From 967fbdf9d0965cc9e0bd8db79e9d0ae3e0a69e5e Mon Sep 17 00:00:00 2001 From: Miriam Cortes Date: Tue, 18 Oct 2016 14:02:07 -0700 Subject: [PATCH 001/191] setup files --- .gitignore | 13 ++++- .ruby-gemset | 1 - .ruby-version | 1 - Gemfile | 15 ++++-- Gemfile.lock | 117 ++++++++++++++++++++++---------------------- README.rdoc | 28 +++++++++++ bin/spring | 7 +-- config/database.yml | 78 ++++------------------------- config/secrets.yml | 4 +- 9 files changed, 124 insertions(+), 140 deletions(-) delete mode 100644 .ruby-gemset delete mode 100644 .ruby-version create mode 100644 README.rdoc diff --git a/.gitignore b/.gitignore index 6db3c9a5bc..adb7f928e7 100644 --- a/.gitignore +++ b/.gitignore @@ -7,9 +7,18 @@ # Ignore bundler config. /.bundle +#Ignore .DS_Store +/.DS_Store +.DS_Store + +#ignore our secrets +/.env + +# Ignore the default SQLite database. +/db/*.sqlite3 +/db/*.sqlite3-journal + # Ignore all logfiles and tempfiles. /log/* !/log/.keep /tmp - -.DS_Store diff --git a/.ruby-gemset b/.ruby-gemset deleted file mode 100644 index d5c660823f..0000000000 --- a/.ruby-gemset +++ /dev/null @@ -1 +0,0 @@ -betsy diff --git a/.ruby-version b/.ruby-version deleted file mode 100644 index 2bf1c1ccf3..0000000000 --- a/.ruby-version +++ /dev/null @@ -1 +0,0 @@ -2.3.1 diff --git a/Gemfile b/Gemfile index c69f4ddde9..48ebc290d8 100644 --- a/Gemfile +++ b/Gemfile @@ -1,10 +1,14 @@ source 'https://rubygems.org' -ruby '2.3.1' + + +gem "awesome_print" +gem "omniauth" +gem "omniauth-github" # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' -gem 'rails', '4.2.6' -# Use postgresql as the database for Active Record -# gem 'pg', '~> 0.15' +gem 'rails', '4.2.7' +# Use sqlite3 as the database for Active Record +gem 'sqlite3' # Use SCSS for stylesheets gem 'sass-rails', '~> 5.0' # Use Uglifier as compressor for JavaScript assets @@ -35,6 +39,8 @@ gem 'sdoc', '~> 0.4.0', group: :doc group :development, :test do # Call 'byebug' anywhere in the code to stop execution and get a debugger console gem 'byebug' + gem 'dotenv-rails' + gem 'better_errors' end group :development do @@ -44,3 +50,4 @@ group :development do # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring gem 'spring' end + diff --git a/Gemfile.lock b/Gemfile.lock index 20975578b8..2516d4acd5 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,36 +1,36 @@ GEM remote: https://rubygems.org/ specs: - actionmailer (4.2.6) - actionpack (= 4.2.6) - actionview (= 4.2.6) - activejob (= 4.2.6) + actionmailer (4.2.7) + actionpack (= 4.2.7) + actionview (= 4.2.7) + activejob (= 4.2.7) mail (~> 2.5, >= 2.5.4) rails-dom-testing (~> 1.0, >= 1.0.5) - actionpack (4.2.6) - actionview (= 4.2.6) - activesupport (= 4.2.6) + actionpack (4.2.7) + actionview (= 4.2.7) + activesupport (= 4.2.7) rack (~> 1.6) rack-test (~> 0.6.2) rails-dom-testing (~> 1.0, >= 1.0.5) rails-html-sanitizer (~> 1.0, >= 1.0.2) - actionview (4.2.6) - activesupport (= 4.2.6) + actionview (4.2.7) + activesupport (= 4.2.7) builder (~> 3.1) erubis (~> 2.7.0) rails-dom-testing (~> 1.0, >= 1.0.5) rails-html-sanitizer (~> 1.0, >= 1.0.2) - activejob (4.2.6) - activesupport (= 4.2.6) + activejob (4.2.7) + activesupport (= 4.2.7) globalid (>= 0.3.0) - activemodel (4.2.6) - activesupport (= 4.2.6) + activemodel (4.2.7) + activesupport (= 4.2.7) builder (~> 3.1) - activerecord (4.2.6) - activemodel (= 4.2.6) - activesupport (= 4.2.6) + activerecord (4.2.7) + activemodel (= 4.2.7) + activesupport (= 4.2.7) arel (~> 6.0) - activesupport (4.2.6) + activesupport (4.2.7) i18n (~> 0.7) json (~> 1.7, >= 1.7.7) minitest (~> 5.1) @@ -40,7 +40,7 @@ GEM binding_of_caller (0.7.2) debug_inspector (>= 0.0.1) builder (3.2.2) - byebug (8.2.5) + byebug (9.0.6) coffee-rails (4.1.1) coffee-script (>= 2.2.0) railties (>= 4.0.0, < 5.1.x) @@ -48,17 +48,17 @@ GEM coffee-script-source execjs coffee-script-source (1.10.0) - concurrent-ruby (1.0.1) + concurrent-ruby (1.0.2) debug_inspector (0.0.2) erubis (2.7.0) - execjs (2.6.0) - globalid (0.3.6) + execjs (2.7.0) + globalid (0.3.7) activesupport (>= 4.1.0) i18n (0.7.0) - jbuilder (2.4.1) + jbuilder (2.6.0) activesupport (>= 3.0.0, < 5.1) multi_json (~> 1.2) - jquery-rails (4.1.1) + jquery-rails (4.2.1) rails-dom-testing (>= 1, < 3) railties (>= 4.2.0) thor (>= 0.14, < 2.0) @@ -67,27 +67,27 @@ GEM nokogiri (>= 1.5.9) mail (2.6.4) mime-types (>= 1.16, < 4) - mime-types (3.0) + mime-types (3.1) mime-types-data (~> 3.2015) - mime-types-data (3.2016.0221) - mini_portile2 (2.0.0) - minitest (5.8.4) - multi_json (1.11.3) - nokogiri (1.6.7.2) - mini_portile2 (~> 2.0.0.rc2) + mime-types-data (3.2016.0521) + mini_portile2 (2.1.0) + minitest (5.9.1) + multi_json (1.12.1) + nokogiri (1.6.8.1) + mini_portile2 (~> 2.1.0) rack (1.6.4) rack-test (0.6.3) rack (>= 1.0) - rails (4.2.6) - actionmailer (= 4.2.6) - actionpack (= 4.2.6) - actionview (= 4.2.6) - activejob (= 4.2.6) - activemodel (= 4.2.6) - activerecord (= 4.2.6) - activesupport (= 4.2.6) + rails (4.2.7) + actionmailer (= 4.2.7) + actionpack (= 4.2.7) + actionview (= 4.2.7) + activejob (= 4.2.7) + activemodel (= 4.2.7) + activerecord (= 4.2.7) + activesupport (= 4.2.7) bundler (>= 1.3.0, < 2.0) - railties (= 4.2.6) + railties (= 4.2.7) sprockets-rails rails-deprecated_sanitizer (1.0.3) activesupport (>= 4.2.0.alpha) @@ -97,40 +97,43 @@ GEM rails-deprecated_sanitizer (>= 1.0.1) rails-html-sanitizer (1.0.3) loofah (~> 2.0) - railties (4.2.6) - actionpack (= 4.2.6) - activesupport (= 4.2.6) + railties (4.2.7) + actionpack (= 4.2.7) + activesupport (= 4.2.7) rake (>= 0.8.7) thor (>= 0.18.1, < 2.0) - rake (11.1.2) + rake (11.3.0) rdoc (4.2.2) json (~> 1.4) sass (3.4.22) - sass-rails (5.0.4) - railties (>= 4.0.0, < 5.0) + sass-rails (5.0.6) + railties (>= 4.0.0, < 6) sass (~> 3.1) sprockets (>= 2.8, < 4.0) sprockets-rails (>= 2.0, < 4.0) tilt (>= 1.1, < 3) - sdoc (0.4.1) + sdoc (0.4.2) json (~> 1.7, >= 1.7.7) rdoc (~> 4.0) - spring (1.7.1) - sprockets (3.6.0) + spring (2.0.0) + activesupport (>= 4.2) + sprockets (3.7.0) concurrent-ruby (~> 1.0) rack (> 1, < 3) - sprockets-rails (3.0.4) + sprockets-rails (3.2.0) actionpack (>= 4.0) activesupport (>= 4.0) sprockets (>= 3.0.0) + sqlite3 (1.3.12) thor (0.19.1) thread_safe (0.3.5) - tilt (2.0.2) - turbolinks (2.5.3) - coffee-rails + tilt (2.0.5) + turbolinks (5.0.1) + turbolinks-source (~> 5) + turbolinks-source (5.0.0) tzinfo (1.2.2) thread_safe (~> 0.1) - uglifier (3.0.0) + uglifier (3.0.2) execjs (>= 0.3.0, < 3) web-console (2.3.0) activemodel (>= 4.0) @@ -146,16 +149,14 @@ DEPENDENCIES coffee-rails (~> 4.1.0) jbuilder (~> 2.0) jquery-rails - rails (= 4.2.6) + rails (= 4.2.7) sass-rails (~> 5.0) sdoc (~> 0.4.0) spring + sqlite3 turbolinks uglifier (>= 1.3.0) web-console (~> 2.0) -RUBY VERSION - ruby 2.3.1p112 - BUNDLED WITH - 1.13.5 + 1.13.1 diff --git a/README.rdoc b/README.rdoc new file mode 100644 index 0000000000..dd4e97e22e --- /dev/null +++ b/README.rdoc @@ -0,0 +1,28 @@ +== README + +This README would normally document whatever steps are necessary to get the +application up and running. + +Things you may want to cover: + +* Ruby version + +* System dependencies + +* Configuration + +* Database creation + +* Database initialization + +* How to run the test suite + +* Services (job queues, cache servers, search engines, etc.) + +* Deployment instructions + +* ... + + +Please feel free to use a different markup language if you do not plan to run +rake doc:app. diff --git a/bin/spring b/bin/spring index 7fe232c3aa..9bc076b9ea 100755 --- a/bin/spring +++ b/bin/spring @@ -7,9 +7,10 @@ unless defined?(Spring) require 'rubygems' require 'bundler' - if (match = Bundler.default_lockfile.read.match(/^GEM$.*?^ (?: )*spring \((.*?)\)$.*?^$/m)) - Gem.paths = { 'GEM_PATH' => [Bundler.bundle_path.to_s, *Gem.path].uniq.join(Gem.path_separator) } - gem 'spring', match[1] + lockfile = Bundler::LockfileParser.new(Bundler.default_lockfile.read) + if spring = lockfile.specs.detect { |spec| spec.name == "spring" } + Gem.use_paths Gem.dir, Bundler.bundle_path.to_s, *Gem.path + gem 'spring', spring.version require 'spring/binstub' end end diff --git a/config/database.yml b/config/database.yml index 04f24be2ba..1c1a37ca8d 100644 --- a/config/database.yml +++ b/config/database.yml @@ -1,85 +1,25 @@ -# PostgreSQL. Versions 8.2 and up are supported. +# SQLite version 3.x +# gem install sqlite3 # -# Install the pg driver: -# gem install pg -# On OS X with Homebrew: -# gem install pg -- --with-pg-config=/usr/local/bin/pg_config -# On OS X with MacPorts: -# gem install pg -- --with-pg-config=/opt/local/lib/postgresql84/bin/pg_config -# On Windows: -# gem install pg -# Choose the win32 build. -# Install PostgreSQL and put its /bin directory on your path. -# -# Configure Using Gemfile -# gem 'pg' +# Ensure the SQLite 3 gem is defined in your Gemfile +# gem 'sqlite3' # default: &default - adapter: postgresql - encoding: unicode - # For details on connection pooling, see rails configuration guide - # http://guides.rubyonrails.org/configuring.html#database-pooling + adapter: sqlite3 pool: 5 + timeout: 5000 development: <<: *default - database: betsy_development - - # The specified database role being used to connect to postgres. - # To create additional roles in postgres see `$ createuser --help`. - # When left blank, postgres will use the default role. This is - # the same name as the operating system user that initialized the database. - #username: betsy - - # The password associated with the postgres role (username). - #password: - - # Connect on a TCP socket. Omitted by default since the client uses a - # domain socket that doesn't need configuration. Windows does not have - # domain sockets, so uncomment these lines. - #host: localhost - - # The TCP port the server listens on. Defaults to 5432. - # If your server runs on a different port number, change accordingly. - #port: 5432 - - # Schema search path. The server defaults to $user,public - #schema_search_path: myapp,sharedapp,public - - # Minimum log levels, in increasing order: - # debug5, debug4, debug3, debug2, debug1, - # log, notice, warning, error, fatal, and panic - # Defaults to warning. - #min_messages: notice + database: db/development.sqlite3 # Warning: The database defined as "test" will be erased and # re-generated from your development database when you run "rake". # Do not set this db to the same as development or production. test: <<: *default - database: betsy_test + database: db/test.sqlite3 -# As with config/secrets.yml, you never want to store sensitive information, -# like your database password, in your source code. If your source code is -# ever seen by anyone, they now have access to your database. -# -# Instead, provide the password as a unix environment variable when you boot -# the app. Read http://guides.rubyonrails.org/configuring.html#configuring-a-database -# for a full rundown on how to provide these environment variables in a -# production deployment. -# -# On Heroku and other platform providers, you may have a full connection URL -# available as an environment variable. For example: -# -# DATABASE_URL="postgres://myuser:mypass@localhost/somedatabase" -# -# You can use this database configuration with: -# -# production: -# url: <%= ENV['DATABASE_URL'] %> -# production: <<: *default - database: betsy_production - username: betsy - password: <%= ENV['BETSY_DATABASE_PASSWORD'] %> + database: db/production.sqlite3 diff --git a/config/secrets.yml b/config/secrets.yml index 6442868fc1..2123fe4437 100644 --- a/config/secrets.yml +++ b/config/secrets.yml @@ -11,10 +11,10 @@ # if you're sharing your code publicly. development: - secret_key_base: eaebee6b0ce07b1e5b22743dacf6e6aaec01bf01c88370f9f86c3ae0d8592b4313c5e9da09754cd613eda8d206168bd74d5ed9910230b3957725352c70e2cf80 + secret_key_base: f7c47456a69cb28cb0b87f8ae0d544dc6d2f549bb24a30e1cb444786fc3daa25bef7f2206d378d3565363842186ae574cb86ec2e062e95f511a19c5d837f3aad test: - secret_key_base: f9c5bd6c383573755e5f8cf214402a51eb5ce8c7d0df9860dbf980f03fbd6c508e97412644b6a80d7034774602b05e05988bf7ab8ff594912950fdb590589a4d + secret_key_base: 836172d2e7760c87cdc215bb88e54d22100caabe180115828f4d3a78ac73161cac88e56425363b5a635f21f520502936f38061c9a252592061b598e2f276a88e # Do not keep production secrets in the repository, # instead read values from the environment. From d64a3d2d74bfdb65a273141ced86ddbd6cd97e66 Mon Sep 17 00:00:00 2001 From: Miriam Cortes Date: Tue, 18 Oct 2016 14:40:07 -0700 Subject: [PATCH 002/191] models --- Gemfile.lock | 36 + app/assets/stylesheets/app.css | 0 app/assets/stylesheets/foundation.css | 4194 +++++++++++++++++ app/models/category.rb | 4 + app/models/guest.rb | 3 + app/models/merchant.rb | 4 + app/models/order.rb | 6 + app/models/product.rb | 8 + app/models/product_category.rb | 4 + app/models/product_order.rb | 4 + app/models/review.rb | 3 + .../20161018211906_create_categories.rb | 9 + db/migrate/20161018211943_create_merchants.rb | 11 + db/migrate/20161018212045_create_products.rb | 15 + db/migrate/20161018212101_create_guests.rb | 10 + db/migrate/20161018212119_create_reviews.rb | 12 + db/migrate/20161018212351_create_orders.rb | 20 + .../20161018213324_create_product_orders.rb | 10 + ...0161018213348_create_product_categories.rb | 10 + db/schema.rb | 95 + test/fixtures/categories.yml | 7 + test/fixtures/guests.yml | 9 + test/fixtures/merchants.yml | 11 + test/fixtures/orders.yml | 29 + test/fixtures/product_categories.yml | 9 + test/fixtures/product_orders.yml | 9 + test/fixtures/products.yml | 19 + test/fixtures/reviews.yml | 13 + test/models/category_test.rb | 7 + test/models/guest_test.rb | 7 + test/models/merchant_test.rb | 7 + test/models/order_test.rb | 7 + test/models/product_category_test.rb | 7 + test/models/product_order_test.rb | 7 + test/models/product_test.rb | 7 + test/models/review_test.rb | 7 + 36 files changed, 4620 insertions(+) create mode 100644 app/assets/stylesheets/app.css create mode 100644 app/assets/stylesheets/foundation.css create mode 100644 app/models/category.rb create mode 100644 app/models/guest.rb create mode 100644 app/models/merchant.rb create mode 100644 app/models/order.rb create mode 100644 app/models/product.rb create mode 100644 app/models/product_category.rb create mode 100644 app/models/product_order.rb create mode 100644 app/models/review.rb create mode 100644 db/migrate/20161018211906_create_categories.rb create mode 100644 db/migrate/20161018211943_create_merchants.rb create mode 100644 db/migrate/20161018212045_create_products.rb create mode 100644 db/migrate/20161018212101_create_guests.rb create mode 100644 db/migrate/20161018212119_create_reviews.rb create mode 100644 db/migrate/20161018212351_create_orders.rb create mode 100644 db/migrate/20161018213324_create_product_orders.rb create mode 100644 db/migrate/20161018213348_create_product_categories.rb create mode 100644 db/schema.rb create mode 100644 test/fixtures/categories.yml create mode 100644 test/fixtures/guests.yml create mode 100644 test/fixtures/merchants.yml create mode 100644 test/fixtures/orders.yml create mode 100644 test/fixtures/product_categories.yml create mode 100644 test/fixtures/product_orders.yml create mode 100644 test/fixtures/products.yml create mode 100644 test/fixtures/reviews.yml create mode 100644 test/models/category_test.rb create mode 100644 test/models/guest_test.rb create mode 100644 test/models/merchant_test.rb create mode 100644 test/models/order_test.rb create mode 100644 test/models/product_category_test.rb create mode 100644 test/models/product_order_test.rb create mode 100644 test/models/product_test.rb create mode 100644 test/models/review_test.rb diff --git a/Gemfile.lock b/Gemfile.lock index 2516d4acd5..d2af84ba62 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -37,10 +37,16 @@ GEM thread_safe (~> 0.3, >= 0.3.4) tzinfo (~> 1.1) arel (6.0.3) + awesome_print (1.7.0) + better_errors (2.1.1) + coderay (>= 1.0.0) + erubis (>= 2.6.6) + rack (>= 0.9.0) binding_of_caller (0.7.2) debug_inspector (>= 0.0.1) builder (3.2.2) byebug (9.0.6) + coderay (1.1.1) coffee-rails (4.1.1) coffee-script (>= 2.2.0) railties (>= 4.0.0, < 5.1.x) @@ -50,10 +56,17 @@ GEM coffee-script-source (1.10.0) concurrent-ruby (1.0.2) debug_inspector (0.0.2) + dotenv (2.1.1) + dotenv-rails (2.1.1) + dotenv (= 2.1.1) + railties (>= 4.0, < 5.1) erubis (2.7.0) execjs (2.7.0) + faraday (0.9.2) + multipart-post (>= 1.2, < 3) globalid (0.3.7) activesupport (>= 4.1.0) + hashie (3.4.6) i18n (0.7.0) jbuilder (2.6.0) activesupport (>= 3.0.0, < 5.1) @@ -63,6 +76,7 @@ GEM railties (>= 4.2.0) thor (>= 0.14, < 2.0) json (1.8.3) + jwt (1.5.6) loofah (2.0.3) nokogiri (>= 1.5.9) mail (2.6.4) @@ -73,8 +87,25 @@ GEM mini_portile2 (2.1.0) minitest (5.9.1) multi_json (1.12.1) + multi_xml (0.5.5) + multipart-post (2.0.0) nokogiri (1.6.8.1) mini_portile2 (~> 2.1.0) + oauth2 (1.2.0) + faraday (>= 0.8, < 0.10) + jwt (~> 1.0) + multi_json (~> 1.3) + multi_xml (~> 0.5) + rack (>= 1.2, < 3) + omniauth (1.3.1) + hashie (>= 1.2, < 4) + rack (>= 1.0, < 3) + omniauth-github (1.1.2) + omniauth (~> 1.0) + omniauth-oauth2 (~> 1.1) + omniauth-oauth2 (1.4.0) + oauth2 (~> 1.0) + omniauth (~> 1.2) rack (1.6.4) rack-test (0.6.3) rack (>= 1.0) @@ -145,10 +176,15 @@ PLATFORMS ruby DEPENDENCIES + awesome_print + better_errors byebug coffee-rails (~> 4.1.0) + dotenv-rails jbuilder (~> 2.0) jquery-rails + omniauth + omniauth-github rails (= 4.2.7) sass-rails (~> 5.0) sdoc (~> 0.4.0) diff --git a/app/assets/stylesheets/app.css b/app/assets/stylesheets/app.css new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/assets/stylesheets/foundation.css b/app/assets/stylesheets/foundation.css new file mode 100644 index 0000000000..66aca962de --- /dev/null +++ b/app/assets/stylesheets/foundation.css @@ -0,0 +1,4194 @@ +@charset "UTF-8"; +/** + * Foundation for Sites by ZURB + * Version 6.2.3 + * foundation.zurb.com + * Licensed under MIT Open Source + */ +/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ +/** + * 1. Set default font family to sans-serif. + * 2. Prevent iOS and IE text size adjust after device orientation change, + * without disabling user zoom. + */ +html { + font-family: sans-serif; + /* 1 */ + -ms-text-size-adjust: 100%; + /* 2 */ + -webkit-text-size-adjust: 100%; + /* 2 */ } + +/** + * Remove default margin. + */ +body { + margin: 0; } + +/* HTML5 display definitions + ========================================================================== */ +/** + * Correct `block` display not defined for any HTML5 element in IE 8/9. + * Correct `block` display not defined for `details` or `summary` in IE 10/11 + * and Firefox. + * Correct `block` display not defined for `main` in IE 11. + */ +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; } + +/** + * 1. Correct `inline-block` display not defined in IE 8/9. + * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. + */ +audio, +canvas, +progress, +video { + display: inline-block; + /* 1 */ + vertical-align: baseline; + /* 2 */ } + +/** + * Prevent modern browsers from displaying `audio` without controls. + * Remove excess height in iOS 5 devices. + */ +audio:not([controls]) { + display: none; + height: 0; } + +/** + * Address `[hidden]` styling not present in IE 8/9/10. + * Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22. + */ +[hidden], +template { + display: none; } + +/* Links + ========================================================================== */ +/** + * Remove the gray background color from active links in IE 10. + */ +a { + background-color: transparent; } + +/** + * Improve readability of focused elements when they are also in an + * active/hover state. + */ +a:active, +a:hover { + outline: 0; } + +/* Text-level semantics + ========================================================================== */ +/** + * Address styling not present in IE 8/9/10/11, Safari, and Chrome. + */ +abbr[title] { + border-bottom: 1px dotted; } + +/** + * Address style set to `bolder` in Firefox 4+, Safari, and Chrome. + */ +b, +strong { + font-weight: bold; } + +/** + * Address styling not present in Safari and Chrome. + */ +dfn { + font-style: italic; } + +/** + * Address variable `h1` font-size and margin within `section` and `article` + * contexts in Firefox 4+, Safari, and Chrome. + */ +h1 { + font-size: 2em; + margin: 0.67em 0; } + +/** + * Address styling not present in IE 8/9. + */ +mark { + background: #ff0; + color: #000; } + +/** + * Address inconsistent and variable font size in all browsers. + */ +small { + font-size: 80%; } + +/** + * Prevent `sub` and `sup` affecting `line-height` in all browsers. + */ +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; } + +sup { + top: -0.5em; } + +sub { + bottom: -0.25em; } + +/* Embedded content + ========================================================================== */ +/** + * Remove border when inside `a` element in IE 8/9/10. + */ +img { + border: 0; } + +/** + * Correct overflow not hidden in IE 9/10/11. + */ +svg:not(:root) { + overflow: hidden; } + +/* Grouping content + ========================================================================== */ +/** + * Address margin not present in IE 8/9 and Safari. + */ +figure { + margin: 1em 40px; } + +/** + * Address differences between Firefox and other browsers. + */ +hr { + box-sizing: content-box; + height: 0; } + +/** + * Contain overflow in all browsers. + */ +pre { + overflow: auto; } + +/** + * Address odd `em`-unit font size rendering in all browsers. + */ +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; } + +/* Forms + ========================================================================== */ +/** + * Known limitation: by default, Chrome and Safari on OS X allow very limited + * styling of `select`, unless a `border` property is set. + */ +/** + * 1. Correct color not being inherited. + * Known issue: affects color of disabled elements. + * 2. Correct font properties not being inherited. + * 3. Address margins set differently in Firefox 4+, Safari, and Chrome. + */ +button, +input, +optgroup, +select, +textarea { + color: inherit; + /* 1 */ + font: inherit; + /* 2 */ + margin: 0; + /* 3 */ } + +/** + * Address `overflow` set to `hidden` in IE 8/9/10/11. + */ +button { + overflow: visible; } + +/** + * Address inconsistent `text-transform` inheritance for `button` and `select`. + * All other form control elements do not inherit `text-transform` values. + * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. + * Correct `select` style inheritance in Firefox. + */ +button, +select { + text-transform: none; } + +/** + * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` + * and `video` controls. + * 2. Correct inability to style clickable `input` types in iOS. + * 3. Improve usability and consistency of cursor style between image-type + * `input` and others. + */ +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + /* 2 */ + cursor: pointer; + /* 3 */ } + +/** + * Re-set default cursor for disabled elements. + */ +button[disabled], +html input[disabled] { + cursor: not-allowed; } + +/** + * Remove inner padding and border in Firefox 4+. + */ +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; } + +/** + * Address Firefox 4+ setting `line-height` on `input` using `!important` in + * the UA stylesheet. + */ +input { + line-height: normal; } + +/** + * It's recommended that you don't attempt to style these elements. + * Firefox's implementation doesn't respect box-sizing, padding, or width. + * + * 1. Address box sizing set to `content-box` in IE 8/9/10. + * 2. Remove excess padding in IE 8/9/10. + */ +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; + /* 1 */ + padding: 0; + /* 2 */ } + +/** + * Fix the cursor style for Chrome's increment/decrement buttons. For certain + * `font-size` values of the `input`, it causes the cursor style of the + * decrement button to change from `default` to `text`. + */ +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; } + +/** + * 1. Address `appearance` set to `searchfield` in Safari and Chrome. + * 2. Address `box-sizing` set to `border-box` in Safari and Chrome. + */ +input[type="search"] { + -webkit-appearance: textfield; + /* 1 */ + box-sizing: content-box; + /* 2 */ } + +/** + * Remove inner padding and search cancel button in Safari and Chrome on OS X. + * Safari (but not Chrome) clips the cancel button when the search input has + * padding (and `textfield` appearance). + */ +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; } + +/** + * Define consistent border, margin, and padding. + * [NOTE] We don't enable this ruleset in Foundation, because we want the
element to have plain styling. + */ +/* fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; + } */ +/** + * 1. Correct `color` not being inherited in IE 8/9/10/11. + * 2. Remove padding so people aren't caught out if they zero out fieldsets. + */ +legend { + border: 0; + /* 1 */ + padding: 0; + /* 2 */ } + +/** + * Remove default vertical scrollbar in IE 8/9/10/11. + */ +textarea { + overflow: auto; } + +/** + * Don't inherit the `font-weight` (applied by a rule above). + * NOTE: the default cannot safely be changed in Chrome and Safari on OS X. + */ +optgroup { + font-weight: bold; } + +/* Tables + ========================================================================== */ +/** + * Remove most spacing between table cells. + */ +table { + border-collapse: collapse; + border-spacing: 0; } + +td, +th { + padding: 0; } + +.foundation-mq { + font-family: "small=0em&medium=40em&large=64em&xlarge=75em&xxlarge=90em"; } + +html { + font-size: 100%; + box-sizing: border-box; } + +*, +*::before, +*::after { + box-sizing: inherit; } + +body { + padding: 0; + margin: 0; + font-family: "Helvetica Neue", Helvetica, Roboto, Arial, sans-serif; + font-weight: normal; + line-height: 1.5; + color: #0a0a0a; + background: #fefefe; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } + +img { + max-width: 100%; + height: auto; + -ms-interpolation-mode: bicubic; + display: inline-block; + vertical-align: middle; } + +textarea { + height: auto; + min-height: 50px; + border-radius: 0; } + +select { + width: 100%; + border-radius: 0; } + +#map_canvas img, +#map_canvas embed, +#map_canvas object, +.map_canvas img, +.map_canvas embed, +.map_canvas object, +.mqa-display img, +.mqa-display embed, +.mqa-display object { + max-width: none !important; } + +button { + -webkit-appearance: none; + -moz-appearance: none; + background: transparent; + padding: 0; + border: 0; + border-radius: 0; + line-height: 1; } + [data-whatinput='mouse'] button { + outline: 0; } + +.is-visible { + display: block !important; } + +.is-hidden { + display: none !important; } + +.row { + max-width: 75rem; + margin-left: auto; + margin-right: auto; } + .row::before, .row::after { + content: ' '; + display: table; } + .row::after { + clear: both; } + .row.collapse > .column, .row.collapse > .columns { + padding-left: 0; + padding-right: 0; } + .row .row { + max-width: none; + margin-left: -0.625rem; + margin-right: -0.625rem; } + @media screen and (min-width: 40em) { + .row .row { + margin-left: -0.9375rem; + margin-right: -0.9375rem; } } + .row .row.collapse { + margin-left: 0; + margin-right: 0; } + .row.expanded { + max-width: none; } + .row.expanded .row { + margin-left: auto; + margin-right: auto; } + +.column, .columns { + width: 100%; + float: left; + padding-left: 0.625rem; + padding-right: 0.625rem; } + @media screen and (min-width: 40em) { + .column, .columns { + padding-left: 0.9375rem; + padding-right: 0.9375rem; } } + .column:last-child:not(:first-child), .columns:last-child:not(:first-child) { + float: right; } + .column.end:last-child:last-child, .end.columns:last-child:last-child { + float: left; } + +.column.row.row, .row.row.columns { + float: none; } + .row .column.row.row, .row .row.row.columns { + padding-left: 0; + padding-right: 0; + margin-left: 0; + margin-right: 0; } + +.small-1 { + width: 8.33333%; } + +.small-push-1 { + position: relative; + left: 8.33333%; } + +.small-pull-1 { + position: relative; + left: -8.33333%; } + +.small-offset-0 { + margin-left: 0%; } + +.small-2 { + width: 16.66667%; } + +.small-push-2 { + position: relative; + left: 16.66667%; } + +.small-pull-2 { + position: relative; + left: -16.66667%; } + +.small-offset-1 { + margin-left: 8.33333%; } + +.small-3 { + width: 25%; } + +.small-push-3 { + position: relative; + left: 25%; } + +.small-pull-3 { + position: relative; + left: -25%; } + +.small-offset-2 { + margin-left: 16.66667%; } + +.small-4 { + width: 33.33333%; } + +.small-push-4 { + position: relative; + left: 33.33333%; } + +.small-pull-4 { + position: relative; + left: -33.33333%; } + +.small-offset-3 { + margin-left: 25%; } + +.small-5 { + width: 41.66667%; } + +.small-push-5 { + position: relative; + left: 41.66667%; } + +.small-pull-5 { + position: relative; + left: -41.66667%; } + +.small-offset-4 { + margin-left: 33.33333%; } + +.small-6 { + width: 50%; } + +.small-push-6 { + position: relative; + left: 50%; } + +.small-pull-6 { + position: relative; + left: -50%; } + +.small-offset-5 { + margin-left: 41.66667%; } + +.small-7 { + width: 58.33333%; } + +.small-push-7 { + position: relative; + left: 58.33333%; } + +.small-pull-7 { + position: relative; + left: -58.33333%; } + +.small-offset-6 { + margin-left: 50%; } + +.small-8 { + width: 66.66667%; } + +.small-push-8 { + position: relative; + left: 66.66667%; } + +.small-pull-8 { + position: relative; + left: -66.66667%; } + +.small-offset-7 { + margin-left: 58.33333%; } + +.small-9 { + width: 75%; } + +.small-push-9 { + position: relative; + left: 75%; } + +.small-pull-9 { + position: relative; + left: -75%; } + +.small-offset-8 { + margin-left: 66.66667%; } + +.small-10 { + width: 83.33333%; } + +.small-push-10 { + position: relative; + left: 83.33333%; } + +.small-pull-10 { + position: relative; + left: -83.33333%; } + +.small-offset-9 { + margin-left: 75%; } + +.small-11 { + width: 91.66667%; } + +.small-push-11 { + position: relative; + left: 91.66667%; } + +.small-pull-11 { + position: relative; + left: -91.66667%; } + +.small-offset-10 { + margin-left: 83.33333%; } + +.small-12 { + width: 100%; } + +.small-offset-11 { + margin-left: 91.66667%; } + +.small-up-1 > .column, .small-up-1 > .columns { + width: 100%; + float: left; } + .small-up-1 > .column:nth-of-type(1n), .small-up-1 > .columns:nth-of-type(1n) { + clear: none; } + .small-up-1 > .column:nth-of-type(1n+1), .small-up-1 > .columns:nth-of-type(1n+1) { + clear: both; } + .small-up-1 > .column:last-child, .small-up-1 > .columns:last-child { + float: left; } + +.small-up-2 > .column, .small-up-2 > .columns { + width: 50%; + float: left; } + .small-up-2 > .column:nth-of-type(1n), .small-up-2 > .columns:nth-of-type(1n) { + clear: none; } + .small-up-2 > .column:nth-of-type(2n+1), .small-up-2 > .columns:nth-of-type(2n+1) { + clear: both; } + .small-up-2 > .column:last-child, .small-up-2 > .columns:last-child { + float: left; } + +.small-up-3 > .column, .small-up-3 > .columns { + width: 33.33333%; + float: left; } + .small-up-3 > .column:nth-of-type(1n), .small-up-3 > .columns:nth-of-type(1n) { + clear: none; } + .small-up-3 > .column:nth-of-type(3n+1), .small-up-3 > .columns:nth-of-type(3n+1) { + clear: both; } + .small-up-3 > .column:last-child, .small-up-3 > .columns:last-child { + float: left; } + +.small-up-4 > .column, .small-up-4 > .columns { + width: 25%; + float: left; } + .small-up-4 > .column:nth-of-type(1n), .small-up-4 > .columns:nth-of-type(1n) { + clear: none; } + .small-up-4 > .column:nth-of-type(4n+1), .small-up-4 > .columns:nth-of-type(4n+1) { + clear: both; } + .small-up-4 > .column:last-child, .small-up-4 > .columns:last-child { + float: left; } + +.small-up-5 > .column, .small-up-5 > .columns { + width: 20%; + float: left; } + .small-up-5 > .column:nth-of-type(1n), .small-up-5 > .columns:nth-of-type(1n) { + clear: none; } + .small-up-5 > .column:nth-of-type(5n+1), .small-up-5 > .columns:nth-of-type(5n+1) { + clear: both; } + .small-up-5 > .column:last-child, .small-up-5 > .columns:last-child { + float: left; } + +.small-up-6 > .column, .small-up-6 > .columns { + width: 16.66667%; + float: left; } + .small-up-6 > .column:nth-of-type(1n), .small-up-6 > .columns:nth-of-type(1n) { + clear: none; } + .small-up-6 > .column:nth-of-type(6n+1), .small-up-6 > .columns:nth-of-type(6n+1) { + clear: both; } + .small-up-6 > .column:last-child, .small-up-6 > .columns:last-child { + float: left; } + +.small-up-7 > .column, .small-up-7 > .columns { + width: 14.28571%; + float: left; } + .small-up-7 > .column:nth-of-type(1n), .small-up-7 > .columns:nth-of-type(1n) { + clear: none; } + .small-up-7 > .column:nth-of-type(7n+1), .small-up-7 > .columns:nth-of-type(7n+1) { + clear: both; } + .small-up-7 > .column:last-child, .small-up-7 > .columns:last-child { + float: left; } + +.small-up-8 > .column, .small-up-8 > .columns { + width: 12.5%; + float: left; } + .small-up-8 > .column:nth-of-type(1n), .small-up-8 > .columns:nth-of-type(1n) { + clear: none; } + .small-up-8 > .column:nth-of-type(8n+1), .small-up-8 > .columns:nth-of-type(8n+1) { + clear: both; } + .small-up-8 > .column:last-child, .small-up-8 > .columns:last-child { + float: left; } + +.small-collapse > .column, .small-collapse > .columns { + padding-left: 0; + padding-right: 0; } + +.small-collapse .row, +.expanded.row .small-collapse.row { + margin-left: 0; + margin-right: 0; } + +.small-uncollapse > .column, .small-uncollapse > .columns { + padding-left: 0.625rem; + padding-right: 0.625rem; } + +.small-centered { + float: none; + margin-left: auto; + margin-right: auto; } + +.small-uncentered, +.small-push-0, +.small-pull-0 { + position: static; + margin-left: 0; + margin-right: 0; + float: left; } + +@media screen and (min-width: 40em) { + .medium-1 { + width: 8.33333%; } + .medium-push-1 { + position: relative; + left: 8.33333%; } + .medium-pull-1 { + position: relative; + left: -8.33333%; } + .medium-offset-0 { + margin-left: 0%; } + .medium-2 { + width: 16.66667%; } + .medium-push-2 { + position: relative; + left: 16.66667%; } + .medium-pull-2 { + position: relative; + left: -16.66667%; } + .medium-offset-1 { + margin-left: 8.33333%; } + .medium-3 { + width: 25%; } + .medium-push-3 { + position: relative; + left: 25%; } + .medium-pull-3 { + position: relative; + left: -25%; } + .medium-offset-2 { + margin-left: 16.66667%; } + .medium-4 { + width: 33.33333%; } + .medium-push-4 { + position: relative; + left: 33.33333%; } + .medium-pull-4 { + position: relative; + left: -33.33333%; } + .medium-offset-3 { + margin-left: 25%; } + .medium-5 { + width: 41.66667%; } + .medium-push-5 { + position: relative; + left: 41.66667%; } + .medium-pull-5 { + position: relative; + left: -41.66667%; } + .medium-offset-4 { + margin-left: 33.33333%; } + .medium-6 { + width: 50%; } + .medium-push-6 { + position: relative; + left: 50%; } + .medium-pull-6 { + position: relative; + left: -50%; } + .medium-offset-5 { + margin-left: 41.66667%; } + .medium-7 { + width: 58.33333%; } + .medium-push-7 { + position: relative; + left: 58.33333%; } + .medium-pull-7 { + position: relative; + left: -58.33333%; } + .medium-offset-6 { + margin-left: 50%; } + .medium-8 { + width: 66.66667%; } + .medium-push-8 { + position: relative; + left: 66.66667%; } + .medium-pull-8 { + position: relative; + left: -66.66667%; } + .medium-offset-7 { + margin-left: 58.33333%; } + .medium-9 { + width: 75%; } + .medium-push-9 { + position: relative; + left: 75%; } + .medium-pull-9 { + position: relative; + left: -75%; } + .medium-offset-8 { + margin-left: 66.66667%; } + .medium-10 { + width: 83.33333%; } + .medium-push-10 { + position: relative; + left: 83.33333%; } + .medium-pull-10 { + position: relative; + left: -83.33333%; } + .medium-offset-9 { + margin-left: 75%; } + .medium-11 { + width: 91.66667%; } + .medium-push-11 { + position: relative; + left: 91.66667%; } + .medium-pull-11 { + position: relative; + left: -91.66667%; } + .medium-offset-10 { + margin-left: 83.33333%; } + .medium-12 { + width: 100%; } + .medium-offset-11 { + margin-left: 91.66667%; } + .medium-up-1 > .column, .medium-up-1 > .columns { + width: 100%; + float: left; } + .medium-up-1 > .column:nth-of-type(1n), .medium-up-1 > .columns:nth-of-type(1n) { + clear: none; } + .medium-up-1 > .column:nth-of-type(1n+1), .medium-up-1 > .columns:nth-of-type(1n+1) { + clear: both; } + .medium-up-1 > .column:last-child, .medium-up-1 > .columns:last-child { + float: left; } + .medium-up-2 > .column, .medium-up-2 > .columns { + width: 50%; + float: left; } + .medium-up-2 > .column:nth-of-type(1n), .medium-up-2 > .columns:nth-of-type(1n) { + clear: none; } + .medium-up-2 > .column:nth-of-type(2n+1), .medium-up-2 > .columns:nth-of-type(2n+1) { + clear: both; } + .medium-up-2 > .column:last-child, .medium-up-2 > .columns:last-child { + float: left; } + .medium-up-3 > .column, .medium-up-3 > .columns { + width: 33.33333%; + float: left; } + .medium-up-3 > .column:nth-of-type(1n), .medium-up-3 > .columns:nth-of-type(1n) { + clear: none; } + .medium-up-3 > .column:nth-of-type(3n+1), .medium-up-3 > .columns:nth-of-type(3n+1) { + clear: both; } + .medium-up-3 > .column:last-child, .medium-up-3 > .columns:last-child { + float: left; } + .medium-up-4 > .column, .medium-up-4 > .columns { + width: 25%; + float: left; } + .medium-up-4 > .column:nth-of-type(1n), .medium-up-4 > .columns:nth-of-type(1n) { + clear: none; } + .medium-up-4 > .column:nth-of-type(4n+1), .medium-up-4 > .columns:nth-of-type(4n+1) { + clear: both; } + .medium-up-4 > .column:last-child, .medium-up-4 > .columns:last-child { + float: left; } + .medium-up-5 > .column, .medium-up-5 > .columns { + width: 20%; + float: left; } + .medium-up-5 > .column:nth-of-type(1n), .medium-up-5 > .columns:nth-of-type(1n) { + clear: none; } + .medium-up-5 > .column:nth-of-type(5n+1), .medium-up-5 > .columns:nth-of-type(5n+1) { + clear: both; } + .medium-up-5 > .column:last-child, .medium-up-5 > .columns:last-child { + float: left; } + .medium-up-6 > .column, .medium-up-6 > .columns { + width: 16.66667%; + float: left; } + .medium-up-6 > .column:nth-of-type(1n), .medium-up-6 > .columns:nth-of-type(1n) { + clear: none; } + .medium-up-6 > .column:nth-of-type(6n+1), .medium-up-6 > .columns:nth-of-type(6n+1) { + clear: both; } + .medium-up-6 > .column:last-child, .medium-up-6 > .columns:last-child { + float: left; } + .medium-up-7 > .column, .medium-up-7 > .columns { + width: 14.28571%; + float: left; } + .medium-up-7 > .column:nth-of-type(1n), .medium-up-7 > .columns:nth-of-type(1n) { + clear: none; } + .medium-up-7 > .column:nth-of-type(7n+1), .medium-up-7 > .columns:nth-of-type(7n+1) { + clear: both; } + .medium-up-7 > .column:last-child, .medium-up-7 > .columns:last-child { + float: left; } + .medium-up-8 > .column, .medium-up-8 > .columns { + width: 12.5%; + float: left; } + .medium-up-8 > .column:nth-of-type(1n), .medium-up-8 > .columns:nth-of-type(1n) { + clear: none; } + .medium-up-8 > .column:nth-of-type(8n+1), .medium-up-8 > .columns:nth-of-type(8n+1) { + clear: both; } + .medium-up-8 > .column:last-child, .medium-up-8 > .columns:last-child { + float: left; } + .medium-collapse > .column, .medium-collapse > .columns { + padding-left: 0; + padding-right: 0; } + .medium-collapse .row, + .expanded.row .medium-collapse.row { + margin-left: 0; + margin-right: 0; } + .medium-uncollapse > .column, .medium-uncollapse > .columns { + padding-left: 0.9375rem; + padding-right: 0.9375rem; } + .medium-centered { + float: none; + margin-left: auto; + margin-right: auto; } + .medium-uncentered, + .medium-push-0, + .medium-pull-0 { + position: static; + margin-left: 0; + margin-right: 0; + float: left; } } + +@media screen and (min-width: 64em) { + .large-1 { + width: 8.33333%; } + .large-push-1 { + position: relative; + left: 8.33333%; } + .large-pull-1 { + position: relative; + left: -8.33333%; } + .large-offset-0 { + margin-left: 0%; } + .large-2 { + width: 16.66667%; } + .large-push-2 { + position: relative; + left: 16.66667%; } + .large-pull-2 { + position: relative; + left: -16.66667%; } + .large-offset-1 { + margin-left: 8.33333%; } + .large-3 { + width: 25%; } + .large-push-3 { + position: relative; + left: 25%; } + .large-pull-3 { + position: relative; + left: -25%; } + .large-offset-2 { + margin-left: 16.66667%; } + .large-4 { + width: 33.33333%; } + .large-push-4 { + position: relative; + left: 33.33333%; } + .large-pull-4 { + position: relative; + left: -33.33333%; } + .large-offset-3 { + margin-left: 25%; } + .large-5 { + width: 41.66667%; } + .large-push-5 { + position: relative; + left: 41.66667%; } + .large-pull-5 { + position: relative; + left: -41.66667%; } + .large-offset-4 { + margin-left: 33.33333%; } + .large-6 { + width: 50%; } + .large-push-6 { + position: relative; + left: 50%; } + .large-pull-6 { + position: relative; + left: -50%; } + .large-offset-5 { + margin-left: 41.66667%; } + .large-7 { + width: 58.33333%; } + .large-push-7 { + position: relative; + left: 58.33333%; } + .large-pull-7 { + position: relative; + left: -58.33333%; } + .large-offset-6 { + margin-left: 50%; } + .large-8 { + width: 66.66667%; } + .large-push-8 { + position: relative; + left: 66.66667%; } + .large-pull-8 { + position: relative; + left: -66.66667%; } + .large-offset-7 { + margin-left: 58.33333%; } + .large-9 { + width: 75%; } + .large-push-9 { + position: relative; + left: 75%; } + .large-pull-9 { + position: relative; + left: -75%; } + .large-offset-8 { + margin-left: 66.66667%; } + .large-10 { + width: 83.33333%; } + .large-push-10 { + position: relative; + left: 83.33333%; } + .large-pull-10 { + position: relative; + left: -83.33333%; } + .large-offset-9 { + margin-left: 75%; } + .large-11 { + width: 91.66667%; } + .large-push-11 { + position: relative; + left: 91.66667%; } + .large-pull-11 { + position: relative; + left: -91.66667%; } + .large-offset-10 { + margin-left: 83.33333%; } + .large-12 { + width: 100%; } + .large-offset-11 { + margin-left: 91.66667%; } + .large-up-1 > .column, .large-up-1 > .columns { + width: 100%; + float: left; } + .large-up-1 > .column:nth-of-type(1n), .large-up-1 > .columns:nth-of-type(1n) { + clear: none; } + .large-up-1 > .column:nth-of-type(1n+1), .large-up-1 > .columns:nth-of-type(1n+1) { + clear: both; } + .large-up-1 > .column:last-child, .large-up-1 > .columns:last-child { + float: left; } + .large-up-2 > .column, .large-up-2 > .columns { + width: 50%; + float: left; } + .large-up-2 > .column:nth-of-type(1n), .large-up-2 > .columns:nth-of-type(1n) { + clear: none; } + .large-up-2 > .column:nth-of-type(2n+1), .large-up-2 > .columns:nth-of-type(2n+1) { + clear: both; } + .large-up-2 > .column:last-child, .large-up-2 > .columns:last-child { + float: left; } + .large-up-3 > .column, .large-up-3 > .columns { + width: 33.33333%; + float: left; } + .large-up-3 > .column:nth-of-type(1n), .large-up-3 > .columns:nth-of-type(1n) { + clear: none; } + .large-up-3 > .column:nth-of-type(3n+1), .large-up-3 > .columns:nth-of-type(3n+1) { + clear: both; } + .large-up-3 > .column:last-child, .large-up-3 > .columns:last-child { + float: left; } + .large-up-4 > .column, .large-up-4 > .columns { + width: 25%; + float: left; } + .large-up-4 > .column:nth-of-type(1n), .large-up-4 > .columns:nth-of-type(1n) { + clear: none; } + .large-up-4 > .column:nth-of-type(4n+1), .large-up-4 > .columns:nth-of-type(4n+1) { + clear: both; } + .large-up-4 > .column:last-child, .large-up-4 > .columns:last-child { + float: left; } + .large-up-5 > .column, .large-up-5 > .columns { + width: 20%; + float: left; } + .large-up-5 > .column:nth-of-type(1n), .large-up-5 > .columns:nth-of-type(1n) { + clear: none; } + .large-up-5 > .column:nth-of-type(5n+1), .large-up-5 > .columns:nth-of-type(5n+1) { + clear: both; } + .large-up-5 > .column:last-child, .large-up-5 > .columns:last-child { + float: left; } + .large-up-6 > .column, .large-up-6 > .columns { + width: 16.66667%; + float: left; } + .large-up-6 > .column:nth-of-type(1n), .large-up-6 > .columns:nth-of-type(1n) { + clear: none; } + .large-up-6 > .column:nth-of-type(6n+1), .large-up-6 > .columns:nth-of-type(6n+1) { + clear: both; } + .large-up-6 > .column:last-child, .large-up-6 > .columns:last-child { + float: left; } + .large-up-7 > .column, .large-up-7 > .columns { + width: 14.28571%; + float: left; } + .large-up-7 > .column:nth-of-type(1n), .large-up-7 > .columns:nth-of-type(1n) { + clear: none; } + .large-up-7 > .column:nth-of-type(7n+1), .large-up-7 > .columns:nth-of-type(7n+1) { + clear: both; } + .large-up-7 > .column:last-child, .large-up-7 > .columns:last-child { + float: left; } + .large-up-8 > .column, .large-up-8 > .columns { + width: 12.5%; + float: left; } + .large-up-8 > .column:nth-of-type(1n), .large-up-8 > .columns:nth-of-type(1n) { + clear: none; } + .large-up-8 > .column:nth-of-type(8n+1), .large-up-8 > .columns:nth-of-type(8n+1) { + clear: both; } + .large-up-8 > .column:last-child, .large-up-8 > .columns:last-child { + float: left; } + .large-collapse > .column, .large-collapse > .columns { + padding-left: 0; + padding-right: 0; } + .large-collapse .row, + .expanded.row .large-collapse.row { + margin-left: 0; + margin-right: 0; } + .large-uncollapse > .column, .large-uncollapse > .columns { + padding-left: 0.9375rem; + padding-right: 0.9375rem; } + .large-centered { + float: none; + margin-left: auto; + margin-right: auto; } + .large-uncentered, + .large-push-0, + .large-pull-0 { + position: static; + margin-left: 0; + margin-right: 0; + float: left; } } + +div, +dl, +dt, +dd, +ul, +ol, +li, +h1, +h2, +h3, +h4, +h5, +h6, +pre, +form, +p, +blockquote, +th, +td { + margin: 0; + padding: 0; } + +p { + font-size: inherit; + line-height: 1.6; + margin-bottom: 1rem; + text-rendering: optimizeLegibility; } + +em, +i { + font-style: italic; + line-height: inherit; } + +strong, +b { + font-weight: bold; + line-height: inherit; } + +small { + font-size: 80%; + line-height: inherit; } + +h1, +h2, +h3, +h4, +h5, +h6 { + font-family: "Helvetica Neue", Helvetica, Roboto, Arial, sans-serif; + font-weight: normal; + font-style: normal; + color: inherit; + text-rendering: optimizeLegibility; + margin-top: 0; + margin-bottom: 0.5rem; + line-height: 1.4; } + h1 small, + h2 small, + h3 small, + h4 small, + h5 small, + h6 small { + color: #cacaca; + line-height: 0; } + +h1 { + font-size: 1.5rem; } + +h2 { + font-size: 1.25rem; } + +h3 { + font-size: 1.1875rem; } + +h4 { + font-size: 1.125rem; } + +h5 { + font-size: 1.0625rem; } + +h6 { + font-size: 1rem; } + +@media screen and (min-width: 40em) { + h1 { + font-size: 3rem; } + h2 { + font-size: 2.5rem; } + h3 { + font-size: 1.9375rem; } + h4 { + font-size: 1.5625rem; } + h5 { + font-size: 1.25rem; } + h6 { + font-size: 1rem; } } + +a { + color: #2199e8; + text-decoration: none; + line-height: inherit; + cursor: pointer; } + a:hover, a:focus { + color: #1585cf; } + a img { + border: 0; } + +hr { + max-width: 75rem; + height: 0; + border-right: 0; + border-top: 0; + border-bottom: 1px solid #cacaca; + border-left: 0; + margin: 1.25rem auto; + clear: both; } + +ul, +ol, +dl { + line-height: 1.6; + margin-bottom: 1rem; + list-style-position: outside; } + +li { + font-size: inherit; } + +ul { + list-style-type: disc; + margin-left: 1.25rem; } + +ol { + margin-left: 1.25rem; } + +ul ul, ol ul, ul ol, ol ol { + margin-left: 1.25rem; + margin-bottom: 0; } + +dl { + margin-bottom: 1rem; } + dl dt { + margin-bottom: 0.3rem; + font-weight: bold; } + +blockquote { + margin: 0 0 1rem; + padding: 0.5625rem 1.25rem 0 1.1875rem; + border-left: 1px solid #cacaca; } + blockquote, blockquote p { + line-height: 1.6; + color: #8a8a8a; } + +cite { + display: block; + font-size: 0.8125rem; + color: #8a8a8a; } + cite:before { + content: '\2014 \0020'; } + +abbr { + color: #0a0a0a; + cursor: help; + border-bottom: 1px dotted #0a0a0a; } + +code { + font-family: Consolas, "Liberation Mono", Courier, monospace; + font-weight: normal; + color: #0a0a0a; + background-color: #e6e6e6; + border: 1px solid #cacaca; + padding: 0.125rem 0.3125rem 0.0625rem; } + +kbd { + padding: 0.125rem 0.25rem 0; + margin: 0; + background-color: #e6e6e6; + color: #0a0a0a; + font-family: Consolas, "Liberation Mono", Courier, monospace; } + +.subheader { + margin-top: 0.2rem; + margin-bottom: 0.5rem; + font-weight: normal; + line-height: 1.4; + color: #8a8a8a; } + +.lead { + font-size: 125%; + line-height: 1.6; } + +.stat { + font-size: 2.5rem; + line-height: 1; } + p + .stat { + margin-top: -1rem; } + +.no-bullet { + margin-left: 0; + list-style: none; } + +.text-left { + text-align: left; } + +.text-right { + text-align: right; } + +.text-center { + text-align: center; } + +.text-justify { + text-align: justify; } + +@media screen and (min-width: 40em) { + .medium-text-left { + text-align: left; } + .medium-text-right { + text-align: right; } + .medium-text-center { + text-align: center; } + .medium-text-justify { + text-align: justify; } } + +@media screen and (min-width: 64em) { + .large-text-left { + text-align: left; } + .large-text-right { + text-align: right; } + .large-text-center { + text-align: center; } + .large-text-justify { + text-align: justify; } } + +.show-for-print { + display: none !important; } + +@media print { + * { + background: transparent !important; + color: black !important; + box-shadow: none !important; + text-shadow: none !important; } + .show-for-print { + display: block !important; } + .hide-for-print { + display: none !important; } + table.show-for-print { + display: table !important; } + thead.show-for-print { + display: table-header-group !important; } + tbody.show-for-print { + display: table-row-group !important; } + tr.show-for-print { + display: table-row !important; } + td.show-for-print { + display: table-cell !important; } + th.show-for-print { + display: table-cell !important; } + a, + a:visited { + text-decoration: underline; } + a[href]:after { + content: " (" attr(href) ")"; } + .ir a:after, + a[href^='javascript:']:after, + a[href^='#']:after { + content: ''; } + abbr[title]:after { + content: " (" attr(title) ")"; } + pre, + blockquote { + border: 1px solid #8a8a8a; + page-break-inside: avoid; } + thead { + display: table-header-group; } + tr, + img { + page-break-inside: avoid; } + img { + max-width: 100% !important; } + @page { + margin: 0.5cm; } + p, + h2, + h3 { + orphans: 3; + widows: 3; } + h2, + h3 { + page-break-after: avoid; } } + +.button { + display: inline-block; + text-align: center; + line-height: 1; + cursor: pointer; + -webkit-appearance: none; + transition: background-color 0.25s ease-out, color 0.25s ease-out; + vertical-align: middle; + border: 1px solid transparent; + border-radius: 0; + padding: 0.85em 1em; + margin: 0 0 1rem 0; + font-size: 0.9rem; + background-color: #2199e8; + color: #fefefe; } + [data-whatinput='mouse'] .button { + outline: 0; } + .button:hover, .button:focus { + background-color: #1583cc; + color: #fefefe; } + .button.tiny { + font-size: 0.6rem; } + .button.small { + font-size: 0.75rem; } + .button.large { + font-size: 1.25rem; } + .button.expanded { + display: block; + width: 100%; + margin-left: 0; + margin-right: 0; } + .button.primary { + background-color: #2199e8; + color: #fefefe; } + .button.primary:hover, .button.primary:focus { + background-color: #147cc0; + color: #fefefe; } + .button.secondary { + background-color: #777; + color: #fefefe; } + .button.secondary:hover, .button.secondary:focus { + background-color: #5f5f5f; + color: #fefefe; } + .button.success { + background-color: #3adb76; + color: #fefefe; } + .button.success:hover, .button.success:focus { + background-color: #22bb5b; + color: #fefefe; } + .button.warning { + background-color: #ffae00; + color: #fefefe; } + .button.warning:hover, .button.warning:focus { + background-color: #cc8b00; + color: #fefefe; } + .button.alert { + background-color: #ec5840; + color: #fefefe; } + .button.alert:hover, .button.alert:focus { + background-color: #da3116; + color: #fefefe; } + .button.hollow { + border: 1px solid #2199e8; + color: #2199e8; } + .button.hollow, .button.hollow:hover, .button.hollow:focus { + background-color: transparent; } + .button.hollow:hover, .button.hollow:focus { + border-color: #0c4d78; + color: #0c4d78; } + .button.hollow.primary { + border: 1px solid #2199e8; + color: #2199e8; } + .button.hollow.primary:hover, .button.hollow.primary:focus { + border-color: #0c4d78; + color: #0c4d78; } + .button.hollow.secondary { + border: 1px solid #777; + color: #777; } + .button.hollow.secondary:hover, .button.hollow.secondary:focus { + border-color: #3c3c3c; + color: #3c3c3c; } + .button.hollow.success { + border: 1px solid #3adb76; + color: #3adb76; } + .button.hollow.success:hover, .button.hollow.success:focus { + border-color: #157539; + color: #157539; } + .button.hollow.warning { + border: 1px solid #ffae00; + color: #ffae00; } + .button.hollow.warning:hover, .button.hollow.warning:focus { + border-color: #805700; + color: #805700; } + .button.hollow.alert { + border: 1px solid #ec5840; + color: #ec5840; } + .button.hollow.alert:hover, .button.hollow.alert:focus { + border-color: #881f0e; + color: #881f0e; } + .button.disabled, .button[disabled] { + opacity: 0.25; + cursor: not-allowed; } + .button.disabled:hover, .button.disabled:focus, .button[disabled]:hover, .button[disabled]:focus { + background-color: #2199e8; + color: #fefefe; } + .button.dropdown::after { + content: ''; + display: block; + width: 0; + height: 0; + border: inset 0.4em; + border-color: #fefefe transparent transparent; + border-top-style: solid; + border-bottom-width: 0; + position: relative; + top: 0.4em; + float: right; + margin-left: 1em; + display: inline-block; } + .button.arrow-only::after { + margin-left: 0; + float: none; + top: -0.1em; } + +[type='text'], [type='password'], [type='date'], [type='datetime'], [type='datetime-local'], [type='month'], [type='week'], [type='email'], [type='number'], [type='search'], [type='tel'], [type='time'], [type='url'], [type='color'], +textarea { + display: block; + box-sizing: border-box; + width: 100%; + height: 2.4375rem; + padding: 0.5rem; + border: 1px solid #cacaca; + margin: 0 0 1rem; + font-family: inherit; + font-size: 1rem; + color: #0a0a0a; + background-color: #fefefe; + box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.1); + border-radius: 0; + transition: box-shadow 0.5s, border-color 0.25s ease-in-out; + -webkit-appearance: none; + -moz-appearance: none; } + [type='text']:focus, [type='password']:focus, [type='date']:focus, [type='datetime']:focus, [type='datetime-local']:focus, [type='month']:focus, [type='week']:focus, [type='email']:focus, [type='number']:focus, [type='search']:focus, [type='tel']:focus, [type='time']:focus, [type='url']:focus, [type='color']:focus, + textarea:focus { + border: 1px solid #8a8a8a; + background-color: #fefefe; + outline: none; + box-shadow: 0 0 5px #cacaca; + transition: box-shadow 0.5s, border-color 0.25s ease-in-out; } + +textarea { + max-width: 100%; } + textarea[rows] { + height: auto; } + +input::-webkit-input-placeholder, +textarea::-webkit-input-placeholder { + color: #cacaca; } + +input::-moz-placeholder, +textarea::-moz-placeholder { + color: #cacaca; } + +input:-ms-input-placeholder, +textarea:-ms-input-placeholder { + color: #cacaca; } + +input::placeholder, +textarea::placeholder { + color: #cacaca; } + +input:disabled, input[readonly], +textarea:disabled, +textarea[readonly] { + background-color: #e6e6e6; + cursor: not-allowed; } + +[type='submit'], +[type='button'] { + border-radius: 0; + -webkit-appearance: none; + -moz-appearance: none; } + +input[type='search'] { + box-sizing: border-box; } + +[type='file'], +[type='checkbox'], +[type='radio'] { + margin: 0 0 1rem; } + +[type='checkbox'] + label, +[type='radio'] + label { + display: inline-block; + margin-left: 0.5rem; + margin-right: 1rem; + margin-bottom: 0; + vertical-align: baseline; } + [type='checkbox'] + label[for], + [type='radio'] + label[for] { + cursor: pointer; } + +label > [type='checkbox'], +label > [type='radio'] { + margin-right: 0.5rem; } + +[type='file'] { + width: 100%; } + +label { + display: block; + margin: 0; + font-size: 0.875rem; + font-weight: normal; + line-height: 1.8; + color: #0a0a0a; } + label.middle { + margin: 0 0 1rem; + padding: 0.5625rem 0; } + +.help-text { + margin-top: -0.5rem; + font-size: 0.8125rem; + font-style: italic; + color: #0a0a0a; } + +.input-group { + display: table; + width: 100%; + margin-bottom: 1rem; } + .input-group > :first-child { + border-radius: 0 0 0 0; } + .input-group > :last-child > * { + border-radius: 0 0 0 0; } + +.input-group-label, .input-group-field, .input-group-button { + margin: 0; + white-space: nowrap; + display: table-cell; + vertical-align: middle; } + +.input-group-label { + text-align: center; + padding: 0 1rem; + background: #e6e6e6; + color: #0a0a0a; + border: 1px solid #cacaca; + white-space: nowrap; + width: 1%; + height: 100%; } + .input-group-label:first-child { + border-right: 0; } + .input-group-label:last-child { + border-left: 0; } + +.input-group-field { + border-radius: 0; + height: 2.5rem; } + +.input-group-button { + padding-top: 0; + padding-bottom: 0; + text-align: center; + height: 100%; + width: 1%; } + .input-group-button a, + .input-group-button input, + .input-group-button button { + margin: 0; } + +.input-group .input-group-button { + display: table-cell; } + +fieldset { + border: 0; + padding: 0; + margin: 0; } + +legend { + margin-bottom: 0.5rem; + max-width: 100%; } + +.fieldset { + border: 1px solid #cacaca; + padding: 1.25rem; + margin: 1.125rem 0; } + .fieldset legend { + background: #fefefe; + padding: 0 0.1875rem; + margin: 0; + margin-left: -0.1875rem; } + +select { + height: 2.4375rem; + padding: 0.5rem; + border: 1px solid #cacaca; + margin: 0 0 1rem; + font-size: 1rem; + font-family: inherit; + line-height: normal; + color: #0a0a0a; + background-color: #fefefe; + border-radius: 0; + -webkit-appearance: none; + -moz-appearance: none; + background-image: url("data:image/svg+xml;utf8,"); + background-size: 9px 6px; + background-position: right -1rem center; + background-origin: content-box; + background-repeat: no-repeat; + padding-right: 1.5rem; } + @media screen and (min-width: 0\0) { + select { + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg=="); } } + select:disabled { + background-color: #e6e6e6; + cursor: not-allowed; } + select::-ms-expand { + display: none; } + select[multiple] { + height: auto; + background-image: none; } + +.is-invalid-input:not(:focus) { + background-color: rgba(236, 88, 64, 0.1); + border-color: #ec5840; } + +.is-invalid-label { + color: #ec5840; } + +.form-error { + display: none; + margin-top: -0.5rem; + margin-bottom: 1rem; + font-size: 0.75rem; + font-weight: bold; + color: #ec5840; } + .form-error.is-visible { + display: block; } + +.accordion { + list-style-type: none; + background: #fefefe; + margin-left: 0; } + +.accordion-item:first-child > :first-child { + border-radius: 0 0 0 0; } + +.accordion-item:last-child > :last-child { + border-radius: 0 0 0 0; } + +.accordion-title { + display: block; + padding: 1.25rem 1rem; + line-height: 1; + font-size: 0.75rem; + color: #2199e8; + position: relative; + border: 1px solid #e6e6e6; + border-bottom: 0; } + :last-child:not(.is-active) > .accordion-title { + border-radius: 0 0 0 0; + border-bottom: 1px solid #e6e6e6; } + .accordion-title:hover, .accordion-title:focus { + background-color: #e6e6e6; } + .accordion-title::before { + content: '+'; + position: absolute; + right: 1rem; + top: 50%; + margin-top: -0.5rem; } + .is-active > .accordion-title::before { + content: '–'; } + +.accordion-content { + padding: 1rem; + display: none; + border: 1px solid #e6e6e6; + border-bottom: 0; + background-color: #fefefe; + color: #0a0a0a; } + :last-child > .accordion-content:last-child { + border-bottom: 1px solid #e6e6e6; } + +.is-accordion-submenu-parent > a { + position: relative; } + .is-accordion-submenu-parent > a::after { + content: ''; + display: block; + width: 0; + height: 0; + border: inset 6px; + border-color: #2199e8 transparent transparent; + border-top-style: solid; + border-bottom-width: 0; + position: absolute; + top: 50%; + margin-top: -4px; + right: 1rem; } + +.is-accordion-submenu-parent[aria-expanded='true'] > a::after { + -webkit-transform-origin: 50% 50%; + -ms-transform-origin: 50% 50%; + transform-origin: 50% 50%; + -webkit-transform: scaleY(-1); + -ms-transform: scaleY(-1); + transform: scaleY(-1); } + +.badge { + display: inline-block; + padding: 0.3em; + min-width: 2.1em; + font-size: 0.6rem; + text-align: center; + border-radius: 50%; + background: #2199e8; + color: #fefefe; } + .badge.secondary { + background: #777; + color: #fefefe; } + .badge.success { + background: #3adb76; + color: #fefefe; } + .badge.warning { + background: #ffae00; + color: #fefefe; } + .badge.alert { + background: #ec5840; + color: #fefefe; } + +.breadcrumbs { + list-style: none; + margin: 0 0 1rem 0; } + .breadcrumbs::before, .breadcrumbs::after { + content: ' '; + display: table; } + .breadcrumbs::after { + clear: both; } + .breadcrumbs li { + float: left; + color: #0a0a0a; + font-size: 0.6875rem; + cursor: default; + text-transform: uppercase; } + .breadcrumbs li:not(:last-child)::after { + color: #cacaca; + content: "/"; + margin: 0 0.75rem; + position: relative; + top: 1px; + opacity: 1; } + .breadcrumbs a { + color: #2199e8; } + .breadcrumbs a:hover { + text-decoration: underline; } + .breadcrumbs .disabled { + color: #cacaca; + cursor: not-allowed; } + +.button-group { + margin-bottom: 1rem; + font-size: 0; } + .button-group::before, .button-group::after { + content: ' '; + display: table; } + .button-group::after { + clear: both; } + .button-group .button { + margin: 0; + margin-right: 1px; + margin-bottom: 1px; + font-size: 0.9rem; } + .button-group .button:last-child { + margin-right: 0; } + .button-group.tiny .button { + font-size: 0.6rem; } + .button-group.small .button { + font-size: 0.75rem; } + .button-group.large .button { + font-size: 1.25rem; } + .button-group.expanded { + margin-right: -1px; } + .button-group.expanded::before, .button-group.expanded::after { + display: none; } + .button-group.expanded .button:first-child:nth-last-child(2), .button-group.expanded .button:first-child:nth-last-child(2):first-child:nth-last-child(2) ~ .button { + display: inline-block; + width: calc(50% - 1px); + margin-right: 1px; } + .button-group.expanded .button:first-child:nth-last-child(2):last-child, .button-group.expanded .button:first-child:nth-last-child(2):first-child:nth-last-child(2) ~ .button:last-child { + margin-right: -6px; } + .button-group.expanded .button:first-child:nth-last-child(3), .button-group.expanded .button:first-child:nth-last-child(3):first-child:nth-last-child(3) ~ .button { + display: inline-block; + width: calc(33.33333% - 1px); + margin-right: 1px; } + .button-group.expanded .button:first-child:nth-last-child(3):last-child, .button-group.expanded .button:first-child:nth-last-child(3):first-child:nth-last-child(3) ~ .button:last-child { + margin-right: -6px; } + .button-group.expanded .button:first-child:nth-last-child(4), .button-group.expanded .button:first-child:nth-last-child(4):first-child:nth-last-child(4) ~ .button { + display: inline-block; + width: calc(25% - 1px); + margin-right: 1px; } + .button-group.expanded .button:first-child:nth-last-child(4):last-child, .button-group.expanded .button:first-child:nth-last-child(4):first-child:nth-last-child(4) ~ .button:last-child { + margin-right: -6px; } + .button-group.expanded .button:first-child:nth-last-child(5), .button-group.expanded .button:first-child:nth-last-child(5):first-child:nth-last-child(5) ~ .button { + display: inline-block; + width: calc(20% - 1px); + margin-right: 1px; } + .button-group.expanded .button:first-child:nth-last-child(5):last-child, .button-group.expanded .button:first-child:nth-last-child(5):first-child:nth-last-child(5) ~ .button:last-child { + margin-right: -6px; } + .button-group.expanded .button:first-child:nth-last-child(6), .button-group.expanded .button:first-child:nth-last-child(6):first-child:nth-last-child(6) ~ .button { + display: inline-block; + width: calc(16.66667% - 1px); + margin-right: 1px; } + .button-group.expanded .button:first-child:nth-last-child(6):last-child, .button-group.expanded .button:first-child:nth-last-child(6):first-child:nth-last-child(6) ~ .button:last-child { + margin-right: -6px; } + .button-group.primary .button { + background-color: #2199e8; + color: #fefefe; } + .button-group.primary .button:hover, .button-group.primary .button:focus { + background-color: #147cc0; + color: #fefefe; } + .button-group.secondary .button { + background-color: #777; + color: #fefefe; } + .button-group.secondary .button:hover, .button-group.secondary .button:focus { + background-color: #5f5f5f; + color: #fefefe; } + .button-group.success .button { + background-color: #3adb76; + color: #fefefe; } + .button-group.success .button:hover, .button-group.success .button:focus { + background-color: #22bb5b; + color: #fefefe; } + .button-group.warning .button { + background-color: #ffae00; + color: #fefefe; } + .button-group.warning .button:hover, .button-group.warning .button:focus { + background-color: #cc8b00; + color: #fefefe; } + .button-group.alert .button { + background-color: #ec5840; + color: #fefefe; } + .button-group.alert .button:hover, .button-group.alert .button:focus { + background-color: #da3116; + color: #fefefe; } + .button-group.stacked .button, .button-group.stacked-for-small .button, .button-group.stacked-for-medium .button { + width: 100%; } + .button-group.stacked .button:last-child, .button-group.stacked-for-small .button:last-child, .button-group.stacked-for-medium .button:last-child { + margin-bottom: 0; } + @media screen and (min-width: 40em) { + .button-group.stacked-for-small .button { + width: auto; + margin-bottom: 0; } } + @media screen and (min-width: 64em) { + .button-group.stacked-for-medium .button { + width: auto; + margin-bottom: 0; } } + @media screen and (max-width: 39.9375em) { + .button-group.stacked-for-small.expanded { + display: block; } + .button-group.stacked-for-small.expanded .button { + display: block; + margin-right: 0; } } + +.callout { + margin: 0 0 1rem 0; + padding: 1rem; + border: 1px solid rgba(10, 10, 10, 0.25); + border-radius: 0; + position: relative; + color: #0a0a0a; + background-color: white; } + .callout > :first-child { + margin-top: 0; } + .callout > :last-child { + margin-bottom: 0; } + .callout.primary { + background-color: #def0fc; } + .callout.secondary { + background-color: #ebebeb; } + .callout.success { + background-color: #e1faea; } + .callout.warning { + background-color: #fff3d9; } + .callout.alert { + background-color: #fce6e2; } + .callout.small { + padding-top: 0.5rem; + padding-right: 0.5rem; + padding-bottom: 0.5rem; + padding-left: 0.5rem; } + .callout.large { + padding-top: 3rem; + padding-right: 3rem; + padding-bottom: 3rem; + padding-left: 3rem; } + +.close-button { + position: absolute; + color: #8a8a8a; + right: 1rem; + top: 0.5rem; + font-size: 2em; + line-height: 1; + cursor: pointer; } + [data-whatinput='mouse'] .close-button { + outline: 0; } + .close-button:hover, .close-button:focus { + color: #0a0a0a; } + +.menu { + margin: 0; + list-style-type: none; } + .menu > li { + display: table-cell; + vertical-align: middle; } + [data-whatinput='mouse'] .menu > li { + outline: 0; } + .menu > li > a { + display: block; + padding: 0.7rem 1rem; + line-height: 1; } + .menu input, + .menu a, + .menu button { + margin-bottom: 0; } + .menu > li > a img, + .menu > li > a i, + .menu > li > a svg { + vertical-align: middle; } + .menu > li > a img + span, + .menu > li > a i + span, + .menu > li > a svg + span { + vertical-align: middle; } + .menu > li > a img, + .menu > li > a i, + .menu > li > a svg { + margin-right: 0.25rem; + display: inline-block; } + .menu > li { + display: table-cell; } + .menu.vertical > li { + display: block; } + @media screen and (min-width: 40em) { + .menu.medium-horizontal > li { + display: table-cell; } + .menu.medium-vertical > li { + display: block; } } + @media screen and (min-width: 64em) { + .menu.large-horizontal > li { + display: table-cell; } + .menu.large-vertical > li { + display: block; } } + .menu.simple li { + line-height: 1; + display: inline-block; + margin-right: 1rem; } + .menu.simple a { + padding: 0; } + .menu.align-right::before, .menu.align-right::after { + content: ' '; + display: table; } + .menu.align-right::after { + clear: both; } + .menu.align-right > li { + float: right; } + .menu.expanded { + width: 100%; + display: table; + table-layout: fixed; } + .menu.expanded > li:first-child:last-child { + width: 100%; } + .menu.icon-top > li > a { + text-align: center; } + .menu.icon-top > li > a img, + .menu.icon-top > li > a i, + .menu.icon-top > li > a svg { + display: block; + margin: 0 auto 0.25rem; } + .menu.nested { + margin-left: 1rem; } + .menu .active > a { + color: #fefefe; + background: #2199e8; } + +.menu-text { + font-weight: bold; + color: inherit; + line-height: 1; + padding-top: 0; + padding-bottom: 0; + padding: 0.7rem 1rem; } + +.menu-centered { + text-align: center; } + .menu-centered > .menu { + display: inline-block; } + +.no-js [data-responsive-menu] ul { + display: none; } + +.menu-icon { + position: relative; + display: inline-block; + vertical-align: middle; + cursor: pointer; + width: 20px; + height: 16px; } + .menu-icon::after { + content: ''; + position: absolute; + display: block; + width: 100%; + height: 2px; + background: #fefefe; + top: 0; + left: 0; + box-shadow: 0 7px 0 #fefefe, 0 14px 0 #fefefe; } + .menu-icon:hover::after { + background: #cacaca; + box-shadow: 0 7px 0 #cacaca, 0 14px 0 #cacaca; } + +.menu-icon.dark { + position: relative; + display: inline-block; + vertical-align: middle; + cursor: pointer; + width: 20px; + height: 16px; } + .menu-icon.dark::after { + content: ''; + position: absolute; + display: block; + width: 100%; + height: 2px; + background: #0a0a0a; + top: 0; + left: 0; + box-shadow: 0 7px 0 #0a0a0a, 0 14px 0 #0a0a0a; } + .menu-icon.dark:hover::after { + background: #8a8a8a; + box-shadow: 0 7px 0 #8a8a8a, 0 14px 0 #8a8a8a; } + +.is-drilldown { + position: relative; + overflow: hidden; } + .is-drilldown li { + display: block !important; } + +.is-drilldown-submenu { + position: absolute; + top: 0; + left: 100%; + z-index: -1; + height: 100%; + width: 100%; + background: #fefefe; + transition: -webkit-transform 0.15s linear; + transition: transform 0.15s linear; } + .is-drilldown-submenu.is-active { + z-index: 1; + display: block; + -webkit-transform: translateX(-100%); + -ms-transform: translateX(-100%); + transform: translateX(-100%); } + .is-drilldown-submenu.is-closing { + -webkit-transform: translateX(100%); + -ms-transform: translateX(100%); + transform: translateX(100%); } + +.is-drilldown-submenu-parent > a { + position: relative; } + .is-drilldown-submenu-parent > a::after { + content: ''; + display: block; + width: 0; + height: 0; + border: inset 6px; + border-color: transparent transparent transparent #2199e8; + border-left-style: solid; + border-right-width: 0; + position: absolute; + top: 50%; + margin-top: -6px; + right: 1rem; } + +.js-drilldown-back > a::before { + content: ''; + display: block; + width: 0; + height: 0; + border: inset 6px; + border-color: transparent #2199e8 transparent transparent; + border-right-style: solid; + border-left-width: 0; + border-left-width: 0; + display: inline-block; + vertical-align: middle; + margin-right: 0.75rem; } + +.dropdown-pane { + background-color: #fefefe; + border: 1px solid #cacaca; + border-radius: 0; + display: block; + font-size: 1rem; + padding: 1rem; + position: absolute; + visibility: hidden; + width: 300px; + z-index: 10; } + .dropdown-pane.is-open { + visibility: visible; } + +.dropdown-pane.tiny { + width: 100px; } + +.dropdown-pane.small { + width: 200px; } + +.dropdown-pane.large { + width: 400px; } + +.dropdown.menu > li.opens-left > .is-dropdown-submenu { + left: auto; + right: 0; + top: 100%; } + +.dropdown.menu > li.opens-right > .is-dropdown-submenu { + right: auto; + left: 0; + top: 100%; } + +.dropdown.menu > li.is-dropdown-submenu-parent > a { + padding-right: 1.5rem; + position: relative; } + +.dropdown.menu > li.is-dropdown-submenu-parent > a::after { + content: ''; + display: block; + width: 0; + height: 0; + border: inset 5px; + border-color: #2199e8 transparent transparent; + border-top-style: solid; + border-bottom-width: 0; + right: 5px; + margin-top: -2px; } + +[data-whatinput='mouse'] .dropdown.menu a { + outline: 0; } + +.no-js .dropdown.menu ul { + display: none; } + +.dropdown.menu.vertical > li .is-dropdown-submenu { + top: 0; } + +.dropdown.menu.vertical > li.opens-left > .is-dropdown-submenu { + left: auto; + right: 100%; } + +.dropdown.menu.vertical > li.opens-right > .is-dropdown-submenu { + right: auto; + left: 100%; } + +.dropdown.menu.vertical > li > a::after { + right: 14px; + margin-top: -3px; } + +.dropdown.menu.vertical > li.opens-left > a::after { + content: ''; + display: block; + width: 0; + height: 0; + border: inset 5px; + border-color: transparent #2199e8 transparent transparent; + border-right-style: solid; + border-left-width: 0; } + +.dropdown.menu.vertical > li.opens-right > a::after { + content: ''; + display: block; + width: 0; + height: 0; + border: inset 5px; + border-color: transparent transparent transparent #2199e8; + border-left-style: solid; + border-right-width: 0; } + +@media screen and (min-width: 40em) { + .dropdown.menu.medium-horizontal > li.opens-left > .is-dropdown-submenu { + left: auto; + right: 0; + top: 100%; } + .dropdown.menu.medium-horizontal > li.opens-right > .is-dropdown-submenu { + right: auto; + left: 0; + top: 100%; } + .dropdown.menu.medium-horizontal > li.is-dropdown-submenu-parent > a { + padding-right: 1.5rem; + position: relative; } + .dropdown.menu.medium-horizontal > li.is-dropdown-submenu-parent > a::after { + content: ''; + display: block; + width: 0; + height: 0; + border: inset 5px; + border-color: #2199e8 transparent transparent; + border-top-style: solid; + border-bottom-width: 0; + right: 5px; + margin-top: -2px; } + .dropdown.menu.medium-vertical > li .is-dropdown-submenu { + top: 0; } + .dropdown.menu.medium-vertical > li.opens-left > .is-dropdown-submenu { + left: auto; + right: 100%; } + .dropdown.menu.medium-vertical > li.opens-right > .is-dropdown-submenu { + right: auto; + left: 100%; } + .dropdown.menu.medium-vertical > li > a::after { + right: 14px; + margin-top: -3px; } + .dropdown.menu.medium-vertical > li.opens-left > a::after { + content: ''; + display: block; + width: 0; + height: 0; + border: inset 5px; + border-color: transparent #2199e8 transparent transparent; + border-right-style: solid; + border-left-width: 0; } + .dropdown.menu.medium-vertical > li.opens-right > a::after { + content: ''; + display: block; + width: 0; + height: 0; + border: inset 5px; + border-color: transparent transparent transparent #2199e8; + border-left-style: solid; + border-right-width: 0; } } + +@media screen and (min-width: 64em) { + .dropdown.menu.large-horizontal > li.opens-left > .is-dropdown-submenu { + left: auto; + right: 0; + top: 100%; } + .dropdown.menu.large-horizontal > li.opens-right > .is-dropdown-submenu { + right: auto; + left: 0; + top: 100%; } + .dropdown.menu.large-horizontal > li.is-dropdown-submenu-parent > a { + padding-right: 1.5rem; + position: relative; } + .dropdown.menu.large-horizontal > li.is-dropdown-submenu-parent > a::after { + content: ''; + display: block; + width: 0; + height: 0; + border: inset 5px; + border-color: #2199e8 transparent transparent; + border-top-style: solid; + border-bottom-width: 0; + right: 5px; + margin-top: -2px; } + .dropdown.menu.large-vertical > li .is-dropdown-submenu { + top: 0; } + .dropdown.menu.large-vertical > li.opens-left > .is-dropdown-submenu { + left: auto; + right: 100%; } + .dropdown.menu.large-vertical > li.opens-right > .is-dropdown-submenu { + right: auto; + left: 100%; } + .dropdown.menu.large-vertical > li > a::after { + right: 14px; + margin-top: -3px; } + .dropdown.menu.large-vertical > li.opens-left > a::after { + content: ''; + display: block; + width: 0; + height: 0; + border: inset 5px; + border-color: transparent #2199e8 transparent transparent; + border-right-style: solid; + border-left-width: 0; } + .dropdown.menu.large-vertical > li.opens-right > a::after { + content: ''; + display: block; + width: 0; + height: 0; + border: inset 5px; + border-color: transparent transparent transparent #2199e8; + border-left-style: solid; + border-right-width: 0; } } + +.dropdown.menu.align-right .is-dropdown-submenu.first-sub { + top: 100%; + left: auto; + right: 0; } + +.is-dropdown-menu.vertical { + width: 100px; } + .is-dropdown-menu.vertical.align-right { + float: right; } + +.is-dropdown-submenu-parent { + position: relative; } + .is-dropdown-submenu-parent a::after { + position: absolute; + top: 50%; + right: 5px; + margin-top: -2px; } + .is-dropdown-submenu-parent.opens-inner > .is-dropdown-submenu { + top: 100%; + left: auto; } + .is-dropdown-submenu-parent.opens-left > .is-dropdown-submenu { + left: auto; + right: 100%; } + .is-dropdown-submenu-parent.opens-right > .is-dropdown-submenu { + right: auto; + left: 100%; } + +.is-dropdown-submenu { + display: none; + position: absolute; + top: 0; + left: 100%; + min-width: 200px; + z-index: 1; + background: #fefefe; + border: 1px solid #cacaca; } + .is-dropdown-submenu .is-dropdown-submenu-parent > a::after { + right: 14px; + margin-top: -3px; } + .is-dropdown-submenu .is-dropdown-submenu-parent.opens-left > a::after { + content: ''; + display: block; + width: 0; + height: 0; + border: inset 5px; + border-color: transparent #2199e8 transparent transparent; + border-right-style: solid; + border-left-width: 0; } + .is-dropdown-submenu .is-dropdown-submenu-parent.opens-right > a::after { + content: ''; + display: block; + width: 0; + height: 0; + border: inset 5px; + border-color: transparent transparent transparent #2199e8; + border-left-style: solid; + border-right-width: 0; } + .is-dropdown-submenu .is-dropdown-submenu { + margin-top: -1px; } + .is-dropdown-submenu > li { + width: 100%; } + .is-dropdown-submenu.js-dropdown-active { + display: block; } + +.flex-video { + position: relative; + height: 0; + padding-bottom: 75%; + margin-bottom: 1rem; + overflow: hidden; } + .flex-video iframe, + .flex-video object, + .flex-video embed, + .flex-video video { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; } + .flex-video.widescreen { + padding-bottom: 56.25%; } + .flex-video.vimeo { + padding-top: 0; } + +.label { + display: inline-block; + padding: 0.33333rem 0.5rem; + font-size: 0.8rem; + line-height: 1; + white-space: nowrap; + cursor: default; + border-radius: 0; + background: #2199e8; + color: #fefefe; } + .label.secondary { + background: #777; + color: #fefefe; } + .label.success { + background: #3adb76; + color: #fefefe; } + .label.warning { + background: #ffae00; + color: #fefefe; } + .label.alert { + background: #ec5840; + color: #fefefe; } + +.media-object { + margin-bottom: 1rem; + display: block; } + .media-object img { + max-width: none; } + @media screen and (max-width: 39.9375em) { + .media-object.stack-for-small .media-object-section { + padding: 0; + padding-bottom: 1rem; + display: block; } + .media-object.stack-for-small .media-object-section img { + width: 100%; } } + +.media-object-section { + display: table-cell; + vertical-align: top; } + .media-object-section:first-child { + padding-right: 1rem; } + .media-object-section:last-child:not(:nth-child(2)) { + padding-left: 1rem; } + .media-object-section > :last-child { + margin-bottom: 0; } + .media-object-section.middle { + vertical-align: middle; } + .media-object-section.bottom { + vertical-align: bottom; } + +html, +body { + height: 100%; } + +.off-canvas-wrapper { + width: 100%; + overflow-x: hidden; + position: relative; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-overflow-scrolling: auto; } + +.off-canvas-wrapper-inner { + position: relative; + width: 100%; + transition: -webkit-transform 0.5s ease; + transition: transform 0.5s ease; } + .off-canvas-wrapper-inner::before, .off-canvas-wrapper-inner::after { + content: ' '; + display: table; } + .off-canvas-wrapper-inner::after { + clear: both; } + +.off-canvas-content, +.off-canvas-content { + min-height: 100%; + background: #fefefe; + transition: -webkit-transform 0.5s ease; + transition: transform 0.5s ease; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + z-index: 1; + padding-bottom: 0.1px; + box-shadow: 0 0 10px rgba(10, 10, 10, 0.5); } + +.js-off-canvas-exit { + display: none; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: rgba(254, 254, 254, 0.25); + cursor: pointer; + transition: background 0.5s ease; } + +.off-canvas { + position: absolute; + background: #e6e6e6; + z-index: -1; + max-height: 100%; + overflow-y: auto; + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); } + [data-whatinput='mouse'] .off-canvas { + outline: 0; } + .off-canvas.position-left { + left: -250px; + top: 0; + width: 250px; } + .is-open-left { + -webkit-transform: translateX(250px); + -ms-transform: translateX(250px); + transform: translateX(250px); } + .off-canvas.position-right { + right: -250px; + top: 0; + width: 250px; } + .is-open-right { + -webkit-transform: translateX(-250px); + -ms-transform: translateX(-250px); + transform: translateX(-250px); } + +@media screen and (min-width: 40em) { + .position-left.reveal-for-medium { + left: 0; + z-index: auto; + position: fixed; } + .position-left.reveal-for-medium ~ .off-canvas-content { + margin-left: 250px; } + .position-right.reveal-for-medium { + right: 0; + z-index: auto; + position: fixed; } + .position-right.reveal-for-medium ~ .off-canvas-content { + margin-right: 250px; } } + +@media screen and (min-width: 64em) { + .position-left.reveal-for-large { + left: 0; + z-index: auto; + position: fixed; } + .position-left.reveal-for-large ~ .off-canvas-content { + margin-left: 250px; } + .position-right.reveal-for-large { + right: 0; + z-index: auto; + position: fixed; } + .position-right.reveal-for-large ~ .off-canvas-content { + margin-right: 250px; } } + +.orbit { + position: relative; } + +.orbit-container { + position: relative; + margin: 0; + overflow: hidden; + list-style: none; } + +.orbit-slide { + width: 100%; + max-height: 100%; } + .orbit-slide.no-motionui.is-active { + top: 0; + left: 0; } + +.orbit-figure { + margin: 0; } + +.orbit-image { + margin: 0; + width: 100%; + max-width: 100%; } + +.orbit-caption { + position: absolute; + bottom: 0; + width: 100%; + padding: 1rem; + margin-bottom: 0; + color: #fefefe; + background-color: rgba(10, 10, 10, 0.5); } + +.orbit-previous, .orbit-next { + position: absolute; + top: 50%; + -webkit-transform: translateY(-50%); + -ms-transform: translateY(-50%); + transform: translateY(-50%); + z-index: 10; + padding: 1rem; + color: #fefefe; } + [data-whatinput='mouse'] .orbit-previous, [data-whatinput='mouse'] .orbit-next { + outline: 0; } + .orbit-previous:hover, .orbit-next:hover, .orbit-previous:active, .orbit-next:active, .orbit-previous:focus, .orbit-next:focus { + background-color: rgba(10, 10, 10, 0.5); } + +.orbit-previous { + left: 0; } + +.orbit-next { + left: auto; + right: 0; } + +.orbit-bullets { + position: relative; + margin-top: 0.8rem; + margin-bottom: 0.8rem; + text-align: center; } + [data-whatinput='mouse'] .orbit-bullets { + outline: 0; } + .orbit-bullets button { + width: 1.2rem; + height: 1.2rem; + margin: 0.1rem; + background-color: #cacaca; + border-radius: 50%; } + .orbit-bullets button:hover { + background-color: #8a8a8a; } + .orbit-bullets button.is-active { + background-color: #8a8a8a; } + +.pagination { + margin-left: 0; + margin-bottom: 1rem; } + .pagination::before, .pagination::after { + content: ' '; + display: table; } + .pagination::after { + clear: both; } + .pagination li { + font-size: 0.875rem; + margin-right: 0.0625rem; + border-radius: 0; + display: none; } + .pagination li:last-child, .pagination li:first-child { + display: inline-block; } + @media screen and (min-width: 40em) { + .pagination li { + display: inline-block; } } + .pagination a, + .pagination button { + color: #0a0a0a; + display: block; + padding: 0.1875rem 0.625rem; + border-radius: 0; } + .pagination a:hover, + .pagination button:hover { + background: #e6e6e6; } + .pagination .current { + padding: 0.1875rem 0.625rem; + background: #2199e8; + color: #fefefe; + cursor: default; } + .pagination .disabled { + padding: 0.1875rem 0.625rem; + color: #cacaca; + cursor: not-allowed; } + .pagination .disabled:hover { + background: transparent; } + .pagination .ellipsis::after { + content: '\2026'; + padding: 0.1875rem 0.625rem; + color: #0a0a0a; } + +.pagination-previous a::before, +.pagination-previous.disabled::before { + content: '\00ab'; + display: inline-block; + margin-right: 0.5rem; } + +.pagination-next a::after, +.pagination-next.disabled::after { + content: '\00bb'; + display: inline-block; + margin-left: 0.5rem; } + +.progress { + background-color: #cacaca; + height: 1rem; + margin-bottom: 1rem; + border-radius: 0; } + .progress.primary .progress-meter { + background-color: #2199e8; } + .progress.secondary .progress-meter { + background-color: #777; } + .progress.success .progress-meter { + background-color: #3adb76; } + .progress.warning .progress-meter { + background-color: #ffae00; } + .progress.alert .progress-meter { + background-color: #ec5840; } + +.progress-meter { + position: relative; + display: block; + width: 0%; + height: 100%; + background-color: #2199e8; } + +.progress-meter-text { + position: absolute; + top: 50%; + left: 50%; + -webkit-transform: translate(-50%, -50%); + -ms-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + position: absolute; + margin: 0; + font-size: 0.75rem; + font-weight: bold; + color: #fefefe; + white-space: nowrap; } + +body.is-reveal-open { + overflow: hidden; } + +html.is-reveal-open, +html.is-reveal-open body { + height: 100%; + overflow: hidden; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } + +.reveal-overlay { + display: none; + position: fixed; + top: 0; + bottom: 0; + left: 0; + right: 0; + z-index: 1005; + background-color: rgba(10, 10, 10, 0.45); + overflow-y: scroll; } + +.reveal { + display: none; + z-index: 1006; + padding: 1rem; + border: 1px solid #cacaca; + background-color: #fefefe; + border-radius: 0; + position: relative; + top: 100px; + margin-left: auto; + margin-right: auto; + overflow-y: auto; } + [data-whatinput='mouse'] .reveal { + outline: 0; } + @media screen and (min-width: 40em) { + .reveal { + min-height: 0; } } + .reveal .column, .reveal .columns, + .reveal .columns { + min-width: 0; } + .reveal > :last-child { + margin-bottom: 0; } + @media screen and (min-width: 40em) { + .reveal { + width: 600px; + max-width: 75rem; } } + @media screen and (min-width: 40em) { + .reveal .reveal { + left: auto; + right: auto; + margin: 0 auto; } } + .reveal.collapse { + padding: 0; } + @media screen and (min-width: 40em) { + .reveal.tiny { + width: 30%; + max-width: 75rem; } } + @media screen and (min-width: 40em) { + .reveal.small { + width: 50%; + max-width: 75rem; } } + @media screen and (min-width: 40em) { + .reveal.large { + width: 90%; + max-width: 75rem; } } + .reveal.full { + top: 0; + left: 0; + width: 100%; + height: 100%; + height: 100vh; + min-height: 100vh; + max-width: none; + margin-left: 0; + border: 0; + border-radius: 0; } + @media screen and (max-width: 39.9375em) { + .reveal { + top: 0; + left: 0; + width: 100%; + height: 100%; + height: 100vh; + min-height: 100vh; + max-width: none; + margin-left: 0; + border: 0; + border-radius: 0; } } + .reveal.without-overlay { + position: fixed; } + +.slider { + position: relative; + height: 0.5rem; + margin-top: 1.25rem; + margin-bottom: 2.25rem; + background-color: #e6e6e6; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -ms-touch-action: none; + touch-action: none; } + +.slider-fill { + position: absolute; + top: 0; + left: 0; + display: inline-block; + max-width: 100%; + height: 0.5rem; + background-color: #cacaca; + transition: all 0.2s ease-in-out; } + .slider-fill.is-dragging { + transition: all 0s linear; } + +.slider-handle { + position: absolute; + top: 50%; + -webkit-transform: translateY(-50%); + -ms-transform: translateY(-50%); + transform: translateY(-50%); + position: absolute; + left: 0; + z-index: 1; + display: inline-block; + width: 1.4rem; + height: 1.4rem; + background-color: #2199e8; + transition: all 0.2s ease-in-out; + -ms-touch-action: manipulation; + touch-action: manipulation; + border-radius: 0; } + [data-whatinput='mouse'] .slider-handle { + outline: 0; } + .slider-handle:hover { + background-color: #1583cc; } + .slider-handle.is-dragging { + transition: all 0s linear; } + +.slider.disabled, +.slider[disabled] { + opacity: 0.25; + cursor: not-allowed; } + +.slider.vertical { + display: inline-block; + width: 0.5rem; + height: 12.5rem; + margin: 0 1.25rem; + -webkit-transform: scale(1, -1); + -ms-transform: scale(1, -1); + transform: scale(1, -1); } + .slider.vertical .slider-fill { + top: 0; + width: 0.5rem; + max-height: 100%; } + .slider.vertical .slider-handle { + position: absolute; + top: 0; + left: 50%; + width: 1.4rem; + height: 1.4rem; + -webkit-transform: translateX(-50%); + -ms-transform: translateX(-50%); + transform: translateX(-50%); } + +.sticky-container { + position: relative; } + +.sticky { + position: absolute; + z-index: 0; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); } + +.sticky.is-stuck { + position: fixed; + z-index: 5; } + .sticky.is-stuck.is-at-top { + top: 0; } + .sticky.is-stuck.is-at-bottom { + bottom: 0; } + +.sticky.is-anchored { + position: absolute; + left: auto; + right: auto; } + .sticky.is-anchored.is-at-bottom { + bottom: 0; } + +.switch { + margin-bottom: 1rem; + outline: 0; + position: relative; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + color: #fefefe; + font-weight: bold; + font-size: 0.875rem; } + +.switch-input { + opacity: 0; + position: absolute; } + +.switch-paddle { + background: #cacaca; + cursor: pointer; + display: block; + position: relative; + width: 4rem; + height: 2rem; + transition: all 0.25s ease-out; + border-radius: 0; + color: inherit; + font-weight: inherit; } + input + .switch-paddle { + margin: 0; } + .switch-paddle::after { + background: #fefefe; + content: ''; + display: block; + position: absolute; + height: 1.5rem; + left: 0.25rem; + top: 0.25rem; + width: 1.5rem; + transition: all 0.25s ease-out; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + border-radius: 0; } + input:checked ~ .switch-paddle { + background: #2199e8; } + input:checked ~ .switch-paddle::after { + left: 2.25rem; } + [data-whatinput='mouse'] input:focus ~ .switch-paddle { + outline: 0; } + +.switch-active, .switch-inactive { + position: absolute; + top: 50%; + -webkit-transform: translateY(-50%); + -ms-transform: translateY(-50%); + transform: translateY(-50%); } + +.switch-active { + left: 8%; + display: none; } + input:checked + label > .switch-active { + display: block; } + +.switch-inactive { + right: 15%; } + input:checked + label > .switch-inactive { + display: none; } + +.switch.tiny .switch-paddle { + width: 3rem; + height: 1.5rem; + font-size: 0.625rem; } + +.switch.tiny .switch-paddle::after { + width: 1rem; + height: 1rem; } + +.switch.tiny input:checked ~ .switch-paddle::after { + left: 1.75rem; } + +.switch.small .switch-paddle { + width: 3.5rem; + height: 1.75rem; + font-size: 0.75rem; } + +.switch.small .switch-paddle::after { + width: 1.25rem; + height: 1.25rem; } + +.switch.small input:checked ~ .switch-paddle::after { + left: 2rem; } + +.switch.large .switch-paddle { + width: 5rem; + height: 2.5rem; + font-size: 1rem; } + +.switch.large .switch-paddle::after { + width: 2rem; + height: 2rem; } + +.switch.large input:checked ~ .switch-paddle::after { + left: 2.75rem; } + +table { + width: 100%; + margin-bottom: 1rem; + border-radius: 0; } + table thead, + table tbody, + table tfoot { + border: 1px solid #f1f1f1; + background-color: #fefefe; } + table caption { + font-weight: bold; + padding: 0.5rem 0.625rem 0.625rem; } + table thead, + table tfoot { + background: #f8f8f8; + color: #0a0a0a; } + table thead tr, + table tfoot tr { + background: transparent; } + table thead th, + table thead td, + table tfoot th, + table tfoot td { + padding: 0.5rem 0.625rem 0.625rem; + font-weight: bold; + text-align: left; } + table tbody tr:nth-child(even) { + background-color: #f1f1f1; } + table tbody th, + table tbody td { + padding: 0.5rem 0.625rem 0.625rem; } + +@media screen and (max-width: 63.9375em) { + table.stack thead { + display: none; } + table.stack tfoot { + display: none; } + table.stack tr, + table.stack th, + table.stack td { + display: block; } + table.stack td { + border-top: 0; } } + +table.scroll { + display: block; + width: 100%; + overflow-x: auto; } + +table.hover tr:hover { + background-color: #f9f9f9; } + +table.hover tr:nth-of-type(even):hover { + background-color: #ececec; } + +.table-scroll { + overflow-x: auto; } + .table-scroll table { + width: auto; } + +.tabs { + margin: 0; + list-style-type: none; + background: #fefefe; + border: 1px solid #e6e6e6; } + .tabs::before, .tabs::after { + content: ' '; + display: table; } + .tabs::after { + clear: both; } + +.tabs.vertical > li { + width: auto; + float: none; + display: block; } + +.tabs.simple > li > a { + padding: 0; } + .tabs.simple > li > a:hover { + background: transparent; } + +.tabs.primary { + background: #2199e8; } + .tabs.primary > li > a { + color: #fefefe; } + .tabs.primary > li > a:hover, .tabs.primary > li > a:focus { + background: #1893e4; } + +.tabs-title { + float: left; } + .tabs-title > a { + display: block; + padding: 1.25rem 1.5rem; + line-height: 1; + font-size: 0.75rem; } + .tabs-title > a:hover { + background: #fefefe; } + .tabs-title > a:focus, .tabs-title > a[aria-selected='true'] { + background: #e6e6e6; } + +.tabs-content { + background: #fefefe; + transition: all 0.5s ease; + border: 1px solid #e6e6e6; + border-top: 0; } + +.tabs-content.vertical { + border: 1px solid #e6e6e6; + border-left: 0; } + +.tabs-panel { + display: none; + padding: 1rem; } + .tabs-panel.is-active { + display: block; } + +.thumbnail { + border: solid 4px #fefefe; + box-shadow: 0 0 0 1px rgba(10, 10, 10, 0.2); + display: inline-block; + line-height: 0; + max-width: 100%; + transition: box-shadow 200ms ease-out; + border-radius: 0; + margin-bottom: 1rem; } + .thumbnail:hover, .thumbnail:focus { + box-shadow: 0 0 6px 1px rgba(33, 153, 232, 0.5); } + +.title-bar { + background: #0a0a0a; + color: #fefefe; + padding: 0.5rem; } + .title-bar::before, .title-bar::after { + content: ' '; + display: table; } + .title-bar::after { + clear: both; } + .title-bar .menu-icon { + margin-left: 0.25rem; + margin-right: 0.25rem; } + +.title-bar-left { + float: left; } + +.title-bar-right { + float: right; + text-align: right; } + +.title-bar-title { + font-weight: bold; + vertical-align: middle; + display: inline-block; } + +.menu-icon.dark { + position: relative; + display: inline-block; + vertical-align: middle; + cursor: pointer; + width: 20px; + height: 16px; } + .menu-icon.dark::after { + content: ''; + position: absolute; + display: block; + width: 100%; + height: 2px; + background: #0a0a0a; + top: 0; + left: 0; + box-shadow: 0 7px 0 #0a0a0a, 0 14px 0 #0a0a0a; } + .menu-icon.dark:hover::after { + background: #8a8a8a; + box-shadow: 0 7px 0 #8a8a8a, 0 14px 0 #8a8a8a; } + +.has-tip { + border-bottom: dotted 1px #8a8a8a; + font-weight: bold; + position: relative; + display: inline-block; + cursor: help; } + +.tooltip { + background-color: #0a0a0a; + color: #fefefe; + font-size: 80%; + padding: 0.75rem; + position: absolute; + z-index: 10; + top: calc(100% + 0.6495rem); + max-width: 10rem !important; + border-radius: 0; } + .tooltip::before { + content: ''; + display: block; + width: 0; + height: 0; + border: inset 0.75rem; + border-color: transparent transparent #0a0a0a; + border-bottom-style: solid; + border-top-width: 0; + bottom: 100%; + position: absolute; + left: 50%; + -webkit-transform: translateX(-50%); + -ms-transform: translateX(-50%); + transform: translateX(-50%); } + .tooltip.top::before { + content: ''; + display: block; + width: 0; + height: 0; + border: inset 0.75rem; + border-color: #0a0a0a transparent transparent; + border-top-style: solid; + border-bottom-width: 0; + top: 100%; + bottom: auto; } + .tooltip.left::before { + content: ''; + display: block; + width: 0; + height: 0; + border: inset 0.75rem; + border-color: transparent transparent transparent #0a0a0a; + border-left-style: solid; + border-right-width: 0; + bottom: auto; + left: 100%; + top: 50%; + -webkit-transform: translateY(-50%); + -ms-transform: translateY(-50%); + transform: translateY(-50%); } + .tooltip.right::before { + content: ''; + display: block; + width: 0; + height: 0; + border: inset 0.75rem; + border-color: transparent #0a0a0a transparent transparent; + border-right-style: solid; + border-left-width: 0; + bottom: auto; + left: auto; + right: 100%; + top: 50%; + -webkit-transform: translateY(-50%); + -ms-transform: translateY(-50%); + transform: translateY(-50%); } + +.top-bar { + padding: 0.5rem; } + .top-bar::before, .top-bar::after { + content: ' '; + display: table; } + .top-bar::after { + clear: both; } + .top-bar, + .top-bar ul { + background-color: #e6e6e6; } + .top-bar input { + max-width: 200px; + margin-right: 1rem; } + .top-bar .input-group-field { + width: 100%; + margin-right: 0; } + .top-bar input.button { + width: auto; } + .top-bar .top-bar-left, + .top-bar .top-bar-right { + width: 100%; } + @media screen and (min-width: 40em) { + .top-bar .top-bar-left, + .top-bar .top-bar-right { + width: auto; } } + @media screen and (max-width: 63.9375em) { + .top-bar.stacked-for-medium .top-bar-left, + .top-bar.stacked-for-medium .top-bar-right { + width: 100%; } } + @media screen and (max-width: 74.9375em) { + .top-bar.stacked-for-large .top-bar-left, + .top-bar.stacked-for-large .top-bar-right { + width: 100%; } } + +.top-bar-title { + float: left; + margin-right: 1rem; } + +.top-bar-left { + float: left; } + +.top-bar-right { + float: right; } + +.hide { + display: none !important; } + +.invisible { + visibility: hidden; } + +@media screen and (max-width: 39.9375em) { + .hide-for-small-only { + display: none !important; } } + +@media screen and (max-width: 0em), screen and (min-width: 40em) { + .show-for-small-only { + display: none !important; } } + +@media screen and (min-width: 40em) { + .hide-for-medium { + display: none !important; } } + +@media screen and (max-width: 39.9375em) { + .show-for-medium { + display: none !important; } } + +@media screen and (min-width: 40em) and (max-width: 63.9375em) { + .hide-for-medium-only { + display: none !important; } } + +@media screen and (max-width: 39.9375em), screen and (min-width: 64em) { + .show-for-medium-only { + display: none !important; } } + +@media screen and (min-width: 64em) { + .hide-for-large { + display: none !important; } } + +@media screen and (max-width: 63.9375em) { + .show-for-large { + display: none !important; } } + +@media screen and (min-width: 64em) and (max-width: 74.9375em) { + .hide-for-large-only { + display: none !important; } } + +@media screen and (max-width: 63.9375em), screen and (min-width: 75em) { + .show-for-large-only { + display: none !important; } } + +.show-for-sr, +.show-on-focus { + position: absolute !important; + width: 1px; + height: 1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); } + +.show-on-focus:active, .show-on-focus:focus { + position: static !important; + height: auto; + width: auto; + overflow: visible; + clip: auto; } + +.show-for-landscape, +.hide-for-portrait { + display: block !important; } + @media screen and (orientation: landscape) { + .show-for-landscape, + .hide-for-portrait { + display: block !important; } } + @media screen and (orientation: portrait) { + .show-for-landscape, + .hide-for-portrait { + display: none !important; } } + +.hide-for-landscape, +.show-for-portrait { + display: none !important; } + @media screen and (orientation: landscape) { + .hide-for-landscape, + .show-for-portrait { + display: none !important; } } + @media screen and (orientation: portrait) { + .hide-for-landscape, + .show-for-portrait { + display: block !important; } } + +.float-left { + float: left !important; } + +.float-right { + float: right !important; } + +.float-center { + display: block; + margin-left: auto; + margin-right: auto; } + +.clearfix::before, .clearfix::after { + content: ' '; + display: table; } + +.clearfix::after { + clear: both; } + +.slide-in-down.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + -webkit-transform: translateY(-100%); + -ms-transform: translateY(-100%); + transform: translateY(-100%); + transition-property: -webkit-transform, opacity; + transition-property: transform, opacity; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; } + +.slide-in-down.mui-enter.mui-enter-active { + -webkit-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); } + +.slide-in-left.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + -webkit-transform: translateX(-100%); + -ms-transform: translateX(-100%); + transform: translateX(-100%); + transition-property: -webkit-transform, opacity; + transition-property: transform, opacity; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; } + +.slide-in-left.mui-enter.mui-enter-active { + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); } + +.slide-in-up.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + -webkit-transform: translateY(100%); + -ms-transform: translateY(100%); + transform: translateY(100%); + transition-property: -webkit-transform, opacity; + transition-property: transform, opacity; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; } + +.slide-in-up.mui-enter.mui-enter-active { + -webkit-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); } + +.slide-in-right.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + -webkit-transform: translateX(100%); + -ms-transform: translateX(100%); + transform: translateX(100%); + transition-property: -webkit-transform, opacity; + transition-property: transform, opacity; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; } + +.slide-in-right.mui-enter.mui-enter-active { + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); } + +.slide-out-down.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + -webkit-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + transition-property: -webkit-transform, opacity; + transition-property: transform, opacity; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; } + +.slide-out-down.mui-leave.mui-leave-active { + -webkit-transform: translateY(100%); + -ms-transform: translateY(100%); + transform: translateY(100%); } + +.slide-out-right.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + transition-property: -webkit-transform, opacity; + transition-property: transform, opacity; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; } + +.slide-out-right.mui-leave.mui-leave-active { + -webkit-transform: translateX(100%); + -ms-transform: translateX(100%); + transform: translateX(100%); } + +.slide-out-up.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + -webkit-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + transition-property: -webkit-transform, opacity; + transition-property: transform, opacity; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; } + +.slide-out-up.mui-leave.mui-leave-active { + -webkit-transform: translateY(-100%); + -ms-transform: translateY(-100%); + transform: translateY(-100%); } + +.slide-out-left.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + transition-property: -webkit-transform, opacity; + transition-property: transform, opacity; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; } + +.slide-out-left.mui-leave.mui-leave-active { + -webkit-transform: translateX(-100%); + -ms-transform: translateX(-100%); + transform: translateX(-100%); } + +.fade-in.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + opacity: 0; + transition-property: opacity; } + +.fade-in.mui-enter.mui-enter-active { + opacity: 1; } + +.fade-out.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + opacity: 1; + transition-property: opacity; } + +.fade-out.mui-leave.mui-leave-active { + opacity: 0; } + +.hinge-in-from-top.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + -webkit-transform: perspective(2000px) rotateX(-90deg); + transform: perspective(2000px) rotateX(-90deg); + -webkit-transform-origin: top; + -ms-transform-origin: top; + transform-origin: top; + transition-property: -webkit-transform, opacity; + transition-property: transform, opacity; + opacity: 0; } + +.hinge-in-from-top.mui-enter.mui-enter-active { + -webkit-transform: perspective(2000px) rotate(0deg); + transform: perspective(2000px) rotate(0deg); + opacity: 1; } + +.hinge-in-from-right.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + -webkit-transform: perspective(2000px) rotateY(-90deg); + transform: perspective(2000px) rotateY(-90deg); + -webkit-transform-origin: right; + -ms-transform-origin: right; + transform-origin: right; + transition-property: -webkit-transform, opacity; + transition-property: transform, opacity; + opacity: 0; } + +.hinge-in-from-right.mui-enter.mui-enter-active { + -webkit-transform: perspective(2000px) rotate(0deg); + transform: perspective(2000px) rotate(0deg); + opacity: 1; } + +.hinge-in-from-bottom.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + -webkit-transform: perspective(2000px) rotateX(90deg); + transform: perspective(2000px) rotateX(90deg); + -webkit-transform-origin: bottom; + -ms-transform-origin: bottom; + transform-origin: bottom; + transition-property: -webkit-transform, opacity; + transition-property: transform, opacity; + opacity: 0; } + +.hinge-in-from-bottom.mui-enter.mui-enter-active { + -webkit-transform: perspective(2000px) rotate(0deg); + transform: perspective(2000px) rotate(0deg); + opacity: 1; } + +.hinge-in-from-left.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + -webkit-transform: perspective(2000px) rotateY(90deg); + transform: perspective(2000px) rotateY(90deg); + -webkit-transform-origin: left; + -ms-transform-origin: left; + transform-origin: left; + transition-property: -webkit-transform, opacity; + transition-property: transform, opacity; + opacity: 0; } + +.hinge-in-from-left.mui-enter.mui-enter-active { + -webkit-transform: perspective(2000px) rotate(0deg); + transform: perspective(2000px) rotate(0deg); + opacity: 1; } + +.hinge-in-from-middle-x.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + -webkit-transform: perspective(2000px) rotateX(-90deg); + transform: perspective(2000px) rotateX(-90deg); + -webkit-transform-origin: center; + -ms-transform-origin: center; + transform-origin: center; + transition-property: -webkit-transform, opacity; + transition-property: transform, opacity; + opacity: 0; } + +.hinge-in-from-middle-x.mui-enter.mui-enter-active { + -webkit-transform: perspective(2000px) rotate(0deg); + transform: perspective(2000px) rotate(0deg); + opacity: 1; } + +.hinge-in-from-middle-y.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + -webkit-transform: perspective(2000px) rotateY(-90deg); + transform: perspective(2000px) rotateY(-90deg); + -webkit-transform-origin: center; + -ms-transform-origin: center; + transform-origin: center; + transition-property: -webkit-transform, opacity; + transition-property: transform, opacity; + opacity: 0; } + +.hinge-in-from-middle-y.mui-enter.mui-enter-active { + -webkit-transform: perspective(2000px) rotate(0deg); + transform: perspective(2000px) rotate(0deg); + opacity: 1; } + +.hinge-out-from-top.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + -webkit-transform: perspective(2000px) rotate(0deg); + transform: perspective(2000px) rotate(0deg); + -webkit-transform-origin: top; + -ms-transform-origin: top; + transform-origin: top; + transition-property: -webkit-transform, opacity; + transition-property: transform, opacity; + opacity: 1; } + +.hinge-out-from-top.mui-leave.mui-leave-active { + -webkit-transform: perspective(2000px) rotateX(-90deg); + transform: perspective(2000px) rotateX(-90deg); + opacity: 0; } + +.hinge-out-from-right.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + -webkit-transform: perspective(2000px) rotate(0deg); + transform: perspective(2000px) rotate(0deg); + -webkit-transform-origin: right; + -ms-transform-origin: right; + transform-origin: right; + transition-property: -webkit-transform, opacity; + transition-property: transform, opacity; + opacity: 1; } + +.hinge-out-from-right.mui-leave.mui-leave-active { + -webkit-transform: perspective(2000px) rotateY(-90deg); + transform: perspective(2000px) rotateY(-90deg); + opacity: 0; } + +.hinge-out-from-bottom.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + -webkit-transform: perspective(2000px) rotate(0deg); + transform: perspective(2000px) rotate(0deg); + -webkit-transform-origin: bottom; + -ms-transform-origin: bottom; + transform-origin: bottom; + transition-property: -webkit-transform, opacity; + transition-property: transform, opacity; + opacity: 1; } + +.hinge-out-from-bottom.mui-leave.mui-leave-active { + -webkit-transform: perspective(2000px) rotateX(90deg); + transform: perspective(2000px) rotateX(90deg); + opacity: 0; } + +.hinge-out-from-left.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + -webkit-transform: perspective(2000px) rotate(0deg); + transform: perspective(2000px) rotate(0deg); + -webkit-transform-origin: left; + -ms-transform-origin: left; + transform-origin: left; + transition-property: -webkit-transform, opacity; + transition-property: transform, opacity; + opacity: 1; } + +.hinge-out-from-left.mui-leave.mui-leave-active { + -webkit-transform: perspective(2000px) rotateY(90deg); + transform: perspective(2000px) rotateY(90deg); + opacity: 0; } + +.hinge-out-from-middle-x.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + -webkit-transform: perspective(2000px) rotate(0deg); + transform: perspective(2000px) rotate(0deg); + -webkit-transform-origin: center; + -ms-transform-origin: center; + transform-origin: center; + transition-property: -webkit-transform, opacity; + transition-property: transform, opacity; + opacity: 1; } + +.hinge-out-from-middle-x.mui-leave.mui-leave-active { + -webkit-transform: perspective(2000px) rotateX(-90deg); + transform: perspective(2000px) rotateX(-90deg); + opacity: 0; } + +.hinge-out-from-middle-y.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + -webkit-transform: perspective(2000px) rotate(0deg); + transform: perspective(2000px) rotate(0deg); + -webkit-transform-origin: center; + -ms-transform-origin: center; + transform-origin: center; + transition-property: -webkit-transform, opacity; + transition-property: transform, opacity; + opacity: 1; } + +.hinge-out-from-middle-y.mui-leave.mui-leave-active { + -webkit-transform: perspective(2000px) rotateY(-90deg); + transform: perspective(2000px) rotateY(-90deg); + opacity: 0; } + +.scale-in-up.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + -webkit-transform: scale(0.5); + -ms-transform: scale(0.5); + transform: scale(0.5); + transition-property: -webkit-transform, opacity; + transition-property: transform, opacity; + opacity: 0; } + +.scale-in-up.mui-enter.mui-enter-active { + -webkit-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + opacity: 1; } + +.scale-in-down.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + -webkit-transform: scale(1.5); + -ms-transform: scale(1.5); + transform: scale(1.5); + transition-property: -webkit-transform, opacity; + transition-property: transform, opacity; + opacity: 0; } + +.scale-in-down.mui-enter.mui-enter-active { + -webkit-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + opacity: 1; } + +.scale-out-up.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + -webkit-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + transition-property: -webkit-transform, opacity; + transition-property: transform, opacity; + opacity: 1; } + +.scale-out-up.mui-leave.mui-leave-active { + -webkit-transform: scale(1.5); + -ms-transform: scale(1.5); + transform: scale(1.5); + opacity: 0; } + +.scale-out-down.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + -webkit-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + transition-property: -webkit-transform, opacity; + transition-property: transform, opacity; + opacity: 1; } + +.scale-out-down.mui-leave.mui-leave-active { + -webkit-transform: scale(0.5); + -ms-transform: scale(0.5); + transform: scale(0.5); + opacity: 0; } + +.spin-in.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + -webkit-transform: rotate(-0.75turn); + -ms-transform: rotate(-0.75turn); + transform: rotate(-0.75turn); + transition-property: -webkit-transform, opacity; + transition-property: transform, opacity; + opacity: 0; } + +.spin-in.mui-enter.mui-enter-active { + -webkit-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); + opacity: 1; } + +.spin-out.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + -webkit-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); + transition-property: -webkit-transform, opacity; + transition-property: transform, opacity; + opacity: 1; } + +.spin-out.mui-leave.mui-leave-active { + -webkit-transform: rotate(0.75turn); + -ms-transform: rotate(0.75turn); + transform: rotate(0.75turn); + opacity: 0; } + +.spin-in-ccw.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + -webkit-transform: rotate(0.75turn); + -ms-transform: rotate(0.75turn); + transform: rotate(0.75turn); + transition-property: -webkit-transform, opacity; + transition-property: transform, opacity; + opacity: 0; } + +.spin-in-ccw.mui-enter.mui-enter-active { + -webkit-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); + opacity: 1; } + +.spin-out-ccw.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + -webkit-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); + transition-property: -webkit-transform, opacity; + transition-property: transform, opacity; + opacity: 1; } + +.spin-out-ccw.mui-leave.mui-leave-active { + -webkit-transform: rotate(-0.75turn); + -ms-transform: rotate(-0.75turn); + transform: rotate(-0.75turn); + opacity: 0; } + +.slow { + transition-duration: 750ms !important; } + +.fast { + transition-duration: 250ms !important; } + +.linear { + transition-timing-function: linear !important; } + +.ease { + transition-timing-function: ease !important; } + +.ease-in { + transition-timing-function: ease-in !important; } + +.ease-out { + transition-timing-function: ease-out !important; } + +.ease-in-out { + transition-timing-function: ease-in-out !important; } + +.bounce-in { + transition-timing-function: cubic-bezier(0.485, 0.155, 0.24, 1.245) !important; } + +.bounce-out { + transition-timing-function: cubic-bezier(0.485, 0.155, 0.515, 0.845) !important; } + +.bounce-in-out { + transition-timing-function: cubic-bezier(0.76, -0.245, 0.24, 1.245) !important; } + +.short-delay { + transition-delay: 300ms !important; } + +.long-delay { + transition-delay: 700ms !important; } + +.shake { + -webkit-animation-name: shake-7; + animation-name: shake-7; } + +@-webkit-keyframes shake-7 { + 0%, 10%, 20%, 30%, 40%, 50%, 60%, 70%, 80%, 90% { + -webkit-transform: translateX(7%); + transform: translateX(7%); } + 5%, 15%, 25%, 35%, 45%, 55%, 65%, 75%, 85%, 95% { + -webkit-transform: translateX(-7%); + transform: translateX(-7%); } } + +@keyframes shake-7 { + 0%, 10%, 20%, 30%, 40%, 50%, 60%, 70%, 80%, 90% { + -webkit-transform: translateX(7%); + transform: translateX(7%); } + 5%, 15%, 25%, 35%, 45%, 55%, 65%, 75%, 85%, 95% { + -webkit-transform: translateX(-7%); + transform: translateX(-7%); } } + +.spin-cw { + -webkit-animation-name: spin-cw-1turn; + animation-name: spin-cw-1turn; } + +@-webkit-keyframes spin-cw-1turn { + 0% { + -webkit-transform: rotate(-1turn); + transform: rotate(-1turn); } + 100% { + -webkit-transform: rotate(0); + transform: rotate(0); } } + +@keyframes spin-cw-1turn { + 0% { + -webkit-transform: rotate(-1turn); + transform: rotate(-1turn); } + 100% { + -webkit-transform: rotate(0); + transform: rotate(0); } } + +.spin-ccw { + -webkit-animation-name: spin-cw-1turn; + animation-name: spin-cw-1turn; } + +@keyframes spin-cw-1turn { + 0% { + -webkit-transform: rotate(0); + transform: rotate(0); } + 100% { + -webkit-transform: rotate(1turn); + transform: rotate(1turn); } } + +.wiggle { + -webkit-animation-name: wiggle-7deg; + animation-name: wiggle-7deg; } + +@-webkit-keyframes wiggle-7deg { + 40%, 50%, 60% { + -webkit-transform: rotate(7deg); + transform: rotate(7deg); } + 35%, 45%, 55%, 65% { + -webkit-transform: rotate(-7deg); + transform: rotate(-7deg); } + 0%, 30%, 70%, 100% { + -webkit-transform: rotate(0); + transform: rotate(0); } } + +@keyframes wiggle-7deg { + 40%, 50%, 60% { + -webkit-transform: rotate(7deg); + transform: rotate(7deg); } + 35%, 45%, 55%, 65% { + -webkit-transform: rotate(-7deg); + transform: rotate(-7deg); } + 0%, 30%, 70%, 100% { + -webkit-transform: rotate(0); + transform: rotate(0); } } + +.shake, +.spin-cw, +.spin-ccw, +.wiggle { + -webkit-animation-duration: 500ms; + animation-duration: 500ms; } + +.infinite { + -webkit-animation-iteration-count: infinite; + animation-iteration-count: infinite; } + +.slow { + -webkit-animation-duration: 750ms !important; + animation-duration: 750ms !important; } + +.fast { + -webkit-animation-duration: 250ms !important; + animation-duration: 250ms !important; } + +.linear { + -webkit-animation-timing-function: linear !important; + animation-timing-function: linear !important; } + +.ease { + -webkit-animation-timing-function: ease !important; + animation-timing-function: ease !important; } + +.ease-in { + -webkit-animation-timing-function: ease-in !important; + animation-timing-function: ease-in !important; } + +.ease-out { + -webkit-animation-timing-function: ease-out !important; + animation-timing-function: ease-out !important; } + +.ease-in-out { + -webkit-animation-timing-function: ease-in-out !important; + animation-timing-function: ease-in-out !important; } + +.bounce-in { + -webkit-animation-timing-function: cubic-bezier(0.485, 0.155, 0.24, 1.245) !important; + animation-timing-function: cubic-bezier(0.485, 0.155, 0.24, 1.245) !important; } + +.bounce-out { + -webkit-animation-timing-function: cubic-bezier(0.485, 0.155, 0.515, 0.845) !important; + animation-timing-function: cubic-bezier(0.485, 0.155, 0.515, 0.845) !important; } + +.bounce-in-out { + -webkit-animation-timing-function: cubic-bezier(0.76, -0.245, 0.24, 1.245) !important; + animation-timing-function: cubic-bezier(0.76, -0.245, 0.24, 1.245) !important; } + +.short-delay { + -webkit-animation-delay: 300ms !important; + animation-delay: 300ms !important; } + +.long-delay { + -webkit-animation-delay: 700ms !important; + animation-delay: 700ms !important; } diff --git a/app/models/category.rb b/app/models/category.rb new file mode 100644 index 0000000000..54a4332ef5 --- /dev/null +++ b/app/models/category.rb @@ -0,0 +1,4 @@ +class Category < ActiveRecord::Base + has_many :product_categories + has_many :categories, :through => :product_categories +end diff --git a/app/models/guest.rb b/app/models/guest.rb new file mode 100644 index 0000000000..ff3fd966f6 --- /dev/null +++ b/app/models/guest.rb @@ -0,0 +1,3 @@ +class Guest < ActiveRecord::Base + has_many :orders +end diff --git a/app/models/merchant.rb b/app/models/merchant.rb new file mode 100644 index 0000000000..e6f54f0458 --- /dev/null +++ b/app/models/merchant.rb @@ -0,0 +1,4 @@ +class Merchant < ActiveRecord::Base + has_many :products + has_many :orders +end diff --git a/app/models/order.rb b/app/models/order.rb new file mode 100644 index 0000000000..ce83301aa9 --- /dev/null +++ b/app/models/order.rb @@ -0,0 +1,6 @@ +class Order < ActiveRecord::Base + has_many :product_orders + has_many :products, :through => :product_orders + belongs_to :merchant + belongs_to :guest +end diff --git a/app/models/product.rb b/app/models/product.rb new file mode 100644 index 0000000000..3ce61aab05 --- /dev/null +++ b/app/models/product.rb @@ -0,0 +1,8 @@ +class Product < ActiveRecord::Base + has_many :product_orders + has_many :orders, :through => :product_orders + has_many :product_categories + has_many :categories, :through => :product_categories + belongs_to :merchant + has_many :reviews +end diff --git a/app/models/product_category.rb b/app/models/product_category.rb new file mode 100644 index 0000000000..9f66674499 --- /dev/null +++ b/app/models/product_category.rb @@ -0,0 +1,4 @@ +class ProductCategory < ActiveRecord::Base + belongs_to :product + belongs_to :category +end diff --git a/app/models/product_order.rb b/app/models/product_order.rb new file mode 100644 index 0000000000..c740857e2c --- /dev/null +++ b/app/models/product_order.rb @@ -0,0 +1,4 @@ +class ProductOrder < ActiveRecord::Base + belongs_to :product + belongs_to :order +end diff --git a/app/models/review.rb b/app/models/review.rb new file mode 100644 index 0000000000..53d7a4885b --- /dev/null +++ b/app/models/review.rb @@ -0,0 +1,3 @@ +class Review < ActiveRecord::Base + belongs_to :product +end diff --git a/db/migrate/20161018211906_create_categories.rb b/db/migrate/20161018211906_create_categories.rb new file mode 100644 index 0000000000..b574669a21 --- /dev/null +++ b/db/migrate/20161018211906_create_categories.rb @@ -0,0 +1,9 @@ +class CreateCategories < ActiveRecord::Migration + def change + create_table :categories do |t| + t.string :name + + t.timestamps null: false + end + end +end diff --git a/db/migrate/20161018211943_create_merchants.rb b/db/migrate/20161018211943_create_merchants.rb new file mode 100644 index 0000000000..03e9214aeb --- /dev/null +++ b/db/migrate/20161018211943_create_merchants.rb @@ -0,0 +1,11 @@ +class CreateMerchants < ActiveRecord::Migration + def change + create_table :merchants do |t| + t.string :name + t.string :email + t.string :password + + t.timestamps null: false + end + end +end diff --git a/db/migrate/20161018212045_create_products.rb b/db/migrate/20161018212045_create_products.rb new file mode 100644 index 0000000000..53b69f1ecf --- /dev/null +++ b/db/migrate/20161018212045_create_products.rb @@ -0,0 +1,15 @@ +class CreateProducts < ActiveRecord::Migration + def change + create_table :products do |t| + t.string :name + t.text :description + t.integer :price + t.string :image + t.integer :merchant_id + t.integer :inventory + t.float :rating + + t.timestamps null: false + end + end +end diff --git a/db/migrate/20161018212101_create_guests.rb b/db/migrate/20161018212101_create_guests.rb new file mode 100644 index 0000000000..16981041e4 --- /dev/null +++ b/db/migrate/20161018212101_create_guests.rb @@ -0,0 +1,10 @@ +class CreateGuests < ActiveRecord::Migration + def change + create_table :guests do |t| + t.string :name + t.string :email + + t.timestamps null: false + end + end +end diff --git a/db/migrate/20161018212119_create_reviews.rb b/db/migrate/20161018212119_create_reviews.rb new file mode 100644 index 0000000000..df019d196d --- /dev/null +++ b/db/migrate/20161018212119_create_reviews.rb @@ -0,0 +1,12 @@ +class CreateReviews < ActiveRecord::Migration + def change + create_table :reviews do |t| + t.text :description + t.integer :stars + t.string :author + t.integer :product_id + + t.timestamps null: false + end + end +end diff --git a/db/migrate/20161018212351_create_orders.rb b/db/migrate/20161018212351_create_orders.rb new file mode 100644 index 0000000000..31c523149b --- /dev/null +++ b/db/migrate/20161018212351_create_orders.rb @@ -0,0 +1,20 @@ +class CreateOrders < ActiveRecord::Migration + def change + create_table :orders do |t| + t.integer :total_amount + t.integer :guest_id + t.integer :merchant_id + t.string :card_name + t.integer :card_number + t.string :card_exp + t.integer :card_cvv + t.integer :billing_zip + t.string :shipping_street + t.string :shipping_city + t.string :shipping_state + t.integer :shipping_zip + + t.timestamps null: false + end + end +end diff --git a/db/migrate/20161018213324_create_product_orders.rb b/db/migrate/20161018213324_create_product_orders.rb new file mode 100644 index 0000000000..d5ef81e254 --- /dev/null +++ b/db/migrate/20161018213324_create_product_orders.rb @@ -0,0 +1,10 @@ +class CreateProductOrders < ActiveRecord::Migration + def change + create_table :product_orders do |t| + t.references :product, index: true, foreign_key: true + t.references :order, index: true, foreign_key: true + + t.timestamps null: false + end + end +end diff --git a/db/migrate/20161018213348_create_product_categories.rb b/db/migrate/20161018213348_create_product_categories.rb new file mode 100644 index 0000000000..7d47a00c43 --- /dev/null +++ b/db/migrate/20161018213348_create_product_categories.rb @@ -0,0 +1,10 @@ +class CreateProductCategories < ActiveRecord::Migration + def change + create_table :product_categories do |t| + t.references :product, index: true, foreign_key: true + t.references :category, index: true, foreign_key: true + + t.timestamps null: false + end + end +end diff --git a/db/schema.rb b/db/schema.rb new file mode 100644 index 0000000000..f310fc2cb3 --- /dev/null +++ b/db/schema.rb @@ -0,0 +1,95 @@ +# encoding: UTF-8 +# This file is auto-generated from the current state of the database. Instead +# of editing this file, please use the migrations feature of Active Record to +# incrementally modify your database, and then regenerate this schema definition. +# +# Note that this schema.rb definition is the authoritative source for your +# database schema. If you need to create the application database on another +# system, you should be using db:schema:load, not running all the migrations +# from scratch. The latter is a flawed and unsustainable approach (the more migrations +# you'll amass, the slower it'll run and the greater likelihood for issues). +# +# It's strongly recommended that you check this file into your version control system. + +ActiveRecord::Schema.define(version: 20161018213348) do + + create_table "categories", force: :cascade do |t| + t.string "name" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + + create_table "guests", force: :cascade do |t| + t.string "name" + t.string "email" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + + create_table "merchants", force: :cascade do |t| + t.string "name" + t.string "email" + t.string "password" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + + create_table "orders", force: :cascade do |t| + t.integer "total_amount" + t.integer "guest_id" + t.integer "merchant_id" + t.string "card_name" + t.integer "card_number" + t.string "card_exp" + t.integer "card_cvv" + t.integer "billing_zip" + t.string "shipping_street" + t.string "shipping_city" + t.string "shipping_state" + t.integer "shipping_zip" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + + create_table "product_categories", force: :cascade do |t| + t.integer "product_id" + t.integer "category_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + + add_index "product_categories", ["category_id"], name: "index_product_categories_on_category_id" + add_index "product_categories", ["product_id"], name: "index_product_categories_on_product_id" + + create_table "product_orders", force: :cascade do |t| + t.integer "product_id" + t.integer "order_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + + add_index "product_orders", ["order_id"], name: "index_product_orders_on_order_id" + add_index "product_orders", ["product_id"], name: "index_product_orders_on_product_id" + + create_table "products", force: :cascade do |t| + t.string "name" + t.text "description" + t.integer "price" + t.string "image" + t.integer "merchant_id" + t.integer "inventory" + t.float "rating" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + + create_table "reviews", force: :cascade do |t| + t.text "description" + t.integer "stars" + t.string "author" + t.integer "product_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + +end diff --git a/test/fixtures/categories.yml b/test/fixtures/categories.yml new file mode 100644 index 0000000000..56066c68af --- /dev/null +++ b/test/fixtures/categories.yml @@ -0,0 +1,7 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + name: MyString + +two: + name: MyString diff --git a/test/fixtures/guests.yml b/test/fixtures/guests.yml new file mode 100644 index 0000000000..5dc4ddf033 --- /dev/null +++ b/test/fixtures/guests.yml @@ -0,0 +1,9 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + name: MyString + email: MyString + +two: + name: MyString + email: MyString diff --git a/test/fixtures/merchants.yml b/test/fixtures/merchants.yml new file mode 100644 index 0000000000..7384b0e7c9 --- /dev/null +++ b/test/fixtures/merchants.yml @@ -0,0 +1,11 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + name: MyString + email: MyString + password: MyString + +two: + name: MyString + email: MyString + password: MyString diff --git a/test/fixtures/orders.yml b/test/fixtures/orders.yml new file mode 100644 index 0000000000..1766a0a6b1 --- /dev/null +++ b/test/fixtures/orders.yml @@ -0,0 +1,29 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + total_amount: 1 + guest_id: 1 + merchant_id: 1 + card_name: MyString + card_number: 1 + card_exp: MyString + card_cvv: 1 + billing_zip: 1 + shipping_street: MyString + shipping_city: MyString + shipping_state: MyString + shipping_zip: 1 + +two: + total_amount: 1 + guest_id: 1 + merchant_id: 1 + card_name: MyString + card_number: 1 + card_exp: MyString + card_cvv: 1 + billing_zip: 1 + shipping_street: MyString + shipping_city: MyString + shipping_state: MyString + shipping_zip: 1 diff --git a/test/fixtures/product_categories.yml b/test/fixtures/product_categories.yml new file mode 100644 index 0000000000..558460cad7 --- /dev/null +++ b/test/fixtures/product_categories.yml @@ -0,0 +1,9 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + product_id: + category_id: + +two: + product_id: + category_id: diff --git a/test/fixtures/product_orders.yml b/test/fixtures/product_orders.yml new file mode 100644 index 0000000000..123ddec2fd --- /dev/null +++ b/test/fixtures/product_orders.yml @@ -0,0 +1,9 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + product_id: + order_id: + +two: + product_id: + order_id: diff --git a/test/fixtures/products.yml b/test/fixtures/products.yml new file mode 100644 index 0000000000..6352985f06 --- /dev/null +++ b/test/fixtures/products.yml @@ -0,0 +1,19 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + name: MyString + description: MyText + price: 1.5 + image: MyString + merchant_id: 1 + inventory: 1 + rating: 1 + +two: + name: MyString + description: MyText + price: 1.5 + image: MyString + merchant_id: 1 + inventory: 1 + rating: 1 diff --git a/test/fixtures/reviews.yml b/test/fixtures/reviews.yml new file mode 100644 index 0000000000..aab3c75d95 --- /dev/null +++ b/test/fixtures/reviews.yml @@ -0,0 +1,13 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + description: MyText + stars: 1 + author: MyString + product_id: 1 + +two: + description: MyText + stars: 1 + author: MyString + product_id: 1 diff --git a/test/models/category_test.rb b/test/models/category_test.rb new file mode 100644 index 0000000000..4733541516 --- /dev/null +++ b/test/models/category_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class CategoryTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/models/guest_test.rb b/test/models/guest_test.rb new file mode 100644 index 0000000000..848ce58750 --- /dev/null +++ b/test/models/guest_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class GuestTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/models/merchant_test.rb b/test/models/merchant_test.rb new file mode 100644 index 0000000000..d98d746a67 --- /dev/null +++ b/test/models/merchant_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class MerchantTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/models/order_test.rb b/test/models/order_test.rb new file mode 100644 index 0000000000..15b8ed1348 --- /dev/null +++ b/test/models/order_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class OrderTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/models/product_category_test.rb b/test/models/product_category_test.rb new file mode 100644 index 0000000000..6f788ebac5 --- /dev/null +++ b/test/models/product_category_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class ProductCategoryTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/models/product_order_test.rb b/test/models/product_order_test.rb new file mode 100644 index 0000000000..6de041e1b8 --- /dev/null +++ b/test/models/product_order_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class ProductOrderTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/models/product_test.rb b/test/models/product_test.rb new file mode 100644 index 0000000000..211cdd0b4a --- /dev/null +++ b/test/models/product_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class ProductTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/models/review_test.rb b/test/models/review_test.rb new file mode 100644 index 0000000000..11aa5204f0 --- /dev/null +++ b/test/models/review_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class ReviewTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end From 116caf18e462f63721e2cfff068fbd943a7d45f9 Mon Sep 17 00:00:00 2001 From: Nina Mutty Date: Tue, 18 Oct 2016 14:44:31 -0700 Subject: [PATCH 003/191] created da controllers --- app/assets/javascripts/guests.coffee | 3 + app/assets/javascripts/merchants.coffee | 3 + app/assets/javascripts/orders.coffee | 3 + app/assets/javascripts/products.coffee | 3 + app/assets/javascripts/reviews.coffee | 3 + app/assets/javascripts/sessions.coffee | 3 + app/assets/stylesheets/guests.scss | 3 + app/assets/stylesheets/merchants.scss | 3 + app/assets/stylesheets/orders.scss | 3 + app/assets/stylesheets/products.scss | 3 + app/assets/stylesheets/reviews.scss | 3 + app/assets/stylesheets/sessions.scss | 3 + app/controllers/guests_controller.rb | 22 ++++++ app/controllers/merchants_controller.rb | 22 ++++++ app/controllers/orders_controller.rb | 22 ++++++ app/controllers/products_controller.rb | 22 ++++++ app/controllers/reviews_controller.rb | 22 ++++++ app/controllers/sessions_controller.rb | 7 ++ app/helpers/guests_helper.rb | 2 + app/helpers/merchants_helper.rb | 2 + app/helpers/orders_helper.rb | 2 + app/helpers/products_helper.rb | 2 + app/helpers/reviews_helper.rb | 2 + app/helpers/sessions_helper.rb | 2 + app/views/guests/create.html.erb | 2 + app/views/guests/destroy.html.erb | 2 + app/views/guests/edit.html.erb | 2 + app/views/guests/index.html.erb | 2 + app/views/guests/new.html.erb | 2 + app/views/guests/show.html.erb | 2 + app/views/guests/update.html.erb | 2 + app/views/merchants/create.html.erb | 2 + app/views/merchants/destroy.html.erb | 2 + app/views/merchants/edit.html.erb | 2 + app/views/merchants/index.html.erb | 2 + app/views/merchants/new.html.erb | 2 + app/views/merchants/show.html.erb | 2 + app/views/merchants/update.html.erb | 2 + app/views/orders/create.html.erb | 2 + app/views/orders/destroy.html.erb | 2 + app/views/orders/edit.html.erb | 2 + app/views/orders/index.html.erb | 2 + app/views/orders/new.html.erb | 2 + app/views/orders/show.html.erb | 2 + app/views/orders/update.html.erb | 2 + app/views/products/create.html.erb | 2 + app/views/products/destroy.html.erb | 2 + app/views/products/edit.html.erb | 2 + app/views/products/index.html.erb | 2 + app/views/products/new.html.erb | 2 + app/views/products/show.html.erb | 2 + app/views/products/update.html.erb | 2 + app/views/reviews/create.html.erb | 2 + app/views/reviews/destroy.html.erb | 2 + app/views/reviews/edit.html.erb | 2 + app/views/reviews/index.html.erb | 2 + app/views/reviews/new.html.erb | 2 + app/views/reviews/show.html.erb | 2 + app/views/reviews/update.html.erb | 2 + app/views/sessions/create.html.erb | 2 + app/views/sessions/destroy.html.erb | 2 + config/routes.rb | 74 +++++++++++++++++++ test/controllers/guests_controller_test.rb | 39 ++++++++++ test/controllers/merchants_controller_test.rb | 39 ++++++++++ test/controllers/orders_controller_test.rb | 39 ++++++++++ test/controllers/products_controller_test.rb | 39 ++++++++++ test/controllers/reviews_controller_test.rb | 39 ++++++++++ test/controllers/sessions_controller_test.rb | 14 ++++ 68 files changed, 522 insertions(+) create mode 100644 app/assets/javascripts/guests.coffee create mode 100644 app/assets/javascripts/merchants.coffee create mode 100644 app/assets/javascripts/orders.coffee create mode 100644 app/assets/javascripts/products.coffee create mode 100644 app/assets/javascripts/reviews.coffee create mode 100644 app/assets/javascripts/sessions.coffee create mode 100644 app/assets/stylesheets/guests.scss create mode 100644 app/assets/stylesheets/merchants.scss create mode 100644 app/assets/stylesheets/orders.scss create mode 100644 app/assets/stylesheets/products.scss create mode 100644 app/assets/stylesheets/reviews.scss create mode 100644 app/assets/stylesheets/sessions.scss create mode 100644 app/controllers/guests_controller.rb create mode 100644 app/controllers/merchants_controller.rb create mode 100644 app/controllers/orders_controller.rb create mode 100644 app/controllers/products_controller.rb create mode 100644 app/controllers/reviews_controller.rb create mode 100644 app/controllers/sessions_controller.rb create mode 100644 app/helpers/guests_helper.rb create mode 100644 app/helpers/merchants_helper.rb create mode 100644 app/helpers/orders_helper.rb create mode 100644 app/helpers/products_helper.rb create mode 100644 app/helpers/reviews_helper.rb create mode 100644 app/helpers/sessions_helper.rb create mode 100644 app/views/guests/create.html.erb create mode 100644 app/views/guests/destroy.html.erb create mode 100644 app/views/guests/edit.html.erb create mode 100644 app/views/guests/index.html.erb create mode 100644 app/views/guests/new.html.erb create mode 100644 app/views/guests/show.html.erb create mode 100644 app/views/guests/update.html.erb create mode 100644 app/views/merchants/create.html.erb create mode 100644 app/views/merchants/destroy.html.erb create mode 100644 app/views/merchants/edit.html.erb create mode 100644 app/views/merchants/index.html.erb create mode 100644 app/views/merchants/new.html.erb create mode 100644 app/views/merchants/show.html.erb create mode 100644 app/views/merchants/update.html.erb create mode 100644 app/views/orders/create.html.erb create mode 100644 app/views/orders/destroy.html.erb create mode 100644 app/views/orders/edit.html.erb create mode 100644 app/views/orders/index.html.erb create mode 100644 app/views/orders/new.html.erb create mode 100644 app/views/orders/show.html.erb create mode 100644 app/views/orders/update.html.erb create mode 100644 app/views/products/create.html.erb create mode 100644 app/views/products/destroy.html.erb create mode 100644 app/views/products/edit.html.erb create mode 100644 app/views/products/index.html.erb create mode 100644 app/views/products/new.html.erb create mode 100644 app/views/products/show.html.erb create mode 100644 app/views/products/update.html.erb create mode 100644 app/views/reviews/create.html.erb create mode 100644 app/views/reviews/destroy.html.erb create mode 100644 app/views/reviews/edit.html.erb create mode 100644 app/views/reviews/index.html.erb create mode 100644 app/views/reviews/new.html.erb create mode 100644 app/views/reviews/show.html.erb create mode 100644 app/views/reviews/update.html.erb create mode 100644 app/views/sessions/create.html.erb create mode 100644 app/views/sessions/destroy.html.erb create mode 100644 test/controllers/guests_controller_test.rb create mode 100644 test/controllers/merchants_controller_test.rb create mode 100644 test/controllers/orders_controller_test.rb create mode 100644 test/controllers/products_controller_test.rb create mode 100644 test/controllers/reviews_controller_test.rb create mode 100644 test/controllers/sessions_controller_test.rb diff --git a/app/assets/javascripts/guests.coffee b/app/assets/javascripts/guests.coffee new file mode 100644 index 0000000000..24f83d18bb --- /dev/null +++ b/app/assets/javascripts/guests.coffee @@ -0,0 +1,3 @@ +# Place all the behaviors and hooks related to the matching controller here. +# All this logic will automatically be available in application.js. +# You can use CoffeeScript in this file: http://coffeescript.org/ diff --git a/app/assets/javascripts/merchants.coffee b/app/assets/javascripts/merchants.coffee new file mode 100644 index 0000000000..24f83d18bb --- /dev/null +++ b/app/assets/javascripts/merchants.coffee @@ -0,0 +1,3 @@ +# Place all the behaviors and hooks related to the matching controller here. +# All this logic will automatically be available in application.js. +# You can use CoffeeScript in this file: http://coffeescript.org/ diff --git a/app/assets/javascripts/orders.coffee b/app/assets/javascripts/orders.coffee new file mode 100644 index 0000000000..24f83d18bb --- /dev/null +++ b/app/assets/javascripts/orders.coffee @@ -0,0 +1,3 @@ +# Place all the behaviors and hooks related to the matching controller here. +# All this logic will automatically be available in application.js. +# You can use CoffeeScript in this file: http://coffeescript.org/ diff --git a/app/assets/javascripts/products.coffee b/app/assets/javascripts/products.coffee new file mode 100644 index 0000000000..24f83d18bb --- /dev/null +++ b/app/assets/javascripts/products.coffee @@ -0,0 +1,3 @@ +# Place all the behaviors and hooks related to the matching controller here. +# All this logic will automatically be available in application.js. +# You can use CoffeeScript in this file: http://coffeescript.org/ diff --git a/app/assets/javascripts/reviews.coffee b/app/assets/javascripts/reviews.coffee new file mode 100644 index 0000000000..24f83d18bb --- /dev/null +++ b/app/assets/javascripts/reviews.coffee @@ -0,0 +1,3 @@ +# Place all the behaviors and hooks related to the matching controller here. +# All this logic will automatically be available in application.js. +# You can use CoffeeScript in this file: http://coffeescript.org/ diff --git a/app/assets/javascripts/sessions.coffee b/app/assets/javascripts/sessions.coffee new file mode 100644 index 0000000000..24f83d18bb --- /dev/null +++ b/app/assets/javascripts/sessions.coffee @@ -0,0 +1,3 @@ +# Place all the behaviors and hooks related to the matching controller here. +# All this logic will automatically be available in application.js. +# You can use CoffeeScript in this file: http://coffeescript.org/ diff --git a/app/assets/stylesheets/guests.scss b/app/assets/stylesheets/guests.scss new file mode 100644 index 0000000000..646b204ef1 --- /dev/null +++ b/app/assets/stylesheets/guests.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the guests controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/assets/stylesheets/merchants.scss b/app/assets/stylesheets/merchants.scss new file mode 100644 index 0000000000..2327c00afe --- /dev/null +++ b/app/assets/stylesheets/merchants.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the merchants controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/assets/stylesheets/orders.scss b/app/assets/stylesheets/orders.scss new file mode 100644 index 0000000000..3b0428a94e --- /dev/null +++ b/app/assets/stylesheets/orders.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the orders controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/assets/stylesheets/products.scss b/app/assets/stylesheets/products.scss new file mode 100644 index 0000000000..89e2e8db07 --- /dev/null +++ b/app/assets/stylesheets/products.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the products controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/assets/stylesheets/reviews.scss b/app/assets/stylesheets/reviews.scss new file mode 100644 index 0000000000..6ea2454d26 --- /dev/null +++ b/app/assets/stylesheets/reviews.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the reviews controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/assets/stylesheets/sessions.scss b/app/assets/stylesheets/sessions.scss new file mode 100644 index 0000000000..7bef9cf826 --- /dev/null +++ b/app/assets/stylesheets/sessions.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the sessions controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/controllers/guests_controller.rb b/app/controllers/guests_controller.rb new file mode 100644 index 0000000000..2689da9733 --- /dev/null +++ b/app/controllers/guests_controller.rb @@ -0,0 +1,22 @@ +class GuestsController < ApplicationController + def index + end + + def show + end + + def new + end + + def create + end + + def edit + end + + def update + end + + def destroy + end +end diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb new file mode 100644 index 0000000000..45be0beb40 --- /dev/null +++ b/app/controllers/merchants_controller.rb @@ -0,0 +1,22 @@ +class MerchantsController < ApplicationController + def index + end + + def show + end + + def new + end + + def create + end + + def edit + end + + def update + end + + def destroy + end +end diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb new file mode 100644 index 0000000000..27bfa788fd --- /dev/null +++ b/app/controllers/orders_controller.rb @@ -0,0 +1,22 @@ +class OrdersController < ApplicationController + def index + end + + def show + end + + def new + end + + def create + end + + def edit + end + + def update + end + + def destroy + end +end diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb new file mode 100644 index 0000000000..6cc58717c0 --- /dev/null +++ b/app/controllers/products_controller.rb @@ -0,0 +1,22 @@ +class ProductsController < ApplicationController + def index + end + + def show + end + + def new + end + + def create + end + + def edit + end + + def update + end + + def destroy + end +end diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb new file mode 100644 index 0000000000..7dd82b0d4a --- /dev/null +++ b/app/controllers/reviews_controller.rb @@ -0,0 +1,22 @@ +class ReviewsController < ApplicationController + def index + end + + def show + end + + def new + end + + def create + end + + def edit + end + + def update + end + + def destroy + end +end diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb new file mode 100644 index 0000000000..ca48c61a6e --- /dev/null +++ b/app/controllers/sessions_controller.rb @@ -0,0 +1,7 @@ +class SessionsController < ApplicationController + def create + end + + def destroy + end +end diff --git a/app/helpers/guests_helper.rb b/app/helpers/guests_helper.rb new file mode 100644 index 0000000000..00317bf2cf --- /dev/null +++ b/app/helpers/guests_helper.rb @@ -0,0 +1,2 @@ +module GuestsHelper +end diff --git a/app/helpers/merchants_helper.rb b/app/helpers/merchants_helper.rb new file mode 100644 index 0000000000..5337747b0f --- /dev/null +++ b/app/helpers/merchants_helper.rb @@ -0,0 +1,2 @@ +module MerchantsHelper +end diff --git a/app/helpers/orders_helper.rb b/app/helpers/orders_helper.rb new file mode 100644 index 0000000000..443227fd48 --- /dev/null +++ b/app/helpers/orders_helper.rb @@ -0,0 +1,2 @@ +module OrdersHelper +end diff --git a/app/helpers/products_helper.rb b/app/helpers/products_helper.rb new file mode 100644 index 0000000000..ab5c42b325 --- /dev/null +++ b/app/helpers/products_helper.rb @@ -0,0 +1,2 @@ +module ProductsHelper +end diff --git a/app/helpers/reviews_helper.rb b/app/helpers/reviews_helper.rb new file mode 100644 index 0000000000..682b7b1abc --- /dev/null +++ b/app/helpers/reviews_helper.rb @@ -0,0 +1,2 @@ +module ReviewsHelper +end diff --git a/app/helpers/sessions_helper.rb b/app/helpers/sessions_helper.rb new file mode 100644 index 0000000000..309f8b2eb3 --- /dev/null +++ b/app/helpers/sessions_helper.rb @@ -0,0 +1,2 @@ +module SessionsHelper +end diff --git a/app/views/guests/create.html.erb b/app/views/guests/create.html.erb new file mode 100644 index 0000000000..a9738a6655 --- /dev/null +++ b/app/views/guests/create.html.erb @@ -0,0 +1,2 @@ +

Guests#create

+

Find me in app/views/guests/create.html.erb

diff --git a/app/views/guests/destroy.html.erb b/app/views/guests/destroy.html.erb new file mode 100644 index 0000000000..7da417e5ba --- /dev/null +++ b/app/views/guests/destroy.html.erb @@ -0,0 +1,2 @@ +

Guests#destroy

+

Find me in app/views/guests/destroy.html.erb

diff --git a/app/views/guests/edit.html.erb b/app/views/guests/edit.html.erb new file mode 100644 index 0000000000..1e16d53b01 --- /dev/null +++ b/app/views/guests/edit.html.erb @@ -0,0 +1,2 @@ +

Guests#edit

+

Find me in app/views/guests/edit.html.erb

diff --git a/app/views/guests/index.html.erb b/app/views/guests/index.html.erb new file mode 100644 index 0000000000..e54983b4ca --- /dev/null +++ b/app/views/guests/index.html.erb @@ -0,0 +1,2 @@ +

Guests#index

+

Find me in app/views/guests/index.html.erb

diff --git a/app/views/guests/new.html.erb b/app/views/guests/new.html.erb new file mode 100644 index 0000000000..ebe92378c8 --- /dev/null +++ b/app/views/guests/new.html.erb @@ -0,0 +1,2 @@ +

Guests#new

+

Find me in app/views/guests/new.html.erb

diff --git a/app/views/guests/show.html.erb b/app/views/guests/show.html.erb new file mode 100644 index 0000000000..a01c0fb8c7 --- /dev/null +++ b/app/views/guests/show.html.erb @@ -0,0 +1,2 @@ +

Guests#show

+

Find me in app/views/guests/show.html.erb

diff --git a/app/views/guests/update.html.erb b/app/views/guests/update.html.erb new file mode 100644 index 0000000000..c95ad0ad75 --- /dev/null +++ b/app/views/guests/update.html.erb @@ -0,0 +1,2 @@ +

Guests#update

+

Find me in app/views/guests/update.html.erb

diff --git a/app/views/merchants/create.html.erb b/app/views/merchants/create.html.erb new file mode 100644 index 0000000000..1762feece0 --- /dev/null +++ b/app/views/merchants/create.html.erb @@ -0,0 +1,2 @@ +

Merchants#create

+

Find me in app/views/merchants/create.html.erb

diff --git a/app/views/merchants/destroy.html.erb b/app/views/merchants/destroy.html.erb new file mode 100644 index 0000000000..7378a23230 --- /dev/null +++ b/app/views/merchants/destroy.html.erb @@ -0,0 +1,2 @@ +

Merchants#destroy

+

Find me in app/views/merchants/destroy.html.erb

diff --git a/app/views/merchants/edit.html.erb b/app/views/merchants/edit.html.erb new file mode 100644 index 0000000000..825f2251dc --- /dev/null +++ b/app/views/merchants/edit.html.erb @@ -0,0 +1,2 @@ +

Merchants#edit

+

Find me in app/views/merchants/edit.html.erb

diff --git a/app/views/merchants/index.html.erb b/app/views/merchants/index.html.erb new file mode 100644 index 0000000000..0ad7977813 --- /dev/null +++ b/app/views/merchants/index.html.erb @@ -0,0 +1,2 @@ +

Merchants#index

+

Find me in app/views/merchants/index.html.erb

diff --git a/app/views/merchants/new.html.erb b/app/views/merchants/new.html.erb new file mode 100644 index 0000000000..aaac3f85d7 --- /dev/null +++ b/app/views/merchants/new.html.erb @@ -0,0 +1,2 @@ +

Merchants#new

+

Find me in app/views/merchants/new.html.erb

diff --git a/app/views/merchants/show.html.erb b/app/views/merchants/show.html.erb new file mode 100644 index 0000000000..cbb0f02bfe --- /dev/null +++ b/app/views/merchants/show.html.erb @@ -0,0 +1,2 @@ +

Merchants#show

+

Find me in app/views/merchants/show.html.erb

diff --git a/app/views/merchants/update.html.erb b/app/views/merchants/update.html.erb new file mode 100644 index 0000000000..48e3f8aed5 --- /dev/null +++ b/app/views/merchants/update.html.erb @@ -0,0 +1,2 @@ +

Merchants#update

+

Find me in app/views/merchants/update.html.erb

diff --git a/app/views/orders/create.html.erb b/app/views/orders/create.html.erb new file mode 100644 index 0000000000..295bd84094 --- /dev/null +++ b/app/views/orders/create.html.erb @@ -0,0 +1,2 @@ +

Orders#create

+

Find me in app/views/orders/create.html.erb

diff --git a/app/views/orders/destroy.html.erb b/app/views/orders/destroy.html.erb new file mode 100644 index 0000000000..d14d0a3508 --- /dev/null +++ b/app/views/orders/destroy.html.erb @@ -0,0 +1,2 @@ +

Orders#destroy

+

Find me in app/views/orders/destroy.html.erb

diff --git a/app/views/orders/edit.html.erb b/app/views/orders/edit.html.erb new file mode 100644 index 0000000000..7de9049bee --- /dev/null +++ b/app/views/orders/edit.html.erb @@ -0,0 +1,2 @@ +

Orders#edit

+

Find me in app/views/orders/edit.html.erb

diff --git a/app/views/orders/index.html.erb b/app/views/orders/index.html.erb new file mode 100644 index 0000000000..d63a69fb54 --- /dev/null +++ b/app/views/orders/index.html.erb @@ -0,0 +1,2 @@ +

Orders#index

+

Find me in app/views/orders/index.html.erb

diff --git a/app/views/orders/new.html.erb b/app/views/orders/new.html.erb new file mode 100644 index 0000000000..1bc27609ce --- /dev/null +++ b/app/views/orders/new.html.erb @@ -0,0 +1,2 @@ +

Orders#new

+

Find me in app/views/orders/new.html.erb

diff --git a/app/views/orders/show.html.erb b/app/views/orders/show.html.erb new file mode 100644 index 0000000000..22eb495f6f --- /dev/null +++ b/app/views/orders/show.html.erb @@ -0,0 +1,2 @@ +

Orders#show

+

Find me in app/views/orders/show.html.erb

diff --git a/app/views/orders/update.html.erb b/app/views/orders/update.html.erb new file mode 100644 index 0000000000..21caac1f70 --- /dev/null +++ b/app/views/orders/update.html.erb @@ -0,0 +1,2 @@ +

Orders#update

+

Find me in app/views/orders/update.html.erb

diff --git a/app/views/products/create.html.erb b/app/views/products/create.html.erb new file mode 100644 index 0000000000..d546021001 --- /dev/null +++ b/app/views/products/create.html.erb @@ -0,0 +1,2 @@ +

Products#create

+

Find me in app/views/products/create.html.erb

diff --git a/app/views/products/destroy.html.erb b/app/views/products/destroy.html.erb new file mode 100644 index 0000000000..d5c678b499 --- /dev/null +++ b/app/views/products/destroy.html.erb @@ -0,0 +1,2 @@ +

Products#destroy

+

Find me in app/views/products/destroy.html.erb

diff --git a/app/views/products/edit.html.erb b/app/views/products/edit.html.erb new file mode 100644 index 0000000000..279b066f30 --- /dev/null +++ b/app/views/products/edit.html.erb @@ -0,0 +1,2 @@ +

Products#edit

+

Find me in app/views/products/edit.html.erb

diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb new file mode 100644 index 0000000000..f8eeb82674 --- /dev/null +++ b/app/views/products/index.html.erb @@ -0,0 +1,2 @@ +

Products#index

+

Find me in app/views/products/index.html.erb

diff --git a/app/views/products/new.html.erb b/app/views/products/new.html.erb new file mode 100644 index 0000000000..a14e0d91b6 --- /dev/null +++ b/app/views/products/new.html.erb @@ -0,0 +1,2 @@ +

Products#new

+

Find me in app/views/products/new.html.erb

diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb new file mode 100644 index 0000000000..5f44ec44d2 --- /dev/null +++ b/app/views/products/show.html.erb @@ -0,0 +1,2 @@ +

Products#show

+

Find me in app/views/products/show.html.erb

diff --git a/app/views/products/update.html.erb b/app/views/products/update.html.erb new file mode 100644 index 0000000000..039889ac02 --- /dev/null +++ b/app/views/products/update.html.erb @@ -0,0 +1,2 @@ +

Products#update

+

Find me in app/views/products/update.html.erb

diff --git a/app/views/reviews/create.html.erb b/app/views/reviews/create.html.erb new file mode 100644 index 0000000000..44bf11c2ed --- /dev/null +++ b/app/views/reviews/create.html.erb @@ -0,0 +1,2 @@ +

Reviews#create

+

Find me in app/views/reviews/create.html.erb

diff --git a/app/views/reviews/destroy.html.erb b/app/views/reviews/destroy.html.erb new file mode 100644 index 0000000000..df58c59d5c --- /dev/null +++ b/app/views/reviews/destroy.html.erb @@ -0,0 +1,2 @@ +

Reviews#destroy

+

Find me in app/views/reviews/destroy.html.erb

diff --git a/app/views/reviews/edit.html.erb b/app/views/reviews/edit.html.erb new file mode 100644 index 0000000000..28034f5e02 --- /dev/null +++ b/app/views/reviews/edit.html.erb @@ -0,0 +1,2 @@ +

Reviews#edit

+

Find me in app/views/reviews/edit.html.erb

diff --git a/app/views/reviews/index.html.erb b/app/views/reviews/index.html.erb new file mode 100644 index 0000000000..d19455779d --- /dev/null +++ b/app/views/reviews/index.html.erb @@ -0,0 +1,2 @@ +

Reviews#index

+

Find me in app/views/reviews/index.html.erb

diff --git a/app/views/reviews/new.html.erb b/app/views/reviews/new.html.erb new file mode 100644 index 0000000000..9cc9d7f56b --- /dev/null +++ b/app/views/reviews/new.html.erb @@ -0,0 +1,2 @@ +

Reviews#new

+

Find me in app/views/reviews/new.html.erb

diff --git a/app/views/reviews/show.html.erb b/app/views/reviews/show.html.erb new file mode 100644 index 0000000000..68d8d94c3b --- /dev/null +++ b/app/views/reviews/show.html.erb @@ -0,0 +1,2 @@ +

Reviews#show

+

Find me in app/views/reviews/show.html.erb

diff --git a/app/views/reviews/update.html.erb b/app/views/reviews/update.html.erb new file mode 100644 index 0000000000..7d46cbed5c --- /dev/null +++ b/app/views/reviews/update.html.erb @@ -0,0 +1,2 @@ +

Reviews#update

+

Find me in app/views/reviews/update.html.erb

diff --git a/app/views/sessions/create.html.erb b/app/views/sessions/create.html.erb new file mode 100644 index 0000000000..c251174fea --- /dev/null +++ b/app/views/sessions/create.html.erb @@ -0,0 +1,2 @@ +

Sessions#create

+

Find me in app/views/sessions/create.html.erb

diff --git a/app/views/sessions/destroy.html.erb b/app/views/sessions/destroy.html.erb new file mode 100644 index 0000000000..d75237d982 --- /dev/null +++ b/app/views/sessions/destroy.html.erb @@ -0,0 +1,2 @@ +

Sessions#destroy

+

Find me in app/views/sessions/destroy.html.erb

diff --git a/config/routes.rb b/config/routes.rb index 3f66539d54..df02ea2f3a 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,4 +1,78 @@ Rails.application.routes.draw do + get 'reviews/index' + + get 'reviews/show' + + get 'reviews/new' + + get 'reviews/create' + + get 'reviews/edit' + + get 'reviews/update' + + get 'reviews/destroy' + + get 'products/index' + + get 'products/show' + + get 'products/new' + + get 'products/create' + + get 'products/edit' + + get 'products/update' + + get 'products/destroy' + + get 'orders/index' + + get 'orders/show' + + get 'orders/new' + + get 'orders/create' + + get 'orders/edit' + + get 'orders/update' + + get 'orders/destroy' + + get 'merchants/index' + + get 'merchants/show' + + get 'merchants/new' + + get 'merchants/create' + + get 'merchants/edit' + + get 'merchants/update' + + get 'merchants/destroy' + + get 'guests/index' + + get 'guests/show' + + get 'guests/new' + + get 'guests/create' + + get 'guests/edit' + + get 'guests/update' + + get 'guests/destroy' + + get 'sessions/create' + + get 'sessions/destroy' + # The priority is based upon order of creation: first created -> highest priority. # See how all your routes lay out with "rake routes". diff --git a/test/controllers/guests_controller_test.rb b/test/controllers/guests_controller_test.rb new file mode 100644 index 0000000000..bfad0bee2b --- /dev/null +++ b/test/controllers/guests_controller_test.rb @@ -0,0 +1,39 @@ +require 'test_helper' + +class GuestsControllerTest < ActionController::TestCase + test "should get index" do + get :index + assert_response :success + end + + test "should get show" do + get :show + assert_response :success + end + + test "should get new" do + get :new + assert_response :success + end + + test "should get create" do + get :create + assert_response :success + end + + test "should get edit" do + get :edit + assert_response :success + end + + test "should get update" do + get :update + assert_response :success + end + + test "should get destroy" do + get :destroy + assert_response :success + end + +end diff --git a/test/controllers/merchants_controller_test.rb b/test/controllers/merchants_controller_test.rb new file mode 100644 index 0000000000..6f4b548bc2 --- /dev/null +++ b/test/controllers/merchants_controller_test.rb @@ -0,0 +1,39 @@ +require 'test_helper' + +class MerchantsControllerTest < ActionController::TestCase + test "should get index" do + get :index + assert_response :success + end + + test "should get show" do + get :show + assert_response :success + end + + test "should get new" do + get :new + assert_response :success + end + + test "should get create" do + get :create + assert_response :success + end + + test "should get edit" do + get :edit + assert_response :success + end + + test "should get update" do + get :update + assert_response :success + end + + test "should get destroy" do + get :destroy + assert_response :success + end + +end diff --git a/test/controllers/orders_controller_test.rb b/test/controllers/orders_controller_test.rb new file mode 100644 index 0000000000..ec871721c6 --- /dev/null +++ b/test/controllers/orders_controller_test.rb @@ -0,0 +1,39 @@ +require 'test_helper' + +class OrdersControllerTest < ActionController::TestCase + test "should get index" do + get :index + assert_response :success + end + + test "should get show" do + get :show + assert_response :success + end + + test "should get new" do + get :new + assert_response :success + end + + test "should get create" do + get :create + assert_response :success + end + + test "should get edit" do + get :edit + assert_response :success + end + + test "should get update" do + get :update + assert_response :success + end + + test "should get destroy" do + get :destroy + assert_response :success + end + +end diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb new file mode 100644 index 0000000000..5e7440a0d5 --- /dev/null +++ b/test/controllers/products_controller_test.rb @@ -0,0 +1,39 @@ +require 'test_helper' + +class ProductsControllerTest < ActionController::TestCase + test "should get index" do + get :index + assert_response :success + end + + test "should get show" do + get :show + assert_response :success + end + + test "should get new" do + get :new + assert_response :success + end + + test "should get create" do + get :create + assert_response :success + end + + test "should get edit" do + get :edit + assert_response :success + end + + test "should get update" do + get :update + assert_response :success + end + + test "should get destroy" do + get :destroy + assert_response :success + end + +end diff --git a/test/controllers/reviews_controller_test.rb b/test/controllers/reviews_controller_test.rb new file mode 100644 index 0000000000..7a6ab9f90d --- /dev/null +++ b/test/controllers/reviews_controller_test.rb @@ -0,0 +1,39 @@ +require 'test_helper' + +class ReviewsControllerTest < ActionController::TestCase + test "should get index" do + get :index + assert_response :success + end + + test "should get show" do + get :show + assert_response :success + end + + test "should get new" do + get :new + assert_response :success + end + + test "should get create" do + get :create + assert_response :success + end + + test "should get edit" do + get :edit + assert_response :success + end + + test "should get update" do + get :update + assert_response :success + end + + test "should get destroy" do + get :destroy + assert_response :success + end + +end diff --git a/test/controllers/sessions_controller_test.rb b/test/controllers/sessions_controller_test.rb new file mode 100644 index 0000000000..9a35cf1518 --- /dev/null +++ b/test/controllers/sessions_controller_test.rb @@ -0,0 +1,14 @@ +require 'test_helper' + +class SessionsControllerTest < ActionController::TestCase + test "should get create" do + get :create + assert_response :success + end + + test "should get destroy" do + get :destroy + assert_response :success + end + +end From 5ebb4a86f07cdbc009c42b160f46a88265653924 Mon Sep 17 00:00:00 2001 From: Nina Mutty Date: Tue, 18 Oct 2016 15:06:55 -0700 Subject: [PATCH 004/191] started products controller methods --- app/controllers/products_controller.rb | 11 +++++++++++ app/models/product.rb | 2 ++ 2 files changed, 13 insertions(+) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 6cc58717c0..b396aac00e 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -1,5 +1,8 @@ class ProductsController < ApplicationController + before_action :find_product, only: [:show, :edit, :update] + def index + @products = Product.all end def show @@ -19,4 +22,12 @@ def update def destroy end + + private + + def find_product + @product = Product.find(params[:product_id]) + end + + end diff --git a/app/models/product.rb b/app/models/product.rb index 3ce61aab05..6809b930f5 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -1,8 +1,10 @@ class Product < ActiveRecord::Base has_many :product_orders has_many :orders, :through => :product_orders + has_many :product_categories has_many :categories, :through => :product_categories + belongs_to :merchant has_many :reviews end From 6bf38b6d2fab7c1368b7c7aaca91a6e092364a0a Mon Sep 17 00:00:00 2001 From: Olivia Date: Tue, 18 Oct 2016 15:16:30 -0700 Subject: [PATCH 005/191] added and seeded csvs --- db/seeds.rb | 34 +++++++++++++++++++++++++++++++ seeds_csvs/category.csv | 11 ++++++++++ seeds_csvs/guests.csv | 11 ++++++++++ seeds_csvs/merchant.csv | 11 ++++++++++ seeds_csvs/orders.csv | 11 ++++++++++ seeds_csvs/product_categories.csv | 11 ++++++++++ seeds_csvs/products.csv | 11 ++++++++++ seeds_csvs/products_orders.csv | 11 ++++++++++ seeds_csvs/reviews.csv | 11 ++++++++++ 9 files changed, 122 insertions(+) create mode 100644 seeds_csvs/category.csv create mode 100644 seeds_csvs/guests.csv create mode 100644 seeds_csvs/merchant.csv create mode 100644 seeds_csvs/orders.csv create mode 100644 seeds_csvs/product_categories.csv create mode 100644 seeds_csvs/products.csv create mode 100644 seeds_csvs/products_orders.csv create mode 100644 seeds_csvs/reviews.csv diff --git a/db/seeds.rb b/db/seeds.rb index 4edb1e857e..a59217b79b 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -5,3 +5,37 @@ # # cities = City.create([{ name: 'Chicago' }, { name: 'Copenhagen' }]) # Mayor.create(name: 'Emanuel', city: cities.first) + +require 'csv' + +CSV.foreach('seed_csvs/category.csv') do |csv_obj| + Category.create(id: csv_obj[0].to_i, name: csv_obj[1], product_id: csv_obj[2].to_i) + end + + CSV.foreach('seed_csvs/guests.csv') do |csv_obj| + Category.create(id: csv_obj[0].to_i, name: csv_obj[1], email: csv_obj[2]) + end + + CSV.foreach('seed_csvs/merchant.csv') do |csv_obj| + Category.create(id: csv_obj[0].to_i, name: csv_obj[1], email: csv_obj[2], password: csv_obj[3]) + end + + CSV.foreach('seed_csvs/orders.csv') do |csv_obj| + Category.create(id: csv_obj[0].to_i, total_amount: csv_obj[1].to_i, guest_id: csv_obj[2].to_i, merchant_id: csv_obj[3].to_i, card_name: csv_obj[4], card_number: csv_obj[5].to_i, card_exp: csv_obj[6], card_cvv: csv_obj[7].to_i, billing_zip: csv_obj[8].to_i, shipping_street: csv_obj[8], shipping_city: csv_obj[9], shipping_state: csv_obj[10], shipping_zip: csv_obj[10].to_i ) + end + + CSV.foreach('seed_csvs/product_categories.csv') do |csv_obj| + Category.create(id: csv_obj[0].to_i, category_id: csv_obj[1].to_i, product_id: csv_obj[2]) + end + + CSV.foreach('seed_csvs/products_orders.csv') do |csv_obj| + Category.create(id: csv_obj[0].to_i, product_id: csv_obj[1].to_i, order_id: csv_obj[2].to_i) + end + + CSV.foreach('seed_csvs/products.csv') do |csv_obj| + Category.create(id: csv_obj[0].to_i, name: csv_obj[1], description: csv_obj[2], price: csv_obj[3].to_i, image: csv_obj[4], merchant_id: csv_obj[2].to_i ) + end + + CSV.foreach('seed_csvs/reviews.csv') do |csv_obj| + Category.create(id: csv_obj[0].to_i, product_id: csv_obj[1].to_i, description: csv_obj[2], author: csv_obj[3], stars: csv_obj[4].to_i) + end diff --git a/seeds_csvs/category.csv b/seeds_csvs/category.csv new file mode 100644 index 0000000000..b7687e44fe --- /dev/null +++ b/seeds_csvs/category.csv @@ -0,0 +1,11 @@ +id,name,product_id +1,discrete,1 +2,Reduced,5 +3,intangible,6 +4,open architecture,5 +5,tertiary,3 +6,interactive,3 +7,holistic,5 +8,open architecture,2 +9,Switchable,10 +10,systemic,3 diff --git a/seeds_csvs/guests.csv b/seeds_csvs/guests.csv new file mode 100644 index 0000000000..7d19edffc0 --- /dev/null +++ b/seeds_csvs/guests.csv @@ -0,0 +1,11 @@ +id,name,email +1,Carlos Howard,choward0@oracle.com +2,Rose Reid,rreid1@usda.gov +3,Michael Brown,mbrown2@networksolutions.com +4,Stephanie Bennett,sbennett3@foxnews.com +5,Terry Allen,tallen4@nasa.gov +6,Michelle Phillips,mphillips5@naver.com +7,Martin Robertson,mrobertson6@spotify.com +8,Randy Weaver,rweaver7@lulu.com +9,Annie Harrison,aharrison8@51.la +10,Sarah King,sking9@spiegel.de diff --git a/seeds_csvs/merchant.csv b/seeds_csvs/merchant.csv new file mode 100644 index 0000000000..783becdcc3 --- /dev/null +++ b/seeds_csvs/merchant.csv @@ -0,0 +1,11 @@ +id,name,email,password +1,ameyer0,rgeorge0@adobe.com,A1s5KLpTiyu +2,acole1,dwilson1@gizmodo.com,2kIBWgyznWY +3,kgonzalez2,dcastillo2@nsw.gov.au,RYshSYKG +4,bwalker3,jwatkins3@mediafire.com,f3cQChXEIi +5,bhernandez4,rlane4@examiner.com,gDGVvnjMkix +6,areed5,htorres5@admin.ch,0IMBHc +7,dfuller6,ascott6@rambler.ru,M1HJAWy +8,amartin7,krodriguez7@bluehost.com,HRPnISN +9,preed8,choward8@cpanel.net,gEvbQpHX +10,scarroll9,smorgan9@google.com.br,Wxbop5c1dNd diff --git a/seeds_csvs/orders.csv b/seeds_csvs/orders.csv new file mode 100644 index 0000000000..efa00429da --- /dev/null +++ b/seeds_csvs/orders.csv @@ -0,0 +1,11 @@ +id,total_amount,guest_id,merchant_id,card_name,card_number,card_exp,card_cvv,billing_zip,shipping_street,shipping_city,shipping_state,shipping_zip +1,Heather Martin,700,3,jcb,3544153313003422,6/5/2016,1,2,8 Blaine Trail,Milwaukee,Wisconsin,5 +2,Ryan King,600,10,jcb,3535790488366570,2/3/2016,2,5,3421 Atwood Street,Milwaukee,Wisconsin,4 +3,Scott Freeman,800,2,visa-electron,4844470197867465,3/22/2016,3,4,12980 Hudson Hill,Colorado Springs,Colorado,2 +4,Matthew Mason,400,8,visa-electron,4913634062130046,7/24/2016,2,1,24351 1st Point,Denver,Colorado,5 +5,Lisa Oliver,400,10,jcb,3561305235966635,8/9/2016,1,5,2063 Pine View Road,Salt Lake City,Utah,2 +6,Sarah Cox,500,6,jcb,3541499214835088,10/24/2015,3,4,56903 American Lane,Beaumont,Texas,1 +7,Nicole Adams,600,9,diners-club-enroute,201516174929028,6/29/2016,3,5,5 Dixon Parkway,Charleston,West Virginia,1 +8,Amanda West,500,4,visa,4041595386325825,11/3/2015,3,2,2 Menomonie Terrace,Dallas,Texas,5 +9,Douglas Sanchez,500,2,mastercard,5100176740926148,12/16/2015,2,1,96916 Loomis Crossing,Florence,South Carolina,3 +10,James Mendoza,100,7,jcb,3528298798434178,9/13/2016,1,1,0662 Duke Court,El Paso,Texas,2 diff --git a/seeds_csvs/product_categories.csv b/seeds_csvs/product_categories.csv new file mode 100644 index 0000000000..ac49a3e5a2 --- /dev/null +++ b/seeds_csvs/product_categories.csv @@ -0,0 +1,11 @@ +id,category_id,product_id +1,8,2 +2,7,5 +3,10,3 +4,3,5 +5,1,6 +6,1,7 +7,2,5 +8,2,4 +9,1,9 +10,7,9 diff --git a/seeds_csvs/products.csv b/seeds_csvs/products.csv new file mode 100644 index 0000000000..fc810b22bd --- /dev/null +++ b/seeds_csvs/products.csv @@ -0,0 +1,11 @@ +id,name,description,price,image,merchant_id +1,ut,elit proin risus praesent lectus vestibulum quam sapien,37.04,http://dummyimage.com/172x213.jpg/5fa2dd/ffffff,9 +2,sollicitudin,ultrices posuere cubilia curae donec pharetra magna,88.38,http://dummyimage.com/145x190.bmp/ff4444/ffffff,3 +3,libero,in magna bibendum imperdiet nullam orci pede venenatis non sodales,11.71,http://dummyimage.com/205x159.bmp/dddddd/000000,10 +4,eget,vestibulum eget vulputate ut ultrices vel augue vestibulum ante ipsum,73.05,http://dummyimage.com/112x147.bmp/dddddd/000000,1 +5,mi nulla,mauris lacinia sapien quis libero,48.57,http://dummyimage.com/181x184.jpg/ff4444/ffffff,1 +6,mauris,ipsum primis in faucibus orci,7.39,http://dummyimage.com/109x202.bmp/ff4444/ffffff,9 +7,sed augue,sodales sed tincidunt eu felis fusce,1.9,http://dummyimage.com/232x126.png/5fa2dd/ffffff,8 +8,nonummy,sit amet eros suspendisse accumsan tortor quis turpis,16.89,http://dummyimage.com/216x113.jpg/dddddd/000000,4 +9,convallis,orci luctus et ultrices posuere cubilia,59.13,http://dummyimage.com/199x218.png/cc0000/ffffff,9 +10,amet erat,quam pede lobortis ligula sit amet eleifend pede libero quis,46.05,http://dummyimage.com/116x101.jpg/5fa2dd/ffffff,9 diff --git a/seeds_csvs/products_orders.csv b/seeds_csvs/products_orders.csv new file mode 100644 index 0000000000..2d63af28c8 --- /dev/null +++ b/seeds_csvs/products_orders.csv @@ -0,0 +1,11 @@ +id,product_id,order_id +1,2,5 +2,5,7 +3,1,4 +4,5,7 +5,2,6 +6,1,4 +7,6,10 +8,3,6 +9,6,9 +10,7,10 diff --git a/seeds_csvs/reviews.csv b/seeds_csvs/reviews.csv new file mode 100644 index 0000000000..6c53526ed4 --- /dev/null +++ b/seeds_csvs/reviews.csv @@ -0,0 +1,11 @@ +id,product_id,description,author,stars +1,3,sapien a libero nam dui proin leo,Louise Andrews,2 +2,3,varius nulla facilisi cras non velit nec,Kimberly Stone,2 +3,1,posuere felis sed lacus morbi sem mauris laoreet ut,Mark Myers,5 +4,7,mi pede malesuada in imperdiet et commodo vulputate,Mark Price,2 +5,9,orci vehicula condimentum curabitur in,Jack Cole,3 +6,1,erat vestibulum sed magna at,Justin Murphy,3 +7,2,accumsan felis ut at dolor quis odio consequat,Janice Foster,5 +8,9,nibh in lectus pellentesque at nulla suspendisse potenti cras,Sarah Matthews,5 +9,5,ante nulla justo aliquam quis turpis eget,Ann Stanley,3 +10,7,quis turpis sed ante vivamus tortor duis mattis egestas,Gary Ramirez,5 From 79692145b1b556e0260a42c3dbebd85b8beb0054 Mon Sep 17 00:00:00 2001 From: Nina Mutty Date: Tue, 18 Oct 2016 15:17:50 -0700 Subject: [PATCH 006/191] products controller base methods (check with seed data) --- app/controllers/products_controller.rb | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index b396aac00e..852888b4b6 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -1,5 +1,6 @@ class ProductsController < ApplicationController before_action :find_product, only: [:show, :edit, :update] + before_action :find_merchant, only: [:new, :create, :edit, :update] def index @products = Product.all @@ -9,15 +10,24 @@ def show end def new + @product = Product.new end def create + @product = Product.new(product_params) + @product.merchant_id = @merchant.id + @product.save end def edit end def update + if @product.update(student_params) + redirect_to product_path + else + render :edit + end end def destroy @@ -26,8 +36,15 @@ def destroy private def find_product - @product = Product.find(params[:product_id]) + @product = Product.find(params[:id]) end + def find_merchant + @merchant = Merchant.find(params[:id]) + end + + def product_params + params.require(:product).permit(:name, :description, :price, :image, :inventory, :rating) + end end From 893fb0b0e56f2379451218cb42bebb6364ecda37 Mon Sep 17 00:00:00 2001 From: Nina Mutty Date: Tue, 18 Oct 2016 15:19:21 -0700 Subject: [PATCH 007/191] added categories controller --- app/assets/javascripts/categories.coffee | 3 ++ app/assets/stylesheets/categories.scss | 3 ++ app/controllers/categories_controller.rb | 22 +++++++++++ app/helpers/categories_helper.rb | 2 + app/views/categories/create.html.erb | 2 + app/views/categories/destroy.html.erb | 2 + app/views/categories/edit.html.erb | 2 + app/views/categories/index.html.erb | 2 + app/views/categories/new.html.erb | 2 + app/views/categories/show.html.erb | 2 + app/views/categories/update.html.erb | 2 + config/routes.rb | 14 +++++++ .../controllers/categories_controller_test.rb | 39 +++++++++++++++++++ 13 files changed, 97 insertions(+) create mode 100644 app/assets/javascripts/categories.coffee create mode 100644 app/assets/stylesheets/categories.scss create mode 100644 app/controllers/categories_controller.rb create mode 100644 app/helpers/categories_helper.rb create mode 100644 app/views/categories/create.html.erb create mode 100644 app/views/categories/destroy.html.erb create mode 100644 app/views/categories/edit.html.erb create mode 100644 app/views/categories/index.html.erb create mode 100644 app/views/categories/new.html.erb create mode 100644 app/views/categories/show.html.erb create mode 100644 app/views/categories/update.html.erb create mode 100644 test/controllers/categories_controller_test.rb diff --git a/app/assets/javascripts/categories.coffee b/app/assets/javascripts/categories.coffee new file mode 100644 index 0000000000..24f83d18bb --- /dev/null +++ b/app/assets/javascripts/categories.coffee @@ -0,0 +1,3 @@ +# Place all the behaviors and hooks related to the matching controller here. +# All this logic will automatically be available in application.js. +# You can use CoffeeScript in this file: http://coffeescript.org/ diff --git a/app/assets/stylesheets/categories.scss b/app/assets/stylesheets/categories.scss new file mode 100644 index 0000000000..ef1657f8c9 --- /dev/null +++ b/app/assets/stylesheets/categories.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the categories controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/controllers/categories_controller.rb b/app/controllers/categories_controller.rb new file mode 100644 index 0000000000..5b402f2721 --- /dev/null +++ b/app/controllers/categories_controller.rb @@ -0,0 +1,22 @@ +class CategoriesController < ApplicationController + def index + end + + def show + end + + def new + end + + def create + end + + def edit + end + + def update + end + + def destroy + end +end diff --git a/app/helpers/categories_helper.rb b/app/helpers/categories_helper.rb new file mode 100644 index 0000000000..e06f31554c --- /dev/null +++ b/app/helpers/categories_helper.rb @@ -0,0 +1,2 @@ +module CategoriesHelper +end diff --git a/app/views/categories/create.html.erb b/app/views/categories/create.html.erb new file mode 100644 index 0000000000..63069b0005 --- /dev/null +++ b/app/views/categories/create.html.erb @@ -0,0 +1,2 @@ +

Categories#create

+

Find me in app/views/categories/create.html.erb

diff --git a/app/views/categories/destroy.html.erb b/app/views/categories/destroy.html.erb new file mode 100644 index 0000000000..a6ac971f4c --- /dev/null +++ b/app/views/categories/destroy.html.erb @@ -0,0 +1,2 @@ +

Categories#destroy

+

Find me in app/views/categories/destroy.html.erb

diff --git a/app/views/categories/edit.html.erb b/app/views/categories/edit.html.erb new file mode 100644 index 0000000000..3b8dca3af4 --- /dev/null +++ b/app/views/categories/edit.html.erb @@ -0,0 +1,2 @@ +

Categories#edit

+

Find me in app/views/categories/edit.html.erb

diff --git a/app/views/categories/index.html.erb b/app/views/categories/index.html.erb new file mode 100644 index 0000000000..a5d0d54736 --- /dev/null +++ b/app/views/categories/index.html.erb @@ -0,0 +1,2 @@ +

Categories#index

+

Find me in app/views/categories/index.html.erb

diff --git a/app/views/categories/new.html.erb b/app/views/categories/new.html.erb new file mode 100644 index 0000000000..7e5c27307e --- /dev/null +++ b/app/views/categories/new.html.erb @@ -0,0 +1,2 @@ +

Categories#new

+

Find me in app/views/categories/new.html.erb

diff --git a/app/views/categories/show.html.erb b/app/views/categories/show.html.erb new file mode 100644 index 0000000000..60e06c3d7b --- /dev/null +++ b/app/views/categories/show.html.erb @@ -0,0 +1,2 @@ +

Categories#show

+

Find me in app/views/categories/show.html.erb

diff --git a/app/views/categories/update.html.erb b/app/views/categories/update.html.erb new file mode 100644 index 0000000000..13b85657ff --- /dev/null +++ b/app/views/categories/update.html.erb @@ -0,0 +1,2 @@ +

Categories#update

+

Find me in app/views/categories/update.html.erb

diff --git a/config/routes.rb b/config/routes.rb index df02ea2f3a..68cb4178af 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,4 +1,18 @@ Rails.application.routes.draw do + get 'categories/index' + + get 'categories/show' + + get 'categories/new' + + get 'categories/create' + + get 'categories/edit' + + get 'categories/update' + + get 'categories/destroy' + get 'reviews/index' get 'reviews/show' diff --git a/test/controllers/categories_controller_test.rb b/test/controllers/categories_controller_test.rb new file mode 100644 index 0000000000..85778c4b52 --- /dev/null +++ b/test/controllers/categories_controller_test.rb @@ -0,0 +1,39 @@ +require 'test_helper' + +class CategoriesControllerTest < ActionController::TestCase + test "should get index" do + get :index + assert_response :success + end + + test "should get show" do + get :show + assert_response :success + end + + test "should get new" do + get :new + assert_response :success + end + + test "should get create" do + get :create + assert_response :success + end + + test "should get edit" do + get :edit + assert_response :success + end + + test "should get update" do + get :update + assert_response :success + end + + test "should get destroy" do + get :destroy + assert_response :success + end + +end From a0b6a93aa8e3958286c902fcb3647075c1becc13 Mon Sep 17 00:00:00 2001 From: Nina Mutty Date: Tue, 18 Oct 2016 15:52:58 -0700 Subject: [PATCH 008/191] edited models to be strings instead of integers --- ...161018224431_make_long_integers_strings.rb | 15 ++++++ db/schema.rb | 10 ++-- db/seeds.rb | 46 +++++++++---------- seeds_csvs/category.csv | 22 ++++----- 4 files changed, 54 insertions(+), 39 deletions(-) create mode 100644 db/migrate/20161018224431_make_long_integers_strings.rb diff --git a/db/migrate/20161018224431_make_long_integers_strings.rb b/db/migrate/20161018224431_make_long_integers_strings.rb new file mode 100644 index 0000000000..13b367f8de --- /dev/null +++ b/db/migrate/20161018224431_make_long_integers_strings.rb @@ -0,0 +1,15 @@ +class MakeLongIntegersStrings < ActiveRecord::Migration + def change + remove_column :orders, :card_number, :integer + add_column :orders, :card_number, :string + + remove_column :orders, :card_cvv, :integer + add_column :orders, :card_cvv, :string + + remove_column :orders, :billing_zip, :integer + add_column :orders, :billing_zip, :string + + remove_column :orders, :shipping_zip, :integer + add_column :orders, :shipping_zip, :string + end +end diff --git a/db/schema.rb b/db/schema.rb index f310fc2cb3..09c5cba213 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20161018213348) do +ActiveRecord::Schema.define(version: 20161018224431) do create_table "categories", force: :cascade do |t| t.string "name" @@ -39,16 +39,16 @@ t.integer "guest_id" t.integer "merchant_id" t.string "card_name" - t.integer "card_number" t.string "card_exp" - t.integer "card_cvv" - t.integer "billing_zip" t.string "shipping_street" t.string "shipping_city" t.string "shipping_state" - t.integer "shipping_zip" t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.string "card_number" + t.string "card_cvv" + t.string "billing_zip" + t.string "shipping_zip" end create_table "product_categories", force: :cascade do |t| diff --git a/db/seeds.rb b/db/seeds.rb index a59217b79b..e9066d2d4c 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -8,34 +8,34 @@ require 'csv' -CSV.foreach('seed_csvs/category.csv') do |csv_obj| - Category.create(id: csv_obj[0].to_i, name: csv_obj[1], product_id: csv_obj[2].to_i) +CSV.foreach('seeds_csvs/category.csv') do |csv_obj| + Category.create(id: csv_obj[0].to_i, name: csv_obj[1]) end - CSV.foreach('seed_csvs/guests.csv') do |csv_obj| - Category.create(id: csv_obj[0].to_i, name: csv_obj[1], email: csv_obj[2]) - end +CSV.foreach('seeds_csvs/guests.csv') do |csv_obj| + Guest.create(id: csv_obj[0].to_i, name: csv_obj[1], email: csv_obj[2]) +end - CSV.foreach('seed_csvs/merchant.csv') do |csv_obj| - Category.create(id: csv_obj[0].to_i, name: csv_obj[1], email: csv_obj[2], password: csv_obj[3]) - end +CSV.foreach('seeds_csvs/merchant.csv') do |csv_obj| + Merchant.create(id: csv_obj[0].to_i, name: csv_obj[1], email: csv_obj[2], password: csv_obj[3]) +end - CSV.foreach('seed_csvs/orders.csv') do |csv_obj| - Category.create(id: csv_obj[0].to_i, total_amount: csv_obj[1].to_i, guest_id: csv_obj[2].to_i, merchant_id: csv_obj[3].to_i, card_name: csv_obj[4], card_number: csv_obj[5].to_i, card_exp: csv_obj[6], card_cvv: csv_obj[7].to_i, billing_zip: csv_obj[8].to_i, shipping_street: csv_obj[8], shipping_city: csv_obj[9], shipping_state: csv_obj[10], shipping_zip: csv_obj[10].to_i ) - end +CSV.foreach('seeds_csvs/orders.csv') do |csv_obj| + Order.create(id: csv_obj[0].to_i, total_amount: csv_obj[1].to_i, guest_id: csv_obj[2].to_i, merchant_id: csv_obj[3].to_i, card_name: csv_obj[4], card_number: csv_obj[5], card_exp: csv_obj[6], card_cvv: csv_obj[7], billing_zip: csv_obj[8], shipping_street: csv_obj[8], shipping_city: csv_obj[9], shipping_state: csv_obj[10], shipping_zip: csv_obj[11]) +end - CSV.foreach('seed_csvs/product_categories.csv') do |csv_obj| - Category.create(id: csv_obj[0].to_i, category_id: csv_obj[1].to_i, product_id: csv_obj[2]) - end +CSV.foreach('seeds_csvs/product_categories.csv') do |csv_obj| + ProductCategory.create(id: csv_obj[0].to_i, category_id: csv_obj[1].to_i, product_id: csv_obj[2]) +end - CSV.foreach('seed_csvs/products_orders.csv') do |csv_obj| - Category.create(id: csv_obj[0].to_i, product_id: csv_obj[1].to_i, order_id: csv_obj[2].to_i) - end +CSV.foreach('seeds_csvs/products_orders.csv') do |csv_obj| + ProductOrder.create(id: csv_obj[0].to_i, product_id: csv_obj[1].to_i, order_id: csv_obj[2].to_i) +end - CSV.foreach('seed_csvs/products.csv') do |csv_obj| - Category.create(id: csv_obj[0].to_i, name: csv_obj[1], description: csv_obj[2], price: csv_obj[3].to_i, image: csv_obj[4], merchant_id: csv_obj[2].to_i ) - end +CSV.foreach('seeds_csvs/products.csv') do |csv_obj| + Product.create(id: csv_obj[0].to_i, name: csv_obj[1], description: csv_obj[2], price: csv_obj[3].to_i, image: csv_obj[4], merchant_id: csv_obj[2].to_i ) +end - CSV.foreach('seed_csvs/reviews.csv') do |csv_obj| - Category.create(id: csv_obj[0].to_i, product_id: csv_obj[1].to_i, description: csv_obj[2], author: csv_obj[3], stars: csv_obj[4].to_i) - end +CSV.foreach('seeds_csvs/reviews.csv') do |csv_obj| + Review.create(id: csv_obj[0].to_i, product_id: csv_obj[1].to_i, description: csv_obj[2], author: csv_obj[3], stars: csv_obj[4].to_i) +end diff --git a/seeds_csvs/category.csv b/seeds_csvs/category.csv index b7687e44fe..9ca067a746 100644 --- a/seeds_csvs/category.csv +++ b/seeds_csvs/category.csv @@ -1,11 +1,11 @@ -id,name,product_id -1,discrete,1 -2,Reduced,5 -3,intangible,6 -4,open architecture,5 -5,tertiary,3 -6,interactive,3 -7,holistic,5 -8,open architecture,2 -9,Switchable,10 -10,systemic,3 +id,name +1,discrete +2,Reduced +3,intangible +4,open architecture +5,tertiary +6,interactive +7,holistic +8,open architecture +9,Switchable +10,systemic From 7c7faa46a0fb6b790af4c41560f33e6bad3e4f5e Mon Sep 17 00:00:00 2001 From: Olivia Date: Tue, 18 Oct 2016 16:15:42 -0700 Subject: [PATCH 009/191] add methods to guest and merchant controller --- app/controllers/guests_controller.rb | 14 ++++++++++++-- app/controllers/merchants_controller.rb | 21 +++++++++++++++++++++ app/views/merchants/new.html.erb | 16 ++++++++++++++-- 3 files changed, 47 insertions(+), 4 deletions(-) diff --git a/app/controllers/guests_controller.rb b/app/controllers/guests_controller.rb index 2689da9733..cba0e54caf 100644 --- a/app/controllers/guests_controller.rb +++ b/app/controllers/guests_controller.rb @@ -1,11 +1,14 @@ class GuestsController < ApplicationController + + before_action :find_guest only: [:show] def index + @guests = Guest.all end - def show - end + def show; end def new + @guest = Guest.new end def create @@ -19,4 +22,11 @@ def update def destroy end + + private + + def find_guest + @guest = Guest.find(params[:id]) + end + end diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index 45be0beb40..32e76a74c4 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -1,14 +1,25 @@ class MerchantsController < ApplicationController + before_action :find_merchant only: [:show, :edit, :update] + def index + @merchants = Merchant.all end def show end def new + @merchant = Merchant.new end def create + @merchant = Merchant.new(merchant_params) + if @merchant.save + redirect_to merchants_path + else + render :new + end + end def edit @@ -19,4 +30,14 @@ def update def destroy end + + private + + def merchant_params + params.require(:merchant).permit(:name, :email, :password) + end + + def find_merchant + @merchant = Merchant.find(params[:id]) + end end diff --git a/app/views/merchants/new.html.erb b/app/views/merchants/new.html.erb index aaac3f85d7..4d0d6378e0 100644 --- a/app/views/merchants/new.html.erb +++ b/app/views/merchants/new.html.erb @@ -1,2 +1,14 @@ -

Merchants#new

-

Find me in app/views/merchants/new.html.erb

+

Become a merchant.

+ +<%= form_for @merchant, url: @path do |f| %> +
    +
  • <%= f.label :name %>
  • +
  • <%= f.text_field :name %>
  • + +
  • <%= f.label :email %>
  • +
  • <%= f.text_field :email %>
  • + +
  • <%= f.label :password %>
  • +
  • <%= f.text_field :password %>
  • + +
From fe6812b040cd33891f809f98db363680e272d50c Mon Sep 17 00:00:00 2001 From: Sabrina Wilbert Date: Tue, 18 Oct 2016 16:25:51 -0700 Subject: [PATCH 010/191] Added oAuth setup and sessions controller. --- app/controllers/sessions_controller.rb | 25 +++++++++++++++++++++++++ config/initializers/omniauth.rb | 3 +++ config/routes.rb | 2 ++ 3 files changed, 30 insertions(+) create mode 100644 config/initializers/omniauth.rb diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index ca48c61a6e..1449429e9c 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -1,7 +1,32 @@ class SessionsController < ApplicationController def create + auth_hash = request.env['omniauth.auth'] + + flash[:notice] = "Login Failed!" + return redirect to root_path unless auth_hash['uid'] + + @merchant = Merchant.find_by(uid: auth_hash[:uid], provider: 'github') + if @merchant.nil? + # User doesn't match anything in the DB. + # Attempt to create a new user. + @merchant = Merchant.build_from_github(auth_hash) + + flash[:notice] = "Unable to save the User" + return redirect_to root_path unless @merchant.save + end + + + #Save the user ID in the session + session[:user_id] = @merchant.id + + flash[:notice] = "Successfully logged in!" + redirect_to root_path end + + + def destroy + session[:user_id] = nil end end diff --git a/config/initializers/omniauth.rb b/config/initializers/omniauth.rb new file mode 100644 index 0000000000..fd4416122a --- /dev/null +++ b/config/initializers/omniauth.rb @@ -0,0 +1,3 @@ +Rails.application.config.middleware.use OmniAuth::Builder do + provider :github, ENV["GITHUB_CLIENT_ID"], ENV["GITHUB_CLIENT_SECRET"], scope: "user:email" +end diff --git a/config/routes.rb b/config/routes.rb index 68cb4178af..9fae6a60f4 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -87,6 +87,8 @@ get 'sessions/destroy' + get "/auth/:provider/callback" => "sessions#create" + # The priority is based upon order of creation: first created -> highest priority. # See how all your routes lay out with "rake routes". From 9861fea6c38612ad73a8a5afa947508354fd76c5 Mon Sep 17 00:00:00 2001 From: Nina Mutty Date: Tue, 18 Oct 2016 16:34:19 -0700 Subject: [PATCH 011/191] working on products show page --- app/views/products/index.html.erb | 8 ++++++-- app/views/products/show.html.erb | 6 ++++-- config/routes.rb | 14 ++------------ 3 files changed, 12 insertions(+), 16 deletions(-) diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index f8eeb82674..6ea08d0b3f 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -1,2 +1,6 @@ -

Products#index

-

Find me in app/views/products/index.html.erb

+

See All NotYetsy Products

+ +<% @products.each do |product| %> +

<%= link_to product.name, product_path(product.id) %>

+

<%= image_tag(product.image, size: "200x275", alt: "Photo of #{product.name}.") %>

+<% end %> diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 5f44ec44d2..13a4997dd7 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -1,2 +1,4 @@ -

Products#show

-

Find me in app/views/products/show.html.erb

+

<%= @product.name %>

+

<%= image_tag(product.image, size: "200x275", alt: "Photo of #{@product.name}.") %>

+

Description: <%= @product.description %>

+

Price: $<%= '%.2f' % (@product.price/100) %>

diff --git a/config/routes.rb b/config/routes.rb index 68cb4178af..6cd07fa6d1 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,4 +1,6 @@ Rails.application.routes.draw do + resources :products + get 'categories/index' get 'categories/show' @@ -27,19 +29,7 @@ get 'reviews/destroy' - get 'products/index' - - get 'products/show' - - get 'products/new' - - get 'products/create' - - get 'products/edit' - - get 'products/update' - get 'products/destroy' get 'orders/index' From 5451c523b1fb1c92302371022d6774bfd4e5d0f4 Mon Sep 17 00:00:00 2001 From: Nina Mutty Date: Tue, 18 Oct 2016 17:00:53 -0700 Subject: [PATCH 012/191] show view almost done --- app/controllers/products_controller.rb | 1 + app/views/products/show.html.erb | 12 +++++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 852888b4b6..7a2d3be959 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -7,6 +7,7 @@ def index end def show + @reviews = @products.reviews end def new diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 13a4997dd7..8f9e4909f8 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -1,4 +1,14 @@

<%= @product.name %>

-

<%= image_tag(product.image, size: "200x275", alt: "Photo of #{@product.name}.") %>

+

<%= image_tag(@product.image, size: "200x275", alt: "Photo of #{@product.name}.") %>

Description: <%= @product.description %>

Price: $<%= '%.2f' % (@product.price/100) %>

+

Inventory: <%= @product.inventory %>

+

Rating: <%= @product.rating.times { p "⭐️"} %>

+ +<% @reviews.each do |review| %> +

<%= review.stars.times { p "⭐️"} %>

+

<%= review.description %>

+

By: <%= review.author %>

+<% end %> + +<%# Add editing stuff buttons if the merchant is logged in %> From 3d3404f5261fab328229df15da1d29fc81ae4de4 Mon Sep 17 00:00:00 2001 From: Nina Mutty Date: Tue, 18 Oct 2016 17:11:10 -0700 Subject: [PATCH 013/191] added references --- app/models/product.rb | 2 +- db/migrate/20161019000145_add_foreign_keys.rb | 15 +++++++++++++++ db/schema.rb | 17 ++++++++++++----- 3 files changed, 28 insertions(+), 6 deletions(-) create mode 100644 db/migrate/20161019000145_add_foreign_keys.rb diff --git a/app/models/product.rb b/app/models/product.rb index 6809b930f5..c9bcf9cfb5 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -4,7 +4,7 @@ class Product < ActiveRecord::Base has_many :product_categories has_many :categories, :through => :product_categories - + belongs_to :merchant has_many :reviews end diff --git a/db/migrate/20161019000145_add_foreign_keys.rb b/db/migrate/20161019000145_add_foreign_keys.rb new file mode 100644 index 0000000000..3f23f6de57 --- /dev/null +++ b/db/migrate/20161019000145_add_foreign_keys.rb @@ -0,0 +1,15 @@ +class AddForeignKeys < ActiveRecord::Migration + def change + remove_column :orders, :guest_id, :integer + remove_column :orders, :merchant_id, :integer + + add_reference :orders, :guest, index: true, foreign_key: true + add_reference :orders, :merchant, index: true, foreign_key: true + + remove_column :products, :merchant_id, :integer + add_reference :products, :merchant, index: true, foreign_key: true + + remove_column :reviews, :product_id, :integer + add_reference :reviews, :product, index: true, foreign_key: true + end +end diff --git a/db/schema.rb b/db/schema.rb index 09c5cba213..e435b8575c 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20161018224431) do +ActiveRecord::Schema.define(version: 20161019000145) do create_table "categories", force: :cascade do |t| t.string "name" @@ -36,8 +36,6 @@ create_table "orders", force: :cascade do |t| t.integer "total_amount" - t.integer "guest_id" - t.integer "merchant_id" t.string "card_name" t.string "card_exp" t.string "shipping_street" @@ -49,8 +47,13 @@ t.string "card_cvv" t.string "billing_zip" t.string "shipping_zip" + t.integer "guest_id" + t.integer "merchant_id" end + add_index "orders", ["guest_id"], name: "index_orders_on_guest_id" + add_index "orders", ["merchant_id"], name: "index_orders_on_merchant_id" + create_table "product_categories", force: :cascade do |t| t.integer "product_id" t.integer "category_id" @@ -76,20 +79,24 @@ t.text "description" t.integer "price" t.string "image" - t.integer "merchant_id" t.integer "inventory" t.float "rating" t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.integer "merchant_id" end + add_index "products", ["merchant_id"], name: "index_products_on_merchant_id" + create_table "reviews", force: :cascade do |t| t.text "description" t.integer "stars" t.string "author" - t.integer "product_id" t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.integer "product_id" end + add_index "reviews", ["product_id"], name: "index_reviews_on_product_id" + end From f915bb50cdc2bd678b3d7567fbebedbd328cf876 Mon Sep 17 00:00:00 2001 From: Olivia Date: Tue, 18 Oct 2016 19:11:22 -0700 Subject: [PATCH 014/191] add merchant partial --- app/views/merchants/_merchant_partial.html.erb | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 app/views/merchants/_merchant_partial.html.erb diff --git a/app/views/merchants/_merchant_partial.html.erb b/app/views/merchants/_merchant_partial.html.erb new file mode 100644 index 0000000000..394959c4fa --- /dev/null +++ b/app/views/merchants/_merchant_partial.html.erb @@ -0,0 +1,12 @@ +<%= form_for @merchant, url: @path do |f| %> +
    +
  • <%= f.label :name %>
  • +
  • <%= f.text_field :name %>
  • + +
  • <%= f.label :email %>
  • +
  • <%= f.text_field :email %>
  • + +
  • <%= f.label :password %>
  • +
  • <%= f.text_field :password %>
  • + +
From 85ee721bad6b58e2151db32912f32395b8c02eea Mon Sep 17 00:00:00 2001 From: Nina Mutty Date: Tue, 18 Oct 2016 19:26:35 -0700 Subject: [PATCH 015/191] basic functionality completed for products and reviews - can one edit a review? --- app/controllers/products_controller.rb | 26 ++++++++++++++++---- app/controllers/reviews_controller.rb | 30 ++++++++++++++++++++++++ app/models/product.rb | 20 ++++++++++++++++ app/models/review.rb | 7 ++++++ app/views/products/_productform.html.erb | 28 ++++++++++++++++++++++ app/views/products/edit.html.erb | 4 ++-- app/views/products/index.html.erb | 10 ++++++-- app/views/products/new.html.erb | 4 ++-- app/views/products/show.html.erb | 26 ++++++++++++++++---- app/views/reviews/_reviewform.html.erb | 20 ++++++++++++++++ app/views/reviews/index.html.erb | 12 ++++++++-- app/views/reviews/new.html.erb | 4 ++-- 12 files changed, 171 insertions(+), 20 deletions(-) create mode 100644 app/views/products/_productform.html.erb create mode 100644 app/views/reviews/_reviewform.html.erb diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 7a2d3be959..1d89e1caa1 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -1,32 +1,48 @@ class ProductsController < ApplicationController before_action :find_product, only: [:show, :edit, :update] - before_action :find_merchant, only: [:new, :create, :edit, :update] + # before_action :find_merchant, only: [:new, :create, :edit, :update] def index @products = Product.all end def show - @reviews = @products.reviews + @reviews = @product.reviews.order('stars desc, id').limit(3) end def new @product = Product.new + @post_path = products_path + @post_method = :post end def create @product = Product.new(product_params) - @product.merchant_id = @merchant.id - @product.save + # @product.merchant_id = @merchant.id + @product.rating = 0 + + if @product.save + redirect_to product_path + else + @error = "Did not save successfully. Please try again." + @post_path = products_path + @post_method = :post + render :new + end end def edit + @post_path = product_path + @post_method = :put end def update - if @product.update(student_params) + if @product.update(product_params) redirect_to product_path else + @error = "Did not save successfully. Please try again." + @post_path = product_path + @post_method = :put render :edit end end diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index 7dd82b0d4a..aaa4483868 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -1,14 +1,33 @@ class ReviewsController < ApplicationController + before_action :find_product + before_action :find_review, only: [:show, :edit, :update] + + def index + @reviews = Review.where(product_id: @product.id) end def show end def new + @review = Review.new + @post_path = product_reviews_path + @post_method = :post end def create + @review = Review.new(review_params) + @review.product_id = @product.id + + if @review.save + redirect_to product_path(@product.id) + else + @error = "Did not save successfully. Please try again." + @post_path = product_reviews_path + @post_method = :post + render :new_review + end end def edit @@ -19,4 +38,15 @@ def update def destroy end + + private + def find_product + @product = Product.find(params[:product_id]) + end + def find_review + @review = Review.find(params[:id]) + end + def review_params + params.require(:review).permit(:stars, :description, :author) + end end diff --git a/app/models/product.rb b/app/models/product.rb index c9bcf9cfb5..46790f4bc8 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -7,4 +7,24 @@ class Product < ActiveRecord::Base belongs_to :merchant has_many :reviews + + + def rating + total_rating = 0 + if reviews.length != 0 + reviews.each do |review| + total_rating += review.stars + end + return total_rating/reviews.length + # Do we want the average to round up or down? Should I add one?? + else + return total_rating + end + end + + def star_string + printed_stars = "" + rating.times {|x| printed_stars << "⭐️"} + return printed_stars + end end diff --git a/app/models/review.rb b/app/models/review.rb index 53d7a4885b..f3f3d58715 100644 --- a/app/models/review.rb +++ b/app/models/review.rb @@ -1,3 +1,10 @@ class Review < ActiveRecord::Base belongs_to :product + + + def star_string + printed_stars = "" + stars.times {|x| printed_stars << "⭐️"} + return printed_stars + end end diff --git a/app/views/products/_productform.html.erb b/app/views/products/_productform.html.erb new file mode 100644 index 0000000000..f2d5f1704c --- /dev/null +++ b/app/views/products/_productform.html.erb @@ -0,0 +1,28 @@ +
<%= @error if @error %>
+<%= form_for @product, + method: @post_method, + url: @post_path do |f| %> +
+ <%= f.label :name %> + <%= f.text_field :name %> +
+
+ <%= f.label :description %> + <%= f.text_area :description %> +
+
+ <%= f.label :price %> + <%= f.number_field :price %> +
+
+ <%= f.label :inventory %> + <%= f.number_field :inventory %> +
+
+ <%= f.label :image %> + <%= f.text_field :image %> +
+
+ <%= f.submit %> +
+<% end %> diff --git a/app/views/products/edit.html.erb b/app/views/products/edit.html.erb index 279b066f30..fdd768f718 100644 --- a/app/views/products/edit.html.erb +++ b/app/views/products/edit.html.erb @@ -1,2 +1,2 @@ -

Products#edit

-

Find me in app/views/products/edit.html.erb

+

Edit Product: <%= @product.name %>

+<%= render partial: 'productform' %> diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index 6ea08d0b3f..3fe217a2f4 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -1,6 +1,12 @@

See All NotYetsy Products

<% @products.each do |product| %> -

<%= link_to product.name, product_path(product.id) %>

-

<%= image_tag(product.image, size: "200x275", alt: "Photo of #{product.name}.") %>

+
+

<%= link_to product.name, product_path(product.id) %>

+

<%= image_tag(product.image, size: "200x275", alt: "Photo of #{product.name}.") %>

+
<% end %> + +

+ <%= link_to "Add New Product", new_product_path %> +

diff --git a/app/views/products/new.html.erb b/app/views/products/new.html.erb index a14e0d91b6..847be15e73 100644 --- a/app/views/products/new.html.erb +++ b/app/views/products/new.html.erb @@ -1,2 +1,2 @@ -

Products#new

-

Find me in app/views/products/new.html.erb

+

Create a New Product

+<%= render partial: 'productform' %> diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 8f9e4909f8..3786868bfa 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -3,12 +3,28 @@

Description: <%= @product.description %>

Price: $<%= '%.2f' % (@product.price/100) %>

Inventory: <%= @product.inventory %>

-

Rating: <%= @product.rating.times { p "⭐️"} %>

+

Rating: <%= @product.rating == 0 ? "Not Yet Rated!" : @product.star_string %>

-<% @reviews.each do |review| %> -

<%= review.stars.times { p "⭐️"} %>

-

<%= review.description %>

-

By: <%= review.author %>

+<%# IF it's a merchant ONLY %> +

<%= link_to "Edit Product", edit_product_path(@product.id) %>

+ + +<% if @reviews != nil %> + <% @reviews.each do |review| %> +
+

<%= review.star_string %>

+

<%= review.description %>

+

By: <%= review.author %>

+
+ <% end %> <% end %> +

<%= link_to 'See All Product Reviews!', product_reviews_path(@product.id) %>

+

<%= link_to 'Add A Review!', new_product_review_path(@product.id) %>

<%# Don't allow a merchant to add their own product review %> + +

+ <%= link_to 'See All Products', products_path %> +

+ + <%# Add editing stuff buttons if the merchant is logged in %> diff --git a/app/views/reviews/_reviewform.html.erb b/app/views/reviews/_reviewform.html.erb new file mode 100644 index 0000000000..7909a80b9a --- /dev/null +++ b/app/views/reviews/_reviewform.html.erb @@ -0,0 +1,20 @@ +
<%= @error if @error %>
+<%= form_for @review, + method: @post_method, + url: @post_path do |f| %> +
+ <%= f.label :stars %> + <%= f.number_field :stars %> +
+
+ <%= f.label :description %> + <%= f.text_area :description %> +
+
+ <%= f.label :author %> + <%= f.text_field :author %> +
+
+ <%= f.submit %> +
+<% end %> diff --git a/app/views/reviews/index.html.erb b/app/views/reviews/index.html.erb index d19455779d..786099c138 100644 --- a/app/views/reviews/index.html.erb +++ b/app/views/reviews/index.html.erb @@ -1,2 +1,10 @@ -

Reviews#index

-

Find me in app/views/reviews/index.html.erb

+

All Reviews for <%= @product.name %>

+

Average: <%= @product.star_string %>

+ +<% @reviews.each do |review| %> +
+

<%= review.star_string %>

+

<%= review.description %>

+

By: <%= review.author %>

+
+<% end %> diff --git a/app/views/reviews/new.html.erb b/app/views/reviews/new.html.erb index 9cc9d7f56b..b83f02a9ff 100644 --- a/app/views/reviews/new.html.erb +++ b/app/views/reviews/new.html.erb @@ -1,2 +1,2 @@ -

Reviews#new

-

Find me in app/views/reviews/new.html.erb

+

Add Review for <%= @product.name %>

+<%= render partial: 'reviewform' %> From a5b642423dec9b978cc1dfbc644d57c9c3892ee5 Mon Sep 17 00:00:00 2001 From: Nina Mutty Date: Tue, 18 Oct 2016 19:26:58 -0700 Subject: [PATCH 016/191] nested reviews routes within products --- config/routes.rb | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/config/routes.rb b/config/routes.rb index b3a7f719ad..57f88bb314 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,5 +1,7 @@ Rails.application.routes.draw do - resources :products + resources :products do + resources :reviews + end get 'categories/index' @@ -15,19 +17,6 @@ get 'categories/destroy' - get 'reviews/index' - - get 'reviews/show' - - get 'reviews/new' - - get 'reviews/create' - - get 'reviews/edit' - - get 'reviews/update' - - get 'reviews/destroy' From ed9bbe3594c0e3b12adf2f73744b152c824b58fe Mon Sep 17 00:00:00 2001 From: Nina Mutty Date: Tue, 18 Oct 2016 19:35:45 -0700 Subject: [PATCH 017/191] added delete product functionality --- app/controllers/products_controller.rb | 5 +++++ app/views/products/show.html.erb | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 1d89e1caa1..63fb1088c7 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -48,6 +48,11 @@ def update end def destroy + @product = find_product + if @product.class == Product + @product.destroy + redirect_to products_path + end end private diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 3786868bfa..0f3fe27a51 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -6,7 +6,8 @@

Rating: <%= @product.rating == 0 ? "Not Yet Rated!" : @product.star_string %>

<%# IF it's a merchant ONLY %> -

<%= link_to "Edit Product", edit_product_path(@product.id) %>

+

<%= button_to "Edit Product", edit_product_path(@product.id) %>

+

<%= button_to "Delete Product", {controller: 'products', action: 'destroy'}, path: 'product', method: :delete, data: {confirm: "Are you sure?"}%>

<% if @reviews != nil %> From 552efe2fc6180f1ff3773f5956319ed3715d077c Mon Sep 17 00:00:00 2001 From: Olivia Date: Wed, 19 Oct 2016 10:53:14 -0700 Subject: [PATCH 018/191] new merchant method --- app/controllers/merchants_controller.rb | 3 +- app/views/merchants/new.html.erb | 16 ++-- config/routes.rb | 90 +------------------ test/controllers/merchants_controller_test.rb | 10 +++ 4 files changed, 22 insertions(+), 97 deletions(-) diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index 32e76a74c4..c47794a43d 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -1,5 +1,5 @@ class MerchantsController < ApplicationController - before_action :find_merchant only: [:show, :edit, :update] + #before_action :find_merchant only: [:show, :edit, :update] def index @merchants = Merchant.all @@ -10,6 +10,7 @@ def show def new @merchant = Merchant.new + @path = merchants_create_path end def create diff --git a/app/views/merchants/new.html.erb b/app/views/merchants/new.html.erb index 4d0d6378e0..e85a4b17c4 100644 --- a/app/views/merchants/new.html.erb +++ b/app/views/merchants/new.html.erb @@ -1,14 +1,14 @@

Become a merchant.

<%= form_for @merchant, url: @path do |f| %> -
    -
  • <%= f.label :name %>
  • -
  • <%= f.text_field :name %>
  • -
  • <%= f.label :email %>
  • -
  • <%= f.text_field :email %>
  • + <%= f.label :name %> + <%= f.text_field :name %> -
  • <%= f.label :password %>
  • -
  • <%= f.text_field :password %>
  • + <%= f.label :email %> + <%= f.text_field :email %> -
+ <%= f.label :password %> + <%= f.text_field :password %> + +<% end %> diff --git a/config/routes.rb b/config/routes.rb index 9fae6a60f4..bedabda897 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,93 +1,7 @@ Rails.application.routes.draw do - get 'categories/index' - get 'categories/show' - - get 'categories/new' - - get 'categories/create' - - get 'categories/edit' - - get 'categories/update' - - get 'categories/destroy' - - get 'reviews/index' - - get 'reviews/show' - - get 'reviews/new' - - get 'reviews/create' - - get 'reviews/edit' - - get 'reviews/update' - - get 'reviews/destroy' - - get 'products/index' - - get 'products/show' - - get 'products/new' - - get 'products/create' - - get 'products/edit' - - get 'products/update' - - get 'products/destroy' - - get 'orders/index' - - get 'orders/show' - - get 'orders/new' - - get 'orders/create' - - get 'orders/edit' - - get 'orders/update' - - get 'orders/destroy' - - get 'merchants/index' - - get 'merchants/show' - - get 'merchants/new' - - get 'merchants/create' - - get 'merchants/edit' - - get 'merchants/update' - - get 'merchants/destroy' - - get 'guests/index' - - get 'guests/show' - - get 'guests/new' - - get 'guests/create' - - get 'guests/edit' - - get 'guests/update' - - get 'guests/destroy' - - get 'sessions/create' - - get 'sessions/destroy' - - get "/auth/:provider/callback" => "sessions#create" + resources :merchants + # The priority is based upon order of creation: first created -> highest priority. # See how all your routes lay out with "rake routes". diff --git a/test/controllers/merchants_controller_test.rb b/test/controllers/merchants_controller_test.rb index 6f4b548bc2..b5149c470d 100644 --- a/test/controllers/merchants_controller_test.rb +++ b/test/controllers/merchants_controller_test.rb @@ -14,6 +14,16 @@ class MerchantsControllerTest < ActionController::TestCase test "should get new" do get :new assert_response :success + assert_template :new + end + end + + test "Creating a Merchant changes number of Merchants" do + assert_difference('Merchant.count', 1) do + post_params = {merchant: {name: "Lola CherryCola"}} + post :create, post_params + end + assert_response :redirect end test "should get create" do From dffcf916dfe04c314b2c7614c754b5186e2c878d Mon Sep 17 00:00:00 2001 From: Miriam Cortes Date: Wed, 19 Oct 2016 10:53:54 -0700 Subject: [PATCH 019/191] merchant show view and edit --- app/controllers/merchants_controller.rb | 3 +- app/views/merchants/edit.html.erb | 4 +- app/views/merchants/show.html.erb | 60 ++++++++++++++++++++++++- config/routes.rb | 15 +------ 4 files changed, 63 insertions(+), 19 deletions(-) diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index 32e76a74c4..37b6932163 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -1,11 +1,12 @@ class MerchantsController < ApplicationController - before_action :find_merchant only: [:show, :edit, :update] + # before_action :find_merchant only: [:show, :edit, :update] def index @merchants = Merchant.all end def show + find_merchant end def new diff --git a/app/views/merchants/edit.html.erb b/app/views/merchants/edit.html.erb index 825f2251dc..1c689e58a0 100644 --- a/app/views/merchants/edit.html.erb +++ b/app/views/merchants/edit.html.erb @@ -1,2 +1,2 @@ -

Merchants#edit

-

Find me in app/views/merchants/edit.html.erb

+

Edit your info

+<%= render partial: "merchantform", locals: {action_name: "update", params: { id: @merchant.id }} %> diff --git a/app/views/merchants/show.html.erb b/app/views/merchants/show.html.erb index cbb0f02bfe..094bda7130 100644 --- a/app/views/merchants/show.html.erb +++ b/app/views/merchants/show.html.erb @@ -1,2 +1,58 @@ -

Merchants#show

-

Find me in app/views/merchants/show.html.erb

+

<%= @merchant[:name] %>

+

+ +
    +
  • <%= button_to 'Add a Product', products_new_path(params[:id]), :class => "button", method: :get %>
  • +
  • <%= button_to 'View Products', products_show_path(params[:id]), :class => "button", method: :get %>
  • +
  • <%= button_to 'Add a Category', categories_new_path(params[:id]), :class => "button", method: :get %>
  • +
+ +
+ + + + + + + + + <% @merchant.orders.each do |order| %> + + + + + + <% end %> + +
Order NumberItemsOrder Status
<%= link_to(order.id, orders_show_path(order.id)) %><%#= link_to(Product.find(order.product_ids).name, products_show_path(product.id)) %><%#= order.status %>
+
+ + +

Summary

+
+

Revenue

+

Total Revenue for Pending Orders:

+

$

+

Total Revenue for Paid Orders:

+

$

+

Total Revenue for Cancelled Orders:

+

$

+

Total Revenue for Completed Orders:

+

$

+

Total Net Revenue:

+

$

+
+
+

Orders

+

Total Pending Orders

+

+

Total Cancelled Orders:

+

+

Total Paid Orders:

+

+

Total Completed Orders:

+

+

Total Orders:

+

+
+
diff --git a/config/routes.rb b/config/routes.rb index 9fae6a60f4..e91724f4b8 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,4 +1,5 @@ Rails.application.routes.draw do + resources :merchants get 'categories/index' get 'categories/show' @@ -55,20 +56,6 @@ get 'orders/destroy' - get 'merchants/index' - - get 'merchants/show' - - get 'merchants/new' - - get 'merchants/create' - - get 'merchants/edit' - - get 'merchants/update' - - get 'merchants/destroy' - get 'guests/index' get 'guests/show' From 0995813959133a972c39583bb77234d1d43598bc Mon Sep 17 00:00:00 2001 From: Olivia Date: Wed, 19 Oct 2016 11:00:32 -0700 Subject: [PATCH 020/191] fixed routes --- config/routes.rb | 81 +++--------------------------------------------- 1 file changed, 5 insertions(+), 76 deletions(-) diff --git a/config/routes.rb b/config/routes.rb index ca032fdddf..4303c47301 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -2,82 +2,11 @@ resources :merchants resources :products - - get 'categories/index' - - get 'categories/show' - - get 'categories/new' - - get 'categories/create' - - get 'categories/edit' - - get 'categories/update' - - get 'categories/destroy' - - get 'reviews/index' - - get 'reviews/show' - - get 'reviews/new' - - get 'reviews/create' - - get 'reviews/edit' - - get 'reviews/update' - - get 'reviews/destroy' - - - - get 'orders/index' - - get 'orders/show' - - get 'orders/new' - - get 'orders/create' - - get 'orders/edit' - - get 'orders/update' - - get 'orders/destroy' - - get 'merchants/index' - - get 'merchants/show' - - get 'merchants/new' - - get 'merchants/create' - - get 'merchants/edit' - - get 'merchants/update' - - get 'merchants/destroy' - - get 'guests/index' - - get 'guests/show' - - get 'guests/new' - - get 'guests/create' - - get 'guests/edit' - - get 'guests/update' - - get 'guests/destroy' - - get 'sessions/create' - - get 'sessions/destroy' + resources :categories + resources :reviews + resources :orders + resources :guests + resources :sessions get "/auth/:provider/callback" => "sessions#create" >>>>>>> master From 8d929614a9c9a837b9bd4400031bde9699d417bd Mon Sep 17 00:00:00 2001 From: Nina Mutty Date: Wed, 19 Oct 2016 11:05:10 -0700 Subject: [PATCH 021/191] Update routes.rb --- config/routes.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/config/routes.rb b/config/routes.rb index 4303c47301..2e0515719d 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -9,7 +9,6 @@ resources :sessions get "/auth/:provider/callback" => "sessions#create" ->>>>>>> master # The priority is based upon order of creation: first created -> highest priority. # See how all your routes lay out with "rake routes". From 78ba4614027de5c4e1ef3f44d71ccb9ee9cb82a9 Mon Sep 17 00:00:00 2001 From: Olivia Date: Wed, 19 Oct 2016 11:07:17 -0700 Subject: [PATCH 022/191] routes --- config/routes.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/routes.rb b/config/routes.rb index 4303c47301..b978968c1a 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -9,7 +9,7 @@ resources :sessions get "/auth/:provider/callback" => "sessions#create" ->>>>>>> master + # The priority is based upon order of creation: first created -> highest priority. # See how all your routes lay out with "rake routes". From 57c9d3e08fc533c5a410914fe36769b47d7c8ed2 Mon Sep 17 00:00:00 2001 From: Nina Mutty Date: Wed, 19 Oct 2016 11:07:24 -0700 Subject: [PATCH 023/191] changes star_string to a view helper method --- app/helpers/application_helper.rb | 25 +++++++++++++++++++++++++ app/models/product.rb | 10 +++++----- app/models/review.rb | 10 +++++----- app/views/products/show.html.erb | 4 ++-- app/views/reviews/index.html.erb | 6 +++--- 5 files changed, 40 insertions(+), 15 deletions(-) diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index de6be7945c..3de19fda31 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -1,2 +1,27 @@ module ApplicationHelper + + def star_string(rating) + printed_stars = "" + rating.times {|x| printed_stars << "⭐️"} + printed_stars.html_safe + end end + +# +# def readable_date(date) +# ("" + date.strftime("%A, %b %d") + "").html_safe +# end +# +# def random_image(width, height) +# number = rand(3) +# url = "" +# case number +# when 0 +# url = "http://www.fillmurray.com/" +# when 1 +# url = "http://www.placecage.com/" +# when 2 +# url = "http://placekitten.com/" +# end +# ["random image"].join.html_safe +# end diff --git a/app/models/product.rb b/app/models/product.rb index 46790f4bc8..01bff2c413 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -22,9 +22,9 @@ def rating end end - def star_string - printed_stars = "" - rating.times {|x| printed_stars << "⭐️"} - return printed_stars - end + # def star_string + # printed_stars = "" + # rating.times {|x| printed_stars << "⭐️"} + # return printed_stars + # end end diff --git a/app/models/review.rb b/app/models/review.rb index f3f3d58715..c3e009ca49 100644 --- a/app/models/review.rb +++ b/app/models/review.rb @@ -2,9 +2,9 @@ class Review < ActiveRecord::Base belongs_to :product - def star_string - printed_stars = "" - stars.times {|x| printed_stars << "⭐️"} - return printed_stars - end + # def star_string + # printed_stars = "" + # stars.times {|x| printed_stars << "⭐️"} + # return printed_stars + # end end diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 0f3fe27a51..cd7c9674a7 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -3,7 +3,7 @@

Description: <%= @product.description %>

Price: $<%= '%.2f' % (@product.price/100) %>

Inventory: <%= @product.inventory %>

-

Rating: <%= @product.rating == 0 ? "Not Yet Rated!" : @product.star_string %>

+

Rating: <%= @product.rating == 0 ? "Not Yet Rated!" : star_string(@product.rating) %>

<%# IF it's a merchant ONLY %>

<%= button_to "Edit Product", edit_product_path(@product.id) %>

@@ -13,7 +13,7 @@ <% if @reviews != nil %> <% @reviews.each do |review| %>
-

<%= review.star_string %>

+

<%= star_string(review.stars) %>

<%= review.description %>

By: <%= review.author %>

diff --git a/app/views/reviews/index.html.erb b/app/views/reviews/index.html.erb index 786099c138..21d1932e6e 100644 --- a/app/views/reviews/index.html.erb +++ b/app/views/reviews/index.html.erb @@ -1,10 +1,10 @@

All Reviews for <%= @product.name %>

-

Average: <%= @product.star_string %>

+

Average: <%= star_string(@product.rating) %>

<% @reviews.each do |review| %>
-

<%= review.star_string %>

+

<%= star_string(review.stars) %>

<%= review.description %>

-

By: <%= review.author %>

+

By: <%= review.author %>

<% end %> From 8f86369338379c108821a4141a83e97d5f9905ba Mon Sep 17 00:00:00 2001 From: Sabrina Wilbert Date: Wed, 19 Oct 2016 11:09:18 -0700 Subject: [PATCH 024/191] Add route resoureces --- app/controllers/application_controller.rb | 9 +++ app/controllers/orders_controller.rb | 3 + app/controllers/sessions_controller.rb | 10 ++- app/helpers/application_helper.rb | 7 ++ app/views/layouts/application.html.erb | 1 + config/routes.rb | 81 +++-------------------- 6 files changed, 40 insertions(+), 71 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index d83690e1b9..9a0b42a230 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -2,4 +2,13 @@ class ApplicationController < ActionController::Base # Prevent CSRF attacks by raising an exception. # For APIs, you may want to use :null_session instead. protect_from_forgery with: :exception + + helper_method :current_merchant + + def current_merchant + @current_merchant ||= Merchant.find_by(id: session[:merchant_id]) + end + + + end diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 27bfa788fd..43068dc2d9 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -1,5 +1,6 @@ class OrdersController < ApplicationController def index + @orders = Order.all end def show @@ -9,6 +10,8 @@ def new end def create + if current_merchant.nil? + end def edit diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index 1449429e9c..954d796280 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -23,7 +23,15 @@ def create redirect_to root_path end - + # def login + # session[:merchant_id] = 1 + # redirect_to '/products/index' + # end + # + # def logout + # session[:merchant_id] = nil + # redirect_to '/products/index' + end def destroy diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index de6be7945c..ca1ee93b0e 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -1,2 +1,9 @@ module ApplicationHelper + def greeting + if current_merchant.nil? + "Welcome Guest" + else + "Welcome #{current_merchant.name}" + end + end end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 9b70e01c2e..983ad65f37 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -7,6 +7,7 @@ <%= csrf_meta_tags %> +

<%= greeting %>

<%= yield %> diff --git a/config/routes.rb b/config/routes.rb index b3a7f719ad..ed4cf268d6 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,77 +1,15 @@ Rails.application.routes.draw do - resources :products - - get 'categories/index' - - get 'categories/show' - - get 'categories/new' - - get 'categories/create' - - get 'categories/edit' - - get 'categories/update' - - get 'categories/destroy' - - get 'reviews/index' - - get 'reviews/show' - - get 'reviews/new' - - get 'reviews/create' - - get 'reviews/edit' - - get 'reviews/update' - - get 'reviews/destroy' - - - - get 'orders/index' - - get 'orders/show' - get 'orders/new' - - get 'orders/create' - - get 'orders/edit' - - get 'orders/update' - - get 'orders/destroy' - - get 'merchants/index' - - get 'merchants/show' - - get 'merchants/new' - - get 'merchants/create' - - get 'merchants/edit' - - get 'merchants/update' - - get 'merchants/destroy' - - get 'guests/index' - - get 'guests/show' - - get 'guests/new' - - get 'guests/create' - - get 'guests/edit' + resources :products - get 'guests/update' + root to: 'products#index' + resources :categories + resources :guests + resources :merchants + resources :products + resources :reviews + resources :orders - get 'guests/destroy' get 'sessions/create' @@ -79,6 +17,9 @@ get "/auth/:provider/callback" => "sessions#create" + # get "/login" => 'sessions#login' + # get "/logout" => 'sessions#logout' + # The priority is based upon order of creation: first created -> highest priority. # See how all your routes lay out with "rake routes". From 084f1e8a2c798368fc05ce6034c70bbeb0a89498 Mon Sep 17 00:00:00 2001 From: Olivia Legge Date: Wed, 19 Oct 2016 11:14:13 -0700 Subject: [PATCH 025/191] Update edit.html.erb --- app/views/merchants/edit.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/merchants/edit.html.erb b/app/views/merchants/edit.html.erb index 1c689e58a0..b50eb28664 100644 --- a/app/views/merchants/edit.html.erb +++ b/app/views/merchants/edit.html.erb @@ -1,2 +1,2 @@

Edit your info

-<%= render partial: "merchantform", locals: {action_name: "update", params: { id: @merchant.id }} %> +<%= render partial: "_merchant_partial", locals: {action_name: "update", params: { id: @merchant.id }} %> From 6cd8ade8c7457a84cc9eb2a607e4734a5102f56d Mon Sep 17 00:00:00 2001 From: Miriam Date: Wed, 19 Oct 2016 11:23:19 -0700 Subject: [PATCH 026/191] Update sessions_controller.rb --- app/controllers/sessions_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index 954d796280..5f81a23459 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -31,7 +31,7 @@ def create # def logout # session[:merchant_id] = nil # redirect_to '/products/index' - end + # end def destroy From 3ba0977483869b30efafd205ebd422bb9fbefdf1 Mon Sep 17 00:00:00 2001 From: Miriam Date: Wed, 19 Oct 2016 11:24:23 -0700 Subject: [PATCH 027/191] Update routes.rb --- config/routes.rb | 57 ------------------------------------------------ 1 file changed, 57 deletions(-) diff --git a/config/routes.rb b/config/routes.rb index f4c04d1b47..dcb104c1e3 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -17,61 +17,4 @@ get "/auth/:provider/callback" => "sessions#create" - # get "/login" => 'sessions#login' - # get "/logout" => 'sessions#logout' - - # The priority is based upon order of creation: first created -> highest priority. - # See how all your routes lay out with "rake routes". - - # You can have the root of your site routed with "root" - # root 'welcome#index' - - # Example of regular route: - # get 'products/:id' => 'catalog#view' - - # Example of named route that can be invoked with purchase_url(id: product.id) - # get 'products/:id/purchase' => 'catalog#purchase', as: :purchase - - # Example resource route (maps HTTP verbs to controller actions automatically): - # resources :products - - # Example resource route with options: - # resources :products do - # member do - # get 'short' - # post 'toggle' - # end - # - # collection do - # get 'sold' - # end - # end - - # Example resource route with sub-resources: - # resources :products do - # resources :comments, :sales - # resource :seller - # end - - # Example resource route with more complex sub-resources: - # resources :products do - # resources :comments - # resources :sales do - # get 'recent', on: :collection - # end - # end - - # Example resource route with concerns: - # concern :toggleable do - # post 'toggle' - # end - # resources :posts, concerns: :toggleable - # resources :photos, concerns: :toggleable - - # Example resource route within a namespace: - # namespace :admin do - # # Directs /admin/products/* to Admin::ProductsController - # # (app/controllers/admin/products_controller.rb) - # resources :products - # end end From 847eb78d16aac065f300c7bbccffbdd8d388c1a2 Mon Sep 17 00:00:00 2001 From: Nina Mutty Date: Wed, 19 Oct 2016 11:25:49 -0700 Subject: [PATCH 028/191] updated review index stars --- app/views/reviews/index.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/reviews/index.html.erb b/app/views/reviews/index.html.erb index 21d1932e6e..a1ea35a372 100644 --- a/app/views/reviews/index.html.erb +++ b/app/views/reviews/index.html.erb @@ -3,7 +3,7 @@ <% @reviews.each do |review| %>
-

<%= star_string(review.stars) %>

+

<%= star_string(review.stars) %>

<%= review.description %>

By: <%= review.author %>

From f451b61a4f1f3ff05a50ad14613bfc87c3452d36 Mon Sep 17 00:00:00 2001 From: Nina Mutty Date: Wed, 19 Oct 2016 11:33:39 -0700 Subject: [PATCH 029/191] Update application_helper.rb --- app/helpers/application_helper.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index a647a2b41d..e10e27c0cc 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -5,7 +5,8 @@ def star_string(rating) printed_stars = "" rating.times {|x| printed_stars << "⭐️"} printed_stars.html_safe - + end + def greeting if current_merchant.nil? "Welcome Guest" From 863c441c154de4453d680c11f3de378cbfbf3f5c Mon Sep 17 00:00:00 2001 From: Nina Mutty Date: Wed, 19 Oct 2016 14:27:33 -0700 Subject: [PATCH 030/191] typo in seed file reading in merchant_id and added iventory column to products --- db/seeds.rb | 2 +- seeds_csvs/products.csv | 22 +++++++++++----------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/db/seeds.rb b/db/seeds.rb index e9066d2d4c..52f8032829 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -33,7 +33,7 @@ end CSV.foreach('seeds_csvs/products.csv') do |csv_obj| - Product.create(id: csv_obj[0].to_i, name: csv_obj[1], description: csv_obj[2], price: csv_obj[3].to_i, image: csv_obj[4], merchant_id: csv_obj[2].to_i ) + Product.create(id: csv_obj[0].to_i, name: csv_obj[1], description: csv_obj[2], price: csv_obj[3].to_i, image: csv_obj[4], inventory: csv_obj[5].to_i, merchant_id: csv_obj[6].to_i ) end CSV.foreach('seeds_csvs/reviews.csv') do |csv_obj| diff --git a/seeds_csvs/products.csv b/seeds_csvs/products.csv index fc810b22bd..1046127913 100644 --- a/seeds_csvs/products.csv +++ b/seeds_csvs/products.csv @@ -1,11 +1,11 @@ -id,name,description,price,image,merchant_id -1,ut,elit proin risus praesent lectus vestibulum quam sapien,37.04,http://dummyimage.com/172x213.jpg/5fa2dd/ffffff,9 -2,sollicitudin,ultrices posuere cubilia curae donec pharetra magna,88.38,http://dummyimage.com/145x190.bmp/ff4444/ffffff,3 -3,libero,in magna bibendum imperdiet nullam orci pede venenatis non sodales,11.71,http://dummyimage.com/205x159.bmp/dddddd/000000,10 -4,eget,vestibulum eget vulputate ut ultrices vel augue vestibulum ante ipsum,73.05,http://dummyimage.com/112x147.bmp/dddddd/000000,1 -5,mi nulla,mauris lacinia sapien quis libero,48.57,http://dummyimage.com/181x184.jpg/ff4444/ffffff,1 -6,mauris,ipsum primis in faucibus orci,7.39,http://dummyimage.com/109x202.bmp/ff4444/ffffff,9 -7,sed augue,sodales sed tincidunt eu felis fusce,1.9,http://dummyimage.com/232x126.png/5fa2dd/ffffff,8 -8,nonummy,sit amet eros suspendisse accumsan tortor quis turpis,16.89,http://dummyimage.com/216x113.jpg/dddddd/000000,4 -9,convallis,orci luctus et ultrices posuere cubilia,59.13,http://dummyimage.com/199x218.png/cc0000/ffffff,9 -10,amet erat,quam pede lobortis ligula sit amet eleifend pede libero quis,46.05,http://dummyimage.com/116x101.jpg/5fa2dd/ffffff,9 +id,name,description,price,image,inventory,merchant_id +1,ut,elit proin risus praesent lectus vestibulum quam sapien,37.04,http://dummyimage.com/172x213.jpg/5fa2dd/ffffff/,1,9 +2,sollicitudin,ultrices posuere cubilia curae donec pharetra magna,88.38,http://dummyimage.com/145x190.bmp/ff4444/ffffff/,2,3 +3,libero,in magna bibendum imperdiet nullam orci pede venenatis non sodales,11.71,http://dummyimage.com/205x159.bmp/dddddd/000000,10,10 +4,eget,vestibulum eget vulputate ut ultrices vel augue vestibulum ante ipsum,73.05,http://dummyimage.com/112x147.bmp/dddddd/000000,1,1 +5,mi nulla,mauris lacinia sapien quis libero,48.57,http://dummyimage.com/181x184.jpg/ff4444/ffffff/,1,1 +6,mauris,ipsum primis in faucibus orci,7.39,http://dummyimage.com/109x202.bmp/ff4444/ffffff/,9,9 +7,sed augue,sodales sed tincidunt eu felis fusce,1.9,http://dummyimage.com/232x126.png/5fa2dd/ffffff/,8,8 +8,nonummy,sit amet eros suspendisse accumsan tortor quis turpis,16.89,http://dummyimage.com/216x113.jpg/dddddd/000000,4,4 +9,convallis,orci luctus et ultrices posuere cubilia,59.13,http://dummyimage.com/199x218.png/cc0000/ffffff/,9,9 +10,amet erat,quam pede lobortis ligula sit amet eleifend pede libero quis,46.05,http://dummyimage.com/116x101.jpg/5fa2dd/ffffff/,9,9 From b7ac4d3abaa0ff662a194242158246a4c6251751 Mon Sep 17 00:00:00 2001 From: Nina Mutty Date: Wed, 19 Oct 2016 14:28:04 -0700 Subject: [PATCH 031/191] edited star method to show empty start --- app/helpers/application_helper.rb | 24 +++--------------------- app/models/product.rb | 5 ----- 2 files changed, 3 insertions(+), 26 deletions(-) diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index e10e27c0cc..05abffa501 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -3,10 +3,11 @@ module ApplicationHelper def star_string(rating) printed_stars = "" - rating.times {|x| printed_stars << "⭐️"} + rating.times {|x| printed_stars << "★"} + (5-rating).times {|x| printed_stars << "☆"} printed_stars.html_safe end - + def greeting if current_merchant.nil? "Welcome Guest" @@ -15,22 +16,3 @@ def greeting end end end - -# -# def readable_date(date) -# ("" + date.strftime("%A, %b %d") + "").html_safe -# end -# -# def random_image(width, height) -# number = rand(3) -# url = "" -# case number -# when 0 -# url = "http://www.fillmurray.com/" -# when 1 -# url = "http://www.placecage.com/" -# when 2 -# url = "http://placekitten.com/" -# end -# ["random image"].join.html_safe -# end diff --git a/app/models/product.rb b/app/models/product.rb index 01bff2c413..b4fbe6d0ec 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -22,9 +22,4 @@ def rating end end - # def star_string - # printed_stars = "" - # rating.times {|x| printed_stars << "⭐️"} - # return printed_stars - # end end From afc3223b7898658e0e8b92d9079bbf24daf19781 Mon Sep 17 00:00:00 2001 From: Nina Mutty Date: Wed, 19 Oct 2016 15:34:42 -0700 Subject: [PATCH 032/191] validations added for products and reviews --- app/assets/stylesheets/application.css | 1 + app/controllers/products_controller.rb | 8 ++++---- app/controllers/reviews_controller.rb | 2 +- app/models/category.rb | 2 +- app/models/product.rb | 22 ++++++++++++++++++++++ app/models/review.rb | 22 +++++++++++++++++----- app/views/products/index.html.erb | 2 +- app/views/products/show.html.erb | 6 +++--- app/views/reviews/index.html.erb | 2 +- 9 files changed, 51 insertions(+), 16 deletions(-) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index f9cd5b3483..cbb429c993 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -1,3 +1,4 @@ +@import url('foundation.css') /* * This is a manifest file that'll be compiled into application.css, which will include all the files * listed below. diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 63fb1088c7..5efb0b0f7e 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -19,10 +19,10 @@ def new def create @product = Product.new(product_params) # @product.merchant_id = @merchant.id - @product.rating = 0 + @product.rating = nil if @product.save - redirect_to product_path + redirect_to product_path(@product.id) else @error = "Did not save successfully. Please try again." @post_path = products_path @@ -38,10 +38,10 @@ def edit def update if @product.update(product_params) - redirect_to product_path + redirect_to product_path(@product.id) else @error = "Did not save successfully. Please try again." - @post_path = product_path + @post_path = product_path(@product.id) @post_method = :put render :edit end diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index aaa4483868..202bb3958c 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -26,7 +26,7 @@ def create @error = "Did not save successfully. Please try again." @post_path = product_reviews_path @post_method = :post - render :new_review + render :new_product_review end end diff --git a/app/models/category.rb b/app/models/category.rb index 54a4332ef5..125b4c386c 100644 --- a/app/models/category.rb +++ b/app/models/category.rb @@ -1,4 +1,4 @@ class Category < ActiveRecord::Base has_many :product_categories - has_many :categories, :through => :product_categories + has_many :products, :through => :product_categories end diff --git a/app/models/product.rb b/app/models/product.rb index b4fbe6d0ec..957c33088d 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -8,6 +8,9 @@ class Product < ActiveRecord::Base belongs_to :merchant has_many :reviews + ############### + ### Methods ### + ############### def rating total_rating = 0 @@ -22,4 +25,23 @@ def rating end end + + ################### + ### Validations ### + ################### + + validates :name, presence: true + validates :description, presence: true + validates :price, presence: true + validates :inventory, presence: true + validates :image, presence: true + + validate :limits_on_stars + + # A rating must be between 0 and 5 + def limits_on_stars + if rating <= 5 && rating >= 0 + errors.add(:rating, "A rating must be between 0 and 5") + end + end end diff --git a/app/models/review.rb b/app/models/review.rb index c3e009ca49..8fe7518454 100644 --- a/app/models/review.rb +++ b/app/models/review.rb @@ -2,9 +2,21 @@ class Review < ActiveRecord::Base belongs_to :product - # def star_string - # printed_stars = "" - # stars.times {|x| printed_stars << "⭐️"} - # return printed_stars - # end + + + ################### + ### Validations ### + ################### + + validates :stars, presence: true + validates :description, presence: true + + validate :limits_on_stars + + # A rating must be between 0 and 5 + def limits_on_stars + unless stars <= 5 && stars >= 0 + errors.add(:stars, "A rating must be between 0 and 5 stars") + end + end end diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index 3fe217a2f4..4b616da3c5 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -3,7 +3,7 @@ <% @products.each do |product| %>

<%= link_to product.name, product_path(product.id) %>

-

<%= image_tag(product.image, size: "200x275", alt: "Photo of #{product.name}.") %>

+

<%= image_tag(product.image, size: "200x300", alt: "Photo of #{product.name}.") %>

<% end %> diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index cd7c9674a7..6761e7c93e 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -3,10 +3,10 @@

Description: <%= @product.description %>

Price: $<%= '%.2f' % (@product.price/100) %>

Inventory: <%= @product.inventory %>

-

Rating: <%= @product.rating == 0 ? "Not Yet Rated!" : star_string(@product.rating) %>

+

Rating: <%= @product.rating == nil ? "Not Yet Rated!" : star_string(@product.rating) %>

<%# IF it's a merchant ONLY %> -

<%= button_to "Edit Product", edit_product_path(@product.id) %>

+

<%= button_to "Edit Product", {controller: 'products', action: 'edit'}, path: 'edit_product', method: :get%>

<%= button_to "Delete Product", {controller: 'products', action: 'destroy'}, path: 'product', method: :delete, data: {confirm: "Are you sure?"}%>

@@ -15,7 +15,7 @@

<%= star_string(review.stars) %>

<%= review.description %>

-

By: <%= review.author %>

+

<%= "By: #{review.author}" if review.author != '' %>

<% end %> <% end %> diff --git a/app/views/reviews/index.html.erb b/app/views/reviews/index.html.erb index a1ea35a372..aeb0eb692d 100644 --- a/app/views/reviews/index.html.erb +++ b/app/views/reviews/index.html.erb @@ -5,6 +5,6 @@

<%= star_string(review.stars) %>

<%= review.description %>

-

By: <%= review.author %>

+

<%= "By: #{review.author}" if review.author != '' %>

<% end %> From ab0780a7fe190f8af63dbe12b6691c36f01d52c5 Mon Sep 17 00:00:00 2001 From: Sabrina Wilbert Date: Wed, 19 Oct 2016 15:56:58 -0700 Subject: [PATCH 033/191] Added line_item table and added order_status to orders table. --- app/models/line_item.rb | 2 ++ app/models/order.rb | 1 + app/views/layouts/application.html.erb | 2 +- db/migrate/20161019224122_create_line_items.rb | 13 +++++++++++++ .../20161019225037_add_order_status_to_order.rb | 5 +++++ db/schema.rb | 13 ++++++++++++- test/fixtures/line_items.yml | 15 +++++++++++++++ test/models/line_item_test.rb | 7 +++++++ 8 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 app/models/line_item.rb create mode 100644 db/migrate/20161019224122_create_line_items.rb create mode 100644 db/migrate/20161019225037_add_order_status_to_order.rb create mode 100644 test/fixtures/line_items.yml create mode 100644 test/models/line_item_test.rb diff --git a/app/models/line_item.rb b/app/models/line_item.rb new file mode 100644 index 0000000000..988324ce31 --- /dev/null +++ b/app/models/line_item.rb @@ -0,0 +1,2 @@ +class LineItem < ActiveRecord::Base +end diff --git a/app/models/order.rb b/app/models/order.rb index ce83301aa9..1e2de9f96f 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -1,6 +1,7 @@ class Order < ActiveRecord::Base has_many :product_orders has_many :products, :through => :product_orders + has_many :line_items belongs_to :merchant belongs_to :guest end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 983ad65f37..eef84819b2 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -8,7 +8,7 @@

<%= greeting %>

- +<%= session.inspect %> <%= yield %> diff --git a/db/migrate/20161019224122_create_line_items.rb b/db/migrate/20161019224122_create_line_items.rb new file mode 100644 index 0000000000..1119414b66 --- /dev/null +++ b/db/migrate/20161019224122_create_line_items.rb @@ -0,0 +1,13 @@ +class CreateLineItems < ActiveRecord::Migration + def change + create_table :line_items do |t| + t.integer :qty + t.integer :price + t.references :order + t.references :product + t.references :merchant + + t.timestamps null: false + end + end +end diff --git a/db/migrate/20161019225037_add_order_status_to_order.rb b/db/migrate/20161019225037_add_order_status_to_order.rb new file mode 100644 index 0000000000..ee918c795f --- /dev/null +++ b/db/migrate/20161019225037_add_order_status_to_order.rb @@ -0,0 +1,5 @@ +class AddOrderStatusToOrder < ActiveRecord::Migration + def change + add_column(:orders, :order_status, :string) + end +end diff --git a/db/schema.rb b/db/schema.rb index e435b8575c..b7a309dd22 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20161019000145) do +ActiveRecord::Schema.define(version: 20161019225037) do create_table "categories", force: :cascade do |t| t.string "name" @@ -26,6 +26,16 @@ t.datetime "updated_at", null: false end + create_table "line_items", force: :cascade do |t| + t.integer "qty" + t.integer "price" + t.integer "order_id" + t.integer "product_id" + t.integer "merchant_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + create_table "merchants", force: :cascade do |t| t.string "name" t.string "email" @@ -49,6 +59,7 @@ t.string "shipping_zip" t.integer "guest_id" t.integer "merchant_id" + t.string "order_status" end add_index "orders", ["guest_id"], name: "index_orders_on_guest_id" diff --git a/test/fixtures/line_items.yml b/test/fixtures/line_items.yml new file mode 100644 index 0000000000..f32a57177a --- /dev/null +++ b/test/fixtures/line_items.yml @@ -0,0 +1,15 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + qty: 1 + price: 1 + order: + product: + merchant: + +two: + qty: 1 + price: 1 + order: + product: + merchant: diff --git a/test/models/line_item_test.rb b/test/models/line_item_test.rb new file mode 100644 index 0000000000..9371a40355 --- /dev/null +++ b/test/models/line_item_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class LineItemTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end From 46b1d796620c08e7f80234d8674421409d1dcf47 Mon Sep 17 00:00:00 2001 From: Olivia Date: Wed, 19 Oct 2016 16:06:11 -0700 Subject: [PATCH 034/191] categories show and index --- app/controllers/categories_controller.rb | 4 ++++ app/controllers/merchants_controller.rb | 2 +- app/models/category.rb | 2 +- app/views/categories/index.html.erb | 16 +++++++++++++-- app/views/categories/show.html.erb | 10 ++++++++-- .../merchants/_merchant_partial.html.erb | 18 +++++++++-------- app/views/merchants/new.html.erb | 20 +++++++++++-------- db/seeds.rb | 2 +- 8 files changed, 51 insertions(+), 23 deletions(-) diff --git a/app/controllers/categories_controller.rb b/app/controllers/categories_controller.rb index 5b402f2721..8b0d5b6d60 100644 --- a/app/controllers/categories_controller.rb +++ b/app/controllers/categories_controller.rb @@ -1,11 +1,15 @@ class CategoriesController < ApplicationController def index + @category = Category.all end def show + @category = Category.find(params[:id].to_i) + @products_in_category = @category.products #Product_categories.find_by category_id: (params[:id].to_i) end def new + Category.new end def create diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index 19904a4f79..3d608f29b3 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -11,7 +11,7 @@ def show def new @merchant = Merchant.new - @path = merchants_create_path + @path = merchants_path end def create diff --git a/app/models/category.rb b/app/models/category.rb index 54a4332ef5..125b4c386c 100644 --- a/app/models/category.rb +++ b/app/models/category.rb @@ -1,4 +1,4 @@ class Category < ActiveRecord::Base has_many :product_categories - has_many :categories, :through => :product_categories + has_many :products, :through => :product_categories end diff --git a/app/views/categories/index.html.erb b/app/views/categories/index.html.erb index a5d0d54736..e1318fa4b9 100644 --- a/app/views/categories/index.html.erb +++ b/app/views/categories/index.html.erb @@ -1,2 +1,14 @@ -

Categories#index

-

Find me in app/views/categories/index.html.erb

+

Procrastination Product Categories

+ +<% @category.each do |category| %> +

<%= link_to(category.name, category_path(category.id)) %>


+<% end %> + +<% form_for @category, url: categories_path do |f| %> + + <%= f.label :name %> + <%= f.text_field :name %> + +<%= f.submit %> + +<% end %> diff --git a/app/views/categories/show.html.erb b/app/views/categories/show.html.erb index 60e06c3d7b..62f1b9aeb3 100644 --- a/app/views/categories/show.html.erb +++ b/app/views/categories/show.html.erb @@ -1,2 +1,8 @@ -

Categories#show

-

Find me in app/views/categories/show.html.erb

+

<%= @category.name %>

+ +

<% @products_in_category.each do |p| %>

+
+ <%= p.name %>
+ <%= link_to image_tag(p.image), product_path(p.id) %> +
+<% end %> diff --git a/app/views/merchants/_merchant_partial.html.erb b/app/views/merchants/_merchant_partial.html.erb index 394959c4fa..dcbbbffac5 100644 --- a/app/views/merchants/_merchant_partial.html.erb +++ b/app/views/merchants/_merchant_partial.html.erb @@ -1,12 +1,14 @@ <%= form_for @merchant, url: @path do |f| %> -
    -
  • <%= f.label :name %>
  • -
  • <%= f.text_field :name %>
  • -
  • <%= f.label :email %>
  • -
  • <%= f.text_field :email %>
  • + <%= f.label :name %> + <%= f.text_field :name %> -
  • <%= f.label :password %>
  • -
  • <%= f.text_field :password %>
  • + <%= f.label :email %> + <%= f.text_field :email %> + + <%= f.label :password %> + <%= f.text_field :password %> -
+ <%= f.submit %> + +<% end %> diff --git a/app/views/merchants/new.html.erb b/app/views/merchants/new.html.erb index e85a4b17c4..cc25e0a831 100644 --- a/app/views/merchants/new.html.erb +++ b/app/views/merchants/new.html.erb @@ -1,14 +1,18 @@

Become a merchant.

-<%= form_for @merchant, url: @path do |f| %> +<%#= form_for @merchant, url: @path do |f| %> - <%= f.label :name %> - <%= f.text_field :name %> + <%#= f.label :name %> + <%#= f.text_field :name %> - <%= f.label :email %> - <%= f.text_field :email %> + <%#= f.label :email %> + <%#= f.text_field :email %> - <%= f.label :password %> - <%= f.text_field :password %> + <%#= f.label :password %> + <%#= f.text_field :password %> -<% end %> + <%#= f.submit %> + +<%# end %> + +<%= render partial: "merchant_partial", locals: {action_name: "create"} %> diff --git a/db/seeds.rb b/db/seeds.rb index e9066d2d4c..f63e7410d0 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -33,7 +33,7 @@ end CSV.foreach('seeds_csvs/products.csv') do |csv_obj| - Product.create(id: csv_obj[0].to_i, name: csv_obj[1], description: csv_obj[2], price: csv_obj[3].to_i, image: csv_obj[4], merchant_id: csv_obj[2].to_i ) + Product.create(id: csv_obj[0].to_i, name: csv_obj[1], description: csv_obj[2], price: csv_obj[3].to_i, image: csv_obj[4], merchant_id: csv_obj[5].to_i ) end CSV.foreach('seeds_csvs/reviews.csv') do |csv_obj| From 03c2a61cff3370ed9cf402965b17439bc7e073e0 Mon Sep 17 00:00:00 2001 From: Olivia Date: Wed, 19 Oct 2016 16:19:40 -0700 Subject: [PATCH 035/191] categories new and create methods --- app/controllers/categories_controller.rb | 14 +++++++++++++- app/views/categories/index.html.erb | 5 +++-- app/views/categories/new.html.erb | 10 ++++++++++ 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/app/controllers/categories_controller.rb b/app/controllers/categories_controller.rb index 8b0d5b6d60..2bcedbab96 100644 --- a/app/controllers/categories_controller.rb +++ b/app/controllers/categories_controller.rb @@ -1,6 +1,7 @@ class CategoriesController < ApplicationController def index @category = Category.all + @new_category = Category.new end def show @@ -9,10 +10,16 @@ def show end def new - Category.new + @category = Category.new end def create + @category = Category.new(category_params) + if @category.save + redirect_to categories_path + else + render :new + end end def edit @@ -23,4 +30,9 @@ def update def destroy end + + private + def category_params + params.require(:category).permit(:name) + end end diff --git a/app/views/categories/index.html.erb b/app/views/categories/index.html.erb index e1318fa4b9..e88fb59873 100644 --- a/app/views/categories/index.html.erb +++ b/app/views/categories/index.html.erb @@ -1,10 +1,11 @@

Procrastination Product Categories

<% @category.each do |category| %> -

<%= link_to(category.name, category_path(category.id)) %>


+
<%= link_to(category.name, category_path(category.id)) %>

<% end %> -<% form_for @category, url: categories_path do |f| %> +

Add a New Category

+<%= form_for @new_category, url: categories_path do |f| %> <%= f.label :name %> <%= f.text_field :name %> diff --git a/app/views/categories/new.html.erb b/app/views/categories/new.html.erb index 7e5c27307e..aed947e7c7 100644 --- a/app/views/categories/new.html.erb +++ b/app/views/categories/new.html.erb @@ -1,2 +1,12 @@

Categories#new

Find me in app/views/categories/new.html.erb

+ + +<%= form_for @category, url: categories_path do |f| %> + + <%= f.label :name %> + <%= f.text_field :name %> + +<%= f.submit %> + +<% end %> From 551eae9ff7b6ac16a41a02d71ecf18db9e16dff6 Mon Sep 17 00:00:00 2001 From: Nina Mutty Date: Wed, 19 Oct 2016 16:36:16 -0700 Subject: [PATCH 036/191] added minitest reporters --- Gemfile | 3 +++ Gemfile.lock | 8 ++++++++ test/test_helper.rb | 2 ++ 3 files changed, 13 insertions(+) diff --git a/Gemfile b/Gemfile index 48ebc290d8..7f44f924ef 100644 --- a/Gemfile +++ b/Gemfile @@ -51,3 +51,6 @@ group :development do gem 'spring' end +group :test do + gem 'minitest-reporters' +end diff --git a/Gemfile.lock b/Gemfile.lock index d2af84ba62..7354dda677 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -36,6 +36,7 @@ GEM minitest (~> 5.1) thread_safe (~> 0.3, >= 0.3.4) tzinfo (~> 1.1) + ansi (1.5.0) arel (6.0.3) awesome_print (1.7.0) better_errors (2.1.1) @@ -86,6 +87,11 @@ GEM mime-types-data (3.2016.0521) mini_portile2 (2.1.0) minitest (5.9.1) + minitest-reporters (1.1.11) + ansi + builder + minitest (>= 5.0) + ruby-progressbar multi_json (1.12.1) multi_xml (0.5.5) multipart-post (2.0.0) @@ -136,6 +142,7 @@ GEM rake (11.3.0) rdoc (4.2.2) json (~> 1.4) + ruby-progressbar (1.8.1) sass (3.4.22) sass-rails (5.0.6) railties (>= 4.0.0, < 6) @@ -183,6 +190,7 @@ DEPENDENCIES dotenv-rails jbuilder (~> 2.0) jquery-rails + minitest-reporters omniauth omniauth-github rails (= 4.2.7) diff --git a/test/test_helper.rb b/test/test_helper.rb index 92e39b2d78..16b8203ad3 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,10 +1,12 @@ ENV['RAILS_ENV'] ||= 'test' require File.expand_path('../../config/environment', __FILE__) require 'rails/test_help' +require "minitest/reporters" class ActiveSupport::TestCase # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order. fixtures :all + Minitest::Reporters.use! # Add more helper methods to be used by all tests here... end From d6fb683035ba8080c7fc1def1c8b781fe7112481 Mon Sep 17 00:00:00 2001 From: Sabrina Wilbert Date: Thu, 20 Oct 2016 08:23:34 -0700 Subject: [PATCH 037/191] Added order controller methods --- app/controllers/application_controller.rb | 5 ++- app/controllers/orders_controller.rb | 54 +++++++++++++++++++++-- app/models/guest.rb | 1 + app/views/layouts/application.html.erb | 1 - app/views/orders/cart.html.erb | 25 +++++++++++ 5 files changed, 81 insertions(+), 5 deletions(-) create mode 100644 app/views/orders/cart.html.erb diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 9a0b42a230..946b7d4904 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -3,12 +3,15 @@ class ApplicationController < ActionController::Base # For APIs, you may want to use :null_session instead. protect_from_forgery with: :exception - helper_method :current_merchant + helper_method :current_merchant, :current_guest def current_merchant @current_merchant ||= Merchant.find_by(id: session[:merchant_id]) end + def current_guest + @current_guest ||= Guest.find_by(id: session[:user_id]) + end end diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 43068dc2d9..6532780ffc 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -3,17 +3,32 @@ def index @orders = Order.all end - def show + def view_cart + + end def new end def create - if current_merchant.nil? - end +def subtotal + @order.line_items do |line| + line_cost = @line.price * @line.qty + total_amount << line_cost + return total_amount +end + def total_amount + subtotal + total_amount.inject { |result, element| result + element } + return result + end + + + + def edit end @@ -22,4 +37,37 @@ def update def destroy end + + def guest_create_cart + if current_merchant.nil? && if @order.guest_id.nil? + @guest = Guest.new + @guest.save + @order = Order.new + @order.guest_id = @guest.id + @order.order_status = "pending" + @order.save + @line = LineItem.new + @line.order_id = @order.id + @line.product_id = params[:products][:product_id] + @line.merchant_id = params[:products][:merchant_id] + @line.qty = params[:qty] + @line.price = params[:products][:price] + @line.save + else + add_to_cart + end + def add_to_cart + @line = LineItem.new + @line.order_id = @order.id + @line.product_id = params[:products][:product_id] + @line.merchant_id = params[:products][:merchant_id] + @line.qty = params[:qty] + @line.price = params[:products][:price] + @line.save + end + + def remove_from_cart + @line = @order.line_items.find(params[:id]) + @line.id.destroy(params[:id].to_i) + end end diff --git a/app/models/guest.rb b/app/models/guest.rb index ff3fd966f6..789847926e 100644 --- a/app/models/guest.rb +++ b/app/models/guest.rb @@ -1,3 +1,4 @@ class Guest < ActiveRecord::Base has_many :orders + has_many :line_items end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index eef84819b2..1c32a57377 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -8,7 +8,6 @@

<%= greeting %>

-<%= session.inspect %> <%= yield %> diff --git a/app/views/orders/cart.html.erb b/app/views/orders/cart.html.erb new file mode 100644 index 0000000000..4703ec3403 --- /dev/null +++ b/app/views/orders/cart.html.erb @@ -0,0 +1,25 @@ + +
+
+
+<%= form_for @order.line_items do |f| %> +

<%= f.label :product.name %>

+ <%= f.text_field :product_id %> +
+ <%= f.number_field :quantity, value: order_item.quantity.to_i, class: "form-control", min: 1 %> + <%= f.hidden_field :product_id, value: product.id %> +
+ <%= f.label :author %> + <%= f.text_field :creator%> + + <%= f.label :description %> + <%= f.text_field :description %> + + <%# <%= f.label :rank %> + <%#<%= f.text_field :rank %> + + <%= f.submit %> + <% end %> +
+
+
From 0db8ec4e6aa9cd1ee839620a2aa268cfd1967596 Mon Sep 17 00:00:00 2001 From: Nina Mutty Date: Thu, 20 Oct 2016 09:05:06 -0700 Subject: [PATCH 038/191] working on testing product model --- app/controllers/products_controller.rb | 2 + app/controllers/reviews_controller.rb | 2 +- app/models/product.rb | 19 ++++----- app/views/products/show.html.erb | 12 ++++++ test/fixtures/products.yml | 41 ++++++++++++-------- test/fixtures/reviews.yml | 34 ++++++++++++----- test/models/product_test.rb | 53 +++++++++++++++++++++++++- 7 files changed, 127 insertions(+), 36 deletions(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 5efb0b0f7e..09bed51a53 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -8,6 +8,7 @@ def index def show @reviews = @product.reviews.order('stars desc, id').limit(3) + #@order = Order.new ### OR Line.new end def new @@ -38,6 +39,7 @@ def edit def update if @product.update(product_params) + @product.rating redirect_to product_path(@product.id) else @error = "Did not save successfully. Please try again." diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index 202bb3958c..4831aa2101 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -26,7 +26,7 @@ def create @error = "Did not save successfully. Please try again." @post_path = product_reviews_path @post_method = :post - render :new_product_review + render :new end end diff --git a/app/models/product.rb b/app/models/product.rb index 957c33088d..929e192ce5 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -35,13 +35,14 @@ def rating validates :price, presence: true validates :inventory, presence: true validates :image, presence: true - - validate :limits_on_stars - - # A rating must be between 0 and 5 - def limits_on_stars - if rating <= 5 && rating >= 0 - errors.add(:rating, "A rating must be between 0 and 5") - end - end + validates :rating, numericality: { only_integer: true, greater_than_or_equal_to: 0, less_than_or_equal_to: 5, allow_nil: true } + + # validate :limits_on_stars + # + # # A rating must be between 0 and 5 + # def limits_on_stars + # unless (rating <= 5) && (rating >= 0) + # errors.add(:rating, "A rating must be between 0 and 5") + # end + # end end diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 6761e7c93e..abaa99cfda 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -9,6 +9,18 @@

<%= button_to "Edit Product", {controller: 'products', action: 'edit'}, path: 'edit_product', method: :get%>

<%= button_to "Delete Product", {controller: 'products', action: 'destroy'}, path: 'product', method: :delete, data: {confirm: "Are you sure?"}%>

+ <% if @reviews != nil %> <% @reviews.each do |review| %> diff --git a/test/fixtures/products.yml b/test/fixtures/products.yml index 6352985f06..f3f5728677 100644 --- a/test/fixtures/products.yml +++ b/test/fixtures/products.yml @@ -1,19 +1,30 @@ # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html -one: - name: MyString - description: MyText - price: 1.5 - image: MyString +new_shoe: + id: 1 + name: "A Shoe!" + description: "A beautiful shoe!" + price: 300 + image: 'http://placekitten.com/200/300' merchant_id: 1 - inventory: 1 - rating: 1 + inventory: 4 + rating: 3 -two: - name: MyString - description: MyText - price: 1.5 - image: MyString - merchant_id: 1 - inventory: 1 - rating: 1 +glitter: + id: 2 + name: "Glitter Wand" + description: "a glittery wand" + price: 1500 + image: 'http://placekitten.com/200/300' + merchant_id: 2 + inventory: 7 + rating: 5 + +no_rating: + id: 3 + name: "Glitter Wand" + description: "a glittery wand" + price: 1500 + image: 'http://placekitten.com/200/300' + merchant_id: 2 + inventory: 7 diff --git a/test/fixtures/reviews.yml b/test/fixtures/reviews.yml index aab3c75d95..cdc7a1ddb8 100644 --- a/test/fixtures/reviews.yml +++ b/test/fixtures/reviews.yml @@ -1,13 +1,29 @@ # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html -one: - description: MyText - stars: 1 - author: MyString - product_id: 1 +glitter_review: + id: 1 + description: "nfjd" + stars: 3 + author: "fndjk" + product: glitter -two: - description: MyText +shoe_review: + id: 2 + description: "mkd" stars: 1 - author: MyString - product_id: 1 + author: "f dk" + product: new_shoe + +rating_review_one: + id: 3 + description: "nfjds" + stars: 5 + author: "jf" + product: no_rating + +rating_review_two: + id: 4 + description: "mkvd" + stars: 3 + author: "fdjk" + product: no_rating diff --git a/test/models/product_test.rb b/test/models/product_test.rb index 211cdd0b4a..95960d0855 100644 --- a/test/models/product_test.rb +++ b/test/models/product_test.rb @@ -1,7 +1,56 @@ require 'test_helper' class ProductTest < ActiveSupport::TestCase - # test "the truth" do - # assert true + test "the truth" do + assert true + end + test "Product must have a name, description, price, inventory and image" do + assert products(:glitter).valid? "Glitter should be valid" ### WHY IS THIS FAILING??? + + products(:glitter).name = nil ## This name removal is local to the test data - it doesn't change the fixture + assert_not products(:glitter).valid? "Glitter should no longer be valid" + + products(:new_shoe).price = nil + assert_not products(:new_shoe).valid? "New Shoe should no longer be valid" + end + + test "Products cannot have a rating less than 0 or greater than 5" do + assert products(:glitter).rating = 6 + assert_not products(:glitter).valid? "Glitter should no longer be valid" + + assert products(:new_shoe).rating = -1 + assert_not products(:new_shoe).valid? "New Shoe should no longer be valid" + end + + + test "The amount of an product's reviews" do + assert_equal products(:glitter).reviews.length, 1 + assert_equal products(:new_shoe).reviews.length, 1 + assert_equal products(:no_rating).reviews.length, 2 + end + + test "No Rating has the correct reviews" do + assert_includes products(:no_rating).reviews, reviews(:rating_review_one) + assert_includes products(:no_rating).reviews, reviews(:rating_review_two) + end + + + + + + + # test "Products total rating must be the average of a products reviews" do + # assert_equal products(:no_rating).rating, 0 + # + # reviews(:rating_review_one).save + # reviews(:rating_review_two).save + # + # assert_equal products(:no_rating).rating, 4 + # + # reviews(:rating_review_two).stars = 0 + # reviews(:rating_review_two).save + # + # assert_equal products(:no_rating).rating, 2 # end + end From d3b988e0c0a4f9c2e2ec74f1bae45cede5478c05 Mon Sep 17 00:00:00 2001 From: Miriam Cortes Date: Thu, 20 Oct 2016 09:15:15 -0700 Subject: [PATCH 039/191] more show page methods for merchant --- app/controllers/merchants_controller.rb | 16 +++++-- app/models/merchant.rb | 16 +++++++ .../merchants/_merchant_partial.html.erb | 18 ++++---- app/views/merchants/edit.html.erb | 2 +- app/views/merchants/new.html.erb | 2 + app/views/merchants/show.html.erb | 20 +++++---- .../merchants/show_merchant_products.html.erb | 7 ++++ config/routes.rb | 2 + db/seeds.rb | 4 +- seeds_csvs/merchant.csv | 20 ++++----- seeds_csvs/orders.csv | 22 +++++----- seeds_csvs/products.csv | 20 ++++----- test/controllers/merchants_controller_test.rb | 42 ++++++++++--------- test/fixtures/merchants.yml | 12 +++--- test/fixtures/orders.yml | 21 +++++----- test/models/merchant_test.rb | 9 ++-- 16 files changed, 141 insertions(+), 92 deletions(-) create mode 100644 app/views/merchants/show_merchant_products.html.erb diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index 19904a4f79..d3e68db068 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -11,13 +11,17 @@ def show def new @merchant = Merchant.new - @path = merchants_create_path + @path = merchants_path end def create - @merchant = Merchant.new(merchant_params) + @params = params + @merchant = Merchant.new + @merchant.name = params[:merchant][:name] + @merchant.email = params[:merchant][:email] + @merchant.password = params[:merchant][:password] if @merchant.save - redirect_to merchants_path + redirect_to merchant_path(@merchant.id) else render :new end @@ -25,6 +29,7 @@ def create end def edit + find_merchant end def update @@ -33,6 +38,11 @@ def update def destroy end + def show_merchant_products + find_merchant + @products = Product.find_by(merchant_id: @merchant.id) + end + private def merchant_params diff --git a/app/models/merchant.rb b/app/models/merchant.rb index e6f54f0458..480d2a68c8 100644 --- a/app/models/merchant.rb +++ b/app/models/merchant.rb @@ -1,4 +1,20 @@ class Merchant < ActiveRecord::Base has_many :products has_many :orders + validates :name, presence: true, uniqueness: true + validates :email, presence: true, uniqueness: true + validates :password, presence: true + + def revenue_paid_orders + revenue_total = 0.0 + orders.each do |order| + revenue_total += order.total_amount + end + return revenue_total + end + + # def orders_count + # total_orders = 0 + # orders. + # end end diff --git a/app/views/merchants/_merchant_partial.html.erb b/app/views/merchants/_merchant_partial.html.erb index 394959c4fa..f197f74226 100644 --- a/app/views/merchants/_merchant_partial.html.erb +++ b/app/views/merchants/_merchant_partial.html.erb @@ -1,12 +1,14 @@ <%= form_for @merchant, url: @path do |f| %> -
    -
  • <%= f.label :name %>
  • -
  • <%= f.text_field :name %>
  • -
  • <%= f.label :email %>
  • -
  • <%= f.text_field :email %>
  • + <%= f.label :name %> + <%= f.text_field :name %> -
  • <%= f.label :password %>
  • -
  • <%= f.text_field :password %>
  • + <%= f.label :email %> + <%= f.text_field :email %> -
+ <%= f.label :password %> + <%= f.text_field :password %> + + <%= f.submit %> + +<% end %> diff --git a/app/views/merchants/edit.html.erb b/app/views/merchants/edit.html.erb index b50eb28664..48d1fbdd45 100644 --- a/app/views/merchants/edit.html.erb +++ b/app/views/merchants/edit.html.erb @@ -1,2 +1,2 @@

Edit your info

-<%= render partial: "_merchant_partial", locals: {action_name: "update", params: { id: @merchant.id }} %> +<%= render partial: "merchant_partial", locals: {action_name: "update", params: { id: @merchant.id }} %> diff --git a/app/views/merchants/new.html.erb b/app/views/merchants/new.html.erb index e85a4b17c4..ecf943e6bb 100644 --- a/app/views/merchants/new.html.erb +++ b/app/views/merchants/new.html.erb @@ -11,4 +11,6 @@ <%= f.label :password %> <%= f.text_field :password %> + <%= f.submit %> + <% end %> diff --git a/app/views/merchants/show.html.erb b/app/views/merchants/show.html.erb index 094bda7130..5dc41b3d25 100644 --- a/app/views/merchants/show.html.erb +++ b/app/views/merchants/show.html.erb @@ -2,9 +2,9 @@

    -
  • <%= button_to 'Add a Product', products_new_path(params[:id]), :class => "button", method: :get %>
  • -
  • <%= button_to 'View Products', products_show_path(params[:id]), :class => "button", method: :get %>
  • -
  • <%= button_to 'Add a Category', categories_new_path(params[:id]), :class => "button", method: :get %>
  • +
  • <%= button_to 'Add a Product', new_product_path(params[:id]), class: "button", method: :get %>
  • +
  • <%= button_to 'View Products', merchant_products_path(params[:id]), class: "button", method: :get %>
  • +
  • <%= button_to 'Add a Category', new_category_path(params[:id]), class: "button", method: :get %>
@@ -18,8 +18,10 @@ <% @merchant.orders.each do |order| %> - <%= link_to(order.id, orders_show_path(order.id)) %> - <%#= link_to(Product.find(order.product_ids).name, products_show_path(product.id)) %> + <%= link_to(order.id, orders_path(order.id)) %> + <% order.products.each do |product| %> + <%= link_to(product.name, product_path(product.id)) %> + <% end %> <%#= order.status %> <% end %> @@ -32,9 +34,11 @@

Revenue

Total Revenue for Pending Orders:

-

$

+

$ + <%# if %> + <%#= sprintf "%.2f", @merchant.revenue_paid_orders %>

Total Revenue for Paid Orders:

-

$

+

$ <%= sprintf "%.2f", @merchant.revenue_paid_orders %>

Total Revenue for Cancelled Orders:

$

Total Revenue for Completed Orders:

@@ -44,7 +48,7 @@

Orders

-

Total Pending Orders

+

Total Pending Orders:

Total Cancelled Orders:

diff --git a/app/views/merchants/show_merchant_products.html.erb b/app/views/merchants/show_merchant_products.html.erb new file mode 100644 index 0000000000..e679e4073c --- /dev/null +++ b/app/views/merchants/show_merchant_products.html.erb @@ -0,0 +1,7 @@ +

<%= @merchant[:name] %>

+

+ + +

+ products will go here! +

diff --git a/config/routes.rb b/config/routes.rb index fcc8670586..056bbe9c1f 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -16,6 +16,8 @@ get 'sessions/destroy' + get 'merchants/:id/products' => 'merchants#show_merchant_products', as: 'merchant_products' + get "/auth/:provider/callback" => "sessions#create" diff --git a/db/seeds.rb b/db/seeds.rb index e9066d2d4c..6028a1ec5d 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -21,7 +21,7 @@ end CSV.foreach('seeds_csvs/orders.csv') do |csv_obj| - Order.create(id: csv_obj[0].to_i, total_amount: csv_obj[1].to_i, guest_id: csv_obj[2].to_i, merchant_id: csv_obj[3].to_i, card_name: csv_obj[4], card_number: csv_obj[5], card_exp: csv_obj[6], card_cvv: csv_obj[7], billing_zip: csv_obj[8], shipping_street: csv_obj[8], shipping_city: csv_obj[9], shipping_state: csv_obj[10], shipping_zip: csv_obj[11]) + Order.create(id: csv_obj[0].to_i, guest_id: csv_obj[1].to_i, total_amount: csv_obj[2].to_f/100, merchant_id: csv_obj[3].to_i, card_name: csv_obj[4], card_number: csv_obj[5], card_exp: csv_obj[6], card_cvv: csv_obj[7], billing_zip: csv_obj[8], shipping_street: csv_obj[9], shipping_city: csv_obj[10], shipping_state: csv_obj[11], shipping_zip: csv_obj[12],order_status: csv_obj[13]) end CSV.foreach('seeds_csvs/product_categories.csv') do |csv_obj| @@ -33,7 +33,7 @@ end CSV.foreach('seeds_csvs/products.csv') do |csv_obj| - Product.create(id: csv_obj[0].to_i, name: csv_obj[1], description: csv_obj[2], price: csv_obj[3].to_i, image: csv_obj[4], merchant_id: csv_obj[2].to_i ) + Product.create(id: csv_obj[0].to_i, name: csv_obj[1], description: csv_obj[2], price: csv_obj[3].to_i, image: csv_obj[4], merchant_id: csv_obj[5].to_i ) end CSV.foreach('seeds_csvs/reviews.csv') do |csv_obj| diff --git a/seeds_csvs/merchant.csv b/seeds_csvs/merchant.csv index 783becdcc3..cb8ff0215d 100644 --- a/seeds_csvs/merchant.csv +++ b/seeds_csvs/merchant.csv @@ -1,11 +1,11 @@ id,name,email,password -1,ameyer0,rgeorge0@adobe.com,A1s5KLpTiyu -2,acole1,dwilson1@gizmodo.com,2kIBWgyznWY -3,kgonzalez2,dcastillo2@nsw.gov.au,RYshSYKG -4,bwalker3,jwatkins3@mediafire.com,f3cQChXEIi -5,bhernandez4,rlane4@examiner.com,gDGVvnjMkix -6,areed5,htorres5@admin.ch,0IMBHc -7,dfuller6,ascott6@rambler.ru,M1HJAWy -8,amartin7,krodriguez7@bluehost.com,HRPnISN -9,preed8,choward8@cpanel.net,gEvbQpHX -10,scarroll9,smorgan9@google.com.br,Wxbop5c1dNd +1,merchant 1,rgeorge0@adobe.com,A1s5KLpTiyu +2,merchant 2,dwilson1@gizmodo.com,2kIBWgyznWY +3,merchant 3,dcastillo2@nsw.gov.au,RYshSYKG +4,merchant 4,jwatkins3@mediafire.com,f3cQChXEIi +5,merchant 5,rlane4@examiner.com,gDGVvnjMkix +6,merchant 6,htorres5@admin.ch,0IMBHc +7,merchant 7,ascott6@rambler.ru,M1HJAWy +8,merchant 8,krodriguez7@bluehost.com,HRPnISN +9,merchant 9,choward8@cpanel.net,gEvbQpHX +10,merchant 10,smorgan9@google.com.br,Wxbop5c1dNd diff --git a/seeds_csvs/orders.csv b/seeds_csvs/orders.csv index efa00429da..15cec6befe 100644 --- a/seeds_csvs/orders.csv +++ b/seeds_csvs/orders.csv @@ -1,11 +1,11 @@ -id,total_amount,guest_id,merchant_id,card_name,card_number,card_exp,card_cvv,billing_zip,shipping_street,shipping_city,shipping_state,shipping_zip -1,Heather Martin,700,3,jcb,3544153313003422,6/5/2016,1,2,8 Blaine Trail,Milwaukee,Wisconsin,5 -2,Ryan King,600,10,jcb,3535790488366570,2/3/2016,2,5,3421 Atwood Street,Milwaukee,Wisconsin,4 -3,Scott Freeman,800,2,visa-electron,4844470197867465,3/22/2016,3,4,12980 Hudson Hill,Colorado Springs,Colorado,2 -4,Matthew Mason,400,8,visa-electron,4913634062130046,7/24/2016,2,1,24351 1st Point,Denver,Colorado,5 -5,Lisa Oliver,400,10,jcb,3561305235966635,8/9/2016,1,5,2063 Pine View Road,Salt Lake City,Utah,2 -6,Sarah Cox,500,6,jcb,3541499214835088,10/24/2015,3,4,56903 American Lane,Beaumont,Texas,1 -7,Nicole Adams,600,9,diners-club-enroute,201516174929028,6/29/2016,3,5,5 Dixon Parkway,Charleston,West Virginia,1 -8,Amanda West,500,4,visa,4041595386325825,11/3/2015,3,2,2 Menomonie Terrace,Dallas,Texas,5 -9,Douglas Sanchez,500,2,mastercard,5100176740926148,12/16/2015,2,1,96916 Loomis Crossing,Florence,South Carolina,3 -10,James Mendoza,100,7,jcb,3528298798434178,9/13/2016,1,1,0662 Duke Court,El Paso,Texas,2 +id,guest_name,total_amount,merchant_id,card_name,card_number,card_exp,card_cvv,billing_zip,shipping_street,shipping_city,shipping_state,shipping_zip,order_status +1,Heather Martin,700,3,jcb,3544153313003422,06/16,121,12345,8 Blaine Trail,Milwaukee,Wisconsin,12345,paid +2,Ryan King,600,10,jcb,3535790488366570,02/16,221,12345,3421 Atwood Street,Milwaukee,Wisconsin,12345,pending +3,Scott Freeman,800,2,visa-electron,4844470197867465,03/16,321,12345,12980 Hudson Hill,Colorado Springs,Colorado,12345,cancelled +4,Matthew Mason,400,8,visa-electron,4913634062130046,07/16,212,12345,24351 1st Point,Denver,Colorado,12345,completed +5,Lisa Oliver,400,10,jcb,3561305235966635,08/16,211,12345,2063 Pine View Road,Salt Lake City,Utah,12345,completed +6,Sarah Cox,500,6,jcb,3541499214835088,10/15,213,12345,56903 American Lane,Beaumont,Texas,12345,cancelled +7,Nicole Adams,600,9,diners-club-enroute,201516174929028,06/16,213,12345,5 Dixon Parkway,Charleston,West Virginia,12345,pending +8,Amanda West,500,4,visa,4041595386325825,11/15,213,12345,2 Menomonie Terrace,Dallas,Texas,12345,paid +9,Douglas Sanchez,500,2,mastercard,5100176740926148,12/15,212,12345,96916 Loomis Crossing,Florence,South Carolina,12345,pending +10,James Mendoza,100,7,jcb,3528298798434178,9/16,211,12345,0662 Duke Court,El Paso,Texas,12345.paid diff --git a/seeds_csvs/products.csv b/seeds_csvs/products.csv index fc810b22bd..f3bb50016f 100644 --- a/seeds_csvs/products.csv +++ b/seeds_csvs/products.csv @@ -1,11 +1,11 @@ id,name,description,price,image,merchant_id -1,ut,elit proin risus praesent lectus vestibulum quam sapien,37.04,http://dummyimage.com/172x213.jpg/5fa2dd/ffffff,9 -2,sollicitudin,ultrices posuere cubilia curae donec pharetra magna,88.38,http://dummyimage.com/145x190.bmp/ff4444/ffffff,3 -3,libero,in magna bibendum imperdiet nullam orci pede venenatis non sodales,11.71,http://dummyimage.com/205x159.bmp/dddddd/000000,10 -4,eget,vestibulum eget vulputate ut ultrices vel augue vestibulum ante ipsum,73.05,http://dummyimage.com/112x147.bmp/dddddd/000000,1 -5,mi nulla,mauris lacinia sapien quis libero,48.57,http://dummyimage.com/181x184.jpg/ff4444/ffffff,1 -6,mauris,ipsum primis in faucibus orci,7.39,http://dummyimage.com/109x202.bmp/ff4444/ffffff,9 -7,sed augue,sodales sed tincidunt eu felis fusce,1.9,http://dummyimage.com/232x126.png/5fa2dd/ffffff,8 -8,nonummy,sit amet eros suspendisse accumsan tortor quis turpis,16.89,http://dummyimage.com/216x113.jpg/dddddd/000000,4 -9,convallis,orci luctus et ultrices posuere cubilia,59.13,http://dummyimage.com/199x218.png/cc0000/ffffff,9 -10,amet erat,quam pede lobortis ligula sit amet eleifend pede libero quis,46.05,http://dummyimage.com/116x101.jpg/5fa2dd/ffffff,9 +1,product 1,description 1,37.04,http://placekitten.com/g/200/300,9 +2,product 2,description 2,88.38,http://placekitten.com/g/200/300,3 +3,product 3,description 3,11.71,http://placekitten.com/g/200/300,10 +4,product 4,description 4,73.05,http://placekitten.com/g/200/300,1 +5,product 5,description 5,48.57,http://placekitten.com/g/200/300,1 +6,product 6,description words,7.39,http://placekitten.com/g/200/300,9 +7,product 7,description words,1.9,http://placekitten.com/g/200/300,8 +8,product 8,description words,16.89,http://placekitten.com/g/200/300,4 +9,product 9,description words,59.13,http://placekitten.com/g/200/300,9 +10,product 10,description words,46.05,http://placekitten.com/g/200/300,9 diff --git a/test/controllers/merchants_controller_test.rb b/test/controllers/merchants_controller_test.rb index b5149c470d..f1625bb43e 100644 --- a/test/controllers/merchants_controller_test.rb +++ b/test/controllers/merchants_controller_test.rb @@ -4,10 +4,11 @@ class MerchantsControllerTest < ActionController::TestCase test "should get index" do get :index assert_response :success + assert_template :index end test "should get show" do - get :show + get :show, {id: merchants(:one).id} assert_response :success end @@ -16,34 +17,35 @@ class MerchantsControllerTest < ActionController::TestCase assert_response :success assert_template :new end - end - test "Creating a Merchant changes number of Merchants" do + test "Creating a new Merchant changes number of Merchants" do assert_difference('Merchant.count', 1) do - post_params = {merchant: {name: "Lola CherryCola"}} + post_params = { merchant: {name: "Lola CherryCola", email: "lola@email.com", password: "lolarocks"} } post :create, post_params end assert_response :redirect end test "should get create" do - get :create - assert_response :success - end - - test "should get edit" do - get :edit - assert_response :success - end - - test "should get update" do - get :update - assert_response :success + post_params = { merchant: {name: "merchant3", email: "email_merchant3@email.com", password: "password1111"} } + post :create, post_params + assert_response :redirect end - test "should get destroy" do - get :destroy - assert_response :success - end + # test "should get edit" do + # get :edit, {id: merchants(:one).id} + # assert_response :success + # end + + # test "should be able to update a merchant" do + # patch :update, :id => merchants(:one), :merchants => {email: "new_email@email.com"} + # assert_equal "new_email@email.com", assigns(:merchant).email + # assert_response :success + # end + # + # test "should get destroy" do + # get :destroy + # assert_response :success + # end end diff --git a/test/fixtures/merchants.yml b/test/fixtures/merchants.yml index 7384b0e7c9..8563391088 100644 --- a/test/fixtures/merchants.yml +++ b/test/fixtures/merchants.yml @@ -1,11 +1,11 @@ # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html one: - name: MyString - email: MyString - password: MyString + name: merchant1 + email: email_merchant1@email.com + password: password1234 two: - name: MyString - email: MyString - password: MyString + name: merchant2 + email: email_merchant2@email.com + password: password4321 diff --git a/test/fixtures/orders.yml b/test/fixtures/orders.yml index 1766a0a6b1..db00362993 100644 --- a/test/fixtures/orders.yml +++ b/test/fixtures/orders.yml @@ -1,18 +1,19 @@ # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html -one: +orderone: total_amount: 1 guest_id: 1 merchant_id: 1 - card_name: MyString - card_number: 1 - card_exp: MyString - card_cvv: 1 - billing_zip: 1 - shipping_street: MyString - shipping_city: MyString - shipping_state: MyString - shipping_zip: 1 + card_name: visa + card_number: 123456789012 + card_exp: 02/16 + card_cvv: 123 + billing_zip: 12345 + shipping_street: "1234 street" + shipping_city: City + shipping_state: State + shipping_zip: 12345 + order_status: pending two: total_amount: 1 diff --git a/test/models/merchant_test.rb b/test/models/merchant_test.rb index d98d746a67..d985daf455 100644 --- a/test/models/merchant_test.rb +++ b/test/models/merchant_test.rb @@ -1,7 +1,10 @@ require 'test_helper' class MerchantTest < ActiveSupport::TestCase - # test "the truth" do - # assert true - # end + test "the truth" do + assert true + end + + + end From 1abc093badd032adad521208605986561f46cfb6 Mon Sep 17 00:00:00 2001 From: Olivia Date: Thu, 20 Oct 2016 09:15:18 -0700 Subject: [PATCH 040/191] Alphabetize categories, some controller tests --- app/controllers/categories_controller.rb | 11 ++++++++-- app/models/category.rb | 6 +++++ .../controllers/categories_controller_test.rb | 22 ++++++++++--------- 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/app/controllers/categories_controller.rb b/app/controllers/categories_controller.rb index 2bcedbab96..b5e2850102 100644 --- a/app/controllers/categories_controller.rb +++ b/app/controllers/categories_controller.rb @@ -1,12 +1,15 @@ class CategoriesController < ApplicationController def index - @category = Category.all + # @category = Category.all + @category = Category.order("lower(name) ASC").all @new_category = Category.new + + end def show @category = Category.find(params[:id].to_i) - @products_in_category = @category.products #Product_categories.find_by category_id: (params[:id].to_i) + @products_in_category = @category.products end def new @@ -29,6 +32,10 @@ def update end def destroy + @category = Category.find(params[:id].to_i) + @category.destroy + + redirect_to categories_path end private diff --git a/app/models/category.rb b/app/models/category.rb index 125b4c386c..b56fb71b11 100644 --- a/app/models/category.rb +++ b/app/models/category.rb @@ -1,4 +1,10 @@ class Category < ActiveRecord::Base has_many :product_categories has_many :products, :through => :product_categories + +# def Self.capitalize_category +# categories = self.all.each do |c| +# c.name.capitalize! +# end +# end end diff --git a/test/controllers/categories_controller_test.rb b/test/controllers/categories_controller_test.rb index 85778c4b52..9abe15985f 100644 --- a/test/controllers/categories_controller_test.rb +++ b/test/controllers/categories_controller_test.rb @@ -4,34 +4,36 @@ class CategoriesControllerTest < ActionController::TestCase test "should get index" do get :index assert_response :success + assert_template :index end test "should get show" do - get :show + get :show, {id: categories(:two).id} assert_response :success + assert_template :show end test "should get new" do + skip get :new assert_response :success end test "should get create" do - get :create + skip + post :create assert_response :success - end - test "should get edit" do - get :edit - assert_response :success + assert_difference('Category.count', 1) do + post_params = {category: {name: "A Category"}} + post :create, post_params + end + assert_response :redirect end - test "should get update" do - get :update - assert_response :success - end test "should get destroy" do + skip get :destroy assert_response :success end From ae185e2c0c8cb214a9817921fcb8739c42ed09fe Mon Sep 17 00:00:00 2001 From: Nina Mutty Date: Thu, 20 Oct 2016 09:17:30 -0700 Subject: [PATCH 041/191] added add to cart button --- app/controllers/products_controller.rb | 2 +- app/views/products/show.html.erb | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 09bed51a53..52e7341bb9 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -8,7 +8,7 @@ def index def show @reviews = @product.reviews.order('stars desc, id').limit(3) - #@order = Order.new ### OR Line.new + @order = Order.new ### OR Line.new end def new diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index abaa99cfda..aa4cdd8a27 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -9,7 +9,7 @@

<%= button_to "Edit Product", {controller: 'products', action: 'edit'}, path: 'edit_product', method: :get%>

<%= button_to "Delete Product", {controller: 'products', action: 'destroy'}, path: 'product', method: :delete, data: {confirm: "Are you sure?"}%>

- +<% end %> <% if @reviews != nil %> <% @reviews.each do |review| %> From 9d25f60fadb8fe0bf5ef62934b24c57aae668c0b Mon Sep 17 00:00:00 2001 From: Nina Mutty Date: Thu, 20 Oct 2016 09:27:31 -0700 Subject: [PATCH 042/191] editing cart button --- app/controllers/products_controller.rb | 2 +- app/views/products/show.html.erb | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 52e7341bb9..fd9720d5f8 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -8,7 +8,7 @@ def index def show @reviews = @product.reviews.order('stars desc, id').limit(3) - @order = Order.new ### OR Line.new + @line_item = LineItem.new ### OR Line.new end def new diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index aa4cdd8a27..4660eef840 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -9,13 +9,12 @@

<%= button_to "Edit Product", {controller: 'products', action: 'edit'}, path: 'edit_product', method: :get%>

<%= button_to "Delete Product", {controller: 'products', action: 'destroy'}, path: 'product', method: :delete, data: {confirm: "Are you sure?"}%>

-Need to choose the corect path to use...maybe use the line item instead of order -<%= form_for @order, +<%= form_for @line_item, method: :post, url: new_order_path do |f| %>
- <%= f.label :quantity %> - <%= f.text_area :quantity %> + <%= f.label :qty %> + <%= f.text_area :qty %>
<%= f.submit "Add to Cart "%> From 54dfa56e8d63de122100504d8b860043decda491 Mon Sep 17 00:00:00 2001 From: Nina Mutty Date: Thu, 20 Oct 2016 14:55:34 -0700 Subject: [PATCH 043/191] added pry gem --- Gemfile | 1 + Gemfile.lock | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/Gemfile b/Gemfile index 7f44f924ef..a6bd668648 100644 --- a/Gemfile +++ b/Gemfile @@ -41,6 +41,7 @@ group :development, :test do gem 'byebug' gem 'dotenv-rails' gem 'better_errors' + gem 'pry' end group :development do diff --git a/Gemfile.lock b/Gemfile.lock index 7354dda677..6b9bf3f0ef 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -82,6 +82,7 @@ GEM nokogiri (>= 1.5.9) mail (2.6.4) mime-types (>= 1.16, < 4) + method_source (0.8.2) mime-types (3.1) mime-types-data (~> 3.2015) mime-types-data (3.2016.0521) @@ -112,6 +113,10 @@ GEM omniauth-oauth2 (1.4.0) oauth2 (~> 1.0) omniauth (~> 1.2) + pry (0.10.4) + coderay (~> 1.1.0) + method_source (~> 0.8.1) + slop (~> 3.4) rack (1.6.4) rack-test (0.6.3) rack (>= 1.0) @@ -153,6 +158,7 @@ GEM sdoc (0.4.2) json (~> 1.7, >= 1.7.7) rdoc (~> 4.0) + slop (3.6.0) spring (2.0.0) activesupport (>= 4.2) sprockets (3.7.0) @@ -193,6 +199,7 @@ DEPENDENCIES minitest-reporters omniauth omniauth-github + pry rails (= 4.2.7) sass-rails (~> 5.0) sdoc (~> 0.4.0) From 34d735711dfe63fd5ee5ce87765ad84e355e2d5a Mon Sep 17 00:00:00 2001 From: Nina Mutty Date: Thu, 20 Oct 2016 14:56:00 -0700 Subject: [PATCH 044/191] products and reviews model test complete --- app/models/product.rb | 2 +- app/models/review.rb | 17 +++++++++-------- test/fixtures/line_items.yml | 28 ++++++++++++++-------------- test/fixtures/products.yml | 3 --- test/fixtures/reviews.yml | 8 ++------ test/models/product_test.rb | 21 ++------------------- test/models/review_test.rb | 29 +++++++++++++++++++++++++++++ 7 files changed, 57 insertions(+), 51 deletions(-) diff --git a/app/models/product.rb b/app/models/product.rb index 929e192ce5..0c4b79a942 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -35,7 +35,7 @@ def rating validates :price, presence: true validates :inventory, presence: true validates :image, presence: true - validates :rating, numericality: { only_integer: true, greater_than_or_equal_to: 0, less_than_or_equal_to: 5, allow_nil: true } + validates :rating, numericality: {greater_than_or_equal_to: 0, less_than_or_equal_to: 5, allow_nil: true } # validate :limits_on_stars # diff --git a/app/models/review.rb b/app/models/review.rb index 8fe7518454..f10b55da14 100644 --- a/app/models/review.rb +++ b/app/models/review.rb @@ -8,15 +8,16 @@ class Review < ActiveRecord::Base ### Validations ### ################### - validates :stars, presence: true + validates :stars, presence: true, numericality: {greater_than_or_equal_to: 0, less_than_or_equal_to: 5, allow_nil: true } validates :description, presence: true - validate :limits_on_stars - # A rating must be between 0 and 5 - def limits_on_stars - unless stars <= 5 && stars >= 0 - errors.add(:stars, "A rating must be between 0 and 5 stars") - end - end + # validate :limits_on_stars + # + # # A rating must be between 0 and 5 + # def limits_on_stars + # unless stars <= 5 && stars >= 0 + # errors.add(:stars, "A rating must be between 0 and 5 stars") + # end + # end end diff --git a/test/fixtures/line_items.yml b/test/fixtures/line_items.yml index f32a57177a..6164387589 100644 --- a/test/fixtures/line_items.yml +++ b/test/fixtures/line_items.yml @@ -1,15 +1,15 @@ # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html - -one: - qty: 1 - price: 1 - order: - product: - merchant: - -two: - qty: 1 - price: 1 - order: - product: - merchant: +# +# one: +# qty: 1 +# price: 1 +# order: +# product: +# merchant: +# +# two: +# qty: 1 +# price: 1 +# order: +# product: +# merchant: diff --git a/test/fixtures/products.yml b/test/fixtures/products.yml index f3f5728677..654c3ae82d 100644 --- a/test/fixtures/products.yml +++ b/test/fixtures/products.yml @@ -1,7 +1,6 @@ # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html new_shoe: - id: 1 name: "A Shoe!" description: "A beautiful shoe!" price: 300 @@ -11,7 +10,6 @@ new_shoe: rating: 3 glitter: - id: 2 name: "Glitter Wand" description: "a glittery wand" price: 1500 @@ -21,7 +19,6 @@ glitter: rating: 5 no_rating: - id: 3 name: "Glitter Wand" description: "a glittery wand" price: 1500 diff --git a/test/fixtures/reviews.yml b/test/fixtures/reviews.yml index cdc7a1ddb8..5dd530b894 100644 --- a/test/fixtures/reviews.yml +++ b/test/fixtures/reviews.yml @@ -1,28 +1,24 @@ # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html glitter_review: - id: 1 description: "nfjd" stars: 3 author: "fndjk" - product: glitter + product: :glitter shoe_review: - id: 2 description: "mkd" stars: 1 - author: "f dk" + author: "fncdk" product: new_shoe rating_review_one: - id: 3 description: "nfjds" stars: 5 author: "jf" product: no_rating rating_review_two: - id: 4 description: "mkvd" stars: 3 author: "fdjk" diff --git a/test/models/product_test.rb b/test/models/product_test.rb index 95960d0855..ede2eaf2e5 100644 --- a/test/models/product_test.rb +++ b/test/models/product_test.rb @@ -5,6 +5,7 @@ class ProductTest < ActiveSupport::TestCase assert true end test "Product must have a name, description, price, inventory and image" do + assert products(:glitter).valid? "Glitter should be valid" ### WHY IS THIS FAILING??? products(:glitter).name = nil ## This name removal is local to the test data - it doesn't change the fixture @@ -27,6 +28,7 @@ class ProductTest < ActiveSupport::TestCase assert_equal products(:glitter).reviews.length, 1 assert_equal products(:new_shoe).reviews.length, 1 assert_equal products(:no_rating).reviews.length, 2 + end test "No Rating has the correct reviews" do @@ -34,23 +36,4 @@ class ProductTest < ActiveSupport::TestCase assert_includes products(:no_rating).reviews, reviews(:rating_review_two) end - - - - - - # test "Products total rating must be the average of a products reviews" do - # assert_equal products(:no_rating).rating, 0 - # - # reviews(:rating_review_one).save - # reviews(:rating_review_two).save - # - # assert_equal products(:no_rating).rating, 4 - # - # reviews(:rating_review_two).stars = 0 - # reviews(:rating_review_two).save - # - # assert_equal products(:no_rating).rating, 2 - # end - end diff --git a/test/models/review_test.rb b/test/models/review_test.rb index 11aa5204f0..42fbc4bc0c 100644 --- a/test/models/review_test.rb +++ b/test/models/review_test.rb @@ -4,4 +4,33 @@ class ReviewTest < ActiveSupport::TestCase # test "the truth" do # assert true # end + + test "Reviews must have a star rating and a description" do + assert reviews(:glitter_review).valid? "Glitter Review should be valid" ### WHY IS THIS FAILING??? + + reviews(:glitter_review).stars = nil ## This name removal is local to the test data - it doesn't change the fixture + assert_not reviews(:glitter_review).valid? "Glitter Review should no longer be valid" + + reviews(:shoe_review).description = nil + assert_not reviews(:shoe_review).valid? "Shoe Review should no longer be valid" + end + + + test "Reviews cannot have a rating less than 0 or greater than 5" do + assert reviews(:glitter_review).stars = 6 + assert_not reviews(:glitter_review).valid? "Glitter Review should no longer be valid" + + assert reviews(:shoe_review).stars = -1 + assert_not reviews(:shoe_review).valid? "New Shoe Review should no longer be valid" + end + + + test "Each Review has the correct rating" do + assert_equal reviews(:glitter_review).product, products(:glitter) + assert_equal reviews(:shoe_review).product, products(:new_shoe) + assert_equal reviews(:rating_review_one).product, products(:no_rating) + assert_equal reviews(:rating_review_two).product, products(:no_rating) + end + + end From 941fb5c157637e503b2bd8642b6319aec09a6868 Mon Sep 17 00:00:00 2001 From: Miriam Cortes Date: Thu, 20 Oct 2016 15:47:38 -0700 Subject: [PATCH 045/191] few things happening --- app/controllers/merchants_controller.rb | 24 +++++++++++++++--------- app/controllers/sessions_controller.rb | 16 +++++++++------- app/models/merchant.rb | 17 ++++++++++++++--- app/views/layouts/application.html.erb | 4 ++++ app/views/merchants/login.html.erb | 3 +++ app/views/merchants/new.html.erb | 12 +++++++++++- config/routes.rb | 5 ++--- 7 files changed, 58 insertions(+), 23 deletions(-) create mode 100644 app/views/merchants/login.html.erb diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index d3e68db068..ef00b199df 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -16,16 +16,22 @@ def new def create @params = params - @merchant = Merchant.new - @merchant.name = params[:merchant][:name] - @merchant.email = params[:merchant][:email] - @merchant.password = params[:merchant][:password] - if @merchant.save - redirect_to merchant_path(@merchant.id) - else - render :new + # index + # @merchants.each do |this_merchant| + # flash[:notice] = "A merchant with this email already exists." if this_merchant.email == params[:merchant][:email] + # end + @merchant = Merchant.new + @merchant.name = params[:merchant][:name] + @merchant.email = params[:merchant][:email] + @merchant.password = params[:merchant][:password] + + if @merchant.save + redirect_to merchant_path(@merchant.id) + else + render :new + end + end end - end def edit diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index 5f81a23459..54d187b430 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -5,24 +5,26 @@ def create flash[:notice] = "Login Failed!" return redirect to root_path unless auth_hash['uid'] - @merchant = Merchant.find_by(uid: auth_hash[:uid], provider: 'github') + @merchant = Merchant.find_by(id: auth_hash[:uid]) if @merchant.nil? - # User doesn't match anything in the DB. - # Attempt to create a new user. + # Merchant doesn't match anything in the DB. + # Attempt to create a new merchant. @merchant = Merchant.build_from_github(auth_hash) - flash[:notice] = "Unable to save the User" + flash[:notice] = "Unable to save the Merchant" return redirect_to root_path unless @merchant.save end - - #Save the user ID in the session - session[:user_id] = @merchant.id + #Save the merchant ID in the session + session[:merchant_id] = @merchant.id flash[:notice] = "Successfully logged in!" redirect_to root_path end + def create_merchant + + end # def login # session[:merchant_id] = 1 # redirect_to '/products/index' diff --git a/app/models/merchant.rb b/app/models/merchant.rb index 480d2a68c8..d8f77617e5 100644 --- a/app/models/merchant.rb +++ b/app/models/merchant.rb @@ -1,9 +1,20 @@ class Merchant < ActiveRecord::Base has_many :products has_many :orders - validates :name, presence: true, uniqueness: true - validates :email, presence: true, uniqueness: true - validates :password, presence: true + validates :name, :password, :email, presence: true + validates :email, uniqueness: true + + def self.build_from_github(auth_hash) + merchant = Merchant.new + merchant.id = auth_hash[:uid] + # user.provider = 'github' + merchant.name = auth_hash['info']['name'] + merchant.email = auth_hash['info']['email'] + # user.avatar = auth_hash['extra']['raw_info']['avatar_url'] + # user.followercount = auth_hash['extra']['raw_info']['followers'].to_i + + return merchant + end def revenue_paid_orders revenue_total = 0.0 diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 1c32a57377..52d877ea96 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -7,6 +7,10 @@ <%= csrf_meta_tags %> +
+ <%= link_to("log in via Github", "/auth/github") %> +
+

<%= greeting %>

<%= yield %> diff --git a/app/views/merchants/login.html.erb b/app/views/merchants/login.html.erb new file mode 100644 index 0000000000..562cb3bc57 --- /dev/null +++ b/app/views/merchants/login.html.erb @@ -0,0 +1,3 @@ +

Login as a merchant

+ +<%= render partial: "merchant_partial", locals: {action_name: "create"} %> diff --git a/app/views/merchants/new.html.erb b/app/views/merchants/new.html.erb index 06a42ad5fa..ddf1570549 100644 --- a/app/views/merchants/new.html.erb +++ b/app/views/merchants/new.html.erb @@ -1,3 +1,13 @@

Become a merchant.

-<%= render partial: "merchant_partial", locals: {action_name: "create"} %> +<%#= render partial: "merchant_partial", locals: {action_name: "create"} %> +<% if @merchant %> +

Welcome <%= @merchant.name %>

+ +<% else %> +

Please log in

+<% end %> +<% if flash[:notice] %> +

<%= flash[:notice] %>

+ +<% end %> diff --git a/config/routes.rb b/config/routes.rb index 7638f68ab3..654ac4baf6 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -28,8 +28,7 @@ get 'sessions/destroy' get 'merchants/:id/products' => 'merchants#show_merchant_products', as: 'merchant_products' - - - get "/auth/:provider/callback" => "sessions#create" + get '/auth/:provider/callback' => 'merchant#create' + get 'merchants/login' => 'merchants#login', as: 'login' end From 60f4c06ff236d301fd307a169c0dc46ad0ded45e Mon Sep 17 00:00:00 2001 From: Nina Mutty Date: Thu, 20 Oct 2016 16:23:10 -0700 Subject: [PATCH 046/191] added delete buttons for reviews --- app/controllers/products_controller.rb | 12 ++++++++++-- app/controllers/reviews_controller.rb | 21 ++++++++++++++++++--- app/models/review.rb | 9 --------- app/views/products/show.html.erb | 1 + app/views/reviews/index.html.erb | 1 + 5 files changed, 30 insertions(+), 14 deletions(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index fd9720d5f8..2d31a35d5b 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -60,11 +60,19 @@ def destroy private def find_product - @product = Product.find(params[:id]) + if Product.exists?(params[:id].to_i) == true + return @product = Product.find(params[:id].to_i) + else + render :status => 404 + end end def find_merchant - @merchant = Merchant.find(params[:id]) + if Merchant.exists?(params[:id].to_i) == true + return @merchant = Merchant.find(params[:id].to_i) + else + render :status => 404 + end end def product_params diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index 4831aa2101..02b1457b58 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -1,6 +1,6 @@ class ReviewsController < ApplicationController before_action :find_product - before_action :find_review, only: [:show, :edit, :update] + before_action :find_review, only: [:show, :edit, :update, :destroy] def index @@ -37,15 +37,30 @@ def update end def destroy + @review = find_review + if @review.class == Review + @review.destroy + redirect_to product_path(@product.id) + end end private def find_product - @product = Product.find(params[:product_id]) + if Product.exists?(params[:product_id].to_i) == true + return @product = Product.find(params[:product_id].to_i) + else + render :status => 404 + end end + def find_review - @review = Review.find(params[:id]) + if Review.exists?(params[:id].to_i) == true + return @review = Review.find(params[:id].to_i) + else + render :status => 404 + end end + def review_params params.require(:review).permit(:stars, :description, :author) end diff --git a/app/models/review.rb b/app/models/review.rb index f10b55da14..4500f1b6e3 100644 --- a/app/models/review.rb +++ b/app/models/review.rb @@ -11,13 +11,4 @@ class Review < ActiveRecord::Base validates :stars, presence: true, numericality: {greater_than_or_equal_to: 0, less_than_or_equal_to: 5, allow_nil: true } validates :description, presence: true - - # validate :limits_on_stars - # - # # A rating must be between 0 and 5 - # def limits_on_stars - # unless stars <= 5 && stars >= 0 - # errors.add(:stars, "A rating must be between 0 and 5 stars") - # end - # end end diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 4660eef840..f9bdfc951d 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -27,6 +27,7 @@

<%= star_string(review.stars) %>

<%= review.description %>

<%= "By: #{review.author}" if review.author != '' %>

+

<%= button_to "Delete Review", {controller: 'reviews', action: 'destroy', product_id: @product.id, id: review.id}, method: :delete, data: {confirm: "Are you sure?"}%>

<% end %> <% end %> diff --git a/app/views/reviews/index.html.erb b/app/views/reviews/index.html.erb index aeb0eb692d..9bceb9b37d 100644 --- a/app/views/reviews/index.html.erb +++ b/app/views/reviews/index.html.erb @@ -6,5 +6,6 @@

<%= star_string(review.stars) %>

<%= review.description %>

<%= "By: #{review.author}" if review.author != '' %>

+

<%= button_to "Delete Review", {controller: 'reviews', action: 'destroy', product_id: @product.id, id: review.id}, method: :delete, data: {confirm: "Are you sure?"}%>

<% end %> From 9b97ab92b1f3b0f914d813051339a7844bce535b Mon Sep 17 00:00:00 2001 From: Nina Mutty Date: Thu, 20 Oct 2016 16:23:27 -0700 Subject: [PATCH 047/191] review and product controller tests done --- .../controllers/categories_controller_test.rb | 72 +++++++++---------- test/controllers/guests_controller_test.rb | 68 +++++++++--------- test/controllers/merchants_controller_test.rb | 60 ++++++++-------- test/controllers/orders_controller_test.rb | 68 +++++++++--------- test/controllers/products_controller_test.rb | 40 ++++++++--- test/controllers/reviews_controller_test.rb | 37 +++++----- test/controllers/sessions_controller_test.rb | 18 ++--- 7 files changed, 193 insertions(+), 170 deletions(-) diff --git a/test/controllers/categories_controller_test.rb b/test/controllers/categories_controller_test.rb index 9abe15985f..ed50a9d22b 100644 --- a/test/controllers/categories_controller_test.rb +++ b/test/controllers/categories_controller_test.rb @@ -1,41 +1,41 @@ require 'test_helper' class CategoriesControllerTest < ActionController::TestCase - test "should get index" do - get :index - assert_response :success - assert_template :index - end - - test "should get show" do - get :show, {id: categories(:two).id} - assert_response :success - assert_template :show - end - - test "should get new" do - skip - get :new - assert_response :success - end - - test "should get create" do - skip - post :create - assert_response :success - - assert_difference('Category.count', 1) do - post_params = {category: {name: "A Category"}} - post :create, post_params - end - assert_response :redirect - end - - - test "should get destroy" do - skip - get :destroy - assert_response :success - end + # test "should get index" do + # get :index + # assert_response :success + # assert_template :index + # end + # + # test "should get show" do + # get :show, {id: categories(:two).id} + # assert_response :success + # assert_template :show + # end + # + # test "should get new" do + # skip + # get :new + # assert_response :success + # end + # + # test "should get create" do + # skip + # post :create + # assert_response :success + # + # assert_difference('Category.count', 1) do + # post_params = {category: {name: "A Category"}} + # post :create, post_params + # end + # assert_response :redirect + # end + # + # + # test "should get destroy" do + # skip + # get :destroy + # assert_response :success + # end end diff --git a/test/controllers/guests_controller_test.rb b/test/controllers/guests_controller_test.rb index bfad0bee2b..8cf2becd09 100644 --- a/test/controllers/guests_controller_test.rb +++ b/test/controllers/guests_controller_test.rb @@ -1,39 +1,39 @@ require 'test_helper' class GuestsControllerTest < ActionController::TestCase - test "should get index" do - get :index - assert_response :success - end - - test "should get show" do - get :show - assert_response :success - end - - test "should get new" do - get :new - assert_response :success - end - - test "should get create" do - get :create - assert_response :success - end - - test "should get edit" do - get :edit - assert_response :success - end - - test "should get update" do - get :update - assert_response :success - end - - test "should get destroy" do - get :destroy - assert_response :success - end + # test "should get index" do + # get :index + # assert_response :success + # end + # + # test "should get show" do + # get :show + # assert_response :success + # end + # + # test "should get new" do + # get :new + # assert_response :success + # end + # + # test "should get create" do + # get :create + # assert_response :success + # end + # + # test "should get edit" do + # get :edit + # assert_response :success + # end + # + # test "should get update" do + # get :update + # assert_response :success + # end + # + # test "should get destroy" do + # get :destroy + # assert_response :success + # end end diff --git a/test/controllers/merchants_controller_test.rb b/test/controllers/merchants_controller_test.rb index f1625bb43e..d6bf6dade8 100644 --- a/test/controllers/merchants_controller_test.rb +++ b/test/controllers/merchants_controller_test.rb @@ -1,36 +1,36 @@ require 'test_helper' class MerchantsControllerTest < ActionController::TestCase - test "should get index" do - get :index - assert_response :success - assert_template :index - end - - test "should get show" do - get :show, {id: merchants(:one).id} - assert_response :success - end - - test "should get new" do - get :new - assert_response :success - assert_template :new - end - - test "Creating a new Merchant changes number of Merchants" do - assert_difference('Merchant.count', 1) do - post_params = { merchant: {name: "Lola CherryCola", email: "lola@email.com", password: "lolarocks"} } - post :create, post_params - end - assert_response :redirect - end - - test "should get create" do - post_params = { merchant: {name: "merchant3", email: "email_merchant3@email.com", password: "password1111"} } - post :create, post_params - assert_response :redirect - end + # test "should get index" do + # get :index + # assert_response :success + # assert_template :index + # end + # + # test "should get show" do + # get :show, {id: merchants(:one).id} + # assert_response :success + # end + # + # test "should get new" do + # get :new + # assert_response :success + # assert_template :new + # end + # + # test "Creating a new Merchant changes number of Merchants" do + # assert_difference('Merchant.count', 1) do + # post_params = { merchant: {name: "Lola CherryCola", email: "lola@email.com", password: "lolarocks"} } + # post :create, post_params + # end + # assert_response :redirect + # end + # + # test "should get create" do + # post_params = { merchant: {name: "merchant3", email: "email_merchant3@email.com", password: "password1111"} } + # post :create, post_params + # assert_response :redirect + # end # test "should get edit" do # get :edit, {id: merchants(:one).id} diff --git a/test/controllers/orders_controller_test.rb b/test/controllers/orders_controller_test.rb index ec871721c6..f00d72f4ff 100644 --- a/test/controllers/orders_controller_test.rb +++ b/test/controllers/orders_controller_test.rb @@ -1,39 +1,39 @@ require 'test_helper' class OrdersControllerTest < ActionController::TestCase - test "should get index" do - get :index - assert_response :success - end - - test "should get show" do - get :show - assert_response :success - end - - test "should get new" do - get :new - assert_response :success - end - - test "should get create" do - get :create - assert_response :success - end - - test "should get edit" do - get :edit - assert_response :success - end - - test "should get update" do - get :update - assert_response :success - end - - test "should get destroy" do - get :destroy - assert_response :success - end + # test "should get index" do + # get :index + # assert_response :success + # end + # + # test "should get show" do + # get :show + # assert_response :success + # end + # + # test "should get new" do + # get :new + # assert_response :success + # end + # + # test "should get create" do + # get :create + # assert_response :success + # end + # + # test "should get edit" do + # get :edit + # assert_response :success + # end + # + # test "should get update" do + # get :update + # assert_response :success + # end + # + # test "should get destroy" do + # get :destroy + # assert_response :success + # end end diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index 5e7440a0d5..d892d4aa67 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -4,36 +4,54 @@ class ProductsControllerTest < ActionController::TestCase test "should get index" do get :index assert_response :success + assert_template :index end test "should get show" do - get :show + get :show, {id: products(:glitter).id} assert_response :success end test "should get new" do get :new assert_response :success + assert_template :new end - test "should get create" do - get :create - assert_response :success + test "should be able to create a new product" do + post_params = {product: {name: "Glitter Wand", description: "a glittery wand", price: 1500, image: 'http://placekitten.com/200/300', merchant_id: 2, inventory: 7, rating: 5}} + + post :create, post_params + assert_response :redirect + # This action will need to change to merchant's create_new_product path + end + + test "creating a product changes the number of products" do + assert_difference("Product.count",1) do + post_params = {product: {name: "Glitter Wand", description: "a glittery wand", price: 1500, image: 'http://placekitten.com/200/300', merchant_id: 2, inventory: 7, rating: 5}} + post :create, post_params + end end test "should get edit" do - get :edit + get :edit, {id: products(:glitter).id} assert_response :success end - test "should get update" do - get :update - assert_response :success + test "should be able to update a product" do + put :update, {id: products(:glitter).id, product: {name: "Glitter Wand", description: "a glittery wand", price: 1500, image: 'http://placekitten.com/200/300', merchant_id: 2, inventory: 7, rating: 5}} + assert_redirected_to controller: "products", action: "show" end - test "should get destroy" do - get :destroy - assert_response :success + test "deleting a product changes the number of products" do + assert_difference("Product.count", -1) do + delete :destroy, {id: products(:glitter).id } + end + end + + test "responds with error if file isn't found" do + delete :destroy, {id: 943} + assert_response :missing end end diff --git a/test/controllers/reviews_controller_test.rb b/test/controllers/reviews_controller_test.rb index 7a6ab9f90d..b570584074 100644 --- a/test/controllers/reviews_controller_test.rb +++ b/test/controllers/reviews_controller_test.rb @@ -2,38 +2,43 @@ class ReviewsControllerTest < ActionController::TestCase test "should get index" do - get :index + get :index, {product_id: products(:glitter).id} assert_response :success + assert_template :index end test "should get show" do - get :show + get :show, {id: reviews(:glitter_review), product_id: products(:glitter).id} assert_response :success end test "should get new" do - get :new + get :new, {product_id: products(:glitter).id} assert_response :success + assert_template :new end - test "should get create" do - get :create - assert_response :success + test "should be able to create a new product" do + post :create, {product_id: products(:glitter).id, review: {description: "njefknlsnf", stars: 2, author: "nfs"}} + assert_response :redirect + # This action will need to change to merchant's create_new_product path end - test "should get edit" do - get :edit - assert_response :success + test "creating a product changes the number of products" do + assert_difference("Review.count",1) do + post :create, {product_id: products(:glitter).id, review: {description: "njefknlsnf", stars: 2, author: "nfs"}} + end end - test "should get update" do - get :update - assert_response :success - end - test "should get destroy" do - get :destroy - assert_response :success + test "deleting a product changes the number of products" do + assert_difference("Review.count", -1) do + delete :destroy, {product_id: products(:glitter).id, id: reviews(:glitter_review).id } + end end + test "responds with error if file isn't found" do + delete :destroy, {product_id: products(:glitter).id, id: 943} + assert_response :missing + end end diff --git a/test/controllers/sessions_controller_test.rb b/test/controllers/sessions_controller_test.rb index 9a35cf1518..9c996334b2 100644 --- a/test/controllers/sessions_controller_test.rb +++ b/test/controllers/sessions_controller_test.rb @@ -1,14 +1,14 @@ require 'test_helper' class SessionsControllerTest < ActionController::TestCase - test "should get create" do - get :create - assert_response :success - end - - test "should get destroy" do - get :destroy - assert_response :success - end + # test "should get create" do + # get :create + # assert_response :success + # end + # + # test "should get destroy" do + # get :destroy + # assert_response :success + # end end From b2d6570e63bce15dcd77e669795438fe2224f724 Mon Sep 17 00:00:00 2001 From: Miriam Cortes Date: Thu, 20 Oct 2016 17:37:30 -0700 Subject: [PATCH 048/191] merchant can now login using github and properly links to their show page --- app/controllers/merchants_controller.rb | 22 +++---------------- app/controllers/sessions_controller.rb | 11 +++------- app/models/merchant.rb | 7 +++--- app/views/layouts/application.html.erb | 16 +++++++++++++- app/views/merchants/new.html.erb | 12 +--------- app/views/merchants/show.html.erb | 11 +++++----- config/routes.rb | 6 ----- ...232838_add_uid_and_provider_to_merchant.rb | 6 +++++ db/schema.rb | 4 +++- 9 files changed, 40 insertions(+), 55 deletions(-) create mode 100644 db/migrate/20161020232838_add_uid_and_provider_to_merchant.rb diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index ef00b199df..23e916344d 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -2,7 +2,8 @@ class MerchantsController < ApplicationController #before_action :find_merchant only: [:show, :edit, :update] def index - @merchants = Merchant.all + # @merchants = Merchant.all + find_merchant end def show @@ -15,23 +16,6 @@ def new end def create - @params = params - # index - # @merchants.each do |this_merchant| - # flash[:notice] = "A merchant with this email already exists." if this_merchant.email == params[:merchant][:email] - # end - @merchant = Merchant.new - @merchant.name = params[:merchant][:name] - @merchant.email = params[:merchant][:email] - @merchant.password = params[:merchant][:password] - - if @merchant.save - redirect_to merchant_path(@merchant.id) - else - render :new - end - end - end end def edit @@ -56,6 +40,6 @@ def merchant_params end def find_merchant - @merchant = Merchant.find(params[:id]) + @merchant = Merchant.find_by(id: session[:merchant_id]) end end diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index 54d187b430..aedefa8756 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -2,15 +2,11 @@ class SessionsController < ApplicationController def create auth_hash = request.env['omniauth.auth'] - flash[:notice] = "Login Failed!" return redirect to root_path unless auth_hash['uid'] - @merchant = Merchant.find_by(id: auth_hash[:uid]) + @merchant = Merchant.find_by(uid: auth_hash[:uid]) if @merchant.nil? - # Merchant doesn't match anything in the DB. - # Attempt to create a new merchant. @merchant = Merchant.build_from_github(auth_hash) - flash[:notice] = "Unable to save the Merchant" return redirect_to root_path unless @merchant.save end @@ -18,8 +14,7 @@ def create #Save the merchant ID in the session session[:merchant_id] = @merchant.id - flash[:notice] = "Successfully logged in!" - redirect_to root_path + redirect_to merchant_path(@merchant.id) end def create_merchant @@ -37,6 +32,6 @@ def create_merchant def destroy - session[:user_id] = nil + session[:merchant_id] = nil end end diff --git a/app/models/merchant.rb b/app/models/merchant.rb index d8f77617e5..56b3f21f44 100644 --- a/app/models/merchant.rb +++ b/app/models/merchant.rb @@ -1,13 +1,14 @@ +# Merchant Model class Merchant < ActiveRecord::Base has_many :products has_many :orders - validates :name, :password, :email, presence: true + validates :name, :email, presence: true validates :email, uniqueness: true def self.build_from_github(auth_hash) merchant = Merchant.new - merchant.id = auth_hash[:uid] - # user.provider = 'github' + merchant.uid = auth_hash[:uid] + merchant.provider = 'github' merchant.name = auth_hash['info']['name'] merchant.email = auth_hash['info']['email'] # user.avatar = auth_hash['extra']['raw_info']['avatar_url'] diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 52d877ea96..a0b7aa669e 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -8,7 +8,21 @@
- <%= link_to("log in via Github", "/auth/github") %> + <% if @merchant %> +

Welcome, <%= @merchant.name %>

+
    +
  • <%#= link_to("Log out", merchant_logout_path) %>
  • +
+ <% else %> +
    +
  • <%= link_to("log in via Github", "/auth/github") %>
  • +
+ <% end %> + + <% if flash[:notice] %> +

<%= flash[:notice] %>

+ <% end %> +

<%= greeting %>

diff --git a/app/views/merchants/new.html.erb b/app/views/merchants/new.html.erb index ddf1570549..06a42ad5fa 100644 --- a/app/views/merchants/new.html.erb +++ b/app/views/merchants/new.html.erb @@ -1,13 +1,3 @@

Become a merchant.

-<%#= render partial: "merchant_partial", locals: {action_name: "create"} %> -<% if @merchant %> -

Welcome <%= @merchant.name %>

- -<% else %> -

Please log in

-<% end %> -<% if flash[:notice] %> -

<%= flash[:notice] %>

- -<% end %> +<%= render partial: "merchant_partial", locals: {action_name: "create"} %> diff --git a/app/views/merchants/show.html.erb b/app/views/merchants/show.html.erb index 5dc41b3d25..ee6d5a5550 100644 --- a/app/views/merchants/show.html.erb +++ b/app/views/merchants/show.html.erb @@ -1,11 +1,10 @@ -

<%= @merchant[:name] %>

+

<%#= @merchant[:name] %>

-
    -
  • <%= button_to 'Add a Product', new_product_path(params[:id]), class: "button", method: :get %>
  • -
  • <%= button_to 'View Products', merchant_products_path(params[:id]), class: "button", method: :get %>
  • -
  • <%= button_to 'Add a Category', new_category_path(params[:id]), class: "button", method: :get %>
  • -
+ +

<%= button_to 'Add a Product', new_product_path(params[:id]), class: "button", method: :get %>

+

<%= button_to 'View Products', merchant_products_path(params[:id]), class: "button", method: :get %>

+

<%= button_to 'Add a Category', new_category_path(params[:id]), class: "button", method: :get %>

diff --git a/config/routes.rb b/config/routes.rb index 654ac4baf6..c734cb4f5d 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,9 +1,7 @@ Rails.application.routes.draw do - get "/auth/:provider/callback" => "sessions#create" - # The priority is based upon order of creation: first created -> highest priority. # See how all your routes lay out with "rake routes". @@ -16,19 +14,15 @@ resources :reviews end - resources :categories resources :guests resources :merchants resources :orders - get 'sessions/create' get 'sessions/destroy' get 'merchants/:id/products' => 'merchants#show_merchant_products', as: 'merchant_products' - get '/auth/:provider/callback' => 'merchant#create' - get 'merchants/login' => 'merchants#login', as: 'login' end diff --git a/db/migrate/20161020232838_add_uid_and_provider_to_merchant.rb b/db/migrate/20161020232838_add_uid_and_provider_to_merchant.rb new file mode 100644 index 0000000000..315ccf7adc --- /dev/null +++ b/db/migrate/20161020232838_add_uid_and_provider_to_merchant.rb @@ -0,0 +1,6 @@ +class AddUidAndProviderToMerchant < ActiveRecord::Migration + def change + add_column(:merchants, :uid, :string) + add_column(:merchants, :provider, :string) + end +end diff --git a/db/schema.rb b/db/schema.rb index b7a309dd22..9809e7d64e 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20161019225037) do +ActiveRecord::Schema.define(version: 20161020232838) do create_table "categories", force: :cascade do |t| t.string "name" @@ -42,6 +42,8 @@ t.string "password" t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.string "uid" + t.string "provider" end create_table "orders", force: :cascade do |t| From 8d8a14b3019a928bff14a20097eb1a4891e7ac6a Mon Sep 17 00:00:00 2001 From: Olivia Date: Thu, 20 Oct 2016 19:25:24 -0700 Subject: [PATCH 049/191] categories tests complete, changed line-item fixture to add order_id etc --- .../controllers/categories_controller_test.rb | 20 ++++++++++--------- test/fixtures/line_items.yml | 12 +++++------ 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/test/controllers/categories_controller_test.rb b/test/controllers/categories_controller_test.rb index 9abe15985f..0a60dda915 100644 --- a/test/controllers/categories_controller_test.rb +++ b/test/controllers/categories_controller_test.rb @@ -8,21 +8,23 @@ class CategoriesControllerTest < ActionController::TestCase end test "should get show" do - get :show, {id: categories(:two).id} + get :show, {id: categories(:one).id} assert_response :success assert_template :show end test "should get new" do - skip get :new assert_response :success end - test "should get create" do - skip - post :create - assert_response :success + test "should be able to create a new category" do + post_params = {category: {name: "Harry Potter Things"}} + post :create, post_params + assert_response :redirect + end + + test "creating a category changes the number of categories" do assert_difference('Category.count', 1) do post_params = {category: {name: "A Category"}} @@ -33,9 +35,9 @@ class CategoriesControllerTest < ActionController::TestCase test "should get destroy" do - skip - get :destroy - assert_response :success + + delete :destroy, {id: categories(:one).id} + assert_response :redirect end end diff --git a/test/fixtures/line_items.yml b/test/fixtures/line_items.yml index f32a57177a..44cfe6ef83 100644 --- a/test/fixtures/line_items.yml +++ b/test/fixtures/line_items.yml @@ -3,13 +3,13 @@ one: qty: 1 price: 1 - order: - product: - merchant: + order_id: + product_id: + merchant_id: two: qty: 1 price: 1 - order: - product: - merchant: + order_id: + product_id: + merchant_id: From 38a78eafbfea26c323e2f706aabcd80c346c19c5 Mon Sep 17 00:00:00 2001 From: Olivia Date: Thu, 20 Oct 2016 19:44:55 -0700 Subject: [PATCH 050/191] category model validation test --- app/models/category.rb | 8 +------- test/models/category_test.rb | 6 ++++++ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/models/category.rb b/app/models/category.rb index 659e5ec916..2e6709a98d 100644 --- a/app/models/category.rb +++ b/app/models/category.rb @@ -1,11 +1,5 @@ class Category < ActiveRecord::Base has_many :product_categories has_many :products, :through => :product_categories - -# def Self.capitalize_category -# categories = self.all.each do |c| -# c.name.capitalize! -# end -# end - + validates :name, presence: true, uniqueness: true end diff --git a/test/models/category_test.rb b/test/models/category_test.rb index 4733541516..9bcab9c3ef 100644 --- a/test/models/category_test.rb +++ b/test/models/category_test.rb @@ -4,4 +4,10 @@ class CategoryTest < ActiveSupport::TestCase # test "the truth" do # assert true # end + + test "should have the necessary required validators" do + category = Category.new + assert_not category.valid? + assert_equal [:name], category.errors.keys +end end From e193a8638ed36fc595da4a32895bca43e80b9b5c Mon Sep 17 00:00:00 2001 From: Sabrina Wilbert Date: Fri, 21 Oct 2016 09:37:52 -0700 Subject: [PATCH 051/191] Moved methods into model --- app/controllers/application_controller.rb | 19 ++++++- app/controllers/orders_controller.rb | 64 +++++++++++++---------- app/models/guest.rb | 12 +++++ app/views/orders/cart.html.erb | 5 -- app/views/products/show.html.erb | 14 ++--- 5 files changed, 72 insertions(+), 42 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 946b7d4904..480682d75f 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -3,15 +3,30 @@ class ApplicationController < ActionController::Base # For APIs, you may want to use :null_session instead. protect_from_forgery with: :exception - helper_method :current_merchant, :current_guest + helper_method :current_merchant, :current_guest, :current_cart def current_merchant @current_merchant ||= Merchant.find_by(id: session[:merchant_id]) end def current_guest - @current_guest ||= Guest.find_by(id: session[:user_id]) + return @current_guest if @current_guest.present? + @current_guest = Guest.find_or_create_by(id: session[:user_id]) + session[:user_id] = @current_guest.id + return @current_guest end + def current_cart + #if we are logged in as merchant + if current_merchant.present? + #get cart from current merchant + return current_merchant.cart + end + #if we are not a merchant + if current_guest.present? + #get cart from current guest cart + return current_guest.cart + end + end end diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 6532780ffc..eafe4a1f96 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -4,22 +4,31 @@ def index end def view_cart - - end def new end def create + if current_merchant.nil? + guest_create_cart + # elsif current_merchant.nil? && if @order.guest_id != nil + # add_line_to_cart + # elsif current_merchant != nil + #other code to create cart or add line to cart. + # end + # end + end + end + + def subtotal + @order.line_items do |line| + line_cost = @line.price * @line.qty + total_amount << line_cost + return total_amount + end end -def subtotal - @order.line_items do |line| - line_cost = @line.price * @line.qty - total_amount << line_cost - return total_amount -end def total_amount subtotal total_amount.inject { |result, element| result + element } @@ -38,36 +47,33 @@ def update def destroy end + + def guest_create_cart - if current_merchant.nil? && if @order.guest_id.nil? - @guest = Guest.new - @guest.save - @order = Order.new - @order.guest_id = @guest.id - @order.order_status = "pending" - @order.save @line = LineItem.new + @line.product_id = params["product_id"] + @line.merchant_id = params["merchant_id"] + @line.qty = params["qty"] + @line.price = params["price"] @line.order_id = @order.id - @line.product_id = params[:products][:product_id] - @line.merchant_id = params[:products][:merchant_id] - @line.qty = params[:qty] - @line.price = params[:products][:price] @line.save - else - add_to_cart - end - def add_to_cart + end + def add_line_to_cart @line = LineItem.new @line.order_id = @order.id - @line.product_id = params[:products][:product_id] - @line.merchant_id = params[:products][:merchant_id] - @line.qty = params[:qty] - @line.price = params[:products][:price] + @line.product_id = params[:product]["product_id"] + @line.merchant_id = params[:product]["merchant_id"] + @line.qty = params["qty"] + @line.price = params[:product]["price"] @line.save - end + end def remove_from_cart @line = @order.line_items.find(params[:id]) @line.id.destroy(params[:id].to_i) end -end + + + + +end#end of class diff --git a/app/models/guest.rb b/app/models/guest.rb index 789847926e..f54e78a68d 100644 --- a/app/models/guest.rb +++ b/app/models/guest.rb @@ -1,4 +1,16 @@ class Guest < ActiveRecord::Base has_many :orders has_many :line_items + + def cart + #find cart from guest orders + self.orders.find_or_create_by(:order_status => "pending") + #if not found we create it + #guest has one cart + #the cart is an orders + #the guest has_many orders + #has to be pending orders + #return the cart + end + end diff --git a/app/views/orders/cart.html.erb b/app/views/orders/cart.html.erb index 4703ec3403..dc03ca481e 100644 --- a/app/views/orders/cart.html.erb +++ b/app/views/orders/cart.html.erb @@ -9,15 +9,10 @@ <%= f.number_field :quantity, value: order_item.quantity.to_i, class: "form-control", min: 1 %> <%= f.hidden_field :product_id, value: product.id %> - <%= f.label :author %> - <%= f.text_field :creator%> <%= f.label :description %> <%= f.text_field :description %> - <%# <%= f.label :rank %> - <%#<%= f.text_field :rank %> - <%= f.submit %> <% end %> diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 4660eef840..46e62a61e6 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -9,18 +9,20 @@

<%= button_to "Edit Product", {controller: 'products', action: 'edit'}, path: 'edit_product', method: :get%>

<%= button_to "Delete Product", {controller: 'products', action: 'destroy'}, path: 'product', method: :delete, data: {confirm: "Are you sure?"}%>

-<%= form_for @line_item, +<%= form_tag @line_items, method: :post, - url: new_order_path do |f| %> + url: orders_path do |f| %>
- <%= f.label :qty %> +
+ <%= f.label :qty %> <%= f.text_area :qty %> -
-
- <%= f.submit "Add to Cart "%> +
+ <%= f.submit "Add to Cart "%>
<% end %> + + <% if @reviews != nil %> <% @reviews.each do |review| %>
From e9c450ef730eff0e96f58cad2490ef925701f3c4 Mon Sep 17 00:00:00 2001 From: Miriam Cortes Date: Fri, 21 Oct 2016 09:38:37 -0700 Subject: [PATCH 052/191] nighttime miriam just doesn't get it --- app/views/merchants/login.html.erb | 3 --- app/views/merchants/show.html.erb | 1 - config/routes.rb | 1 + 3 files changed, 1 insertion(+), 4 deletions(-) delete mode 100644 app/views/merchants/login.html.erb diff --git a/app/views/merchants/login.html.erb b/app/views/merchants/login.html.erb deleted file mode 100644 index 562cb3bc57..0000000000 --- a/app/views/merchants/login.html.erb +++ /dev/null @@ -1,3 +0,0 @@ -

Login as a merchant

- -<%= render partial: "merchant_partial", locals: {action_name: "create"} %> diff --git a/app/views/merchants/show.html.erb b/app/views/merchants/show.html.erb index ee6d5a5550..e93e469955 100644 --- a/app/views/merchants/show.html.erb +++ b/app/views/merchants/show.html.erb @@ -1,4 +1,3 @@ -

<%#= @merchant[:name] %>

diff --git a/config/routes.rb b/config/routes.rb index c734cb4f5d..be6a83ef07 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -25,4 +25,5 @@ get 'merchants/:id/products' => 'merchants#show_merchant_products', as: 'merchant_products' + end From a28532de491bd9494bc14a0b3020852c99fe814f Mon Sep 17 00:00:00 2001 From: Sabrina Wilbert Date: Fri, 21 Oct 2016 10:08:06 -0700 Subject: [PATCH 053/191] Updated Gemfile for Heroku --- Gemfile | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index a6bd668648..9143cdc51b 100644 --- a/Gemfile +++ b/Gemfile @@ -5,10 +5,13 @@ gem "awesome_print" gem "omniauth" gem "omniauth-github" +gem 'pg', group: :production +gem 'rails_12factor', group: :production + # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' gem 'rails', '4.2.7' # Use sqlite3 as the database for Active Record -gem 'sqlite3' +gem 'sqlite3', group: [:development, :test] # Use SCSS for stylesheets gem 'sass-rails', '~> 5.0' # Use Uglifier as compressor for JavaScript assets From 1d3b15862c8b91faa9afab79d053d39eabbe9433 Mon Sep 17 00:00:00 2001 From: Sabrina Wilbert Date: Fri, 21 Oct 2016 11:14:00 -0700 Subject: [PATCH 054/191] Updated Gemfile for Heroku --- Gemfile | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Gemfile b/Gemfile index a6bd668648..312312fc76 100644 --- a/Gemfile +++ b/Gemfile @@ -5,11 +5,13 @@ gem "awesome_print" gem "omniauth" gem "omniauth-github" +gem 'pg', group: :production +gem 'rails_12factor', group: :production + # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' gem 'rails', '4.2.7' # Use sqlite3 as the database for Active Record -gem 'sqlite3' -# Use SCSS for stylesheets +gem 'sqlite3', group: [:development, :test]# Use SCSS for stylesheets gem 'sass-rails', '~> 5.0' # Use Uglifier as compressor for JavaScript assets gem 'uglifier', '>= 1.3.0' From 1ccbf2449e12768d347e24d7dcb493ac7f0c7789 Mon Sep 17 00:00:00 2001 From: Sabrina Wilbert Date: Fri, 21 Oct 2016 11:24:48 -0700 Subject: [PATCH 055/191] Added gems --- Gemfile.lock | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Gemfile.lock b/Gemfile.lock index 6b9bf3f0ef..a712c87090 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -113,6 +113,7 @@ GEM omniauth-oauth2 (1.4.0) oauth2 (~> 1.0) omniauth (~> 1.2) + pg (0.19.0) pry (0.10.4) coderay (~> 1.1.0) method_source (~> 0.8.1) @@ -139,6 +140,11 @@ GEM rails-deprecated_sanitizer (>= 1.0.1) rails-html-sanitizer (1.0.3) loofah (~> 2.0) + rails_12factor (0.0.3) + rails_serve_static_assets + rails_stdout_logging + rails_serve_static_assets (0.0.5) + rails_stdout_logging (0.0.5) railties (4.2.7) actionpack (= 4.2.7) activesupport (= 4.2.7) @@ -199,8 +205,10 @@ DEPENDENCIES minitest-reporters omniauth omniauth-github + pg pry rails (= 4.2.7) + rails_12factor sass-rails (~> 5.0) sdoc (~> 0.4.0) spring From 13ad3dc80c5232ace80e09c7368d54d38d9d4f69 Mon Sep 17 00:00:00 2001 From: Miriam Cortes Date: Fri, 21 Oct 2016 11:28:26 -0700 Subject: [PATCH 056/191] logout button not routing correctly but showing when it's supposed to --- app/controllers/sessions_controller.rb | 1 + app/views/layouts/application.html.erb | 5 +---- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index aedefa8756..608769acb5 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -33,5 +33,6 @@ def create_merchant def destroy session[:merchant_id] = nil + redirect_to root_path end end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index a0b7aa669e..b510981e3e 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -9,10 +9,7 @@
<% if @merchant %> -

Welcome, <%= @merchant.name %>

-
    -
  • <%#= link_to("Log out", merchant_logout_path) %>
  • -
+ <%= link_to("Log out", 'sessions/destroy') %> <% else %>
  • <%= link_to("log in via Github", "/auth/github") %>
  • From b976468e8e0f4e0697f35251d46d48bb99a0bd3f Mon Sep 17 00:00:00 2001 From: Miriam Cortes Date: Fri, 21 Oct 2016 11:32:16 -0700 Subject: [PATCH 057/191] gemfile for heroku --- Gemfile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index a6bd668648..8c96600c9b 100644 --- a/Gemfile +++ b/Gemfile @@ -4,11 +4,13 @@ source 'https://rubygems.org' gem "awesome_print" gem "omniauth" gem "omniauth-github" +gem 'pg', group: :production +gem 'rails_12factor', group: :production # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' gem 'rails', '4.2.7' # Use sqlite3 as the database for Active Record -gem 'sqlite3' +gem 'sqlite3', group: [:development, :test] # Use SCSS for stylesheets gem 'sass-rails', '~> 5.0' # Use Uglifier as compressor for JavaScript assets From 52042a25b11e6f1e46c743e4ebd35b1367e6e99c Mon Sep 17 00:00:00 2001 From: Miriam Cortes Date: Fri, 21 Oct 2016 11:36:01 -0700 Subject: [PATCH 058/191] gemfile lock --- Gemfile.lock | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Gemfile.lock b/Gemfile.lock index 6b9bf3f0ef..a712c87090 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -113,6 +113,7 @@ GEM omniauth-oauth2 (1.4.0) oauth2 (~> 1.0) omniauth (~> 1.2) + pg (0.19.0) pry (0.10.4) coderay (~> 1.1.0) method_source (~> 0.8.1) @@ -139,6 +140,11 @@ GEM rails-deprecated_sanitizer (>= 1.0.1) rails-html-sanitizer (1.0.3) loofah (~> 2.0) + rails_12factor (0.0.3) + rails_serve_static_assets + rails_stdout_logging + rails_serve_static_assets (0.0.5) + rails_stdout_logging (0.0.5) railties (4.2.7) actionpack (= 4.2.7) activesupport (= 4.2.7) @@ -199,8 +205,10 @@ DEPENDENCIES minitest-reporters omniauth omniauth-github + pg pry rails (= 4.2.7) + rails_12factor sass-rails (~> 5.0) sdoc (~> 0.4.0) spring From db2ade46f2c6f458e4a25ff62a4c25807bc08404 Mon Sep 17 00:00:00 2001 From: Miriam Cortes Date: Fri, 21 Oct 2016 13:12:43 -0700 Subject: [PATCH 059/191] gemfile, wtf --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index a6bd668648..b368fb39e2 100644 --- a/Gemfile +++ b/Gemfile @@ -8,7 +8,7 @@ gem "omniauth-github" # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' gem 'rails', '4.2.7' # Use sqlite3 as the database for Active Record -gem 'sqlite3' +gem 'sqlite3', group: [:development, :test] # Use SCSS for stylesheets gem 'sass-rails', '~> 5.0' # Use Uglifier as compressor for JavaScript assets From f7635db66ca75595ef5f2b3ce0d23e9d870ff051 Mon Sep 17 00:00:00 2001 From: Miriam Cortes Date: Fri, 21 Oct 2016 13:15:22 -0700 Subject: [PATCH 060/191] I hate the gemfile --- Gemfile | 2 ++ Gemfile.lock | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/Gemfile b/Gemfile index b368fb39e2..8c96600c9b 100644 --- a/Gemfile +++ b/Gemfile @@ -4,6 +4,8 @@ source 'https://rubygems.org' gem "awesome_print" gem "omniauth" gem "omniauth-github" +gem 'pg', group: :production +gem 'rails_12factor', group: :production # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' gem 'rails', '4.2.7' diff --git a/Gemfile.lock b/Gemfile.lock index 6b9bf3f0ef..a712c87090 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -113,6 +113,7 @@ GEM omniauth-oauth2 (1.4.0) oauth2 (~> 1.0) omniauth (~> 1.2) + pg (0.19.0) pry (0.10.4) coderay (~> 1.1.0) method_source (~> 0.8.1) @@ -139,6 +140,11 @@ GEM rails-deprecated_sanitizer (>= 1.0.1) rails-html-sanitizer (1.0.3) loofah (~> 2.0) + rails_12factor (0.0.3) + rails_serve_static_assets + rails_stdout_logging + rails_serve_static_assets (0.0.5) + rails_stdout_logging (0.0.5) railties (4.2.7) actionpack (= 4.2.7) activesupport (= 4.2.7) @@ -199,8 +205,10 @@ DEPENDENCIES minitest-reporters omniauth omniauth-github + pg pry rails (= 4.2.7) + rails_12factor sass-rails (~> 5.0) sdoc (~> 0.4.0) spring From c64e15d4a88f07d3d6adc9d60a37df02b0f34f44 Mon Sep 17 00:00:00 2001 From: Miriam Cortes Date: Fri, 21 Oct 2016 13:24:03 -0700 Subject: [PATCH 061/191] I hate my life --- app/controllers/guests_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/guests_controller.rb b/app/controllers/guests_controller.rb index cba0e54caf..6d4f734a17 100644 --- a/app/controllers/guests_controller.rb +++ b/app/controllers/guests_controller.rb @@ -1,6 +1,6 @@ class GuestsController < ApplicationController - before_action :find_guest only: [:show] + before_action :find_guest, only: [:show] def index @guests = Guest.all end From 4382ffa6f08df6ade17a6f4fa9d80142283d5010 Mon Sep 17 00:00:00 2001 From: Miriam Cortes Date: Fri, 21 Oct 2016 13:27:55 -0700 Subject: [PATCH 062/191] wtf git, SERIOUSLY --- app/controllers/orders_controller.rb | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 6532780ffc..2cc1a158cb 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -14,12 +14,14 @@ def new def create end -def subtotal - @order.line_items do |line| - line_cost = @line.price * @line.qty - total_amount << line_cost - return total_amount -end + def subtotal + @order.line_items do |line| + line_cost = @line.price * @line.qty + total_amount << line_cost + return total_amount + end + end + def total_amount subtotal total_amount.inject { |result, element| result + element } From 19c90eb9a52dd5028ca5bdff9020386a36414f2a Mon Sep 17 00:00:00 2001 From: Miriam Cortes Date: Fri, 21 Oct 2016 13:30:50 -0700 Subject: [PATCH 063/191] thank god for TAs --- app/controllers/orders_controller.rb | 43 ++++++++++++++-------------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 2cc1a158cb..677629f0f9 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -21,7 +21,7 @@ def subtotal return total_amount end end - + def total_amount subtotal total_amount.inject { |result, element| result + element } @@ -42,22 +42,23 @@ def destroy def guest_create_cart if current_merchant.nil? && if @order.guest_id.nil? - @guest = Guest.new - @guest.save - @order = Order.new - @order.guest_id = @guest.id - @order.order_status = "pending" - @order.save - @line = LineItem.new - @line.order_id = @order.id - @line.product_id = params[:products][:product_id] - @line.merchant_id = params[:products][:merchant_id] - @line.qty = params[:qty] - @line.price = params[:products][:price] - @line.save - else - add_to_cart + @guest = Guest.new + @guest.save + @order = Order.new + @order.guest_id = @guest.id + @order.order_status = "pending" + @order.save + @line = LineItem.new + @line.order_id = @order.id + @line.product_id = params[:products][:product_id] + @line.merchant_id = params[:products][:merchant_id] + @line.qty = params[:qty] + @line.price = params[:products][:price] + @line.save + else + add_to_cart end + end def add_to_cart @line = LineItem.new @line.order_id = @order.id @@ -66,10 +67,10 @@ def add_to_cart @line.qty = params[:qty] @line.price = params[:products][:price] @line.save - end + end - def remove_from_cart - @line = @order.line_items.find(params[:id]) - @line.id.destroy(params[:id].to_i) - end + def remove_from_cart + @line = @order.line_items.find(params[:id]) + @line.id.destroy(params[:id].to_i) + end end From bdae86d559c648e2a4c2df653ee98064ebb22e8f Mon Sep 17 00:00:00 2001 From: Miriam Cortes Date: Fri, 21 Oct 2016 13:35:33 -0700 Subject: [PATCH 064/191] please, PLEASEEEEE --- app/controllers/orders_controller.rb | 143 +++++++++++++-------------- 1 file changed, 69 insertions(+), 74 deletions(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 677629f0f9..360c3cf388 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -1,76 +1,71 @@ class OrdersController < ApplicationController - def index - @orders = Order.all - end - - def view_cart - - - end - - def new - end - - def create - end - - def subtotal - @order.line_items do |line| - line_cost = @line.price * @line.qty - total_amount << line_cost - return total_amount - end - end - - def total_amount - subtotal - total_amount.inject { |result, element| result + element } - return result - end - - - - - def edit - end - - def update - end - - def destroy - end - - def guest_create_cart - if current_merchant.nil? && if @order.guest_id.nil? - @guest = Guest.new - @guest.save - @order = Order.new - @order.guest_id = @guest.id - @order.order_status = "pending" - @order.save - @line = LineItem.new - @line.order_id = @order.id - @line.product_id = params[:products][:product_id] - @line.merchant_id = params[:products][:merchant_id] - @line.qty = params[:qty] - @line.price = params[:products][:price] - @line.save - else - add_to_cart - end - end - def add_to_cart - @line = LineItem.new - @line.order_id = @order.id - @line.product_id = params[:products][:product_id] - @line.merchant_id = params[:products][:merchant_id] - @line.qty = params[:qty] - @line.price = params[:products][:price] - @line.save - end - - def remove_from_cart - @line = @order.line_items.find(params[:id]) - @line.id.destroy(params[:id].to_i) - end + # def index + # @orders = Order.all + # end + # + # def view_cart + # end + # + # def new + # end + # + # def create + # end + # + # def subtotal + # @order.line_items do |line| + # line_cost = @line.price * @line.qty + # total_amount << line_cost + # return total_amount + # end + # end + # + # def total_amount + # subtotal + # total_amount.inject { |result, element| result + element } + # return result + # end + # + # def edit + # end + # + # def update + # end + # + # def destroy + # end + # + # def guest_create_cart + # if current_merchant.nil? && @order.guest_id.nil? + # @guest = Guest.new + # @guest.save + # @order = Order.new + # @order.guest_id = @guest.id + # @order.order_status = "pending" + # @order.save + # @line = LineItem.new + # @line.order_id = @order.id + # @line.product_id = params[:products][:product_id] + # @line.merchant_id = params[:products][:merchant_id] + # @line.qty = params[:qty] + # @line.price = params[:products][:price] + # @line.save + # else + # add_to_cart + # end + # end + # def add_to_cart + # @line = LineItem.new + # @line.order_id = @order.id + # @line.product_id = params[:products][:product_id] + # @line.merchant_id = params[:products][:merchant_id] + # @line.qty = params[:qty] + # @line.price = params[:products][:price] + # @line.save + # end + # + # def remove_from_cart + # @line = @order.line_items.find(params[:id]) + # @line.id.destroy(params[:id].to_i) + # end end From 5df596fd877b3b3ecc3cde9b9ca3cf52500649d4 Mon Sep 17 00:00:00 2001 From: Nina Mutty Date: Fri, 21 Oct 2016 13:57:46 -0700 Subject: [PATCH 065/191] updated routes so products are nested in merchants --- app/controllers/application_controller.rb | 5 ++-- app/controllers/products_controller.rb | 28 ++++++++++++++--------- app/controllers/reviews_controller.rb | 19 +++++++++++---- app/views/merchants/show.html.erb | 6 ++--- app/views/products/all_products.html.erb | 12 ++++++++++ app/views/products/index.html.erb | 10 ++++---- app/views/products/show.html.erb | 18 ++++++++++----- config/routes.rb | 14 ++++++++---- 8 files changed, 75 insertions(+), 37 deletions(-) create mode 100644 app/views/products/all_products.html.erb diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 946b7d4904..4583102840 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -6,12 +6,11 @@ class ApplicationController < ActionController::Base helper_method :current_merchant, :current_guest def current_merchant - @current_merchant ||= Merchant.find_by(id: session[:merchant_id]) + @current_merchant ||= Merchant.find_by(id: session[:merchant_id].to_i) end def current_guest - @current_guest ||= Guest.find_by(id: session[:user_id]) + @current_guest ||= Guest.find_by(id: session[:user_id].to_i) end - end diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 2d31a35d5b..115d86118d 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -1,11 +1,15 @@ class ProductsController < ApplicationController before_action :find_product, only: [:show, :edit, :update] - # before_action :find_merchant, only: [:new, :create, :edit, :update] + before_action :find_merchant - def index + def all_products @products = Product.all end + def index + @products = Product.where(merchant_id: @merchant.id) + end + def show @reviews = @product.reviews.order('stars desc, id').limit(3) @line_item = LineItem.new ### OR Line.new @@ -13,37 +17,39 @@ def show def new @product = Product.new - @post_path = products_path + @post_path = merchant_products_path@merchant.id @post_method = :post end def create + @params = params @product = Product.new(product_params) # @product.merchant_id = @merchant.id @product.rating = nil + @product.merchant_id = @merchant.id if @product.save - redirect_to product_path(@product.id) + redirect_to merchant_product_path(@merchant.id, @product.id) else @error = "Did not save successfully. Please try again." - @post_path = products_path + @post_path = merchant_products_path @post_method = :post render :new end end def edit - @post_path = product_path + @post_path = merchant_product_path(@merchant.id) @post_method = :put end def update if @product.update(product_params) @product.rating - redirect_to product_path(@product.id) + redirect_to merchant_product_path(@merchant.id, @product.id) else @error = "Did not save successfully. Please try again." - @post_path = product_path(@product.id) + @post_path = merchant_product_path(@merchant.id, @product.id) @post_method = :put render :edit end @@ -53,7 +59,7 @@ def destroy @product = find_product if @product.class == Product @product.destroy - redirect_to products_path + redirect_to merchant_products_path(@merchant.id) end end @@ -68,8 +74,8 @@ def find_product end def find_merchant - if Merchant.exists?(params[:id].to_i) == true - return @merchant = Merchant.find(params[:id].to_i) + if Merchant.exists?(params[:merchant_id].to_i) == true + return @merchant = Merchant.find(params[:merchant_id].to_i) else render :status => 404 end diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index 02b1457b58..aae27e570e 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -1,4 +1,5 @@ class ReviewsController < ApplicationController + before_action :find_merchant before_action :find_product before_action :find_review, only: [:show, :edit, :update, :destroy] @@ -12,7 +13,7 @@ def show def new @review = Review.new - @post_path = product_reviews_path + @post_path = merchant_product_reviews_path @post_method = :post end @@ -21,10 +22,10 @@ def create @review.product_id = @product.id if @review.save - redirect_to product_path(@product.id) + redirect_to merchant_product_path(@merchant.id, @product.id) else @error = "Did not save successfully. Please try again." - @post_path = product_reviews_path + @post_path = merchant_product_reviews_path @post_method = :post render :new end @@ -40,11 +41,12 @@ def destroy @review = find_review if @review.class == Review @review.destroy - redirect_to product_path(@product.id) + redirect_to merchant_product_path(@product.id) end end private + def find_product if Product.exists?(params[:product_id].to_i) == true return @product = Product.find(params[:product_id].to_i) @@ -53,6 +55,15 @@ def find_product end end + def find_merchant + find_product + if Merchant.exists?(@product.merchant_id) == true + return @merchant = Merchant.find(@product.merchant_id) + else + render :status => 404 + end + end + def find_review if Review.exists?(params[:id].to_i) == true return @review = Review.find(params[:id].to_i) diff --git a/app/views/merchants/show.html.erb b/app/views/merchants/show.html.erb index e93e469955..698bd083fb 100644 --- a/app/views/merchants/show.html.erb +++ b/app/views/merchants/show.html.erb @@ -1,8 +1,8 @@

    -

    <%= button_to 'Add a Product', new_product_path(params[:id]), class: "button", method: :get %>

    -

    <%= button_to 'View Products', merchant_products_path(params[:id]), class: "button", method: :get %>

    +

    <%= button_to 'Add a Product', new_merchant_product_path(@merchant.id, params[:product_id]), class: "button", method: :get %>

    +

    <%= button_to 'View Products', merchant_products_path(@merchant.id, params[:id]), class: "button", method: :get %>

    <%= button_to 'Add a Category', new_category_path(params[:id]), class: "button", method: :get %>

    @@ -18,7 +18,7 @@
<% order.products.each do |product| %> - + <% end %> diff --git a/app/views/products/all_products.html.erb b/app/views/products/all_products.html.erb new file mode 100644 index 0000000000..986cc18146 --- /dev/null +++ b/app/views/products/all_products.html.erb @@ -0,0 +1,12 @@ +

See All NotYetsy Products

+ +<% @products.each do |product| %> +
+

<%= link_to product.name, merchant_product_path(@merchant.id, product.id) %>

+

<%= image_tag(product.image, size: "200x300", alt: "Photo of #{product.name}.") %>

+
+<% end %> + +<% if :current_merchant == true %> +

<%= link_to "Add New Product", new_merchant_product_path(@merchant.id) %>

+<% end %> diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index 4b616da3c5..4817b7cc9d 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -1,12 +1,12 @@ -

See All NotYetsy Products

+

See NotYetsy Products for <%= @merchant.name %>

<% @products.each do |product| %>
-

<%= link_to product.name, product_path(product.id) %>

+

<%= link_to product.name, merchant_product_path(@merchant.id, product.id) %>

<%= image_tag(product.image, size: "200x300", alt: "Photo of #{product.name}.") %>

<% end %> -

- <%= link_to "Add New Product", new_product_path %> -

+<% if :current_merchant == true %> +

<%= link_to "Add New Product", new_merchant_product_path(@merchant.id) %>

+<% end %> diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index f9bdfc951d..4edcda50f9 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -1,3 +1,5 @@ +

<%= @params %>

+

<%= @product.name %>

<%= image_tag(@product.image, size: "200x275", alt: "Photo of #{@product.name}.") %>

Description: <%= @product.description %>

@@ -5,9 +7,13 @@

Inventory: <%= @product.inventory %>

Rating: <%= @product.rating == nil ? "Not Yet Rated!" : star_string(@product.rating) %>

-<%# IF it's a merchant ONLY %> -

<%= button_to "Edit Product", {controller: 'products', action: 'edit'}, path: 'edit_product', method: :get%>

-

<%= button_to "Delete Product", {controller: 'products', action: 'destroy'}, path: 'product', method: :delete, data: {confirm: "Are you sure?"}%>

+<%= @current_merchant %> +<% if @product.merchant != :current_merchant %> +

<%= button_to "Edit Product", {controller: 'products', action: 'edit'}, path: 'edit_merchant_product', method: :get%>

+

<%= button_to "Delete Product", {controller: 'products', action: 'destroy'}, path: 'merchant_product', method: :delete, data: {confirm: "Are you sure?"}%>

+<% end %> + + <%= form_for @line_item, method: :post, @@ -32,11 +38,11 @@ <% end %> <% end %> -

<%= link_to 'See All Product Reviews!', product_reviews_path(@product.id) %>

-

<%= link_to 'Add A Review!', new_product_review_path(@product.id) %>

<%# Don't allow a merchant to add their own product review %> +

<%= link_to 'See All Product Reviews!', merchant_product_reviews_path(@merchant.id, @product.id) %>

+

<%= link_to 'Add A Review!', new_merchant_product_review_path(@merchant.id, @product.id) %>

<%# Don't allow a merchant to add their own product review %>

- <%= link_to 'See All Products', products_path %> + <%= link_to 'See All Products', all_products_path %>

diff --git a/config/routes.rb b/config/routes.rb index be6a83ef07..59c0aa5cbf 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -8,22 +8,26 @@ # You can have the root of your site routed with "root" # root 'welcome#index' -root to: 'products#index' +root to: 'products#all_products' - resources :products do - resources :reviews + resources :merchants do + resources :products do + resources :reviews + end end resources :categories resources :guests - resources :merchants + #resources :merchants resources :orders get 'sessions/create' get 'sessions/destroy' - get 'merchants/:id/products' => 'merchants#show_merchant_products', as: 'merchant_products' + get 'products/all_products' => 'products#all_products', as: 'all_products' + + # get 'merchants/:id/products' => 'merchants#show_merchant_products', as: 'merchant_products' end From f52e40696b2ea553029a4080930b3d2ca7f05642 Mon Sep 17 00:00:00 2001 From: Miriam Cortes Date: Fri, 21 Oct 2016 14:32:43 -0700 Subject: [PATCH 066/191] please go to my branch --- app/controllers/sessions_controller.rb | 5 +++-- app/views/layouts/application.html.erb | 2 +- config/routes.rb | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index aedefa8756..63b21538d7 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -18,8 +18,8 @@ def create end def create_merchant - end + # def login # session[:merchant_id] = 1 # redirect_to '/products/index' @@ -27,11 +27,12 @@ def create_merchant # # def logout # session[:merchant_id] = nil - # redirect_to '/products/index' + # redirect_to root_path # end def destroy session[:merchant_id] = nil + redirect_to root_path end end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index a0b7aa669e..133055235b 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -11,7 +11,7 @@ <% if @merchant %>

Welcome, <%= @merchant.name %>

    -
  • <%#= link_to("Log out", merchant_logout_path) %>
  • +
  • <%= link_to("Log out", merchant_logout_path) %>
<% else %>
    diff --git a/config/routes.rb b/config/routes.rb index be6a83ef07..cec3ac48bf 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -21,7 +21,7 @@ get 'sessions/create' - get 'sessions/destroy' + delete 'sessions/destroy' => 'sessions#destroy' get 'merchants/:id/products' => 'merchants#show_merchant_products', as: 'merchant_products' From 074ecdb955e388e6679b80cad87cbfdf6c85d271 Mon Sep 17 00:00:00 2001 From: Miriam Cortes Date: Fri, 21 Oct 2016 14:53:50 -0700 Subject: [PATCH 067/191] logout working --- app/views/layouts/application.html.erb | 2 +- app/views/merchants/show.html.erb | 4 +--- config/routes.rb | 4 +--- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index b510981e3e..ee3c7053c5 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -9,7 +9,7 @@
    <% if @merchant %> - <%= link_to("Log out", 'sessions/destroy') %> + <%= link_to("Log out", 'sessions/destroy', method: :delete) %> <% else %>
    • <%= link_to("log in via Github", "/auth/github") %>
    • diff --git a/app/views/merchants/show.html.erb b/app/views/merchants/show.html.erb index e93e469955..c8eb60173d 100644 --- a/app/views/merchants/show.html.erb +++ b/app/views/merchants/show.html.erb @@ -1,6 +1,4 @@ -

      - - +### MERCHANT SHOW VIEW ###

      <%= button_to 'Add a Product', new_product_path(params[:id]), class: "button", method: :get %>

      <%= button_to 'View Products', merchant_products_path(params[:id]), class: "button", method: :get %>

      <%= button_to 'Add a Category', new_category_path(params[:id]), class: "button", method: :get %>

      diff --git a/config/routes.rb b/config/routes.rb index be6a83ef07..56b238e463 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -13,7 +13,7 @@ resources :products do resources :reviews end - + delete 'merchants/sessions/destroy' => 'sessions#destroy' resources :categories resources :guests resources :merchants @@ -21,8 +21,6 @@ get 'sessions/create' - get 'sessions/destroy' - get 'merchants/:id/products' => 'merchants#show_merchant_products', as: 'merchant_products' From cb522863a0e00956559cad0b669d013b709e853a Mon Sep 17 00:00:00 2001 From: Olivia Date: Fri, 21 Oct 2016 15:20:55 -0700 Subject: [PATCH 068/191] added so user can only add new category if logged in --- app/views/categories/index.html.erb | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/app/views/categories/index.html.erb b/app/views/categories/index.html.erb index e88fb59873..b5d048b638 100644 --- a/app/views/categories/index.html.erb +++ b/app/views/categories/index.html.erb @@ -4,12 +4,15 @@
      <%= link_to(category.name, category_path(category.id)) %>

      <% end %> -

      Add a New Category

      -<%= form_for @new_category, url: categories_path do |f| %> +<% if current_merchant != nil %> - <%= f.label :name %> - <%= f.text_field :name %> +

      <%= 'Add a New Category' %>

      + <%= form_for @new_category, url: categories_path do |f| %> -<%= f.submit %> + <%= f.label :name %> + <%= f.text_field :name %> + <%= f.submit %> + + <% end %> <% end %> From 4b3ffe7443802efc9e8c0a21e77e731fd2e92b05 Mon Sep 17 00:00:00 2001 From: Miriam Cortes Date: Fri, 21 Oct 2016 15:54:24 -0700 Subject: [PATCH 069/191] merchant models added --- app/models/merchant.rb | 14 +++++++++++++- app/views/merchants/show.html.erb | 5 ++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/app/models/merchant.rb b/app/models/merchant.rb index 56b3f21f44..5aa5ce0d39 100644 --- a/app/models/merchant.rb +++ b/app/models/merchant.rb @@ -20,7 +20,19 @@ def self.build_from_github(auth_hash) def revenue_paid_orders revenue_total = 0.0 orders.each do |order| - revenue_total += order.total_amount + if order.order_status == "paid" + revenue_total += order.total_amount + end + end + return revenue_total + end + + def revenue_pending_orders + revenue_total = 0.0 + orders.each do |order| + if order.order_status == "pending" + revenue_total += order.total_amount + end end return revenue_total end diff --git a/app/views/merchants/show.html.erb b/app/views/merchants/show.html.erb index c8eb60173d..80f07d3f55 100644 --- a/app/views/merchants/show.html.erb +++ b/app/views/merchants/show.html.erb @@ -1,4 +1,4 @@ -### MERCHANT SHOW VIEW ### +<%# ### MERCHANT SHOW VIEW ### %>

      <%= button_to 'Add a Product', new_product_path(params[:id]), class: "button", method: :get %>

      <%= button_to 'View Products', merchant_products_path(params[:id]), class: "button", method: :get %>

      <%= button_to 'Add a Category', new_category_path(params[:id]), class: "button", method: :get %>

      @@ -31,8 +31,7 @@

      Revenue

      Total Revenue for Pending Orders:

      $ - <%# if %> - <%#= sprintf "%.2f", @merchant.revenue_paid_orders %>

      + <%= sprintf "%.2f", @merchant.revenue_pending_orders %>

      Total Revenue for Paid Orders:

      $ <%= sprintf "%.2f", @merchant.revenue_paid_orders %>

      Total Revenue for Cancelled Orders:

      From b75b7883c993734fdfa17385b2b574abdf081800 Mon Sep 17 00:00:00 2001 From: Nina Mutty Date: Fri, 21 Oct 2016 15:55:05 -0700 Subject: [PATCH 070/191] edited seed file headers and nested routes --- app/controllers/application_controller.rb | 2 +- app/controllers/merchants_controller.rb | 2 +- app/controllers/products_controller.rb | 2 +- app/controllers/sessions_controller.rb | 2 +- app/views/layouts/application.html.erb | 3 +-- app/views/products/all_products.html.erb | 6 +----- app/views/products/index.html.erb | 2 +- app/views/products/show.html.erb | 3 +-- seeds_csvs/category.csv | 1 - seeds_csvs/guests.csv | 1 - seeds_csvs/merchant.csv | 1 - seeds_csvs/orders.csv | 1 - seeds_csvs/product_categories.csv | 1 - seeds_csvs/products.csv | 1 - seeds_csvs/products_orders.csv | 1 - seeds_csvs/reviews.csv | 1 - 16 files changed, 8 insertions(+), 22 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 4583102840..38a2cdfea2 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -6,7 +6,7 @@ class ApplicationController < ActionController::Base helper_method :current_merchant, :current_guest def current_merchant - @current_merchant ||= Merchant.find_by(id: session[:merchant_id].to_i) + return @current_merchant ||= Merchant.find_by(id: session[:merchant_id].to_i) end def current_guest diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index 23e916344d..b481cb990b 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -40,6 +40,6 @@ def merchant_params end def find_merchant - @merchant = Merchant.find_by(id: session[:merchant_id]) + @merchant = Merchant.find_by(id: session[:merchant_id].to_i) end end diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 115d86118d..415d8fd5de 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -1,6 +1,6 @@ class ProductsController < ApplicationController before_action :find_product, only: [:show, :edit, :update] - before_action :find_merchant + before_action :find_merchant, except: [:all_products] def all_products @products = Product.all diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index aedefa8756..5bd50ddace 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -12,7 +12,7 @@ def create end #Save the merchant ID in the session - session[:merchant_id] = @merchant.id + session[:merchant_id] = @merchant.id.to_i redirect_to merchant_path(@merchant.id) end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index a0b7aa669e..7a361a439d 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -8,8 +8,7 @@
      - <% if @merchant %> -

      Welcome, <%= @merchant.name %>

      + <% if current_merchant != nil %>
      • <%#= link_to("Log out", merchant_logout_path) %>
      diff --git a/app/views/products/all_products.html.erb b/app/views/products/all_products.html.erb index 986cc18146..ba377ddecd 100644 --- a/app/views/products/all_products.html.erb +++ b/app/views/products/all_products.html.erb @@ -2,11 +2,7 @@ <% @products.each do |product| %>
      -

      <%= link_to product.name, merchant_product_path(@merchant.id, product.id) %>

      +

      <%= link_to product.name, merchant_product_path(product.merchant_id, product.id) %>

      <%= image_tag(product.image, size: "200x300", alt: "Photo of #{product.name}.") %>

      <% end %> - -<% if :current_merchant == true %> -

      <%= link_to "Add New Product", new_merchant_product_path(@merchant.id) %>

      -<% end %> diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index 4817b7cc9d..82d2ca9263 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -7,6 +7,6 @@ <% end %> -<% if :current_merchant == true %> +<% if current_merchant == true %>

      <%= link_to "Add New Product", new_merchant_product_path(@merchant.id) %>

      <% end %> diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 4edcda50f9..41201c4369 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -7,8 +7,7 @@

      Inventory: <%= @product.inventory %>

      Rating: <%= @product.rating == nil ? "Not Yet Rated!" : star_string(@product.rating) %>

      -<%= @current_merchant %> -<% if @product.merchant != :current_merchant %> +<% if @product.merchant == current_merchant %>

      <%= button_to "Edit Product", {controller: 'products', action: 'edit'}, path: 'edit_merchant_product', method: :get%>

      <%= button_to "Delete Product", {controller: 'products', action: 'destroy'}, path: 'merchant_product', method: :delete, data: {confirm: "Are you sure?"}%>

      <% end %> diff --git a/seeds_csvs/category.csv b/seeds_csvs/category.csv index 9ca067a746..94880a5433 100644 --- a/seeds_csvs/category.csv +++ b/seeds_csvs/category.csv @@ -1,4 +1,3 @@ -id,name 1,discrete 2,Reduced 3,intangible diff --git a/seeds_csvs/guests.csv b/seeds_csvs/guests.csv index 7d19edffc0..b0a5348817 100644 --- a/seeds_csvs/guests.csv +++ b/seeds_csvs/guests.csv @@ -1,4 +1,3 @@ -id,name,email 1,Carlos Howard,choward0@oracle.com 2,Rose Reid,rreid1@usda.gov 3,Michael Brown,mbrown2@networksolutions.com diff --git a/seeds_csvs/merchant.csv b/seeds_csvs/merchant.csv index cb8ff0215d..3492f7430c 100644 --- a/seeds_csvs/merchant.csv +++ b/seeds_csvs/merchant.csv @@ -1,4 +1,3 @@ -id,name,email,password 1,merchant 1,rgeorge0@adobe.com,A1s5KLpTiyu 2,merchant 2,dwilson1@gizmodo.com,2kIBWgyznWY 3,merchant 3,dcastillo2@nsw.gov.au,RYshSYKG diff --git a/seeds_csvs/orders.csv b/seeds_csvs/orders.csv index 15cec6befe..fd4d358277 100644 --- a/seeds_csvs/orders.csv +++ b/seeds_csvs/orders.csv @@ -1,4 +1,3 @@ -id,guest_name,total_amount,merchant_id,card_name,card_number,card_exp,card_cvv,billing_zip,shipping_street,shipping_city,shipping_state,shipping_zip,order_status 1,Heather Martin,700,3,jcb,3544153313003422,06/16,121,12345,8 Blaine Trail,Milwaukee,Wisconsin,12345,paid 2,Ryan King,600,10,jcb,3535790488366570,02/16,221,12345,3421 Atwood Street,Milwaukee,Wisconsin,12345,pending 3,Scott Freeman,800,2,visa-electron,4844470197867465,03/16,321,12345,12980 Hudson Hill,Colorado Springs,Colorado,12345,cancelled diff --git a/seeds_csvs/product_categories.csv b/seeds_csvs/product_categories.csv index ac49a3e5a2..895eb0b3bc 100644 --- a/seeds_csvs/product_categories.csv +++ b/seeds_csvs/product_categories.csv @@ -1,4 +1,3 @@ -id,category_id,product_id 1,8,2 2,7,5 3,10,3 diff --git a/seeds_csvs/products.csv b/seeds_csvs/products.csv index 98c6214d9a..e5a47e8502 100644 --- a/seeds_csvs/products.csv +++ b/seeds_csvs/products.csv @@ -1,4 +1,3 @@ -id,name,description,price,image,inventory,merchant_id 1,product 1,description 1,37.04,http://placekitten.com/g/200/300,10,9 2,product 2,description 2,88.38,http://placekitten.com/g/200/300,13,3 3,product 3,description 3,11.71,http://placekitten.com/g/200/300,5,10 diff --git a/seeds_csvs/products_orders.csv b/seeds_csvs/products_orders.csv index 2d63af28c8..e7384e9f6c 100644 --- a/seeds_csvs/products_orders.csv +++ b/seeds_csvs/products_orders.csv @@ -1,4 +1,3 @@ -id,product_id,order_id 1,2,5 2,5,7 3,1,4 diff --git a/seeds_csvs/reviews.csv b/seeds_csvs/reviews.csv index 6c53526ed4..16443dca3f 100644 --- a/seeds_csvs/reviews.csv +++ b/seeds_csvs/reviews.csv @@ -1,4 +1,3 @@ -id,product_id,description,author,stars 1,3,sapien a libero nam dui proin leo,Louise Andrews,2 2,3,varius nulla facilisi cras non velit nec,Kimberly Stone,2 3,1,posuere felis sed lacus morbi sem mauris laoreet ut,Mark Myers,5 From 499b83963e10d18cdfbc0709204cd97a4eefdd68 Mon Sep 17 00:00:00 2001 From: Nina Mutty Date: Fri, 21 Oct 2016 16:26:40 -0700 Subject: [PATCH 071/191] Update products_controller.rb --- app/controllers/products_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 415d8fd5de..8e82751b3f 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -17,7 +17,7 @@ def show def new @product = Product.new - @post_path = merchant_products_path@merchant.id + @post_path = merchant_products_path(@merchant.id) @post_method = :post end From 69489550fc3f2c12eb6f6c06ef42ba1ccd437240 Mon Sep 17 00:00:00 2001 From: Nina Mutty Date: Fri, 21 Oct 2016 16:29:35 -0700 Subject: [PATCH 072/191] Update show.html.erb --- app/views/merchants/show.html.erb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/merchants/show.html.erb b/app/views/merchants/show.html.erb index 16c9f3f62b..b7d48cf77e 100644 --- a/app/views/merchants/show.html.erb +++ b/app/views/merchants/show.html.erb @@ -2,8 +2,8 @@

      <%= button_to 'Add a Product', new_merchant_product_path(@merchant.id, params[:product_id]), class: "button", method: :get %>

      <%= button_to 'View Products', merchant_products_path(@merchant.id, params[:id]), class: "button", method: :get %>

      <%# ### MERCHANT SHOW VIEW ### %> - + <%#

      <%= button_to 'Add a Product', new_product_path(params[:id]), class: "button", method: :get %>

      +

      <%= button_to 'View Products', merchant_products_path(params[:id]), class: "button", method: :get %>

      %>

      <%= button_to 'Add a Category', new_category_path(params[:id]), class: "button", method: :get %>

      From 122e74884b943a296b44093ff41d1ada416f8220 Mon Sep 17 00:00:00 2001 From: Miriam Date: Fri, 21 Oct 2016 16:30:26 -0700 Subject: [PATCH 073/191] Update show.html.erb --- app/views/merchants/show.html.erb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/merchants/show.html.erb b/app/views/merchants/show.html.erb index b7d48cf77e..05e73f111c 100644 --- a/app/views/merchants/show.html.erb +++ b/app/views/merchants/show.html.erb @@ -2,8 +2,8 @@

      <%= button_to 'Add a Product', new_merchant_product_path(@merchant.id, params[:product_id]), class: "button", method: :get %>

      <%= button_to 'View Products', merchant_products_path(@merchant.id, params[:id]), class: "button", method: :get %>

      <%# ### MERCHANT SHOW VIEW ### %> - <%#

      <%= button_to 'Add a Product', new_product_path(params[:id]), class: "button", method: :get %>

      -

      <%= button_to 'View Products', merchant_products_path(params[:id]), class: "button", method: :get %>

      %> +

      <%#= button_to 'Add a Product', new_product_path(params[:id]), class: "button", method: :get %>

      +

      <%#= button_to 'View Products', merchant_products_path(params[:id]), class: "button", method: :get %>

      <%= button_to 'Add a Category', new_category_path(params[:id]), class: "button", method: :get %>

      From d21ba0164a9c5524a5be40917f1300aa56aa6456 Mon Sep 17 00:00:00 2001 From: Nina Mutty Date: Fri, 21 Oct 2016 16:30:55 -0700 Subject: [PATCH 074/191] Update application_controller.rb --- app/controllers/application_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 38a2cdfea2..4583102840 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -6,7 +6,7 @@ class ApplicationController < ActionController::Base helper_method :current_merchant, :current_guest def current_merchant - return @current_merchant ||= Merchant.find_by(id: session[:merchant_id].to_i) + @current_merchant ||= Merchant.find_by(id: session[:merchant_id].to_i) end def current_guest From 83e504be5cf977db02ece14da6d4ebd318ac08d8 Mon Sep 17 00:00:00 2001 From: Miriam Date: Fri, 21 Oct 2016 16:32:35 -0700 Subject: [PATCH 075/191] Update index.html.erb --- app/views/products/index.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index 82d2ca9263..74ce723fe0 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -7,6 +7,6 @@
      <% end %> -<% if current_merchant == true %> +<% if current_merchant != nil %>

      <%= link_to "Add New Product", new_merchant_product_path(@merchant.id) %>

      <% end %> From ebcfbdd14408fecdd81b8e98a2beccc95e55a57d Mon Sep 17 00:00:00 2001 From: Nina Mutty Date: Fri, 21 Oct 2016 16:32:51 -0700 Subject: [PATCH 076/191] Update show.html.erb --- app/views/products/show.html.erb | 1 - 1 file changed, 1 deletion(-) diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 41201c4369..520e1ded8e 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -1,4 +1,3 @@ -

      <%= @params %>

      <%= @product.name %>

      <%= image_tag(@product.image, size: "200x275", alt: "Photo of #{@product.name}.") %>

      From d28494e9ef0a2ebd75d0781c4aaa0ae520f89a86 Mon Sep 17 00:00:00 2001 From: Miriam Cortes Date: Fri, 21 Oct 2016 17:50:49 -0700 Subject: [PATCH 077/191] fixed customer orders associations --- app/models/line_item.rb | 3 +++ app/models/merchant.rb | 5 ++++- app/models/order.rb | 4 ++-- app/models/product.rb | 4 ++-- 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/app/models/line_item.rb b/app/models/line_item.rb index 988324ce31..4202476d28 100644 --- a/app/models/line_item.rb +++ b/app/models/line_item.rb @@ -1,2 +1,5 @@ class LineItem < ActiveRecord::Base + belongs_to :product + belongs_to :order + end diff --git a/app/models/merchant.rb b/app/models/merchant.rb index 5aa5ce0d39..9407f33c41 100644 --- a/app/models/merchant.rb +++ b/app/models/merchant.rb @@ -1,7 +1,10 @@ # Merchant Model class Merchant < ActiveRecord::Base has_many :products - has_many :orders + has_many :placed_orders, :class_name => "Order" + has_many :orders, :through => :products + alias_attribute(:customer_orders, :orders) + validates :name, :email, presence: true validates :email, uniqueness: true diff --git a/app/models/order.rb b/app/models/order.rb index 1e2de9f96f..f958b8f1c3 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -1,7 +1,7 @@ class Order < ActiveRecord::Base - has_many :product_orders - has_many :products, :through => :product_orders has_many :line_items + # has_many :product_orders + has_many :products, :through => :line_items belongs_to :merchant belongs_to :guest end diff --git a/app/models/product.rb b/app/models/product.rb index 0c4b79a942..8f3389552c 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -1,6 +1,6 @@ class Product < ActiveRecord::Base - has_many :product_orders - has_many :orders, :through => :product_orders + has_many :line_items + has_many :orders, :through => :line_items has_many :product_categories has_many :categories, :through => :product_categories From e812f04eadbba2669940fe35fc32e752a7fa6f14 Mon Sep 17 00:00:00 2001 From: Nina Mutty Date: Mon, 24 Oct 2016 10:04:52 -0700 Subject: [PATCH 078/191] commented out pg gem --- Gemfile | 2 +- Gemfile.lock | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/Gemfile b/Gemfile index 8c96600c9b..7b503b78f0 100644 --- a/Gemfile +++ b/Gemfile @@ -4,7 +4,7 @@ source 'https://rubygems.org' gem "awesome_print" gem "omniauth" gem "omniauth-github" -gem 'pg', group: :production +#gem 'pg', group: :production gem 'rails_12factor', group: :production # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' diff --git a/Gemfile.lock b/Gemfile.lock index a712c87090..85e525ecc0 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -113,7 +113,6 @@ GEM omniauth-oauth2 (1.4.0) oauth2 (~> 1.0) omniauth (~> 1.2) - pg (0.19.0) pry (0.10.4) coderay (~> 1.1.0) method_source (~> 0.8.1) @@ -205,7 +204,6 @@ DEPENDENCIES minitest-reporters omniauth omniauth-github - pg pry rails (= 4.2.7) rails_12factor From bd7f6bc71980e5bd4835d214b75e2f2cc2693659 Mon Sep 17 00:00:00 2001 From: Nina Mutty Date: Mon, 24 Oct 2016 10:52:00 -0700 Subject: [PATCH 079/191] new review stars to dropdown and merchant can't review their own product' --- app/controllers/reviews_controller.rb | 14 +++++++++++++- app/helpers/application_helper.rb | 8 ++++++-- app/models/product.rb | 2 +- app/views/products/show.html.erb | 5 ++++- app/views/reviews/_reviewform.html.erb | 2 +- app/views/reviews/index.html.erb | 4 ++++ 6 files changed, 29 insertions(+), 6 deletions(-) diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index aae27e570e..25eff35d87 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -12,6 +12,10 @@ def show end def new + if current_merchant != nil && @merchant = current_merchant + flash[:notice] = "Cannot Review Your Own Product" + redirect_to merchant_product_path(@merchant.id, @product.id) + end @review = Review.new @post_path = merchant_product_reviews_path @post_method = :post @@ -32,16 +36,24 @@ def create end def edit + if @merchant.id = @product.merchant_id + flash[:notice] = "Cannot Review Your Own Product" + redirect_to merchant_product_path(@merchant.id, @product.id) + end end def update end def destroy + if @merchant.id = @product.merchant_id + flash[:notice] = "Cannot Delete Your Own Product's Reviews" + redirect_to merchant_product_path(@merchant.id, @product.id) + end @review = find_review if @review.class == Review @review.destroy - redirect_to merchant_product_path(@product.id) + redirect_to merchant_product_path(@merchant.id, @product.id) end end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 05abffa501..e7556d06b0 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -3,8 +3,12 @@ module ApplicationHelper def star_string(rating) printed_stars = "" - rating.times {|x| printed_stars << "★"} - (5-rating).times {|x| printed_stars << "☆"} + if rating == nil + printed_stars = "Not Yet Reviewed" + else + rating.times {|x| printed_stars << "★"} + (5-rating).times {|x| printed_stars << "☆"} + end printed_stars.html_safe end diff --git a/app/models/product.rb b/app/models/product.rb index 8f3389552c..3aef55144f 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -21,7 +21,7 @@ def rating return total_rating/reviews.length # Do we want the average to round up or down? Should I add one?? else - return total_rating + total_rating = nil end end diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 520e1ded8e..31bb083d81 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -37,7 +37,10 @@ <% end %>

      <%= link_to 'See All Product Reviews!', merchant_product_reviews_path(@merchant.id, @product.id) %>

      -

      <%= link_to 'Add A Review!', new_merchant_product_review_path(@merchant.id, @product.id) %>

      <%# Don't allow a merchant to add their own product review %> + +<% unless @product.merchant == current_merchant %> +

      <%= link_to 'Add A Review!', new_merchant_product_review_path(@merchant.id, @product.id) %>

      +<% end %>

      <%= link_to 'See All Products', all_products_path %> diff --git a/app/views/reviews/_reviewform.html.erb b/app/views/reviews/_reviewform.html.erb index 7909a80b9a..8b7282e0c9 100644 --- a/app/views/reviews/_reviewform.html.erb +++ b/app/views/reviews/_reviewform.html.erb @@ -4,7 +4,7 @@ url: @post_path do |f| %>

      <%= f.label :stars %> - <%= f.number_field :stars %> + <%= f.select(:stars, (0..5).map{|index| [star_string(index), index]}, {include_blank: true}) %>
      <%= f.label :description %> diff --git a/app/views/reviews/index.html.erb b/app/views/reviews/index.html.erb index 9bceb9b37d..e755bdcb04 100644 --- a/app/views/reviews/index.html.erb +++ b/app/views/reviews/index.html.erb @@ -9,3 +9,7 @@

      <%= button_to "Delete Review", {controller: 'reviews', action: 'destroy', product_id: @product.id, id: review.id}, method: :delete, data: {confirm: "Are you sure?"}%>

      <% end %> + +

      + <%= link_to "Back to Product", merchant_product_path(@merchant.id, @product.id) %> +

      From 2beac8dff4e22f5e30ed2294a6c18ae17df0e048 Mon Sep 17 00:00:00 2001 From: Miriam Cortes Date: Mon, 24 Oct 2016 11:01:11 -0700 Subject: [PATCH 080/191] login and out not working on heroku --- app/controllers/sessions_controller.rb | 1 + app/views/layouts/application.html.erb | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index 41b33db318..0b496ce848 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -8,6 +8,7 @@ def create if @merchant.nil? @merchant = Merchant.build_from_github(auth_hash) flash[:notice] = "Unable to save the Merchant" + raise return redirect_to root_path unless @merchant.save end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index f9cf1a7efc..2472a4cc9b 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -9,7 +9,7 @@
      <% if current_merchant != nil %> - <%= link_to("Log out", 'sessions/destroy', method: :delete) %> + <%= link_to("Log out", sessions_destroy_path, method: :delete) %> <% else %>
      • <%= link_to("log in via Github", "/auth/github") %>
      • From 99800f0b47842207ac4e2160f6b35ea1c1b27a24 Mon Sep 17 00:00:00 2001 From: Miriam Cortes Date: Mon, 24 Oct 2016 11:03:26 -0700 Subject: [PATCH 081/191] rescue thing --- app/controllers/sessions_controller.rb | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index 0b496ce848..5a9207f34c 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -8,8 +8,11 @@ def create if @merchant.nil? @merchant = Merchant.build_from_github(auth_hash) flash[:notice] = "Unable to save the Merchant" - raise - return redirect_to root_path unless @merchant.save + begin + return redirect_to root_path unless @merchant.save + rescue Exception => e + Rails.logger.error("unable to save with #{e.message}") + end end #Save the merchant ID in the session From 07a058345c85ec35d3487b508ce8df4b395b0377 Mon Sep 17 00:00:00 2001 From: Miriam Cortes Date: Mon, 24 Oct 2016 11:17:01 -0700 Subject: [PATCH 082/191] going to have to de-seed when we get ready for heroku --- app/controllers/sessions_controller.rb | 5 ----- 1 file changed, 5 deletions(-) diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index 5a9207f34c..996aa75158 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -8,11 +8,6 @@ def create if @merchant.nil? @merchant = Merchant.build_from_github(auth_hash) flash[:notice] = "Unable to save the Merchant" - begin - return redirect_to root_path unless @merchant.save - rescue Exception => e - Rails.logger.error("unable to save with #{e.message}") - end end #Save the merchant ID in the session From 962019bd7f9e197a9f28381095cf9f09c30fc476 Mon Sep 17 00:00:00 2001 From: Nina Mutty Date: Mon, 24 Oct 2016 11:38:51 -0700 Subject: [PATCH 083/191] updated price to type in a float --- app/controllers/products_controller.rb | 2 ++ app/views/products/_productform.html.erb | 2 +- app/views/products/show.html.erb | 4 ++-- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 8e82751b3f..34b7818d51 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -24,6 +24,7 @@ def new def create @params = params @product = Product.new(product_params) + @product.price = (product_params[:price].to_f * 100).to_i # @product.merchant_id = @merchant.id @product.rating = nil @product.merchant_id = @merchant.id @@ -45,6 +46,7 @@ def edit def update if @product.update(product_params) + @product.price = (product_params[:price].to_f * 100).to_i @product.rating redirect_to merchant_product_path(@merchant.id, @product.id) else diff --git a/app/views/products/_productform.html.erb b/app/views/products/_productform.html.erb index f2d5f1704c..7a3d00b5fc 100644 --- a/app/views/products/_productform.html.erb +++ b/app/views/products/_productform.html.erb @@ -12,7 +12,7 @@
        <%= f.label :price %> - <%= f.number_field :price %> + <%= f.text_field :price %>
        <%= f.label :inventory %> diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 31bb083d81..03f303db88 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -2,7 +2,7 @@

        <%= @product.name %>

        <%= image_tag(@product.image, size: "200x275", alt: "Photo of #{@product.name}.") %>

        Description: <%= @product.description %>

        -

        Price: $<%= '%.2f' % (@product.price/100) %>

        +

        Price: $<%= '%.2f' % (@product.price/100.00) %>

        Inventory: <%= @product.inventory %>

        Rating: <%= @product.rating == nil ? "Not Yet Rated!" : star_string(@product.rating) %>

        @@ -39,7 +39,7 @@

        <%= link_to 'See All Product Reviews!', merchant_product_reviews_path(@merchant.id, @product.id) %>

        <% unless @product.merchant == current_merchant %> -

        <%= link_to 'Add A Review!', new_merchant_product_review_path(@merchant.id, @product.id) %>

        +

        <%= link_to 'Add A Review!', new_merchant_product_review_path(@merchant.id, @product.id) %>

        <% end %>

        From 93f6681e2bd00d0891fd0771d7b6f55ce3087de8 Mon Sep 17 00:00:00 2001 From: Olivia Date: Mon, 24 Oct 2016 12:36:48 -0700 Subject: [PATCH 084/191] basic nav bar --- Gemfile | 2 +- Gemfile.lock | 2 -- app/controllers/application_controller.rb | 7 +++++++ app/views/layouts/application.html.erb | 10 ++++++++++ 4 files changed, 18 insertions(+), 3 deletions(-) diff --git a/Gemfile b/Gemfile index 8c96600c9b..7b503b78f0 100644 --- a/Gemfile +++ b/Gemfile @@ -4,7 +4,7 @@ source 'https://rubygems.org' gem "awesome_print" gem "omniauth" gem "omniauth-github" -gem 'pg', group: :production +#gem 'pg', group: :production gem 'rails_12factor', group: :production # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' diff --git a/Gemfile.lock b/Gemfile.lock index a712c87090..85e525ecc0 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -113,7 +113,6 @@ GEM omniauth-oauth2 (1.4.0) oauth2 (~> 1.0) omniauth (~> 1.2) - pg (0.19.0) pry (0.10.4) coderay (~> 1.1.0) method_source (~> 0.8.1) @@ -205,7 +204,6 @@ DEPENDENCIES minitest-reporters omniauth omniauth-github - pg pry rails (= 4.2.7) rails_12factor diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 4583102840..320a028f33 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -3,6 +3,7 @@ class ApplicationController < ActionController::Base # For APIs, you may want to use :null_session instead. protect_from_forgery with: :exception + before_action do define_category_variables(6) end helper_method :current_merchant, :current_guest def current_merchant @@ -13,4 +14,10 @@ def current_guest @current_guest ||= Guest.find_by(id: session[:user_id].to_i) end + def define_category_variables(limit) + @top_catgories = Category.order("lower(name) ASC").limit(limit) + @all_categories = Category.all + end + + end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index f9cf1a7efc..9a3b5dacf5 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -20,6 +20,16 @@

        <%= flash[:notice] %>

        <% end %> +
        + +
        +

      <%= greeting %>

      From 39407c39ffbc5bf1da7b8f89b9c79e5cb0c8fa27 Mon Sep 17 00:00:00 2001 From: Olivia Date: Mon, 24 Oct 2016 13:57:10 -0700 Subject: [PATCH 085/191] added foundation gem --- Gemfile | 4 +- Gemfile.lock | 17 + app/assets/javascripts/application.js | 10 + app/assets/stylesheets/_settings.scss | 574 ++++++++++++++++++ .../{application.css => application.scss} | 2 + .../stylesheets/foundation_and_overrides.scss | 52 ++ app/views/layouts/application.html.erb | 68 ++- 7 files changed, 695 insertions(+), 32 deletions(-) create mode 100644 app/assets/stylesheets/_settings.scss rename app/assets/stylesheets/{application.css => application.scss} (94%) create mode 100644 app/assets/stylesheets/foundation_and_overrides.scss diff --git a/Gemfile b/Gemfile index 7b503b78f0..abea4ecaf5 100644 --- a/Gemfile +++ b/Gemfile @@ -1,6 +1,8 @@ source 'https://rubygems.org' - +#Foundation Rails gem +gem 'foundation-rails' +gem 'jquery-turbolinks' gem "awesome_print" gem "omniauth" gem "omniauth-github" diff --git a/Gemfile.lock b/Gemfile.lock index 85e525ecc0..94d5a3e765 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -39,6 +39,10 @@ GEM ansi (1.5.0) arel (6.0.3) awesome_print (1.7.0) + babel-source (5.8.35) + babel-transpiler (0.7.0) + babel-source (>= 4.0, < 6) + execjs (~> 2.0) better_errors (2.1.1) coderay (>= 1.0.0) erubis (>= 2.6.6) @@ -65,6 +69,10 @@ GEM execjs (2.7.0) faraday (0.9.2) multipart-post (>= 1.2, < 3) + foundation-rails (6.2.4.0) + railties (>= 3.1.0) + sass (>= 3.3.0, < 3.5) + sprockets-es6 (>= 0.9.0) globalid (0.3.7) activesupport (>= 4.1.0) hashie (3.4.6) @@ -76,6 +84,9 @@ GEM rails-dom-testing (>= 1, < 3) railties (>= 4.2.0) thor (>= 0.14, < 2.0) + jquery-turbolinks (2.1.0) + railties (>= 3.1.0) + turbolinks json (1.8.3) jwt (1.5.6) loofah (2.0.3) @@ -169,6 +180,10 @@ GEM sprockets (3.7.0) concurrent-ruby (~> 1.0) rack (> 1, < 3) + sprockets-es6 (0.9.2) + babel-source (>= 5.8.11) + babel-transpiler + sprockets (>= 3.0.0) sprockets-rails (3.2.0) actionpack (>= 4.0) activesupport (>= 4.0) @@ -199,8 +214,10 @@ DEPENDENCIES byebug coffee-rails (~> 4.1.0) dotenv-rails + foundation-rails jbuilder (~> 2.0) jquery-rails + jquery-turbolinks minitest-reporters omniauth omniauth-github diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index e07c5a830f..038d8d7ecc 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -12,5 +12,15 @@ // //= require jquery //= require jquery_ujs +//= require foundation //= require turbolinks //= require_tree . + +$(function(){ $(document).foundation(); }); + +//= require foundation +$(document).foundation(); + +$(document).on('turbolinks:load', function() { + $(function(){ $(document).foundation(); }); +}); diff --git a/app/assets/stylesheets/_settings.scss b/app/assets/stylesheets/_settings.scss new file mode 100644 index 0000000000..703053eb9d --- /dev/null +++ b/app/assets/stylesheets/_settings.scss @@ -0,0 +1,574 @@ +// Foundation for Sites Settings +// ----------------------------- +// +// Table of Contents: +// +// 1. Global +// 2. Breakpoints +// 3. The Grid +// 4. Base Typography +// 5. Typography Helpers +// 6. Abide +// 7. Accordion +// 8. Accordion Menu +// 9. Badge +// 10. Breadcrumbs +// 11. Button +// 12. Button Group +// 13. Callout +// 14. Close Button +// 15. Drilldown +// 16. Dropdown +// 17. Dropdown Menu +// 18. Flex Video +// 19. Forms +// 20. Label +// 21. Media Object +// 22. Menu +// 23. Meter +// 24. Off-canvas +// 25. Orbit +// 26. Pagination +// 27. Progress Bar +// 28. Reveal +// 29. Slider +// 30. Switch +// 31. Table +// 32. Tabs +// 33. Thumbnail +// 34. Title Bar +// 35. Tooltip +// 36. Top Bar + +@import 'util/util'; + +// 1. Global +// --------- + +$global-font-size: 100%; +$global-width: rem-calc(1200); +$global-lineheight: 1.5; +$foundation-palette: ( + primary: #2199e8, + secondary: #777, + success: #3adb76, + warning: #ffae00, + alert: #ec5840, +); +$light-gray: #e6e6e6; +$medium-gray: #cacaca; +$dark-gray: #8a8a8a; +$black: #0a0a0a; +$white: #fefefe; +$body-background: $white; +$body-font-color: $black; +$body-font-family: 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif; +$body-antialiased: true; +$global-margin: 1rem; +$global-padding: 1rem; +$global-weight-normal: normal; +$global-weight-bold: bold; +$global-radius: 0; +$global-text-direction: ltr; +$global-flexbox: false; +$print-transparent-backgrounds: true; + +@include add-foundation-colors; + +// 2. Breakpoints +// -------------- + +$breakpoints: ( + small: 0, + medium: 640px, + large: 1024px, + xlarge: 1200px, + xxlarge: 1440px, +); +$breakpoint-classes: (small medium large); + +// 3. The Grid +// ----------- + +$grid-row-width: $global-width; +$grid-column-count: 12; +$grid-column-gutter: ( + small: 20px, + medium: 30px, +); +$grid-column-align-edge: true; +$block-grid-max: 8; + +// 4. Base Typography +// ------------------ + +$header-font-family: $body-font-family; +$header-font-weight: $global-weight-normal; +$header-font-style: normal; +$font-family-monospace: Consolas, 'Liberation Mono', Courier, monospace; +$header-sizes: ( + small: ( + 'h1': 24, + 'h2': 20, + 'h3': 19, + 'h4': 18, + 'h5': 17, + 'h6': 16, + ), + medium: ( + 'h1': 48, + 'h2': 40, + 'h3': 31, + 'h4': 25, + 'h5': 20, + 'h6': 16, + ), +); +$header-color: inherit; +$header-lineheight: 1.4; +$header-margin-bottom: 0.5rem; +$header-text-rendering: optimizeLegibility; +$small-font-size: 80%; +$header-small-font-color: $medium-gray; +$paragraph-lineheight: 1.6; +$paragraph-margin-bottom: 1rem; +$paragraph-text-rendering: optimizeLegibility; +$code-color: $black; +$code-font-family: $font-family-monospace; +$code-font-weight: $global-weight-normal; +$code-background: $light-gray; +$code-border: 1px solid $medium-gray; +$code-padding: rem-calc(2 5 1); +$anchor-color: $primary-color; +$anchor-color-hover: scale-color($anchor-color, $lightness: -14%); +$anchor-text-decoration: none; +$anchor-text-decoration-hover: none; +$hr-width: $global-width; +$hr-border: 1px solid $medium-gray; +$hr-margin: rem-calc(20) auto; +$list-lineheight: $paragraph-lineheight; +$list-margin-bottom: $paragraph-margin-bottom; +$list-style-type: disc; +$list-style-position: outside; +$list-side-margin: 1.25rem; +$list-nested-side-margin: 1.25rem; +$defnlist-margin-bottom: 1rem; +$defnlist-term-weight: $global-weight-bold; +$defnlist-term-margin-bottom: 0.3rem; +$blockquote-color: $dark-gray; +$blockquote-padding: rem-calc(9 20 0 19); +$blockquote-border: 1px solid $medium-gray; +$cite-font-size: rem-calc(13); +$cite-color: $dark-gray; +$keystroke-font: $font-family-monospace; +$keystroke-color: $black; +$keystroke-background: $light-gray; +$keystroke-padding: rem-calc(2 4 0); +$keystroke-radius: $global-radius; +$abbr-underline: 1px dotted $black; + +// 5. Typography Helpers +// --------------------- + +$lead-font-size: $global-font-size * 1.25; +$lead-lineheight: 1.6; +$subheader-lineheight: 1.4; +$subheader-color: $dark-gray; +$subheader-font-weight: $global-weight-normal; +$subheader-margin-top: 0.2rem; +$subheader-margin-bottom: 0.5rem; +$stat-font-size: 2.5rem; + +// 6. Abide +// -------- + +$abide-inputs: true; +$abide-labels: true; +$input-background-invalid: map-get($foundation-palette, alert); +$form-label-color-invalid: map-get($foundation-palette, alert); +$input-error-color: map-get($foundation-palette, alert); +$input-error-font-size: rem-calc(12); +$input-error-font-weight: $global-weight-bold; + +// 7. Accordion +// ------------ + +$accordion-background: $white; +$accordion-plusminus: true; +$accordion-item-color: foreground($accordion-background, $primary-color); +$accordion-item-background-hover: $light-gray; +$accordion-item-padding: 1.25rem 1rem; +$accordion-content-background: $white; +$accordion-content-border: 1px solid $light-gray; +$accordion-content-color: foreground($accordion-content-background, $body-font-color); +$accordion-content-padding: 1rem; + +// 8. Accordion Menu +// ----------------- + +$accordionmenu-arrows: true; +$accordionmenu-arrow-color: $primary-color; + +// 9. Badge +// -------- + +$badge-background: $primary-color; +$badge-color: foreground($badge-background); +$badge-padding: 0.3em; +$badge-minwidth: 2.1em; +$badge-font-size: 0.6rem; + +// 10. Breadcrumbs +// --------------- + +$breadcrumbs-margin: 0 0 $global-margin 0; +$breadcrumbs-item-font-size: rem-calc(11); +$breadcrumbs-item-color: $primary-color; +$breadcrumbs-item-color-current: $black; +$breadcrumbs-item-color-disabled: $medium-gray; +$breadcrumbs-item-margin: 0.75rem; +$breadcrumbs-item-uppercase: true; +$breadcrumbs-item-slash: true; + +// 11. Button +// ---------- + +$button-padding: 0.85em 1em; +$button-margin: 0 0 $global-margin 0; +$button-fill: solid; +$button-background: $primary-color; +$button-background-hover: scale-color($button-background, $lightness: -15%); +$button-color: $white; +$button-color-alt: $black; +$button-radius: $global-radius; +$button-sizes: ( + tiny: 0.6rem, + small: 0.75rem, + default: 0.9rem, + large: 1.25rem, +); +$button-opacity-disabled: 0.25; +$button-background-hover-lightness: -20%; +$button-hollow-hover-lightness: -50%; + +// 12. Button Group +// ---------------- + +$buttongroup-margin: 1rem; +$buttongroup-spacing: 1px; +$buttongroup-child-selector: '.button'; +$buttongroup-expand-max: 6; + +// 13. Callout +// ----------- + +$callout-background: $white; +$callout-background-fade: 85%; +$callout-border: 1px solid rgba($black, 0.25); +$callout-margin: 0 0 1rem 0; +$callout-padding: 1rem; +$callout-font-color: $body-font-color; +$callout-font-color-alt: $body-background; +$callout-radius: $global-radius; +$callout-link-tint: 30%; + +// 14. Close Button +// ---------------- + +$closebutton-position: right top; +$closebutton-offset-horizontal: 1rem; +$closebutton-offset-vertical: 0.5rem; +$closebutton-size: 2em; +$closebutton-lineheight: 1; +$closebutton-color: $dark-gray; +$closebutton-color-hover: $black; + +// 15. Drilldown +// ------------- + +$drilldown-transition: transform 0.15s linear; +$drilldown-arrows: true; +$drilldown-arrow-color: $primary-color; +$drilldown-background: $white; + +// 16. Dropdown +// ------------ + +$dropdown-padding: 1rem; +$dropdown-border: 1px solid $medium-gray; +$dropdown-font-size: 1rem; +$dropdown-width: 300px; +$dropdown-radius: $global-radius; +$dropdown-sizes: ( + tiny: 100px, + small: 200px, + large: 400px, +); + +// 17. Dropdown Menu +// ----------------- + +$dropdownmenu-arrows: true; +$dropdownmenu-arrow-color: $anchor-color; +$dropdownmenu-min-width: 200px; +$dropdownmenu-background: $white; +$dropdownmenu-border: 1px solid $medium-gray; + +// 18. Flex Video +// -------------- + +$flexvideo-margin-bottom: rem-calc(16); +$flexvideo-ratio: 4 by 3; +$flexvideo-ratio-widescreen: 16 by 9; + +// 19. Forms +// --------- + +$fieldset-border: 1px solid $medium-gray; +$fieldset-padding: rem-calc(20); +$fieldset-margin: rem-calc(18 0); +$legend-padding: rem-calc(0 3); +$form-spacing: rem-calc(16); +$helptext-color: $black; +$helptext-font-size: rem-calc(13); +$helptext-font-style: italic; +$input-prefix-color: $black; +$input-prefix-background: $light-gray; +$input-prefix-border: 1px solid $medium-gray; +$input-prefix-padding: 1rem; +$form-label-color: $black; +$form-label-font-size: rem-calc(14); +$form-label-font-weight: $global-weight-normal; +$form-label-line-height: 1.8; +$select-background: $white; +$select-triangle-color: $dark-gray; +$select-radius: $global-radius; +$input-color: $black; +$input-placeholder-color: $medium-gray; +$input-font-family: inherit; +$input-font-size: rem-calc(16); +$input-background: $white; +$input-background-focus: $white; +$input-background-disabled: $light-gray; +$input-border: 1px solid $medium-gray; +$input-border-focus: 1px solid $dark-gray; +$input-shadow: inset 0 1px 2px rgba($black, 0.1); +$input-shadow-focus: 0 0 5px $medium-gray; +$input-cursor-disabled: not-allowed; +$input-transition: box-shadow 0.5s, border-color 0.25s ease-in-out; +$input-number-spinners: true; +$input-radius: $global-radius; +$button-radius: $global-radius; + +// 20. Label +// --------- + +$label-background: $primary-color; +$label-color: foreground($label-background); +$label-font-size: 0.8rem; +$label-padding: 0.33333rem 0.5rem; +$label-radius: $global-radius; + +// 21. Media Object +// ---------------- + +$mediaobject-margin-bottom: $global-margin; +$mediaobject-section-padding: $global-padding; +$mediaobject-image-width-stacked: 100%; + +// 22. Menu +// -------- + +$menu-margin: 0; +$menu-margin-nested: 1rem; +$menu-item-padding: 0.7rem 1rem; +$menu-item-color-active: $white; +$menu-item-background-active: map-get($foundation-palette, primary); +$menu-icon-spacing: 0.25rem; + +// 23. Meter +// --------- + +$meter-height: 1rem; +$meter-radius: $global-radius; +$meter-background: $medium-gray; +$meter-fill-good: $success-color; +$meter-fill-medium: $warning-color; +$meter-fill-bad: $alert-color; + +// 24. Off-canvas +// -------------- + +$offcanvas-size: 250px; +$offcanvas-background: $light-gray; +$offcanvas-zindex: -1; +$offcanvas-transition-length: 0.5s; +$offcanvas-transition-timing: ease; +$offcanvas-fixed-reveal: true; +$offcanvas-exit-background: rgba($white, 0.25); +$maincontent-class: 'off-canvas-content'; +$maincontent-shadow: 0 0 10px rgba($black, 0.5); + +// 25. Orbit +// --------- + +$orbit-bullet-background: $medium-gray; +$orbit-bullet-background-active: $dark-gray; +$orbit-bullet-diameter: 1.2rem; +$orbit-bullet-margin: 0.1rem; +$orbit-bullet-margin-top: 0.8rem; +$orbit-bullet-margin-bottom: 0.8rem; +$orbit-caption-background: rgba($black, 0.5); +$orbit-caption-padding: 1rem; +$orbit-control-background-hover: rgba($black, 0.5); +$orbit-control-padding: 1rem; +$orbit-control-zindex: 10; + +// 26. Pagination +// -------------- + +$pagination-font-size: rem-calc(14); +$pagination-margin-bottom: $global-margin; +$pagination-item-color: $black; +$pagination-item-padding: rem-calc(3 10); +$pagination-item-spacing: rem-calc(1); +$pagination-radius: $global-radius; +$pagination-item-background-hover: $light-gray; +$pagination-item-background-current: $primary-color; +$pagination-item-color-current: foreground($pagination-item-background-current); +$pagination-item-color-disabled: $medium-gray; +$pagination-ellipsis-color: $black; +$pagination-mobile-items: false; +$pagination-mobile-current-item: false; +$pagination-arrows: true; + +// 27. Progress Bar +// ---------------- + +$progress-height: 1rem; +$progress-background: $medium-gray; +$progress-margin-bottom: $global-margin; +$progress-meter-background: $primary-color; +$progress-radius: $global-radius; + +// 28. Reveal +// ---------- + +$reveal-background: $white; +$reveal-width: 600px; +$reveal-max-width: $global-width; +$reveal-padding: $global-padding; +$reveal-border: 1px solid $medium-gray; +$reveal-radius: $global-radius; +$reveal-zindex: 1005; +$reveal-overlay-background: rgba($black, 0.45); + +// 29. Slider +// ---------- + +$slider-width-vertical: 0.5rem; +$slider-transition: all 0.2s ease-in-out; +$slider-height: 0.5rem; +$slider-background: $light-gray; +$slider-fill-background: $medium-gray; +$slider-handle-height: 1.4rem; +$slider-handle-width: 1.4rem; +$slider-handle-background: $primary-color; +$slider-opacity-disabled: 0.25; +$slider-radius: $global-radius; + +// 30. Switch +// ---------- + +$switch-background: $medium-gray; +$switch-background-active: $primary-color; +$switch-height: 2rem; +$switch-height-tiny: 1.5rem; +$switch-height-small: 1.75rem; +$switch-height-large: 2.5rem; +$switch-radius: $global-radius; +$switch-margin: $global-margin; +$switch-paddle-background: $white; +$switch-paddle-offset: 0.25rem; +$switch-paddle-radius: $global-radius; +$switch-paddle-transition: all 0.25s ease-out; + +// 31. Table +// --------- + +$table-background: $white; +$table-color-scale: 5%; +$table-border: 1px solid smart-scale($table-background, $table-color-scale); +$table-padding: rem-calc(8 10 10); +$table-hover-scale: 2%; +$table-row-hover: darken($table-background, $table-hover-scale); +$table-row-stripe-hover: darken($table-background, $table-color-scale + $table-hover-scale); +$table-striped-background: smart-scale($table-background, $table-color-scale); +$table-stripe: even; +$table-head-background: smart-scale($table-background, $table-color-scale / 2); +$table-head-row-hover: darken($table-head-background, $table-hover-scale); +$table-foot-background: smart-scale($table-background, $table-color-scale); +$table-foot-row-hover: darken($table-foot-background, $table-hover-scale); +$table-head-font-color: $body-font-color; +$table-foot-font-color: $body-font-color; +$show-header-for-stacked: false; + +// 32. Tabs +// -------- + +$tab-margin: 0; +$tab-background: $white; +$tab-background-active: $light-gray; +$tab-item-font-size: rem-calc(12); +$tab-item-background-hover: $white; +$tab-item-padding: 1.25rem 1.5rem; +$tab-expand-max: 6; +$tab-content-background: $white; +$tab-content-border: $light-gray; +$tab-content-color: foreground($tab-background, $primary-color); +$tab-content-padding: 1rem; + +// 33. Thumbnail +// ------------- + +$thumbnail-border: solid 4px $white; +$thumbnail-margin-bottom: $global-margin; +$thumbnail-shadow: 0 0 0 1px rgba($black, 0.2); +$thumbnail-shadow-hover: 0 0 6px 1px rgba($primary-color, 0.5); +$thumbnail-transition: box-shadow 200ms ease-out; +$thumbnail-radius: $global-radius; + +// 34. Title Bar +// ------------- + +$titlebar-background: $black; +$titlebar-color: $white; +$titlebar-padding: 0.5rem; +$titlebar-text-font-weight: bold; +$titlebar-icon-color: $white; +$titlebar-icon-color-hover: $medium-gray; +$titlebar-icon-spacing: 0.25rem; + +// 35. Tooltip +// ----------- + +$has-tip-font-weight: $global-weight-bold; +$has-tip-border-bottom: dotted 1px $dark-gray; +$tooltip-background-color: $black; +$tooltip-color: $white; +$tooltip-padding: 0.75rem; +$tooltip-font-size: $small-font-size; +$tooltip-pip-width: 0.75rem; +$tooltip-pip-height: $tooltip-pip-width * 0.866; +$tooltip-radius: $global-radius; + +// 36. Top Bar +// ----------- + +$topbar-padding: 0.5rem; +$topbar-background: $light-gray; +$topbar-submenu-background: $topbar-background; +$topbar-title-spacing: 1rem; +$topbar-input-width: 200px; +$topbar-unstack-breakpoint: medium; + diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.scss similarity index 94% rename from app/assets/stylesheets/application.css rename to app/assets/stylesheets/application.scss index cbb429c993..e35bfa8442 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.scss @@ -13,4 +13,6 @@ * *= require_tree . *= require_self + *= require foundation_and_overrides + */ diff --git a/app/assets/stylesheets/foundation_and_overrides.scss b/app/assets/stylesheets/foundation_and_overrides.scss new file mode 100644 index 0000000000..458eb4fafb --- /dev/null +++ b/app/assets/stylesheets/foundation_and_overrides.scss @@ -0,0 +1,52 @@ +@charset 'utf-8'; + +@import 'settings'; +@import 'foundation'; + +// If you'd like to include motion-ui the foundation-rails gem comes prepackaged with it, uncomment the 3 @imports, if you are not using the gem you need to install the motion-ui sass package. +// +@import 'motion-ui/motion-ui'; + +// We include everything by default. To slim your CSS, remove components you don't use. + +@include foundation-global-styles; +@include foundation-grid; +@include foundation-typography; +@include foundation-button; +@include foundation-forms; +@include foundation-visibility-classes; +@include foundation-float-classes; +@include foundation-accordion; +@include foundation-accordion-menu; +@include foundation-badge; +@include foundation-breadcrumbs; +@include foundation-button-group; +@include foundation-callout; +@include foundation-close-button; +@include foundation-drilldown-menu; +@include foundation-dropdown; +@include foundation-dropdown-menu; +@include foundation-flex-video; +@include foundation-label; +@include foundation-media-object; +@include foundation-menu; +@include foundation-menu-icon; +@include foundation-off-canvas; +@include foundation-orbit; +@include foundation-pagination; +@include foundation-progress-bar; +@include foundation-slider; +@include foundation-sticky; +@include foundation-reveal; +@include foundation-switch; +@include foundation-table; +@include foundation-tabs; +@include foundation-thumbnail; +@include foundation-title-bar; +@include foundation-tooltip; +@include foundation-top-bar; + +// If you'd like to include motion-ui the foundation-rails gem comes prepackaged with it, uncomment the 3 @imports, if you are not using the gem you need to install the motion-ui sass package. +// +@include motion-ui-transitions; +@include motion-ui-animations; diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 9a3b5dacf5..11965fcfb8 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -1,39 +1,45 @@ - - - Betsy - <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %> - <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %> - <%= csrf_meta_tags %> - - -
      - <% if current_merchant != nil %> - <%= link_to("Log out", 'sessions/destroy', method: :delete) %> - <% else %> -
        -
      • <%= link_to("log in via Github", "/auth/github") %>
      • -
      - <% end %> + + + + - <% if flash[:notice] %> -

      <%= flash[:notice] %>

      - <% end %> + <%= content_for?(:title) ? yield(:title) : "Not Yetsy" %> -
      -
      + <% end %> + + <% if flash[:notice] %> +

      <%= flash[:notice] %>

      + <% end %> + +
      + +
      + +
      -
      +

      <%= greeting %>

      -

      <%= greeting %>

      -<%= yield %> + <%= yield %> - + From a2fcce4367fb19a91d9fb5fc4562e2d5b8a552f7 Mon Sep 17 00:00:00 2001 From: Miriam Cortes Date: Mon, 24 Oct 2016 14:31:56 -0700 Subject: [PATCH 086/191] merchant's categories button redirecting correctly --- app/models/merchant.rb | 84 +++++++++++++++++++++++++- app/views/layouts/application.html.erb | 1 + app/views/merchants/show.html.erb | 19 +++--- 3 files changed, 92 insertions(+), 12 deletions(-) diff --git a/app/models/merchant.rb b/app/models/merchant.rb index 9407f33c41..537c7e8cd0 100644 --- a/app/models/merchant.rb +++ b/app/models/merchant.rb @@ -4,7 +4,7 @@ class Merchant < ActiveRecord::Base has_many :placed_orders, :class_name => "Order" has_many :orders, :through => :products alias_attribute(:customer_orders, :orders) - + validates :name, :email, presence: true validates :email, uniqueness: true @@ -40,6 +40,88 @@ def revenue_pending_orders return revenue_total end + def revenue_cancelled_orders + revenue_total = 0.0 + orders.each do |order| + if order.order_status == "cancelled" + revenue_total += order.total_amount + end + end + return revenue_total + end + + def revenue_completed_orders + revenue_total = 0.0 + orders.each do |order| + if order.order_status == "completed" + revenue_total += order.total_amount + end + end + return revenue_total + end + + def total_revenue + revenue_total = 0.0 + orders.each do |order| + if order.order_status == "cancelled" + else + revenue_total += order.total_amount + end + end + return revenue_total + end + + def pending_orders + pending = 0 + orders.each do |order| + if order.order_status == "pending" + pending += 1 + end + end + return pending + end + + def cancelled_orders + cancelled = 0 + orders.each do |order| + if order.order_status == "cancelled" + cancelled += 1 + end + end + return cancelled + end + + def paid_orders + paid = 0 + orders.each do |order| + if order.order_status == "paid" + paid += 1 + end + end + return paid + end + + def completed_orders + completed = 0 + orders.each do |order| + if order.order_status == "completed" + completed += 1 + end + end + return completed + end + + def total_orders + total = 0 + orders.each do |order| + if order.order_status == "cancelled" + else + total += 1 + end + end + return total + end + # def orders_count # total_orders = 0 # orders. diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 2472a4cc9b..2d3582f1ce 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -10,6 +10,7 @@
      <% if current_merchant != nil %> <%= link_to("Log out", sessions_destroy_path, method: :delete) %> + <%= link_to("My account", merchant_path(current_merchant.id), method: :get) %> <% else %>
      • <%= link_to("log in via Github", "/auth/github") %>
      • diff --git a/app/views/merchants/show.html.erb b/app/views/merchants/show.html.erb index 05e73f111c..a3cd72e0cb 100644 --- a/app/views/merchants/show.html.erb +++ b/app/views/merchants/show.html.erb @@ -1,9 +1,6 @@

        <%= button_to 'Add a Product', new_merchant_product_path(@merchant.id, params[:product_id]), class: "button", method: :get %>

        <%= button_to 'View Products', merchant_products_path(@merchant.id, params[:id]), class: "button", method: :get %>

        -<%# ### MERCHANT SHOW VIEW ### %> -

        <%#= button_to 'Add a Product', new_product_path(params[:id]), class: "button", method: :get %>

        -

        <%#= button_to 'View Products', merchant_products_path(params[:id]), class: "button", method: :get %>

        <%= button_to 'Add a Category', new_category_path(params[:id]), class: "button", method: :get %>

        @@ -38,23 +35,23 @@

        Total Revenue for Paid Orders:

        $ <%= sprintf "%.2f", @merchant.revenue_paid_orders %>

        Total Revenue for Cancelled Orders:

        -

        $

        +

        $ <%= sprintf "%.2f", @merchant.revenue_cancelled_orders %>

        Total Revenue for Completed Orders:

        -

        $

        +

        $ <%= sprintf "%.2f", @merchant.revenue_completed_orders %>

        Total Net Revenue:

        -

        $

        +

        $ <%= sprintf "%.2f", @merchant.total_revenue %>

        Orders

        Total Pending Orders:

        -

        +

        <%= @merchant.pending_orders %>

        Total Cancelled Orders:

        -

        +

        <%= @merchant.cancelled_orders %>

        Total Paid Orders:

        -

        +

        <%= @merchant.paid_orders %>

        Total Completed Orders:

        -

        +

        <%= @merchant.completed_orders %>

        Total Orders:

        -

        +

        <%= @merchant.total_orders %>

        From 7c596f8f870bbb04ae07f438ce6c329615278394 Mon Sep 17 00:00:00 2001 From: Miriam Cortes Date: Mon, 24 Oct 2016 14:32:10 -0700 Subject: [PATCH 087/191] merchant's categories button redirecting correctly --- app/views/merchants/show.html.erb | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/app/views/merchants/show.html.erb b/app/views/merchants/show.html.erb index a3cd72e0cb..9b97edb69b 100644 --- a/app/views/merchants/show.html.erb +++ b/app/views/merchants/show.html.erb @@ -1,7 +1,8 @@ - -

        <%= button_to 'Add a Product', new_merchant_product_path(@merchant.id, params[:product_id]), class: "button", method: :get %>

        -

        <%= button_to 'View Products', merchant_products_path(@merchant.id, params[:id]), class: "button", method: :get %>

        -

        <%= button_to 'Add a Category', new_category_path(params[:id]), class: "button", method: :get %>

        +
          +
        • <%= button_to 'Add a Product', new_merchant_product_path(@merchant.id, params[:product_id]), class: "button", method: :get %>
        • +
        • <%= button_to 'View Products', merchant_products_path(@merchant.id, params[:id]), class: "button", method: :get %>
        • +
        • <%= button_to 'Add a Category', new_category_path(params[:id]), class: "button", method: :get %>
        • +
<%= link_to(order.id, orders_path(order.id)) %><%= link_to(product.name, product_path(product.id)) %><%= link_to(product.name, product_path(@merchant.id, product.id)) %><%#= order.status %>
From 42eacbf276e843c0480f9d969c9948c0bff702ce Mon Sep 17 00:00:00 2001 From: Olivia Date: Mon, 24 Oct 2016 14:32:28 -0700 Subject: [PATCH 088/191] changed category routes --- app/controllers/application_controller.rb | 11 +++++++++-- app/controllers/categories_controller.rb | 1 + app/views/categories/show.html.erb | 2 +- app/views/layouts/application.html.erb | 13 ++++++++++++- 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 320a028f33..8413b2334c 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -3,7 +3,7 @@ class ApplicationController < ActionController::Base # For APIs, you may want to use :null_session instead. protect_from_forgery with: :exception - before_action do define_category_variables(6) end + before_action do define_category_variables(2) end helper_method :current_merchant, :current_guest def current_merchant @@ -15,8 +15,15 @@ def current_guest end def define_category_variables(limit) - @top_catgories = Category.order("lower(name) ASC").limit(limit) + ordered_categories = Category.order("lower(name) ASC") + @top_catgories = ordered_categories.limit(limit) @all_categories = Category.all + @lesser_categories = find_lesser_categories(ordered_categories, limit) + end + + def find_lesser_categories(ordered_categories, limit) + lesser_categories = ordered_categories[limit..-1] + return lesser_categories end diff --git a/app/controllers/categories_controller.rb b/app/controllers/categories_controller.rb index b5e2850102..af1ca2b610 100644 --- a/app/controllers/categories_controller.rb +++ b/app/controllers/categories_controller.rb @@ -42,4 +42,5 @@ def destroy def category_params params.require(:category).permit(:name) end + end diff --git a/app/views/categories/show.html.erb b/app/views/categories/show.html.erb index 62f1b9aeb3..9dfd4c8798 100644 --- a/app/views/categories/show.html.erb +++ b/app/views/categories/show.html.erb @@ -3,6 +3,6 @@

<% @products_in_category.each do |p| %>

<%= p.name %>
- <%= link_to image_tag(p.image), product_path(p.id) %> + <%= link_to image_tag(p.image), merchant_product_path(p.merchant_id,p.id) %>
<% end %> diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 11965fcfb8..bafe49d4e0 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -31,10 +31,21 @@ <% @top_catgories.each do |category| %>
  • <%= link_to(category.name, category_path(category.id)) %>
  • <% end %> - + +
  • + More Categories + +
  • + + +

    <%= greeting %>

    From 8c35da200da90bca58ec06c0465bc1caf4be0ef9 Mon Sep 17 00:00:00 2001 From: Miriam Cortes Date: Mon, 24 Oct 2016 17:12:23 -0700 Subject: [PATCH 089/191] trying to fix heroku id stuff, and session tests --- app/controllers/sessions_controller.rb | 3 +- db/seeds.rb | 9 ++ .../controllers/categories_controller_test.rb | 76 ++++++------- test/controllers/merchants_controller_test.rb | 51 +-------- test/controllers/products_controller_test.rb | 104 +++++++++--------- test/controllers/reviews_controller_test.rb | 80 +++++++------- test/controllers/sessions_controller_test.rb | 27 +++++ test/test_helper.rb | 13 +++ 8 files changed, 186 insertions(+), 177 deletions(-) diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index 996aa75158..f0ef17a7a2 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -8,11 +8,12 @@ def create if @merchant.nil? @merchant = Merchant.build_from_github(auth_hash) flash[:notice] = "Unable to save the Merchant" + return redirect_to root_path unless @merchant.save end #Save the merchant ID in the session session[:merchant_id] = @merchant.id.to_i - + # binding.pry redirect_to merchant_path(@merchant.id) end diff --git a/db/seeds.rb b/db/seeds.rb index 3c5c747d60..35c03b8659 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -39,3 +39,12 @@ CSV.foreach('seeds_csvs/reviews.csv') do |csv_obj| Review.create(id: csv_obj[0].to_i, product_id: csv_obj[1].to_i, description: csv_obj[2], author: csv_obj[3], stars: csv_obj[4].to_i) end + +begin + require "pg" + array = [Merchant, Product, ProductOrder, Category, Review, Guest, Order, ProductCategory] + array.each do |model| + ActiveRecord::Base.connection.execute("SELECT setval('#{model.table_name}_id_seq'::regclass,?)", model.count) + end +rescue LoadError +end diff --git a/test/controllers/categories_controller_test.rb b/test/controllers/categories_controller_test.rb index 6e2267313e..8bb315be33 100644 --- a/test/controllers/categories_controller_test.rb +++ b/test/controllers/categories_controller_test.rb @@ -1,44 +1,44 @@ require 'test_helper' class CategoriesControllerTest < ActionController::TestCase - test "should get index" do - get :index - assert_response :success - assert_template :index - end - - test "should get show" do - get :show, {id: categories(:one).id} - assert_response :success - assert_template :show - end - - test "should get new" do - get :new - assert_response :success - end - - test "should be able to create a new category" do - post_params = {category: {name: "Harry Potter Things"}} - post :create, post_params - assert_response :redirect - end - - test "creating a category changes the number of categories" do - - assert_difference('Category.count', 1) do - post_params = {category: {name: "A Category"}} - post :create, post_params - end - assert_response :redirect - end - - - test "should get destroy" do - - delete :destroy, {id: categories(:one).id} - assert_response :redirect - end + # test "should get index" do + # get :index + # assert_response :success + # assert_template :index + # end + # + # test "should get show" do + # get :show, {id: categories(:one).id} + # assert_response :success + # assert_template :show + # end + # + # test "should get new" do + # get :new + # assert_response :success + # end + # + # test "should be able to create a new category" do + # post_params = {category: {name: "Harry Potter Things"}} + # post :create, post_params + # assert_response :redirect + # end + # + # test "creating a category changes the number of categories" do + # + # assert_difference('Category.count', 1) do + # post_params = {category: {name: "A Category"}} + # post :create, post_params + # end + # assert_response :redirect + # end + # + # + # test "should get destroy" do + # + # delete :destroy, {id: categories(:one).id} + # assert_response :redirect + # end end diff --git a/test/controllers/merchants_controller_test.rb b/test/controllers/merchants_controller_test.rb index d6bf6dade8..60518e0c28 100644 --- a/test/controllers/merchants_controller_test.rb +++ b/test/controllers/merchants_controller_test.rb @@ -1,51 +1,10 @@ require 'test_helper' class MerchantsControllerTest < ActionController::TestCase - # test "should get index" do - # get :index - # assert_response :success - # assert_template :index - # end - # - # test "should get show" do - # get :show, {id: merchants(:one).id} - # assert_response :success - # end - # - # test "should get new" do - # get :new - # assert_response :success - # assert_template :new - # end - # - # test "Creating a new Merchant changes number of Merchants" do - # assert_difference('Merchant.count', 1) do - # post_params = { merchant: {name: "Lola CherryCola", email: "lola@email.com", password: "lolarocks"} } - # post :create, post_params - # end - # assert_response :redirect - # end - # - # test "should get create" do - # post_params = { merchant: {name: "merchant3", email: "email_merchant3@email.com", password: "password1111"} } - # post :create, post_params - # assert_response :redirect - # end - - # test "should get edit" do - # get :edit, {id: merchants(:one).id} - # assert_response :success - # end - - # test "should be able to update a merchant" do - # patch :update, :id => merchants(:one), :merchants => {email: "new_email@email.com"} - # assert_equal "new_email@email.com", assigns(:merchant).email - # assert_response :success - # end - # - # test "should get destroy" do - # get :destroy - # assert_response :success - # end + test "should get index" do + get :index + assert_response :success + assert_template :index + end end diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index d892d4aa67..403ecb08c7 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -1,57 +1,57 @@ require 'test_helper' class ProductsControllerTest < ActionController::TestCase - test "should get index" do - get :index - assert_response :success - assert_template :index - end - - test "should get show" do - get :show, {id: products(:glitter).id} - assert_response :success - end - - test "should get new" do - get :new - assert_response :success - assert_template :new - end - - test "should be able to create a new product" do - post_params = {product: {name: "Glitter Wand", description: "a glittery wand", price: 1500, image: 'http://placekitten.com/200/300', merchant_id: 2, inventory: 7, rating: 5}} - - post :create, post_params - assert_response :redirect - # This action will need to change to merchant's create_new_product path - end - - test "creating a product changes the number of products" do - assert_difference("Product.count",1) do - post_params = {product: {name: "Glitter Wand", description: "a glittery wand", price: 1500, image: 'http://placekitten.com/200/300', merchant_id: 2, inventory: 7, rating: 5}} - post :create, post_params - end - end - - test "should get edit" do - get :edit, {id: products(:glitter).id} - assert_response :success - end - - test "should be able to update a product" do - put :update, {id: products(:glitter).id, product: {name: "Glitter Wand", description: "a glittery wand", price: 1500, image: 'http://placekitten.com/200/300', merchant_id: 2, inventory: 7, rating: 5}} - assert_redirected_to controller: "products", action: "show" - end - - test "deleting a product changes the number of products" do - assert_difference("Product.count", -1) do - delete :destroy, {id: products(:glitter).id } - end - end - - test "responds with error if file isn't found" do - delete :destroy, {id: 943} - assert_response :missing - end + # test "should get index" do + # get :index + # assert_response :success + # assert_template :index + # end + # + # test "should get show" do + # get :show, {id: products(:glitter).id} + # assert_response :success + # end + # + # test "should get new" do + # get :new + # assert_response :success + # assert_template :new + # end + # + # test "should be able to create a new product" do + # post_params = {product: {name: "Glitter Wand", description: "a glittery wand", price: 1500, image: 'http://placekitten.com/200/300', merchant_id: 2, inventory: 7, rating: 5}} + # + # post :create, post_params + # assert_response :redirect + # # This action will need to change to merchant's create_new_product path + # end + # + # test "creating a product changes the number of products" do + # assert_difference("Product.count",1) do + # post_params = {product: {name: "Glitter Wand", description: "a glittery wand", price: 1500, image: 'http://placekitten.com/200/300', merchant_id: 2, inventory: 7, rating: 5}} + # post :create, post_params + # end + # end + # + # test "should get edit" do + # get :edit, {id: products(:glitter).id} + # assert_response :success + # end + # + # test "should be able to update a product" do + # put :update, {id: products(:glitter).id, product: {name: "Glitter Wand", description: "a glittery wand", price: 1500, image: 'http://placekitten.com/200/300', merchant_id: 2, inventory: 7, rating: 5}} + # assert_redirected_to controller: "products", action: "show" + # end + # + # test "deleting a product changes the number of products" do + # assert_difference("Product.count", -1) do + # delete :destroy, {id: products(:glitter).id } + # end + # end + # + # test "responds with error if file isn't found" do + # delete :destroy, {id: 943} + # assert_response :missing + # end end diff --git a/test/controllers/reviews_controller_test.rb b/test/controllers/reviews_controller_test.rb index b570584074..eb9d4f244c 100644 --- a/test/controllers/reviews_controller_test.rb +++ b/test/controllers/reviews_controller_test.rb @@ -1,44 +1,44 @@ require 'test_helper' class ReviewsControllerTest < ActionController::TestCase - test "should get index" do - get :index, {product_id: products(:glitter).id} - assert_response :success - assert_template :index - end - - test "should get show" do - get :show, {id: reviews(:glitter_review), product_id: products(:glitter).id} - assert_response :success - end - - test "should get new" do - get :new, {product_id: products(:glitter).id} - assert_response :success - assert_template :new - end - - test "should be able to create a new product" do - post :create, {product_id: products(:glitter).id, review: {description: "njefknlsnf", stars: 2, author: "nfs"}} - assert_response :redirect - # This action will need to change to merchant's create_new_product path - end - - test "creating a product changes the number of products" do - assert_difference("Review.count",1) do - post :create, {product_id: products(:glitter).id, review: {description: "njefknlsnf", stars: 2, author: "nfs"}} - end - end - - - test "deleting a product changes the number of products" do - assert_difference("Review.count", -1) do - delete :destroy, {product_id: products(:glitter).id, id: reviews(:glitter_review).id } - end - end - - test "responds with error if file isn't found" do - delete :destroy, {product_id: products(:glitter).id, id: 943} - assert_response :missing - end + # test "should get index" do + # get :index, {product_id: products(:glitter).id} + # assert_response :success + # assert_template :index + # end + # + # test "should get show" do + # get :show, {id: reviews(:glitter_review), product_id: products(:glitter).id} + # assert_response :success + # end + # + # test "should get new" do + # get :new, {product_id: products(:glitter).id} + # assert_response :success + # assert_template :new + # end + # + # test "should be able to create a new product" do + # post :create, {product_id: products(:glitter).id, review: {description: "njefknlsnf", stars: 2, author: "nfs"}} + # assert_response :redirect + # # This action will need to change to merchant's create_new_product path + # end + # + # test "creating a product changes the number of products" do + # assert_difference("Review.count",1) do + # post :create, {product_id: products(:glitter).id, review: {description: "njefknlsnf", stars: 2, author: "nfs"}} + # end + # end + # + # + # test "deleting a product changes the number of products" do + # assert_difference("Review.count", -1) do + # delete :destroy, {product_id: products(:glitter).id, id: reviews(:glitter_review).id } + # end + # end + # + # test "responds with error if file isn't found" do + # delete :destroy, {product_id: products(:glitter).id, id: 943} + # assert_response :missing + # end end diff --git a/test/controllers/sessions_controller_test.rb b/test/controllers/sessions_controller_test.rb index 9c996334b2..9c49242143 100644 --- a/test/controllers/sessions_controller_test.rb +++ b/test/controllers/sessions_controller_test.rb @@ -11,4 +11,31 @@ class SessionsControllerTest < ActionController::TestCase # assert_response :success # end + # setup do + # request.env['omniauth.auth'] = OmniAuth.config.mock_auth[:github] + # end + + def login_a_merchant + request.env['omniauth.auth'] = OmniAuth.config.mock_auth[:github] + get :create, {uid: '12345'} + end + + test "Can Create a merchant" do + assert_difference('Merchant.count', 1) do + login_a_merchant + assert_response :redirect + assert_redirected_to merchant_path(Merchant.last.id) + end + end + + test "If a merchant logs in twice it doesn't create a 2nd merchant" do + assert_difference('Merchant.count', 1) do + login_a_merchant + end + assert_no_difference('Merchant.count') do + login_a_merchant + assert_response :redirect + assert_redirected_to merchant_path(Merchant.last.id) + end + end end diff --git a/test/test_helper.rb b/test/test_helper.rb index 16b8203ad3..819caf60c3 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -9,4 +9,17 @@ class ActiveSupport::TestCase Minitest::Reporters.use! # Add more helper methods to be used by all tests here... + # /test/test_helper.rb + def setup + # Once you have enabled test mode, all requests + # to OmniAuth will be short circuited to use the mock authentication hash. + # A request to /auth/provider will redirect immediately to /auth/provider/callback. + OmniAuth.config.test_mode = true + + # The mock_auth configuration allows you to set per-provider (or default) authentication + # hashes to return during testing. + OmniAuth.config.mock_auth[:github] = OmniAuth::AuthHash.new({ + provider: 'github', uid: '123545', info: { email: "a@b.com", name: "Ada" } + }) + end end From 7ca50a2c84806e60c7f8ca47f8705dad447b8f24 Mon Sep 17 00:00:00 2001 From: Olivia Date: Tue, 25 Oct 2016 10:47:43 -0700 Subject: [PATCH 090/191] can add categories to a product --- app/controllers/products_controller.rb | 4 +-- app/views/layouts/application.html.erb | 35 ++++++++++++++---------- app/views/products/_productform.html.erb | 9 ++++++ 3 files changed, 32 insertions(+), 16 deletions(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 34b7818d51..f008206bbe 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -19,6 +19,7 @@ def new @product = Product.new @post_path = merchant_products_path(@merchant.id) @post_method = :post + @category = Category.order("lower(name) ASC").all end def create @@ -28,7 +29,6 @@ def create # @product.merchant_id = @merchant.id @product.rating = nil @product.merchant_id = @merchant.id - if @product.save redirect_to merchant_product_path(@merchant.id, @product.id) else @@ -84,7 +84,7 @@ def find_merchant end def product_params - params.require(:product).permit(:name, :description, :price, :image, :inventory, :rating) + params.require(:product).permit(:name, :description, :price, :image, :inventory, :rating, category_ids: []) end end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index bb82aa3fb5..3579aa9d58 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -27,22 +27,29 @@ <% end %>
    - +
    diff --git a/app/views/products/_productform.html.erb b/app/views/products/_productform.html.erb index 7a3d00b5fc..2878261940 100644 --- a/app/views/products/_productform.html.erb +++ b/app/views/products/_productform.html.erb @@ -22,7 +22,16 @@ <%= f.label :image %> <%= f.text_field :image %> +
    + <%= f.label :categories %> + + <%= f.collection_check_boxes(:category_ids, Category.all, :id, :name) %> +
    <%= f.submit %>
    + + + + <% end %> From 6fcb5061177e7e74ff39f3f774bf61c699442d18 Mon Sep 17 00:00:00 2001 From: Olivia Date: Tue, 25 Oct 2016 11:05:51 -0700 Subject: [PATCH 091/191] added back to all categories button --- app/controllers/categories_controller.rb | 4 ++++ app/views/categories/show.html.erb | 2 ++ app/views/products/_productform.html.erb | 4 ---- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/app/controllers/categories_controller.rb b/app/controllers/categories_controller.rb index af1ca2b610..351c6bcb7a 100644 --- a/app/controllers/categories_controller.rb +++ b/app/controllers/categories_controller.rb @@ -21,10 +21,14 @@ def create if @category.save redirect_to categories_path else + @error = "Did not save successfully. Please try again." render :new end + end end + + def edit end diff --git a/app/views/categories/show.html.erb b/app/views/categories/show.html.erb index 9dfd4c8798..0e554ea8ab 100644 --- a/app/views/categories/show.html.erb +++ b/app/views/categories/show.html.erb @@ -6,3 +6,5 @@ <%= link_to image_tag(p.image), merchant_product_path(p.merchant_id,p.id) %> <% end %> + +<%= link_to("View all Categories", categories_path) %> diff --git a/app/views/products/_productform.html.erb b/app/views/products/_productform.html.erb index 2878261940..41823dd66a 100644 --- a/app/views/products/_productform.html.erb +++ b/app/views/products/_productform.html.erb @@ -24,14 +24,10 @@
    <%= f.label :categories %> - <%= f.collection_check_boxes(:category_ids, Category.all, :id, :name) %>
    <%= f.submit %>
    - - - <% end %> From 920eb5574e848ea3acad4a598567bf4b216eb560 Mon Sep 17 00:00:00 2001 From: Nina Mutty Date: Tue, 25 Oct 2016 11:19:47 -0700 Subject: [PATCH 092/191] added foundation gem --- app/assets/stylesheets/application.scss | 2 ++ app/assets/stylesheets/foundation_and_overrides.scss | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index e35bfa8442..b2ec54fc31 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -13,6 +13,8 @@ * *= require_tree . *= require_self +//= require foundation_and_overrides + *= require foundation_and_overrides */ diff --git a/app/assets/stylesheets/foundation_and_overrides.scss b/app/assets/stylesheets/foundation_and_overrides.scss index 458eb4fafb..f60bbaf0f5 100644 --- a/app/assets/stylesheets/foundation_and_overrides.scss +++ b/app/assets/stylesheets/foundation_and_overrides.scss @@ -5,7 +5,7 @@ // If you'd like to include motion-ui the foundation-rails gem comes prepackaged with it, uncomment the 3 @imports, if you are not using the gem you need to install the motion-ui sass package. // -@import 'motion-ui/motion-ui'; +// @import 'motion-ui/motion-ui'; // We include everything by default. To slim your CSS, remove components you don't use. @@ -48,5 +48,5 @@ // If you'd like to include motion-ui the foundation-rails gem comes prepackaged with it, uncomment the 3 @imports, if you are not using the gem you need to install the motion-ui sass package. // -@include motion-ui-transitions; -@include motion-ui-animations; +// @include motion-ui-transitions; +// @include motion-ui-animations; From 5fc863d79579362a3cd5caf853b775e304ddddeb Mon Sep 17 00:00:00 2001 From: Sabrina Wilbert Date: Tue, 25 Oct 2016 11:19:58 -0700 Subject: [PATCH 093/191] add to cart method and helper methods --- app/controllers/application_controller.rb | 5 +- app/controllers/orders_controller.rb | 123 ++++------------------ app/models/guest.rb | 2 + app/models/merchant.rb | 7 +- app/models/order.rb | 12 +++ app/views/orders/update.html.erb | 1 + app/views/products/index.html.erb | 1 + app/views/products/show.html.erb | 35 ++++-- config/routes.rb | 1 + db/seeds.rb | 36 +++---- 10 files changed, 86 insertions(+), 137 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 1ff85dc8e5..9eb67a3874 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -26,12 +26,13 @@ def current_cart if current_guest.present? #get cart from current guest cart return current_guest.cart + end end - @current_guest ||= Guest.find_by(id: session[:user_id].to_i) - end + # @current_guest ||= Guest.find_by(id: session[:user_id].to_i) + end diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index be79d0a6e4..e2c9aa3113 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -1,5 +1,4 @@ class OrdersController < ApplicationController -<<<<<<< HEAD def index @orders = Order.all end @@ -11,15 +10,6 @@ def new end def create - if current_merchant.nil? - guest_create_cart - # elsif current_merchant.nil? && if @order.guest_id != nil - # add_line_to_cart - # elsif current_merchant != nil - #other code to create cart or add line to cart. - # end - # end - end end def subtotal @@ -48,105 +38,28 @@ def update def destroy end + def find_product + #cusomer product page and clicks add product_id + Product.find_by(id: params[:product_id] || params[:id]) + #need to take the id use it to find product + end + def add_to_cart + product = find_product + cart = current_cart + cart.add_product(product, params[:qty]) + # current_cart.add_product(find_product) + redirect_to root_path + end - def guest_create_cart - @line = LineItem.new - @line.product_id = params["product_id"] - @line.merchant_id = params["merchant_id"] - @line.qty = params["qty"] - @line.price = params["price"] - @line.order_id = @order.id - @line.save - end - def add_line_to_cart - @line = LineItem.new - @line.order_id = @order.id - @line.product_id = params[:product]["product_id"] - @line.merchant_id = params[:product]["merchant_id"] - @line.qty = params["qty"] - @line.price = params[:product]["price"] - @line.save - end - def remove_from_cart - @line = @order.line_items.find(params[:id]) - @line.id.destroy(params[:id].to_i) - end - + # def remove_from_cart + # @line = @order.line_items.find(params[:id]) + # @line.id.destroy(params[:id].to_i) + # end + + end#end of class -======= - # def index - # @orders = Order.all - # end - # - # def view_cart - # end - # - # def new - # end - # - # def create - # end - # - # def subtotal - # @order.line_items do |line| - # line_cost = @line.price * @line.qty - # total_amount << line_cost - # return total_amount - # end - # end - # - # def total_amount - # subtotal - # total_amount.inject { |result, element| result + element } - # return result - # end - # - # def edit - # end - # - # def update - # end - # - # def destroy - # end - # - # def guest_create_cart - # if current_merchant.nil? && @order.guest_id.nil? - # @guest = Guest.new - # @guest.save - # @order = Order.new - # @order.guest_id = @guest.id - # @order.order_status = "pending" - # @order.save - # @line = LineItem.new - # @line.order_id = @order.id - # @line.product_id = params[:products][:product_id] - # @line.merchant_id = params[:products][:merchant_id] - # @line.qty = params[:qty] - # @line.price = params[:products][:price] - # @line.save - # else - # add_to_cart - # end - # end - # def add_to_cart - # @line = LineItem.new - # @line.order_id = @order.id - # @line.product_id = params[:products][:product_id] - # @line.merchant_id = params[:products][:merchant_id] - # @line.qty = params[:qty] - # @line.price = params[:products][:price] - # @line.save - # end - # - # def remove_from_cart - # @line = @order.line_items.find(params[:id]) - # @line.id.destroy(params[:id].to_i) - # end -end ->>>>>>> master diff --git a/app/models/guest.rb b/app/models/guest.rb index f54e78a68d..d381f50820 100644 --- a/app/models/guest.rb +++ b/app/models/guest.rb @@ -13,4 +13,6 @@ def cart #return the cart end + + end diff --git a/app/models/merchant.rb b/app/models/merchant.rb index 9407f33c41..c4463de38a 100644 --- a/app/models/merchant.rb +++ b/app/models/merchant.rb @@ -4,7 +4,7 @@ class Merchant < ActiveRecord::Base has_many :placed_orders, :class_name => "Order" has_many :orders, :through => :products alias_attribute(:customer_orders, :orders) - + validates :name, :email, presence: true validates :email, uniqueness: true @@ -40,6 +40,11 @@ def revenue_pending_orders return revenue_total end + def cart + #find cart from merchant orders + self.placed_orders.find_or_create_by(:order_status => "pending") + end + # def orders_count # total_orders = 0 # orders. diff --git a/app/models/order.rb b/app/models/order.rb index f958b8f1c3..889b519a8e 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -4,4 +4,16 @@ class Order < ActiveRecord::Base has_many :products, :through => :line_items belongs_to :merchant belongs_to :guest + + def add_product(product, qty) +#if there is a guest and a cart + #add a row to the LineItem table + #once the line is added return the user back to the product page + line = LineItem.new + line.product = product + line.merchant = product.merchant + line.qty = qty + line.price = product.price + line_items << line + end end diff --git a/app/views/orders/update.html.erb b/app/views/orders/update.html.erb index 21caac1f70..0c6ae77427 100644 --- a/app/views/orders/update.html.erb +++ b/app/views/orders/update.html.erb @@ -1,2 +1,3 @@

    Orders#update

    Find me in app/views/orders/update.html.erb

    +<%= @current_guest.inspect %> diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index 74ce723fe0..8534ac2513 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -10,3 +10,4 @@ <% if current_merchant != nil %>

    <%= link_to "Add New Product", new_merchant_product_path(@merchant.id) %>

    <% end %> +<%= session.inspect %> diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 96c936f1ac..f661e2e236 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -13,19 +13,32 @@ -<%= form_tag @line_items, - method: :post, - url: orders_path do |f| %> -
    -
    - <%= f.label :qty %> - <%= f.text_area :qty %> -
    - <%= f.submit "Add to Cart "%> + + +
    +
    +

    <%= @product.name %>

    +
    -<% end %> +
    + + <%= form_for(controller: "orders", action: "add_to_cart", method: "post") do |f| %> +
    Price:<%= @product.price %>
    +
    + <%= f.number_field :qty, value: 1, class: "form-control", min: 1 %> +
    + <%= f.hidden_field :product_id, value: @product.id %> + <%= f.hidden_field :merchant_id, value: @product.merchant_id %> + <%= f.submit "Add to Cart", class: "btn btn-primary" %> +
    +
    + <% end %> + +
    + +
    + - <% if @reviews != nil %> <% @reviews.each do |review| %> diff --git a/config/routes.rb b/config/routes.rb index c9bd85a4d6..01307e8db3 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -26,6 +26,7 @@ delete 'sessions/destroy' => 'sessions#destroy' get 'products/all_products' => 'products#all_products', as: 'all_products' + patch 'orders/add_to_cart' => 'orders#add_to_cart', as: 'add_to_cart' # get 'merchants/:id/products' => 'merchants#show_merchant_products', as: 'merchant_products' diff --git a/db/seeds.rb b/db/seeds.rb index 3c5c747d60..5f8d5e49c9 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -8,34 +8,34 @@ require 'csv' -CSV.foreach('seeds_csvs/category.csv') do |csv_obj| - Category.create(id: csv_obj[0].to_i, name: csv_obj[1]) - end +# CSV.foreach('seeds_csvs/category.csv') do |csv_obj| +# Category.create(id: csv_obj[0].to_i, name: csv_obj[1]) +# end -CSV.foreach('seeds_csvs/guests.csv') do |csv_obj| - Guest.create(id: csv_obj[0].to_i, name: csv_obj[1], email: csv_obj[2]) -end +# CSV.foreach('seeds_csvs/guests.csv') do |csv_obj| +# Guest.create(id: csv_obj[0].to_i, name: csv_obj[1], email: csv_obj[2]) +# end CSV.foreach('seeds_csvs/merchant.csv') do |csv_obj| Merchant.create(id: csv_obj[0].to_i, name: csv_obj[1], email: csv_obj[2], password: csv_obj[3]) end -CSV.foreach('seeds_csvs/orders.csv') do |csv_obj| - Order.create(id: csv_obj[0].to_i, guest_id: csv_obj[1].to_i, total_amount: csv_obj[2].to_f/100, merchant_id: csv_obj[3].to_i, card_name: csv_obj[4], card_number: csv_obj[5], card_exp: csv_obj[6], card_cvv: csv_obj[7], billing_zip: csv_obj[8], shipping_street: csv_obj[9], shipping_city: csv_obj[10], shipping_state: csv_obj[11], shipping_zip: csv_obj[12],order_status: csv_obj[13]) -end +# CSV.foreach('seeds_csvs/orders.csv') do |csv_obj| +# Order.create(id: csv_obj[0].to_i, guest_id: csv_obj[1].to_i, total_amount: csv_obj[2].to_f/100, merchant_id: csv_obj[3].to_i, card_name: csv_obj[4], card_number: csv_obj[5], card_exp: csv_obj[6], card_cvv: csv_obj[7], billing_zip: csv_obj[8], shipping_street: csv_obj[9], shipping_city: csv_obj[10], shipping_state: csv_obj[11], shipping_zip: csv_obj[12],order_status: csv_obj[13]) +# end -CSV.foreach('seeds_csvs/product_categories.csv') do |csv_obj| - ProductCategory.create(id: csv_obj[0].to_i, category_id: csv_obj[1].to_i, product_id: csv_obj[2]) -end +# CSV.foreach('seeds_csvs/product_categories.csv') do |csv_obj| +# ProductCategory.create(id: csv_obj[0].to_i, category_id: csv_obj[1].to_i, product_id: csv_obj[2]) +# end -CSV.foreach('seeds_csvs/products_orders.csv') do |csv_obj| - ProductOrder.create(id: csv_obj[0].to_i, product_id: csv_obj[1].to_i, order_id: csv_obj[2].to_i) -end +# CSV.foreach('seeds_csvs/products_orders.csv') do |csv_obj| +# ProductOrder.create(id: csv_obj[0].to_i, product_id: csv_obj[1].to_i, order_id: csv_obj[2].to_i) +# end CSV.foreach('seeds_csvs/products.csv') do |csv_obj| Product.create(id: csv_obj[0].to_i, name: csv_obj[1], description: csv_obj[2], price: csv_obj[3].to_i, image: csv_obj[4], inventory: csv_obj[5].to_i, merchant_id: csv_obj[6].to_i ) end -CSV.foreach('seeds_csvs/reviews.csv') do |csv_obj| - Review.create(id: csv_obj[0].to_i, product_id: csv_obj[1].to_i, description: csv_obj[2], author: csv_obj[3], stars: csv_obj[4].to_i) -end +# CSV.foreach('seeds_csvs/reviews.csv') do |csv_obj| +# Review.create(id: csv_obj[0].to_i, product_id: csv_obj[1].to_i, description: csv_obj[2], author: csv_obj[3], stars: csv_obj[4].to_i) +# end From 49df8599f6063b66a9417822815d9a2e80a3ee85 Mon Sep 17 00:00:00 2001 From: Nina Mutty Date: Tue, 25 Oct 2016 11:20:38 -0700 Subject: [PATCH 094/191] working on fixing delete review button --- app/controllers/reviews_controller.rb | 14 +++++++++++--- app/views/products/show.html.erb | 2 +- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index 25eff35d87..a81ebdbf0b 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -49,11 +49,13 @@ def destroy if @merchant.id = @product.merchant_id flash[:notice] = "Cannot Delete Your Own Product's Reviews" redirect_to merchant_product_path(@merchant.id, @product.id) + return end @review = find_review if @review.class == Review @review.destroy redirect_to merchant_product_path(@merchant.id, @product.id) + return end end @@ -63,7 +65,9 @@ def find_product if Product.exists?(params[:product_id].to_i) == true return @product = Product.find(params[:product_id].to_i) else - render :status => 404 + redirect_to merchant_path(@merchant.id) + flash[:notice] = "Product Not Found" + return end end @@ -72,7 +76,9 @@ def find_merchant if Merchant.exists?(@product.merchant_id) == true return @merchant = Merchant.find(@product.merchant_id) else - render :status => 404 + redirect_to categories_path + flash[:notice] = "Merchant Not Found" + return end end @@ -80,7 +86,9 @@ def find_review if Review.exists?(params[:id].to_i) == true return @review = Review.find(params[:id].to_i) else - render :status => 404 + redirect_to merchant_product_path(@merchant.id, @product.id) + flash[:notice] = "Review Not Found" + return end end diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 03f303db88..9e22f29a3d 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -31,7 +31,7 @@

    <%= star_string(review.stars) %>

    <%= review.description %>

    <%= "By: #{review.author}" if review.author != '' %>

    -

    <%= button_to "Delete Review", {controller: 'reviews', action: 'destroy', product_id: @product.id, id: review.id}, method: :delete, data: {confirm: "Are you sure?"}%>

    +

    <%= button_to "Delete Review", {controller: 'reviews', action: 'destroy', merchant_id: @merchant.id, product_id: @product.id, id: review.id}, method: :delete, data: {confirm: "Are you sure?"}%>

    <% end %> <% end %> From a9f8a4e6aa02de82032e953091daa77926543184 Mon Sep 17 00:00:00 2001 From: Nina Mutty Date: Tue, 25 Oct 2016 11:21:36 -0700 Subject: [PATCH 095/191] fixing paths in tests after nesting products in merchants --- test/controllers/products_controller_test.rb | 18 +++++++++--------- test/controllers/reviews_controller_test.rb | 20 ++++++++++---------- test/fixtures/merchants.yml | 11 +++++++++++ test/fixtures/products.yml | 6 +++--- 4 files changed, 33 insertions(+), 22 deletions(-) diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index d892d4aa67..b64b71d7ab 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -2,18 +2,18 @@ class ProductsControllerTest < ActionController::TestCase test "should get index" do - get :index + get :index, {merchant_id: (products(:glitter).merchant).id} assert_response :success assert_template :index end test "should get show" do - get :show, {id: products(:glitter).id} + get :show, {merchant_id: (products(:glitter).merchant).id, id: products(:glitter).id} assert_response :success end test "should get new" do - get :new + get :new, {merchant_id: (products(:glitter).merchant).id} assert_response :success assert_template :new end @@ -21,7 +21,7 @@ class ProductsControllerTest < ActionController::TestCase test "should be able to create a new product" do post_params = {product: {name: "Glitter Wand", description: "a glittery wand", price: 1500, image: 'http://placekitten.com/200/300', merchant_id: 2, inventory: 7, rating: 5}} - post :create, post_params + post :create, {merchant_id: (products(:glitter).merchant).id}, post_params assert_response :redirect # This action will need to change to merchant's create_new_product path end @@ -29,28 +29,28 @@ class ProductsControllerTest < ActionController::TestCase test "creating a product changes the number of products" do assert_difference("Product.count",1) do post_params = {product: {name: "Glitter Wand", description: "a glittery wand", price: 1500, image: 'http://placekitten.com/200/300', merchant_id: 2, inventory: 7, rating: 5}} - post :create, post_params + post :create, {merchant_id: (products(:glitter).merchant).id}, post_params end end test "should get edit" do - get :edit, {id: products(:glitter).id} + get :edit, {merchant_id: (products(:glitter).merchant).id, id: products(:glitter).id} assert_response :success end test "should be able to update a product" do - put :update, {id: products(:glitter).id, product: {name: "Glitter Wand", description: "a glittery wand", price: 1500, image: 'http://placekitten.com/200/300', merchant_id: 2, inventory: 7, rating: 5}} + put :update, {merchant_id: (products(:glitter).merchant).id, id: products(:glitter).id, product: {name: "Glitter Wand", description: "a glittery wand", price: 1500, image: 'http://placekitten.com/200/300', merchant_id: 2, inventory: 7, rating: 5}} assert_redirected_to controller: "products", action: "show" end test "deleting a product changes the number of products" do assert_difference("Product.count", -1) do - delete :destroy, {id: products(:glitter).id } + delete :destroy, {merchant_id: (products(:glitter).merchant).id, id: products(:glitter).id } end end test "responds with error if file isn't found" do - delete :destroy, {id: 943} + delete :destroy, {merchant_id: (products(:glitter).merchant).id, id: 943} assert_response :missing end diff --git a/test/controllers/reviews_controller_test.rb b/test/controllers/reviews_controller_test.rb index b570584074..0e8a781f61 100644 --- a/test/controllers/reviews_controller_test.rb +++ b/test/controllers/reviews_controller_test.rb @@ -2,43 +2,43 @@ class ReviewsControllerTest < ActionController::TestCase test "should get index" do - get :index, {product_id: products(:glitter).id} + get :index, {merchant_id: (products(:glitter).merchant).id, product_id: products(:glitter).id} assert_response :success assert_template :index end test "should get show" do - get :show, {id: reviews(:glitter_review), product_id: products(:glitter).id} + get :show, {id: reviews(:glitter_review), product_id: products(:glitter).id, merchant_id: (products(:glitter).merchant).id} assert_response :success end test "should get new" do - get :new, {product_id: products(:glitter).id} + get :new, {merchant_id: (products(:glitter).merchant).id, product_id: products(:glitter).id} assert_response :success assert_template :new end test "should be able to create a new product" do - post :create, {product_id: products(:glitter).id, review: {description: "njefknlsnf", stars: 2, author: "nfs"}} + post :create, {merchant_id: (products(:glitter).merchant).id, product_id: products(:glitter).id, review: {description: "njefknlsnf", stars: 2, author: "nfs"}} assert_response :redirect # This action will need to change to merchant's create_new_product path end test "creating a product changes the number of products" do assert_difference("Review.count",1) do - post :create, {product_id: products(:glitter).id, review: {description: "njefknlsnf", stars: 2, author: "nfs"}} + post :create, {merchant_id: (products(:glitter).merchant).id, product_id: products(:glitter).id, review: {description: "njefknlsnf", stars: 2, author: "nfs"}} end end - test "deleting a product changes the number of products" do + test "deleting a review changes the number of reviews" do assert_difference("Review.count", -1) do - delete :destroy, {product_id: products(:glitter).id, id: reviews(:glitter_review).id } + delete :destroy, {merchant_id: (products(:glitter).merchant).id, product_id: products(:glitter).id, id: reviews(:glitter_review).id } end end - test "responds with error if file isn't found" do - delete :destroy, {product_id: products(:glitter).id, id: 943} - assert_response :missing + test "redirects and gives flash notice if file isn't found" do + delete :destroy, {merchant_id: (products(:glitter).merchant).id, product_id: products(:glitter).id, id: 943} + assert_redirected_to merchant_product_path((products(:glitter).merchant).id, products(:glitter).id) end end diff --git a/test/fixtures/merchants.yml b/test/fixtures/merchants.yml index 8563391088..ac7eafe484 100644 --- a/test/fixtures/merchants.yml +++ b/test/fixtures/merchants.yml @@ -9,3 +9,14 @@ two: name: merchant2 email: email_merchant2@email.com password: password4321 + + +three: + name: merchant1 + email: email_merchant1@email.com + password: password1234 + +four: + name: merchant2 + email: email_merchant2@email.com + password: password4321 diff --git a/test/fixtures/products.yml b/test/fixtures/products.yml index 654c3ae82d..3fe692926e 100644 --- a/test/fixtures/products.yml +++ b/test/fixtures/products.yml @@ -5,7 +5,7 @@ new_shoe: description: "A beautiful shoe!" price: 300 image: 'http://placekitten.com/200/300' - merchant_id: 1 + merchant: three inventory: 4 rating: 3 @@ -14,7 +14,7 @@ glitter: description: "a glittery wand" price: 1500 image: 'http://placekitten.com/200/300' - merchant_id: 2 + merchant: three inventory: 7 rating: 5 @@ -23,5 +23,5 @@ no_rating: description: "a glittery wand" price: 1500 image: 'http://placekitten.com/200/300' - merchant_id: 2 + merchant: four inventory: 7 From 59c557fa12d1a0cd0c34a6e7ad4723a7e2295f51 Mon Sep 17 00:00:00 2001 From: Nina Mutty Date: Tue, 25 Oct 2016 11:36:29 -0700 Subject: [PATCH 096/191] adding to checkout master: --- app/assets/stylesheets/foundation_and_overrides.scss | 6 +++--- app/views/products/show.html.erb | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/assets/stylesheets/foundation_and_overrides.scss b/app/assets/stylesheets/foundation_and_overrides.scss index f60bbaf0f5..234147a31f 100644 --- a/app/assets/stylesheets/foundation_and_overrides.scss +++ b/app/assets/stylesheets/foundation_and_overrides.scss @@ -5,7 +5,7 @@ // If you'd like to include motion-ui the foundation-rails gem comes prepackaged with it, uncomment the 3 @imports, if you are not using the gem you need to install the motion-ui sass package. // -// @import 'motion-ui/motion-ui'; + @import 'motion-ui/motion-ui'; // We include everything by default. To slim your CSS, remove components you don't use. @@ -48,5 +48,5 @@ // If you'd like to include motion-ui the foundation-rails gem comes prepackaged with it, uncomment the 3 @imports, if you are not using the gem you need to install the motion-ui sass package. // -// @include motion-ui-transitions; -// @include motion-ui-animations; +@include motion-ui-transitions; +@include motion-ui-animations; diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 9e22f29a3d..b474fa52cc 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -31,7 +31,7 @@

    <%= star_string(review.stars) %>

    <%= review.description %>

    <%= "By: #{review.author}" if review.author != '' %>

    -

    <%= button_to "Delete Review", {controller: 'reviews', action: 'destroy', merchant_id: @merchant.id, product_id: @product.id, id: review.id}, method: :delete, data: {confirm: "Are you sure?"}%>

    +

    <%= button_to "Delete Review", {controller: 'reviews', action: 'destroy'}, path: 'merchant_product_review_path', merchant_id: @merchant.id, product_id: @product.id, id: review.id}, method: :delete, data: {confirm: "Are you sure?"}%>

    <% end %> <% end %> From 37b63e2fc412e500d8e0422c2c839a4637499c5a Mon Sep 17 00:00:00 2001 From: Miriam Cortes Date: Tue, 25 Oct 2016 11:36:57 -0700 Subject: [PATCH 097/191] merchant oAuth tests and simplecov addition --- Gemfile | 2 + Gemfile.lock | 7 + app/views/merchants/show.html.erb | 2 +- .../merchants/show_merchant_products.html.erb | 5 - app/views/products/index.html.erb | 2 +- coverage/.last_run.json | 5 + coverage/.resultset.json | 1041 +++ coverage/.resultset.json.lock | 0 coverage/assets/0.10.0/application.css | 799 ++ coverage/assets/0.10.0/application.js | 1707 ++++ coverage/assets/0.10.0/colorbox/border.png | Bin 0 -> 163 bytes coverage/assets/0.10.0/colorbox/controls.png | Bin 0 -> 2033 bytes coverage/assets/0.10.0/colorbox/loading.gif | Bin 0 -> 9427 bytes .../0.10.0/colorbox/loading_background.png | Bin 0 -> 166 bytes coverage/assets/0.10.0/favicon_green.png | Bin 0 -> 1009 bytes coverage/assets/0.10.0/favicon_red.png | Bin 0 -> 1009 bytes coverage/assets/0.10.0/favicon_yellow.png | Bin 0 -> 1009 bytes coverage/assets/0.10.0/loading.gif | Bin 0 -> 7247 bytes coverage/assets/0.10.0/magnify.png | Bin 0 -> 1301 bytes .../images/ui-bg_flat_0_aaaaaa_40x100.png | Bin 0 -> 180 bytes .../images/ui-bg_flat_75_ffffff_40x100.png | Bin 0 -> 178 bytes .../images/ui-bg_glass_55_fbf9ee_1x400.png | Bin 0 -> 120 bytes .../images/ui-bg_glass_65_ffffff_1x400.png | Bin 0 -> 105 bytes .../images/ui-bg_glass_75_dadada_1x400.png | Bin 0 -> 111 bytes .../images/ui-bg_glass_75_e6e6e6_1x400.png | Bin 0 -> 110 bytes .../images/ui-bg_glass_95_fef1ec_1x400.png | Bin 0 -> 119 bytes .../ui-bg_highlight-soft_75_cccccc_1x100.png | Bin 0 -> 101 bytes .../images/ui-icons_222222_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_2e83ff_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_454545_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_888888_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_cd0a0a_256x240.png | Bin 0 -> 4369 bytes coverage/index.html | 6884 +++++++++++++++++ .../controllers/categories_controller_test.rb | 76 +- test/controllers/products_controller_test.rb | 104 +- test/controllers/reviews_controller_test.rb | 80 +- test/fixtures/orders.yml | 5 +- test/fixtures/product_orders.yml | 8 +- test/test_helper.rb | 2 + 39 files changed, 10586 insertions(+), 143 deletions(-) create mode 100644 coverage/.last_run.json create mode 100644 coverage/.resultset.json create mode 100644 coverage/.resultset.json.lock create mode 100644 coverage/assets/0.10.0/application.css create mode 100644 coverage/assets/0.10.0/application.js create mode 100644 coverage/assets/0.10.0/colorbox/border.png create mode 100644 coverage/assets/0.10.0/colorbox/controls.png create mode 100644 coverage/assets/0.10.0/colorbox/loading.gif create mode 100644 coverage/assets/0.10.0/colorbox/loading_background.png create mode 100644 coverage/assets/0.10.0/favicon_green.png create mode 100644 coverage/assets/0.10.0/favicon_red.png create mode 100644 coverage/assets/0.10.0/favicon_yellow.png create mode 100644 coverage/assets/0.10.0/loading.gif create mode 100644 coverage/assets/0.10.0/magnify.png create mode 100644 coverage/assets/0.10.0/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png create mode 100644 coverage/assets/0.10.0/smoothness/images/ui-bg_flat_75_ffffff_40x100.png create mode 100644 coverage/assets/0.10.0/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png create mode 100644 coverage/assets/0.10.0/smoothness/images/ui-bg_glass_65_ffffff_1x400.png create mode 100644 coverage/assets/0.10.0/smoothness/images/ui-bg_glass_75_dadada_1x400.png create mode 100644 coverage/assets/0.10.0/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png create mode 100644 coverage/assets/0.10.0/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png create mode 100644 coverage/assets/0.10.0/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png create mode 100644 coverage/assets/0.10.0/smoothness/images/ui-icons_222222_256x240.png create mode 100644 coverage/assets/0.10.0/smoothness/images/ui-icons_2e83ff_256x240.png create mode 100644 coverage/assets/0.10.0/smoothness/images/ui-icons_454545_256x240.png create mode 100644 coverage/assets/0.10.0/smoothness/images/ui-icons_888888_256x240.png create mode 100644 coverage/assets/0.10.0/smoothness/images/ui-icons_cd0a0a_256x240.png create mode 100644 coverage/index.html diff --git a/Gemfile b/Gemfile index abea4ecaf5..1fdc1a9c62 100644 --- a/Gemfile +++ b/Gemfile @@ -9,6 +9,8 @@ gem "omniauth-github" #gem 'pg', group: :production gem 'rails_12factor', group: :production +gem 'simplecov', group: :test + # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' gem 'rails', '4.2.7' # Use sqlite3 as the database for Active Record diff --git a/Gemfile.lock b/Gemfile.lock index 94d5a3e765..4311afa53d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -61,6 +61,7 @@ GEM coffee-script-source (1.10.0) concurrent-ruby (1.0.2) debug_inspector (0.0.2) + docile (1.1.5) dotenv (2.1.1) dotenv-rails (2.1.1) dotenv (= 2.1.1) @@ -174,6 +175,11 @@ GEM sdoc (0.4.2) json (~> 1.7, >= 1.7.7) rdoc (~> 4.0) + simplecov (0.12.0) + docile (~> 1.1.0) + json (>= 1.8, < 3) + simplecov-html (~> 0.10.0) + simplecov-html (0.10.0) slop (3.6.0) spring (2.0.0) activesupport (>= 4.2) @@ -226,6 +232,7 @@ DEPENDENCIES rails_12factor sass-rails (~> 5.0) sdoc (~> 0.4.0) + simplecov spring sqlite3 turbolinks diff --git a/app/views/merchants/show.html.erb b/app/views/merchants/show.html.erb index 9b97edb69b..49b10641ca 100644 --- a/app/views/merchants/show.html.erb +++ b/app/views/merchants/show.html.erb @@ -1,6 +1,6 @@
    • <%= button_to 'Add a Product', new_merchant_product_path(@merchant.id, params[:product_id]), class: "button", method: :get %>
    • -
    • <%= button_to 'View Products', merchant_products_path(@merchant.id, params[:id]), class: "button", method: :get %>
    • +
    • <%= button_to 'View Products', merchant_products_path(@merchant.id), class: "button", method: :get %>
    • <%= button_to 'Add a Category', new_category_path(params[:id]), class: "button", method: :get %>
    diff --git a/app/views/merchants/show_merchant_products.html.erb b/app/views/merchants/show_merchant_products.html.erb index e679e4073c..503d9c07bd 100644 --- a/app/views/merchants/show_merchant_products.html.erb +++ b/app/views/merchants/show_merchant_products.html.erb @@ -1,7 +1,2 @@

    <%= @merchant[:name] %>

    - - -

    - products will go here! -

    diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index 74ce723fe0..792369ab74 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -1,4 +1,4 @@ -

    See NotYetsy Products for <%= @merchant.name %>

    +

    Your NotYetsy Products

    <% @products.each do |product| %>
    diff --git a/coverage/.last_run.json b/coverage/.last_run.json new file mode 100644 index 0000000000..7bc1ca275d --- /dev/null +++ b/coverage/.last_run.json @@ -0,0 +1,5 @@ +{ + "result": { + "covered_percent": 65.52 + } +} diff --git a/coverage/.resultset.json b/coverage/.resultset.json new file mode 100644 index 0000000000..2535fb3d45 --- /dev/null +++ b/coverage/.resultset.json @@ -0,0 +1,1041 @@ +{ + "MiniTest": { + "coverage": { + "/Users/miriamcortes/ada/wk10/betsy/test/controllers/guests_controller_test.rb": [ + 1, + null, + 1, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null + ], + "/Users/miriamcortes/ada/wk10/betsy/test/controllers/merchants_controller_test.rb": [ + 1, + null, + 1, + 1, + 1, + 1, + 1, + null, + null, + null + ], + "/Users/miriamcortes/ada/wk10/betsy/test/controllers/orders_controller_test.rb": [ + 1, + null, + 1, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null + ], + "/Users/miriamcortes/ada/wk10/betsy/test/controllers/products_controller_test.rb": [ + 1, + null, + 1, + 1, + 1, + 0, + 0, + null, + null, + 1, + 1, + 0, + null, + null, + 1, + 1, + 0, + 0, + null, + null, + 1, + 1, + null, + 1, + 0, + null, + null, + null, + 1, + 1, + 1, + 1, + null, + null, + null, + 1, + 1, + 0, + null, + null, + 1, + 1, + 0, + null, + null, + 1, + 1, + 1, + null, + null, + null, + 1, + 1, + 0, + null, + null, + null + ], + "/Users/miriamcortes/ada/wk10/betsy/test/controllers/reviews_controller_test.rb": [ + 1, + null, + 1, + 1, + 1, + 0, + 0, + null, + null, + 1, + 1, + 0, + null, + null, + 1, + 1, + 0, + 0, + null, + null, + 1, + 1, + 0, + null, + null, + null, + 1, + 1, + 1, + null, + null, + null, + null, + 1, + 1, + 1, + null, + null, + null, + 1, + 1, + 0, + null, + null + ], + "/Users/miriamcortes/ada/wk10/betsy/test/controllers/sessions_controller_test.rb": [ + 1, + null, + 1, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + 1, + 3, + 3, + null, + null, + 1, + 1, + 1, + 1, + 1, + null, + null, + null, + 1, + 1, + 1, + null, + 1, + 1, + 1, + 1, + null, + null, + null + ], + "/Users/miriamcortes/ada/wk10/betsy/test/models/category_test.rb": [ + 1, + null, + 1, + null, + null, + null, + null, + 1, + 1, + 1, + 1, + null, + null + ], + "/Users/miriamcortes/ada/wk10/betsy/test/models/guest_test.rb": [ + 1, + null, + 1, + null, + null, + null, + null + ], + "/Users/miriamcortes/ada/wk10/betsy/test/models/line_item_test.rb": [ + 1, + null, + 1, + null, + null, + null, + null + ], + "/Users/miriamcortes/ada/wk10/betsy/test/models/merchant_test.rb": [ + 1, + null, + 1, + 1, + 1, + null, + null, + null, + null, + null + ], + "/Users/miriamcortes/ada/wk10/betsy/test/models/order_test.rb": [ + 1, + null, + 1, + null, + null, + null, + null + ], + "/Users/miriamcortes/ada/wk10/betsy/test/models/product_category_test.rb": [ + 1, + null, + 1, + null, + null, + null, + null + ], + "/Users/miriamcortes/ada/wk10/betsy/test/models/product_order_test.rb": [ + 1, + null, + 1, + null, + null, + null, + null + ], + "/Users/miriamcortes/ada/wk10/betsy/test/models/product_test.rb": [ + 1, + null, + 1, + 1, + 1, + null, + 1, + null, + 1, + null, + 1, + 1, + null, + 1, + 1, + null, + null, + 1, + 1, + 1, + null, + 1, + 1, + null, + null, + null, + 1, + 1, + 1, + 1, + null, + null, + null, + 1, + 1, + 1, + null, + null, + null + ], + "/Users/miriamcortes/ada/wk10/betsy/test/models/review_test.rb": [ + 1, + null, + 1, + null, + null, + null, + null, + 1, + 1, + null, + 1, + 1, + null, + 1, + 1, + null, + null, + null, + 1, + 1, + 1, + null, + 1, + 1, + null, + null, + null, + 1, + 1, + 1, + 1, + 1, + null, + null, + null, + null + ], + "/Users/miriamcortes/ada/wk10/betsy/app/models/category.rb": [ + 1, + 1, + 1, + 1, + null + ], + "/Users/miriamcortes/ada/wk10/betsy/app/models/guest.rb": [ + 1, + 1, + 1, + null + ], + "/Users/miriamcortes/ada/wk10/betsy/app/models/line_item.rb": [ + 1, + 1, + 1, + null, + null + ], + "/Users/miriamcortes/ada/wk10/betsy/app/models/merchant.rb": [ + null, + 1, + 1, + 1, + 1, + 1, + null, + 1, + 1, + null, + 1, + 2, + 2, + 2, + 2, + 2, + null, + null, + null, + 2, + null, + null, + 1, + 0, + 0, + 0, + 0, + null, + null, + 0, + null, + null, + 1, + 0, + 0, + 0, + 0, + null, + null, + 0, + null, + null, + 1, + 0, + 0, + 0, + 0, + null, + null, + 0, + null, + null, + 1, + 0, + 0, + 0, + 0, + null, + null, + 0, + null, + null, + 1, + 0, + 0, + 0, + null, + 0, + null, + null, + 0, + null, + null, + 1, + 0, + 0, + 0, + 0, + null, + null, + 0, + null, + null, + 1, + 0, + 0, + 0, + 0, + null, + null, + 0, + null, + null, + 1, + 0, + 0, + 0, + 0, + null, + null, + 0, + null, + null, + 1, + 0, + 0, + 0, + 0, + null, + null, + 0, + null, + null, + 1, + 0, + 0, + 0, + null, + 0, + null, + null, + 0, + null, + null, + null, + null, + null, + null, + null + ], + "/Users/miriamcortes/ada/wk10/betsy/app/models/order.rb": [ + 1, + 1, + null, + 1, + 1, + 1, + null + ], + "/Users/miriamcortes/ada/wk10/betsy/app/models/product_category.rb": [ + 1, + 1, + 1, + null + ], + "/Users/miriamcortes/ada/wk10/betsy/app/models/product_order.rb": [ + 1, + 1, + 1, + null + ], + "/Users/miriamcortes/ada/wk10/betsy/app/models/product.rb": [ + 1, + 1, + 1, + null, + 1, + 1, + null, + 1, + 1, + null, + null, + null, + null, + null, + 1, + 7, + 7, + 7, + 7, + null, + 7, + null, + null, + 0, + null, + null, + null, + null, + null, + null, + null, + null, + 1, + 1, + 1, + 1, + 1, + 1, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null + ], + "/Users/miriamcortes/ada/wk10/betsy/app/models/review.rb": [ + 1, + 1, + null, + null, + null, + null, + null, + null, + null, + null, + 1, + 1, + null, + null + ], + "/Users/miriamcortes/ada/wk10/betsy/app/controllers/products_controller.rb": [ + 1, + 1, + 1, + null, + 1, + 0, + null, + null, + 1, + 0, + null, + null, + 1, + 0, + 0, + null, + null, + 1, + 0, + 0, + 0, + null, + null, + 1, + 0, + 0, + 0, + null, + 0, + 0, + null, + 0, + 0, + null, + 0, + 0, + 0, + 0, + null, + null, + null, + 1, + 0, + 0, + null, + null, + 1, + 0, + 0, + 0, + 0, + null, + 0, + 0, + 0, + 0, + null, + null, + null, + 1, + 0, + 0, + 0, + 0, + null, + null, + null, + 1, + null, + 1, + 0, + 0, + null, + 0, + null, + null, + null, + 1, + 0, + 0, + null, + 0, + null, + null, + null, + 1, + 0, + null, + null, + null + ], + "/Users/miriamcortes/ada/wk10/betsy/app/controllers/application_controller.rb": [ + 1, + null, + null, + 1, + null, + 11, + 1, + null, + 1, + 9, + null, + null, + 1, + 0, + null, + null, + 1, + 10, + 10, + 10, + 10, + null, + null, + 1, + 10, + 10, + null, + null, + null, + null + ], + "/Users/miriamcortes/ada/wk10/betsy/app/helpers/application_helper.rb": [ + 1, + null, + null, + 1, + 0, + 0, + 0, + null, + 0, + 0, + null, + 0, + null, + null, + 1, + 4, + 4, + null, + 0, + null, + null, + null + ], + "/Users/miriamcortes/ada/wk10/betsy/app/helpers/categories_helper.rb": [ + 1, + null + ], + "/Users/miriamcortes/ada/wk10/betsy/app/helpers/guests_helper.rb": [ + 1, + null + ], + "/Users/miriamcortes/ada/wk10/betsy/app/helpers/merchants_helper.rb": [ + 1, + null + ], + "/Users/miriamcortes/ada/wk10/betsy/app/helpers/orders_helper.rb": [ + 1, + null + ], + "/Users/miriamcortes/ada/wk10/betsy/app/helpers/products_helper.rb": [ + 1, + null + ], + "/Users/miriamcortes/ada/wk10/betsy/app/helpers/reviews_helper.rb": [ + 1, + null + ], + "/Users/miriamcortes/ada/wk10/betsy/app/helpers/sessions_helper.rb": [ + 1, + null + ], + "/Users/miriamcortes/ada/wk10/betsy/app/controllers/merchants_controller.rb": [ + 1, + null, + null, + 1, + null, + 1, + null, + null, + 1, + 0, + null, + null, + 1, + 0, + 0, + null, + null, + 1, + null, + null, + 1, + 0, + null, + null, + 1, + null, + null, + 1, + null, + null, + 1, + 0, + 0, + null, + null, + 1, + null, + 1, + 0, + null, + null, + 1, + 1, + null, + null + ], + "/Users/miriamcortes/ada/wk10/betsy/app/controllers/sessions_controller.rb": [ + 1, + 1, + 3, + null, + 3, + null, + 3, + 3, + 2, + 2, + 2, + null, + null, + null, + 3, + null, + 3, + null, + null, + 1, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + 1, + 0, + 0, + null, + null + ], + "/Users/miriamcortes/ada/wk10/betsy/app/controllers/categories_controller.rb": [ + 1, + 1, + null, + 1, + 1, + null, + null, + null, + null, + 1, + 1, + 1, + null, + null, + 1, + 1, + null, + null, + 1, + 2, + 2, + 2, + null, + 0, + null, + null, + null, + 1, + null, + null, + 1, + null, + null, + 1, + 1, + 1, + null, + 1, + null, + null, + 1, + 1, + 2, + null, + null, + null + ], + "/Users/miriamcortes/ada/wk10/betsy/app/controllers/reviews_controller.rb": [ + 1, + 1, + 1, + 1, + null, + null, + 1, + 0, + null, + null, + 1, + null, + null, + 1, + 0, + 0, + 0, + null, + 0, + 0, + 0, + null, + null, + 1, + 0, + 0, + null, + 0, + 0, + null, + 0, + 0, + 0, + 0, + null, + null, + null, + 1, + 0, + 0, + 0, + null, + null, + null, + 1, + null, + null, + 1, + 0, + 0, + 0, + null, + 0, + 0, + 0, + 0, + null, + null, + null, + 1, + null, + 1, + 0, + 0, + null, + 0, + null, + null, + null, + 1, + 0, + 0, + 0, + null, + 0, + null, + null, + null, + 1, + 0, + 0, + null, + 0, + null, + null, + null, + 1, + 0, + null, + null + ] + }, + "timestamp": 1477419703 + } +} diff --git a/coverage/.resultset.json.lock b/coverage/.resultset.json.lock new file mode 100644 index 0000000000..e69de29bb2 diff --git a/coverage/assets/0.10.0/application.css b/coverage/assets/0.10.0/application.css new file mode 100644 index 0000000000..d86560434d --- /dev/null +++ b/coverage/assets/0.10.0/application.css @@ -0,0 +1,799 @@ +/* ----------------------------------------------------------------------- + + + Blueprint CSS Framework 0.9 + http://blueprintcss.org + + * Copyright (c) 2007-Present. See LICENSE for more info. + * See README for instructions on how to use Blueprint. + * For credits and origins, see AUTHORS. + * This is a compressed file. See the sources in the 'src' directory. + +----------------------------------------------------------------------- */ + +/* reset.css */ + +html, body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, code, del, dfn, em, img, q, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, dialog, figure, footer, header, hgroup, nav, section {margin:0;padding:0;border:0;font-weight:inherit;font-style:inherit;font-size:100%;font-family:inherit;vertical-align:baseline;} +article, aside, dialog, figure, footer, header, hgroup, nav, section {display:block;} +body {line-height:1.5;} +table {border-collapse:separate;border-spacing:0;} +caption, th, td {text-align:left;font-weight:normal;} +table, td, th {vertical-align:middle;} +blockquote:before, blockquote:after, q:before, q:after {content:"";} +blockquote, q {quotes:"" "";} +a img {border:none;} + +/* typography.css */ +html {font-size:100.01%;} +body {font-size:82%;color:#222;background:#fff;font-family:"Helvetica Neue", Arial, Helvetica, sans-serif;} +h1, h2, h3, h4, h5, h6 {font-weight:normal;color:#111;} +h1 {font-size:3em;line-height:1;margin-bottom:0.5em;} +h2 {font-size:2em;margin-bottom:0.75em;} +h3 {font-size:1.5em;line-height:1;margin-bottom:1em;} +h4 {font-size:1.2em;line-height:1.25;margin-bottom:1.25em;} +h5 {font-size:1em;font-weight:bold;margin-bottom:1.5em;} +h6 {font-size:1em;font-weight:bold;} +h1 img, h2 img, h3 img, h4 img, h5 img, h6 img {margin:0;} +p {margin:0 0 1.5em;} +p img.left {float:left;margin:1.5em 1.5em 1.5em 0;padding:0;} +p img.right {float:right;margin:1.5em 0 1.5em 1.5em;} +a:focus, a:hover {color:#000;} +a {color:#009;text-decoration:underline;} +blockquote {margin:1.5em;color:#666;font-style:italic;} +strong {font-weight:bold;} +em, dfn {font-style:italic;} +dfn {font-weight:bold;} +sup, sub {line-height:0;} +abbr, acronym {border-bottom:1px dotted #666;} +address {margin:0 0 1.5em;font-style:italic;} +del {color:#666;} +pre {margin:1.5em 0;white-space:pre;} +pre, code, tt {font:1em 'andale mono', 'lucida console', monospace;line-height:1.5;} +li ul, li ol {margin:0;} +ul, ol {margin:0 1.5em 1.5em 0;padding-left:3.333em;} +ul {list-style-type:disc;} +ol {list-style-type:decimal;} +dl {margin:0 0 1.5em 0;} +dl dt {font-weight:bold;} +dd {margin-left:1.5em;} +table {margin-bottom:1.4em;width:100%;} +th {font-weight:bold;} +thead th {background:#c3d9ff;} +th, td, caption {padding:4px 10px 4px 5px;} +tr.even td {background:#efefef;} +tfoot {font-style:italic;} +caption {background:#eee;} +.small {font-size:.8em;margin-bottom:1.875em;line-height:1.875em;} +.large {font-size:1.2em;line-height:2.5em;margin-bottom:1.25em;} +.hide {display:none;} +.quiet {color:#666;} +.loud {color:#000;} +.highlight {background:#ff0;} +.added {background:#060;color:#fff;} +.removed {background:#900;color:#fff;} +.first {margin-left:0;padding-left:0;} +.last {margin-right:0;padding-right:0;} +.top {margin-top:0;padding-top:0;} +.bottom {margin-bottom:0;padding-bottom:0;} + +/* forms.css */ +label {font-weight:bold;} +fieldset {padding:1.4em;margin:0 0 1.5em 0;border:1px solid #ccc;} +legend {font-weight:bold;font-size:1.2em;} +input[type=text], input[type=password], input.text, input.title, textarea, select {background-color:#fff;border:1px solid #bbb;} +input[type=text]:focus, input[type=password]:focus, input.text:focus, input.title:focus, textarea:focus, select:focus {border-color:#666;} +input[type=text], input[type=password], input.text, input.title, textarea, select {margin:0.5em 0;} +input.text, input.title {width:300px;padding:5px;} +input.title {font-size:1.5em;} +textarea {width:390px;height:250px;padding:5px;} +input[type=checkbox], input[type=radio], input.checkbox, input.radio {position:relative;top:.25em;} +form.inline {line-height:3;} +form.inline p {margin-bottom:0;} +.error, .notice, .success {padding:.8em;margin-bottom:1em;border:2px solid #ddd;} +.error {background:#FBE3E4;color:#8a1f11;border-color:#FBC2C4;} +.notice {background:#FFF6BF;color:#514721;border-color:#FFD324;} +.success {background:#E6EFC2;color:#264409;border-color:#C6D880;} +.error a {color:#8a1f11;} +.notice a {color:#514721;} +.success a {color:#264409;} +.box {padding:1.5em;margin-bottom:1.5em;background:#E5ECF9;} +hr {background:#ddd;color:#ddd;clear:both;float:none;width:100%;height:.1em;margin:0 0 1.45em;border:none;} +hr.space {background:#fff;color:#fff;visibility:hidden;} +.clearfix:after, .container:after {content:"\0020";display:block;height:0;clear:both;visibility:hidden;overflow:hidden;} +.clearfix, .container {display:block;} +.clear {clear:both;} +/* +github.com style (c) Vasily Polovnyov +*/ + + +pre code { +} + +pre .comment, +pre .template_comment, +pre .diff .header, +pre .javadoc { + color: #998; + font-style: italic +} + +pre .keyword, +pre .css .rule .keyword, +pre .winutils, +pre .javascript .title, +pre .lisp .title { + color: #000; + font-weight: bold +} + +pre .number, +pre .hexcolor { + color: #458 +} + + +pre .string, +pre .tag .value, +pre .phpdoc, +pre .tex .formula { + color: #d14 +} + +pre .subst { + color: #712; +} + +pre .constant, +pre .title, +pre .id { + color: #900; + font-weight: bold +} + +pre .javascript .title, +pre .lisp .title, +pre .subst { + font-weight: normal +} + +pre .class .title, +pre .haskell .label, +pre .tex .command { + color: #458; + font-weight: bold +} + +pre .tag, +pre .tag .title, +pre .rules .property, +pre .django .tag .keyword { + color: #000080; + font-weight: normal +} + +pre .attribute, +pre .variable, +pre .instancevar, +pre .lisp .body { + color: #008080 +} + +pre .regexp { + color: #009926 +} + +pre .class { + color: #458; + font-weight: bold +} + +pre .symbol, +pre .ruby .symbol .string, +pre .ruby .symbol .keyword, +pre .ruby .symbol .keymethods, +pre .lisp .keyword, +pre .tex .special, +pre .input_number { + color: #990073 +} + +pre .builtin, +pre .built_in, +pre .lisp .title { + color: #0086b3 +} + +pre .preprocessor, +pre .pi, +pre .doctype, +pre .shebang, +pre .cdata { + color: #999; + font-weight: bold +} + +pre .deletion { + background: #fdd +} + +pre .addition { + background: #dfd +} + +pre .diff .change { + background: #0086b3 +} + +pre .chunk { + color: #aaa +} + +pre .tex .formula { + opacity: 0.5; +} +/* + * jQuery UI CSS Framework @VERSION + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + */ + +/* Layout helpers +----------------------------------*/ + +.ui-helper-hidden { display: none; } +.ui-helper-hidden-accessible { position: absolute; left: -99999999px; } +.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } +.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } +.ui-helper-clearfix { display: inline-block; } +/* required comment for clearfix to work in Opera \*/ +* html .ui-helper-clearfix { height:1%; } +.ui-helper-clearfix { display:block; } +/* end clearfix */ +.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); } + + +/* Interaction Cues +----------------------------------*/ +.ui-state-disabled { cursor: default !important; } + + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } + + +/* Misc visuals +----------------------------------*/ + +/* Overlays */ +.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } + + +/* + * jQuery UI CSS Framework @VERSION + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + * + * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana,Arial,sans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=03_highlight_soft.png&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=01_flat.png&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=02_glass.png&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=02_glass.png&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=02_glass.png&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=01_flat.png&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px + */ + + +/* Component containers +----------------------------------*/ +.ui-widget { font-family: Verdana,Arial,sans-serif; font-size: 1.1em; } +.ui-widget .ui-widget { font-size: 1em; } +.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif; font-size: 1em; } +.ui-widget-content { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x; color: #222222; } +.ui-widget-content a { color: #222222; } +.ui-widget-header { border: 1px solid #aaaaaa; background: #cccccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x; color: #222222; font-weight: bold; } +.ui-widget-header a { color: #222222; } + +/* Interaction states +----------------------------------*/ +.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3; background: #e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #555555; } +.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555; text-decoration: none; } +.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #999999; background: #dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; } +.ui-state-hover a, .ui-state-hover a:hover { color: #212121; text-decoration: none; } +.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; } +.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121; text-decoration: none; } +.ui-widget :active { outline: none; } + +/* Interaction Cues +----------------------------------*/ +.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fcefa1; background: #fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x; color: #363636; } +.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; } +.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x; color: #cd0a0a; } +.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a; } +.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a; } +.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; } +.ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } +.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png); } +.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); } +.ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); } +.ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png); } +.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); } +.ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); } +.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png); } +.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png); } + +/* positioning */ +.ui-icon-carat-1-n { background-position: 0 0; } +.ui-icon-carat-1-ne { background-position: -16px 0; } +.ui-icon-carat-1-e { background-position: -32px 0; } +.ui-icon-carat-1-se { background-position: -48px 0; } +.ui-icon-carat-1-s { background-position: -64px 0; } +.ui-icon-carat-1-sw { background-position: -80px 0; } +.ui-icon-carat-1-w { background-position: -96px 0; } +.ui-icon-carat-1-nw { background-position: -112px 0; } +.ui-icon-carat-2-n-s { background-position: -128px 0; } +.ui-icon-carat-2-e-w { background-position: -144px 0; } +.ui-icon-triangle-1-n { background-position: 0 -16px; } +.ui-icon-triangle-1-ne { background-position: -16px -16px; } +.ui-icon-triangle-1-e { background-position: -32px -16px; } +.ui-icon-triangle-1-se { background-position: -48px -16px; } +.ui-icon-triangle-1-s { background-position: -64px -16px; } +.ui-icon-triangle-1-sw { background-position: -80px -16px; } +.ui-icon-triangle-1-w { background-position: -96px -16px; } +.ui-icon-triangle-1-nw { background-position: -112px -16px; } +.ui-icon-triangle-2-n-s { background-position: -128px -16px; } +.ui-icon-triangle-2-e-w { background-position: -144px -16px; } +.ui-icon-arrow-1-n { background-position: 0 -32px; } +.ui-icon-arrow-1-ne { background-position: -16px -32px; } +.ui-icon-arrow-1-e { background-position: -32px -32px; } +.ui-icon-arrow-1-se { background-position: -48px -32px; } +.ui-icon-arrow-1-s { background-position: -64px -32px; } +.ui-icon-arrow-1-sw { background-position: -80px -32px; } +.ui-icon-arrow-1-w { background-position: -96px -32px; } +.ui-icon-arrow-1-nw { background-position: -112px -32px; } +.ui-icon-arrow-2-n-s { background-position: -128px -32px; } +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } +.ui-icon-arrow-2-e-w { background-position: -160px -32px; } +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } +.ui-icon-arrowstop-1-n { background-position: -192px -32px; } +.ui-icon-arrowstop-1-e { background-position: -208px -32px; } +.ui-icon-arrowstop-1-s { background-position: -224px -32px; } +.ui-icon-arrowstop-1-w { background-position: -240px -32px; } +.ui-icon-arrowthick-1-n { background-position: 0 -48px; } +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } +.ui-icon-arrowthick-1-e { background-position: -32px -48px; } +.ui-icon-arrowthick-1-se { background-position: -48px -48px; } +.ui-icon-arrowthick-1-s { background-position: -64px -48px; } +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } +.ui-icon-arrowthick-1-w { background-position: -96px -48px; } +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } +.ui-icon-arrow-4 { background-position: 0 -80px; } +.ui-icon-arrow-4-diag { background-position: -16px -80px; } +.ui-icon-extlink { background-position: -32px -80px; } +.ui-icon-newwin { background-position: -48px -80px; } +.ui-icon-refresh { background-position: -64px -80px; } +.ui-icon-shuffle { background-position: -80px -80px; } +.ui-icon-transfer-e-w { background-position: -96px -80px; } +.ui-icon-transferthick-e-w { background-position: -112px -80px; } +.ui-icon-folder-collapsed { background-position: 0 -96px; } +.ui-icon-folder-open { background-position: -16px -96px; } +.ui-icon-document { background-position: -32px -96px; } +.ui-icon-document-b { background-position: -48px -96px; } +.ui-icon-note { background-position: -64px -96px; } +.ui-icon-mail-closed { background-position: -80px -96px; } +.ui-icon-mail-open { background-position: -96px -96px; } +.ui-icon-suitcase { background-position: -112px -96px; } +.ui-icon-comment { background-position: -128px -96px; } +.ui-icon-person { background-position: -144px -96px; } +.ui-icon-print { background-position: -160px -96px; } +.ui-icon-trash { background-position: -176px -96px; } +.ui-icon-locked { background-position: -192px -96px; } +.ui-icon-unlocked { background-position: -208px -96px; } +.ui-icon-bookmark { background-position: -224px -96px; } +.ui-icon-tag { background-position: -240px -96px; } +.ui-icon-home { background-position: 0 -112px; } +.ui-icon-flag { background-position: -16px -112px; } +.ui-icon-calendar { background-position: -32px -112px; } +.ui-icon-cart { background-position: -48px -112px; } +.ui-icon-pencil { background-position: -64px -112px; } +.ui-icon-clock { background-position: -80px -112px; } +.ui-icon-disk { background-position: -96px -112px; } +.ui-icon-calculator { background-position: -112px -112px; } +.ui-icon-zoomin { background-position: -128px -112px; } +.ui-icon-zoomout { background-position: -144px -112px; } +.ui-icon-search { background-position: -160px -112px; } +.ui-icon-wrench { background-position: -176px -112px; } +.ui-icon-gear { background-position: -192px -112px; } +.ui-icon-heart { background-position: -208px -112px; } +.ui-icon-star { background-position: -224px -112px; } +.ui-icon-link { background-position: -240px -112px; } +.ui-icon-cancel { background-position: 0 -128px; } +.ui-icon-plus { background-position: -16px -128px; } +.ui-icon-plusthick { background-position: -32px -128px; } +.ui-icon-minus { background-position: -48px -128px; } +.ui-icon-minusthick { background-position: -64px -128px; } +.ui-icon-close { background-position: -80px -128px; } +.ui-icon-closethick { background-position: -96px -128px; } +.ui-icon-key { background-position: -112px -128px; } +.ui-icon-lightbulb { background-position: -128px -128px; } +.ui-icon-scissors { background-position: -144px -128px; } +.ui-icon-clipboard { background-position: -160px -128px; } +.ui-icon-copy { background-position: -176px -128px; } +.ui-icon-contact { background-position: -192px -128px; } +.ui-icon-image { background-position: -208px -128px; } +.ui-icon-video { background-position: -224px -128px; } +.ui-icon-script { background-position: -240px -128px; } +.ui-icon-alert { background-position: 0 -144px; } +.ui-icon-info { background-position: -16px -144px; } +.ui-icon-notice { background-position: -32px -144px; } +.ui-icon-help { background-position: -48px -144px; } +.ui-icon-check { background-position: -64px -144px; } +.ui-icon-bullet { background-position: -80px -144px; } +.ui-icon-radio-off { background-position: -96px -144px; } +.ui-icon-radio-on { background-position: -112px -144px; } +.ui-icon-pin-w { background-position: -128px -144px; } +.ui-icon-pin-s { background-position: -144px -144px; } +.ui-icon-play { background-position: 0 -160px; } +.ui-icon-pause { background-position: -16px -160px; } +.ui-icon-seek-next { background-position: -32px -160px; } +.ui-icon-seek-prev { background-position: -48px -160px; } +.ui-icon-seek-end { background-position: -64px -160px; } +.ui-icon-seek-start { background-position: -80px -160px; } +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ +.ui-icon-seek-first { background-position: -80px -160px; } +.ui-icon-stop { background-position: -96px -160px; } +.ui-icon-eject { background-position: -112px -160px; } +.ui-icon-volume-off { background-position: -128px -160px; } +.ui-icon-volume-on { background-position: -144px -160px; } +.ui-icon-power { background-position: 0 -176px; } +.ui-icon-signal-diag { background-position: -16px -176px; } +.ui-icon-signal { background-position: -32px -176px; } +.ui-icon-battery-0 { background-position: -48px -176px; } +.ui-icon-battery-1 { background-position: -64px -176px; } +.ui-icon-battery-2 { background-position: -80px -176px; } +.ui-icon-battery-3 { background-position: -96px -176px; } +.ui-icon-circle-plus { background-position: 0 -192px; } +.ui-icon-circle-minus { background-position: -16px -192px; } +.ui-icon-circle-close { background-position: -32px -192px; } +.ui-icon-circle-triangle-e { background-position: -48px -192px; } +.ui-icon-circle-triangle-s { background-position: -64px -192px; } +.ui-icon-circle-triangle-w { background-position: -80px -192px; } +.ui-icon-circle-triangle-n { background-position: -96px -192px; } +.ui-icon-circle-arrow-e { background-position: -112px -192px; } +.ui-icon-circle-arrow-s { background-position: -128px -192px; } +.ui-icon-circle-arrow-w { background-position: -144px -192px; } +.ui-icon-circle-arrow-n { background-position: -160px -192px; } +.ui-icon-circle-zoomin { background-position: -176px -192px; } +.ui-icon-circle-zoomout { background-position: -192px -192px; } +.ui-icon-circle-check { background-position: -208px -192px; } +.ui-icon-circlesmall-plus { background-position: 0 -208px; } +.ui-icon-circlesmall-minus { background-position: -16px -208px; } +.ui-icon-circlesmall-close { background-position: -32px -208px; } +.ui-icon-squaresmall-plus { background-position: -48px -208px; } +.ui-icon-squaresmall-minus { background-position: -64px -208px; } +.ui-icon-squaresmall-close { background-position: -80px -208px; } +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } +.ui-icon-grip-solid-vertical { background-position: -32px -224px; } +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } +.ui-icon-grip-diagonal-se { background-position: -80px -224px; } + + +/* Misc visuals +----------------------------------*/ + +/* Corner radius */ +.ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; } +.ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; } +.ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; } +.ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; } +.ui-corner-top { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; } +.ui-corner-bottom { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; } +.ui-corner-right { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; } +.ui-corner-left { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; } +.ui-corner-all { -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; } + +/* Overlays */ +.ui-widget-overlay { background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); } +.ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; } +/* + ColorBox Core Style: + The following CSS is consistent between example themes and should not be altered. +*/ +#colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:9999; overflow:hidden;} +#cboxOverlay{position:fixed; width:100%; height:100%;} +#cboxMiddleLeft, #cboxBottomLeft{clear:left;} +#cboxContent{position:relative;} +#cboxLoadedContent{overflow:auto;} +#cboxTitle{margin:0;} +#cboxLoadingOverlay, #cboxLoadingGraphic{position:absolute; top:0; left:0; width:100%; height:100%;} +#cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{cursor:pointer;} +.cboxPhoto{float:left; margin:auto; border:0; display:block; max-width:none;} +.cboxIframe{width:100%; height:100%; display:block; border:0;} +#colorbox, #cboxContent, #cboxLoadedContent{box-sizing:content-box;} + +/* + User Style: + Change the following styles to modify the appearance of ColorBox. They are + ordered & tabbed in a way that represents the nesting of the generated HTML. +*/ +#cboxOverlay{background:#000;} +#colorbox{} + #cboxTopLeft{width:14px; height:14px; background:url(colorbox/controls.png) no-repeat 0 0;} + #cboxTopCenter{height:14px; background:url(colorbox/border.png) repeat-x top left;} + #cboxTopRight{width:14px; height:14px; background:url(colorbox/controls.png) no-repeat -36px 0;} + #cboxBottomLeft{width:14px; height:43px; background:url(colorbox/controls.png) no-repeat 0 -32px;} + #cboxBottomCenter{height:43px; background:url(colorbox/border.png) repeat-x bottom left;} + #cboxBottomRight{width:14px; height:43px; background:url(colorbox/controls.png) no-repeat -36px -32px;} + #cboxMiddleLeft{width:14px; background:url(colorbox/controls.png) repeat-y -175px 0;} + #cboxMiddleRight{width:14px; background:url(colorbox/controls.png) repeat-y -211px 0;} + #cboxContent{background:#fff; overflow:visible;} + .cboxIframe{background:#fff;} + #cboxError{padding:50px; border:1px solid #ccc;} + #cboxLoadedContent{margin-bottom:5px;} + #cboxLoadingOverlay{background:url(colorbox/loading_background.png) no-repeat center center;} + #cboxLoadingGraphic{background:url(colorbox/loading.gif) no-repeat center center;} + #cboxTitle{position:absolute; bottom:-25px; left:0; text-align:center; width:100%; font-weight:bold; color:#7C7C7C;} + #cboxCurrent{position:absolute; bottom:-25px; left:58px; font-weight:bold; color:#7C7C7C;} + + #cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{position:absolute; bottom:-29px; background:url(colorbox/controls.png) no-repeat 0px 0px; width:23px; height:23px; text-indent:-9999px;} + #cboxPrevious{left:0px; background-position: -51px -25px;} + #cboxPrevious:hover{background-position:-51px 0px;} + #cboxNext{left:27px; background-position:-75px -25px;} + #cboxNext:hover{background-position:-75px 0px;} + #cboxClose{right:0; background-position:-100px -25px;} + #cboxClose:hover{background-position:-100px 0px;} + + .cboxSlideshow_on #cboxSlideshow{background-position:-125px 0px; right:27px;} + .cboxSlideshow_on #cboxSlideshow:hover{background-position:-150px 0px;} + .cboxSlideshow_off #cboxSlideshow{background-position:-150px -25px; right:27px;} + .cboxSlideshow_off #cboxSlideshow:hover{background-position:-125px 0px;} +#loading { + position: fixed; + left: 40%; + top: 50%; } + +a { + color: #333333; + text-decoration: none; } + a:hover { + color: black; + text-decoration: underline; } + +body { + font-family: "Lucida Grande", Helvetica, "Helvetica Neue", Arial, sans-serif; + padding: 12px; + background-color: #333333; } + +h1, h2, h3, h4 { + color: #1c2324; + margin: 0; + padding: 0; + margin-bottom: 12px; } + +table { + width: 100%; } + +#content { + clear: left; + background-color: white; + border: 2px solid #dddddd; + border-top: 8px solid #dddddd; + padding: 18px; + -webkit-border-bottom-left-radius: 5px; + -webkit-border-bottom-right-radius: 5px; + -webkit-border-top-right-radius: 5px; + -moz-border-radius-bottomleft: 5px; + -moz-border-radius-bottomright: 5px; + -moz-border-radius-topright: 5px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + border-top-right-radius: 5px; } + +.dataTables_filter, .dataTables_info { + padding: 2px 6px; } + +abbr.timeago { + text-decoration: none; + border: none; + font-weight: bold; } + +.timestamp { + float: right; + color: #dddddd; } + +.group_tabs { + list-style: none; + float: left; + margin: 0; + padding: 0; } + .group_tabs li { + display: inline; + float: left; } + .group_tabs li a { + font-family: Helvetica, Arial, sans-serif; + display: block; + float: left; + text-decoration: none; + padding: 4px 8px; + background-color: #aaaaaa; + background: -webkit-gradient(linear, 0 0, 0 bottom, from(#dddddd), to(#aaaaaa)); + background: -moz-linear-gradient(#dddddd, #aaaaaa); + background: linear-gradient(#dddddd, #aaaaaa); + text-shadow: #e5e5e5 1px 1px 0px; + border-bottom: none; + color: #333333; + font-weight: bold; + margin-right: 8px; + border-top: 1px solid #efefef; + -webkit-border-top-left-radius: 2px; + -webkit-border-top-right-radius: 2px; + -moz-border-radius-topleft: 2px; + -moz-border-radius-topright: 2px; + border-top-left-radius: 2px; + border-top-right-radius: 2px; } + .group_tabs li a:hover { + background-color: #cccccc; + background: -webkit-gradient(linear, 0 0, 0 bottom, from(#eeeeee), to(#aaaaaa)); + background: -moz-linear-gradient(#eeeeee, #aaaaaa); + background: linear-gradient(#eeeeee, #aaaaaa); } + .group_tabs li a:active { + padding-top: 5px; + padding-bottom: 3px; } + .group_tabs li.active a { + color: black; + text-shadow: white 1px 1px 0px; + background-color: #dddddd; + background: -webkit-gradient(linear, 0 0, 0 bottom, from(white), to(#dddddd)); + background: -moz-linear-gradient(white, #dddddd); + background: linear-gradient(white, #dddddd); } + +.file_list { + margin-bottom: 18px; } + +a.src_link { + background: url("./magnify.png") no-repeat left 50%; + padding-left: 18px; } + +tr, td { + margin: 0; + padding: 0; } + +th { + white-space: nowrap; } + th.ui-state-default { + cursor: pointer; } + th span.ui-icon { + float: left; } + +td { + padding: 4px 8px; } + td.strong { + font-weight: bold; } + +.source_table h3, .source_table h4 { + padding: 0; + margin: 0; + margin-bottom: 4px; } +.source_table .header { + padding: 10px; } +.source_table pre { + margin: 0; + padding: 0; + white-space: normal; + color: black; + font-family: "Monaco", "Inconsolata", "Consolas", monospace; } +.source_table code { + color: black; + font-family: "Monaco", "Inconsolata", "Consolas", monospace; } +.source_table pre { + background-color: #333333; } + .source_table pre ol { + margin: 0px; + padding: 0px; + margin-left: 45px; + font-size: 12px; + color: white; } + .source_table pre li { + margin: 0px; + padding: 2px 6px; + border-left: 5px solid white; } + .source_table pre li code { + white-space: pre; + white-space: pre-wrap; } + .source_table pre .hits { + float: right; + margin-left: 10px; + padding: 2px 4px; + background-color: #444444; + background: -webkit-gradient(linear, 0 0, 0 bottom, from(#222222), to(#666666)); + background: -moz-linear-gradient(#222222, #666666); + background: linear-gradient(#222222, #666666); + color: white; + font-family: Helvetica, "Helvetica Neue", Arial, sans-serif; + font-size: 10px; + font-weight: bold; + text-align: center; + border-radius: 6px; } + +#footer { + color: #dddddd; + font-size: 12px; + font-weight: bold; + margin-top: 12px; + text-align: right; } + #footer a { + color: #eeeeee; + text-decoration: underline; } + #footer a:hover { + color: white; + text-decoration: none; } + +.green { + color: #009900; } + +.red { + color: #990000; } + +.yellow { + color: #ddaa00; } + +.source_table .covered { + border-color: #009900; } +.source_table .missed { + border-color: #990000; } +.source_table .never { + border-color: black; } +.source_table .skipped { + border-color: #ffcc00; } +.source_table .covered:nth-child(odd) { + background-color: #cdf2cd; } +.source_table .covered:nth-child(even) { + background-color: #dbf2db; } +.source_table .missed:nth-child(odd) { + background-color: #f7c0c0; } +.source_table .missed:nth-child(even) { + background-color: #f7cfcf; } +.source_table .never:nth-child(odd) { + background-color: #efefef; } +.source_table .never:nth-child(even) { + background-color: #f4f4f4; } +.source_table .skipped:nth-child(odd) { + background-color: #fbf0c0; } +.source_table .skipped:nth-child(even) { + background-color: #fbffcf; } + + + diff --git a/coverage/assets/0.10.0/application.js b/coverage/assets/0.10.0/application.js new file mode 100644 index 0000000000..fe65d88219 --- /dev/null +++ b/coverage/assets/0.10.0/application.js @@ -0,0 +1,1707 @@ +/*! + * jQuery JavaScript Library v1.6.2 + * http://jquery.com/ + * + * Copyright 2011, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Thu Jun 30 14:16:56 2011 -0400 + */ + +(function(a,b){function cv(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cs(a){if(!cg[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ch||(ch=c.createElement("iframe"),ch.frameBorder=ch.width=ch.height=0),b.appendChild(ch);if(!ci||!ch.createElement)ci=(ch.contentWindow||ch.contentDocument).document,ci.write((c.compatMode==="CSS1Compat"?"":"")+""),ci.close();d=ci.createElement(a),ci.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ch)}cg[a]=e}return cg[a]}function cr(a,b){var c={};f.each(cm.concat.apply([],cm.slice(0,b)),function(){c[this]=a});return c}function cq(){cn=b}function cp(){setTimeout(cq,0);return cn=f.now()}function cf(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ce(){try{return new a.XMLHttpRequest}catch(b){}}function b$(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){c!=="border"&&f.each(e,function(){c||(d-=parseFloat(f.css(a,"padding"+this))||0),c==="margin"?d+=parseFloat(f.css(a,c+this))||0:d-=parseFloat(f.css(a,"border"+this+"Width"))||0});return d+"px"}d=bx(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0,c&&f.each(e,function(){d+=parseFloat(f.css(a,"padding"+this))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+this+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+this))||0)});return d+"px"}function bm(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(be,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bl(a){f.nodeName(a,"input")?bk(a):"getElementsByTagName"in a&&f.grep(a.getElementsByTagName("input"),bk)}function bk(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bj(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function bi(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bh(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c=f.expando,d=f.data(a),e=f.data(b,d);if(d=d[c]){var g=d.events;e=e[c]=f.extend({},d);if(g){delete e.handle,e.events={};for(var h in g)for(var i=0,j=g[h].length;i=0===c})}function V(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function N(a,b){return(a&&a!=="*"?a+".":"")+b.replace(z,"`").replace(A,"&")}function M(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,"events");if(!(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type==="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var s=r.live.slice(0);for(i=0;ic)break;a.currentTarget=e.elem,a.data=e.handleObj.data,a.handleObj=e.handleObj,o=e.handleObj.origHandler.apply(e.elem,arguments);if(o===!1||a.isPropagationStopped()){c=e.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function K(a,c,d){var e=f.extend({},d[0]);e.type=a,e.originalEvent={},e.liveFired=b,f.event.handle.call(c,e),e.isDefaultPrevented()&&d[0].preventDefault()}function E(){return!0}function D(){return!1}function m(a,c,d){var e=c+"defer",g=c+"queue",h=c+"mark",i=f.data(a,e,b,!0);i&&(d==="queue"||!f.data(a,g,b,!0))&&(d==="mark"||!f.data(a,h,b,!0))&&setTimeout(function(){!f.data(a,g,b,!0)&&!f.data(a,h,b,!0)&&(f.removeData(a,e,!0),i.resolve())},0)}function l(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function k(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(j,"$1-$2").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNaN(d)?i.test(d)?f.parseJSON(d):d:parseFloat(d)}catch(g){}f.data(a,c,d)}else d=b}return d}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=/-([a-z])/ig,x=function(a,b){return b.toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.6.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!A){A=e._Deferred();if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNaN:function(a){return a==null||!m.test(a)||isNaN(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in a);return c===b||D.call(a,c)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(b,c,d){a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b)),d=c.documentElement,(!d||!d.nodeName||d.nodeName==="parsererror")&&e.error("Invalid XML: "+b);return c},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?h.call(arguments,0):c,--e||g.resolveWith(g,h.call(b,0))}}var b=arguments,c=0,d=b.length,e=d,g=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred();if(d>1){for(;c
    a",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=a.getElementsByTagName("input")[0],k={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55$/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:a.className!=="t",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,k.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,k.optDisabled=!h.disabled;try{delete a.test}catch(v){k.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function(){k.noCloneEvent=!1}),a.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),k.radioValue=i.value==="t",i.setAttribute("checked","checked"),a.appendChild(i),l=c.createDocumentFragment(),l.appendChild(a.firstChild),k.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",m=c.getElementsByTagName("body")[0],o=c.createElement(m?"div":"body"),p={visibility:"hidden",width:0,height:0,border:0,margin:0},m&&f.extend(p,{position:"absolute",left:-1e3,top:-1e3});for(t in p)o.style[t]=p[t];o.appendChild(a),n=m||b,n.insertBefore(o,n.firstChild),k.appendChecked=i.checked,k.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,k.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="
    ",k.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="
    t
    ",q=a.getElementsByTagName("td"),u=q[0].offsetHeight===0,q[0].style.display="",q[1].style.display="none",k.reliableHiddenOffsets=u&&q[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",a.appendChild(j),k.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0),o.innerHTML="",n.removeChild(o);if(a.attachEvent)for(t in{submit:1,change:1,focusin:1})s="on"+t,u=s in a,u||(a.setAttribute(s,"return;"),u=typeof a[s]=="function"),k[t+"Bubbles"]=u;o=l=g=h=m=j=a=i=null;return k}(),f.boxModel=f.support.boxModel;var i=/^(?:\{.*\}|\[.*\])$/,j=/([a-z])([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!l(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g=f.expando,h=typeof c=="string",i,j=a.nodeType,k=j?f.cache:a,l=j?a[f.expando]:a[f.expando]&&f.expando;if((!l||e&&l&&!k[l][g])&&h&&d===b)return;l||(j?a[f.expando]=l=++f.uuid:l=f.expando),k[l]||(k[l]={},j||(k[l].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?k[l][g]=f.extend(k[l][g],c):k[l]=f.extend(k[l],c);i=k[l],e&&(i[g]||(i[g]={}),i=i[g]),d!==b&&(i[f.camelCase(c)]=d);if(c==="events"&&!i[c])return i[g]&&i[g].events;return h?i[f.camelCase(c)]||i[c]:i}},removeData:function(b,c,d){if(!!f.acceptData(b)){var e=f.expando,g=b.nodeType,h=g?f.cache:b,i=g?b[f.expando]:f.expando;if(!h[i])return;if(c){var j=d?h[i][e]:h[i];if(j){delete j[c];if(!l(j))return}}if(d){delete h[i][e];if(!l(h[i]))return}var k=h[i][e];f.support.deleteExpando||h!=a?delete h[i]:h[i]=null,k?(h[i]={},g||(h[i].toJSON=f.noop),h[i][e]=k):g&&(f.support.deleteExpando?delete b[f.expando]:b.removeAttribute?b.removeAttribute(f.expando):b[f.expando]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d=null;if(typeof a=="undefined"){if(this.length){d=f.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,g;for(var h=0,i=e.length;h-1)return!0;return!1},val:function(a){var c,d,e=this[0];if(!arguments.length){if(e){c=f.valHooks[e.nodeName.toLowerCase()]||f.valHooks[e.type];if(c&&"get"in c&&(d=c.get(e,"value"))!==b)return d;d=e.value;return typeof d=="string"?d.replace(p,""):d==null?"":d}return b}var g=f.isFunction(a);return this.each(function(d){var e=f(this),h;if(this.nodeType===1){g?h=a.call(this,d,e.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c=a.selectedIndex,d=[],e=a.options,g=a.type==="select-one";if(c<0)return null;for(var h=g?c:0,i=g?c+1:e.length;h=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attrFix:{tabindex:"tabIndex"},attr:function(a,c,d,e){var g=a.nodeType;if(!a||g===3||g===8||g===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);var h,i,j=g!==1||!f.isXMLDoc(a);j&&(c=f.attrFix[c]||c,i=f.attrHooks[c],i||(t.test(c)?i=w:v&&c!=="className"&&(f.nodeName(a,"form")||u.test(c))&&(i=v)));if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(i&&"set"in i&&j&&(h=i.set(a,d,c))!==b)return h;a.setAttribute(c,""+d);return d}if(i&&"get"in i&&j&&(h=i.get(a,c))!==null)return h;h=a.getAttribute(c);return h===null?b:h},removeAttr:function(a,b){var c;a.nodeType===1&&(b=f.attrFix[b]||b,f.support.getSetAttribute?a.removeAttribute(b):(f.attr(a,b,""),a.removeAttributeNode(a.getAttributeNode(b))),t.test(b)&&(c=f.propFix[b]||b)in a&&(a[c]=!1))},attrHooks:{type:{set:function(a,b){if(q.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},tabIndex:{get:function(a){var c=a.getAttributeNode("tabIndex");return c&&c.specified?parseInt(c.value,10):r.test(a.nodeName)||s.test(a.nodeName)&&a.href?0:b}},value:{get:function(a,b){if(v&&f.nodeName(a,"button"))return v.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(v&&f.nodeName(a,"button"))return v.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e=a.nodeType;if(!a||e===3||e===8||e===2)return b;var g,h,i=e!==1||!f.isXMLDoc(a);i&&(c=f.propFix[c]||c,h=f.propHooks[c]);return d!==b?h&&"set"in h&&(g=h.set(a,d,c))!==b?g:a[c]=d:h&&"get"in h&&(g=h.get(a,c))!==b?g:a[c]},propHooks:{}}),w={get:function(a,c){return f.prop(a,c)?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},f.support.getSetAttribute||(f.attrFix=f.propFix,v=f.attrHooks.name=f.attrHooks.title=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&d.nodeValue!==""?d.nodeValue:b},set:function(a,b,c){var d=a.getAttributeNode(c);if(d){d.nodeValue=b;return b}}},f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})})),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}})),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var x=/\.(.*)$/,y=/^(?:textarea|input|select)$/i,z=/\./g,A=/ /g,B=/[^\w\s.|`]/g,C=function(a){return a.replace(B,"\\$&")};f.event={add:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){if(d===!1)d=D;else if(!d)return;var g,h;d.handler&&(g=d,d=g.handler),d.guid||(d.guid=f.guid++);var i=f._data(a);if(!i)return;var j=i.events,k=i.handle;j||(i.events=j={}),k||(i.handle=k=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.handle.apply(k.elem,arguments):b}),k.elem=a,c=c.split(" ");var l,m=0,n;while(l=c[m++]){h=g?f.extend({},g):{handler:d,data:e},l.indexOf(".")>-1?(n=l.split("."),l=n.shift(),h.namespace=n.slice(0).sort().join(".")):(n=[],h.namespace=""),h.type=l,h.guid||(h.guid=d.guid);var o=j[l],p=f.event.special[l]||{};if(!o){o=j[l]=[];if(!p.setup||p.setup.call(a,e,n,k)===!1)a.addEventListener?a.addEventListener(l,k,!1):a.attachEvent&&a.attachEvent("on"+l,k)}p.add&&(p.add.call(a,h),h.handler.guid||(h.handler.guid=d.guid)),o.push(h),f.event.global[l]=!0}a=null}},global:{},remove:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){d===!1&&(d=D);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=f.hasData(a)&&f._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(d=c.handler,c=c.type);if(!c||typeof c=="string"&&c.charAt(0)==="."){c=c||"";for(h in t)f.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+f.map(m.slice(0).sort(),C).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!d){for(j=0;j=0&&(h=h.slice(0,-1),j=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i. +shift(),i.sort());if(!!e&&!f.event.customEvent[h]||!!f.event.global[h]){c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.exclusive=j,c.namespace=i.join("."),c.namespace_re=new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)");if(g||!e)c.preventDefault(),c.stopPropagation();if(!e){f.each(f.cache,function(){var a=f.expando,b=this[a];b&&b.events&&b.events[h]&&f.event.trigger(c,d,b.handle.elem)});return}if(e.nodeType===3||e.nodeType===8)return;c.result=b,c.target=e,d=d!=null?f.makeArray(d):[],d.unshift(c);var k=e,l=h.indexOf(":")<0?"on"+h:"";do{var m=f._data(k,"handle");c.currentTarget=k,m&&m.apply(k,d),l&&f.acceptData(k)&&k[l]&&k[l].apply(k,d)===!1&&(c.result=!1,c.preventDefault()),k=k.parentNode||k.ownerDocument||k===c.target.ownerDocument&&a}while(k&&!c.isPropagationStopped());if(!c.isDefaultPrevented()){var n,o=f.event.special[h]||{};if((!o._default||o._default.call(e.ownerDocument,c)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)){try{l&&e[h]&&(n=e[l],n&&(e[l]=null),f.event.triggered=h,e[h]())}catch(p){}n&&(e[l]=n),f.event.triggered=b}}return c.result}},handle:function(c){c=f.event.fix(c||a.event);var d=((f._data(this,"events")||{})[c.type]||[]).slice(0),e=!c.exclusive&&!c.namespace,g=Array.prototype.slice.call(arguments,0);g[0]=c,c.currentTarget=this;for(var h=0,i=d.length;h-1?f.map(a.options,function(a){return a.selected}).join("-"):"":f.nodeName(a,"select")&&(c=a.selectedIndex);return c},J=function(c){var d=c.target,e,g;if(!!y.test(d.nodeName)&&!d.readOnly){e=f._data(d,"_change_data"),g=I(d),(c.type!=="focusout"||d.type!=="radio")&&f._data(d,"_change_data",g);if(e===b||g===e)return;if(e!=null||g)c.type="change",c.liveFired=b,f.event.trigger(c,arguments[1],d)}};f.event.special.change={filters:{focusout:J,beforedeactivate:J,click:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(c==="radio"||c==="checkbox"||f.nodeName(b,"select"))&&J.call(this,a)},keydown:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(a.keyCode===13&&!f.nodeName(b,"textarea")||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&J.call(this,a)},beforeactivate:function(a){var b=a.target;f._data(b,"_change_data",I(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in H)f.event.add(this,c+".specialChange",H[c]);return y.test(this.nodeName)},teardown:function(a){f.event.remove(this,".specialChange");return y.test(this.nodeName)}},H=f.event.special.change.filters,H.focus=H.beforeactivate}f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){function e(a){var c=f.event.fix(a);c.type=b,c.originalEvent={},f.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var d=0;f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.each(["bind","one"],function(a,c){f.fn[c]=function(a,d,e){var g;if(typeof a=="object"){for(var h in a)this[c](h,d,a[h],e);return this}if(arguments.length===2||d===!1)e=d,d=b;c==="one"?(g=function(a){f(this).unbind(a,g);return e.apply(this,arguments)},g.guid=e.guid||f.guid++):g=e;if(a==="unload"&&c!=="one")this.one(a,d,e);else for(var i=0,j=this.length;i0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d=0,e=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,f,g){f=f||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return f;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(e.call(n)==="[object Array]")if(!u)f.push.apply(f,n);else if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&f.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&f.push(j[t]);else p(n,f);o&&(k(o,h,f,g),k.uniqueSort(f));return f};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=d++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(e.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var f=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

    ";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
    ";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g0)for(h=g;h0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(d=0,e=a.length;d-1:f(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=T.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a||typeof a=="string")return f.inArray(this[0],a?f(a):this.parent().children());return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(V(c[0])||V(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=S.call(arguments);O.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!U[a]?f.unique(e):e,(this.length>1||Q.test(d))&&P.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var X=/ jQuery\d+="(?:\d+|null)"/g,Y=/^\s+/,Z=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,$=/<([\w:]+)/,_=/",""],legend:[1,"
    ","
    "],thead:[1,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],col:[2,"","
    "],area:[1,"",""],_default:[0,"",""]};bf.optgroup=bf.option,bf.tbody=bf.tfoot=bf.colgroup=bf.caption=bf.thead,bf.th=bf.td,f.support.htmlSerialize||(bf._default=[1,"div
    ","
    "]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(X,""):null;if(typeof a=="string"&&!bb.test(a)&&(f.support.leadingWhitespace||!Y.test(a))&&!bf[($.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Z,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j +)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bi(a,d),e=bj(a),g=bj(d);for(h=0;e[h];++h)bi(e[h],g[h])}if(b){bh(a,d);if(c){e=bj(a),g=bj(d);for(h=0;e[h];++h)bh(e[h],g[h])}}e=g=null;return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!ba.test(k))k=b.createTextNode(k);else{k=k.replace(Z,"<$1>");var l=($.exec(k)||["",""])[1].toLowerCase(),m=bf[l]||bf._default,n=m[0],o=b.createElement("div");o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=_.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&Y.test(k)&&o.insertBefore(b.createTextNode(Y.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bo.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle;c.zoom=1;var e=f.isNaN(b)?"":"alpha(opacity="+b*100+")",g=d&&d.filter||c.filter||"";c.filter=bn.test(g)?g.replace(bn,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bx(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(by=function(a,c){var d,e,g;c=c.replace(bp,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bz=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bq.test(d)&&br.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bx=by||bz,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bB=/%20/g,bC=/\[\]$/,bD=/\r?\n/g,bE=/#.*$/,bF=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bG=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bH=/^(?:about|app|app\-storage|.+\-extension|file|widget):$/,bI=/^(?:GET|HEAD)$/,bJ=/^\/\//,bK=/\?/,bL=/)<[^<]*)*<\/script>/gi,bM=/^(?:select|textarea)/i,bN=/\s+/,bO=/([?&])_=[^&]*/,bP=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bQ=f.fn.load,bR={},bS={},bT,bU;try{bT=e.href}catch(bV){bT=c.createElement("a"),bT.href="",bT=bT.href}bU=bP.exec(bT.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bQ)return bQ.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
    ").append(c.replace(bL,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bM.test(this.nodeName)||bG.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bD,"\r\n")}}):{name:b.name,value:c.replace(bD,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?f.extend(!0,a,f.ajaxSettings,b):(b=a,a=f.extend(!0,f.ajaxSettings,b));for(var c in{context:1,url:1})c in b?a[c]=b[c]:c in f.ajaxSettings&&(a[c]=f.ajaxSettings[c]);return a},ajaxSettings:{url:bT,isLocal:bH.test(bU[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML}},ajaxPrefilter:bW(bR),ajaxTransport:bW(bS),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a?4:0;var o,r,u,w=l?bZ(d,v,l):b,x,y;if(a>=200&&a<300||a===304){if(d.ifModified){if(x=v.getResponseHeader("Last-Modified"))f.lastModified[k]=x;if(y=v.getResponseHeader("Etag"))f.etag[k]=y}if(a===304)c="notmodified",o=!0;else try{r=b$(d,w),c="success",o=!0}catch(z){c="parsererror",u=z}}else{u=c;if(!c||a)c="error",a<0&&(a=0)}v.status=a,v.statusText=c,o?h.resolveWith(e,[r,c,v]):h.rejectWith(e,[v,c,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.resolveWith(e,[v,c]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f._Deferred(),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bF.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.done,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bE,"").replace(bJ,bU[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bN),d.crossDomain==null&&(r=bP.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bU[1]&&r[2]==bU[2]&&(r[3]||(r[1]==="http:"?80:443))==(bU[3]||(bU[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bX(bR,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bI.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bK.test(d.url)?"&":"?")+d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bO,"$1_="+x);d.url=y+(y===d.url?(bK.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", */*; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bX(bS,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){status<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)bY(g,a[g],c,e);return d.join("&").replace(bB,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var b_=f.now(),ca=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+b_++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ca.test(b.url)||e&&ca.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ca,l),b.url===j&&(e&&(k=k.replace(ca,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cb=a.ActiveXObject?function(){for(var a in cd)cd[a](0,1)}:!1,cc=0,cd;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ce()||cf()}:ce,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cb&&delete cd[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cc,cb&&(cd||(cd={},f(a).unload(cb)),cd[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cg={},ch,ci,cj=/^(?:toggle|show|hide)$/,ck=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cl,cm=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cn,co=a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||a.oRequestAnimationFrame;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cr("show",3),a,b,c);for(var g=0,h=this.length;g=e.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),e.animatedProperties[this.prop]=!0;for(g in e.animatedProperties)e.animatedProperties[g]!==!0&&(c=!1);if(c){e.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){d.style["overflow"+b]=e.overflow[a]}),e.hide&&f(d).hide();if(e.hide||e.show)for(var i in e.animatedProperties)f.style(d,i,e.orig[i]);e.complete.call(d)}return!1}e.duration==Infinity?this.now=b:(h=b-this.startTime,this.state=h/e.duration,this.pos=f.easing[e.animatedProperties[this.prop]](this.state,h,0,1,e.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){for(var a=f.timers,b=0;b
    ";f.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),d=b.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,this.doesNotAddBorder=e.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,e.style.position="fixed",e.style.top="20px",this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),f.offset.initialize=f.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.offset.initialize(),f.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cu.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cu.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cv(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cv(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a&&a.style?parseFloat(f.css(a,d,"padding")):null},f.fn["outer"+c]=function(a){var b=this[0];return b&&b.style?parseFloat(f.css(b,d,a?"margin":"border")):null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c];return e.document.compatMode==="CSS1Compat"&&g||e.document.body["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var h=f.css(e,d),i=parseFloat(h);return f.isNaN(i)?h:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window); +var hljs=new function(){function l(o){return o.replace(/&/gm,"&").replace(/"}while(x.length||y.length){var u=t().splice(0,1)[0];v+=l(w.substr(q,u.offset-q));q=u.offset;if(u.event=="start"){v+=r(u.node);s.push(u.node)}else{if(u.event=="stop"){var p=s.length;do{p--;var o=s[p];v+=("")}while(o!=u.node);s.splice(p,1);while(p'+l(K[0])+""}else{M+=l(K[0])}O=N.lR.lastIndex;K=N.lR.exec(L)}M+=l(L.substr(O,L.length-O));return M}function J(r,L){if(L.sL&&d[L.sL]){var K=f(L.sL,r);s+=K.keyword_count;return K.value}else{return E(r,L)}}function H(L,r){var K=L.cN?'':"";if(L.rB){p+=K;L.buffer=""}else{if(L.eB){p+=l(r)+K;L.buffer=""}else{p+=K;L.buffer=r}}B.push(L);A+=L.r}function D(N,K,P){var Q=B[B.length-1];if(P){p+=J(Q.buffer+N,Q);return false}var L=y(K,Q);if(L){p+=J(Q.buffer+N,Q);H(L,K);return L.rB}var r=v(B.length-1,K);if(r){var M=Q.cN?"":"";if(Q.rE){p+=J(Q.buffer+N,Q)+M}else{if(Q.eE){p+=J(Q.buffer+N,Q)+M+l(K)}else{p+=J(Q.buffer+N+K,Q)+M}}while(r>1){M=B[B.length-2].cN?"":"";p+=M;r--;B.length--}var O=B[B.length-1];B.length--;B[B.length-1].buffer="";if(O.starts){H(O.starts,"")}return Q.rE}if(w(K,Q)){throw"Illegal"}}var G=d[I];var B=[G.dM];var A=0;var s=0;var p="";try{var u=0;G.dM.buffer="";do{var x=q(C,u);var t=D(x[0],x[1],x[2]);u+=x[0].length;if(!t){u+=x[1].length}}while(!x[2]);if(B.length>1){throw"Illegal"}return{language:I,r:A,keyword_count:s,value:p}}catch(F){if(F=="Illegal"){return{language:null,r:0,keyword_count:0,value:l(C)}}else{throw F}}}function h(){function o(t,s,u){if(t.compiled){return}if(!u){t.bR=c(s,t.b?t.b:"\\B|\\b");if(!t.e&&!t.eW){t.e="\\B|\\b"}if(t.e){t.eR=c(s,t.e)}}if(t.i){t.iR=c(s,t.i)}if(t.r==undefined){t.r=1}if(t.k){t.lR=c(s,t.l||hljs.IR,true)}for(var r in t.k){if(!t.k.hasOwnProperty(r)){continue}if(t.k[r] instanceof Object){t.kG=t.k}else{t.kG={keyword:t.k}}break}if(!t.c){t.c=[]}t.compiled=true;for(var q=0;qx.keyword_count+x.r){x=u}if(u.keyword_count+u.r>w.keyword_count+w.r){x=w;w=u}}}var s=t.className;if(!s.match(w.language)){s=s?(s+" "+w.language):w.language}var o=b(t);if(o.length){var q=document.createElement("pre");q.innerHTML=w.value;w.value=k(o,b(q),A)}if(y){w.value=w.value.replace(/^((<[^>]+>|\t)+)/gm,function(B,E,D,C){return E.replace(/\t/g,y)})}if(p){w.value=w.value.replace(/\n/g,"
    ")}if(/MSIE [678]/.test(navigator.userAgent)&&t.tagName=="CODE"&&t.parentNode.tagName=="PRE"){var q=t.parentNode;var v=document.createElement("div");v.innerHTML="
    "+w.value+"
    ";t=v.firstChild.firstChild;v.firstChild.cN=q.cN;q.parentNode.replaceChild(v.firstChild,q)}else{t.innerHTML=w.value}t.className=s;t.dataset={};t.dataset.result={language:w.language,kw:w.keyword_count,re:w.r};if(x&&x.language){t.dataset.second_best={language:x.language,kw:x.keyword_count,re:x.r}}}function j(){if(j.called){return}j.called=true;e();var q=document.getElementsByTagName("pre");for(var o=0;o|>=|>>|>>=|>>>|>>>=|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~";this.BE={b:"\\\\.",r:0};this.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[this.BE],r:0};this.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[this.BE],r:0};this.CLCM={cN:"comment",b:"//",e:"$"};this.CBLCLM={cN:"comment",b:"/\\*",e:"\\*/"};this.HCM={cN:"comment",b:"#",e:"$"};this.NM={cN:"number",b:this.NR,r:0};this.CNM={cN:"number",b:this.CNR,r:0};this.inherit=function(o,r){var q={};for(var p in o){q[p]=o[p]}if(r){for(var p in r){q[p]=r[p]}}return q}}();hljs.LANGUAGES.ruby=function(){var g="[a-zA-Z_][a-zA-Z0-9_]*(\\!|\\?)?";var a="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?";var n={keyword:{and:1,"false":1,then:1,defined:1,module:1,"in":1,"return":1,redo:1,"if":1,BEGIN:1,retry:1,end:1,"for":1,"true":1,self:1,when:1,next:1,until:1,"do":1,begin:1,unless:1,END:1,rescue:1,nil:1,"else":1,"break":1,undef:1,not:1,"super":1,"class":1,"case":1,require:1,yield:1,alias:1,"while":1,ensure:1,elsif:1,or:1,def:1},keymethods:{__id__:1,__send__:1,abort:1,abs:1,"all?":1,allocate:1,ancestors:1,"any?":1,arity:1,assoc:1,at:1,at_exit:1,autoload:1,"autoload?":1,"between?":1,binding:1,binmode:1,"block_given?":1,call:1,callcc:1,caller:1,capitalize:1,"capitalize!":1,casecmp:1,"catch":1,ceil:1,center:1,chomp:1,"chomp!":1,chop:1,"chop!":1,chr:1,"class":1,class_eval:1,"class_variable_defined?":1,class_variables:1,clear:1,clone:1,close:1,close_read:1,close_write:1,"closed?":1,coerce:1,collect:1,"collect!":1,compact:1,"compact!":1,concat:1,"const_defined?":1,const_get:1,const_missing:1,const_set:1,constants:1,count:1,crypt:1,"default":1,default_proc:1,"delete":1,"delete!":1,delete_at:1,delete_if:1,detect:1,display:1,div:1,divmod:1,downcase:1,"downcase!":1,downto:1,dump:1,dup:1,each:1,each_byte:1,each_index:1,each_key:1,each_line:1,each_pair:1,each_value:1,each_with_index:1,"empty?":1,entries:1,eof:1,"eof?":1,"eql?":1,"equal?":1,"eval":1,exec:1,exit:1,"exit!":1,extend:1,fail:1,fcntl:1,fetch:1,fileno:1,fill:1,find:1,find_all:1,first:1,flatten:1,"flatten!":1,floor:1,flush:1,for_fd:1,foreach:1,fork:1,format:1,freeze:1,"frozen?":1,fsync:1,getc:1,gets:1,global_variables:1,grep:1,gsub:1,"gsub!":1,"has_key?":1,"has_value?":1,hash:1,hex:1,id:1,include:1,"include?":1,included_modules:1,index:1,indexes:1,indices:1,induced_from:1,inject:1,insert:1,inspect:1,instance_eval:1,instance_method:1,instance_methods:1,"instance_of?":1,"instance_variable_defined?":1,instance_variable_get:1,instance_variable_set:1,instance_variables:1,"integer?":1,intern:1,invert:1,ioctl:1,"is_a?":1,isatty:1,"iterator?":1,join:1,"key?":1,keys:1,"kind_of?":1,lambda:1,last:1,length:1,lineno:1,ljust:1,load:1,local_variables:1,loop:1,lstrip:1,"lstrip!":1,map:1,"map!":1,match:1,max:1,"member?":1,merge:1,"merge!":1,method:1,"method_defined?":1,method_missing:1,methods:1,min:1,module_eval:1,modulo:1,name:1,nesting:1,"new":1,next:1,"next!":1,"nil?":1,nitems:1,"nonzero?":1,object_id:1,oct:1,open:1,pack:1,partition:1,pid:1,pipe:1,pop:1,popen:1,pos:1,prec:1,prec_f:1,prec_i:1,print:1,printf:1,private_class_method:1,private_instance_methods:1,"private_method_defined?":1,private_methods:1,proc:1,protected_instance_methods:1,"protected_method_defined?":1,protected_methods:1,public_class_method:1,public_instance_methods:1,"public_method_defined?":1,public_methods:1,push:1,putc:1,puts:1,quo:1,raise:1,rand:1,rassoc:1,read:1,read_nonblock:1,readchar:1,readline:1,readlines:1,readpartial:1,rehash:1,reject:1,"reject!":1,remainder:1,reopen:1,replace:1,require:1,"respond_to?":1,reverse:1,"reverse!":1,reverse_each:1,rewind:1,rindex:1,rjust:1,round:1,rstrip:1,"rstrip!":1,scan:1,seek:1,select:1,send:1,set_trace_func:1,shift:1,singleton_method_added:1,singleton_methods:1,size:1,sleep:1,slice:1,"slice!":1,sort:1,"sort!":1,sort_by:1,split:1,sprintf:1,squeeze:1,"squeeze!":1,srand:1,stat:1,step:1,store:1,strip:1,"strip!":1,sub:1,"sub!":1,succ:1,"succ!":1,sum:1,superclass:1,swapcase:1,"swapcase!":1,sync:1,syscall:1,sysopen:1,sysread:1,sysseek:1,system:1,syswrite:1,taint:1,"tainted?":1,tell:1,test:1,"throw":1,times:1,to_a:1,to_ary:1,to_f:1,to_hash:1,to_i:1,to_int:1,to_io:1,to_proc:1,to_s:1,to_str:1,to_sym:1,tr:1,"tr!":1,tr_s:1,"tr_s!":1,trace_var:1,transpose:1,trap:1,truncate:1,"tty?":1,type:1,ungetc:1,uniq:1,"uniq!":1,unpack:1,unshift:1,untaint:1,untrace_var:1,upcase:1,"upcase!":1,update:1,upto:1,"value?":1,values:1,values_at:1,warn:1,write:1,write_nonblock:1,"zero?":1,zip:1}};var h={cN:"yardoctag",b:"@[A-Za-z]+"};var d={cN:"comment",b:"#",e:"$",c:[h]};var c={cN:"comment",b:"^\\=begin",e:"^\\=end",c:[h],r:10};var b={cN:"comment",b:"^__END__",e:"\\n$"};var u={cN:"subst",b:"#\\{",e:"}",l:g,k:n};var p=[hljs.BE,u];var s={cN:"string",b:"'",e:"'",c:p,r:0};var r={cN:"string",b:'"',e:'"',c:p,r:0};var q={cN:"string",b:"%[qw]?\\(",e:"\\)",c:p,r:10};var o={cN:"string",b:"%[qw]?\\[",e:"\\]",c:p,r:10};var m={cN:"string",b:"%[qw]?{",e:"}",c:p,r:10};var l={cN:"string",b:"%[qw]?<",e:">",c:p,r:10};var k={cN:"string",b:"%[qw]?/",e:"/",c:p,r:10};var j={cN:"string",b:"%[qw]?%",e:"%",c:p,r:10};var i={cN:"string",b:"%[qw]?-",e:"-",c:p,r:10};var t={cN:"string",b:"%[qw]?\\|",e:"\\|",c:p,r:10};var e={cN:"function",b:"\\bdef\\s+",e:" |$|;",l:g,k:n,c:[{cN:"title",b:a,l:g,k:n},{cN:"params",b:"\\(",e:"\\)",l:g,k:n},d,c,b]};var f={cN:"identifier",b:g,l:g,k:n,r:0};var v=[d,c,b,s,r,q,o,m,l,k,j,i,t,{cN:"class",b:"\\b(class|module)\\b",e:"$|;",k:{"class":1,module:1},c:[{cN:"title",b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?",r:0},{cN:"inheritance",b:"<\\s*",c:[{cN:"parent",b:"("+hljs.IR+"::)?"+hljs.IR}]},d,c,b]},e,{cN:"constant",b:"(::)?([A-Z]\\w*(::)?)+",r:0},{cN:"symbol",b:":",c:[s,r,q,o,m,l,k,j,i,t,f],r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{cN:"number",b:"\\?\\w"},{cN:"variable",b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},f,{b:"("+hljs.RSR+")\\s*",c:[d,c,b,{cN:"regexp",b:"/",e:"/[a-z]*",i:"\\n",c:[hljs.BE]}],r:0}];u.c=v;e.c[1].c=v;return{dM:{l:g,k:n,c:v}}}(); +/*! + Colorbox v1.5.13 - 2014-08-04 + jQuery lightbox and modal window plugin + (c) 2014 Jack Moore - http://www.jacklmoore.com/colorbox + license: http://www.opensource.org/licenses/mit-license.php + */ + +(function ($, document, window) { + var + // Default settings object. + // See http://jacklmoore.com/colorbox for details. + defaults = { + // data sources + html: false, + photo: false, + iframe: false, + inline: false, + + // behavior and appearance + transition: "elastic", + speed: 300, + fadeOut: 300, + width: false, + initialWidth: "600", + innerWidth: false, + maxWidth: false, + height: false, + initialHeight: "450", + innerHeight: false, + maxHeight: false, + scalePhotos: true, + scrolling: true, + opacity: 0.9, + preloading: true, + className: false, + overlayClose: true, + escKey: true, + arrowKey: true, + top: false, + bottom: false, + left: false, + right: false, + fixed: false, + data: undefined, + closeButton: true, + fastIframe: true, + open: false, + reposition: true, + loop: true, + slideshow: false, + slideshowAuto: true, + slideshowSpeed: 2500, + slideshowStart: "start slideshow", + slideshowStop: "stop slideshow", + photoRegex: /\.(gif|png|jp(e|g|eg)|bmp|ico|webp|jxr|svg)((#|\?).*)?$/i, + + // alternate image paths for high-res displays + retinaImage: false, + retinaUrl: false, + retinaSuffix: '@2x.$1', + + // internationalization + current: "image {current} of {total}", + previous: "previous", + next: "next", + close: "close", + xhrError: "This content failed to load.", + imgError: "This image failed to load.", + + // accessbility + returnFocus: true, + trapFocus: true, + + // callbacks + onOpen: false, + onLoad: false, + onComplete: false, + onCleanup: false, + onClosed: false, + + rel: function() { + return this.rel; + }, + href: function() { + // using this.href would give the absolute url, when the href may have been inteded as a selector (e.g. '#container') + return $(this).attr('href'); + }, + title: function() { + return this.title; + } + }, + + // Abstracting the HTML and event identifiers for easy rebranding + colorbox = 'colorbox', + prefix = 'cbox', + boxElement = prefix + 'Element', + + // Events + event_open = prefix + '_open', + event_load = prefix + '_load', + event_complete = prefix + '_complete', + event_cleanup = prefix + '_cleanup', + event_closed = prefix + '_closed', + event_purge = prefix + '_purge', + + // Cached jQuery Object Variables + $overlay, + $box, + $wrap, + $content, + $topBorder, + $leftBorder, + $rightBorder, + $bottomBorder, + $related, + $window, + $loaded, + $loadingBay, + $loadingOverlay, + $title, + $current, + $slideshow, + $next, + $prev, + $close, + $groupControls, + $events = $(''), // $({}) would be prefered, but there is an issue with jQuery 1.4.2 + + // Variables for cached values or use across multiple functions + settings, + interfaceHeight, + interfaceWidth, + loadedHeight, + loadedWidth, + index, + photo, + open, + active, + closing, + loadingTimer, + publicMethod, + div = "div", + requests = 0, + previousCSS = {}, + init; + + // **************** + // HELPER FUNCTIONS + // **************** + + // Convenience function for creating new jQuery objects + function $tag(tag, id, css) { + var element = document.createElement(tag); + + if (id) { + element.id = prefix + id; + } + + if (css) { + element.style.cssText = css; + } + + return $(element); + } + + // Get the window height using innerHeight when available to avoid an issue with iOS + // http://bugs.jquery.com/ticket/6724 + function winheight() { + return window.innerHeight ? window.innerHeight : $(window).height(); + } + + function Settings(element, options) { + if (options !== Object(options)) { + options = {}; + } + + this.cache = {}; + this.el = element; + + this.value = function(key) { + var dataAttr; + + if (this.cache[key] === undefined) { + dataAttr = $(this.el).attr('data-cbox-'+key); + + if (dataAttr !== undefined) { + this.cache[key] = dataAttr; + } else if (options[key] !== undefined) { + this.cache[key] = options[key]; + } else if (defaults[key] !== undefined) { + this.cache[key] = defaults[key]; + } + } + + return this.cache[key]; + }; + + this.get = function(key) { + var value = this.value(key); + return $.isFunction(value) ? value.call(this.el, this) : value; + }; + } + + // Determine the next and previous members in a group. + function getIndex(increment) { + var + max = $related.length, + newIndex = (index + increment) % max; + + return (newIndex < 0) ? max + newIndex : newIndex; + } + + // Convert '%' and 'px' values to integers + function setSize(size, dimension) { + return Math.round((/%/.test(size) ? ((dimension === 'x' ? $window.width() : winheight()) / 100) : 1) * parseInt(size, 10)); + } + + // Checks an href to see if it is a photo. + // There is a force photo option (photo: true) for hrefs that cannot be matched by the regex. + function isImage(settings, url) { + return settings.get('photo') || settings.get('photoRegex').test(url); + } + + function retinaUrl(settings, url) { + return settings.get('retinaUrl') && window.devicePixelRatio > 1 ? url.replace(settings.get('photoRegex'), settings.get('retinaSuffix')) : url; + } + + function trapFocus(e) { + if ('contains' in $box[0] && !$box[0].contains(e.target) && e.target !== $overlay[0]) { + e.stopPropagation(); + $box.focus(); + } + } + + function setClass(str) { + if (setClass.str !== str) { + $box.add($overlay).removeClass(setClass.str).addClass(str); + setClass.str = str; + } + } + + function getRelated(rel) { + index = 0; + + if (rel && rel !== false && rel !== 'nofollow') { + $related = $('.' + boxElement).filter(function () { + var options = $.data(this, colorbox); + var settings = new Settings(this, options); + return (settings.get('rel') === rel); + }); + index = $related.index(settings.el); + + // Check direct calls to Colorbox. + if (index === -1) { + $related = $related.add(settings.el); + index = $related.length - 1; + } + } else { + $related = $(settings.el); + } + } + + function trigger(event) { + // for external use + $(document).trigger(event); + // for internal use + $events.triggerHandler(event); + } + + var slideshow = (function(){ + var active, + className = prefix + "Slideshow_", + click = "click." + prefix, + timeOut; + + function clear () { + clearTimeout(timeOut); + } + + function set() { + if (settings.get('loop') || $related[index + 1]) { + clear(); + timeOut = setTimeout(publicMethod.next, settings.get('slideshowSpeed')); + } + } + + function start() { + $slideshow + .html(settings.get('slideshowStop')) + .unbind(click) + .one(click, stop); + + $events + .bind(event_complete, set) + .bind(event_load, clear); + + $box.removeClass(className + "off").addClass(className + "on"); + } + + function stop() { + clear(); + + $events + .unbind(event_complete, set) + .unbind(event_load, clear); + + $slideshow + .html(settings.get('slideshowStart')) + .unbind(click) + .one(click, function () { + publicMethod.next(); + start(); + }); + + $box.removeClass(className + "on").addClass(className + "off"); + } + + function reset() { + active = false; + $slideshow.hide(); + clear(); + $events + .unbind(event_complete, set) + .unbind(event_load, clear); + $box.removeClass(className + "off " + className + "on"); + } + + return function(){ + if (active) { + if (!settings.get('slideshow')) { + $events.unbind(event_cleanup, reset); + reset(); + } + } else { + if (settings.get('slideshow') && $related[1]) { + active = true; + $events.one(event_cleanup, reset); + if (settings.get('slideshowAuto')) { + start(); + } else { + stop(); + } + $slideshow.show(); + } + } + }; + + }()); + + + function launch(element) { + var options; + + if (!closing) { + + options = $(element).data(colorbox); + + settings = new Settings(element, options); + + getRelated(settings.get('rel')); + + if (!open) { + open = active = true; // Prevents the page-change action from queuing up if the visitor holds down the left or right keys. + + setClass(settings.get('className')); + + // Show colorbox so the sizes can be calculated in older versions of jQuery + $box.css({visibility:'hidden', display:'block', opacity:''}); + + $loaded = $tag(div, 'LoadedContent', 'width:0; height:0; overflow:hidden; visibility:hidden'); + $content.css({width:'', height:''}).append($loaded); + + // Cache values needed for size calculations + interfaceHeight = $topBorder.height() + $bottomBorder.height() + $content.outerHeight(true) - $content.height(); + interfaceWidth = $leftBorder.width() + $rightBorder.width() + $content.outerWidth(true) - $content.width(); + loadedHeight = $loaded.outerHeight(true); + loadedWidth = $loaded.outerWidth(true); + + // Opens inital empty Colorbox prior to content being loaded. + var initialWidth = setSize(settings.get('initialWidth'), 'x'); + var initialHeight = setSize(settings.get('initialHeight'), 'y'); + var maxWidth = settings.get('maxWidth'); + var maxHeight = settings.get('maxHeight'); + + settings.w = (maxWidth !== false ? Math.min(initialWidth, setSize(maxWidth, 'x')) : initialWidth) - loadedWidth - interfaceWidth; + settings.h = (maxHeight !== false ? Math.min(initialHeight, setSize(maxHeight, 'y')) : initialHeight) - loadedHeight - interfaceHeight; + + $loaded.css({width:'', height:settings.h}); + publicMethod.position(); + + trigger(event_open); + settings.get('onOpen'); + + $groupControls.add($title).hide(); + + $box.focus(); + + if (settings.get('trapFocus')) { + // Confine focus to the modal + // Uses event capturing that is not supported in IE8- + if (document.addEventListener) { + + document.addEventListener('focus', trapFocus, true); + + $events.one(event_closed, function () { + document.removeEventListener('focus', trapFocus, true); + }); + } + } + + // Return focus on closing + if (settings.get('returnFocus')) { + $events.one(event_closed, function () { + $(settings.el).focus(); + }); + } + } + + var opacity = parseFloat(settings.get('opacity')); + $overlay.css({ + opacity: opacity === opacity ? opacity : '', + cursor: settings.get('overlayClose') ? 'pointer' : '', + visibility: 'visible' + }).show(); + + if (settings.get('closeButton')) { + $close.html(settings.get('close')).appendTo($content); + } else { + $close.appendTo('
    '); // replace with .detach() when dropping jQuery < 1.4 + } + + load(); + } + } + + // Colorbox's markup needs to be added to the DOM prior to being called + // so that the browser will go ahead and load the CSS background images. + function appendHTML() { + if (!$box && document.body) { + init = false; + $window = $(window); + $box = $tag(div).attr({ + id: colorbox, + 'class': $.support.opacity === false ? prefix + 'IE' : '', // class for optional IE8 & lower targeted CSS. + role: 'dialog', + tabindex: '-1' + }).hide(); + $overlay = $tag(div, "Overlay").hide(); + $loadingOverlay = $([$tag(div, "LoadingOverlay")[0],$tag(div, "LoadingGraphic")[0]]); + $wrap = $tag(div, "Wrapper"); + $content = $tag(div, "Content").append( + $title = $tag(div, "Title"), + $current = $tag(div, "Current"), + $prev = $('
    <% end %> <% end %> diff --git a/app/views/reviews/index.html.erb b/app/views/reviews/index.html.erb index e755bdcb04..c162625b60 100644 --- a/app/views/reviews/index.html.erb +++ b/app/views/reviews/index.html.erb @@ -6,10 +6,13 @@

    <%= star_string(review.stars) %>

    <%= review.description %>

    <%= "By: #{review.author}" if review.author != '' %>

    -

    <%= button_to "Delete Review", {controller: 'reviews', action: 'destroy', product_id: @product.id, id: review.id}, method: :delete, data: {confirm: "Are you sure?"}%>

    +

    <%= link_to "Delete Review", merchant_product_review_path(@merchant.id, @product.id, review.id), method: :delete, data: {confirm: "Are you sure?"}%>

    <% end %> - +<%# {controller: 'reviews', action: 'destroy', product_id: @product.id, id: review.id}, method: :delete, %> +<% unless @product.merchant == current_merchant %> +

    <%= link_to 'Add A Review!', new_merchant_product_review_path(@merchant.id, @product.id) %>

    +<% end %>

    <%= link_to "Back to Product", merchant_product_path(@merchant.id, @product.id) %>

    diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index b64b71d7ab..686705b0f4 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -8,7 +8,10 @@ class ProductsControllerTest < ActionController::TestCase end test "should get show" do - get :show, {merchant_id: (products(:glitter).merchant).id, id: products(:glitter).id} + merchant = products(:glitter).merchant + + get :show, {id: products(:glitter).id, merchant_id: merchant.id } + #get merchant_product_path(merchant.id, products(:glitter).id) assert_response :success end @@ -19,27 +22,26 @@ class ProductsControllerTest < ActionController::TestCase end test "should be able to create a new product" do - post_params = {product: {name: "Glitter Wand", description: "a glittery wand", price: 1500, image: 'http://placekitten.com/200/300', merchant_id: 2, inventory: 7, rating: 5}} + post_params = {name: "Glitter Wand", description: "a glittery wand", price: "15.00", image: 'http://placekitten.com/200/300', merchant_id: 2, inventory: 7, rating: 5} - post :create, {merchant_id: (products(:glitter).merchant).id}, post_params + post :create, {merchant_id: (products(:glitter).merchant).id, product: post_params} assert_response :redirect - # This action will need to change to merchant's create_new_product path end test "creating a product changes the number of products" do assert_difference("Product.count",1) do - post_params = {product: {name: "Glitter Wand", description: "a glittery wand", price: 1500, image: 'http://placekitten.com/200/300', merchant_id: 2, inventory: 7, rating: 5}} - post :create, {merchant_id: (products(:glitter).merchant).id}, post_params + post :create, {merchant_id: (products(:glitter).merchant).id, "product" => {name: "Glitter Wand", description: "a glittery wand", price: "15.00", image: 'http://placekitten.com/200/300', inventory: 7, rating: 5}} end end - test "should get edit" do - get :edit, {merchant_id: (products(:glitter).merchant).id, id: products(:glitter).id} + test "should get edit -----!!!!" do + product = products(:glitter) + get :edit, {id: product.id, merchant_id: products(:glitter).merchant.id } assert_response :success end test "should be able to update a product" do - put :update, {merchant_id: (products(:glitter).merchant).id, id: products(:glitter).id, product: {name: "Glitter Wand", description: "a glittery wand", price: 1500, image: 'http://placekitten.com/200/300', merchant_id: 2, inventory: 7, rating: 5}} + put :update, {merchant_id: (products(:glitter).merchant).id, id: products(:glitter).id, product: {name: "Glitter Wand", description: "a glittery wand", price: "15.00", image: 'http://placekitten.com/200/300', merchant_id: 2, inventory: 7, rating: 5}} assert_redirected_to controller: "products", action: "show" end diff --git a/test/fixtures/reviews.yml b/test/fixtures/reviews.yml index 5dd530b894..8165e61b53 100644 --- a/test/fixtures/reviews.yml +++ b/test/fixtures/reviews.yml @@ -4,7 +4,7 @@ glitter_review: description: "nfjd" stars: 3 author: "fndjk" - product: :glitter + product: glitter shoe_review: description: "mkd" diff --git a/test/models/product_test.rb b/test/models/product_test.rb index ede2eaf2e5..25f9139d15 100644 --- a/test/models/product_test.rb +++ b/test/models/product_test.rb @@ -31,7 +31,7 @@ class ProductTest < ActiveSupport::TestCase end - test "No Rating has the correct reviews" do + test "No_Rating has the correct reviews" do assert_includes products(:no_rating).reviews, reviews(:rating_review_one) assert_includes products(:no_rating).reviews, reviews(:rating_review_two) end From 40d8efc8aa63a828355b58e79d366352ed92bc87 Mon Sep 17 00:00:00 2001 From: Sabrina Wilbert Date: Tue, 25 Oct 2016 15:34:10 -0700 Subject: [PATCH 101/191] Able to add new order. --- app/controllers/orders_controller.rb | 7 +++++-- app/models/order.rb | 2 +- app/views/layouts/application.html.erb | 7 +++++++ app/views/orders/cart.html.erb | 6 +++--- app/views/orders/show.html.erb | 21 +++++++++++++++++++-- app/views/orders/update.html.erb | 1 - app/views/products/index.html.erb | 1 - app/views/products/show.html.erb | 10 +++++----- config/routes.rb | 3 ++- 9 files changed, 42 insertions(+), 16 deletions(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index e2c9aa3113..de59cee8a2 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -3,7 +3,10 @@ def index @orders = Order.all end - def view_cart + def show + #get list of items for this guest or merchant_id + @order_items = LineItem.where(order_id: current_cart.id) + end def new @@ -14,7 +17,7 @@ def create def subtotal @order.line_items do |line| - line_cost = @line.price * @line.qty + line_cost = line.price * line.qty total_amount << line_cost return total_amount end diff --git a/app/models/order.rb b/app/models/order.rb index 889b519a8e..11692f83c2 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -11,7 +11,7 @@ def add_product(product, qty) #once the line is added return the user back to the product page line = LineItem.new line.product = product - line.merchant = product.merchant + line.merchant_id = product.merchant_id line.qty = qty line.price = product.price line_items << line diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index f9cf1a7efc..e318d5e637 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -15,6 +15,13 @@
  • <%= link_to("log in via Github", "/auth/github") %>
  • <% end %> + <% if current_cart != nil %> + <%= link_to("View Cart", 'orders/show', method: :get) %> + <% else %> +
      +
    • You have nothing in your cart to show.

    • +
    + <% end %> <% if flash[:notice] %>

    <%= flash[:notice] %>

    diff --git a/app/views/orders/cart.html.erb b/app/views/orders/cart.html.erb index dc03ca481e..c295e57feb 100644 --- a/app/views/orders/cart.html.erb +++ b/app/views/orders/cart.html.erb @@ -2,12 +2,12 @@
    -<%= form_for @order.line_items do |f| %> +<%= form_for @line_items do |f| %>

    <%= f.label :product.name %>

    <%= f.text_field :product_id %>
    - <%= f.number_field :quantity, value: order_item.quantity.to_i, class: "form-control", min: 1 %> - <%= f.hidden_field :product_id, value: product.id %> + <%= f.number_field :quantity, order_item.quantity.to_i, class: "form-control", min: 1 %> + <%= f.hidden_field :product_id, product.id %>
    <%= f.label :description %> diff --git a/app/views/orders/show.html.erb b/app/views/orders/show.html.erb index 22eb495f6f..6f57c6739a 100644 --- a/app/views/orders/show.html.erb +++ b/app/views/orders/show.html.erb @@ -1,2 +1,19 @@ -

    Orders#show

    -

    Find me in app/views/orders/show.html.erb

    +
    +
    +
    +<%= @order_items.each do |f| %> +

    <%= f.label :product.name %>

    + <%= f.text_field :product_id %> +
    + <%= f.number_field :quantity, order_item.quantity.to_i, class: "form-control", min: 1 %> + <%= f.hidden_field :product_id, product.id %> +
    + + <%= f.label :description %> + <%= f.text_field :description %> + + <%= f.submit %> + <% end %> +
    +
    +
    diff --git a/app/views/orders/update.html.erb b/app/views/orders/update.html.erb index 0c6ae77427..21caac1f70 100644 --- a/app/views/orders/update.html.erb +++ b/app/views/orders/update.html.erb @@ -1,3 +1,2 @@

    Orders#update

    Find me in app/views/orders/update.html.erb

    -<%= @current_guest.inspect %> diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index 8534ac2513..74ce723fe0 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -10,4 +10,3 @@ <% if current_merchant != nil %>

    <%= link_to "Add New Product", new_merchant_product_path(@merchant.id) %>

    <% end %> -<%= session.inspect %> diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index f661e2e236..2107fac182 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -22,14 +22,14 @@
    - <%= form_for(controller: "orders", action: "add_to_cart", method: "post") do |f| %> + <%= form_tag(controller: "orders", action: "add_to_cart", method: "post") do |f| %>
    Price:<%= @product.price %>
    - <%= f.number_field :qty, value: 1, class: "form-control", min: 1 %> + <%= number_field_tag :qty, 1, class: "form-control", min: 1 %>
    - <%= f.hidden_field :product_id, value: @product.id %> - <%= f.hidden_field :merchant_id, value: @product.merchant_id %> - <%= f.submit "Add to Cart", class: "btn btn-primary" %> + <%= hidden_field_tag :product_id, @product.id %> + <%= hidden_field_tag :merchant_id, @product.merchant_id %> + <%= submit_tag "Add to Cart", class: "btn btn-primary" %>
    <% end %> diff --git a/config/routes.rb b/config/routes.rb index 01307e8db3..1016995c05 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -26,7 +26,8 @@ delete 'sessions/destroy' => 'sessions#destroy' get 'products/all_products' => 'products#all_products', as: 'all_products' - patch 'orders/add_to_cart' => 'orders#add_to_cart', as: 'add_to_cart' + post 'orders/add_to_cart' => 'orders#add_to_cart', as: 'add_to_cart' + # get 'merchants/:id/products' => 'merchants#show_merchant_products', as: 'merchant_products' From 34d6fe4f83f50e7f4fdbb08f7141b70407ac539f Mon Sep 17 00:00:00 2001 From: Sabrina Wilbert Date: Tue, 25 Oct 2016 18:36:11 -0700 Subject: [PATCH 102/191] Added view cart. --- app/controllers/orders_controller.rb | 3 ++- app/views/layouts/application.html.erb | 2 +- app/views/orders/show.html.erb | 19 +++++++------------ app/views/orders/view_cart.html.erb | 18 ++++++++++++++++++ config/routes.rb | 2 +- 5 files changed, 29 insertions(+), 15 deletions(-) create mode 100644 app/views/orders/view_cart.html.erb diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index de59cee8a2..ca694a8ba6 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -4,6 +4,7 @@ def index end def show + #get list of items for this guest or merchant_id @order_items = LineItem.where(order_id: current_cart.id) @@ -16,7 +17,7 @@ def create end def subtotal - @order.line_items do |line| + @order_items.each do |line| line_cost = line.price * line.qty total_amount << line_cost return total_amount diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index e318d5e637..ef044c3be7 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -16,7 +16,7 @@ <% end %> <% if current_cart != nil %> - <%= link_to("View Cart", 'orders/show', method: :get) %> + <%= link_to("View Cart", 'orders/view_cart', method: :get) %> <% else %>
    - - - -
    - -
    -
    -

    app/controllers/application_controller.rb

    -

    95.83 % covered

    -
    - 24 relevant lines. - 23 lines covered and - 1 lines missed. -
    -
    - -
    -    
      - -
    1. - 1 - - class ApplicationController < ActionController::Base -
    2. - -
    3. - - - # Prevent CSRF attacks by raising an exception. -
    4. - -
    5. - - - # For APIs, you may want to use :null_session instead. -
    6. - -
    7. - 1 - - protect_from_forgery with: :exception -
    8. - -
    9. - - - -
    10. - -
    11. - 27 - - before_action do define_category_variables(2) end -
    12. - -
    13. - 1 - - helper_method :current_merchant, :current_guest, :current_cart -
    14. - -
    15. - - - -
    16. - -
    17. - 1 - - def current_merchant -
    18. - -
    19. - 55 - - @current_merchant ||= Merchant.find_by(id: session[:merchant_id].to_i) -
    20. - -
    21. - - - end -
    22. - -
    23. - - - -
    24. - -
    25. - 1 - - def current_guest -
    26. - -
    27. - 48 - - return @current_guest if @current_guest.present? -
    28. - -
    29. - 12 - - @current_guest = Guest.find_or_create_by(id: session[:user_id]) -
    30. - -
    31. - 12 - - session[:user_id] = @current_guest.id -
    32. - -
    33. - 12 - - return @current_guest -
    34. - -
    35. - - - end -
    36. - -
    37. - - - -
    38. - -
    39. - 1 - - def define_category_variables(limit) -
    40. - -
    41. - 26 - - ordered_categories = Category.order("lower(name) ASC") -
    42. - -
    43. - 26 - - @top_catgories = ordered_categories.limit(limit) -
    44. - -
    45. - 26 - - @all_categories = Category.all -
    46. - -
    47. - 26 - - @lesser_categories = find_lesser_categories(ordered_categories, limit) -
    48. - -
    49. - - - end -
    50. - -
    51. - - - -
    52. - -
    53. - 1 - - def find_lesser_categories(ordered_categories, limit) -
    54. - -
    55. - 26 - - lesser_categories = ordered_categories[limit..-1] -
    56. - -
    57. - 26 - - return lesser_categories -
    58. - -
    59. - - - end -
    60. - -
    61. - - - -
    62. - -
    63. - 1 - - def current_cart -
    64. - -
    65. - - - #if we are logged in as merchant -
    66. - -
    67. - 24 - - if current_merchant.present? -
    68. - -
    69. - - - #get cart from current merchant -
    70. - -
    71. - - - return current_merchant.cart -
    72. - -
    73. - - - end -
    74. - -
    75. - - - #if we are not a merchant -
    76. - -
    77. - 24 - - if current_guest.present? -
    78. - -
    79. - - - #get cart from current guest cart -
    80. - -
    81. - 24 - - return current_guest.cart -
    82. - -
    83. - - - -
    84. - -
    85. - - - end -
    86. - -
    87. - - - end -
    88. - -
    89. - - - -
    90. - -
    91. - - - -
    92. - -
    93. - - - # @current_guest ||= Guest.find_by(id: session[:user_id].to_i) -
    94. - -
    95. - - - -
    96. - -
    97. - - - -
    98. - -
    99. - - - end -
    100. - -
    -
    -
    - -
    -
    -

    app/controllers/categories_controller.rb

    -

    91.67 % covered

    -
    - 24 relevant lines. - 22 lines covered and - 2 lines missed. -
    -
    - -
    -    
      - -
    1. - 1 - - class CategoriesController < ApplicationController -
    2. - -
    3. - 1 - - def index -
    4. - -
    5. - - - # @category = Category.all -
    6. - -
    7. - 1 - - @category = Category.order("lower(name) ASC").all -
    8. - -
    9. - 1 - - @new_category = Category.new -
    10. - -
    11. - - - -
    12. - -
    13. - - - -
    14. - -
    15. - - - end -
    16. - -
    17. - - - -
    18. - -
    19. - 1 - - def show -
    20. - -
    21. - 1 - - @category = Category.find(params[:id].to_i) -
    22. - -
    23. - 1 - - @products_in_category = @category.products -
    24. - -
    25. - - - end -
    26. - -
    27. - - - -
    28. - -
    29. - 1 - - def new -
    30. - -
    31. - 1 - - @category = Category.new -
    32. - -
    33. - - - end -
    34. - -
    35. - - - -
    36. - -
    37. - 1 - - def create -
    38. - -
    39. - 2 - - @category = Category.new(category_params) -
    40. - -
    41. - 2 - - if @category.save -
    42. - -
    43. - 2 - - redirect_to categories_path -
    44. - -
    45. - - - else -
    46. - -
    47. - - - flash[:notice] = "Did not save successfully. Please check that this category does not already exist and try again." -
    48. - -
    49. - - - redirect_to categories_path -
    50. - -
    51. - - - end -
    52. - -
    53. - - - end -
    54. - -
    55. - - - -
    56. - -
    57. - - - -
    58. - -
    59. - - - -
    60. - -
    61. - 1 - - def edit -
    62. - -
    63. - - - end -
    64. - -
    65. - - - -
    66. - -
    67. - 1 - - def update -
    68. - -
    69. - - - end -
    70. - -
    71. - - - -
    72. - -
    73. - 1 - - def destroy -
    74. - -
    75. - 1 - - @category = Category.find(params[:id].to_i) -
    76. - -
    77. - 1 - - @category.destroy -
    78. - -
    79. - - - -
    80. - -
    81. - 1 - - redirect_to categories_path -
    82. - -
    83. - - - end -
    84. - -
    85. - - - -
    86. - -
    87. - 1 - - private -
    88. - -
    89. - 1 - - def category_params -
    90. - -
    91. - 2 - - params.require(:category).permit(:name) -
    92. - -
    93. - - - end -
    94. - -
    95. - - - -
    96. - -
    97. - - - end -
    98. - -
    -
    -
    - -
    -
    -

    app/controllers/merchants_controller.rb

    -

    70.0 % covered

    -
    - 20 relevant lines. - 14 lines covered and - 6 lines missed. -
    -
    - -
    -    
      - -
    1. - 1 - - class MerchantsController < ApplicationController -
    2. - -
    3. - - - #before_action :find_merchant only: [:show, :edit, :update] -
    4. - -
    5. - - - -
    6. - -
    7. - 1 - - def index -
    8. - -
    9. - 1 - - find_merchant -
    10. - -
    11. - - - end -
    12. - -
    13. - - - -
    14. - -
    15. - 1 - - def show -
    16. - -
    17. - - - find_merchant -
    18. - -
    19. - - - end -
    20. - -
    21. - - - -
    22. - -
    23. - 1 - - def new -
    24. - -
    25. - - - @merchant = Merchant.new -
    26. - -
    27. - - - @path = merchants_path -
    28. - -
    29. - - - end -
    30. - -
    31. - - - -
    32. - -
    33. - 1 - - def create -
    34. - -
    35. - - - end -
    36. - -
    37. - - - -
    38. - -
    39. - 1 - - def edit -
    40. - -
    41. - - - end -
    42. - -
    43. - - - -
    44. - -
    45. - 1 - - def update -
    46. - -
    47. - - - end -
    48. - -
    49. - - - -
    50. - -
    51. - 1 - - def destroy -
    52. - -
    53. - - - end -
    54. - -
    55. - - - -
    56. - -
    57. - 1 - - def show_merchant_products -
    58. - -
    59. - - - find_merchant -
    60. - -
    61. - - - @products = Product.find_by(merchant_id: @merchant.id) -
    62. - -
    63. - - - end -
    64. - -
    65. - - - -
    66. - -
    67. - 1 - - private -
    68. - -
    69. - - - -
    70. - -
    71. - 1 - - def merchant_params -
    72. - -
    73. - - - params.require(:merchant).permit(:name, :email, :password) -
    74. - -
    75. - - - end -
    76. - -
    77. - - - -
    78. - -
    79. - 1 - - def find_merchant -
    80. - -
    81. - 1 - - @merchant = Merchant.find_by(id: session[:merchant_id].to_i) -
    82. - -
    83. - - - end -
    84. - -
    85. - - - end -
    86. - -
    -
    -
    - -
    -
    -

    app/controllers/products_controller.rb

    -

    81.82 % covered

    -
    - 55 relevant lines. - 45 lines covered and - 10 lines missed. -
    -
    - -
    -    
      - -
    1. - 1 - - class ProductsController < ApplicationController -
    2. - -
    3. - 1 - - before_action :find_product, only: [:show, :edit, :update] -
    4. - -
    5. - 1 - - before_action :find_merchant, except: [:all_products] -
    6. - -
    7. - - - -
    8. - -
    9. - 1 - - def all_products -
    10. - -
    11. - - - @products = Product.all -
    12. - -
    13. - - - end -
    14. - -
    15. - - - -
    16. - -
    17. - 1 - - def index -
    18. - -
    19. - 1 - - @products = Product.where(merchant_id: @merchant.id) -
    20. - -
    21. - - - end -
    22. - -
    23. - - - -
    24. - -
    25. - 1 - - def show -
    26. - -
    27. - 1 - - puts "Products is NIL" if @product == nil -
    28. - -
    29. - 1 - - @reviews = @product.reviews.order('stars desc, id').limit(3) -
    30. - -
    31. - 1 - - @line_item = LineItem.new ### OR Line.new -
    32. - -
    33. - - - end -
    34. - -
    35. - - - -
    36. - -
    37. - 1 - - def new -
    38. - -
    39. - 1 - - @product = Product.new -
    40. - -
    41. - 1 - - @post_path = merchant_products_path(@merchant.id) -
    42. - -
    43. - 1 - - @post_method = :post -
    44. - -
    45. - 1 - - @category = Category.order("lower(name) ASC").all -
    46. - -
    47. - - - end -
    48. - -
    49. - - - -
    50. - -
    51. - 1 - - def create -
    52. - -
    53. - 2 - - @product = Product.new(product_params) -
    54. - -
    55. - 2 - - @product.price = (product_params[:price].to_f * 100).to_i -
    56. - -
    57. - - - # @product.merchant_id = @merchant.id -
    58. - -
    59. - 2 - - @product.rating = nil -
    60. - -
    61. - 2 - - @product.merchant_id = @merchant.id -
    62. - -
    63. - 2 - - if @product.save -
    64. - -
    65. - 2 - - redirect_to merchant_product_path(@merchant.id, @product.id) -
    66. - -
    67. - - - else -
    68. - -
    69. - - - @error = "Did not save successfully. Please try again." -
    70. - -
    71. - - - @post_path = merchant_products_path -
    72. - -
    73. - - - @post_method = :post -
    74. - -
    75. - - - render :new -
    76. - -
    77. - - - end -
    78. - -
    79. - - - end -
    80. - -
    81. - - - -
    82. - -
    83. - 1 - - def edit -
    84. - -
    85. - 1 - - @post_path = merchant_product_path(@merchant.id, @product.id) -
    86. - -
    87. - 1 - - @post_method = :put -
    88. - -
    89. - - - end -
    90. - -
    91. - - - -
    92. - -
    93. - 1 - - def update -
    94. - -
    95. - 1 - - if @product.update(product_params) -
    96. - -
    97. - 1 - - @product.price = (product_params[:price].to_f * 100).to_i -
    98. - -
    99. - 1 - - @product.rating -
    100. - -
    101. - 1 - - redirect_to merchant_product_path(@merchant.id, @product.id) -
    102. - -
    103. - - - else -
    104. - -
    105. - - - @error = "Did not save successfully. Please try again." -
    106. - -
    107. - - - @post_path = merchant_product_path(@merchant.id, @product.id) -
    108. - -
    109. - - - @post_method = :put -
    110. - -
    111. - - - render :edit -
    112. - -
    113. - - - end -
    114. - -
    115. - - - end -
    116. - -
    117. - - - -
    118. - -
    119. - 1 - - def destroy -
    120. - -
    121. - 2 - - @product = find_product -
    122. - -
    123. - 2 - - if @product.class == Product -
    124. - -
    125. - 1 - - @product.destroy -
    126. - -
    127. - 1 - - redirect_to merchant_products_path(@merchant.id) -
    128. - -
    129. - - - end -
    130. - -
    131. - - - end -
    132. - -
    133. - - - -
    134. - -
    135. - 1 - - private -
    136. - -
    137. - - - -
    138. - -
    139. - 1 - - def find_product -
    140. - -
    141. - 5 - - if Product.exists?(params[:id].to_i) == true -
    142. - -
    143. - 4 - - return @product = Product.find_by(id: params[:id].to_i) -
    144. - -
    145. - - - else -
    146. - -
    147. - 1 - - render :status => 404 -
    148. - -
    149. - - - end -
    150. - -
    151. - - - end -
    152. - -
    153. - - - -
    154. - -
    155. - 1 - - def find_merchant -
    156. - -
    157. - 9 - - if Merchant.exists?(params[:merchant_id].to_i) == true -
    158. - -
    159. - 9 - - return @merchant = Merchant.find(params[:merchant_id].to_i) -
    160. - -
    161. - - - else -
    162. - -
    163. - - - render :status => 404 -
    164. - -
    165. - - - end -
    166. - -
    167. - - - end -
    168. - -
    169. - - - -
    170. - -
    171. - 1 - - def product_params -
    172. - -
    173. - 6 - - params.require(:product).permit(:name, :description, :price, :image, :inventory, :rating, category_ids: []) -
    174. - -
    175. - - - end -
    176. - -
    177. - - - -
    178. - -
    179. - - - end -
    180. - -
    -
    -
    - -
    -
    -

    app/controllers/reviews_controller.rb

    -

    72.73 % covered

    -
    - 55 relevant lines. - 40 lines covered and - 15 lines missed. -
    -
    - -
    -    
      - -
    1. - 1 - - class ReviewsController < ApplicationController -
    2. - -
    3. - 1 - - before_action :find_merchant -
    4. - -
    5. - 1 - - before_action :find_product -
    6. - -
    7. - 1 - - before_action :find_review, only: [:show, :edit, :update, :destroy] -
    8. - -
    9. - - - -
    10. - -
    11. - - - -
    12. - -
    13. - 1 - - def index -
    14. - -
    15. - 1 - - @reviews = Review.where(product_id: @product.id) -
    16. - -
    17. - - - end -
    18. - -
    19. - - - -
    20. - -
    21. - 1 - - def show -
    22. - -
    23. - - - end -
    24. - -
    25. - - - -
    26. - -
    27. - 1 - - def new -
    28. - -
    29. - 1 - - if current_merchant != nil && @merchant.name == current_merchant.name -
    30. - -
    31. - - - flash[:notice] = "Cannot Review Your Own Product" -
    32. - -
    33. - - - redirect_to merchant_product_path(@merchant.id, @product.id) -
    34. - -
    35. - - - return -
    36. - -
    37. - - - else -
    38. - -
    39. - 1 - - @review = Review.new -
    40. - -
    41. - 1 - - @post_path = merchant_product_reviews_path -
    42. - -
    43. - 1 - - @post_method = :post -
    44. - -
    45. - - - end -
    46. - -
    47. - - - end -
    48. - -
    49. - - - -
    50. - -
    51. - 1 - - def create -
    52. - -
    53. - 2 - - @review = Review.new(review_params) -
    54. - -
    55. - 2 - - @review.product_id = @product.id -
    56. - -
    57. - - - -
    58. - -
    59. - 2 - - if @review.save -
    60. - -
    61. - 2 - - redirect_to merchant_product_path(@merchant.id, @product.id) -
    62. - -
    63. - - - else -
    64. - -
    65. - - - @error = "Did not save successfully. Please try again." -
    66. - -
    67. - - - @post_path = merchant_product_reviews_path -
    68. - -
    69. - - - @post_method = :post -
    70. - -
    71. - - - render :new -
    72. - -
    73. - - - end -
    74. - -
    75. - - - end -
    76. - -
    77. - - - -
    78. - -
    79. - 1 - - def edit -
    80. - -
    81. - - - if @merchant.id = @product.merchant_id -
    82. - -
    83. - - - flash[:notice] = "Cannot Review Your Own Product" -
    84. - -
    85. - - - redirect_to merchant_product_path(@merchant.id, @product.id) -
    86. - -
    87. - - - end -
    88. - -
    89. - - - end -
    90. - -
    91. - - - -
    92. - -
    93. - 1 - - def update -
    94. - -
    95. - - - end -
    96. - -
    97. - - - -
    98. - -
    99. - 1 - - def destroy -
    100. - -
    101. - 1 - - @review = find_review -
    102. - -
    103. - 1 - - if current_merchant != nil && current_merchant.id == @product.merchant_id -
    104. - -
    105. - - - flash[:notice] = "Cannot Delete Your Own Product's Reviews" -
    106. - -
    107. - - - redirect_to merchant_product_path(@merchant.id, @product.id) -
    108. - -
    109. - - - return -
    110. - -
    111. - - - else -
    112. - -
    113. - 1 - - if @review.class == Review -
    114. - -
    115. - 1 - - @review.destroy -
    116. - -
    117. - 1 - - redirect_to merchant_product_path(@merchant.id, @product.id) -
    118. - -
    119. - - - return -
    120. - -
    121. - - - end -
    122. - -
    123. - - - end -
    124. - -
    125. - - - end -
    126. - -
    127. - - - -
    128. - -
    129. - 1 - - private -
    130. - -
    131. - - - -
    132. - -
    133. - 1 - - def find_product -
    134. - -
    135. - 14 - - if Product.exists?(params[:product_id].to_i) == true -
    136. - -
    137. - 14 - - return @product = Product.find(params[:product_id].to_i) -
    138. - -
    139. - - - else -
    140. - -
    141. - - - redirect_to merchant_path(@merchant.id) -
    142. - -
    143. - - - flash[:notice] = "Product Not Found" -
    144. - -
    145. - - - return -
    146. - -
    147. - - - end -
    148. - -
    149. - - - end -
    150. - -
    151. - - - -
    152. - -
    153. - 1 - - def find_merchant -
    154. - -
    155. - 7 - - find_product -
    156. - -
    157. - 7 - - if Merchant.exists?(@product.merchant_id) == true -
    158. - -
    159. - 7 - - return @merchant = Merchant.find(@product.merchant_id) -
    160. - -
    161. - - - else -
    162. - -
    163. - - - redirect_to categories_path -
    164. - -
    165. - - - flash[:notice] = "Merchant Not Found" -
    166. - -
    167. - - - return -
    168. - -
    169. - - - end -
    170. - -
    171. - - - end -
    172. - -
    173. - - - -
    174. - -
    175. - 1 - - def find_review -
    176. - -
    177. - 4 - - if Review.exists?(params[:id].to_i) == true -
    178. - -
    179. - 3 - - return @review = Review.find(params[:id].to_i) -
    180. - -
    181. - - - else -
    182. - -
    183. - 1 - - redirect_to merchant_product_path(@merchant.id, @product.id) -
    184. - -
    185. - 1 - - flash[:notice] = "Review Not Found" -
    186. - -
    187. - - - return -
    188. - -
    189. - - - end -
    190. - -
    191. - - - end -
    192. - -
    193. - - - -
    194. - -
    195. - 1 - - def review_params -
    196. - -
    197. - 2 - - params.require(:review).permit(:stars, :description, :author) -
    198. - -
    199. - - - end -
    200. - -
    201. - - - end -
    202. - -
    -
    -
    - -
    -
    -

    app/controllers/sessions_controller.rb

    -

    86.67 % covered

    -
    - 15 relevant lines. - 13 lines covered and - 2 lines missed. -
    -
    - -
    -    
      - -
    1. - 1 - - class SessionsController < ApplicationController -
    2. - -
    3. - 1 - - def create -
    4. - -
    5. - 3 - - auth_hash = request.env['omniauth.auth'] -
    6. - -
    7. - - - -
    8. - -
    9. - 3 - - return redirect to root_path unless auth_hash['uid'] -
    10. - -
    11. - - - -
    12. - -
    13. - 3 - - @merchant = Merchant.find_by(uid: auth_hash[:uid]) -
    14. - -
    15. - 3 - - if @merchant.nil? -
    16. - -
    17. - 2 - - @merchant = Merchant.build_from_github(auth_hash) -
    18. - -
    19. - 2 - - flash[:notice] = "Unable to save the Merchant" -
    20. - -
    21. - 2 - - return redirect_to root_path unless @merchant.save -
    22. - -
    23. - - - end -
    24. - -
    25. - - - -
    26. - -
    27. - - - #Save the merchant ID in the session -
    28. - -
    29. - 3 - - session[:merchant_id] = @merchant.id.to_i -
    30. - -
    31. - - - # binding.pry -
    32. - -
    33. - 3 - - redirect_to merchant_path(@merchant.id) -
    34. - -
    35. - - - end -
    36. - -
    37. - - - -
    38. - -
    39. - 1 - - def create_merchant -
    40. - -
    41. - - - end -
    42. - -
    43. - - - -
    44. - -
    45. - - - # def login -
    46. - -
    47. - - - # session[:merchant_id] = 1 -
    48. - -
    49. - - - # redirect_to '/products/index' -
    50. - -
    51. - - - # end -
    52. - -
    53. - - - # -
    54. - -
    55. - - - # def logout -
    56. - -
    57. - - - # session[:merchant_id] = nil -
    58. - -
    59. - - - # redirect_to root_path -
    60. - -
    61. - - - # end -
    62. - -
    63. - - - -
    64. - -
    65. - - - -
    66. - -
    67. - 1 - - def destroy -
    68. - -
    69. - - - session[:merchant_id] = nil -
    70. - -
    71. - - - redirect_to root_path -
    72. - -
    73. - - - end -
    74. - -
    75. - - - end -
    76. - -
    -
    -
    - -
    -
    -

    app/helpers/application_helper.rb

    -

    83.33 % covered

    -
    - 12 relevant lines. - 10 lines covered and - 2 lines missed. -
    -
    - -
    -    
      - -
    1. - 1 - - module ApplicationHelper -
    2. - -
    3. - - - -
    4. - -
    5. - - - -
    6. - -
    7. - 1 - - def star_string(rating) -
    8. - -
    9. - 10 - - printed_stars = "" -
    10. - -
    11. - 10 - - if rating == nil -
    12. - -
    13. - - - printed_stars = "Not Yet Reviewed" -
    14. - -
    15. - - - else -
    16. - -
    17. - 37 - - rating.times {|x| printed_stars << "★"} -
    18. - -
    19. - 33 - - (5-rating).times {|x| printed_stars << "☆"} -
    20. - -
    21. - - - end -
    22. - -
    23. - 10 - - printed_stars.html_safe -
    24. - -
    25. - - - end -
    26. - -
    27. - - - -
    28. - -
    29. - 1 - - def greeting -
    30. - -
    31. - 12 - - if current_merchant.nil? -
    32. - -
    33. - 12 - - "Welcome Guest" -
    34. - -
    35. - - - else -
    36. - -
    37. - - - "Welcome #{current_merchant.name}" -
    38. - -
    39. - - - end -
    40. - -
    41. - - - end -
    42. - -
    43. - - - end -
    44. - -
    -
    -
    - -
    -
    -

    app/helpers/categories_helper.rb

    -

    100.0 % covered

    -
    - 1 relevant lines. - 1 lines covered and - 0 lines missed. -
    -
    - -
    -    
      - -
    1. - 1 - - module CategoriesHelper -
    2. - -
    3. - - - end -
    4. - -
    -
    -
    - -
    -
    -

    app/helpers/guests_helper.rb

    -

    100.0 % covered

    -
    - 1 relevant lines. - 1 lines covered and - 0 lines missed. -
    -
    - -
    -    
      - -
    1. - 1 - - module GuestsHelper -
    2. - -
    3. - - - end -
    4. - -
    -
    -
    - -
    -
    -

    app/helpers/merchants_helper.rb

    -

    100.0 % covered

    -
    - 1 relevant lines. - 1 lines covered and - 0 lines missed. -
    -
    - -
    -    
      - -
    1. - 1 - - module MerchantsHelper -
    2. - -
    3. - - - end -
    4. - -
    -
    -
    - -
    -
    -

    app/helpers/orders_helper.rb

    -

    100.0 % covered

    -
    - 1 relevant lines. - 1 lines covered and - 0 lines missed. -
    -
    - -
    -    
      - -
    1. - 1 - - module OrdersHelper -
    2. - -
    3. - - - end -
    4. - -
    -
    -
    - -
    -
    -

    app/helpers/products_helper.rb

    -

    100.0 % covered

    -
    - 1 relevant lines. - 1 lines covered and - 0 lines missed. -
    -
    - -
    -    
      - -
    1. - 1 - - module ProductsHelper -
    2. - -
    3. - - - end -
    4. - -
    -
    -
    - -
    -
    -

    app/helpers/reviews_helper.rb

    -

    100.0 % covered

    -
    - 1 relevant lines. - 1 lines covered and - 0 lines missed. -
    -
    - -
    -    
      - -
    1. - 1 - - module ReviewsHelper -
    2. - -
    3. - - - end -
    4. - -
    -
    -
    - -
    -
    -

    app/helpers/sessions_helper.rb

    -

    100.0 % covered

    -
    - 1 relevant lines. - 1 lines covered and - 0 lines missed. -
    -
    - -
    -    
      - -
    1. - 1 - - module SessionsHelper -
    2. - -
    3. - - - end -
    4. - -
    -
    -
    - -
    -
    -

    app/models/category.rb

    -

    100.0 % covered

    -
    - 4 relevant lines. - 4 lines covered and - 0 lines missed. -
    -
    - -
    -    
      - -
    1. - 1 - - class Category < ActiveRecord::Base -
    2. - -
    3. - 1 - - has_many :product_categories -
    4. - -
    5. - 1 - - has_many :products, :through => :product_categories -
    6. - -
    7. - 1 - - validates :name, presence: true, uniqueness: true -
    8. - -
    9. - - - end -
    10. - -
    -
    -
    - -
    -
    -

    app/models/guest.rb

    -

    100.0 % covered

    -
    - 5 relevant lines. - 5 lines covered and - 0 lines missed. -
    -
    - -
    -    
      - -
    1. - 1 - - class Guest < ActiveRecord::Base -
    2. - -
    3. - 1 - - has_many :orders -
    4. - -
    5. - 1 - - has_many :line_items -
    6. - -
    7. - - - -
    8. - -
    9. - 1 - - def cart -
    10. - -
    11. - - - #find cart from guest orders -
    12. - -
    13. - 24 - - self.orders.find_or_create_by(:order_status => "pending") -
    14. - -
    15. - - - #if not found we create it -
    16. - -
    17. - - - #guest has one cart -
    18. - -
    19. - - - #the cart is an orders -
    20. - -
    21. - - - #the guest has_many orders -
    22. - -
    23. - - - #has to be pending orders -
    24. - -
    25. - - - #return the cart -
    26. - -
    27. - - - end -
    28. - -
    29. - - - -
    30. - -
    31. - - - -
    32. - -
    33. - - - -
    34. - -
    35. - - - end -
    36. - -
    -
    -
    - -
    -
    -

    app/models/line_item.rb

    -

    45.45 % covered

    -
    - 11 relevant lines. - 5 lines covered and - 6 lines missed. -
    -
    - -
    -    
      - -
    1. - 1 - - class LineItem < ActiveRecord::Base -
    2. - -
    3. - 1 - - belongs_to :product -
    4. - -
    5. - 1 - - belongs_to :order -
    6. - -
    7. - - - -
    8. - -
    9. - 1 - - def subtotal -
    10. - -
    11. - - - @order_items.each do |item| -
    12. - -
    13. - - - @item_total = item.price * item.qty -
    14. - -
    15. - - - subtotal << @item_total -
    16. - -
    17. - - - return subtotal -
    18. - -
    19. - - - end -
    20. - -
    21. - - - end -
    22. - -
    23. - - - -
    24. - -
    25. - 1 - - def total_amount -
    26. - -
    27. - - - subtotal.inject(0) { |total, element| total + element } -
    28. - -
    29. - - - return total -
    30. - -
    31. - - - end -
    32. - -
    33. - - - -
    34. - -
    35. - - - end -
    36. - -
    -
    -
    - -
    -
    -

    app/models/merchant.rb

    -

    98.68 % covered

    -
    - 76 relevant lines. - 75 lines covered and - 1 lines missed. -
    -
    - -
    -    
      - -
    1. - - - # Merchant Model -
    2. - -
    3. - 1 - - class Merchant < ActiveRecord::Base -
    4. - -
    5. - 1 - - has_many :products -
    6. - -
    7. - 1 - - has_many :placed_orders, :class_name => "Order" -
    8. - -
    9. - 1 - - has_many :orders, :through => :products -
    10. - -
    11. - 1 - - alias_attribute(:customer_orders, :orders) -
    12. - -
    13. - - - -
    14. - -
    15. - 1 - - validates :name, :email, presence: true -
    16. - -
    17. - 1 - - validates :email, uniqueness: true -
    18. - -
    19. - - - -
    20. - -
    21. - 1 - - def self.build_from_github(auth_hash) -
    22. - -
    23. - 2 - - merchant = Merchant.new -
    24. - -
    25. - 2 - - merchant.uid = auth_hash[:uid] -
    26. - -
    27. - 2 - - merchant.provider = 'github' -
    28. - -
    29. - 2 - - merchant.name = auth_hash['info']['name'] -
    30. - -
    31. - 2 - - merchant.email = auth_hash['info']['email'] -
    32. - -
    33. - - - # user.avatar = auth_hash['extra']['raw_info']['avatar_url'] -
    34. - -
    35. - - - # user.followercount = auth_hash['extra']['raw_info']['followers'].to_i -
    36. - -
    37. - - - -
    38. - -
    39. - 2 - - return merchant -
    40. - -
    41. - - - end -
    42. - -
    43. - - - -
    44. - -
    45. - 1 - - def revenue_paid_orders -
    46. - -
    47. - 1 - - revenue_total = 0.0 -
    48. - -
    49. - 1 - - orders.each do |order| -
    50. - -
    51. - 6 - - if order.order_status == "paid" -
    52. - -
    53. - 2 - - revenue_total += order.total_amount -
    54. - -
    55. - - - end -
    56. - -
    57. - - - end -
    58. - -
    59. - 1 - - return revenue_total -
    60. - -
    61. - - - end -
    62. - -
    63. - - - -
    64. - -
    65. - 1 - - def revenue_pending_orders -
    66. - -
    67. - 1 - - revenue_total = 0.0 -
    68. - -
    69. - 1 - - orders.each do |order| -
    70. - -
    71. - 6 - - if order.order_status == "pending" -
    72. - -
    73. - 2 - - revenue_total += order.total_amount -
    74. - -
    75. - - - end -
    76. - -
    77. - - - end -
    78. - -
    79. - 1 - - return revenue_total -
    80. - -
    81. - - - end -
    82. - -
    83. - - - -
    84. - -
    85. - 1 - - def revenue_cancelled_orders -
    86. - -
    87. - 1 - - revenue_total = 0.0 -
    88. - -
    89. - 1 - - orders.each do |order| -
    90. - -
    91. - 6 - - if order.order_status == "cancelled" -
    92. - -
    93. - 1 - - revenue_total += order.total_amount -
    94. - -
    95. - - - end -
    96. - -
    97. - - - end -
    98. - -
    99. - 1 - - return revenue_total -
    100. - -
    101. - - - end -
    102. - -
    103. - - - -
    104. - -
    105. - 1 - - def revenue_completed_orders -
    106. - -
    107. - 1 - - revenue_total = 0.0 -
    108. - -
    109. - 1 - - orders.each do |order| -
    110. - -
    111. - 6 - - if order.order_status == "completed" -
    112. - -
    113. - 1 - - revenue_total += order.total_amount -
    114. - -
    115. - - - end -
    116. - -
    117. - - - end -
    118. - -
    119. - 1 - - return revenue_total -
    120. - -
    121. - - - end -
    122. - -
    123. - - - -
    124. - -
    125. - 1 - - def total_revenue -
    126. - -
    127. - 1 - - revenue_total = 0.0 -
    128. - -
    129. - 1 - - orders.each do |order| -
    130. - -
    131. - 6 - - if order.order_status == "cancelled" -
    132. - -
    133. - - - else -
    134. - -
    135. - 5 - - revenue_total += order.total_amount -
    136. - -
    137. - - - end -
    138. - -
    139. - - - end -
    140. - -
    141. - 1 - - return revenue_total -
    142. - -
    143. - - - end -
    144. - -
    145. - - - -
    146. - -
    147. - 1 - - def pending_orders -
    148. - -
    149. - 1 - - pending = 0 -
    150. - -
    151. - 1 - - orders.each do |order| -
    152. - -
    153. - 6 - - if order.order_status == "pending" -
    154. - -
    155. - 2 - - pending += 1 -
    156. - -
    157. - - - end -
    158. - -
    159. - - - end -
    160. - -
    161. - 1 - - return pending -
    162. - -
    163. - - - end -
    164. - -
    165. - - - -
    166. - -
    167. - 1 - - def cancelled_orders -
    168. - -
    169. - 1 - - cancelled = 0 -
    170. - -
    171. - 1 - - orders.each do |order| -
    172. - -
    173. - 6 - - if order.order_status == "cancelled" -
    174. - -
    175. - 1 - - cancelled += 1 -
    176. - -
    177. - - - end -
    178. - -
    179. - - - end -
    180. - -
    181. - 1 - - return cancelled -
    182. - -
    183. - - - end -
    184. - -
    185. - - - -
    186. - -
    187. - 1 - - def paid_orders -
    188. - -
    189. - 1 - - paid = 0 -
    190. - -
    191. - 1 - - orders.each do |order| -
    192. - -
    193. - 6 - - if order.order_status == "paid" -
    194. - -
    195. - 2 - - paid += 1 -
    196. - -
    197. - - - end -
    198. - -
    199. - - - end -
    200. - -
    201. - 1 - - return paid -
    202. - -
    203. - - - end -
    204. - -
    205. - - - -
    206. - -
    207. - 1 - - def completed_orders -
    208. - -
    209. - 1 - - completed = 0 -
    210. - -
    211. - 1 - - orders.each do |order| -
    212. - -
    213. - 6 - - if order.order_status == "completed" -
    214. - -
    215. - 1 - - completed += 1 -
    216. - -
    217. - - - end -
    218. - -
    219. - - - end -
    220. - -
    221. - 1 - - return completed -
    222. - -
    223. - - - end -
    224. - -
    225. - - - -
    226. - -
    227. - 1 - - def total_orders -
    228. - -
    229. - 1 - - total = 0 -
    230. - -
    231. - 1 - - orders.each do |order| -
    232. - -
    233. - 6 - - if order.order_status == "cancelled" -
    234. - -
    235. - - - else -
    236. - -
    237. - 5 - - total += 1 -
    238. - -
    239. - - - end -
    240. - -
    241. - - - end -
    242. - -
    243. - 1 - - return total -
    244. - -
    245. - - - end -
    246. - -
    247. - - - -
    248. - -
    249. - 1 - - def cart -
    250. - -
    251. - - - #find cart from merchant orders -
    252. - -
    253. - - - self.placed_orders.find_or_create_by(:order_status => "pending") -
    254. - -
    255. - - - end -
    256. - -
    257. - - - -
    258. - -
    259. - - - # def orders_count -
    260. - -
    261. - - - # total_orders = 0 -
    262. - -
    263. - - - # orders. -
    264. - -
    265. - - - # end -
    266. - -
    267. - - - end -
    268. - -
    -
    -
    - -
    -
    -

    app/models/order.rb

    -

    50.0 % covered

    -
    - 12 relevant lines. - 6 lines covered and - 6 lines missed. -
    -
    - -
    -    
      - -
    1. - 1 - - class Order < ActiveRecord::Base -
    2. - -
    3. - 1 - - has_many :line_items -
    4. - -
    5. - - - # has_many :product_orders -
    6. - -
    7. - 1 - - has_many :products, :through => :line_items -
    8. - -
    9. - 1 - - belongs_to :merchant -
    10. - -
    11. - 1 - - belongs_to :guest -
    12. - -
    13. - - - -
    14. - -
    15. - 1 - - def add_product(product, qty) -
    16. - -
    17. - - - #if there is a guest and a cart -
    18. - -
    19. - - - #add a row to the LineItem table -
    20. - -
    21. - - - #once the line is added return the user back to the product page -
    22. - -
    23. - - - line = LineItem.new -
    24. - -
    25. - - - line.product = product -
    26. - -
    27. - - - line.merchant_id = product.merchant_id -
    28. - -
    29. - - - line.qty = qty -
    30. - -
    31. - - - line.price = product.price -
    32. - -
    33. - - - line_items << line -
    34. - -
    35. - - - end -
    36. - -
    37. - - - -
    38. - -
    39. - - - -
    40. - -
    41. - - - end -
    42. - -
    -
    -
    - -
    -
    -

    app/models/product.rb

    -

    100.0 % covered

    -
    - 20 relevant lines. - 20 lines covered and - 0 lines missed. -
    -
    - -
    -    
      - -
    1. - 1 - - class Product < ActiveRecord::Base -
    2. - -
    3. - 1 - - has_many :line_items -
    4. - -
    5. - 1 - - has_many :orders, :through => :line_items -
    6. - -
    7. - - - -
    8. - -
    9. - 1 - - has_many :product_categories -
    10. - -
    11. - 1 - - has_many :categories, :through => :product_categories -
    12. - -
    13. - - - -
    14. - -
    15. - 1 - - belongs_to :merchant -
    16. - -
    17. - 1 - - has_many :reviews -
    18. - -
    19. - - - -
    20. - -
    21. - - - ############### -
    22. - -
    23. - - - ### Methods ### -
    24. - -
    25. - - - ############### -
    26. - -
    27. - - - -
    28. - -
    29. - 1 - - def rating -
    30. - -
    31. - 14 - - total_rating = 0 -
    32. - -
    33. - 14 - - if reviews.length != 0 -
    34. - -
    35. - 12 - - reviews.each do |review| -
    36. - -
    37. - 12 - - total_rating += review.stars -
    38. - -
    39. - - - end -
    40. - -
    41. - 12 - - return total_rating/reviews.length -
    42. - -
    43. - - - # Do we want the average to round up or down? Should I add one?? -
    44. - -
    45. - - - else -
    46. - -
    47. - 2 - - total_rating = nil -
    48. - -
    49. - - - end -
    50. - -
    51. - - - end -
    52. - -
    53. - - - -
    54. - -
    55. - - - -
    56. - -
    57. - - - ################### -
    58. - -
    59. - - - ### Validations ### -
    60. - -
    61. - - - ################### -
    62. - -
    63. - - - -
    64. - -
    65. - 1 - - validates :name, presence: true -
    66. - -
    67. - 1 - - validates :description, presence: true -
    68. - -
    69. - 1 - - validates :price, presence: true -
    70. - -
    71. - 1 - - validates :inventory, presence: true -
    72. - -
    73. - 1 - - validates :image, presence: true -
    74. - -
    75. - 1 - - validates :rating, numericality: {greater_than_or_equal_to: 0, less_than_or_equal_to: 5, allow_nil: true } -
    76. - -
    77. - - - -
    78. - -
    79. - - - # validate :limits_on_stars -
    80. - -
    81. - - - # -
    82. - -
    83. - - - # # A rating must be between 0 and 5 -
    84. - -
    85. - - - # def limits_on_stars -
    86. - -
    87. - - - # unless (rating <= 5) && (rating >= 0) -
    88. - -
    89. - - - # errors.add(:rating, "A rating must be between 0 and 5") -
    90. - -
    91. - - - # end -
    92. - -
    93. - - - # end -
    94. - -
    95. - - - end -
    96. - -
    -
    -
    - -
    -
    -

    app/models/product_category.rb

    -

    100.0 % covered

    -
    - 3 relevant lines. - 3 lines covered and - 0 lines missed. -
    -
    - -
    -    
      - -
    1. - 1 - - class ProductCategory < ActiveRecord::Base -
    2. - -
    3. - 1 - - belongs_to :product -
    4. - -
    5. - 1 - - belongs_to :category -
    6. - -
    7. - - - end -
    8. - -
    -
    -
    - -
    -
    -

    app/models/product_order.rb

    -

    100.0 % covered

    -
    - 3 relevant lines. - 3 lines covered and - 0 lines missed. -
    -
    - -
    -    
      - -
    1. - 1 - - class ProductOrder < ActiveRecord::Base -
    2. - -
    3. - 1 - - belongs_to :product -
    4. - -
    5. - 1 - - belongs_to :order -
    6. - -
    7. - - - end -
    8. - -
    -
    -
    - -
    -
    -

    app/models/review.rb

    -

    100.0 % covered

    -
    - 4 relevant lines. - 4 lines covered and - 0 lines missed. -
    -
    - -
    -    
      - -
    1. - 1 - - class Review < ActiveRecord::Base -
    2. - -
    3. - 1 - - belongs_to :product -
    4. - -
    5. - - - -
    6. - -
    7. - - - -
    8. - -
    9. - - - -
    10. - -
    11. - - - -
    12. - -
    13. - - - ################### -
    14. - -
    15. - - - ### Validations ### -
    16. - -
    17. - - - ################### -
    18. - -
    19. - - - -
    20. - -
    21. - 1 - - validates :stars, presence: true, numericality: {greater_than_or_equal_to: 0, less_than_or_equal_to: 5, allow_nil: true } -
    22. - -
    23. - 1 - - validates :description, presence: true -
    24. - -
    25. - - - -
    26. - -
    27. - - - end -
    28. - -
    -
    -
    - -
    -
    -

    test/controllers/guests_controller_test.rb

    -

    100.0 % covered

    -
    - 2 relevant lines. - 2 lines covered and - 0 lines missed. -
    -
    - -
    -    
      - -
    1. - 1 - - require 'test_helper' -
    2. - -
    3. - - - -
    4. - -
    5. - 1 - - class GuestsControllerTest < ActionController::TestCase -
    6. - -
    7. - - - # test "should get index" do -
    8. - -
    9. - - - # get :index -
    10. - -
    11. - - - # assert_response :success -
    12. - -
    13. - - - # end -
    14. - -
    15. - - - # -
    16. - -
    17. - - - # test "should get show" do -
    18. - -
    19. - - - # get :show -
    20. - -
    21. - - - # assert_response :success -
    22. - -
    23. - - - # end -
    24. - -
    25. - - - # -
    26. - -
    27. - - - # test "should get new" do -
    28. - -
    29. - - - # get :new -
    30. - -
    31. - - - # assert_response :success -
    32. - -
    33. - - - # end -
    34. - -
    35. - - - # -
    36. - -
    37. - - - # test "should get create" do -
    38. - -
    39. - - - # get :create -
    40. - -
    41. - - - # assert_response :success -
    42. - -
    43. - - - # end -
    44. - -
    45. - - - # -
    46. - -
    47. - - - # test "should get edit" do -
    48. - -
    49. - - - # get :edit -
    50. - -
    51. - - - # assert_response :success -
    52. - -
    53. - - - # end -
    54. - -
    55. - - - # -
    56. - -
    57. - - - # test "should get update" do -
    58. - -
    59. - - - # get :update -
    60. - -
    61. - - - # assert_response :success -
    62. - -
    63. - - - # end -
    64. - -
    65. - - - # -
    66. - -
    67. - - - # test "should get destroy" do -
    68. - -
    69. - - - # get :destroy -
    70. - -
    71. - - - # assert_response :success -
    72. - -
    73. - - - # end -
    74. - -
    75. - - - -
    76. - -
    77. - - - end -
    78. - -
    -
    -
    - -
    -
    -

    test/controllers/merchants_controller_test.rb

    -

    100.0 % covered

    -
    - 6 relevant lines. - 6 lines covered and - 0 lines missed. -
    -
    - -
    -    
      - -
    1. - 1 - - require 'test_helper' -
    2. - -
    3. - - - -
    4. - -
    5. - 1 - - class MerchantsControllerTest < ActionController::TestCase -
    6. - -
    7. - 1 - - test "should get index" do -
    8. - -
    9. - 1 - - get :index -
    10. - -
    11. - 1 - - assert_response :success -
    12. - -
    13. - 1 - - assert_template :index -
    14. - -
    15. - - - end -
    16. - -
    17. - - - -
    18. - -
    19. - - - end -
    20. - -
    -
    -
    - -
    -
    -

    test/controllers/orders_controller_test.rb

    -

    100.0 % covered

    -
    - 2 relevant lines. - 2 lines covered and - 0 lines missed. -
    -
    - -
    -    
      - -
    1. - 1 - - require 'test_helper' -
    2. - -
    3. - - - -
    4. - -
    5. - 1 - - class OrdersControllerTest < ActionController::TestCase -
    6. - -
    7. - - - # test "should get index" do -
    8. - -
    9. - - - # get :index -
    10. - -
    11. - - - # assert_response :success -
    12. - -
    13. - - - # end -
    14. - -
    15. - - - # -
    16. - -
    17. - - - # test "should get show" do -
    18. - -
    19. - - - # get :show -
    20. - -
    21. - - - # assert_response :success -
    22. - -
    23. - - - # end -
    24. - -
    25. - - - # -
    26. - -
    27. - - - # test "should get new" do -
    28. - -
    29. - - - # get :new -
    30. - -
    31. - - - # assert_response :success -
    32. - -
    33. - - - # end -
    34. - -
    35. - - - # -
    36. - -
    37. - - - # test "should get create" do -
    38. - -
    39. - - - # get :create -
    40. - -
    41. - - - # assert_response :success -
    42. - -
    43. - - - # end -
    44. - -
    45. - - - # -
    46. - -
    47. - - - # test "should get edit" do -
    48. - -
    49. - - - # get :edit -
    50. - -
    51. - - - # assert_response :success -
    52. - -
    53. - - - # end -
    54. - -
    55. - - - # -
    56. - -
    57. - - - # test "should get update" do -
    58. - -
    59. - - - # get :update -
    60. - -
    61. - - - # assert_response :success -
    62. - -
    63. - - - # end -
    64. - -
    65. - - - # -
    66. - -
    67. - - - # test "should get destroy" do -
    68. - -
    69. - - - # get :destroy -
    70. - -
    71. - - - # assert_response :success -
    72. - -
    73. - - - # end -
    74. - -
    75. - - - -
    76. - -
    77. - - - end -
    78. - -
    -
    -
    - -
    -
    -

    test/controllers/products_controller_test.rb

    -

    100.0 % covered

    -
    - 34 relevant lines. - 34 lines covered and - 0 lines missed. -
    -
    - -
    -    
      - -
    1. - 1 - - require 'test_helper' -
    2. - -
    3. - - - -
    4. - -
    5. - 1 - - class ProductsControllerTest < ActionController::TestCase -
    6. - -
    7. - 1 - - test "should get index" do -
    8. - -
    9. - 1 - - get :index, {merchant_id: (products(:glitter).merchant).id} -
    10. - -
    11. - 1 - - assert_response :success -
    12. - -
    13. - 1 - - assert_template :index -
    14. - -
    15. - - - end -
    16. - -
    17. - - - -
    18. - -
    19. - 1 - - test "should get show" do -
    20. - -
    21. - 1 - - merchant = products(:glitter).merchant -
    22. - -
    23. - - - -
    24. - -
    25. - 1 - - get :show, {id: products(:glitter).id, merchant_id: merchant.id } -
    26. - -
    27. - - - #get merchant_product_path(merchant.id, products(:glitter).id) -
    28. - -
    29. - 1 - - assert_response :success -
    30. - -
    31. - - - end -
    32. - -
    33. - - - -
    34. - -
    35. - 1 - - test "should get new" do -
    36. - -
    37. - 1 - - get :new, {merchant_id: (products(:glitter).merchant).id} -
    38. - -
    39. - 1 - - assert_response :success -
    40. - -
    41. - 1 - - assert_template :new -
    42. - -
    43. - - - end -
    44. - -
    45. - - - -
    46. - -
    47. - 1 - - test "should be able to create a new product" do -
    48. - -
    49. - 1 - - post_params = {name: "Glitter Wand", description: "a glittery wand", price: "15.00", image: 'http://placekitten.com/200/300', merchant_id: 2, inventory: 7, rating: 5} -
    50. - -
    51. - - - -
    52. - -
    53. - 1 - - post :create, {merchant_id: (products(:glitter).merchant).id, product: post_params} -
    54. - -
    55. - 1 - - assert_response :redirect -
    56. - -
    57. - - - end -
    58. - -
    59. - - - -
    60. - -
    61. - 1 - - test "creating a product changes the number of products" do -
    62. - -
    63. - 1 - - assert_difference("Product.count",1) do -
    64. - -
    65. - 1 - - post :create, {merchant_id: (products(:glitter).merchant).id, "product" => {name: "Glitter Wand", description: "a glittery wand", price: "15.00", image: 'http://placekitten.com/200/300', inventory: 7, rating: 5}} -
    66. - -
    67. - - - end -
    68. - -
    69. - - - end -
    70. - -
    71. - - - -
    72. - -
    73. - 1 - - test "should get edit -----!!!!" do -
    74. - -
    75. - 1 - - product = products(:glitter) -
    76. - -
    77. - 1 - - get :edit, {id: product.id, merchant_id: products(:glitter).merchant.id } -
    78. - -
    79. - 1 - - assert_response :success -
    80. - -
    81. - - - end -
    82. - -
    83. - - - -
    84. - -
    85. - 1 - - test "should be able to update a product" do -
    86. - -
    87. - 1 - - put :update, {merchant_id: (products(:glitter).merchant).id, id: products(:glitter).id, product: {name: "Glitter Wand", description: "a glittery wand", price: "15.00", image: 'http://placekitten.com/200/300', merchant_id: 2, inventory: 7, rating: 5}} -
    88. - -
    89. - 1 - - assert_redirected_to controller: "products", action: "show" -
    90. - -
    91. - - - end -
    92. - -
    93. - - - -
    94. - -
    95. - 1 - - test "deleting a product changes the number of products" do -
    96. - -
    97. - 1 - - assert_difference("Product.count", -1) do -
    98. - -
    99. - 1 - - delete :destroy, {merchant_id: (products(:glitter).merchant).id, id: products(:glitter).id } -
    100. - -
    101. - - - end -
    102. - -
    103. - - - end -
    104. - -
    105. - - - -
    106. - -
    107. - 1 - - test "responds with error if file isn't found" do -
    108. - -
    109. - 1 - - delete :destroy, {merchant_id: (products(:glitter).merchant).id, id: 943} -
    110. - -
    111. - 1 - - assert_response :missing -
    112. - -
    113. - - - end -
    114. - -
    115. - - - -
    116. - -
    117. - - - end -
    118. - -
    -
    -
    - -
    -
    -

    test/controllers/reviews_controller_test.rb

    -

    100.0 % covered

    -
    - 25 relevant lines. - 25 lines covered and - 0 lines missed. -
    -
    - -
    -    
      - -
    1. - 1 - - require 'test_helper' -
    2. - -
    3. - - - -
    4. - -
    5. - 1 - - class ReviewsControllerTest < ActionController::TestCase -
    6. - -
    7. - 1 - - test "should get index" do -
    8. - -
    9. - 1 - - get :index, {merchant_id: (products(:glitter).merchant).id, product_id: products(:glitter).id} -
    10. - -
    11. - 1 - - assert_response :success -
    12. - -
    13. - 1 - - assert_template :index -
    14. - -
    15. - - - end -
    16. - -
    17. - - - -
    18. - -
    19. - 1 - - test "should get show" do -
    20. - -
    21. - 1 - - get :show, {id: reviews(:glitter_review), product_id: products(:glitter).id, merchant_id: (products(:glitter).merchant).id} -
    22. - -
    23. - 1 - - assert_response :success -
    24. - -
    25. - - - end -
    26. - -
    27. - - - -
    28. - -
    29. - 1 - - test "should get new" do -
    30. - -
    31. - 1 - - get :new, {merchant_id: (products(:glitter).merchant).id, product_id: products(:glitter).id} -
    32. - -
    33. - 1 - - assert_response :success -
    34. - -
    35. - 1 - - assert_template :new -
    36. - -
    37. - - - end -
    38. - -
    39. - - - -
    40. - -
    41. - 1 - - test "should be able to create a new product" do -
    42. - -
    43. - 1 - - post :create, {merchant_id: (products(:glitter).merchant).id, product_id: products(:glitter).id, review: {description: "njefknlsnf", stars: 2, author: "nfs"}} -
    44. - -
    45. - 1 - - assert_response :redirect -
    46. - -
    47. - - - # This action will need to change to merchant's create_new_product path -
    48. - -
    49. - - - end -
    50. - -
    51. - - - -
    52. - -
    53. - 1 - - test "creating a product changes the number of products" do -
    54. - -
    55. - 1 - - assert_difference("Review.count",1) do -
    56. - -
    57. - 1 - - post :create, {merchant_id: (products(:glitter).merchant).id, product_id: products(:glitter).id, review: {description: "njefknlsnf", stars: 2, author: "nfs"}} -
    58. - -
    59. - - - end -
    60. - -
    61. - - - end -
    62. - -
    63. - - - -
    64. - -
    65. - - - -
    66. - -
    67. - 1 - - test "deleting a review changes the number of reviews" do -
    68. - -
    69. - 1 - - assert_difference("Review.count", -1) do -
    70. - -
    71. - 1 - - delete :destroy, {merchant_id: (products(:glitter).merchant).id, product_id: products(:glitter).id, id: reviews(:glitter_review).id } -
    72. - -
    73. - - - end -
    74. - -
    75. - - - end -
    76. - -
    77. - - - -
    78. - -
    79. - 1 - - test "redirects and gives flash notice if file isn't found" do -
    80. - -
    81. - 1 - - delete :destroy, {merchant_id: (products(:glitter).merchant).id, product_id: products(:glitter).id, id: 943} -
    82. - -
    83. - 1 - - assert_redirected_to merchant_product_path((products(:glitter).merchant).id, products(:glitter).id) -
    84. - -
    85. - - - end -
    86. - -
    87. - - - end -
    88. - -
    -
    -
    - -
    -
    -

    test/controllers/sessions_controller_test.rb

    -

    100.0 % covered

    -
    - 17 relevant lines. - 17 lines covered and - 0 lines missed. -
    -
    - -
    -    
      - -
    1. - 1 - - require 'test_helper' -
    2. - -
    3. - - - -
    4. - -
    5. - 1 - - class SessionsControllerTest < ActionController::TestCase -
    6. - -
    7. - - - # test "should get create" do -
    8. - -
    9. - - - # get :create -
    10. - -
    11. - - - # assert_response :success -
    12. - -
    13. - - - # end -
    14. - -
    15. - - - # -
    16. - -
    17. - - - # test "should get destroy" do -
    18. - -
    19. - - - # get :destroy -
    20. - -
    21. - - - # assert_response :success -
    22. - -
    23. - - - # end -
    24. - -
    25. - - - -
    26. - -
    27. - - - # setup do -
    28. - -
    29. - - - # request.env['omniauth.auth'] = OmniAuth.config.mock_auth[:github] -
    30. - -
    31. - - - # end -
    32. - -
    33. - - - -
    34. - -
    35. - 1 - - def login_a_merchant -
    36. - -
    37. - 3 - - request.env['omniauth.auth'] = OmniAuth.config.mock_auth[:github] -
    38. - -
    39. - 3 - - get :create, {uid: '12345'} -
    40. - -
    41. - - - end -
    42. - -
    43. - - - -
    44. - -
    45. - 1 - - test "Can Create a merchant" do -
    46. - -
    47. - 1 - - assert_difference('Merchant.count', 1) do -
    48. - -
    49. - 1 - - login_a_merchant -
    50. - -
    51. - 1 - - assert_response :redirect -
    52. - -
    53. - 1 - - assert_redirected_to merchant_path(Merchant.last.id) -
    54. - -
    55. - - - end -
    56. - -
    57. - - - end -
    58. - -
    59. - - - -
    60. - -
    61. - 1 - - test "If a merchant logs in twice it doesn't create a 2nd merchant" do -
    62. - -
    63. - 1 - - assert_difference('Merchant.count', 1) do -
    64. - -
    65. - 1 - - login_a_merchant -
    66. - -
    67. - - - end -
    68. - -
    69. - 1 - - assert_no_difference('Merchant.count') do -
    70. - -
    71. - 1 - - login_a_merchant -
    72. - -
    73. - 1 - - assert_response :redirect -
    74. - -
    75. - 1 - - assert_redirected_to merchant_path(Merchant.last.id) -
    76. - -
    77. - - - end -
    78. - -
    79. - - - end -
    80. - -
    81. - - - end -
    82. - -
    -
    -
    - -
    -
    -

    test/models/category_test.rb

    -

    100.0 % covered

    -
    - 6 relevant lines. - 6 lines covered and - 0 lines missed. -
    -
    - -
    -    
      - -
    1. - 1 - - require 'test_helper' -
    2. - -
    3. - - - -
    4. - -
    5. - 1 - - class CategoryTest < ActiveSupport::TestCase -
    6. - -
    7. - - - # test "the truth" do -
    8. - -
    9. - - - # assert true -
    10. - -
    11. - - - # end -
    12. - -
    13. - - - -
    14. - -
    15. - 1 - - test "should have the necessary required validators" do -
    16. - -
    17. - 1 - - category = Category.new -
    18. - -
    19. - 1 - - assert_not category.valid? -
    20. - -
    21. - 1 - - assert_equal [:name], category.errors.keys -
    22. - -
    23. - - - end -
    24. - -
    25. - - - end -
    26. - -
    -
    -
    - -
    -
    -

    test/models/guest_test.rb

    -

    100.0 % covered

    -
    - 2 relevant lines. - 2 lines covered and - 0 lines missed. -
    -
    - -
    -    
      - -
    1. - 1 - - require 'test_helper' -
    2. - -
    3. - - - -
    4. - -
    5. - 1 - - class GuestTest < ActiveSupport::TestCase -
    6. - -
    7. - - - # test "the truth" do -
    8. - -
    9. - - - # assert true -
    10. - -
    11. - - - # end -
    12. - -
    13. - - - end -
    14. - -
    -
    -
    - -
    -
    -

    test/models/line_item_test.rb

    -

    100.0 % covered

    -
    - 2 relevant lines. - 2 lines covered and - 0 lines missed. -
    -
    - -
    -    
      - -
    1. - 1 - - require 'test_helper' -
    2. - -
    3. - - - -
    4. - -
    5. - 1 - - class LineItemTest < ActiveSupport::TestCase -
    6. - -
    7. - - - # test "the truth" do -
    8. - -
    9. - - - # assert true -
    10. - -
    11. - - - # end -
    12. - -
    13. - - - end -
    14. - -
    -
    -
    - -
    -
    -

    test/models/merchant_test.rb

    -

    100.0 % covered

    -
    - 24 relevant lines. - 24 lines covered and - 0 lines missed. -
    -
    - -
    -    
      - -
    1. - 1 - - require 'test_helper' -
    2. - -
    3. - - - -
    4. - -
    5. - 1 - - class MerchantTest < ActiveSupport::TestCase -
    6. - -
    7. - 1 - - test "the truth" do -
    8. - -
    9. - 1 - - assert true -
    10. - -
    11. - - - end -
    12. - -
    13. - - - -
    14. - -
    15. - 1 - - test "paid orders calculate as paid" do -
    16. - -
    17. - 1 - - assert_equal 500, merchants(:one).revenue_paid_orders -
    18. - -
    19. - - - end -
    20. - -
    21. - - - -
    22. - -
    23. - 1 - - test "pending orders calculate correctly" do -
    24. - -
    25. - 1 - - assert_equal 600, merchants(:one).revenue_pending_orders -
    26. - -
    27. - - - end -
    28. - -
    29. - - - -
    30. - -
    31. - 1 - - test "completed orders calculate correctly" do -
    32. - -
    33. - 1 - - assert_equal 300, merchants(:one).revenue_completed_orders -
    34. - -
    35. - - - end -
    36. - -
    37. - - - -
    38. - -
    39. - 1 - - test "cancelled orders calculate correctly" do -
    40. - -
    41. - 1 - - assert_equal 300, merchants(:one).revenue_cancelled_orders -
    42. - -
    43. - - - end -
    44. - -
    45. - - - -
    46. - -
    47. - 1 - - test "total orders calculate correctly" do -
    48. - -
    49. - 1 - - assert_equal 1400, merchants(:one).total_revenue -
    50. - -
    51. - - - end -
    52. - -
    53. - - - -
    54. - -
    55. - 1 - - test "correct number of pending orders" do -
    56. - -
    57. - 1 - - assert_equal 2, merchants(:one).pending_orders -
    58. - -
    59. - - - end -
    60. - -
    61. - - - -
    62. - -
    63. - 1 - - test "correct number of cancelled orders" do -
    64. - -
    65. - 1 - - assert_equal 1, merchants(:one).cancelled_orders -
    66. - -
    67. - - - end -
    68. - -
    69. - - - -
    70. - -
    71. - 1 - - test "correct number of paid orders" do -
    72. - -
    73. - 1 - - assert_equal 2, merchants(:one).paid_orders -
    74. - -
    75. - - - end -
    76. - -
    77. - - - -
    78. - -
    79. - 1 - - test "correct number of completed orders" do -
    80. - -
    81. - 1 - - assert_equal 1, merchants(:one).completed_orders -
    82. - -
    83. - - - end -
    84. - -
    85. - - - -
    86. - -
    87. - 1 - - test "correct number of orders" do -
    88. - -
    89. - 1 - - assert_equal 5, merchants(:one).total_orders -
    90. - -
    91. - - - end -
    92. - -
    93. - - - -
    94. - -
    95. - - - end -
    96. - -
    -
    -
    - -
    -
    -

    test/models/order_test.rb

    -

    100.0 % covered

    -
    - 2 relevant lines. - 2 lines covered and - 0 lines missed. -
    -
    - -
    -    
      - -
    1. - 1 - - require 'test_helper' -
    2. - -
    3. - - - -
    4. - -
    5. - 1 - - class OrderTest < ActiveSupport::TestCase -
    6. - -
    7. - - - # test "the truth" do -
    8. - -
    9. - - - # assert true -
    10. - -
    11. - - - # end -
    12. - -
    13. - - - end -
    14. - -
    -
    -
    - -
    -
    -

    test/models/product_category_test.rb

    -

    100.0 % covered

    -
    - 2 relevant lines. - 2 lines covered and - 0 lines missed. -
    -
    - -
    -    
      - -
    1. - 1 - - require 'test_helper' -
    2. - -
    3. - - - -
    4. - -
    5. - 1 - - class ProductCategoryTest < ActiveSupport::TestCase -
    6. - -
    7. - - - # test "the truth" do -
    8. - -
    9. - - - # assert true -
    10. - -
    11. - - - # end -
    12. - -
    13. - - - end -
    14. - -
    -
    -
    - -
    -
    -

    test/models/product_order_test.rb

    -

    100.0 % covered

    -
    - 2 relevant lines. - 2 lines covered and - 0 lines missed. -
    -
    - -
    -    
      - -
    1. - 1 - - require 'test_helper' -
    2. - -
    3. - - - -
    4. - -
    5. - 1 - - class ProductOrderTest < ActiveSupport::TestCase -
    6. - -
    7. - - - # test "the truth" do -
    8. - -
    9. - - - # assert true -
    10. - -
    11. - - - # end -
    12. - -
    13. - - - end -
    14. - -
    -
    -
    - -
    -
    -

    test/models/product_test.rb

    -

    100.0 % covered

    -
    - 22 relevant lines. - 22 lines covered and - 0 lines missed. -
    -
    - -
    -    
      - -
    1. - 1 - - require 'test_helper' -
    2. - -
    3. - - - -
    4. - -
    5. - 1 - - class ProductTest < ActiveSupport::TestCase -
    6. - -
    7. - 1 - - test "the truth" do -
    8. - -
    9. - 1 - - assert true -
    10. - -
    11. - - - end -
    12. - -
    13. - 1 - - test "Product must have a name, description, price, inventory and image" do -
    14. - -
    15. - - - -
    16. - -
    17. - 1 - - assert products(:glitter).valid? "Glitter should be valid" ### WHY IS THIS FAILING??? -
    18. - -
    19. - - - -
    20. - -
    21. - 1 - - products(:glitter).name = nil ## This name removal is local to the test data - it doesn't change the fixture -
    22. - -
    23. - 1 - - assert_not products(:glitter).valid? "Glitter should no longer be valid" -
    24. - -
    25. - - - -
    26. - -
    27. - 1 - - products(:new_shoe).price = nil -
    28. - -
    29. - 1 - - assert_not products(:new_shoe).valid? "New Shoe should no longer be valid" -
    30. - -
    31. - - - end -
    32. - -
    33. - - - -
    34. - -
    35. - 1 - - test "Products cannot have a rating less than 0 or greater than 5" do -
    36. - -
    37. - 1 - - assert products(:glitter).rating = 6 -
    38. - -
    39. - 1 - - assert_not products(:glitter).valid? "Glitter should no longer be valid" -
    40. - -
    41. - - - -
    42. - -
    43. - 1 - - assert products(:new_shoe).rating = -1 -
    44. - -
    45. - 1 - - assert_not products(:new_shoe).valid? "New Shoe should no longer be valid" -
    46. - -
    47. - - - end -
    48. - -
    49. - - - -
    50. - -
    51. - - - -
    52. - -
    53. - 1 - - test "The amount of an product's reviews" do -
    54. - -
    55. - 1 - - assert_equal products(:glitter).reviews.length, 1 -
    56. - -
    57. - 1 - - assert_equal products(:new_shoe).reviews.length, 1 -
    58. - -
    59. - 1 - - assert_equal products(:no_rating).reviews.length, 2 -
    60. - -
    61. - - - -
    62. - -
    63. - - - end -
    64. - -
    65. - - - -
    66. - -
    67. - 1 - - test "No_Rating has the correct reviews" do -
    68. - -
    69. - 1 - - assert_includes products(:no_rating).reviews, reviews(:rating_review_one) -
    70. - -
    71. - 1 - - assert_includes products(:no_rating).reviews, reviews(:rating_review_two) -
    72. - -
    73. - - - end -
    74. - -
    75. - - - -
    76. - -
    77. - - - end -
    78. - -
    -
    -
    - -
    -
    -

    test/models/review_test.rb

    -

    100.0 % covered

    -
    - 18 relevant lines. - 18 lines covered and - 0 lines missed. -
    -
    - -
    -    
      - -
    1. - 1 - - require 'test_helper' -
    2. - -
    3. - - - -
    4. - -
    5. - 1 - - class ReviewTest < ActiveSupport::TestCase -
    6. - -
    7. - - - # test "the truth" do -
    8. - -
    9. - - - # assert true -
    10. - -
    11. - - - # end -
    12. - -
    13. - - - -
    14. - -
    15. - 1 - - test "Reviews must have a star rating and a description" do -
    16. - -
    17. - 1 - - assert reviews(:glitter_review).valid? "Glitter Review should be valid" ### WHY IS THIS FAILING??? -
    18. - -
    19. - - - -
    20. - -
    21. - 1 - - reviews(:glitter_review).stars = nil ## This name removal is local to the test data - it doesn't change the fixture -
    22. - -
    23. - 1 - - assert_not reviews(:glitter_review).valid? "Glitter Review should no longer be valid" -
    24. - -
    25. - - - -
    26. - -
    27. - 1 - - reviews(:shoe_review).description = nil -
    28. - -
    29. - 1 - - assert_not reviews(:shoe_review).valid? "Shoe Review should no longer be valid" -
    30. - -
    31. - - - end -
    32. - -
    33. - - - -
    34. - -
    35. - - - -
    36. - -
    37. - 1 - - test "Reviews cannot have a rating less than 0 or greater than 5" do -
    38. - -
    39. - 1 - - assert reviews(:glitter_review).stars = 6 -
    40. - -
    41. - 1 - - assert_not reviews(:glitter_review).valid? "Glitter Review should no longer be valid" -
    42. - -
    43. - - - -
    44. - -
    45. - 1 - - assert reviews(:shoe_review).stars = -1 -
    46. - -
    47. - 1 - - assert_not reviews(:shoe_review).valid? "New Shoe Review should no longer be valid" -
    48. - -
    49. - - - end -
    50. - -
    51. - - - -
    52. - -
    53. - - - -
    54. - -
    55. - 1 - - test "Each Review has the correct rating" do -
    56. - -
    57. - 1 - - assert_equal reviews(:glitter_review).product, products(:glitter) -
    58. - -
    59. - 1 - - assert_equal reviews(:shoe_review).product, products(:new_shoe) -
    60. - -
    61. - 1 - - assert_equal reviews(:rating_review_one).product, products(:no_rating) -
    62. - -
    63. - 1 - - assert_equal reviews(:rating_review_two).product, products(:no_rating) -
    64. - -
    65. - - - end -
    66. - -
    67. - - - -
    68. - -
    69. - - - -
    70. - -
    71. - - - end -
    72. - -
    -
    -
    - -
    -
    - - From ee44557418abe4a20731516514cc87ae6323305e Mon Sep 17 00:00:00 2001 From: Miriam Date: Wed, 26 Oct 2016 15:09:12 -0700 Subject: [PATCH 117/191] Delete .last_run.json --- coverage/.last_run.json | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 coverage/.last_run.json diff --git a/coverage/.last_run.json b/coverage/.last_run.json deleted file mode 100644 index 86cccaddfb..0000000000 --- a/coverage/.last_run.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "result": { - "covered_percent": 90.12 - } -} From 42d3d0d935c71dee664b693ab23215a86c65a9dd Mon Sep 17 00:00:00 2001 From: Miriam Date: Wed, 26 Oct 2016 15:09:26 -0700 Subject: [PATCH 118/191] Delete .resultset.json --- coverage/.resultset.json | 1456 -------------------------------------- 1 file changed, 1456 deletions(-) delete mode 100644 coverage/.resultset.json diff --git a/coverage/.resultset.json b/coverage/.resultset.json deleted file mode 100644 index d7409b4657..0000000000 --- a/coverage/.resultset.json +++ /dev/null @@ -1,1456 +0,0 @@ -{ - "MiniTest": { - "coverage": { - "/Users/miriamcortes/ada/wk10/betsy/test/controllers/guests_controller_test.rb": [ - 1, - null, - 1, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null - ], - "/Users/miriamcortes/ada/wk10/betsy/test/controllers/merchants_controller_test.rb": [ - 1, - null, - 1, - 1, - 1, - 1, - 1, - null, - null, - null - ], - "/Users/miriamcortes/ada/wk10/betsy/test/controllers/orders_controller_test.rb": [ - 1, - null, - 1, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null - ], - "/Users/miriamcortes/ada/wk10/betsy/test/controllers/products_controller_test.rb": [ - 1, - null, - 1, - 1, - 1, - 1, - 1, - null, - null, - 1, - 1, - null, - 1, - null, - 1, - null, - null, - 1, - 1, - 1, - 1, - null, - null, - 1, - 1, - null, - 1, - 1, - null, - null, - 1, - 1, - 1, - null, - null, - null, - 1, - 1, - 1, - 1, - null, - null, - 1, - 1, - 1, - null, - null, - 1, - 1, - 1, - null, - null, - null, - 1, - 1, - 1, - null, - null, - null - ], - "/Users/miriamcortes/ada/wk10/betsy/test/controllers/reviews_controller_test.rb": [ - 1, - null, - 1, - 1, - 1, - 1, - 1, - null, - null, - 1, - 1, - 1, - null, - null, - 1, - 1, - 1, - 1, - null, - null, - 1, - 1, - 1, - null, - null, - null, - 1, - 1, - 1, - null, - null, - null, - null, - 1, - 1, - 1, - null, - null, - null, - 1, - 1, - 1, - null, - null - ], - "/Users/miriamcortes/ada/wk10/betsy/test/controllers/sessions_controller_test.rb": [ - 1, - null, - 1, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - 1, - 3, - 3, - null, - null, - 1, - 1, - 1, - 1, - 1, - null, - null, - null, - 1, - 1, - 1, - null, - 1, - 1, - 1, - 1, - null, - null, - null - ], - "/Users/miriamcortes/ada/wk10/betsy/test/models/category_test.rb": [ - 1, - null, - 1, - null, - null, - null, - null, - 1, - 1, - 1, - 1, - null, - null - ], - "/Users/miriamcortes/ada/wk10/betsy/test/models/guest_test.rb": [ - 1, - null, - 1, - null, - null, - null, - null - ], - "/Users/miriamcortes/ada/wk10/betsy/test/models/line_item_test.rb": [ - 1, - null, - 1, - null, - null, - null, - null - ], - "/Users/miriamcortes/ada/wk10/betsy/test/models/merchant_test.rb": [ - 1, - null, - 1, - 1, - 1, - null, - null, - 1, - 1, - null, - null, - 1, - 1, - null, - null, - 1, - 1, - null, - null, - 1, - 1, - null, - null, - 1, - 1, - null, - null, - 1, - 1, - null, - null, - 1, - 1, - null, - null, - 1, - 1, - null, - null, - 1, - 1, - null, - null, - 1, - 1, - null, - null, - null - ], - "/Users/miriamcortes/ada/wk10/betsy/test/models/order_test.rb": [ - 1, - null, - 1, - null, - null, - null, - null - ], - "/Users/miriamcortes/ada/wk10/betsy/test/models/product_category_test.rb": [ - 1, - null, - 1, - null, - null, - null, - null - ], - "/Users/miriamcortes/ada/wk10/betsy/test/models/product_order_test.rb": [ - 1, - null, - 1, - null, - null, - null, - null - ], - "/Users/miriamcortes/ada/wk10/betsy/test/models/product_test.rb": [ - 1, - null, - 1, - 1, - 1, - null, - 1, - null, - 1, - null, - 1, - 1, - null, - 1, - 1, - null, - null, - 1, - 1, - 1, - null, - 1, - 1, - null, - null, - null, - 1, - 1, - 1, - 1, - null, - null, - null, - 1, - 1, - 1, - null, - null, - null - ], - "/Users/miriamcortes/ada/wk10/betsy/test/models/review_test.rb": [ - 1, - null, - 1, - null, - null, - null, - null, - 1, - 1, - null, - 1, - 1, - null, - 1, - 1, - null, - null, - null, - 1, - 1, - 1, - null, - 1, - 1, - null, - null, - null, - 1, - 1, - 1, - 1, - 1, - null, - null, - null, - null - ], - "/Users/miriamcortes/ada/wk10/betsy/app/models/category.rb": [ - 1, - 1, - 1, - 1, - null - ], - "/Users/miriamcortes/ada/wk10/betsy/app/models/guest.rb": [ - 1, - 1, - 1, - null, - 1, - null, - 24, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null - ], - "/Users/miriamcortes/ada/wk10/betsy/app/models/line_item.rb": [ - 1, - 1, - 1, - null, - 1, - 0, - 0, - 0, - 0, - null, - null, - null, - 1, - 0, - 0, - null, - null, - null - ], - "/Users/miriamcortes/ada/wk10/betsy/app/models/merchant.rb": [ - null, - 1, - 1, - 1, - 1, - 1, - null, - 1, - 1, - null, - 1, - 2, - 2, - 2, - 2, - 2, - null, - null, - null, - 2, - null, - null, - 1, - 1, - 1, - 6, - 2, - null, - null, - 1, - null, - null, - 1, - 1, - 1, - 6, - 2, - null, - null, - 1, - null, - null, - 1, - 1, - 1, - 6, - 1, - null, - null, - 1, - null, - null, - 1, - 1, - 1, - 6, - 1, - null, - null, - 1, - null, - null, - 1, - 1, - 1, - 6, - null, - 5, - null, - null, - 1, - null, - null, - 1, - 1, - 1, - 6, - 2, - null, - null, - 1, - null, - null, - 1, - 1, - 1, - 6, - 1, - null, - null, - 1, - null, - null, - 1, - 1, - 1, - 6, - 2, - null, - null, - 1, - null, - null, - 1, - 1, - 1, - 6, - 1, - null, - null, - 1, - null, - null, - 1, - 1, - 1, - 6, - null, - 5, - null, - null, - 1, - null, - null, - 1, - null, - 0, - null, - null, - null, - null, - null, - null, - null - ], - "/Users/miriamcortes/ada/wk10/betsy/app/models/order.rb": [ - 1, - 1, - null, - 1, - 1, - 1, - null, - 1, - null, - null, - null, - 0, - 0, - 0, - 0, - 0, - 0, - null, - null, - null, - null - ], - "/Users/miriamcortes/ada/wk10/betsy/app/models/product_category.rb": [ - 1, - 1, - 1, - null - ], - "/Users/miriamcortes/ada/wk10/betsy/app/models/product_order.rb": [ - 1, - 1, - 1, - null - ], - "/Users/miriamcortes/ada/wk10/betsy/app/models/product.rb": [ - 1, - 1, - 1, - null, - 1, - 1, - null, - 1, - 1, - null, - null, - null, - null, - null, - 1, - 14, - 14, - 12, - 12, - null, - 12, - null, - null, - 2, - null, - null, - null, - null, - null, - null, - null, - null, - 1, - 1, - 1, - 1, - 1, - 1, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null - ], - "/Users/miriamcortes/ada/wk10/betsy/app/models/review.rb": [ - 1, - 1, - null, - null, - null, - null, - null, - null, - null, - null, - 1, - 1, - null, - null - ], - "/Users/miriamcortes/ada/wk10/betsy/app/controllers/merchants_controller.rb": [ - 1, - null, - null, - 1, - 1, - null, - null, - 1, - 0, - null, - null, - 1, - 0, - 0, - null, - null, - 1, - null, - null, - 1, - null, - null, - 1, - null, - null, - 1, - null, - null, - 1, - 0, - 0, - null, - null, - 1, - null, - 1, - 0, - null, - null, - 1, - 1, - null, - null - ], - "/Users/miriamcortes/ada/wk10/betsy/app/controllers/application_controller.rb": [ - 1, - null, - null, - 1, - null, - 27, - 1, - null, - 1, - 55, - null, - null, - 1, - 48, - 12, - 12, - 12, - null, - null, - 1, - 26, - 26, - 26, - 26, - null, - null, - 1, - 26, - 26, - null, - null, - 1, - null, - 24, - null, - 0, - null, - null, - 24, - null, - 24, - null, - null, - null, - null, - null, - null, - null, - null, - null - ], - "/Users/miriamcortes/ada/wk10/betsy/app/helpers/application_helper.rb": [ - 1, - null, - null, - 1, - 10, - 10, - 0, - null, - 37, - 33, - null, - 10, - null, - null, - 1, - 12, - 12, - null, - 0, - null, - null, - null - ], - "/Users/miriamcortes/ada/wk10/betsy/app/helpers/categories_helper.rb": [ - 1, - null - ], - "/Users/miriamcortes/ada/wk10/betsy/app/helpers/guests_helper.rb": [ - 1, - null - ], - "/Users/miriamcortes/ada/wk10/betsy/app/helpers/merchants_helper.rb": [ - 1, - null - ], - "/Users/miriamcortes/ada/wk10/betsy/app/helpers/orders_helper.rb": [ - 1, - null - ], - "/Users/miriamcortes/ada/wk10/betsy/app/helpers/products_helper.rb": [ - 1, - null - ], - "/Users/miriamcortes/ada/wk10/betsy/app/helpers/reviews_helper.rb": [ - 1, - null - ], - "/Users/miriamcortes/ada/wk10/betsy/app/helpers/sessions_helper.rb": [ - 1, - null - ], - "/Users/miriamcortes/ada/wk10/betsy/app/controllers/products_controller.rb": [ - 1, - 1, - 1, - null, - 1, - 0, - null, - null, - 1, - 1, - null, - null, - 1, - 1, - 1, - 1, - null, - null, - 1, - 1, - 1, - 1, - 1, - null, - null, - 1, - 2, - 2, - null, - 2, - 2, - 2, - 2, - null, - 0, - 0, - 0, - 0, - null, - null, - null, - 1, - 1, - 1, - null, - null, - 1, - 1, - 1, - 1, - 1, - null, - 0, - 0, - 0, - 0, - null, - null, - null, - 1, - 2, - 2, - 1, - 1, - null, - null, - null, - 1, - null, - 1, - 5, - 4, - null, - 1, - null, - null, - null, - 1, - 9, - 9, - null, - 0, - null, - null, - null, - 1, - 6, - null, - null, - null - ], - "/Users/miriamcortes/ada/wk10/betsy/app/controllers/reviews_controller.rb": [ - 1, - 1, - 1, - 1, - null, - null, - 1, - 1, - null, - null, - 1, - null, - null, - 1, - 1, - 0, - 0, - null, - null, - 1, - 1, - 1, - null, - null, - null, - 1, - 2, - 2, - null, - 2, - 2, - null, - 0, - 0, - 0, - 0, - null, - null, - null, - 1, - 0, - 0, - 0, - null, - null, - null, - 1, - null, - null, - 1, - 1, - 1, - 0, - 0, - null, - null, - 1, - 1, - 1, - null, - null, - null, - null, - null, - 1, - null, - 1, - 14, - 14, - null, - 0, - 0, - null, - null, - null, - null, - 1, - 7, - 7, - 7, - null, - 0, - 0, - null, - null, - null, - null, - 1, - 4, - 3, - null, - 1, - 1, - null, - null, - null, - null, - 1, - 2, - null, - null - ], - "/Users/miriamcortes/ada/wk10/betsy/app/controllers/categories_controller.rb": [ - 1, - 1, - null, - 1, - 1, - null, - null, - null, - null, - 1, - 1, - 1, - null, - null, - 1, - 1, - null, - null, - 1, - 2, - 2, - 2, - null, - 0, - 0, - null, - null, - null, - null, - null, - 1, - null, - null, - 1, - null, - null, - 1, - 1, - 1, - null, - 1, - null, - null, - 1, - 1, - 2, - null, - null, - null - ], - "/Users/miriamcortes/ada/wk10/betsy/app/controllers/sessions_controller.rb": [ - 1, - 1, - 3, - null, - 3, - null, - 3, - 3, - 2, - 2, - 2, - null, - null, - null, - 3, - null, - 3, - null, - null, - 1, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - 1, - 0, - 0, - null, - null - ] - }, - "timestamp": 1477517203 - }, - "Unit Tests": { - "coverage": { - "/Users/miriamcortes/ada/wk10/betsy/test/models/merchant_test.rb": [ - 1, - null, - 1, - 1, - 1, - null, - null, - 1, - 1, - null, - null, - 1, - 1, - null, - null, - 1, - 1, - null, - null, - 1, - 1, - null, - null, - 1, - 1, - null, - null, - 1, - 1, - null, - null, - 1, - 1, - null, - null, - 1, - 1, - null, - null, - 1, - 1, - null, - null, - null, - null, - null, - null, - 1, - 1, - null, - null, - null - ], - "/Users/miriamcortes/ada/wk10/betsy/app/models/category.rb": [ - 1, - 1, - 1, - 1, - null - ], - "/Users/miriamcortes/ada/wk10/betsy/app/models/guest.rb": [ - 1, - 1, - 1, - null - ], - "/Users/miriamcortes/ada/wk10/betsy/app/models/line_item.rb": [ - 1, - 1, - 1, - null, - null - ], - "/Users/miriamcortes/ada/wk10/betsy/app/models/merchant.rb": [ - null, - 1, - 1, - 1, - 1, - 1, - null, - 1, - 1, - null, - 1, - 0, - 0, - 0, - 0, - 0, - null, - null, - null, - 0, - null, - null, - 1, - 1, - 1, - 6, - 2, - null, - null, - 1, - null, - null, - 1, - 1, - 1, - 6, - 2, - null, - null, - 1, - null, - null, - 1, - 1, - 1, - 6, - 1, - null, - null, - 1, - null, - null, - 1, - 1, - 1, - 6, - 1, - null, - null, - 1, - null, - null, - 1, - 1, - 1, - 6, - null, - 5, - null, - null, - 1, - null, - null, - 1, - 1, - 1, - 6, - 2, - null, - null, - 1, - null, - null, - 1, - 1, - 1, - 6, - 1, - null, - null, - 1, - null, - null, - 1, - 1, - 1, - 6, - 2, - null, - null, - 1, - null, - null, - 1, - 1, - 1, - 6, - 1, - null, - null, - 1, - null, - null, - 1, - 1, - 1, - 6, - null, - 5, - null, - null, - 1, - null, - null, - null, - null, - null, - null, - null - ], - "/Users/miriamcortes/ada/wk10/betsy/app/models/order.rb": [ - 1, - 1, - null, - 1, - 1, - 1, - null - ], - "/Users/miriamcortes/ada/wk10/betsy/app/models/product_category.rb": [ - 1, - 1, - 1, - null - ], - "/Users/miriamcortes/ada/wk10/betsy/app/models/product_order.rb": [ - 1, - 1, - 1, - null - ], - "/Users/miriamcortes/ada/wk10/betsy/app/models/product.rb": [ - 1, - 1, - 1, - null, - 1, - 1, - null, - 1, - 1, - null, - null, - null, - null, - null, - 1, - 0, - 0, - 0, - 0, - null, - 0, - null, - null, - 0, - null, - null, - null, - null, - null, - null, - null, - null, - 1, - 1, - 1, - 1, - 1, - 1, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null - ], - "/Users/miriamcortes/ada/wk10/betsy/app/models/review.rb": [ - 1, - 1, - null, - null, - null, - null, - null, - null, - null, - null, - 1, - 1, - null, - null - ] - }, - "timestamp": 1477435952 - } -} From f390fd8f951e9c65cad55677c6a5852f476a4376 Mon Sep 17 00:00:00 2001 From: Miriam Date: Wed, 26 Oct 2016 15:09:33 -0700 Subject: [PATCH 119/191] Delete .resultset.json.lock --- coverage/.resultset.json.lock | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 coverage/.resultset.json.lock diff --git a/coverage/.resultset.json.lock b/coverage/.resultset.json.lock deleted file mode 100644 index e69de29bb2..0000000000 From dc8006215e32a23a949f710745263c5187f4d84c Mon Sep 17 00:00:00 2001 From: Miriam Date: Wed, 26 Oct 2016 15:09:40 -0700 Subject: [PATCH 120/191] Delete magnify.png --- coverage/assets/0.10.0/magnify.png | Bin 1301 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 coverage/assets/0.10.0/magnify.png diff --git a/coverage/assets/0.10.0/magnify.png b/coverage/assets/0.10.0/magnify.png deleted file mode 100644 index 6073b9530ed197d0431ab30ca79ed262f4b910fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1301 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CP!3HERJk;|9Qj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS=07?{&CLn2Bde0{8v^Ko2Tt~skz|cV7z)0WFNY~KZ%Gk)tz(4^Clz_GsrKDK}xwt{?0`hE?GD=Dctn~HE z%ggo3jrH=2()A53EiFN27#ZmTRp=I1=9MH?=;jqG!%T2VElw`VEGWs$&r<-In3$Ab zT4JjNbScCOxdpzyaD(%Tp#cR9GX09g0)0b01O41wkiWpHi%Wu15zfG>x;Uh=AXPso zwK%`DC>aHCFybnZQU%%yG$2F3nBNEAe!(RRYTBrDUd98JJoa z7#fLwm{}MaS{S&PxH=kI8aca~nVK0J!py*?*VNqH(b&z&+|k6`#L&>i&C$@& z*wN9@%*oZ*)ycrb38vRGuec;JFF6%vZzj-Qs9rO?daay`QWHz^i$e1Ab6_bTAS1sd zzc?emK*2fKRKYhfIWrH$2SpFWw=StgnPsUdZbkXI3gGay%EV$nVShvPreF&*U?|}Y zGku_A^g)RODY3wWfGH5fgeQF<2cCIS^ME;~2$(gL-@n|+z`*G0>EaktajRw0L9dno zk+%0&6)$)$+Nzu6AkfL76}2_%qHx3)uDvb4^e!sRPZYbPmUVHFfHTLUiPtWPG~N0l zZ#n&l+OLO)AAjB7Ui^QxNPqy#CXKGeHs{qNr>(s->-DbU0z`y zvr6dr$F>Ni``^>&J&$coyz%zJ3gg+&AF#zVco%Tny^yX9X%_4~_?3AFvsJM_@4>k9 z$|k19Q#LoAQGV8H_r+$eqvyAIlg$53a?31u`=R*Y7LjRQK3q&Le8wT*lABgaxY9)S-2*+#8CINRCwstB#E|+S#Dc$ zwO{YLR_Gu9;oL6fRnl*|)1C_USH7J5{&}o${cFKJg}F_K6W5$Bxw~5P=*fENxPy~_ qY45u7g2$OHiv4-Q?6`fb5)4Z;>fX&^evkqxs61W$T-G@yGywqb{mBae From 85053ff9e1fdd2529bf593ca248ee067d0beaae3 Mon Sep 17 00:00:00 2001 From: Miriam Date: Wed, 26 Oct 2016 15:09:45 -0700 Subject: [PATCH 121/191] Delete loading.gif --- coverage/assets/0.10.0/loading.gif | Bin 7247 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 coverage/assets/0.10.0/loading.gif diff --git a/coverage/assets/0.10.0/loading.gif b/coverage/assets/0.10.0/loading.gif deleted file mode 100644 index 3596a61f3af951db38aeb149eecb37e7142d5c46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7247 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 From 7cda41972cf27a351792556dc2c84cb64257c74a Mon Sep 17 00:00:00 2001 From: Miriam Date: Wed, 26 Oct 2016 15:09:49 -0700 Subject: [PATCH 122/191] Delete favicon_yellow.png --- coverage/assets/0.10.0/favicon_yellow.png | Bin 1009 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 coverage/assets/0.10.0/favicon_yellow.png diff --git a/coverage/assets/0.10.0/favicon_yellow.png b/coverage/assets/0.10.0/favicon_yellow.png deleted file mode 100644 index e53847ea09aea9a5a16237a2acbebd0bef7f9436..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1009 zcmbVL&u-H&7|%3;VA8a415Q?U;jkulx;AaLFg0<;Dwa{TmFRJ9;eJ#kmiX9Mq>;)n%m16w*8lZ-ldARVZ09vn08R3}~jQ%4>lxM4$c%<5qMr zyvnKBrvXT zW(y$?VK0EKJ-cON+=4-+aU0if*#Qg!4>ub=LILbF?S|iIT6OFlAsf{zZZ|6g$s$_$ zO{Cuyw{s`g@i`@e@gZXuRR{EDOt50ca^MddAS6+eslB?MWww~|pPHF67*jRJU(He-$qrP@o7R_`o8h6EoER=gqyAy{ksPc0y^~?^^P`$D o)I$%Y+3MoXu>3JTdwlPk2EJ-*+uGW`=e<;rZg7e}d1vo_0~HY~(EtDd From e32d58c9954f6e6585fa45661d0275997e74ae52 Mon Sep 17 00:00:00 2001 From: Miriam Date: Wed, 26 Oct 2016 15:09:53 -0700 Subject: [PATCH 123/191] Delete favicon_red.png --- coverage/assets/0.10.0/favicon_red.png | Bin 1009 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 coverage/assets/0.10.0/favicon_red.png diff --git a/coverage/assets/0.10.0/favicon_red.png b/coverage/assets/0.10.0/favicon_red.png deleted file mode 100644 index fbe093a551114bd5ba92550b83ec04a886238bdb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1009 zcmbVLO>Wab7bYf2utF_0Br^M-! z9Yvvdaul*51?`xOX_u04_WBz=P?XJ4)E|g}e`*IT)<}WT@;H@j zML9UkQxaTI0fuxOC64;@(`OY#p`*U6`_NB4I*CrMIqhAa^@Hn+pc$%%Pr*TMOM#dQ z0`mAW$?V)w=eoAs7uUK9<`8k=s0*hCeg}ArQ&87nC4eRbCel!~W?9x_U_b(45K0um28#>l2?*! zzf{093wV@@h$WymuBpW2eKZc{gNzmce9}aD7~>?@JJSgTw)en#WWFZ?5OgO7Dk~BQ3E1m)u3fS zvw@I{u-k%-n$@r{ZopQlv5xCD%qliK1DkaZp%y$ct-4n?jVgAJk%g)yx1D5yBmph$ zM$+z*i*DrF9;ZYw-e>Hx?10XM36@P*3cOw&_#}vu;#`zx5iO=XdPBow&SEgnuN|$i z4~>7tz2JublQUg9qZiHbSF@B?vIC3ls`cezH9Rzt6T{_byxRM5OODl@&S}5(em-Fz o?)}1Yv(v^${rvmz{Qm8)3izUI>?#{iT=#i_X}8YsNB8{gZ@}R!9smFU From 2a7b7ed3da0bdeb83399140896867243b34f052f Mon Sep 17 00:00:00 2001 From: Miriam Date: Wed, 26 Oct 2016 15:09:57 -0700 Subject: [PATCH 124/191] Delete favicon_green.png --- coverage/assets/0.10.0/favicon_green.png | Bin 1009 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 coverage/assets/0.10.0/favicon_green.png diff --git a/coverage/assets/0.10.0/favicon_green.png b/coverage/assets/0.10.0/favicon_green.png deleted file mode 100644 index 74db330cd05242b60234287449ecfd80372ffd72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1009 zcmbVL&u-H&7|%2fp-Izr1Ws0V;Xo5RU6VE}OiP`yie*%7C3>8jxNWp0&K!@XJ96U* z5HGP8-~dPV3cLg_zyZ5$28U@#L`pu}`Tc(1AAjG+?&<5T&1ajMrfqeOaZlPE^*&yg z-{-aMzBEroFcf_@7Bj-Bb{Mk}1)Y>kXpfS3etApxHEn&I42EJDp12W94WckcndXwM zY5NCdPNH)vz=%$g%+r5<`Kp5?_Vjm+5Qcf1PLtznPW#uVgXsD^YQ_4&E3jX>QXr** zfHJ+v3b*w1g{~{t>e$r50wT^meHqj+?1DDq6f_K2i=YjGjSN)Za~$Udupojav`l2x zkmJ@Z7ecUlbm@)9W4DKoR=(uU)2Bk@u4&F@Gh0d)Scz%4poTJdu||E-;I(Qksbl_H_Bjh?Cfbs0k5r_Ml@y zyNQsGuphwYp3`(NZo;6_xR2{M?K-yn0Naf=LIFIqokqK1TXpOoAqUkfZYL`Q$s$_$ zO{Cuy7eB~#+nf@?_<*sCssp-HCRj0LIcWDAAS6+eslB?MWww~|pPHF67*jRJU(He-$qrP@yVjSRyWydkoER=gV9Nv@y|Z|1|OU)HUIzs From 04a788beae02b5a3934196418bc9388627f4b1a8 Mon Sep 17 00:00:00 2001 From: Miriam Date: Wed, 26 Oct 2016 15:10:04 -0700 Subject: [PATCH 125/191] Delete application.js --- coverage/assets/0.10.0/application.js | 1707 ------------------------- 1 file changed, 1707 deletions(-) delete mode 100644 coverage/assets/0.10.0/application.js diff --git a/coverage/assets/0.10.0/application.js b/coverage/assets/0.10.0/application.js deleted file mode 100644 index fe65d88219..0000000000 --- a/coverage/assets/0.10.0/application.js +++ /dev/null @@ -1,1707 +0,0 @@ -/*! - * jQuery JavaScript Library v1.6.2 - * http://jquery.com/ - * - * Copyright 2011, John Resig - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * Includes Sizzle.js - * http://sizzlejs.com/ - * Copyright 2011, The Dojo Foundation - * Released under the MIT, BSD, and GPL Licenses. - * - * Date: Thu Jun 30 14:16:56 2011 -0400 - */ - -(function(a,b){function cv(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cs(a){if(!cg[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ch||(ch=c.createElement("iframe"),ch.frameBorder=ch.width=ch.height=0),b.appendChild(ch);if(!ci||!ch.createElement)ci=(ch.contentWindow||ch.contentDocument).document,ci.write((c.compatMode==="CSS1Compat"?"":"")+""),ci.close();d=ci.createElement(a),ci.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ch)}cg[a]=e}return cg[a]}function cr(a,b){var c={};f.each(cm.concat.apply([],cm.slice(0,b)),function(){c[this]=a});return c}function cq(){cn=b}function cp(){setTimeout(cq,0);return cn=f.now()}function cf(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ce(){try{return new a.XMLHttpRequest}catch(b){}}function b$(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){c!=="border"&&f.each(e,function(){c||(d-=parseFloat(f.css(a,"padding"+this))||0),c==="margin"?d+=parseFloat(f.css(a,c+this))||0:d-=parseFloat(f.css(a,"border"+this+"Width"))||0});return d+"px"}d=bx(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0,c&&f.each(e,function(){d+=parseFloat(f.css(a,"padding"+this))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+this+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+this))||0)});return d+"px"}function bm(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(be,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bl(a){f.nodeName(a,"input")?bk(a):"getElementsByTagName"in a&&f.grep(a.getElementsByTagName("input"),bk)}function bk(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bj(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function bi(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bh(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c=f.expando,d=f.data(a),e=f.data(b,d);if(d=d[c]){var g=d.events;e=e[c]=f.extend({},d);if(g){delete e.handle,e.events={};for(var h in g)for(var i=0,j=g[h].length;i=0===c})}function V(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function N(a,b){return(a&&a!=="*"?a+".":"")+b.replace(z,"`").replace(A,"&")}function M(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,"events");if(!(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type==="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var s=r.live.slice(0);for(i=0;ic)break;a.currentTarget=e.elem,a.data=e.handleObj.data,a.handleObj=e.handleObj,o=e.handleObj.origHandler.apply(e.elem,arguments);if(o===!1||a.isPropagationStopped()){c=e.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function K(a,c,d){var e=f.extend({},d[0]);e.type=a,e.originalEvent={},e.liveFired=b,f.event.handle.call(c,e),e.isDefaultPrevented()&&d[0].preventDefault()}function E(){return!0}function D(){return!1}function m(a,c,d){var e=c+"defer",g=c+"queue",h=c+"mark",i=f.data(a,e,b,!0);i&&(d==="queue"||!f.data(a,g,b,!0))&&(d==="mark"||!f.data(a,h,b,!0))&&setTimeout(function(){!f.data(a,g,b,!0)&&!f.data(a,h,b,!0)&&(f.removeData(a,e,!0),i.resolve())},0)}function l(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function k(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(j,"$1-$2").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNaN(d)?i.test(d)?f.parseJSON(d):d:parseFloat(d)}catch(g){}f.data(a,c,d)}else d=b}return d}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=/-([a-z])/ig,x=function(a,b){return b.toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.6.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!A){A=e._Deferred();if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNaN:function(a){return a==null||!m.test(a)||isNaN(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in a);return c===b||D.call(a,c)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(b,c,d){a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b)),d=c.documentElement,(!d||!d.nodeName||d.nodeName==="parsererror")&&e.error("Invalid XML: "+b);return c},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?h.call(arguments,0):c,--e||g.resolveWith(g,h.call(b,0))}}var b=arguments,c=0,d=b.length,e=d,g=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred();if(d>1){for(;c
    a",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=a.getElementsByTagName("input")[0],k={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55$/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:a.className!=="t",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,k.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,k.optDisabled=!h.disabled;try{delete a.test}catch(v){k.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function(){k.noCloneEvent=!1}),a.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),k.radioValue=i.value==="t",i.setAttribute("checked","checked"),a.appendChild(i),l=c.createDocumentFragment(),l.appendChild(a.firstChild),k.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",m=c.getElementsByTagName("body")[0],o=c.createElement(m?"div":"body"),p={visibility:"hidden",width:0,height:0,border:0,margin:0},m&&f.extend(p,{position:"absolute",left:-1e3,top:-1e3});for(t in p)o.style[t]=p[t];o.appendChild(a),n=m||b,n.insertBefore(o,n.firstChild),k.appendChecked=i.checked,k.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,k.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="
    ",k.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="
    t
    ",q=a.getElementsByTagName("td"),u=q[0].offsetHeight===0,q[0].style.display="",q[1].style.display="none",k.reliableHiddenOffsets=u&&q[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",a.appendChild(j),k.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0),o.innerHTML="",n.removeChild(o);if(a.attachEvent)for(t in{submit:1,change:1,focusin:1})s="on"+t,u=s in a,u||(a.setAttribute(s,"return;"),u=typeof a[s]=="function"),k[t+"Bubbles"]=u;o=l=g=h=m=j=a=i=null;return k}(),f.boxModel=f.support.boxModel;var i=/^(?:\{.*\}|\[.*\])$/,j=/([a-z])([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!l(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g=f.expando,h=typeof c=="string",i,j=a.nodeType,k=j?f.cache:a,l=j?a[f.expando]:a[f.expando]&&f.expando;if((!l||e&&l&&!k[l][g])&&h&&d===b)return;l||(j?a[f.expando]=l=++f.uuid:l=f.expando),k[l]||(k[l]={},j||(k[l].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?k[l][g]=f.extend(k[l][g],c):k[l]=f.extend(k[l],c);i=k[l],e&&(i[g]||(i[g]={}),i=i[g]),d!==b&&(i[f.camelCase(c)]=d);if(c==="events"&&!i[c])return i[g]&&i[g].events;return h?i[f.camelCase(c)]||i[c]:i}},removeData:function(b,c,d){if(!!f.acceptData(b)){var e=f.expando,g=b.nodeType,h=g?f.cache:b,i=g?b[f.expando]:f.expando;if(!h[i])return;if(c){var j=d?h[i][e]:h[i];if(j){delete j[c];if(!l(j))return}}if(d){delete h[i][e];if(!l(h[i]))return}var k=h[i][e];f.support.deleteExpando||h!=a?delete h[i]:h[i]=null,k?(h[i]={},g||(h[i].toJSON=f.noop),h[i][e]=k):g&&(f.support.deleteExpando?delete b[f.expando]:b.removeAttribute?b.removeAttribute(f.expando):b[f.expando]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d=null;if(typeof a=="undefined"){if(this.length){d=f.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,g;for(var h=0,i=e.length;h-1)return!0;return!1},val:function(a){var c,d,e=this[0];if(!arguments.length){if(e){c=f.valHooks[e.nodeName.toLowerCase()]||f.valHooks[e.type];if(c&&"get"in c&&(d=c.get(e,"value"))!==b)return d;d=e.value;return typeof d=="string"?d.replace(p,""):d==null?"":d}return b}var g=f.isFunction(a);return this.each(function(d){var e=f(this),h;if(this.nodeType===1){g?h=a.call(this,d,e.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c=a.selectedIndex,d=[],e=a.options,g=a.type==="select-one";if(c<0)return null;for(var h=g?c:0,i=g?c+1:e.length;h=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attrFix:{tabindex:"tabIndex"},attr:function(a,c,d,e){var g=a.nodeType;if(!a||g===3||g===8||g===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);var h,i,j=g!==1||!f.isXMLDoc(a);j&&(c=f.attrFix[c]||c,i=f.attrHooks[c],i||(t.test(c)?i=w:v&&c!=="className"&&(f.nodeName(a,"form")||u.test(c))&&(i=v)));if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(i&&"set"in i&&j&&(h=i.set(a,d,c))!==b)return h;a.setAttribute(c,""+d);return d}if(i&&"get"in i&&j&&(h=i.get(a,c))!==null)return h;h=a.getAttribute(c);return h===null?b:h},removeAttr:function(a,b){var c;a.nodeType===1&&(b=f.attrFix[b]||b,f.support.getSetAttribute?a.removeAttribute(b):(f.attr(a,b,""),a.removeAttributeNode(a.getAttributeNode(b))),t.test(b)&&(c=f.propFix[b]||b)in a&&(a[c]=!1))},attrHooks:{type:{set:function(a,b){if(q.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},tabIndex:{get:function(a){var c=a.getAttributeNode("tabIndex");return c&&c.specified?parseInt(c.value,10):r.test(a.nodeName)||s.test(a.nodeName)&&a.href?0:b}},value:{get:function(a,b){if(v&&f.nodeName(a,"button"))return v.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(v&&f.nodeName(a,"button"))return v.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e=a.nodeType;if(!a||e===3||e===8||e===2)return b;var g,h,i=e!==1||!f.isXMLDoc(a);i&&(c=f.propFix[c]||c,h=f.propHooks[c]);return d!==b?h&&"set"in h&&(g=h.set(a,d,c))!==b?g:a[c]=d:h&&"get"in h&&(g=h.get(a,c))!==b?g:a[c]},propHooks:{}}),w={get:function(a,c){return f.prop(a,c)?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},f.support.getSetAttribute||(f.attrFix=f.propFix,v=f.attrHooks.name=f.attrHooks.title=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&d.nodeValue!==""?d.nodeValue:b},set:function(a,b,c){var d=a.getAttributeNode(c);if(d){d.nodeValue=b;return b}}},f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})})),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}})),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var x=/\.(.*)$/,y=/^(?:textarea|input|select)$/i,z=/\./g,A=/ /g,B=/[^\w\s.|`]/g,C=function(a){return a.replace(B,"\\$&")};f.event={add:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){if(d===!1)d=D;else if(!d)return;var g,h;d.handler&&(g=d,d=g.handler),d.guid||(d.guid=f.guid++);var i=f._data(a);if(!i)return;var j=i.events,k=i.handle;j||(i.events=j={}),k||(i.handle=k=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.handle.apply(k.elem,arguments):b}),k.elem=a,c=c.split(" ");var l,m=0,n;while(l=c[m++]){h=g?f.extend({},g):{handler:d,data:e},l.indexOf(".")>-1?(n=l.split("."),l=n.shift(),h.namespace=n.slice(0).sort().join(".")):(n=[],h.namespace=""),h.type=l,h.guid||(h.guid=d.guid);var o=j[l],p=f.event.special[l]||{};if(!o){o=j[l]=[];if(!p.setup||p.setup.call(a,e,n,k)===!1)a.addEventListener?a.addEventListener(l,k,!1):a.attachEvent&&a.attachEvent("on"+l,k)}p.add&&(p.add.call(a,h),h.handler.guid||(h.handler.guid=d.guid)),o.push(h),f.event.global[l]=!0}a=null}},global:{},remove:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){d===!1&&(d=D);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=f.hasData(a)&&f._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(d=c.handler,c=c.type);if(!c||typeof c=="string"&&c.charAt(0)==="."){c=c||"";for(h in t)f.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+f.map(m.slice(0).sort(),C).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!d){for(j=0;j=0&&(h=h.slice(0,-1),j=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i. -shift(),i.sort());if(!!e&&!f.event.customEvent[h]||!!f.event.global[h]){c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.exclusive=j,c.namespace=i.join("."),c.namespace_re=new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)");if(g||!e)c.preventDefault(),c.stopPropagation();if(!e){f.each(f.cache,function(){var a=f.expando,b=this[a];b&&b.events&&b.events[h]&&f.event.trigger(c,d,b.handle.elem)});return}if(e.nodeType===3||e.nodeType===8)return;c.result=b,c.target=e,d=d!=null?f.makeArray(d):[],d.unshift(c);var k=e,l=h.indexOf(":")<0?"on"+h:"";do{var m=f._data(k,"handle");c.currentTarget=k,m&&m.apply(k,d),l&&f.acceptData(k)&&k[l]&&k[l].apply(k,d)===!1&&(c.result=!1,c.preventDefault()),k=k.parentNode||k.ownerDocument||k===c.target.ownerDocument&&a}while(k&&!c.isPropagationStopped());if(!c.isDefaultPrevented()){var n,o=f.event.special[h]||{};if((!o._default||o._default.call(e.ownerDocument,c)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)){try{l&&e[h]&&(n=e[l],n&&(e[l]=null),f.event.triggered=h,e[h]())}catch(p){}n&&(e[l]=n),f.event.triggered=b}}return c.result}},handle:function(c){c=f.event.fix(c||a.event);var d=((f._data(this,"events")||{})[c.type]||[]).slice(0),e=!c.exclusive&&!c.namespace,g=Array.prototype.slice.call(arguments,0);g[0]=c,c.currentTarget=this;for(var h=0,i=d.length;h-1?f.map(a.options,function(a){return a.selected}).join("-"):"":f.nodeName(a,"select")&&(c=a.selectedIndex);return c},J=function(c){var d=c.target,e,g;if(!!y.test(d.nodeName)&&!d.readOnly){e=f._data(d,"_change_data"),g=I(d),(c.type!=="focusout"||d.type!=="radio")&&f._data(d,"_change_data",g);if(e===b||g===e)return;if(e!=null||g)c.type="change",c.liveFired=b,f.event.trigger(c,arguments[1],d)}};f.event.special.change={filters:{focusout:J,beforedeactivate:J,click:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(c==="radio"||c==="checkbox"||f.nodeName(b,"select"))&&J.call(this,a)},keydown:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(a.keyCode===13&&!f.nodeName(b,"textarea")||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&J.call(this,a)},beforeactivate:function(a){var b=a.target;f._data(b,"_change_data",I(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in H)f.event.add(this,c+".specialChange",H[c]);return y.test(this.nodeName)},teardown:function(a){f.event.remove(this,".specialChange");return y.test(this.nodeName)}},H=f.event.special.change.filters,H.focus=H.beforeactivate}f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){function e(a){var c=f.event.fix(a);c.type=b,c.originalEvent={},f.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var d=0;f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.each(["bind","one"],function(a,c){f.fn[c]=function(a,d,e){var g;if(typeof a=="object"){for(var h in a)this[c](h,d,a[h],e);return this}if(arguments.length===2||d===!1)e=d,d=b;c==="one"?(g=function(a){f(this).unbind(a,g);return e.apply(this,arguments)},g.guid=e.guid||f.guid++):g=e;if(a==="unload"&&c!=="one")this.one(a,d,e);else for(var i=0,j=this.length;i0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d=0,e=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,f,g){f=f||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return f;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(e.call(n)==="[object Array]")if(!u)f.push.apply(f,n);else if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&f.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&f.push(j[t]);else p(n,f);o&&(k(o,h,f,g),k.uniqueSort(f));return f};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=d++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(e.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var f=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

    ";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
    ";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g0)for(h=g;h0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(d=0,e=a.length;d-1:f(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=T.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a||typeof a=="string")return f.inArray(this[0],a?f(a):this.parent().children());return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(V(c[0])||V(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=S.call(arguments);O.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!U[a]?f.unique(e):e,(this.length>1||Q.test(d))&&P.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var X=/ jQuery\d+="(?:\d+|null)"/g,Y=/^\s+/,Z=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,$=/<([\w:]+)/,_=/",""],legend:[1,"
    ","
    "],thead:[1,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],col:[2,"","
    "],area:[1,"",""],_default:[0,"",""]};bf.optgroup=bf.option,bf.tbody=bf.tfoot=bf.colgroup=bf.caption=bf.thead,bf.th=bf.td,f.support.htmlSerialize||(bf._default=[1,"div
    ","
    "]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(X,""):null;if(typeof a=="string"&&!bb.test(a)&&(f.support.leadingWhitespace||!Y.test(a))&&!bf[($.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Z,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j -)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bi(a,d),e=bj(a),g=bj(d);for(h=0;e[h];++h)bi(e[h],g[h])}if(b){bh(a,d);if(c){e=bj(a),g=bj(d);for(h=0;e[h];++h)bh(e[h],g[h])}}e=g=null;return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!ba.test(k))k=b.createTextNode(k);else{k=k.replace(Z,"<$1>");var l=($.exec(k)||["",""])[1].toLowerCase(),m=bf[l]||bf._default,n=m[0],o=b.createElement("div");o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=_.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&Y.test(k)&&o.insertBefore(b.createTextNode(Y.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bo.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle;c.zoom=1;var e=f.isNaN(b)?"":"alpha(opacity="+b*100+")",g=d&&d.filter||c.filter||"";c.filter=bn.test(g)?g.replace(bn,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bx(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(by=function(a,c){var d,e,g;c=c.replace(bp,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bz=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bq.test(d)&&br.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bx=by||bz,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bB=/%20/g,bC=/\[\]$/,bD=/\r?\n/g,bE=/#.*$/,bF=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bG=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bH=/^(?:about|app|app\-storage|.+\-extension|file|widget):$/,bI=/^(?:GET|HEAD)$/,bJ=/^\/\//,bK=/\?/,bL=/)<[^<]*)*<\/script>/gi,bM=/^(?:select|textarea)/i,bN=/\s+/,bO=/([?&])_=[^&]*/,bP=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bQ=f.fn.load,bR={},bS={},bT,bU;try{bT=e.href}catch(bV){bT=c.createElement("a"),bT.href="",bT=bT.href}bU=bP.exec(bT.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bQ)return bQ.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
    ").append(c.replace(bL,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bM.test(this.nodeName)||bG.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bD,"\r\n")}}):{name:b.name,value:c.replace(bD,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?f.extend(!0,a,f.ajaxSettings,b):(b=a,a=f.extend(!0,f.ajaxSettings,b));for(var c in{context:1,url:1})c in b?a[c]=b[c]:c in f.ajaxSettings&&(a[c]=f.ajaxSettings[c]);return a},ajaxSettings:{url:bT,isLocal:bH.test(bU[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML}},ajaxPrefilter:bW(bR),ajaxTransport:bW(bS),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a?4:0;var o,r,u,w=l?bZ(d,v,l):b,x,y;if(a>=200&&a<300||a===304){if(d.ifModified){if(x=v.getResponseHeader("Last-Modified"))f.lastModified[k]=x;if(y=v.getResponseHeader("Etag"))f.etag[k]=y}if(a===304)c="notmodified",o=!0;else try{r=b$(d,w),c="success",o=!0}catch(z){c="parsererror",u=z}}else{u=c;if(!c||a)c="error",a<0&&(a=0)}v.status=a,v.statusText=c,o?h.resolveWith(e,[r,c,v]):h.rejectWith(e,[v,c,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.resolveWith(e,[v,c]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f._Deferred(),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bF.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.done,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bE,"").replace(bJ,bU[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bN),d.crossDomain==null&&(r=bP.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bU[1]&&r[2]==bU[2]&&(r[3]||(r[1]==="http:"?80:443))==(bU[3]||(bU[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bX(bR,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bI.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bK.test(d.url)?"&":"?")+d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bO,"$1_="+x);d.url=y+(y===d.url?(bK.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", */*; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bX(bS,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){status<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)bY(g,a[g],c,e);return d.join("&").replace(bB,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var b_=f.now(),ca=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+b_++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ca.test(b.url)||e&&ca.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ca,l),b.url===j&&(e&&(k=k.replace(ca,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cb=a.ActiveXObject?function(){for(var a in cd)cd[a](0,1)}:!1,cc=0,cd;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ce()||cf()}:ce,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cb&&delete cd[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cc,cb&&(cd||(cd={},f(a).unload(cb)),cd[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cg={},ch,ci,cj=/^(?:toggle|show|hide)$/,ck=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cl,cm=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cn,co=a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||a.oRequestAnimationFrame;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cr("show",3),a,b,c);for(var g=0,h=this.length;g=e.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),e.animatedProperties[this.prop]=!0;for(g in e.animatedProperties)e.animatedProperties[g]!==!0&&(c=!1);if(c){e.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){d.style["overflow"+b]=e.overflow[a]}),e.hide&&f(d).hide();if(e.hide||e.show)for(var i in e.animatedProperties)f.style(d,i,e.orig[i]);e.complete.call(d)}return!1}e.duration==Infinity?this.now=b:(h=b-this.startTime,this.state=h/e.duration,this.pos=f.easing[e.animatedProperties[this.prop]](this.state,h,0,1,e.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){for(var a=f.timers,b=0;b
    ";f.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),d=b.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,this.doesNotAddBorder=e.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,e.style.position="fixed",e.style.top="20px",this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),f.offset.initialize=f.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.offset.initialize(),f.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cu.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cu.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cv(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cv(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a&&a.style?parseFloat(f.css(a,d,"padding")):null},f.fn["outer"+c]=function(a){var b=this[0];return b&&b.style?parseFloat(f.css(b,d,a?"margin":"border")):null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c];return e.document.compatMode==="CSS1Compat"&&g||e.document.body["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var h=f.css(e,d),i=parseFloat(h);return f.isNaN(i)?h:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window); -var hljs=new function(){function l(o){return o.replace(/&/gm,"&").replace(/"}while(x.length||y.length){var u=t().splice(0,1)[0];v+=l(w.substr(q,u.offset-q));q=u.offset;if(u.event=="start"){v+=r(u.node);s.push(u.node)}else{if(u.event=="stop"){var p=s.length;do{p--;var o=s[p];v+=("")}while(o!=u.node);s.splice(p,1);while(p'+l(K[0])+""}else{M+=l(K[0])}O=N.lR.lastIndex;K=N.lR.exec(L)}M+=l(L.substr(O,L.length-O));return M}function J(r,L){if(L.sL&&d[L.sL]){var K=f(L.sL,r);s+=K.keyword_count;return K.value}else{return E(r,L)}}function H(L,r){var K=L.cN?'':"";if(L.rB){p+=K;L.buffer=""}else{if(L.eB){p+=l(r)+K;L.buffer=""}else{p+=K;L.buffer=r}}B.push(L);A+=L.r}function D(N,K,P){var Q=B[B.length-1];if(P){p+=J(Q.buffer+N,Q);return false}var L=y(K,Q);if(L){p+=J(Q.buffer+N,Q);H(L,K);return L.rB}var r=v(B.length-1,K);if(r){var M=Q.cN?"":"";if(Q.rE){p+=J(Q.buffer+N,Q)+M}else{if(Q.eE){p+=J(Q.buffer+N,Q)+M+l(K)}else{p+=J(Q.buffer+N+K,Q)+M}}while(r>1){M=B[B.length-2].cN?"":"";p+=M;r--;B.length--}var O=B[B.length-1];B.length--;B[B.length-1].buffer="";if(O.starts){H(O.starts,"")}return Q.rE}if(w(K,Q)){throw"Illegal"}}var G=d[I];var B=[G.dM];var A=0;var s=0;var p="";try{var u=0;G.dM.buffer="";do{var x=q(C,u);var t=D(x[0],x[1],x[2]);u+=x[0].length;if(!t){u+=x[1].length}}while(!x[2]);if(B.length>1){throw"Illegal"}return{language:I,r:A,keyword_count:s,value:p}}catch(F){if(F=="Illegal"){return{language:null,r:0,keyword_count:0,value:l(C)}}else{throw F}}}function h(){function o(t,s,u){if(t.compiled){return}if(!u){t.bR=c(s,t.b?t.b:"\\B|\\b");if(!t.e&&!t.eW){t.e="\\B|\\b"}if(t.e){t.eR=c(s,t.e)}}if(t.i){t.iR=c(s,t.i)}if(t.r==undefined){t.r=1}if(t.k){t.lR=c(s,t.l||hljs.IR,true)}for(var r in t.k){if(!t.k.hasOwnProperty(r)){continue}if(t.k[r] instanceof Object){t.kG=t.k}else{t.kG={keyword:t.k}}break}if(!t.c){t.c=[]}t.compiled=true;for(var q=0;qx.keyword_count+x.r){x=u}if(u.keyword_count+u.r>w.keyword_count+w.r){x=w;w=u}}}var s=t.className;if(!s.match(w.language)){s=s?(s+" "+w.language):w.language}var o=b(t);if(o.length){var q=document.createElement("pre");q.innerHTML=w.value;w.value=k(o,b(q),A)}if(y){w.value=w.value.replace(/^((<[^>]+>|\t)+)/gm,function(B,E,D,C){return E.replace(/\t/g,y)})}if(p){w.value=w.value.replace(/\n/g,"
    ")}if(/MSIE [678]/.test(navigator.userAgent)&&t.tagName=="CODE"&&t.parentNode.tagName=="PRE"){var q=t.parentNode;var v=document.createElement("div");v.innerHTML="
    "+w.value+"
    ";t=v.firstChild.firstChild;v.firstChild.cN=q.cN;q.parentNode.replaceChild(v.firstChild,q)}else{t.innerHTML=w.value}t.className=s;t.dataset={};t.dataset.result={language:w.language,kw:w.keyword_count,re:w.r};if(x&&x.language){t.dataset.second_best={language:x.language,kw:x.keyword_count,re:x.r}}}function j(){if(j.called){return}j.called=true;e();var q=document.getElementsByTagName("pre");for(var o=0;o|>=|>>|>>=|>>>|>>>=|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~";this.BE={b:"\\\\.",r:0};this.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[this.BE],r:0};this.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[this.BE],r:0};this.CLCM={cN:"comment",b:"//",e:"$"};this.CBLCLM={cN:"comment",b:"/\\*",e:"\\*/"};this.HCM={cN:"comment",b:"#",e:"$"};this.NM={cN:"number",b:this.NR,r:0};this.CNM={cN:"number",b:this.CNR,r:0};this.inherit=function(o,r){var q={};for(var p in o){q[p]=o[p]}if(r){for(var p in r){q[p]=r[p]}}return q}}();hljs.LANGUAGES.ruby=function(){var g="[a-zA-Z_][a-zA-Z0-9_]*(\\!|\\?)?";var a="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?";var n={keyword:{and:1,"false":1,then:1,defined:1,module:1,"in":1,"return":1,redo:1,"if":1,BEGIN:1,retry:1,end:1,"for":1,"true":1,self:1,when:1,next:1,until:1,"do":1,begin:1,unless:1,END:1,rescue:1,nil:1,"else":1,"break":1,undef:1,not:1,"super":1,"class":1,"case":1,require:1,yield:1,alias:1,"while":1,ensure:1,elsif:1,or:1,def:1},keymethods:{__id__:1,__send__:1,abort:1,abs:1,"all?":1,allocate:1,ancestors:1,"any?":1,arity:1,assoc:1,at:1,at_exit:1,autoload:1,"autoload?":1,"between?":1,binding:1,binmode:1,"block_given?":1,call:1,callcc:1,caller:1,capitalize:1,"capitalize!":1,casecmp:1,"catch":1,ceil:1,center:1,chomp:1,"chomp!":1,chop:1,"chop!":1,chr:1,"class":1,class_eval:1,"class_variable_defined?":1,class_variables:1,clear:1,clone:1,close:1,close_read:1,close_write:1,"closed?":1,coerce:1,collect:1,"collect!":1,compact:1,"compact!":1,concat:1,"const_defined?":1,const_get:1,const_missing:1,const_set:1,constants:1,count:1,crypt:1,"default":1,default_proc:1,"delete":1,"delete!":1,delete_at:1,delete_if:1,detect:1,display:1,div:1,divmod:1,downcase:1,"downcase!":1,downto:1,dump:1,dup:1,each:1,each_byte:1,each_index:1,each_key:1,each_line:1,each_pair:1,each_value:1,each_with_index:1,"empty?":1,entries:1,eof:1,"eof?":1,"eql?":1,"equal?":1,"eval":1,exec:1,exit:1,"exit!":1,extend:1,fail:1,fcntl:1,fetch:1,fileno:1,fill:1,find:1,find_all:1,first:1,flatten:1,"flatten!":1,floor:1,flush:1,for_fd:1,foreach:1,fork:1,format:1,freeze:1,"frozen?":1,fsync:1,getc:1,gets:1,global_variables:1,grep:1,gsub:1,"gsub!":1,"has_key?":1,"has_value?":1,hash:1,hex:1,id:1,include:1,"include?":1,included_modules:1,index:1,indexes:1,indices:1,induced_from:1,inject:1,insert:1,inspect:1,instance_eval:1,instance_method:1,instance_methods:1,"instance_of?":1,"instance_variable_defined?":1,instance_variable_get:1,instance_variable_set:1,instance_variables:1,"integer?":1,intern:1,invert:1,ioctl:1,"is_a?":1,isatty:1,"iterator?":1,join:1,"key?":1,keys:1,"kind_of?":1,lambda:1,last:1,length:1,lineno:1,ljust:1,load:1,local_variables:1,loop:1,lstrip:1,"lstrip!":1,map:1,"map!":1,match:1,max:1,"member?":1,merge:1,"merge!":1,method:1,"method_defined?":1,method_missing:1,methods:1,min:1,module_eval:1,modulo:1,name:1,nesting:1,"new":1,next:1,"next!":1,"nil?":1,nitems:1,"nonzero?":1,object_id:1,oct:1,open:1,pack:1,partition:1,pid:1,pipe:1,pop:1,popen:1,pos:1,prec:1,prec_f:1,prec_i:1,print:1,printf:1,private_class_method:1,private_instance_methods:1,"private_method_defined?":1,private_methods:1,proc:1,protected_instance_methods:1,"protected_method_defined?":1,protected_methods:1,public_class_method:1,public_instance_methods:1,"public_method_defined?":1,public_methods:1,push:1,putc:1,puts:1,quo:1,raise:1,rand:1,rassoc:1,read:1,read_nonblock:1,readchar:1,readline:1,readlines:1,readpartial:1,rehash:1,reject:1,"reject!":1,remainder:1,reopen:1,replace:1,require:1,"respond_to?":1,reverse:1,"reverse!":1,reverse_each:1,rewind:1,rindex:1,rjust:1,round:1,rstrip:1,"rstrip!":1,scan:1,seek:1,select:1,send:1,set_trace_func:1,shift:1,singleton_method_added:1,singleton_methods:1,size:1,sleep:1,slice:1,"slice!":1,sort:1,"sort!":1,sort_by:1,split:1,sprintf:1,squeeze:1,"squeeze!":1,srand:1,stat:1,step:1,store:1,strip:1,"strip!":1,sub:1,"sub!":1,succ:1,"succ!":1,sum:1,superclass:1,swapcase:1,"swapcase!":1,sync:1,syscall:1,sysopen:1,sysread:1,sysseek:1,system:1,syswrite:1,taint:1,"tainted?":1,tell:1,test:1,"throw":1,times:1,to_a:1,to_ary:1,to_f:1,to_hash:1,to_i:1,to_int:1,to_io:1,to_proc:1,to_s:1,to_str:1,to_sym:1,tr:1,"tr!":1,tr_s:1,"tr_s!":1,trace_var:1,transpose:1,trap:1,truncate:1,"tty?":1,type:1,ungetc:1,uniq:1,"uniq!":1,unpack:1,unshift:1,untaint:1,untrace_var:1,upcase:1,"upcase!":1,update:1,upto:1,"value?":1,values:1,values_at:1,warn:1,write:1,write_nonblock:1,"zero?":1,zip:1}};var h={cN:"yardoctag",b:"@[A-Za-z]+"};var d={cN:"comment",b:"#",e:"$",c:[h]};var c={cN:"comment",b:"^\\=begin",e:"^\\=end",c:[h],r:10};var b={cN:"comment",b:"^__END__",e:"\\n$"};var u={cN:"subst",b:"#\\{",e:"}",l:g,k:n};var p=[hljs.BE,u];var s={cN:"string",b:"'",e:"'",c:p,r:0};var r={cN:"string",b:'"',e:'"',c:p,r:0};var q={cN:"string",b:"%[qw]?\\(",e:"\\)",c:p,r:10};var o={cN:"string",b:"%[qw]?\\[",e:"\\]",c:p,r:10};var m={cN:"string",b:"%[qw]?{",e:"}",c:p,r:10};var l={cN:"string",b:"%[qw]?<",e:">",c:p,r:10};var k={cN:"string",b:"%[qw]?/",e:"/",c:p,r:10};var j={cN:"string",b:"%[qw]?%",e:"%",c:p,r:10};var i={cN:"string",b:"%[qw]?-",e:"-",c:p,r:10};var t={cN:"string",b:"%[qw]?\\|",e:"\\|",c:p,r:10};var e={cN:"function",b:"\\bdef\\s+",e:" |$|;",l:g,k:n,c:[{cN:"title",b:a,l:g,k:n},{cN:"params",b:"\\(",e:"\\)",l:g,k:n},d,c,b]};var f={cN:"identifier",b:g,l:g,k:n,r:0};var v=[d,c,b,s,r,q,o,m,l,k,j,i,t,{cN:"class",b:"\\b(class|module)\\b",e:"$|;",k:{"class":1,module:1},c:[{cN:"title",b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?",r:0},{cN:"inheritance",b:"<\\s*",c:[{cN:"parent",b:"("+hljs.IR+"::)?"+hljs.IR}]},d,c,b]},e,{cN:"constant",b:"(::)?([A-Z]\\w*(::)?)+",r:0},{cN:"symbol",b:":",c:[s,r,q,o,m,l,k,j,i,t,f],r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{cN:"number",b:"\\?\\w"},{cN:"variable",b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},f,{b:"("+hljs.RSR+")\\s*",c:[d,c,b,{cN:"regexp",b:"/",e:"/[a-z]*",i:"\\n",c:[hljs.BE]}],r:0}];u.c=v;e.c[1].c=v;return{dM:{l:g,k:n,c:v}}}(); -/*! - Colorbox v1.5.13 - 2014-08-04 - jQuery lightbox and modal window plugin - (c) 2014 Jack Moore - http://www.jacklmoore.com/colorbox - license: http://www.opensource.org/licenses/mit-license.php - */ - -(function ($, document, window) { - var - // Default settings object. - // See http://jacklmoore.com/colorbox for details. - defaults = { - // data sources - html: false, - photo: false, - iframe: false, - inline: false, - - // behavior and appearance - transition: "elastic", - speed: 300, - fadeOut: 300, - width: false, - initialWidth: "600", - innerWidth: false, - maxWidth: false, - height: false, - initialHeight: "450", - innerHeight: false, - maxHeight: false, - scalePhotos: true, - scrolling: true, - opacity: 0.9, - preloading: true, - className: false, - overlayClose: true, - escKey: true, - arrowKey: true, - top: false, - bottom: false, - left: false, - right: false, - fixed: false, - data: undefined, - closeButton: true, - fastIframe: true, - open: false, - reposition: true, - loop: true, - slideshow: false, - slideshowAuto: true, - slideshowSpeed: 2500, - slideshowStart: "start slideshow", - slideshowStop: "stop slideshow", - photoRegex: /\.(gif|png|jp(e|g|eg)|bmp|ico|webp|jxr|svg)((#|\?).*)?$/i, - - // alternate image paths for high-res displays - retinaImage: false, - retinaUrl: false, - retinaSuffix: '@2x.$1', - - // internationalization - current: "image {current} of {total}", - previous: "previous", - next: "next", - close: "close", - xhrError: "This content failed to load.", - imgError: "This image failed to load.", - - // accessbility - returnFocus: true, - trapFocus: true, - - // callbacks - onOpen: false, - onLoad: false, - onComplete: false, - onCleanup: false, - onClosed: false, - - rel: function() { - return this.rel; - }, - href: function() { - // using this.href would give the absolute url, when the href may have been inteded as a selector (e.g. '#container') - return $(this).attr('href'); - }, - title: function() { - return this.title; - } - }, - - // Abstracting the HTML and event identifiers for easy rebranding - colorbox = 'colorbox', - prefix = 'cbox', - boxElement = prefix + 'Element', - - // Events - event_open = prefix + '_open', - event_load = prefix + '_load', - event_complete = prefix + '_complete', - event_cleanup = prefix + '_cleanup', - event_closed = prefix + '_closed', - event_purge = prefix + '_purge', - - // Cached jQuery Object Variables - $overlay, - $box, - $wrap, - $content, - $topBorder, - $leftBorder, - $rightBorder, - $bottomBorder, - $related, - $window, - $loaded, - $loadingBay, - $loadingOverlay, - $title, - $current, - $slideshow, - $next, - $prev, - $close, - $groupControls, - $events = $(''), // $({}) would be prefered, but there is an issue with jQuery 1.4.2 - - // Variables for cached values or use across multiple functions - settings, - interfaceHeight, - interfaceWidth, - loadedHeight, - loadedWidth, - index, - photo, - open, - active, - closing, - loadingTimer, - publicMethod, - div = "div", - requests = 0, - previousCSS = {}, - init; - - // **************** - // HELPER FUNCTIONS - // **************** - - // Convenience function for creating new jQuery objects - function $tag(tag, id, css) { - var element = document.createElement(tag); - - if (id) { - element.id = prefix + id; - } - - if (css) { - element.style.cssText = css; - } - - return $(element); - } - - // Get the window height using innerHeight when available to avoid an issue with iOS - // http://bugs.jquery.com/ticket/6724 - function winheight() { - return window.innerHeight ? window.innerHeight : $(window).height(); - } - - function Settings(element, options) { - if (options !== Object(options)) { - options = {}; - } - - this.cache = {}; - this.el = element; - - this.value = function(key) { - var dataAttr; - - if (this.cache[key] === undefined) { - dataAttr = $(this.el).attr('data-cbox-'+key); - - if (dataAttr !== undefined) { - this.cache[key] = dataAttr; - } else if (options[key] !== undefined) { - this.cache[key] = options[key]; - } else if (defaults[key] !== undefined) { - this.cache[key] = defaults[key]; - } - } - - return this.cache[key]; - }; - - this.get = function(key) { - var value = this.value(key); - return $.isFunction(value) ? value.call(this.el, this) : value; - }; - } - - // Determine the next and previous members in a group. - function getIndex(increment) { - var - max = $related.length, - newIndex = (index + increment) % max; - - return (newIndex < 0) ? max + newIndex : newIndex; - } - - // Convert '%' and 'px' values to integers - function setSize(size, dimension) { - return Math.round((/%/.test(size) ? ((dimension === 'x' ? $window.width() : winheight()) / 100) : 1) * parseInt(size, 10)); - } - - // Checks an href to see if it is a photo. - // There is a force photo option (photo: true) for hrefs that cannot be matched by the regex. - function isImage(settings, url) { - return settings.get('photo') || settings.get('photoRegex').test(url); - } - - function retinaUrl(settings, url) { - return settings.get('retinaUrl') && window.devicePixelRatio > 1 ? url.replace(settings.get('photoRegex'), settings.get('retinaSuffix')) : url; - } - - function trapFocus(e) { - if ('contains' in $box[0] && !$box[0].contains(e.target) && e.target !== $overlay[0]) { - e.stopPropagation(); - $box.focus(); - } - } - - function setClass(str) { - if (setClass.str !== str) { - $box.add($overlay).removeClass(setClass.str).addClass(str); - setClass.str = str; - } - } - - function getRelated(rel) { - index = 0; - - if (rel && rel !== false && rel !== 'nofollow') { - $related = $('.' + boxElement).filter(function () { - var options = $.data(this, colorbox); - var settings = new Settings(this, options); - return (settings.get('rel') === rel); - }); - index = $related.index(settings.el); - - // Check direct calls to Colorbox. - if (index === -1) { - $related = $related.add(settings.el); - index = $related.length - 1; - } - } else { - $related = $(settings.el); - } - } - - function trigger(event) { - // for external use - $(document).trigger(event); - // for internal use - $events.triggerHandler(event); - } - - var slideshow = (function(){ - var active, - className = prefix + "Slideshow_", - click = "click." + prefix, - timeOut; - - function clear () { - clearTimeout(timeOut); - } - - function set() { - if (settings.get('loop') || $related[index + 1]) { - clear(); - timeOut = setTimeout(publicMethod.next, settings.get('slideshowSpeed')); - } - } - - function start() { - $slideshow - .html(settings.get('slideshowStop')) - .unbind(click) - .one(click, stop); - - $events - .bind(event_complete, set) - .bind(event_load, clear); - - $box.removeClass(className + "off").addClass(className + "on"); - } - - function stop() { - clear(); - - $events - .unbind(event_complete, set) - .unbind(event_load, clear); - - $slideshow - .html(settings.get('slideshowStart')) - .unbind(click) - .one(click, function () { - publicMethod.next(); - start(); - }); - - $box.removeClass(className + "on").addClass(className + "off"); - } - - function reset() { - active = false; - $slideshow.hide(); - clear(); - $events - .unbind(event_complete, set) - .unbind(event_load, clear); - $box.removeClass(className + "off " + className + "on"); - } - - return function(){ - if (active) { - if (!settings.get('slideshow')) { - $events.unbind(event_cleanup, reset); - reset(); - } - } else { - if (settings.get('slideshow') && $related[1]) { - active = true; - $events.one(event_cleanup, reset); - if (settings.get('slideshowAuto')) { - start(); - } else { - stop(); - } - $slideshow.show(); - } - } - }; - - }()); - - - function launch(element) { - var options; - - if (!closing) { - - options = $(element).data(colorbox); - - settings = new Settings(element, options); - - getRelated(settings.get('rel')); - - if (!open) { - open = active = true; // Prevents the page-change action from queuing up if the visitor holds down the left or right keys. - - setClass(settings.get('className')); - - // Show colorbox so the sizes can be calculated in older versions of jQuery - $box.css({visibility:'hidden', display:'block', opacity:''}); - - $loaded = $tag(div, 'LoadedContent', 'width:0; height:0; overflow:hidden; visibility:hidden'); - $content.css({width:'', height:''}).append($loaded); - - // Cache values needed for size calculations - interfaceHeight = $topBorder.height() + $bottomBorder.height() + $content.outerHeight(true) - $content.height(); - interfaceWidth = $leftBorder.width() + $rightBorder.width() + $content.outerWidth(true) - $content.width(); - loadedHeight = $loaded.outerHeight(true); - loadedWidth = $loaded.outerWidth(true); - - // Opens inital empty Colorbox prior to content being loaded. - var initialWidth = setSize(settings.get('initialWidth'), 'x'); - var initialHeight = setSize(settings.get('initialHeight'), 'y'); - var maxWidth = settings.get('maxWidth'); - var maxHeight = settings.get('maxHeight'); - - settings.w = (maxWidth !== false ? Math.min(initialWidth, setSize(maxWidth, 'x')) : initialWidth) - loadedWidth - interfaceWidth; - settings.h = (maxHeight !== false ? Math.min(initialHeight, setSize(maxHeight, 'y')) : initialHeight) - loadedHeight - interfaceHeight; - - $loaded.css({width:'', height:settings.h}); - publicMethod.position(); - - trigger(event_open); - settings.get('onOpen'); - - $groupControls.add($title).hide(); - - $box.focus(); - - if (settings.get('trapFocus')) { - // Confine focus to the modal - // Uses event capturing that is not supported in IE8- - if (document.addEventListener) { - - document.addEventListener('focus', trapFocus, true); - - $events.one(event_closed, function () { - document.removeEventListener('focus', trapFocus, true); - }); - } - } - - // Return focus on closing - if (settings.get('returnFocus')) { - $events.one(event_closed, function () { - $(settings.el).focus(); - }); - } - } - - var opacity = parseFloat(settings.get('opacity')); - $overlay.css({ - opacity: opacity === opacity ? opacity : '', - cursor: settings.get('overlayClose') ? 'pointer' : '', - visibility: 'visible' - }).show(); - - if (settings.get('closeButton')) { - $close.html(settings.get('close')).appendTo($content); - } else { - $close.appendTo('
    '); // replace with .detach() when dropping jQuery < 1.4 - } - - load(); - } - } - - // Colorbox's markup needs to be added to the DOM prior to being called - // so that the browser will go ahead and load the CSS background images. - function appendHTML() { - if (!$box && document.body) { - init = false; - $window = $(window); - $box = $tag(div).attr({ - id: colorbox, - 'class': $.support.opacity === false ? prefix + 'IE' : '', // class for optional IE8 & lower targeted CSS. - role: 'dialog', - tabindex: '-1' - }).hide(); - $overlay = $tag(div, "Overlay").hide(); - $loadingOverlay = $([$tag(div, "LoadingOverlay")[0],$tag(div, "LoadingGraphic")[0]]); - $wrap = $tag(div, "Wrapper"); - $content = $tag(div, "Content").append( - $title = $tag(div, "Title"), - $current = $tag(div, "Current"), - $prev = $(' + + <% @featured_products.each do |product| %> +
  • +
    +

    <%= product.name %>

    +

    <%= image_tag(product.image, size: "200x275", alt: "Photo of #{product.name}") %>

    +

    Price: $<%= '%.2f' % (product.price/100.00) %>

    +

    Inventory: <%= product.inventory %>

    +

    <%= product.rating == nil ? "Not Yet Rated!" : star_string(product.rating) %>

    + + +
    +
  • + <% end %> + + +
    diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index fcc598eccb..6c603b38eb 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -13,6 +13,7 @@
    + <%= link_to("Home", index_path, method: :get) %> <% if current_merchant != nil %> <%= link_to("Log out", sessions_destroy_path, method: :delete) %> <%= link_to("My account", merchant_path(current_merchant.id), method: :get) %> @@ -53,7 +54,7 @@
    diff --git a/app/views/products/all_products.html.erb b/app/views/products/all_products.html.erb index ba377ddecd..a5b31067eb 100644 --- a/app/views/products/all_products.html.erb +++ b/app/views/products/all_products.html.erb @@ -1,8 +1,10 @@ -

    See All NotYetsy Products

    + -<% @products.each do |product| %> -
    -

    <%= link_to product.name, merchant_product_path(product.merchant_id, product.id) %>

    -

    <%= image_tag(product.image, size: "200x300", alt: "Photo of #{product.name}.") %>

    -
    -<% end %> +
    + <% @products.each do |product| %> +
    +

    <%= link_to product.name, merchant_product_path(product.merchant_id, product.id) %>

    +

    <%= image_tag(product.image, size: "200x300", alt: "Photo of #{product.name}.") %>

    +
    + <% end %> +
    diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index 792369ab74..c889c90f5f 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -1,11 +1,14 @@ -

    Your NotYetsy Products

    + +
    <% @products.each do |product| %> -
    -

    <%= link_to product.name, merchant_product_path(@merchant.id, product.id) %>

    +
    +

    <%= link_to product.name, merchant_product_path(@merchant.id, product.id) %>

    <%= image_tag(product.image, size: "200x300", alt: "Photo of #{product.name}.") %>

    <% end %> +
    + <% if current_merchant != nil %>

    <%= link_to "Add New Product", new_merchant_product_path(@merchant.id) %>

    diff --git a/config/routes.rb b/config/routes.rb index 8916da9ba3..e561dd22fe 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,6 +1,7 @@ Rails.application.routes.draw do + root to: 'landing#index' - get 'landing/index' + get 'landing/index' => 'landing#index', as: 'index' get "/auth/:provider/callback" => "sessions#create" @@ -10,7 +11,6 @@ # You can have the root of your site routed with "root" # root 'welcome#index' -root to: 'products#all_products' resources :merchants do resources :products do From bea5db6ba759a6dc34f136893c54e98ba6257c72 Mon Sep 17 00:00:00 2001 From: Miriam Cortes Date: Thu, 27 Oct 2016 14:32:42 -0700 Subject: [PATCH 150/191] merchant show page correctly listing orders placed TO them --- app/assets/stylesheets/merchants.scss | 3 +++ app/views/merchants/show.html.erb | 14 +++++++------- seeds_csvs/orders.csv | 2 +- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/app/assets/stylesheets/merchants.scss b/app/assets/stylesheets/merchants.scss index 2327c00afe..51c22b805b 100644 --- a/app/assets/stylesheets/merchants.scss +++ b/app/assets/stylesheets/merchants.scss @@ -1,3 +1,6 @@ // Place all the styles related to the merchants controller here. // They will automatically be included in application.css. // You can use Sass (SCSS) here: http://sass-lang.com/ +body { + margin: 10%; +} diff --git a/app/views/merchants/show.html.erb b/app/views/merchants/show.html.erb index 903d1b3d93..4e318209e7 100644 --- a/app/views/merchants/show.html.erb +++ b/app/views/merchants/show.html.erb @@ -13,14 +13,14 @@ Order Status - <% @merchant.orders.each do |order| %> - - <%= link_to(order.id, orders_path(order.id)) %> - <% order.products.each do |product| %> - <%= link_to(product.name, merchant_product_path(@merchant.id, product.id)) %> + <% @merchant.placed_orders.each do |order| %> + <% order.products.each do |product| %> + + <%= link_to(order.id, orders_path(order.id)) %> + <%= link_to(product.name, merchant_product_path(@merchant.id, product.id)) %> + <%#= product.status %> + <% end %> - <%#= order.status %> - <% end %> diff --git a/seeds_csvs/orders.csv b/seeds_csvs/orders.csv index fd4d358277..c5590de625 100644 --- a/seeds_csvs/orders.csv +++ b/seeds_csvs/orders.csv @@ -7,4 +7,4 @@ 7,Nicole Adams,600,9,diners-club-enroute,201516174929028,06/16,213,12345,5 Dixon Parkway,Charleston,West Virginia,12345,pending 8,Amanda West,500,4,visa,4041595386325825,11/15,213,12345,2 Menomonie Terrace,Dallas,Texas,12345,paid 9,Douglas Sanchez,500,2,mastercard,5100176740926148,12/15,212,12345,96916 Loomis Crossing,Florence,South Carolina,12345,pending -10,James Mendoza,100,7,jcb,3528298798434178,9/16,211,12345,0662 Duke Court,El Paso,Texas,12345.paid +10,James Mendoza,100,7,jcb,3528298798434178,9/16,211,12345,0662 Duke Court,El Paso,Texas,12345,paid From 01f84396d1e55d260717ef8c8f4a8e1441de69a0 Mon Sep 17 00:00:00 2001 From: Miriam Cortes Date: Thu, 27 Oct 2016 14:44:05 -0700 Subject: [PATCH 151/191] used number_to_currency for merchant revenues and fix cart amounts to properly take in pennies prices --- app/models/merchant.rb | 20 ++++++++++---------- app/views/merchants/show.html.erb | 13 ++++++------- app/views/orders/show.html.erb | 6 +++--- 3 files changed, 19 insertions(+), 20 deletions(-) diff --git a/app/models/merchant.rb b/app/models/merchant.rb index fc42ef0d05..32c4d5c587 100644 --- a/app/models/merchant.rb +++ b/app/models/merchant.rb @@ -22,7 +22,7 @@ def self.build_from_github(auth_hash) def revenue_paid_orders revenue_total = 0.0 - orders.each do |order| + placed_orders.each do |order| if order.order_status == "paid" revenue_total += order.total_amount end @@ -32,7 +32,7 @@ def revenue_paid_orders def revenue_pending_orders revenue_total = 0.0 - orders.each do |order| + placed_orders.each do |order| if order.order_status == "pending" revenue_total += order.total_amount end @@ -42,7 +42,7 @@ def revenue_pending_orders def revenue_cancelled_orders revenue_total = 0.0 - orders.each do |order| + placed_orders.each do |order| if order.order_status == "cancelled" revenue_total += order.total_amount end @@ -52,7 +52,7 @@ def revenue_cancelled_orders def revenue_completed_orders revenue_total = 0.0 - orders.each do |order| + placed_orders.each do |order| if order.order_status == "completed" revenue_total += order.total_amount end @@ -62,7 +62,7 @@ def revenue_completed_orders def total_revenue revenue_total = 0.0 - orders.each do |order| + placed_orders.each do |order| if order.order_status == "cancelled" else revenue_total += order.total_amount @@ -73,7 +73,7 @@ def total_revenue def pending_orders pending = 0 - orders.each do |order| + placed_orders.each do |order| if order.order_status == "pending" pending += 1 end @@ -83,7 +83,7 @@ def pending_orders def cancelled_orders cancelled = 0 - orders.each do |order| + placed_orders.each do |order| if order.order_status == "cancelled" cancelled += 1 end @@ -93,7 +93,7 @@ def cancelled_orders def paid_orders paid = 0 - orders.each do |order| + placed_orders.each do |order| if order.order_status == "paid" paid += 1 end @@ -103,7 +103,7 @@ def paid_orders def completed_orders completed = 0 - orders.each do |order| + placed_orders.each do |order| if order.order_status == "completed" completed += 1 end @@ -113,7 +113,7 @@ def completed_orders def total_orders total = 0 - orders.each do |order| + placed_orders.each do |order| if order.order_status == "cancelled" else total += 1 diff --git a/app/views/merchants/show.html.erb b/app/views/merchants/show.html.erb index 4e318209e7..75d9c6e766 100644 --- a/app/views/merchants/show.html.erb +++ b/app/views/merchants/show.html.erb @@ -16,7 +16,7 @@ <% @merchant.placed_orders.each do |order| %> <% order.products.each do |product| %> - <%= link_to(order.id, orders_path(order.id)) %> + <%= link_to(order.id, order_path(order.id)) %> <%= link_to(product.name, merchant_product_path(@merchant.id, product.id)) %> <%#= product.status %> @@ -31,16 +31,15 @@

    Revenue

    Total Revenue for Pending Orders:

    -

    $ - <%= sprintf "%.2f", @merchant.revenue_pending_orders %>

    +

    <%= number_to_currency(@merchant.revenue_pending_orders/100.0) %>

    Total Revenue for Paid Orders:

    -

    $ <%= sprintf "%.2f", @merchant.revenue_paid_orders %>

    +

    <%= number_to_currency(@merchant.revenue_paid_orders/100.0) %>

    Total Revenue for Cancelled Orders:

    -

    $ <%= sprintf "%.2f", @merchant.revenue_cancelled_orders %>

    +

    <%= number_to_currency(@merchant.revenue_cancelled_orders/100.0) %>

    Total Revenue for Completed Orders:

    -

    $ <%= sprintf "%.2f", @merchant.revenue_completed_orders %>

    +

    <%= number_to_currency(@merchant.revenue_completed_orders/100.0) %>

    Total Net Revenue:

    -

    $ <%= sprintf "%.2f", @merchant.total_revenue %>

    +

    <%= number_to_currency(@merchant.total_revenue/100.0) %>

    Orders

    diff --git a/app/views/orders/show.html.erb b/app/views/orders/show.html.erb index 6892c6dd31..ca8a269104 100644 --- a/app/views/orders/show.html.erb +++ b/app/views/orders/show.html.erb @@ -20,14 +20,14 @@ <%= image_tag(item.product.image, class: "cart-thumbnail") %> <%= link_to "#{item.product.name}", merchant_product_path(merchant_id: item.product.merchant_id, id: item.product.id) %> - <%= number_to_currency(item.product.price) %> + <%= number_to_currency(item.product.price/100.0) %> <%= form_tag order_update_qty_path(current_cart.id), method: :post do %> <%= number_field_tag :qty, item.qty.to_i, class: "form_control", min: 1 %> <%= hidden_field_tag :line_item_id, item.id %> <%= submit_tag "Update Quantity", class: "btn btn-default" %> - <%= number_to_currency(item.subtotal) %> + <%= number_to_currency(item.subtotal/100.0) %> <%end%> <%= button_to 'Remove from Cart', {action: "destroy", id: item.id}, method: :delete, data: {confirm: "Are you sure?"} %> @@ -39,6 +39,6 @@ Order Total - <%= number_to_currency(current_cart.total_amount) %> + <%= number_to_currency(current_cart.total_amount/100.0) %> <% end %> From ac499eef3048b9443a95cfe25a03feb3bcb00c94 Mon Sep 17 00:00:00 2001 From: Miriam Cortes Date: Thu, 27 Oct 2016 14:49:02 -0700 Subject: [PATCH 152/191] order status showing --- app/assets/stylesheets/merchants.scss | 4 ++-- app/views/merchants/show.html.erb | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/assets/stylesheets/merchants.scss b/app/assets/stylesheets/merchants.scss index 51c22b805b..0507f66227 100644 --- a/app/assets/stylesheets/merchants.scss +++ b/app/assets/stylesheets/merchants.scss @@ -1,6 +1,6 @@ // Place all the styles related to the merchants controller here. // They will automatically be included in application.css. // You can use Sass (SCSS) here: http://sass-lang.com/ -body { - margin: 10%; +h1 { + color: red; } diff --git a/app/views/merchants/show.html.erb b/app/views/merchants/show.html.erb index 75d9c6e766..6f284210ae 100644 --- a/app/views/merchants/show.html.erb +++ b/app/views/merchants/show.html.erb @@ -18,7 +18,7 @@ <%= link_to(order.id, order_path(order.id)) %> <%= link_to(product.name, merchant_product_path(@merchant.id, product.id)) %> - <%#= product.status %> + <%= order.order_status %> <% end %> <% end %> @@ -41,6 +41,7 @@

    Total Net Revenue:

    <%= number_to_currency(@merchant.total_revenue/100.0) %>

    +

    Orders

    Total Pending Orders:

    From 20021e9dc1d565ce2189e0ec71409d781b845689 Mon Sep 17 00:00:00 2001 From: Miriam Cortes Date: Thu, 27 Oct 2016 14:50:25 -0700 Subject: [PATCH 153/191] removed link on order number bc it was routing to a cart --- app/views/merchants/show.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/merchants/show.html.erb b/app/views/merchants/show.html.erb index 6f284210ae..7febce9a95 100644 --- a/app/views/merchants/show.html.erb +++ b/app/views/merchants/show.html.erb @@ -16,7 +16,7 @@ <% @merchant.placed_orders.each do |order| %> <% order.products.each do |product| %> - <%= link_to(order.id, order_path(order.id)) %> + <%= order.id %> <%= link_to(product.name, merchant_product_path(@merchant.id, product.id)) %> <%= order.order_status %> From bbbdff70dd9fa57e2067f1c9215e7e0412d4c593 Mon Sep 17 00:00:00 2001 From: Sabrina Wilbert Date: Thu, 27 Oct 2016 16:21:49 -0700 Subject: [PATCH 154/191] Added checkout page. --- app/controllers/orders_controller.rb | 20 ++++++++++++--- app/views/orders/checkout.html.erb | 38 ++++++++++++++++++++++++++++ app/views/orders/show.html.erb | 4 +-- app/views/orders/view_cart.html.erb | 18 ------------- config/routes.rb | 1 + 5 files changed, 58 insertions(+), 23 deletions(-) create mode 100644 app/views/orders/checkout.html.erb delete mode 100644 app/views/orders/view_cart.html.erb diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 7914e0c8df..6a66eb5193 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -25,8 +25,19 @@ def edit end def update - - end + cart = current_cart + cart.card_name = params[:card_name] + cart.card_exp = params[:card_exp] + cart.shipping_street = params[:shipping_street] + cart.shipping_city = params[:shipping_city] + cart.shipping_state = params[:shipping_state] + cart.card_number = params[:card_number] + cart.card_cvv = params[:card_cvv] + cart.billing_zip = params[:billing_zip] + cart.shipping_zip = params[:shipping_zip] + cart.order_status == "Complete" + cart.save + end def destroy @order_items = LineItem.destroy(params[:id]) @@ -61,8 +72,11 @@ def update_qty end + def checkout + + + end - end#end of class diff --git a/app/views/orders/checkout.html.erb b/app/views/orders/checkout.html.erb new file mode 100644 index 0000000000..d22ac0ef91 --- /dev/null +++ b/app/views/orders/checkout.html.erb @@ -0,0 +1,38 @@ + +
    + +
    +
    +

    Total: <%= number_to_currency(current_cart.total_amount) %>

    +

    Shipping Information

    +<%= form_tag order_path(current_cart.id), method: :patch do %> +

    Name

    +<%= text_field_tag :card_name %> +

    Street Address

    +<%= text_field_tag :shipping_street %> +

    City

    +<%= text_field_tag :shipping_city %> +

    State

    +<%= text_field_tag :shipping_state %> + +

    Zip Code

    +<%= text_field_tag :shipping_zip %> + +

    Billing Information

    +

    Card Number

    +<%= text_field_tag :card_number %> +

    Card Expiration Date

    +<%= text_field_tag :card_exp %> +

    Card CVV

    +<%= text_field_tag :card_cvv %> +

    Zip Code

    +<%= text_field_tag :billing_zip %> +<%= submit_tag "Submit Order", class: "btn btn-default" %> +<%end%> +
    +
    +
    diff --git a/app/views/orders/show.html.erb b/app/views/orders/show.html.erb index 6892c6dd31..68591bc144 100644 --- a/app/views/orders/show.html.erb +++ b/app/views/orders/show.html.erb @@ -22,7 +22,7 @@ <%= link_to "#{item.product.name}", merchant_product_path(merchant_id: item.product.merchant_id, id: item.product.id) %> <%= number_to_currency(item.product.price) %> - <%= form_tag order_update_qty_path(current_cart.id), method: :post do %> + <%= form_tag order_update_qty_path(current_cart.id), method: :patch do %> <%= number_field_tag :qty, item.qty.to_i, class: "form_control", min: 1 %> <%= hidden_field_tag :line_item_id, item.id %> <%= submit_tag "Update Quantity", class: "btn btn-default" %> @@ -35,7 +35,7 @@ - + <%= button_to "Checkout", order_checkout_path(current_cart.id), method: :get %> Order Total diff --git a/app/views/orders/view_cart.html.erb b/app/views/orders/view_cart.html.erb deleted file mode 100644 index 99d0b98607..0000000000 --- a/app/views/orders/view_cart.html.erb +++ /dev/null @@ -1,18 +0,0 @@ - -
    -
    -
    -<%= form_tag(controller: "orders", action: "show", method: "get") do |f| %> -

    <%= label_tag :product.name %>

    - <%= text_field_tag :product_id %> -
    - <%= number_field_tag :quantity, order_item.quantity.to_i, class: "form-control", min: 1 %> - <%= hidden_field_tag :product_id, product.id %> -
    - - <%= label_tag :description %> - <%= text_field_tag :description %> - <% end %> -
    -
    -
    diff --git a/config/routes.rb b/config/routes.rb index 0c7efd37d7..10884a5d00 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -23,6 +23,7 @@ #resources :merchants resources :orders do post 'update_qty' + get 'checkout' end get 'sessions/create' From 4d066ffab2e9a2e8e222f07c7f9d830323aa8d28 Mon Sep 17 00:00:00 2001 From: Olivia Date: Thu, 27 Oct 2016 16:22:00 -0700 Subject: [PATCH 155/191] Lots of seeds --- seeds_csvs/category.csv | 20 ++++++++--------- seeds_csvs/product_categories.csv | 37 ++++++++++++++++++++++--------- seeds_csvs/products.csv | 35 ++++++++++++++++++++--------- 3 files changed, 62 insertions(+), 30 deletions(-) diff --git a/seeds_csvs/category.csv b/seeds_csvs/category.csv index 94880a5433..1d365f7266 100644 --- a/seeds_csvs/category.csv +++ b/seeds_csvs/category.csv @@ -1,10 +1,10 @@ -1,discrete -2,Reduced -3,intangible -4,open architecture -5,tertiary -6,interactive -7,holistic -8,open architecture -9,Switchable -10,systemic +1,Rainbows +2,Games and Toys +3,Moustache +4,Disguises +5,Miscellaneous +6,Naps +7,Wearables +8,Decor +9,Animals +10,Beauty diff --git a/seeds_csvs/product_categories.csv b/seeds_csvs/product_categories.csv index 895eb0b3bc..dc86e406c3 100644 --- a/seeds_csvs/product_categories.csv +++ b/seeds_csvs/product_categories.csv @@ -1,10 +1,27 @@ -1,8,2 -2,7,5 -3,10,3 -4,3,5 -5,1,6 -6,1,7 -7,2,5 -8,2,4 -9,1,9 -10,7,9 +Category/Product +1,10,1 +2,2,2 +3,7,3 +4,9,3 +5,2,4 +6,5,5 +7,9,5 +8,8,5 +9,10,6 +10,7,6 +11,4,6 +12,5,7 +13,8,7 +14,3,8 +15,4,8 +16,5,8 +17,7,8 +18,10,8 +19,9,9 +20,8,9 +21,5,10 +22,9,11 +23,7,11 +24,5,11 +25,4,11 +26,2,11 diff --git a/seeds_csvs/products.csv b/seeds_csvs/products.csv index e5a47e8502..a669caa758 100644 --- a/seeds_csvs/products.csv +++ b/seeds_csvs/products.csv @@ -1,10 +1,25 @@ -1,product 1,description 1,37.04,http://placekitten.com/g/200/300,10,9 -2,product 2,description 2,88.38,http://placekitten.com/g/200/300,13,3 -3,product 3,description 3,11.71,http://placekitten.com/g/200/300,5,10 -4,product 4,description 4,73.05,http://placekitten.com/g/200/300,7,1 -5,product 5,description 5,48.57,http://placekitten.com/g/200/300,3,1 -6,product 6,description words,7.39,http://placekitten.com/g/200/300,2,9 -7,product 7,description words,1.9,http://placekitten.com/g/200/300,15,8 -8,product 8,description words,16.89,http://placekitten.com/g/200/300,43,4 -9,product 9,description words,59.13,http://placekitten.com/g/200/300,9,9 -10,product 10,description words,46.05,http://placekitten.com/g/200/300,10,9 +1,Bath Bomb,"Literally a bomb for your bath. Desperate times call for desperate measures. The best way to get out of doing your work is to cause an 'accidental' small explosion at your house. Pro Tip: A bath bomb is also a great way to avoid cleaning your shower.",37.04,bath_bomb.jpg,10,9 +2,Cards Against Humanity,"Cards Against Humanity is a party game for horrible people. Unlike most of the party games you've played before, Cards Against Humanity is as despicable and awkward as you and your friends.",88.38,card_humanity.jpg,13,3 +3,Cat Watch,"As you suspected, this watch doesn't actually tell time. A stylish procrastinator like you needs a sleek and clever looking feline to adorn your wrist, but not actually tell you how much time you've wasted. It's also a great conversation starter if you're trying to charm a hipster. #winning",11.71,cat_watch.jpg,5,10 +4,Drunk Stoned or Stupid,"DRUNK STONED OR STUPID is a party game for you and your stupid friends. Each round a card is drawn and the group decides who in the group would be most likely to do really stupid things.",73.05,drunk_stoned_or_stupid.jpg,7,1 +5,Porcelain Baby Elephant Drinking Wine,"You asked and we delivered. Yes, this porcelain baby elephant is LITERALLY drinking wine. You'll find yourself mesmerized by it's cuteness.",48.57,elephant_wine.jpg,3,1 +6,Eyelash Goggles,"Go scuba diving with style. These sassy lashy goggles take waterproof falsies to a whole new level. Where them while you're swimming for a wet and sexy look, or where them when you're not swimming to attract unwanted attention.",7.39,eyelash_goggles.jpg,2,9 +7,Singing Cardboard Face,"Always wanted a cardboard face? We know. And guess what? This one sings! Our Intelligent Bionic Cardboard Technology will have you guessing whether this is really a piece of art made from recycled boxes or a real human face while it serenades you with 90's boyband songs.",1.9,face.jpg,15,8 +8,Fingerstache,"Charm your lover with these sexy fingerstaches. This pack of far too many temporary tattoos will keep you talking in bad accents all night long.",16.89,finger_stash.jpg,43,4 +9,Flamingo Lights,"Have your friends screaming 'this pad is lit!' every time they visit with this set of LED flamingo lights. Pro Tip: Cool your Yule and avian your Advent by using these feisty flamingo lights on your Christmas Tree.",59.13,flamingo_lights.jpg,9,9 +10,Universe Lollipops,"How many licks does it take to get to the center of the Universe? Help humankind find these answer to this and other rhetorical questions by taking a lick at these yummy universe pops.",46.05,galaxy_lollipops.jpg,10,9 +11,Gorgeous Giraffe Mask,"Gee! Golly! A Giraffe! Spend hours frolicking through your local urban jungle wearing this gorgeous giraffe mask. ",10.05,giraffe.jpg,10,9 +12,Rainbow Hammock,"Find your pot of gold at the end of your rainbow hammock nap. Don't worry, this hammock doesn't only come out when the sun is shining through the rain.",15.75,hamock.jpg,10,9 +13,Hey Girl Tea,"You'll want to take a sick day every day with this tantalizing tea infused with Mucinex and honey. ",13.34,hey_girl.jpg,10,9 +14,Horse of the Household,"Tired of being Head of the Household? Hand of your responsibilities to this Horse of the Household. She'll lead you and your roommates on the path toward en'light'enment.",100.99,horse_lamp.jpg,10,9 +15,Little Wiener Man,"Waste away your day fiddling with this limited edition Little Wiener Man. Collect this and the other Tiny Meat Men: Frank Furt, Brad Wurst, and Kevin Bacon",16.43,hotdog_lego.jpg,10,9 +16,Rainbow Knives,"Look like you're doing something productive while you're actually doing nothing at all. These nifty knives are so dull that they'll cut nothing at all. You'll look like you're always chopping vegetables, but with these, we promise it will never get done.",21.67,knives.jpg,10,9 +17,Squid Mask,"Haters gonna hate, and you'll make them hate you even more when you wear this knit squid mask. Made with 100% alpaca wool. Hand crafted.",19.62,mask.jpg,10,9 +18,Creepy Mermaid Lego,"We just know you'll want to play with this miserable mermaid just as much as we do. She's made of plastic, it's fantastic.",6.54,mermaid_lego.jpg,10,9 +19,Moustache Clips,"Stache away your favorite passages with these Moustache Clip Page Markers. They come in a variety of lifelike shapes and colors to help you stay organized. These wiry staches are both magnetic and lady magnets.",8.94,mustache_clips.jpg,10,9 +20,Moustache Outlet Covers,"You've always thought the holes in your outlet looked like face. Well, why not make that boring outlet face look like your dad's face? These classy mustache stickers will have you and your friends gawking at the resemblance.",4.58,outlet_stash.jpg,10,9 +21,Tiny Plungers,"These tiny plungers can tackle the tiniest of clogs in the tiniest of toilets. Some assembly required.",12.43,party_plungers.jpg,10,9 +22,Ultimate Procrastinator's Pen Set,"Take forever deciding which color pen you want to use. With more than ten shades of blue to chose from you'll never decide on the perfect one.",21.31,pens.jpg,10,9 +23,Frappe Fake Phone Case,"This fancy Frappe Fake Phone Case doesn't fit a single phone in existence. Really. Not one. Just try making your phone fit. We dare you.",6.54,phone_case.jpg,10,9 +24,Pegg,"Meet Pegg. She's a pig who pukes eggs. Well, egg yolks to be specific. She's the cutest but least efficient way you'll ever find to separate the egg yolks from the whites.",18.24,pig_egg.jpg,10,9 +25,Pizza Floatation Device,"Ever wish you could hit the water on your favorite wedge of pizza. This is your chance. Drowning Warning: Wait twenty minutes after using Pizza Flotation Device before swimming.",27.77,pizza_raft.jpg,10,9 From 14659b56e30c257b27c25ebb8de5b58973b4ab37 Mon Sep 17 00:00:00 2001 From: Sabrina Wilbert Date: Thu, 27 Oct 2016 16:24:20 -0700 Subject: [PATCH 156/191] Updated update page to say order complete. --- app/views/orders/update.html.erb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/views/orders/update.html.erb b/app/views/orders/update.html.erb index 21caac1f70..1eb756bef4 100644 --- a/app/views/orders/update.html.erb +++ b/app/views/orders/update.html.erb @@ -1,2 +1 @@ -

    Orders#update

    -

    Find me in app/views/orders/update.html.erb

    +

    Your Order has been submitted

    From e1215c6606a4fd4e6719efd78f05267c67fca65c Mon Sep 17 00:00:00 2001 From: Miriam Cortes Date: Thu, 27 Oct 2016 16:25:44 -0700 Subject: [PATCH 157/191] more styles --- app/assets/stylesheets/application.scss | 33 ++++++++++++++- app/assets/stylesheets/merchants.scss | 3 -- app/views/merchants/show.html.erb | 55 +++++++++++++------------ 3 files changed, 61 insertions(+), 30 deletions(-) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index e897a70298..4701198e46 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -1,4 +1,4 @@ -@import url('foundation.css') +@import url('foundation.css'); // /* // * This is a manifest file that'll be compiled into application.css, which will include all the files // * listed below. @@ -16,3 +16,34 @@ //= require foundation_and_overrides // *= require foundation_and_overrides + h1{font-size: 2em;} + h2 {font-size: 1.5em;} + +ul li { + display: inline-block; + // width: 30%; + margin-left: auto; + margin-right: auto; + +} +ul.row { + width: 80%; + +} +// .merchant_buttons { +// margin-left: auto; +// margin-right: auto; +// align-items: center; +// display: flex; +// } + +table { + margin-left: auto; + margin-right: auto; + width: 80%; +} + +.give_me_a_margin { + border: 1px solid black; +} +body {margin: 1%;} diff --git a/app/assets/stylesheets/merchants.scss b/app/assets/stylesheets/merchants.scss index 0507f66227..2327c00afe 100644 --- a/app/assets/stylesheets/merchants.scss +++ b/app/assets/stylesheets/merchants.scss @@ -1,6 +1,3 @@ // Place all the styles related to the merchants controller here. // They will automatically be included in application.css. // You can use Sass (SCSS) here: http://sass-lang.com/ -h1 { - color: red; -} diff --git a/app/views/merchants/show.html.erb b/app/views/merchants/show.html.erb index 7febce9a95..bb2e094816 100644 --- a/app/views/merchants/show.html.erb +++ b/app/views/merchants/show.html.erb @@ -1,8 +1,11 @@ -
      -
    • <%= button_to 'Add a Product', new_merchant_product_path(@merchant.id, params[:product_id]), class: "button", method: :get %>
    • -
    • <%= button_to 'View Products', merchant_products_path(@merchant.id), class: "button", method: :get %>
    • -
    • <%= button_to 'Add a Category', new_category_path(params[:id]), class: "button", method: :get %>
    • -
    +
    +
      +
    • <%= button_to 'Add a Product', new_merchant_product_path(@merchant.id, params[:product_id]), class: "button", method: :get %>
    • +
    • <%= button_to 'View Products', merchant_products_path(@merchant.id), class: "button", method: :get %>
    • +
    • <%= button_to 'Add a Category', new_category_path(params[:id]), class: "button", method: :get %>
    • +
    • +
    +
    @@ -26,33 +29,33 @@
    - -

    Summary

    -
    -

    Revenue

    -

    Total Revenue for Pending Orders:

    -

    <%= number_to_currency(@merchant.revenue_pending_orders/100.0) %>

    -

    Total Revenue for Paid Orders:

    -

    <%= number_to_currency(@merchant.revenue_paid_orders/100.0) %>

    -

    Total Revenue for Cancelled Orders:

    -

    <%= number_to_currency(@merchant.revenue_cancelled_orders/100.0) %>

    -

    Total Revenue for Completed Orders:

    -

    <%= number_to_currency(@merchant.revenue_completed_orders/100.0) %>

    -

    Total Net Revenue:

    -

    <%= number_to_currency(@merchant.total_revenue/100.0) %>

    + +

    Summary

    +
    +

    Revenue

    +

    Total Revenue for Pending Orders:

    +

    <%= number_to_currency(@merchant.revenue_pending_orders/100.0) %>

    +

    Total Revenue for Paid Orders:

    +

    <%= number_to_currency(@merchant.revenue_paid_orders/100.0) %>

    +

    Total Revenue for Cancelled Orders:

    +

    <%= number_to_currency(@merchant.revenue_cancelled_orders/100.0) %>

    +

    Total Revenue for Completed Orders:

    +

    <%= number_to_currency(@merchant.revenue_completed_orders/100.0) %>

    +

    Total Net Revenue:

    +

    <%= number_to_currency(@merchant.total_revenue/100.0) %>

    -
    -

    Orders

    -

    Total Pending Orders:

    +
    +

    Orders

    +

    Total Pending Orders:

    <%= @merchant.pending_orders %>

    -

    Total Cancelled Orders:

    +

    Total Cancelled Orders:

    <%= @merchant.cancelled_orders %>

    -

    Total Paid Orders:

    +

    Total Paid Orders:

    <%= @merchant.paid_orders %>

    -

    Total Completed Orders:

    +

    Total Completed Orders:

    <%= @merchant.completed_orders %>

    -

    Total Orders:

    +

    Total Orders:

    <%= @merchant.total_orders %>

    From c89365c324e8eaa4b9a3103c4cd750eac967905d Mon Sep 17 00:00:00 2001 From: Nina Mutty Date: Thu, 27 Oct 2016 16:26:26 -0700 Subject: [PATCH 158/191] header styling...not done yet --- ...NoProductImage .png => NoProductImage.png} | Bin app/assets/stylesheets/application.scss | 108 +++++++++++++++++- app/assets/stylesheets/foundation.css | 8 +- app/controllers/application_controller.rb | 2 +- app/views/categories/index.html.erb | 10 +- app/views/categories/show.html.erb | 8 +- app/views/layouts/application.html.erb | 87 ++++++++------ app/views/products/all_products.html.erb | 10 +- app/views/products/index.html.erb | 10 +- 9 files changed, 186 insertions(+), 57 deletions(-) rename app/assets/images/{NoProductImage .png => NoProductImage.png} (100%) diff --git a/app/assets/images/NoProductImage .png b/app/assets/images/NoProductImage.png similarity index 100% rename from app/assets/images/NoProductImage .png rename to app/assets/images/NoProductImage.png diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index e897a70298..8bd0a45378 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -1,4 +1,4 @@ -@import url('foundation.css') + @import url('foundation.css'); // /* // * This is a manifest file that'll be compiled into application.css, which will include all the files // * listed below. @@ -15,4 +15,108 @@ // *= require_self //= require foundation_and_overrides - // *= require foundation_and_overrides +// *= require foundation_and_overrides + +header { + width: 100%; + border-bottom: 1px solid black; +} + + +// nav { +// margin-top: 5%; +// text-align: center; +// } +// +// nav ul.nav-list li { +// display: inline-block; +// margin: 1% 2%; +// font-size: 1.2rem; +// } + +.top-bar { + border-bottom: 1px solid black; + border-top: 1px solid black; + background-color: white; +} + +.categories-explaination { + padding: 0.7rem 1rem; + margin: 0; +} + + +.top-bar-left { + width: 80%; + margin-left: 9%; + background-color: white; +} + +.top-bar-left .dropdown { + background-color: white; +} + +@media only screen { + div.top-header { + text-align: center; + } + + img.not-yetsy-main-logo { + // width: 60%; + // margin: 0 20%; + display: none; + } + + nav { + margin-top: 0%; + text-align: center; + } + + nav ul.nav-list li { + display: inline-block; + margin: 1% 2%; + font-size: 1rem; + } + + h1.mobile-header { + display: block; + font-size: .7rem; + letter-spacing: 2px; + } + + h1.mobile-header span { + font-family: 'Kaushan Script', cursive; + font-size: 2.1rem; + } + + div.top-bar { + display: none; + } +} + + +@media only screen and (min-width: 40.063em) { + img.not-yetsy-main-logo { + width: 25%; + display: inline-block; + } + + nav { + margin-top: 5%; + text-align: center; + } + + nav ul.nav-list li { + display: inline-block; + margin: 1% 2%; + font-size: 1.2rem; + } + + h1.mobile-header { + display: none; + } + + div.top-bar { + display: block; + } +} diff --git a/app/assets/stylesheets/foundation.css b/app/assets/stylesheets/foundation.css index 66aca962de..14a0d5a9f6 100644 --- a/app/assets/stylesheets/foundation.css +++ b/app/assets/stylesheets/foundation.css @@ -12,7 +12,7 @@ * without disabling user zoom. */ html { - font-family: sans-serif; + font-family:'Open Sans Condensed', 'Raleway', sans-serif; /* 1 */ -ms-text-size-adjust: 100%; /* 2 */ @@ -376,7 +376,8 @@ html { body { padding: 0; margin: 0; - font-family: "Helvetica Neue", Helvetica, Roboto, Arial, sans-serif; + font-family: 'Raleway', Helvetica, Roboto, Arial, sans-serif; + letter-spacing: 1px; font-weight: normal; line-height: 1.5; color: #0a0a0a; @@ -1211,7 +1212,8 @@ h3, h4, h5, h6 { - font-family: "Helvetica Neue", Helvetica, Roboto, Arial, sans-serif; + font-family: "Raleway", Helvetica, Roboto, Arial, sans-serif; + letter-spacing: 2px; font-weight: normal; font-style: normal; color: inherit; diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index e7c03f7e85..201d31482c 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -3,7 +3,7 @@ class ApplicationController < ActionController::Base # For APIs, you may want to use :null_session instead. protect_from_forgery with: :exception - before_action do define_category_variables(2) end + before_action do define_category_variables(8) end helper_method :current_merchant, :current_guest, :current_cart def current_merchant diff --git a/app/views/categories/index.html.erb b/app/views/categories/index.html.erb index bec6760e51..740e9bb417 100644 --- a/app/views/categories/index.html.erb +++ b/app/views/categories/index.html.erb @@ -2,11 +2,13 @@ -
    +
    <% @category.each do |category| %> -
    -

    <%= link_to(category.name, category_path(category.id)) %>

    -

    <%= image_tag((category.products.first == nil ? "NoProductImage.png" : "#{category.products.first.image}"), size: "200x300", alt: "Link of #{category.name}.") %>

    +
    "> +
    +

    <%= link_to(category.name, category_path(category.id)) %>

    +

    <%= image_tag((category.products.first == nil ? "NoProductImage.png" : "#{category.products.first.image}"), size: "200x300", alt: "Link of #{category.name}.") %>

    +
    <% end %>
    diff --git a/app/views/categories/show.html.erb b/app/views/categories/show.html.erb index e3de930d20..6b1cd69bdb 100644 --- a/app/views/categories/show.html.erb +++ b/app/views/categories/show.html.erb @@ -1,10 +1,12 @@ -
    +
    <% @products_in_category.each do |p| %>
    -

    <%= p.name %>

    -

    <%= link_to image_tag(p.image), merchant_product_path(p.merchant_id,p.id) %>

    +
    +

    <%= p.name %>

    +

    <%= link_to image_tag(p.image), merchant_product_path(p.merchant_id,p.id) %>

    +
    <% end %> diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index baee1db4d3..861d4d1e98 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -5,7 +5,7 @@ <%= content_for?(:title) ? yield(:title) : "Not Yetsy" %> - + <%= stylesheet_link_tag "application" %> <%= javascript_include_tag "application", 'data-turbolinks-track' => true %> <%= csrf_meta_tags %> @@ -13,38 +13,58 @@
    - <%= link_to("Home", index_path, method: :get) %> - <% if current_merchant != nil %> - <%= link_to("Log out", sessions_destroy_path, method: :delete) %> - <%= link_to("My account", merchant_path(current_merchant.id), method: :get) %> - <% else %> -
      -
    • <%= link_to("log in via Github", "/auth/github") %>
    • -
    - <% end %> - <% if current_cart != nil %> + +
    +

    Not Yetsy The Procrastinators Paradise

    + <%= image_tag("NotYetsyLogo.png", alt: "Not Yetsy Logo", class: "not-yetsy-main-logo columns small-12 medium-5 large-3") %> + + +
    - <% if flash[:notice] %> -

    <%= flash[:notice] %>

    - <% end %> -
    -
    - + <% if flash[:notice] %> +

    <%= flash[:notice] %>

    + <% end %>
    -

    <%= greeting %>

    +

    <%= greeting %>

    <%= yield %> diff --git a/app/views/products/all_products.html.erb b/app/views/products/all_products.html.erb index a5b31067eb..9148923df2 100644 --- a/app/views/products/all_products.html.erb +++ b/app/views/products/all_products.html.erb @@ -1,10 +1,12 @@ -
    +
    <% @products.each do |product| %> -
    -

    <%= link_to product.name, merchant_product_path(product.merchant_id, product.id) %>

    -

    <%= image_tag(product.image, size: "200x300", alt: "Photo of #{product.name}.") %>

    +
    "> +
    +

    <%= link_to product.name, merchant_product_path(product.merchant_id, product.id) %>

    +

    <%= image_tag(product.image, size: "200x300", alt: "Photo of #{product.name}.") %>

    +
    <% end %>
    diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index c889c90f5f..e071697492 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -1,10 +1,12 @@ -
    +
    <% @products.each do |product| %> -
    -

    <%= link_to product.name, merchant_product_path(@merchant.id, product.id) %>

    -

    <%= image_tag(product.image, size: "200x300", alt: "Photo of #{product.name}.") %>

    +
    "> +
    +

    <%= link_to product.name, merchant_product_path(@merchant.id, product.id) %>

    +

    <%= image_tag(product.image, size: "200x300", alt: "Photo of #{product.name}.") %>

    +
    <% end %>
    From 4353faa797f3ad82e340ed393cdaea81b660a74b Mon Sep 17 00:00:00 2001 From: Nina Mutty Date: Thu, 27 Oct 2016 16:28:03 -0700 Subject: [PATCH 159/191] deleted headers --- seeds_csvs/product_categories.csv | 1 - 1 file changed, 1 deletion(-) diff --git a/seeds_csvs/product_categories.csv b/seeds_csvs/product_categories.csv index dc86e406c3..1ab69c2222 100644 --- a/seeds_csvs/product_categories.csv +++ b/seeds_csvs/product_categories.csv @@ -1,4 +1,3 @@ -Category/Product 1,10,1 2,2,2 3,7,3 From 0029242968b9149514fbef266a5a06bae93a30c5 Mon Sep 17 00:00:00 2001 From: Olivia Date: Thu, 27 Oct 2016 16:28:04 -0700 Subject: [PATCH 160/191] removed header --- seeds_csvs/product_categories.csv | 1 - 1 file changed, 1 deletion(-) diff --git a/seeds_csvs/product_categories.csv b/seeds_csvs/product_categories.csv index dc86e406c3..1ab69c2222 100644 --- a/seeds_csvs/product_categories.csv +++ b/seeds_csvs/product_categories.csv @@ -1,4 +1,3 @@ -Category/Product 1,10,1 2,2,2 3,7,3 From ed23002a7723e9ee9d00819a81782fd7212b9d16 Mon Sep 17 00:00:00 2001 From: Miriam Cortes Date: Thu, 27 Oct 2016 16:28:10 -0700 Subject: [PATCH 161/191] deleted first line of Olivia's csv --- seeds_csvs/product_categories.csv | 1 - 1 file changed, 1 deletion(-) diff --git a/seeds_csvs/product_categories.csv b/seeds_csvs/product_categories.csv index dc86e406c3..1ab69c2222 100644 --- a/seeds_csvs/product_categories.csv +++ b/seeds_csvs/product_categories.csv @@ -1,4 +1,3 @@ -Category/Product 1,10,1 2,2,2 3,7,3 From 29b51b77073a7b6f56ee69bdb652ed82948dcc2e Mon Sep 17 00:00:00 2001 From: Miriam Date: Thu, 27 Oct 2016 16:34:29 -0700 Subject: [PATCH 162/191] Update orders_controller.rb --- app/controllers/orders_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 6a66eb5193..313078f1fe 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -35,7 +35,7 @@ def update cart.card_cvv = params[:card_cvv] cart.billing_zip = params[:billing_zip] cart.shipping_zip = params[:shipping_zip] - cart.order_status == "Complete" + cart.order_status = "Complete" cart.save end From 5905a9934a781dd182f2578510bdb85d6390db56 Mon Sep 17 00:00:00 2001 From: Nina Mutty Date: Thu, 27 Oct 2016 16:38:35 -0700 Subject: [PATCH 163/191] edited dropdown - will edit more --- app/views/layouts/application.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 861d4d1e98..3332c981c3 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -23,7 +23,7 @@
  • <%= link_to("Home", index_path, method: :get) %>
  • More Categories From 321b78ddcd6e67ac6d73892267d28a0bbb03b262 Mon Sep 17 00:00:00 2001 From: Miriam Cortes Date: Thu, 27 Oct 2016 16:50:46 -0700 Subject: [PATCH 164/191] pg uncommented for heroku --- Gemfile | 4 ++-- Gemfile.lock | 8 ++++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/Gemfile b/Gemfile index f25c045d4a..0ed3d10f2e 100644 --- a/Gemfile +++ b/Gemfile @@ -8,8 +8,8 @@ gem "omniauth" gem "omniauth-github" gem 'simplecov', group: :test -#gem 'pg', group: :production -#gem 'rails_12factor', group: :production +gem 'pg', group: :production +gem 'rails_12factor', group: :production # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' gem 'rails', '4.2.7' diff --git a/Gemfile.lock b/Gemfile.lock index c6ec61d9ed..f79301bfe3 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -125,6 +125,7 @@ GEM omniauth-oauth2 (1.4.0) oauth2 (~> 1.0) omniauth (~> 1.2) + pg (0.19.0) pry (0.10.4) coderay (~> 1.1.0) method_source (~> 0.8.1) @@ -151,6 +152,11 @@ GEM rails-deprecated_sanitizer (>= 1.0.1) rails-html-sanitizer (1.0.3) loofah (~> 2.0) + rails_12factor (0.0.3) + rails_serve_static_assets + rails_stdout_logging + rails_serve_static_assets (0.0.5) + rails_stdout_logging (0.0.5) railties (4.2.7) actionpack (= 4.2.7) activesupport (= 4.2.7) @@ -222,8 +228,10 @@ DEPENDENCIES minitest-reporters omniauth omniauth-github + pg pry rails (= 4.2.7) + rails_12factor sass-rails (~> 5.0) sdoc (~> 0.4.0) simplecov From 7b748105f493f78579287c456b05419b81000f7c Mon Sep 17 00:00:00 2001 From: Miriam Cortes Date: Thu, 27 Oct 2016 17:07:30 -0700 Subject: [PATCH 165/191] heroku crap --- config/environments/production.rb | 2 +- db/seeds.rb | 34 +++++++++++++++---------------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/config/environments/production.rb b/config/environments/production.rb index 5c1b32e486..10a93ddf6a 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -29,7 +29,7 @@ # config.assets.css_compressor = :sass # Do not fallback to assets pipeline if a precompiled asset is missed. - config.assets.compile = false + config.assets.compile = true # Asset digests allow you to set far-future HTTP expiration dates on all assets, # yet still be able to expire them through the digest params. diff --git a/db/seeds.rb b/db/seeds.rb index ae7c3c33bb..4344d04f9f 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -9,43 +9,43 @@ require 'csv' CSV.foreach('seeds_csvs/category.csv') do |csv_obj| - Category.create(id: csv_obj[0].to_i, name: csv_obj[1]) + Category.create(name: csv_obj[1]) end CSV.foreach('seeds_csvs/guests.csv') do |csv_obj| - Guest.create(id: csv_obj[0].to_i, name: csv_obj[1], email: csv_obj[2]) + Guest.create(name: csv_obj[1], email: csv_obj[2]) end CSV.foreach('seeds_csvs/merchant.csv') do |csv_obj| - Merchant.create(id: csv_obj[0].to_i, name: csv_obj[1], email: csv_obj[2], password: csv_obj[3]) + Merchant.create(name: csv_obj[1], email: csv_obj[2], password: csv_obj[3]) end CSV.foreach('seeds_csvs/orders.csv') do |csv_obj| - Order.create(id: csv_obj[0].to_i, guest_id: csv_obj[1].to_i, total_amount: csv_obj[2].to_f/100, merchant_id: csv_obj[3].to_i, card_name: csv_obj[4], card_number: csv_obj[5], card_exp: csv_obj[6], card_cvv: csv_obj[7], billing_zip: csv_obj[8], shipping_street: csv_obj[9], shipping_city: csv_obj[10], shipping_state: csv_obj[11], shipping_zip: csv_obj[12],order_status: csv_obj[13]) + Order.create(guest_id: csv_obj[1].to_i, total_amount: csv_obj[2].to_f/100, merchant_id: csv_obj[3].to_i, card_name: csv_obj[4], card_number: csv_obj[5], card_exp: csv_obj[6], card_cvv: csv_obj[7], billing_zip: csv_obj[8], shipping_street: csv_obj[9], shipping_city: csv_obj[10], shipping_state: csv_obj[11], shipping_zip: csv_obj[12],order_status: csv_obj[13]) end CSV.foreach('seeds_csvs/product_categories.csv') do |csv_obj| - ProductCategory.create(id: csv_obj[0].to_i, category_id: csv_obj[1].to_i, product_id: csv_obj[2]) + ProductCategory.create(category_id: csv_obj[1].to_i, product_id: csv_obj[2]) end CSV.foreach('seeds_csvs/products_orders.csv') do |csv_obj| - ProductOrder.create(id: csv_obj[0].to_i, product_id: csv_obj[1].to_i, order_id: csv_obj[2].to_i) + ProductOrder.create(product_id: csv_obj[1].to_i, order_id: csv_obj[2].to_i) end CSV.foreach('seeds_csvs/products.csv') do |csv_obj| - Product.create(id: csv_obj[0].to_i, name: csv_obj[1], description: csv_obj[2], price: csv_obj[3].to_i, image: csv_obj[4], inventory: csv_obj[5].to_i, merchant_id: csv_obj[6].to_i ) + Product.create(name: csv_obj[1], description: csv_obj[2], price: csv_obj[3].to_i, image: csv_obj[4], inventory: csv_obj[5].to_i, merchant_id: csv_obj[6].to_i ) end CSV.foreach('seeds_csvs/reviews.csv') do |csv_obj| - Review.create(id: csv_obj[0].to_i, product_id: csv_obj[1].to_i, description: csv_obj[2], author: csv_obj[3], stars: csv_obj[4].to_i) + Review.create(product_id: csv_obj[1].to_i, description: csv_obj[2], author: csv_obj[3], stars: csv_obj[4].to_i) end - -begin - require "pg" - array = [Merchant, Product, ProductOrder, Category, Review, Guest, Order, ProductCategory] - array.each do |model| - ActiveRecord::Base.connection.execute("SELECT setval('#{model.table_name}_id_seq'::regclass,?)", model.count) - end -rescue LoadError -end +# +# begin +# require "pg" +# array = [Merchant, Product, ProductOrder, Category, Review, Guest, Order, ProductCategory] +# array.each do |model| +# ActiveRecord::Base.connection.execute("SELECT setval('#{model.table_name}_id_seq'::regclass,?)", model.count) +# end +# rescue LoadError +# end From 756234086b40085d2641490bb7f78dfaa2a06103 Mon Sep 17 00:00:00 2001 From: Miriam Cortes Date: Thu, 27 Oct 2016 17:22:50 -0700 Subject: [PATCH 166/191] uncommented things in Gemfile for Olivia and Nina --- Gemfile | 4 ++-- Gemfile.lock | 8 -------- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/Gemfile b/Gemfile index 0ed3d10f2e..c70bfd6eb6 100644 --- a/Gemfile +++ b/Gemfile @@ -8,8 +8,8 @@ gem "omniauth" gem "omniauth-github" gem 'simplecov', group: :test -gem 'pg', group: :production -gem 'rails_12factor', group: :production +# gem 'pg', group: :production +# gem 'rails_12factor', group: :production # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' gem 'rails', '4.2.7' diff --git a/Gemfile.lock b/Gemfile.lock index f79301bfe3..c6ec61d9ed 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -125,7 +125,6 @@ GEM omniauth-oauth2 (1.4.0) oauth2 (~> 1.0) omniauth (~> 1.2) - pg (0.19.0) pry (0.10.4) coderay (~> 1.1.0) method_source (~> 0.8.1) @@ -152,11 +151,6 @@ GEM rails-deprecated_sanitizer (>= 1.0.1) rails-html-sanitizer (1.0.3) loofah (~> 2.0) - rails_12factor (0.0.3) - rails_serve_static_assets - rails_stdout_logging - rails_serve_static_assets (0.0.5) - rails_stdout_logging (0.0.5) railties (4.2.7) actionpack (= 4.2.7) activesupport (= 4.2.7) @@ -228,10 +222,8 @@ DEPENDENCIES minitest-reporters omniauth omniauth-github - pg pry rails (= 4.2.7) - rails_12factor sass-rails (~> 5.0) sdoc (~> 0.4.0) simplecov From 33be15481eb283107b555ded80767b2c6eed924b Mon Sep 17 00:00:00 2001 From: Nina Mutty Date: Thu, 27 Oct 2016 17:41:37 -0700 Subject: [PATCH 167/191] landing styling --- app/assets/stylesheets/application.scss | 41 +++++++++++++++++-------- app/assets/stylesheets/landing.scss | 4 +++ app/views/landing/index.html.erb | 10 +++--- app/views/layouts/application.html.erb | 37 ++++++++++++++-------- 4 files changed, 62 insertions(+), 30 deletions(-) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 74e3e74a49..4ffb3d9821 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -20,19 +20,13 @@ header { width: 100%; border-bottom: 1px solid black; + } -// nav { -// margin-top: 5%; -// text-align: center; -// } -// -// nav ul.nav-list li { -// display: inline-block; -// margin: 1% 2%; -// font-size: 1.2rem; -// } +.dropdown { + display: inline-block; +} h1{font-size: 2em;} @@ -76,7 +70,6 @@ body {margin: 1%;} - .top-bar { border-bottom: 1px solid black; border-top: 1px solid black; @@ -99,6 +92,29 @@ body {margin: 1%;} background-color: white; } +.orbit-slide div h3 a { + font-family: 'Kaushan Script', cursive; + color: black; +} + +.orbit-slide div h3 a:hover { + font-weight: 600; +} + +.orbit-slide div { + text-align: center; +} + +.orbit-slide div p.orbit-display { + display: inline-block; + margin: 1% 2%; + text-align: center; +} + + + +// ###### Media Screen Differences ###### + @media only screen { div.top-header { text-align: center; @@ -151,10 +167,11 @@ body {margin: 1%;} nav ul.nav-list li { display: inline-block; - margin: 1% 2%; + margin: 1% 1.2%; font-size: 1.2rem; } + h1.mobile-header { display: none; } diff --git a/app/assets/stylesheets/landing.scss b/app/assets/stylesheets/landing.scss index f33d6f8d4a..d1bea31a98 100644 --- a/app/assets/stylesheets/landing.scss +++ b/app/assets/stylesheets/landing.scss @@ -1,3 +1,7 @@ // Place all the styles related to the landing controller here. // They will automatically be included in application.css. // You can use Sass (SCSS) here: http://sass-lang.com/ + +.orbit-slide div h3 a { + font-family: 'Kaushan Script', cursive; +} diff --git a/app/views/landing/index.html.erb b/app/views/landing/index.html.erb index 16bf954392..d99ec844c5 100644 --- a/app/views/landing/index.html.erb +++ b/app/views/landing/index.html.erb @@ -7,13 +7,11 @@ <% @featured_products.each do |product| %>
  • -

    <%= product.name %>

    -

    <%= image_tag(product.image, size: "200x275", alt: "Photo of #{product.name}") %>

    -

    Price: $<%= '%.2f' % (product.price/100.00) %>

    -

    Inventory: <%= product.inventory %>

    +

    <%= link_to(product.name, merchant_product_path(product.merchant.id, product.id)) %>

    +
    <%= link_to(image_tag(product.image, size: "200x275", alt: "Photo of #{product.name}"), merchant_product_path(product.merchant.id, product.id)) %>
    +

    Price: $<%= '%.2f' % (product.price/100.00) %>

    +

    Inventory: <%= product.inventory %>

    <%= product.rating == nil ? "Not Yet Rated!" : star_string(product.rating) %>

    - -
  • <% end %> diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 3332c981c3..4387de2d74 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -16,28 +16,35 @@

    Not Yetsy The Procrastinators Paradise

    - <%= image_tag("NotYetsyLogo.png", alt: "Not Yetsy Logo", class: "not-yetsy-main-logo columns small-12 medium-5 large-3") %> + <%= image_tag("NotYetsyLogo.png", alt: "Not Yetsy Logo", class: "not-yetsy-main-logo columns small-12 medium-4 large-3") %> -
    -
    + <% if flash[:notice] %> @@ -87,5 +94,11 @@ <%= yield %> +
    +

    + © - Olivia Legge, Miriam Cortes, Nina Mutty, and Sabrina - 2016 +

    +
    + From dfd2363381c7a121f5eea9522b33ee8016bb0ccf Mon Sep 17 00:00:00 2001 From: Miriam Cortes Date: Thu, 27 Oct 2016 21:13:30 -0700 Subject: [PATCH 168/191] styled merchants page --- app/assets/stylesheets/application.scss | 9 ++--- app/models/merchant.rb | 4 +-- app/views/layouts/application.html.erb | 6 ++-- app/views/merchants/show.html.erb | 46 ++++++++++++------------- app/views/orders/checkout.html.erb | 4 +-- 5 files changed, 35 insertions(+), 34 deletions(-) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 74e3e74a49..2eba0cdaa9 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -39,15 +39,15 @@ header { h2 {font-size: 1.5em;} ul li { - display: inline-block; - // width: 30%; + display: block; + text-align: center; margin-left: auto; margin-right: auto; - + // text-align: center; + // position: relative; } ul.row { width: 80%; - } // .merchant_buttons { // margin-left: auto; @@ -60,6 +60,7 @@ table { margin-left: auto; margin-right: auto; width: 80%; + font-size: .9em; } .give_me_a_margin { diff --git a/app/models/merchant.rb b/app/models/merchant.rb index 32c4d5c587..34fbe3a14b 100644 --- a/app/models/merchant.rb +++ b/app/models/merchant.rb @@ -53,7 +53,7 @@ def revenue_cancelled_orders def revenue_completed_orders revenue_total = 0.0 placed_orders.each do |order| - if order.order_status == "completed" + if order.order_status == "Complete" revenue_total += order.total_amount end end @@ -104,7 +104,7 @@ def paid_orders def completed_orders completed = 0 placed_orders.each do |order| - if order.order_status == "completed" + if order.order_status == "Complete" completed += 1 end end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 3332c981c3..eca81139cc 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -62,9 +62,9 @@
    + diff --git a/app/views/orders/show.html.erb b/app/views/orders/show.html.erb index b8868132a4..0cb3bb5af8 100644 --- a/app/views/orders/show.html.erb +++ b/app/views/orders/show.html.erb @@ -22,7 +22,7 @@ <%= link_to "#{item.product.name}", merchant_product_path(merchant_id: item.product.merchant_id, id: item.product.id) %> <%= number_to_currency(item.product.price/100.0) %> - <%= form_tag order_update_qty_path(current_cart.id), method: :patch do %> + <%= form_tag order_update_qty_path(current_cart.id), method: :post do %> <%= number_field_tag :qty, item.qty.to_i, class: "form_control", min: 1 %> <%= hidden_field_tag :line_item_id, item.id %> <%= submit_tag "Update Quantity", class: "btn btn-default button" %> diff --git a/app/views/orders/update.html.erb b/app/views/orders/update.html.erb index 1eb756bef4..d73e0f9e6e 100644 --- a/app/views/orders/update.html.erb +++ b/app/views/orders/update.html.erb @@ -1 +1,2 @@ -

    Your Order has been submitted

    +

    Thank You <%= params[:card_name]%>

    +

    Your Order #<%=params[:id] %> has been submitted

    From afd5b200678aef231fc8c2a2f68dc528e44da8f0 Mon Sep 17 00:00:00 2001 From: Nina Mutty Date: Fri, 28 Oct 2016 12:30:44 -0700 Subject: [PATCH 180/191] STYLING --- app/assets/stylesheets/application.scss | 27 ++++++++++++++++++------ app/views/categories/index.html.erb | 10 +++++---- app/views/categories/show.html.erb | 14 ++++++------ app/views/landing/index.html.erb | 4 ++-- app/views/layouts/application.html.erb | 2 +- app/views/orders/checkout.html.erb | 3 ++- app/views/products/all_products.html.erb | 10 +++++---- app/views/products/index.html.erb | 10 +++++---- seeds_csvs/products.csv | 4 ++-- 9 files changed, 54 insertions(+), 30 deletions(-) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index a979a3d8d6..9777c1cdd1 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -23,12 +23,16 @@ header { } main { - margin-bottom: 5vh; + padding-bottom: 12vh; +} + +div#checkout form { + padding-bottom: 20vh; } .greeting-message { - margin: 2% 0 0 2%; - font-family: 'Kaushan Script', cursive; + margin: 2%; + font-family: 'Unica One', 'Kaushan Script', cursive; letter-spacing: 4px; } @@ -114,7 +118,7 @@ body {margin: 1%;} } .orbit-slide div h3 a { - font-family: 'Kaushan Script', cursive; + font-family: 'Unica One', 'Kaushan Script', cursive; color: black; } @@ -137,7 +141,7 @@ body {margin: 1%;} } .product-name a { - font-family: 'Kaushan Script', cursive; + font-family: 'Unica One', 'Kaushan Script', cursive; color: black; font-size: 1.8rem; letter-spacing: 2px; @@ -215,6 +219,17 @@ p.product-description-paragraph { } +div.product-name-div { + height: 15vh; +} + +.product-photo { + max-height: 250px; +} + +.product-grid { + margin-top: 3%; +} // ###### Media Screen Differences ###### @@ -247,7 +262,7 @@ p.product-description-paragraph { } h1.mobile-header span { - font-family: 'Kaushan Script', cursive; + font-family: 'Unica One', 'Kaushan Script', cursive; font-size: 2.1rem; } diff --git a/app/views/categories/index.html.erb b/app/views/categories/index.html.erb index ceb7e8163c..80718da017 100644 --- a/app/views/categories/index.html.erb +++ b/app/views/categories/index.html.erb @@ -1,13 +1,15 @@
    <%= @error if @error %>
    - +

    Not Yesty Categories

    -
    +
    <% @category.each do |category| %>
    ">
    -

    <%= link_to(category.name, category_path(category.id)) %>

    -

    <%= image_tag((category.products.first == nil ? "NoProductImage.png" : "#{category.products.first.image}"), size: "200x300", alt: "Link of #{category.name}.") %>

    +
    +

    <%= link_to(category.name, category_path(category.id)) %>

    +
    + <%= image_tag((category.products.first == nil ? "NoProductImage.png" : "#{category.products.first.image}"), size: "200x300", alt: "Link of #{category.name}.", class: "product-photo") %>
    <% end %> diff --git a/app/views/categories/show.html.erb b/app/views/categories/show.html.erb index 1b64914a75..dc88e5c58b 100644 --- a/app/views/categories/show.html.erb +++ b/app/views/categories/show.html.erb @@ -1,11 +1,13 @@ - +

    Products For <%= @category.name %>

    -
    +
    <% @products_in_category.each do |p| %> -
    -
    -

    <%= link_to(p.name, merchant_product_path(p.merchant_id,p.id)) %>

    -

    <%= link_to image_tag(p.image), merchant_product_path(p.merchant_id,p.id) %>

    +
    +
    +
    +

    <%= link_to(p.name, merchant_product_path(p.merchant_id,p.id)) %>

    +
    + <%= link_to image_tag(p.image, alt: 'product photo', size: '200x200', class: "product-photo"), merchant_product_path(p.merchant_id,p.id) %>
    <% end %> diff --git a/app/views/landing/index.html.erb b/app/views/landing/index.html.erb index d99ec844c5..4c99c30af0 100644 --- a/app/views/landing/index.html.erb +++ b/app/views/landing/index.html.erb @@ -1,6 +1,6 @@ - +

    Featured Products

    -
    +
      diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 14b453b308..8962591d51 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -5,7 +5,7 @@ <%= content_for?(:title) ? yield(:title) : "Not Yetsy" %> - + <%= stylesheet_link_tag "application" %> <%= javascript_include_tag "application", 'data-turbolinks-track' => true %> <%= csrf_meta_tags %> diff --git a/app/views/orders/checkout.html.erb b/app/views/orders/checkout.html.erb index 3b5173faa5..c01e529d78 100644 --- a/app/views/orders/checkout.html.erb +++ b/app/views/orders/checkout.html.erb @@ -1,4 +1,4 @@ - +
      bF)%vl{80WXvIFT z&tb>x`qam6%r}sWX>&Dt}*nN+dC|BOX8-#QK_Al?S(T!vGrJ)~`1j3&1 zv;}5+z592W96wB0;G)h|pcANsoHyoiS{GZ=WqzF6Ci5m>Kx14k_E`xi3rE@g;Zhz; zot8U2>!IwW*Zj+bjGgM}ElQLgVY@Gl$q1d&+AnLR3O!Q~6~dF6TfMav!Z2oVPG&gP zaJ9F|It*b>3rtiZYsFTo>dvjhWxlIt4wBff>*9D;u8eh~z%W;{{>{RGQ64wSB;3m| zV-jSltS2^Dn$+ObYG)zu0Y@C(OFb;jLA$A2j*A^iHQ}#z?^GH6KV7~OAMyE0s?>#W zAXH*HogHJqiSKG{m3;xE4)n!gcy1ivw(faGH7V59sK}V%+;${5zWa4$DDBcC(xL5Q zOi6q1U*uTJY|%@$=mm%?KdLZY#MJwb;Ty0QV;L z7~znIIV{9c2}o1^kd3R*Kj83Kqb96;-`?(xbvSp=6%#gCo16o@z&KlON<2&+!Ln*ByT}^9ApB>v z{Zq8TB>$&I_w?Pc&K(`KTV$^dr-K0})}WOtU(59r6nB{-g7t}0jU6%5&5}1CbWY_yZSx^tsOsdJ^I-O=bO-(Ly-R4r9j<*KgP-drV*14EL;T&}^P50y5ee!&BytJ*Js&^K>ZAx;ay zXxFDLE*KV{ENWpLoOPACm6yyMYwtrlKUO+5o=ERz=uv>yMm784yED!MBd@6UdLo2r zroFwzli?omN_=5GjyKnOLQ_w&fn-fh{x_P!+c;e*d_0^OkQaa@)3S91ygMsyxrXZG zv{6@v?xgZ_0l$f%7h8{)fO>gf(nq%7kIIx((0M%XU-#Z7nR${qlEl12bT(SU0Nld^ z@_NBD*~Ci~!Mp}8Q%S`0tOoYjXR8>H6wn};0tYS{%0_O*bsxoXeW_Gjzi7)p(K~EC ztwamFY9MmF`7jW0bEBOBo2T|xk?2!+o=2X1{s`UHKoGDjdQ2YIc`hEq1$A&7Ybyl4 zSYV7Hkv5`Mer6UsJwS0+j_4MI?>-rp3AHrigD=UrB12NNeN5beG+bcXaXQNP{9XTGF87$B#V@?J#!D}@Axn@ znXQ`@^vzttS?eTkP)5JAS^YYo)Ne-KmM^`Rty-mkTc{&dCo9=Ib#~ z%;I$PxlmufWwqp1qv;xPabeuPzYl6<4pzosSU?Mo$!n$-vvu8e~HPr7O-6!K;Y5?dlaue>4b%sm5!j zL~Fq4a`-U}*FaIjQi%;h?@gk=a8aq~fSE5S@sUs$^|&BqqY8(%{^|nq^9AsQ;Zo>I&*U-s)rG*a`DrRn}_v3Uszv5~XUkBUIru^c>=(mao(s&u;k@iao(~#!8J(X@rJLYimv$1MXZ+JDQ9`QdoqndeN zp;rLs1(}k;Dedisi{B17A;EGGEC(~%%r60a*nLdTNh{jqBAJx*#CPpTW2ycEJf}izC+vELKlPA^?iwT=2*1Do2tO`sJ zbo9YUhfw8}Ik+t5IJjJs46zt)-dGq5i-=+O4SPty&(q6i)XXp>pXY5AwdkHWsO|bawC$RXH6`S2jhPDL~ zWaY(I6t*hpH+-2~j6)vZZ7XGcDe&`vG1NTpsR-@(JU}J^xzV%Khq7tR z1e>-~M>ML2jU3e(&!MR2Z`F58A>SH%;k^K2C#~2b=`&_&=6EMFqpLDKo6^s+)^==% zbe4MFxM`-jY`*SYJfHHU-QLh7pw%lw2S!F} z;{=+*Vc-wvoyk^%*+UGidTDVVIX&4`&K3@%YA6{!x;OVk3FgG*R zz@ewK?wXU!{>wL-iWi2CpI>FGJywddKzzGs!G$IM41u}{PY7&M0Re5DBg)+Yr0OPT z?Nllp98$qQ+UKpis3)y0Vb(D;<-88lzn1cpSq0dHvz#Rwk4$ubeJC*0{F>DBdp8om z<=P3^#P+s049`qGHgKpjRSgKir;D#?Ps9Y>W{EMhk?#3HqfY}1Z z5zvT%?$z+=&APoiM>~#XL?BkL!WlWil8>Zo8xFE%$nJU`XZpvNJj?qirVhir;f_oFfz}8q%^#h{8}sQoHiVna*yx zk>#eJ`;}^Dh~e#l+G9nP7ZL8Kkc&4*E(goEcOzG-?GyD(IdOjP&5)<2!CWzsWkpu z(Q~e$xL5l9jIQ0|%>1$R`^i%WzT$xZsSd6$iYJA)E}YQ+ZRs}K806W)`Jm0qWZ2t* zN<((S4e%O4(t(}D;|U^37%i^#B*(OB*>J|aULH8ic8K+JaXuJ zoR5dX$g=mWI&XNQa^>D06vXGPau59Sy||U&;d@SBae9d&#*6)>xO+$3i?_1#%wk+iK#wD^E#3BayhC zu9WQ`CVg|b2k{E-zW`KKq6p)9%IRf{gocJ!3X*20x-Iv0^0xuq&dNnWrUS{%S#4;# z6b&I>%Um)oR|byhNDcxctkgg!iNo3a=(#vabvE;AjL%V7g=oC$t_`82MGij^L`s=M z0>$Rk^FLHi8_iL(S<%;o7>>ou&r}9^6zAU&DlKy0@RI89IMA7U#3On8ktV;>zhErj zrf#-RJ(v_Ngm!=lnrqQ7w}uTBV=~8`=Ykk|9_PsnFrlEiTzF4XMc=*Sw4YpC8~DJka$t6g z$c>JZmJXlfA4XWQb?=!qteyPwxxL*n+cJ?(3m>domA^G*;lbk{xtJ(W1`FOb|K!iVXT~udB?S1;$t}mjwVyETO6rRB*z*tB0Zh) z65p=&Iur?{MJ!BMOQeOH-VTih<3DQ`r=*arMmdBEDvmeGkM45wzW|8NZ`?z(w0JE< z1lI1gEECL@lT^^ZlCL)Z!JI${H!56`QE#>1cq)VetH#CLb&pBnV?5d=>6`_^ifnAu zUH}8fMmEY2P$9}cJ~!?b)=Oh6{DG{gM`YLonx=$gC;t5LN2)2*yv*Bvy;o9kqOr}@ z7v#{?J$jeR-G@BY)w(6h|GTT+hbJ_tr^SLSh_h_N4%F5X2*mi=$;ghbDqPq0G{gHy zoXY9D_3Yp@*Fszopj0JQ0tpc4DAq^sncFSdz@vBqK?U&uLkgQYY(-TM041X!)5V1) zro4pX*eVrSht=_IMTcuBr-6GKFtFM_P<5ugW!h!Of#s^#KYs2LEbzUHaw zKTQdiQWahRKbX31LaOS5#-AwSjYWifskgHgf;rX3)*NXVtOH~(o489HysWP#hweEu3l6_|o_{)yM7jUI zmio8IQ^Yh3{t9pW8w~H9cUPi@X5<8>HaBs(d{I_n*PM=hFc=r_O+9RA8!hZ&@t?Ac z*I5wBpR)!=hUZ1cH@**XN1x~G17%cvdF3r5ZhTftju3&W5PAxFEYPoAm@I)=1!v|U zn1-VEc}cNm#8*RX8K$!Tun^`7?=9@{?Mut3Fn{oR;1tw3U+em;5=R72m*At3IJxVx z>YQ4q+R+@^bd1(W%UB@+>6otO%p_qah`NJ%dLOHF?e$jD@RZ*O9MC&9vnx@jex1z+ z%PuGeWVRv(2j@L7AB&--@A160I=c)C5f^XDS1M`v9PJppKm6!BSAg$J0p89H8FoZrr|G3!%9=?a@l$MwKXk=dF0azpf1)L-;;*WMtzqy z92P95QZyYj-p*CRcP*6!j>HOxT?k|G|qS&L6CxX zv=a3__-fOaKu!~v@9$9w2#JVEKGM-Md}8F{=Hcbz7m)lSB`qT>C$Fxd2?A?r>zJCE zTUc6I+qk;9dw6L);NU&~6$ETVBx-hK9C1|?V`p3%j-YpV5|D!Wp7*qzYM1yXF4L$4K(4Ki zSO0b||KwT$pd-NjQyu~~Kos!88pV(g|NqPXgYRInYoTdO5Nhk{ zMw<+fPjLwUO;jANJyT3cS784*jB-=#hV;zHR}!Y0UK~60!i*vJ_5bcW`5Lb(tB(R! zeVl2Bn^PA$3_Pd`e3&Z9%5q-t`gu_=HH9;+lGP!;a18ebut(zht&Q1|y7Rh%%Ae-M ztg1<>J{zvP8u;?~sk+iSxcZdxVV>3N0sag>du2bd%dzmUwP=f5?qWnhl=5xy8SNTa zIt4%LZ(H#jU~=)5@AsAt!{`oUcf3t8@Sb?YPpn>TVR6fwvfcGL{zR`dp~@f02OL2~ zNFvpXJ?)9rm$~^d-g;QL^3&mnu@#6%zdFW~{G_-sCk9ZJh&9+|KgdC3w3AIT6|I_T zPTCww4#1m5@IOE3R&}O7kZXMUf2JM(g@ML0jLD)y_V8cr0@-(f9-Ak zF^40bb&^f_Y-No!e?$J;K0E&T(1xkHI%zISApnfH-HT7z*U8O(ds?Y~cYaH&~wsb;vvdx}{ zRa>w~du`7FH9*}&WLTr^IdJfT-#D+IOI4)?0Bc=a|b^5lY~1`YEAwHT|O%*1Y|<~47!~A<;M;WrOhjLUqR(qK{j#n0rSGg zRJ&)|oHdG{>ATIe$>wTekrupur0Lu@TWwR;1cHmec{Y%guD0kBpy)(JJ|`pS6a(nO zQAT{E9`Vl6Za$>`^GXSDIiq2XBQJTrgQ>0x?E|CSZ5mT6c}cl~Ezo}I;7A_astv85 zfxYXE5qQ~+niGhz;b(eU%qd;P{uaARk-_bGMraKGL+*ZD&rHoyHL$W`aL5yX-0+yr zLX;O@+LU>$t{g%5h+wUZ%2m^;jSI&CB|%Xu!hZ9i%)a`a{a~#OvUgd6LH|^ZIs!LG z|5Ep^+Lst)Hg@&=GcA`S-vm6`{PIFI++tZgU$xuG>k=w}8-PTjO&EzEFsUQ$noz+Z z*9~y7Ne=h0wyGeI5yDDaXDHd+@ZkSg(8FSX-w!%D zK4`nI@K`C0&}e!NUE^KY3-q<4Mh)>?@d?(Nq?E_ecnHwPT+xzm2X|rT0+cf(!a<|V|w`AiLRz6ScZ8xYO79BY?wrHq%sBp{S{`Qn%8a%kJ=C> z@$T@G+$*c=qeh8P`Iusg}+j@Sr#8rAx|ET;gNqpL2_xTn>J=9WP^Qn z1NtoyNmmo#;#IXD>e3cXUS3Q@krKdwaI=!CV3Kdqu=}HEB$)@tIYy(tx2i|RC!J2v zZ0bWWq^AhNOEl%}7(9*$2z3S_nx_GGr>Gq6D!QW8IL*W9;e(0LW;3U~zTfZ8vAn0} zN}Q`)D~V_o45#~!$tGY~tz~t&B!nvW!3l5iD-N=pNyonGk$!B$S&$6Ol|)E88;7Yv z^&65~4+ff^Xauf9y^|opi$ckdD z<)l~93Kl|LYRaVv-Y4^o8p@~HsnNKK?|TE(YPUGSFEfhDx6ep}J+{6JOMw!%+1COB z|Jop*g5vtML%Q9 z*QC{r&UOc`m3Z~}Z1d0lr`7@$Tt;NuAIaG#7#qeC!PXNtd(-Pq{gw&rkTaFRU{fc~ z%xAvO>(Kq<%8?|oHvqMGoWC^*jg%yj(>kWj3<@J((RPeK~%o6B?cfWKP@R? zr(w(W!kd+dRjh%%>sE~dvMcc_(zT#1C{Gr|Wk{X}7$oPLx&2|BhPex4uos#OGxF=; zXHrv{LR8vayDKY+jbm;U**32k_FC^aOQPc#`F0Q;j-tAl^=>pvHth`<^A#Yz(qiVw zEtQm#2ClmJ%jB{7=il2XiOTfVcwTQMpE6G>)34m5E;gww9|GrQ$}eNHt4EPt;~4RB zW%J-B4|LSKU1!k+=D|%YNmC1iz!s>Sv!~0Twor$x^iy_H?=zMwsCb_BBYHCrLA@B( z=q&t%O!;j|mU&BEu(I4cZ>$x1Dvwv}zc#Qfuc7m&0q4bP;2AlV3`Tf#?0!u@$$bIR zAnR?VHx>PbE<2dwksrC)u9gM%E_z9+A?P9D^5hPGMA@B&ePmVpW?cyU-rZpwab#2; ziU`ITQc9X%CwCp&QMIa?lz2Z&W!WW5E27T+0)uQ-2Q2EqZ^+2j&bb{n`o>G1>CB`O z$Hu)Ain=S;47IuuU#H-`Mqc()^g>2g@( zZd}(`&5b|5w99>gqiwtK*|%dEYssFJ;0iak-%~WsR$b*PG?^VKq{7HG`1ed__?P*r z-2JPXb*=F08R1Tc+vi!kC4-Yn6VLvT3&ubAhVqX?abJs)wGzWN=u6}|JGDkH!_U>6kI61!u^n~f!mrK)IR#2cO` zxvV&t$M*NE)AF|!SGaOhhNrGb-_c6vfS+C~I;IlmfQ|Jlb4VSXM95t=Uit9&OroH4 z)b>=)QJZLIXH+Kt7^~NQL(?R#3>E5moZ#kuvr*#crDHQh^Ka{4hTRifUQ!1If*H8G z@)Riz5j*8b8S;ojn{Bd~xI5KT__HE2&}Nj5d~*WEbyCfzc=*6JWtEq~OG8Xa*{;8%QUx_R=*hKIuqH5cB0CZ|L{h$!$DEmfqHNo~5wEvg zk|TkGSZca0lJ;nU7Nu7b(eAb>s8?gZqH|?hYd)(ej9I;|nsR#67ve5*Z*SYQt9yb) z!rv=ues8R=-uAV%wY7lgOT56m&j#C5ZxWKwZ$eFb%0IhX{%p>vEu!k~F^!DlWxuZ# zxuVfAxA@s=RqUXO_ow`>mZFAQ$;ZmS1e`)os_7|AE7t~FU{Skq80K3Ct1JIGJ);r-d=_jGyupc1Xx(Uj?yI*A5EB)j(F6BXmDIks&*ACm0E zl<~W-wlcAl)|+~|4=Bya+Pz&{=WUVPsQJu%`*#Glw^Q~Ge6VuNr2)g_S-#g**RA;ihxtdqZ zds?vemya2zsYI_whT!~Ve#vZU{9v_-cHCO$>>Je5x#pWMv4XCL3FZ3K$O%PVa}xW? zbEpYtmyo4b*xQ!(J))w$=k|Sh8IQI{jNTpk#_{-+{VL3q7Hl{txOeZZnIB z3qmk8#Y4oI7Gv^K^LDow`%T zShj8{xXZ)Q&%h-E#(sb8n*vGIv^bh?>v}gWp_?f;qB@cA@G*Vv(-YJv+lM14r%+3`D+*Xy(x-&{+uU)&6u=T0u$j2+#Pd!7G8=4zo zap$IOAvT0l=payiwWS9osvu@^=0weeP_h^;8DrEox9tJP6F)sY8TgR1qI_`pPuvGr zPvAUEu4Z{Vv}dQrmVTIEbW*U~&N4GsEJ2`^3f=YCCajw0Ln`nM;3*WWr(W(qkv@AE zwdmRyJ0vK#>9c@z`Q>wHxB%%6FtqD+0U#)+}Ym32A+?BGqdyC_tWF;%`)WQWvy zxzCyV?$DM=b$0K&g_|d}+9F8d9Om(unl5GH^_s^z1Wxr37%8EsFCiAb$z4cur zwSD2M=Qn^yvpWJ4#!0dgl>G2I1#mqo5EmrFU0`C;8Vjkcif^Wy&+B&=sTK$ z*Aer10m~4^d>3mZ-^}GBs+wYvk!OqcpT&!nC1~${%ZsE5i8aee8 z!Mr-F-e!TFj#1H5vOk4--ZzMINho+Dl$LRCC0He}taO#X&kb*_>67Z3bCXjYxiJzA z%q{G&9{Cxun{Co8OcPaI@>}$3TZK-=X+!93%5#w|Ca8w50th^f7b*ExIzMmQh{XP=S4eH(C+t+DA-o?~S>!#N7^ zIPOmI;5VNX6F%8LtDb&d(3@wpaq-bvxH*^H!jL|YNF`;fFv;{V4H{+!99-9`Ot~}E zQa(iPwQjNzBe%Y1nX)-!W=BMqFWlKv&aaic3`=Pj5pbTY_Th6Ysd})SwB#S7V|ciR`su(v|WwODuc*Rx0|-iip6lX2i%qt4n6KiU++ z*;LfoPQwjL=AuoR`QXkIS_O4Q|Tu&SQKWc#-oC>~FY=~C~E3<4dGdiw86(TRF)4A6znqQ#Fn(!W%gQ0Pm%sor_%epm0h z&Z>XKs>(N^`(dY@pqqF@<=(18tNscZU$TnMca}&%!>bxHsXc^+o?f(M6@t~N-CmVusiHIA&T zWxo}&lCu0W*5*X4`{o7828PX)w!VREF`SWJ{!uGJ&|+zq3nko{y-{1&ykjO`XB|zm z1p?ga&t0a1$NKH}r#P#eDB4BcPF~|aPaYIpYW=(yZif4Q6W-|ygNj>(y*gKvks@P0 zw7+w9b_XocN>md0Cw8(A&iC6W$wo1XW4ry>%y;t)IMrDGgWT6wham-atbF_@8d75;4{-G4u2Y)ctZ09YkgVBa^mET^Q29IBLiY8Ey_PHh38xjlbV*=XIB#~kWCPoHh9pVk=$SqQedXl zkuyfN7wwd<_H_LvE1Cxj(H)-@ibE8;_Nr;{tXB7A*zX(XxAWRzKF$B*9n2N5QAg7`=n0PGC53Z3P;$#ydv&_WoyTDI$(x^^K(WxIkKzD zk;ik*&*}kt)7Cy~x#wak%Oki85j`YQ~0ZbUvLCb-!0=rJ=ZGdnXn@$rl54aKRy zT&+3=p)TlFC`PgDFtxY~S7O$lO4SvZhAB|bH*U`|nBkCxR45SG%&9fI_G#GQ-E9@Q zshSn7C_Bp%xagSC>c&)YJjeJ7lw!<|W{b|x#|*W%KgvAM3xuhO#jG(n#NKk>I7Yi? zWGq$fB9545-<&d$ieHVd7jKxfLAt3L*k3mKX4*{CWin?3_EN`^GAIphH>dS}_66eW zKIVM^<9uq5fTMY!t*?QubTN#`=~I|03bKD%I*Jn4em;8x+`E@$*)VP2Q8iDQ$S{5IvOLo4057 zr$(MFL93#?)gQqaSAo4Z#{`lZv$W_M!Hf@v#hws4WM^gL^h^$pI5z(ibR`nLCSjzf!BSqolyk1&^vs1)`i22rY+?DY>(9^2FI&Fo&za}@Qav8T2CX%oV1mUK)e+$a z!%1vPOIYBYaR;Z*b_Y9~62Y-|t9R>M+g1Q$okFyNZ>;pk%Zt!zR8m1blkGD}c&$&n z@ZQYc{H4bdg7MgfdSWrnB-QymRXdcP+2}7MCw}(DQUnF=)wa9{>hn7od(fCZM@S4~ zZt2=$&QQ7j@59tdrnZh*Gp5FQe^JKkr`)oKqXDj>s70OyOWCG5i;mV7Uom4QxSjwf znY#hK>5ni-J^55pe48)U_#40A11FmO=*ePD_t&H{Xjl@V zzyv{%tMxz*SJ!eTy9~t#fim*WHr~&h7>-AoX08&R*ubxBC-E6FWe@nlTqUNY4HYeP z`cNY7nMYGKn5{dLBi4zILFHCzDvIv-rvsivco7wZ z(c#kB5)9`6x_S~b!qj?{RM`fFok&7r%1FxL#bPcfzG-jCx*RuW$O1Qija!HPZnFo; z@1MzIrQJQ(JTaCFt*esv9q+E$_wH|RYl3zi>!f9$zz8cPvd1yl(@W&3{OFk8lX|Ll zp2MyqcXU}+%1fpyaHG3d1K?<%@qHtE6mlk>^MTVuR((qL^ceS^A$&tPX(fS6>j(5d z*>Jh8zwvSF*brix`Kyv+h0}~Tj5L^w+z#k7e`P1-sXuC_CE4Zb~Uaw+zh zFI)PN3T>=rBapCdWliKR7J9N!QHH;^-!8v=C#O;x`sWCDQ;e*%e{%Gzl%#fo*5B2F zu?)C2{a)!pD&~2LJJ4Fw$WU(#iEK+0B28oP$$1f!D42M0j|mc&^jEo?NH*&i7>r>1k+UZI* z=-{V9nby$5xhZ9=OMu7~ayE-;g#H&1$BQ`IgRv}SLj9dHfs_&Y+KbG55v;j$^T^W9 zl)CQN8QhJIT-K-;nT$K1-=qFgo3;_>ZuwVr#>W_L+(UkJb@rlt)@Wqe=$WUsB^+vC zX?t!cYVV>LZy$Xj*1oMr9ju8ZFniOEav}0mfsq#7Xzm-_IJ;1tEGyje?4J{@p$j_k zJMO4RmIiYay!}b}V%ElDaR|#T+MV+&x5UGs2x%k2nLu@w_fdunw_a6}i3WWFyY@;= zZrZ}$JJRmW2ilo>i^r@jqF2?j-l4y_wjz#Exdez2=Y700X^s0J^Fbxn!!ozub>mFm zByp317TS57Shg`e&QvphP5UVpJPw^n%IETS!TJ=Dx4NLBgDCkxc>e*dg`JEl{p#zg zt3Bm{8hS;Qu6TKFe^{1jO~wWxwMVU(?c|-l%29iMYeX4Z-|ov|w%6hgWxpYU!9d}$ zfJaIoMjwK;=f{rl04GzUQlxgH7&l?t%((!j-^YZi%eDr{U6IARddsp--FF|gd|nns zXjecn=86iv0Ml(-0 zO;WQ}wz3)gn{(8c0zaZaWST=a_JpPKXHS0xS|+Ks zM@kAesWFnZFtz3aY6-6t-vH5fFZL431Va>AR>7mQw{y;ozl0bo%Ex$QpR$Bcz@Xp( zfzlXv3|Hx7ZK1|2OXmy%H{}$Uu810FF9lKt%*s6;_qXuhT}!_YDevm@RDug0L_>Yt zio<*Rayq(1ZZcua7IZeE=!CmILp>mU+O5;6jdIyFNxZTHA|U>2Ua?&D+S9$qHO|*M z`Gpx?m0`KTK*|H{0H!ttWz?mktLBl?F5HxuKzMkl$g<;1{b1eF997o-7l_mP13EZ| ze`J7sx|on(j;zD_ddcwja{H6j`$YERkV{*6m7kaKL#@|Ks~5WMO&`|RmIa#6uGoYE zQXo8o(* zYU9{9s(*D)KTDao5I7VQCOBpI?L3} zW(`9B@_m+XeMo0kOLW$b!BWS4_;$+Xj4s-$*sn5x8fU6fTxp?P8EOD*FSUgdyHa?GC%-sc- zG@h!XQZ&DabZ_esvTMaJn0qGc?WWaVCH2T>0*-ul?<(3pQ>`qmcvaQt#tstS%Z8Lw z@p7O1M5Ft#(PSaTt}j&=uO7!Vv?n$sl%4I*H06ik+&qJCco$8@xV#HCAgE>e;+>H~ zVFMNv95co5hwzAlXpy0+k=Qa1;W|I71YjrZJwSLSKDp*EC@A~*orTFc@#MS=(4{{Z zZvd*$XVgQcyi58&L1~vY-+!crUrz7LJ*I=l1Dkl`{S*rQzWS5OGCHD_CWTg#zymtJRkW?_1SN&&X^1et(X9{bXYw;dZ9!&mn(s zSK#)~WERK58X%IMnR|_YPJRom`A-L};_YzdjL@#M{b-?|CiMp~m2a~92|hwSM7^EO zQ35li`6?6qNUvZM3qP*7+cA4Ivi&&?wri>RS(KSwv*-TW*ad=vb{75}usdc4mU#U* zyvddZ;1}3l(o2fBAL!2Q3%>z;70@m4%RoNt3@5{p)i}AZ<(2ok0uiv?Kz0s-I(+hix8YFVsNX#)`*@V&rKv zbR8R=0#z6k$K=>yqfJ6t+ZQ3X7r553rN0>>4#r^}l%JFPnlHBa4{Z{$N?o4+Q@lyAlXtSx@dgNQS8bk!dJQf;__ggI0Q2TDqXK5J zRrzlP*fkkupf)}v0<)1@w#LEi`XfVMFv-%GqUx;9XKEDD|>vhg=0;b%RWk)UWhGz_Tid@lkRIk{YEN%+X{J@Uv53BE^iFPvwbX^M+u?JdV zYwzJx&uTbo_p(Z2Osz9Yzh>RtgVFf zi4Pn7oXFqa0XK!Xl=0$fvzBzWm&wX1sj=V4%J{(zoq%XCS9W8duBIlw>KE^_ z261rU2o{d>Uvh1R!V1A%iF&CP)06O?fyy}@f2mUNe#f>sIRKZUQMGV z{S8<&-YWCh=)p53Z+&%#y=zk>BRVQZj5;go{yUGrl3&skjPq2@91PZd0DeU@P zVwNIGD+BK;1{#)5*kUCHcHGfbNB>QkwdkVojQEL)u6_Ip!DI_jCav!RJoKCb8OJVR zIfH3Nz*!9)COu+v9Q3dlBm1H9gFK%Wx{~%1`KV+{m)wq$q5H;vP#K@r#4%3ZYaDW)e* zV(jk}v;ZOZ?%=uQJ1jaD#3E?8n5QZiL9;RW4v5ZyhW|?Dnv3MsIwD=HAh+}!Q;IR7 zkmdUZ(8+}qDwDmE;|^|{Qgs_S!3p!@XI!!F6E}6y_nqK0HHX%GOt=F%0rdOZs4txW>;~%7b9tM$I2nKb-6Sa#t#+cF|5qs%(++$cC=X7-? zrA$9U%eR5n13`4$!cWx}U0PGfCeU2*s*;33ybkl>qa*dzAO`eJdlY(+i2opzT zN4@^t3U*ctN5;KA}#+)%^c^{zvh@#&)Wh%k;Ukl3UX;}qHy^81 zYCPA5^?%}KcKH$b9x?~Pqlxb;#$R|)rVz~Z!S0xtotLadk1)$Sy&LQQOg@77u19=5 z+H-alC&w%u&z2w{nC}uyFg#PNPbsJ_`VAn8E)dvl^Qk6t_~Y1@MjNoDeYSA259IHZ zK;{Ov?R@r)-%Q8Sj~0&=Ao78li2a{6M3e(Z<1-cd``mKZ`?RJBWc<8Pse1~T@0ZJG zXx7QiedWQvobGw>Vg4K&m21;yZ`CnMZNXn&pBamf(v4*ZXOEa|1S%@pyx~YUp~ju$04UXoN*a zUAeS%W8V-jLsMM1=A-5Px{_~!J7dv=uGInFU(PLuEc{&;`RifLcJ|sYmw$)5W{f&e zKGDE4PW0?!t}Rae)k(Q9J@AJq=W6vhCUr1R?ly5BHud`_bp_;U*k zsH-NbtADpT1n8VjBC-)nOcjY5!Y4rG@V!K4rZM;e1wTrQ4U^G^gcTI)vpsWfCtfZDC4Szl7 zFIzc<8YNok60ZvdIE*>8YGeLic~Pjtoxj4WKvp7DNZCb|kxTbzSmY5TGl%uQ38j+-q-}v*J+sdPsjkDsln+uNq8 zsnTO)KE7DuG5-<`&SwETF)s`2>)H0$=5Ty~q)Be+ci(?}^*#V>HzrqAxv5*H6!YR> zoQA5C`)0P-SR}GJH?u!TJd{o{3Rd~X6j9!(-b{AsYB|2c+_LYz=iBsW;uU7LC8}Jj z#bZ5qh^t3<%$#azYC&*~*(rC4>Qp;G_lTzS|3$fH#;n^iOfHT9ff2K>2t;{e6h zL3M~|JBaQmI3|P^y{iI9noK~u08QNE8CBRx09<7Dl-vtYC4bE$lx3Np7r7gw+4LMT zoYH7!P0hsJ`<_ux@|=A)w58R)*K6=tH@NtYyff!z-$>*P^7O?=t)Sskb+`bf)}Rov6ST`_t#olb&p6xs`Wi z=8Ly?=~76&avlNO<=fP2c|KLcNv~%>3|w|=O8zzf;~nvhYl&Ps7Hu||>>iUhvx%S< zTb-Ek@(|-5}4D2f}cyfBoYgM-N^R$SYorY2HfPLJUvwUm^Y~w zfzyU2TCXo5@mqI*`O)M|v%yXcNNuH_z)^9SDQge4LAt?yrPgX6W~zAt**L=r;6$TS z!Dj?2?*D1!>lU#voG|0~-AX|nYW}W+is;t`nd@;VBI?o7v*B74VwAo>hptyEqP;^a$zQ`4hq-cEW2mY&A~Rz z#w|SAY)a}V)75{$gpJRs=kR;+0Zcuj<`#2V@(Zl0_)ykzB8Oc|(TT1^23U9)SE3fw zZf{w}=GjgtyL=#z(*PC!BcA($5wjMe#=NqeSZWVK+K@V!sh+F|EXgwyJXJth>~yxJ zPoZlbr7u7s?TJMEyx$RBcVhCz*U;4^Tf8TTw6$?t z&C;JbV00d?;CRH9&HRK)fE1?^JO#FAxSki<(;u6wJGm{}&HNbc<`f?Dpp;RyMmJQVoj|l*1!AJSt0Q+ z%D5>tmm)VV`%1q|4U+v4DNgrNGHNgl`_Wn;r>bzwJ}nTtkZlL z$Dp+$szqF`**UY|#(_S-nP?Eh+cMIa*HbObh05TaI^;AU<7KdOmjo6c1F=aeAs05Jchi37C? zP2`w0JnjlE&Zt-DAk^!_nrgp(f2-wDI;cs>8D5i3@Jnb!I`;(yK)o%k5fpscsVo`N z0se{({<+@Jn=dpQbLg;tt`HZ(9BW`MV<$+*?%_Rma%y{Qx9HWKCrxpu)Q zq<;22ZN@B&++vqthRfB_c5wpYf&2yt;x!yCPF0wDs(}d$&|u0k&$R4y*Zi<$p<&oi zRM(4EOUBA%C_=+|VT?bvWi#;d-n%x=U6y|Xpw_TIYbYtY30S*yIhcRJ+49bPe!NAE z-jlijZ#SjqFIze~pa2`q=9h85F1`P^^(?UoE{<@)J)@1^rpJ%AzvWe8XxSZa!E!1; z#3@Xua!x4Xv?R+_)YMiTp^=j%uMg5-z3cGhd#JK|v~QCd8P^w3OPY#Yh`~R%Gu-%C zoen9|`b~VYy3iKM9oQ(d?|RUlgl9i8`7nG-Zks)K_Zizj8JHmco^|j0FDFgc>rJc^ zsbpL!+N{U@o9sU`^=m|brF=B%Am2MP_U4D=eZ&cFmzcLblk*|FCKF4*diuoqnWKwR z$jvI%>NmbkA0rSdr^Fdd*P4=(DWJ6)U3UcM&qRnRk`m`#WmOv_g>cyI{%X0uYHCHy z(|=z>Meczcz1<;&jrA&>=#F7P<_%y_hoJxEy>3KC&Wzc<3C|xT0Y3@q{RuVMmii9!wYE?zV)R}1eL^&0$!eZ!k*kaH9SuPFk zC#5d&v$4Ni%a0mJNgX%~pEO3jXmkV$j(iaF0Qz#q7Ju)mt-=6JJZ*^ zy_T~vhIKJ)?q!iS?@W?co1Y{-9bF7xa2~6ce1+o7+Q(kgJ6J zDWV+6@SZ5o>)<2g)SDT z*&;CIaqw*jnbu%P@#MzZA(|Tz_1GQc726<(Sq+2b2n+h0RS25DD~4{xco<~-QB;UB z?cms+9yE33zj?tPrd`M=J5t{qvwNXOX#Z2=k6}ITZg&Lynz16b(uYD{@T?j5aoZzt z=31K;AwAfU_+HpXM~d#3bf!Nmr*|2%h2thdD0g&~SH+8ZW86xAh5nktZs7r(*NEvU z3itdNepNzB2LwS$`TW}o$`AfO$G8PY7UNY_+uwQ3`5{V%kdaBf?fPtb7TgA&QZ@GZ z%540!Sgtn!=ERE4nxZ#jPJ=R&)A(`HC`>T2-BgJj_mtOr2F>Xd~6& z4K)Y<#X?)(<&Bv0z4VXy^h$(15oGYJ@PPMCaa0s+K3;;`Y1VJSlH7S`xO6_GCH~&6 zr@yZZA=_F1Z(8^rxuq;gYT@*gdYP})ig02DWIo-D?Cxlz)sW~95lL}*^W|&9^rTR} zfIb$)6o{2vHX$~-&~+@1&SGy7@-G4>M*PZ*4hIhDQ{K2=fkgF-a~&Rfp~U#H*Ssfp zJIS)u)ucQzkLfsAf=6<0{y{!xcP^LIuU5%V>mwHBde=kKH954%es0P4J~0Zqm}@)K zDPFF_g_uw5m=3p^EB@!F&QAZVM#-GAG73nuutrlrI-L$hFV0@0Y|UUFloYR08b9;z zJf@cys@20&gb^3pAoWP60Q(FgpxR>~NKx|*(1bXN zlIf9Mx3P40`wX^o8HA2AW#fz|r7`0OBOib~`K?Jd;3gAm)BY_-lt(H8dN%AuvAj#B z!yn;y8xBf*arHL3s&sUZdQ9LgF>7ePrX~a*^6zA>)cy1=K+{dmb2)b^b&m05MiIZz zR^kZZFN~$t;mBjonATnCr81-1je%Dd%@OCqtZp-#Bzo4=R%#k1z~He>AAY&?8(Iw- zKKCxSKXXrwc57Dequ|SURL#v8u5l-6X`4Hlt|uR@I{wls0S%K3&fJ9+Uy*liHT?yT zson%UA;7!NUgIwwwbMu3Wh9H6HDB`4pQ%+o8T6GXIY<4Z@2i%U!ZA4hyx;b*pTXmc z=*k3pQm*Y!tWWBX@tlO96dAKSq12rrpU~(X%^7VoCm{j;&KTL;dbTHWSH>yJ5A_P#*TWmD$F^*6xSzh%V?v)_%r+GfQ|(oNA7u0iV$ z43zO;kI?Xm%=!0;K1VI$ZO{Pe8-RZ&HE_kVU$`se$nL!87xWz72eQbwU-ctthru0f zj8x;dqr)lEuv0nTDY*5-pw~~>5l)iKwk$oJFzJ_he6}g6wAU?7N&6Hly-~THNve2T zZ~gn2om$74x?CE6+JY+otj8j+*fk2y@AG~+e0bi7$_?gpv~vVQ)%szxn(sq0e#}Ji zeF`1sA2LWe&Rd?PWt1zDj~q6kMFF@8;bzib4#cieT1PSc6rh`2$G(5*2-FERP@7F1 z;8hZ}ZX7#pQpVQ*HT!#Aw|AgUqIGy&HxOgY(ULh)?+swp8z84U)*W#WpOw#jSiPm- z-8=wH>Kqo=)m%*-@-JFgh~FaO+VhRhm|5WP= zXaYyrJiIq52wPeaYV=JdCTE&+!@|(f8rhd*{W%$-U~i5#Lv)4cD)bi=S`#g5ltk(E-nv^p|DQk@oi=n|-}&d9r(F2Rmpc?a^hmgy&=LC|lRl(>tTkC=I1;A@i)2myn0|XDUoxuyEB$sqy%rBRgg<%D|MU z3=_xyr9g#&e#K74MBV+zNAq56-MXfB+GFQ$Rb~eVYMymq6H&luH~t$yJ5D6!{Y+J~ zgBvsI=Id4b-UQ=Sn0-ET8OoJkPN0rcs5G(?U=tIGtYyu!c>u1Y2M@{K9!kF+FOtEH zrjygZ{sFR?1ax5sJR2=^^jER<(at1|0&p3ZNU{vNl!QA8uQH{0BY9lHHGTxT;(=QYW>< z0~2qKPZNUfi1VJUI5<0_%s;t;J=YD5lP0%xe;R$Gmi-oin^Z40&bX`_gG=(y*kfMZ z+K8SY!^h}beTpnEP#$V+T9C47?$6PZCfLtwpl@XwT=J7K_0q|yux%yJG%-j5Q^N@T zQWVv$+2cCFKnOB*fN~3kg!A{xkcTJTk9{K2r#)N$#Gbf$(;+ljN+QaUS9%wte9-*pMOko z_<$sIH-=f-<$d}FcppF|$E1IZqA**nJWk8qlTx2s@Bzo)_IPjB4y4S^0tFB9!UZew z5XAIkB3d8-AW3@H-4ZVQkVR!mwag|i5%nwH9z{vzX;_ zmY-|c9^0+nuh@QHGOzL4X1T_EwGA_>&lTFsX!!t6OG1`${IzW&eO6+~8=P?&db6}M zO^3hzJXEM@DH-A9Hb31;F^_gttxtw^N?xjO>kpjXi%`xrMR!n&NHy7ZR5uC%wiKLW zyRj1lGk?##0W38YF)x%B|44}xxH1MDZAD3>Mv(&l^gGh$Pa@3x7N&zdKuO_7>j7rW~6)~H7MLlW`zzYtFEsJhBp&yY785sT z7`i@*x!@0Ojt$$zB{v7c{~$l&8F$8n1iDfmQ@9jh2?K_NUL}4cwp`vr5MzO$Ank7` z``k=c?WXxMjgiSbf3S1?tp#vx7O6pU>y-S5ub9(r>pCoIL%k1I8(+fs@DM@fLhST{ z-jl$ag=V8mP#V%`*N<@9|2DM+j#}>udpXLDoac=m229Q2@BF1m%Myj z{!6Fc;Fh1|@ue;WWl@{vscx%io4WL9!F2EHWha`H0$iAW<~J1`SZ4LH!Pn^1GfSJj zHkq^L6y*m>EnT(kP08URhT~P=MJ||qk93Lama^V5&gMq-&B-*d+eKBaLeX;*l~_1iSpb8%e26g z><#=DD}#M!ILoZgRw>$lW_D`CxB0$nC!esj-4(vYtaX`z_1e$78U7rfpt*iQW~@{*hu*G&DJ z6Wy2=9IIQta)si>b&qp^6`dV_;H2W8lOv15?-_bly~@`q6?rQa9=BY6NeuUv8EZan z&il_0a`C6Hxa_aVUzf~#svB{%v{We8kjYRb{n`8eQ@enZ-rR=^i$$LVtr7P;Y^BD$ zzQEOAtx>Q?Yes+mJlp%{ws*~0G&?NKbgAdQjMA4ko~=z`d#C*T_H-K#ho9~H9-b{1 zW0_sbB5>omy6Mcs1+Ez>pK4Y(+qqBKapL>h>U0w&0sI?w$l|q=Q>sM>nvWK~cWdQM8Sp``D8X5qA_V@rE7638;3?Mo> zIuPS=!N9=4#KOnMdK4l&JRE!yB2rQkA`%iZN}8u+SkDsF64Yc z@wwPc($yUl8WTrgeskAg99+t$&z@7gU}j-uV;2w<5*85^lX?9{R!&~wt)`Z?j;@}* zfrX{jdutn8J2&?a9-dy_J|Uk%!@?sX;R%Ufl9E%trl#fP7ZiRgDlRFlsjaJTXl!b3 z>Fnz6>Fw(u7@V9!OwY{D%_CP<*VZ>Sx3+h7k55j|&Mz*nu5bR~LIVK*h4r}p3+(^k zB6;L`^5_)@*wFzPSFoF1zxt_)ncjP`@Bwc{IJMRnb3atMuwZoRav(xv2f$f@3q#%gr0BaE;}aSpJ#f7 z=xN>sjZq9-k%}DnDXbBY3U%r2>53W!;>5$V`)7?BdORHh13R17_kGB7(j=Dts;d%|cXU(|zDu zLquj|QB|x0ho~sK7-;U9(){>91ou;KBOxTn_*{5HaKjNe}6^YGzri z(ge}YjqbNM#MnIx09R#KXl-X-F-qrnrkR*CBKZRT061bXhe~OJB3epVvyR`8>-5p9 zzaaF=4-@fwNos>H%Y-z?XRb3J%-+BPh-G7+Lbv5Fk{bMpc<|i|Lc-9^# zT)Sj@z?IxeItKIkg}uTGuWY`*(4z5iGu#ar!-;1i<>$sBF#4d`yuX~`t>OqJorf%b z_m1SAMXsn|Uv5o)4-mX^{(a@mLyBR`l|kI?R(I4{Z7MY#-klqm&!}Mkv0_*wJLwOE zkYh@){p=?xwfH8H>lW#?3_ab|MY)Zv^5Ws}i?_rzyJ|;O-KsQ!og}ta1H>+qIrvW$x?FnYE3}V2yTP$+%*UA8hFc4^PoZH;Nv5jRbyE)3$@D|mM%DIy2eY8a zN^A9*VYT{2rBQQ-Ng@>$1(3lRWqLN>xu;z2oS)*c{}*l(=6tl$q;Enc7Eyv(bDDnJ;$gDuY=KYl9LI*KIfP83Cn+prI959eZ^wluMXd zU^KuKOMJFBS<`N*Eac_)yaJ|+SGU_zmmqh)3dlbnan6Du1c}J*;yNXt$@#y%3-&Je zs3g+N`UOysoIdjm{sFaJF~!-*qN_0<*E1}aS}2RZ%($%vXIFS=wt8AeM%HP-g&v~; zV*P(Y(!WB}O9_{iD?jCx^q}Ef|>lY@JvhQg%qyea!O-1zly1HP%%QhJBS~XvRgaj(hdnW#8+fd{-uu zdc1t+?N-Qh`#Qttp-t*8;uuNCiFNManQxy9=z)LbbH82!C(Ha~C&1%BUR?;sN7DZ^ zT~xsY2BE&XL&Gb)!h1oHk`hOm2bmY~jC!^j0|L|%pT0hgdxk#@ji5P>WmVx-j|;qV zwHwtgWUHM+DHM+;MAw9 z$tsrzsLn))PF&|%EYt1~O8I=*=Y4G^1)CdFO{|z&;r_bY0{{cXR=fmLzZx=Vpsem9 zW6s8MYcCI9a01Sv_GQM4-J{%KT?33YPchGKua zuPxg>4wi~Pk<0^NrYdEharRq^`lQp@5Pk>q!XB6GoGJ;&XOI~a!S=6M2yEYA`JM$O z5!ItiS@`WYcV>CVN9Kj3Ospg5nd8zqS#Vli1C8bCVI0o5ADK(V-poz*f>zhFTYfnw z;#l&i=g3kKpycMyHMuD+fjcp34!vLUTI@uHnn!ohRPR%0>s(5|BCZSNbPi#Piioql z^gur9;@?ueZu&i%-@Y(ew$M^$RIzw2o;V?)GKh0pzFD>LRqv`57wX<}@@J!N2|hjn zg3CKc;awKpMcq%S8ggxm>dFLr!!MZmpQ8;#4TD&cRgZnBZV4X%`G zxFUXpdHt{x&RREA3K zl`WMUw35&2_RMR3`iKbduMjr1 zabuie!*XVEwNlx>7C^Nc6yuMv0wUXPW1qA@)EV|{!_^ zX1*K`M`#@zkmIb57-p@yzPuN>MuiUg9#E{PUDfuqXmUDKj5$~IpRUP@T!M8rvb!sM z<{to4b+?Mevy~$gjav!Ox1!_M&-Vm$xmNztZW}brA$4jpj%(Hc*5kse8^+2So-fKU z$kmmk-jJ)I{aYz07AWdcQ;K6EP{qKpbB->zO5@Rr(Dz83{j#2SdtxZ{#&`#|Usx`* zBihHb`=2RlqnP!*#bG!VbVB%MW=-yH89MSy%3MI*wpgp^(HG1zG0h#7zC8)taTd(q z$DNvEJoJlcYJ~v-6q5^cctyHNE%>aCy#+IMHisLL?}zt@7vZYE9s9`V6GRSxst(j| z>%(r$XH#nN%6@q-`y)_eJBDdiCq^R-Od$;Gv64wqC9?QSeuoRIX6>HuSdR|Q6lgc0 z-p>-f7-~esuPtIf z60(D;3sM~1Xv)n}HaIdWr&KhKe zmff|gCX#Yk*xtsrFFL8C%I1IYR3g1X6b%=Q@`;jd^iUJf576<;3bJNW9YLEsc%C$z zHRs7cn$G?=Ch_(c`~x}Ka?9HOG3Swl^{_4y5~`$&-R$4(tE+vi+Bub;eI;MF9le0* zXr`X<67|k=t!m5YH6Q2kVc4slSm(eb%QJz+w(y}|!~hT@+$Z?`7sbu)-y-x=A$RGQ z@&We#gI>;>j*zi>j?idhQ^nybUUf#LaM!qiyk;KY4`u(re3hj)3;7EYCQX|{Anm?2 zvRABC8>Q;FZe@{sls4lgg zn;KI@_^cntb)|K{ePP+;OL+4M5DxiG4@UU|2>$x!+xBJODrtFm>JNSmQr22U3h%Xh&fYfi%Uqc3)x^tIX? z7WM%bQ$ z8jc&5t>yy&PAm1zu-uI^-*Yeoe`HU)pS2@}Gg|Cygc2`nt;oc1my&l0DGv^|#E*us z_jr4D5jgErb*GX4y^r~DJ7gXhEHfPl+Jx*O?53Kz^d2iV^M4m?Cu5OqILSo9Mn}8X ze0SI8>L**xzy=s%o1Rz-5Q3mmHYO0~-{KC+dREsYvWJ2G)pjNdH zBrd#KTVX>%i@R122x%6sKN`vYWMY}UOS}Pf=GFX+Qk!IGjfoCQbY9CYG@p*qewoQ3LFon0@TJlX&gch#?@Vin1CJ%b9o0|YXsB0! zT@XUb`g{x#tpn{nFlTj-5iEL+pxhb`5n1FFWfDwWsety-(Wl=^pY=<0%&aFFd7$}D zL*#|56k|+~TPm3cYYhpmCn`mex}reH6^a${L!mIau3`34!R*@upf4=baUofU_W3d5 z&a1NQ?Gd}8b*7{33+rbjEd4niJ0teCk~k9rJIRK|gh+kOO;UNjr>E=VL8)0(idDoC zRENz#IamgAf#hS`SK6_k9&UpYF-v-Joc0mU6tS*<^`7vO`_LDEDicg|+2FDI zJ>+klhT;%}Qe8})m26t`I1-kIQ9<8xdEn(rN0 z_3nYVA9QMG3n!VK7Jrx6oFd;m07$a?HRh9AAR3Q#0{HO?{d)`$qF&p8;AE-(5&6C` z6W^7I5L@sxJ4mCmOLJC$b;~z`s|rkcxJdhH4HPthf^8E~>?-D8!PF6RYx@_6dxvw^ za;wf9n=!acC$l=uoG90-sYMg*78*NSxckYvGzP%w!!|Jo9Z7mL@N^S4p@`EqkR5-*lpD?GcQ zM@f67jhGBIoh;YEZkG{|y~%wC`s&3+Ro}QQT@a%`mYcx?fXMG9B&E|IsAl^j+4g|a zu!=W9%27M~J36l0t8t;%(sEGGagafUPdvCPH{%rhIo&p&BR#h_%O7MlN_q7GP;1mz zXiGV1C%o?+Oy@zQ;}~^?kYsOe`GI&hA<(Pv0ms{$zZ+-D1DfRM1$#Sr29upSlTY@o z2kq!;&}9A|fb7PLXZ-BRj;&r#)8&>~eGK`cyAoX92Hg8IngQYvL^kRQj*}5Y=$Ht&>7d^j#*tHc_7<+k~ zC_3nHq?dr7h3&G=uYUIVn6tK{Rp{RXv-d2Q94DL?J+v!N$)3MS`j!*E1-JU_lR*c= z>%2ix74R#NS5Zj=%#Zo-Z>-8>bk(^U&aV@nqX&wmCSm$hqn8Mfj65Hd&;4=}%>TyC z6!%=c%!^Dp<2zp$XnupXOV;D`902Nt7buFs|2^~iW~5B*d& zPCI}4x^7bOK)8{87^1-kdH_h{m{?n4^yWHGm1xCA{Ct6??2}dbgsqBmxKS7)M>|BcT4x6*|dH}QmL*fRL zdtP|>&wtbFvC2p8%LS*9htI^sw-!rAKlvGI^3nJ%j8Bdr`4^Y$ZF#?W$XJo6q zG|62qO5TzRUe&<)fbnV@L$I06w~@`LYh79~GhYPQT)vR3ckfE!>Xv9sS!h3K;AzSm z8#4JF$y+*Q;@X!3WTER!BB7X-Eaqd7oq#O z+W2GcvTi?^LOoPzeQj|@r^MSPI#1zAD&e18fhmMC`Ap}`oJgn&(dC`L|A=9o&4TK? zm?mC!JVGzQAm)>fPh%{}TlkBl>>F8yc)Ztdft|t5szsm*;o{`*!ho?$U-}t=1TTf2 zZj1S_shi@w8c96CpN-w(bNKCT%~N3rthl5O7SItpTi-k1tl2l@n*Y`4=yI$@&8EE` zUmYwj*<6G=q^>||+z!qwOPlVTIrbVsZ1kZR;r6(x_9BO_lMAo(*H5Nix+|e7_8}aJ z$rscyW`~CdN#!dT>c-#87}h-7pqU=Xt@#SB!lnwwizjxMLoPARX`_9j|#4fZ%wz>M# zZJDKOh=|Njayq>?0Q4JHV$5Lx-nK|me;P^BWHrEoZXt43616o!HA*+MWSzVtme*RQ z$mF+pc3>Qkx^B#dyVBzm<%fAB)>nfxHeUb&3dhZ%f9nOYP;B#@VeTW|Mno+sLRZiz zwg0VDlE9ptK{z4?cll{mQzvjp322wX+Jt zcHmWritLXxao?}Y8l&$%C+N1J0n$zmr+8%fxIk)!|1vsBL#uoi<0;=D zmqA-vZ&EjFkbH82Wn=XGz%aA;v=zbUxl=!+8<6#rc`Abz@uS2ov8h#V?US5`i9?QP z=g;n7F|+qnkkh}_nW=8s+(sfO{#WHLJ|oCil0()K%nF!FqptBKyVIj1rCrRq7MoSBB)5Nx4X8g9~t80|O{{5MB?Sf%>+vHN!3_?UJ$(0MIg8Zh; zYtI1zm~c|sF~vMMdnB&qNgq0oKslv=#<1!;w)4zY*yEf={OddPel1>glpg)saSzM) z$yU(=i*AE1-un^w61v50Eqk&n#ARHIvZvds63iodU0{JoE3qh@8?n6zk+8?syVJSq zxpXGSz)@CTM2s$U-pPY9oxI#s+nd|NmVX^BfPEdq|#j>Eyk!-b*%fMxkG82a5u+#!$!F$WC+2d3BufOsXH_7DeM{%H}<2Yp<++aL8pV=;nJ(La+T zaeJ|r(kxCv_GoHx5wkjz*FGtsf5{1}9N7DbmKOpuC6}1vHWM@%dd1!aXfp)S_ze=R zsC#?zBy;4_WK*Dou}7w}svY*)WR8uv0HF+ zqwD5bu%OiBHGcQT?ItDoEPaFhVjFD_ndnMmp>Qb?-kVKW5T#}8)|tYmx9gHo_IiVt zXsWnWD3CaS0b~;kvZQKlGh_V(zxvdw`|Z2y%@8R zzo4JeIF$L6-_Vylbllj>*(w*#VA5R;4ip=1J?80gBI_O^SlgL7$WESJ7dad8eL8Q? zh~emdHSaRI9e!3gwM2V09V8lTxQOkStcb}!7Sw(5r)0wf|H{}+;&@kVzeXVa zlJ`C5sQ-v>V2A`A@-ueB5UeQQtUx{HmxpO!!1RQdOlRY)OZp#j{T_QoAjKEgLnL%3 zpAhGQ#y9OR)9YBlSOKj!&$QJ)VrUrm+gla>5K5j{Fzl_Cp$dI%@)4Ka;PDRscY5YO zCm@q=SI{|CY51b_lHuh?J>U2dDwXg8TeSiMk4y*qV%}C_%K!*W8g5j2S#5MuUrDb1 zhEKZour5mBaAbx`RL^X1jVLy?zXF#{(B<1quj}@OMHpe%ct#+*&yEm#fZkVM@94k^ zle}0h$@iLK#*uqCkIq~`*+OgF9{|@Epv#E|09ET7O6gX%K+Bz?iURAs5lM)!YP6Ys kMc-X5g&mwTcpuIIvx&86j3g?}q2T)ObnwrN>tX(X0o>Qu0ssI2 literal 0 HcmV?d00001 diff --git a/app/assets/images/nudes_book.jpg b/app/assets/images/nudes_book.jpg new file mode 100644 index 0000000000000000000000000000000000000000..de36469ba4b471ee715b462c18826de9ddc73906 GIT binary patch literal 7148 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 C9;Uzm literal 0 HcmV?d00001 diff --git a/app/assets/images/pac_man_clock.jpg b/app/assets/images/pac_man_clock.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ea7e0c4ac5f64cae941d2165ee2976309686e4b1 GIT binary patch literal 19534 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 WhY0-HfIFPv|K`8A(O>eg&H4lCDuK)Z literal 0 HcmV?d00001 diff --git a/app/assets/images/sheep.jpg b/app/assets/images/sheep.jpg new file mode 100644 index 0000000000000000000000000000000000000000..260f6386a82b48f22d32afe54aa3d92549301c4d GIT binary patch literal 15962 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 VTlG5Ffd2{qLt*|eCSm?T{}=sJ2|NG* literal 0 HcmV?d00001 diff --git a/app/assets/images/sphinx_bedding.jpg b/app/assets/images/sphinx_bedding.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9e79db6b2f7a48e38ca47115bbe4c1554fcabf04 GIT binary patch literal 13898 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 b34CRuf0q9L;}d{?U;k~7|B(;Cy)6DOGF21H literal 0 HcmV?d00001 diff --git a/app/assets/images/sphinx_book.jpg b/app/assets/images/sphinx_book.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1e5ba4e847b446efe4fdfe072cecf4c5c7c63d86 GIT binary patch literal 30884 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 SpMClNad!>w5FmJPZ3xo1yKCd_?(UcO`|h1P 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�KJ;?G2}xwMH5d{s z05S(}yxqx=bLY@d-rVazZQQ6*gS+5$sUUmwqH8O!<2ySM9Q|Uw8Y=UpUiqUpXL2d_ ze`0R`nO~TAAW>XLNg1+TVW5UZd~X#@W^VRXS&7QdH2y~&hhLdj;eS|!EG~N}i4&Jv zb0M6uT~G~%2nCfNSL5b~q6XSZw?SxwFvfS&d9o%Xibn6f(Yd>J{TEjfRKK6SFD#^n zHuA^(?RA8jWv!^YxwFt2 zIoue*^DQ5Ra3`&LCd$NDfJnY`Ch~-hGlMLc5(Y9O)-)#7ds0w+^u*@7IYy!__g$L_ zQ+g#?!V3i>fXWZMZ!g0bWf`s%PWo3w2>W;MT#b{pxm+D@FKuZwcT-LX$ zK!v}-gUj~BvNaxA%H9JzWl9pR1pl7`j{kmL@W1*jL5v>dO_iz zmF1P-FWKxqrh>jva-el0ijkuzJLE2)u$pjR1K#9>45yL*NM)=9?)$v=z&HuQ|7)!- eu8bjk4U89pUo6_Hf;>Jw%EmoQLr&QIzX<>U6m~=a literal 0 HcmV?d00001 diff --git a/app/assets/images/sphinx_shirt.jpg b/app/assets/images/sphinx_shirt.jpg new file mode 100644 index 0000000000000000000000000000000000000000..58910bb50b0b618c436fe3a9b28ce53fb923f696 GIT binary patch literal 20382 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/spinning_zombie_game.jpg b/app/assets/images/spinning_zombie_game.jpg new file mode 100644 index 0000000000000000000000000000000000000000..87d8b07fd3540321fae59e38f21feaa2c4c5767d GIT binary patch literal 16798 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 V5bVQ4ME-L}{x5C&Zx481{2yx@sXzb# literal 0 HcmV?d00001 diff --git a/seeds_csvs/product_categories.csv b/seeds_csvs/product_categories.csv index d4c39e0788..a359fb55ed 100644 --- a/seeds_csvs/product_categories.csv +++ b/seeds_csvs/product_categories.csv @@ -76,3 +76,24 @@ 78,2,33 79,5,33 80,9,33 +81,2,34 +82,5,34 +83,5,35 +84,1,37 +85,5,37 +86,7,37 +87,10,37 +88,1,38 +89,4,38 +90,5,38 +91,7,38 +92,10,38 +93,5,39 +94,9,39 +95,2,39 +96,2,40 +97,5,40 +98,5,41 +99,9,41 +100,5,42 +101,8,42 diff --git a/seeds_csvs/products.csv b/seeds_csvs/products.csv index f9c6a353f3..47620559a2 100644 --- a/seeds_csvs/products.csv +++ b/seeds_csvs/products.csv @@ -30,4 +30,11 @@ 31,Tire Swing,"This tried and true tire swing will keep you twirling your time away day after day.",10123,tire_swing.jpg,10,9 32,Rainbow Parasol,"Did you know harmful UVRainbows can cause premature aging? Protect your skin from the visible light spectrum with this rainbow parasol. Keep it on hand for those disheartening days when the sun is shining through the rain. ",4233,umbrella.jpg,10,9 33,Uni the Unicorn,"What's white, gold, and rainbow all over? Uni the Unicorn! You'll love snuggling her plushy bod. Kiss her on the muzzle and you might even catch her smiling at you.",791,unicorn_animal.jpg,10,9 -34,View Master,"The original virtual reality device is back and ready for you to explore distant lands and funny memes with the pull of a trigger. Choose from a variety of film discs including bald cats, tiny apartments, and accidental photos of the floor.",1594,view_master.jpg.jpg,10,9 +34,View Master,"The original virtual reality device is back and ready for you to explore distant lands and funny memes with the pull of a trigger. Choose from a variety of film discs including bald cats, tiny apartments, and accidental photos of the floor.",1594,view_master.jpg,10,9 +35,Boxed Water,"Boxed water is better. Don't believe us? Try it for yourself. Drinking water out of cardboard carton will leave you feeling refreshed and oddly nostalgic for your elementary school cafeteria. It's an emotion fusion we guarantee you'll love. Please don't operate heavy machinery after drinking boxed water.",2.99,water.jpg,10,9 +37,Engagement Ring,"Have your S.O. saying 'Oh Yes' with this 'hue'-tiful rainbow engagement ring. You'll love watching her friends smile and nod politely when they ask to see her ring.",99.99,wedding-ring.jpg,10,9 +38,Rainbow Hair,"Win friends and influence people with this psychedelic rainbow wig made from real human hair.",47.99,wig.jpg,10,9 +39,Mum Fish and Bone Baby,"You'll love helping this Mum Fish give birth to her smiling Bone Baby. Make Bone Baby swim around or put him back in the birthing canal for more laborious fun.",17.99,bone_fish.jpg,10,9 +40,Techie Plush-a-nana,"Get caught in an infinite loop peeling and un-peeling this soft plush banana. You'll find yourself iterating over plush banana mechanics all day long. ",12.99,fake_banana.jpg,10,9 +41,Prehistoric Paper Weight,"Keep your documents from blowing away so your job doesn't go extinct. Paleo down your important papers with this Dino-mite glass paper weight. Plus, it'll look 'ptero-rrific' in your cubicle.",29.99,glass_dino.jpg,10,9 +42,Take My Hand Statue,"This lifelike hand is always handy when you need a hand, but only when you need a fake hand. We know it's a rare occasion, but it's here. You know, just in case. ",47.99,hand.jpg,10,9 From b9275caf2262b3126d09edd84202c5033f85d3c9 Mon Sep 17 00:00:00 2001 From: Nina Mutty Date: Fri, 28 Oct 2016 12:48:35 -0700 Subject: [PATCH 182/191] edited wedding ring csv --- seeds_csvs/products.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/seeds_csvs/products.csv b/seeds_csvs/products.csv index b91cb8d5b4..7f2dd54c8f 100644 --- a/seeds_csvs/products.csv +++ b/seeds_csvs/products.csv @@ -32,7 +32,7 @@ 33,Uni the Unicorn,"What's white, gold, and rainbow all over? Uni the Unicorn! You'll love snuggling her plushy bod. Kiss her on the muzzle and you might even catch her smiling at you.",791,unicorn_animal.jpg,10,9 34,View Master,"The original virtual reality device is back and ready for you to explore distant lands and funny memes with the pull of a trigger. Choose from a variety of film discs including bald cats, tiny apartments, and accidental photos of the floor.",1594,view_master.jpg,10,9 35,Boxed Water,"Boxed water is better. Don't believe us? Try it for yourself. Drinking water out of cardboard carton will leave you feeling refreshed and oddly nostalgic for your elementary school cafeteria. It's an emotion fusion we guarantee you'll love. Please don't operate heavy machinery after drinking boxed water.",2.99,water.jpg,10,9 -37,Engagement Ring,"Have your S.O. saying 'Oh Yes' with this 'hue'-tiful rainbow engagement ring. You'll love watching her friends smile and nod politely when they ask to see her ring.",99.99,wedding-ring.jpg,10,9 +37,Engagement Ring,"Have your S.O. saying 'Oh Yes' with this 'hue'-tiful rainbow engagement ring. You'll love watching her friends smile and nod politely when they ask to see her ring.",99.99,wedding_ring.jpg,10,9 38,Rainbow Hair,"Win friends and influence people with this psychedelic rainbow wig made from real human hair.",47.99,wig.jpg,10,9 39,Mum Fish and Bone Baby,"You'll love helping this Mum Fish give birth to her smiling Bone Baby. Make Bone Baby swim around or put him back in the birthing canal for more laborious fun.",17.99,bone_fish.jpg,10,9 40,Techie Plush-a-nana,"Get caught in an infinite loop peeling and un-peeling this soft plush banana. You'll find yourself iterating over plush banana mechanics all day long. ",12.99,fake_banana.jpg,10,9 From ee47cf94d866f34d90ea73025c1b4eecaf5363ea Mon Sep 17 00:00:00 2001 From: Miriam Cortes Date: Fri, 28 Oct 2016 12:49:01 -0700 Subject: [PATCH 183/191] Gemfile for heroku --- Gemfile | 4 ++-- Gemfile.lock | 8 ++++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/Gemfile b/Gemfile index c70bfd6eb6..0ed3d10f2e 100644 --- a/Gemfile +++ b/Gemfile @@ -8,8 +8,8 @@ gem "omniauth" gem "omniauth-github" gem 'simplecov', group: :test -# gem 'pg', group: :production -# gem 'rails_12factor', group: :production +gem 'pg', group: :production +gem 'rails_12factor', group: :production # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' gem 'rails', '4.2.7' diff --git a/Gemfile.lock b/Gemfile.lock index c6ec61d9ed..f79301bfe3 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -125,6 +125,7 @@ GEM omniauth-oauth2 (1.4.0) oauth2 (~> 1.0) omniauth (~> 1.2) + pg (0.19.0) pry (0.10.4) coderay (~> 1.1.0) method_source (~> 0.8.1) @@ -151,6 +152,11 @@ GEM rails-deprecated_sanitizer (>= 1.0.1) rails-html-sanitizer (1.0.3) loofah (~> 2.0) + rails_12factor (0.0.3) + rails_serve_static_assets + rails_stdout_logging + rails_serve_static_assets (0.0.5) + rails_stdout_logging (0.0.5) railties (4.2.7) actionpack (= 4.2.7) activesupport (= 4.2.7) @@ -222,8 +228,10 @@ DEPENDENCIES minitest-reporters omniauth omniauth-github + pg pry rails (= 4.2.7) + rails_12factor sass-rails (~> 5.0) sdoc (~> 0.4.0) simplecov From 3b62a90cf27476ae5f059c3be84dde2c7bb477c0 Mon Sep 17 00:00:00 2001 From: Miriam Cortes Date: Fri, 28 Oct 2016 12:50:37 -0700 Subject: [PATCH 184/191] for heroku --- app/assets/stylesheets/application.scss | 3 --- seeds_csvs/products.csv | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index ca5a625407..c47bc369ed 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -26,9 +26,6 @@ main { padding-bottom: 12vh; } - -} - div#checkout form { padding-bottom: 20vh; } diff --git a/seeds_csvs/products.csv b/seeds_csvs/products.csv index b91cb8d5b4..7f2dd54c8f 100644 --- a/seeds_csvs/products.csv +++ b/seeds_csvs/products.csv @@ -32,7 +32,7 @@ 33,Uni the Unicorn,"What's white, gold, and rainbow all over? Uni the Unicorn! You'll love snuggling her plushy bod. Kiss her on the muzzle and you might even catch her smiling at you.",791,unicorn_animal.jpg,10,9 34,View Master,"The original virtual reality device is back and ready for you to explore distant lands and funny memes with the pull of a trigger. Choose from a variety of film discs including bald cats, tiny apartments, and accidental photos of the floor.",1594,view_master.jpg,10,9 35,Boxed Water,"Boxed water is better. Don't believe us? Try it for yourself. Drinking water out of cardboard carton will leave you feeling refreshed and oddly nostalgic for your elementary school cafeteria. It's an emotion fusion we guarantee you'll love. Please don't operate heavy machinery after drinking boxed water.",2.99,water.jpg,10,9 -37,Engagement Ring,"Have your S.O. saying 'Oh Yes' with this 'hue'-tiful rainbow engagement ring. You'll love watching her friends smile and nod politely when they ask to see her ring.",99.99,wedding-ring.jpg,10,9 +37,Engagement Ring,"Have your S.O. saying 'Oh Yes' with this 'hue'-tiful rainbow engagement ring. You'll love watching her friends smile and nod politely when they ask to see her ring.",99.99,wedding_ring.jpg,10,9 38,Rainbow Hair,"Win friends and influence people with this psychedelic rainbow wig made from real human hair.",47.99,wig.jpg,10,9 39,Mum Fish and Bone Baby,"You'll love helping this Mum Fish give birth to her smiling Bone Baby. Make Bone Baby swim around or put him back in the birthing canal for more laborious fun.",17.99,bone_fish.jpg,10,9 40,Techie Plush-a-nana,"Get caught in an infinite loop peeling and un-peeling this soft plush banana. You'll find yourself iterating over plush banana mechanics all day long. ",12.99,fake_banana.jpg,10,9 From 5de78ed65ed571b3bb3820decb2d1c3aea3ba906 Mon Sep 17 00:00:00 2001 From: Nina Mutty Date: Fri, 28 Oct 2016 13:10:29 -0700 Subject: [PATCH 185/191] reviews 6-9 --- app/assets/stylesheets/application.scss | 9 +++++++-- app/views/orders/show.html.erb | 6 +++--- app/views/orders/update.html.erb | 4 ++-- seeds_csvs/reviews.csv | 10 +++++----- 4 files changed, 17 insertions(+), 12 deletions(-) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index ca5a625407..38b7e14c04 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -27,8 +27,6 @@ main { } -} - div#checkout form { padding-bottom: 20vh; } @@ -234,6 +232,13 @@ div.product-name-div { margin-top: 3%; } + +h4.order-number { + text-align: center; + margin-top: 3%; +} + + // ###### Media Screen Differences ###### @media only screen { diff --git a/app/views/orders/show.html.erb b/app/views/orders/show.html.erb index 0cb3bb5af8..a5fdbc0201 100644 --- a/app/views/orders/show.html.erb +++ b/app/views/orders/show.html.erb @@ -1,9 +1,9 @@ -

      <%= @order_items.count %> <%= @order_items.count == 1 ? "Item" : "Items" %> in Your Cart

      +

      <%= @order_items.count %> <%= @order_items.count == 1 ? "Item" : "Items" %> in Your Cart

      <% if @order_items.count == 0 %> -

      +

      There are no items in your shopping cart. Please <%= link_to "go back", root_path %> and add some items to your cart. -

      +

      <% else %> diff --git a/app/views/orders/update.html.erb b/app/views/orders/update.html.erb index d73e0f9e6e..248f5bf339 100644 --- a/app/views/orders/update.html.erb +++ b/app/views/orders/update.html.erb @@ -1,2 +1,2 @@ -

      Thank You <%= params[:card_name]%>

      -

      Your Order #<%=params[:id] %> has been submitted

      +

      Thank You <%= params[:card_name]%>

      +

      Your Order #<%=params[:id] %> has been submitted

      diff --git a/seeds_csvs/reviews.csv b/seeds_csvs/reviews.csv index 16443dca3f..a3cac3c2d7 100644 --- a/seeds_csvs/reviews.csv +++ b/seeds_csvs/reviews.csv @@ -3,8 +3,8 @@ 3,1,posuere felis sed lacus morbi sem mauris laoreet ut,Mark Myers,5 4,7,mi pede malesuada in imperdiet et commodo vulputate,Mark Price,2 5,9,orci vehicula condimentum curabitur in,Jack Cole,3 -6,1,erat vestibulum sed magna at,Justin Murphy,3 -7,2,accumsan felis ut at dolor quis odio consequat,Janice Foster,5 -8,9,nibh in lectus pellentesque at nulla suspendisse potenti cras,Sarah Matthews,5 -9,5,ante nulla justo aliquam quis turpis eget,Ann Stanley,3 -10,7,quis turpis sed ante vivamus tortor duis mattis egestas,Gary Ramirez,5 +6,1,I take nightly baths and this is BY FAR the best bath bomb I'v used! It not only smells amazing but also leave my skin silky smooth. I only give it a three because that's my favorite number,Justin Murphy,3 +7,2,THIS IS SO FUN! I brought it into my 1st grade class room and loved it! One thumb up! (I lost my other in a tire swing accident a few years back),Janice Foster,5 +8,9,Super fun a festive! Great for a back-yard BBQ,Sarah Matthews,5 +9,5,I LOVE the elephant, however be warned, it only holds a normal bottle of wine - not a double - need a grown up elephant for that!,Ann Stanley,3 +10,7,I thought about getting a cardboard moose for my wall but the face is so much more relatable,Gary Ramirez,5 From 2a87ebbb2f1a1ecfae8fc8f3f605f371ebaea4e1 Mon Sep 17 00:00:00 2001 From: Miriam Cortes Date: Fri, 28 Oct 2016 13:15:50 -0700 Subject: [PATCH 186/191] reviews added --- seeds_csvs/reviews.csv | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/seeds_csvs/reviews.csv b/seeds_csvs/reviews.csv index 16443dca3f..ff399b54b5 100644 --- a/seeds_csvs/reviews.csv +++ b/seeds_csvs/reviews.csv @@ -1,8 +1,8 @@ -1,3,sapien a libero nam dui proin leo,Louise Andrews,2 -2,3,varius nulla facilisi cras non velit nec,Kimberly Stone,2 -3,1,posuere felis sed lacus morbi sem mauris laoreet ut,Mark Myers,5 -4,7,mi pede malesuada in imperdiet et commodo vulputate,Mark Price,2 -5,9,orci vehicula condimentum curabitur in,Jack Cole,3 +1,3,This cat watch is kinda crappy! It tells the time so you'd think that's great. But the cat glasses broke off in the first month. Still pretty cute tho.,Louise Andrews,2 +2,3,OHEMGEE! I LOVE this thing!!!!,Kimberly Stone,5 +3,1,Dare I say it? This is the BOMB.com!! #productpuns,Mark Myers,5 +4,7,This is garbage! It didn't even survive outside during the first rainstorm of the season.,Mark Price,2 +5,9,Perfect ambiance for when I bring my dates back to my place. They even forget that we're in my mom's basement!,3 6,1,erat vestibulum sed magna at,Justin Murphy,3 7,2,accumsan felis ut at dolor quis odio consequat,Janice Foster,5 8,9,nibh in lectus pellentesque at nulla suspendisse potenti cras,Sarah Matthews,5 From edab648cd4fedaa8a8f9a99428fcdd0a5297baa7 Mon Sep 17 00:00:00 2001 From: Miriam Cortes Date: Fri, 28 Oct 2016 13:20:56 -0700 Subject: [PATCH 187/191] purchased orders vs customer orders --- app/views/merchants/show.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/merchants/show.html.erb b/app/views/merchants/show.html.erb index 473c553c78..060aca364a 100644 --- a/app/views/merchants/show.html.erb +++ b/app/views/merchants/show.html.erb @@ -16,7 +16,7 @@ - <% @merchant.placed_orders.each do |order| %> + <% @merchant.customer_orders.each do |order| %> <% order.products.each do |product| %> From 10f3b8537b15b8929fa7a29ee028471e5ad6acc9 Mon Sep 17 00:00:00 2001 From: Miriam Cortes Date: Fri, 28 Oct 2016 13:27:09 -0700 Subject: [PATCH 188/191] Olivia's changes --- Gemfile | 4 +- Gemfile.lock | 8 ---- seeds_csvs/product_categories.csv | 65 ++++++++++++++++--------------- seeds_csvs/products.csv | 27 ++++++------- 4 files changed, 49 insertions(+), 55 deletions(-) diff --git a/Gemfile b/Gemfile index 0ed3d10f2e..c70bfd6eb6 100644 --- a/Gemfile +++ b/Gemfile @@ -8,8 +8,8 @@ gem "omniauth" gem "omniauth-github" gem 'simplecov', group: :test -gem 'pg', group: :production -gem 'rails_12factor', group: :production +# gem 'pg', group: :production +# gem 'rails_12factor', group: :production # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' gem 'rails', '4.2.7' diff --git a/Gemfile.lock b/Gemfile.lock index f79301bfe3..c6ec61d9ed 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -125,7 +125,6 @@ GEM omniauth-oauth2 (1.4.0) oauth2 (~> 1.0) omniauth (~> 1.2) - pg (0.19.0) pry (0.10.4) coderay (~> 1.1.0) method_source (~> 0.8.1) @@ -152,11 +151,6 @@ GEM rails-deprecated_sanitizer (>= 1.0.1) rails-html-sanitizer (1.0.3) loofah (~> 2.0) - rails_12factor (0.0.3) - rails_serve_static_assets - rails_stdout_logging - rails_serve_static_assets (0.0.5) - rails_stdout_logging (0.0.5) railties (4.2.7) actionpack (= 4.2.7) activesupport (= 4.2.7) @@ -228,10 +222,8 @@ DEPENDENCIES minitest-reporters omniauth omniauth-github - pg pry rails (= 4.2.7) - rails_12factor sass-rails (~> 5.0) sdoc (~> 0.4.0) simplecov diff --git a/seeds_csvs/product_categories.csv b/seeds_csvs/product_categories.csv index a359fb55ed..2e748fef5d 100644 --- a/seeds_csvs/product_categories.csv +++ b/seeds_csvs/product_categories.csv @@ -65,35 +65,36 @@ 67,5,27 68,2,28 69,5,28 -70,5,30 -71,9,30 -72,2,31 -73,5,31 -74,6,31 -75,1,32 -76,5,32 -77,1,33 -78,2,33 -79,5,33 -80,9,33 -81,2,34 -82,5,34 -83,5,35 -84,1,37 -85,5,37 -86,7,37 -87,10,37 -88,1,38 -89,4,38 -90,5,38 -91,7,38 -92,10,38 -93,5,39 -94,9,39 -95,2,39 -96,2,40 -97,5,40 -98,5,41 -99,9,41 -100,5,42 -101,8,42 +70,5,29 +71,9,29 +72,2,30 +73,5,30 +74,6,30 +75,1,31 +76,5,31 +77,1,32 +78,2,32 +79,5,32 +80,9,32 +81,2,33 +82,5,33 +83,5,34 +84,1,35 +85,5,35 +86,7,35 +87,10,35 +88,1,36 +89,4,36 +90,5,36 +91,7,37 +92,10,37 +93,5,37 +94,9,38 +95,2,38 +96,5,38 +97,5,39 +98,9,39 +99,5,40 +100,8,40 +101,5,41 +102,8,41 diff --git a/seeds_csvs/products.csv b/seeds_csvs/products.csv index 7f2dd54c8f..5a4c1cd8e6 100644 --- a/seeds_csvs/products.csv +++ b/seeds_csvs/products.csv @@ -19,22 +19,23 @@ 19,Moustache Clips,"Stache away your favorite passages with these Moustache Clip Page Markers. They come in a variety of lifelike shapes and colors to help you stay organized. These wiry staches are both magnetic and lady magnets.",894,mustache_clips.jpg,10,9 20,Moustache Outlet Covers,"You've always thought the holes in your outlet looked like a face. Well, why not make that boring outlet face look like your dad's face? These classy mustache stickers will have you and your friends gawking at the resemblance.",458,outlet_stash.jpg,10,9 21,Tiny Plungers,"These tiny plungers can tackle the tiniest of clogs in the tiniest of toilets. Some assembly required.",1243,party_plungers.jpg,10,9 -22,Ultimate Procrastinator's Pen Set,"Take forever deciding which color pen you want to use. With more than ten shades of blue to chose from you'll never decide on the perfect one.",2100,pens.jpg,10,9 +22,Procrastinator's Pen Set,"Take forever deciding which color pen you want to use. With more than ten shades of blue to chose from you'll never decide on the perfect one.",2100,pens.jpg,10,9 23,Frappe Fake Phone Case,"This fancy Frappe Fake Phone Case doesn't fit a single phone in existence. Really. Not one. Just try making your phone fit. We dare you.",654,phone_case.jpg,10,9 24,Pegg,"Meet Pegg. She's a pig who pukes eggs. Well, egg yolks to be specific. She's the cutest but least efficient way you'll ever find to separate the egg yolks from the whites.",1824,pig_egg.jpg,10,9 25,Pizza Floatation Device,"Ever wish you could hit the water on your favorite wedge of pizza. This is your chance. Drowning Hazard Warning: Wait twenty minutes after using Pizza Flotation Device before swimming.",2777,pizza_raft.jpg,10,9 26,Roy G. Biv Rainbow Maker,"Enjoy the entire visible light spectrum from the comfort of your living room. This rainbow maker is the first and only of its kind and is guaranteed to bring you happiness. Warning: Shining a rainbow directly into your eyes could cause vision loss.",8721,rainbow_maker.jpg,10,9 27,Toast-Its,"You'll love leaving yourself little reminders on paper that looks and smells so much like real toast that you might catch yourself buttering it. Don't worry, we've done it too.",133,sticky_notes.jpg,10,9 28,Voo-doo Squeez-a-Face,"Seeking revenge on someone who has done you wrong? Look no further. Squeeze this head into whatever ugly expression you desire and your nemesis's face will be permanently stuck that way.",733,stress_balls.jpg,10,9 -30,Tea-Rex,"Still drinking New Age Tea? Pssshh. Time to turn your tea Prehistoric with this Tea-Rex. Also available in Paleozoic Purple and Cambrian Cranberry.",664,tea_infuser.jpg,10,9 -31,Tire Swing,"This tried and true tire swing will keep you twirling your time away day after day.",10123,tire_swing.jpg,10,9 -32,Rainbow Parasol,"Did you know harmful UVRainbows can cause premature aging? Protect your skin from the visible light spectrum with this rainbow parasol. Keep it on hand for those disheartening days when the sun is shining through the rain. ",4233,umbrella.jpg,10,9 -33,Uni the Unicorn,"What's white, gold, and rainbow all over? Uni the Unicorn! You'll love snuggling her plushy bod. Kiss her on the muzzle and you might even catch her smiling at you.",791,unicorn_animal.jpg,10,9 -34,View Master,"The original virtual reality device is back and ready for you to explore distant lands and funny memes with the pull of a trigger. Choose from a variety of film discs including bald cats, tiny apartments, and accidental photos of the floor.",1594,view_master.jpg,10,9 -35,Boxed Water,"Boxed water is better. Don't believe us? Try it for yourself. Drinking water out of cardboard carton will leave you feeling refreshed and oddly nostalgic for your elementary school cafeteria. It's an emotion fusion we guarantee you'll love. Please don't operate heavy machinery after drinking boxed water.",2.99,water.jpg,10,9 -37,Engagement Ring,"Have your S.O. saying 'Oh Yes' with this 'hue'-tiful rainbow engagement ring. You'll love watching her friends smile and nod politely when they ask to see her ring.",99.99,wedding_ring.jpg,10,9 -38,Rainbow Hair,"Win friends and influence people with this psychedelic rainbow wig made from real human hair.",47.99,wig.jpg,10,9 -39,Mum Fish and Bone Baby,"You'll love helping this Mum Fish give birth to her smiling Bone Baby. Make Bone Baby swim around or put him back in the birthing canal for more laborious fun.",17.99,bone_fish.jpg,10,9 -40,Techie Plush-a-nana,"Get caught in an infinite loop peeling and un-peeling this soft plush banana. You'll find yourself iterating over plush banana mechanics all day long. ",12.99,fake_banana.jpg,10,9 -41,Prehistoric Paper Weight,"Keep your documents from blowing away so your job doesn't go extinct. Paleo down your important papers with this Dino-mite glass paper weight. Plus, it'll look 'ptero-rrific' in your cubicle.",29.99,glass_dino.jpg,10,9 -42,Take My Hand Statue,"This lifelike hand is always handy when you need a hand, but only when you need a fake hand. We know it's a rare occasion, but it's here. You know, just in case. ",47.99,hand.jpg,10,9 +29,Tea-Rex,"Still drinking New Age Tea? Pssshh. Time to turn your tea Prehistoric with this Tea-Rex. Also available in Paleozoic Purple and Cambrian Cranberry.",664,tea_infuser.jpg,10,9 +30,Tire Swing,"This tried and true tire swing will keep you twirling your time away day after day.",10123,tire_swing.jpg,10,9 +31,Rainbow Parasol,"Did you know harmful UVRainbows can cause premature aging? Protect your skin from the visible light spectrum with this rainbow parasol. Keep it on hand for those disheartening days when the sun is shining through the rain. ",4233,umbrella.jpg,10,9 +32,Uni the Unicorn,"What's white, gold, and rainbow all over? Uni the Unicorn! You'll love snuggling her plushy bod. Kiss her on the muzzle and you might even catch her smiling at you.",791,unicorn_animal.jpg,10,9 +33,View Master,"The original virtual reality device is back and ready for you to explore distant lands and funny memes with the pull of a trigger. Choose from a variety of film discs including bald cats, tiny apartments, and accidental photos of the floor.",1594,view_master.jpg,10,9 +34,Boxed Water,"Boxed water is better. Don't believe us? Try it for yourself. Drinking water out of cardboard carton will leave you feeling refreshed and oddly nostalgic for your elementary school cafeteria. It's an emotion fusion we guarantee you'll love. Please don't operate heavy machinery after drinking boxed water.",299,water.jpg,10,9 +35,Engagement Ring,"Have your S.O. saying 'Oh Yes' with this 'hue'-tiful rainbow engagement ring. You'll love watching her friends smile and nod politely when they ask to see her ring.",9999,wedding-ring.jpg,10,9 +36,Rainbow Hair,"Win friends and influence people with this psychedelic rainbow wig made from real human hair.",4799,wig.jpg,10,9 +37,Mum Fish and Bone Baby,"You'll love helping this Mum Fish give birth to her smiling Bone Baby. Make Bone Baby swim around or put him back in the birthing canal for more laborious fun.",1799,bone_fish.jpg,10,9 +38,Techie Plush-a-nana,"Get caught in an infinite loop peeling and un-peeling this soft plush banana. You'll find yourself iterating over plush banana mechanics all day long. ",1299,fake_banana.jpg,10,9 +39,Prehistoric Paper Weight,"Keep your documents from blowing away so your job doesn't go extinct. Paleo down your important papers with this Dino-mite glass paper weight. Plus, it'll look 'ptero-rrific' in your cubicle.",2999,glass_dino.jpg,10,9 +40,Take My Hand Statue,"This lifelike hand is always handy when you need a hand, but only when you need a fake hand. We know it's a rare occasion, but it's here. You know, just in case. ",4799,hand.jpg,10,9 +41,Monkey Pizza Cutter,"Pretend you're at the circus at dinner time. This pizza cutter that closely resembles a monkey riding a unicycle will slice your pizza in one fell swoop.",2799,monkey_pizza_cutter.jpg,10,9 From ade6ce5186350e55b00161772c24bff0f3ee0c56 Mon Sep 17 00:00:00 2001 From: Miriam Cortes Date: Fri, 28 Oct 2016 13:36:57 -0700 Subject: [PATCH 189/191] gemfile for heroku --- Gemfile | 4 ++-- Gemfile.lock | 8 ++++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/Gemfile b/Gemfile index c70bfd6eb6..0ed3d10f2e 100644 --- a/Gemfile +++ b/Gemfile @@ -8,8 +8,8 @@ gem "omniauth" gem "omniauth-github" gem 'simplecov', group: :test -# gem 'pg', group: :production -# gem 'rails_12factor', group: :production +gem 'pg', group: :production +gem 'rails_12factor', group: :production # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' gem 'rails', '4.2.7' diff --git a/Gemfile.lock b/Gemfile.lock index c6ec61d9ed..f79301bfe3 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -125,6 +125,7 @@ GEM omniauth-oauth2 (1.4.0) oauth2 (~> 1.0) omniauth (~> 1.2) + pg (0.19.0) pry (0.10.4) coderay (~> 1.1.0) method_source (~> 0.8.1) @@ -151,6 +152,11 @@ GEM rails-deprecated_sanitizer (>= 1.0.1) rails-html-sanitizer (1.0.3) loofah (~> 2.0) + rails_12factor (0.0.3) + rails_serve_static_assets + rails_stdout_logging + rails_serve_static_assets (0.0.5) + rails_stdout_logging (0.0.5) railties (4.2.7) actionpack (= 4.2.7) activesupport (= 4.2.7) @@ -222,8 +228,10 @@ DEPENDENCIES minitest-reporters omniauth omniauth-github + pg pry rails (= 4.2.7) + rails_12factor sass-rails (~> 5.0) sdoc (~> 0.4.0) simplecov From cb85654a4bcb7035cb540552567928da41207474 Mon Sep 17 00:00:00 2001 From: Miriam Cortes Date: Fri, 28 Oct 2016 13:40:15 -0700 Subject: [PATCH 190/191] seeds --- seeds_csvs/product_categories.csv | 6 +++--- seeds_csvs/products.csv | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/seeds_csvs/product_categories.csv b/seeds_csvs/product_categories.csv index 2e748fef5d..6e970fbe73 100644 --- a/seeds_csvs/product_categories.csv +++ b/seeds_csvs/product_categories.csv @@ -86,9 +86,9 @@ 88,1,36 89,4,36 90,5,36 -91,7,37 -92,10,37 -93,5,37 +91,5,37 +92,9,37 +93,2,37 94,9,38 95,2,38 96,5,38 diff --git a/seeds_csvs/products.csv b/seeds_csvs/products.csv index 5a4c1cd8e6..534b63766f 100644 --- a/seeds_csvs/products.csv +++ b/seeds_csvs/products.csv @@ -32,7 +32,7 @@ 32,Uni the Unicorn,"What's white, gold, and rainbow all over? Uni the Unicorn! You'll love snuggling her plushy bod. Kiss her on the muzzle and you might even catch her smiling at you.",791,unicorn_animal.jpg,10,9 33,View Master,"The original virtual reality device is back and ready for you to explore distant lands and funny memes with the pull of a trigger. Choose from a variety of film discs including bald cats, tiny apartments, and accidental photos of the floor.",1594,view_master.jpg,10,9 34,Boxed Water,"Boxed water is better. Don't believe us? Try it for yourself. Drinking water out of cardboard carton will leave you feeling refreshed and oddly nostalgic for your elementary school cafeteria. It's an emotion fusion we guarantee you'll love. Please don't operate heavy machinery after drinking boxed water.",299,water.jpg,10,9 -35,Engagement Ring,"Have your S.O. saying 'Oh Yes' with this 'hue'-tiful rainbow engagement ring. You'll love watching her friends smile and nod politely when they ask to see her ring.",9999,wedding-ring.jpg,10,9 +35,Engagement Ring,"Have your S.O. saying 'Oh Yes' with this 'hue'-tiful rainbow engagement ring. You'll love watching her friends smile and nod politely when they ask to see her ring.",9999,wedding_ring.jpg,10,9 36,Rainbow Hair,"Win friends and influence people with this psychedelic rainbow wig made from real human hair.",4799,wig.jpg,10,9 37,Mum Fish and Bone Baby,"You'll love helping this Mum Fish give birth to her smiling Bone Baby. Make Bone Baby swim around or put him back in the birthing canal for more laborious fun.",1799,bone_fish.jpg,10,9 38,Techie Plush-a-nana,"Get caught in an infinite loop peeling and un-peeling this soft plush banana. You'll find yourself iterating over plush banana mechanics all day long. ",1299,fake_banana.jpg,10,9 From ac5b16d4086988a10186fe7760e96938c0c0fa2f Mon Sep 17 00:00:00 2001 From: Miriam Cortes Date: Fri, 28 Oct 2016 13:48:23 -0700 Subject: [PATCH 191/191] checkout button --- app/views/orders/checkout.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/orders/checkout.html.erb b/app/views/orders/checkout.html.erb index cbbbb5f92f..b970868285 100644 --- a/app/views/orders/checkout.html.erb +++ b/app/views/orders/checkout.html.erb @@ -31,7 +31,7 @@

      Zip Code

      <%= text_field_tag :billing_zip, nil, maxlength: 5 %> -<%= submit_tag "Submit Order", class: "btn btn-default" %> +<%= submit_tag "Submit Order", class: "btn btn-default button" %> <%end%>
      Order Status
      <%= order.id %>