import { Controller } from "@hotwired/stimulus"
import { subscription } from "~/javascripts/store/mixins/subscription"
/**
* @class Dashboard.FrameLoaderController
* @classdesc Requests the correct Turbo frame to load in the required data visualisation
* @extends Controller
**/
export default class extends Controller {
static targets = [ "frame", "loading" ]
static values = {
defaultFrame: String,
path: String,
storeId: String
}
/**
* Subscribe to the store.
*
* @instance
* @memberof Dashboard.FrameLoaderController
**/
connect() {
this.clonedLoader = this.loadingTarget.cloneNode(true)
subscription(this)
this.subscribe()
this.reconnect()
}
/**
* Handles a repeated Turbo visit to the dashboard page.
*
* @instance
* @memberof Dashboard.FrameLoaderController
**/
reconnect() {
if (this.store("frameSelected")) {
this.editStore("frameSelected", this.defaultFrameValue)
}
}
/**
* Generate a Turbo frame to load the correct data visualisation and append the loader inside
*
* @instance
* @memberof Dashboard.FrameLoaderController
**/
storeUpdated(prop, storeId) {
if (prop === "frameSelected") {
let turboFrame = document.createElement("turbo-frame")
turboFrame.id = this.store("frameSelected")
turboFrame.src = this.pathValue
turboFrame.appendChild(this.clonedLoader)
this.frameTarget.innerHTML = ""
this.frameTarget.appendChild(turboFrame)
}
}
/**
* Unsubscribe from the store
*
* @instance
* @memberof Dashboard.FrameLoaderController
**/
disconnect() {
this.unsubscribe()
}
}