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
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;
|
|
});
|
|
});
|