367 lines
11 KiB
PHP
367 lines
11 KiB
PHP
@extends('layouts.app')
|
||
|
||
@section('title', __('essentials::lang.reminders'))
|
||
|
||
@section('content')
|
||
@include('essentials::layouts.nav_essentials')
|
||
<section class="content">
|
||
<div class="row">
|
||
<div class="col-md-12">
|
||
<div class="box box-solid">
|
||
<div class="box-body">
|
||
<div class="row">
|
||
<div class="col-md-12">
|
||
<div class="box-tools pull-right">
|
||
<button data-href="#" class="btn btn-sm btn-primary add_reminder">
|
||
<i class="fa fa-plus"></i>
|
||
@lang('essentials::lang.add_reminder')
|
||
</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div id="calendar">
|
||
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
@include('essentials::reminder.create')
|
||
</section>
|
||
<!-- show reminder modal -->
|
||
<div class="modal fade view_reminder" id="exampleModalCenter" tabindex="-1" role="dialog" aria-labelledby="exampleModalCenterTitle" aria-hidden="true"></div>
|
||
@endsection
|
||
|
||
@section('javascript')
|
||
@php
|
||
$fullcalendar_lang_file = session()->get('user.language', config('app.locale') ) . '.js';
|
||
@endphp
|
||
<!-- TODO -->
|
||
@if(file_exists(public_path() . '/plugins/fullcalendar/locale/' . $fullcalendar_lang_file))
|
||
<!-- <script src="{{ asset('plugins/fullcalendar/locale/' . $fullcalendar_lang_file . '?v=' . $asset_v) }}"></script> -->
|
||
@endif
|
||
<script type="text/javascript">
|
||
$(document).ready(function(){
|
||
var use_persian_calendar = true;
|
||
// Force native conversion; j-token behavior is inconsistent in this build.
|
||
var has_moment_jalali = false;
|
||
var jalali_month_names = ['فروردین', 'اردیبهشت', 'خرداد', 'تیر', 'مرداد', 'شهریور', 'مهر', 'آبان', 'آذر', 'دی', 'بهمن', 'اسفند'];
|
||
var persian_digits = ['۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹'];
|
||
var arabic_digits = ['٠', '١', '٢', '٣', '٤', '٥', '٦', '٧', '٨', '٩'];
|
||
|
||
function to_english_digits(value) {
|
||
value = String(value || '');
|
||
for (var i = 0; i < 10; i++) {
|
||
value = value.replace(new RegExp(persian_digits[i], 'g'), String(i));
|
||
value = value.replace(new RegExp(arabic_digits[i], 'g'), String(i));
|
||
}
|
||
return value;
|
||
}
|
||
|
||
function parse_localized_int(value) {
|
||
return parseInt(to_english_digits(value), 10);
|
||
}
|
||
|
||
function safe_jalali_month_name(month_index) {
|
||
var idx = parseInt(month_index, 10);
|
||
if (!isFinite(idx) || idx < 1 || idx > 12) {
|
||
return 'ماه';
|
||
}
|
||
return jalali_month_names[idx - 1];
|
||
}
|
||
|
||
function safe_jalali_number(value, fallback) {
|
||
var n = parseInt(value, 10);
|
||
if (!isFinite(n)) {
|
||
return fallback;
|
||
}
|
||
return n;
|
||
}
|
||
|
||
function gregorian_to_jalali_parts(gy, gm, gd) {
|
||
var g_d_m = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334];
|
||
var gy2 = (gm > 2) ? (gy + 1) : gy;
|
||
var days = 355666 + (365 * gy) + Math.floor((gy2 + 3) / 4) - Math.floor((gy2 + 99) / 100) + Math.floor((gy2 + 399) / 400) + gd + g_d_m[gm - 1];
|
||
var jy = -1595 + (33 * Math.floor(days / 12053));
|
||
days %= 12053;
|
||
jy += 4 * Math.floor(days / 1461);
|
||
days %= 1461;
|
||
|
||
if (days > 365) {
|
||
jy += Math.floor((days - 1) / 365);
|
||
days = (days - 1) % 365;
|
||
}
|
||
|
||
var jm, jd;
|
||
if (days < 186) {
|
||
jm = 1 + Math.floor(days / 31);
|
||
jd = 1 + (days % 31);
|
||
} else {
|
||
jm = 7 + Math.floor((days - 186) / 30);
|
||
jd = 1 + ((days - 186) % 30);
|
||
}
|
||
|
||
return {jy: jy, jm: jm, jd: jd};
|
||
}
|
||
|
||
function get_jalali_parts_from_moment(m) {
|
||
if (has_moment_jalali) {
|
||
var parsed = {
|
||
jy: parse_localized_int(m.format('jYYYY')),
|
||
jm: parse_localized_int(m.format('jM')),
|
||
jd: parse_localized_int(m.format('jD'))
|
||
};
|
||
parsed.jy = safe_jalali_number(parsed.jy, parseInt(m.format('YYYY'), 10));
|
||
parsed.jm = safe_jalali_number(parsed.jm, 1);
|
||
parsed.jd = safe_jalali_number(parsed.jd, 1);
|
||
return parsed;
|
||
}
|
||
|
||
return gregorian_to_jalali_parts(
|
||
parseInt(m.format('YYYY'), 10),
|
||
parseInt(m.format('M'), 10),
|
||
parseInt(m.format('D'), 10)
|
||
);
|
||
}
|
||
|
||
function to_persian_digits(value) {
|
||
if (typeof persian_number === 'function') {
|
||
return persian_number(value);
|
||
}
|
||
return value;
|
||
}
|
||
|
||
function get_persian_calendar_title(view) {
|
||
if (!use_persian_calendar) {
|
||
return null;
|
||
}
|
||
|
||
var start = view.intervalStart ? view.intervalStart.clone() : view.start.clone();
|
||
var end = view.intervalEnd ? view.intervalEnd.clone().subtract(1, 'day') : view.end.clone().subtract(1, 'day');
|
||
|
||
var start_j = get_jalali_parts_from_moment(start);
|
||
var end_j = get_jalali_parts_from_moment(end);
|
||
|
||
if (view.name === 'month') {
|
||
var anchor_date = $('#calendar').fullCalendar('getDate');
|
||
if (anchor_date && anchor_date.isValid && anchor_date.isValid()) {
|
||
start_j = get_jalali_parts_from_moment(anchor_date.clone());
|
||
}
|
||
return to_persian_digits(safe_jalali_month_name(start_j.jm) + ' ' + safe_jalali_number(start_j.jy, '----'));
|
||
}
|
||
|
||
if (view.name === 'agendaWeek') {
|
||
if (start_j.jy === end_j.jy && start_j.jm === end_j.jm) {
|
||
return to_persian_digits(
|
||
safe_jalali_number(start_j.jd, 1) + ' - ' + safe_jalali_number(end_j.jd, 1) + ' ' + safe_jalali_month_name(end_j.jm) + ' ' + safe_jalali_number(end_j.jy, '----')
|
||
);
|
||
}
|
||
return to_persian_digits(
|
||
safe_jalali_number(start_j.jd, 1) + ' ' + safe_jalali_month_name(start_j.jm) + ' ' + safe_jalali_number(start_j.jy, '----') +
|
||
' - ' +
|
||
safe_jalali_number(end_j.jd, 1) + ' ' + safe_jalali_month_name(end_j.jm) + ' ' + safe_jalali_number(end_j.jy, '----')
|
||
);
|
||
}
|
||
|
||
return to_persian_digits(safe_jalali_number(start_j.jd, 1) + ' ' + safe_jalali_month_name(start_j.jm) + ' ' + safe_jalali_number(start_j.jy, '----'));
|
||
}
|
||
|
||
function patch_calendar_for_persian(view) {
|
||
if (!use_persian_calendar) {
|
||
return;
|
||
}
|
||
|
||
var custom_title = get_persian_calendar_title(view);
|
||
if (custom_title) {
|
||
setTimeout(function() {
|
||
$('#calendar').find('.fc-toolbar .fc-center h2, .fc-center h2').text(custom_title);
|
||
}, 0);
|
||
}
|
||
|
||
$('#calendar').find('.fc-day-top[data-date]').each(function() {
|
||
var date_value = $(this).attr('data-date');
|
||
if (!date_value) {
|
||
return;
|
||
}
|
||
var m = moment(date_value, 'YYYY-MM-DD');
|
||
if (!m.isValid()) {
|
||
return;
|
||
}
|
||
var j = get_jalali_parts_from_moment(m);
|
||
$(this).find('.fc-day-number').text(to_persian_digits(j.jd));
|
||
});
|
||
}
|
||
|
||
function refresh_calendar_title_for_persian() {
|
||
var current_view = $('#calendar').fullCalendar('getView');
|
||
if (current_view) {
|
||
patch_calendar_for_persian(current_view);
|
||
}
|
||
}
|
||
|
||
//on button click show modal
|
||
$('button.add_reminder').click( function(){
|
||
$('div.reminder').modal('show');
|
||
});
|
||
|
||
//call function when modal opened
|
||
$(".reminder").on('shown.bs.modal', function(){
|
||
//reminder_form validate
|
||
reminder_form_validator = $("form#reminder_form").validate();
|
||
|
||
//date-picker (use Persian calendar when enabled)
|
||
if (typeof initPersianDatepicker === 'function') {
|
||
initPersianDatepicker('form#reminder_form .datepicker', {
|
||
autoClose: true
|
||
});
|
||
} else {
|
||
$('form#reminder_form .datepicker').datepicker({
|
||
autoclose: true,
|
||
format:datepicker_date_format,
|
||
});
|
||
}
|
||
|
||
//time
|
||
__init_time_field('form#reminder_form input#time');
|
||
__init_time_field('form#reminder_form input#end_time');
|
||
});
|
||
|
||
//on hide reset reminder_form
|
||
$('.reminder').on('hidden.bs.modal', function(){
|
||
reminder_form_validator.destroy();
|
||
$("form#reminder_form")[0].reset();
|
||
});
|
||
|
||
//saving reminder
|
||
$(document).on("submit", "form#reminder_form", function(e){
|
||
e.preventDefault();
|
||
var data = $("form#reminder_form").serialize();
|
||
var url = $("form#reminder_form").attr("action");
|
||
$.ajax({
|
||
method: "POST",
|
||
url: url,
|
||
data: data,
|
||
dataType: "json",
|
||
success: function(result){
|
||
if(result.success == true){
|
||
$('.reminder').modal("hide");
|
||
reload_calendar();
|
||
toastr.success(result.msg);
|
||
} else {
|
||
toastr.error(result.msg);
|
||
}
|
||
}
|
||
});
|
||
});
|
||
|
||
//full calender
|
||
clickCount = 0;
|
||
$("#calendar").fullCalendar({
|
||
header:{
|
||
left: 'prev,next today',
|
||
center: 'title',
|
||
right: 'month,agendaWeek,agendaDay'
|
||
},
|
||
locale: (typeof app_locale !== 'undefined' ? app_locale : 'en'),
|
||
eventLimit: true,
|
||
events: '/essentials/reminder',
|
||
// timeFormat: 'h(:mm)t', // like '7p'
|
||
eventRender:function(event, element){
|
||
var eventname_html = event.name;
|
||
element.find('.fc-title').html(eventname_html);
|
||
element.attr('data-href', event.url);
|
||
element.attr('data-container', '.view_reminder');
|
||
element.addClass('btn-modal');
|
||
},
|
||
dayClick: function(date, jsEvent, view){
|
||
clickCount++;
|
||
if(clickCount == 2){
|
||
$('.reminder').modal("show");
|
||
}
|
||
var clickTimer = setInterval(function(){
|
||
clickCount = 0;
|
||
clearInterval(clickTimer);
|
||
}, 500);
|
||
},
|
||
viewRender: function(view) {
|
||
patch_calendar_for_persian(view);
|
||
},
|
||
eventAfterAllRender: function(view) {
|
||
patch_calendar_for_persian(view);
|
||
}
|
||
});
|
||
|
||
// Ensure title/day numbers stay patched after toolbar navigation.
|
||
setTimeout(refresh_calendar_title_for_persian, 0);
|
||
$(document).on('click', '#calendar .fc-prev-button, #calendar .fc-next-button, #calendar .fc-today-button, #calendar .fc-month-button, #calendar .fc-agendaWeek-button, #calendar .fc-agendaDay-button', function() {
|
||
setTimeout(refresh_calendar_title_for_persian, 0);
|
||
});
|
||
setInterval(refresh_calendar_title_for_persian, 500);
|
||
|
||
//reload_calendar
|
||
function reload_calendar()
|
||
{
|
||
$('#calendar').fullCalendar( 'refetchEvents' );
|
||
}
|
||
|
||
//on click show reminder
|
||
$(document).on('click', '.btn-modal', function(){
|
||
});
|
||
|
||
//call function when modal opened
|
||
$(".view_reminder").on('shown.bs.modal', function(){
|
||
$("form#update_reminder_repeat").validate();
|
||
});
|
||
|
||
//delete reminder
|
||
$(document).on('click', '#delete_reminder', function(){
|
||
var url = $(this).data("href");
|
||
swal({
|
||
title: LANG.sure,
|
||
icon: "warning",
|
||
buttons: true,
|
||
dangerMode: true,
|
||
}).then((confirmed) => {
|
||
if (confirmed) {
|
||
$.ajax({
|
||
method: "DELETE",
|
||
url: url,
|
||
dataType: "json",
|
||
success: function(result){
|
||
if(result.success == true){
|
||
$('.view_reminder').modal('hide');
|
||
reload_calendar();
|
||
toastr.success(result.msg);
|
||
} else {
|
||
toastr.error(result.msg);
|
||
}
|
||
}
|
||
});
|
||
}
|
||
});
|
||
});
|
||
|
||
//update reminder_repeat
|
||
$(document).on('submit', 'form#update_reminder_repeat', function(e){
|
||
e.preventDefault();
|
||
var url = $("form#update_reminder_repeat").attr("action");
|
||
var data = $("form#update_reminder_repeat").serialize();
|
||
$.ajax({
|
||
method: "PUT",
|
||
url: url,
|
||
data: data,
|
||
dataType: "json",
|
||
success: function(result){
|
||
if(result.success == true){
|
||
$('.view_reminder').modal('hide');
|
||
reload_calendar();
|
||
toastr.success(result.msg);
|
||
} else {
|
||
toastr.error(result.msg);
|
||
}
|
||
}
|
||
});
|
||
});
|
||
});
|
||
</script>
|
||
@endsection |