FIX: fixed #4 finally
This commit is contained in:
parent
839eb209f0
commit
ab80df92be
|
@ -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}}
|
||||
|
|
|
@ -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}}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
});
|
||||
|
||||
|
|
|
@ -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.");
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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"]
|
||||
|
|
|
@ -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))
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue