homepage outfit features

This commit is contained in:
Emi Matchu 2014-09-10 15:38:26 -05:00
parent f11f6374da
commit 04a328e6ee
7 changed files with 104 additions and 28 deletions

View file

@ -7,6 +7,8 @@ var preview_el = $('#pet-preview'),
response_el = preview_el.find('span'),
name_el = $('#main-pet-name');
var defaultPreviewUrl = img_el.attr('src');
preview_el.click(function () {
Preview.Job.current.visit();
});
@ -42,14 +44,32 @@ var Preview = {
}
}
$.getJSON('http://notables.openneo.net/api/1/days/ago/1?callback=?', function (response) {
var notables = response.notables;
var i = Math.floor(Math.random() * notables.length);
Preview.Job.fallback = new Preview.Job.Name(notables[i].petName);
if(!Preview.Job.current) {
Preview.Job.fallback.setAsCurrent();
}
});
function loadNotable() {
$.getJSON('http://notables.openneo.net/api/1/days/ago/1?callback=?', function (response) {
var notables = response.notables;
var i = Math.floor(Math.random() * notables.length);
Preview.Job.fallback = new Preview.Job.Name(notables[i].petName);
if(!Preview.Job.current) {
Preview.Job.fallback.setAsCurrent();
}
});
}
function loadFeature() {
$.getJSON('/donations/features', function(features) {
if (features.length > 0) {
var feature = features[Math.floor(Math.random() * features.length)];
Preview.Job.fallback = new Preview.Job.Feature(feature);
if (!Preview.Job.current) {
Preview.Job.fallback.setAsCurrent();
}
} else {
loadNotable();
}
});
}
loadFeature();
Preview.Job = function (key, base) {
var job = this,
@ -61,8 +81,12 @@ Preview.Job = function (key, base) {
// lol lazy code for prank image :P
return "http://swfimages.impress.openneo.net" +
"/biology/000/000/0-2/" + key.substr(2) + "/300x300.png";
} else {
} else if (base === 'cp' || base === 'cpn') {
return petImage(base + '/' + key, quality);
} else if (base === 'url') {
return key;
} else {
throw new Error("unrecognized image base " + base);
}
}
@ -82,6 +106,10 @@ Preview.Job = function (key, base) {
Preview.Job.current = job;
load();
}
this.notFound = function() {
Preview.notFound('pet-not-found');
}
}
Preview.Job.Name = function (name) {
@ -102,6 +130,25 @@ Preview.Job.Hash = function (hash) {
}
}
Preview.Job.Feature = function(feature) {
Preview.Job.apply(this, [feature.outfit_image_url, 'url']);
this.name = "Thanks for donating, " + feature.donor_name + "!"; // TODO: i18n
this.visit = function() {
window.location = '/donate';
}
this.notFound = function() {
// The outfit thumbnail hasn't generated or is missing or something.
// Let's fall back to a boring image for now.
var boring = new Preview.Job.Feature({
donor_name: feature.donor_name,
outfit_image_url: defaultPreviewUrl
});
boring.setAsCurrent();
}
}
$(function () {
var previewWithNameTimeout;
@ -127,7 +174,7 @@ $(function () {
}).error(function () {
if(Preview.Job.current.loading) {
Preview.Job.loading = false;
Preview.notFound('pet-not-found');
Preview.Job.current.notFound();
}
});

View file

@ -73,6 +73,10 @@ body.static-donate
text-align: center
width: $outfit-banner-inner-width
img
height: $outfit-inner-height
width: $outfit-inner-width
#fine-print
font-size: 85%
margin-top: 2em

View file

@ -0,0 +1,8 @@
class DonationFeaturesController < ApplicationController
def index
# TODO: scope by campaign?
@features = DonationFeature.includes(:donation).includes(:outfit).
where('outfit_id IS NOT NULL')
render json: @features
end
end

View file

@ -1,3 +1,6 @@
class StaticController < ApplicationController
def donate
# TODO: scope by campaign?
@donations = Donation.includes(features: :outfit).order('created_at DESC')
end
end

View file

@ -4,6 +4,12 @@ class DonationFeature < ActiveRecord::Base
validates :outfit, presence: true, if: :outfit_id?
delegate :donor_name, to: :donation
def as_json(options={})
{donor_name: donor_name, outfit_image_url: outfit.image.medium.url}
end
def outfit_url=(outfit_url)
self.outfit_id = outfit_url.split('/').last rescue nil
end

View file

@ -7,7 +7,7 @@
toward our hosting costs this year. Thanks so much!
= form_tag donations_path, method: 'POST', id: 'donation-form',
'data-checkout-image' => image_path('default-preview.png'),
'data-checkout-image' => image_path('default_preview.png'),
'data-checkout-publishable-key' => Rails.configuration.stripe[:publishable_key] do
= hidden_field_tag 'donation[stripe_token]'
= hidden_field_tag 'donation[donor_email]'
@ -63,16 +63,15 @@
%h2 Thanks to our lovely donors!
%ul#outfits
= Outfit.includes(:user).find_each do |outfit| # TODO: donors only
= outfit_li_for(outfit) do
- if outfit.image?
= link_to image_tag(outfit.image.small.url), outfit
%header
- if outfit.user
Thanks, #{outfit.user.name}!
- @donations.each do |donation|
- donation.features.each do |feature|
%li
- if feature.outfit_id? && feature.outfit.image?
= link_to image_tag(feature.outfit.image.small.url), feature.outfit
- else
Thanks, anonymous!
= image_tag 'default_preview.png'
%header Thanks, #{donation.donor_name.presence || 'Anonymous'}!
#fine-print
%h2 Some notes on featured outfits
@ -97,14 +96,19 @@
We reserve the right to refuse to post any outfit for any reason, and we
reserve the right to remove any previously posted outfit for any reason.
(That said, so long as your outfit is appropriate for Neopians of all ages,
we don't expect any trouble.)
Same goes for the name attached to your donation.
(That said, we intend to allow most any name and outfit that are
appropriate for Neopians of all ages.)
If you change your mind about donating, no worries: we'll refund any
donation within 30 days of the moment you donated.
(Please don't be that person who repeatedly donates and refunds.
We'll stop posting your outfits
<img src="http://images.neopets.com/neoboards/smilies/tongue.gif" />)
good-faith donation within 60 days of the day you donated.
(For example, changing your mind and requesting a refund *is* acting in
good faith, and we'd love to help you out.
Posting an obscene outfit then requesting a refund once we take it down is
*not* acting in good faith, and we don't want to encourage that behavior
<img src="http://images.neopets.com/neoboards/smilies/tongue.gif" />
We determine "good faith" at our sole discretion—not limited to those
examples—but we're generally pretty understanding.)
**TL;DR: We love to help and acknowledge our good-faith donors,
but reserve the right not to do those things,

View file

@ -78,7 +78,11 @@ OpenneoImpressItems::Application.routes.draw do
only: [:create, :destroy]
end
resources :donations, only: [:create, :show, :update]
resources :donations, only: [:create, :show, :update] do
collection do
resources :donation_features, path: 'features', only: [:index]
end
end
match 'users/current-user/closet' => 'closet_hangers#index', :as => :your_items