feat: Add recursive task handling and lightbox for task images
This commit is contained in:
@@ -84,6 +84,10 @@ class Cron
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* sprawdzenie daty ostatniego powtórzenia */
|
||||||
|
if ( $row['recursive_last_date'] and $new_date_end > $row['recursive_last_date'] )
|
||||||
|
continue;
|
||||||
|
|
||||||
$days_reminder = explode( ',', $row['reminders_interval'] );
|
$days_reminder = explode( ',', $row['reminders_interval'] );
|
||||||
$max_days_reminder = max( $days_reminder );
|
$max_days_reminder = max( $days_reminder );
|
||||||
|
|
||||||
@@ -97,7 +101,7 @@ class Cron
|
|||||||
$row['show_in_calendar'] ? $show_in_calendar = 'on' : $show_in_calendar = 'off';
|
$row['show_in_calendar'] ? $show_in_calendar = 'on' : $show_in_calendar = 'off';
|
||||||
|
|
||||||
$new_task_id = \factory\Tasks::task_save(
|
$new_task_id = \factory\Tasks::task_save(
|
||||||
null, $row['id'], $row['created_by'], $row['name'], $row['text'], $new_date_start, $new_date_end, $row['project_id'], $row['client_id'], $row['pay_rate'], $row['reminders_interval'], $row['recursively'] ? 'on' : 'off', $row['frequency'], $row['period'], $task_users, $row['date_end_month_day'], $row['date_start_month_day'], null, $row['status_change_mail'], true, $status, $show_in_calendar, $row['priority']
|
null, $row['id'], $row['created_by'], $row['name'], $row['text'], $new_date_start, $new_date_end, $row['project_id'], $row['client_id'], $row['pay_rate'], $row['reminders_interval'], $row['recursively'] ? 'on' : 'off', $row['frequency'], $row['period'], $task_users, $row['date_end_month_day'], $row['date_start_month_day'], null, $row['status_change_mail'], true, $status, $show_in_calendar, $row['priority'], $row['recursive_last_date']
|
||||||
);
|
);
|
||||||
|
|
||||||
if ( $new_task_id ) {
|
if ( $new_task_id ) {
|
||||||
|
|||||||
@@ -415,10 +415,11 @@ class Tasks
|
|||||||
$values['send_email_notification'] = isset( $values['send_email_notification'] ) ? $values['send_email_notification'] : 'off';
|
$values['send_email_notification'] = isset( $values['send_email_notification'] ) ? $values['send_email_notification'] : 'off';
|
||||||
$values['users'] = isset( $values['users'] ) ? $values['users'] : [];
|
$values['users'] = isset( $values['users'] ) ? $values['users'] : [];
|
||||||
$values['priority'] = isset( $values['priority'] ) && $values['priority'] !== '' ? $values['priority'] : 0;
|
$values['priority'] = isset( $values['priority'] ) && $values['priority'] !== '' ? $values['priority'] : 0;
|
||||||
|
$values['recursive_last_date'] = isset( $values['recursive_last_date'] ) ? $values['recursive_last_date'] : null;
|
||||||
$status = \Controllers\TasksController::resolveTaskStatusForSave( $values );
|
$status = \Controllers\TasksController::resolveTaskStatusForSave( $values );
|
||||||
|
|
||||||
if ( $id = \factory\Tasks::task_save(
|
if ( $id = \factory\Tasks::task_save(
|
||||||
$values['id'], null, $user['id'], $values['name'], $values['text'], $values['date_start'], $values['date_end'], $values['project_id'], $values['client_id'], $values['pay_rate'], $values['reminders_interval'], $values['recursively'], $values['frequency'], $values['period'], $values['users'], null, null, $values['send_email_notification'], $values['status_change_mail'], false, $status, $values['show_in_calendar'], $values['priority']
|
$values['id'], null, $user['id'], $values['name'], $values['text'], $values['date_start'], $values['date_end'], $values['project_id'], $values['client_id'], $values['pay_rate'], $values['reminders_interval'], $values['recursively'], $values['frequency'], $values['period'], $values['users'], null, null, $values['send_email_notification'], $values['status_change_mail'], false, $status, $values['show_in_calendar'], $values['priority'], $values['recursive_last_date']
|
||||||
) )
|
) )
|
||||||
{
|
{
|
||||||
\factory\Tasks::clear_task_opened( $id );
|
\factory\Tasks::clear_task_opened( $id );
|
||||||
|
|||||||
@@ -447,7 +447,7 @@ class Tasks
|
|||||||
}
|
}
|
||||||
|
|
||||||
// przy zmianach pamiętać o zadaniach z CRON
|
// przy zmianach pamiętać o zadaniach z CRON
|
||||||
static public function task_save( $task_id, $parent_id = null, $user_id, $name, $text, $date_start, $date_end, $project_id, $client_id, $pay_rate, $reminders_interval, $recursively, $frequency, $period, $users, $date_end_month_day = null, $date_start_month_day = null, $send_email_notification = false, $status_change_mail, $rescursive = false, $status = 0, $show_in_calendar, $priority = 0 )
|
static public function task_save( $task_id, $parent_id = null, $user_id, $name, $text, $date_start, $date_end, $project_id, $client_id, $pay_rate, $reminders_interval, $recursively, $frequency, $period, $users, $date_end_month_day = null, $date_start_month_day = null, $send_email_notification = false, $status_change_mail, $rescursive = false, $status = 0, $show_in_calendar, $priority = 0, $recursive_last_date = null )
|
||||||
{
|
{
|
||||||
global $mdb;
|
global $mdb;
|
||||||
|
|
||||||
@@ -476,6 +476,7 @@ class Tasks
|
|||||||
'status' => $status,
|
'status' => $status,
|
||||||
'show_in_calendar' => self::isEnabled( $show_in_calendar ) ? 1 : 0,
|
'show_in_calendar' => self::isEnabled( $show_in_calendar ) ? 1 : 0,
|
||||||
'priority' => $priority,
|
'priority' => $priority,
|
||||||
|
'recursive_last_date' => $recursive_last_date != '' ? $recursive_last_date : null,
|
||||||
] );
|
] );
|
||||||
$id = $mdb -> id();
|
$id = $mdb -> id();
|
||||||
|
|
||||||
@@ -518,6 +519,7 @@ class Tasks
|
|||||||
'status' => $status,
|
'status' => $status,
|
||||||
'show_in_calendar' => self::isEnabled( $show_in_calendar ) ? 1 : 0,
|
'show_in_calendar' => self::isEnabled( $show_in_calendar ) ? 1 : 0,
|
||||||
'priority' => $priority,
|
'priority' => $priority,
|
||||||
|
'recursive_last_date' => $recursive_last_date != '' ? $recursive_last_date : null,
|
||||||
], [
|
], [
|
||||||
'AND' => [
|
'AND' => [
|
||||||
'id' => $task_id
|
'id' => $task_id
|
||||||
|
|||||||
@@ -203,6 +203,12 @@ if ( is_array( $this -> priorities ) )
|
|||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="form_group recursive-detail" style="<?= $this -> task[ 'recursively' ] ? '' : 'display: none;';?>">
|
||||||
|
<label class="label">Powtarzaj do (opcjonalnie):</label>
|
||||||
|
<div class="input">
|
||||||
|
<input type="text" class="form-control datetime" name="recursive_last_date" style="max-width: 200px;" value="<?= $this -> task[ 'recursive_last_date' ];?>" autocomplete="off" placeholder="RRRR-MM-DD">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<?=
|
<?=
|
||||||
\Html::input_switch( [
|
\Html::input_switch( [
|
||||||
'label' => 'Powiadom użytkowników mailem',
|
'label' => 'Powiadom użytkowników mailem',
|
||||||
@@ -264,10 +270,11 @@ echo $grid -> draw();
|
|||||||
$(document).ready(function ()
|
$(document).ready(function ()
|
||||||
{
|
{
|
||||||
function toggleRecursiveDetails() {
|
function toggleRecursiveDetails() {
|
||||||
if ( $( '#recursively' ).is( ':checked' ) )
|
if ( $( '#recursively' ).is( ':checked' ) ) {
|
||||||
$( '#recursive-details' ).show();
|
$( '#recursive-details, .recursive-detail' ).show();
|
||||||
else
|
} else {
|
||||||
$( '#recursive-details' ).hide();
|
$( '#recursive-details, .recursive-detail' ).hide();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$('input[type="checkbox"]').iCheck({
|
$('input[type="checkbox"]').iCheck({
|
||||||
|
|||||||
@@ -284,6 +284,50 @@
|
|||||||
.task_popup .task_details .content .right .client .select2-container--bootstrap-5.select2-container--open .select2-selection {
|
.task_popup .task_details .content .right .client .select2-container--bootstrap-5.select2-container--open .select2-selection {
|
||||||
border-color: #6690f4;
|
border-color: #6690f4;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Lightbox - powiększanie zdjęć w opisie */
|
||||||
|
.task_popup .task_details .description img {
|
||||||
|
cursor: zoom-in;
|
||||||
|
transition: opacity .2s ease;
|
||||||
|
}
|
||||||
|
.task_popup .task_details .description img:hover {
|
||||||
|
opacity: .85;
|
||||||
|
}
|
||||||
|
.task-img-lightbox {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
z-index: 99999;
|
||||||
|
background: rgba(0,0,0,.85);
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
cursor: zoom-out;
|
||||||
|
animation: taskLightboxIn .2s ease;
|
||||||
|
}
|
||||||
|
@keyframes taskLightboxIn {
|
||||||
|
from { opacity: 0; }
|
||||||
|
to { opacity: 1; }
|
||||||
|
}
|
||||||
|
.task-img-lightbox img {
|
||||||
|
max-width: 90vw;
|
||||||
|
max-height: 90vh;
|
||||||
|
border-radius: 4px;
|
||||||
|
box-shadow: 0 0 40px rgba(0,0,0,.5);
|
||||||
|
object-fit: contain;
|
||||||
|
}
|
||||||
|
.task-img-lightbox .lightbox-close {
|
||||||
|
position: absolute;
|
||||||
|
top: 16px;
|
||||||
|
right: 24px;
|
||||||
|
color: #fff;
|
||||||
|
font-size: 32px;
|
||||||
|
cursor: pointer;
|
||||||
|
line-height: 1;
|
||||||
|
text-shadow: 0 0 8px rgba(0,0,0,.6);
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
( function() {
|
( function() {
|
||||||
@@ -360,6 +404,31 @@
|
|||||||
|
|
||||||
renderTime();
|
renderTime();
|
||||||
|
|
||||||
|
// Lightbox – kliknięcie na zdjęcie w opisie
|
||||||
|
popup.on( 'click', '.description img', function( e ) {
|
||||||
|
e.preventDefault();
|
||||||
|
e.stopPropagation();
|
||||||
|
var src = $( this ).attr( 'src' );
|
||||||
|
if ( !src ) return;
|
||||||
|
|
||||||
|
var $overlay = $( '<div class="task-img-lightbox">' +
|
||||||
|
'<span class="lightbox-close">×</span>' +
|
||||||
|
'<img src="' + src + '">' +
|
||||||
|
'</div>' );
|
||||||
|
|
||||||
|
$( 'body' ).append( $overlay );
|
||||||
|
|
||||||
|
$overlay.on( 'click', function() {
|
||||||
|
$overlay.remove();
|
||||||
|
});
|
||||||
|
|
||||||
|
$( document ).one( 'keydown.taskLightbox', function( ev ) {
|
||||||
|
if ( ev.key === 'Escape' ) {
|
||||||
|
$overlay.remove();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
var interval_id = setInterval( function() {
|
var interval_id = setInterval( function() {
|
||||||
if ( !document.body.contains( popup.get( 0 ) ) )
|
if ( !document.body.contains( popup.get( 0 ) ) )
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user