hancock_cms_faq 1.0.2

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 (69) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +9 -0
  3. data/.ruby-gemset +1 -0
  4. data/.ruby-version +1 -0
  5. data/.travis.yml +4 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE.txt +21 -0
  8. data/README.md +55 -0
  9. data/Rakefile +1 -0
  10. data/app/assets/javascripts/hancock/faq.coffee +6 -0
  11. data/app/assets/javascripts/hancock/faq/form.coffee +9 -0
  12. data/app/assets/javascripts/hancock/faq/init.coffee +2 -0
  13. data/app/assets/stylesheets/hancock/faq.sass +0 -0
  14. data/app/controllers/concerns/hancock/faq/decorators/categories.rb +17 -0
  15. data/app/controllers/concerns/hancock/faq/decorators/questions.rb +71 -0
  16. data/app/controllers/hancock/faq/categories_controller.rb +7 -0
  17. data/app/controllers/hancock/faq/questions_controller.rb +7 -0
  18. data/app/models/concerns/hancock/faq/decorators/category.rb +36 -0
  19. data/app/models/concerns/hancock/faq/decorators/question.rb +48 -0
  20. data/app/models/hancock/faq/category.rb +11 -0
  21. data/app/models/hancock/faq/question.rb +11 -0
  22. data/app/views/hancock/faq/categories/index.html.slim +10 -0
  23. data/app/views/hancock/faq/categories/show.html.slim +8 -0
  24. data/app/views/hancock/faq/questions/_fields.html.slim +11 -0
  25. data/app/views/hancock/faq/questions/_fields_with_settings.html.slim +20 -0
  26. data/app/views/hancock/faq/questions/_form.html.slim +66 -0
  27. data/app/views/hancock/faq/questions/_form_with_wrapper.html.slim +2 -0
  28. data/app/views/hancock/faq/questions/_question_block.html.slim +33 -0
  29. data/app/views/hancock/faq/questions/_simple_captcha.html.slim +16 -0
  30. data/app/views/hancock/faq/questions/_success.html.slim +3 -0
  31. data/app/views/hancock/faq/questions/create.html.slim +1 -0
  32. data/app/views/hancock/faq/questions/index.html.slim +11 -0
  33. data/app/views/hancock/faq/questions/new.html.slim +6 -0
  34. data/app/views/hancock/faq/questions/show.html.slim +8 -0
  35. data/app/views/hancock/faq/questions/update_captcha.html.slim +16 -0
  36. data/bin/console +14 -0
  37. data/bin/setup +7 -0
  38. data/config/locales/hancock.faq.ru.yml +64 -0
  39. data/hancock_cms_faq.gemspec +36 -0
  40. data/lib/generators/hancock/faq/config/config_generator.rb +13 -0
  41. data/lib/generators/hancock/faq/config/templates/hancock_faq.erb +23 -0
  42. data/lib/generators/hancock/faq/controllers/all_generator.rb +28 -0
  43. data/lib/generators/hancock/faq/controllers/category_generator.rb +43 -0
  44. data/lib/generators/hancock/faq/controllers/decorators_generator.rb +24 -0
  45. data/lib/generators/hancock/faq/controllers/question_generator.rb +43 -0
  46. data/lib/generators/hancock/faq/controllers/templates/categories_controller.erb +10 -0
  47. data/lib/generators/hancock/faq/controllers/templates/questions_controller.erb +10 -0
  48. data/lib/generators/hancock/faq/models/all_generator.rb +28 -0
  49. data/lib/generators/hancock/faq/models/category_generator.rb +43 -0
  50. data/lib/generators/hancock/faq/models/decorators_generator.rb +24 -0
  51. data/lib/generators/hancock/faq/models/question_generator.rb +34 -0
  52. data/lib/generators/hancock/faq/models/templates/category.erb +36 -0
  53. data/lib/generators/hancock/faq/models/templates/question.erb +37 -0
  54. data/lib/hancock/faq/admin.rb +6 -0
  55. data/lib/hancock/faq/admin/category.rb +128 -0
  56. data/lib/hancock/faq/admin/question.rb +104 -0
  57. data/lib/hancock/faq/configuration.rb +53 -0
  58. data/lib/hancock/faq/controllers/categories.rb +88 -0
  59. data/lib/hancock/faq/controllers/questions.rb +174 -0
  60. data/lib/hancock/faq/engine.rb +7 -0
  61. data/lib/hancock/faq/models/category.rb +50 -0
  62. data/lib/hancock/faq/models/mongoid/category.rb +33 -0
  63. data/lib/hancock/faq/models/mongoid/question.rb +72 -0
  64. data/lib/hancock/faq/models/question.rb +85 -0
  65. data/lib/hancock/faq/routes.rb +83 -0
  66. data/lib/hancock/faq/version.rb +5 -0
  67. data/lib/hancock_cms_faq.rb +31 -0
  68. data/release.sh +6 -0
  69. metadata +159 -0
@@ -0,0 +1,2 @@
1
+ #hancock_faq_form
2
+ = render partial: "hancock/faq/questions/form"
@@ -0,0 +1,33 @@
1
+ - _cache_helper = (Hancock::Faq.config.cache_support ? :hancock_cache : :cache)
2
+
3
+ - send _cache_helper, q do
4
+ .qtable
5
+ - _category = q.main_category
6
+ - if _category and _category.enabled
7
+ = link_to _category.name, hancock_faq_category_path(_category), title: _category.name
8
+
9
+ .qtext_block
10
+ .questionblock
11
+ .questiontext
12
+ .qname
13
+ p= q.author_name
14
+ .qemail
15
+ p= q.author_email
16
+ .qdate
17
+ p= q.created_at
18
+ .qtext
19
+ - if q.question_text_after_editing.blank?
20
+ p== q.question_text
21
+ - else
22
+ p== q.question_text_after_editing
23
+
24
+ .answertext
25
+ - if q.answered or (current_user and current_user.admin?)
26
+ .aqname
27
+ p= q.answer_author_name
28
+ .aqdate
29
+ p= q.answered_time
30
+ .aqtext
31
+ p== q.answer_text
32
+
33
+ .mentionsdivider
@@ -0,0 +1,16 @@
1
+ ruby:
2
+ if Hancock::Faq.config.model_settings_support
3
+ settings_scope ||= Hancock::Faq::Question.settings
4
+ elsif defined?(Settings)
5
+ settings_scope ||= Settings.ns('FAQ')
6
+ end
7
+
8
+ - label = t('hancock.faq_plugin.fields.captcha.label')
9
+ - placeholder = t('hancock.faq_plugin.fields.captcha.placeholder')
10
+ - update_captcha = link_to ' (обн)', hancock_faq_question_update_captcha_path, class: 'update_captcha_link'
11
+ - if Hancock::Faq.config.model_settings_support
12
+ - label = settings_scope.simple_captcha_label(default: label, label: "Заголовок поля Код проверки")
13
+ - placeholder = settings_scope.simple_captcha_placeholder(default: placeholder, label: "Placeholder поля Код проверки")
14
+ = f.input :captcha, as: :simple_captcha, label: label, input_html: {placeholder: placeholder, update_captcha: update_captcha}, required: true
15
+ - else
16
+ = f.input :captcha, as: :simple_captcha, label: label, input_html: {placeholder: placeholder, update_captcha: update_captcha}, required: true
@@ -0,0 +1,3 @@
1
+ #hancock_cms_fq_success
2
+ h2 Ваш вопрос принят
3
+ div В ближайшее время мы ответим на него и развестим ответ на сайте.
@@ -0,0 +1 @@
1
+ = render partial: "hancock/faq/questions/form_with_wrapper"
@@ -0,0 +1,11 @@
1
+ - _partial_path = (Hancock::Faq.config.seo_support ? 'shared/obj_with_seo' : 'shared/obj')
2
+ = render _partial_path, obj: (@seo_page || @seo_parent_page)
3
+
4
+
5
+ - @questions.each do |q|
6
+ .question_block{data-question-id="#{q._id.to_s}"}
7
+ = render partial: "hancock/faq/questions/question_block", locals: {q: q}
8
+
9
+ .newquestionform
10
+ p.newquestiontitle Задать свой вопрос:
11
+ = render partial: "hancock/faq/questions/form_with_wrapper"
@@ -0,0 +1,6 @@
1
+ - _partial_path = (Hancock::Faq.config.seo_support ? 'shared/obj_with_seo' : 'shared/obj')
2
+ = render _partial_path, obj: (@seo_page || @seo_parent_page)
3
+
4
+ .newquestionform
5
+ p.newquestiontitle Задать свой вопрос:
6
+ = render partial: "hancock/faq/questions/form_with_wrapper"
@@ -0,0 +1,8 @@
1
+ / - _cache_helper = (Hancock::Faq.config.cache_support ? :hancock_cache : :cache)
2
+
3
+ - _partial_path = (Hancock::Faq.config.seo_support ? 'shared/obj_with_seo' : 'shared/obj')
4
+ = render _partial_path, obj: @question
5
+
6
+
7
+ .question_block{data-question-id="#{@question._id.to_s}"}
8
+ = render partial: "hancock/faq/questions/question_block", locals: {q: @question}
@@ -0,0 +1,16 @@
1
+ .input.simple_captcha.required.hancock_feedback_contact_message_captcha
2
+ - if Hancock::Feedback.config.captcha and Hancock::Feedback.config.simple_captcha_support
3
+ ruby:
4
+ options = {
5
+ label: t('hancock.feedback_plugin.fields.captcha.label'),
6
+ placeholder: t('hancock.feedback_plugin.fields.captcha.placeholder'),
7
+ update_captcha: link_to(' (обн)', hancock_feedback_update_captcha_path, class: 'update_captcha_link'),
8
+ object: Hancock::Feedback::ContactMessage.new
9
+ }
10
+
11
+ - if Hancock::Feedback.config.model_settings_support
12
+ - options[:label] = settings_scope.simple_captcha_label(default: options[:label], label: "Заголовок поля Код проверки")
13
+ - options[:placeholder] = settings_scope.simple_captcha_placeholder(default: options[:placeholder], label: "Placeholder поля Код проверки")
14
+ = show_simple_captcha options
15
+ - else
16
+ = show_simple_captcha options
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "hancock_cms_faq"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ bundle install
6
+
7
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,64 @@
1
+ ru:
2
+ hancock:
3
+ faq: FAQ
4
+ breadcrumbs:
5
+ faq: FAQ
6
+ errors:
7
+ faq:
8
+ recaptcha: Вы робот?
9
+
10
+ faq_plugin:
11
+ fields:
12
+ author_name:
13
+ label: 'ФИО'
14
+ placeholder: 'ФИО'
15
+ author_email:
16
+ label: E-mail
17
+ placeholder: E-mail
18
+ # phone:
19
+ # label: Телефон
20
+ # placeholder: Телефон
21
+ question_text:
22
+ label: Вопрос
23
+ placeholder: Вопрос
24
+ captcha:
25
+ label: "Введите код с картинки"
26
+ placeholder: "Введите код с картинки"
27
+
28
+ mongoid:
29
+ models:
30
+ hancock/faq/question: Вопросы
31
+ hancock/faq/category: Категории
32
+ attributes:
33
+ hancock/faq/question:
34
+ question_text: Текст вопроса
35
+ question_text_after_editing: Текст вопроса (редактированный)
36
+ author_name: Имя автора
37
+ author_name_after_editing: Имя автора (редактированное)
38
+ author_email: E-mail автора
39
+
40
+ answered: Есть ответ
41
+ answer_text: Текст ответа
42
+ answered_time: Время ответа
43
+ answer_author_name: Имя автора ответа
44
+
45
+ categories: Категории
46
+ category_ids: Категории
47
+
48
+ hancock/faq/category:
49
+ questions: Вопросы
50
+
51
+
52
+ errors:
53
+ models:
54
+ hancock/faq/question:
55
+ attributes:
56
+ author_email:
57
+ invalid_email_address: "Некорректный e-mail"
58
+
59
+
60
+
61
+ admin:
62
+ scopes:
63
+ rails_admin_settings~setting:
64
+ ns_rails_admin_model_settings_hancock_faq_question: 'FAQ'
@@ -0,0 +1,36 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "hancock/faq/version"
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "hancock_cms_faq"
8
+ spec.version = Hancock::Faq::VERSION
9
+ spec.authors = ["Alexander Kiseliev"]
10
+ spec.email = ["dev@redrocks.pro"]
11
+
12
+ spec.summary = %q{FAQ system with HancockCMS support.}
13
+ spec.description = %q{FAQ system with HancockCMS support.}
14
+ spec.homepage = "https://github.com/red-rocks/hancock_cms_faq"
15
+ spec.license = "MIT"
16
+
17
+ # Prevent pushing this gem to RubyGems.org by setting 'allowed_push_host', or
18
+ # delete this section to allow pushing this gem to any host.
19
+ # if spec.respond_to?(:metadata)
20
+ # spec.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com'"
21
+ # else
22
+ # raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
23
+ # end
24
+
25
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
26
+ spec.bindir = "exe"
27
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
28
+ spec.require_paths = ["lib"]
29
+
30
+ spec.add_development_dependency "bundler", "~> 1.10"
31
+ spec.add_development_dependency "rake", "~> 10.0"
32
+
33
+ spec.add_dependency 'hancock_cms', [">=1.0.2", "<2.1.x"]
34
+ # spec.add_dependency 'hancock_cms', ["~> 1.0.2", "~> 2.0"]
35
+
36
+ end
@@ -0,0 +1,13 @@
1
+ require 'rails/generators'
2
+
3
+ module Hancock::Faq
4
+ class ConfigGenerator < Rails::Generators::Base
5
+ source_root File.expand_path('../templates', __FILE__)
6
+
7
+ desc 'Hancock::Faq Config generator'
8
+ def config
9
+ template 'hancock_faq.erb', "config/initializers/hancock_faq.rb"
10
+ end
11
+
12
+ end
13
+ end
@@ -0,0 +1,23 @@
1
+ Hancock::Faq.configure do |config|
2
+ ##### defaults #####
3
+ # config.author_name_required = true
4
+ #
5
+ # config.default_answer_author_name = "Администрация сайта"
6
+ #
7
+ # config.captcha_error_message = "Код с картинки введен неверно"
8
+ #
9
+ # config.recaptcha_support = !!defined?(Recaptcha)
10
+ # config.simple_captcha_support = !!defined?(SimpleCaptcha)
11
+ # config.captcha = # config.recaptcha_support || # config.simple_captcha_support
12
+ #
13
+ # config.seo_support = !!defined?(Hancock::Seo)
14
+ # config.cache_support = !!defined?(Hancock::Cache)
15
+ #
16
+ # config.breadcrumbs_on_rails_support = !!defined?(BreadcrumbsOnRails)
17
+ #
18
+ # config.localize = Hancock.config.localize
19
+ #
20
+ # config.model_settings_support = !!defined?(RailsAdminModelSettings)
21
+ # config.user_abilities_support = !!defined?(RailsAdminUserAbilities)
22
+ # config.ra_comments_support = !!defined?(RailsAdminComments)
23
+ end
@@ -0,0 +1,28 @@
1
+ require 'rails/generators'
2
+
3
+ module Hancock::Faq::Controllers
4
+ class AllGenerator < Rails::Generators::Base
5
+ source_root File.expand_path('../templates', __FILE__)
6
+ argument :class_name, type: :string
7
+ argument :category_class_name_arg, type: :string, default: ""
8
+
9
+ desc 'Hancock::Faq Controllers generator'
10
+ def all
11
+ generate "hancock:faq:controllers:question #{camelcased_class_name}"
12
+ generate "hancock:faq:controllers:category #{category_class_name}"
13
+ end
14
+
15
+ private
16
+ def capitalized_class_name
17
+ class_name.capitalize
18
+ end
19
+ def camelcased_class_name
20
+ class_name.camelcase
21
+ end
22
+
23
+ def category_class_name
24
+ category_class_name_arg.blank? ? "#{camelcased_class_name}Category" : category_class_name_arg
25
+ end
26
+
27
+ end
28
+ end
@@ -0,0 +1,43 @@
1
+ require 'rails/generators'
2
+
3
+ module Hancock::Faq::Controllers
4
+ class CategoryGenerator < Rails::Generators::Base
5
+ source_root File.expand_path('../templates', __FILE__)
6
+ argument :class_name, type: :string
7
+ argument :question_class_name_arg, type: :string, default: ""
8
+
9
+ desc 'Hancock::Faq Category Controller generator'
10
+ def category
11
+ template 'categories_controller.erb', "app/controllers/#{file_name}_controller.rb"
12
+ end
13
+
14
+ private
15
+ def capitalized_class_name
16
+ class_name.capitalize
17
+ end
18
+
19
+ def camelcased_class_name
20
+ class_name.camelcase
21
+ end
22
+
23
+ def camelcased_pluralized_class_name
24
+ camelcased_class_name.pluralize
25
+ end
26
+
27
+ def file_name
28
+ underscored_pluralized_class_name
29
+ end
30
+
31
+ def underscored_class_name
32
+ camelcased_class_name.underscore
33
+ end
34
+
35
+ def underscored_pluralized_class_name
36
+ underscored_class_name.pluralize
37
+ end
38
+
39
+ def question_class_name
40
+ question_class_name_arg.blank? ? camelcased_class_name.sub(/Category$/, "") : question_class_name_arg
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,24 @@
1
+ require 'rails/generators'
2
+
3
+ module Hancock::Faq::Controllers
4
+ class DecoratorsGenerator < Rails::Generators::Base
5
+ source_root File.expand_path('../../../../../../app/controllers/concerns/hancock/faq/decorators', __FILE__)
6
+ argument :controllers, type: :array, default: []
7
+
8
+ desc 'Hancock::Faq Controllers generator'
9
+ def decorators
10
+ copied = false
11
+ (controllers == ['all'] ? permitted_controllers : controllers & permitted_controllers).each do |c|
12
+ copied = true
13
+ copy_file "#{c}.rb", "app/controllers/concerns/hancock/faq/decorators/#{c}.rb"
14
+ end
15
+ puts "U need to set controllers`s name. One of this: #{permitted_controllers.join(", ")}." unless copied
16
+ end
17
+
18
+ private
19
+ def permitted_controllers
20
+ ['categories', 'questions']
21
+ end
22
+
23
+ end
24
+ end
@@ -0,0 +1,43 @@
1
+ require 'rails/generators'
2
+
3
+ module Hancock::Faq::Controllers
4
+ class QuestionGenerator < Rails::Generators::Base
5
+ source_root File.expand_path('../templates', __FILE__)
6
+ argument :class_name, type: :string
7
+ argument :category_class_name_arg, type: :string, default: ""
8
+
9
+ desc 'Hancock::Faq Question Controller generator'
10
+ def question
11
+ template 'questions_controller.erb', "app/controllers/#{file_name}_controller.rb"
12
+ end
13
+
14
+ private
15
+ def capitalized_class_name
16
+ class_name.capitalize
17
+ end
18
+
19
+ def camelcased_class_name
20
+ class_name.camelcase
21
+ end
22
+
23
+ def camelcased_pluralized_class_name
24
+ camelcased_class_name.pluralize
25
+ end
26
+
27
+ def file_name
28
+ underscored_pluralized_class_name
29
+ end
30
+
31
+ def underscored_class_name
32
+ camelcased_class_name.underscore
33
+ end
34
+
35
+ def underscored_pluralized_class_name
36
+ underscored_class_name.pluralize
37
+ end
38
+
39
+ def category_class_name
40
+ category_class_name_arg.blank? ? "#{camelcased_class_name}Category" : category_class_name_arg
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,10 @@
1
+ class <%= camelcased_pluralized_class_name %>Controller < Hancock::Faq::CategoriesController
2
+
3
+ private
4
+ def category_class
5
+ <%= camelcased_class_name %>
6
+ end
7
+ def question_class
8
+ <%= question_class_name %>
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ class <%= camelcased_pluralized_class_name %>Controller < Hancock::Faq::QuestionsController
2
+
3
+ private
4
+ def category_class
5
+ <%= category_class_name %>
6
+ end
7
+ def question_class
8
+ <%= camelcased_class_name %>
9
+ end
10
+ end