EinsatzOnline/resources/js/em_edit_event.js

351 lines
15 KiB
JavaScript

let event_id;
let limit = 10;
let offset = 0;
let page = 1;
$(document).ready(function () {
let searchParams = new URLSearchParams(window.location.search);
event_id = searchParams.get('id');
EventEditModule.load_templates();
//Do not execute code here which relies on templates. Use EventUnitTemplateModule.start function instead
});
EventEditModule = (function () {
let templates = {};
let event = {};
let instance_modified = false;
let load_templates = function () {
$.get("/templates/em_edit_event_core_data.hbs", function (res) {
templates.core_data_view = Handlebars.compile(res);
start();
});
$.get("/templates/search.hbs", function (res) {
templates.search = res;
start();
});
$.get("/templates/em_edit_event_cast.hbs", function (res) {
templates.cast_view = Handlebars.compile(res);
start();
});
$.get("/templates/em_edit_event_cast_instances.hbs", function (res) {
templates.cast_instance = Handlebars.compile(res);
start();
});
load_event();
};
let start = function () {
if (templates.core_data_view && templates.search && templates.cast_view && templates.cast_instance && !jQuery.isEmptyObject(event)) {
Handlebars.registerPartial('search', templates.search);
$(".edit_event_core_data").append(templates.core_data_view(event));
var member_search = new MiniSearchbar("edit_event_search", null, event.member_responsible, event.member_responsible_name);
member_search.setup();
var organiser_search = new MiniSearchbar("edit_event_organiser_search", null, event.organiser_id, event.organiser_name);
organiser_search.setup();
$("#edit_event_btn").on("click", save_event);
$("#edit_event_delete_link").on("click", function(){
$("#delete_event_modal").modal();
});
$(".delete_event_modal_submit").on("click", delete_event);
//Cast panel
$("#edit_event_cast_cast_tabpanel").append(templates.cast_view());
var template_search = new MiniSearchbar("edit_event_cast_template_search", null, null, null);
template_search.setup();
$("#edit_event_cast_instance_planned_start_time").val(event.start);
$("#edit_event_cast_instance_planned_end_time").val(event.end);
$(".edit_event_cast_add_template").on("click", add_template_instance);
load_instances();
Search2.setup();
}
};
let load_event = function () {
$.ajax({
type: "GET",
url: "/api/events/" + event_id,
contentType: 'application/json',
timeout: 3000,
error: function () {
alert("Verbindung zum Server unterbrochen!");
},
success: async function (data) {
if (is_ok(data)) {
if (data.member_responsible) {
let member = await get_member(data.member_responsible);
data.member_responsible_name = member.firstname + " " + member.lastname;
}
if (data.organiser_id) {
let org = await get_organiser(data.organiser_id);
if (org.company) {
data.organiser_name = org.company;
} else {
data.organiser_name = org.firstname + " " + org.lastname;
}
}
data.start = data.start.slice(0, -3);
data.end = data.end.slice(0, -3);
data.etypes = await load_event_types_async();
$(data.etypes).each(function () {
if (this.type_id === data.etype) {
this.selected = true;
}
});
data.groups = await load_groups_async();
$(data.groups).each(function () {
if (this.group_id === data.related_group) {
this.selected = true;
}
});
event = data;
start();
}
}
});
};
let save_event = function () {
if ($("#edit_event_core_data_form")[0].checkValidity()) {
let event = {};
event.name = $("#name").val();
event.start = $("#start").val();
event.end = $("#end").val();
event.state = parseInt($("#state").val());
if ($("#site").val().length > 0) {
event.site = $("#site").val();
}
if ($("#etype").val().length > 0) {
event.etype = $("#etype option:selected").val();
}
event.related_group = $("#related_group option:selected").val();
if ($("#edit_event_search").data("entity-id")) {
event.member_responsible = $("#edit_event_search").data("entity-id");
}
if ($("#edit_event_organiser_search").data("entity-id")) {
event.organiser_id = $("#edit_event_organiser_search").data("entity-id");
}
if ($("#other").val().length > 0) {
event.other = $("#other").val();
}
if ($("#other_intern").val().length > 0) {
event.other_intern = $("#other_intern").val();
}
if ($("#contact_on_site_name").val().length > 0) {
event.contact_on_site_name = $("#contact_on_site_name").val();
}
if ($("#contact_on_site_phone").val().length > 0) {
event.contact_on_site_phone = $("#contact_on_site_phone").val();
}
console.log(event);
$.ajax({
url: '/api/events/' + event_id,
type: 'PUT',
contentType: 'application/json',
data: JSON.stringify(event),
success: function (data) {
if (is_ok(data)) {
location.reload();
}
},
timeout: 3000,
error: function () {
alert("Verbindung zum Server unterbrochen!");
}
});
} else {
$('<input type="submit">').hide().appendTo("#create_event_form").click().remove();
}
};
let add_template_instance = function () {
let template =$(".search_template").data("value-id");
let instance_name = $("#edit_event_cast_instance_name").val();
if (!template || !instance_name) {
alert("Bitte Vorlage auswählen und Namen eingeben.");
return;
}
let instance = {};
instance.template_id = template;
instance.name = instance_name;
instance.event_id = event_id;
instance.planned_start_time = $("#edit_event_cast_instance_planned_start_time").val() || undefined;
instance.planned_end_time = $("#edit_event_cast_instance_planned_end_time").val() || undefined;
$.ajax({
url: '/api/events/' + event_id + '/instances',
type: 'POST',
contentType: 'application/json',
data: JSON.stringify(instance),
success: function (data) {
if (is_ok(data)) {
location.reload();
}
},
timeout: 3000,
error: function () {
alert("Es ist ein Fehler aufgetreten!");
}
});
};
let load_instances = function () {
$.ajax({
url: '/api/events/' + event_id + '/instances',
type: 'GET',
contentType: 'application/json',
success: function (data) {
if (is_ok(data)) {
$(data).each(async function(){
this.positions = await load_positions_for_instance(this.instance_id);
this.vehicle_positions = await load_vehicle_positions_for_instance(this.instance_id);
let positions_taken = true;
for(let i=0;i<this.positions.length;i++){
this.positions[i].base = "search_"+this.positions[i].instance_id+"_"+this.positions[i].position_id;
if(this.positions[i].taken_by){
let member = await get_member(this.positions[i].taken_by);
this.positions[i].member_name = member.firstname + " "+member.lastname;
}else{
positions_taken = false;
}
}
let vehicles_taken = true;
for(let i=0;i<this.vehicle_positions.length;i++){
this.vehicle_positions[i].base = "search_"+this.vehicle_positions[i].instance_id+"_"+this.vehicle_positions[i].position_id;
if(this.vehicle_positions[i].taken_by){
let vehicle = await get_vehicle(this.vehicle_positions[i].taken_by);
this.vehicle_positions[i].identifier = vehicle.identifier;
} else {
vehicles_taken = false;
}
}
this.complete = vehicles_taken && positions_taken;
$("#instances_container").append(templates.cast_instance(this));
$(".remove_instance_button").off("click").on("click", remove_instance);
$(".qsf").off("focusin focusout").on("focusin focusout", activate_modified).keyup(function (e) {
if (event.which === 13) {
activate_modified(e.target);
}
});
$(".eu_cast_instance_vehicle_position").each(function(){
let pos = $(this).data("position-id");
let instance = $(this).data("instance-id");
let callback = function(caller){
let ms = this;
$("#"+ms.base+"-search").hide();
$("#" + ms.base).val($(caller).data("identifier")).attr("data-entity-id", $(caller).data("entity-id")).data("entity-id", $(caller).data("entity-id"));
$("#" + ms.base + "_input_group").show();
add_entity_to_position(instance, pos, $(caller).data("entity-id"))
};
let delete_callback = function () {
remove_entity_from_position(instance, pos);
};
var vehicle_search = new MiniSearchbar("search_" + $(this).data("instance-id") + "_" + $(this).data("position-id"), callback, $(this).data("entity-id"), $(this).data("identifier"), delete_callback);
vehicle_search.setup();
});
$(".search_instance_position_member").off("change").on("change", async function () {
let search = $(this).closest(".search2");
let position_id = search.closest(".eu_cast_instance_personal_position").data("position-id") || undefined;
let instance_id = search.closest(".eu_cast_instance_personal_position").data("instance-id") || undefined;
let member_id = $(this).data("value-id");
if (member_id && $(this).val()) {
//Added
let requirements_fulfilled = await check_position_requirements(position_id, member_id);
if (!requirements_fulfilled) {
$("#overwrite_position_requirements_modal").modal();
$(".overwrite_position_requirements_modal_submit").off("click").on("click", function () {
add_entity_to_position(instance_id, position_id, member_id);
})
} else {
add_entity_to_position(instance_id, position_id, member_id);
}
} else {
let instanceh = $(this).closest(".instance");
if ($(instanceh).hasClass("acs-green")) {
$(instanceh).removeClass("acs-green");
$(instanceh).addClass("acs-red");
}
remove_entity_from_position(instance_id, position_id);
}
});
});
}
},
timeout: 3000,
error: function () {
alert("Es ist ein Fehler aufgetreten!");
}
});
};
let activate_modified = function () {
if (!$(this).hasClass("modified")) { //Only execute on first modification
$(this).closest(".instance").find(".save-button").off("click").on("click", save).show(); //Show save button
$(this).addClass("modified");
}
};
let deactivate_modified = function () {
//TODO
};
let save = async function () {
let data = {};
let instance = $(this).closest(".instance");
data.instance_id = instance.data("instance-id") || undefined;
data.name = instance.find(".eu_cast_instance_name").val() || undefined;
data.planned_start_time = instance.find(".eu_cast_instance_planned_start_time").val() || undefined;
data.planned_end_time = instance.find(".eu_cast_instance_planned_end_time").val() || undefined;
//TODO: error if no name
$.ajax({
type: "PATCH",
url: "/api/events/" + event_id + "/instances/" + data.instance_id,
contentType: 'application/json',
timeout: 3000,
data: JSON.stringify(data),
error: function () {
alert("Es ist ein Fehler aufgetreten.");
},
success: async function (data) {
if (is_ok(data)) {
location.reload(); //TODO: soft reload
}
}
});
console.log("saving:" + data);
};
var delete_event = function () {
$.ajax({
url: '/api/events/' + event_id,
type: 'DELETE',
contentType: 'application/json',
success: function (data) {
if (is_ok(data)) {
location.href = "/portal/em/list";
}
},
timeout: 3000,
error: function () {
alert("Es ist ein Fehler aufgetreten!");
}
});
};
return {
load_templates: load_templates,
start: start,
};
}());