Skip to content

Commit 6e8e25a

Browse files
committed
Integrate hacky GridDayRefreshController into other controllers
Now: - Grid refresh happens automatically via schedule-grid controller's connect() when replaced - Modal close is handled by bulk-dialog listening to stream events bulk-dialog controller now: - Opens modal on turbo:frame-load (when turbo-frame gets content) - Closes modal on turbo:before-stream-render when schedule_day_* is replaced (successful creation/cancel)
1 parent 85d95c5 commit 6e8e25a

20 files changed

+109
-167
lines changed

app/decorators/staff/time_slot_decorator.rb

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -104,9 +104,7 @@ def ts_data
104104
if ts.persisted?
105105
data.merge!({
106106
edit_path: h.edit_event_staff_schedule_grid_time_slot_path(object.event, object),
107-
update_path: h.event_staff_schedule_grid_time_slot_url(object.event, object),
108-
toggle: 'modal',
109-
target: '#grid-time-slot-edit-dialog'
107+
update_path: h.event_staff_schedule_grid_time_slot_url(object.event, object)
110108
})
111109
end
112110
data

app/helpers/schedule_helper.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ def generate_grid_button(day)
2626
link_to('Generate Grid',
2727
new_event_staff_schedule_grid_bulk_time_slot_path(current_event, day),
2828
class: 'btn btn-primary btn-sm generate-grid',
29-
data: {turbo: true, toggle: 'modal', target: '#bulk-time-slot-create-dialog'}
29+
data: {turbo: true, turbo_frame: 'grid-modal-content'}
3030
)
3131
end
3232

app/javascript/controllers/bulk_dialog_controller.js

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

app/javascript/controllers/draggable_sessions_controller.js

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -68,18 +68,11 @@ export default class extends Controller {
6868
const scheduled = session.dataset.scheduled
6969

7070
if (url && !scheduled) {
71-
fetch(url, {
72-
headers: {
73-
'Accept': 'text/html',
74-
'Turbo-Frame': 'program-session-show-dialog'
75-
}
76-
}).then(response => response.text())
77-
.then(html => {
78-
const frame = document.querySelector('#program-session-show-dialog turbo-frame')
79-
if (frame) {
80-
frame.innerHTML = html
81-
}
82-
})
71+
const frame = document.getElementById('grid-modal-content')
72+
if (frame) {
73+
frame.innerHTML = ''
74+
frame.src = url
75+
}
8376
}
8477
}
8578

app/javascript/controllers/grid_day_refresh_controller.js

Lines changed: 0 additions & 32 deletions
This file was deleted.
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import { Controller } from "@hotwired/stimulus"
2+
import { Modal } from "bootstrap"
3+
4+
export default class extends Controller {
5+
connect() {
6+
this.element.addEventListener('turbo:frame-load', () => this.onFrameLoad())
7+
document.addEventListener('turbo:submit-end', this.handleSubmitEnd)
8+
document.addEventListener('turbo:before-stream-render', this.handleStreamRender)
9+
}
10+
11+
disconnect() {
12+
document.removeEventListener('turbo:submit-end', this.handleSubmitEnd)
13+
document.removeEventListener('turbo:before-stream-render', this.handleStreamRender)
14+
}
15+
16+
handleStreamRender = (event) => {
17+
const stream = event.target
18+
if (stream.action === 'replace' && stream.target?.startsWith('schedule_day_')) {
19+
this.close()
20+
}
21+
}
22+
23+
onFrameLoad() {
24+
this.setupBulkFormSync()
25+
this.open()
26+
}
27+
28+
handleSubmitEnd = (event) => {
29+
const form = event.target
30+
if (!this.element.contains(form)) return
31+
32+
if (event.detail.success) {
33+
const submitter = event.detail.formSubmission?.submitter
34+
if (submitter && submitter.value === 'save_and_add') {
35+
return
36+
}
37+
this.close()
38+
}
39+
}
40+
41+
setupBulkFormSync() {
42+
const formatSelect = this.element.querySelector('select.session-format')
43+
const durationInput = this.element.querySelector('.time-slot-duration')
44+
45+
if (formatSelect && durationInput) {
46+
formatSelect.addEventListener('change', () => {
47+
durationInput.value = formatSelect.value
48+
})
49+
50+
durationInput.addEventListener('keyup', () => {
51+
if (document.activeElement === durationInput) {
52+
formatSelect.value = ''
53+
}
54+
})
55+
}
56+
}
57+
58+
open() {
59+
Modal.getOrCreateInstance(this.element).show()
60+
}
61+
62+
close() {
63+
const modal = Modal.getInstance(this.element)
64+
if (modal) modal.hide()
65+
}
66+
}

app/javascript/controllers/grid_show_modal_controller.js

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

app/javascript/controllers/index.js

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ window.Stimulus = application
1212
import AlertAutodismissController from "./alert_autodismiss_controller"
1313
import AlertController from "./alert_controller"
1414
import BannerAdsController from "./banner_ads_controller"
15-
import BulkDialogController from "./bulk_dialog_controller"
15+
import GridModalController from "./grid_modal_controller"
1616
import CfpDatatableController from "./cfp_datatable_controller"
1717
import ContentController from "./content_controller"
1818
import CopySpeakerEmailsController from "./copy_speaker_emails_controller"
@@ -22,15 +22,12 @@ import EditorController from "./editor_controller"
2222
import FilterController from "./filter_controller"
2323
import FixedSubnavController from "./fixed_subnav_controller"
2424
import FlyOutController from "./fly_out_controller"
25-
import GridDayRefreshController from "./grid_day_refresh_controller"
26-
import GridShowModalController from "./grid_show_modal_controller"
2725
import GridTimeSlotRefreshController from "./grid_time_slot_refresh_controller"
2826
import HighlightController from "./highlight_controller"
2927
import InlineEditController from "./inline_edit_controller"
3028
import MaxlengthAlertController from "./maxlength_alert_controller"
3129
import MentionController from "./mention_controller"
3230
import ModalAutofocusController from "./modal_autofocus_controller"
33-
import ModalFormController from "./modal_form_controller"
3431
import NestedFormController from "./nested_form_controller"
3532
import NextProposalController from "./next_proposal_controller"
3633
import NotificationsChannelController from "./notifications_channel_controller"
@@ -58,7 +55,7 @@ import TrackFilterController from "./track_filter_controller"
5855
application.register("alert-autodismiss", AlertAutodismissController)
5956
application.register("alert", AlertController)
6057
application.register("banner-ads", BannerAdsController)
61-
application.register("bulk-dialog", BulkDialogController)
58+
application.register("grid-modal", GridModalController)
6259
application.register("cfp-datatable", CfpDatatableController)
6360
application.register("content", ContentController)
6461
application.register("copy-speaker-emails", CopySpeakerEmailsController)
@@ -68,15 +65,12 @@ application.register("editor", EditorController)
6865
application.register("filter", FilterController)
6966
application.register("fixed-subnav", FixedSubnavController)
7067
application.register("fly-out", FlyOutController)
71-
application.register("grid-day-refresh", GridDayRefreshController)
72-
application.register("grid-show-modal", GridShowModalController)
7368
application.register("grid-time-slot-refresh", GridTimeSlotRefreshController)
7469
application.register("highlight", HighlightController)
7570
application.register("inline-edit", InlineEditController)
7671
application.register("maxlength-alert", MaxlengthAlertController)
7772
application.register("mention", MentionController)
7873
application.register("modal-autofocus", ModalAutofocusController)
79-
application.register("modal-form", ModalFormController)
8074
application.register("nested-form", NestedFormController)
8175
application.register("next-proposal", NextProposalController)
8276
application.register("notifications-channel", NotificationsChannelController)

app/javascript/controllers/modal_form_controller.js

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

app/javascript/controllers/schedule_grid_controller.js

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import { Controller } from '@hotwired/stimulus'
2-
import { Modal } from 'bootstrap'
32
import palette from 'google-palette'
43
import dayjs from 'dayjs'
54

@@ -288,18 +287,10 @@ export default class extends Controller {
288287
const url = slot.dataset.editPath
289288
if (!url || url.length === 0) return
290289

291-
fetch(url, {
292-
headers: {
293-
'Accept': 'text/vnd.turbo-stream.html, text/html',
294-
'Turbo-Frame': 'grid-time-slot-edit-dialog'
295-
}
296-
}).then(response => response.text())
297-
.then(html => {
298-
const dialog = document.getElementById('grid-time-slot-edit-dialog')
299-
dialog.innerHTML = html
300-
const modal = Modal.getOrCreateInstance(dialog)
301-
modal.show()
302-
})
290+
const frame = document.getElementById('grid-modal-content')
291+
if (frame) {
292+
frame.src = url
293+
}
303294
}
304295

305296
setupScrollHandlers() {

0 commit comments

Comments
 (0)