view_table_renderer.anubis 12.6 KB
/*
 * Created by PyramIDE.
 * User: Totoro
 * Date: 30/11/2011
 * Time: 21:22
 * 
 */

read hayamiki_lib/view/view_table_types.anubis
read hayamiki_lib/view/view_table_manager_types.anubis
read hayamiki_lib/view/view_table_manager.anubis
read hayamiki_lib/view/web_action.anubis
read hayamiki_lib/types/hayamiki.anubis
read system/string.anubis
read locale/L3.anubis
read tools/basis.anubis
read data_base/sqlite.anubis
read system_colors/rgb.anubis
read system/convert.anubis

//read utils.anubis
read locale/L3LanguageInfo.anubis
read calexium_lib/web/CXM_common.anubis
read calexium_lib/web/CXM_web_arg_utils.anubis
read calexium_lib/web/CXM_making_a_web_site.anubis
read calexium_lib/web/CXM_multihost_http_server.anubis
read calexium_lib/web/jQuery/CXM_jquery_datatable.anubis
read calexium_lib/web/jQuery/CXM_jquery_datatable_types.anubis
read calexium_lib/web/jQuery/CXM_jquery_dialog.anubis      
read calexium_lib/web/jQuery/CXM_jquery_button.anubis
read calexium_lib/web/jQuery/ui-addon/datetimepicker.anubis
read calexium_lib/web/CXM_form.anubis
read calexium_lib/web/widgets/css_helper.anubis
read calexium_lib/web/widgets/button.anubis




define CXM_Form_Field
  help_line
  (
    HK_Help_Text  help,
    (String) -> String    _T
  )=
  if help is
  {
    no_help_text        then  empty,
    help_text_TAG(tag)  then  explain(_T(tag)),
    help_text(str)      then  explain(str)
  }.
  
  
  //Edit table part
public define List(CXM_Form_Field)  
  edit_form_lines
  (
    SQLite3DataBase       db,
    (String) -> String    _T,
    List(VT_edit_entry)   list,
    List(CXM_Form_Field)  so_far
  )=
  if list is
  {
    []        then reverse(so_far),
    [ h . t]  then
      with line = 
        if h is
        {
          hidden(name, value)        then
            //print("hidden "+name+" = "+value);
            [hidden(html_Id(""), wan(name), wav(value))],          
          primary_key(idx)          then 
            [hidden(html_Id(""), wan("id"), wav(idx))],
          information(s_name, c_name, value, width, help) then
            [input_readonly(label(_T(s_name), no_help), wan(c_name), init(not_null_String(value)), if width > 0 then custom(width) else narrow), help_line(help, _T)],
          text(s_name, c_name, value, help) then  
            [input(label(_T(s_name), no_help), wan(c_name), init(not_null_String(value)), narrow, mandatory), help_line(help, _T)],
          password(s_name, c_name, help) then
             [password_input(label(_T(s_name), no_help), wan(c_name+"_1"), init(""), narrow, non_mandatory),
              password_input(label(_T(s_name), no_help), wan(c_name+"_2"), init(""), narrow, non_mandatory),
              help_line(help, _T)],

          foreign_text(s_name, c_name, value, select, help) then 
            [selector_c([],label(_T(s_name), no_help), html_Id(""), wan(c_name), 1, select.get(db), success(init(to_String(value))), mandatory), help_line(help, _T)],
          choices_text(s_name, c_name, value, select, help) then 
            [selector_c([],label(_T(s_name), no_help), html_Id(""), wan(c_name), 1, select.get(db), success(init(value)), mandatory), help_line(help, _T)],
          text_area(s_name, c_name, value, txt_editor, help)  then
            with id = if txt_editor is { none then "", rich_editor then c_name+"_editor"},
            [text_area([],label(_T(s_name), no_help), html_Id(id), wan(c_name), init(not_null_String(value)), narrow, (Int)5, mandatory), help_line(help, _T)],
          boolean(s_name, c_name, value, help)  then
            [checkboxr([],label(_T(s_name), no_help), html_Id(""), wan(c_name), wav(c_name),value, mandatory), help_line(help, _T)],
          integer(s_name, c_name, value, help) then  
            [input(label(_T(s_name), no_help), wan(c_name), init(abs_to_decimal(value)), small, mandatory), help_line(help, _T)],
          float(s_name, c_name, value, help) then
            [input(label(_T(s_name), no_help), wan(c_name), init(float_to_string(value, 5)), small, mandatory), help_line(help, _T)],            
          choices_int(s_name, c_name, value, select, help) then 
            [selector_c([],label(_T(s_name), no_help), html_Id(""), wan(c_name), 1, select.get(db), success(init(to_String(value))), mandatory), help_line(help, _T)],
          date(s_name, c_name, value, help) then  
            [input([class("datepicker")], label(_T(s_name), no_help), html_Id(c_name), wan(c_name), init(value), small, non_mandatory), help_line(help, _T)],
          time(s_name, c_name, value, help) then  
            [input([class("timepicker")], label(_T(s_name), no_help), html_Id(c_name), wan(c_name), init(value), small, non_mandatory), help_line(help, _T)],
          datetime(s_name, c_name, value, help) then  
            [input([class("datetimepicker")], label(_T(s_name), no_help), html_Id(c_name), wan(c_name), init(value), custom(18), mandatory), help_line(help, _T)],
        },
     edit_form_lines(db, _T, t, reverse(line)+so_far)
  }.

define HTML_Head_Tag
  get_rich_editor_inline
  (
    List(VT_edit_entry)   list
  )=
  js_inline(jquery_ready(
    join("",map_select((VT_edit_entry entry) |->
    if entry is text_area(s_name, c_name, value, txt_editor, help)  then
      if txt_editor is { none then failure,
        rich_editor then success(" CKEDITOR.replace( '"+c_name+"_editor' );")
      }
    else
      failure, list))
  ))
.
  
define List(HTML_Head_Tag)
  get_editor_header
  (
    List(VT_edit_entry)   list
  )=
  [js(js_file("ckeditor/ckeditor.js")),
      get_rich_editor_inline(list),
  ]
  .
  
public define HTML_Partial_Content 
  edit_table_page
  (
    SQLite3DataBase       db,
    (String) -> String    _T,
    String                lang,
    List(Web_arg)         lwa,
    VT_edit               vt_elist
  ) =
  with table_name  = vt_elist.table_name,
  with button_name = if get_String(lwa, "id","none") = "none" then _T("CREATE") else _T("UPDATE"),
  with button_name_and_new = if get_String(lwa, "id","none") = "none" then _T("CREATE_AND_EDIT_NEW") else _T("UPDATE_AND_EDIT_NEW"),
  

  partial_content(
    jq_datetimepicker_init(lang) +
    get_editor_header(vt_elist.list), //add editor header if need. Like init ck_editor
    cxm_form( table_name, lwa,      
      edit_form_lines(db, _T, vt_elist.list, [])+
     [ one_line_fields([
        submit(save_row, failure, button_name, [("table_name", table_name)]),
        submit(save_row_and_new, failure, button_name_and_new, [("table_name", table_name)]),
        submit(hk_cancel, failure, _T("CANCEL"))
        ])
     ]
     )).
    
public define Maybe(HTML_Partial_Content) 
  edit_table_content 
  (
    SQLite3DataBase       db,
    (String) -> String    _T,
    String                lang,
    List(Web_arg)         lwa,
    String                table,
    String                view_name,    
    VT_action             action,
    VTM                   vtm
  ) =
  if vtm_get_edit(table, vtm.edit_list) is
  {
    failure        then failure,
    success(vtm_e) then 
      since vtm_e is vtm_edit(_, get_edit), 
        success(edit_table_page(db, _T, lang, lwa, get_edit(db, action, view_name)))
  }.

  
  // View table part
define HTML_Row(HTML_Off_Form)  make_line
  (
    String              table_name,
    String              _action_name,            //default is "edit_table", but can be surcharged for own use
    List(VT_view_entry) entries,
    List(HTML_Cell(HTML_Off_Form)) so_far
  )=
  if entries is
  {
    []      then  row( [], reverse(so_far)),
    [h . t] then
      with cell = if h is
                  {
                    text(string)     then cell((HTML_Off_Form)text(not_null_String(string))),
//                    link(id, string) then cell((HTML_Off_Form)actioner(same,same, link(string), action_name, [("table_name", table_name),("id",id)])),
                    link(id, string)                  then cell((HTML_Off_Form)literal(jq_dialog_open(string, dialog_id(_action_name+"_dlg_ajax"), "'id="+id+"'"))),
                    link_id_action(id, name, action)  then cell((HTML_Off_Form)actioner(same,same, link(name), action, [("id",id)])),
                    icon(icon_path)                   then cell((HTML_Off_Form)image([], icon_path, ""))
                  },
      make_line(table_name, _action_name, t, [cell . so_far])
  }.

define List(HTML_Row(HTML_Off_Form))  
  make_lines
  (
    (String) -> String  _T,       //translator  
    String            table_name,
    String            action_name,
    List(VT_view_row) entries,
    List(HTML_Row(HTML_Off_Form))  so_far
  )=
  if entries is
  {
    []      then  reverse(so_far),
    [h . t] then  
      //compute each line
      //prepare here the first cell for actioner
      with actions_cell = (HTML_Cell(HTML_Off_Form))
        cell([],
          sequence([
            partial(img_button_confirm(icn16_cross, _T("CONFIRMATION_REQUEST"), _T("CONFIRM_LINE_DELETION") , _T("OK"), _T("CANCEL"), jQuery_actioner(same, jqlink(controller_action("hk_c", "delete_row" + format_extra_operands([("table_name", table_name),("id",to_String(h.db_id))])))))),
            partial(img_button(icn16_edit, [event(onclick, jq_dialog_open(dialog_id(action_name+"_dlg_ajax"), "'id="+to_String(h.db_id)+"'"))], "", [])),           
          ])
        ),
      make_lines(_T, table_name, action_name, t, [make_line(table_name, action_name, h.list, [actions_cell]). so_far] )
  }.
  
  // View table part
define HTML_Header_Row(HTML_Off_Form)  
  make_header
  (
    (String) -> String                    _T,       //translator
    List(VT_view_entry)                   entries,
    List(HTML_Header_Cell(HTML_Off_Form)) so_far
  )=
  if entries is
  {
    []      then  header_row( [], reverse(so_far)),
    [h . t] then
      with cell = if h is
                  {
                    text(string)      then header_cell((HTML_Off_Form)text(_T(string))),
                    link(id, string)  then header_cell((HTML_Off_Form)actioner(same, same, link(string), edit_table,[])), //TODO
                    link_id_action(id, text, action)  then header_cell((HTML_Off_Form)actioner(same,same, link(text), action,[("id",id)])), //TODO
                    icon(icon_path)   then header_cell((HTML_Off_Form)image([], icon_path, ""))
                  },
      make_header(_T, t, [cell . so_far])
  }.


 
public define HTML_Partial_Content  
  view_table_form
  (
    (String) -> String    _T,
    String                action_name,
    VT_view               rows
  )=
 with action_header_cell = header_cell((HTML_Off_Form)text(_T("ACTION"))),
  partial_content(
      div( [/*class("tableau")*/],
          sequence(
           [ 
              partial(img_button(icn16_add, [event(onclick, jq_dialog_open(dialog_id(action_name+"_dlg_ajax")))], "", [])),           
              //partial(jquery_button(jQuery_button(button, "edit_table_"+rows.table_name, "", _T("NEW"), jQuery_actioner(same, jqlink(controller_action("hk_c", "edit_table&table_name="+rows.table_name)))))),
              //dialog used by datatable entries
              partial(jq_dialog_create(dialog_id(action_name+"_dlg_ajax"), ajax(controller_action("hk_c", "ajax_edit_table&table_name="+rows.table_name)))),
              
              table([core_attrs([id("table_view"), class("tableau display compact nowrap")])],
                    make_header(_T, rows.header.list, [action_header_cell]),
                    make_lines(_T, rows.table_name, action_name, rows.list, []))
           ]
           )
      ))
 .

public define HTML_Partial_Content 
  view_table_page
  (
    (String) -> String    _T,
    String                lang,
    String                web_site_directory,
    String                action_name,
    VT_view               rows
  ) =

//  if tb is tool_box(lang, _T, _, _, db, _) then
//  println("view_table_page - lang : "+lang);
//  println("view_table_page - web_site_directory : "+web_site_directory);
  partial_content(jq_dialog_init + jq_datetimepicker_init(lang),
    [partial(html_wave_box_wide(_T(to_upper(rows.table_name)), 
                       jquery_datatable("table_view", view_table_form(_T, action_name, rows), true, false, jq_dt_pt_full_numbers, false, scrollY(500), true, true, true, lang, no_extra, web_site_directory)))]).
    
public define Maybe(HTML_Partial_Content)
  view_table_content
  (
    SQLite3DataBase       db,  
    (String) -> String    _T,
    String                lang,
    String                web_site_directory,
    String                table,
    String                view_name,
    String                action_name,
    VTM                   vtm       
  ) =
  if vtm_get_view(table, vtm.view_list) is
  {
    failure        then failure,
    success(vtm_v) then 
      since vtm_v is vtm_view(_, get_view), 
        success(view_table_page(_T, lang, web_site_directory, action_name, get_view(db, view_name)))
  }.