dm_forum 4.2.1.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (185) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +23 -0
  3. data/README.md +33 -0
  4. data/Rakefile +30 -0
  5. data/app/assets/javascripts/dm_forum/admin.js +20 -0
  6. data/app/assets/javascripts/dm_forum/application.js +16 -0
  7. data/app/assets/javascripts/dm_forum/dm_forum.js +3 -0
  8. data/app/assets/stylesheets/dm_forum/admin.css +2 -0
  9. data/app/assets/stylesheets/dm_forum/application.css +12 -0
  10. data/app/controllers/dm_forum/admin/admin_controller.rb +13 -0
  11. data/app/controllers/dm_forum/admin/dashboard_controller.rb +12 -0
  12. data/app/controllers/dm_forum/admin/forum_categories_controller.rb +80 -0
  13. data/app/controllers/dm_forum/admin/forum_sites_controller.rb +40 -0
  14. data/app/controllers/dm_forum/admin/forums_controller.rb +113 -0
  15. data/app/controllers/dm_forum/application_controller.rb +25 -0
  16. data/app/controllers/dm_forum/forum_comments_controller.rb +88 -0
  17. data/app/controllers/dm_forum/forum_topics_controller.rb +93 -0
  18. data/app/controllers/dm_forum/forums_controller.rb +45 -0
  19. data/app/datatables/forum_user_datatable.rb +79 -0
  20. data/app/helpers/dm_forum/application_helper.rb +5 -0
  21. data/app/helpers/dm_forum/forum_helper.rb +109 -0
  22. data/app/mailers/forum_notification_mailer.rb +27 -0
  23. data/app/models/dm_forum/concerns/ability.rb +50 -0
  24. data/app/models/dm_forum/concerns/user.rb +37 -0
  25. data/app/models/dm_forum/permitted_params.rb +38 -0
  26. data/app/models/forum.rb +74 -0
  27. data/app/models/forum_category.rb +14 -0
  28. data/app/models/forum_comment.rb +93 -0
  29. data/app/models/forum_site.rb +27 -0
  30. data/app/models/forum_topic.rb +146 -0
  31. data/app/presenters/forum_comment_presenter.rb +8 -0
  32. data/app/presenters/forum_common_presenter.rb +31 -0
  33. data/app/presenters/forum_presenter.rb +14 -0
  34. data/app/views/dm_forum/admin/dashboard/_widget_forum_comments.html.erb +38 -0
  35. data/app/views/dm_forum/admin/dashboard/widget_forum_comments.js.erb +1 -0
  36. data/app/views/dm_forum/admin/forum_categories/_content_toolbar.html.erb +5 -0
  37. data/app/views/dm_forum/admin/forum_categories/_form.html.erb +18 -0
  38. data/app/views/dm_forum/admin/forum_categories/edit.html.erb +3 -0
  39. data/app/views/dm_forum/admin/forum_categories/index.html.erb +25 -0
  40. data/app/views/dm_forum/admin/forum_categories/new.html.erb +3 -0
  41. data/app/views/dm_forum/admin/forum_categories/show.html.erb +41 -0
  42. data/app/views/dm_forum/admin/forum_sites/_form.html.erb +18 -0
  43. data/app/views/dm_forum/admin/forum_sites/edit.html.erb +2 -0
  44. data/app/views/dm_forum/admin/forum_sites/show.html.erb +12 -0
  45. data/app/views/dm_forum/admin/forums/_content_toolbar.html.erb +5 -0
  46. data/app/views/dm_forum/admin/forums/_form.html.erb +24 -0
  47. data/app/views/dm_forum/admin/forums/edit.html.erb +2 -0
  48. data/app/views/dm_forum/admin/forums/new.html.erb +2 -0
  49. data/app/views/dm_forum/admin/forums/show.html.erb +68 -0
  50. data/app/views/dm_forum/forum_comments/_formatting.html.erb +12 -0
  51. data/app/views/dm_forum/forum_comments/edit.html.erb +15 -0
  52. data/app/views/dm_forum/forum_topics/_comment_item.html.erb +26 -0
  53. data/app/views/dm_forum/forum_topics/_comments_list.html.erb +63 -0
  54. data/app/views/dm_forum/forum_topics/_follow_button.html.erb +3 -0
  55. data/app/views/dm_forum/forum_topics/_form.html.erb +24 -0
  56. data/app/views/dm_forum/forum_topics/edit.html.erb +13 -0
  57. data/app/views/dm_forum/forum_topics/new.html.erb +13 -0
  58. data/app/views/dm_forum/forum_topics/show.html.erb +49 -0
  59. data/app/views/dm_forum/forum_topics/toggle_follow.js.coffee +5 -0
  60. data/app/views/dm_forum/forums/_category_side_list.html.erb +28 -0
  61. data/app/views/dm_forum/forums/_forum_header.html.erb +14 -0
  62. data/app/views/dm_forum/forums/_no_forums.html.erb +1 -0
  63. data/app/views/dm_forum/forums/_topics_list.html.erb +86 -0
  64. data/app/views/dm_forum/forums/categories.html.erb +32 -0
  65. data/app/views/dm_forum/forums/list.html.erb +10 -0
  66. data/app/views/dm_forum/forums/show.html.erb +39 -0
  67. data/app/views/layouts/email_templates/forum_notification.html.erb +15 -0
  68. data/app/views/layouts/email_templates/forum_notification.text.erb +16 -0
  69. data/config/initializers/dm_forum.rb +0 -0
  70. data/config/locales/fms.cs.yml +104 -0
  71. data/config/locales/fms.de.yml +104 -0
  72. data/config/locales/fms.en.yml +104 -0
  73. data/config/locales/fms.fi.yml +104 -0
  74. data/config/locales/fms.ja.yml +104 -0
  75. data/config/routes.rb +43 -0
  76. data/db/migrate/20130103151149_create_forums.rb +72 -0
  77. data/db/migrate/20130424125513_add_public_forum.rb +13 -0
  78. data/db/migrate/20130430084925_add_forum_category.rb +7 -0
  79. data/db/migrate/20140201112134_delete_monitorships.rb +17 -0
  80. data/db/migrate/20140303121325_add_requires_subscription_forum.rb +5 -0
  81. data/db/migrate/20140423113420_add_forum_owner.rb +6 -0
  82. data/db/migrate/20160821150125_index_foreign_keys_in_fms_forum_sites.rb +5 -0
  83. data/db/migrate/20160821150126_index_foreign_keys_in_fms_forum_topics.rb +9 -0
  84. data/db/migrate/20160821150127_index_foreign_keys_in_fms_forums.rb +7 -0
  85. data/lib/dm_forum/engine.rb +9 -0
  86. data/lib/dm_forum/version.rb +3 -0
  87. data/lib/dm_forum.rb +4 -0
  88. data/lib/tasks/dm_forum_tasks.rake +4 -0
  89. data/spec/dummy/README.rdoc +28 -0
  90. data/spec/dummy/Rakefile +6 -0
  91. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  92. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  93. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  94. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  95. data/spec/dummy/app/models/ability.rb +12 -0
  96. data/spec/dummy/app/models/user.rb +6 -0
  97. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  98. data/spec/dummy/bin/bundle +3 -0
  99. data/spec/dummy/bin/rails +4 -0
  100. data/spec/dummy/bin/rake +4 -0
  101. data/spec/dummy/config/application.rb +26 -0
  102. data/spec/dummy/config/boot.rb +5 -0
  103. data/spec/dummy/config/database.yml +25 -0
  104. data/spec/dummy/config/environment.rb +5 -0
  105. data/spec/dummy/config/environments/development.rb +37 -0
  106. data/spec/dummy/config/environments/production.rb +82 -0
  107. data/spec/dummy/config/environments/test.rb +39 -0
  108. data/spec/dummy/config/initializers/assets.rb +8 -0
  109. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  110. data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
  111. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  112. data/spec/dummy/config/initializers/inflections.rb +16 -0
  113. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  114. data/spec/dummy/config/initializers/session_store.rb +3 -0
  115. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  116. data/spec/dummy/config/locales/en.yml +23 -0
  117. data/spec/dummy/config/routes.rb +17 -0
  118. data/spec/dummy/config/secrets.yml +22 -0
  119. data/spec/dummy/config.ru +4 -0
  120. data/spec/dummy/db/development.sqlite3 +0 -0
  121. data/spec/dummy/db/migrate/20141114170927_add_globalize_countries.dm_core.rb +50 -0
  122. data/spec/dummy/db/migrate/20141114170928_devise_create_users.dm_core.rb +46 -0
  123. data/spec/dummy/db/migrate/20141114170929_add_user_fields.dm_core.rb +14 -0
  124. data/spec/dummy/db/migrate/20141114170930_rolify_create_roles.dm_core.rb +20 -0
  125. data/spec/dummy/db/migrate/20141114170931_add_last_access.dm_core.rb +10 -0
  126. data/spec/dummy/db/migrate/20141114170932_create_versions.dm_core.rb +19 -0
  127. data/spec/dummy/db/migrate/20141114170933_add_object_changes_column_to_versions.dm_core.rb +12 -0
  128. data/spec/dummy/db/migrate/20141114170934_create_dm_core_accounts.dm_core.rb +13 -0
  129. data/spec/dummy/db/migrate/20141114170935_add_account_to_users.dm_core.rb +9 -0
  130. data/spec/dummy/db/migrate/20141114170936_create_preferences.dm_core.rb +13 -0
  131. data/spec/dummy/db/migrate/20141114170937_create_comments.dm_core.rb +22 -0
  132. data/spec/dummy/db/migrate/20141114170938_add_activity.dm_core.rb +21 -0
  133. data/spec/dummy/db/migrate/20141114170939_add_type_to_comments.dm_core.rb +9 -0
  134. data/spec/dummy/db/migrate/20141114170940_add_category.dm_core.rb +28 -0
  135. data/spec/dummy/db/migrate/20141114170941_create_email_table.dm_core.rb +26 -0
  136. data/spec/dummy/db/migrate/20141114170942_add_user_profile.dm_core.rb +46 -0
  137. data/spec/dummy/db/migrate/20141114170943_add_profile_email.dm_core.rb +14 -0
  138. data/spec/dummy/db/migrate/20141114170944_create_payment_history.dm_core.rb +37 -0
  139. data/spec/dummy/db/migrate/20141114170945_change_anchor_field.dm_core.rb +10 -0
  140. data/spec/dummy/db/migrate/20141114170946_create_user_site_profile.dm_core.rb +27 -0
  141. data/spec/dummy/db/migrate/20141114170947_add_avatar.dm_core.rb +12 -0
  142. data/spec/dummy/db/migrate/20141114170948_add_notify_to_payment_history.dm_core.rb +8 -0
  143. data/spec/dummy/db/migrate/20141114170949_acts_as_votable_migration.dm_core.rb +28 -0
  144. data/spec/dummy/db/migrate/20141114170950_add_user_site_profile_uuid.dm_core.rb +19 -0
  145. data/spec/dummy/db/migrate/20141114170951_add_invoice_id.dm_core.rb +7 -0
  146. data/spec/dummy/db/migrate/20141114170952_acts_as_follower_migration.dm_core.rb +18 -0
  147. data/spec/dummy/db/migrate/20141114170953_rename_invoice_id.dm_core.rb +12 -0
  148. data/spec/dummy/db/migrate/20141114170954_add_core_addresses.dm_core.rb +18 -0
  149. data/spec/dummy/db/migrate/20141114170955_papertrail_increase_column.dm_core.rb +9 -0
  150. data/spec/dummy/db/migrate/20141114170956_acts_as_taggable_on_migration.dm_core.rb +32 -0
  151. data/spec/dummy/db/migrate/20141114170957_add_missing_unique_indices.dm_core.rb +23 -0
  152. data/spec/dummy/db/migrate/20141114170958_add_taggings_counter_cache_to_tags.dm_core.rb +16 -0
  153. data/spec/dummy/db/migrate/20141114170959_create_custom_fields.dm_core.rb +40 -0
  154. data/spec/dummy/db/migrate/20141114170960_add_missing_taggable_index.dm_core.rb +11 -0
  155. data/spec/dummy/db/migrate/20141119112030_create_cms.dm_cms.rb +92 -0
  156. data/spec/dummy/db/migrate/20141119112031_add_account_to_cms.dm_cms.rb +11 -0
  157. data/spec/dummy/db/migrate/20141119112032_create_blog.dm_cms.rb +62 -0
  158. data/spec/dummy/db/migrate/20141119112033_add_notification_sent.dm_cms.rb +6 -0
  159. data/spec/dummy/db/migrate/20141119112034_add_blog_comment.dm_cms.rb +8 -0
  160. data/spec/dummy/db/migrate/20141119112035_add_blog_image.dm_cms.rb +6 -0
  161. data/spec/dummy/db/migrate/20141119112036_rename_snippet_slug.dm_cms.rb +14 -0
  162. data/spec/dummy/db/migrate/20141119112037_add_requires_subscription_blog.dm_cms.rb +8 -0
  163. data/spec/dummy/db/migrate/20141119112038_add_pages_ranked_model.dm_cms.rb +23 -0
  164. data/spec/dummy/db/migrate/20141119112039_add_blog_owner.dm_cms.rb +7 -0
  165. data/spec/dummy/db/migrate/20141119112040_create_media_files.dm_cms.rb +30 -0
  166. data/spec/dummy/db/migrate/20141119112041_add_cmspage_summary.dm_cms.rb +7 -0
  167. data/spec/dummy/db/migrate/20141119112042_add_blog_image_email_header.dm_cms.rb +6 -0
  168. data/spec/dummy/db/migrate/20141119112043_add_header_image.dm_cms.rb +10 -0
  169. data/spec/dummy/db/migrate/20160128144312_add_favored_locale.dm_core.rb +17 -0
  170. data/spec/dummy/db/migrate/20160128144313_update_papertrail_v4.dm_core.rb +41 -0
  171. data/spec/dummy/db/schema.rb +628 -0
  172. data/spec/dummy/public/404.html +67 -0
  173. data/spec/dummy/public/422.html +67 -0
  174. data/spec/dummy/public/500.html +66 -0
  175. data/spec/dummy/public/favicon.ico +0 -0
  176. data/spec/factories/accounts.rb +9 -0
  177. data/spec/factories/user_profiles.rb +10 -0
  178. data/spec/factories/users.rb +19 -0
  179. data/spec/models/forum_spec.rb +9 -0
  180. data/spec/rails_helper.rb +70 -0
  181. data/spec/spec_helper.rb +85 -0
  182. data/spec/support/accounts.rb +17 -0
  183. data/spec/support/devise.rb +44 -0
  184. data/spec/support/fix_locale.rb +57 -0
  185. metadata +337 -0
@@ -0,0 +1,146 @@
1
+ class ForumTopic < ActiveRecord::Base
2
+
3
+ self.table_name = 'fms_forum_topics'
4
+
5
+ attr_accessor :body
6
+ attr_readonly :comments_count, :hits, :forum_posts_count
7
+
8
+ # --- FriendlyId
9
+ extend FriendlyId
10
+ include DmCore::Concerns::FriendlyId
11
+
12
+ acts_as_followable
13
+
14
+ before_validation :set_default_attributes, :on => :create
15
+
16
+ after_create :create_initial_comment
17
+ before_update :check_for_moved_forum
18
+ after_update :set_comment_forum_id
19
+ before_destroy :count_user_comments_for_counter_cache
20
+ after_destroy :update_cached_forum_and_user_counts
21
+
22
+ #--- creator of forum topic
23
+ belongs_to :user
24
+ belongs_to :account
25
+
26
+ #--- creator of recent comment
27
+ belongs_to :last_user, :class_name => "User"
28
+
29
+ belongs_to :forum, :counter_cache => true
30
+
31
+ #--- forum's site, set by callback
32
+ belongs_to :forum_site, :counter_cache => true
33
+
34
+ #--- don't use acts_as_commentable since we're using a specialized ForumComment class
35
+ has_many :forum_comments, {:as => :commentable, :dependent => :destroy}
36
+ has_one :recent_comment, -> { where(ancestry_depth: 1).order('created_at DESC') }, :as => :commentable, :class_name => "ForumComment"
37
+
38
+ has_many :voices, -> { distinct(true) }, :through => :forum_comments, :source => :user
39
+
40
+ validates_presence_of :user_id, :forum_site_id, :forum_id, :title
41
+ validates_presence_of :body, :on => :create
42
+
43
+ default_scope { where(account_id: Account.current.id) }
44
+
45
+ # use babosa gem (to_slug) to allow better handling of multi-language slugs
46
+ #------------------------------------------------------------------------------
47
+ def model_slug
48
+ title
49
+ end
50
+
51
+ # The first comment on a topic is the topic text. So the number of *replies*
52
+ # is the number of comments - 1
53
+ #------------------------------------------------------------------------------
54
+ def num_replies
55
+ comments_count - 1
56
+ end
57
+ #------------------------------------------------------------------------------
58
+ def to_s
59
+ title
60
+ end
61
+
62
+ #------------------------------------------------------------------------------
63
+ def sticky?
64
+ sticky
65
+ end
66
+
67
+ #------------------------------------------------------------------------------
68
+ def hit!
69
+ self.class.increment_counter :hits, id
70
+ end
71
+
72
+ #------------------------------------------------------------------------------
73
+ def paged?
74
+ comments_count > ForumComment.per_page
75
+ end
76
+
77
+ #------------------------------------------------------------------------------
78
+ def last_page
79
+ [(comments_count.to_f / ForumComment.per_page.to_f).ceil.to_i, 1].max
80
+ end
81
+
82
+ #------------------------------------------------------------------------------
83
+ def comment_number(forum_comment)
84
+ self.forum_comments.where("id <= #{forum_comment.id}").count
85
+ end
86
+
87
+ #------------------------------------------------------------------------------
88
+ def comment_page(forum_comment)
89
+ [(comment_number(forum_comment).to_f / ForumComment.per_page.to_f).ceil.to_i, 1].max
90
+ end
91
+
92
+ #------------------------------------------------------------------------------
93
+ def update_cached_comment_fields(forum_comment)
94
+ #--- these fields are not accessible to mass assignment
95
+ if remaining_comment = forum_comment.frozen? ? recent_comment : forum_comment
96
+ self.class.where(:id => id).update_all(:last_updated_at => remaining_comment.created_at,
97
+ :last_user_id => remaining_comment.user_id, :last_forum_comment_id => remaining_comment.id)
98
+ else
99
+ destroy
100
+ end
101
+ end
102
+
103
+ protected
104
+
105
+ #------------------------------------------------------------------------------
106
+ def create_initial_comment
107
+ self.forum_comments.create_comment(self, body, user)
108
+ @body = nil
109
+ end
110
+
111
+ #------------------------------------------------------------------------------
112
+ def set_default_attributes
113
+ self.forum_site_id = forum.forum_site_id if forum_id
114
+ self.sticky ||= 0
115
+ self.last_updated_at ||= Time.now.utc
116
+ end
117
+
118
+ #------------------------------------------------------------------------------
119
+ def check_for_moved_forum
120
+ old = ForumTopic.find(id)
121
+ @old_forum_id = old.forum_id if old.forum_id != forum_id
122
+ true
123
+ end
124
+
125
+ #------------------------------------------------------------------------------
126
+ def set_comment_forum_id
127
+ return unless @old_forum_id
128
+ Forum.where(:id => @old_forum_id).update_all("comments_count = comments_count - #{comments_count}")
129
+ Forum.where(:id => forum_id).update_all("comments_count = comments_count + #{comments_count}")
130
+ Forum.where(:id => @old_forum_id).update_all("forum_topics_count = forum_topics_count - 1")
131
+ Forum.where(:id => forum_id).update_all("forum_topics_count = forum_topics_count + 1")
132
+ end
133
+
134
+ #------------------------------------------------------------------------------
135
+ def count_user_comments_for_counter_cache
136
+ @user_comments = forum_comments.group_by { |p| p.user_id }
137
+ end
138
+
139
+ #------------------------------------------------------------------------------
140
+ def update_cached_forum_and_user_counts
141
+ Forum.where(:id => forum_id).update_all("comments_count = comments_count - #{comments_count}")
142
+ # @user_comments.each do |user_id, comments|
143
+ # User.where(:id => user_id).update_all("comments_count = comments_count - #{forum_comments.size}")
144
+ # end
145
+ end
146
+ end
@@ -0,0 +1,8 @@
1
+ # Define presentation-specific methods here. Helpers are accessed through
2
+ # `helpers` (aka `h`).
3
+ #------------------------------------------------------------------------------
4
+ class ForumCommentPresenter < CommentPresenter
5
+
6
+ presents :forum_comment
7
+
8
+ end
@@ -0,0 +1,31 @@
1
+ # Define presentation-specific methods here. Helpers are accessed through
2
+ # `helpers` (aka `h`).
3
+ #
4
+ # This class is used to contain some common presenter functions
5
+ #------------------------------------------------------------------------------
6
+ class ForumCommonPresenter < BasePresenter
7
+ presents :model
8
+
9
+ #------------------------------------------------------------------------------
10
+ # Admin presenter methods
11
+
12
+ #------------------------------------------------------------------------------
13
+ def label_published
14
+ model.published? ? h.colored_label('Published', :success) : h.colored_label('Draft')
15
+ end
16
+
17
+ #
18
+ # #------------------------------------------------------------------------------
19
+ # # Front-end presenter methods
20
+ #
21
+ # # Run content through a standard Textile/Liquid renderer
22
+ # #------------------------------------------------------------------------------
23
+ # def render_content(arguments = {})
24
+ # doc = RedCloth.new(Liquid::Template.parse(model.content).render(arguments, :filters => [LiquidFilters],
25
+ # :registers => {:controller => controller, :view => self, :account_site_assets => '/site_assets', :current_user => current_user}))
26
+ # #doc.hard_breaks = false
27
+ #
28
+ # return doc.to_html.html_safe
29
+ # end
30
+
31
+ end
@@ -0,0 +1,14 @@
1
+ # Define presentation-specific methods here. Helpers are accessed through
2
+ # `helpers` (aka `h`).
3
+ #------------------------------------------------------------------------------
4
+ class ForumPresenter < ForumCommonPresenter
5
+ presents :forum
6
+
7
+ #------------------------------------------------------------------------------
8
+ def visibility
9
+ forum.visibility_to_s
10
+ end
11
+
12
+ # #delegate :something, to: :course
13
+ #
14
+ end
@@ -0,0 +1,38 @@
1
+ <% comment_day = params[:comment_day].to_i %>
2
+ <% date_range = (Date.today - comment_day.day).midnight..(Date.today - (comment_day - 1).day).midnight %>
3
+ <% comments = Comment.where(commentable_type: ForumTopic, created_at: date_range).order('created_at DESC') %>
4
+ <% title = comment_day == 0 ? 'Today\'s Forum Comments' : comment_day == 1 ? 'Yesterday\'s Forum Comments' : "Forum Comments #{comment_day} days ago" %>
5
+ <% content_for :forum_title_toolbar do %>
6
+ <%= toolbar_btn(comments.size, dm_core.admin_dashboard_path, title: 'Number of comments today', class: 'label label-success pull-right') %>
7
+ <div class="panel-icons-group">
8
+ <%= link_to icons('icon-arrow-left11'), dm_forum.admin_widget_forum_comments_path(comment_day: comment_day + 1), remote: true, class: 'btn btn-link btn-icon' %>
9
+ <% if @comment_day == 0 %>
10
+ <%= link_to icons('icon-arrow-right12'), '#', class: 'btn btn-link btn-icon disabled' %>
11
+ <% else %>
12
+ <%= link_to icons('icon-arrow-right12'), dm_forum.admin_widget_forum_comments_path(comment_day: comment_day - 1), remote: true, class: 'btn btn-link btn-icon' %></li>
13
+ <% end %>
14
+ <%= link_to icons('icon-spinner8'), dm_forum.admin_widget_forum_comments_path(comment_day: comment_day), class: 'btn btn-link btn-icon hovertip', title: 'Refresh', remote: true %>
15
+ </div>
16
+ <% end %>
17
+
18
+ <%= panel title: title, toolbar: content_for(:forum_title_toolbar) do %>
19
+ <% if comments.size == 0 %>
20
+ <p>No comments posted yet</p>
21
+ <% else %>
22
+ <% comments.each do |comment| %>
23
+ <!-- Comment -->
24
+ <div class="media">
25
+ <a class="pull-left" href="#"><div class="media-object"><%= avatar_for comment.user, 50 %></div></a>
26
+ <div class="media-body">
27
+ <%= link_to "<span class='hovertip' data-placement='right' title='#{comment.user.full_name}'>#{present(comment).author}</span>".html_safe, dm_forum.forum_forum_topic_path(comment.commentable.forum.slug, comment.commentable.slug, anchor: "forum_comment_#{comment.id}"), class: 'media-heading' %>
28
+ <ul class="headline-info">
29
+ <li><%= format_datetime comment.created_at %></li>
30
+ <li><%= link_to comment.commentable.title, dm_forum.forum_forum_topic_path(comment.commentable.forum.slug, comment.commentable.slug, anchor: "forum_comment_#{comment.id}"), class: 'post_title', target: '_blank' %></li>
31
+ </ul>
32
+ <%= present(comment).formatted_comment %>
33
+ </div>
34
+ </div>
35
+ <!-- /comment -->
36
+ <% end %>
37
+ <% end %>
38
+ <% end %>
@@ -0,0 +1 @@
1
+ $('#widget_forum_comments').empty().append('<%= j render 'widget_forum_comments', comment_day: @comment_day %>')
@@ -0,0 +1,5 @@
1
+ <%= nav_bar_items([
2
+ link_to(icon_label(:edit, 'Edit'), [:edit, :admin, item], :class => "nav-btn-primary"),
3
+ link_to(icon_label(:trash, 'Delete'), [:admin, item], method: :delete, class: "nav-btn-danger", data: {confirm: 'Are you sure you wish to delete this category? All forums and comments will also be deleted!'})
4
+ ])
5
+ %>
@@ -0,0 +1,18 @@
1
+ <% submit_url = (@forum_category.new_record? ? admin_forum_categories_path : admin_forum_category_path) %>
2
+ <%= simple_form_for @forum_category, url: submit_url,
3
+ html: { class: 'form-horizontal' }, wrapper: :bs3_horizontal_form, wrapper_mappings: DmAdmin::FormWrapperMappings do |f| %>
4
+
5
+ <%= f.error_notification message: "Please review the problems below" %>
6
+ <% toolbar = capture do %>
7
+ <%= link_to icons(:cancel), [:admin, @forum_category], class: 'btn btn-link btn-icon' %>
8
+ <% end %>
9
+ <%= panel title: @title, toolbar: toolbar do %>
10
+ <%= locale_tabs do |locale| %>
11
+ <%= f.input "name_#{locale}", label: 'Category Name', id: 'name_error', required: true %>
12
+ <%#= f.input "description_#{locale}", as: :text, label: 'Description', input_html: { rows: 6, class: 'input-block-level monospaced' } %>
13
+ <% end %>
14
+
15
+ <%= submit_or_cancel cancel_url: [:admin, @forum_category], delete_url: ([:admin, @forum_category] unless @forum_category.new_record?), delete_confirm: 'Are you sure you wish to delete this forum category? All forums and comments will also be deleted!' %>
16
+
17
+ <% end %>
18
+ <% end %>
@@ -0,0 +1,3 @@
1
+ <% content_for :content_title, icon_label('font-comments', @forum_category.name) %>
2
+ <% @title = 'Edit Forum Category' %>
3
+ <%= render 'form' %>
@@ -0,0 +1,25 @@
1
+ <% content_for :content_title, icon_label('font-comments', 'Forum Categories') %>
2
+
3
+ <% toolbar = toolbar_btn(icons(:new), new_admin_forum_category_path, title: 'New Category', class: "btn btn-link btn-icon") %>
4
+ <%= panel body: false, toolbar: toolbar do %>
5
+ <table id="drag_sort" class="table table-striped table-bordered table-block" data-update_url="<%= dm_forum.admin_forum_category_sort_path %>">
6
+ <thead>
7
+ <tr>
8
+ <th class="sort_handle"></th>
9
+ <th>Name</th>
10
+ <th width="50">Status</th>
11
+ </tr>
12
+ </thead>
13
+ <tbody>
14
+ <% @forum_categories.each do |forum_category| %>
15
+ <tr class="item" data-item_id="<%= forum_category.id %>">
16
+ <td class="sort_handle"></td>
17
+ <td>
18
+ <%= link_to(forum_category.name.to_s_default, admin_forum_category_path(forum_category)) %>
19
+ </td>
20
+ <td></td>
21
+ </tr>
22
+ <% end %>
23
+ </tbody>
24
+ </table>
25
+ <% end %>
@@ -0,0 +1,3 @@
1
+ <% content_for :content_title, icon_label('font-comments', 'Forum Categories') %>
2
+ <% @title = 'New Forum Category' %>
3
+ <%= render 'form' %>
@@ -0,0 +1,41 @@
1
+ <% content_for :content_title, icon_label('font-comments', @forum_category.name) %>
2
+ <% content_for :content_title_extra do %>
3
+ <%= page_header_buttons do %>
4
+ <%= link_to(icon_label(:edit, 'Edit'), [:edit, :admin, @forum_category], class: "btn btn-xs btn-default", title: 'Edit') %>
5
+ <% end %>
6
+ <% end %>
7
+
8
+ <% toolbar = toolbar_btn(icons(:new), new_admin_forum_category_forum_path(@forum_category), title: 'New Forum', class: "btn btn-link btn-icon") %>
9
+ <%= panel title: 'Forums', toolbar: toolbar, body: false do %>
10
+ <div class="table-overflow">
11
+ <table id="drag_sort" class="table table-striped table-bordered table-block" data-update_url="<%= dm_forum.admin_forum_sort_path %>">
12
+ <thead>
13
+ <tr>
14
+ <th class="sort_handle"></th>
15
+ <th>Name</th>
16
+ <th>Associated Event</th>
17
+ <th width="50">Type</th>
18
+ <th width="50">Status</th>
19
+ </tr>
20
+ </thead>
21
+ <tbody>
22
+ <% @forum_category.forums.each do |forum| %>
23
+ <% present forum do |forum_presenter| %>
24
+ <tr class="item" data-item_id="<%= forum.id %>">
25
+ <td class="sort_handle"></td>
26
+ <td>
27
+ <%= link_to forum.name, [:admin, forum] %>
28
+ <div class="description">
29
+ <%= forum.description %>
30
+ </div>
31
+ </td>
32
+ <td><%= forum.owner.try(:title) %></td>
33
+ <td><%= forum_presenter.visibility %></td>
34
+ <td><%= forum_presenter.label_published %></td>
35
+ </tr>
36
+ <% end %>
37
+ <% end %>
38
+ </tbody>
39
+ </table>
40
+ </div>
41
+ <% end %>
@@ -0,0 +1,18 @@
1
+ <%= simple_form_for @forum_site, url: dm_forum.admin_forum_site_path,
2
+ html: { class: 'form-horizontal' }, wrapper: :bs3_horizontal_form, wrapper_mappings: DmAdmin::FormWrapperMappings do |f| %>
3
+
4
+ <%= f.error_notification message: "Please review the problems below" %>
5
+
6
+ <% toolbar = capture do %>
7
+ <%= link_to icons(:cancel), dm_forum.admin_forum_site_url, class: 'btn btn-link btn-icon' %>
8
+ <% end %>
9
+ <%= panel title: @title, toolbar: toolbar do %>
10
+
11
+ <%= f.input :enabled, as: :toggle, label: 'Enable Forums?' %>
12
+ <%= f.input :tagline, as: :text, label: 'Tagline', input_html: { rows: 4, class: 'input-block-level' } %>
13
+ <%= f.input :description, as: :text, label: 'Description', input_html: { rows: 4, class: 'input-block-level' } %>
14
+
15
+ <%= submit_or_cancel cancel_url: dm_forum.admin_forum_site_url %>
16
+
17
+ <% end %>
18
+ <% end %>
@@ -0,0 +1,2 @@
1
+ <% @title = 'Edit Forum Settings' %>
2
+ <%= render 'form' %>
@@ -0,0 +1,12 @@
1
+ <% toolbar = capture do %>
2
+ <%= @forum_site.enabled? ? colored_label('Forums Enabled', :success) : colored_label('Forums Disabled') %>
3
+ <%= link_to(icons(:edit), dm_forum.edit_admin_forum_site_path, class: "btn btn-link btn-icon") %>
4
+ <% end %>
5
+ <%= panel title: "Forum Settings", toolbar: toolbar do %>
6
+ <dl class="dl-horizontal">
7
+ <dt>Tagline</dt>
8
+ <dd><%= @forum_site.tagline.to_s_default %></dd>
9
+ <dt>Description</dt>
10
+ <dd><%= @forum_site.description.to_s_default %></dd>
11
+ </dl>
12
+ <% end %>
@@ -0,0 +1,5 @@
1
+ <%= nav_bar_items([
2
+ link_to(icon_label('icon-edit', 'Edit'), [:edit, :admin, item], class: "nav-btn-primary"),
3
+ link_to(icon_label('icon-trash', 'Delete'), [:admin, item], method: :delete, class: "nav-btn-danger", data: {confirm: 'Are you sure you wish to delete this forum? All comments will also be deleted!'})
4
+ ])
5
+ %>
@@ -0,0 +1,24 @@
1
+ <% submit_url = (@forum.new_record? ? admin_forum_category_forums_path(@forum_category) : admin_forum_path) %>
2
+ <%= simple_form_for @forum, url: submit_url,
3
+ html: { class: 'form-horizontal' }, wrapper: :bs3_horizontal_form, wrapper_mappings: DmAdmin::FormWrapperMappings do |f| %>
4
+
5
+ <%= f.error_notification message: "Please review the problems below" %>
6
+ <% toolbar = capture do %>
7
+ <%= link_to icons(:cancel), (@forum.new_record? ? admin_forum_category_path(@forum.forum_category) : admin_forum_path(@forum)), class: 'btn btn-link btn-icon' %>
8
+ <% end %>
9
+ <%= panel title: @title, toolbar: toolbar do %>
10
+ <%= f.input :name, required: true, autofocus: true %>
11
+ <%= f.input :slug, label: 'Slug', hint: 'Leave blank to have auto-generated based on title.' %>
12
+ <%= f.input :description, as: :text, label: 'Description', input_html: { rows: 4, class: 'input-block-level' } %>
13
+ <%= f.input :published, as: :toggle, label: 'Publish It?' %>
14
+ <%= f.input :is_public, as: :toggle, label: 'Make Forum Public?', hint: 'This will allow anyone to see the forum. Use option below to restrict to registered users' %>
15
+ <%= f.input :requires_login, as: :toggle, label: 'Public Requires Login?', hint: 'If this is a public forum, user must be logged in to see it. (All private forums automatically require login)' %>
16
+ <% if defined? DmSubscriptions %>
17
+ <%= f.input :requires_subscription, as: :toggle, label: 'Subscription Required?', hint: 'User must have a paid subscription to access' %>
18
+ <% end %>
19
+
20
+ <%= submit_or_cancel cancel_url: (@forum.new_record? ? admin_forum_category_path(@forum.forum_category) : admin_forum_path(@forum)),
21
+ delete_url: ([:admin, @forum] unless @forum.new_record?), delete_confirm: 'Are you sure you wish to delete this forum? All comments will also be deleted!' %>
22
+
23
+ <% end %>
24
+ <% end %>
@@ -0,0 +1,2 @@
1
+ <% @title = 'Edit Forum' %>
2
+ <%= render 'form' %>
@@ -0,0 +1,2 @@
1
+ <% @title = 'New Forum' %>
2
+ <%= render 'form' %>
@@ -0,0 +1,68 @@
1
+ <% content_for :content_title, icon_label('font-comment', @forum.name) %>
2
+ <% content_for :content_title_extra do %>
3
+ <%= page_header_buttons do %>
4
+ <%= link_to(icon_label(:edit, 'Edit'), [:edit, :admin, @forum], class: "btn btn-xs btn-default", title: 'Edit') %>
5
+ <% end %>
6
+ <% end %>
7
+
8
+ <%= panel header: false do %>
9
+ <dl>
10
+ <dt>Category</dt>
11
+ <dd><%= link_to @forum.forum_category.name, admin_forum_category_path(@forum.forum_category) %></dd>
12
+ <dt>Description</dt>
13
+ <dd><%= @forum.description %></dd>
14
+ </dl>
15
+ <% end %>
16
+
17
+ <% if @forum.owner %>
18
+ <% toolbar = toolbar_btn(@forum.member_count(:automatic), '#', title: 'Number of users with automatic forum access', class: 'label label-success pull-right') %>
19
+ <%= panel title: 'Users with Automatic Access', toolbar: toolbar do %>
20
+ <h5>Automatic Access Granted for Event</h5>
21
+ <p><%= @forum.owner.title %></p>
22
+ <% end %>
23
+ <% end %>
24
+
25
+
26
+ <% toolbar = toolbar_btn(@forum.member_count(:manual), '#', title: 'Number of users with forum access', class: 'label label-success pull-right') %>
27
+ <%= panel title: 'Users with Manual Access', toolbar: toolbar do %>
28
+ <div class="row">
29
+ <div class="col-md-6">
30
+ <%= subsection title: 'Users with Access' do %>
31
+ <table class="table table-striped table-bordered">
32
+ <thead>
33
+ <tr>
34
+ <th>Name</th>
35
+ <th>Country</th>
36
+ </tr>
37
+ </thead>
38
+ <tbody>
39
+ <% @forum.member_list(:manual).each do |user| %>
40
+ <tr>
41
+ <td><%= link_to(icons("icon-minus"), dm_forum.forum_delete_member_admin_forum_path(@forum, user_id: user.id), method: :delete, title: 'Remove Access') + "&nbsp;&nbsp;".html_safe + user.full_name %></td>
42
+ <td><%= user.country.english_name %></td>
43
+ </tr>
44
+ <% end %>
45
+ </tbody>
46
+ </table>
47
+ <% end %>
48
+ </div>
49
+
50
+ <div class="col-md-6">
51
+ <%= subsection title: 'Add Individual Users' do %>
52
+ <div class="table-overflow">
53
+ <table id="forum_user_table" class="table table-striped table-bordered" data-source="<%= dm_forum.forum_users_admin_forum_url %>">
54
+ <thead>
55
+ <tr>
56
+ <th>Name</th>
57
+ <th>Country</th>
58
+ </tr>
59
+ </thead>
60
+ <tbody>
61
+ </tbody>
62
+ </table>
63
+ </div>
64
+ </div>
65
+ <% end %>
66
+ </div>
67
+ <% end %>
68
+
@@ -0,0 +1,12 @@
1
+ <div id="markup_help">
2
+ <h3><%= I18n.t 'fms.views_posts.formatting_help' %></h3>
3
+ <p><a href="http://daringfireball.net/projects/markdown/syntax" target="_blank">Markdown</a> <%= I18n.t 'fms.views_posts.formatting_desc' %></p>
4
+ <ul class="list">
5
+ <li><%= t 'fms.views_posts.formatting_bold' %></li>
6
+ <li><%= t 'fms.views_posts.formatting_italics' %></li>
7
+ <li><%= (t 'fms.views_posts.formatting_blockquote').html_safe %></li>
8
+ <li><%= t 'fms.views_posts.formatting_icode' %></li>
9
+ <li><%= (t 'fms.views_posts.formatting_horizontal_rule').html_safe %></li>
10
+ <li><%= (t 'fms.views_posts.formatting_list').html_safe %></li>
11
+ </ul>
12
+ </div>
@@ -0,0 +1,15 @@
1
+ <% content_for :page_title, @forum_topic.title %>
2
+ <%= render(:partial => 'dm_forum/forums/forum_header', :object => @forum_topic.forum, :as => :forum) %>
3
+
4
+ <h1 id="topic_title">
5
+ <%= @forum_topic.title %>
6
+ <% if @forum_topic.locked? %>
7
+ <span>(<%= I18n.t 'fms.topic' %> <%= I18n.t 'fms.locked' %>)</span>
8
+ <% end %>
9
+ </h1>
10
+
11
+ <%= simple_form_for [@forum, @forum_topic, @forum_comment], wrapper: simple_form_theme_wrapper do |f| %>
12
+ <%#= f.error_messages %>
13
+ <%= f.input :body, :as => :text, :label => I18n.t('fms.views_topics.body'), :input_html => {:rows => 10} %>
14
+ <%= f.submit I18n.t('fms.views_posts.save'), class: 'btn btn-primary' %>
15
+ <% end %>
@@ -0,0 +1,26 @@
1
+ <li class="clearfix" id="<%= dom_id(comment_item) %>">
2
+ <div class="user"><%= avatar_for comment_item.user, 48 %></div>
3
+ <p class="comment_author"><%= truncate(comment_item.user.display_name, :length => 30) %>
4
+ <% if false #can?(:moderate, comment_item.forum_topic.forum) || !comment_item.user.active? %>
5
+ <span class="admin">(<%= forum_comment_user_state(comment_item) %>)</span>
6
+ <% end %>
7
+ </p>
8
+ <p class="info">
9
+ <%= present(comment_item).date_posted %>
10
+ <% edited = edited_on_tag(comment_item) %>
11
+ <%= " | #{edited}".html_safe if edited %>
12
+ <%= ' | '.html_safe + link_to(I18n.t('fms.reply'), '#reply') unless @forum_topic.locked? || !user_signed_in? %>
13
+ <% if user_signed_in? && can?(:edit, comment_item) %>
14
+ |
15
+ <%= link_to I18n.t('fms.admin.edit_post'), edit_forum_forum_topic_forum_comment_path(@forum, @forum_topic, comment_item), :class => 'utility' %>
16
+ <% end %>
17
+ </p>
18
+ <div class="clearfix"></div>
19
+ <div class="comment_text">
20
+ <% if comment_item.user.active? %>
21
+ <%= present(comment_item).formatted_comment %>
22
+ <% else %>
23
+ <p>(<% I18n.t 'fms.suspended_user_post' %>)</p>
24
+ <% end %>
25
+ </div>
26
+ </li>
@@ -0,0 +1,63 @@
1
+ <a name="<%= dom_id @forum_comments.first %>" id="<%= dom_id @forum_comments.first %>">&#xA0;</a>
2
+
3
+ <div id="comment_section">
4
+ <% if @forum_comments.first.is_root? %>
5
+ <div class="comments clearfix">
6
+ <ul class="comment_list first_comment">
7
+ <%= render(:partial => 'comment_item', object: @forum_comments.first) %>
8
+ </ul>
9
+ </div>
10
+ <% end %>
11
+
12
+ <div class="comment_section_header">
13
+ <div class="num_comments"> <%= "#{@forum_comments.count - 1} #{I18n.t 'cms.comments_stat'}" %></div>
14
+ <% if user_signed_in? and !@forum_topic.locked? %>
15
+ <div class="reply_link"><%= link_to I18n.t('fms.reply_to_topic'), "#reply" %></div>
16
+ <% end %>
17
+ <div class="comment_pagination"><%= pagination(@forum_comments) %></div>
18
+ </div>
19
+
20
+
21
+ <div class="comments clearfix">
22
+ <ul class="comment_list">
23
+ <% for forum_comment in @forum_comments do %>
24
+ <%= render(:partial => 'comment_item', object: forum_comment) unless forum_comment.is_root? %>
25
+ <% end %>
26
+ <% if current_user %>
27
+ <li class="clearfix" id="reply">
28
+ <% if !@forum_topic.locked? %>
29
+ <div class="user"><%= avatar_for current_user, 50 %></div>
30
+ <div class="reply_field">
31
+ <%= simple_form_for [@forum, @forum_topic, @forum_topic.forum_comments.new] do |f| %>
32
+ <%= f.text_area :body, rows: 5, placeholder: I18n.t('cms.add_comment') %>
33
+ <div class="comment_formatting_hint">
34
+ <%= nls :comment_extra_instruction %>
35
+ <%= I18n.t('fms.comment_notification_inform')%>
36
+ </div>
37
+ <%= f.submit I18n.t('fms.views_topics.save_reply'), class: 'btn btn-primary' %>
38
+ <% end %>
39
+ </div>
40
+ <% end %>
41
+ </li>
42
+ <% end %>
43
+ </ul>
44
+ </div>
45
+
46
+ <% if @forum_topic.locked? %>
47
+ <div class="topic_locked_message">
48
+ <p class="topic_locked"><%= I18n.t 'fms.views_topics.locked_topic' %></p>
49
+ </div>
50
+ <% elsif !current_user %>
51
+ <p><%= I18n.t 'cms.comment_login_required' %></p>
52
+ <div class="login_required_buttons">
53
+ <%= link_to I18n.t('core.login'), main_app.new_user_session_path, class: 'btn btn-primary' %>
54
+ <%= link_to I18n.t('core.create_account'), main_app.new_user_registration_path, class: 'btn' %>
55
+ </div>
56
+ <% end %>
57
+
58
+
59
+ <div class="comment_section_footer">
60
+ <div class="comment_pagination"><%= pagination(@forum_comments) %></div>
61
+ </div>
62
+ </div>
63
+ <div class="clear"></div>
@@ -0,0 +1,3 @@
1
+ <% button_title = following ? I18n.t('fms.follow_stop') : I18n.t('fms.follow') %>
2
+ <% follow_class = following ? 'btn btn-default btn-small follow_active' : 'btn btn-default btn-small' %>
3
+ <%= button_to button_title, forum_forum_topic_toggle_follow_path(@forum, @forum_topic.id), remote: true, method: :patch, id: 'follow_button', class: follow_class %>