From 8116ce4b2b93a70d5459cbd6729e9846aac9912f Mon Sep 17 00:00:00 2001 From: totoro Date: Sat, 10 Jun 2017 17:32:23 +0200 Subject: [PATCH] continuation of the refactoring, and gather database call back in hk_table_controller implement, insert or update, and update to CSV import make clickable the text on Apps view Fix bug on list view with filter which was not applied at first draw add reference to foreign table in foreign_text of HK_Form_Entry --- controller/hk_rows_import.anubis | 124 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------- view/types/hk_form_entry.anubis | 4 ++-- view/types/hk_view.anubis | 9 +++++---- view/view_apps_renderer.anubis | 6 +++--- view/view_rows_import.anubis | 24 +++++++++++++++++++----- view/view_table_manager_types.anubis | 8 ++++++-- view/view_table_renderer.anubis | 145 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------- 7 files changed, 238 insertions(+), 82 deletions(-) diff --git a/controller/hk_rows_import.anubis b/controller/hk_rows_import.anubis index 3479be2..682754b 100644 --- a/controller/hk_rows_import.anubis +++ b/controller/hk_rows_import.anubis @@ -111,20 +111,55 @@ define (Int, List(List(String))) else if cvs_line_reader(unique) is { - end_of_input then (offset, so_far) + end_of_input then println("END OF INPUT "+offset);(offset, so_far) error(e) then //TODO report that error in importation report println("error ["+e+"]\n"); (offset, so_far), ok(_offset, all_values) then + println("extracted line : \""+join("\", ", all_values)+"\""); + //if line_data is (line, all_values) then extract_lines(cvs_line_reader, max_count - 1, columns, _offset, [all_values . so_far]) } . + +define Result(String, One) + update_data_to_table + ( + SQLite3Stmt update_data_stmt, + List(String) columns, + List(String) values + )= + if sqlite3_reset(update_data_stmt) is + { + error(err) then println(db_error(err, "Error reseting update data statement")); error("DB Error"), + ok then + //println("update reset ok"); + if sqlite3_bind(update_data_stmt, map2_select(bind_column_value, columns, values)) is + { + error(err) then println(db_error(err, "Error binding update data statement"));error("DB Error"), + ok then + //println("update bind ok"); + if sqlite3_step(update_data_stmt) is + { + error(err) then + println(db_error(err, "Error executing update data statement")); + error("DB Error"), + no_more_row then + ok(unique), + row(_) then + ok(unique) + } + } + }. + define Result(String, One) - insert_data_to_table + insert_or_update_data_to_table ( SQLite3Stmt insert_data_stmt, + SQLite3Stmt update_data_stmt, + Bool update, //if true make update on constraint violation List(String) columns, List(String) values )= @@ -138,9 +173,20 @@ define Result(String, One) ok then if sqlite3_step(insert_data_stmt) is { - error(err) then println(db_error(err, "Error executing insert data statement")); error("DB Error"), - no_more_row then ok(unique), + error(err) then + //println(db_error(err, "Error executing insert data statement")); + forget(sqlite3_reset(insert_data_stmt)); + + if err.code = 19 & update then + update_data_to_table(update_data_stmt, columns, values) + else + error("DB Error"), + no_more_row then ok(unique) + //println("insert no more row"); + //update_data_to_table(update_data_stmt, columns, values), row(_) then ok(unique) + //println("insert row"); + //update_data_to_table(update_data_stmt, columns, values) } } }. @@ -148,28 +194,33 @@ define Result(String, One) define Maybe(One) store_data ( - SQLite3Stmt insert_data_stmt, - SQLite3Stmt update_data_stmt, +// SQLite3Stmt insert_data_stmt, +// SQLite3Stmt update_data_stmt, +// Bool update, + List(String) -> Result(String, One) import_line_values, // SQLite3Stmt select_contact_id_opt_out_stmt, // SQLite3Stmt select_stmt, // SQLite3Stmt insert_list_contact_stmt, // SQLite3Stmt count_stmt, - List(String) columns, //list of column's name + +// List(String) columns, //list of column's name List(List(String)) rows //list of list of real data to store ) = if rows is { - [] then success(unique), + [] then + println("store data row empty"); + success(unique), [row . t] then - if insert_data_to_table(insert_data_stmt, columns, row) is + if import_line_values(row) is //insert_or_update_data_to_table(insert_data_stmt, update_data_stmt, update, columns, row) is { error(msg) then println("data can't be added "+msg); //TODO as Julien's idea, copy error line in new csv file - store_data(insert_data_stmt, update_data_stmt, columns, t), + store_data(import_line_values, t), ok(_) then - store_data(insert_data_stmt, update_data_stmt, columns, t) + store_data(import_line_values, t) } } . @@ -179,9 +230,9 @@ define CSV_Import_Status ( SQLite3DataBase db, // Int import_id, */ - SQLite3Stmt insert_data_stmt, - SQLite3Stmt update_data_stmt, - +// SQLite3Stmt insert_data_stmt, +// SQLite3Stmt update_data_stmt, + List(String) -> Result(String, One) import_line_values, One -> ReadCsvResult csv_line_reader, //One -> Int progression, UTime start_time, @@ -201,22 +252,25 @@ define CSV_Import_Status //get 500 lines from cvs since extract_lines(csv_line_reader, 500, columns, _offset, []) is (offset, so_far), with extract_length = length(so_far), - println("Extracted lines : "+extract_length); + //println("extraction: offset "+offset+" #lines "+extract_length); if extract_length = 0 then csv_finished else if db_do_transaction( db, - (One _) |-> store_data(insert_data_stmt, update_data_stmt, columns, so_far), + (One _) |-> store_data(import_line_values, so_far), success((SQLite3Error err) |-> println(db_error(err,"import_csv_to_db"))), //success((SQLite3Error err) |-> logError("DB", db_error(err,"import_csv_to_db"))), 60000, // max 60s 100 // retry every 100 ms ) is { - error(_) then csv_db_error, - ok(_) then main_loop(db, insert_data_stmt, update_data_stmt, csv_line_reader, new_time, columns, line_num + extract_length, offset, offset_base) + error(_) then + println("main loop db_do_transaction csv_db_error"); + csv_db_error, + ok(_) then + main_loop(db, import_line_values, csv_line_reader, new_time, columns, line_num + extract_length, offset, offset_base) } . @@ -228,17 +282,17 @@ define CSV_Import_Status // Import_Task import_task, One -> ReadCsvResult csv_line_reader, //(One) -> Int progression, + String import_type, List(String) columns, //columns selected for importation in same order from CSV file + String column_key, UTime start_time, Int offset_base )= //since import_task is import_task(import_task_id, list_id, filename, file_size, csv_db_columns, separator, charset, amount_time, offset, current_line, lines_count, status, status_details, update_contact, opt_out_import), with current_line = (Int)0, with offset = (Int)0, -// if get_domain_id_from_mailing(db, list_id) is -// { -// failure then logError(debug_log, "domain_id not found in import_csv_to_mailing_list"); csv_error, -// success(domain_id) then + with key = if column_key = "" then "id" else column_key, + with filter_columns = map_select((String s) |-> if s = "" then failure else success(s), columns), sql_columns = join(", ", filter_columns), sql_values = join(", ", map((String s) |-> ":"+s, filter_columns)), @@ -246,25 +300,36 @@ define CSV_Import_Status if sqlite3_prepare(db, "INSERT INTO "+table_name+" ("+sql_columns+") VALUES ("+sql_values+");") is { - error(err) then //logError(debug_log, db_error(err, "preparing insert contact statement for import_csv_to_mailing_list")); + error(err) then //logError(debug_log, db_error(err, "preparing insert contact statement for import _csv_to_mailing_list")); println(db_error(err, "preparing insert data statement for import_csv_to_mailing_list")); csv_db_error, ok(insert_data_stmt) then - - if sqlite3_prepare(db, "UPDATE "+table_name+" SET " + sql_update_values + " WHERE id=:id;") is +// with update_query = "UPDATE "+table_name+" SET " + sql_update_values + " WHERE changes()=0 AND "+key+"=:"+key+";", + with update_query = "UPDATE "+table_name+" SET " + sql_update_values + " WHERE "+key+"=:"+key+";", + println(" update query : "+update_query); + if sqlite3_prepare(db, update_query) is { error(err) then //logError(debug_log, db_error(err, "preparing update contact statement for import_csv_to_mailing_list")); println(db_error(err, "preparing update data statement for import_csv_to_db_transaction")); csv_db_error, ok(update_data_stmt) then /* run the main loop */ - main_loop(db, /*import_task_id, */ insert_data_stmt, update_data_stmt, csv_line_reader, start_time, columns, current_line, offset, offset_base) + with import_line_values = + if import_type = "insert_or_update" then + (List(String) row) |-> insert_or_update_data_to_table(insert_data_stmt, update_data_stmt, true, columns, row) + else if import_type = "insert" then + (List(String) row) |-> insert_or_update_data_to_table(insert_data_stmt, update_data_stmt, false, columns, row) + else if import_type = "update" then + (List(String) row) |-> update_data_to_table(update_data_stmt, columns, row) + else + (List(String) row) |-> insert_or_update_data_to_table(insert_data_stmt, update_data_stmt, true, columns, row), + + main_loop(db, import_line_values, csv_line_reader, start_time, columns, current_line, offset, offset_base) } } // } . - public define Result(String, String) hkc_import_execute ( @@ -282,7 +347,9 @@ public define Result(String, String) with separator = get_String(lwa, "csv_sep", ";"), with csv_db_columns = get_columns_list(lwa), with columns = get_db_columns(csv_db_columns, []), + column_key = get_String(lwa, "column_key", ""), table_name = get_String(lwa, "table_name", ""), + import_type = get_String(lwa, "import_type", "insert_or_update"), with start_time = unow, offset_base = (Int)0, skip_first_line = get_Bool(lwa, "hk_remove_csv_header", true), @@ -306,9 +373,8 @@ public define Result(String, String) forget(csv_line_reader(unique)) else unique); - with status = import_csv_to_db_transaction(db, table_name, csv_line_reader, columns, start_time, offset_base), + with status = import_csv_to_db_transaction(db, table_name, csv_line_reader, import_type, columns, column_key, start_time, offset_base), ok("imported") - } } . diff --git a/view/types/hk_form_entry.anubis b/view/types/hk_form_entry.anubis index d0bef73..ece70b9 100644 --- a/view/types/hk_form_entry.anubis +++ b/view/types/hk_form_entry.anubis @@ -24,7 +24,7 @@ public type HK_Form_Entry: //legacy VT_Edit information (String s_name, String c_name, String v_name, Int width, HK_Help_Text help), //s_name = show_name for translation, v_name = string to show text (String s_name, String c_name, String value, HK_Help_Text help), //s_name = show_name for translation, c_name = table column name password (String s_name, String c_name, HK_Help_Text help), //s_name = show_name for translation, c_name = table column name - foreign_text(String s_name, String c_name, DB_id selected, HK_Form_Selector selector, HK_Help_Text help), + foreign_text(String s_name, String c_name, DB_id selected, String f_table_name, HK_Form_Selector selector, HK_Help_Text help), foreign_text_search(String s_name, String c_name, DB_id selected, String f_table_name, List(String) search_fields, HK_Help_Text help), choices_text(String s_name, String c_name, String selected, HK_Form_Selector selector, HK_Help_Text help), text_area (String s_name, String c_name, String value, HK_Text_Field_Attr area_att, HK_Help_Text help), //s_name = show_name for translate, c_name = table column name @@ -41,7 +41,7 @@ public type HK_Form_Entry: //legacy VT_Edit . public define HK_Form_Entry text (String s_name, String c_name, String value) = text (s_name, c_name, value, no_help_text). -public define HK_Form_Entry foreign_text(String s_name, String c_name, DB_id selected, HK_Form_Selector selector) = foreign_text(s_name, c_name, selected, selector, no_help_text). +public define HK_Form_Entry foreign_text(String s_name, String c_name, DB_id selected, String foreign_table_name, HK_Form_Selector selector) = foreign_text(s_name, c_name, selected, foreign_table_name, selector, no_help_text). public define HK_Form_Entry text_area (String s_name, String c_name, String value) = text_area (s_name, c_name, value, none, no_help_text). public define HK_Form_Entry boolean (String s_name, String c_name, Bool value) = boolean (s_name, c_name, value, no_help_text). public define HK_Form_Entry integer (String s_name, String c_name, Int value) = integer (s_name, c_name, value, no_help_text). diff --git a/view/types/hk_view.anubis b/view/types/hk_view.anubis index 639ffaf..05eff65 100644 --- a/view/types/hk_view.anubis +++ b/view/types/hk_view.anubis @@ -91,16 +91,17 @@ public type VT_view_row_header: public type VT_view_row: vt_view_row(Int db_id, List(VT_view_entry) list). +/* public type VT_View_DB_Calls: vt_view_db_calls( - (SQLite3DataBase db, String clause) -> Int get_count, - (SQLite3DataBase db, HK_Referer referer, String clause, String order_by) -> JsonMember get_rows_json + (SQLite3DataBase db, String clause) -> Int get_count, + (SQLite3DataBase db, HK_Referer referer, String clause, String order_by) -> JsonValue get_rows_json // (SQLite3DataBase db, String clause) -> List(VT_view_row) get_rows ) -. +. */ public type VT_view: - vt_view(String table_name, String view_name, VT_view_model view_model, VT_view_row_header header, VT_View_DB_Calls db_calls). + vt_view(String table_name, String view_name, VT_view_model view_model, VT_view_row_header header). public type HK_Form_action: diff --git a/view/view_apps_renderer.anubis b/view/view_apps_renderer.anubis index 3100b9e..4c83ad4 100644 --- a/view/view_apps_renderer.anubis +++ b/view/view_apps_renderer.anubis @@ -35,19 +35,19 @@ define List(HTML_Row(HTML_Off_Form)) cell( sequence([ partial(img_button(icn16_add, [event(onclick, jq_dialog_open(dialog_id("edit_table_dlg_ajax"), "'table_name="+table_name+"'"))], "", [])), - text(_T("ADD")), + actioner(link([core_attrs([event(onclick, jq_dialog_open(dialog_id("edit_table_dlg_ajax"), "'table_name="+table_name+"'"))])],_T("ADD")), no_action, []) ]) ), cell( sequence([ partial(img_button(icn16_view_list, hkc_list_view, [("table_name",table_name)])), - text(_T("LIST")) + actioner(link(_T("LIST")), hkc_list_view, [("table_name",table_name)]) ]) ), cell( sequence([ partial(img_button("icons/16x16/table_import.png", hkc_import_dropzone, [("table_name",table_name)])), - text(_T("CSV_IMPORT")) + actioner(link(_T("CSV_IMPORT")), hkc_import_dropzone, [("table_name",table_name)]) ]) ), cell(text(_T("RECORDS_COUNT")+" ")), diff --git a/view/view_rows_import.anubis b/view/view_rows_import.anubis index dc06c78..80825d7 100644 --- a/view/view_rows_import.anubis +++ b/view/view_rows_import.anubis @@ -10,10 +10,12 @@ read locale/L3.anubis read locale/L3LanguageInfo.anubis //date and time formating read system/data_io.anubis read tools/line_reader.anubis +read tools/basis.anubis read calexium_lib/database/csv_tools.anubis read calexium_lib/web/CXM_making_a_web_site.anubis read calexium_lib/web/CXM_jquery.anubis +read calexium_lib/web/CXM_form.anubis read calexium_lib/web/jQuery/CXM_jquery_button.anubis read calexium_lib/web/widgets/css_helper.anubis read calexium_lib/web/widgets/icons_set.anubis @@ -36,6 +38,18 @@ public define List((List(CoreAttrs), WebArgValue, String)) +public define List((List(CoreAttrs), WebArgValue, String)) + csv_import_type_combo + ( + (String) -> String _T + ) + = + (List((List(CoreAttrs), WebArgValue, String)))[ + ([],wav("insert_or_update"), _T("INSERT_OR_UPDATE")), + ([],wav("insert"), _T("INSERT")), + ([],wav("update"), _T("UPDATE")), + ]. + public define HTML_Partial_Content import_zone ( @@ -140,7 +154,7 @@ define List(HTML_Row(HTML_In_Form)) text(_T("IGNORED_COLUMN")), hidden(html_Id("hk_"+hidden_name+"_input"), wan(""), wav(hidden_name)) ])), - cell([class("icon ")],image([class("dnd-dst-btn")],"/icons/16x16/delete_cross.png","")) + cell(image([class("dnd-dst-btn")],"/icons/16x16/delete_cross.png","")) ]) . so_far], index+1, _T) }. @@ -173,6 +187,7 @@ public define HTML_Partial_Content (String) -> String _T, )= partial_content([css(css_file("css/cxm/cxm_dnd.css")), + css(css_file("css/changelists.css")), js(js_file("js/cxm/cxm_dnd.js")), js(js_file("js/data_import.js")) ], @@ -188,6 +203,8 @@ public define HTML_Partial_Content row([], [cell(empty), cell(text(_T("DELIMITER"))), cell(selector_c([], no_label, html_Id("import_delimiter"), wan("csv_sep"), 1, csv_delimiter_combo(_T), init(separator)),)]), row([], [cell(empty), cell(text(_T("FILE_ENCODING"))), cell(text("choose encoding"))]), row([], [cell(empty), cell(text(_T("REMOVE_CSV_HEADER"))), cell(check_box([], no_label, html_Id(""), wan("hk_remove_csv_header"), wav("1"), true))]), + row([], [cell(empty), cell(text(_T("IMPORT_TYPE"))), cell(selector_c([], no_label, html_Id("import_type"), wan("import_type"), 1, csv_import_type_combo(_T), init(separator)),)]), + // row([], [cell(empty), cell(text(_T("OPT_OUT"))), cell(check_box([], no_label, html_Id(""), wan("import_opt_out"), wav("1"), false))])] //end of row ]), br, @@ -202,10 +219,7 @@ public define HTML_Partial_Content div_empty([class("clear")]) ])), - //partial(jquery_button(jquery_img_button(icn16_cross, _T("CANCEL"), "", jQuery_actioner(same, jqlink, "go_edit_mailing_list&list_id="+list_id.id), left))), - //partial(jquery_button(jquery_img_button(icn16_check, _T("IMPORT"), "", jQuery_actioner(same, jqform, "import_csv_form"), left))) - - ])), //end of sequence in form + ])), //end of sequence in form // )]) partial(jquery_button(jquery_img_button(icn16_cross, _T("CANCEL"), "", jQuery_actioner(same, jqlink(cancel_action)), left))), partial(img_submit_button(_T("IMPORT"), "import_csv_form")) diff --git a/view/view_table_manager_types.anubis b/view/view_table_manager_types.anubis index 33aa348..caae499 100644 --- a/view/view_table_manager_types.anubis +++ b/view/view_table_manager_types.anubis @@ -12,6 +12,10 @@ transmit hayamiki_lib/view/types/hk_filter.anubis transmit calexium_lib/web/CXM_common.anubis read hayamiki_lib/types/hayamiki.anubis + +read calexium_lib/web/CXM_common.anubis +read calexium_lib/database/db_types.anubis + public type VTM_edit: vtm_edit(String table_name, (SQLite3DataBase db, HK_Form_action action, String edit_view_name) -> HK_Form get_edit). @@ -40,8 +44,8 @@ public type HK_Table_controller: (SQLite3DataBase db, List(Web_arg) lwa) -> Maybe(One) write_from_fields, //Read (SQLite3DataBase db, String clause) -> Int get_count, - (SQLite3DataBase db, HK_Referer referer, String clause, String order_by) -> JsonMember get_rows_json, - + (SQLite3DataBase db, List(String) columns, DB_id) -> JsonValue get_one_json, + (SQLite3DataBase db, List(String) columns, HK_Referer referer, String clause, String order_by) -> JsonValue get_rows_json, //Update //Delete (SQLite3DataBase db, List(Int) l_int) -> Maybe(One) delete diff --git a/view/view_table_renderer.anubis b/view/view_table_renderer.anubis index 8f4d516..1fc5e0b 100644 --- a/view/view_table_renderer.anubis +++ b/view/view_table_renderer.anubis @@ -18,6 +18,7 @@ read system/string.anubis read locale/L3.anubis read tools/basis.anubis read tools/list.anubis +read tools/printable_tree.anubis read data_base/sqlite.anubis read system_colors/rgb.anubis read system/convert.anubis @@ -97,12 +98,17 @@ public define HK_Filter get_filter_from_name ( VTM_view vtm_v, //virtual table manager view - String view_name, // - String filter_name + String view_name, //view name where belonging the filters + String filter_name //the filter name to get )= with all_view_name = vtm_v.get_all_view_name(unique), with filters = get_view_filters(view_name, all_view_name), - + + //we don't have any filter name to search for, hence we get the first entry + if filter_name = "" then + force_nth(0, filters, hk_filter("", "")) + else + //else try to get the filter according to his name get_filter_from_name(filters, filter_name) . @@ -287,9 +293,8 @@ define String autoResizing: { compact: true, resetWidthOrg: true }, autoresizeOnLoad: true, autowidth:true, - /*idPrefix: '_g_"+uid+"_',*/ - pager: '#"+uid+"_pager', - pager: true, + viewrecords: true, + /*pager: true,*/ toppager: true, /*shrinkToFit:false,*/ @@ -400,7 +405,7 @@ url:'?aws_controller=hk_c&aws_action=grid_view&table_name="+rows.table_name+"&vi return $(cellObject.html()).css(\"backgroundColor\").substring(1); } function formatPhone(cellValue, options, rowObject) { - var phoneInput = '' + cellValue + ''; + var phoneInput = '' + cellValue + ''; return phoneInput; } function unformatPhone(cellValue, options, cellObject) { @@ -409,7 +414,7 @@ url:'?aws_controller=hk_c&aws_action=grid_view&table_name="+rows.table_name+"&vi return ret; } function formatEmail(cellValue, options, rowObject) { - var phoneInput = '' + cellValue + ''; + var phoneInput = '' + cellValue + ''; return phoneInput; } function unformatEmail(cellValue, options, cellObject) { @@ -422,7 +427,7 @@ url:'?aws_controller=hk_c&aws_action=grid_view&table_name="+rows.table_name+"&vi div([], sequence([ table([core_attrs([id(uid+"_grid")])],[]), - div_empty([id(uid+"_pager")]) + //DR 20170528 div_empty([id(uid+"_pager")]) ]) ) ) @@ -623,10 +628,26 @@ public define List(CXM_Form_Field) password_entries ], - 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, table_referer, fk_clause), success(init(to_String(value))), mandatory), help_line(help, _T)], - foreign_text_search(s_name, c_name, select, table_name, fields, help) then - [raw_in_form(literal(""))] + foreign_text(s_name, c_name, value, foreign_table_name, select, help) then + with uid = generate_random_string(20)+"_", + + [selector_c([],label(_T(s_name), no_help), html_Id(""), wan(c_name), 1, select.get(db, table_referer, fk_clause), success(init(to_String(value))), mandatory), help_line(help, _T), + + partial(jq_dialog_create(dialog_id(uid+foreign_table_name+"_dlg_ajax"), ajax(controller_action("hk_c", "ajax_edit_table&sub_dialog=true&table_name="+foreign_table_name)))), + partial(img_button(icn16_add, [event(onclick, jq_dialog_open(dialog_id(uid+foreign_table_name+"_dlg_ajax")))], "", [])), + ], + foreign_text_search(s_name, c_name, select, foreign_table_name, fields, help) then + with uid = generate_random_string(20)+"_", + [ + raw_in_form(sequence([ + literal(to_String(format_label(label(_T(s_name), no_help), html_Id("")))+ + ""), + partial(jq_dialog_create(dialog_id(uid+foreign_table_name+"_dlg_ajax"), ajax(controller_action("hk_c", "ajax_edit_table&sub_dialog=true&table_name="+foreign_table_name)))), + partial(img_button(icn16_add, [event(onclick, jq_dialog_open(dialog_id(uid+foreign_table_name+"_dlg_ajax")))], "", [])), + ]) + ), + 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, no_referer, ""), success(init(value)), mandatory), help_line(help, _T)], text_area(s_name, c_name, value, txt_editor, help) then @@ -649,9 +670,9 @@ public define List(CXM_Form_Field) color( s_name, c_name, value, help) then [input([class("jscolor")], label(_T(s_name), no_help), wan(c_name), init(not_null_String(value)), narrow, mandatory), help_line(help, _T)], phone( s_name, c_name, value, help) then - [input([class("hk_input_phone")], label(_T(s_name), no_help), wan(c_name), init(not_null_String(value)), narrow, mandatory), help_line(help, _T)], + [phone_input([event(onclick, "hk_phone_call(this)")], [class("hk_input_phone")], label(_T(s_name), no_help), html_Id(c_name), wan(c_name), init(not_null_String(value)), narrow, mandatory), help_line(help, _T)], email( s_name, c_name, value, help) then - [input([class("hk_input_email")], label(_T(s_name), no_help), wan(c_name), init(not_null_String(value)), narrow, mandatory), help_line(help, _T)], + [email_input([event(onclick, "hk_send_email(this)")], [class("hk_input_email")], label(_T(s_name), no_help), html_Id(c_name), wan(c_name), init(not_null_String(value)), narrow, mandatory), help_line(help, _T)], }, edit_form_lines(db, fk_clause, table_referer, _T, t, new_entry, reverse(line)+so_far) }. @@ -710,6 +731,26 @@ define List(String) _lines) . +define String + ajax_combo_init_parameter + ( + String f_table, //db table name + String c_name, //column name in the table + List(String) s_fields //search fields + )= +"$('#acb_"+c_name+"').ajaxComboBox( '?aws_controller=hk_c&aws_action=combo_search', + { + lang: 'fr', + per_page: 15, + db_table: '"+f_table+"', + button_img: 'ajax-combobox/btn.png', + field: '"+force_nth(0, s_fields, "name")+"', + search_field: '"+join(", ", s_fields)+"', + hidden_name: '"+c_name+"', + show_string: '"+join(", ", s_fields)+"', + and_or: 'OR' + });" +. define List(String) _get_combo_header @@ -724,15 +765,8 @@ define List(String) if cell is { hk_form_table_cell(_, form_entry) then - if form_entry is foreign_text(s_name, c_name, value, select, help) then - with result = -"$('#acb_"+c_name+"').ajaxComboBox( '?aws_controller=hkc&aws_action=combo_action', - { - lang: 'fr', - db_table: '"+table_name+"', - button_img: 'ajax-combobox/btn.png' - });", - [result] + if form_entry is foreign_text_search(s_name, c_name, select, f_table, s_fields, help) then + [ajax_combo_init_parameter(f_table, c_name, s_fields)] else [], hk_form_table_cell_table(_, t_lines) then @@ -755,6 +789,7 @@ define List(HTML_Head_Tag) else [] . + define List(HTML_Head_Tag) get_combo_header ( @@ -770,6 +805,38 @@ define List(HTML_Head_Tag) else [] . + +define List(String) + _get_combo_header + ( + String table_name, + List(HK_Form_Entry) _entries + )= + map_append((HK_Form_Entry entry) + |-> + if entry is foreign_text_search(s_name, c_name, select, f_table, s_fields, help) then + [ajax_combo_init_parameter(f_table, c_name, s_fields)] + else + [] + , + _entries) +. + +define List(HTML_Head_Tag) + get_combo_header + ( + String table_name, + List(HK_Form_Entry) _lines + )= + with result = _get_combo_header(table_name, _lines), + if length(result) > 0 then + [js(js_file("ajax-combobox/js/jquery.ajax-combobox.js")), + css(css_file("ajax-combobox/css/jquery.ajax-combobox.css")), + js_inline(jquery_ready(join("",result))) + ] + else + [] + . public define HTML_Partial_Content renderer_edit_list_form @@ -793,6 +860,8 @@ public define HTML_Partial_Content //true if need to create row or false for updating with create = if get_String(lwa, "id","none") = "none" then true else false, with id = get_String(lwa, "id","none"), + with sub_dialog = get_String(lwa, "sub_dialog", "false"), + with button_name = if create then _T("CREATE") else _T("UPDATE"), with button_name_and_new = if create then _T("CREATE_AND_EDIT_NEW") else _T("UPDATE_AND_EDIT_NEW"), @@ -807,13 +876,14 @@ public define HTML_Partial_Content $('#my-awesome-dropzone').dropzone(); ")), ]+ jq_datetimepicker_init(lang) + - get_editor_header(list_entries), //add editor header if need. Like init ck_editor + get_editor_header(list_entries)+ //add editor header if need. Like init ck_editor + get_combo_header(table_name, list_entries), sequence([ cxm_form( table_name, lwa, [ one_line_fields([ - submit(if create then hkc_save_row else hkc_update_row, failure, button_name, [("table_name", table_name)]), - submit(if create then hkc_save_row_and_new else hkc_update_row_and_new, failure, button_name_and_new, [("table_name", table_name)]), - submit(hkc_cancel, failure, _T("CANCEL")) + submit(if create then hkc_save_row else hkc_update_row, failure, button_name, [("table_name", table_name), ("sub_dialog", sub_dialog)]), + submit(if create then hkc_save_row_and_new else hkc_update_row_and_new, failure, button_name_and_new, [("table_name", table_name), ("sub_dialog", sub_dialog)]), + submit(hkc_cancel, failure, _T("CANCEL"), [("sub_dialog", sub_dialog)]) ]), hr ]+edit_form_lines(db, "", table_referer, _T, list_entries, create, []) @@ -834,9 +904,9 @@ public define HTML_Partial_Content ,list_tabs))+ [ hr, one_line_fields([ - submit(if create then hkc_save_row else hkc_update_row, failure, button_name, [("table_name", table_name)]), - submit(if create then hkc_save_row_and_new else hkc_update_row_and_new, failure, button_name_and_new, [("table_name", table_name)]), - submit(hkc_cancel, failure, _T("CANCEL")) + submit(if create then hkc_save_row else hkc_update_row, failure, button_name, [("table_name", table_name), ("sub_dialog", sub_dialog)]), + submit(if create then hkc_save_row_and_new else hkc_update_row_and_new, failure, button_name_and_new, [("table_name", table_name), ("sub_dialog", sub_dialog)]), + submit(hkc_cancel, failure, _T("CANCEL"), [("sub_dialog", sub_dialog)]) ]) ] ), @@ -887,11 +957,12 @@ public define List(CXM_Form_Field) password_entries ], - foreign_text(s_name, c_name, value, select, help) then + foreign_text(s_name, c_name, value, foreign_table_name, select, help) then [selector_c([],no_label, html_Id(""), wan(c_name), 1, select.get(db, table_referer, fk_clause), success(init(to_String(value))), mandatory), help_line(help, _T)], - //[selector_c([],label(_T(s_name), no_help), html_Id(""), wan(c_name), 1, select.get(db, table_referer, fk_clause), success(init(to_String(value))), mandatory), help_line(help, _T)], - foreign_text_search(s_name, c_name, select, f_table, s_fields, help) then - [raw_in_form(literal(""))], + + foreign_text_search(s_name, c_name, select, foreign_table_name, s_fields, help) then + [raw_in_form(literal(""))] +// [raw_in_form(literal(""))], choices_text(s_name, c_name, value, select, help) then [selector_c([],no_label, html_Id(""), wan(c_name), 1, select.get(db, no_referer, ""), success(init(value)), mandatory), help_line(help, _T)], @@ -915,9 +986,9 @@ public define List(CXM_Form_Field) color( s_name, c_name, value, help) then [input([class("jscolor")], no_label, wan(c_name), init(not_null_String(value)), narrow, mandatory), help_line(help, _T)], phone( s_name, c_name, value, help) then - [input([class("hk_input_phone")], no_label, wan(c_name), init(not_null_String(value)), narrow, mandatory), help_line(help, _T)], + [phone_input([event(onclick, "hk_phone_call(this)"), class("phone_click")], [class("hk_input_phone")], label(_T(s_name), no_help), html_Id(c_name), wan(c_name), init(not_null_String(value)), narrow, mandatory), help_line(help, _T)], email( s_name, c_name, value, help) then - [input([class("hk_input_email")], no_label, wan(c_name), init(not_null_String(value)), narrow, mandatory), help_line(help, _T)], + [email_input([event(onclick, "hk_send_email(this)"), class("email_click")], [class("hk_input_email")], label(_T(s_name), no_help), html_Id(c_name), wan(c_name), init(not_null_String(value)), narrow, mandatory), help_line(help, _T)], }. -- libgit2 0.21.4