#! /usr/bin/env fan
//
// Copyright (c) 2021, Brian Frank and Andy Frank
// Licensed under the Academic Free License version 3.0
//
// History:
// 29 Jun 21 Andy Frank Creation
//

using dom
using util
using web
using webmod
using wisp

*************************************************************************
** JsDomMain
*************************************************************************

class JsDomMain : AbstractMain
{
 @Opt { help = "http port" }
 Int port := 8080

 override Int run()
 {
 wisp := WispService
 {
 it.httpPort = this.port
 it.root = JsDomMod()
 }
 return runServices([wisp])
 }
}

*************************************************************************
** JsDomMod
*************************************************************************

const class JsDomMod : WebMod
{
 new make()
 {
 pods := ["sys","dom"].map |n| { Pod.find(n) }
 files := File[,]
 .addAll(FilePack.toAppJsFiles(pods))
 .add(compileScriptJs)
 this.jsPack = FilePack(files)
 }

 override Void onGet()
 {
 switch (req.modRel.path.first)
 {
 case null: onIndex
 case "dom.js": jsPack.onGet
 }
 }

 Void onIndex()
 {
 res.headers["Content-Type"] = "text/html; charset=utf-8"
 out := res.out
 out.docType5
 out.html
 out.head
 .title.w("Dom Basics").titleEnd
 .includeJs(`/dom.js`)
 .style.w(
 "body {
 padding: 0.25em 2em;
 font: 16px -apple-system, BlinkMacSystemFont, sans-serif;
 }").styleEnd
 out.headEnd
 out.body
 .h1.w("Dom Basics").h1End

 // Win
 out.hr
 .h2.w("Win").h2End
 .p
 .button("value='Alert' onclick='fan.domExample.JsDom.winAlert()'")
 .button("value='Uri' onclick='fan.domExample.JsDom.winUri()'")
 .button("value='Viewport' onclick='fan.domExample.JsDom.winViewport()'")
 .pEnd

 // Elem
 out.hr
 .h2.w("Elem").h2End
 .p
 .button("value='Add Item' onclick='fan.domExample.JsDom.elemAddItem()'")
 .button("value='Clear Items' onclick='fan.domExample.JsDom.elemClearItems()'")
 .pEnd
 .div("id='elem-list'").divEnd

 out.bodyEnd
 out.htmlEnd
 }

 **
 ** Normally your @Js code would exist in a pod, but since
 ** this is a Fantom script, we need to compile on the fly
 ** in order to get JS output to add to FilePack.
 **
 private File compileScriptJs()
 {
 src := Env.cur.homeDir + `examples/js/dom.fan`
 js := Env.cur.compileScriptToJs(src, ["podName":"domExample"])
 temp := Env.cur.tempDir + `dom.js`
 temp.out.print(js).sync.close
 return temp
 }

 private const FilePack jsPack
}

*************************************************************************
** JsDom
*************************************************************************

@Js class JsDom
{
 static Void winAlert()
 {
 Win.cur.alert("Hello world, from JsDom.winAlert!")
 }

 static Void winUri()
 {
 Win.cur.alert("uri: ${Win.cur.uri}")
 }

 static Void winViewport()
 {
 Win.cur.alert("viewport: ${Win.cur.viewport}")
 }

 static Void elemAddItem()
 {
 list := Win.cur.doc.elemById("elem-list")
 list.add(Elem {
 it.text = "This is item #${list.children.size}"
 })
 }

 static Void elemClearItems()
 {
 list := Win.cur.doc.elemById("elem-list")
 list.removeAll
 }
}

AltStyle によって変換されたページ (->オリジナル) /