kms_feedback 0.1.0

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.
Files changed (34) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/Rakefile +37 -0
  4. data/app/assets/javascripts/kms_feedback/application.js +3 -0
  5. data/app/assets/javascripts/kms_feedback/application/controllers/feedbacks_controller.coffee.erb +47 -0
  6. data/app/assets/javascripts/kms_feedback/application/routes.coffee.erb +17 -0
  7. data/app/assets/javascripts/templates/feedbacks/index.html.slim +31 -0
  8. data/app/assets/javascripts/templates/settings/captcha.html.slim +9 -0
  9. data/app/assets/javascripts/templates/settings/from_email.html.slim +3 -0
  10. data/app/assets/stylesheets/feedback/application.css +15 -0
  11. data/app/assets/stylesheets/feedback_messages.css +4 -0
  12. data/app/controllers/kms/feedback/feedback_messages_controller.rb +20 -0
  13. data/app/controllers/kms/public/feedback_messages_controller.rb +25 -0
  14. data/app/controllers/kms/users_controller_decorator.rb +11 -0
  15. data/app/helpers/feedback/application_helper.rb +4 -0
  16. data/app/helpers/feedback_messages_helper.rb +2 -0
  17. data/app/mailers/feedback_mailer.rb +9 -0
  18. data/app/models/kms/feedback_message.rb +11 -0
  19. data/app/models/kms/user_decorator.rb +3 -0
  20. data/app/views/feedback_mailer/send_alert.html.erb +25 -0
  21. data/config/initializers/ability.rb +3 -0
  22. data/config/initializers/resources.rb +1 -0
  23. data/config/initializers/settings.rb +1 -0
  24. data/config/locales/en.yml +26 -0
  25. data/config/locales/ru.yml +26 -0
  26. data/config/routes.rb +11 -0
  27. data/db/migrate/20141119115845_create_kms_feedback_messages.rb +12 -0
  28. data/db/migrate/20141120060745_add_alertable_flag_to_user.rb +5 -0
  29. data/lib/generators/kms_feedback/install/install_generator.rb +17 -0
  30. data/lib/kms/feedback/engine.rb +17 -0
  31. data/lib/kms/feedback/version.rb +5 -0
  32. data/lib/kms_feedback.rb +6 -0
  33. data/lib/tasks/feedback_tasks.rake +4 -0
  34. metadata +162 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: b1375f11378f9cbc373501b445172d2209465421
4
+ data.tar.gz: b7540949603fe7eaf3351296d09e5b77db3b05c7
5
+ SHA512:
6
+ metadata.gz: 3a0e8211a3553009696a345fdf293c06e3e17cc5b476d21cc5b5d90e4bb7cef12b3669e0ded50064609d2ee34f9a4b632a9c8f8eb8f007585d0cfc9ce864f55e
7
+ data.tar.gz: 1d381ddcf5b207e33decb6b7c21909dcede8e57e89bd2a377a2f249f8a86569104a467fb38674215d36876adf7e09a0333e6564a25cb2503f10186090777f37c
@@ -0,0 +1,20 @@
1
+ Copyright 2014 Alexandr Nigomatulin, Igor Petrov
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,37 @@
1
+ begin
2
+ require 'bundler/setup'
3
+ rescue LoadError
4
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
+ end
6
+
7
+ require 'rdoc/task'
8
+
9
+ RDoc::Task.new(:rdoc) do |rdoc|
10
+ rdoc.rdoc_dir = 'rdoc'
11
+ rdoc.title = 'Feedback'
12
+ rdoc.options << '--line-numbers'
13
+ rdoc.rdoc_files.include('README.rdoc')
14
+ rdoc.rdoc_files.include('lib/**/*.rb')
15
+ end
16
+
17
+ APP_RAKEFILE = File.expand_path("../test/dummy/Rakefile", __FILE__)
18
+ load 'rails/tasks/engine.rake'
19
+
20
+
21
+ load 'rails/tasks/statistics.rake'
22
+
23
+
24
+
25
+ Bundler::GemHelper.install_tasks
26
+
27
+ require 'rake/testtask'
28
+
29
+ Rake::TestTask.new(:test) do |t|
30
+ t.libs << 'lib'
31
+ t.libs << 'test'
32
+ t.pattern = 'test/**/*_test.rb'
33
+ t.verbose = false
34
+ end
35
+
36
+
37
+ task default: :test
@@ -0,0 +1,3 @@
1
+ //= require "kms_feedback/application/routes"
2
+ //= require_tree "../templates"
3
+ //= require_tree "./application/controllers"
@@ -0,0 +1,47 @@
1
+ FeedbacksController = ($scope, $state, $cookieStore, Restangular, $stateParams) ->
2
+ Restangular.all('users').customGET('kms_user').then (current_user) ->
3
+ $scope.currentUser = current_user
4
+ $scope.currentUser.admin = $scope.currentUser.role == 'admin'
5
+ #Alertable users
6
+ $scope.users = []
7
+ $scope.select_options = {
8
+ displayProp: 'email',
9
+ idProp: 'id'
10
+ }
11
+ $scope.select_translations = {
12
+ buttonDefaultText: '<%= I18n.t(:select_users_to_notify) %>',
13
+ checkAll: '<%= I18n.t(:mark_all) %>',
14
+ uncheckAll: '<%= I18n.t(:unmark_all) %>',
15
+ dynamicButtonTextSuffix: '<%= I18n.t(:selected) %>'
16
+ }
17
+ $scope.alertableUsers = []
18
+ Restangular.all('users').getList().then (users)->
19
+ $scope.users = users
20
+ users.forEach (ent) ->
21
+ if ent.alert
22
+ $scope.alertableUsers.push ent
23
+
24
+ $scope.selectAlertableUsers = () ->
25
+ Restangular.all('users').customPOST('', 'alertable', {'users_ids[]': $scope.alertableUsers.map((us) -> us.id)})
26
+
27
+
28
+ $scope.store = Restangular.all('feedbacks')
29
+
30
+ $scope.store.getList().then (feedbacks)->
31
+ $scope.feedbacks = feedbacks
32
+
33
+ if $stateParams.id
34
+ $scope.store.get($stateParams.id).then (category)->
35
+ $scope.feedback = feedback
36
+ else
37
+ $scope.feedback = {}
38
+
39
+
40
+ $scope.destroy = (feedback)->
41
+ if(confirm('<%= I18n.t(:are_you_sure) %>'))
42
+ feedback.remove().then ->
43
+ $scope.feedbacks = _.without($scope.feedbacks, feedback)
44
+
45
+
46
+ angular.module('KMS')
47
+ .controller('FeedbacksController', ['$scope', '$state', '$cookieStore', 'Restangular', '$stateParams', FeedbacksController])
@@ -0,0 +1,17 @@
1
+ 'use strict'
2
+
3
+ angular.module('KMS').config ['$stateProvider', '$urlRouterProvider', ($stateProvider, $urlRouterProvider) ->
4
+
5
+ # Application routes
6
+ $stateProvider
7
+ .state('feedback_messages', {
8
+ url: '/kms/feedbacks',
9
+ views:
10
+ "header":
11
+ template: "<%= Kms::FeedbackMessage.model_name.human(count: 1.1) %>"
12
+ "@":
13
+ controller: 'FeedbacksController',
14
+ controllerAs: 'feedbacks',
15
+ templateUrl: 'feedbacks/index.html',
16
+ })
17
+ ]
@@ -0,0 +1,31 @@
1
+ .row
2
+ .col-lg-12
3
+ div.pull-left ng-dropdown-multiselect="" options='users' selected-model='alertableUsers' extra-settings="select_options" translation-texts="select_translations" style="padding-right: 20px;"
4
+ a.btn.btn-info ng-click="selectAlertableUsers()"
5
+ i.fa.fa-check
6
+ .row
7
+ .col-lg-12
8
+ .widget
9
+ .widget-header
10
+ i.fa.fa-comments-o
11
+ = Kms::FeedbackMessage.model_name.human(count: 1.1)
12
+ /a.pull-right href="#" Manage
13
+ .widget-body.no-padding
14
+ .table-responsive
15
+ table.table
16
+ tbody
17
+ tr ng-repeat="feedback in feedbacks"
18
+ td style="width: 10%"
19
+ | {{ feedback.name }}
20
+ td style="width: 10%"
21
+ | {{ feedback.phone }}
22
+ td style="width: 10%"
23
+ a href="mailto:{{ feedback.email }}"
24
+ | {{ feedback.email }}
25
+ td
26
+ | {{ feedback.message }}
27
+ td style="width: 10%"
28
+ | {{ feedback.created_at | date: 'dd MMM yyyy HH:mm' }}
29
+ td style="width: 10%"
30
+ a.btn.btn-sm.btn-danger ng-click="destroy(feedback)" ng-show='currentUser.admin'
31
+ i.fa.fa-times
@@ -0,0 +1,9 @@
1
+ .form-group
2
+ label for="enable_recaptcha" style="margin-right:10px;" = I18n.t(:enable_recaptcha)
3
+ toggle-switch ng-model="settings.values.enable_recaptcha" on-label=I18n.t(:yes_word) off-label=I18n.t(:no_word)
4
+ .form-group ng-if="settings.values.enable_recaptcha"
5
+ label = I18n.t(:recaptcha_public_key)
6
+ input.form-control type="text" ng-model="settings.values.recaptcha_public_key" required=""
7
+ .form-group ng-if="settings.values.enable_recaptcha"
8
+ label = I18n.t(:recaptcha_private_key)
9
+ input.form-control type="text" ng-model="settings.values.recaptcha_private_key" required=""
@@ -0,0 +1,3 @@
1
+ .form-group
2
+ label = I18n.t(:from, scope: :feedback_mailer)
3
+ input.form-control type="text" ng-model="settings.values.feedback_from_email" required=""
@@ -0,0 +1,15 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
+ * or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the bottom of the
9
+ * compiled file so the styles you add here take precedence over styles defined in any styles
10
+ * defined in the other CSS/SCSS files in this directory. It is generally better to create a new
11
+ * file per style scope.
12
+ *
13
+ *= require_tree .
14
+ *= require_self
15
+ */
@@ -0,0 +1,4 @@
1
+ /*
2
+ Place all the styles related to the matching controller here.
3
+ They will automatically be included in application.css.
4
+ */
@@ -0,0 +1,20 @@
1
+ module Kms
2
+ module Feedback
3
+ class FeedbackMessagesController < Kms::ApplicationController
4
+
5
+ load_and_authorize_resource class: "Kms::FeedbackMessage"
6
+
7
+ def index
8
+ render json: Kms::FeedbackMessage.order('created_at desc').to_json
9
+ end
10
+
11
+
12
+ def destroy
13
+ @feedback = Kms::FeedbackMessage.find(params[:id])
14
+ @feedback.destroy
15
+ render json: @feedback.to_json
16
+ end
17
+
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,25 @@
1
+ module Kms
2
+ module Public
3
+ class FeedbackMessagesController < ActionController::Base
4
+ def create
5
+ @feedback = Kms::FeedbackMessage.new(feedback_params)
6
+ if Kms::Settings.instance.values['enable_recaptcha']
7
+ verify_recaptcha(model: @feedback, private_key: Kms::Settings.instance.values['recaptcha_private_key']) && @feedback.save
8
+ else
9
+ @feedback.save
10
+ end
11
+ if @feedback.errors.present?
12
+ render json: @feedback.to_json(methods: :errors), status: :unprocessable_entity
13
+ else
14
+ render json: @feedback.to_json
15
+ end
16
+ end
17
+
18
+ protected
19
+
20
+ def feedback_params
21
+ params.require(:feedback).permit(:name, :phone, :email, :message)
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,11 @@
1
+ Kms::UsersController.class_eval do
2
+ protect_from_forgery except: :alertable
3
+ def alertable
4
+ Kms::User.update_all(alert: false)
5
+ params[:users_ids].each do |id|
6
+ user = Kms::User.find_by_id(id.to_i)
7
+ user.update_attribute(:alert, true) if user
8
+ end if params[:users_ids]
9
+ head :ok
10
+ end
11
+ end
@@ -0,0 +1,4 @@
1
+ module Feedback
2
+ module ApplicationHelper
3
+ end
4
+ end
@@ -0,0 +1,2 @@
1
+ module FeedbackMessagesHelper
2
+ end
@@ -0,0 +1,9 @@
1
+ class FeedbackMailer < ActionMailer::Base
2
+ default from: Proc.new { Kms::Settings.instance.values['feedback_from_email'] } #"no-reply@email.webgradus.com"
3
+
4
+ def send_alert user, feedback
5
+ #TODO Add site domain
6
+ @feedback = feedback
7
+ mail(to: user.email, subject: I18n.t(:new_feedback_from_site, scope: :feedback_mailer))
8
+ end
9
+ end
@@ -0,0 +1,11 @@
1
+ module Kms
2
+ class FeedbackMessage < ActiveRecord::Base
3
+ after_create :send_alert
4
+
5
+ def send_alert
6
+ Kms::User.alertable.each do |user|
7
+ FeedbackMailer.send_alert(user, self).deliver
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,3 @@
1
+ Kms::User.class_eval do
2
+ scope :alertable, -> { where('alert') }
3
+ end
@@ -0,0 +1,25 @@
1
+ <h1><%= I18n.t(:new_feedback_from_site, scope: :feedback_mailer) %></h1>
2
+
3
+ <% if @feedback.name.present? %>
4
+ <p>
5
+ <%= Kms::FeedbackMessage.human_attribute_name(:name) %>: <%= @feedback.name %>
6
+ </p>
7
+ <% end %>
8
+
9
+ <% if @feedback.phone.present? %>
10
+ <p>
11
+ Телефон: <%= @feedback.phone %>
12
+ </p>
13
+ <% end %>
14
+
15
+ <% if @feedback.email.present? %>
16
+ <p>
17
+ Email: <%= @feedback.email %>
18
+ </p>
19
+ <% end %>
20
+
21
+ <% if @feedback.message.present? %>
22
+ <p>
23
+ Сообщение: <%= @feedback.message %>
24
+ </p>
25
+ <% end %>
@@ -0,0 +1,3 @@
1
+ Kms::AbilityService.register do
2
+ can :index, Kms::FeedbackMessage
3
+ end
@@ -0,0 +1 @@
1
+ Kms::ResourceService.register(:feedback, Kms::FeedbackMessage, "fa-comments-o")
@@ -0,0 +1 @@
1
+ Kms::SettingsService.register_templates Kms::Feedback::Engine, 'settings/captcha.html', 'settings/from_email.html'
@@ -0,0 +1,26 @@
1
+ en:
2
+ catalog: "Catalog"
3
+ feedback: 'Feedback'
4
+ enable_recaptcha: 'Enable Recaptcha'
5
+ recaptcha_public_key: 'Recaptcha Public Key'
6
+ recaptcha_private_key: 'Recaptcha Private Key'
7
+ select_users_to_notify: 'Select users to notify'
8
+ mark_all: 'Mark all'
9
+ unmark_all: 'Unmark all'
10
+ selected: 'selected'
11
+ feedback_mailer:
12
+ new_feedback_from_site: 'New message from website'
13
+ from: 'Email address that will be used for sending email notifications'
14
+ activerecord:
15
+ models:
16
+ kms/feedback_message:
17
+ one: "Message"
18
+ few: "Messages"
19
+ many: "Messages"
20
+ other: "Messages"
21
+ attributes:
22
+ kms/feedback_message:
23
+ name: "Name"
24
+ phone: "Phone"
25
+ email: "Email"
26
+ message: "Message"
@@ -0,0 +1,26 @@
1
+ ru:
2
+ catalog: "Каталог"
3
+ feedback: 'Обратная связь'
4
+ enable_recaptcha: 'Включить Recaptcha'
5
+ recaptcha_public_key: 'Recaptcha Public Key'
6
+ recaptcha_private_key: 'Recaptcha Private Key'
7
+ select_users_to_notify: 'Выберите пользователей для уведомления'
8
+ mark_all: 'Отметить всех'
9
+ unmark_all: 'Снять со всех'
10
+ selected: 'выбран(о)'
11
+ feedback_mailer:
12
+ new_feedback_from_site: 'Новая заявка с сайта'
13
+ from: 'Email адрес, с которого отправляются уведомления по почте'
14
+ activerecord:
15
+ models:
16
+ kms/feedback_message:
17
+ one: "Сообщение"
18
+ few: "Сообщения"
19
+ many: "Сообщений"
20
+ other: "Сообщения"
21
+ attributes:
22
+ kms/feedback_message:
23
+ name: "Имя"
24
+ phone: "Телефон"
25
+ email: "Email"
26
+ message: "Сообщение"
@@ -0,0 +1,11 @@
1
+ Kms::Feedback::Engine.routes.draw do
2
+ constraints(format: "json") do
3
+ resources :feedback_messages, path: 'feedbacks', only: [:index, :destroy], format: true
4
+ end
5
+ end
6
+ Kms::Engine.routes.draw do
7
+ post '/users/alertable' => 'users#alertable'
8
+ end
9
+ Rails.application.routes.draw do
10
+ resources :feedback_messages, path: 'feedbacks', only: :create, controller: 'kms/public/feedback_messages'
11
+ end
@@ -0,0 +1,12 @@
1
+ class CreateKmsFeedbackMessages < ActiveRecord::Migration
2
+ def change
3
+ create_table :kms_feedback_messages do |t|
4
+ t.string :name
5
+ t.string :phone
6
+ t.string :email
7
+ t.text :message
8
+
9
+ t.timestamps null: false
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,5 @@
1
+ class AddAlertableFlagToUser < ActiveRecord::Migration
2
+ def change
3
+ add_column :kms_users, :alert, :boolean, default: false, null: false
4
+ end
5
+ end
@@ -0,0 +1,17 @@
1
+ module KmsFeedback
2
+ class InstallGenerator < Rails::Generators::Base
3
+
4
+ source_root File.expand_path('../../../../../', __FILE__)
5
+
6
+ def insert_engine_routes
7
+ route %(
8
+ mount Kms::Feedback::Engine => '/kms'
9
+ )
10
+ end
11
+
12
+ def insert_javascript
13
+ append_file "app/assets/javascripts/application.js", "//= require kms_feedback/application\n"
14
+ end
15
+
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ require "recaptcha/rails"
2
+ module Kms
3
+ module Feedback
4
+ class Engine < ::Rails::Engine
5
+ engine_name 'kms_feedback'
6
+ isolate_namespace Kms::Feedback
7
+ # config.autoload_paths += Dir["#{config.root}/lib/**/"]
8
+ config.assets.paths += Dir["#{config.root}/vendor/assets/bower_components"]
9
+
10
+ config.to_prepare do
11
+ Dir.glob(File.join(File.dirname(__FILE__), "../../app/**/*_decorator*.rb")) do |c|
12
+ require_dependency(c)
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,5 @@
1
+ module Kms
2
+ module Feedback
3
+ VERSION = "0.1.0"
4
+ end
5
+ end
@@ -0,0 +1,6 @@
1
+ require "kms/feedback/engine"
2
+
3
+ module Kms
4
+ module Feedback
5
+ end
6
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :feedback do
3
+ # # Task goes here
4
+ # end
metadata ADDED
@@ -0,0 +1,162 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: kms_feedback
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Alexandr Nigomatulin
8
+ - Igor Petrov
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2016-11-21 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rails
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: 5.0.0
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: 5.0.0
28
+ - !ruby/object:Gem::Dependency
29
+ name: recaptcha
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: kms
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: 0.6.0
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: 0.6.0
56
+ - !ruby/object:Gem::Dependency
57
+ name: combustion
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - "~>"
61
+ - !ruby/object:Gem::Version
62
+ version: 0.5.4
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: 0.5.4
70
+ - !ruby/object:Gem::Dependency
71
+ name: factory_girl_rails
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ - !ruby/object:Gem::Dependency
85
+ name: rspec-rails
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - "~>"
89
+ - !ruby/object:Gem::Version
90
+ version: 3.5.0
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - "~>"
96
+ - !ruby/object:Gem::Version
97
+ version: 3.5.0
98
+ description: KMS extension allowing to have feedback/callback/contact forms on your
99
+ website
100
+ email:
101
+ - info@webgradus.ru
102
+ executables: []
103
+ extensions: []
104
+ extra_rdoc_files: []
105
+ files:
106
+ - MIT-LICENSE
107
+ - Rakefile
108
+ - app/assets/javascripts/kms_feedback/application.js
109
+ - app/assets/javascripts/kms_feedback/application/controllers/feedbacks_controller.coffee.erb
110
+ - app/assets/javascripts/kms_feedback/application/routes.coffee.erb
111
+ - app/assets/javascripts/templates/feedbacks/index.html.slim
112
+ - app/assets/javascripts/templates/settings/captcha.html.slim
113
+ - app/assets/javascripts/templates/settings/from_email.html.slim
114
+ - app/assets/stylesheets/feedback/application.css
115
+ - app/assets/stylesheets/feedback_messages.css
116
+ - app/controllers/kms/feedback/feedback_messages_controller.rb
117
+ - app/controllers/kms/public/feedback_messages_controller.rb
118
+ - app/controllers/kms/users_controller_decorator.rb
119
+ - app/helpers/feedback/application_helper.rb
120
+ - app/helpers/feedback_messages_helper.rb
121
+ - app/mailers/feedback_mailer.rb
122
+ - app/models/kms/feedback_message.rb
123
+ - app/models/kms/user_decorator.rb
124
+ - app/views/feedback_mailer/send_alert.html.erb
125
+ - config/initializers/ability.rb
126
+ - config/initializers/resources.rb
127
+ - config/initializers/settings.rb
128
+ - config/locales/en.yml
129
+ - config/locales/ru.yml
130
+ - config/routes.rb
131
+ - db/migrate/20141119115845_create_kms_feedback_messages.rb
132
+ - db/migrate/20141120060745_add_alertable_flag_to_user.rb
133
+ - lib/generators/kms_feedback/install/install_generator.rb
134
+ - lib/kms/feedback/engine.rb
135
+ - lib/kms/feedback/version.rb
136
+ - lib/kms_feedback.rb
137
+ - lib/tasks/feedback_tasks.rake
138
+ homepage: http://webgradus.ru
139
+ licenses:
140
+ - MIT
141
+ metadata: {}
142
+ post_install_message:
143
+ rdoc_options: []
144
+ require_paths:
145
+ - lib
146
+ required_ruby_version: !ruby/object:Gem::Requirement
147
+ requirements:
148
+ - - ">="
149
+ - !ruby/object:Gem::Version
150
+ version: '0'
151
+ required_rubygems_version: !ruby/object:Gem::Requirement
152
+ requirements:
153
+ - - ">="
154
+ - !ruby/object:Gem::Version
155
+ version: '0'
156
+ requirements: []
157
+ rubyforge_project:
158
+ rubygems_version: 2.4.5
159
+ signing_key:
160
+ specification_version: 4
161
+ summary: KMS extension for feedback/callback/contact forms
162
+ test_files: []