Patch title: Release 90 bulk changes
Abstract:
File: /appli/pad/display.pli
Key:
    Removed line
    Added line
module "/pliant/protocol/http/server.pli"
module "/pliant/protocol/http/style/default.style"
module "/pliant/util/encoding/http.pli"
module "database.pli"
module "/pliant/admin/file.pli"


function smart_size size -> s
  arg Intn size ; arg Str s
  s := shunt size<4096 string:size+" bytes" size<4096*2^10 (string size\2^10)+" KB" (string size\2^20)+" MB"

method page pad_list pad list
  arg_rw HtmlPage page ; arg_rw Data:PadPage pad ; arg Array:FileInfo list
method page pad_list pad list rw
  arg_rw HtmlPage page ; arg_rw Data:PadPage pad ; arg Array:FileInfo list ; arg CBool rw
  implicit page
    table columns 3
    table columns (shunt rw 4 3)
      cell header [File]
      cell header [Date]
      cell header [Size]
      if rw
        cell header
          void
      var Intn total := 0
      for (var Int i) 0 list:size-1
        total += list:i:size
        cell
          link list:i:name keyof:pad+"/file/"+list:i:name no_extension
        cell
          text (string list:i:datetime)
        cell
          text (smart_size list:i:size)
        if rw
          cell
            var Str filename := list:i:name
            note "delete"
              title "delete '"+filename+"'"
              [Are you sure that you want to delete] ; fixed (text " "+filename+" ") ; [file ? ]
              button "yes" noeol
                var Str path := pad path
                if path<>"" and (filename search "/" -1)=(-1)
                  file_delete path+filename
                goto_backward
              button "no"
                goto_backward
      if list:size>1
        cell header
          text (string list:size)+" files"
        cell header void
        cell header
          text smart_size:total
        if rw
          cell header
            void

method page pad_display pad
  arg_rw HtmlPage page ; arg_rw Data:PadPage pad
  implicit page
    title pad:title
    each c pad:content
      var Str t := c type
      if t="link"
        link (c:options option "title" Str c:content) c:content no_extension
        if (c:options option "comment")
          fixed [  ] ; text (c:options option "comment" Str)
        eol
      eif t="inline"
        html "<iframe name=[dq]f"+keyof:c+"[dq] onload=[dq]this.style.height = window.frames[lb]'f"+keyof:c+"'[rb].document.body.scrollHeight + 16 + 'px'[dq] src=[dq]"+(http_encode c:content)+"[dq] width=[dq]100%[dq] style=[dq]height:100px[dq]>[lf]"
        link c:content c:content no_extension
        html "[lf]</iframe>[lf]"
      eif t="header"
        eol
        bold (text c:content) ; eol
      eif t="para"
        para
          var Str all := c content
          if (all 0 2)=". " or (all search "[lf]. " -1)<>(-1)
            var CBool li := false
            while all<>""
              if not (all eparse any:(var Str first) "[lf]" any:(var Str remain))
                first := all ; remain := ""
              if (first 0 2)=". "
                if not li
                  html "[lf]<ul>[lf]" ; li := true
                html "<li>"
                text (first 2 first:len)
                html "</li>[lf]"
              else
                if li
                  html "</ul>[lf]" ; li := false
                text first
              if remain<>"" and not li and (remain 0 2)<>". "
                eol
              all := remain
            if li
              html "</ul>[lf]"
          else
            text all
      eif t="fixed"
        para
          fixed
            text c:content
      eif t="table"
        html "[lf]<p>[lf]<table border=[dq]1[dq] cellpadding=[dq]4[dq] cellspacing=[dq]0[dq]>[lf]"
        var Str all := c content
        while all<>""
          if not (all eparse any:(var Str line) "[lf]" any:(var Str remain))
            line := all ; remain := ""
          html "<tr>[lf]"
          while line<>""
            if not (line eparse any:(var Str ce) "|" any:(var Str re))
              ce := line ; re := ""
            html "<td>" ; text ce ; html "</td>[lf]"
            html "<td>"
            if (ce parse any:(var Str label) "->" any:(var Str url))
              link label url no_extension
            else
              text ce
            html "</td>[lf]"
            line := re
          html "</tr>[lf]"
          all := remain
        html "</table>[lf]</p>[lf]"
      eif t="html"
        para
          html c:content
    if pad:planning:size>0
      para
        table columns 3
          cell header [Who]
          cell header [When]
          cell header [Duration]
          each pl pad:planning
            cell
              text pl:who
            cell
              text (string pl:when)
            cell
              text pl:duration
    var Array:FileInfo list := file_list pad:path standard+recursive+relative+sorted
    if list:size>0
      para
        pad_list pad list
        pad_list pad list false

method pad next_content_id -> id
  arg Data:PadPage pad ; arg Str id
  var Int num := pad:content:size+1
  part try
    id := right string:num 3 "0"
    if (exists pad:content:id)
      num += 1
      restart try

method page pad_express pad
  arg_rw HtmlPage page ; arg_rw Data:PadPage pad
  implicit page
    para
      box color (color hsl 240 20 75) round 5 header "Express fill"
        select "Type: " (var Str a_type)
          option "" ""
          option "link" "link"
          option "inline" "inline"
          option "header" "header"
          option "para" "para"
          option "fixed" "fixed"
          option "table" "table"
          option "html" "html"
        input "Title:" (var Str a_title) length 60 noeol ; [ (links only)] ; eol
        [Content: ] ; eol
        text_input "" (var Str a_content) columns 80 rows 10
        page button "append"
          var Str cid := pad next_content_id
          pad:content create cid
          var Data:PadContent c :> pad:content cid
          c type := a_type
          c content := a_content
          if a_type="link" and a_title<>""
            c options := "title "+string:a_title
          reload_page
    para
      box color (color hsl 240 20 75) round 5 header "Sub page creation"
        input "Title:" (var Str sub_title) length 60 noeol
        page button "create sub page"
          var Str sub_id := generate_id
          var Str cid := pad next_content_id
          pad:content create cid
          var Data:PadContent c :> pad:content cid
          c type := "link"
          c content := sub_id
          c options := "title "+string:sub_title
          pad_database:data:page create sub_id
          pad_database:data:page:sub_id user := user_name
          pad_database:data:page:sub_id title := sub_title
          goto_url sub_id no_extension

method page pad_edit pad
  arg_rw HtmlPage page ; arg_rw Data:PadPage pad
  implicit page
    para
      box color (color hsl 60 50 75) round 5 header "Abstract"
        table columns 2 border 0
          cell [Title:]
          cell (input "" pad:title length 80)
          cell [Author:]
          cell (text pad:user)
          cell [Read requires right:]
          cell (input "" pad:read)
          cell [Write requires right:]
          cell (input "" pad:write)
    para
      box color (color hsl 240 20 75) round 5 header "Content"
        table columns 4
          cell header [Line ID]
          cell header [Type]
          cell header [Content]
          cell header [Options]
          each c pad:content
            cell
              text keyof:c
            cell
              select "" c:type
                option "" ""
                option "link" "link"
                option "inline" "inline"
                option "header" "header"
                option "para" "para"
                option "fixed" "fixed"
                option "table" "table"
                option "html" "html"
            cell
              if c:type="para" or c:type="fixed" or c:type="table"or c:type="html"
                small
                  text (replace (c:content 0 40) "[lf]" " ")
                fixed [ ]
                button "edit"
                  text_input "" c:content columns 80 rows 25
                  button "record"
                    goto_backward
              else
                input "" c:content length 40
            cell
              input "" c:options length 40
        input "Line ID: " (var Str cid) noeol
        button "create" noeol
          pad:content create cid
          reload_page
        button "delete" noeol
          pad:content delete cid
          reload_page
    pad_express pad
    para
      box color (color hsl 120 20 75) round 5 header "Planning"
        table columns 4
          cell header [Line ID]
          cell header [Who]
          cell header [When]
          cell header [Duration]
          each pl pad:planning
            cell
              text keyof:pl
            cell
              input "" pl:who length 20
            cell
              input "" pl:when length 20
            cell
              input "" pl:duration length 5
        input "Line ID: " (var Str pid) noeol
        button "create" noeol
          pad:planning create pid
          reload_page
        button "delete" noeol
          pad:planning delete pid
          reload_page
    para
      box color (color hsl 0 0 75) round 5 header "Storage"
        var Array:FileInfo list := file_list pad:path standard+recursive+relative+sorted
        pad_list pad list
        pad_list pad list true
        file_upload "File: " (var Str upload) noeol
        button "upload"
          var Str path := pad path
          var Str name  := upload option "remote_name" Str
          file_move upload pad:path+name
          if path<>""
            file_move upload path+name
          reload_page
    para
      button "update"
        goto_backward


export '. pad_display' '. pad_edit'