FIX: fixed #4 finally

This commit is contained in:
Keanu D?lle 2022-03-08 20:48:10 +01:00
parent 839eb209f0
commit ab80df92be
9 changed files with 87 additions and 63 deletions

View File

@ -19,7 +19,7 @@
{{#each positions}}
<div class="form-group row eu_cast_instance_personal_position" data-instance-id="{{../instance_id}}"
data-position-id="{{position_id}}" data-member-name="{{member_name}}"
data-member-id="{{taken_by}}">
data-member-id="{{taken_by}}" data-position-instance-id="{{position_instance_id}}">
<label class="col-4 col-form-label" {{#if position_description}}title="{{position_description}}" {{/if}}>{{position_name}}</label>
<div class="input-group mb-3 col-8">
{{search2 type="member" classname="search_instance_position_member" value_id=taken_by
@ -33,10 +33,11 @@
<div class="eu_cast_instance_vehicles">
{{#each vehicle_positions}}
<div class="form-group row eu_cast_instance_vehicle_position" data-instance-id="{{../instance_id}}"
data-position-id="{{position_id}}" data-identifier="{{identifier}}" data-entity-id="{{taken_by}}">
data-position-id="{{position_id}}" data-position-instance-id="{{position_instance_id}}" data-identifier="{{identifier}}" data-entity-id="{{taken_by}}">
<label class="col-4 col-form-label">{{name}}</label>
<div class="input-group mb-3 col-8">
{{> search base=this.base type="vehicle"}}
{{search2 type="vehicle" classname="search_instance_vehicle_position" value_id=taken_by
value=identifier}}
</div>
</div>
{{/each}}

View File

@ -15,7 +15,7 @@
{{#each positions}}
<div class="form-group row eu_cast_instance_personal_position" data-instance-id="{{../instance_id}}"
data-position-id="{{position_id}}" data-member-name="{{member_name}}"
data-member-id="{{taken_by}}">
data-member-id="{{taken_by}}", data-position-instance-id="{{position_instance_id}}">
<label class="col-4 col-form-label" {{#if position_description}}title="{{position_description}}" {{/if}}>{{position_name}}</label>
<div class="input-group mb-3 col-8">
{{#if taken_by}}{{member_name}}{{else}}

View File

@ -205,7 +205,7 @@ EventEditModule = (function () {
this.positions = await load_positions_for_instance(this.instance_id);
this.vehicle_positions = await load_vehicle_positions_for_instance(this.instance_id);
console.log(data);
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;
@ -237,28 +237,26 @@ EventEditModule = (function () {
}
});
$(".eu_cast_instance_vehicle_position").each(function(){
let pos = $(this).data("position-id");
let instance = $(this).data("instance-id");
$(".search_instance_vehicle_position").off("change").on("change", function(){
let search = $(this).closest(".search2");
let position_instance_id = search.closest(".eu_cast_instance_vehicle_position").data("position-instance-id");
let vehicle_entity_id = $(this).data("value-id");
if(vehicle_entity_id && $(this).val()){
//Added
add_entity_to_position(vehicle_entity_id, position_instance_id)
}else{
//Removed
remove_entity_from_position(position_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 position_instance_id = search.closest(".eu_cast_instance_personal_position").data("position-instance-id") || undefined;
let member_id = $(this).data("value-id");
if (member_id && $(this).val()) {
@ -267,10 +265,10 @@ EventEditModule = (function () {
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);
add_entity_to_position(member_id, position_instance_id);
})
} else {
add_entity_to_position(instance_id, position_id, member_id);
add_entity_to_position(member_id, position_instance_id);
}
} else {
let instanceh = $(this).closest(".instance");
@ -278,7 +276,7 @@ EventEditModule = (function () {
$(instanceh).removeClass("acs-green");
$(instanceh).addClass("acs-red");
}
remove_entity_from_position(instance_id, position_id);
remove_entity_from_position(position_instance_id);
}
});

View File

@ -195,6 +195,7 @@ EventListModule = ( function() {
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) {
console.log("taken by: {}", 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 {
@ -220,16 +221,17 @@ EventListModule = ( function() {
$(".eu_cast_instance_personal_position").each(function(){
let pos = $(this).data("position-id");
let instance = $(this).data("instance-id");
let position_instance_id = $(this).data("position-instance-id");
let callback = function(caller){
let ms = this;
$("#"+ms.base+"-search").hide();
$("#"+ms.base).val($(caller).data("firstname")+" "+$(caller).data("lastname")).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"))
add_entity_to_position($(caller).data("entity-id"), position_instance_id)
};
let delete_callback = function(){
remove_entity_from_position(instance, pos);
remove_entity_from_position(position_instance_id);
};
var member_search = new MiniSearchbar("search_"+$(this).data("instance-id")+"_"+$(this).data("position-id"), callback, $(this).data("member-id"), $(this).data("member-name"), delete_callback);
member_search.setup();
@ -237,16 +239,17 @@ EventListModule = ( function() {
$(".eu_cast_instance_vehicle_position").each(function(){
let pos = $(this).data("position-id");
let instance = $(this).data("instance-id");
let position_instance_id = $(this).data("position-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"))
add_entity_to_position($(caller).data("entity-id"), position_instance_id)
};
let delete_callback = function(){
remove_entity_from_position(instance, pos);
remove_entity_from_position(position_instance_id);
};
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();
@ -266,23 +269,13 @@ EventListModule = ( function() {
let position_id = position.data("position-id");
let instance_id = position.data("instance-id");
let caller_entity_id = $("#caller_entity_id").val();
let position_instance_id = position.data("position-instance-id");
let check_requirements = await check_position_requirements(position_id, caller_entity_id);
if(check_requirements){
const res = await $.ajax({
type: "PUT",
url: "/api/events/instances/"+instance_id+"/positions/"+position_id+"/entities/"+caller_entity_id,
contentType: 'application/json',
timeout: 3000,
error: function () {
alert("Es ist ein Fehler aufgetreten!");
},
});
if (is_ok(res)) {
let member = await get_member(caller_entity_id);
add_entity_to_position(caller_entity_id, position_instance_id);
let member = await get_member(caller_entity_id);
btn.replaceWith(member.firstname + " "+member.lastname);
}
}else{
alert("Du erfüllst nicht die nötigen Voraussetzungen für diese Position.");
}

View File

@ -201,13 +201,14 @@ let remove_instance = function(){
}
});
};
let add_entity_to_position = function(instance, position, entity){
let add_entity_to_position = function(entity, position_instance_id){
$.ajax({
url: '/api/events/instances/'+instance+'/positions/'+position+'/entities/'+entity,
url: '/api/entities/'+entity+'/position_instances/'+position_instance_id,
type: 'PUT',
contentType: 'application/json',
success: function (data) {
if (is_ok(data)) {
return data;
}
},
timeout: 3000,
@ -216,9 +217,9 @@ let add_entity_to_position = function(instance, position, entity){
}
});
};
let remove_entity_from_position = function(instance, position){
let remove_entity_from_position = function(position_instance_id){
$.ajax({
url: '/api/events/instances/'+instance+'/positions/'+position+'/entities/',
url: '/api/position_instances/'+position_instance_id+'/taken_by',
type: 'DELETE',
contentType: 'application/json',
success: function (data) {

View File

@ -147,7 +147,22 @@ Search2 = (function () {
let res = res_map.get($(this).data("entity-id"));
setValue(this, res.entity_id, res.name);
};
} else {
} else if (type === "vehicle") {
options.url = "/api/resources/vehicles/";
options.get_data = {
"q": searchbar.val()
};
options.res_handler = function (data) {
$.each(data.vehicle_list, function (index, value) {
res_map.set(value.entity_id, value);
overlay_list.append("<span tabindex=\"0\" class=\"search2-result-overlay-list-entry\" data-entity-id=\"" + value.entity_id + "\"><li class='list-group-item' title='" + value.description + "'><span class=\"badge badge-secondary\">Hinzufügen:</span> " + value.identifier + "("+value.numberplate+")</li></span>");
});
};
options.overlay_click_handler = function () {
let res = res_map.get($(this).data("entity-id"));
setValue(this, res.entity_id, res.identifier+" ("+res.numberplate+")");
};
}else {
console.error("Unknown search type: " + type);
return;
}

View File

@ -554,7 +554,7 @@ pub fn get_position_instance(settings: &State<Settings>, position_instance_id: u
pub fn get_instance_vehicle_positions(settings: &State<Settings>, instance_id2: uuid::Uuid) -> Result<Vec<EventUnitInstanceVehiclePosition>, diesel::result::Error> {
let connection = establish_connection(settings);
let position_instances: Result<Vec<EventUnitInstanceVehiclePosition>, diesel::result::Error> = sql_query(
"SELECT instance_id, position_id, taken_by, name, description, required_vehicle_category FROM eu_position_instances INNER JOIN eu_vehicle_positions ON position_id = entity_id WHERE instance_id = $1;",
"SELECT position_instance_id, instance_id, position_id, taken_by, name, description, required_vehicle_category FROM eu_position_instances INNER JOIN eu_vehicle_positions ON position_id = entity_id WHERE instance_id = $1;",
)
.bind::<Uuid, _>(instance_id2)
.get_results(&connection);
@ -581,11 +581,11 @@ pub fn add_vehicle_position(settings: &State<Settings>, position: EventUnitVehic
}
}
pub fn change_position_instances(settings: &State<Settings>, instance_id2: uuid::Uuid, position_id2: uuid::Uuid, taken_by2: Option<uuid::Uuid>) -> Result<usize, diesel::result::Error>{
pub fn change_position_instances(settings: &State<Settings>, position_instance_id2: uuid::Uuid, taken_by2: Option<uuid::Uuid>) -> Result<usize, diesel::result::Error>{
use crate::schema::eu_position_instances::dsl::*;
let connection = establish_connection(settings);
match diesel::update(eu_position_instances).filter(instance_id.eq(instance_id2)).filter(position_id.eq(position_id2)).set(taken_by.eq(taken_by2)).execute(&connection){
match diesel::update(eu_position_instances).filter(position_instance_id.eq(position_instance_id2)).set(taken_by.eq(taken_by2)).execute(&connection){
Ok(count) => Ok(count),
Err(e) => {
error!("Couldn't update position instances: {}", e);

View File

@ -121,6 +121,8 @@ pub struct EventUnitInstancePosition{
#[derive(Queryable, Clone, Deserialize, Serialize, QueryableByName)]
pub struct EventUnitInstanceVehiclePosition{
#[sql_type = "Uuid"]
pub(crate) position_instance_id: uuid::Uuid,
#[sql_type = "Uuid"]
pub(crate) instance_id: uuid::Uuid,
#[sql_type = "Uuid"]

View File

@ -3,7 +3,7 @@ use std::convert::TryInto;
use rocket::serde::json::Json;
use rocket::State;
use crate::database::controller::events::{change_position_instances, get_event};
use crate::database::controller::events::{change_position_instances, get_event, get_position_instance};
use crate::database::controller::events::instances::instance_positions::RawPositionInstanceChangeset;
use crate::database::controller::events::instances::instances::{get_instance, get_instances, RawEventUnitInstanceChangeset, update_instance};
use crate::helper::serde_patch::Patch;
@ -16,21 +16,27 @@ use crate::modules::api::member_management::controller::parser::{parse_member_co
use crate::modules::api::model::api_outcome::{ApiError, ApiErrorWrapper};
use crate::modules::event_management::check_position_requirements::{check_position_requirements, RequirementParserError};
#[put("/api/events/instances/<instance_id>/positions/<position_id>/entities/<entity_id>", format = "json", rank = 1)]
#[put("/api/entities/<entity_id>/position_instances/<position_instance>", format = "json", rank = 1)]
pub fn put_entity_in_position(
settings: &State<Settings>,
cookie: SessionCookie,
instance_id: String,
position_id: String,
position_instance: String,
entity_id: String,
) -> Result<Json<usize>, Json<ApiErrorWrapper>> {
let caller = parse_member_cookie(cookie.member)?;
let position_id = parse_uuid_string(position_id)?;
let position_instance = parse_uuid_string(position_instance)?;
let entity_id = parse_uuid_string(entity_id)?;
let instance_id = parse_uuid_string(instance_id)?;
let instance = match get_instance(settings, instance_id) {
let position_instance_data = match get_position_instance(settings, position_instance){
Ok(res) => res,
Err(e) => {
error!("Couldn't retrieve position instance: {}", e);
return Err(Json(ApiError::new(404, "position instance not found!".to_string()).to_wrapper()));
}
};
let instance = match get_instance(settings, position_instance_data.instance_id) {
Ok(instance) => instance,
Err(e) =>
{
@ -52,7 +58,7 @@ pub fn put_entity_in_position(
}
if caller.entity_id == entity_id {
match check_position_requirements(settings, position_id, entity_id) {
match check_position_requirements(settings, position_instance_data.position_id, entity_id) {
Ok(res) => {
if !res { //if member tries to add himself to a position, but don't fulfill the position requirements AND don't have the event edit permission (overwrite), abort
if !caller.has_permission(crate::permissions::modules::event_management::events::EDIT.to_string()) {
@ -80,18 +86,17 @@ pub fn put_entity_in_position(
));
}
match change_position_instances(settings, instance_id, position_id, Some(entity_id)) {
match change_position_instances(settings, position_instance, Some(entity_id)) {
Ok(pos) => Ok(Json(pos)),
Err(e) => return Err(translate_diesel(e))
}
}
#[delete("/api/events/instances/<instance_id>/positions/<position_id>/entities", format = "json", rank = 1)]
#[delete("/api/position_instances/<position_instance>/taken_by", format = "json", rank = 1)]
pub fn remove_entity_from_position(
settings: &State<Settings>,
cookie: SessionCookie,
instance_id: String,
position_id: String,
position_instance: String,
) -> Result<Json<usize>, Json<ApiErrorWrapper>> {
let caller = parse_member_cookie(cookie.member)?;
if !caller.has_permission(crate::permissions::modules::event_management::events::EDIT.to_string()) {
@ -100,9 +105,17 @@ pub fn remove_entity_from_position(
));
}
let instance_id = parse_uuid_string(instance_id)?;
let position_instance = parse_uuid_string(position_instance)?;
let instance = match get_instance(settings, instance_id) {
let position_instance_data = match get_position_instance(settings, position_instance){
Ok(res) => res,
Err(e) => {
error!("Couldn't retrieve position instance: {}", e);
return Err(Json(ApiError::new(404, "position instance not found!".to_string()).to_wrapper()));
}
};
let instance = match get_instance(settings, position_instance_data.instance_id) {
Ok(instance) => instance,
Err(e) =>
{
@ -118,12 +131,13 @@ pub fn remove_entity_from_position(
ApiError::new(404, "event for instance not found!".to_string()).to_wrapper()))
}
};
if event.state >= 4 {
return Err(Json(
ApiError::new(400, "Dieser Einsatz wurde bereits geschlossen!".to_string()).to_wrapper()))
}
match change_position_instances(settings, instance_id, parse_uuid_string(position_id)?, None) {
match change_position_instances(settings, position_instance, None) {
Ok(pos) => Ok(Json(pos)),
Err(e) => return Err(translate_diesel(e))
}