// We need to import the CSS so that webpack will load it. // The MiniCssExtractPlugin is used to separate it out into // its own CSS file. import "../css/app.scss" import '@fortawesome/fontawesome-free/js/all' // webpack automatically bundles all modules in your // entry points. Those entry points can be configured // in "webpack.config.js". // // Import deps with the dep name or local files with a relative path, for example: // // import {Socket} from "phoenix" // import socket from "./socket" // import "phoenix_html" import {Socket} from "phoenix" import LiveSocket from "phoenix_live_view" let Hooks = {} Hooks.Dragger = { toggleAddDelete() { const deleter = document.getElementById('deleter') if (deleter) { const adder = document.getElementById('adder') deleter.hidden = adder.hidden adder.hidden = !adder.hidden } }, get dragImage() { const canvas = document.createElement("canvas") canvas.width = canvas.height = 60 const ctx = canvas.getContext("2d") ctx.beginPath() ctx.arc(30, 30, 30, 0, 2 * Math.PI) ctx.fill() return canvas }, mounted() { this.el.addEventListener("dragstart", event => { event.dataTransfer.setData("text/plain", `task-id:${this.el.dataset.taskId}`) event.dataTransfer.setDragImage(this.dragImage, 25, 25) this.toggleAddDelete() }) this.el.addEventListener("dragend", event => { this.toggleAddDelete() }) }, } Hooks.AddDropper = { get bgClass() { return "has-background-warning"}, addTaskToPlan(payload) { return this.pushEvent("add-task-to-plan", payload) }, getTaskPayload(event) { return event.dataTransfer.getData("text/plain") }, parseTaskPayload(payload) { return payload.startsWith("task-id:") ? payload.split(":")[1] : null }, addHoverClass(event) { event.target.classList.add(this.bgClass) }, removeHoverClass(event) { event.target.classList.remove(this.bgClass) }, mounted() { this.el.addEventListener("drop", event => { event.preventDefault() const payload = this.getTaskPayload(event) const taskID = this.parseTaskPayload(payload) if (taskID !== null) { const planID = this.el.dataset.planId this.addTaskToPlan({ "task_id": taskID, "plan_id": planID, }) this.removeHoverClass(event) } }) this.el.addEventListener("dragover", event => event.preventDefault()) this.el.addEventListener("dragenter", event => { const payload = this.getTaskPayload(event) const taskID = this.parseTaskPayload(payload) if (taskID !== null) { this.addHoverClass(event) } }) this.el.addEventListener("dragleave", event => { const payload = this.getTaskPayload(event) const taskID = this.parseTaskPayload(payload) if (taskID !== null) { this.removeHoverClass(event) } }) } } Hooks.DeleteDropper = { get hoverBGClass() { return "has-background-warning"}, get baseBGClass() { return "has-background-danger"}, deleteTaskFromPlan(payload) { return this.pushEvent("delete-task-from-plan", payload) }, getTaskPayload(event) { return event.dataTransfer.getData("text/plain") }, parseTaskPayload(payload) { return payload.startsWith("task-id:") ? payload.split(":")[1] : null }, addHoverClass(event) { event.target.classList.add(this.hoverBGClass) event.target.classList.remove(this.baseBGClass) }, removeHoverClass(event) { event.target.classList.remove(this.hoverBGClass) event.target.classList.add(this.baseBGClass) }, mounted() { this.el.addEventListener("drop", event => { event.preventDefault() const payload = this.getTaskPayload(event) const taskID = this.parseTaskPayload(payload) if (taskID !== null) { const planID = this.el.dataset.drop this.deleteTaskFromPlan({ "task_id": taskID, "plan_id": planID, }) this.removeHoverClass(event) } }) this.el.addEventListener("dragover", event => event.preventDefault()) this.el.addEventListener("dragenter", event => { const payload = this.getTaskPayload(event) const taskID = this.parseTaskPayload(payload) if (taskID !== null) { this.addHoverClass(event) } }) this.el.addEventListener("dragleave", event => { const payload = this.getTaskPayload(event) const taskID = this.parseTaskPayload(payload) if (taskID !== null) { this.removeHoverClass(event) } }) } } let csrfToken = document.querySelector("meta[name='csrf-token']").getAttribute("content") let liveSocket = new LiveSocket("/live", Socket, {params: {_csrf_token: csrfToken}, hooks: Hooks}) // Connect if there are any LiveViews on the page liveSocket.connect() // Expose liveSocket on window for web console debug logs and latency simulation: // >> liveSocket.enableDebug() // >> liveSocket.enableLatencySim(1000) // The latency simulator is enabled for the duration of the browser session. // Call disableLatencySim() to disable: // >> liveSocket.disableLatencySim() window.liveSocket = liveSocket document.addEventListener('DOMContentLoaded', () => { const $navbarBurgers = Array.prototype.slice.call(document.querySelectorAll('.navbar-burger'), 0) if ($navbarBurgers.length > 0) { $navbarBurgers.forEach( el => { el.addEventListener('click', () => { const target = el.dataset.target const $target = document.getElementById(target) el.classList.toggle('is-active') $target.classList.toggle('is-active') }) }) } })