From d6c65a16264b687950a085e8a25eaa343403831f Mon Sep 17 00:00:00 2001 From: George Vinogradov Date: Fri, 20 Jul 2012 20:06:31 +0400 Subject: [PATCH] [issue #565] Added feedback form. * Added web pages to send request * Added mailer to send feedback message. --- app/assets/images/check.png | Bin 0 -> 1122 bytes app/assets/images/feedback.png | Bin 0 -> 60596 bytes app/assets/stylesheets/design/custom.scss | 138 ++++++++++++++++++ app/controllers/contacts_controller.rb | 22 +++ app/controllers/pages_controller.rb | 1 + app/helpers/application_helper.rb | 2 + app/mailers/feedback_mailer.rb | 38 +++++ app/models/feedback.rb | 108 ++++++++++++++ app/views/contacts/new.html.haml | 44 ++++++ app/views/contacts/sended.html.haml | 8 + .../feedback_form_send.html.haml | 1 + .../feedback_form_send.text.erb | 1 + config/locales/models/contact.en.yml | 32 ++++ config/locales/models/contact.ru.yml | 32 ++++ config/routes.rb | 11 +- 15 files changed, 435 insertions(+), 3 deletions(-) create mode 100644 app/assets/images/check.png create mode 100644 app/assets/images/feedback.png create mode 100644 app/controllers/contacts_controller.rb create mode 100644 app/mailers/feedback_mailer.rb create mode 100644 app/models/feedback.rb create mode 100644 app/views/contacts/new.html.haml create mode 100644 app/views/contacts/sended.html.haml create mode 100644 app/views/feedback_mailer/feedback_form_send.html.haml create mode 100644 app/views/feedback_mailer/feedback_form_send.text.erb create mode 100644 config/locales/models/contact.en.yml create mode 100644 config/locales/models/contact.ru.yml diff --git a/app/assets/images/check.png b/app/assets/images/check.png new file mode 100644 index 0000000000000000000000000000000000000000..4f53a153ac2d7deeb9e6c61a98a03226ed69d85c GIT binary patch literal 1122 zcmaJ=OH30%7+zYbihzxe19%x%5nt`j7E0}gN*~)o6PIAAkr)$QcBio7KG+@X!o^}j zQcN@)jq!o;hKa`Lp+3+HCVDaPqQ+x2dNPI>BYJWcDSEJOGCT86zVG{=Gu_wQ-B8zD zM^RKmx`)q@eIr@*>pbK?AOG}$Y)v>hfcy0v&Wk3ZVzNGnKw1@tPzH(e_~;ANNl|WE z$qwKF;SeY3s$X<4ep@vNo1!|qY(tbr5C(&2NYNtnmq$-&pvV#WXi$KHkwC*r&xDEk zCwjBe#E2A@>8^vI)8>ePim(W5^|WSjc7$Hm<;dB&W@xYs!6Om+cTfXDA4upX0zp6Y zNw5Qg4%W}MwTD8X{U88Y$iM)@27GLYYYT7?f|ZXZ-b^{iW%$&JFJeXLVT=uqVeF*R&V^vnO zR?0*Q#@M34uzu*IQ~?UY|Dme7ineeD{fYOV!d74!K6@&C|^{3rl;wUA5&m3#W4K@{j1_EyYmHDAzMHweCVZ`na+9dD4zN ze*o9VFDECLp!b%0F$gYt%1>c>=H8LQlE-^gx;x5b-*opUX9Q?<{<5y>z|R#kP6B$LDXj zww_(P@T}xo6Q287C~Xp+c#0>yH=EXQGxep7-!}CYd~@9Fba{_?|D>C$@lY+@E!)l; RuMRt}KAr64Z^uub`vr%?Yw7?1 literal 0 HcmV?d00001 diff --git a/app/assets/images/feedback.png b/app/assets/images/feedback.png new file mode 100644 index 0000000000000000000000000000000000000000..5cc0222136c9705fc4a967e909af83b20e5a5f09 GIT binary patch literal 60596 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%0AWB% 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 b$FsT94jb=*!x`iRy=O9#ieD?l4gLNHs$oOw literal 0 HcmV?d00001 diff --git a/app/assets/stylesheets/design/custom.scss b/app/assets/stylesheets/design/custom.scss index ccf97e3d0..ea44b0b99 100644 --- a/app/assets/stylesheets/design/custom.scss +++ b/app/assets/stylesheets/design/custom.scss @@ -1172,3 +1172,141 @@ table.tablesorter tr td.no_results { text-align: center; } /* end */ + +article div.all { + width: 860px; +} + +div.inner-columns { + width: 100%; + height: auto; + display: block; +} + +div.inner-columns:after { + clear: both; + content: "."; + display: block; + height: 0; + visibility: hidden; +} + +div.inner-columns.equal section { + width: 430px; + float: left; +} + +section.first div { + width: 415px; +} + +form.inline_errors span.error { + display: inline-block; + color: #FF5050; +} + +div.form-actions { + text-align: right; + padding-bottom: 5px; +} + +div.form-actions .button { + margin-right: 50px; +} + +dl.form, div.form-actions { + margin: 15px 0; +} + +dl.form > dt { + margin: 0 0 6px; +} + +dl.form > dt label { + color: #333333; + font-size: 14px; + font-weight: bold; + position: relative; +} + +dl.form > dd { + margin: 0; + padding: 0; + border: 0, none; +} + +dl.form > dd > input[type="text"], +dl.form > dd > input[type="password"], +dl.form > dd > textarea { + width: 350px; + border: 1px solid #A0A0A0; + border-radius: 4px; + padding: 5px; + font-family: Tahoma, Geneva, Helvetica, sans-serif; + font-size: 12px; +} + +dl.form > dd > input.error[type="text"], +dl.form > dd > input.error[type="password"], +dl.form > dd > textarea.error { + border-color: #FF8080; +} + +dl.form > dd > input[type="text"], +dl.form > dd > input[type="password"] { + height: 16px; +} + +dl.form > dd > textarea { + height: 110px; +} + +ul.checklist { + font-size: 12px; + font-weight: bold; + margin: 20px 0; + padding: 0; +} + +ul.checklist li { + background: image-url("check.png") no-repeat scroll 0 2px transparent; + list-style-type: none; + margin: 15px 0; + padding-left: 25px; +} + +div.all.feedback_sended { + background: image-url("feedback.png") no-repeat scroll 49% 0 transparent; + height: 500px; + text-align: center; +} + +article div.all.feedback_sended h1 { + font-size: 48px; + font-weight: normal; + margin: 165px 0 0; + padding: 0; +} + +article div.all.feedback_sended h2 { + font-size: 18px; + font-weight: normal; + margin: 5px 0 0; + padding: 0; +} +article div.all.feedback_sended p.pages { + margin-top: 70px; + width: 280px; +} + +article div.all.feedback_sended p.search { + margin-top: 80px; + width: 230px; +} + +article div.all.feedback_sended p { + font-size: 14px; + margin: 0 auto; + padding: 0; + text-align: center; +} diff --git a/app/controllers/contacts_controller.rb b/app/controllers/contacts_controller.rb new file mode 100644 index 000000000..cfff89a41 --- /dev/null +++ b/app/controllers/contacts_controller.rb @@ -0,0 +1,22 @@ +# -*- encoding : utf-8 -*- +class ContactsController < ApplicationController + + def new + @form = Feedback.new(current_user) + end + + def create + @form = Feedback.new(params[:feedback]) + if @form.perform_send + flash[:notice] = I18n.t("flash.contact.success") + redirect_to sended_contact_path + else + flash[:error] = I18n.t("flash.contact.error") + render :new and return + end + end + + def sended + end + +end diff --git a/app/controllers/pages_controller.rb b/app/controllers/pages_controller.rb index bcb399cc5..ebf5ed17c 100644 --- a/app/controllers/pages_controller.rb +++ b/app/controllers/pages_controller.rb @@ -24,4 +24,5 @@ class PagesController < ApplicationController def tos end + end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 86f9d69cd..26ed84332 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -14,6 +14,8 @@ module ApplicationHelper 'right bigpadding' when controller_name == 'platforms' && action_name == 'clone' 'right middlepadding' + when controller_name == 'contacts' && action_name == 'sended' + 'all feedback_sended' else content_for?(:sidebar) ? 'right' : 'all' end diff --git a/app/mailers/feedback_mailer.rb b/app/mailers/feedback_mailer.rb new file mode 100644 index 000000000..4b86cf3f8 --- /dev/null +++ b/app/mailers/feedback_mailer.rb @@ -0,0 +1,38 @@ +class FeedbackMailer < ActionMailer::Base + FBM_CONFIG = APP_CONFIG['feedback'] + + default :to => FBM_CONFIG['email'], + :cc => FBM_CONFIG['cc'], + :bcc => FBM_CONFIG['bcc'] + + include Resque::Mailer # send email async + + def feedback_form_send(form_data) + @data = Feedback.new(form_data) + + from = "#{@data.name} <#{@data.email}>" + subj = prepare_subject(@data.subject) + + mail :from => from, :subject => subj + end + + protected + + def prepare_subject(subject) + res = '' + res << affix(FBM_CONFIG['subject_prefixes']) + res << subject + res << affix(FBM_CONFIG['subject_postfixes']) + # WOODOO magic. Change all space sequences to one space than remove trailing spaces. + res.gsub(/\s+/, ' ').gsub(/^\s|\s$/, '') + res + end + + def affix(affixes) + res = ' ' + res << Array(affixes).map{|e| "[#{e}]"}.join + res << ' ' + res + end + +end diff --git a/app/models/feedback.rb b/app/models/feedback.rb new file mode 100644 index 000000000..5aa73123f --- /dev/null +++ b/app/models/feedback.rb @@ -0,0 +1,108 @@ +# This class is based on +# https://github.com/rails/rails/blob/4da6e1cce2833474034fda0cbb67b2cc35e828da/activerecord/lib/active_record/validations.rb + +class Feedback + include ActiveModel::Conversion + include ActiveModel::Validations + include ActiveModel::Serializers::JSON + include ActiveModel::MassAssignmentSecurity + extend ActiveModel::Naming + + attr_accessor :name, :email, :subject, :message + + attr_accessible :name, :email, :subject, :message + + validates :name, :presence => true + validates :email, :presence => true, + :format => { :with => /\A[^@]+@([^@\.]+\.)+[^@\.]+\z/, :allow_blank => false } + validates :subject, :presence => true + validates :message, :presence => true + + def initialize(args = {}, options = {}) + return args.dup if args.is_a? Feedback + if args.respond_to? :name and args.respond_to? :email + self.name, self.email = args.name, args.email + elsif args.respond_to? :each_pair + sanitize_for_mass_assignment(args, options[:as]).each_pair do |k, v| + send("#{k}=", v) + end + else + return false + end + end + + # FIXME: Maybe rename to `save`? + def perform_send(options = {}) + perform_validations(options) ? real_send : false + end + + def perform_send!(options={}) + perform_validations(options) ? real_send : raise(ActiveRecord::RecordInvalid.new(self)) + end + + def new_record? + true + end + + def persisted? + false + end + + def message_with_links + message.to_s.dup.auto_link + end + + def attributes + %w{ name email subject message }.inject({}) do |h, e| + h.merge(e => send(e)) + end + end + + def to_s + str = "#<#{self.class} " + str += %w{ name email subject message }.inject('') do |s, e| + s << "#{e}: #{ send(e).inspect }, "; s + end + str[-2] = '>' + str[0..-1] + end + + class << self + + def create(attributes = nil, options = {}, &block) + if attributes.is_a?(Array) + attributes.collect { |attr| create!(attr, options, &block) } + else + object = new(attributes, options) + yield(object) if block_given? + object.perform_send + object + end + end + + def create!(attributes = nil, options = {}, &block) + if attributes.is_a?(Array) + attributes.collect { |attr| create!(attr, options, &block) } + else + object = new(attributes, options) + yield(object) if block_given? + object.perform_send! + object + end + end + + end + + protected + + def real_send + FeedbackMailer.feedback_form_send(self).deliver + end + + def perform_validations(options={}) + perform_validation = options[:validate] != false + perform_validation ? valid?(options[:context]) : true + end + +end +Feedback.include_root_in_json = false diff --git a/app/views/contacts/new.html.haml b/app/views/contacts/new.html.haml new file mode 100644 index 000000000..492ad83cf --- /dev/null +++ b/app/views/contacts/new.html.haml @@ -0,0 +1,44 @@ +%h1= t("layout.contact.header") +%p= t("layout.contact.subheader") + +%hr + +.inner-columns.equal + %section.first + %div + = form_for @form, :url => contact_path, :html => {:class => 'inline_errors'} do |f| + + %dl.form + %dt= f.label :name, t("activerecord.attributes.user.name") + %dd + = f.text_field :name, :placeholder => t("layout.contact.placeholders.name"), + :class => @form.errors.messages[:name].present? ? 'error' : '' + + %dl.form + %dt= f.label :email, t("activerecord.attributes.user.email") + %dd + = f.text_field :email, :placeholder => t("layout.contact.placeholders.email"), + :class => @form.errors.messages[:email].present? ? 'error' : '' + + %dl.form + %dt= f.label :subject, t("layout.contact.subject") + %dd + = f.text_field :subject, :placeholder => t("layout.contact.placeholders.subject"), + :class => @form.errors.messages[:subject].present? ? 'error' : '' + + %dl.form + %dt= f.label :message, t("layout.contact.message") + %dd + = f.text_area :message, :placeholder => t("layout.contact.placeholders.message"), + :class => @form.errors.messages[:message].present? ? 'error' : '' + + .form-actions + = f.submit t("layout.contact.send_request"), :class => 'button' + + %section.last + %div + %h3= t("layout.contact.info.header") + + %ul.checklist + - t("layout.contact.info.items").try(:each) do |item| + %li= item diff --git a/app/views/contacts/sended.html.haml b/app/views/contacts/sended.html.haml new file mode 100644 index 000000000..b7575091c --- /dev/null +++ b/app/views/contacts/sended.html.haml @@ -0,0 +1,8 @@ +%h1= t("layout.contact.thanks") +%h2= t("layout.contact.thanks_2") + +%p.pages + = t("layout.contact.open_pages") +%p.search + = t("layout.contact.use_search") +.both diff --git a/app/views/feedback_mailer/feedback_form_send.html.haml b/app/views/feedback_mailer/feedback_form_send.html.haml new file mode 100644 index 000000000..1eaa6bdac --- /dev/null +++ b/app/views/feedback_mailer/feedback_form_send.html.haml @@ -0,0 +1 @@ += simple_format @data.message_with_links diff --git a/app/views/feedback_mailer/feedback_form_send.text.erb b/app/views/feedback_mailer/feedback_form_send.text.erb new file mode 100644 index 000000000..de79d63ee --- /dev/null +++ b/app/views/feedback_mailer/feedback_form_send.text.erb @@ -0,0 +1 @@ +<%= @data.message.chomp %> diff --git a/config/locales/models/contact.en.yml b/config/locales/models/contact.en.yml new file mode 100644 index 000000000..66d2d4b23 --- /dev/null +++ b/config/locales/models/contact.en.yml @@ -0,0 +1,32 @@ +en: + layout: + contact: + header: Contact us + subheader: We’re here to help with any questions or comments. + send_request: Send Request + + thanks: Thanks for feedback! + thanks_2: Your request in progress. + + open_pages: Please, continue your work + use_search: Try to find something cool? + + placeholders: + name: Your name + email: user@example.com + subject: I want to say about ... + message: Problem description + + subject: Subject + message: Message + + info: + header: What's in a great support request? + items: + - "Be succinct, we'll ask if we need more info" + - "The name of the user, repository, build list etc you’re having troubles with" + + flash: + contact: + success: Request successfully sended + error: Sending request failed diff --git a/config/locales/models/contact.ru.yml b/config/locales/models/contact.ru.yml new file mode 100644 index 000000000..97bc3f908 --- /dev/null +++ b/config/locales/models/contact.ru.yml @@ -0,0 +1,32 @@ +ru: + layout: + contact: + header: Свяжитесь с нами + subheader: Мы готовы помочь вам с любыми вопросами и комментариями. + send_request: Отправить запрос + + thanks: Спасибо за сообщение! + thanks_2: Мы уже начали работу. + + open_pages: Продолжайте работу с системой + use_search: Воспользуйтесь поиском + + placeholders: + name: Ваше имя + email: user@example.com + subject: Я хочу сказать о... + message: Описание проблемы + + subject: Тема сообщения + message: Сообщение + + info: + header: Каким должен быть хороший запрос? + items: + - "Будьте кратки. Если нам понадобится дополнительная информация, мы ее запросим." + - "Укажите, с чем у вас возникла проблема: имя пользователя, репозиторий, сборочный лист и т.д." + + flash: + contact: + success: Запрос успешно отправлен + error: Не удалось отправить запрос diff --git a/config/routes.rb b/config/routes.rb index 62c3029d3..5dd55a76d 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,5 +1,10 @@ # -*- encoding : utf-8 -*- Rosa::Application.routes.draw do + resource :contact, :only => [:new, :create, :sended] do + get '/' => 'contacts#new' + get :sended + end + devise_scope :users do get '/users/auth/:provider' => 'users/omniauth_callbacks#passthru' end @@ -7,9 +12,9 @@ Rosa::Application.routes.draw do resources :search, :only => [:index] - get '/forbidden' => 'pages#forbidden', :as => 'forbidden' - get '/terms-of-service' => 'pages#tos', :as => 'tos' - get '/tour/:id' => 'pages#tour_inside', :as => 'tour_inside', :id => /projects|sources|builds/ + get '/forbidden' => 'pages#forbidden', :as => 'forbidden' + get '/terms-of-service' => 'pages#tos', :as => 'tos' + get '/tour/:id' => 'pages#tour_inside', :as => 'tour_inside', :id => /projects|sources|builds/ get '/activity_feeds.:format' => 'activity_feeds#index', :as => 'atom_activity_feeds', :format => /atom/ if APP_CONFIG['anonymous_access']