From cd370892caaada0f7f0f127657d94769ca4ccb01 Mon Sep 17 00:00:00 2001 From: luap42 / Paul Date: Sat, 5 Feb 2022 18:16:04 +0100 Subject: [PATCH 001/347] Add moderator tools to user header --- app/assets/stylesheets/tabs.scss | 4 +++ app/controllers/users_controller.rb | 1 + app/views/users/_tabs.html.erb | 6 ++++ app/views/users/show.html.erb | 47 ++++++++++------------------- 4 files changed, 27 insertions(+), 31 deletions(-) diff --git a/app/assets/stylesheets/tabs.scss b/app/assets/stylesheets/tabs.scss index 108168625..b3122a994 100644 --- a/app/assets/stylesheets/tabs.scss +++ b/app/assets/stylesheets/tabs.scss @@ -2,4 +2,8 @@ .tabs { margin-bottom: 1em; + + .tabs--push { + flex-grow: 1; + } } \ No newline at end of file diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 8f9945197..f25247625 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -465,6 +465,7 @@ def vote_summary .group_by(&:date_of).map { |k, vl| [k, vl.group_by(&:post) ] } \ .paginate(page: params[:page], per_page: 15) @votes + render layout: 'without_sidebar' end def avatar diff --git a/app/views/users/_tabs.html.erb b/app/views/users/_tabs.html.erb index 0c4713fef..f476b40b2 100644 --- a/app/views/users/_tabs.html.erb +++ b/app/views/users/_tabs.html.erb @@ -19,4 +19,10 @@ Preferences <% end %> <% end %> +
+ <% if current_user&.is_moderator %> + <%= link_to mod_user_path(user), class: "tabs--item" do %> + Moderator Tools + <% end %> + <% end %> \ No newline at end of file diff --git a/app/views/users/show.html.erb b/app/views/users/show.html.erb index ef4f914c6..6f3b797b8 100644 --- a/app/views/users/show.html.erb +++ b/app/views/users/show.html.erb @@ -4,25 +4,26 @@ <%= render 'deleted', user: @user %> <% end %> -

<%= rtl_safe_username(@user) %>

- -<% if @user.community_user.suspended? %> -
- <% if @user.community_user.suspension_public_comment.nil? %> -

This user has been temporarily suspended. - <% else %> -

This user has been temporarily suspended <%= @user.community_user.suspension_public_comment %>. - <% end %> - - The suspension ends in <%= time_ago_in_words(@user.community_user.suspension_end) %>.

-
-<% end %> - <%= render 'tabs', user: @user %>
-
+
+ +

<%= rtl_safe_username(@user) %>

+ + <% if @user.community_user.suspended? %> +
+ <% if @user.community_user.suspension_public_comment.nil? %> +

This user has been temporarily suspended. + <% else %> +

This user has been temporarily suspended <%= @user.community_user.suspension_public_comment %>. + <% end %> + + The suspension ends in <%= time_ago_in_words(@user.community_user.suspension_end) %>.

+
+ <% end %> +

<% if @user.website.present? %> @@ -55,22 +56,6 @@ Subscribe to user <% end %> <% end %> - <% if current_user&.is_moderator %> - Moderator Tools -

- <% end %> <% if current_user&.id == @user.id %> <%= link_to qr_login_code_path, class: 'button is-outlined is-small' do %> Mobile Sign In From 208f5157d6dcb8ab7fab6ea7b3a6cb00e2cbf2f4 Mon Sep 17 00:00:00 2001 From: luap42 / Paul Date: Sat, 5 Feb 2022 18:34:18 +0100 Subject: [PATCH 002/347] Implement sidebar infrastructure for new mod tools --- app/controllers/users_controller.rb | 4 +- app/views/shared/_user_mod_sidebar.html.erb | 59 +++++++++++++++++++++ app/views/users/mod.html.erb | 41 +++----------- 3 files changed, 68 insertions(+), 36 deletions(-) create mode 100644 app/views/shared/_user_mod_sidebar.html.erb diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index f25247625..0e1f5906b 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -129,7 +129,9 @@ def activity render layout: 'without_sidebar' end - def mod; end + def mod + render layout: 'without_sidebar' + end def full_log @posts = Post.where(user: @user).count diff --git a/app/views/shared/_user_mod_sidebar.html.erb b/app/views/shared/_user_mod_sidebar.html.erb new file mode 100644 index 000000000..27897d165 --- /dev/null +++ b/app/views/shared/_user_mod_sidebar.html.erb @@ -0,0 +1,59 @@ +
+ +
\ No newline at end of file diff --git a/app/views/users/mod.html.erb b/app/views/users/mod.html.erb index 54761db71..dd6bf5ec6 100644 --- a/app/views/users/mod.html.erb +++ b/app/views/users/mod.html.erb @@ -1,41 +1,12 @@ <% content_for :title, "Moderator Tools: #{rtl_safe_username(@user)}" %> -

Moderator Tools: <%= user_link @user %>

+<%= render 'tabs', user: @user %> -
-
Links
-
-
    -
  • full activity log
  • -
  • <%= link_to 'annotations on user', user_annotations_path(@user) %>
  • -
  • privileges
  • -
  • warnings and suspensions sent to user <% if @user.community_user.suspended? %>(includes lifting the suspension)<% end %>
  • -
  • warn or suspend user
  • -
  • <%= link_to 'vote summary', mod_vote_summary_path(@user) %>
  • - <% if current_user.developer %> -
  • <%= link_to 'impersonate', start_impersonating_path(@user), class: 'is-yellow' %>
  • - <% end %> -
-
-
+
+ <%= render 'shared/user_mod_sidebar', user: @user %> -
-
Danger Zone
-
-

Take care! Actions in this section may not be reversible, and you will not be asked to confirm - after initiating an action.

-
- <%= link_to 'Destroy user', destroy_user_path(@user.id), remote: true, - method: :delete, class: 'js-destroy-user button is-danger is-filled' %> - <%= link_to 'Delete community profile', soft_delete_user_path(@user.id, type: 'profile'), remote: true, - method: :delete, class: 'js-soft-delete button is-danger is-filled' %> - <% if current_user.is_global_moderator || current_user.is_global_admin %> - <%= link_to 'Delete user network-wide', soft_delete_user_path(@user.id, type: 'user'), remote: true, - method: :delete, class: 'js-soft-delete button is-danger is-filled' %> - <% end %> - <% if current_user.is_global_admin %> - <%= link_to 'Feed to STAT (180 days)', hellban_user_path(@user), method: :post, class: 'button is-danger is-filled' %> - <% end %> -
+
+

User Moderation Tools

+

Please note that many information shown in these user moderation tools are sensitive and should not be shared with anyone outside the moderator and admin team.

From 3b36262862d5d26a5209fa3d3cb8d67bfbf82e5d Mon Sep 17 00:00:00 2001 From: luap42 / Paul Date: Sat, 5 Feb 2022 18:51:19 +0100 Subject: [PATCH 003/347] Apply new theme to existing mod pages --- app/assets/stylesheets/users.scss | 8 + app/controllers/moderator_controller.rb | 1 + app/controllers/users_controller.rb | 1 + app/views/mod_warning/log.html.erb | 96 ++--- app/views/mod_warning/new.html.erb | 133 +++---- .../moderator/user_vote_summary.html.erb | 107 +++--- app/views/shared/_user_mod_sidebar.html.erb | 114 +++--- app/views/users/annotations.html.erb | 60 ++-- app/views/users/full_log.html.erb | 281 +++++++-------- app/views/users/mod.html.erb | 2 +- app/views/users/mod_privileges.html.erb | 327 +++++++++--------- 11 files changed, 605 insertions(+), 525 deletions(-) diff --git a/app/assets/stylesheets/users.scss b/app/assets/stylesheets/users.scss index a79c0662a..49d194f96 100644 --- a/app/assets/stylesheets/users.scss +++ b/app/assets/stylesheets/users.scss @@ -212,3 +212,11 @@ $sizes: (16, 32, 40, 48, 64, 128, 256); } } } + + +.modtools--sidebar { + margin-right: 1rem; +} +.modtools--usercard { + padding: 0.5rem; +} \ No newline at end of file diff --git a/app/controllers/moderator_controller.rb b/app/controllers/moderator_controller.rb index 9070a632d..468792dc1 100644 --- a/app/controllers/moderator_controller.rb +++ b/app/controllers/moderator_controller.rb @@ -64,6 +64,7 @@ def user_vote_summary total: Vote.where(recv_user: @user).count ) ) + render layout: 'without_sidebar' end private diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 0e1f5906b..57ade3368 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -177,6 +177,7 @@ def full_log def mod_privileges @abilities = Ability.all + render layout: 'without_sidebar' end def destroy diff --git a/app/views/mod_warning/log.html.erb b/app/views/mod_warning/log.html.erb index c3493e706..e279822f4 100644 --- a/app/views/mod_warning/log.html.erb +++ b/app/views/mod_warning/log.html.erb @@ -1,46 +1,56 @@ -

Warnings sent to <%= user_link @user %>

+<% content_for :title, "Moderator Tools: #{rtl_safe_username(@user)}" %> - - - - - - - - - <% @warnings.each do |w| %> +<%= render 'users/tabs', user: @user %> + +
+ <%= render 'shared/user_mod_sidebar', user: @user %> + +
+

Previously Sent Warnings

+ +
DateTypeFromExcerptStatus
- - - - - + + + + + - <% end %> -
- <%= time_ago_in_words(w.created_at) %> ago - - <% if w.is_suspension %> - <% diff = ((w.suspension_end - w.created_at) / (3600 * 24)).to_i %> - Suspension (<%= diff %>d) - <% else %> - Warning - <% end %> - - <%= user_link w.author %> - - <%= raw(sanitize(render_markdown(w.body), scrubber: scrubber)) %> - - <% if w.suspension_active? %> - Current - <%= form_tag lift_mod_warning_url(@user.id), method: :post do %> - <%= submit_tag '(lift)', class: 'link is-red' %> - <% end %> - <% elsif w.active %> - Unread - <% elsif w.read %> - Read - <% else %> - Lifted - <% end %> - DateTypeFromExcerptStatus
\ No newline at end of file + <% @warnings.each do |w| %> + + + <%= time_ago_in_words(w.created_at) %> ago + + + <% if w.is_suspension %> + <% diff = ((w.suspension_end - w.created_at) / (3600 * 24)).to_i %> + Suspension (<%= diff %>d) + <% else %> + Warning + <% end %> + + + <%= user_link w.author %> + + + <%= raw(sanitize(render_markdown(w.body), scrubber: scrubber)) %> + + + <% if w.suspension_active? %> + Current + <%= form_tag lift_mod_warning_url(@user.id), method: :post do %> + <%= submit_tag '(lift)', class: 'link is-red' %> + <% end %> + <% elsif w.active %> + Unread + <% elsif w.read %> + Read + <% else %> + Lifted + <% end %> + + + <% end %> + +
+
\ No newline at end of file diff --git a/app/views/mod_warning/new.html.erb b/app/views/mod_warning/new.html.erb index c980d3a3c..867ba8c4f 100644 --- a/app/views/mod_warning/new.html.erb +++ b/app/views/mod_warning/new.html.erb @@ -2,78 +2,89 @@ <%= render 'posts/markdown_script' %> <% end %> -

Warn or suspend <%= user_link @user %>

+<% content_for :title, "Moderator Tools: #{rtl_safe_username(@user)}" %> -
-

Use the warning tool only against users who have violated the site rules. Prefer other measurements, such as friendly asking the user to stop certain behaviors in a comment.

-
+<%= render 'users/tabs', user: @user %> -<%= form_for @warning, url: create_mod_warning_path(@user.id), method: :post do |f| %> -
-
- 1. Choose a template +
+ <%= render 'shared/user_mod_sidebar', user: @user %> + +
+

Warn or Suspend User

+ +
+

Use the warning tool only against users who have violated the site rules. Prefer other measurements, such as friendly asking the user to stop certain behaviors in a comment.

-
-
-

Choose a template, which explains, why you are contacting the user. If none is applicable, choose to send a custom message.

- - + + <%= form_for @warning, url: create_mod_warning_path(@user.id), method: :post do |f| %> +
+
+ 1. Choose a template
-
-
- 2. Review the message -
-
-
-

Review the generated message and add details. Do not add salutations or informations about possible suspensions, as they are generated automatically.

+
+
+

Choose a template, which explains, why you are contacting the user. If none is applicable, choose to send a custom message.

+ + +
+
+
+ 2. Review the message +
+
+
+

Review the generated message and add details. Do not add salutations or informations about possible suspensions, as they are generated automatically.

-
- <%= render 'shared/body_field', f: f, field_name: :body, field_label: 'Body' %> -
+
+ <%= render 'shared/body_field', f: f, field_name: :body, field_label: 'Body' %> +
+
-
-
- 3. Choose optional suspension -
-
-
-

Decide, whether or not to suspend the user, and if, for how long. Choose an optional message shown publicly on the user profile.

+
+ 3. Choose optional suspension +
+
+
+

Decide, whether or not to suspend the user, and if, for how long. Choose an optional message shown publicly on the user profile.

- <% if @prior_warning_count == 0 %> -

Info: This user has no prior warnings. The system recommends issuing only a warning, unless the user is destructive and needs to be stopped immediately.

- <% elsif @prior_warning_count >= 5 %> -

Info: This user has <%= @prior_warning_count %> prior warnings. The system recommends suspending them for 365 days (the maximum).

- <% else %> - <% lengths = { 1 => 3, 2 => 7, 3 => 30, 4 => 180 } %> -

Info: This user has <%= @prior_warning_count %> prior warnings. The system recommends suspending them for <%= lengths[@prior_warning_count] %> days.

- <% end %> + <% if @prior_warning_count == 0 %> +

Info: This user has no prior warnings. The system recommends issuing only a warning, unless the user is destructive and needs to be stopped immediately.

+ <% elsif @prior_warning_count >= 5 %> +

Info: This user has <%= @prior_warning_count %> prior warnings. The system recommends suspending them for 365 days (the maximum).

+ <% else %> + <% lengths = { 1 => 3, 2 => 7, 3 => 30, 4 => 180 } %> +

Info: This user has <%= @prior_warning_count %> prior warnings. The system recommends suspending them for <%= lengths[@prior_warning_count] %> days.

+ <% end %> -
- <%= f.label :is_suspension, 'Suspend this user account?', class: 'form-element' %> - - -
+
+ <%= f.label :is_suspension, 'Suspend this user account?', class: 'form-element' %> + + +
-
- <%= f.label :suspension_duration, 'If suspending, for how long?', class: 'form-element' %> -
Enter the number of days. At least 1, at most 365.
- <%= f.number_field :suspension_duration, in: 1..365, class: 'form-element' %> -
+
+ <%= f.label :suspension_duration, 'If suspending, for how long?', class: 'form-element' %> +
Enter the number of days. At least 1, at most 365.
+ <%= f.number_field :suspension_duration, in: 1..365, class: 'form-element' %> +
-
- <%= f.label :suspension_public_notice, 'If suspending, what public notice, if any, do you want to show?', class: 'form-element' %> - <%= f.select :suspension_public_notice, options_for_select([['for rule violations', 'for rule violations'], ['to cool down', 'to cool down']]), { include_blank: true }, class: 'form-element' %> +
+ <%= f.label :suspension_public_notice, 'If suspending, what public notice, if any, do you want to show?', class: 'form-element' %> + <%= f.select :suspension_public_notice, options_for_select([['for rule violations', 'for rule violations'], ['to cool down', 'to cool down']]), { include_blank: true }, class: 'form-element' %> +
+
- -
-<% end %> + <% end %> + +
+
\ No newline at end of file diff --git a/app/views/moderator/user_vote_summary.html.erb b/app/views/moderator/user_vote_summary.html.erb index 65fb666a3..3c17e6783 100644 --- a/app/views/moderator/user_vote_summary.html.erb +++ b/app/views/moderator/user_vote_summary.html.erb @@ -1,53 +1,62 @@ -

Vote Summary: <%= user_link @user %>>

-

- This is a summary of votes cast and received by this user. This may help you to identify voting patterns and - sock puppets, but use caution: what you see as a pattern may also be coincidence. Look for conclusive undeniable - patterns before using this data for sanctions. -

+<% content_for :title, "Moderator Tools: #{rtl_safe_username(@user)}" %> -

- Key: - <%= text_bg 'yellow-200', '> 20%', class: 'has-padding-1 has-margin-horizontal-1' %> - <%= text_bg 'yellow-700', '> 30%', class: 'has-padding-1 has-margin-horizontal-1' %> - <%= text_bg 'red-200', '> 40%', class: 'has-padding-1 has-margin-horizontal-1' %> - <%= text_bg 'red-700', '> 50%', class: 'has-color-white has-padding-1 has-margin-horizontal-1' %> -

+<%= render 'users/tabs', user: @user %> -<% [:cast, :received].each do |type| %> -

Votes <%= type %>

+
+ <%= render 'shared/user_mod_sidebar', user: @user %> - - - - - - - - - - - <% @vote_data[type].breakdown.each do |key, count| %> - - - - - <% pct = count * 100.0 / @vote_data[type].total %> - - - <% end %> - -
<%= type == :cast ? 'To' : 'From' %> userVote typeVote count% of total
<%= user_link @users.select { |x| x.id == key[0] }[0] %><%= key[1] %><%= count %> - <% if pct >= 50 %> - <%= text_bg 'red-700', number_to_percentage(pct, precision: 2), class: 'has-color-white has-padding-1' %> - <% elsif pct >= 40 %> - <%= text_bg 'red-200', number_to_percentage(pct, precision: 2), class: 'has-padding-1' %> - <% elsif pct >= 30 %> - <%= text_bg 'yellow-700', number_to_percentage(pct, precision: 2), class: 'has-padding-1' %> - <% elsif pct >= 20 %> - <%= text_bg 'yellow-200', number_to_percentage(pct, precision: 2), class: 'has-padding-1' %> - <% else %> - <%= number_to_percentage(pct, precision: 2) %> - <% end %> -
-<% end %> +
+

Vote Summary

+

+ This is a summary of votes cast and received by this user. This may help you to identify voting patterns and + sock puppets, but use caution: what you see as a pattern may also be coincidence. Look for conclusive undeniable + patterns before using this data for sanctions. +

+ +

+ Key: + <%= text_bg 'yellow-200', '> 20%', class: 'has-padding-1 has-margin-horizontal-1' %> + <%= text_bg 'yellow-700', '> 30%', class: 'has-padding-1 has-margin-horizontal-1' %> + <%= text_bg 'red-200', '> 40%', class: 'has-padding-1 has-margin-horizontal-1' %> + <%= text_bg 'red-700', '> 50%', class: 'has-color-white has-padding-1 has-margin-horizontal-1' %> +

+ <% [:cast, :received].each do |type| %> +

Votes <%= type %>

+ + + + + + + + + + + + <% @vote_data[type].breakdown.each do |key, count| %> + + + + + <% pct = count * 100.0 / @vote_data[type].total %> + + + <% end %> + +
<%= type == :cast ? 'To' : 'From' %> userVote typeVote count% of total
<%= user_link @users.select { |x| x.id == key[0] }[0] %><%= key[1] %><%= count %> + <% if pct >= 50 %> + <%= text_bg 'red-700', number_to_percentage(pct, precision: 2), class: 'has-color-white has-padding-1' %> + <% elsif pct >= 40 %> + <%= text_bg 'red-200', number_to_percentage(pct, precision: 2), class: 'has-padding-1' %> + <% elsif pct >= 30 %> + <%= text_bg 'yellow-700', number_to_percentage(pct, precision: 2), class: 'has-padding-1' %> + <% elsif pct >= 20 %> + <%= text_bg 'yellow-200', number_to_percentage(pct, precision: 2), class: 'has-padding-1' %> + <% else %> + <%= number_to_percentage(pct, precision: 2) %> + <% end %> +
+ <% end %> +
+
\ No newline at end of file diff --git a/app/views/shared/_user_mod_sidebar.html.erb b/app/views/shared/_user_mod_sidebar.html.erb index 27897d165..b6fd8d82c 100644 --- a/app/views/shared/_user_mod_sidebar.html.erb +++ b/app/views/shared/_user_mod_sidebar.html.erb @@ -1,59 +1,71 @@
- \ No newline at end of file diff --git a/app/views/users/annotations.html.erb b/app/views/users/annotations.html.erb index 0c0c4ec20..4fef6ce37 100644 --- a/app/views/users/annotations.html.erb +++ b/app/views/users/annotations.html.erb @@ -1,29 +1,39 @@ -

User annotations

+<% content_for :title, "Moderator Tools: #{rtl_safe_username(@user)}" %> -
- Add an annotation - <% if defined?(@log) && @log.errors.any? %> -
- There was an error while trying to save your annotation. -
    - <% @log.errors.full_messages.each do |msg| %> -
  • <%= msg %>
  • - <% end %> -
-
- <% end %> - <%= form_tag annotate_user_path(@user), method: :post do %> -
- <%= label_tag :comment, 'Comment', class: 'form-element' %> - <%= text_field_tag :comment, params[:comment], class: 'form-element' %> -
+<%= render 'tabs', user: @user %> + +
+ <%= render 'shared/user_mod_sidebar', user: @user %> - <%= submit_tag 'Save', class: 'button is-filled' %> - <% end %> -
+
+

User annotations

-
-

<%= pluralize(@logs.count, 'log') %>

-
+
+ Add an annotation + <% if defined?(@log) && @log.errors.any? %> +
+ There was an error while trying to save your annotation. +
    + <% @log.errors.full_messages.each do |msg| %> +
  • <%= msg %>
  • + <% end %> +
+
+ <% end %> + <%= form_tag annotate_user_path(@user), method: :post do %> +
+ <%= label_tag :comment, 'Comment', class: 'form-element' %> + <%= text_field_tag :comment, params[:comment], class: 'form-element' %> +
+ + <%= submit_tag 'Save', class: 'button is-filled' %> + <% end %> +
+ +
+

<%= pluralize(@logs.count, 'log') %>

+
-<%= render 'admin/log_table' %> \ No newline at end of file + <%= render 'admin/log_table' %> +
+
\ No newline at end of file diff --git a/app/views/users/full_log.html.erb b/app/views/users/full_log.html.erb index 3bb5c826a..c7a657121 100644 --- a/app/views/users/full_log.html.erb +++ b/app/views/users/full_log.html.erb @@ -1,145 +1,154 @@ <% content_for :title, "Moderator Tools: #{rtl_safe_username(@user)}" %> -

Full activity log for <%= user_link @user %>

+<%= render 'tabs', user: @user %> -

This is a filterable log for all activity by the user. You can consult it for moderation decisions. Do not share this information to people, who do not have access to it.

+
+ <%= render 'shared/user_mod_sidebar', user: @user %> -<% if params[:filter] == 'interesting' %> -

You are looking at negative interactions the user had with this site. These are not necessarily bad, just actions at which you should look more closely. This list includes deleted comments, rejected flags and edit suggestions and negatively received posts.

-<% end %> +
+

Full activity log

-
- - Show all events - - <% if @interesting > 0 %> - - Negative - <%= @interesting %> - +

This is a filterable log for all activity by the user. You can consult it for moderation decisions. Do not share this information to people, who do not have access to it.

+ + <% if params[:filter] == 'interesting' %> +

You are looking at negative interactions the user had with this site. These are not necessarily bad, just actions at which you should look more closely. This list includes deleted comments, rejected flags and edit suggestions and negatively received posts.

<% end %> - - Posts - <% if @posts > 0 %><%= @posts %><% end %> - - - Comments - <% if @comments > 0 %><%= @comments %><% end %> - - - Flags - <% if @flags > 0 %><%= @flags %><% end %> - - - Edits - <% if @all_edits > 0 %><%= @all_edits %><% end %> - - - Warnings - <% if @mod_warnings_received > 0 %><%= @mod_warnings_received %><% end %> - -
- - - - - - - - - <% @items.each do |i| %> - - <% if i.class == Post %> - - - - - <% elsif i.class == Comment %> - - - - - <% elsif i.class == PostHistory %> - - - - - <% elsif i.class == SuggestedEdit %> - - - - - <% elsif i.class == ModWarning %> - - - - - <% elsif i.class == Flag %> - - - - - <% else %> + + +
TypeOn...ExcerptStatusDate
- - <%= (i.question? ? "Question" : (i.article? ? "Article" : "Answer")) %> - - - <% if !i.answer? %> - <%= i.title %>
- <% else %> - A: <%= i.parent.title %>
- <% end %> - <%= i.body_plain[0..300] + ((i.body_plain.length > 300) ? "..." : "") %>
- <%= link_to '(more)', generic_share_link(i)%> -
- Comment - - <%= link_to "Post #" + i.post.id.to_s, generic_share_link(i.post)%> - - <%= i.content[0..300] + ((i.content.length > 300) ? "..." : "") %>
- <%= link_to '(more)', generic_share_link(i.post) + "#comment-" + i.id.to_s %> -
- Edit - - <%= link_to "Post #" + i.post.id.to_s, generic_share_link(i.post)%> - - <% if i.comment %> - <%= i.post_history_type.name.gsub("_", " ").capitalize %>:
<%= i.comment %> - <% else %> - <%= i.post_history_type.name.gsub("_", " ").capitalize %> - <% end %> -
- Suggested Edit - - <%= link_to "Post #" + i.post.id.to_s, generic_share_link(i.post)%> - - Suggested edit:
<%= i.comment %>
<%= link_to '(more)', suggested_edit_url(i.id) %> -
- <%= (i.pending? ? "pending" : (i.approved? ? "helpful" : "declined")) %> - - Warning - - <%= i.body[0..300] + ((i.body.length > 300) ? "..." : "") %> - - Flag - - <%= link_to "Post #" + i.post.id.to_s, generic_share_link(i.post)%> - - <%= i.reason[0..300] + ((i.reason.length > 300) ? "..." : "") %>
-
- <%= i.status || "pending" %> -
+ + + + + + + + <% @items.each do |i| %> + + <% if i.class == Post %> + + + + + <% elsif i.class == Comment %> + + + + + <% elsif i.class == PostHistory %> + + + + + <% elsif i.class == SuggestedEdit %> + + + + + <% elsif i.class == ModWarning %> + + + + + <% elsif i.class == Flag %> + + + + + <% else %> + + + + + <% end %> - - - - <% end %> - - - <% end %> -
TypeOn...ExcerptStatusDate
+ + <%= (i.question? ? "Question" : (i.article? ? "Article" : "Answer")) %> + + + <% if !i.answer? %> + <%= i.title %>
+ <% else %> + A: <%= i.parent.title %>
+ <% end %> + <%= i.body_plain[0..300] + ((i.body_plain.length > 300) ? "..." : "") %>
+ <%= link_to '(more)', generic_share_link(i)%> +
+ Comment + + <%= link_to "Post #" + i.post.id.to_s, generic_share_link(i.post)%> + + <%= i.content[0..300] + ((i.content.length > 300) ? "..." : "") %>
+ <%= link_to '(more)', generic_share_link(i.post) + "#comment-" + i.id.to_s %> +
+ Edit + + <%= link_to "Post #" + i.post.id.to_s, generic_share_link(i.post)%> + + <% if i.comment %> + <%= i.post_history_type.name.gsub("_", " ").capitalize %>:
<%= i.comment %> + <% else %> + <%= i.post_history_type.name.gsub("_", " ").capitalize %> + <% end %> +
+ Suggested Edit + + <%= link_to "Post #" + i.post.id.to_s, generic_share_link(i.post)%> + + Suggested edit:
<%= i.comment %>
<%= link_to '(more)', suggested_edit_url(i.id) %> +
+ <%= (i.pending? ? "pending" : (i.approved? ? "helpful" : "declined")) %> + + Warning + + <%= i.body[0..300] + ((i.body.length > 300) ? "..." : "") %> + + Flag + + <%= link_to "Post #" + i.post.id.to_s, generic_share_link(i.post)%> + + <%= i.reason[0..300] + ((i.reason.length > 300) ? "..." : "") %>
+
+ <%= i.status || "pending" %> + + Unknown + <%= i.class %> - Unknown + <%= time_ago_in_words(i.created_at) %> ago <%= i.class %> - <%= time_ago_in_words(i.created_at) %> ago -
+ + <% end %> + + +
+
\ No newline at end of file diff --git a/app/views/users/mod.html.erb b/app/views/users/mod.html.erb index dd6bf5ec6..cc76ebfcb 100644 --- a/app/views/users/mod.html.erb +++ b/app/views/users/mod.html.erb @@ -7,6 +7,6 @@

User Moderation Tools

-

Please note that many information shown in these user moderation tools are sensitive and should not be shared with anyone outside the moderator and admin team.

+

Please note that many information shown in these user moderation tools are sensitive and should not be shared with anyone outside the moderator and admin team.

diff --git a/app/views/users/mod_privileges.html.erb b/app/views/users/mod_privileges.html.erb index 1765d6536..e8537d96b 100644 --- a/app/views/users/mod_privileges.html.erb +++ b/app/views/users/mod_privileges.html.erb @@ -1,176 +1,185 @@ -<% content_for :title, "Moderator Tools: #{@user.username}" %> +<% content_for :title, "Moderator Tools: #{rtl_safe_username(@user)}" %> -

Privileges of <%= link_to @user.username, user_path(@user) %>

+<%= render 'tabs', user: @user %> -
-
- ability - page - Abilities -
- <% @abilities.each do |a| %> - <% next if a.internal_id == 'mod' %> - <% ua = @user.privilege a.internal_id %> -
-
-
- -
-
-

- <%= a.name %> -

-

<%= a.summary %>

- <% unless ua.nil? %> -

- Delete -

- <% end %> -
-
- <% if ua.nil? %> - - <% elsif ua.suspended? %> - - <% else %> - -
-
suspend ability to <%= a.name %>
- -
in days; leave blank for permanent
- +
+ <%= render 'shared/user_mod_sidebar', user: @user %> - -
will be privately shown to user
- +
+

User Privileges

- +
+
+ ability + page + Abilities +
+ <% @abilities.each do |a| %> + <% next if a.internal_id == 'mod' %> + <% ua = @user.privilege a.internal_id %> +
+
+
+ +
+
+

+ <%= a.name %> +

+

<%= a.summary %>

+ <% unless ua.nil? %> +

+ Delete +

+ <% end %>
- <% end %> +
+ <% if ua.nil? %> + + <% elsif ua.suspended? %> + + <% else %> + +
+
suspend ability to <%= a.name %>
+ +
in days; leave blank for permanent
+ + + +
will be privately shown to user
+ + + +
+ <% end %> +
+
+ <% end %> +
- <% end %> - -
-<% if current_user.is_admin %> -
-
- Roles -
-
-
-
- + <% if current_user.is_admin %> +
+
+ Roles
-
-

- Moderator -

-

Moderators can unilaterally close and delete posts, can feature and lock posts - and may impose restrictions on user accounts.

+
+
+
+ +
+
+

+ Moderator +

+

Moderators can unilaterally close and delete posts, can feature and lock posts + and may impose restrictions on user accounts.

+
+
+ <% if @user.is_moderator %> + + <% else %> + + <% end %> +
+
-
- <% if @user.is_moderator %> - - <% else %> - - <% end %> + <% end %> + <% if current_user.is_global_admin %> +
+
+
+ +
+
+

+ Administrator +

+

Administrators can edit site settings and user roles.

+
+
+ <% if @user.is_global_moderator %> + + <% else %> + + <% end %> +
-
-<% end %> -<% if current_user.is_global_admin %> -
-
-
- -
-
-

- Administrator -

-

Administrators can edit site settings and user roles.

-
-
- <% if @user.is_global_moderator %> - - <% else %> - - <% end %> -
-
-
-
-
-
- -
-
-

- Network-wide Moderator -

-

This user will have moderator status on every site in this network.

-
-
- <% if @user.is_global_moderator %> - - <% else %> - - <% end %> -
-
-
-
-
-
- -
-
-

- Network-wide Admin -

-

This user will have admin status on every site in this network.

-
-
- <% if @user.is_global_admin %> - <% if @user.id == current_user.id %> - - <% else %> - - <% end %> - <% else %> - - <% end %> -
-
-
-<% end %> -<% if current_user.is_global_admin && current_user.staff? %> -
-
-
- +
+
+
+ +
+
+

+ Network-wide Moderator +

+

This user will have moderator status on every site in this network.

+
+
+ <% if @user.is_global_moderator %> + + <% else %> + + <% end %> +
+
-
-

- Staff -

-

The staff role doesn't carry any privileges, but designates the staff running this - site.

+
+
+
+ +
+
+

+ Network-wide Admin +

+

This user will have admin status on every site in this network.

+
+
+ <% if @user.is_global_admin %> + <% if @user.id == current_user.id %> + + <% else %> + + <% end %> + <% else %> + + <% end %> +
+
-
- <% if @user.staff? %> - - <% else %> - - <% end %> + <% end %> + <% if current_user.is_global_admin && current_user.staff? %> +
+
+
+ +
+
+

+ Staff +

+

The staff role doesn't carry any privileges, but designates the staff running this + site.

+
+
+ <% if @user.staff? %> + + <% else %> + + <% end %> +
+
+ <% end %>
+
-<% end %> -
+
\ No newline at end of file From 4ad7dc92a4dbd58f0af1c09ef7e42eccba825651 Mon Sep 17 00:00:00 2001 From: luap42 / Paul Date: Sat, 5 Feb 2022 19:09:10 +0100 Subject: [PATCH 004/347] Add deletion entry --- app/controllers/users_controller.rb | 8 +++-- app/views/shared/_user_mod_sidebar.html.erb | 16 ++++++---- app/views/users/mod_delete.html.erb | 34 +++++++++++++++++++++ config/routes.rb | 1 + 4 files changed, 51 insertions(+), 8 deletions(-) create mode 100644 app/views/users/mod_delete.html.erb diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 57ade3368..36442f51d 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -7,10 +7,10 @@ class UsersController < ApplicationController before_action :authenticate_user!, only: [:edit_profile, :update_profile, :stack_redirect, :transfer_se_content, :qr_login_code, :me, :preferences, :set_preference, :my_vote_summary] before_action :verify_moderator, only: [:mod, :destroy, :soft_delete, :role_toggle, :full_log, - :annotate, :annotations, :mod_privileges, :mod_privilege_action] + :annotate, :annotations, :mod_privileges, :mod_privilege_action, :mod_delete] before_action :set_user, only: [:show, :mod, :destroy, :soft_delete, :posts, :role_toggle, :full_log, :activity, :annotate, :annotations, :mod_privileges, :mod_privilege_action, - :vote_summary, :avatar] + :vote_summary, :avatar, :mod_delete] before_action :check_deleted, only: [:show, :posts, :activity] def index @@ -180,6 +180,10 @@ def mod_privileges render layout: 'without_sidebar' end + def mod_delete + render layout: 'without_sidebar' + end + def destroy if @user.votes.count > 100 render json: { status: 'failed', message: 'Users with more than 100 votes cannot be destroyed.' }, diff --git a/app/views/shared/_user_mod_sidebar.html.erb b/app/views/shared/_user_mod_sidebar.html.erb index b6fd8d82c..3dde5e32b 100644 --- a/app/views/shared/_user_mod_sidebar.html.erb +++ b/app/views/shared/_user_mod_sidebar.html.erb @@ -46,16 +46,20 @@ <% end %> - <%= link_to '', class: 'menu--item' do %> + <%= link_to mod_delete_or_destroy_path(user), + class: "menu--item #{current_page?(mod_delete_or_destroy_path(user)) ? 'is-active' : ''}" do %> Delete or Destroy Account <% end %> - <%= link_to '', class: 'menu--item' do %> - Feed to STAT - <% end %> <% if current_user.is_global_admin %> - - (none yet, sorry ^^) + + <%= link_to '', class: 'menu--item' do %> + Network-wide Suspension + <% end %> + <%= link_to '', class: 'menu--item' do %> + Hungry Codidactyl
+ (Delete, Feed to STAT) + <% end %> <% end %> <% if current_user.developer %> diff --git a/app/views/users/mod_delete.html.erb b/app/views/users/mod_delete.html.erb new file mode 100644 index 000000000..ab532709a --- /dev/null +++ b/app/views/users/mod_delete.html.erb @@ -0,0 +1,34 @@ +<% content_for :title, "Moderator Tools: #{rtl_safe_username(@user)}" %> + +<%= render 'tabs', user: @user %> + +
+ <%= render 'shared/user_mod_sidebar', user: @user %> + +
+

Delete or Destroy Account

+ +

Some users are just blatant spammers or trolls and some users are just unwilling to follow site rules, even after repeated warnings and suspensions. As a moderator, you may delete the user account in these cases.

+ +
+

Take care! These actions may not be reversible and you will not be asked to confirm after initiating an action.

+
+ +
+
+

Destroy Acccount

+

Destroy Accounts of blatant spammers and trolls.

+ + <%= link_to 'Destroy Account', destroy_user_path(@user.id), remote: true, + method: :delete, class: 'js-destroy-user button is-danger is-filled' %> +
+
+

Delete Community Profile

+

Delete the community profile of users who are unwilling to follow the rules of this site, even after repeated warnings and suspensions. Choose this option if a user has requested deletion of their profile on one site, once you have confirmed their identity and request.

+ + <%= link_to 'Delete community profile', soft_delete_user_path(@user.id, type: 'profile'), remote: true, + method: :delete, class: 'js-soft-delete button is-danger is-filled' %> +
+
+
+
diff --git a/config/routes.rb b/config/routes.rb index a23af0142..6d58b9a60 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -188,6 +188,7 @@ post '/:id/mod/annotations', to: 'users#annotate', as: :annotate_user get '/:id/mod/activity-log', to: 'users#full_log', as: :full_user_log post '/:id/hellban', to: 'admin#hellban', as: :hellban_user + get '/:id/mod/delete-or-destroy', to: 'users#mod_delete', as: :mod_delete_or_destroy get '/:id/avatar/:size', to: 'users#avatar', as: :user_auto_avatar end From 1296004dd1d3b8190e3f6a4c6d74134951c75343 Mon Sep 17 00:00:00 2001 From: luap42 / Paul Date: Sat, 5 Feb 2022 19:59:10 +0100 Subject: [PATCH 005/347] Add dashboard in UMT --- app/assets/stylesheets/users.scss | 6 ++ app/views/users/mod.html.erb | 166 ++++++++++++++++++++++++++++++ 2 files changed, 172 insertions(+) diff --git a/app/assets/stylesheets/users.scss b/app/assets/stylesheets/users.scss index 49d194f96..b8587152f 100644 --- a/app/assets/stylesheets/users.scss +++ b/app/assets/stylesheets/users.scss @@ -219,4 +219,10 @@ $sizes: (16, 32, 40, 48, 64, 128, 256); } .modtools--usercard { padding: 0.5rem; +} +.modtools-tbl-noborder { + th { + border-bottom-width: 1px !important; + width: 150px; + } } \ No newline at end of file diff --git a/app/views/users/mod.html.erb b/app/views/users/mod.html.erb index cc76ebfcb..39d8ab722 100644 --- a/app/views/users/mod.html.erb +++ b/app/views/users/mod.html.erb @@ -8,5 +8,171 @@

User Moderation Tools

Please note that many information shown in these user moderation tools are sensitive and should not be shared with anyone outside the moderator and admin team.

+ +
+
Account Information
+
+ + + + + + + + + + + + + +
User Name<%= rtl_safe_username(@user) %>
Account ID#<%= @user.id %>
Joined<%= @user.created_at.strftime("%Y-%m-%d") %> (network), <%= @user.community_user.created_at.strftime("%Y-%m-%d") %> (community)
+
+
+ +
+
Activity Summary
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
BehaviorSince CreationLast YearLast MonthMost Recent
Posts Written + <%= @user.posts.count %> + + <%= @user.posts.where(created_at: 360.days.ago..DateTime.now).count %> + + <%= @user.posts.where(created_at: 30.days.ago..DateTime.now).count %> + + <% last_post = @user.posts.last %> + <% if last_post %> + <%= time_ago_in_words(last_post.created_at, locale: :en_abbrev) %> ago + <% else %> + never + <% end %> +
Votes Cast + <%= @user.votes.count %> + + <%= @user.votes.where(created_at: 360.days.ago..DateTime.now).count %> + + <%= @user.votes.where(created_at: 30.days.ago..DateTime.now).count %> + + <% last_vote = @user.votes.last %> + <% if last_vote %> + <%= time_ago_in_words(last_vote.created_at, locale: :en_abbrev) %> ago + <% else %> + never + <% end %> +
Comments written + <%= @user.comments.count %> + + <%= @user.comments.where(created_at: 360.days.ago..DateTime.now).count %> + + <%= @user.comments.where(created_at: 30.days.ago..DateTime.now).count %> + + <% last_comment = @user.comments.last %> + <% if last_comment %> + <%= time_ago_in_words(last_comment.created_at, locale: :en_abbrev) %> ago + <% else %> + never + <% end %> +
Edits Suggested + <%= @user.suggested_edits.count %> + + <%= @user.suggested_edits.where(created_at: 360.days.ago..DateTime.now).count %> + + <%= @user.suggested_edits.where(created_at: 30.days.ago..DateTime.now).count %> + + <% last_suggested_edit = @user.suggested_edits.last %> + <% if last_suggested_edit %> + <%= time_ago_in_words(last_suggested_edit.created_at, locale: :en_abbrev) %> ago + <% else %> + never + <% end %> +
+
+
+ +
+
Moderation Summary
+
+ <% annotations_count = AuditLog.where(log_type: 'user_annotation', related: @user).count %> + <% warnings_count = ModWarning.where(community_user: @user.community_user, is_suspension: false).count %> + <% suspensions_count = ModWarning.where(community_user: @user.community_user, is_suspension: true).count %> + + + + + + + + + + + + + + + + + +
Annotations + <% if annotations_count > 0 %> + <%= annotations_count %> + <% else %> + 0 + <% end %> +
Currently Suspended? + <% if @user.community_user.suspended? %> + yes + <% else %> + 0 + <% end %> +
Warnings + <% if warnings_count > 0 %> + <%= warnings_count %> + <% else %> + 0 + <% end %> +
Suspensions + <% if suspensions_count > 0 %> + <%= suspensions_count %> + <% else %> + 0 + <% end %> +
+
+
From 6d624c288ef68132a4fa0e6b5f5dcba9615febd7 Mon Sep 17 00:00:00 2001 From: luap42 / Paul Date: Sat, 5 Feb 2022 20:08:55 +0100 Subject: [PATCH 006/347] Add FA icons to UMT sidebar --- app/views/shared/_user_mod_sidebar.html.erb | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/app/views/shared/_user_mod_sidebar.html.erb b/app/views/shared/_user_mod_sidebar.html.erb index 3dde5e32b..63f6dd180 100644 --- a/app/views/shared/_user_mod_sidebar.html.erb +++ b/app/views/shared/_user_mod_sidebar.html.erb @@ -12,51 +12,63 @@ + <%= render 'posts/image_upload' %> + <%= render 'shared/body_field', f: f, field_name: :profile_markdown, field_label: 'Profile', post: current_user %>
From 3bea5e54601729edf34e19c70b9f898432035601 Mon Sep 17 00:00:00 2001 From: Taico Aerts Date: Tue, 16 Aug 2022 16:59:50 +0200 Subject: [PATCH 059/347] Fix Roboto font is missing by adding it --- app/assets/imgfonts/Roboto.ttf | Bin 0 -> 171272 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 app/assets/imgfonts/Roboto.ttf diff --git a/app/assets/imgfonts/Roboto.ttf b/app/assets/imgfonts/Roboto.ttf new file mode 100644 index 0000000000000000000000000000000000000000..2b6392ffe8712b9c5450733320cd220d6c0f4bce GIT binary patch literal 171272 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 literal 0 HcmV?d00001 From 7806dec6edcf4d0e554de3f132efe3ae2d08b393 Mon Sep 17 00:00:00 2001 From: sau226 <32805612+sau226@users.noreply.github.com> Date: Sun, 12 Jun 2022 04:30:50 +1000 Subject: [PATCH 060/347] Upgrade ruby in gemfile --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index 228b43a1e..0c180e87c 100644 --- a/Gemfile +++ b/Gemfile @@ -1,5 +1,5 @@ source 'https://rubygems.org' -ruby '2.6.6' +ruby '2.7.6' # Essential gems: servers, adapters, Rails + Rails requirements gem 'coffee-rails', '~> 4.2.2' From f650071680ded1e059d66d74e6f5c0f3a8484966 Mon Sep 17 00:00:00 2001 From: sau226 <32805612+sau226@users.noreply.github.com> Date: Sun, 12 Jun 2022 04:32:21 +1000 Subject: [PATCH 061/347] Upgrade ruby in lock file --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 80040aa63..ccfd75a78 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -362,7 +362,7 @@ DEPENDENCIES will_paginate-bootstrap (~> 1.0) RUBY VERSION - ruby 2.6.6p146 + ruby 2.7.6p219 BUNDLED WITH 2.2.3 From 99a9edb7fa6fc7311320388d8fedc0ce4b8189d5 Mon Sep 17 00:00:00 2001 From: sau226 <32805612+sau226@users.noreply.github.com> Date: Sun, 12 Jun 2022 04:38:03 +1000 Subject: [PATCH 062/347] Upgrade ruby in CI --- .circleci/config.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index fd2af9fd4..929b40672 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -2,7 +2,7 @@ version: 2.1 jobs: test: docker: - - image: circleci/ruby:2.6.6-node + - image: circleci/ruby:2.7.6-node - image: circleci/mysql:8.0.20 command: [--default-authentication-plugin=mysql_native_password] environment: @@ -66,7 +66,7 @@ jobs: rubocop: docker: - - image: circleci/ruby:2.6.6-node + - image: circleci/ruby:2.7.6-node working_directory: ~/qpixel @@ -97,7 +97,7 @@ jobs: deploy: docker: - - image: circleci/ruby:2.6.6-node + - image: circleci/ruby:2.7.6-node working_directory: ~/qpixel @@ -123,4 +123,4 @@ workflows: - rubocop filters: branches: - only: develop \ No newline at end of file + only: develop From 2cc7e101f3e019df4e9aaeef6ce64bf753a1c311 Mon Sep 17 00:00:00 2001 From: sau226 <32805612+sau226@users.noreply.github.com> Date: Sun, 12 Jun 2022 04:38:41 +1000 Subject: [PATCH 063/347] Upgrade ruby in dockerfile --- docker/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index c0c75a607..06fe360ac 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,4 +1,4 @@ -FROM ruby:2.6.6 +FROM ruby:2.7.6 # docker build -f docker/Dockerfile -t qpixel_uwsgi . From ccf0fcdd52e0f885c898ebd4e3df3faa3f79d8cf Mon Sep 17 00:00:00 2001 From: sau226 <32805612+sau226@users.noreply.github.com> Date: Sat, 11 Jun 2022 20:04:52 +1000 Subject: [PATCH 064/347] Upgrade codeql actions to v2 CodeQL v1 is deprecated per https://github.blog/changelog/2022-04-27-code-scanning-deprecation-of-codeql-action-v1/ --- .github/workflows/codeql-analysis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 42e26b0e4..1e373b7db 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -26,10 +26,10 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v1 + uses: github/codeql-action/init@v2 with: languages: javascript, ruby # Actually perform an analysis - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v1 + uses: github/codeql-action/analyze@v2 From 13c18362e31c60400198e0f5e41f325096c2c5b3 Mon Sep 17 00:00:00 2001 From: Taico Aerts Date: Tue, 23 Aug 2022 13:46:42 +0200 Subject: [PATCH 065/347] Fix regression from !839 The form was no longer able to be submitted for the profile due to some unexpected interaction between the post upload field and the profile form. By moving it to a different location in the file, this issue is fixed. --- app/views/users/edit_profile.erb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/users/edit_profile.erb b/app/views/users/edit_profile.erb index 9f4708244..330bdbbb9 100644 --- a/app/views/users/edit_profile.erb +++ b/app/views/users/edit_profile.erb @@ -18,6 +18,8 @@
<% end %> +<%= render 'posts/image_upload' %> + <%= form_for current_user, url: update_user_profile_path do |f| %>
user avatar @@ -35,8 +37,6 @@ <%= f.text_field :username, class: 'form-element', autocomplete: 'off' %>
- <%= render 'posts/image_upload' %> - <%= render 'shared/body_field', f: f, field_name: :profile_markdown, field_label: 'Profile', post: current_user %>
From 1ef8e2bc3fefcb5b4fac87950f9ea7e08d35717d Mon Sep 17 00:00:00 2001 From: MrHug Date: Tue, 23 Aug 2022 10:47:33 +0200 Subject: [PATCH 066/347] Image for the voting help page --- app/assets/images/voting.png | Bin 0 -> 1988 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 app/assets/images/voting.png diff --git a/app/assets/images/voting.png b/app/assets/images/voting.png new file mode 100644 index 0000000000000000000000000000000000000000..a3e7a598e9c73d2ebc353ca46d3881a7ed8ff7e5 GIT binary patch literal 1988 zcmaJ?X*3&%7LKQr(h8%NG}dBhX~Y<+mWZjbg@)R-f}*jsl9bR9&sMcm4W^bTNkmo9 z)K*Jsr?%8iEJY~Q+J@9lmGW}V{Ox)7eD{9$e!sqR?m71+-mo?Yosl{N002Np3llpY zqj;Gh0OVEsuu(4_ogx?`9Rzq0E^y~DZ-xY$x&+(feS-h=48j0>ad<37o!}jW!Qcpf z_~3Q^76brr+6ifL%^{S+rMd;UEWG6k>mWt<0cUwE};&H91+v(&h2&*$S0*-*3h>VvG^Oi9}8+}I0MC;Lo#UDW_<#VRB=r$qV_ z+RcCS02Cj_mN?7rf)eC49ZOfCy}dQ;CvEKRBhoC{dQn|ssb{gSva$Q}$Bc{$ySx03 zjhc?EvTujidrG2L)vy?1db%M842*kXFq!U!A&$iM;pQ2ZRu|7oFe@7)Jn3r;4F@!~ zmGXpuqSMpKLc0YhFtDPMauRjoXWdz6e9P7){KK@5gJpQ+h<0Gg)xj}`T<6q6sDzVc z@e0D)gW>H<4R6xD<^Sp>ygg#vX`+;867t2WDkp6nDD$cstuxro8iAUXl4Cz4Cm1mF zb_3OqWnIgq&DGSi`n7`KpPv01-MI`@VrhM@bS>BA&?VyfQ7$bN&0vDqs@;45Huqlq z+@BHt&H|U|b%&9WQO`-IwLMH(95pT;f0VU6ORX!5($J4QR#GfKs?GP7r3HnGI$y^% z#s6@}KN8=HSl#kTA>f-ksy-URPjW*%;dQnLhvz$BjqMX2tkC@?Rj-?XWHCvz;Mdhc z_V|>o$b8ZVFmM@^Y0xz{UH%Au@Bla@AhTTbUYGT?u_n8&mROh_zAscxmGg!ZmtF{! zX1~Lm=^4l>X%a|a&Xry*LLl8S#_aQ8x(V(GJ8^ETGjq{BLtAiq1m5yZ%w~_8A6yi( zS;{9(pb*vGO(b9czN|sP1QpLDLiw&DwSN004Vi|iS60d{2!?JHaaS6?#QrzOxA(#@ z<@d+)-igCF5Q7Y%z#`l$b`mOHysS6RNw~rOPfW109*SSA@({ zL;Xkj2Z)i6ukI7_);LKkTf9&cX>>d%SFfm{xp%WGC$w#~z(|}wL7Ptii+9;E5)=Jy z9{k)n2;*U@Q z)fMNd4ZEGnnp35M402~{MxAHVOi_e1<}RdoJ^$W%sm4D$awDEfU44CSxM8a~tpDbz zM9|QK)n!bX5ODW`6fn`HZ?xhAiJ7AsU^1lL!<`$dmIAORDK9-|LKbukIgT#y;Aaq9(U$Np=grm`-yVkc%zkgpk+IwDV_vfYr&c=b-;nQt98EL}^ggkHd8|^)=PND~xpRb)e zi!l~Zfq5+S>|$K!YrecHI-HC2_neDql0nc?y%TN$py2oQ<;P|v+__MC=2kcOEV?;t zCXFCJ-ICg#s*@80b4Kz%YYs|Y(J0Rj8yFw~^LB$vv5;D_K!v>V0lL9xl9AECs8Pw9ofrK|M5`k{pP$mrcZh@BkEbSkhF+3a}AzYiY}=2`B>(#0|1JKaXz zvus^PI3g?nokq+jk}7vlF(NQi{NqM3a(w7j_Za1zSU1*C4h37 xz>N^EpQ00D8Uj+eH~p>W6Ng8zKV0UKh()xeR^o+{o4hv+K$=>clo{WS`5#MZz+eCX literal 0 HcmV?d00001 From 96203d75585a5cde87ab1f9a9fdecb3bb397b996 Mon Sep 17 00:00:00 2001 From: MrHug Date: Tue, 23 Aug 2022 10:26:26 +0200 Subject: [PATCH 067/347] Three images for the scoring help page --- app/assets/images/scoring_3d.png | Bin 0 -> 28803 bytes app/assets/images/scoring_distribution.png | Bin 0 -> 57458 bytes app/assets/images/scoring_table.png | Bin 0 -> 25797 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 app/assets/images/scoring_3d.png create mode 100644 app/assets/images/scoring_distribution.png create mode 100644 app/assets/images/scoring_table.png diff --git a/app/assets/images/scoring_3d.png b/app/assets/images/scoring_3d.png new file mode 100644 index 0000000000000000000000000000000000000000..38650c3629dd5f21a02dc43c39b2bc7c76d63b02 GIT binary patch literal 28803 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%0D%P@yn-%Hmm;Om?LJi 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 ZKPbznxb(=F5(pOr$-h&P{w-+~^nV{33(Noj literal 0 HcmV?d00001 diff --git a/app/assets/images/scoring_distribution.png b/app/assets/images/scoring_distribution.png new file mode 100644 index 0000000000000000000000000000000000000000..675a3f14f6294fc40777c9943201b5023f3a441e GIT binary patch literal 57458 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⋘)v796Ol zmDUHhUyjH-N&!JS6BqKGNOq!24f`Vq$|$)MVqMvF`t{!nt*GuSxyL752(w`9;(ODS z^}S19%LP+;>XC27k?bzOxe-q1QWZ8m zN~wH_BiX_eyIdfo76w$|bvG1F+=zi|Gg$@YmP%W(XqkATy-#&O!x)%ZDSUf*OT5#Z zHz*)`I|_DxY@#^1gR}=~%!uMWNj}hMkuaoSkCRNt z;5}gZA%JlaCvjyzSRn>KvHKiJ3^uDOu!1Z*Vcyxe1@K2Q60b#>5IerNEU6lqS7Y&= z(TUi?av
7eUgXc3fkM;^gYh113@wt%_J&W2} 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 Date: Tue, 23 Aug 2022 10:58:37 +0200 Subject: [PATCH 068/347] Add scoring formula image --- app/assets/images/scoring_formula.png | Bin 0 -> 5090 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 app/assets/images/scoring_formula.png diff --git a/app/assets/images/scoring_formula.png b/app/assets/images/scoring_formula.png new file mode 100644 index 0000000000000000000000000000000000000000..bffc34c9c6bfece135f482c7f91bb8e677f3cadb GIT binary patch literal 5090 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 Ef}ZS_fB*mh literal 0 HcmV?d00001 From d7aa7a41ad54a2128debbcd328b4704e38bf0ae1 Mon Sep 17 00:00:00 2001 From: Taico Aerts Date: Wed, 24 Aug 2022 10:57:21 +0200 Subject: [PATCH 069/347] Fix CI We were using legacy CI images, for which the updated ruby 2.7 image does not exist (any more?), and these are being phased out. We need to use the tag `cimg` instead to switch to the new images (which should be faster but do the same). --- .circleci/config.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 929b40672..0a97df713 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -2,15 +2,15 @@ version: 2.1 jobs: test: docker: - - image: circleci/ruby:2.7.6-node - - image: circleci/mysql:8.0.20 + - image: cimg/ruby:2.7.6-node + - image: cimg/mysql:8.0.20 command: [--default-authentication-plugin=mysql_native_password] environment: MYSQL_ROOT_HOST: '%' MYSQL_USER: 'root' MYSQL_ROOT_PASSWORD: 'root' MYSQL_DATABASE: 'qpixel_test' - - image: circleci/redis:6.0.0 + - image: cimg/redis:6.0.0 working_directory: ~/qpixel @@ -66,7 +66,7 @@ jobs: rubocop: docker: - - image: circleci/ruby:2.7.6-node + - image: cimg/ruby:2.7.6-node working_directory: ~/qpixel @@ -97,7 +97,7 @@ jobs: deploy: docker: - - image: circleci/ruby:2.7.6-node + - image: cimg/ruby:2.7.6-node working_directory: ~/qpixel From e257fcc6623e43b68355990583082f7c76012678 Mon Sep 17 00:00:00 2001 From: MrHug Date: Thu, 25 Aug 2022 12:19:15 +0200 Subject: [PATCH 070/347] Display post body in lists - Increase text size of title - Add truncated post body (configurable length) --- app/assets/stylesheets/posts.scss | 8 ++++++++ app/views/posts/_list.html.erb | 5 +++++ db/seeds/site_settings.yml | 8 ++++++++ 3 files changed, 21 insertions(+) diff --git a/app/assets/stylesheets/posts.scss b/app/assets/stylesheets/posts.scss index 8385b3bf0..a1a548af6 100644 --- a/app/assets/stylesheets/posts.scss +++ b/app/assets/stylesheets/posts.scss @@ -40,6 +40,14 @@ h1 .badge.is-tag.is-master-tag { font-size: 14px; } +.post-list--title { + font-size: 19px; +} + +.post-list--content { + font-size: 14px; +} + .post--action-dialog { display: none; diff --git a/app/views/posts/_list.html.erb b/app/views/posts/_list.html.erb index fd40109e1..9caf81526 100644 --- a/app/views/posts/_list.html.erb +++ b/app/views/posts/_list.html.erb @@ -35,6 +35,11 @@ <%= post.duplicate_post && post.post_type.is_closeable && post.closed ? "[duplicate]" : "" %> <% end %>
+ <% if (SiteSetting['PostBodyListTruncateLength'] || 0) > 0 %> +

+ <%= strip_tags(post.body).truncate(SiteSetting['PostBodyListTruncateLength'] || 200) %> +

+ <% end %>

<% if post.post_type.has_answers? %> diff --git a/db/seeds/site_settings.yml b/db/seeds/site_settings.yml index 9009a2e8b..af25d2f95 100644 --- a/db/seeds/site_settings.yml +++ b/db/seeds/site_settings.yml @@ -507,3 +507,11 @@ category: Tour description: > Displayed as the description for the tour's more page for where users can find additional information. Markdown allowed. + +- name: PostBodyListTruncateLength + value: 200 + value_type: integer + category: Display + description: > + The content of a post is shown in short in lists (e.g. category post overview or in search). + This setting controls how many characters of a post are shown. From dce4025e20af4bbce7bd71dfdf250590005325e5 Mon Sep 17 00:00:00 2001 From: MrHug Date: Thu, 25 Aug 2022 12:37:31 +0200 Subject: [PATCH 071/347] Search tags in name and excerpt --- app/assets/javascripts/tags.js | 7 ++++++- app/models/tag.rb | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/app/assets/javascripts/tags.js b/app/assets/javascripts/tags.js index 68a97fef0..836fff5fd 100644 --- a/app/assets/javascripts/tags.js +++ b/app/assets/javascripts/tags.js @@ -28,6 +28,11 @@ $(() => { const useIds = $tgt.attr('data-use-ids') === 'true'; $tgt.select2({ tags: $tgt.attr('data-create') !== 'false', + insertTag: function (data, tag) { + tag.desc = "(Create new tag)" + // Insert the tag at the end of the results + data.push(tag); + }, ajax: { url: '/tags', data: function (params) { @@ -104,4 +109,4 @@ $(() => { } } }); -}); \ No newline at end of file +}); diff --git a/app/models/tag.rb b/app/models/tag.rb index 50d3ceb16..d7097de8a 100644 --- a/app/models/tag.rb +++ b/app/models/tag.rb @@ -17,6 +17,7 @@ class Tag < ApplicationRecord def self.search(term) where('name LIKE ?', "%#{sanitize_sql_like(term)}%") + .or(where('excerpt LIKE ?', "%#{sanitize_sql_like(term)}%")) .order(Arel.sql(sanitize_sql_array(['name LIKE ? DESC, name', "#{sanitize_sql_like(term)}%"]))) end From 2295452681f986b0ae5703848cb74feadaf1b6af Mon Sep 17 00:00:00 2001 From: Taico Aerts Date: Thu, 18 Aug 2022 17:23:34 +0200 Subject: [PATCH 072/347] Use same badge as elsewhere on the site Fixes #816 --- app/views/users/_common_card.html.erb | 4 ++-- app/views/users/show.html.erb | 8 ++++++-- db/seeds/site_settings.yml | 8 ++++---- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/app/views/users/_common_card.html.erb b/app/views/users/_common_card.html.erb index 80227d33d..a5a99a336 100644 --- a/app/views/users/_common_card.html.erb +++ b/app/views/users/_common_card.html.erb @@ -33,9 +33,9 @@ <%= link_to external_url ? user_url(user) : user_path(user), dir: 'ltr', class: small ? :'user-card--link-small' :'user-card--link', data: data do %> <%= rtl_safe_username(user) %> <% if user.is_admin && SiteSetting['AdminBadgeCharacter'] %> - <%= SiteSetting['AdminBadgeCharacter'] %> + <% elsif user.is_moderator && SiteSetting['ModBadgeCharacter'] %> - <%= SiteSetting['ModBadgeCharacter'] %> + <% end %> <% if user.staff? %> staff diff --git a/app/views/users/show.html.erb b/app/views/users/show.html.erb index 1e201d8c1..052b71b07 100644 --- a/app/views/users/show.html.erb +++ b/app/views/users/show.html.erb @@ -92,9 +92,13 @@

Staff
- <% elsif @user.is_moderator || @user.is_admin %> + <% elsif @user.is_admin %> +
+ Administrator +
+ <% elsif @user.is_moderator %>
- Moderator + Moderator
<% end %>
diff --git a/db/seeds/site_settings.yml b/db/seeds/site_settings.yml index af25d2f95..cb91ffc3b 100644 --- a/db/seeds/site_settings.yml +++ b/db/seeds/site_settings.yml @@ -74,18 +74,18 @@ How many "hot" questions to display in the sidebar. - name: AdminBadgeCharacter - value: "" + value: "shield-alt" value_type: string category: Display description: > - A character to display after an admin's username to distinguish their role. + The fontawesome v5 icon (e.g. shield-alt, hammer, ...) to display after an admin's username to distinguish their role. - name: ModBadgeCharacter - value: "" + value: "shield-alt" value_type: string category: Display description: > - A character to display after a moderator's username to distinguish their role. + The fontawesome v5 icon (e.g. shield-alt, hammer, ...) to display after a moderator's username to distinguish their role. - name: SoftDeleteTransferUser value: -1 From bebf06fd78c82be19ba38a281b693cba2b8ddb64 Mon Sep 17 00:00:00 2001 From: Monica Cellio Date: Tue, 21 Jun 2022 20:10:34 -0400 Subject: [PATCH 073/347] show 'push to network' control only to admins --- app/views/posts/_form.html.erb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/views/posts/_form.html.erb b/app/views/posts/_form.html.erb index 7ce4f65d7..77721ec95 100644 --- a/app/views/posts/_form.html.erb +++ b/app/views/posts/_form.html.erb @@ -154,7 +154,8 @@
<% if edit_comment %> -
+ <% if current_user.is_admin %> +
<%= label_tag :network_push, 'Push to network', class: 'form-element' %> @@ -166,6 +167,7 @@
<% end %> + <% end %> <% end %> <% if edit_comment %> From bf62f73b39ac47bc1b6bd45fe0378de35fa0c972 Mon Sep 17 00:00:00 2001 From: ArtOfCode Date: Fri, 26 Aug 2022 23:56:24 +0100 Subject: [PATCH 074/347] Update _form.html.erb --- app/views/posts/_form.html.erb | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/app/views/posts/_form.html.erb b/app/views/posts/_form.html.erb index 77721ec95..97c7a2d9d 100644 --- a/app/views/posts/_form.html.erb +++ b/app/views/posts/_form.html.erb @@ -154,19 +154,19 @@
<% if edit_comment %> - <% if current_user.is_admin %> -
-
-
- <%= label_tag :network_push, 'Push to network', class: 'form-element' %> - Copy this edit to all communities (where the post has not been edited)? -
-
- <%= check_box_tag :network_push, true, false, class: 'form-checkbox-element' %> + <% if admin? %> +
+
+
+ <%= label_tag :network_push, 'Push to network', class: 'form-element' %> + Copy this edit to all communities (where the post has not been edited)? +
+
+ <%= check_box_tag :network_push, true, false, class: 'form-checkbox-element' %> +
-
- <% end %> + <% end %> <% end %> <% end %> From 070962a967c98d808057b31a6672fb0320d48f0f Mon Sep 17 00:00:00 2001 From: Taico Aerts Date: Sat, 13 Aug 2022 20:13:08 +0200 Subject: [PATCH 075/347] Fix files when not using Amazon S3 for storage Fixes #827 --- app/controllers/application_controller.rb | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 3d7013ce6..f419e3c6f 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -16,7 +16,12 @@ class ApplicationController < ActionController::Base helper_method :top_level_post_types, :second_level_post_types def upload - redirect_to helpers.upload_remote_url(params[:key]), status: 301 + if ActiveStorage::Blob.service.class.name.end_with?('S3Service') + redirect_to helpers.upload_remote_url(params[:key]), status: 301 + else + blob = params[:key] + redirect_to url_for(ActiveStorage::Blob.find_by(key: blob.is_a?(String) ? blob : blob.key)) + end end def dashboard From 2fcd30a0f5bcb69cec1ab8d78bca161126bbcdb5 Mon Sep 17 00:00:00 2001 From: Moshi Date: Wed, 31 Aug 2022 19:04:45 -0700 Subject: [PATCH 076/347] Make tag selection clearable --- app/assets/javascripts/tags.js | 3 ++- app/views/tags/edit.html.erb | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/tags.js b/app/assets/javascripts/tags.js index 836fff5fd..a2d71685f 100644 --- a/app/assets/javascripts/tags.js +++ b/app/assets/javascripts/tags.js @@ -66,7 +66,8 @@ $(() => { }; }, }, - templateResult: template + templateResult: template, + allowClear: true }); }); diff --git a/app/views/tags/edit.html.erb b/app/views/tags/edit.html.erb index 830c7afef..93b6ec10e 100644 --- a/app/views/tags/edit.html.erb +++ b/app/views/tags/edit.html.erb @@ -27,7 +27,7 @@ <%= f.select :parent_id, options_for_select(@tag.parent.present? ? [[@tag.parent.name, @tag.parent_id]] : [], selected: @tag.parent.present? ? @tag.parent_id : nil), { include_blank: true }, class: "form-element js-tag-select", - data: { tag_set: @category.tag_set_id, use_ids: true } %> + data: { tag_set: @category.tag_set_id, use_ids: true, placeholder: "None" } %>
From 9a4a233516493139ad8e63260d066234a5f6c340 Mon Sep 17 00:00:00 2001 From: Monica Cellio Date: Tue, 23 Aug 2022 21:34:07 -0400 Subject: [PATCH 077/347] Replaced COC, TOS, and privacy policy with placeholders. Reduced global FAQ to network-independent info, with a plug for the project at the end. Edited help section titles to remove references to the Codidact network. Removed the spam topic from the list but didn't remove the file from the repo; it might be useful as a starting point but I believe it won't appear in the help without the entry in posts.yml. --- db/seeds/posts.yml | 22 +++------- db/seeds/posts/coc.html | 16 +++---- db/seeds/posts/global_faq.html | 25 +++++------ db/seeds/posts/privacy-policy.html | 70 +++--------------------------- db/seeds/posts/tos.html | 35 +++------------ 5 files changed, 32 insertions(+), 136 deletions(-) diff --git a/db/seeds/posts.yml b/db/seeds/posts.yml index 06028cd02..415721ef8 100644 --- a/db/seeds/posts.yml +++ b/db/seeds/posts.yml @@ -19,23 +19,15 @@ body_markdown: $FILE posts/coc.html body: $FILE posts/coc.html doc_slug: code-of-conduct - help_category: About Codidact + help_category: About the Network community_id: ~ - post_type_id: <%= PolicyDoc.post_type_id %> - title: Codidact FAQ + title: Network FAQ body_markdown: $FILE posts/global_faq.html body: $FILE posts/global_faq.html - doc_slug: codidact-faq - help_category: About Codidact - community_id: ~ - -- post_type_id: <%= PolicyDoc.post_type_id %> - title: Guidelines for promotional content in posts on Codidact communities - body_markdown: $FILE posts/spam.html - body: $FILE posts/spam.html - doc_slug: spam - help_category: About Codidact + doc_slug: network-faq + help_category: About the Network community_id: ~ - post_type_id: <%= HelpDoc.post_type_id %> @@ -88,21 +80,21 @@ help_category: Guidance - post_type_id: <%= HelpDoc.post_type_id %> - title: Guidelines for referencing and quoting on Codidact communities + title: Guidelines for referencing and quoting body_markdown: $FILE posts/referencing.html body: $FILE posts/referencing.html doc_slug: referencing help_category: Guidance - post_type_id: <%= HelpDoc.post_type_id %> - title: Guidance on available licenses on Codidact communities + title: Guidance on available licenses body_markdown: $FILE posts/licenses.html body: $FILE posts/licenses.html doc_slug: licenses help_category: Guidance - post_type_id: <%= HelpDoc.post_type_id %> - title: Codidact search options + title: Search options body_markdown: $FILE posts/search.html body: $FILE posts/search.html doc_slug: search diff --git a/db/seeds/posts/coc.html b/db/seeds/posts/coc.html index 59f9c62e7..04a2ef829 100644 --- a/db/seeds/posts/coc.html +++ b/db/seeds/posts/coc.html @@ -1,11 +1,5 @@ -

This Code of Conduct applies to all online spaces run by the Codidact organization, as well as official physical meetups of its community.

-

Be nice; be respectful

-

We're deliberately not setting out everything that is and isn't allowed - bring your common sense and apply the spirit of this Code. The following are definitely not okay:

-
    -
  • Rudeness
  • -
  • Threatening, abusive, or prejudicial treatment of a person or group
  • -
  • Ad hominem attacks, whether directed at individual people or groups
  • -
  • Any kind of harassment, for any reason
  • -
-

Always be constructive, especially when giving feedback. Always presume that others are acting with good intent.

-

If you see anything that appears to be a violation of this Code, flag or otherwise report it. We take reports seriously, and although we may not be able to follow up with you, we will take any necessary action. We'll keep your identity private.

+ + +

+ + diff --git a/db/seeds/posts/global_faq.html b/db/seeds/posts/global_faq.html index 32ca56522..bfa480047 100644 --- a/db/seeds/posts/global_faq.html +++ b/db/seeds/posts/global_faq.html @@ -1,18 +1,13 @@ -

What is Codidact?

-

Codidact is an open-source initiative to provide a high-quality, community-controlled, open source Q&A platform. Visit https://codidact.org to learn more about the platform we're building to empower anyone to host a Q&A community, or visit https://codidact.com to browse our family of hosted communities.

-

Who runs Codidact?

-

Users just like you! The software is built and hosted by volunteers who are passionate about the need for a community-driven Q&A site. Each site is moderated by a team of dedicated, experienced users who spend their time weeding out spam, coaching newcomers, and ensuring questions are on-topic and high-quality.

-

As of July 2020, the current organisation structure looks like this:

-

Team Lead: ArtOfCode. Underneath Team Lead are Community Lead (cellio) and Tech Lead (luap42), as well as Group Leader: Design (mattjbrent) and the Admin role. Under Tech Lead are Group Leader: Backend and Group Leader: Frontend (Kieran). Under Community Lead is Group Leader: Developer Docs (Mithrandir24601) and Group Leader: User Docs (Sarah & Mithical). Off to the side is Project Leaders, and underneath the Project Leaders, Admins, and Group Leaders are Contributors.

+ +

How do I ask a question?

-

You will need to register an account. Make sure you are logged into the appropriate topic-related site for your question and click the "Ask Question" button at the top of the page. A template should appear with helpful guidelines on how to ask a quality question. Note that some communities may require you to have a certain trust level before asking a question; always check out the local FAQ page for important information before contributing.

-

What are trust levels and how are they calculated?

- -

Trust levels are the system Codidact uses to determine user privileges. Everyone starts at Trust Level 0 and gradually gains the ability to contribute at a higher level. Trust levels are earned by positively contributing to the site. For more information, see https://github.com/codidact/docs/wiki/User-Privileges.

-

What does it mean that Codidact is community-controlled? What makes it different from any other Q&A site?

-

Most Q&A sites are run by companies whose primary goal is to make a profit for their shareholders. This leads to a situation where bringing in revenue can be more important than the health of the community using the site. On Codidact, the users control the communities they use, so there's no conflict of interest between quality and the bottom line.

+

You will need to register an account. Make sure you are logged into the appropriate topic-related site for your question and click the "Ask Question" button at the top of the page. A template should appear with helpful guidelines on how to ask a quality question. Check out the local FAQ page for important information about each community.

+ +

What license do my posts fall under?

Most posts fall under CC BY-SA 4.0. Some communities or contributors may use a license that more closely aligns with the content posted or their ideological position. Check a community's local FAQ page and Terms of Service for site-specific details.

-

How can I contribute?

- -

The best way to contribute is by joining a community and submitting quality questions and answers! If you want to join our technical team, check out our GitHub site here to get started.

+ + +

What is Codidact?

+

This community is built using software provided by The Codidact Foundation. The software is free, open-source, and customizable.

+ diff --git a/db/seeds/posts/privacy-policy.html b/db/seeds/posts/privacy-policy.html index ccd5efe0f..c96e11254 100644 --- a/db/seeds/posts/privacy-policy.html +++ b/db/seeds/posts/privacy-policy.html @@ -1,65 +1,5 @@ -

How we use and protect your information

-

This Privacy Policy applies to all Codidact communities hosted under ​codidact.com​, and to the announcements@codidact.org​ mailing list. We want you to be able to trust us when we say:

-
    -
  • that we respect your privacy;
  • -
  • that we don't ask for information we don't need;
  • -
  • that we take care of the information you give us.
  • -
-

What data do we collect?

-

We try to keep the amount of identifying data that we collect about you to the minimum necessary. If you're using our communities without signing in, we collect no identifying information about you at all. If you sign up for an account, we'll ask for a few things:

-
    -
  • An ​email address.
  • -
  • A ​username​. This isn't necessarily identifiable to you, but you should be aware that it's public – you should pick something that you don't mind everyone seeing.
  • -
-

We'll also collect your email address if you sign up for our announcements@codidact.org​ mailing list.

-

As you're browsing the communities we host, we'll also collect a small amount of non-identifying information automatically, including:

-
    -
  • The type of device you're using, and the operating system it runs on
  • -
  • The Internet browser you use
  • -
  • The country that your request came from
  • -
  • How you arrived at our sites – whether you searched, came from another website, or came straight to us
  • -
-

How do we collect data?

-

If you sign up for an account or for our mailing list, you're directly providing us with the data that we collect. Our automatic collection of non-identifying data is done behind the scenes based on information that your browser sends while you're using our sites.

-

How will we use your data?

-

We collect your data so that we can:

-
    -
  • Manage your account (for instance by sending you emails about the security of your account, or to help you regain access if you lose your password);
  • -
  • Keep you updated about our policies (for instance, we might email you if we change our Terms of Service or this Privacy Policy);
  • -
  • Respond to requests for support (these are generally handled on our Meta site, but in some cases our staff might email you to help with your request)
  • -
  • If you sign up for our mailing list, so that we can send you updates about the important things happening in the Codidact project.
  • -
-

We do not:

-
    -
  • Send you emails that you didn't sign up for, or
  • -
  • Sell or give away your data for our commercial benefit, either individually or in aggregate.
  • -
-

How do we store data?

-

If you've signed up for an account on our sites, your information is stored in our database, which we host on an ​Amazon Web Services​ server. Amazon staff do not have access to our server or to your information. Our mailing list is based on email services from ​ICDSoft​. If you've signed up for our mailing list, your email address is stored on their servers. In all cases where we're storing your data, we use strict access controls to ensure the minimum number of people have access to your data. We don't access or use your data without good reason, such as to fulfil one of the purposes listed above, or in the security and maintenance of our sites. Our analytics data is stored using an instance of ​Matomo​ which we host ourselves. This means that all our analytics data never leaves our own servers, and we don't use non-self-hosted options like Google Analytics.

-

What are your rights?

-

As an international organisation, we extend the rights granted by the EU GDPR to everyone. Therefore, all our users have the right to the following:

-
    -
  • Access: You have the right to request a copy of all the personal data we hold about you. We may ask you to cover our costs in preparing a copy for you, but the majority of cases should have no associated cost.
  • -
  • Rectification: You can ask us to correct any information we hold that is inaccurate, or to complete any information we hold that is incomplete.
  • -
  • Erasure: You can request that we remove all personal information we hold about you. If you've signed up for an account, this may mean we need to delete your account. If you're signed up to our mailing list, you'll no longer receive updates from it.
  • -
  • Restriction or Objection: You can, under certain conditions, request that we restrict the processing of your personal data, or object to our processing of your personal data. As with your right to erasure, this may mean we need to delete your account or remove you from our mailing list.
  • -
  • Portability: You can ask us to transfer the data we hold about you to another organisation or directly to you, in a format that's convenient for you.
  • -
-

We may take up to one month to respond to a request in regards to any of these rights, though we will try to respond as soon as practicable. If you'd like to make use of any of these rights, please email us at info@codidact.org​.

-

How do we use cookies?

-

Cookies are small, temporary text files that your browser places on your computer at our request. Their use is standard practice across the Internet to keep hold of information that we need about your visit. You can visit ​allaboutcookies.org​ for more information about them. We use them in a small number of ways:

-
    -
  • To keep you signed into your account
  • -
  • To understand how you use our sites
  • -
-

Our cookies are split into two distinct types of cookies:

-
    -
  • Functional: These are cookies that we have to set for you to be able to use the site, such as to keep you signed into your account.
  • -
  • Analytics: These cookies store a small amount of information about your device and your visit, to help us understand how people are using our sites and how we can improve them.
  • -
-

Can you disable cookies?

-

If you'd rather we didn't set any cookies on your device, you can set your browser to refuse cookies from us and remove any that have already been set – have a look at the website above for details on how to do so. Please be aware that this may mean our sites don't work as they should: for example, if you block all cookies from us, we won't be able to keep you signed into your account.

-

Changes to this Privacy Policy

-

We review this privacy policy regularly to make sure we're always giving you the correct information. If we make significant additions or changes to what data we collect from you or how we use it, we'll let you know via email, if we have an email address for you. This privacy policy was last updated on 2021-03-20.

-

Contact

-

If you have questions about this policy or you wish to exercise one of your rights, please contact us at info@codidact.org​. If you wish to report a complaint or if you feel that we haven't adequately resolved your concerns, you have the right to make a complaint to a relevant authority. To do so, you should contact the statutory data protection authority in your country of residence. Please be aware that if you live outside the EU, you may not have this right.

\ No newline at end of file + + +

+ + diff --git a/db/seeds/posts/tos.html b/db/seeds/posts/tos.html index aab874165..d63e5acdb 100644 --- a/db/seeds/posts/tos.html +++ b/db/seeds/posts/tos.html @@ -1,30 +1,5 @@ -

These Terms of Service ("Terms") govern your use of any Codidact community hosted at https://codidact.com/ or any subdomain thereof (the "Service"). These Terms apply to all uses of the Service, whether you sign up for an account or not. Your use of the Service constitutes your acceptance of these Terms.

-

1. Who can use the Service

-

The Service is intended to be as open as possible; however, there are a few restrictions on who is eligible to use it.

-
    -
  • If you wish to sign up for an account, you must be at least 13 years old, or 16 years old if you reside in the European Union.
  • -
  • You must not be prohibited from using the Service by any applicable laws.
  • -
  • If you sign up for an account and it is terminated due to your misconduct or contravention of these Terms, you may no longer use the Service.
  • -
-

2. Member Conduct

-

You agree not to use the Service to:

-
    -
  • attempt to gain unauthorized access to the Service or to any servers, systems, networks, databases, or other technology or data involved in its provision;
  • -
  • violate any applicable law or regulation;
  • -
  • post content which you do not have the right or permission to post, or to infringe any copyright or other proprietary right of any entity or person;
  • -
  • post content that is hateful, discriminatory, harmful, illegal, or otherwise objectionable;
  • -
  • impersonate any other person, group, or entity;
  • -
  • violate the then-current Code of Conduct of the Service, which is available in our help center.
  • -
-

3. User-Generated Content

-

If you sign up for an account, you will be able to submit questions, answers, comments, and other types of posts, some of which may include images, video, or other media (collectively, "User-Generated Content" or "Content").

-

By posting here, you license any such Content under the terms of one of (in increasing order of precedence) (a) the site default license at the time of creating your post; (b) the license of the category in which you post, or (c) the license you choose from the available list at the time of creating your post — the "Applicable License". You represent and warrant that you own the rights to all Content you post or that you have the right or have been given permission from the relevant copyright holder to post it under the terms of the Applicable License.

-

You may have the opportunity to post feedback on the Service in the Meta section, including reports of erroneous behavior or requests for changes to how the Service works. If your feedback is acted upon, you will not be entitled to compensation in any form. There will be no obligation to act upon your feedback.

-

Your use of the Service does not give you any rights in the design, branding, logos, or other design elements of the Service, and you may not copy, distribute, or otherwise use or disseminate any such elements without written permission (which may be requested by emailing info@codidact.com).

-

4. Termination

-

You agree that if you engage in any conduct that contravenes these Terms, your right to use the Service may be revoked without warning. If you have provided contact details (for example, by creating an account), you may be contacted to advise you of such revocation, but there shall be no obligation to do so.

-

Any clause that should by its nature survive termination shall be deemed to survive it, including particularly clauses 3, 4, 5, and 6.

-

5. Limitations on Liability

-

Although every effort is made to make the Service available, the Service is provided "as-is", and no guarantee is made that the Service will be available, secure, or error-free. To the maximum extent permitted by law, the Service comes with NO WARRANTY, WHETHER EXPRESS OR IMPLIED, INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE, AND NON-INFRINGEMENT.

-

6. Governing Law

-

These Terms are governed by the laws of the United Kingdom, and jurisdiction in disputes relating to the Service shall be limited to courts located in London, United Kingdom.

+ + +

+ + From a780b5b6bfb8bd4867cda1c805dc79211459dcbd Mon Sep 17 00:00:00 2001 From: Monica Cellio Date: Wed, 24 Aug 2022 09:46:43 -0400 Subject: [PATCH 078/347] restore original versions; we can leave them as templates and not auto-include them in the help instead --- db/seeds/posts/coc.html | 14 ++++-- db/seeds/posts/privacy-policy.html | 68 ++++++++++++++++++++++++++++-- db/seeds/posts/tos.html | 33 +++++++++++++-- 3 files changed, 106 insertions(+), 9 deletions(-) diff --git a/db/seeds/posts/coc.html b/db/seeds/posts/coc.html index 04a2ef829..f975305a1 100644 --- a/db/seeds/posts/coc.html +++ b/db/seeds/posts/coc.html @@ -1,5 +1,13 @@ - - -

+

This Code of Conduct applies to all online spaces run by the Codidact organization, as well as official physical meetups of its community.

+

Be nice; be respectful

+

We're deliberately not setting out everything that is and isn't allowed - bring your common sense and apply the spirit of this Code. The following are definitely not okay:

+
    +
  • Rudeness
  • +
  • Threatening, abusive, or prejudicial treatment of a person or group
  • +
  • Ad hominem attacks, whether directed at individual people or groups
  • +
  • Any kind of harassment, for any reason
  • +
+

Always be constructive, especially when giving feedback. Always presume that others are acting with good intent.

+

If you see anything that appears to be a violation of this Code, flag or otherwise report it. We take reports seriously, and although we may not be able to follow up with you, we will take any necessary action. We'll keep your identity private.

diff --git a/db/seeds/posts/privacy-policy.html b/db/seeds/posts/privacy-policy.html index c96e11254..1a59d8d85 100644 --- a/db/seeds/posts/privacy-policy.html +++ b/db/seeds/posts/privacy-policy.html @@ -1,5 +1,67 @@ - - -

+

How we use and protect your information

+

This Privacy Policy applies to all Codidact communities hosted under ​codidact.com​, and to the announcements@codidact.org​ mailing list. We want you to be able to trust us when we say:

+
    +
  • that we respect your privacy;
  • +
  • that we don't ask for information we don't need;
  • +
  • that we take care of the information you give us.
  • +
+

What data do we collect?

+

We try to keep the amount of identifying data that we collect about you to the minimum necessary. If you're using our communities without signing in, we collect no identifying information about you at all. If you sign up for an account, we'll ask for a few things:

+
    +
  • An ​email address.
  • +
  • A ​username​. This isn't necessarily identifiable to you, but you should be aware that it's public – you should pick something that you don't mind everyone seeing.
  • +
+

We'll also collect your email address if you sign up for our announcements@codidact.org​ mailing list.

+

As you're browsing the communities we host, we'll also collect a small amount of non-identifying information automatically, including:

+
    +
  • The type of device you're using, and the operating system it runs on
  • +
  • The Internet browser you use
  • +
  • The country that your request came from
  • +
  • How you arrived at our sites – whether you searched, came from another website, or came straight to us
  • +
+

How do we collect data?

+

If you sign up for an account or for our mailing list, you're directly providing us with the data that we collect. Our automatic collection of non-identifying data is done behind the scenes based on information that your browser sends while you're using our sites.

+

How will we use your data?

+

We collect your data so that we can:

+
    +
  • Manage your account (for instance by sending you emails about the security of your account, or to help you regain access if you lose your password);
  • +
  • Keep you updated about our policies (for instance, we might email you if we change our Terms of Service or this Privacy Policy);
  • +
  • Respond to requests for support (these are generally handled on our Meta site, but in some cases our staff might email you to help with your request)
  • +
  • If you sign up for our mailing list, so that we can send you updates about the important things happening in the Codidact project.
  • +
+

We do not:

+
    +
  • Send you emails that you didn't sign up for, or
  • +
  • Sell or give away your data for our commercial benefit, either individually or in aggregate.
  • +
+

How do we store data?

+

If you've signed up for an account on our sites, your information is stored in our database, which we host on an ​Amazon Web Services​ server. Amazon staff do not have access to our server or to your information. Our mailing list is based on email services from ​ICDSoft​. If you've signed up for our mailing list, your email address is stored on their servers. In all cases where we're storing your data, we use strict access controls to ensure the minimum number of people have access to your data. We don't access or use your data without good reason, such as to fulfil one of the purposes listed above, or in the security and maintenance of our sites. Our analytics data is stored using an instance of ​Matomo​ which we host ourselves. This means that all our analytics data never leaves our own servers, and we don't use non-self-hosted options like Google Analytics.

+

What are your rights?

+

As an international organisation, we extend the rights granted by the EU GDPR to everyone. Therefore, all our users have the right to the following:

+
    +
  • Access: You have the right to request a copy of all the personal data we hold about you. We may ask you to cover our costs in preparing a copy for you, but the majority of cases should have no associated cost.
  • +
  • Rectification: You can ask us to correct any information we hold that is inaccurate, or to complete any information we hold that is incomplete.
  • +
  • Erasure: You can request that we remove all personal information we hold about you. If you've signed up for an account, this may mean we need to delete your account. If you're signed up to our mailing list, you'll no longer receive updates from it.
  • +
  • Restriction or Objection: You can, under certain conditions, request that we restrict the processing of your personal data, or object to our processing of your personal data. As with your right to erasure, this may mean we need to delete your account or remove you from our mailing list.
  • +
  • Portability: You can ask us to transfer the data we hold about you to another organisation or directly to you, in a format that's convenient for you.
  • +
+

We may take up to one month to respond to a request in regards to any of these rights, though we will try to respond as soon as practicable. If you'd like to make use of any of these rights, please email us at info@codidact.org​.

+

How do we use cookies?

+

Cookies are small, temporary text files that your browser places on your computer at our request. Their use is standard practice across the Internet to keep hold of information that we need about your visit. You can visit ​allaboutcookies.org​ for more information about them. We use them in a small number of ways:

+
    +
  • To keep you signed into your account
  • +
  • To understand how you use our sites
  • +
+

Our cookies are split into two distinct types of cookies:

+
    +
  • Functional: These are cookies that we have to set for you to be able to use the site, such as to keep you signed into your account.
  • +
  • Analytics: These cookies store a small amount of information about your device and your visit, to help us understand how people are using our sites and how we can improve them.
  • +
+

Can you disable cookies?

+

If you'd rather we didn't set any cookies on your device, you can set your browser to refuse cookies from us and remove any that have already been set – have a look at the website above for details on how to do so. Please be aware that this may mean our sites don't work as they should: for example, if you block all cookies from us, we won't be able to keep you signed into your account.

+

Changes to this Privacy Policy

+

We review this privacy policy regularly to make sure we're always giving you the correct information. If we make significant additions or changes to what data we collect from you or how we use it, we'll let you know via email, if we have an email address for you. This privacy policy was last updated on 2021-03-20.

+

Contact

+

If you have questions about this policy or you wish to exercise one of your rights, please contact us at info@codidact.org​. If you wish to report a complaint or if you feel that we haven't adequately resolved your concerns, you have the right to make a complaint to a relevant authority. To do so, you should contact the statutory data protection authority in your country of residence. Please be aware that if you live outside the EU, you may not have this right.

diff --git a/db/seeds/posts/tos.html b/db/seeds/posts/tos.html index d63e5acdb..9d8483486 100644 --- a/db/seeds/posts/tos.html +++ b/db/seeds/posts/tos.html @@ -1,5 +1,32 @@ - - -

+

These Terms of Service ("Terms") govern your use of any Codidact community hosted at https://codidact.com/ or any subdomain thereof (the "Service"). These Terms apply to all uses of the Service, whether you sign up for an account or not. Your use of the Service constitutes your acceptance of these Terms.

+

1. Who can use the Service

+

The Service is intended to be as open as possible; however, there are a few restrictions on who is eligible to use it.

+
    +
  • If you wish to sign up for an account, you must be at least 13 years old, or 16 years old if you reside in the European Union.
  • +
  • You must not be prohibited from using the Service by any applicable laws.
  • +
  • If you sign up for an account and it is terminated due to your misconduct or contravention of these Terms, you may no longer use the Service.
  • +
+

2. Member Conduct

+

You agree not to use the Service to:

+
    +
  • attempt to gain unauthorized access to the Service or to any servers, systems, networks, databases, or other technology or data involved in its provision;
  • +
  • violate any applicable law or regulation;
  • +
  • post content which you do not have the right or permission to post, or to infringe any copyright or other proprietary right of any entity or person;
  • +
  • post content that is hateful, discriminatory, harmful, illegal, or otherwise objectionable;
  • +
  • impersonate any other person, group, or entity;
  • +
  • violate the then-current Code of Conduct of the Service, which is available in our help center.
  • +
+

3. User-Generated Content

+

If you sign up for an account, you will be able to submit questions, answers, comments, and other types of posts, some of which may include images, video, or other media (collectively, "User-Generated Content" or "Content").

+

By posting here, you license any such Content under the terms of one of (in increasing order of precedence) (a) the site default license at the time of creating your post; (b) the license of the category in which you post, or (c) the license you choose from the available list at the time of creating your post — the "Applicable License". You represent and warrant that you own the rights to all Content you post or that you have the right or have been given permission from the relevant copyright holder to post it under the terms of the Applicable License.

+

You may have the opportunity to post feedback on the Service in the Meta section, including reports of erroneous behavior or requests for changes to how the Service works. If your feedback is acted upon, you will not be entitled to compensation in any form. There will be no obligation to act upon your feedback.

+

Your use of the Service does not give you any rights in the design, branding, logos, or other design elements of the Service, and you may not copy, distribute, or otherwise use or disseminate any such elements without written permission (which may be requested by emailing info@codidact.com).

+

4. Termination

+

You agree that if you engage in any conduct that contravenes these Terms, your right to use the Service may be revoked without warning. If you have provided contact details (for example, by creating an account), you may be contacted to advise you of such revocation, but there shall be no obligation to do so.

+

Any clause that should by its nature survive termination shall be deemed to survive it, including particularly clauses 3, 4, 5, and 6.

+

5. Limitations on Liability

+

Although every effort is made to make the Service available, the Service is provided "as-is", and no guarantee is made that the Service will be available, secure, or error-free. To the maximum extent permitted by law, the Service comes with NO WARRANTY, WHETHER EXPRESS OR IMPLIED, INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE, AND NON-INFRINGEMENT.

+

6. Governing Law

+

These Terms are governed by the laws of the United Kingdom, and jurisdiction in disputes relating to the Service shall be limited to courts located in London, United Kingdom.

From 6f298d2c318f60093e978e3a741dabe4a78912c3 Mon Sep 17 00:00:00 2001 From: Monica Cellio Date: Wed, 24 Aug 2022 11:15:16 -0400 Subject: [PATCH 079/347] added placeholders () and instructional comments for customizing --- db/seeds/posts/coc.html | 3 ++- db/seeds/posts/privacy-policy.html | 15 ++++++++------- db/seeds/posts/spam.html | 3 ++- db/seeds/posts/tos.html | 8 +++++--- 4 files changed, 17 insertions(+), 12 deletions(-) diff --git a/db/seeds/posts/coc.html b/db/seeds/posts/coc.html index f975305a1..6802e538e 100644 --- a/db/seeds/posts/coc.html +++ b/db/seeds/posts/coc.html @@ -1,4 +1,5 @@ -

This Code of Conduct applies to all online spaces run by the Codidact organization, as well as official physical meetups of its community.

+ +

This Code of Conduct applies to all online spaces run by the $EDIT-org-name organization, as well as official physical meetups of its community.

Be nice; be respectful

We're deliberately not setting out everything that is and isn't allowed - bring your common sense and apply the spirit of this Code. The following are definitely not okay:

    diff --git a/db/seeds/posts/privacy-policy.html b/db/seeds/posts/privacy-policy.html index 1a59d8d85..ddd07c6bd 100644 --- a/db/seeds/posts/privacy-policy.html +++ b/db/seeds/posts/privacy-policy.html @@ -1,5 +1,6 @@ +

    How we use and protect your information

    -

    This Privacy Policy applies to all Codidact communities hosted under ​codidact.com​, and to the announcements@codidact.org​ mailing list. We want you to be able to trust us when we say:

    +

    This Privacy Policy applies to all Codidact communities hosted under ​$EDIT-URL. We want you to be able to trust us when we say:

    • that we respect your privacy;
    • that we don't ask for information we don't need;
    • @@ -11,7 +12,6 @@

      What data do we collect?

    • An ​email address.
    • A ​username​. This isn't necessarily identifiable to you, but you should be aware that it's public – you should pick something that you don't mind everyone seeing.
    -

    We'll also collect your email address if you sign up for our announcements@codidact.org​ mailing list.

    As you're browsing the communities we host, we'll also collect a small amount of non-identifying information automatically, including:

    • The type of device you're using, and the operating system it runs on
    • @@ -27,7 +27,7 @@

      How will we use your data?

    • Manage your account (for instance by sending you emails about the security of your account, or to help you regain access if you lose your password);
    • Keep you updated about our policies (for instance, we might email you if we change our Terms of Service or this Privacy Policy);
    • Respond to requests for support (these are generally handled on our Meta site, but in some cases our staff might email you to help with your request)
    • -
    • If you sign up for our mailing list, so that we can send you updates about the important things happening in the Codidact project.
    • +
    • If you sign up for our mailing list, so that we can send you updates.

    We do not:

      @@ -35,7 +35,8 @@

      How will we use your data?

    • Sell or give away your data for our commercial benefit, either individually or in aggregate.

    How do we store data?

    -

    If you've signed up for an account on our sites, your information is stored in our database, which we host on an ​Amazon Web Services​ server. Amazon staff do not have access to our server or to your information. Our mailing list is based on email services from ​ICDSoft​. If you've signed up for our mailing list, your email address is stored on their servers. In all cases where we're storing your data, we use strict access controls to ensure the minimum number of people have access to your data. We don't access or use your data without good reason, such as to fulfil one of the purposes listed above, or in the security and maintenance of our sites. Our analytics data is stored using an instance of ​Matomo​ which we host ourselves. This means that all our analytics data never leaves our own servers, and we don't use non-self-hosted options like Google Analytics.

    + +

    If you've signed up for an account on our sites, your information is stored in our database, which we host on an ​Amazon Web Services​ server. Amazon staff do not have access to our server or to your information. If you've signed up for our mailing list, your email address is stored on the email provider's servers. In all cases where we're storing your data, we use strict access controls to ensure the minimum number of people have access to your data. We don't access or use your data without good reason, such as to fulfil one of the purposes listed above, or in the security and maintenance of our sites. Our analytics data is stored using an instance of ​Matomo​ which we host ourselves. This means that all our analytics data never leaves our own servers, and we don't use non-self-hosted options like Google Analytics.

    What are your rights?

    As an international organisation, we extend the rights granted by the EU GDPR to everyone. Therefore, all our users have the right to the following:

      @@ -45,7 +46,7 @@

      What are your rights?

    • Restriction or Objection: You can, under certain conditions, request that we restrict the processing of your personal data, or object to our processing of your personal data. As with your right to erasure, this may mean we need to delete your account or remove you from our mailing list.
    • Portability: You can ask us to transfer the data we hold about you to another organisation or directly to you, in a format that's convenient for you.
    -

    We may take up to one month to respond to a request in regards to any of these rights, though we will try to respond as soon as practicable. If you'd like to make use of any of these rights, please email us at info@codidact.org​.

    +

    We may take up to one month to respond to a request in regards to any of these rights, though we will try to respond as soon as practicable. If you'd like to make use of any of these rights, please email us at $EDIT-contact-email.

    How do we use cookies?

    Cookies are small, temporary text files that your browser places on your computer at our request. Their use is standard practice across the Internet to keep hold of information that we need about your visit. You can visit ​allaboutcookies.org​ for more information about them. We use them in a small number of ways:

      @@ -60,8 +61,8 @@

      How do we use cookies?

      Can you disable cookies?

      If you'd rather we didn't set any cookies on your device, you can set your browser to refuse cookies from us and remove any that have already been set – have a look at the website above for details on how to do so. Please be aware that this may mean our sites don't work as they should: for example, if you block all cookies from us, we won't be able to keep you signed into your account.

      Changes to this Privacy Policy

      -

      We review this privacy policy regularly to make sure we're always giving you the correct information. If we make significant additions or changes to what data we collect from you or how we use it, we'll let you know via email, if we have an email address for you. This privacy policy was last updated on 2021-03-20.

      +

      We review this privacy policy regularly to make sure we're always giving you the correct information. If we make significant additions or changes to what data we collect from you or how we use it, we'll let you know via email, if we have an email address for you. This privacy policy was last updated on $EDIT-update-date.

      Contact

      -

      If you have questions about this policy or you wish to exercise one of your rights, please contact us at info@codidact.org​. If you wish to report a complaint or if you feel that we haven't adequately resolved your concerns, you have the right to make a complaint to a relevant authority. To do so, you should contact the statutory data protection authority in your country of residence. Please be aware that if you live outside the EU, you may not have this right.

      +

      If you have questions about this policy or you wish to exercise one of your rights, please contact us at $EDIT-contact-email​. If you wish to report a complaint or if you feel that we haven't adequately resolved your concerns, you have the right to make a complaint to a relevant authority. To do so, you should contact the statutory data protection authority in your country of residence. Please be aware that if you live outside the EU, you may not have this right.

      diff --git a/db/seeds/posts/spam.html b/db/seeds/posts/spam.html index 0479665f6..09b3caa7f 100644 --- a/db/seeds/posts/spam.html +++ b/db/seeds/posts/spam.html @@ -1,3 +1,4 @@ +

      It's natural to want to promote yourself. You want as many people as possible to know about your dragon-riding place (only 1,000 gold coins per ride!), and to make sure that you're their first choice for saddling up firebreathers. With that in mind, though, we do need to set some restrictions and guidelines on self-promotion here.

      When promoting or linking anything that you are affiliated with, please keep the following points in mind:

      @@ -14,4 +15,4 @@
    -

    Posts that don't follow the above guidelines may be deleted, even without warning.

    \ No newline at end of file +

    Posts that don't follow the above guidelines may be deleted, even without warning.

    diff --git a/db/seeds/posts/tos.html b/db/seeds/posts/tos.html index 9d8483486..ef9e5d02d 100644 --- a/db/seeds/posts/tos.html +++ b/db/seeds/posts/tos.html @@ -1,4 +1,5 @@ -

    These Terms of Service ("Terms") govern your use of any Codidact community hosted at https://codidact.com/ or any subdomain thereof (the "Service"). These Terms apply to all uses of the Service, whether you sign up for an account or not. Your use of the Service constitutes your acceptance of these Terms.

    + +

    These Terms of Service ("Terms") govern your use of any Codidact community hosted at $EDIT-URL or any subdomain thereof (the "Service"). These Terms apply to all uses of the Service, whether you sign up for an account or not. Your use of the Service constitutes your acceptance of these Terms.

    1. Who can use the Service

    The Service is intended to be as open as possible; however, there are a few restrictions on who is eligible to use it.

      @@ -14,19 +15,20 @@

      2. Member Conduct

    • post content which you do not have the right or permission to post, or to infringe any copyright or other proprietary right of any entity or person;
    • post content that is hateful, discriminatory, harmful, illegal, or otherwise objectionable;
    • impersonate any other person, group, or entity;
    • -
    • violate the then-current Code of Conduct of the Service, which is available in our help center.
    • +
    • violate the then-current Code of Conduct of the Service, which is available in our help center.

    3. User-Generated Content

    If you sign up for an account, you will be able to submit questions, answers, comments, and other types of posts, some of which may include images, video, or other media (collectively, "User-Generated Content" or "Content").

    By posting here, you license any such Content under the terms of one of (in increasing order of precedence) (a) the site default license at the time of creating your post; (b) the license of the category in which you post, or (c) the license you choose from the available list at the time of creating your post — the "Applicable License". You represent and warrant that you own the rights to all Content you post or that you have the right or have been given permission from the relevant copyright holder to post it under the terms of the Applicable License.

    You may have the opportunity to post feedback on the Service in the Meta section, including reports of erroneous behavior or requests for changes to how the Service works. If your feedback is acted upon, you will not be entitled to compensation in any form. There will be no obligation to act upon your feedback.

    -

    Your use of the Service does not give you any rights in the design, branding, logos, or other design elements of the Service, and you may not copy, distribute, or otherwise use or disseminate any such elements without written permission (which may be requested by emailing info@codidact.com).

    +

    Your use of the Service does not give you any rights in the design, branding, logos, or other design elements of the Service, and you may not copy, distribute, or otherwise use or disseminate any such elements without written permission (which may be requested by emailing $EDIT-contact-email).

    4. Termination

    You agree that if you engage in any conduct that contravenes these Terms, your right to use the Service may be revoked without warning. If you have provided contact details (for example, by creating an account), you may be contacted to advise you of such revocation, but there shall be no obligation to do so.

    Any clause that should by its nature survive termination shall be deemed to survive it, including particularly clauses 3, 4, 5, and 6.

    5. Limitations on Liability

    Although every effort is made to make the Service available, the Service is provided "as-is", and no guarantee is made that the Service will be available, secure, or error-free. To the maximum extent permitted by law, the Service comes with NO WARRANTY, WHETHER EXPRESS OR IMPLIED, INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE, AND NON-INFRINGEMENT.

    6. Governing Law

    +

    These Terms are governed by the laws of the United Kingdom, and jurisdiction in disputes relating to the Service shall be limited to courts located in London, United Kingdom.

    From 3dc05de3f96a82e44e6f86d2775a4202eebcdc33 Mon Sep 17 00:00:00 2001 From: Monica Cellio Date: Wed, 24 Aug 2022 11:15:59 -0400 Subject: [PATCH 080/347] restored spam section, so it and tos/coc/privacy are all treated the same way (currently in, but maybe we should comment out) --- db/seeds/posts.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/db/seeds/posts.yml b/db/seeds/posts.yml index 415721ef8..893015027 100644 --- a/db/seeds/posts.yml +++ b/db/seeds/posts.yml @@ -30,6 +30,14 @@ help_category: About the Network community_id: ~ +- post_type_id: <%= PolicyDoc.post_type_id %> + title: Guidelines for promotional content in posts + body_markdown: $FILE posts/spam.html + body: $FILE posts/spam.html + doc_slug: spam + help_category: About the Network + community_id: ~ + - post_type_id: <%= HelpDoc.post_type_id %> title: FAQ body_markdown: $FILE posts/local_faq.html From 4a988f23b76c5f4c3f83c31dc63cbd3bc32d36ab Mon Sep 17 00:00:00 2001 From: Monica Cellio Date: Wed, 24 Aug 2022 21:13:08 -0400 Subject: [PATCH 081/347] added section about updating help (for production systems) to installation doc --- INSTALLATION.md | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/INSTALLATION.md b/INSTALLATION.md index 101982a49..d05e5961d 100644 --- a/INSTALLATION.md +++ b/INSTALLATION.md @@ -115,8 +115,7 @@ Community.create(name: 'Dev Community', host: 'localhost:3000') Rails.cache.clear ``` -After that you can call `rails db:seed` to fill the database with necessary seed data, such as -settings, help posts and default templates. +After that you can call `rails db:seed` to fill the database with necessary seed data, such as settings, help posts and default templates. (If you are preparing a production deployment, you might choose to edit some of the help seeds first. See "Help Topics" at the end of this guide.) $ rails db:seed Category: Created 2, skipped 0 @@ -179,3 +178,19 @@ body and title, and you are required at least one tag. And then click to "Save Post in Q&A" ![img/post.png](img/post.png) + +## Optional: Help Topics + +If you are running a development server, you might not care a lot about what's in the help. If you are planning to deploy a server for actual use, however, note that the seeds have some placeholder text you'll want to edit. We have provided starting points (to be edited) for the following topics: + +- Terms of service (TOS) +- Code of conduct (COC) +- Privacy policy +- Spam policy +- Global (network) FAQ + +The corresponding posts in db/seeds/posts have some places marked with "$EDIT" where you will probably want to insert URLs, email addresses, and the like. We recommend reviewing all of the content in these topics. There are two ways to edit these topics: + +- Edit the seed files before seeding your database. +- Edit the topics in the UI. As an administrator, you'll see an edit button on help topics when you view them, and the editor provides an option to deploy changes across your network of communities. + From 38612d6e324db942a8c919088d27753953f29d2a Mon Sep 17 00:00:00 2001 From: Monica Cellio Date: Thu, 25 Aug 2022 18:36:46 -0400 Subject: [PATCH 082/347] addressed PR review comments --- db/seeds/posts/global_faq.html | 2 +- db/seeds/posts/privacy-policy.html | 2 +- db/seeds/posts/tos.html | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/db/seeds/posts/global_faq.html b/db/seeds/posts/global_faq.html index bfa480047..3830f2a4f 100644 --- a/db/seeds/posts/global_faq.html +++ b/db/seeds/posts/global_faq.html @@ -9,5 +9,5 @@

    What license do my posts fall unde

    What is Codidact?

    -

    This community is built using software provided by The Codidact Foundation. The software is free, open-source, and customizable.

    +

    This community is built using the open-source QPixel software provided by The Codidact Foundation. The software is free, open-source, and customizable.

    diff --git a/db/seeds/posts/privacy-policy.html b/db/seeds/posts/privacy-policy.html index ddd07c6bd..74f007f69 100644 --- a/db/seeds/posts/privacy-policy.html +++ b/db/seeds/posts/privacy-policy.html @@ -27,7 +27,7 @@

    How will we use your data?

  • Manage your account (for instance by sending you emails about the security of your account, or to help you regain access if you lose your password);
  • Keep you updated about our policies (for instance, we might email you if we change our Terms of Service or this Privacy Policy);
  • Respond to requests for support (these are generally handled on our Meta site, but in some cases our staff might email you to help with your request)
  • -
  • If you sign up for our mailing list, so that we can send you updates.
  • +
  • If you sign up for our mailing list, such that we can send you updates.

We do not:

    diff --git a/db/seeds/posts/tos.html b/db/seeds/posts/tos.html index ef9e5d02d..83ca41b0d 100644 --- a/db/seeds/posts/tos.html +++ b/db/seeds/posts/tos.html @@ -1,5 +1,5 @@ -

    These Terms of Service ("Terms") govern your use of any Codidact community hosted at $EDIT-URL or any subdomain thereof (the "Service"). These Terms apply to all uses of the Service, whether you sign up for an account or not. Your use of the Service constitutes your acceptance of these Terms.

    +

    These Terms of Service ("Terms") govern your use of any $EDIT-org-name community hosted at $EDIT-URL or any subdomain thereof (the "Service"). These Terms apply to all uses of the Service, whether you sign up for an account or not. Your use of the Service constitutes your acceptance of these Terms.

    1. Who can use the Service

    The Service is intended to be as open as possible; however, there are a few restrictions on who is eligible to use it.

      @@ -15,7 +15,7 @@

      2. Member Conduct

    • post content which you do not have the right or permission to post, or to infringe any copyright or other proprietary right of any entity or person;
    • post content that is hateful, discriminatory, harmful, illegal, or otherwise objectionable;
    • impersonate any other person, group, or entity;
    • -
    • violate the then-current Code of Conduct of the Service, which is available in our help center.
    • +
    • violate the then-current Code of Conduct of the Service, which is available in our help center.

    3. User-Generated Content

    If you sign up for an account, you will be able to submit questions, answers, comments, and other types of posts, some of which may include images, video, or other media (collectively, "User-Generated Content" or "Content").

    From 3076e87a57f115876464ec4ac2bcde8fcf50d1fb Mon Sep 17 00:00:00 2001 From: Monica Cellio Date: Thu, 25 Aug 2022 18:41:40 -0400 Subject: [PATCH 083/347] Codidact -> -org-name in help template --- db/seeds/posts/privacy-policy.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/seeds/posts/privacy-policy.html b/db/seeds/posts/privacy-policy.html index 74f007f69..1c6e98ed1 100644 --- a/db/seeds/posts/privacy-policy.html +++ b/db/seeds/posts/privacy-policy.html @@ -1,6 +1,6 @@

    How we use and protect your information

    -

    This Privacy Policy applies to all Codidact communities hosted under ​$EDIT-URL. We want you to be able to trust us when we say:

    +

    This Privacy Policy applies to all $EDIT-org-name communities hosted under ​$EDIT-URL. We want you to be able to trust us when we say:

    • that we respect your privacy;
    • that we don't ask for information we don't need;
    • From 1416c00fdfc963988d9948095b03c96f6caec77c Mon Sep 17 00:00:00 2001 From: Monica Cellio Date: Sun, 28 Aug 2022 14:21:47 -0400 Subject: [PATCH 084/347] added seed command for seding help, reworked help section a bit to (I hope) be clearer --- INSTALLATION.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/INSTALLATION.md b/INSTALLATION.md index d05e5961d..9a26dcc0f 100644 --- a/INSTALLATION.md +++ b/INSTALLATION.md @@ -189,8 +189,12 @@ If you are running a development server, you might not care a lot about what's i - Spam policy - Global (network) FAQ -The corresponding posts in db/seeds/posts have some places marked with "$EDIT" where you will probably want to insert URLs, email addresses, and the like. We recommend reviewing all of the content in these topics. There are two ways to edit these topics: +The corresponding posts in db/seeds/posts have some places marked with "$EDIT" where you will probably want to insert URLs, email addresses, and the like. We recommend reviewing all of the content in these topics. There are two ways to edit these topics: in the source files before adding to your database, or through the UI in your running instance. + +If you edit the seed files, use the following command to add them to your database: + +`UPDATE_POSTS=true rails db:seed` + +You can also edit the topics in the UI. As an administrator, you'll see an edit button on help topics when you view them, and the editor provides an option to deploy changes across your network of communities. Administrators can update help topics in this way at any time. -- Edit the seed files before seeding your database. -- Edit the topics in the UI. As an administrator, you'll see an edit button on help topics when you view them, and the editor provides an option to deploy changes across your network of communities. From ad04e05f5f9f13a78cfc262fa0aefc2fa966b803 Mon Sep 17 00:00:00 2001 From: Moshi Date: Wed, 31 Aug 2022 06:18:20 -0700 Subject: [PATCH 085/347] Create markdown-it plugin to escape LaTeX --- app/assets/javascripts/latex_escape.js | 109 +++++++++++++++++++++++++ app/assets/javascripts/posts.js | 1 + 2 files changed, 110 insertions(+) create mode 100644 app/assets/javascripts/latex_escape.js diff --git a/app/assets/javascripts/latex_escape.js b/app/assets/javascripts/latex_escape.js new file mode 100644 index 000000000..e40b6d01a --- /dev/null +++ b/app/assets/javascripts/latex_escape.js @@ -0,0 +1,109 @@ +// markdown-it plugin to escape LaTeX + +function latexEscape(md, options) { + // Load all the rules + for (const [rule, ruleset] of Object.entries(latexEscape.inlineDelimiters)) { + md.inline.ruler.before('escape', rule, latexEscape.inlineRule(ruleset)); + } + + for (const [rule, ruleset] of Object.entries(latexEscape.blockDelimiters)) { + md.block.ruler.before('fence', rule, latexEscape.blockRule(ruleset)); + } + + // We just need to escape it for the MathJax parser, + // so we can just return the contents as-is + md.renderer.rules['inline_math'] = + md.renderer.rules['block_math'] = + md.renderer.rules['math_open'] = + md.renderer.rules['math_close'] = (tokens, idx) => tokens[idx].content; +} + +latexEscape.inlineRule = ruleset => (state, silent) => { + const start = state.pos; + + ruleset.open.lastIndex = start; + const open_match = ruleset.open.exec(state.src); + if (!open_match) { return false; } + + ruleset.close.lastIndex = start + open_match[0].length; + const close_match = ruleset.close.exec(state.src); + if (!close_match) { return false; } + + const end = ruleset.close.lastIndex + close_match[0].length + + if (!silent) { + const token = state.push('inline_math', 'math', 0); + token.content = state.src.substring(start, end); + } + + state.pos = end; + + return true; +} + +latexEscape.blockRule = ruleset => (state, startLine, endLine, silent) => { + const start = state.bMarks[startLine] + state.tShift[startLine] + + if (!state.src.startsWith(ruleset.open, start)) { return false; } + + let nextLine = startLine + 1; + + while (nextLine < endLine && !state.src.endsWith(ruleset.close, state.eMarks[nextLine])) { + ++nextLine; + } + + // no ending found + if (nextLine === endLine) { + return false; + } + const parentType = state.parentType; + + state.push('math_open', 'math', 1); + + state.parentType = 'math'; + + const block_token = state.push('block_math', 'math', 0) + block_token.content = state.src.substring(start, state.eMarks[nextLine]); + + state.push('math_close', 'math', -1); + + state.parentType = parentType; + state.line = nextLine + 1; + + return true; +} + +// open: opening delimiter +// close: closing delimiter +latexEscape.inlineDelimiters = { + '$': { + open: /\$(?!\$)/y, // $ not followed by a $ + close: /(? { linkify: true }); window.converter.use(window.markdownitFootnote); + window.converter.use(window.latexEscape); } window.setTimeout(() => { const converter = window.converter; From e68e56aaa48a42581ee4a82785dd8762a1d502fd Mon Sep 17 00:00:00 2001 From: MoshiKoi <54333972+MoshiKoi@users.noreply.github.com> Date: Fri, 2 Sep 2022 23:21:15 -0700 Subject: [PATCH 086/347] Simplify inline algorithm --- app/assets/javascripts/latex_escape.js | 27 +++++++++----------------- 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/app/assets/javascripts/latex_escape.js b/app/assets/javascripts/latex_escape.js index e40b6d01a..000a8ee08 100644 --- a/app/assets/javascripts/latex_escape.js +++ b/app/assets/javascripts/latex_escape.js @@ -21,15 +21,11 @@ function latexEscape(md, options) { latexEscape.inlineRule = ruleset => (state, silent) => { const start = state.pos; - ruleset.open.lastIndex = start; - const open_match = ruleset.open.exec(state.src); - if (!open_match) { return false; } + ruleset.match.lastIndex = start; + const match = ruleset.match.exec(state.src); + if (!match) { return false; } - ruleset.close.lastIndex = start + open_match[0].length; - const close_match = ruleset.close.exec(state.src); - if (!close_match) { return false; } - - const end = ruleset.close.lastIndex + close_match[0].length + const end = start + match[0].length if (!silent) { const token = state.push('inline_math', 'math', 0); @@ -73,25 +69,20 @@ latexEscape.blockRule = ruleset => (state, startLine, endLine, silent) => { return true; } -// open: opening delimiter -// close: closing delimiter +// match: Sticky regex matching the LaTeX latexEscape.inlineDelimiters = { '$': { - open: /\$(?!\$)/y, // $ not followed by a $ - close: /(? Date: Fri, 2 Sep 2022 23:39:34 -0700 Subject: [PATCH 087/347] Adjust block algorithm --- app/assets/javascripts/latex_escape.js | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/app/assets/javascripts/latex_escape.js b/app/assets/javascripts/latex_escape.js index 000a8ee08..0c0c3609c 100644 --- a/app/assets/javascripts/latex_escape.js +++ b/app/assets/javascripts/latex_escape.js @@ -40,11 +40,15 @@ latexEscape.inlineRule = ruleset => (state, silent) => { latexEscape.blockRule = ruleset => (state, startLine, endLine, silent) => { const start = state.bMarks[startLine] + state.tShift[startLine] - if (!state.src.startsWith(ruleset.open, start)) { return false; } + ruleset.match.lastIndex = start; + const match = ruleset.match.exec(state.src); + if (!match) { return false; } - let nextLine = startLine + 1; + const end = start + match[0].length + + let nextLine = startLine; - while (nextLine < endLine && !state.src.endsWith(ruleset.close, state.eMarks[nextLine])) { + while (nextLine < endLine && state.eMarks[nextLine] != end) { ++nextLine; } @@ -59,7 +63,7 @@ latexEscape.blockRule = ruleset => (state, startLine, endLine, silent) => { state.parentType = 'math'; const block_token = state.push('block_math', 'math', 0) - block_token.content = state.src.substring(start, state.eMarks[nextLine]); + block_token.content = state.src.substring(start, end); state.push('math_close', 'math', -1); @@ -86,15 +90,17 @@ latexEscape.inlineDelimiters = { } }; -// Similar format to the above -// Regexes aren't really necessary, since blocks can only match whole lines anyway +// Same format as above +// Note: all regexs *must* end in an end-of-line assertion $ +// This is because markdown-it needs blocks to contain full lines. latexEscape.blockDelimiters = { '$$': { - open: '$$', - close: '$$', + match: /\$\$[^]+\$\$$/my // $$...$$ }, '\\[': { - open: '\\[', - close: '\\]', + match: /\\\[[^]+\\\]$/my // \[...\] + }, + 'begin-end': { + match: /\\begin\{(.+)\}[^]+\\end\{\1\}$/my // \begin{...}...\end{...} } } \ No newline at end of file From 261dc929e0d70b961f9a2a6891156ffdef82268d Mon Sep 17 00:00:00 2001 From: MoshiKoi <54333972+MoshiKoi@users.noreply.github.com> Date: Sat, 3 Sep 2022 00:31:51 -0700 Subject: [PATCH 088/347] Bug fixes --- app/assets/javascripts/latex_escape.js | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/app/assets/javascripts/latex_escape.js b/app/assets/javascripts/latex_escape.js index 0c0c3609c..3f2a6df65 100644 --- a/app/assets/javascripts/latex_escape.js +++ b/app/assets/javascripts/latex_escape.js @@ -42,7 +42,7 @@ latexEscape.blockRule = ruleset => (state, startLine, endLine, silent) => { ruleset.match.lastIndex = start; const match = ruleset.match.exec(state.src); - if (!match) { return false; } + if (!match || ruleset.validate && !ruleset.validate(match[0])) { return false; } const end = start + match[0].length @@ -76,17 +76,17 @@ latexEscape.blockRule = ruleset => (state, startLine, endLine, silent) => { // match: Sticky regex matching the LaTeX latexEscape.inlineDelimiters = { '$': { - match: /\$.+\$/y // $...$ + match: /\$.+?\$/y // $...$ }, '\\(': { - match: /\\\(.+\\\)/y // \(...\) + match: /\\\(.+?\\\)/y // \(...\) }, // Block-level delimiters work inline too! '$$': { - match: /\$\$.+\$\$/y // $$...$$ + match: /\$\$.+?\$\$/y // $$...$$ }, '\\[': { - match: /\\\[.+\\\]/y // \[...\] + match: /\\\[.+?\\\]/y // \[...\] } }; @@ -95,10 +95,17 @@ latexEscape.inlineDelimiters = { // This is because markdown-it needs blocks to contain full lines. latexEscape.blockDelimiters = { '$$': { - match: /\$\$[^]+\$\$$/my // $$...$$ + // $$...$$ + match: /\$\$[^]+?\$\$$/my, + // Make sure there's no intervening $$ + // Fixes the bug where it would match all of the following 3 lines + // $$123$$ some text + // + // not math $$456$$ + validate: match => match.indexOf('$$', 2) === match.length - 2. }, '\\[': { - match: /\\\[[^]+\\\]$/my // \[...\] + match: /\\\[[^]+?\\\]$/my // \[...\] }, 'begin-end': { match: /\\begin\{(.+)\}[^]+\\end\{\1\}$/my // \begin{...}...\end{...} From 32971a4bd938feedacb6f0e97c0578067149a5c3 Mon Sep 17 00:00:00 2001 From: MoshiKoi <54333972+MoshiKoi@users.noreply.github.com> Date: Sun, 4 Sep 2022 23:21:55 -0700 Subject: [PATCH 089/347] Make begin-end regex non-greedy --- app/assets/javascripts/latex_escape.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/javascripts/latex_escape.js b/app/assets/javascripts/latex_escape.js index 3f2a6df65..51687a12b 100644 --- a/app/assets/javascripts/latex_escape.js +++ b/app/assets/javascripts/latex_escape.js @@ -108,6 +108,6 @@ latexEscape.blockDelimiters = { match: /\\\[[^]+?\\\]$/my // \[...\] }, 'begin-end': { - match: /\\begin\{(.+)\}[^]+\\end\{\1\}$/my // \begin{...}...\end{...} + match: /\\begin\{(.+?)\}[^]+?\\end\{\1\}$/my // \begin{...}...\end{...} } } \ No newline at end of file From 41e14b36c16561c7f05910039fad0953b8df3b72 Mon Sep 17 00:00:00 2001 From: Moshi Date: Thu, 1 Sep 2022 21:02:52 -0700 Subject: [PATCH 090/347] Extract deleted comments skip notice --- app/views/comments/_skip_deleted.erb | 15 +++++++++++++ app/views/comments/thread.html.erb | 32 ++-------------------------- 2 files changed, 17 insertions(+), 30 deletions(-) create mode 100644 app/views/comments/_skip_deleted.erb diff --git a/app/views/comments/_skip_deleted.erb b/app/views/comments/_skip_deleted.erb new file mode 100644 index 000000000..75ffd8474 --- /dev/null +++ b/app/views/comments/_skip_deleted.erb @@ -0,0 +1,15 @@ +
      +

      + <% if skipped_deleted == 1 %> + Skipping <%= skipped_deleted %> deleted comment. + <% if current_user&.is_moderator %> + Show it anyway. + <% end %> + <% else %> + Skipping <%= skipped_deleted %> deleted comments. + <% if current_user&.is_moderator %> + Show them anyway. + <% end %> + <% end %> +

      +
      \ No newline at end of file diff --git a/app/views/comments/thread.html.erb b/app/views/comments/thread.html.erb index 23c0caf65..992dd56a3 100644 --- a/app/views/comments/thread.html.erb +++ b/app/views/comments/thread.html.erb @@ -78,21 +78,7 @@ <% next %> <% elsif skipped_deleted > 0 %>
      -
      -

      - <% if skipped_deleted == 1 %> - Skipping <%= skipped_deleted %> deleted comment. - <% if current_user&.is_moderator %> - Show it anyway. - <% end %> - <% else %> - Skipping <%= skipped_deleted %> deleted comments. - <% if current_user&.is_moderator %> - Show them anyway. - <% end %> - <% end %> -

      -
      + <%= render 'comments/skip_deleted', skipped_deleted: skipped_deleted%>
      <% skipped_deleted = 0 %> <% else %> @@ -104,21 +90,7 @@ <% end %> <% if skipped_deleted > 0 %>
      -
      -

      - <% if skipped_deleted == 1 %> - Skipping <%= skipped_deleted %> deleted comment. - <% if current_user&.is_moderator %> - Show it anyway. - <% end %> - <% else %> - Skipping <%= skipped_deleted %> deleted comments. - <% if current_user&.is_moderator %> - Show them anyway. - <% end %> - <% end %> -

      -
      + <%= render 'comments/skip_deleted', skipped_deleted: skipped_deleted%>
      <% skipped_deleted = 0 %> <% end %> From ae17942dde0983c5f3a5234bf73548bfc28e4f97 Mon Sep 17 00:00:00 2001 From: Moshi Date: Thu, 1 Sep 2022 21:04:11 -0700 Subject: [PATCH 091/347] Remove useless branch skipped_deleted is always non-negative; if it isn't greater than 0, it must already be 0 --- app/views/comments/thread.html.erb | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/views/comments/thread.html.erb b/app/views/comments/thread.html.erb index 992dd56a3..a403f6ff5 100644 --- a/app/views/comments/thread.html.erb +++ b/app/views/comments/thread.html.erb @@ -81,8 +81,6 @@ <%= render 'comments/skip_deleted', skipped_deleted: skipped_deleted%>
<% skipped_deleted = 0 %> - <% else %> - <% skipped_deleted = 0 %> <% end %>
<%= render 'comments/comment', comment: comment, pingable: pingable %> From 032cf4bffc8e20e305aaa4e468c428806adf1b79 Mon Sep 17 00:00:00 2001 From: Moshi Date: Thu, 1 Sep 2022 21:21:52 -0700 Subject: [PATCH 092/347] Pluralize instead branching --- app/views/comments/_skip_deleted.erb | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/app/views/comments/_skip_deleted.erb b/app/views/comments/_skip_deleted.erb index 75ffd8474..2c37b92c4 100644 --- a/app/views/comments/_skip_deleted.erb +++ b/app/views/comments/_skip_deleted.erb @@ -1,15 +1,10 @@

- <% if skipped_deleted == 1 %> - Skipping <%= skipped_deleted %> deleted comment. - <% if current_user&.is_moderator %> - Show it anyway. - <% end %> - <% else %> - Skipping <%= skipped_deleted %> deleted comments. - <% if current_user&.is_moderator %> - Show them anyway. - <% end %> + Skipping <%= pluralize(skipped_deleted, 'deleted comment') %>. + <% if current_user&.is_moderator %> + + Show <%= skipped_deleted > 1 ? 'them' : 'it' %> anyway. + <% end %>

\ No newline at end of file From 2fc053dcd45d3e9c6a7dc9c41a1b24fd7156bc29 Mon Sep 17 00:00:00 2001 From: Moshi Date: Thu, 1 Sep 2022 20:35:08 -0700 Subject: [PATCH 093/347] Raise limit from 5 total to 5 visible comments --- app/views/comments/thread.html.erb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/views/comments/thread.html.erb b/app/views/comments/thread.html.erb index a403f6ff5..f23210485 100644 --- a/app/views/comments/thread.html.erb +++ b/app/views/comments/thread.html.erb @@ -70,7 +70,11 @@ <% skipped_deleted = 0 %> <% comments = @comment_thread.comments %> <% if params[:inline] == 'true' %> - <% comments = comments.where(deleted: false).take 5 %> + <% count = 0 %> + <% comments = comments.take_while do |comment| %> + <% count += 1 if !comment.deleted %> + <% count <= 5 %> + <% end %> <% end %> <% comments.each do |comment| %> <% if comment.deleted && !(current_user&.is_moderator && params[:show_deleted_comments] == "1") %> From 1b283a820a48a91f3bac8656ce1eed7ebf564cde Mon Sep 17 00:00:00 2001 From: Moshi Date: Tue, 30 Aug 2022 21:38:52 -0700 Subject: [PATCH 094/347] Trigger highlightjs on thread expansion --- app/assets/javascripts/comments.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/app/assets/javascripts/comments.js b/app/assets/javascripts/comments.js index a796dc308..c370da7d4 100644 --- a/app/assets/javascripts/comments.js +++ b/app/assets/javascripts/comments.js @@ -29,6 +29,7 @@ $(() => { $tgt.parent()[0].outerHTML = data; window.MathJax && MathJax.typeset(); + window.hljs && hljs.highlightAll(); }); $(document).on('click', '.js-collapse-thread', async ev => { @@ -178,8 +179,8 @@ $(() => { }); $(document).on('click', '.comment-form input[type="submit"]', async evt => { - // Comment posting has been clicked. - $(evt.target).attr('data-disable-with', 'Posting...'); + // Comment posting has been clicked. + $(evt.target).attr('data-disable-with', 'Posting...'); }); const pingable = {}; @@ -223,7 +224,7 @@ $(() => { const username = e[0].replace(//g, '>'); const id = e[1]; return itemTemplate.clone().html(`${username} #${id}`) - .attr('data-user-id', id); + .attr('data-user-id', id); }); QPixel.Popup.getPopup(items, $tgt[0], callback); } @@ -231,7 +232,7 @@ $(() => { QPixel.Popup.destroyAll(); } }); - + $('.js-new-thread-link').on('click', async ev => { ev.preventDefault(); const $tgt = $(ev.target); @@ -240,7 +241,7 @@ $(() => { if ($thread.is(':hidden')) { $thread.show(); - } + } else { $thread.hide(); } From 00aead82b28cf58b2c9f9c2f3b2d5e0f36b6d917 Mon Sep 17 00:00:00 2001 From: MoshiKoi <54333972+MoshiKoi@users.noreply.github.com> Date: Fri, 2 Sep 2022 18:44:14 -0700 Subject: [PATCH 095/347] Update app/views/comments/thread.html.erb Co-authored-by: ArtOfCode --- app/views/comments/thread.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/comments/thread.html.erb b/app/views/comments/thread.html.erb index f23210485..9754e3fdc 100644 --- a/app/views/comments/thread.html.erb +++ b/app/views/comments/thread.html.erb @@ -72,7 +72,7 @@ <% if params[:inline] == 'true' %> <% count = 0 %> <% comments = comments.take_while do |comment| %> - <% count += 1 if !comment.deleted %> + <% count += 1 unless comment.deleted %> <% count <= 5 %> <% end %> <% end %> From 04f5f399bad7cbedefc9c6a6b4bdc15103a02c2f Mon Sep 17 00:00:00 2001 From: MoshiKoi <54333972+MoshiKoi@users.noreply.github.com> Date: Fri, 2 Sep 2022 20:15:48 -0700 Subject: [PATCH 096/347] Allow expanding deleted comments inline --- app/assets/javascripts/comments.js | 19 +++++++++++++++---- app/views/comments/_post.html.erb | 18 ++++++++++-------- app/views/comments/_skip_deleted.erb | 2 +- 3 files changed, 26 insertions(+), 13 deletions(-) diff --git a/app/assets/javascripts/comments.js b/app/assets/javascripts/comments.js index c370da7d4..c157bd706 100644 --- a/app/assets/javascripts/comments.js +++ b/app/assets/javascripts/comments.js @@ -17,9 +17,13 @@ $(() => { if (evt.ctrlKey) { return; } evt.preventDefault(); - const $tgt = $(evt.target); - const resp = await fetch($tgt.attr("href") + '?inline=true', { + $tgt = $(evt.target); + openThread($tgt.closest('.post--comments-thread-wrapper')[0], $tgt.attr("href")); + }); + + async function openThread(wrapper, targetUrl, showDeleted = false) { + const resp = await fetch(`${targetUrl}?inline=true&show_deleted_comments=${showDeleted ? 1 : 0}`, { headers: { 'Accept': 'text/html' } }); let data = await resp.text(); @@ -27,10 +31,17 @@ $(() => { data = data.split("")[1]; data = data.split("")[0]; - $tgt.parent()[0].outerHTML = data; + wrapper.innerHTML = data; + + $('a.show-deleted-comments').click(async evt => { + if (evt.ctrlKey) { return; } + evt.preventDefault(); + openThread(wrapper, targetUrl, true); + }); + window.MathJax && MathJax.typeset(); window.hljs && hljs.highlightAll(); - }); + } $(document).on('click', '.js-collapse-thread', async ev => { const $tgt = $(ev.target); diff --git a/app/views/comments/_post.html.erb b/app/views/comments/_post.html.erb index ce24006fc..4949f5012 100644 --- a/app/views/comments/_post.html.erb +++ b/app/views/comments/_post.html.erb @@ -3,13 +3,15 @@ %> <% comment_threads.each do |thread| %> -
- <% if thread.deleted %> - - <% elsif thread.archived %> - - <% end %> - <%= link_to thread.title, comment_thread_path(thread), class: 'js--comment-link', data: { thread: thread.id } %> - (<%= pluralize(thread.reply_count, 'comment') %>) +
+
+ <% if thread.deleted %> + + <% elsif thread.archived %> + + <% end %> + <%= link_to thread.title, comment_thread_path(thread), class: 'js--comment-link', data: { thread: thread.id } %> + (<%= pluralize(thread.reply_count, 'comment') %>) +
<% end %> \ No newline at end of file diff --git a/app/views/comments/_skip_deleted.erb b/app/views/comments/_skip_deleted.erb index 2c37b92c4..3b940b514 100644 --- a/app/views/comments/_skip_deleted.erb +++ b/app/views/comments/_skip_deleted.erb @@ -2,7 +2,7 @@

Skipping <%= pluralize(skipped_deleted, 'deleted comment') %>. <% if current_user&.is_moderator %> - + Show <%= skipped_deleted > 1 ? 'them' : 'it' %> anyway. <% end %> From 2094879819ec2e1368fe9498ad0391157b4e881c Mon Sep 17 00:00:00 2001 From: MoshiKoi <54333972+MoshiKoi@users.noreply.github.com> Date: Sat, 3 Sep 2022 14:31:54 -0700 Subject: [PATCH 097/347] Update app/assets/javascripts/comments.js Co-authored-by: Taico Aerts --- app/assets/javascripts/comments.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/javascripts/comments.js b/app/assets/javascripts/comments.js index c157bd706..508de72d6 100644 --- a/app/assets/javascripts/comments.js +++ b/app/assets/javascripts/comments.js @@ -18,7 +18,7 @@ $(() => { evt.preventDefault(); - $tgt = $(evt.target); + const $tgt = $(evt.target); openThread($tgt.closest('.post--comments-thread-wrapper')[0], $tgt.attr("href")); }); From a0eafded331b416ed77f94cde51cdd18bb92bb28 Mon Sep 17 00:00:00 2001 From: Taico Aerts Date: Sat, 3 Sep 2022 11:43:19 +0200 Subject: [PATCH 098/347] Add missing almost_years and over_years strings --- config/locales/time.en_abbrev.yml | 2 ++ config/locales/time.es_abbrev.yml | 2 ++ 2 files changed, 4 insertions(+) diff --git a/config/locales/time.en_abbrev.yml b/config/locales/time.en_abbrev.yml index c82669315..f2b31c6e9 100644 --- a/config/locales/time.en_abbrev.yml +++ b/config/locales/time.en_abbrev.yml @@ -11,4 +11,6 @@ en_abbrev: about_x_months: '%{count}mo' x_months: '%{count}mo' about_x_years: '%{count}y' + almost_x_years: '%{count}y' x_years: '%{count}y' + over_x_years: '%{count}y' \ No newline at end of file diff --git a/config/locales/time.es_abbrev.yml b/config/locales/time.es_abbrev.yml index c5ed4160e..f0aea64a7 100644 --- a/config/locales/time.es_abbrev.yml +++ b/config/locales/time.es_abbrev.yml @@ -27,4 +27,6 @@ es_abbrev: one: '1mes' other: '%{count}meses' about_x_years: '~%{count}a' + almost_x_years: '%{count}a' x_years: '%{count}a' + over_x_years: '%{count}a' From 84cdb2676a920f455dbe209b8517c0985649567d Mon Sep 17 00:00:00 2001 From: Taico Aerts Date: Sat, 3 Sep 2022 11:43:40 +0200 Subject: [PATCH 099/347] Unify spanish translation with english one in terms of extra symbols --- config/locales/time.es_abbrev.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/config/locales/time.es_abbrev.yml b/config/locales/time.es_abbrev.yml index f0aea64a7..8b8540883 100644 --- a/config/locales/time.es_abbrev.yml +++ b/config/locales/time.es_abbrev.yml @@ -11,8 +11,8 @@ es_abbrev: one: '1min' other: '%{count}mins' about_x_hours: - one: '~1h' - other: '~%{count}hs' + one: '1h' + other: '%{count}hs' x_hours: one: '1h' other: '%{count}hs' @@ -21,12 +21,12 @@ es_abbrev: one: '1sem' other: '%{count}sems' about_x_months: - one: '~1mes' - other: '~%{count}meses' + one: '1mes' + other: '%{count}meses' x_months: one: '1mes' other: '%{count}meses' - about_x_years: '~%{count}a' + about_x_years: '%{count}a' almost_x_years: '%{count}a' x_years: '%{count}a' over_x_years: '%{count}a' From e5f29e11e615cedae250ef025bc66a962c4c8c51 Mon Sep 17 00:00:00 2001 From: Taico Aerts Date: Sat, 13 Aug 2022 22:30:58 +0200 Subject: [PATCH 100/347] Add search instructions in search slide Closes #830 --- app/views/layouts/_header.html.erb | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/app/views/layouts/_header.html.erb b/app/views/layouts/_header.html.erb index 1b450d75c..2c6bedd6b 100644 --- a/app/views/layouts/_header.html.erb +++ b/app/views/layouts/_header.html.erb @@ -111,6 +111,33 @@

+
+
+ tag:snake search within a tag +
+
+ answers:0 unanswered questions +
+
+ user:xxxx search by author id +
+
+ score:0.5 posts with 0.5+ score +
+
+ "snake oil" exact phrase +
+
+ votes:4 posts with 4+ votes +
+
+ created:<1w created < 1 week ago +
+
+ post_type:xxxx type of post +
+
+ <%= form_tag search_path, method: :get do %>
<%= text_field_tag :search, params[:search], class: 'form-element' %> @@ -121,6 +148,9 @@
<% end %> +
From 9d8d9e5925ee833456f0d66d040f9d8a8a157495 Mon Sep 17 00:00:00 2001 From: MrHug Date: Wed, 31 Aug 2022 17:05:44 +0200 Subject: [PATCH 101/347] Add button to make tag subscription --- app/views/tags/show.html.erb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/views/tags/show.html.erb b/app/views/tags/show.html.erb index e44cfe89d..b2350de22 100644 --- a/app/views/tags/show.html.erb +++ b/app/views/tags/show.html.erb @@ -78,6 +78,9 @@
<%= short_number_to_human post_count, precision: 1, significant: false %> <%= 'post'.pluralize(post_count) %> + <%= link_to 'Subscribe', + new_subscription_path(type: 'tag', qualifier: @tag.name, return_to: request.path), + class: 'button is-outlined' %>
From 4cedb231df39ed4ed6a62044c474c41925aab1f2 Mon Sep 17 00:00:00 2001 From: MrHug Date: Wed, 31 Aug 2022 17:24:20 +0200 Subject: [PATCH 102/347] Add disclaimer when 25 questions are shown --- app/views/subscription_mailer/subscription.html.erb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/views/subscription_mailer/subscription.html.erb b/app/views/subscription_mailer/subscription.html.erb index c3ee467ea..2bc7213fb 100644 --- a/app/views/subscription_mailer/subscription.html.erb +++ b/app/views/subscription_mailer/subscription.html.erb @@ -3,6 +3,10 @@ <% if @subscription.name.present? %> "<%= @subscription.name %>" <% end %> + + <% if @questions.count == 25 %> + This e-mail only shows the 25 most recent items matching your filter. + <% end %> <% @questions.each do |question| %> From 561fa0e056de9cd2107e76a21cdbcf9782eeb12d Mon Sep 17 00:00:00 2001 From: MrHug Date: Wed, 31 Aug 2022 17:36:55 +0200 Subject: [PATCH 103/347] Fix question inclusion Include only questions which were created since our last email or (in case no email was sent yet) since we created the subscription. Uses arel_table to ensure that the created_at field of the correct table is referenced. --- app/models/subscription.rb | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/models/subscription.rb b/app/models/subscription.rb index bb7447f13..149a35ec3 100644 --- a/app/models/subscription.rb +++ b/app/models/subscription.rb @@ -14,12 +14,14 @@ def questions case type when 'all' Question.unscoped.where(community: community, post_type_id: Question.post_type_id) - .where('created_at >= ?', last_sent_at) + .where(Question.arel_table[:created_at].gteq(last_sent_at || created_at)) when 'tag' Question.unscoped.where(community: community, post_type_id: Question.post_type_id) + .where(Question.arel_table[:created_at].gteq(last_sent_at || created_at)) .joins(:tags).where(tags: { name: qualifier }) when 'user' Question.unscoped.where(community: community, post_type_id: Question.post_type_id) + .where(Question.arel_table[:created_at].gteq(last_sent_at || created_at)) .where(user_id: qualifier) when 'interesting' RequestContext.community = community # otherwise SiteSetting#[] doesn't work @@ -28,6 +30,7 @@ def questions .order(Arel.sql('RAND()')) when 'category' Question.unscoped.where(community: community, post_type_id: Question.post_type_id) + .where(Question.arel_table[:created_at].gteq(last_sent_at || created_at)) .where(category_id: qualifier) end&.order(created_at: :desc)&.limit(25) end From a0b69d336ebaafe6a5134005dd9cc762b242abb7 Mon Sep 17 00:00:00 2001 From: Moshi Date: Thu, 1 Sep 2022 00:27:24 -0700 Subject: [PATCH 104/347] Show direct link notice only if more than one answer --- app/views/posts/_expanded.html.erb | 3 ++- app/views/posts/show.html.erb | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/views/posts/_expanded.html.erb b/app/views/posts/_expanded.html.erb index d4f29d623..fa61b5dcd 100644 --- a/app/views/posts/_expanded.html.erb +++ b/app/views/posts/_expanded.html.erb @@ -2,6 +2,7 @@ Full post view, containing all details and interactions. Variables: post : the Post instance to display + float_notice : whether to display the float notice %> <% category ||= defined?(@category) && @category.id == post.category_id ? @category : post.category %> @@ -24,7 +25,7 @@ <% end %> - <% if !is_top_level && !params[:answer].nil? && params[:answer] == post.id.to_s %> + <% if float_notice %> <% sort_type = params[:sort] == 'active' ? 'activity' : 'score' %>

diff --git a/app/views/posts/show.html.erb b/app/views/posts/show.html.erb index e6a72e16f..c25a17c03 100644 --- a/app/views/posts/show.html.erb +++ b/app/views/posts/show.html.erb @@ -17,7 +17,7 @@ " /> <% end %> -<%= render 'posts/expanded', post: @post %> +<%= render 'posts/expanded', post: @post, float_notice: false %> <% if @post.post_type.has_answers %>

<%= pluralize(@post.children.where(deleted: false).count, 'answer') %>

@@ -30,7 +30,7 @@
<% @children.each do |answer| %> - <%= render 'posts/expanded', post: answer %> + <%= render 'posts/expanded', post: answer, float_notice: answer.id == params[:answer]&.to_i && @children.length > 1 %> <% end %>
From 0619bc2babdc646c63ac47f65be04e3dd0bd0694 Mon Sep 17 00:00:00 2001 From: Taico Aerts Date: Thu, 1 Sep 2022 11:36:22 +0200 Subject: [PATCH 105/347] Add instructions for using MariaDB --- INSTALLATION.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/INSTALLATION.md b/INSTALLATION.md index 9a26dcc0f..49d96e560 100644 --- a/INSTALLATION.md +++ b/INSTALLATION.md @@ -99,6 +99,8 @@ You'll also need to fill in details for the Redis connection. If you've followed the sample file should already contain the correct values for you, but if you've customised your setup you'll need to correct them. +If you are using MariaDB instead of MySQL, you will need to replace all occurrences of +`utf8mb4_0900_ai_ci` with `utf8mb4_unicode_ci` in `db/schema.rb`. Set up the database: From 9713034f982c53cc641999681e539ebc31e549e0 Mon Sep 17 00:00:00 2001 From: Taico Aerts Date: Wed, 31 Aug 2022 18:34:28 +0200 Subject: [PATCH 106/347] Only load stripe API if donations are enabled --- app/views/layouts/_head.html.erb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/views/layouts/_head.html.erb b/app/views/layouts/_head.html.erb index aacdfd9e0..8750b60d9 100644 --- a/app/views/layouts/_head.html.erb +++ b/app/views/layouts/_head.html.erb @@ -27,7 +27,9 @@ <%= javascript_include_tag "https://cdn.jsdelivr.net/npm/jquery@2.2.2/dist/jquery.min.js" %> <%= javascript_include_tag "https://cdn.jsdelivr.net/npm/moment@2.13.0/min/moment.min.js" %> <%= javascript_include_tag "https://cdn.jsdelivr.net/npm/select2@4.0.12/dist/js/select2.min.js" %> -<%= javascript_include_tag "https://js.stripe.com/v3/" %> +<% if SiteSetting['DonationsEnabled'] %> + <%= javascript_include_tag "https://js.stripe.com/v3/" %> +<% end %> <%= javascript_include_tag "https://cdn.jsdelivr.net/npm/dompurify@2.2.9/dist/purify.min.js" %> <%= javascript_include_tag "/assets/community/#{@community.host.split('.')[0]}.js" %> <%= javascript_include_tag 'application' %> From b218ad47655a544f30af7be2a6e97e0a456e910a Mon Sep 17 00:00:00 2001 From: Moshi Date: Tue, 30 Aug 2022 20:59:07 -0700 Subject: [PATCH 107/347] Use the deleted_user? util instead of checking for nil. (Soft-deleted users are not nil but are deleted) --- app/views/post_history/post.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/post_history/post.html.erb b/app/views/post_history/post.html.erb index 8ee0da2d1..5e2b284d6 100644 --- a/app/views/post_history/post.html.erb +++ b/app/views/post_history/post.html.erb @@ -11,7 +11,7 @@ by - <% if event.user.nil? %> + <% if deleted_user? event.user %> (deleted user) <% else %> user avatar From cb3bbe3366f753656d957c60a1e7a7b9eef00acc Mon Sep 17 00:00:00 2001 From: Taico Aerts Date: Wed, 31 Aug 2022 11:19:25 +0200 Subject: [PATCH 108/347] Improve the docker-compose setup * Confirm account in creation script to remove the need for a manual step * Fix instruction steps to something that actually works * Add information on how to access a rails console --- docker/README.md | 77 +++++++++++++++------------- docker/create_admin_and_community.rb | 4 +- docker/entrypoint.sh | 2 +- 3 files changed, 44 insertions(+), 39 deletions(-) diff --git a/docker/README.md b/docker/README.md index 225f1f875..e7b926aac 100644 --- a/docker/README.md +++ b/docker/README.md @@ -2,30 +2,13 @@ A [docker-compose.yml](../docker-compose.yml) file is provided for deployment with Docker compose, if you choose. -## 1. Build Containers - -You should first build the images, before making any changes to config files. We do this so the container -is not built with secrets. - -```bash -docker-compose build -``` - -If you need to just rebuild one container, you can do that too. - -```bash -docker-compose build uwsgi -docker-compose build db -docker-compose build redis -``` - -## 2. Setup and Secrets +## 1. Setup and Secrets The `docker-compose.yml` file uses a `.env` file in the same directory to load dynamic values used when the docker containers are initialized. This is useful for setting up custom values locally. Additionally, your secrets (the mysql database credentials and admin user name) are inserted into the running container through the `docker/env` file. -Both the `.env` file and the `docker/env` file are gitignored, so you can change values to suit, these filed need to be copied to the correct locations with some default values. You can do this in one step by executing a bash script. +Both the `.env` file and the `docker/env` file are gitignored, so you can change values to suit. These files need to be copied to the correct locations with some default values. You can do this in one step by executing a bash script. ```bash # ensure script is executable, from the project root: @@ -35,12 +18,28 @@ docker/local-setup.sh Editing the `./.env` file will modify the corresponding variables used in the docker-compose.yml file but **NOT** the environment variables in the container. Editing the `./docker/env` file will change environment variables only in the running container. -## 3. Database File -Ensure `config/database.yml` has the username and password as defined in [docker/env](dummy.env) file. The `config/database.yml` should already be gitignored. +## 2. Database File +Ensure `config/database.yml` has the username and password as defined in [docker/env](docker/env) file. The `config/database.yml` should already be gitignored. The `COMMUNITY_NAME` value defined in the `.env` file defines the initial community name on your local DB. -the `COMMUNITY_ADMIN_USERNAME`, `COMMUNITY_ADMIN_PASSWORD` and `COMMUNITY_ADMIN_EMAIL` values in the `docker/env` file define the first user you can log in as - however you will need to follow the instructions below to ensure you can log in as that user. +the `COMMUNITY_ADMIN_USERNAME`, `COMMUNITY_ADMIN_PASSWORD` and `COMMUNITY_ADMIN_EMAIL` values in the `docker/env` file define the first user you can log in as. Please note that the password should be at least 6 characters long. + +## 3. Build Containers + +Next, you should build the images. + +```bash +docker-compose build +``` + +If you need to just rebuild one container, you can do that too. + +```bash +docker-compose build uwsgi +docker-compose build db +docker-compose build redis +``` ## 4. Start Containers @@ -73,17 +72,7 @@ and see the interface. ![img/interface.png](../img/interface.png) -Before you login, since we don't have email configured, you'll need to set a manual -`confirmed_at` variable for your newly created user. You can do this easily with a single -command to the container: - -```bash -$ docker exec qpixel_uwsgi_1 rails runner "User.second.update(confirmed_at: DateTime.now)" -Running via Spring preloader in process 111 -``` - -The first user is the system user, so the second user is the admin created during the -start of the container. And you can of course do this same command for any future users that you don't want to require email confirmation for. You can then click "Sign in" to login with what you defined for `$COMMUNITY_ADMIN_EMAIL` and `$COMMUNITY_ADMIN_PASSWORD`. Importantly, your password must be 6 characters or greater, otherwise the user won't be created. +You can then click "Sign in" to login with what you defined for `$COMMUNITY_ADMIN_EMAIL` and `$COMMUNITY_ADMIN_PASSWORD`. Importantly, your password must be 6 characters or longer, otherwise the user won't be created. ## 5. Login @@ -123,7 +112,25 @@ And then click to "Save Post in Q&A" That's it! -### 8. Stop Containers +## 8. Accessing emails +Running in this docker-compose setup, the system does not actually send emails. However, you can see the emails that would have been sent by going to [http://localhost:3000/letter_opener](http://localhost:3000/letter_opener). +This is especially useful to confirm other accounts that you make in the container. + +### 9. Running commands in the docker container +Often, it may be useful to run some ruby/rails code directly, e.g. for debugging purposes. YOu can do so with the following command: + +```bash +$ docker exec qpixel_uwsgi_1 rails runner "" +Running via Spring preloader in process 111 +``` + +It is also possible to open up a rails console to do more complicated things: + +```bash +$ docker exec qpixel_uwsgi_1 rails c +``` + +### 10. Stop Containers When you are finished, don't forget to clean up. @@ -132,7 +139,7 @@ docker-compose stop docker-compose rm ``` -### 9. Next steps +### 11. Next steps The current goal of this container is to provide a development environment for working on QPixel. This deployment has not been tested with email notifications diff --git a/docker/create_admin_and_community.rb b/docker/create_admin_and_community.rb index 88c05b1b2..90e785a84 100644 --- a/docker/create_admin_and_community.rb +++ b/docker/create_admin_and_community.rb @@ -9,6 +9,4 @@ email = ENV['COMMUNITY_ADMIN_EMAIL'] || 'codadict@noreply.com' User.create(username: username, password: password, email: email, is_global_admin: true, is_global_moderator: true, - staff: true) -# You'll need to manually set confirmation for this user -# $ docker exec qpixel_uwsgi_1 rails runner "User.second.update(confirmed_at: DateTime.now)" + staff: true, confirmed_at: DateTime.now) diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh index 8ff585266..145b478c6 100644 --- a/docker/entrypoint.sh +++ b/docker/entrypoint.sh @@ -10,8 +10,8 @@ if [ ! -f "/db-created" ]; then rails r db/scripts/create_tags_path_view.rb rails db:migrate rails db:migrate RAILS_ENV=development - rails db:seed rails r docker/create_admin_and_community.rb + UPDATE_POSTS=true rails db:seed touch /db-created fi From 21b7ffea222a1a1d5b30f0cf09703f77b5652ede Mon Sep 17 00:00:00 2001 From: Taico Aerts Date: Wed, 31 Aug 2022 11:33:25 +0200 Subject: [PATCH 109/347] Update to new docker compose spec - Also add brief installation instructions for docker-compose-plugin --- docker/README.md | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/docker/README.md b/docker/README.md index e7b926aac..cef11c263 100644 --- a/docker/README.md +++ b/docker/README.md @@ -2,6 +2,14 @@ A [docker-compose.yml](../docker-compose.yml) file is provided for deployment with Docker compose, if you choose. +To use docker compose, you need to install the docker-compose-plugin. For a system like debian or ubuntu, you can use the following command. + +```bash +sudo apt-get install docker-compose-plugin +``` + +Depending on your setup, you may need to prefix every docker command with sudo. + ## 1. Setup and Secrets The `docker-compose.yml` file uses a `.env` file in the same directory to load dynamic values used when the docker containers are initialized. @@ -30,15 +38,15 @@ the `COMMUNITY_ADMIN_USERNAME`, `COMMUNITY_ADMIN_PASSWORD` and `COMMUNITY_ADMIN_ Next, you should build the images. ```bash -docker-compose build +docker compose build ``` If you need to just rebuild one container, you can do that too. ```bash -docker-compose build uwsgi -docker-compose build db -docker-compose build redis +docker compose build uwsgi +docker compose build db +docker compose build redis ``` ## 4. Start Containers @@ -46,7 +54,7 @@ docker-compose build redis Then start your containers! ```bash -docker-compose up # append -d if you want to detach the processes, although it can be useful to see output into the terminal +docker compose up # append -d if you want to detach the processes, although it can be useful to see output into the terminal Creating qpixel_redis_1 ... done Creating qpixel_db_1 ... done Creating qpixel_uwsgi_1 ... done @@ -120,14 +128,14 @@ This is especially useful to confirm other accounts that you make in the contain Often, it may be useful to run some ruby/rails code directly, e.g. for debugging purposes. YOu can do so with the following command: ```bash -$ docker exec qpixel_uwsgi_1 rails runner "" +$ docker compose exec uwsgi rails runner "" Running via Spring preloader in process 111 ``` It is also possible to open up a rails console to do more complicated things: ```bash -$ docker exec qpixel_uwsgi_1 rails c +$ docker compose exec uwsgi rails c ``` ### 10. Stop Containers @@ -135,8 +143,8 @@ $ docker exec qpixel_uwsgi_1 rails c When you are finished, don't forget to clean up. ```bash -docker-compose stop -docker-compose rm +docker compose stop +docker compose rm ``` ### 11. Next steps From ea7563509b1986da0094bebbe39d22789c6105a6 Mon Sep 17 00:00:00 2001 From: Taico Aerts Date: Wed, 31 Aug 2022 11:39:52 +0200 Subject: [PATCH 110/347] Add information about request context for rails console --- docker/README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docker/README.md b/docker/README.md index cef11c263..7622bc148 100644 --- a/docker/README.md +++ b/docker/README.md @@ -138,6 +138,14 @@ It is also possible to open up a rails console to do more complicated things: $ docker compose exec uwsgi rails c ``` +Please keep in mind that for database related actions to work as expected, you first need to run the following in the rails console. + +```ruby +RequestContext.community = Community.first +``` + +This correctly scopes all database actions to the first (and probably only) community in your system. + ### 10. Stop Containers When you are finished, don't forget to clean up. From 367c1dad9783dbafeea1ea95cbacdeca02195781 Mon Sep 17 00:00:00 2001 From: Taico Aerts Date: Wed, 31 Aug 2022 14:08:27 +0200 Subject: [PATCH 111/347] Fix typo --- docker/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/README.md b/docker/README.md index 7622bc148..f7e1a33ba 100644 --- a/docker/README.md +++ b/docker/README.md @@ -125,7 +125,7 @@ Running in this docker-compose setup, the system does not actually send emails. This is especially useful to confirm other accounts that you make in the container. ### 9. Running commands in the docker container -Often, it may be useful to run some ruby/rails code directly, e.g. for debugging purposes. YOu can do so with the following command: +Often, it may be useful to run some ruby/rails code directly, e.g. for debugging purposes. You can do so with the following command: ```bash $ docker compose exec uwsgi rails runner "" From cc6652b9a0c317c2c722ffaa14f0b39e58b43bad Mon Sep 17 00:00:00 2001 From: Moshi Date: Mon, 29 Aug 2022 17:26:16 -0700 Subject: [PATCH 112/347] restricts answers:n to posts that have answers --- app/helpers/search_helper.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/helpers/search_helper.rb b/app/helpers/search_helper.rb index 4c2956407..f5786839a 100644 --- a/app/helpers/search_helper.rb +++ b/app/helpers/search_helper.rb @@ -77,7 +77,9 @@ def qualifiers_to_sql(qualifiers, query) next unless value.match?(valid_value[:numeric]) operator, val = numeric_value_sql value + post_types_with_answers = PostType.where(has_answers: true) query = query.where("answer_count #{operator.presence || '='} ?", val.to_i) + .where(post_type_id: post_types_with_answers) end end From de1310d62f83ed354ec1a307608d538a964ba8fa Mon Sep 17 00:00:00 2001 From: Moshi Date: Tue, 30 Aug 2022 01:23:44 -0700 Subject: [PATCH 113/347] Remove excess whitespace around post titles --- app/views/posts/_expanded.html.erb | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/app/views/posts/_expanded.html.erb b/app/views/posts/_expanded.html.erb index fa61b5dcd..7ee658780 100644 --- a/app/views/posts/_expanded.html.erb +++ b/app/views/posts/_expanded.html.erb @@ -14,11 +14,10 @@
<% if is_top_level %>

- - <%= post.title %> - <%= post_type.is_closeable && post.closed && !post.duplicate_post ? "[closed]" : "" %> - <%= post.duplicate_post && post_type.is_closeable && post.closed ? "[duplicate]" : "" %> - + <% title = post.title + + (post.closed && !post.duplicate_post ? " [closed]" : "") + + (post.duplicate_post ? " [duplicate]" : "") %> + <%= title %> <% if category.display_post_types.reject { |e| e.to_s.empty? }.size > 1 %> <%= post_type_badge(post_type) %> <% end %> From a5a88104a877919859088d98ee006922576463fa Mon Sep 17 00:00:00 2001 From: Taico Aerts Date: Mon, 29 Aug 2022 10:12:09 +0200 Subject: [PATCH 114/347] Only create the tour tagset for the first community --- db/seeds/tag_sets.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/db/seeds/tag_sets.yml b/db/seeds/tag_sets.yml index fb6f88357..d675cb51a 100644 --- a/db/seeds/tag_sets.yml +++ b/db/seeds/tag_sets.yml @@ -1,4 +1,5 @@ - name: Main - name: Meta - name: Tour - id: -1 \ No newline at end of file + id: -1 + community_id: 1 \ No newline at end of file From d1839055d75f354c7ce6a4ae09f4f7b7f834fa63 Mon Sep 17 00:00:00 2001 From: Taico Aerts Date: Sat, 13 Aug 2022 14:57:46 +0200 Subject: [PATCH 115/347] Allow @post, @question and @article to be nil Fixes #823 --- app/helpers/categories_helper.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/helpers/categories_helper.rb b/app/helpers/categories_helper.rb index 53eda23be..68c77d120 100644 --- a/app/helpers/categories_helper.rb +++ b/app/helpers/categories_helper.rb @@ -6,14 +6,14 @@ def active?(category) end def expandable? - (defined?(@category) && !@category.nil? && !@category.id.nil? && !current_page?(new_category_url)) || + (defined?(@category) && !@category&.id.nil? && !current_page?(new_category_url)) || (defined?(@post) && !@post&.category.nil?) || (defined?(@question) && !@question&.category.nil?) || (defined?(@article) && !@article&.category.nil?) end def current_category - @current_category ||= if defined?(@category) && !@category.nil? && !@category.id.nil? + @current_category ||= if defined?(@category) && !@category&.id.nil? @category elsif defined?(@post) && !@post&.category.nil? @post.category From 9e8f764efd243d7ff9ca0d96364e8060e59fc520 Mon Sep 17 00:00:00 2001 From: Sujal Singh Date: Thu, 8 Sep 2022 21:50:24 +0530 Subject: [PATCH 116/347] Fixed storage.sample.yml giving Key Error --- config/storage.sample.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/storage.sample.yml b/config/storage.sample.yml index e3dd0b723..88649a3fb 100644 --- a/config/storage.sample.yml +++ b/config/storage.sample.yml @@ -3,7 +3,7 @@ test: root: <%= Rails.root.join('tmp/storage') %> local: - storage: Disk + service: Disk root: <%= Rails.root.join('storage') %> s3: @@ -11,4 +11,4 @@ s3: access_key_id: "" secret_access_key: "" region: us-east-1 - bucket: "" \ No newline at end of file + bucket: "" From 44b09f7f589b5f4144e04b8e7291d257b7479ea7 Mon Sep 17 00:00:00 2001 From: Moshi Date: Mon, 29 Aug 2022 22:05:16 -0700 Subject: [PATCH 117/347] filters out pinned posts from hot posts --- app/controllers/application_controller.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index f419e3c6f..f1caf813d 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -254,12 +254,18 @@ def pull_pinned_links_and_hot_questions PinnedLink.where(active: true).where('shown_before IS NULL OR shown_before > NOW()').all end end + + # We need to filter out pinned links that aren't posts + # because for whatever reason, where.not(id: nil) will return an empty query + pinned_post_ids = @pinned_links.pluck(:post_id).select(&:present?) + @hot_questions = Rails.cache.fetch('hot_questions', expires_in: 4.hours) do Rack::MiniProfiler.step 'hot_questions: cache miss' do Post.undeleted.where(last_activity: (Rails.env.development? ? 365 : 7).days.ago..DateTime.now) .where(post_type_id: [Question.post_type_id, Article.post_type_id]) .joins(:category).where(categories: { use_for_hot_posts: true }) .where('score >= ?', SiteSetting['HotPostsScoreThreshold']) + .where.not(id: pinned_post_ids) .order('score DESC').limit(SiteSetting['HotQuestionsCount']).all end end From 91eaf9675f60a57649fcc15c1f9132811118bb21 Mon Sep 17 00:00:00 2001 From: Moshi Date: Wed, 31 Aug 2022 16:35:25 -0700 Subject: [PATCH 118/347] Explain the counterintuitive behavior of the query --- app/controllers/application_controller.rb | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index f1caf813d..a8029e19c 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -256,7 +256,14 @@ def pull_pinned_links_and_hot_questions end # We need to filter out pinned links that aren't posts - # because for whatever reason, where.not(id: nil) will return an empty query + # If pinned_post_ids contains nil, then the query formed is + # SELECT WHERE NOT IN (... NULL) + # In SQL, when the rhs of IN contains NULL, it returns NULL if not present, rather than false + # Secondly, NOT NULL evaluates to NULL + # These two counterintuitive behaviors mean that if NULL is in pinned_post_ids, + # Post not pinned => NOT IN pinned_post_ids = NOT NULL = NULL => Not Selected + # Post pinned => NOT IN pinned_post_ids = NOT TRUE = FALSE => Not Selected + # I.e., if pinned_post_ids contains null, the selection will never return records pinned_post_ids = @pinned_links.pluck(:post_id).select(&:present?) @hot_questions = Rails.cache.fetch('hot_questions', expires_in: 4.hours) do From db197efe14812dc34f2644f2d25d6bcd7cee8358 Mon Sep 17 00:00:00 2001 From: MoshiKoi <54333972+MoshiKoi@users.noreply.github.com> Date: Wed, 7 Sep 2022 19:47:40 -0700 Subject: [PATCH 119/347] Update app/controllers/application_controller.rb Co-authored-by: ArtOfCode --- app/controllers/application_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index a8029e19c..d6275bb9f 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -264,7 +264,7 @@ def pull_pinned_links_and_hot_questions # Post not pinned => NOT IN pinned_post_ids = NOT NULL = NULL => Not Selected # Post pinned => NOT IN pinned_post_ids = NOT TRUE = FALSE => Not Selected # I.e., if pinned_post_ids contains null, the selection will never return records - pinned_post_ids = @pinned_links.pluck(:post_id).select(&:present?) + pinned_post_ids = @pinned_links.map(&:post_id).reject(&:nil?) @hot_questions = Rails.cache.fetch('hot_questions', expires_in: 4.hours) do Rack::MiniProfiler.step 'hot_questions: cache miss' do From 80cf02d0ed17858583cc7c44fd48723edc82b486 Mon Sep 17 00:00:00 2001 From: Moshi Date: Mon, 29 Aug 2022 23:11:52 -0700 Subject: [PATCH 120/347] Add preference for having a sticky navbar --- config/config/preferences.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/config/config/preferences.yml b/config/config/preferences.yml index 3f808e72e..151ed0d38 100644 --- a/config/config/preferences.yml +++ b/config/config/preferences.yml @@ -67,3 +67,9 @@ auto_follow_comment_threads: description: > Automatically follow any comment thread you participate in. default: 'true' + +sticky_header: + type: boolean + description: > + Make the Codidact navigation bar sticky + default: false \ No newline at end of file From 419bbdf8c1c1a24e45937dd4602825d7ffe58236 Mon Sep 17 00:00:00 2001 From: Moshi Date: Mon, 29 Aug 2022 23:12:13 -0700 Subject: [PATCH 121/347] Make navbar sticky when preference is set --- app/views/layouts/_header.html.erb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/views/layouts/_header.html.erb b/app/views/layouts/_header.html.erb index 2c6bedd6b..50ddad377 100644 --- a/app/views/layouts/_header.html.erb +++ b/app/views/layouts/_header.html.erb @@ -1,7 +1,11 @@ <% logo_path = SiteSetting['SiteLogoPath'] %> <% mobile_logo_path = SiteSetting['MobileLogoPath'] %> +<% sticky_header = user_preference('sticky_header', community: false) == 'true' %> -
+
+ style="position:sticky;top:0;" + <% end %>>
<% if mobile_logo_path.present? %> From c394fc7fcdb0ad8e8251812550fafbf006a17d46 Mon Sep 17 00:00:00 2001 From: MoshiKoi <54333972+MoshiKoi@users.noreply.github.com> Date: Sat, 3 Sep 2022 15:05:09 -0700 Subject: [PATCH 122/347] Add a helper class --- app/assets/stylesheets/application.scss | 4 ++++ app/views/layouts/_header.html.erb | 5 +---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 28db6063f..549ae5838 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -112,6 +112,10 @@ header { position: relative; box-shadow: 0 3px 3px 0 rgba(0, 0, 0, 0.2); } + &.header.sticky { + position: sticky; + top: 0; + } } .notice a.has-font-size-larger { diff --git a/app/views/layouts/_header.html.erb b/app/views/layouts/_header.html.erb index 50ddad377..0de78a20d 100644 --- a/app/views/layouts/_header.html.erb +++ b/app/views/layouts/_header.html.erb @@ -2,10 +2,7 @@ <% mobile_logo_path = SiteSetting['MobileLogoPath'] %> <% sticky_header = user_preference('sticky_header', community: false) == 'true' %> -
- style="position:sticky;top:0;" - <% end %>> +