const event_speaker = (function ($, window, jQuery) { return { "getForm" : function(){ var form = $("form#eventForm"); return { obj : form, data : form.data("event_speaker")}; }, "model" : { "indexs" : function(){ return {speaker_assignee_id : "",speaker_id : "", sort_order:"", speaker : ""}; }, "init" : function(){ var eventForm = event_speaker.getForm(); (eventForm.obj).data("event_speaker", []); //initialize grid event_speaker.grid.init("addEvent"); }, "action" : { "client" : { //means local storage "reset" : function() { (event_speaker.getForm().obj).removeData("event_speaker"); }, "generate_tmp_id" : function(){ var eventForm = event_speaker.getForm(), len = (eventForm.data).length, min = ((len-2) <=0)?0:(len-2), max = len+1; return Math.random() * (max - min) + min; }, "check_duplicate" : function(obj){ var input = obj.val().trim(), found = 0; if(input !=""){ //do not allow empty input var hidden_data = obj.data("prev"); if(typeof hidden_data != "undefined"){ if(escape(hidden_data) == escape(input)){ return false; //no changes made close } } var eventForm = (events.get_vars().event_speaker_list)[0].data(); $.map(eventForm, function(value){ if(escape(value.speaker) == escape(input)){ app._notify("error", app.get_vars().events.val.required_event_speaker); found=1; return false; //not accepted } }); if(found == 0) { return true; //accepted } } return false; //not accepted }, "add" : function(action){ var input = $("#speaker"); if(event_speaker.model.action.client.check_duplicate(input)) { var eventForm = event_speaker.getForm(), indexs = event_speaker.model.indexs(); //get inputs from speaker using the datastore template indexs["speaker"] = input.val().trim(); //create temporary id for edit and delete purposes, happens when sorting is activated indexs["speaker_assignee_id"] = event_speaker.model.action.client.generate_tmp_id(); //push new data from temp. datastore (eventForm.data).push(indexs); //now, update datastore (eventForm.obj).data("event_speaker", eventForm.data); //then, reload grid event_speaker.grid.reload("addEvent"); input.val("").focus(); } input.focus(); }, "delete" : function(row){ var eventForm = event_speaker.getForm(); var tobe_deleted_row = (events.get_vars().event_speaker_list)[0].row(row).data(); // delete a row or an element from the datastore $.map(eventForm.data, function(value, key){ if(typeof value!= "undefined"){ // console.log(value); if(tobe_deleted_row.speaker_assignee_id == value.speaker_assignee_id){ eventForm.data.splice(key, 1); return false; } } }); //now, update datastore (eventForm.obj).data("event_speaker", eventForm.data); //then, reload grid event_speaker.grid.reload("addEvent"); }, "update" : function(input, row){ if(event_speaker.model.action.client.check_duplicate(input)) { var eventForm = event_speaker.getForm(); var edited_row = (events.get_vars().event_speaker_list)[0].row(row).data(); //update specific event speaker from the datastore $.map(eventForm.data, function(value, key){ if(typeof value!= "undefined"){ if(edited_row.speaker_assignee_id == value.speaker_assignee_id){ eventForm.data[key]["speaker"] = input.val().trim(); return false; } } }); //now, update datastore (eventForm.obj).data("event_speaker", eventForm.data); //then, reload grid event_speaker.grid.reload("addEvent"); } }, /*clean up event data before saving*/ "clean_event_speaker_data" : function(){ var eventForm = event_speaker.getForm(), indexs = eventForm.data; //clean datastore before submitting to server $.map(eventForm.data, function(value, key){ delete eventForm.data[key]["speaker_assignee_id"]; delete eventForm.data[key]["speaker_id"]; delete eventForm.data[key]["sort_order"]; }); return eventForm.data; } }, "server" : { "add" : function(form){ var input = $("#speaker"); if(event_speaker.model.action.client.check_duplicate(input)) { var url_param = events.get_vars().event_id; var http_data = {"event_speaker" : [ {"speaker" : input.val().trim()} ] } var http_result = event_speaker.model.action.server.request("add_event_speaker", http_data, url_param); http_result.success(function(res){ app._notify(res.mtype, res.message); //then, reload grid event_speaker.grid.reload("editEvent"); input.val("").focus(); }).error(function(xhr){ console.log(xhr); }); } input.focus(); }, "update" : function(input, row){ if(event_speaker.model.action.client.check_duplicate(input)) { var edited_row = (events.get_vars().event_speaker_list)[0].row(row).data(); var url_param = edited_row.speaker_assignee_id; var http_data = {"speaker" : input.val().trim(), "speaker_id" : edited_row.speaker_id, "event_id" : $("#eventForm").data("event_id")}; var http_result = event_speaker.model.action.server.request("update_event_speaker", http_data, url_param); http_result.success(function(res){ app._notify(res.mtype, res.message); //then, reload grid event_speaker.grid.reload("editEvent"); }).error(function(xhr){ console.log(xhr); }); } }, "delete" : function(row){ var edited_row = (events.get_vars().event_speaker_list)[0].row(row).data(); var url_param = edited_row.speaker_assignee_id; var http_data = {"speaker_id" : edited_row.speaker_id}; var http_result = event_speaker.model.action.server.request("delete_event_speaker", http_data, url_param); http_result.success(function(res){ app._notify(res.mtype, res.message); //then, reload grid event_speaker.grid.reload("editEvent"); }).error(function(xhr){ console.log(xhr); }); }, "request" : function(action, http_data, url_param){ return $.ajax({ async:false, type : "POST", data : http_data, url : app.get_vars().baseurl+action+((url_param!="")?"/"+url_param: "") }); } } } }, "grid" : { init : function(action){ try{ //check datatable is initialzed var table; if (action == "addEvent") { table = $("#event_speaker_list").DataTable($.extend(event_speaker.grid.opt(action), event_speaker.grid.extra(action))).clear(); } else{ var result = localStorage.getItem("event_speaker"); if(result != null){ table = $("#event_speaker_list").DataTable().ajax.url(app.get_vars().baseurl + "list_event_speaker/" + ((events.get_vars().event_id !=null && typeof events.get_vars().event_id != "undefined" )?events.get_vars().event_id:0)).load(); }else{ localStorage.setItem("event_speaker", "initialzed"); table = $("#event_speaker_list").DataTable($.extend(event_speaker.grid.opt(action), event_speaker.grid.extra(action))); } } event_speaker.grid.init_vars(table, action); }catch(e){ console.log(e); } }, "init_vars" : function(table, action){ //set table instance in the global variable along with the action [addEvent/editEvent] events.set_vars({"event_speaker_list": [(typeof table!="undefined")?table:null, action]}); }, reload : function(action){ var table = $("#event_speaker_list").DataTable(); if(action == "addEvent"){ var eventForm = event_speaker.getForm(); if((eventForm.data).length != 0) { table.clear().draw(); $.map(eventForm.data, function (value) { table.row.add(value).columns.adjust().draw(); }); } else { table.clear().columns.adjust().draw(); } } else { table.ajax.reload(null, false); } //displayHack : recalculate the dimensions of event_speaker_list table/grid // events.get_vars().event_speaker_list[0].columns.adjust().draw(); }, "opt" : function(action){ return { "autoWidth": false, "sDom": 'ip<"toolbar">', "pageLength": 5, "destroy": true, "responsive": true, "searching": false, "processing": true, //Feature control the processing indicator. "oLanguage": fr_onload_lang.oLanguage, "aaSorting":[], // "order" : [3, "asc"], "columns": [ {"data": "speaker_assignee_id", defaultContent: null, "orderable": false, "visible" : false, "render" : function(data, type, full, meta){ return data; } }, {"data": "speaker_id", defaultContent: null, "orderable": false, "visible" : false, "render" : function(data, type, full, meta){ return data; } }, {"data" : "sort_order", defaultContent: null, orderable : false,"visible" : false ,render : function(data, type, full, meta){ // console.log(full.action); return (meta.row+1); } }, {data: 'speaker', "orderable": true}, {"data": "action", defaultContent: null, "orderable": false, "render": event_speaker.grid.action } ], "columnDefs": [ { "targets": [3], className: "truncate-content-text custom-popover-tooltip", width: "80%" }, {"targets": [4], "orderable": false, width: "11%"} ], "drawCallback": function( settings ) { event_speaker.grid.remove_inline_edit(); var table = $("#event_speaker_list").DataTable({ "aaSorting": [] }); $('#event_speaker_list tbody tr').off('click').on('click', 'td:eq(0)', function () { if(!$(this).hasClass("dataTables_empty")){ var rowIdx = $(this).parent(); var row = table.row( rowIdx ).index(); event_speaker.modal.init(this, row, "edit"); } }); }, initComplete: function(){ //set table instance in the global variable along with the action [addEvent/editEvent] event_speaker.grid.init_vars($("#event_speaker_list").DataTable(), action); } }; }, "remove_inline_edit" : function(){ var find_textfield = $("#editspeaker"); if (find_textfield.length > 0) { var val = find_textfield.data("prev"); $("#editspeaker").removeData("prev").parent().text(val); } }, "extra" : function(action){ if(action == "editEvent") { return { "serverSide": true, //Feature control DataTables' server-side processing mode. "ajax": { // Load data for the table's content from an Ajax source "url": app.get_vars().baseurl + "list_event_speaker/" + events.get_vars().event_id, "type": "POST" } }; } else { return {data : event_speaker.getForm().data}; } }, "action" : function(data, type, full, meta){ var table = (events.get_vars().event_speaker_list), actions = {}, action_btns = ""; switch(table[1]){ case "addEvent" : actions.edit = "event_speaker.grid.trigger_edit(this)"; actions.delete = "event_speaker.model.action.client.delete("+meta.row+")"; break; case "editEvent" : actions.edit = "event_speaker.grid.trigger_edit(this)"; actions.delete = "event_speaker.modal.delete_confirm(\'server\', "+meta.row+")"; break; default : "" break; }; action_btns +=app.grid.create_action_btn(app.get_vars()._app.action._edit, "pencil", "success", actions.edit); action_btns +=app.grid.create_action_btn(app.get_vars()._app.action._delete, "trash", "danger", actions.delete); return action_btns; }, "trigger_edit" : function(td){ var table = $("#event_speaker_list").DataTable(); var rowIdx = ($(td).parent().parent().parent()).index(); var target = $('#event_speaker_list tbody tr:eq('+rowIdx+') td:eq(0)'); if(target.find("#editspeaker").length > 0){ $("#editspeaker").focus(); } else { target.trigger("click"); } } }, "modal" : { "init" : function(obj, row, action){ var rowData = (events.get_vars().event_speaker_list[0]).row(row).data(); var _this = $(obj), index = _this.index(); var find_textfield = $("#editspeaker"); //revert the previous data of the column once the user change target if(find_textfield.length > 0) { var get_index = (find_textfield.parent().parent()).index(); if(row!=get_index){ var val = find_textfield.data("prev"); $("#editspeaker").removeData("prev").parent().html("").html(val); } // return false; } /*check whether the selected td or column has no input element at first check. if really none, then,assign an input field right away */ if($(obj).find("#editspeaker").length!=1) { var event_listener = `onkeypress='event_speaker.modal.action(1, event, "${row}");'`; _this.html(``); // $("#editspeaker").trigger("focus"); var num = $('#editspeaker').val(); $('#editspeaker').focus().val("").val(num); } }, "delete_confirm" : function(action, row){ app.modal.confirm_box({ "message" : app.get_vars().events.cma_msg.delete_event_speaker+" [#"+(row+1)+"] ?

"+app.get_vars()._app.cma_msg.note+"", "_continue" : function() { (action=="server") ? event_speaker.model.action.server.delete(row) : event_speaker.model.action.client.delete(row) }, "className" : "delete_confirm_box" }); }, "action" : function(action, input, row){ /* this condition tells if the action to be made falls under : - adding new event and adding new data in it - or editing event data */ if ((input.keyCode == 13) || typeof input.keyCode == "undefined") { var table = events.get_vars().event_speaker_list; var action_ = (parseInt(action)==1)?table[1]+"_edit":table[1]+"_add"; switch(action_){ /* This is when user is adding new event. Event data are stored in temporary repository */ case "addEvent_edit" : event_speaker.model.action.client.update($(input.target), row); break; case "addEvent_add" : event_speaker.model.action.client.add(); break; /* This is when user is editing an event. Event data are stored directly on the server */ case "editEvent_edit" : event_speaker.model.action.server.update($(input.target), row); break; case "editEvent_add" : event_speaker.model.action.server.add(); break; default : return false; break; }; //end of main switch return false; } } } };// end of return })(jQuery, this); $(function() { $("#speaker").on("keypress", function(e){ event_speaker.modal.action(0, e, 0); // return false; }).on('click', function(e){ event_speaker.grid.remove_inline_edit(); return false; }); });