Skip to content

Commit 5289148

Browse files
authored
Merge pull request #854 from amatsuda/integrate_stimulus_controllers
Consolidate three multiselect-related Stimulus controllers into one
2 parents 3da3099 + cdec8a3 commit 5289148

File tree

9 files changed

+40
-67
lines changed

9 files changed

+40
-67
lines changed

app/assets/stylesheets/modules/proposal.css

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,6 @@ div.col-md-4 {
171171
}
172172

173173
#review-tags-form-wrapper {
174-
display: none;
175174
padding: 0;
176175
text-align: left;
177176
#autocomplete-options {

app/javascript/controllers/index.js

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ import MaxlengthAlertController from "./maxlength_alert_controller"
3232
import MentionController from "./mention_controller"
3333
import ModalAutofocusController from "./modal_autofocus_controller"
3434
import ModalFormController from "./modal_form_controller"
35-
import MultiselectController from "./multiselect_controller"
3635
import NestedFormController from "./nested_form_controller"
3736
import NextProposalController from "./next_proposal_controller"
3837
import NotificationsChannelController from "./notifications_channel_controller"
@@ -42,7 +41,6 @@ import ProposalSelectController from "./proposal_select_controller"
4241
import ProposalsTableController from "./proposals_table_controller"
4342
import RatingController from "./rating_controller"
4443
import RemoteModalController from "./remote_modal_controller"
45-
import ReviewTagsController from "./review_tags_controller"
4644
import ReviewerTagsController from "./reviewer_tags_controller"
4745
import ScheduleGridController from "./schedule_grid_controller"
4846
import ScheduleTabsController from "./schedule_tabs_controller"
@@ -81,7 +79,6 @@ application.register("maxlength-alert", MaxlengthAlertController)
8179
application.register("mention", MentionController)
8280
application.register("modal-autofocus", ModalAutofocusController)
8381
application.register("modal-form", ModalFormController)
84-
application.register("multiselect", MultiselectController)
8582
application.register("nested-form", NestedFormController)
8683
application.register("next-proposal", NextProposalController)
8784
application.register("notifications-channel", NotificationsChannelController)
@@ -91,7 +88,6 @@ application.register("proposal-select", ProposalSelectController)
9188
application.register("proposals-table", ProposalsTableController)
9289
application.register("rating", RatingController)
9390
application.register("remote-modal", RemoteModalController)
94-
application.register("review-tags", ReviewTagsController)
9591
application.register("reviewer-tags", ReviewerTagsController)
9692
application.register("schedule-grid", ScheduleGridController)
9793
application.register("schedule-tabs", ScheduleTabsController)

app/javascript/controllers/multiselect_controller.js

Lines changed: 0 additions & 16 deletions
This file was deleted.

app/javascript/controllers/review_tags_controller.js

Lines changed: 0 additions & 22 deletions
This file was deleted.

app/javascript/controllers/reviewer_tags_controller.js

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,6 @@ export default class extends Controller {
66
toggle() {
77
this.displayTarget.classList.toggle('hidden')
88
this.iconTarget.classList.toggle('hidden')
9-
10-
// Slide toggle with CSS transition
11-
const form = this.formTarget
12-
if (form.classList.contains('hidden')) {
13-
form.classList.remove('hidden')
14-
form.style.maxHeight = form.scrollHeight + 'px'
15-
} else {
16-
form.style.maxHeight = '0'
17-
form.addEventListener('transitionend', () => {
18-
if (form.style.maxHeight === '0px') {
19-
form.classList.add('hidden')
20-
}
21-
}, { once: true })
22-
}
9+
this.formTarget.classList.toggle('hidden')
2310
}
2411
}

app/javascript/controllers/tom_select_controller.js

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,53 @@ import { Controller } from '@hotwired/stimulus'
22
import TomSelect from 'tom-select'
33

44
export default class extends Controller {
5+
static targets = ['input']
56
static values = {
67
sortable: { type: Boolean, default: false },
7-
create: { type: Boolean, default: false }
8+
create: { type: Boolean, default: false },
9+
options: { type: Array, default: [] },
10+
delimiter: { type: String, default: '' },
11+
labelClass: { type: String, default: '' }
812
}
913

10-
connect() {
11-
const options = {}
14+
get inputElement() {
15+
return this.hasInputTarget ? this.inputTarget : this.element
16+
}
1217

13-
if (this.sortableValue || this.createValue) {
14-
options.plugins = ['drag_drop']
18+
connect() {
19+
const plugins = ['remove_button']
20+
if (this.sortableValue) {
21+
plugins.push('drag_drop')
1522
}
1623

24+
const options = { plugins }
25+
1726
if (this.createValue) {
1827
options.persist = false
1928
options.create = (input) => ({ value: input, text: input })
2029
}
2130

22-
this.tomSelect = new TomSelect(this.element, options)
31+
if (this.delimiterValue) {
32+
options.delimiter = this.delimiterValue
33+
options.persist = false
34+
options.create = (input) => ({ value: input, text: input, item: input })
35+
}
36+
37+
if (this.optionsValue.length > 0) {
38+
const items = this.optionsValue.map(x => ({ item: x }))
39+
options.options = items
40+
options.valueField = 'item'
41+
options.labelField = 'item'
42+
options.searchField = 'item'
43+
}
44+
45+
if (this.labelClassValue) {
46+
options.render = {
47+
item: (data, escape) => '<div class="' + this.labelClassValue + '" style="margin-right: 4px;">' + escape(data.text) + '</div>'
48+
}
49+
}
50+
51+
this.tomSelect = new TomSelect(this.inputElement, options)
2352
}
2453

2554
disconnect() {

app/views/proposals/_form.html.haml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
Tags
3232
= f.select :tags,
3333
options_for_select(event.proposal_tags, proposal.object.tags),
34-
{}, {class: 'multiselect proposal-tags', multiple: true, data: {controller: 'multiselect'}}
34+
{}, {class: 'multiselect proposal-tags', multiple: true, data: {controller: 'tom-select', tom_select_label_class_value: 'label label-primary'}}
3535

3636
%fieldset
3737
%legend.fieldset-legend For Review Committee

app/views/shared/proposals/_reviewer_tags.html.haml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,5 @@
55
- else
66
%em None
77
#edit-tags-icon.fa.fa-pencil{data: {reviewer_tags_target: 'icon', action: 'click->reviewer-tags#toggle'}}
8-
#review-tags-form-wrapper{data: {reviewer_tags_target: 'form'}, style: 'display: none'}
8+
#review-tags-form-wrapper.hidden{data: {reviewer_tags_target: 'form'}}
99
= render 'shared/proposals/tags_form', event: event, proposal: proposal

app/views/shared/proposals/_tags_form.html.haml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
= form_for proposal, url: event_staff_proposal_path(event, proposal), data: {turbo_frame: dom_id(proposal, :reviewer_tags), controller: 'review-tags', review_tags_options_value: (event.review_tags | proposal.review_tags).to_json} do |f|
1+
= form_for proposal, url: event_staff_proposal_path(event, proposal), data: {turbo_frame: dom_id(proposal, :reviewer_tags), controller: 'tom-select', tom_select_options_value: (event.review_tags | proposal.review_tags).to_json, tom_select_delimiter_value: ','} do |f|
22
.form-group.col-sm-8.no-pad-left
33
.tag-list
4-
= f.text_field :review_tags, value: proposal.review_tags.join(','), tabindex: '-1', data: {review_tags_target: 'input'}
4+
= f.text_field :review_tags, value: proposal.review_tags.join(','), tabindex: '-1', data: {tom_select_target: 'input'}
55
= program_tracker
66
.form-group.col-sm-4
77
%button.btn.btn-success.btn-sm(type="submit")

0 commit comments

Comments
 (0)