members-space-shifts-exchange.js 33.3 KB
Newer Older
1
var calendar = null,
2
    selected_shift = null,
3 4
    vw = null,
    adding_mode = false;
5

6 7
/* - Logic */

8 9 10 11
/**
 * A partner can exchange shifts if:
 *  - s.he doesn't have to choose a makeup shift
 *  - s.he's not an associated partner
12
 *  - s.he's is an associated partner who is not blocked in his actions
13 14 15
 * @returns boolean
 */
function can_exchange_shifts() {
16
    return partner_data.makeups_to_do == 0 && (partner_data.is_associated_people === "False" || (partner_data.is_associated_people === "True" && block_actions_for_attached_people === "False"));
17 18 19
}

/**
20
 * A partner should select a shift if:
21 22 23 24
 *  - s.he has makeups to do
 *  - s.he's not an associated partner
 * @returns boolean
 */
25
function should_select_makeup() {
Etienne Freiss committed
26
    return partner_data.makeups_to_do > 0 || (partner_data.makeups_to_do > 0 && partner_data.is_associated_people === "True" && block_actions_for_attached_people === "False");
27 28
}

29 30
/* - Server requests */

31 32
/**
 * Proceed to shift exchange or registration
33
 * @param {int} new_shift_id
34 35 36
 */
function add_or_change_shift(new_shift_id) {
    if (is_time_to('change_shift')) {
37
        setTimeout(openModal, 100); // loading on
38

39 40 41 42 43
        if (partner_data.is_associated_people === "False") {
            tData = 'idNewShift=' + new_shift_id
                +'&idPartner=' + partner_data.partner_id
                + '&shift_type=' + partner_data.shift_type
                + '&verif_token=' + partner_data.verif_token;
Etienne Freiss committed
44
        } else if (partner_data.is_associated_people === "True" && block_actions_for_attached_people === "False") {
45 46 47 48 49 50 51
            tData = 'idNewShift=' + new_shift_id
                +'&idPartner=' + partner_data.parent_id
                + '&shift_type=' + partner_data.shift_type
                + '&verif_token=' + partner_data.parent_verif_token;
        } else {
            return false;
        }
52 53 54

        if (selected_shift === null) {
            tUrl = '/shifts/add_shift';
55 56 57
            if (partner_data.makeups_to_do > 0) {
                tData += '&is_makeup=1';
            }
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
        } else {
            tUrl = '/shifts/change_shift';
            tData = tData + '&idOldShift='+ selected_shift.shift_id[0] +'&idRegister=' + selected_shift.id;
        }

        $.ajax({
            type: 'POST',
            url: tUrl,
            dataType:"json",
            data: tData,
            timeout: 3000,
            success: function(data) {
                if (data.result) {
                    // Decrement makeups to do if needed
                    if (partner_data.makeups_to_do > 0) {
                        partner_data.makeups_to_do = parseInt(partner_data.makeups_to_do, 10) - 1;

                        if (partner_data.makeups_to_do === 0) {
                            $("#need_to_select_makeups_message").hide();
                        } else {
                            $(".makeups_nb").text(partner_data.makeups_to_do);
                        }
                    }

                    let msg = "Parfait! ";
83 84 85 86

                    msg += (selected_shift === null)
                        ? "Le service choisi a été ajouté."
                        : "Le service a été échangé.";
87 88 89 90 91 92 93

                    selected_shift = null;

                    // Refetch partner shifts list & update DOM
                    load_partner_shifts(partner_data.concerned_partner_id)
                        .then(() => {
                            init_shifts_list();
94 95 96 97 98

                            if (partner_data.shift_type === 'ftop' && ftop_can_delete_shift === "True") {
                                init_delete_registration_buttons();
                            }

99 100 101
                            closeModal();

                            setTimeout(() => {
102

103 104 105 106 107 108 109

                                alert(msg);
                            }, 100);
                        });

                    // Redraw calendar
                    calendar.refetchEvents();
110 111 112 113 114 115 116
                } else {
                    closeModal();
                    selected_shift = null;
                    alert(`Une erreur est survenue. ` +
                        `Il est néanmoins possible que la requête ait abouti, ` +
                        `veuillez patienter quelques secondes puis vérifier vos services enregistrés.`);

Etienne Freiss committed
117
                    // Refectch shifts anyway, if registration/exchange was still succesful
118 119
                    setTimeout(() => {
                        load_partner_shifts(partner_data.concerned_partner_id)
Etienne Freiss committed
120
                            .then(init_shifts_list);
121
                    }, 300);
122 123 124 125
                }
            },
            error: function(error) {
                closeModal();
126
                selected_shift = null;
127
                if (error.status === 400 && 'msg' in error.responseJSON && error.responseJSON.msg === "Old service in less than 24hours.") {
Thibault Grandjean committed
128
                    alert(`Désolé ! Le service que tu souhaites échanger démarre dans moins de 24h. ` +
129 130 131
                        `Afin de faciliter la logistique des services, il n'est plus possible de l'échanger. ` +
                        `Si tu ne peux vraiment pas venir, tu seras noté.e absent.e à ton service. ` +
                        `Tu devras alors sélectionner un service de rattrapage sur ton espace membre.`);
132
                } else if (error.status === 400 && 'msg' in error.responseJSON && error.responseJSON.msg === "Not allowed to change shift") {
133
                    alert(not_allowed_shift_op);
134
                } else if (error.status === 500 && 'msg' in error.responseJSON && error.responseJSON.msg === "Fail to create shift") {
135
                    // TODO differentiate error cases!
136 137 138
                    alert(`Une erreur est survenue. ` +
                        `Il est néanmoins possible que la requête ait abouti, ` +
                        `veuillez patienter quelques secondes puis vérifier vos services enregistrés.`);
139
                } else if (error.status === 400 && 'msg' in error.responseJSON && error.responseJSON.msg === "Bad arguments") {
140 141 142
                    alert(`Une erreur est survenue. ` +
                        `Il est néanmoins possible que la requête ait abouti, ` +
                        `veuillez patienter quelques secondes puis vérifier vos services enregistrés.`);
143 144
                } else if (error.status === 422) {
                    alert('Désolé ! Ce service ne peut pas être ajouté en raison des règles établies.');
145
                } else {
Damien Moulard committed
146 147
                    alert(`Une erreur est survenue. ` +
                        `Il est néanmoins possible que la requête ait abouti, ` +
148 149 150 151 152 153 154 155 156 157
                        `veuillez patienter quelques secondes puis vérifier vos services enregistrés.`);
                }

                // Refectch shifts anyway, if registration/exchange was still succesful
                setTimeout(() => {
                    load_partner_shifts(partner_data.concerned_partner_id)
                        .then(init_shifts_list);
                }, 300);
            }
        });
158 159
        adding_mode = false;
        $('#start_adding_shift').prop('disabled', false);
160
    }
Damien Moulard committed
161 162

    return null;
163 164
}

165 166 167 168 169 170 171
/**
 * Send request to delete (cancel) a shift registration.
 * @param {Int} shift_registration_id shift registration to cancel
 */
function delete_shift_registration(shift_registration_id) {
    if (is_time_to('delete_shift_registration')) {
        openModal();
Damien Moulard committed
172

173 174 175
        tData = 'idPartner=' + partner_data.concerned_partner_id
                + '&idRegister=' + shift_registration_id
                + '&extra_shift_done=' + partner_data.extra_shift_done;
Damien Moulard committed
176

177 178
        if (partner_data.is_associated_people === "False") {
            tData += '&verif_token=' + partner_data.verif_token;
Damien Moulard committed
179
        } else if (partner_data.is_associated_people === "True" && block_actions_for_attached_people === "False") {
180 181 182 183
            tData += '&verif_token=' + partner_data.parent_verif_token;
        } else {
            return false;
        }
Damien Moulard committed
184

185 186
        $.ajax({
            type: 'POST',
187
            url: "/shifts/cancel_shift_case_extra_shift_done",
188 189 190 191 192
            dataType:"json",
            data: tData,
            timeout: 3000,
            success: function() {
                partner_data.extra_shift_done -= 1;
Damien Moulard committed
193

194 195 196 197 198 199 200 201 202 203 204 205 206 207 208
                // Refetch partner shifts list & update DOM
                load_partner_shifts(partner_data.concerned_partner_id)
                    .then(() => {
                        init_shifts_list();

                        if (partner_data.extra_shift_done > 0) {
                            $(".extra_shift_done").text(partner_data.extra_shift_done);
                            init_delete_registration_buttons();
                        } else {
                            $("#can_delete_future_registrations_area").hide();
                            $(".delete_registration_button").off();
                            $(".delete_registration_button").hide();
                        }

                        closeModal();
Damien Moulard committed
209

210 211 212 213
                        setTimeout(() => {
                            alert("La présence a bien été annulée !");
                        }, 100);
                    });
Damien Moulard committed
214

215 216 217 218 219 220 221 222 223
                // Redraw calendar
                calendar.refetchEvents();
            },
            error: function() {
                closeModal();
                alert("Une erreur est survenue.");
            }
        });
    }
Damien Moulard committed
224 225

    return null;
226 227 228 229 230 231 232
}

/**
 * Proceed affecting a shift registration to a/both member(s) of a pair
 * @param {string} partner
 * @param {string} shift_id
 */
Damien Moulard committed
233
function affect_shift(partner, shift_id) {
Etienne Freiss committed
234
    if (is_time_to('affect_shift', 1000)) {
235 236 237 238
        tData = 'idShiftRegistration=' + shift_id
            +'&idPartner=' + partner_data.partner_id
            + '&affected_partner=' + partner
            + '&verif_token=' + partner_data.verif_token;
Damien Moulard committed
239

240
        tUrl = '/shifts/affect_shift';
Damien Moulard committed
241

242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259
        $.ajax({
            type: 'POST',
            url: tUrl,
            dataType:"json",
            data: tData,
            timeout: 3000,
            success: function() {
                load_partner_shifts(partner_data.concerned_partner_id)
                    .then(() => {
                        init_shifts_list();
                        modal.find(".btn-modal-ok").show();
                        closeModal();
                    });
            },
            error: function() {
                init_shifts_list();
                modal.find(".btn-modal-ok").show();
                closeModal();
Damien Moulard committed
260

261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284
                alert(`Une erreur est survenue. ` +
                    `Il est néanmoins possible que la requête ait abouti, ` +
                    `veuillez patienter quelques secondes puis vérifier vos services enregistrés.`);
            }
        });
    }
}

/**
 * Reset a member extra_shift_done to 0
 */
function offer_extra_shift() {
    if (is_time_to('offer_extra_shift')) {
        openModal();

        $.ajax({
            type: 'POST',
            url: "/members_space/offer_extra_shift",
            dataType:"json",
            data: {
                partner_id: partner_data.concerned_partner_id
            },
            timeout: 3000,
            success: function() {
285
                partner_data.extra_shift_done -= 1;
Damien Moulard committed
286

287
                $("#can_delete_future_registrations_area").hide();
288 289 290
                $(".delete_registration_button").off();
                $(".delete_registration_button").hide();

291 292 293 294 295 296 297 298 299 300 301 302 303
                closeModal();
                alert("Don de service effectué");
            },
            error: function() {
                closeModal();
                alert("Une erreur est survenue");
            }
        });
    }
}

/* - DOM */

304 305 306 307 308 309 310 311 312
function init_shifts_list() {
    $(".loading-incoming-shifts").hide();
    $("#shifts_list").show();

    if (incoming_shifts.length === 0) {
        $("#shifts_list").text("Aucun service à venir...");
    } else {
        $("#shifts_list").empty();

313
        for (let shift of incoming_shifts) {
314
            let shift_line_template = $("#selectable_shift_line_template");
Félicie committed
315
            let datetime_shift_start = new Date(shift.date_begin.replace(/\s/, 'T'));
316 317 318 319 320 321

            let f_date_shift_start = datetime_shift_start.toLocaleDateString("fr-fr", date_options);

            f_date_shift_start = f_date_shift_start.charAt(0).toUpperCase() + f_date_shift_start.slice(1);

            shift_line_template.find(".shift_line_date").text(f_date_shift_start);
322 323
            shift_line_template.find(".shift_line_time").text(datetime_shift_start.toLocaleTimeString("fr-fr", time_options));

324
            // Disable or not
Etienne Freiss committed
325 326 327
            shift_line_template.find(".selectable_shift_line").removeClass("btn--primary");
            shift_line_template.find(".selectable_shift_line").removeClass("btn");
            shift_line_template.find(".selectable_shift_line").removeClass("btn--warning");
Damien Moulard committed
328

329
            if (!can_exchange_shifts()) {
330 331
                shift_line_template.find(".selectable_shift_line").addClass("btn");
                shift_line_template.find(".checkbox").prop("disabled", "disabled");
332
                $('#start_adding_shift').prop('disabled', true);
333
            } else {
Etienne Freiss committed
334 335 336 337 338 339 340 341 342
                if (shift.is_makeup==true) {
                    shift_line_template.find(".selectable_shift_line").addClass("btn--warning");
                    shift_line_template.find(".checkbox").prop("disabled", false);
                    shift_line_template.find(".checkbox").prop("value", shift.id);
                } else {
                    shift_line_template.find(".selectable_shift_line").addClass("btn--primary");
                    shift_line_template.find(".checkbox").prop("disabled", false);
                    shift_line_template.find(".checkbox").prop("value", shift.id);
                }
343
            }
344
            // Set assign shift button
Etienne Freiss committed
345
            if (partner_data.associated_partner_id === "False" && partner_data.parent_id === "False") {
346
                shift_line_template.find('.affect_associate_registered').hide();
Etienne Freiss committed
347
            } else {
348 349 350 351 352 353
                if (!can_exchange_shifts()) {
                    shift_line_template.find('.affect_associate_registered').hide();
                } else {
                    shift_line_template.find('.affect_associate_registered').show();
                }

Damien Moulard committed
354 355
                shift_line_template.find('.affect_associate_registered').closest(".shift_line_container")
                    .attr('id', 'shift_id_'+shift.id);
Etienne Freiss committed
356 357
                if (shift.associate_registered==="both") {
                    shift_line_template.find('.affect_associate_registered').text("Les deux");
Etienne Freiss committed
358
                    shift_line_template.find('.affect_associate_registered').addClass('btn--success');
Etienne Freiss committed
359
                } else if (shift.associate_registered==="partner") {
Etienne Freiss committed
360
                    shift_line_template.find('.affect_associate_registered').addClass('btn--success');
Etienne Freiss committed
361 362 363 364
                    if (partner_data.associated_partner_id !== "False") {
                        shift_line_template.find('.affect_associate_registered').text(partner_data.name);
                    } else {
                        shift_line_template.find('.affect_associate_registered').text(partner_data.parent_name);
Etienne Freiss committed
365
                    }
Etienne Freiss committed
366 367

                } else if (shift.associate_registered==="associate") {
Etienne Freiss committed
368
                    shift_line_template.find('.affect_associate_registered').addClass('btn--success');
Etienne Freiss committed
369 370 371 372
                    if (partner_data.associated_partner_id !== "False") {
                        shift_line_template.find('.affect_associate_registered').text(partner_data.associated_partner_name);
                    } else {
                        shift_line_template.find('.affect_associate_registered').text(partner_data.name);
Etienne Freiss committed
373
                    }
Etienne Freiss committed
374 375
                } else {
                    shift_line_template.find('.affect_associate_registered').text("A déterminer");
Etienne Freiss committed
376
                    shift_line_template.find('.affect_associate_registered').addClass('btn--danger');
Etienne Freiss committed
377
                }
Etienne Freiss committed
378
            }
Etienne Freiss committed
379

380 381 382 383 384 385
            // Set delete registration button if shift isn't a makeup or user is ftop and has right to delete shifts
            if (
                partner_data.extra_shift_done > 0 && shift.is_makeup === false
                || partner_data.shift_type === 'ftop' && ftop_can_delete_shift === "True"
            ) {

386 387
                if (shift_line_template.find(".delete_registration_button").length === 0) {
                    let delete_reg_button_template = $("#delete_registration_button_template");
Damien Moulard committed
388

389
                    shift_line_template.find(".shift_line_extra_actions").append(delete_reg_button_template.html());
Etienne Freiss committed
390
                }
391 392
            } else {
                shift_line_template.find(".delete_registration_button").remove();
Etienne Freiss committed
393
            }
Etienne Freiss committed
394

395
            $("#shifts_list").append(shift_line_template.html());
Etienne Freiss committed
396 397
            shift_line_template.find('.affect_associate_registered').removeClass('btn--danger');
            shift_line_template.find('.affect_associate_registered').removeClass('btn--success');
398
        }
399 400 401 402

        $(".selectable_shift_line").on("click", function(e) {
            if (can_exchange_shifts()) {
                let cb = $(this).find(".checkbox");
403

404 405 406 407
                // Select checkbox on click on button
                if (!$(e.target).hasClass("checkbox")) {
                    cb.prop("checked", !cb.prop("checked"));
                }
408

409 410 411 412 413
                if (cb.prop("checked")) {
                    selected_shift = incoming_shifts.find(s => s.id == cb.prop("value"));
                } else {
                    selected_shift = null;
                }
414

415
                // Unselect other checkboxes
416 417
                if ($(this).find(".checkbox")
                    .prop("checked")) {
418 419 420 421 422 423 424 425
                    for (let cb_item of $("#shifts_list").find(".checkbox")) {
                        if (cb.prop("value") !== $(cb_item).prop("value")) {
                            $(cb_item).prop("checked", false);
                        }
                    }
                }
            }
        });
Etienne Freiss committed
426

Etienne Freiss committed
427
        $(".affect_associate_registered").on("click", function() {
Etienne Freiss committed
428
            // Display modal
Damien Moulard committed
429 430
            let id = $(this).closest(".shift_line_container")
                .attr('id')
Etienne Freiss committed
431
                .split('_')[2];
Etienne Freiss committed
432
            let modal_template = $("#modal_affect_shift");
Etienne Freiss committed
433 434

            if (partner_data.associated_partner_id != "False") {
Etienne Freiss committed
435 436
                modal_template.find("#shift_partner").text(partner_data.name);
                modal_template.find("#shift_associate").text(partner_data.associated_partner_name);
Etienne Freiss committed
437

Etienne Freiss committed
438
            } else {
Etienne Freiss committed
439 440
                modal_template.find("#shift_partner").text(partner_data.parent_name);
                modal_template.find("#shift_associate").text(partner_data.name);
Etienne Freiss committed
441
            }
Etienne Freiss committed
442

Etienne Freiss committed
443 444 445
            openModal(
                modal_template.html(),
                () => {
446
                    modal.find(".btn-modal-ok").show();
Etienne Freiss committed
447
                },
448
                "Valider", true, true,
Etienne Freiss committed
449
                () => {
450 451
                    modal.find(".btn-modal-ok").show();
                }
Etienne Freiss committed
452
            );
Etienne Freiss committed
453 454 455

            modal.find('#shift_partner').on("click", function() {
                affect_shift("partner", id);
Etienne Freiss committed
456
            });
Etienne Freiss committed
457 458
            modal.find('#shift_associate').on("click", function() {
                affect_shift("associate", id);
Etienne Freiss committed
459
            });
Etienne Freiss committed
460 461
            modal.find('#shift_both').on("click", function() {
                affect_shift("both", id);
Etienne Freiss committed
462 463
            });

Etienne Freiss committed
464
            modal.find(".btn-modal-ok").hide();
Etienne Freiss committed
465
        });
466 467 468
    }
}

469 470 471 472 473 474 475 476 477 478 479 480 481 482
function add_week_letter_to_elt(elt) {
    const date_string = $(elt.el).data('date'),
        date = new Date(date_string);

    if (date.getDay() == 1) {
        const wl = date.getABCDWeekLetter();
        let week_letter_div = document.createElement('div');

        week_letter_div.innerHTML = '<span>' + wl + '</span>';
        week_letter_div.classList.add('week-letter');
        $('td[data-date="' + date_string + '"]').append(week_letter_div);
    }
}

483 484 485 486
/**
 * Inits the page when the calendar is displayed
 */
function init_calendar_page() {
Damien Moulard committed
487
    let template_explanations = $("#calendar_explaination_template");
488
    let event_src = '/shifts/get_list_shift_calendar/' + partner_data.concerned_partner_id;
489
    if (vw <= 992) {
490
        $(".loading-calendar").show();
Damien Moulard committed
491 492 493 494 495 496 497

        $("#calendar_explaination_area").hide();
        $("#calendar_explaination_button").on("click", () => {
            openModal(
                template_explanations.html(),
                closeModal,
                "J'ai compris"
Damien Moulard committed
498
            );
Etienne Freiss committed
499 500
        })
            .show();
Damien Moulard committed
501 502
    } else {
        $("#calendar_explaination_button").hide();
Etienne Freiss committed
503 504
        $("#calendar_explaination_area").html(template_explanations.html())
            .show();
505 506
    }

507 508 509 510 511 512 513
    if (incoming_shifts !== null) {
        init_shifts_list();
    } else {
        load_partner_shifts(partner_data.concerned_partner_id)
            .then(init_shifts_list);
    }

514
    if (should_select_makeup()) {
515 516 517 518
        $(".makeups_nb").text(partner_data.makeups_to_do);
        $("#need_to_select_makeups_message").show();
    }

519 520
    if (partner_data.extra_shift_done > 0) {
        $(".extra_shift_done").text(partner_data.extra_shift_done);
521
        $("#can_delete_future_registrations_area").css('display', 'flex');
522 523 524

        $("#offer_extra_shift").on("click", () => {
            openModal(
525
                "<p>Je ne souhaite pas supprimer un service futur.</p>",
526 527 528
                offer_extra_shift,
                "Confirmer",
                false
529 530 531 532
            );
        });

        $("#delete_future_registration").on("click", init_delete_registration_buttons);
533
    }
534

535 536 537 538
    if (partner_data.shift_type === 'ftop' && ftop_can_delete_shift === "True") {
        init_delete_registration_buttons();
    }

539 540 541
    let default_initial_view = "";
    let header_toolbar = {};

542 543 544 545 546 547 548 549
    if (vw <= 768) {
        default_initial_view = 'listWeek';
        header_toolbar = {
            left: 'title',
            center: 'listWeek,timeGridDay',
            right: 'prev,next today'
        };
    } else if (vw <=992) {
550 551 552
        default_initial_view = 'listWeek';
        header_toolbar = {
            left: 'title',
553
            center: 'dayGridMonth,listWeek,timeGridDay',
554
            right: 'prev,next today'
555
        };
556 557 558 559 560 561
    } else {
        default_initial_view = 'dayGridMonth';
        header_toolbar = {
            left: 'prev,next today',
            center: 'title',
            right: 'dayGridMonth,listWeek,timeGridDay'
562
        };
563
    }
564

565
    const hidden_days = days_to_hide.length > 0 ? $.map(days_to_hide.split(", "), Number) : [];
566 567

    const calendarEl = document.getElementById('calendar');
568

569
    calendar = new FullCalendar.Calendar(calendarEl, {
570 571
        locale: 'fr',
        initialView: default_initial_view,
572 573 574
        headerToolbar: header_toolbar,
        buttonText: {
            list: "Semaine"
575 576 577 578 579 580 581 582 583
        },
        eventTimeFormat: {
            hour: '2-digit',
            minute: '2-digit'
        },
        allDaySlot: false,
        contentHeight: "auto",
        eventDisplay: "block",
        hiddenDays: hidden_days,
584
        events: event_src,
585
        eventClick: function(info) {
Etienne Freiss committed
586
            if (!$(info.el).hasClass("shift_booked") && !$(info.el).hasClass("shift_booked_makeup")) {
587 588 589 590 591
                const new_shift_id = info.event.id;

                // Set new shift
                const datetime_new_shift = info.event.start;
                let new_shift_date = datetime_new_shift.toLocaleDateString("fr-fr", date_options);
592 593
                let new_shift_time = datetime_new_shift.toLocaleTimeString("fr-fr", time_options);

594 595 596 597 598 599 600 601 602 603 604
                function showInfoAboutSelectedShift(modal_template, new_shift_date, new_shift_time) {
                    var new_shift_week_day = new_shift_date.replace(/ .*/,'');
                    if (on_picking_shift_template_msg.startsWith(new_shift_week_day + " " + new_shift_time + " ")) {
                        modal_template.find(".on_picking_shift_template_msg").text(
                            on_picking_shift_template_msg.replace(new_shift_week_day + " " + new_shift_time + " ","")
                        );
                    } else {
                        modal_template.find(".on_picking_shift_template_msg").text("");
                    }
                }

605 606 607 608 609
                if (selected_shift !== null && can_exchange_shifts()) {
                    /* shift exchange */
                    // Set old shift
                    let datetime_old_shift = new Date(selected_shift.date_begin);
                    let old_shift_date = datetime_old_shift.toLocaleDateString("fr-fr", date_options);
610
                    let old_shift_time = datetime_old_shift.toLocaleTimeString("fr-fr", time_options);
611 612 613

                    // Display modal
                    let modal_template = $("#modal_shift_exchange_template");
614

615 616 617 618
                    modal_template.find(".date_old_shift").text(old_shift_date);
                    modal_template.find(".time_old_shift").text(old_shift_time);
                    modal_template.find(".date_new_shift").text(new_shift_date);
                    modal_template.find(".time_new_shift").text(new_shift_time);
619

620 621
                    showInfoAboutSelectedShift(modal_template, new_shift_date, new_shift_time);

622 623 624 625 626 627 628
                    openModal(
                        modal_template.html(),
                        () => {
                            add_or_change_shift(new_shift_id);
                        },
                        "Valider"
                    );
629
                } else if (partner_data.shift_type !== 'ftop' && selected_shift === null && can_exchange_shifts()) {
630 631 632 633 634 635 636 637 638 639
                    if (adding_mode === false) {
                        /* could exchange shift but no old shift selected */
                        openModal(
                            "Je dois sélectionner un service à échanger.",
                            closeModal,
                            "J'ai compris"
                        );
                    } else {
                        // Display modal
                        let modal_template = $("#modal_add_shift_template");
Damien Moulard committed
640

641 642
                        modal_template.find(".date_new_shift").text(new_shift_date);
                        modal_template.find(".time_new_shift").text(new_shift_time);
643 644 645

                        showInfoAboutSelectedShift(modal_template, new_shift_date, new_shift_time);

646 647 648 649 650 651 652 653
                        openModal(
                            modal_template.html(),
                            () => {
                                add_or_change_shift(new_shift_id);
                            },
                            "Valider"
                        );
                    }
Damien Moulard committed
654

655
                } else if (should_select_makeup() || partner_data.shift_type == 'ftop') {
656 657
                    /* choose a makeup service */
                    let modal_template = $("#modal_add_shift_template");
658

659 660 661
                    modal_template.find(".date_new_shift").text(new_shift_date);
                    modal_template.find(".time_new_shift").text(new_shift_time);

662 663
                    showInfoAboutSelectedShift(modal_template, new_shift_date, new_shift_time);

664 665 666 667 668 669 670 671 672 673
                    openModal(
                        modal_template.html(),
                        () => {
                            add_or_change_shift(new_shift_id);
                        },
                        "Valider"
                    );
                }
            }
        },
674
        eventsSet: function() {
675 676 677
            // Calendar is hidden at first on mobile to hide header change when data is loaded
            $(".loading-calendar").hide();
            $("#calendar").show();
678

679 680 681 682
            if (vw <= 992) {
                $(".fc .fc-header-toolbar").addClass("resp-header-toolbar");
            } else {
                $(".fc .fc-header-toolbar").removeClass("resp-header-toolbar");
683
            }
684 685 686 687 688
        },
        dayCellDidMount: function(dayRenderInfo) {
            add_week_letter_to_elt(dayRenderInfo);

            return dayRenderInfo.el;
689 690
        }
    });
691

692
    calendar.render();
693 694
}

695
async function init_read_only_calendar_page() {
696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718
    let template_explanations = $("#calendar_explaination_template");

    if (vw <= 992) {
        $(".loading-calendar").show();

        $("#calendar_explaination_area").hide();
        $("#calendar_explaination_button").on("click", () => {
            openModal(
                template_explanations.html(),
                closeModal,
                "J'ai compris"
            );
        })
            .show();
    } else {
        $("#calendar_explaination_button").hide();
        $("#calendar_explaination_area").html(template_explanations.html())
            .show();
    }

    if (incoming_shifts !== null) {
        init_shifts_list();
    } else {
719 720
        await load_partner_shifts(partner_data.concerned_partner_id)
        init_shifts_list();
721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756
    }

    if (should_select_makeup()) {
        $(".makeups_nb").text(partner_data.makeups_to_do);
        $("#need_to_select_makeups_message").show();
    }

    let default_initial_view = "";
    let header_toolbar = {};

    if (vw <= 768) {
        default_initial_view = 'listWeek';
        header_toolbar = {
            left: 'title',
            center: 'listWeek,timeGridDay',
            right: 'prev,next today'
        };
    } else if (vw <=992) {
        default_initial_view = 'listWeek';
        header_toolbar = {
            left: 'title',
            center: 'dayGridMonth,listWeek,timeGridDay',
            right: 'prev,next today'
        };
    } else {
        default_initial_view = 'dayGridMonth';
        header_toolbar = {
            left: 'prev,next today',
            center: 'title',
            right: 'dayGridMonth,listWeek,timeGridDay'
        };
    }

    const hidden_days = days_to_hide.length > 0 ? $.map(days_to_hide.split(", "), Number) : [];

    const calendarEl = document.getElementById('read_only_calendar');
757 758 759 760 761 762 763 764 765 766
    let event_src = '/shifts/get_list_shift_calendar/' + partner_data.concerned_partner_id;
    if (partner_data.comite === "True") {
        let next_evts = []
        if (incoming_shifts.length > 0) {
            incoming_shifts.forEach((s) => {
                next_evts.push({id: s.id, title: 'Prélèvement 1 point', allDay: true, start: s.date_begin})
            });
        }
        event_src = next_evts
    }
767 768 769 770 771 772 773 774 775 776 777 778 779 780 781
    calendar = new FullCalendar.Calendar(calendarEl, {
        locale: 'fr',
        initialView: default_initial_view,
        headerToolbar: header_toolbar,
        buttonText: {
            list: "Semaine"
        },
        eventTimeFormat: {
            hour: '2-digit',
            minute: '2-digit'
        },
        allDaySlot: false,
        contentHeight: "auto",
        eventDisplay: "block",
        hiddenDays: hidden_days,
782
        events: event_src,
783
        eventsSet: function() {
784 785 786 787 788 789 790 791 792 793 794 795 796 797 798
            // Calendar is hidden at first on mobile to hide header change when data is loaded
            $(".loading-calendar").hide();
            $("#calendar").show();

            if (vw <= 992) {
                $(".fc .fc-header-toolbar").addClass("resp-header-toolbar");
            } else {
                $(".fc .fc-header-toolbar").removeClass("resp-header-toolbar");
            }
        }
    });

    calendar.render();
}

Damien Moulard committed
799
function init_delete_registration_buttons() {
800
    $(".delete_registration_button").off();
801
    $(".delete_registration_button").hide();
802

803
    if (partner_data.extra_shift_done > 0 || partner_data.shift_type === 'ftop' && ftop_can_delete_shift === "True") {
804 805
        $(".delete_registration_button").on("click", function() {
            let shift_name = $(this).closest("div")
Damien Moulard committed
806 807
                .parent()
                .parent()
808 809 810 811 812 813
                .find(".shift_line_date")
                .text()
                .trim();
            let shift_id = $(this).closest(".shift_line_container")
                .attr('id')
                .split('_')[2];
Damien Moulard committed
814

815 816 817 818 819 820 821 822 823
            openModal(
                `<p>Je m'apprête à supprimer ma présence au service du <b>${shift_name}</b></p>`,
                () => {
                    delete_shift_registration(shift_id);
                },
                "Confirmer",
                false
            );
        });
Damien Moulard committed
824

825 826
        $(".delete_registration_button").css('display', 'flex');
    }
827 828
}

829 830
function init_shifts_exchange() {
    $(".shifts_exchange_page_content").hide();
831
    vw = window.innerWidth;
832

833
    if (partner_data.cooperative_state === 'unsubscribed' || partner_data.cooperative_state === 'gone') {
834 835 836 837 838 839 840 841 842 843
        $("#unsuscribed_content").show();

        $(".unsuscribed_form_link")
            .show()
            .attr('href', unsuscribe_form_link)
            .on('click', function() {
                setTimeout(500, () => {
                    $(this).removeClass('active');
                });
            });
844
    } else if (partner_data.comite === "True") {
845
        let msg_template = $("#comite_template");
Etienne Freiss committed
846

847 848
        $(".comite_content_msg").html(msg_template.html());
        $("#comite_content").show();
849
        init_read_only_calendar_page();
850 851 852 853
    } else {
        $("#shifts_exchange_content").show();
        init_calendar_page();
    }
854

855
    $('#start_adding_shift').click((c) => {
Damien Moulard committed
856 857 858 859 860 861 862 863 864 865 866
        openModal(
            "<p>Je souhaite sélectionner un service supplémentaire.</p>",
            () => {
                $(c.target).prop('disabled', true);
                adding_mode = true;
                closeModal();
            },
            "Confirmer",
            false
        );
    });
867

Etienne Freiss committed
868
    $(window).smartresize(function() {
Damien Moulard committed
869
        // only apply if a width threshold is passed
870
        if (
Etienne Freiss committed
871 872 873
            vw > 992 && window.innerWidth <= 992 ||
            vw <= 992 && window.innerWidth > 992 ||
            vw > 768 && window.innerWidth <= 768 ||
874 875 876 877 878 879 880
            vw <= 768 && window.innerWidth > 768
        ) {
            vw = window.innerWidth;
            init_calendar_page();
        } else {
            vw = window.innerWidth;
        }
881
    });
Thibault Grandjean committed
882
}