fullstack-contacts 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Gemfile +8 -0
- data/Gemfile.lock +94 -0
- data/README.md +103 -0
- data/Rakefile +53 -0
- data/VERSION +1 -0
- data/app/controllers/admin/contacts_controller.rb +11 -0
- data/app/helpers/contacts_helper.rb +16 -0
- data/app/mailers/.gitkeep +0 -0
- data/app/mailers/contacts_mailer.rb +15 -0
- data/app/views/admin/contacts/_contacts_dashboard_widget.html.erb +9 -0
- data/app/views/admin/contacts/_contacts_table.html.erb +41 -0
- data/app/views/admin/contacts/index.html.erb +6 -0
- data/app/views/admin/contacts/show.html.erb +20 -0
- data/config/locales/en.yml +19 -0
- data/config/locales/it.yml +18 -0
- data/config/routes.rb +5 -0
- data/fullstack-contacts.gemspec +71 -0
- data/lib/fullstack-contacts.rb +24 -0
- data/lib/fullstack/contacts.rb +8 -0
- data/lib/fullstack/contacts/actions.rb +28 -0
- data/lib/fullstack/contacts/engine.rb +9 -0
- data/lib/generators/fullstack/contacts/install_generator.rb +63 -0
- data/lib/generators/fullstack/contacts/templates/app/models/contact.rb +47 -0
- data/lib/generators/fullstack/contacts/templates/app/views/contacts_mailer/confirmation.html.erb +1 -0
- data/lib/generators/fullstack/contacts/templates/app/views/contacts_mailer/notify.html.erb +8 -0
- data/lib/generators/fullstack/contacts/templates/app/views/fullstack/contacts/_form.html.erb +13 -0
- data/lib/generators/fullstack/contacts/templates/app/views/fullstack/contacts/_success.html.erb +3 -0
- metadata +124 -0
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,94 @@
|
|
1
|
+
GEM
|
2
|
+
remote: http://rubygems.org/
|
3
|
+
specs:
|
4
|
+
actionmailer (3.2.11)
|
5
|
+
actionpack (= 3.2.11)
|
6
|
+
mail (~> 2.4.4)
|
7
|
+
actionpack (3.2.11)
|
8
|
+
activemodel (= 3.2.11)
|
9
|
+
activesupport (= 3.2.11)
|
10
|
+
builder (~> 3.0.0)
|
11
|
+
erubis (~> 2.7.0)
|
12
|
+
journey (~> 1.0.4)
|
13
|
+
rack (~> 1.4.0)
|
14
|
+
rack-cache (~> 1.2)
|
15
|
+
rack-test (~> 0.6.1)
|
16
|
+
sprockets (~> 2.2.1)
|
17
|
+
activemodel (3.2.11)
|
18
|
+
activesupport (= 3.2.11)
|
19
|
+
builder (~> 3.0.0)
|
20
|
+
activerecord (3.2.11)
|
21
|
+
activemodel (= 3.2.11)
|
22
|
+
activesupport (= 3.2.11)
|
23
|
+
arel (~> 3.0.2)
|
24
|
+
tzinfo (~> 0.3.29)
|
25
|
+
activeresource (3.2.11)
|
26
|
+
activemodel (= 3.2.11)
|
27
|
+
activesupport (= 3.2.11)
|
28
|
+
activesupport (3.2.11)
|
29
|
+
i18n (~> 0.6)
|
30
|
+
multi_json (~> 1.0)
|
31
|
+
arel (3.0.2)
|
32
|
+
builder (3.0.4)
|
33
|
+
erubis (2.7.0)
|
34
|
+
git (1.2.5)
|
35
|
+
hike (1.2.1)
|
36
|
+
i18n (0.6.1)
|
37
|
+
jeweler (1.8.4)
|
38
|
+
bundler (~> 1.0)
|
39
|
+
git (>= 1.2.5)
|
40
|
+
rake
|
41
|
+
rdoc
|
42
|
+
journey (1.0.4)
|
43
|
+
json (1.7.6)
|
44
|
+
mail (2.4.4)
|
45
|
+
i18n (>= 0.4.0)
|
46
|
+
mime-types (~> 1.16)
|
47
|
+
treetop (~> 1.4.8)
|
48
|
+
mime-types (1.19)
|
49
|
+
multi_json (1.5.0)
|
50
|
+
polyglot (0.3.3)
|
51
|
+
rack (1.4.4)
|
52
|
+
rack-cache (1.2)
|
53
|
+
rack (>= 0.4)
|
54
|
+
rack-ssl (1.3.3)
|
55
|
+
rack
|
56
|
+
rack-test (0.6.2)
|
57
|
+
rack (>= 1.0)
|
58
|
+
rails (3.2.11)
|
59
|
+
actionmailer (= 3.2.11)
|
60
|
+
actionpack (= 3.2.11)
|
61
|
+
activerecord (= 3.2.11)
|
62
|
+
activeresource (= 3.2.11)
|
63
|
+
activesupport (= 3.2.11)
|
64
|
+
bundler (~> 1.0)
|
65
|
+
railties (= 3.2.11)
|
66
|
+
railties (3.2.11)
|
67
|
+
actionpack (= 3.2.11)
|
68
|
+
activesupport (= 3.2.11)
|
69
|
+
rack-ssl (~> 1.3.2)
|
70
|
+
rake (>= 0.8.7)
|
71
|
+
rdoc (~> 3.4)
|
72
|
+
thor (>= 0.14.6, < 2.0)
|
73
|
+
rake (10.0.3)
|
74
|
+
rdoc (3.12)
|
75
|
+
json (~> 1.4)
|
76
|
+
sprockets (2.2.2)
|
77
|
+
hike (~> 1.2)
|
78
|
+
multi_json (~> 1.0)
|
79
|
+
rack (~> 1.0)
|
80
|
+
tilt (~> 1.1, != 1.3.0)
|
81
|
+
thor (0.17.0)
|
82
|
+
tilt (1.3.3)
|
83
|
+
treetop (1.4.12)
|
84
|
+
polyglot
|
85
|
+
polyglot (>= 0.3.1)
|
86
|
+
tzinfo (0.3.35)
|
87
|
+
|
88
|
+
PLATFORMS
|
89
|
+
ruby
|
90
|
+
|
91
|
+
DEPENDENCIES
|
92
|
+
bundler
|
93
|
+
jeweler (~> 1.8.4)
|
94
|
+
rails
|
data/README.md
ADDED
@@ -0,0 +1,103 @@
|
|
1
|
+
# Fullstack-contacts
|
2
|
+
|
3
|
+
Contact form and backend for fullstack-cms
|
4
|
+
|
5
|
+
---
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
|
9
|
+
``` rb
|
10
|
+
gem 'fullstack-contacts'
|
11
|
+
```
|
12
|
+
|
13
|
+
``` sh
|
14
|
+
rails g fullstack:contacts:install
|
15
|
+
```
|
16
|
+
|
17
|
+
Edit `app/models/contact.rb` to customize `Contact` model and then run:
|
18
|
+
|
19
|
+
``` rb
|
20
|
+
rails g migration:from contact && rake db:migrate
|
21
|
+
```
|
22
|
+
|
23
|
+
You may also wish to customize front-end views editing:
|
24
|
+
|
25
|
+
- `app/views/contacts_mailer/confirmation.html.erb`
|
26
|
+
- `app/views/contacts_mailer/notify.html.erb`
|
27
|
+
- `app/views/fullstack/contacts/_form.html.erb`
|
28
|
+
- `app/views/fullstack/contacts/_success.html.erb`
|
29
|
+
|
30
|
+
|
31
|
+
## Administration
|
32
|
+
|
33
|
+
Enable contacts back-end in config/initializers/fullstack.rb:
|
34
|
+
|
35
|
+
``` rb
|
36
|
+
# ...
|
37
|
+
admin.group :contacts do |g|
|
38
|
+
g.icon= "user"
|
39
|
+
g.resource :contacts
|
40
|
+
end
|
41
|
+
|
42
|
+
```
|
43
|
+
|
44
|
+
Install a widget inside your admin/dashboard to view the latest contacts:
|
45
|
+
|
46
|
+
``` erb
|
47
|
+
<%= contacts_dashboard_widget %>
|
48
|
+
```
|
49
|
+
|
50
|
+
## Usage
|
51
|
+
|
52
|
+
``` rb
|
53
|
+
class Site::SiteController < Site::BaseController
|
54
|
+
include Fullstack::Contacts::Actions
|
55
|
+
|
56
|
+
page :home, "/" do
|
57
|
+
end
|
58
|
+
|
59
|
+
page :contacts, "/contacts", :parent => :home do
|
60
|
+
@contact = Contact.new
|
61
|
+
end
|
62
|
+
|
63
|
+
action :contact, "/contact", :via => :post do
|
64
|
+
create_contact!(:success => polymorphic_path([:site, :contacts], :success => true))
|
65
|
+
end
|
66
|
+
# ...
|
67
|
+
|
68
|
+
end
|
69
|
+
```
|
70
|
+
|
71
|
+
``` rhtml
|
72
|
+
<!-- site/site/contacts.html.erb -->
|
73
|
+
|
74
|
+
<% if params[:success] %>
|
75
|
+
<%= contact_success %>
|
76
|
+
<% else %>
|
77
|
+
<%= contact_form %>
|
78
|
+
<% end %>
|
79
|
+
|
80
|
+
```
|
81
|
+
|
82
|
+
Copyright (c) 2012 mcasimir
|
83
|
+
|
84
|
+
MIT License
|
85
|
+
|
86
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
87
|
+
a copy of this software and associated documentation files (the
|
88
|
+
"Software"), to deal in the Software without restriction, including
|
89
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
90
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
91
|
+
permit persons to whom the Software is furnished to do so, subject to
|
92
|
+
the following conditions:
|
93
|
+
|
94
|
+
The above copyright notice and this permission notice shall be
|
95
|
+
included in all copies or substantial portions of the Software.
|
96
|
+
|
97
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
98
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
99
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
100
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
101
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
102
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
103
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'bundler'
|
5
|
+
begin
|
6
|
+
Bundler.setup(:default, :development)
|
7
|
+
rescue Bundler::BundlerError => e
|
8
|
+
$stderr.puts e.message
|
9
|
+
$stderr.puts "Run `bundle install` to install missing gems"
|
10
|
+
exit e.status_code
|
11
|
+
end
|
12
|
+
require 'rake'
|
13
|
+
|
14
|
+
require 'jeweler'
|
15
|
+
Jeweler::Tasks.new do |gem|
|
16
|
+
# gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
|
17
|
+
gem.name = "fullstack-contacts"
|
18
|
+
gem.homepage = "http://github.com/mcasimir/kaminari-bootstrap"
|
19
|
+
gem.license = "MIT"
|
20
|
+
gem.summary = %Q{Contact form and backend for fullstack-cms}
|
21
|
+
gem.description = %Q{Contact form and backend for fullstack-cms}
|
22
|
+
gem.email = "maurizio.cas@gmail.com"
|
23
|
+
gem.authors = ["mcasimir"]
|
24
|
+
# dependencies defined in Gemfile
|
25
|
+
end
|
26
|
+
Jeweler::RubygemsDotOrgTasks.new
|
27
|
+
|
28
|
+
|
29
|
+
task :push do
|
30
|
+
message = ENV["message"] || "commit #{Time.now}"
|
31
|
+
`git add . && git commit -a -m '#{message}' && git push`
|
32
|
+
end
|
33
|
+
|
34
|
+
task "release:patch" do
|
35
|
+
Rake::Task["gemspec"].invoke
|
36
|
+
Rake::Task["version:bump:patch"]
|
37
|
+
Rake::Task["push"].invoke
|
38
|
+
Rake::Task["release"].invoke
|
39
|
+
end
|
40
|
+
|
41
|
+
task "release:minor" do
|
42
|
+
Rake::Task["gemspec"].invoke
|
43
|
+
Rake::Task["version:bump:minor"]
|
44
|
+
Rake::Task["push"].invoke
|
45
|
+
Rake::Task["release"].invoke
|
46
|
+
end
|
47
|
+
|
48
|
+
task "release:major" do
|
49
|
+
Rake::Task["gemspec"].invoke
|
50
|
+
Rake::Task["version:bump:major"]
|
51
|
+
Rake::Task["push"].invoke
|
52
|
+
Rake::Task["release"].invoke
|
53
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.1.3
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module ContactsHelper
|
2
|
+
|
3
|
+
def contact_success
|
4
|
+
render :partial => "fullstack/contacts/success"
|
5
|
+
end
|
6
|
+
|
7
|
+
def contact_form
|
8
|
+
render :partial => "fullstack/contacts/form"
|
9
|
+
end
|
10
|
+
|
11
|
+
def contacts_dashboard_widget
|
12
|
+
contacts = Contact.order("created_at DESC").limit(5)
|
13
|
+
render :partial => "admin/contacts/contacts_dashboard_widget", :locals => { :contacts => contacts }
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
File without changes
|
@@ -0,0 +1,15 @@
|
|
1
|
+
class ContactsMailer < ActionMailer::Base
|
2
|
+
default from: "#{Settings.app.title} <no-reply@#{Settings.app.domain}>"
|
3
|
+
|
4
|
+
def confirmation(contact)
|
5
|
+
@contact = contact
|
6
|
+
mail(:to => @contact.email, :subject => I18n.t("contacts.confirmation.subject"))
|
7
|
+
end
|
8
|
+
|
9
|
+
def notify(contact)
|
10
|
+
@contact = contact
|
11
|
+
recipient = Setting.where(:key => "notifies_recipient", :group => "contacts").first.try(:value) || Settings.app.notifies_recipient
|
12
|
+
mail(:to => recipient, :subject => "#{Settings.app.domain}: #{I18n.t('contacts.contact_request_from', :from => @contact.name)}")
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
<div class="box">
|
2
|
+
<div class="box-header"><%= t("contacts.latest_contact_requests", :default => "Latest Contact Requests") %></div>
|
3
|
+
<div class="box-content">
|
4
|
+
<%= render :partial => "admin/contacts/contacts_table", :locals => { :contacts => contacts } %>
|
5
|
+
</div>
|
6
|
+
<div class="box-footer">
|
7
|
+
<%= link_to t("contacts.display_all", :default => "Display All"), admin_contacts_path %>
|
8
|
+
</div>
|
9
|
+
</div>
|
@@ -0,0 +1,41 @@
|
|
1
|
+
<table class="table table-striped table-bordered">
|
2
|
+
<tr>
|
3
|
+
<th><%= t("helpers.label.subject", :default => "Subject") %></th>
|
4
|
+
<th><%= t("helpers.label.sent_by", :default => "Sent by") %></th>
|
5
|
+
<th><%= t("helpers.label.sent_at", :default => "Sent at") %></th>
|
6
|
+
<th></th>
|
7
|
+
</tr>
|
8
|
+
|
9
|
+
<% contacts.each do |contact| %>
|
10
|
+
<% if contact.unread? %>
|
11
|
+
<tr class="info">
|
12
|
+
<% else %>
|
13
|
+
<tr>
|
14
|
+
<% end %>
|
15
|
+
<td>
|
16
|
+
<% if contact.text.present? %>
|
17
|
+
<%= truncate(contact.text, :limit => 30) %>
|
18
|
+
<% else %>
|
19
|
+
<i>(<%= t("contacts.subject_empty", :default => "Subject empty") %>)</i>
|
20
|
+
<% end %>
|
21
|
+
</td>
|
22
|
+
<td><%= contact.name %> <i>(<%= contact.email %>)</i></td><td><%= l(contact.created_at, :format => :pubdate) %></td>
|
23
|
+
<td><%= link_to t("contacts.read", :default => "Read"), admin_contact_path(contact), :rel => "facebox", :class => "read-contact-link" %></td>
|
24
|
+
</tr>
|
25
|
+
<% end %>
|
26
|
+
</table>
|
27
|
+
|
28
|
+
|
29
|
+
|
30
|
+
<% content_for :javascripts do -%>
|
31
|
+
<script type="text/javascript" charset="utf-8">
|
32
|
+
$(document).ready(function(){
|
33
|
+
|
34
|
+
$(".read-contact-link").click(function(){
|
35
|
+
$(this).closest("tr").removeClass("info");
|
36
|
+
});
|
37
|
+
|
38
|
+
});
|
39
|
+
</script>
|
40
|
+
|
41
|
+
<% end -%>
|
@@ -0,0 +1,20 @@
|
|
1
|
+
<div class="modal-header">
|
2
|
+
<h3><%= t("contacts.contact_request_from", :from => @contact.name) %></h3>
|
3
|
+
</div>
|
4
|
+
<div class="modal-body">
|
5
|
+
<dl class="dl-horizontal">
|
6
|
+
<dt><%= t("helpers.label.sent_at", :default => "Sent at") %></dt>
|
7
|
+
<dd><%= l(@contact.created_at, :format => :long) %></dd>
|
8
|
+
|
9
|
+
|
10
|
+
<dt><%= t("helpers.label.first_name", :default => "First name") %></dt>
|
11
|
+
<dd><%= @contact.first_name || "-" %></dd>
|
12
|
+
<dt><%= t("helpers.label.second_name", :default => "Second name") %></dt>
|
13
|
+
<dd><%= @contact.second_name || "-" %></dd>
|
14
|
+
<dt><%= t("helpers.label.email", :default => "Email") %></dt>
|
15
|
+
<dd><%= @contact.email || "-" %></dd>
|
16
|
+
<dt><%= t("helpers.label.subject", :default => "Subject") %></dt>
|
17
|
+
<dd><%= @contact.text || "-" %></dd>
|
18
|
+
|
19
|
+
</dl>
|
20
|
+
</div>
|
@@ -0,0 +1,19 @@
|
|
1
|
+
en:
|
2
|
+
contacts:
|
3
|
+
subject_empty: "Subject is empty"
|
4
|
+
read: "Read"
|
5
|
+
latest_contact_requests: "Latest contact requests"
|
6
|
+
display_all: "Display all"
|
7
|
+
success: "Thank you for contacting us. We will get back to you as soon as possible."
|
8
|
+
contact_request_from: "New contact request from %{from}"
|
9
|
+
send: "Send"
|
10
|
+
|
11
|
+
confirmation:
|
12
|
+
subject: "Thank you for contacting us"
|
13
|
+
body: |
|
14
|
+
Dear %{first_name},
|
15
|
+
|
16
|
+
Thank you for contacting us through our website %{site_name}
|
17
|
+
We will get back to you as soon as possible.
|
18
|
+
|
19
|
+
If you think that you have received this email by mistake, please contact us at %{reply_to}
|
@@ -0,0 +1,18 @@
|
|
1
|
+
it:
|
2
|
+
contacts:
|
3
|
+
subject_empty: "Senza oggetto"
|
4
|
+
read: "Leggi"
|
5
|
+
latest_contact_requests: "Ultime richieste di contatto"
|
6
|
+
display_all: "Mostra tutte"
|
7
|
+
success: "Grazie per averci contattato, la ricontatteremo al più presto!"
|
8
|
+
contact_request_from: "Nuova richesta di contatto da %{from}"
|
9
|
+
send: "Invia"
|
10
|
+
|
11
|
+
confirmation:
|
12
|
+
subject: "Conferma richesta di contatto"
|
13
|
+
body: |
|
14
|
+
Gentile %{first_name} la ringraziamo per averci contattato presso il sito %{site_name}.
|
15
|
+
|
16
|
+
La ricontatteremo al più presto
|
17
|
+
|
18
|
+
Se non è stato lei ad aver effettuato la richesta, o se pensa di aver ricevuto questa mail per errore la preghiamo di contattarci all'indirizzo %{reply_to}
|
data/config/routes.rb
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = "fullstack-contacts"
|
8
|
+
s.version = "0.1.3"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["mcasimir"]
|
12
|
+
s.date = "2013-02-02"
|
13
|
+
s.description = "Contact form and backend for fullstack-cms"
|
14
|
+
s.email = "maurizio.cas@gmail.com"
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"README.md"
|
17
|
+
]
|
18
|
+
s.files = [
|
19
|
+
"Gemfile",
|
20
|
+
"Gemfile.lock",
|
21
|
+
"README.md",
|
22
|
+
"Rakefile",
|
23
|
+
"VERSION",
|
24
|
+
"app/controllers/admin/contacts_controller.rb",
|
25
|
+
"app/helpers/contacts_helper.rb",
|
26
|
+
"app/mailers/.gitkeep",
|
27
|
+
"app/mailers/contacts_mailer.rb",
|
28
|
+
"app/views/admin/contacts/_contacts_dashboard_widget.html.erb",
|
29
|
+
"app/views/admin/contacts/_contacts_table.html.erb",
|
30
|
+
"app/views/admin/contacts/index.html.erb",
|
31
|
+
"app/views/admin/contacts/show.html.erb",
|
32
|
+
"config/locales/en.yml",
|
33
|
+
"config/locales/it.yml",
|
34
|
+
"config/routes.rb",
|
35
|
+
"fullstack-contacts.gemspec",
|
36
|
+
"lib/fullstack-contacts.rb",
|
37
|
+
"lib/fullstack/contacts.rb",
|
38
|
+
"lib/fullstack/contacts/actions.rb",
|
39
|
+
"lib/fullstack/contacts/engine.rb",
|
40
|
+
"lib/generators/fullstack/contacts/install_generator.rb",
|
41
|
+
"lib/generators/fullstack/contacts/templates/app/models/contact.rb",
|
42
|
+
"lib/generators/fullstack/contacts/templates/app/views/contacts_mailer/confirmation.html.erb",
|
43
|
+
"lib/generators/fullstack/contacts/templates/app/views/contacts_mailer/notify.html.erb",
|
44
|
+
"lib/generators/fullstack/contacts/templates/app/views/fullstack/contacts/_form.html.erb",
|
45
|
+
"lib/generators/fullstack/contacts/templates/app/views/fullstack/contacts/_success.html.erb"
|
46
|
+
]
|
47
|
+
s.homepage = "http://github.com/mcasimir/kaminari-bootstrap"
|
48
|
+
s.licenses = ["MIT"]
|
49
|
+
s.require_paths = ["lib"]
|
50
|
+
s.rubygems_version = "1.8.25"
|
51
|
+
s.summary = "Contact form and backend for fullstack-cms"
|
52
|
+
|
53
|
+
if s.respond_to? :specification_version then
|
54
|
+
s.specification_version = 3
|
55
|
+
|
56
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
57
|
+
s.add_runtime_dependency(%q<rails>, [">= 0"])
|
58
|
+
s.add_development_dependency(%q<bundler>, [">= 0"])
|
59
|
+
s.add_development_dependency(%q<jeweler>, ["~> 1.8.4"])
|
60
|
+
else
|
61
|
+
s.add_dependency(%q<rails>, [">= 0"])
|
62
|
+
s.add_dependency(%q<bundler>, [">= 0"])
|
63
|
+
s.add_dependency(%q<jeweler>, ["~> 1.8.4"])
|
64
|
+
end
|
65
|
+
else
|
66
|
+
s.add_dependency(%q<rails>, [">= 0"])
|
67
|
+
s.add_dependency(%q<bundler>, [">= 0"])
|
68
|
+
s.add_dependency(%q<jeweler>, ["~> 1.8.4"])
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# Author:: Maurizio Casimirri (mailto:maurizio.cas@gmail.com)
|
2
|
+
# Copyright:: Copyright (c) 2012 Maurizio Casimirri
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
5
|
+
# a copy of this software and associated documentation files (the
|
6
|
+
# "Software"), to deal in the Software without restriction, including
|
7
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
8
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
9
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
10
|
+
# the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be
|
13
|
+
# included in all copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
17
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
19
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
20
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
21
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
|
23
|
+
|
24
|
+
require 'fullstack/contacts'
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Fullstack
|
2
|
+
module Contacts
|
3
|
+
module Actions
|
4
|
+
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
included do
|
8
|
+
end
|
9
|
+
|
10
|
+
protected
|
11
|
+
|
12
|
+
def create_contact!(options = {})
|
13
|
+
|
14
|
+
options = {
|
15
|
+
:failure => "contacts"
|
16
|
+
}.merge(options)
|
17
|
+
|
18
|
+
@contact = Contact.new(params[:contact])
|
19
|
+
if @contact.save
|
20
|
+
redirect_to options[:success], :flash => {:notice => t("contacts.success", :default => "Thank you for contacting us")}
|
21
|
+
else
|
22
|
+
render options[:new]
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
module Fullstack
|
2
|
+
module Contacts
|
3
|
+
class InstallGenerator < Rails::Generators::Base
|
4
|
+
source_root File.expand_path('../templates', __FILE__)
|
5
|
+
|
6
|
+
def install_templates
|
7
|
+
directory "app", Rails.root.join("app")
|
8
|
+
end
|
9
|
+
|
10
|
+
def banner
|
11
|
+
puts <<-eos
|
12
|
+
|
13
|
+
# =========================================================
|
14
|
+
# = Take the following steps to complete the installation =
|
15
|
+
# =========================================================
|
16
|
+
|
17
|
+
Edit 'app/models/contact.rb' to customize 'Contact' model and then run:
|
18
|
+
rails g migration:from contact && rake db:migrate
|
19
|
+
|
20
|
+
You may also wish to customize front-end views editing:
|
21
|
+
- app/views/contacts_mailer/confirmation.html.erb
|
22
|
+
- app/views/contacts_mailer/notify.html.erb
|
23
|
+
- app/views/fullstack/contacts/_form.html.erb
|
24
|
+
- app/views/fullstack/contacts/_success.html.erb
|
25
|
+
|
26
|
+
Enable contacts back-end in config/initializers/fullstack.rb:
|
27
|
+
|
28
|
+
admin.group :contacts do |g|
|
29
|
+
g.icon= "user"
|
30
|
+
g.resource :contacts
|
31
|
+
end
|
32
|
+
|
33
|
+
Install a widget in your admin/dashboard:
|
34
|
+
|
35
|
+
<%= contacts_dashboard_widget %>
|
36
|
+
|
37
|
+
Add actions to your controller:
|
38
|
+
|
39
|
+
include Fullstack::Contacts::Actions
|
40
|
+
|
41
|
+
page :contacts, "/contacts", :parent => :home do
|
42
|
+
@contact = Contact.new
|
43
|
+
end
|
44
|
+
|
45
|
+
action :contact, "/contact", :via => :post do
|
46
|
+
create_contact!(:success => polymorphic_path([:site, :contacts], :success => true))
|
47
|
+
end
|
48
|
+
|
49
|
+
Render a contact_form inside your views:
|
50
|
+
|
51
|
+
<% if params[:success] %>
|
52
|
+
<%= contact_success %>
|
53
|
+
<% else %>
|
54
|
+
<%= contact_form %>
|
55
|
+
<% end %>
|
56
|
+
|
57
|
+
eos
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
class Contact < ActiveRecord::Base
|
2
|
+
include Localized
|
3
|
+
inheritable
|
4
|
+
timestamps
|
5
|
+
|
6
|
+
field :first_name
|
7
|
+
field :second_name
|
8
|
+
field :email
|
9
|
+
field :text, :text
|
10
|
+
field :read, :boolean, :default => false
|
11
|
+
|
12
|
+
scope :unread, where("read IS NOT true")
|
13
|
+
|
14
|
+
def name
|
15
|
+
[first_name, second_name].compact.join(" ")
|
16
|
+
end
|
17
|
+
|
18
|
+
def unread?
|
19
|
+
!read?
|
20
|
+
end
|
21
|
+
|
22
|
+
field :agreed_to_privacy, :boolean, :default => false
|
23
|
+
validates_acceptance_of :agreed_to_privacy, :on => :create, :accept => true, :allow_nil => false
|
24
|
+
validates_presence_of :locale, :email, :first_name
|
25
|
+
|
26
|
+
before_validation do |contact|
|
27
|
+
contact.locale = I18n.locale.to_s
|
28
|
+
end
|
29
|
+
|
30
|
+
after_create do |contact|
|
31
|
+
ContactsMailer.confirmation(contact).deliver
|
32
|
+
ContactsMailer.notify(contact).deliver
|
33
|
+
end
|
34
|
+
|
35
|
+
def read!
|
36
|
+
unless read?
|
37
|
+
update_attributes!(:read => true)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def unread!
|
42
|
+
unless unread?
|
43
|
+
update_attributes!(:read => false)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
data/lib/generators/fullstack/contacts/templates/app/views/contacts_mailer/confirmation.html.erb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
<%= simple_format t("contacts.confirmation.body", :first_name => @contact.first_name, :reply_to => Settings.app.email, :site_name => Settings.app.domain) %>
|
@@ -0,0 +1,8 @@
|
|
1
|
+
<ul>
|
2
|
+
<li><b><%= t("helpers.label.locale", :default => "Locale") %></b>: <%= @contact.locale %></li>
|
3
|
+
<li><b><%= t("helpers.label.first_name", :default => "First Name") %></b>: <%= @contact.first_name %></li>
|
4
|
+
<li><b><%= t("helpers.label.second_name", :default => "Second Name") %></b>: <%= @contact.second_name %></li>
|
5
|
+
<li><b><%= t("helpers.label.email", :default => "Email") %></b>: <%= @contact.email %></li>
|
6
|
+
<li><b><%= t("helpers.label.message", :default => "Message") %></b>: <br/>
|
7
|
+
<%= simple_format h(@contact.text) %></li>
|
8
|
+
</ul>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<%= site_form_for( @contact, :url => [:site, :contact] ) do |f| %>
|
2
|
+
|
3
|
+
<%= f.inputs do %>
|
4
|
+
<%= f.input :first_name %>
|
5
|
+
<%= f.input :email %>
|
6
|
+
<%= f.input :text %>
|
7
|
+
<%= f.input :agreed_to_privacy %>
|
8
|
+
<% end %>
|
9
|
+
<div>
|
10
|
+
<input name="commit" type="submit" value="<%= t('contacts.send', :default => 'Send') %>" class="contact-submit btn btn-primary">
|
11
|
+
</div>
|
12
|
+
|
13
|
+
<% end %>
|
metadata
ADDED
@@ -0,0 +1,124 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: fullstack-contacts
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.3
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- mcasimir
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-02-02 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rails
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: bundler
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: jeweler
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ~>
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 1.8.4
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 1.8.4
|
62
|
+
description: Contact form and backend for fullstack-cms
|
63
|
+
email: maurizio.cas@gmail.com
|
64
|
+
executables: []
|
65
|
+
extensions: []
|
66
|
+
extra_rdoc_files:
|
67
|
+
- README.md
|
68
|
+
files:
|
69
|
+
- Gemfile
|
70
|
+
- Gemfile.lock
|
71
|
+
- README.md
|
72
|
+
- Rakefile
|
73
|
+
- VERSION
|
74
|
+
- app/controllers/admin/contacts_controller.rb
|
75
|
+
- app/helpers/contacts_helper.rb
|
76
|
+
- app/mailers/.gitkeep
|
77
|
+
- app/mailers/contacts_mailer.rb
|
78
|
+
- app/views/admin/contacts/_contacts_dashboard_widget.html.erb
|
79
|
+
- app/views/admin/contacts/_contacts_table.html.erb
|
80
|
+
- app/views/admin/contacts/index.html.erb
|
81
|
+
- app/views/admin/contacts/show.html.erb
|
82
|
+
- config/locales/en.yml
|
83
|
+
- config/locales/it.yml
|
84
|
+
- config/routes.rb
|
85
|
+
- fullstack-contacts.gemspec
|
86
|
+
- lib/fullstack-contacts.rb
|
87
|
+
- lib/fullstack/contacts.rb
|
88
|
+
- lib/fullstack/contacts/actions.rb
|
89
|
+
- lib/fullstack/contacts/engine.rb
|
90
|
+
- lib/generators/fullstack/contacts/install_generator.rb
|
91
|
+
- lib/generators/fullstack/contacts/templates/app/models/contact.rb
|
92
|
+
- lib/generators/fullstack/contacts/templates/app/views/contacts_mailer/confirmation.html.erb
|
93
|
+
- lib/generators/fullstack/contacts/templates/app/views/contacts_mailer/notify.html.erb
|
94
|
+
- lib/generators/fullstack/contacts/templates/app/views/fullstack/contacts/_form.html.erb
|
95
|
+
- lib/generators/fullstack/contacts/templates/app/views/fullstack/contacts/_success.html.erb
|
96
|
+
homepage: http://github.com/mcasimir/kaminari-bootstrap
|
97
|
+
licenses:
|
98
|
+
- MIT
|
99
|
+
post_install_message:
|
100
|
+
rdoc_options: []
|
101
|
+
require_paths:
|
102
|
+
- lib
|
103
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
104
|
+
none: false
|
105
|
+
requirements:
|
106
|
+
- - ! '>='
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
version: '0'
|
109
|
+
segments:
|
110
|
+
- 0
|
111
|
+
hash: -7703580069063085
|
112
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
114
|
+
requirements:
|
115
|
+
- - ! '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
requirements: []
|
119
|
+
rubyforge_project:
|
120
|
+
rubygems_version: 1.8.25
|
121
|
+
signing_key:
|
122
|
+
specification_version: 3
|
123
|
+
summary: Contact form and backend for fullstack-cms
|
124
|
+
test_files: []
|