Skip to content

Commit 9a1aa52

Browse files
committed
added a proper qualifier partial & handling (labels are still WIP)
1 parent 0a96cc5 commit 9a1aa52

File tree

3 files changed

+61
-32
lines changed

3 files changed

+61
-32
lines changed

app/assets/javascripts/subscriptions.js

Lines changed: 35 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,11 @@
11
document.addEventListener('DOMContentLoaded', () => {
22
/**
3-
* Clears subscription qualifier field value
4-
* @returns {void}
3+
* Extracts qualifier type from the field's dataset
4+
* @returns {string | null}
55
*/
6-
const clearQualifier = () => {
7-
const qualifierField = document.querySelector('.js-subscription-qualifier-field');
8-
9-
if (qualifierField instanceof HTMLInputElement) {
10-
qualifierField.value = '';
11-
}
12-
};
13-
14-
/**
15-
* Sets subscription qualifier section visibility
16-
* @param {boolean} visible visibility state
17-
* @returns {void}
18-
*/
19-
const setQualifierVisibility = (visible) => {
20-
document.querySelector('.js-subscription-qualifier-field')
21-
?.closest('.form-group')
22-
?.classList.toggle('hide', visible);
6+
const getQualifierType = () => {
7+
const field = document.querySelector('.js-sub-type-select');
8+
return field instanceof HTMLSelectElement ? field.value : null;
239
};
2410

2511
/**
@@ -31,24 +17,50 @@ document.addEventListener('DOMContentLoaded', () => {
3117
return ['category', 'tag', 'user'].includes(type);
3218
};
3319

20+
/**
21+
* Synchronizes qualifier field with the given type
22+
* @param {string} type subscription type
23+
*/
24+
const syncQualifier = (type) => {
25+
const field = document.querySelector('.js-sub-qualifier-select');
26+
27+
if (field instanceof HTMLElement) {
28+
$(field).val(null).trigger('change');
29+
field.closest('.form-group')?.classList.toggle('hide', !isQualifiable(type));
30+
}
31+
};
32+
3433
/**
3534
* Is a given element a subscription type select?
3635
* @param {Element} element
3736
* @returns {element is HTMLSelectElement}
3837
*/
3938
const isTypeSelect = (element) => {
40-
return element.matches('.js-subscription-type-select');
39+
return element.matches('.js-sub-type-select');
4140
};
4241

43-
document.querySelectorAll('.js-subscription-type-select, .js-subscription-frequency-select').forEach((el) => {
42+
document.querySelectorAll('.js-sub-type-select, .js-sub-frequency-select').forEach((el) => {
4443
$(el).select2().on('change', ($event) => {
4544
if (isTypeSelect($event.target)) {
46-
clearQualifier();
47-
setQualifierVisibility(!isQualifiable($event.target.value));
45+
syncQualifier($event.target.value);
4846
}
4947
});
5048
});
5149

50+
$('.js-sub-qualifier-select').select2({
51+
ajax: {
52+
url: () => {
53+
const type = getQualifierType();
54+
return `/subscriptions/qualifiers?type=${type}`
55+
},
56+
headers: { 'Accept': 'application/json' },
57+
delay: 100,
58+
processResults: (results) => {
59+
return { results }
60+
},
61+
}
62+
});
63+
5264
$('.js-enable-subscription').on('change', async (evt) => {
5365
const $tgt = $(evt.target);
5466
const $sub = $tgt.parents('details');
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<%#
2+
"Subscription qualifier field partial
3+
4+
Variables:
5+
form : form to render the field for
6+
subscription : Subscription to render qualifier field for
7+
"%>
8+
9+
<div class="form-group<%= ' hide' unless subscription.qualified? %>">
10+
<%= form.label :qualifier,
11+
subscription.type&.capitalize || 'Qualifier',
12+
class: "form-element js-sub-qualifier-label" %>
13+
<div class="form-caption">
14+
Which <%= subscription.type || 'entity' %> to subscribe to?
15+
Required for <%= subscription.type || 'qualified' %> subscriptions.
16+
</div>
17+
<%= form.select :qualifier,
18+
options_for_select([[subscription.qualifier_name, subscription.qualifier]],
19+
selected: subscription.qualifier),
20+
{},
21+
class: "form-element js-sub-qualifier-select",
22+
data: { create: 'false', placeholder: '', use_ids: subscription.user? },
23+
multiple: false %>
24+
</div>

app/views/subscriptions/new.html.erb

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,10 @@
1414
<%= f.select :type,
1515
options_for_select(type_choice_for(current_user), selected: @subscription.type),
1616
{ include_blank: true },
17-
class: 'form-element js-subscription-type-select' %>
17+
class: 'form-element js-sub-type-select' %>
1818
</div>
1919

20-
<div class="form-group<%= ' hide' unless @subscription.qualified? %>">
21-
<%= f.label :qualifier, class: "form-element" %>
22-
<div class="form-caption">Should be an id for user subscriptions or name for tag & category subscriptions.
23-
Leave the field blank otherwise.</div>
24-
<%= f.text_field :qualifier,
25-
class: 'form-element js-subscription-qualifier-field',
26-
value: @subscription.qualifier %>
27-
</div>
20+
<%= render 'subscriptions/qualifier', form: f, subscription: @subscription %>
2821

2922
<div class="form-group">
3023
<%= f.label :name, class: "form-element" %>

0 commit comments

Comments
 (0)