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