All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.hyperscala.ui.module.ScriptLoader.scala Maven / Gradle / Ivy

package org.hyperscala.ui.module

import org.hyperscala.event.BrowserEvent
import org.hyperscala.html._
import org.hyperscala.javascript.JavaScriptContent
import org.hyperscala.module.{Interface, Module}
import org.hyperscala.realtime.{RealtimePage, Realtime}
import org.hyperscala.web.{Website, Webpage}
import org.hyperscala.javascript.dsl._
import org.powerscala.event.Intercept
import org.powerscala.hierarchy.event.Descendants
import org.powerscala.{Priority, Unique, Version}
import org.powerscala.json.TypedSupport

/**
 * ScriptLoader allows for dynamically loading JavaScript files after the page has loaded.
 *
 * @author Matt Hicks 
 */
object ScriptLoader extends Module {
  TypedSupport.register("scriptLoaded", classOf[ScriptLoaded])

  override val name = "ScriptLoader"
  override val version = Version(1)

  override def dependencies = List(Realtime)

  override def init(website: Website) = {
    website.register("/js/hyperscala-scriptloader.js", "hyperscala-scriptloader.js")
  }

  override def load(webpage: Webpage) = {
    webpage.head.contents += new tag.Script(src = "/js/hyperscala-scriptloader.js")
  }

  def load(webpage: Webpage, url: String, cache: Boolean = true) = {
    webpage.eval(s"ScriptLoader.load('$url', $cache);")
  }

  def loadMultiple(webpage: Webpage, urls: List[String], cache: Boolean = true) = {
    webpage.eval(s"ScriptLoader.loadMultiple(${urls.map(JavaScriptContent.toJS).mkString("[", ", ", "]")}, $cache);")
  }

  def whenFinished(webpage: Webpage)(callback: => Unit) = {
    val id = Unique()
    webpage.body.eventReceived.onceConditional(Intercept.Continue) {
      case evt: ScriptLoaded if evt.callId == id => {
        callback
        Some(Intercept.Stop)
      }
      case _ => None
    }
    webpage.eval(s"ScriptLoader.onFinish('$id');")
  }
}

case class ScriptLoaded(tag: HTMLTag, callId: String) extends BrowserEvent




© 2015 - 2025 Weber Informatics LLC | Privacy Policy