Skip to content

Commit 4c46487

Browse files
authored
Merge branch 'develop' into taeir/fix-validations-apply-to-help-policy
2 parents 5d7b005 + 8df636c commit 4c46487

23 files changed

Lines changed: 254 additions & 52 deletions

Gemfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ gem 'net-smtp', '~> 0.3'
7070
gem 'ruby-progressbar', '~> 1.11'
7171

7272
# Image generation
73-
gem 'rmagick', '~> 5.0'
73+
gem 'rmagick', '~> 5.3'
7474

7575
# Payments. Kinda important, y'know.
7676
gem 'stripe', '~> 5.55'

Gemfile.lock

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ GEM
221221
parallel (1.22.1)
222222
parser (3.1.2.1)
223223
ast (~> 2.4.1)
224-
pkg-config (1.5.1)
224+
pkg-config (1.5.5)
225225
premailer (1.16.0)
226226
addressable
227227
css_parser (>= 1.6.0)
@@ -285,7 +285,7 @@ GEM
285285
reverse_markdown (2.1.1)
286286
nokogiri
287287
rexml (3.2.5)
288-
rmagick (5.2.0)
288+
rmagick (5.3.0)
289289
pkg-config (~> 1.4)
290290
rotp (6.2.0)
291291
rqrcode (2.1.2)
@@ -428,7 +428,7 @@ DEPENDENCIES
428428
rails-html-sanitizer (~> 1.4)
429429
redis (~> 4.8)
430430
reverse_markdown (~> 2.1)
431-
rmagick (~> 5.0)
431+
rmagick (~> 5.3)
432432
rotp (~> 6.2)
433433
rqrcode (~> 2.1)
434434
rubocop (~> 1)

app/assets/javascripts/filters.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ $(() => {
5454
const filters = await QPixel.filters();
5555

5656
function template(option) {
57-
if (option.id == '') { return 'None'; }
57+
if (option.id == '') { return 'Default'; }
5858

5959
const filter = filters[option.id];
6060
const name = `<span>${option.text}</span>`;

app/assets/javascripts/posts.js

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,19 @@ const ALLOWED_ATTR = ['id', 'class', 'href', 'title', 'src', 'height', 'width',
66
'start', 'dir'];
77

88
$(() => {
9+
DOMPurify.addHook("uponSanitizeAttribute", (node, event) => {
10+
const rowspan = node.getAttribute("rowspan");
11+
const colspan = node.getAttribute("colspan");
12+
13+
if (rowspan && Number.isNaN(+rowspan)) {
14+
event.keepAttr = false;
15+
}
16+
17+
if (colspan && Number.isNaN(+colspan)) {
18+
event.keepAttr = false;
19+
}
20+
});
21+
922
const $uploadForm = $('.js-upload-form');
1023

1124
const stringInsert = (str, idx, insert) => str.slice(0, idx) + insert + str.slice(idx);
@@ -149,6 +162,27 @@ $(() => {
149162
ALLOWED_TAGS,
150163
ALLOWED_ATTR
151164
});
165+
166+
const removedElements = [...new Set(DOMPurify.removed
167+
.filter(entry => entry.element && !(entry.element instanceof HTMLBodyElement))
168+
.map(entry => entry.element.localName))];
169+
170+
const removedAttributes = [...new Set(DOMPurify.removed
171+
.filter(entry => entry.attribute)
172+
.map(entry => [
173+
entry.attribute.name + (entry.attribute.value ? `='${entry.attribute.value}'` : ''),
174+
entry.from.localName
175+
]))]
176+
177+
$tgt.parents('form')
178+
.find('.rejected-elements')
179+
.toggleClass('hide', removedElements.length === 0 && removedAttributes.length === 0)
180+
.find('ul')
181+
.empty()
182+
.append(
183+
removedElements.map(name => $(`<li><code>&lt;${name}&gt;</code></li>`)),
184+
removedAttributes.map(([attr, elName]) => $(`<li><code>${attr}</code> (in <code>&lt;${elName}&gt;</code>)</li>`)));
185+
152186
$tgt.parents('.form-group').siblings('.post-preview').html(html);
153187
$tgt.parents('form').find('.js-post-html[name="__html"]').val(html + '<!-- g: js, mdit -->');
154188
}, 0);

app/assets/stylesheets/comments.scss

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,17 @@
6565
font-style: italic;
6666
}
6767

68+
.post--comments-header {
69+
align-items: center;
70+
display: flex;
71+
justify-content: space-between;
72+
margin-bottom: 0.75rem;
73+
}
74+
75+
.post--comments-container {
76+
margin-bottom: 1rem;
77+
}
78+
6879
.post--comments-thread.is-inline {
6980
padding: 0.5rem 0.25rem;
7081
display: flex;
@@ -139,7 +150,7 @@
139150
.new-thread-modal {
140151
box-shadow: 0 3px 5px -2px #eee;
141152
border: 1px solid #d0d9dd;
142-
margin-top: 10px;
153+
margin-top: 1rem;
143154
padding: 0.7em;
144155
display: none;
145156
}

app/controllers/categories_controller.rb

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,8 @@ def category_params
143143
params.require(:category).permit(:name, :short_wiki, :tag_set_id, :is_homepage, :min_trust_level, :button_text,
144144
:color_code, :min_view_trust_level, :license_id, :sequence,
145145
:asking_guidance_override, :answering_guidance_override,
146-
:use_for_hot_posts, :use_for_advertisement, :min_title_length, :min_body_length,
146+
:use_for_hot_posts, :use_for_advertisement,
147+
:min_title_length, :min_body_length, :default_filter_id,
147148
display_post_types: [], post_type_ids: [], required_tag_ids: [],
148149
topic_tag_ids: [], moderator_tag_ids: [])
149150
end
@@ -165,13 +166,22 @@ def set_list_posts
165166
filter_qualifiers = helpers.params_to_qualifiers
166167
@active_filter = helpers.active_filter
167168

168-
if filter_qualifiers.blank? && user_signed_in?
169-
default_filter_id = helpers.default_filter(current_user.id, @category.id)
170-
default_filter = Filter.find_by(id: default_filter_id)
169+
if filter_qualifiers.blank? && @active_filter[:name].blank?
170+
if user_signed_in?
171+
default_filter_id = helpers.default_filter(current_user.id, @category.id)
172+
default_filter = Filter.find_by(id: default_filter_id)
173+
default = :user if default_filter.present?
174+
end
175+
176+
if default_filter.nil?
177+
default_filter = @category.default_filter
178+
default = :category if default_filter.present?
179+
end
180+
171181
unless default_filter.nil?
172182
filter_qualifiers = helpers.filter_to_qualifiers default_filter
173183
@active_filter = {
174-
default: true,
184+
default: default,
175185
name: default_filter.name,
176186
min_score: default_filter.min_score,
177187
max_score: default_filter.max_score,

app/controllers/users_controller.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ def filter_json(filter)
8080
end
8181

8282
def filters_json
83-
system_filters = Rails.cache.fetch 'system_filters' do
83+
system_filters = Rails.cache.fetch 'default_system_filters', expires_in: 1.day do
8484
User.find(-1).filters.to_h { |filter| [filter.name, filter_json(filter)] }
8585
end
8686

app/helpers/search_helper.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ def filter_to_qualifiers(filter)
4141

4242
def active_filter
4343
{
44-
default: false,
44+
default: nil,
4545
name: params[:predefined_filter],
4646
min_score: params[:min_score],
4747
max_score: params[:max_score],

app/models/category.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ class Category < ApplicationRecord
99
has_many :posts
1010
belongs_to :tag_set
1111
belongs_to :license
12+
belongs_to :default_filter, class_name: 'Filter', optional: true
1213

1314
serialize :display_post_types, Array
1415

app/views/categories/_form.html.erb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,13 @@
145145
</span>
146146
<%= f.number_field :sequence, class: 'form-element' %>
147147
</div>
148+
149+
<div class="form-group">
150+
<%= f.label :default_filter_id, class: 'form-element' %>
151+
<span class="form-caption">The default filter for this category, used for anonymous users.</span>
152+
<% system_filters = User.find(-1).filters.to_h { |filter| [filter.name, filter.id] } %>
153+
<%= f.select :default_filter_id, options_for_select(system_filters, selected: @category.default_filter_id), { include_blank: "No default" } %>
154+
</div>
148155
</details>
149156

150157
<details>

0 commit comments

Comments
 (0)