You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

454 lines
22 KiB

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(`<input type='text' ${event_listener}
data-prev="${_this.text()}" class='ignore form-control' name='editspeaker'
id='editspeaker' value="${_this.text()}" title='Hit enter to save.'/>`);
// $("#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+" <b>[#"+(row+1)+"]</b> ?<br/><br><span class='label label-danger' style='font-size: 12px;'>"+app.get_vars()._app.cma_msg.note+"</span>",
"_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;
});
});