HTML


Opis modułu

Interfejs użytkownika w programach uruchamianych za pomocą przeglądarek internetowych jest pisany w języku HTML. W module Html dostępny jest szereg metod ułatwiających skompletowanie podstawowych elementów, z których składa się strona. Większość metod jest przeciążona, co pozwala na łatwe budowanie strony z domyślnymi parametrami, a jednocześnie, w razie potrzeby, umożliwia pełną konfigurację wyglądu i treści. W większości metod obowiązkowymi parametrami są wartości atrybutów "id" i "name" elementów HTML

Tworzenie formularza

Formularz to część dokumentu HTML, zawierająca elementy służące do skompletowania informacji i następnie wysłania ich do serwera. Użytkownik kompletuje informacje poprzez

Do tworzenia formularza służą metody html.createForm(). Zapewniają one:

Zawartość formularza wprowadzana jest jako parametr formCode w języku jPALIO - może on zawierać metody modułu HTML lub bezpośrednio kod HTML.

Przykład:

$html.createForm("customerForm",
"customerForm",
$page.url($currentPageCode()),
"input",
"button",
(String) null,
{
$// jPALIO code to create form content
},
{},
{}
)

Wprowadzanie danych

Podstawową metodą umożliwiającą użytkownikowi wpisywanie danych jest textField(). Istnieje również szereg metod szczegółowych, do wprowadzania szczególnych typów danych, o charakterystycznych właściwościach lub formatach, np.:

Dwie ostatnie metody, ze względu na swój szczególny charakter,  mają automatycznie przypisane nazwy parametrów i niektóre właściwości.

Istnieje również metoda textArea(), wyświetlająca obszar tekstowy do wprowadzania danych.

Szczególnym przypadkiem są metody uploadField(), pozwalające na wyświetlanie pola do przesyłania plików na serwer. Jeśli się korzysta z którejś z nich, należy uwzględnić to przy tworzeniu formularza: zamiast podstawowej metody createForm() należy wykorzystać przystosowaną specjalnie do tego celu metodę createUploadForm().

Przykład

<label>"Customer last name"</label>
$html.textField("customer.name",
                (String) $getParam("customer.name"),
                100,
                false,
                (String) "CUSTOMER LAST NAME",
                (String) null,
                (String) "customer.name",
                (String) null,
                (String) null,
                (String) null,
                (String) null,
                {})

Listy wyboru

Lista wyboru jest elementem formularza, pozwalającym na wybranie jednej (jeśli użyjemy metody dropList()) lub dowolnej liczby pozycji (w przypadku multipleDropList()) z przygotowanego zestawu. Zestaw pozycji w obu tych metodach można zadeklarować jako tablicę lub kolekcję (np. listę) o wartościach będących tablicami [wartość, etykieta].

Przykłady

Lista pojedynczego wyboru:

$html.dropList("customer.type",
(String) $getParam("customer.type"),
(List) $customerTypeList,
true,
"CUSTOMER TYPE",
"customer.type",
"",
"",
(String) null,
"----",
"")

Lista wyboru wielokrotnego

$html.multipleDropList("processes",
$util.asArray((Collection)$processes),
(Collection)$processList,
3,
false,
(String)null,
"processes",
"doubleWidth",
(String)null,
"")

Tabele

Moduł Html udostępnia metody wspomagające tworzenie tabel, które użytkownik może posortować wg swoich potrzeb. Wyświetlanie takich tabel trzeba poprzedzić przygotowaniem odpowiedniego kodu CSS metodą sortTableCSS(). Kod ten powinien zostać umieszczony w odpowiednim arkuszu stylów.
Do tworzenia tabel służą metody sortTable(). Pozwalają one na wyświetlanie prostych, dwuwymiarowych tabel, umożliwiając dodatkowo według życzenia:

We wszystkich tych metodach nagłówki (postać i obsługę) określa się jako tablicę, której każdy element definiuje sposób wyświetlania jednej kolumny, w szczególności to, czy tabela może być sortowana (w obu kierunkach) po tej kolumnie i typ wartości w kolumnie (dopuszczalne są: "T"- tekst, "C"- currency, "D"- date, "I"- integer, "F"- float).
Dane do wyświetlenia (zawartość tabeli) mogą być przekazane jako lista (java.util.List) albo tablica. Można też przygotować własny kod jPALIO (palio.compiler.PalioCode) tworzący tabelkę, ze standardowymi znacznikami - wiersze <tr> i kolumny <td>. Należy pamiętać, że pierwsza kolumna listy (indeks 0) nie jest wyświetlana - musi zawierać używany wewnętrznie identyfikator (tzn. przygotowana do wyświetlenia tablica musi zawierać o jedną kolumnę więcej, niż wskazuje na to nagłówek).
Po wyświetleniu tabeli można dodać javascript, wstępnie sortujący jej pozycje.

Przykłady

Standardowa tabela sortowana:

$html.sortTable(
  "processesTable", 
  "100%", 
  false, 
  [["Code", true, true, null, null, "T"],
   ["Name", true, true, null, null, "T"],
   ["Description", true, true, null, null, "T"],
   ["Frequency of execution", true, true, null, null, "T"],
   ["Frequency unit", true, true, null, null, "T"],
   ["Date of nearest execution", true, true, null, null, "D"],
   ["Edit", true, true, $pageID("system.processes.edit.page"), null, "T"]], 
  (List)$processesList,
  false,
  {<div class="info">"No data matching required criteria"</div>}
)

Definiowana przez programistę tabela z polami kontrolnymi, umożliwiającymi wskazanie wybranych pozycji

$html.sortTable(
"CustomersTable",
"90%",
false,
true,
[["", false, false, null, null, "T"],
["Customer’s first name", false, false, null, null, "T"],
["Customer’s surname", true, true, null, null, "T"],
["Company", false, false, null, null, "T"]],
{ $@=(index,0)
$for( customer, (List)$customersList, {
$if($==( $%((Long)$@index, 2), 0), { $@=(trClass, "normalRow") }, { $@=(trClass, "alternateRow") })
$@=(customerNo, (String)$customer[0])
$ifNotNull((String)$getParam($+("customer_", (String)$columnNo)), {
$@=(checked, true)
}, {
$@=(checked, false)
})
<tr class=$@trClass>
<td>$html.checkBox($+("customer_", (String)$customerNo), $@customerNo, (Boolean)$@checked, $+("customer_", (String)$customerNo), "style class=\"checkBox\" onchange=\"conditionallyDisableTextFieldsAndTestButton()\"")</td>
<td>$customer[1]</td>
<td>$customer[2]</td>
<td>$customer[3]</td>
</tr>
$++(@index)
})
}
)

Przyciski

Duże znaczenie w większości formularzy mają elementy pozwalające użytkownikowi na sterowanie działaniem programu, Należą do nich:

Przykłady

Prosty przycisk, zmieniający stronę programu:

$html.simpleButton("backToPreviuosPage.action", "Powrót", $+(["window.location='",$page.pageURL($pageID("system.customers.page")),"'"]),"backToPreviuosPage.action", "yellowButton", "")
Wysłanie danych do serwera:
$html.submitButton("saveButton", "Save", "saveButton", "greenButton", "")
Pojedyncze pole kontrolne:
<div class="row">
  <label for="process.active">Active</label>
  $html.checkBox("process.active", "T", (Boolean)$getParam("process.active"), "process.active", "class='checkbox'")
</div>
Grupa przycisków radiowych:
<div class="row">
  <label class="bold">Customer type:</label>
  <div class="radioButtonsInputsOnLeft">
    $html.radioButtons("customerType", "F", (List)$customerTypes, "<div class="radioButtonRow">INPUT <label>LABEL</label></div>")
  </div>
</div>

Kalendarz

Szczególnym rodzajem danych, które mogą być wprowadzane przez użytkownika, są daty. Ze względu na konieczność ścisłej kontroli formalnej przy ich wprowadzaniu, do wprowadzania ich przygotowane są specjalne metody dateField() i calendarField(). Dla wygody użytkownika istnieją również metody calendarShow() i calendarShowInLine(), które wywołują funkcję pokazującą kalendarz i umożliwiającą wybranie daty. Przed wywołaniem ich (w nagłówku strony) należy umieścić metodę calendarInit().

Przykład

$html.calendarInit()

$html.createForm("REPORT_form", "REPORT_form", $pageURL($currentPage()), "field", "button", {
<div class="blankLine"></div>

<div class="row">
<label for="report.signDateFrom">Start date</label>
$html.calendarField("report.signDateFrom", $toDate((String) $getParam("report.signDateFrom"), $global.get("report.dateFormat")), true, "START DATE ", (Date) null, (Date) null, $global.get("report.dateFormat"), "report.signDateFrom", "short", (String) null, (String) null, (String) null)
$html.simpleButton("", "...", $html.calendarShow("report.signDateFrom", $global.get("report.dateFormatForCalendar")), (String) null, "shortButton", (String) null)
</div>
<div class="row">
<label>End date:</label>
$html.calendarField("report.signDateTo", $toDate((String) $getParam("report.signDateTo"), $global.get("report.dateFormat")), true, "END DATE", (Date) null, (Date) null, $global.get("report.dateFormat"), "report.signDateTo", "short", (String) null, (String) null, (String) null)
$html.simpleButton("", "...", $html.calendarShow("report.signDateTo", $global.get("report.dateFormatForCalendar")), (String) null, "shortButton", (String) null)
</div>
$html.submitButton("searchButton", "Display", "searchButton", "blueButton", (String) null)

}, {})

Podpowiedzi

Uzupełnieniem formularza mogą być podpowiedzi, ukazujące się na ekranie przy najechaniu myszką na odpowiedni element. Do tworzenia ich służą metody initTooltips(), addTooltip(), addTooltipToBuffer() i flushTooltipsBuffer(). Dwie ostatnie są użyteczne, gdy na stronie chcemy mieć dużo elementów z podpowiedziami.

Panel z zakładkami

Przed rozpoczęciem wprowadzania zakładek konieczne jest utworzenie kodu CSS metodą tabCSS(). Kod ten powinien zostać umieszczony w odpowiednim arkuszu stylów.
Panel z przyciskami konstruowany jest poprzez wywołanie metody createTabs(), przyjmującej jako parametr kod Palio - wewnątrz tego kodu należy zawrzeć wywołania addTab().
Bezpośrednio po wywołaniu createTabs(), należy wywołać createTabBody(), również przyjmującej jako parametr kod Palio - kod HTML będący efektem wykonania tego kodu zostanie umieszczony na panelu zakładek. Kod źródłowy do wyświetlenia każdej zakładki należy umieścić w oddzielnym podkatalogu.

Przykład

Organizacja panelu zakładek

$// Tabs list
$=(tabs, $createMap(
[0, 1, 2],
["General", "Services", "Documents"]
))

$ifNull($activeTab, {
$=(activeTabNo, 0)
}, {
$=(activeTabNo, $toLong($activeTab))
})
$=(tabDirName, $+(["tab", $toLower((String) $get((Map) $tabs, $activeTabNo))]))

$// Create navigation panel
$html.createTabs((Long) $activeTabNo, {
$// And add tabs to it
$for("tab", (Map) $tabs, {
$=(@rowId, $toString($getParam("_RowID")))
$// The 0’th tab is active always, rest only if the _RowID parameter is set (customer exists)
$=(@isTabActive, $or($==((Long) $tab[0], 0), $isNotNull($@rowId)))
$html.addTab($#((String) $tab[1]), $page.url($currentPageCode(), $@rowId, $+("&activeTab=", $tab[0])), $@isTabActive)
})
})
$// Create panel body
$html.createTabBody({
$=(@objCode, $+([" system.customers.define.details.", $tabDirName, ".tab"]))
$=(@sqlQuery, "select 1 from p_objects where code = ?")
$if($sql.exists($@sqlQuery, [$@objCode]), {
$object($@objCode)
})
})

Przykład formularza dla zerowej zakładki

$// Basic tab – general information
$object("system.customer.details.tabgeneral.form$init")
$html.createForm("customerDetailsGeneral", "customerDetailsGeneral", $page.url($currentPageCode()), "input", "button", (String) null, {

  $html.setParam("REQUIRED_CHAR", "<em></em>")
  <div class="blankLine"></div>
  <div class="row">
    <label for="customer.lastName">Surname</label>
    $html.textField("customer.lastName", (String)$getParam("customer.lastName"), 50, false, "SURNAME", (String) null, "customer.lastName", "", "", "", "", {})  
  </div>

  <div class="row">
    <label for="customer.firstName">First name</label>
    $html.textField("customer.firstName", (String)$getParam("customer.firstName"), 30, false, "FIRST NAME", (String) null, "customer.firstName", "", "", "", "", {})
  </div>

  <div class="row">
    <label for="customer.companyName">Company name </label>
    $html.textField("customer.companyName", (String)$getParam("customer.companyName"), 200, false, "COMPANY NAME", (String) null, "customer.companyName", "", "", "", "", {})
  </div>

  $html.submitButton("saveCustomersList", "Save", "saveCustomersList", "submit", "")
  $html.simpleButton("backToPreviuosPage", "Back", $+(["window.location='",$page.pageURL($pageID("system.customers.page")) ,"'"]),"backToPreviuosPage", "button", "")
}, {}, {})

Przykłady

Klasyczny, prosty formularz do wprowadzania i edycji danych.

$html.calendarInit()

$// Current message
$ifNotNull($status, {
  <div class="$statusStyle">
    $status
    $=(status, null)
  </div>
})

$html.createForm("processEditForm", "processEditForm", $page.url($currentPageCode()), "input", "button", (String) null, {
  <fieldset>
    <div class="blankLine"></div>
    $// Code (identifier) can be entered only for new positions
    <div class="row">
    <label for="process.code">Code<em></em></label>
      $if( $==( $actionType, "new"), {
        $html.textField("process.code", (String)$getParam("process.code"), 1, true, "CODE", (String) null, "process.code", "doubleWidth", "", "", "", {})  
      }, {
        $html.textField("process.code", (String)$getParam("process.code"), 1, true, "CODE", (String) null, "process.code", "doubleWidth readonly", "", "", "readonly", {})  
      })
    </div>

    $// Required field
    <div class="row">
      <label for="process.name">Name<em></em></label>
      $html.textField("process.name", (String)$getParam("process.name"), 50, true, "NAME", (String) null, "process.name", "doubleWidth", "", "", "", {})
    </div>

    <div class="row">
      <label for="process.description">Description<em></em></label>
      $html.textField("process.description", (String)$getParam("process.description"), 200, true, "DESCRIPTION", (String) null, "process.description", "doubleWidth", "", "", "", {})
    </div>

    $// Field with controlled value: only digits can be entered
    <div class="row">
      <label for="process.frequency">Frequency</label>
          $html.textField("process.frequency", (String)$getParam("process.frequency"), 5, false, "FREQUENCY", "/^[0-9]*$/", "process.frequency", "width-XS", "", "", "", {})
      $// Single select list
      $=(@frequencyUnit, "Frequency unit")
      $html.dropList("process.frequencyUnit", (String) $getParam("process.frequencyUnit"), (List) $getParam("dict.frequencyUnits"), false, "FREQUENCY UNIT", "process.frequencyUnit", "", (String) null, (String) null, "------", "")
    </div>

    <div class="row">
      $// Adding calendar 
      <label>Next date</label>
        $html.textField("process.nextDate", $toString((Date) $getParam("process.nextDate"), $global.get("dateFormat")), 10, false, "NEXT DATE", $+(["/", $global.get("regexp.dateFormat"), "/"]), "process.nextDate", "", (String) null, (String) null, (String) null)
      $html.simpleButton("", "...", $html.calendarShow("process.nextDate", $global.get("dateFormatForCalendar")), (String) null, "shortButton", "")
    </div>
  
    <div class="row">
      $// Check box
      <label for="process.active">Active</label>
      $html.checkBox("process.active", "T", (Boolean)$getParam("process.active"), "process.active", "class='checkbox'")
    </div>

    <fieldset class="submit">
      $// Buttons
      $html.submitButton("saveprocess.action", "Save", "saveprocess.action", "greenSubmit", "")
      $html.simpleButton("backToPreviuosPage.action", "Back", $+(["window.location='",$page.pageURL($pageID("system.processes.page")),"'"]),"backToPreviuosPage.action", "yellowSubmit", "")
      $// Tooltips
      $html.initTooltips()
      $html.addTooltip( "saveRefreshProcess.action", "Save data", 1000 )
      $html.addTooltip( "backToPreviuosPage.action", "Back to processes list", 1000 )
    </fieldset>
  </fieldset>
}, {}, {})
Przykład formularza umożliwiającego zalogowanie się do programu

<html>
  <head>
    <title>$#(Login)</title>
    <link rel="stylesheet" type="text/css" href="$page.url(system.layout.css.main)">
  </head>

  <body>
    <div id="login">
      <div id="centralBlock">
        <h1>Logging In</h1>
$// Information about login status
        $ifNotNull($getParam("page.message"), {
          <div id="#page-message" class="info">$getParam("page.message")</div>
        })
        $ifNotNull($getParam("page.error"), {
          <div id="#page-error" class="error">$getParam("page.error")</div>
        })

$// The login form points to a page, to which date should be sent after successful login.
$// If the application uses different access right for different users,
$// that page should read permissions of logged in user.
        $html.createForm("loginForm", "loginForm", $page.login(system.home.page), "form", "", {

          <div class="centered">LOGIN</div>
          $html.loginField("", 20, "LOGIN", "_UserName", "centered", "")

          <div class="centered">PASSWORD</div>
          $html.passwordField( 30, "PASSWORD","_Password", "centered", "")

          $html.submitButton("checkLogin", "Log in", "checkLogin", submit, "")
        }, {})
      </div>
    </div>
  </body>
</html>

API

http://jpalio.torn.com.pl/modules/palio/modules/HTML.html