From bb75ee3fc6f077d5840845d6036284da9ba970d2 Mon Sep 17 00:00:00 2001 From: Andy Zhao Date: Tue, 7 May 2019 18:25:25 -0400 Subject: [PATCH] WIP Add proper error handling when creating a listing (#2755) * Add proper error handling when creating a listing * Remove accidentally committed stylesheet * Make error text * Preserve input values if the submission is invalid --- app/assets/stylesheets/classified_listings.scss | 5 ++++- .../stylesheets/classified_listings_form.scss | 1 - .../classified_listings_controller.rb | 16 ++++++++++------ app/javascript/listings/elements/categories.jsx | 9 ++++++++- app/javascript/listings/listingForm.jsx | 2 +- app/models/classified_listing.rb | 2 +- app/views/classified_listings/_form.html.erb | 4 ++-- 7 files changed, 26 insertions(+), 13 deletions(-) delete mode 100644 app/assets/stylesheets/classified_listings_form.scss diff --git a/app/assets/stylesheets/classified_listings.scss b/app/assets/stylesheets/classified_listings.scss index ae2236fdb..69252880e 100644 --- a/app/assets/stylesheets/classified_listings.scss +++ b/app/assets/stylesheets/classified_listings.scss @@ -181,9 +181,12 @@ } .classified-errors { background: $red; - color: white; + color: $black; padding: 20px; border-radius: 3px; + h2 { + color: $black; + } } label { display: inline-block; diff --git a/app/assets/stylesheets/classified_listings_form.scss b/app/assets/stylesheets/classified_listings_form.scss deleted file mode 100644 index d73a900db..000000000 --- a/app/assets/stylesheets/classified_listings_form.scss +++ /dev/null @@ -1 +0,0 @@ -@import 'variables'; diff --git a/app/controllers/classified_listings_controller.rb b/app/controllers/classified_listings_controller.rb index 682d42f84..7725334b4 100644 --- a/app/controllers/classified_listings_controller.rb +++ b/app/controllers/classified_listings_controller.rb @@ -46,12 +46,16 @@ class ClassifiedListingsController < ApplicationController @classified_listing.bumped_at = Time.current @classified_listing.published = true @classified_listing.organization_id = current_user.organization_id if @org - return unless @classified_listing.save - - clear_listings_cache - credits.limit(@number_of_credits_needed).update_all(spent: true) - @classified_listing.index! - redirect_to "/listings" + if @classified_listing.save + clear_listings_cache + credits.limit(@number_of_credits_needed).update_all(spent: true) + @classified_listing.index! + redirect_to "/listings" + else + @credits = current_user.credits.where(spent: false) + @classified_listing.cached_tag_list = classified_listing_params[:tag_list] + render :new + end end def update diff --git a/app/javascript/listings/elements/categories.jsx b/app/javascript/listings/elements/categories.jsx index fbcd7145d..d8f399a0e 100644 --- a/app/javascript/listings/elements/categories.jsx +++ b/app/javascript/listings/elements/categories.jsx @@ -3,8 +3,14 @@ import { h, Component } from 'preact'; class Categories extends Component { options = () => { - const { categoriesForSelect } = this.props + const { categoriesForSelect, category } = this.props return categoriesForSelect.map(array => { + // array example: ["Education/Courses (1 Credit)", "education"] + if(category === array[1]) { + return( + + ) + } return( ) @@ -51,6 +57,7 @@ class Categories extends Component { Categories.propTypes = { categoriesForSelect: PropTypes.array.isRequired, categoriesForDetails: PropTypes.array.isRequired, + category: PropTypes.string.isRequired, onChange: PropTypes.func.isRequired, } diff --git a/app/javascript/listings/listingForm.jsx b/app/javascript/listings/listingForm.jsx index 207bbe9cb..b096fcfd6 100644 --- a/app/javascript/listings/listingForm.jsx +++ b/app/javascript/listings/listingForm.jsx @@ -47,7 +47,7 @@ export default class ListingForm extends Component {
<BodyMarkdown defaultValue={bodyMarkdown} onChange={linkState(this, 'bodyMarkdown')} /> - <Categories categoriesForSelect={categoriesForSelect} categoriesForDetails={categoriesForDetails} onChange={linkState(this, 'category')} /> + <Categories categoriesForSelect={categoriesForSelect} categoriesForDetails={categoriesForDetails} onChange={linkState(this, 'category')} category={category} /> <Tags defaultValue={tagList} category={category} onInput={linkState(this, 'tagList')} /> {/* add contact via connect checkbox later */} </div> diff --git a/app/models/classified_listing.rb b/app/models/classified_listing.rb index 5b48fa8e0..20323a0b9 100644 --- a/app/models/classified_listing.rb +++ b/app/models/classified_listing.rb @@ -89,7 +89,7 @@ class ClassifiedListing < ApplicationRecord end def restrict_markdown_input - errors.add(:body_markdown, "has too many linebreaks. No no more than 12 allowed.") if body_markdown.to_s.scan(/(?=\n)/).count > 12 + errors.add(:body_markdown, "has too many linebreaks. No more than 12 allowed.") if body_markdown.to_s.scan(/(?=\n)/).count > 12 errors.add(:body_markdown, "is not allowed to include images.") if body_markdown.to_s.include?("![") errors.add(:body_markdown, "is not allowed to include liquid tags.") if body_markdown.to_s.include?("{% ") end diff --git a/app/views/classified_listings/_form.html.erb b/app/views/classified_listings/_form.html.erb index ad1823716..dbe22080e 100644 --- a/app/views/classified_listings/_form.html.erb +++ b/app/views/classified_listings/_form.html.erb @@ -6,7 +6,7 @@ <div class="classified-form-inner"> <% if classified_listing.errors.any? %> <div class="classified-errors"> - <h2><%= pluralize(classified_listing.errors.count, "error") %> prohibited this classified_listing from being saved:</h2> + <h2><%= pluralize(classified_listing.errors.count, "error") %> prohibited this listing from being saved:</h2> <ul> <% classified_listing.errors.full_messages.each do |message| %> @@ -16,7 +16,7 @@ </div> <% end %> <div id="listingform-data" - data-listing="<%= classified_listing.to_json(only: %i[id title slug cached_tag_list]) %>" + data-listing="<%= classified_listing.to_json(only: %i[id title body_markdown category cached_tag_list]) %>" data-organizations="<%= @organizations.to_json %>" data-categories-for-select="<%= ClassifiedListing.select_options_for_categories.to_json %>" data-categories-for-details="<%= ClassifiedListing.categories_available.transform_values{ |value_hash| value_hash.except(:cost) }.values.to_json %>"