diff --git a/autoload/controls/class.Tasks.php b/autoload/controls/class.Tasks.php index 02b5a1f..417d2f0 100644 --- a/autoload/controls/class.Tasks.php +++ b/autoload/controls/class.Tasks.php @@ -2,40 +2,15 @@ namespace controls; class Tasks { - static public function gantt_json() { + static public function task_change_dates() { global $mdb; - $tasks = $mdb -> query( 'SELECT t.id, t.name, t.date_start, t.date_end, t.status, t.client_id FROM tasks AS t WHERE show_in_calendar = 1 AND status != 2 ORDER BY date_start ASC' ) -> fetchAll( \PDO::FETCH_ASSOC ); - foreach ( $tasks as $task ) { + $response = [ 'status' => 'error', 'msg' => 'Podczas zmiany daty wystąpił błąd. Proszę spróbować ponownie.' ]; - $class = ''; - if ( $task['status'] == 6 ) - $class = 'ganttGrey'; - elseif ( $task['status'] == 5 ) - $class = 'ganttRed'; + if ( \factory\Tasks::task_change_dates( \S::get( 'task_id' ), \S::get( 'date_start' ), \S::get( 'date_end' ) ) ) + $response = [ 'status' => 'success', 'msg' => 'Data została zmieniona.' ]; - $task_json['name'] = $task['client_id'] ? \factory\Crm::get_client_name( (int)$task['client_id'] ) : $task['name']; - $task_json['desc'] = 'Lorem ipsum dolor sit amet.'; - $task_json['id'] = $task['id']; - $task_json['cssClass'] = 'redLabel'; - $task_json['values'] = [ - [ - 'from' => $task['date_start'] . ' 08:00', - 'to' => $task['date_end'] . ' 16:00', - 'label' => $task['name'], - 'desc' => '', - 'customClass' => $class, - 'dataObj' => [ - 'task_id' => $task['id'], - ] - ] - ]; - $data[] = $task_json; - } - header('Content-Type: application/json'); - - // Zwróć dane jako JSON - echo json_encode($data); + echo json_encode( $response ); exit; } @@ -195,6 +170,7 @@ class Tasks 'show_tasks_bulk' => $show_tasks_bulk, 'show_tasks_to_review' => $show_tasks_to_review, 'users' => \factory\Users::users_list(), + 'tasks_gantt' => \factory\Tasks::get_tasks_gantt(), ] ); } diff --git a/autoload/factory/class.Tasks.php b/autoload/factory/class.Tasks.php index 88172a2..be249fb 100644 --- a/autoload/factory/class.Tasks.php +++ b/autoload/factory/class.Tasks.php @@ -5,6 +5,46 @@ class Tasks { public static $statuses = [ 0 => 'nowe', 3 => 'do rozliczenia', 5 => 'do zrobienia', 4 => 'zaplanowane', 1 => 'do sprawdzenia', 6 => 'faktury', 2 => 'zamknięte' ]; + static public function task_change_dates( $task_id, $date_start, $date_end ) + { + global $mdb; + + if ( !$task_id ) + return false; + + return $mdb -> update( 'tasks', [ + 'date_start' => $date_start, + 'date_end' => $date_end + ], [ + 'id' => $task_id + ] ); + } + + static public function get_tasks_gantt() { + global $mdb; + + $tasks = $mdb -> query( 'SELECT t.id, t.name, t.date_start, t.date_end, t.status, t.client_id FROM tasks AS t WHERE show_in_calendar = 1 AND status != 2 ORDER BY date_start ASC' ) -> fetchAll( \PDO::FETCH_ASSOC ); + foreach ( $tasks as $task ) { + $task_json = []; + $task_json['name'] = $task['client_id'] ? \factory\Crm::get_client_name( (int)$task['client_id'] ) : $task['name']; + // start + $task_json['start'] = $task['date_start']; + // end + $task_json['end'] = $task['date_end']; + // id + $task_json['id'] = $task['id']; + // custom class + if ( $task['date_start'] <= date( 'Y-m-d H:i:s' ) ) + $task_json['custom_class'] = 'gantt-task-backlog'; + // progress + $task_json['progress'] = 0; + + $data[] = $task_json; + } + + return $data; + } + static public function work_delete( $work_id ) { global $mdb; return $mdb -> update( 'tasks_work', [ 'deleted' => 1 ], [ 'id' => $work_id ] ); diff --git a/layout/style.css b/layout/style.css index 0cbdb9d..c782c12 100644 --- a/layout/style.css +++ b/layout/style.css @@ -1 +1 @@ -.default-btn,.task_popup .task_details .content .right .time a:not(.time_worked_toggle),.task_popup .task_details .content .right .time a.time_worked_toggle{display:flex;align-items:center;justify-content:center;height:40px;border-radius:.25rem;padding:0 15px;transition:all .3s ease}.default-btn:hover,.task_popup .task_details .content .right .time a:hover:not(.time_worked_toggle),.task_popup .task_details .content .right .time a.time_worked_toggle:hover{text-decoration:none}.animate{animation:mymove 3s infinite}.text-right{text-align:right}.nowrap{white-space:nowrap}table{border-collapse:collapse}small{font-size:.75em}table{font-size:13px}@keyframes mymove{50%{opacity:.33}}@keyframes gradient-animation{0%{background-position:15% 0%}50%{background-position:85% 100%}100%{background-position:15% 0%}}@keyframes frame-enter{0%{-webkit-clip-path:polygon(0% 100%, 3px 100%, 3px 3px, calc(100% - 3px) 3px, calc(100% - 3px) calc(100% - 3px), 3px calc(100% - 3px), 3px 100%, 100% 100%, 100% 0%, 0% 0%);clip-path:polygon(0% 100%, 3px 100%, 3px 3px, calc(100% - 3px) 3px, calc(100% - 3px) calc(100% - 3px), 3px calc(100% - 3px), 3px 100%, 100% 100%, 100% 0%, 0% 0%)}25%{-webkit-clip-path:polygon(0% 100%, 3px 100%, 3px 3px, calc(100% - 3px) 3px, calc(100% - 3px) calc(100% - 3px), calc(100% - 3px) calc(100% - 3px), calc(100% - 3px) 100%, 100% 100%, 100% 0%, 0% 0%);clip-path:polygon(0% 100%, 3px 100%, 3px 3px, calc(100% - 3px) 3px, calc(100% - 3px) calc(100% - 3px), calc(100% - 3px) calc(100% - 3px), calc(100% - 3px) 100%, 100% 100%, 100% 0%, 0% 0%)}50%{-webkit-clip-path:polygon(0% 100%, 3px 100%, 3px 3px, calc(100% - 3px) 3px, calc(100% - 3px) 3px, calc(100% - 3px) 3px, calc(100% - 3px) 3px, calc(100% - 3px) 3px, 100% 0%, 0% 0%);clip-path:polygon(0% 100%, 3px 100%, 3px 3px, calc(100% - 3px) 3px, calc(100% - 3px) 3px, calc(100% - 3px) 3px, calc(100% - 3px) 3px, calc(100% - 3px) 3px, 100% 0%, 0% 0%)}75%{-webkit-clip-path:polygon(0% 100%, 3px 100%, 3px 3px, 3px 3px, 3px 3px, 3px 3px, 3px 3px, 3px 3px, 3px 0%, 0% 0%)}100%{-webkit-clip-path:polygon(0% 100%, 3px 100%, 3px 100%, 3px 100%, 3px 100%, 3px 100%, 3px 100%, 3px 100%, 3px 100%, 0% 100%)}}*{box-sizing:border-box}body{font-family:"Open Sans",sans-serif;margin:0;padding:0;font-size:15px;color:#4e5e6a}.btn{padding:12px 25px;transition:all .3s ease;color:#fff;border:0;border-radius:.25rem;cursor:pointer;display:inline-flex;text-decoration:none;gap:5px;justify-content:center;align-items:center}.btn.btn_small,.btn.btn-xs{padding:5px 7px;font-size:13px}.btn.btn_small i,.btn.btn-xs i{font-size:12px}.btn.btn-success{background:#099885}.btn.btn-success:hover{background:#4a9c3b}.btn.btn-primary{background:#6690f4}.btn.btn-primary:hover{background:#3164db}.btn.btn-danger{background:#cc563d}.btn.btn-danger:hover{background:#b30000}.hide{display:none}.form-error{color:#cc563d;font-size:13px}.input-group{margin-bottom:10px}input[type=checkbox]{border:1px solid #ebebeb}.form-control{border:1px solid #ebebeb;border-radius:3px;height:35px;width:100%;padding:5px;font-family:"Open Sans",sans-serif}.form-control option{padding:5px}.form-control:focus{border:1px solid #6690f4;outline:none}.unlogged{background:#eef1f9;display:flex;align-items:center;justify-content:center;height:100vh}.unlogged .box-login{background:#fff;padding:25px;border-radius:.25rem;width:400px}.unlogged .box-login .title{text-align:center;padding:10px 10px 25px;border-bottom:1px solid #ebebeb;font-size:20px;margin-bottom:25px}body>.top{background:#fff;border-bottom:1px solid #ebebeb;display:flex;justify-content:space-between;align-items:center}body>.top .logo a{display:inline-flex;color:#6690f4;padding:10px;text-decoration:none}body>.top .logo a span{font-weight:600}body>.top .user-nav{position:relative;font-size:14px;padding:10px}body>.top .user-nav .trigger{cursor:pointer}body>.top .user-nav .trigger i{color:#6690f4}body>.top .user-nav ul{position:absolute;top:100%;left:0;background:#fff;margin:0;padding:0;width:100%;list-style-type:none;border:1px solid #ebebeb;display:none}body>.top .user-nav ul li{cursor:pointer}body>.top .user-nav ul li:hover{background:#f8f9fa}body>.top .user-nav ul li a{color:#333;display:block;text-decoration:none;padding:10px}body>.top .user-nav:hover ul{display:block}.main-menu{display:flex;box-shadow:0 .125rem .25rem rgba(0,0,0,.075) !important}.main-menu ul{display:flex;list-style-type:none;margin:0;padding:0;font-size:14px}.main-menu ul li{cursor:pointer}.main-menu ul li a{color:#333;text-decoration:none;display:inline-flex;padding:10px 15px}.main-menu ul li:hover a{background:#6690f4;color:#fff}.main-menu ul li ul{display:none}.main{padding:25px;background:#d9dee2;min-height:calc(100vh - 80px)}.tasks_container{display:grid;grid-template-columns:repeat(7, 1fr);gap:20px}.tasks_container .column{width:100%}.tasks_container .column h2{display:flex;padding:10px;background:#fff;margin-bottom:10px;font-size:15px;font-weight:300;border-radius:3px 3px 0 0;justify-content:space-between;align-items:center}.tasks_container .column h2 i{cursor:pointer}.tasks_container .column.tasks_suspended h2{border-bottom:5px solid #cc563d}.tasks_container .column.tasks_fvat h2{border-bottom:5px solid #a900fc}.tasks_container .column.tasks_new h2{border-bottom:5px solid #ccc}.tasks_container .column.tasks_bulk h2{border-bottom:5px solid #ff8c00}.tasks_container .column.tasks_to_do h2{border-bottom:5px solid #2aaf47}.tasks_container .column.tasks_to_review h2{border-bottom:5px solid #2535c9}.tasks_container .column.tasks_closed h2{border-bottom:5px solid #000}.tasks_container .column ul{list-style-type:none;margin:0;padding:0}.tasks_container .column ul .task{margin-bottom:5px;background:#fff;padding:10px;border-radius:0;display:flex;position:relative;border-radius:.25rem;flex-wrap:wrap}.tasks_container .column ul .task.notopened{border:2px solid #cc563d}.tasks_container .column ul .task .top{display:flex;justify-content:space-between;margin-bottom:5px;width:100%}.tasks_container .column ul .task .top ._users{display:flex;gap:5px;flex-wrap:wrap}.tasks_container .column ul .task .top ._users .user{display:flex;width:25px;height:25px;border-radius:.25rem;justify-content:center;align-items:center;color:#fff;font-size:12px}.tasks_container .column ul .task .top ._timer{display:flex;gap:5px}.tasks_container .column ul .task .top ._timer .recursively{color:#fff;background:#405189;border-radius:3px;cursor:pointer;margin-bottom:5px;width:25px;height:25px;text-align:center;display:block}.tasks_container .column ul .task .top ._timer .recursively i{font-size:12px}.tasks_container .column ul .task .top ._timer .task_start{display:block;background:#099885;color:#fff;border-radius:.25rem;cursor:pointer;margin-bottom:5px;width:25px;height:25px;text-align:center}.tasks_container .column ul .task .top ._timer .task_start.hidden{display:none}.tasks_container .column ul .task .top ._timer .task_start i{font-size:12px}.tasks_container .column ul .task .top ._timer .task_end{background:#cc563d;display:block;color:#fff;border-radius:.25rem;cursor:pointer;margin-bottom:5px;width:25px;height:25px;text-align:center}.tasks_container .column ul .task .top ._timer .task_end.hidden{display:none}.tasks_container .column ul .task .top ._timer .task_end i{font-size:12px}.tasks_container .column ul .task .middle{width:100%}.tasks_container .column ul .task .name{font-size:14px;color:#333;text-decoration:none;display:block;margin-bottom:5px}.tasks_container .column ul .task .bottom{display:flex;justify-content:space-between}.tasks_container .column ul .task .client_info,.tasks_container .column ul .task .current_status{font-size:12px;font-weight:400}.tasks_container .column ul .task .client_info strong,.tasks_container .column ul .task .current_status strong{font-weight:600}.tasks_container .column ul .task .current_status{position:relative;cursor:pointer}.tasks_container .column ul .task .current_status .status_change{position:absolute;left:0;top:20px;background:#fff;padding:15px;border:1px solid #dfdfdf;border-radius:3px;cursor:pointer;box-shadow:0 0 15px rgba(0,0,0,.1);z-index:99;display:none}.tasks_container .column ul .task .current_status .status_change select{width:250px;padding:10px;border:1px solid #ebebeb;border-radius:3px}.tasks_container .column ul .task .current_status .status_change select option{font-size:15px;padding:3px}.tasks_container .column ul .task .dates{margin-bottom:5px;display:flex;justify-content:space-between;font-size:12px}.tasks_container .column ul .task .dates .danger{color:#cc563d;font-weight:600}.tasks_container .column ul .task .dates .warning{color:#ff8c00}.tasks_container .column ul .task .dates i{font-size:12px;color:#c9ced4;margin-right:5px}.action_menu{display:flex;margin-bottom:25px;gap:20px}.action_menu .btn{display:inline-flex;padding:7px 15px;color:#fff;border-radius:3px;text-decoration:none;align-items:center;justify-content:center;gap:5px}.action_menu .btn.btn_add{background:#099885}.action_menu .btn.btn_add:hover{background:#4a9c3b}.action_menu .btn.btn_cancel{background:#cc563d}.action_menu .btn.btn_cancel:hover{background:#b30000}.action_menu .btn.disabled{opacity:.5}.form_container{background:#fff;padding:25px;max-width:1300px}.form_container.full{max-width:100%}.form_container .form_group{margin-bottom:10px;display:flex}.form_container .form_group>.label{width:300px;display:inline-flex;align-items:flex-start;justify-content:right;padding-right:10px}.form_container .form_group .input{width:calc(100% - 300px)}.fullscreen_description{position:fixed !important;top:25px;left:25px;right:25px;bottom:25px;z-index:9999;background:#fff;padding:20px;overflow:auto;border-radius:.25rem;box-shadow:0 0 20px rgba(0,0,0,.3)}.fullscreen{position:absolute;top:10px;right:10px;cursor:pointer;color:#fff;background:#cc563d;display:inline-flex;height:40px;width:40px;border-radius:.25rem;align-items:center;justify-content:center;transition:all .3s ease}.fullscreen:hover{transform:scale(1.05);text-decoration:none}.task_popup{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.5);display:none;z-index:9999}.task_popup .task_details{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);background:#fff;padding:25px;border-radius:.25rem;max-width:1140px;width:100%;transition:all .3s ease;height:90vh}.task_popup .task_details .content{height:calc(100% - 50px)}.task_popup .task_details.open_works_time{max-width:1540px}.task_popup .task_details.open_works_time .content{grid-template-columns:1fr 300px 350px}.task_popup .task_details.open_works_time .content .task_work_details{display:block}.task_popup .task_details .title{font-size:20px;margin-bottom:25px;display:flex;align-items:center;gap:10px}.task_popup .task_details .title a{border:1px solid #099885;display:inline-flex;height:30px;width:30px;border-radius:.25rem;align-items:center;justify-content:center}.task_popup .task_details .title a:hover{text-decoration:none}.task_popup .task_details .title a i{color:#099885}.task_popup .task_details .title a.task-delete{border:1px solid #cc563d}.task_popup .task_details .title a.task-delete i{color:#cc563d}.task_popup .task_details .title a i{font-size:14px}.task_popup .task_details .close{position:absolute;top:10px;right:10px;cursor:pointer}.task_popup .task_details .content{display:grid;font-size:14px;grid-template-columns:1fr 300px;gap:30px;transition:all .3s ease}.task_popup .task_details .content h3{width:100%;margin-top:0;margin-bottom:5px;font-weight:500;color:#000;font-size:17px}.task_popup .task_details .content .left{height:100%;overflow:hidden}.task_popup .task_details .content .left .users{display:flex;gap:20px}.task_popup .task_details .content .left .users .user{display:flex;gap:10px;align-items:center;margin-bottom:10px}.task_popup .task_details .content .left .users .user .avatar{height:30px;width:30px;border-radius:.25rem;background:#ccc;display:flex;justify-content:center;align-items:center;color:#fff;font-size:12px}.task_popup .task_details .content .left .comments{border-radius:3px;margin-bottom:10px}.task_popup .task_details .content .left .comments .new_comment{margin-bottom:10px}.task_popup .task_details .content .left .comments .new_comment textarea{height:75px;margin-bottom:10px;border-radius:.25rem}.task_popup .task_details .content .left .comments .new_comment .add_comment{background:#099885;color:#fff;padding:10px;border-radius:.25rem;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;width:200px;text-decoration:none}.task_popup .task_details .content .left .comments .new_comment .add_comment:hover{background:#4a9c3b}.task_popup .task_details .content .left .comments ul{margin:0;padding:0;list-style-type:none}.task_popup .task_details .content .left .comments ul li{background:#ced4da;margin-bottom:5px;padding:15px;border-radius:.25rem;position:relative}.task_popup .task_details .content .left .comments ul li .delete_comment{position:absolute;top:10px;right:10px;cursor:pointer;color:#cc563d}.task_popup .task_details .content .left .comments ul li .author{font-weight:600;margin-bottom:5px;display:inline-flex;margin-right:10px}.task_popup .task_details .content .left .comments ul li .date{font-size:12px;margin-bottom:5px;display:inline-flex}.task_popup .task_details .content .left .comments ul li .text{margin-bottom:15px;font-size:13px}.task_popup .task_details .content .left .checklist{border-radius:3px;margin-bottom:10px}.task_popup .task_details .content .left .checklist .new_element{display:flex;margin-bottom:10px}.task_popup .task_details .content .left .checklist .new_element a{display:flex;align-items:center;justify-content:center;padding:10px;border-radius:0 .25rem .25rem 0;text-decoration:none;width:35px;background:#099885;color:#fff}.task_popup .task_details .content .left .checklist ul{margin:0;padding:0;list-style-type:none;overflow-y:auto;max-height:calc(90vh - 400px)}.task_popup .task_details .content .left .checklist ul li{display:flex;gap:10px;margin-bottom:5px;background:#fff;border-radius:3px;padding:10px;border:1px solid #ebebeb;font-size:13px;align-items:flex-start}.task_popup .task_details .content .left .checklist ul li a{margin-left:auto;margin-right:0;cursor:pointer;background:#cc563d;display:flex;height:25px;width:25px;min-width:25px;justify-content:center;align-items:center;border:0;border-radius:3px;transition:all .3s ease}.task_popup .task_details .content .left .checklist ul li a:hover{text-decoration:none;background:#b30000}.task_popup .task_details .content .left .checklist ul li a i{color:#fff;font-size:12px}.task_popup .task_details .content .left .description{padding:15px;border-radius:.25rem;border:1px solid #ebebeb;margin-bottom:15px;max-height:202px;overflow-x:hidden;position:relative}.task_popup .task_details .content .right .box{margin-bottom:15px}.task_popup .task_details .content .right .time a.time_worked_toggle{color:#299cdb;display:inline-flex;border:1px solid #299cdb}.task_popup .task_details .content .right .time a.time_worked_toggle:hover{background:#dff0fa;text-decoration:none}.task_popup .task_details .content .right .time a.time_worked_toggle:active,.task_popup .task_details .content .right .time a.time_worked_toggle:focus{text-decoration:none}.task_popup .task_details .content .right .time a:not(.time_worked_toggle){margin-top:10px;text-decoration:none;gap:10px}.task_popup .task_details .content .right .time a:not(.time_worked_toggle).task_start{background:#0ab39c;color:#fff}.task_popup .task_details .content .right .time a:not(.time_worked_toggle).task_start:hover{background:#099885}.task_popup .task_details .content .right .time a:not(.time_worked_toggle).task_end{background:#cc563d;color:#fff}.task_popup .task_details .content .right .time a:not(.time_worked_toggle).hidden{display:none}.task_popup .task_details .content .right .dates{display:flex;justify-content:space-between;flex-wrap:wrap}.task_popup .task_details .content .right .dates .danger{color:#cc563d;font-weight:600}.task_popup .task_details .content .right .dates .warning{color:#ff8c00}.task_popup .task_details .content .right .dates i{color:#c9ced4;margin-right:5px}.task_popup .task_details .content .task_work_details{display:none;overflow-y:auto;max-height:508px;width:100%;padding-right:10px;padding-top:4px}.task_popup .task_details .content .task_work_details ._line{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;margin-bottom:5px}.task_popup .task_details .content .task_work_details ._line ._user{width:100%;font-size:13px}.task_popup .task_details .content .task_work_details ._line input{width:calc(50% - 25px);text-align:center;margin-left:2px;margin-right:2px}.task_popup .task_details .content .task_work_details ._work_delete{display:inline-flex;height:35px;width:35px;border-radius:.25rem;align-items:center;justify-content:center;cursor:pointer;border:1px solid #cc563d;margin-left:2px;transition:all .3s ease}.task_popup .task_details .content .task_work_details ._work_delete:hover{background:#cc563d}.task_popup .task_details .content .task_work_details ._work_delete:hover i{color:#fff}.task_popup .task_details .content .task_work_details ._work_delete i{transition:all .3s ease;color:#cc563d}.table{width:100%}.table th,.table td{border:1px solid #ebebeb;padding:5px}.table td.center{text-align:center}.table td.left{text-align:left}.projects_container{background:#fff;padding:15px;border-radius:.25rem;display:flex;gap:20px}.projects_container .left{width:calc(100% - 250px)}.projects_container .left ._projects,.projects_container .left ._users{display:flex;gap:20px;flex-wrap:wrap}.projects_container .right{width:250px;display:flex;flex-wrap:wrap;align-items:flex-start;justify-content:center;gap:20px;border-left:1px solid #ebebeb;padding-left:15px}.projects_container .right select{width:200px}.default_popup{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.5);display:none}.default_popup .popup_content{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);background:#fff;padding:25px;border-radius:.25rem;max-width:1140px;width:100%}.default_popup .popup_content .close{position:absolute;top:10px;right:10px;cursor:pointer}#fg-cron{margin:10px 0}#fg-cron .countdown{background:#099885;color:#fff;padding:10px}#fg-cron #cron-container{max-height:300px;overflow-x:hidden;overflow-y:auto}#fg-cron #cron-container .msg{font-size:13px;padding:5px;border-bottom:1px solid #e8e8e8}.card{background:#fff;padding:25px;border-radius:.25rem;color:#000;font-size:15px;max-width:1280px}.card.mb25{margin-bottom:25px}.card .card-header{font-weight:600}.card .card-body{padding-top:10px}.card .card-body table{border-collapse:collapse}.card .card-body table th,.card .card-body table td{font-size:14px}.card .card-body table th.bold,.card .card-body table td.bold{font-weight:600}.card .card-body table th.text-right,.card .card-body table td.text-right{text-align:right}.card .card-body table th.text-center,.card .card-body table td.text-center{text-align:center}.card .card-body table th .close-task,.card .card-body table td .close-task{text-decoration:none;color:#6690f4}.card .card-body table th .close-task:hover,.card .card-body table td .close-task:hover{color:#cc563d}.finance-summary{display:grid;grid-template-columns:1fr 1fr 1fr 1fr;gap:10px}.finance-summary .panel{background:#fff;border-radius:.25rem;padding:15px}.finance-summary .panel h1{font-size:20px;margin:0}.finance-summary .panel span{font-size:.85em}.finance-manager{display:grid;gap:10px;grid-template-columns:200px 1fr 500px;padding-top:25px}.finance-manager .manage-menu{display:inline-block;margin-right:10px}.finance-manager .manage-menu a{color:#333;text-decoration:none;font-weight:300;display:block}.finance-manager .actions{width:100px;text-align:center}.finance-manager .actions a{display:inline-flex;margin:0 2px;height:25px;width:25px;align-items:center;justify-content:center;text-decoration:none;color:#000;border:1px solid #e7e7e7;font-size:11px;border-radius:3px;transition:all .3s ease}.finance-manager .actions a:hover{border:1px solid #6690f4}.bootstrap-tagsinput .tag{background:#6690f4;font-size:13px;padding:5px 10px;border-radius:12px}.bootstrap-tagsinput .tag [data-role=remove]{color:#fff !important}.bootstrap-tagsinput .tag [data-role=remove]:hover{box-shadow:none !important;color:#000 !important}.finance-tags{display:flex;flex-wrap:wrap;gap:5px}.finance-tags a:not(.btn){display:flex;width:100%;text-decoration:none;color:#4e5e6a}.finance-tags a:not(.btn).zoom-100{font-size:130%}.finance-tags a:not(.btn).zoom-90{font-size:120%}.finance-tags a:not(.btn).zoom-80{font-size:110%}.finance-tags a:not(.btn).zoom-70{font-size:100%}.finance-tags a:not(.btn).zoom-60{font-size:95%}.finance-tags a:not(.btn).zoom-50{font-size:85%}.finance-tags a:not(.btn).zoom-40{font-size:80%}.finance-tags a:not(.btn).zoom-30{font-size:75%}.finance-tags a:not(.btn).zoom-20{font-size:75%}.finance-tags a:not(.btn).zoom-10{font-size:70%}.finance-tags a:not(.btn).zoom-0{font-size:70%}.manage-menu{position:relative}.manage-menu .context-menu{border-left:4px dotted #000;width:1px;height:100%}.manage-menu .context-menu-container{position:absolute;display:none;background:#fff;box-shadow:5px 5px 15px rgba(0,0,0,.1);top:2px;left:2px}.manage-menu .context-menu-container ul{list-style-type:none;margin:0;padding:0}.manage-menu .context-menu-container ul li a{display:block;padding:7px 15px;white-space:nowrap}.manage-menu .context-menu-container ul li a:hover{background:#f8f8f8}.manage-menu:hover .context-menu-container{display:block}.wiki-categories{display:grid;gap:10px;margin-top:25px;grid-template-columns:1fr 1fr 1fr 1fr}.wiki-categories .category{background:#fff;padding:10px}.wiki-categories .category .users{display:grid;grid-template-columns:1fr 1fr 1fr 1fr;gap:5px}.wiki-categories .category .users .user{display:flex;height:25px;width:25px;border-radius:50%;background:#ccc;justify-content:center;align-items:center;color:#fff;font-size:12px}.wiki-categories .category .actions{display:grid;grid-template-columns:1fr 1fr}.wiki-categories .category .actions a{display:block;color:#4e5e6a;font-size:13px;text-align:center}.wiki-categories .category .title{margin-bottom:5px}.wiki-categories .category .title a{display:block;color:#4e5e6a;font-size:13px;font-weight:600}/*# sourceMappingURL=style.css.map */ \ No newline at end of file +.default-btn,.task_popup .task_details .content .right .time a:not(.time_worked_toggle),.task_popup .task_details .content .right .time a.time_worked_toggle{display:flex;align-items:center;justify-content:center;height:40px;border-radius:.25rem;padding:0 15px;transition:all .3s ease}.default-btn:hover,.task_popup .task_details .content .right .time a:hover:not(.time_worked_toggle),.task_popup .task_details .content .right .time a.time_worked_toggle:hover{text-decoration:none}.animate{animation:mymove 3s infinite}.text-right{text-align:right}.nowrap{white-space:nowrap}table{border-collapse:collapse}small{font-size:.75em}table{font-size:13px}@keyframes mymove{50%{opacity:.33}}@keyframes gradient-animation{0%{background-position:15% 0%}50%{background-position:85% 100%}100%{background-position:15% 0%}}@keyframes frame-enter{0%{-webkit-clip-path:polygon(0% 100%, 3px 100%, 3px 3px, calc(100% - 3px) 3px, calc(100% - 3px) calc(100% - 3px), 3px calc(100% - 3px), 3px 100%, 100% 100%, 100% 0%, 0% 0%);clip-path:polygon(0% 100%, 3px 100%, 3px 3px, calc(100% - 3px) 3px, calc(100% - 3px) calc(100% - 3px), 3px calc(100% - 3px), 3px 100%, 100% 100%, 100% 0%, 0% 0%)}25%{-webkit-clip-path:polygon(0% 100%, 3px 100%, 3px 3px, calc(100% - 3px) 3px, calc(100% - 3px) calc(100% - 3px), calc(100% - 3px) calc(100% - 3px), calc(100% - 3px) 100%, 100% 100%, 100% 0%, 0% 0%);clip-path:polygon(0% 100%, 3px 100%, 3px 3px, calc(100% - 3px) 3px, calc(100% - 3px) calc(100% - 3px), calc(100% - 3px) calc(100% - 3px), calc(100% - 3px) 100%, 100% 100%, 100% 0%, 0% 0%)}50%{-webkit-clip-path:polygon(0% 100%, 3px 100%, 3px 3px, calc(100% - 3px) 3px, calc(100% - 3px) 3px, calc(100% - 3px) 3px, calc(100% - 3px) 3px, calc(100% - 3px) 3px, 100% 0%, 0% 0%);clip-path:polygon(0% 100%, 3px 100%, 3px 3px, calc(100% - 3px) 3px, calc(100% - 3px) 3px, calc(100% - 3px) 3px, calc(100% - 3px) 3px, calc(100% - 3px) 3px, 100% 0%, 0% 0%)}75%{-webkit-clip-path:polygon(0% 100%, 3px 100%, 3px 3px, 3px 3px, 3px 3px, 3px 3px, 3px 3px, 3px 3px, 3px 0%, 0% 0%)}100%{-webkit-clip-path:polygon(0% 100%, 3px 100%, 3px 100%, 3px 100%, 3px 100%, 3px 100%, 3px 100%, 3px 100%, 3px 100%, 0% 100%)}}*{box-sizing:border-box}body{font-family:"Open Sans",sans-serif;margin:0;padding:0;font-size:15px;color:#4e5e6a}.btn{padding:12px 25px;transition:all .3s ease;color:#fff;border:0;border-radius:.25rem;cursor:pointer;display:inline-flex;text-decoration:none;gap:5px;justify-content:center;align-items:center}.btn.btn_small,.btn.btn-xs{padding:5px 7px;font-size:13px}.btn.btn_small i,.btn.btn-xs i{font-size:12px}.btn.btn-success{background:#099885}.btn.btn-success:hover{background:#4a9c3b}.btn.btn-primary{background:#6690f4}.btn.btn-primary:hover{background:#3164db}.btn.btn-danger{background:#cc563d}.btn.btn-danger:hover{background:#b30000}.hide{display:none}.form-error{color:#cc563d;font-size:13px}.input-group{margin-bottom:10px}input[type=checkbox]{border:1px solid #ebebeb}.form-control{border:1px solid #ebebeb;border-radius:3px;height:35px;width:100%;padding:5px;font-family:"Open Sans",sans-serif}.form-control option{padding:5px}.form-control:focus{border:1px solid #6690f4;outline:none}.unlogged{background:#eef1f9;display:flex;align-items:center;justify-content:center;height:100vh}.unlogged .box-login{background:#fff;padding:25px;border-radius:.25rem;width:400px}.unlogged .box-login .title{text-align:center;padding:10px 10px 25px;border-bottom:1px solid #ebebeb;font-size:20px;margin-bottom:25px}body>.top{background:#fff;border-bottom:1px solid #ebebeb;display:flex;justify-content:space-between;align-items:center}body>.top .logo a{display:inline-flex;color:#6690f4;padding:10px;text-decoration:none}body>.top .logo a span{font-weight:600}body>.top .user-nav{position:relative;font-size:14px;padding:10px}body>.top .user-nav .trigger{cursor:pointer}body>.top .user-nav .trigger i{color:#6690f4}body>.top .user-nav ul{position:absolute;top:100%;left:0;background:#fff;margin:0;padding:0;width:100%;list-style-type:none;border:1px solid #ebebeb;display:none}body>.top .user-nav ul li{cursor:pointer}body>.top .user-nav ul li:hover{background:#f8f9fa}body>.top .user-nav ul li a{color:#333;display:block;text-decoration:none;padding:10px}body>.top .user-nav:hover ul{display:block}.main-menu{display:flex;box-shadow:0 .125rem .25rem rgba(0,0,0,.075) !important}.main-menu ul{display:flex;list-style-type:none;margin:0;padding:0;font-size:14px}.main-menu ul li{cursor:pointer}.main-menu ul li a{color:#333;text-decoration:none;display:inline-flex;padding:10px 15px}.main-menu ul li:hover a{background:#6690f4;color:#fff}.main-menu ul li ul{display:none}.main{padding:25px;background:#d9dee2;min-height:calc(100vh - 80px)}.tasks_container{display:grid;grid-template-columns:repeat(7, 1fr);gap:20px}.tasks_container .column{width:100%}.tasks_container .column h2{display:flex;padding:10px;background:#fff;margin-bottom:10px;font-size:15px;font-weight:300;border-radius:3px 3px 0 0;justify-content:space-between;align-items:center}.tasks_container .column h2 i{cursor:pointer}.tasks_container .column.tasks_suspended h2{border-bottom:5px solid #cc563d}.tasks_container .column.tasks_fvat h2{border-bottom:5px solid #a900fc}.tasks_container .column.tasks_new h2{border-bottom:5px solid #ccc}.tasks_container .column.tasks_bulk h2{border-bottom:5px solid #ff8c00}.tasks_container .column.tasks_to_do h2{border-bottom:5px solid #2aaf47}.tasks_container .column.tasks_to_review h2{border-bottom:5px solid #2535c9}.tasks_container .column.tasks_closed h2{border-bottom:5px solid #000}.tasks_container .column ul{list-style-type:none;margin:0;padding:0}.tasks_container .column ul .task{margin-bottom:5px;background:#fff;padding:10px;border-radius:0;display:flex;position:relative;border-radius:.25rem;flex-wrap:wrap}.tasks_container .column ul .task.notopened{border:2px solid #cc563d}.tasks_container .column ul .task .top{display:flex;justify-content:space-between;margin-bottom:5px;width:100%}.tasks_container .column ul .task .top ._users{display:flex;gap:5px;flex-wrap:wrap}.tasks_container .column ul .task .top ._users .user{display:flex;width:25px;height:25px;border-radius:.25rem;justify-content:center;align-items:center;color:#fff;font-size:12px}.tasks_container .column ul .task .top ._timer{display:flex;gap:5px}.tasks_container .column ul .task .top ._timer .recursively{color:#fff;background:#405189;border-radius:3px;cursor:pointer;margin-bottom:5px;width:25px;height:25px;text-align:center;display:block}.tasks_container .column ul .task .top ._timer .recursively i{font-size:12px}.tasks_container .column ul .task .top ._timer .task_start{display:block;background:#099885;color:#fff;border-radius:.25rem;cursor:pointer;margin-bottom:5px;width:25px;height:25px;text-align:center}.tasks_container .column ul .task .top ._timer .task_start.hidden{display:none}.tasks_container .column ul .task .top ._timer .task_start i{font-size:12px}.tasks_container .column ul .task .top ._timer .task_end{background:#cc563d;display:block;color:#fff;border-radius:.25rem;cursor:pointer;margin-bottom:5px;width:25px;height:25px;text-align:center}.tasks_container .column ul .task .top ._timer .task_end.hidden{display:none}.tasks_container .column ul .task .top ._timer .task_end i{font-size:12px}.tasks_container .column ul .task .middle{width:100%}.tasks_container .column ul .task .name{font-size:14px;color:#333;text-decoration:none;display:block;margin-bottom:5px}.tasks_container .column ul .task .bottom{display:flex;justify-content:space-between}.tasks_container .column ul .task .client_info,.tasks_container .column ul .task .current_status{font-size:12px;font-weight:400}.tasks_container .column ul .task .client_info strong,.tasks_container .column ul .task .current_status strong{font-weight:600}.tasks_container .column ul .task .current_status{position:relative;cursor:pointer}.tasks_container .column ul .task .current_status .status_change{position:absolute;left:0;top:20px;background:#fff;padding:15px;border:1px solid #dfdfdf;border-radius:3px;cursor:pointer;box-shadow:0 0 15px rgba(0,0,0,.1);z-index:99;display:none}.tasks_container .column ul .task .current_status .status_change select{width:250px;padding:10px;border:1px solid #ebebeb;border-radius:3px}.tasks_container .column ul .task .current_status .status_change select option{font-size:15px;padding:3px}.tasks_container .column ul .task .dates{margin-bottom:5px;display:flex;justify-content:space-between;font-size:12px}.tasks_container .column ul .task .dates .danger{color:#cc563d;font-weight:600}.tasks_container .column ul .task .dates .warning{color:#ff8c00}.tasks_container .column ul .task .dates i{font-size:12px;color:#c9ced4;margin-right:5px}.action_menu{display:flex;margin-bottom:25px;gap:20px}.action_menu .btn{display:inline-flex;padding:7px 15px;color:#fff;border-radius:3px;text-decoration:none;align-items:center;justify-content:center;gap:5px}.action_menu .btn.btn_add{background:#099885}.action_menu .btn.btn_add:hover{background:#4a9c3b}.action_menu .btn.btn_cancel{background:#cc563d}.action_menu .btn.btn_cancel:hover{background:#b30000}.action_menu .btn.disabled{opacity:.5}.form_container{background:#fff;padding:25px;max-width:1300px}.form_container.full{max-width:100%}.form_container .form_group{margin-bottom:10px;display:flex}.form_container .form_group>.label{width:300px;display:inline-flex;align-items:flex-start;justify-content:right;padding-right:10px}.form_container .form_group .input{width:calc(100% - 300px)}.fullscreen_description{position:fixed !important;top:25px;left:25px;right:25px;bottom:25px;z-index:9999;background:#fff;padding:20px;overflow:auto;border-radius:.25rem;box-shadow:0 0 20px rgba(0,0,0,.3)}.fullscreen{position:absolute;top:10px;right:10px;cursor:pointer;color:#fff;background:#cc563d;display:inline-flex;height:40px;width:40px;border-radius:.25rem;align-items:center;justify-content:center;transition:all .3s ease}.fullscreen:hover{transform:scale(1.05);text-decoration:none}.task_popup{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.5);display:none;z-index:9999}.task_popup .task_details{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);background:#fff;padding:25px;border-radius:.25rem;max-width:1140px;width:100%;transition:all .3s ease;height:90vh}.task_popup .task_details .content{height:calc(100% - 50px)}.task_popup .task_details.open_works_time{max-width:1540px}.task_popup .task_details.open_works_time .content{grid-template-columns:1fr 300px 350px}.task_popup .task_details.open_works_time .content .task_work_details{display:block}.task_popup .task_details .title{font-size:20px;margin-bottom:25px;display:flex;align-items:center;gap:10px}.task_popup .task_details .title a{border:1px solid #099885;display:inline-flex;height:30px;width:30px;border-radius:.25rem;align-items:center;justify-content:center}.task_popup .task_details .title a:hover{text-decoration:none}.task_popup .task_details .title a i{color:#099885}.task_popup .task_details .title a.task-delete{border:1px solid #cc563d}.task_popup .task_details .title a.task-delete i{color:#cc563d}.task_popup .task_details .title a i{font-size:14px}.task_popup .task_details .close{position:absolute;top:10px;right:10px;cursor:pointer}.task_popup .task_details .content{display:grid;font-size:14px;grid-template-columns:1fr 300px;gap:30px;transition:all .3s ease}.task_popup .task_details .content h3{width:100%;margin-top:0;margin-bottom:5px;font-weight:500;color:#000;font-size:17px}.task_popup .task_details .content .left{height:100%;overflow:hidden}.task_popup .task_details .content .left .users{display:flex;gap:20px}.task_popup .task_details .content .left .users .user{display:flex;gap:10px;align-items:center;margin-bottom:10px}.task_popup .task_details .content .left .users .user .avatar{height:30px;width:30px;border-radius:.25rem;background:#ccc;display:flex;justify-content:center;align-items:center;color:#fff;font-size:12px}.task_popup .task_details .content .left .comments{border-radius:3px;margin-bottom:10px}.task_popup .task_details .content .left .comments .new_comment{margin-bottom:10px}.task_popup .task_details .content .left .comments .new_comment textarea{height:75px;margin-bottom:10px;border-radius:.25rem}.task_popup .task_details .content .left .comments .new_comment .add_comment{background:#099885;color:#fff;padding:10px;border-radius:.25rem;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;width:200px;text-decoration:none}.task_popup .task_details .content .left .comments .new_comment .add_comment:hover{background:#4a9c3b}.task_popup .task_details .content .left .comments ul{margin:0;padding:0;list-style-type:none}.task_popup .task_details .content .left .comments ul li{background:#ced4da;margin-bottom:5px;padding:15px;border-radius:.25rem;position:relative}.task_popup .task_details .content .left .comments ul li .delete_comment{position:absolute;top:10px;right:10px;cursor:pointer;color:#cc563d}.task_popup .task_details .content .left .comments ul li .author{font-weight:600;margin-bottom:5px;display:inline-flex;margin-right:10px}.task_popup .task_details .content .left .comments ul li .date{font-size:12px;margin-bottom:5px;display:inline-flex}.task_popup .task_details .content .left .comments ul li .text{margin-bottom:15px;font-size:13px}.task_popup .task_details .content .left .checklist{border-radius:3px;margin-bottom:10px}.task_popup .task_details .content .left .checklist .new_element{display:flex;margin-bottom:10px}.task_popup .task_details .content .left .checklist .new_element a{display:flex;align-items:center;justify-content:center;padding:10px;border-radius:0 .25rem .25rem 0;text-decoration:none;width:35px;background:#099885;color:#fff}.task_popup .task_details .content .left .checklist ul{margin:0;padding:0;list-style-type:none;overflow-y:auto;max-height:calc(90vh - 400px)}.task_popup .task_details .content .left .checklist ul li{display:flex;gap:10px;margin-bottom:5px;background:#fff;border-radius:3px;padding:10px;border:1px solid #ebebeb;font-size:13px;align-items:flex-start}.task_popup .task_details .content .left .checklist ul li a{margin-left:auto;margin-right:0;cursor:pointer;background:#cc563d;display:flex;height:25px;width:25px;min-width:25px;justify-content:center;align-items:center;border:0;border-radius:3px;transition:all .3s ease}.task_popup .task_details .content .left .checklist ul li a:hover{text-decoration:none;background:#b30000}.task_popup .task_details .content .left .checklist ul li a i{color:#fff;font-size:12px}.task_popup .task_details .content .left .description{padding:15px;border-radius:.25rem;border:1px solid #ebebeb;margin-bottom:15px;max-height:202px;overflow-x:hidden;position:relative}.task_popup .task_details .content .right .box{margin-bottom:15px}.task_popup .task_details .content .right .time a.time_worked_toggle{color:#299cdb;display:inline-flex;border:1px solid #299cdb}.task_popup .task_details .content .right .time a.time_worked_toggle:hover{background:#dff0fa;text-decoration:none}.task_popup .task_details .content .right .time a.time_worked_toggle:active,.task_popup .task_details .content .right .time a.time_worked_toggle:focus{text-decoration:none}.task_popup .task_details .content .right .time a:not(.time_worked_toggle){margin-top:10px;text-decoration:none;gap:10px}.task_popup .task_details .content .right .time a:not(.time_worked_toggle).task_start{background:#0ab39c;color:#fff}.task_popup .task_details .content .right .time a:not(.time_worked_toggle).task_start:hover{background:#099885}.task_popup .task_details .content .right .time a:not(.time_worked_toggle).task_end{background:#cc563d;color:#fff}.task_popup .task_details .content .right .time a:not(.time_worked_toggle).hidden{display:none}.task_popup .task_details .content .right .dates{display:flex;justify-content:space-between;flex-wrap:wrap}.task_popup .task_details .content .right .dates .danger{color:#cc563d;font-weight:600}.task_popup .task_details .content .right .dates .warning{color:#ff8c00}.task_popup .task_details .content .right .dates i{color:#c9ced4;margin-right:5px}.task_popup .task_details .content .task_work_details{display:none;overflow-y:auto;max-height:508px;width:100%;padding-right:10px;padding-top:4px}.task_popup .task_details .content .task_work_details ._line{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;margin-bottom:5px}.task_popup .task_details .content .task_work_details ._line ._user{width:100%;font-size:13px}.task_popup .task_details .content .task_work_details ._line input{width:calc(50% - 25px);text-align:center;margin-left:2px;margin-right:2px}.task_popup .task_details .content .task_work_details ._work_delete{display:inline-flex;height:35px;width:35px;border-radius:.25rem;align-items:center;justify-content:center;cursor:pointer;border:1px solid #cc563d;margin-left:2px;transition:all .3s ease}.task_popup .task_details .content .task_work_details ._work_delete:hover{background:#cc563d}.task_popup .task_details .content .task_work_details ._work_delete:hover i{color:#fff}.task_popup .task_details .content .task_work_details ._work_delete i{transition:all .3s ease;color:#cc563d}.table{width:100%}.table th,.table td{border:1px solid #ebebeb;padding:5px}.table td.center{text-align:center}.table td.left{text-align:left}.projects_container{background:#fff;padding:15px;border-radius:.25rem;display:flex;gap:20px}.projects_container .left{width:calc(100% - 250px)}.projects_container .left ._projects,.projects_container .left ._users{display:flex;gap:20px;flex-wrap:wrap}.projects_container .right{width:250px;display:flex;flex-wrap:wrap;align-items:flex-start;justify-content:center;gap:20px;border-left:1px solid #ebebeb;padding-left:15px}.projects_container .right select{width:200px}.default_popup{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.5);display:none}.default_popup .popup_content{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);background:#fff;padding:25px;border-radius:.25rem;max-width:1140px;width:100%}.default_popup .popup_content .close{position:absolute;top:10px;right:10px;cursor:pointer}#fg-cron{margin:10px 0}#fg-cron .countdown{background:#099885;color:#fff;padding:10px}#fg-cron #cron-container{max-height:300px;overflow-x:hidden;overflow-y:auto}#fg-cron #cron-container .msg{font-size:13px;padding:5px;border-bottom:1px solid #e8e8e8}.card{background:#fff;padding:25px;border-radius:.25rem;color:#000;font-size:15px;max-width:1280px}.card.mb25{margin-bottom:25px}.card .card-header{font-weight:600}.card .card-body{padding-top:10px}.card .card-body table{border-collapse:collapse}.card .card-body table th,.card .card-body table td{font-size:14px}.card .card-body table th.bold,.card .card-body table td.bold{font-weight:600}.card .card-body table th.text-right,.card .card-body table td.text-right{text-align:right}.card .card-body table th.text-center,.card .card-body table td.text-center{text-align:center}.card .card-body table th .close-task,.card .card-body table td .close-task{text-decoration:none;color:#6690f4}.card .card-body table th .close-task:hover,.card .card-body table td .close-task:hover{color:#cc563d}.finance-summary{display:grid;grid-template-columns:1fr 1fr 1fr 1fr;gap:10px}.finance-summary .panel{background:#fff;border-radius:.25rem;padding:15px}.finance-summary .panel h1{font-size:20px;margin:0}.finance-summary .panel span{font-size:.85em}.finance-manager{display:grid;gap:10px;grid-template-columns:200px 1fr 500px;padding-top:25px}.finance-manager .manage-menu{display:inline-block;margin-right:10px}.finance-manager .manage-menu a{color:#333;text-decoration:none;font-weight:300;display:block}.finance-manager .actions{width:100px;text-align:center}.finance-manager .actions a{display:inline-flex;margin:0 2px;height:25px;width:25px;align-items:center;justify-content:center;text-decoration:none;color:#000;border:1px solid #e7e7e7;font-size:11px;border-radius:3px;transition:all .3s ease}.finance-manager .actions a:hover{border:1px solid #6690f4}.bootstrap-tagsinput .tag{background:#6690f4;font-size:13px;padding:5px 10px;border-radius:12px}.bootstrap-tagsinput .tag [data-role=remove]{color:#fff !important}.bootstrap-tagsinput .tag [data-role=remove]:hover{box-shadow:none !important;color:#000 !important}.finance-tags{display:flex;flex-wrap:wrap;gap:5px}.finance-tags a:not(.btn){display:flex;width:100%;text-decoration:none;color:#4e5e6a}.finance-tags a:not(.btn).zoom-100{font-size:130%}.finance-tags a:not(.btn).zoom-90{font-size:120%}.finance-tags a:not(.btn).zoom-80{font-size:110%}.finance-tags a:not(.btn).zoom-70{font-size:100%}.finance-tags a:not(.btn).zoom-60{font-size:95%}.finance-tags a:not(.btn).zoom-50{font-size:85%}.finance-tags a:not(.btn).zoom-40{font-size:80%}.finance-tags a:not(.btn).zoom-30{font-size:75%}.finance-tags a:not(.btn).zoom-20{font-size:75%}.finance-tags a:not(.btn).zoom-10{font-size:70%}.finance-tags a:not(.btn).zoom-0{font-size:70%}.manage-menu{position:relative}.manage-menu .context-menu{border-left:4px dotted #000;width:1px;height:100%}.manage-menu .context-menu-container{position:absolute;display:none;background:#fff;box-shadow:5px 5px 15px rgba(0,0,0,.1);top:2px;left:2px}.manage-menu .context-menu-container ul{list-style-type:none;margin:0;padding:0}.manage-menu .context-menu-container ul li a{display:block;padding:7px 15px;white-space:nowrap}.manage-menu .context-menu-container ul li a:hover{background:#f8f8f8}.manage-menu:hover .context-menu-container{display:block}.wiki-categories{display:grid;gap:10px;margin-top:25px;grid-template-columns:1fr 1fr 1fr 1fr}.wiki-categories .category{background:#fff;padding:10px}.wiki-categories .category .users{display:grid;grid-template-columns:1fr 1fr 1fr 1fr;gap:5px}.wiki-categories .category .users .user{display:flex;height:25px;width:25px;border-radius:50%;background:#ccc;justify-content:center;align-items:center;color:#fff;font-size:12px}.wiki-categories .category .actions{display:grid;grid-template-columns:1fr 1fr}.wiki-categories .category .actions a{display:block;color:#4e5e6a;font-size:13px;text-align:center}.wiki-categories .category .title{margin-bottom:5px}.wiki-categories .category .title a{display:block;color:#4e5e6a;font-size:13px;font-weight:600}.bootstrap-datetimepicker-widget .picker-switch a{display:block;color:#000}/*# sourceMappingURL=style.css.map */ \ No newline at end of file diff --git a/layout/style.css.map b/layout/style.css.map index 8b12dce..2d20331 100644 --- a/layout/style.css.map +++ b/layout/style.css.map @@ -1 +1 @@ -{"version":3,"sources":["style.scss"],"names":[],"mappings":"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","file":"style.css","sourcesContent":["$cBlue: #6690F4;\r\n$cRed: #cc563d;\r\n$cGreen: #099885;\r\n$cBlack: #4e5e6a;\r\n\r\n.default-btn {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n height: 40px;\r\n border-radius: .25rem;\r\n padding: 0 15px;\r\n transition: all .3s ease;\r\n\r\n &:hover {\r\n text-decoration: none;\r\n }\r\n}\r\n\r\n.animate {\r\n animation: mymove 3s infinite;\r\n}\r\n\r\n.text-right {\r\n text-align: right;\r\n}\r\n\r\n.nowrap {\r\n white-space: nowrap;\r\n}\r\n\r\ntable {\r\n border-collapse: collapse;\r\n}\r\n\r\nsmall {\r\n font-size: .75em;\r\n}\r\n\r\ntable {\r\n font-size: 13px;\r\n}\r\n\r\n@keyframes mymove {\r\n 50% {\r\n opacity: .33;\r\n }\r\n}\r\n\r\n/* motion */\r\n@keyframes gradient-animation {\r\n 0% {\r\n background-position: 15% 0%;\r\n }\r\n\r\n 50% {\r\n background-position: 85% 100%;\r\n }\r\n\r\n 100% {\r\n background-position: 15% 0%;\r\n }\r\n}\r\n\r\n@keyframes frame-enter {\r\n 0% {\r\n clip-path: polygon(0% 100%, 3px 100%, 3px 3px, calc(100% - 3px) 3px, calc(100% - 3px) calc(100% - 3px), 3px calc(100% - 3px), 3px 100%, 100% 100%, 100% 0%, 0% 0%);\r\n }\r\n\r\n 25% {\r\n clip-path: polygon(0% 100%, 3px 100%, 3px 3px, calc(100% - 3px) 3px, calc(100% - 3px) calc(100% - 3px), calc(100% - 3px) calc(100% - 3px), calc(100% - 3px) 100%, 100% 100%, 100% 0%, 0% 0%);\r\n }\r\n\r\n 50% {\r\n clip-path: polygon(0% 100%, 3px 100%, 3px 3px, calc(100% - 3px) 3px, calc(100% - 3px) 3px, calc(100% - 3px) 3px, calc(100% - 3px) 3px, calc(100% - 3px) 3px, 100% 0%, 0% 0%);\r\n }\r\n\r\n 75% {\r\n -webkit-clip-path: polygon(0% 100%, 3px 100%, 3px 3px, 3px 3px, 3px 3px, 3px 3px, 3px 3px, 3px 3px, 3px 0%, 0% 0%);\r\n }\r\n\r\n 100% {\r\n -webkit-clip-path: polygon(0% 100%, 3px 100%, 3px 100%, 3px 100%, 3px 100%, 3px 100%, 3px 100%, 3px 100%, 3px 100%, 0% 100%);\r\n }\r\n}\r\n\r\n* {\r\n box-sizing: border-box;\r\n}\r\n\r\nbody {\r\n font-family: \"Open Sans\", sans-serif;\r\n margin: 0;\r\n padding: 0;\r\n font-size: 15px;\r\n color: #4e5e6a;\r\n}\r\n\r\n.btn {\r\n padding: 12px 25px;\r\n transition: all 0.3s ease;\r\n color: #FFF;\r\n border: 0;\r\n border-radius: .25rem;\r\n cursor: pointer;\r\n display: inline-flex;\r\n text-decoration: none;\r\n gap: 5px;\r\n justify-content: center;\r\n align-items: center;\r\n\r\n &.btn_small,\r\n &.btn-xs {\r\n padding: 5px 7px;\r\n font-size: 13px;\r\n\r\n i {\r\n font-size: 12px;\r\n }\r\n }\r\n\r\n &.btn-success {\r\n background: $cGreen;\r\n\r\n &:hover {\r\n background: #4a9c3b;\r\n }\r\n }\r\n\r\n &.btn-primary {\r\n background: $cBlue;\r\n\r\n &:hover {\r\n background: #3164db;\r\n }\r\n }\r\n\r\n &.btn-danger {\r\n background: $cRed;\r\n\r\n &:hover {\r\n background: #b30000;\r\n }\r\n }\r\n}\r\n\r\n.hide {\r\n display: none;\r\n}\r\n\r\n.form-error {\r\n color: $cRed;\r\n font-size: 13px;\r\n}\r\n\r\n.input-group {\r\n margin-bottom: 10px;\r\n}\r\n\r\ninput[type=\"checkbox\"] {\r\n border: 1px solid #ebebeb;\r\n}\r\n\r\n.form-control {\r\n border: 1px solid #ebebeb;\r\n border-radius: 3px;\r\n height: 35px;\r\n width: 100%;\r\n padding: 5px;\r\n font-family: \"Open Sans\", sans-serif;\r\n\r\n option {\r\n padding: 5px;\r\n }\r\n\r\n &:focus {\r\n border: 1px solid $cBlue;\r\n outline: none;\r\n }\r\n}\r\n\r\n.unlogged {\r\n background: #EEF1F9;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n height: 100vh;\r\n\r\n .box-login {\r\n background: #FFF;\r\n padding: 25px;\r\n border-radius: .25rem;\r\n width: 400px;\r\n\r\n .title {\r\n text-align: center;\r\n padding: 10px 10px 25px;\r\n border-bottom: 1px solid #ebebeb;\r\n font-size: 20px;\r\n margin-bottom: 25px;\r\n }\r\n }\r\n}\r\n\r\nbody>.top {\r\n background: #FFF;\r\n border-bottom: 1px solid #ebebeb;\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n\r\n .logo {\r\n a {\r\n display: inline-flex;\r\n color: $cBlue;\r\n padding: 10px;\r\n text-decoration: none;\r\n\r\n span {\r\n font-weight: 600;\r\n }\r\n }\r\n }\r\n\r\n .user-nav {\r\n position: relative;\r\n font-size: 14px;\r\n padding: 10px;\r\n\r\n .trigger {\r\n cursor: pointer;\r\n\r\n i {\r\n color: $cBlue;\r\n }\r\n }\r\n\r\n ul {\r\n position: absolute;\r\n top: 100%;\r\n left: 0;\r\n background: #FFF;\r\n margin: 0;\r\n padding: 0;\r\n width: 100%;\r\n list-style-type: none;\r\n border: 1px solid #ebebeb;\r\n display: none;\r\n\r\n li {\r\n cursor: pointer;\r\n\r\n &:hover {\r\n background: #F8F9FA;\r\n }\r\n\r\n a {\r\n color: #333;\r\n display: block;\r\n text-decoration: none;\r\n padding: 10px;\r\n }\r\n }\r\n }\r\n\r\n &:hover {\r\n ul {\r\n display: block;\r\n }\r\n }\r\n }\r\n}\r\n\r\n.main-menu {\r\n display: flex;\r\n box-shadow: 0 .125rem .25rem rgba(0, 0, 0, .075) !important;\r\n\r\n ul {\r\n display: flex;\r\n list-style-type: none;\r\n margin: 0;\r\n padding: 0;\r\n font-size: 14px;\r\n\r\n li {\r\n cursor: pointer;\r\n\r\n a {\r\n color: #333;\r\n text-decoration: none;\r\n display: inline-flex;\r\n padding: 10px 15px;\r\n }\r\n\r\n &:hover {\r\n a {\r\n background: $cBlue;\r\n color: #FFF;\r\n }\r\n }\r\n\r\n ul {\r\n display: none;\r\n }\r\n }\r\n }\r\n}\r\n\r\n.main {\r\n padding: 25px;\r\n background: #D9DEE2;\r\n min-height: calc(100vh - 80px);\r\n}\r\n\r\n.tasks_container {\r\n display: grid;\r\n grid-template-columns: repeat(7, 1fr);\r\n gap: 20px;\r\n\r\n .column {\r\n width: 100%;\r\n\r\n h2 {\r\n display: flex;\r\n padding: 10px;\r\n background: #FFF;\r\n margin-bottom: 10px;\r\n font-size: 15px;\r\n font-weight: 300;\r\n border-radius: 3px 3px 0 0;\r\n justify-content: space-between;\r\n align-items: center;\r\n\r\n i {\r\n cursor: pointer;\r\n }\r\n }\r\n\r\n &.tasks_suspended {\r\n h2 {\r\n border-bottom: 5px solid $cRed;\r\n }\r\n }\r\n\r\n &.tasks_fvat {\r\n h2 {\r\n border-bottom: 5px solid #a900fc;\r\n }\r\n }\r\n\r\n &.tasks_new {\r\n h2 {\r\n border-bottom: 5px solid #ccc;\r\n }\r\n }\r\n\r\n &.tasks_bulk {\r\n h2 {\r\n border-bottom: 5px solid #ff8c00;\r\n }\r\n }\r\n\r\n &.tasks_to_do {\r\n h2 {\r\n border-bottom: 5px solid #2aaf47;\r\n }\r\n }\r\n\r\n &.tasks_to_review {\r\n h2 {\r\n border-bottom: 5px solid #2535c9;\r\n }\r\n }\r\n\r\n &.tasks_closed {\r\n h2 {\r\n border-bottom: 5px solid #000;\r\n }\r\n }\r\n\r\n ul {\r\n list-style-type: none;\r\n margin: 0;\r\n padding: 0;\r\n\r\n .task {\r\n margin-bottom: 5px;\r\n background: #FFF;\r\n padding: 10px;\r\n border-radius: 0;\r\n display: flex;\r\n position: relative;\r\n border-radius: .25rem;\r\n flex-wrap: wrap;\r\n\r\n &.notopened {\r\n border: 2px solid $cRed;\r\n }\r\n\r\n .top {\r\n display: flex;\r\n justify-content: space-between;\r\n margin-bottom: 5px;\r\n width: 100%;\r\n\r\n ._users {\r\n display: flex;\r\n gap: 5px;\r\n flex-wrap: wrap;\r\n\r\n .user {\r\n display: flex;\r\n width: 25px;\r\n height: 25px;\r\n border-radius: .25rem;\r\n justify-content: center;\r\n align-items: center;\r\n color: #FFF;\r\n font-size: 12px;\r\n }\r\n }\r\n\r\n ._timer {\r\n display: flex;\r\n gap: 5px;\r\n\r\n .recursively {\r\n color: #FFF;\r\n background: #405189;\r\n border-radius: 3px;\r\n cursor: pointer;\r\n margin-bottom: 5px;\r\n width: 25px;\r\n height: 25px;\r\n text-align: center;\r\n display: block;\r\n\r\n i {\r\n font-size: 12px;\r\n }\r\n }\r\n\r\n .task_start {\r\n display: block;\r\n background: $cGreen;\r\n color: #FFF;\r\n border-radius: .25rem;\r\n cursor: pointer;\r\n margin-bottom: 5px;\r\n width: 25px;\r\n height: 25px;\r\n text-align: center;\r\n\r\n &.hidden {\r\n display: none;\r\n }\r\n\r\n i {\r\n font-size: 12px;\r\n }\r\n }\r\n\r\n .task_end {\r\n background: $cRed;\r\n display: block;\r\n color: #FFF;\r\n border-radius: .25rem;\r\n cursor: pointer;\r\n margin-bottom: 5px;\r\n width: 25px;\r\n height: 25px;\r\n text-align: center;\r\n\r\n &.hidden {\r\n display: none;\r\n }\r\n\r\n i {\r\n font-size: 12px;\r\n }\r\n }\r\n }\r\n }\r\n\r\n .middle {\r\n width: 100%;\r\n }\r\n\r\n .name {\r\n font-size: 14px;\r\n color: #333;\r\n text-decoration: none;\r\n display: block;\r\n margin-bottom: 5px;\r\n }\r\n\r\n .bottom {\r\n display: flex;\r\n justify-content: space-between;\r\n }\r\n\r\n .client_info,\r\n .current_status {\r\n font-size: 12px;\r\n font-weight: 400;\r\n\r\n strong {\r\n font-weight: 600;\r\n }\r\n }\r\n\r\n .current_status {\r\n position: relative;\r\n cursor: pointer;\r\n\r\n .status_change {\r\n position: absolute;\r\n left: 0;\r\n top: 20px;\r\n background: #fff;\r\n padding: 15px;\r\n border: 1px solid #dfdfdf;\r\n border-radius: 3px;\r\n cursor: pointer;\r\n box-shadow: 0 0 15px rgba(0, 0, 0, 0.1);\r\n z-index: 99;\r\n display: none;\r\n\r\n select {\r\n width: 250px;\r\n padding: 10px;\r\n border: 1px solid #ebebeb;\r\n border-radius: 3px;\r\n\r\n option {\r\n font-size: 15px;\r\n padding: 3px;\r\n }\r\n }\r\n }\r\n }\r\n\r\n .dates {\r\n margin-bottom: 5px;\r\n display: flex;\r\n justify-content: space-between;\r\n font-size: 12px;\r\n\r\n .danger {\r\n color: $cRed;\r\n font-weight: 600;\r\n }\r\n\r\n .warning {\r\n color: #ff8c00;\r\n }\r\n\r\n i {\r\n font-size: 12px;\r\n color: #C9CED4;\r\n margin-right: 5px;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n.action_menu {\r\n display: flex;\r\n margin-bottom: 25px;\r\n gap: 20px;\r\n\r\n .btn {\r\n display: inline-flex;\r\n padding: 7px 15px;\r\n color: #FFF;\r\n border-radius: 3px;\r\n text-decoration: none;\r\n align-items: center;\r\n justify-content: center;\r\n gap: 5px;\r\n\r\n &.btn_add {\r\n background: $cGreen;\r\n\r\n &:hover {\r\n background: #4a9c3b;\r\n }\r\n }\r\n\r\n &.btn_cancel {\r\n background: $cRed;\r\n\r\n &:hover {\r\n background: #b30000;\r\n }\r\n }\r\n\r\n &.disabled {\r\n opacity: .5;\r\n }\r\n }\r\n}\r\n\r\n.form_container {\r\n background: #FFF;\r\n padding: 25px;\r\n max-width: 1300px;\r\n\r\n &.full {\r\n max-width: 100%;\r\n }\r\n\r\n .form_group {\r\n margin-bottom: 10px;\r\n display: flex;\r\n\r\n >.label {\r\n width: 300px;\r\n display: inline-flex;\r\n align-items: flex-start;\r\n justify-content: right;\r\n padding-right: 10px;\r\n }\r\n\r\n .input {\r\n width: calc(100% - 300px);\r\n }\r\n }\r\n}\r\n\r\n.fullscreen_description {\r\n position: fixed !important;\r\n top: 25px;\r\n left: 25px;\r\n right: 25px;\r\n bottom: 25px;\r\n z-index: 9999;\r\n background: white;\r\n padding: 20px;\r\n overflow: auto;\r\n border-radius: 0.25rem;\r\n box-shadow: 0 0 20px rgba(0, 0, 0, 0.3);\r\n}\r\n\r\n.fullscreen {\r\n position: absolute;\r\n top: 10px;\r\n right: 10px;\r\n cursor: pointer;\r\n color: #FFF;\r\n background: $cRed;\r\n display: inline-flex;\r\n height: 40px;\r\n width: 40px;\r\n border-radius: .25rem;\r\n align-items: center;\r\n justify-content: center;\r\n transition: all 0.3s ease;\r\n\r\n &:hover {\r\n transform: scale(1.05);\r\n text-decoration: none;\r\n }\r\n}\r\n\r\n.task_popup {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n background: rgba(0, 0, 0, 0.5);\r\n display: none;\r\n z-index: 9999;\r\n\r\n .task_details {\r\n position: absolute;\r\n top: 50%;\r\n left: 50%;\r\n transform: translate(-50%, -50%);\r\n background: #FFF;\r\n padding: 25px;\r\n border-radius: .25rem;\r\n max-width: 1140px;\r\n width: 100%;\r\n transition: all 0.3s ease;\r\n height: 90vh;\r\n\r\n .content {\r\n height: calc(100% - 50px);\r\n }\r\n\r\n &.open_works_time {\r\n max-width: 1540px;\r\n\r\n .content {\r\n grid-template-columns: 1fr 300px 350px;\r\n\r\n .task_work_details {\r\n display: block;\r\n }\r\n }\r\n }\r\n\r\n .title {\r\n font-size: 20px;\r\n margin-bottom: 25px;\r\n display: flex;\r\n align-items: center;\r\n gap: 10px;\r\n\r\n a {\r\n border: 1px solid $cGreen;\r\n display: inline-flex;\r\n height: 30px;\r\n width: 30px;\r\n border-radius: .25rem;\r\n align-items: center;\r\n justify-content: center;\r\n\r\n &:hover {\r\n text-decoration: none;\r\n }\r\n\r\n i {\r\n color: $cGreen;\r\n }\r\n\r\n &.task-delete {\r\n border: 1px solid $cRed;\r\n\r\n i {\r\n color: $cRed;\r\n }\r\n }\r\n\r\n i {\r\n font-size: 14px;\r\n }\r\n }\r\n }\r\n\r\n .close {\r\n position: absolute;\r\n top: 10px;\r\n right: 10px;\r\n cursor: pointer;\r\n }\r\n\r\n .content {\r\n display: grid;\r\n font-size: 14px;\r\n grid-template-columns: 1fr 300px;\r\n gap: 30px;\r\n transition: all 0.3s ease;\r\n\r\n h3 {\r\n width: 100%;\r\n margin-top: 0;\r\n margin-bottom: 5px;\r\n font-weight: 500;\r\n color: #000;\r\n font-size: 17px;\r\n }\r\n\r\n .left {\r\n height: 100%;\r\n overflow: hidden;\r\n\r\n .users {\r\n display: flex;\r\n gap: 20px;\r\n\r\n .user {\r\n display: flex;\r\n gap: 10px;\r\n align-items: center;\r\n margin-bottom: 10px;\r\n\r\n .avatar {\r\n height: 30px;\r\n width: 30px;\r\n border-radius: .25rem;\r\n background: #ccc;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n color: #FFF;\r\n font-size: 12px;\r\n }\r\n }\r\n }\r\n\r\n .comments {\r\n border-radius: 3px;\r\n margin-bottom: 10px;\r\n\r\n .new_comment {\r\n margin-bottom: 10px;\r\n\r\n textarea {\r\n height: 75px;\r\n margin-bottom: 10px;\r\n border-radius: .25rem;\r\n }\r\n\r\n .add_comment {\r\n background: $cGreen;\r\n color: #FFF;\r\n padding: 10px;\r\n border-radius: .25rem;\r\n cursor: pointer;\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 200px;\r\n text-decoration: none;\r\n\r\n &:hover {\r\n background: #4a9c3b;\r\n }\r\n }\r\n }\r\n\r\n ul {\r\n margin: 0;\r\n padding: 0;\r\n list-style-type: none;\r\n\r\n li {\r\n background: #ced4da;\r\n margin-bottom: 5px;\r\n padding: 15px;\r\n border-radius: .25rem;\r\n position: relative;\r\n\r\n .delete_comment {\r\n position: absolute;\r\n top: 10px;\r\n right: 10px;\r\n cursor: pointer;\r\n color: $cRed;\r\n }\r\n\r\n .author {\r\n font-weight: 600;\r\n margin-bottom: 5px;\r\n display: inline-flex;\r\n margin-right: 10px;\r\n }\r\n\r\n .date {\r\n font-size: 12px;\r\n margin-bottom: 5px;\r\n display: inline-flex;\r\n }\r\n\r\n .text {\r\n margin-bottom: 15px;\r\n font-size: 13px;\r\n }\r\n }\r\n }\r\n }\r\n\r\n .checklist {\r\n border-radius: 3px;\r\n margin-bottom: 10px;\r\n\r\n .new_element {\r\n display: flex;\r\n margin-bottom: 10px;\r\n\r\n a {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n padding: 10px;\r\n border-radius: 0 .25rem .25rem 0;\r\n text-decoration: none;\r\n width: 35px;\r\n background: $cGreen;\r\n color: #FFF;\r\n }\r\n }\r\n\r\n ul {\r\n margin: 0;\r\n padding: 0;\r\n list-style-type: none;\r\n overflow-y: auto;\r\n max-height: calc(90vh - 400px);\r\n\r\n li {\r\n display: flex;\r\n gap: 10px;\r\n margin-bottom: 5px;\r\n background: #FFF;\r\n border-radius: 3px;\r\n padding: 10px;\r\n border: 1px solid #ebebeb;\r\n font-size: 13px;\r\n align-items: flex-start;\r\n\r\n a {\r\n margin-left: auto;\r\n margin-right: 0;\r\n cursor: pointer;\r\n background: $cRed;\r\n display: flex;\r\n height: 25px;\r\n width: 25px;\r\n min-width: 25px;\r\n justify-content: center;\r\n align-items: center;\r\n border: 0;\r\n border-radius: 3px;\r\n transition: all 0.3s ease;\r\n\r\n &:hover {\r\n text-decoration: none;\r\n background: #b30000;\r\n }\r\n\r\n i {\r\n color: #FFF;\r\n font-size: 12px;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n .description {\r\n padding: 15px;\r\n border-radius: 0.25rem;\r\n border: 1px solid #ebebeb;\r\n margin-bottom: 15px;\r\n max-height: 202px;\r\n overflow-x: hidden;\r\n position: relative;\r\n }\r\n }\r\n\r\n .right {\r\n\r\n .box {\r\n margin-bottom: 15px;\r\n }\r\n\r\n .time {\r\n a.time_worked_toggle {\r\n @extend .default-btn;\r\n color: #299cdb;\r\n display: inline-flex;\r\n border: 1px solid #299cdb;\r\n\r\n &:hover {\r\n background: #dff0fa;\r\n text-decoration: none;\r\n }\r\n\r\n &:active,\r\n &:focus {\r\n text-decoration: none;\r\n }\r\n }\r\n\r\n a:not(.time_worked_toggle) {\r\n @extend .default-btn;\r\n margin-top: 10px;\r\n text-decoration: none;\r\n gap: 10px;\r\n\r\n &.task_start {\r\n background: #0ab39c;\r\n color: #FFF;\r\n\r\n &:hover {\r\n background: #099885;\r\n }\r\n }\r\n\r\n &.task_end {\r\n background: $cRed;\r\n color: #FFF;\r\n }\r\n\r\n &.hidden {\r\n display: none;\r\n }\r\n }\r\n }\r\n\r\n .dates {\r\n display: flex;\r\n justify-content: space-between;\r\n flex-wrap: wrap;\r\n\r\n .danger {\r\n color: $cRed;\r\n font-weight: 600;\r\n }\r\n\r\n .warning {\r\n color: #ff8c00;\r\n }\r\n\r\n i {\r\n color: #C9CED4;\r\n margin-right: 5px;\r\n }\r\n }\r\n }\r\n\r\n .task_work_details {\r\n display: none;\r\n overflow-y: auto;\r\n max-height: 508px;\r\n width: 100%;\r\n padding-right: 10px;\r\n padding-top: 4px;\r\n\r\n ._line {\r\n display: flex;\r\n flex-wrap: wrap;\r\n justify-content: space-between;\r\n align-items: center;\r\n margin-bottom: 5px;\r\n\r\n ._user {\r\n width: 100%;\r\n font-size: 13px;\r\n }\r\n\r\n input {\r\n width: calc(50% - 25px);\r\n text-align: center;\r\n margin-left: 2px;\r\n margin-right: 2px;\r\n }\r\n }\r\n\r\n ._work_delete {\r\n display: inline-flex;\r\n height: 35px;\r\n width: 35px;\r\n border-radius: .25rem;\r\n align-items: center;\r\n justify-content: center;\r\n cursor: pointer;\r\n border: 1px solid $cRed;\r\n margin-left: 2px;\r\n transition: all 0.3s ease;\r\n\r\n &:hover {\r\n background: $cRed;\r\n\r\n i {\r\n color: #FFF;\r\n }\r\n }\r\n\r\n i {\r\n transition: all 0.3s ease;\r\n color: $cRed;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n.table {\r\n width: 100%;\r\n\r\n th,\r\n td {\r\n border: 1px solid #ebebeb;\r\n padding: 5px;\r\n }\r\n\r\n td.center {\r\n text-align: center;\r\n }\r\n\r\n td.left {\r\n text-align: left;\r\n }\r\n}\r\n\r\n.projects_container {\r\n background: #FFF;\r\n padding: 15px;\r\n border-radius: .25rem;\r\n display: flex;\r\n gap: 20px;\r\n\r\n .left {\r\n width: calc(100% - 250px);\r\n\r\n ._projects,\r\n ._users {\r\n display: flex;\r\n gap: 20px;\r\n flex-wrap: wrap;\r\n }\r\n }\r\n\r\n .right {\r\n width: 250px;\r\n display: flex;\r\n flex-wrap: wrap;\r\n align-items: flex-start;\r\n justify-content: center;\r\n gap: 20px;\r\n border-left: 1px solid #ebebeb;\r\n padding-left: 15px;\r\n\r\n select {\r\n width: 200px;\r\n }\r\n }\r\n}\r\n\r\n.default_popup {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n background: rgba(0, 0, 0, 0.5);\r\n display: none;\r\n\r\n .popup_content {\r\n position: absolute;\r\n top: 50%;\r\n left: 50%;\r\n transform: translate(-50%, -50%);\r\n background: #FFF;\r\n padding: 25px;\r\n border-radius: .25rem;\r\n max-width: 1140px;\r\n width: 100%;\r\n\r\n .close {\r\n position: absolute;\r\n top: 10px;\r\n right: 10px;\r\n cursor: pointer;\r\n }\r\n }\r\n}\r\n\r\n#fg-cron {\r\n margin: 10px 0;\r\n\r\n .countdown {\r\n background: $cGreen;\r\n color: #FFF;\r\n padding: 10px;\r\n }\r\n\r\n #cron-container {\r\n max-height: 300px;\r\n overflow-x: hidden;\r\n overflow-y: auto;\r\n\r\n .msg {\r\n font-size: 13px;\r\n padding: 5px;\r\n border-bottom: 1px solid #e8e8e8;\r\n }\r\n }\r\n}\r\n\r\n.card {\r\n background: #FFF;\r\n padding: 25px;\r\n border-radius: .25rem;\r\n color: #000;\r\n font-size: 15px;\r\n max-width: 1280px;\r\n\r\n &.mb25 {\r\n margin-bottom: 25px;\r\n }\r\n\r\n .card-header {\r\n font-weight: 600;\r\n }\r\n\r\n .card-body {\r\n padding-top: 10px;\r\n\r\n table {\r\n border-collapse: collapse;\r\n\r\n th,\r\n td {\r\n font-size: 14px;\r\n\r\n &.bold {\r\n font-weight: 600;\r\n }\r\n\r\n &.text-right {\r\n text-align: right;\r\n }\r\n\r\n &.text-center {\r\n text-align: center;\r\n }\r\n\r\n .close-task {\r\n text-decoration: none;\r\n color: $cBlue;\r\n\r\n &:hover {\r\n color: $cRed;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n.finance-summary {\r\n display: grid;\r\n grid-template-columns: 1fr 1fr 1fr 1fr;\r\n gap: 10px;\r\n\r\n .panel {\r\n background: #FFF;\r\n border-radius: .25rem;\r\n padding: 15px;\r\n\r\n h1 {\r\n font-size: 20px;\r\n margin: 0;\r\n }\r\n\r\n span {\r\n font-size: 0.85em;\r\n }\r\n }\r\n}\r\n\r\n.finance-manager {\r\n display: grid;\r\n gap: 10px;\r\n grid-template-columns: 200px 1fr 500px;\r\n padding-top: 25px;\r\n\r\n .manage-menu {\r\n display: inline-block;\r\n margin-right: 10px;\r\n\r\n a {\r\n color: #333333;\r\n text-decoration: none;\r\n font-weight: 300;\r\n display: block;\r\n }\r\n }\r\n\r\n .actions {\r\n width: 100px;\r\n text-align: center;\r\n\r\n a {\r\n display: inline-flex;\r\n margin: 0 2px;\r\n height: 25px;\r\n width: 25px;\r\n align-items: center;\r\n justify-content: center;\r\n text-decoration: none;\r\n color: #000;\r\n border: 1px solid #e7e7e7;\r\n font-size: 11px;\r\n border-radius: 3px;\r\n transition: all 0.3s ease;\r\n\r\n &:hover {\r\n border: 1px solid $cBlue;\r\n }\r\n }\r\n }\r\n}\r\n\r\n.bootstrap-tagsinput {\r\n .tag {\r\n background: $cBlue;\r\n font-size: 13px;\r\n padding: 5px 10px;\r\n border-radius: 12px;\r\n\r\n [data-role=\"remove\"] {\r\n color: #FFF !important;\r\n\r\n &:hover {\r\n box-shadow: none !important;\r\n color: #000 !important\r\n }\r\n }\r\n }\r\n}\r\n\r\n.finance-tags {\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: 5px;\r\n\r\n a:not(.btn) {\r\n display: flex;\r\n width: 100%;\r\n text-decoration: none;\r\n color: $cBlack;\r\n\r\n &.zoom-100 {\r\n font-size: 130%;\r\n }\r\n\r\n &.zoom-90 {\r\n font-size: 120%;\r\n }\r\n\r\n &.zoom-80 {\r\n font-size: 110%;\r\n }\r\n\r\n &.zoom-70 {\r\n font-size: 100%;\r\n }\r\n\r\n &.zoom-60 {\r\n font-size: 95%;\r\n }\r\n\r\n &.zoom-50 {\r\n font-size: 85%;\r\n }\r\n\r\n &.zoom-40 {\r\n font-size: 80%;\r\n }\r\n\r\n &.zoom-30 {\r\n font-size: 75%;\r\n }\r\n\r\n &.zoom-20 {\r\n font-size: 75%;\r\n }\r\n\r\n &.zoom-10 {\r\n font-size: 70%;\r\n }\r\n\r\n &.zoom-0 {\r\n font-size: 70%;\r\n }\r\n }\r\n}\r\n\r\n.manage-menu {\r\n position: relative;\r\n\r\n .context-menu {\r\n border-left: 4px dotted #000;\r\n width: 1px;\r\n height: 100%;\r\n }\r\n\r\n .context-menu-container {\r\n position: absolute;\r\n display: none;\r\n background: #FFF;\r\n box-shadow: 5px 5px 15px rgba(0, 0, 0, 0.1);\r\n top: 2px;\r\n left: 2px;\r\n\r\n ul {\r\n list-style-type: none;\r\n margin: 0;\r\n padding: 0;\r\n\r\n li {\r\n a {\r\n display: block;\r\n padding: 7px 15px;\r\n white-space: nowrap;\r\n\r\n &:hover {\r\n background: #f8f8f8;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n &:hover {\r\n .context-menu-container {\r\n display: block;\r\n }\r\n }\r\n}\r\n\r\n.wiki-categories {\r\n display: grid;\r\n gap: 10px;\r\n margin-top: 25px;\r\n grid-template-columns: 1fr 1fr 1fr 1fr;\r\n\r\n .category {\r\n background: #FFF;\r\n padding: 10px;\r\n\r\n .users {\r\n display: grid;\r\n grid-template-columns: 1fr 1fr 1fr 1fr;\r\n gap: 5px;\r\n\r\n .user {\r\n display: flex;\r\n height: 25px;\r\n width: 25px;\r\n border-radius: 50%;\r\n background: #ccc;\r\n justify-content: center;\r\n align-items: center;\r\n color: #FFF;\r\n font-size: 12px;\r\n }\r\n }\r\n\r\n .actions {\r\n display: grid;\r\n grid-template-columns: 1fr 1fr;\r\n\r\n a {\r\n display: block;\r\n color: $cBlack;\r\n font-size: 13px;\r\n text-align: center;\r\n }\r\n }\r\n\r\n .title {\r\n margin-bottom: 5px;\r\n\r\n a {\r\n display: block;\r\n color: $cBlack;\r\n font-size: 13px;\r\n font-weight: 600;\r\n }\r\n }\r\n }\r\n}"]} \ No newline at end of file +{"version":3,"sources":["style.scss"],"names":[],"mappings":"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","file":"style.css","sourcesContent":["$cBlue: #6690F4;\r\n$cRed: #cc563d;\r\n$cGreen: #099885;\r\n$cBlack: #4e5e6a;\r\n\r\n.default-btn {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n height: 40px;\r\n border-radius: .25rem;\r\n padding: 0 15px;\r\n transition: all .3s ease;\r\n\r\n &:hover {\r\n text-decoration: none;\r\n }\r\n}\r\n\r\n.animate {\r\n animation: mymove 3s infinite;\r\n}\r\n\r\n.text-right {\r\n text-align: right;\r\n}\r\n\r\n.nowrap {\r\n white-space: nowrap;\r\n}\r\n\r\ntable {\r\n border-collapse: collapse;\r\n}\r\n\r\nsmall {\r\n font-size: .75em;\r\n}\r\n\r\ntable {\r\n font-size: 13px;\r\n}\r\n\r\n@keyframes mymove {\r\n 50% {\r\n opacity: .33;\r\n }\r\n}\r\n\r\n/* motion */\r\n@keyframes gradient-animation {\r\n 0% {\r\n background-position: 15% 0%;\r\n }\r\n\r\n 50% {\r\n background-position: 85% 100%;\r\n }\r\n\r\n 100% {\r\n background-position: 15% 0%;\r\n }\r\n}\r\n\r\n@keyframes frame-enter {\r\n 0% {\r\n clip-path: polygon(0% 100%, 3px 100%, 3px 3px, calc(100% - 3px) 3px, calc(100% - 3px) calc(100% - 3px), 3px calc(100% - 3px), 3px 100%, 100% 100%, 100% 0%, 0% 0%);\r\n }\r\n\r\n 25% {\r\n clip-path: polygon(0% 100%, 3px 100%, 3px 3px, calc(100% - 3px) 3px, calc(100% - 3px) calc(100% - 3px), calc(100% - 3px) calc(100% - 3px), calc(100% - 3px) 100%, 100% 100%, 100% 0%, 0% 0%);\r\n }\r\n\r\n 50% {\r\n clip-path: polygon(0% 100%, 3px 100%, 3px 3px, calc(100% - 3px) 3px, calc(100% - 3px) 3px, calc(100% - 3px) 3px, calc(100% - 3px) 3px, calc(100% - 3px) 3px, 100% 0%, 0% 0%);\r\n }\r\n\r\n 75% {\r\n -webkit-clip-path: polygon(0% 100%, 3px 100%, 3px 3px, 3px 3px, 3px 3px, 3px 3px, 3px 3px, 3px 3px, 3px 0%, 0% 0%);\r\n }\r\n\r\n 100% {\r\n -webkit-clip-path: polygon(0% 100%, 3px 100%, 3px 100%, 3px 100%, 3px 100%, 3px 100%, 3px 100%, 3px 100%, 3px 100%, 0% 100%);\r\n }\r\n}\r\n\r\n* {\r\n box-sizing: border-box;\r\n}\r\n\r\nbody {\r\n font-family: \"Open Sans\", sans-serif;\r\n margin: 0;\r\n padding: 0;\r\n font-size: 15px;\r\n color: #4e5e6a;\r\n}\r\n\r\n.btn {\r\n padding: 12px 25px;\r\n transition: all 0.3s ease;\r\n color: #FFF;\r\n border: 0;\r\n border-radius: .25rem;\r\n cursor: pointer;\r\n display: inline-flex;\r\n text-decoration: none;\r\n gap: 5px;\r\n justify-content: center;\r\n align-items: center;\r\n\r\n &.btn_small,\r\n &.btn-xs {\r\n padding: 5px 7px;\r\n font-size: 13px;\r\n\r\n i {\r\n font-size: 12px;\r\n }\r\n }\r\n\r\n &.btn-success {\r\n background: $cGreen;\r\n\r\n &:hover {\r\n background: #4a9c3b;\r\n }\r\n }\r\n\r\n &.btn-primary {\r\n background: $cBlue;\r\n\r\n &:hover {\r\n background: #3164db;\r\n }\r\n }\r\n\r\n &.btn-danger {\r\n background: $cRed;\r\n\r\n &:hover {\r\n background: #b30000;\r\n }\r\n }\r\n}\r\n\r\n.hide {\r\n display: none;\r\n}\r\n\r\n.form-error {\r\n color: $cRed;\r\n font-size: 13px;\r\n}\r\n\r\n.input-group {\r\n margin-bottom: 10px;\r\n}\r\n\r\ninput[type=\"checkbox\"] {\r\n border: 1px solid #ebebeb;\r\n}\r\n\r\n.form-control {\r\n border: 1px solid #ebebeb;\r\n border-radius: 3px;\r\n height: 35px;\r\n width: 100%;\r\n padding: 5px;\r\n font-family: \"Open Sans\", sans-serif;\r\n\r\n option {\r\n padding: 5px;\r\n }\r\n\r\n &:focus {\r\n border: 1px solid $cBlue;\r\n outline: none;\r\n }\r\n}\r\n\r\n.unlogged {\r\n background: #EEF1F9;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n height: 100vh;\r\n\r\n .box-login {\r\n background: #FFF;\r\n padding: 25px;\r\n border-radius: .25rem;\r\n width: 400px;\r\n\r\n .title {\r\n text-align: center;\r\n padding: 10px 10px 25px;\r\n border-bottom: 1px solid #ebebeb;\r\n font-size: 20px;\r\n margin-bottom: 25px;\r\n }\r\n }\r\n}\r\n\r\nbody>.top {\r\n background: #FFF;\r\n border-bottom: 1px solid #ebebeb;\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n\r\n .logo {\r\n a {\r\n display: inline-flex;\r\n color: $cBlue;\r\n padding: 10px;\r\n text-decoration: none;\r\n\r\n span {\r\n font-weight: 600;\r\n }\r\n }\r\n }\r\n\r\n .user-nav {\r\n position: relative;\r\n font-size: 14px;\r\n padding: 10px;\r\n\r\n .trigger {\r\n cursor: pointer;\r\n\r\n i {\r\n color: $cBlue;\r\n }\r\n }\r\n\r\n ul {\r\n position: absolute;\r\n top: 100%;\r\n left: 0;\r\n background: #FFF;\r\n margin: 0;\r\n padding: 0;\r\n width: 100%;\r\n list-style-type: none;\r\n border: 1px solid #ebebeb;\r\n display: none;\r\n\r\n li {\r\n cursor: pointer;\r\n\r\n &:hover {\r\n background: #F8F9FA;\r\n }\r\n\r\n a {\r\n color: #333;\r\n display: block;\r\n text-decoration: none;\r\n padding: 10px;\r\n }\r\n }\r\n }\r\n\r\n &:hover {\r\n ul {\r\n display: block;\r\n }\r\n }\r\n }\r\n}\r\n\r\n.main-menu {\r\n display: flex;\r\n box-shadow: 0 .125rem .25rem rgba(0, 0, 0, .075) !important;\r\n\r\n ul {\r\n display: flex;\r\n list-style-type: none;\r\n margin: 0;\r\n padding: 0;\r\n font-size: 14px;\r\n\r\n li {\r\n cursor: pointer;\r\n\r\n a {\r\n color: #333;\r\n text-decoration: none;\r\n display: inline-flex;\r\n padding: 10px 15px;\r\n }\r\n\r\n &:hover {\r\n a {\r\n background: $cBlue;\r\n color: #FFF;\r\n }\r\n }\r\n\r\n ul {\r\n display: none;\r\n }\r\n }\r\n }\r\n}\r\n\r\n.main {\r\n padding: 25px;\r\n background: #D9DEE2;\r\n min-height: calc(100vh - 80px);\r\n}\r\n\r\n.tasks_container {\r\n display: grid;\r\n grid-template-columns: repeat(7, 1fr);\r\n gap: 20px;\r\n\r\n .column {\r\n width: 100%;\r\n\r\n h2 {\r\n display: flex;\r\n padding: 10px;\r\n background: #FFF;\r\n margin-bottom: 10px;\r\n font-size: 15px;\r\n font-weight: 300;\r\n border-radius: 3px 3px 0 0;\r\n justify-content: space-between;\r\n align-items: center;\r\n\r\n i {\r\n cursor: pointer;\r\n }\r\n }\r\n\r\n &.tasks_suspended {\r\n h2 {\r\n border-bottom: 5px solid $cRed;\r\n }\r\n }\r\n\r\n &.tasks_fvat {\r\n h2 {\r\n border-bottom: 5px solid #a900fc;\r\n }\r\n }\r\n\r\n &.tasks_new {\r\n h2 {\r\n border-bottom: 5px solid #ccc;\r\n }\r\n }\r\n\r\n &.tasks_bulk {\r\n h2 {\r\n border-bottom: 5px solid #ff8c00;\r\n }\r\n }\r\n\r\n &.tasks_to_do {\r\n h2 {\r\n border-bottom: 5px solid #2aaf47;\r\n }\r\n }\r\n\r\n &.tasks_to_review {\r\n h2 {\r\n border-bottom: 5px solid #2535c9;\r\n }\r\n }\r\n\r\n &.tasks_closed {\r\n h2 {\r\n border-bottom: 5px solid #000;\r\n }\r\n }\r\n\r\n ul {\r\n list-style-type: none;\r\n margin: 0;\r\n padding: 0;\r\n\r\n .task {\r\n margin-bottom: 5px;\r\n background: #FFF;\r\n padding: 10px;\r\n border-radius: 0;\r\n display: flex;\r\n position: relative;\r\n border-radius: .25rem;\r\n flex-wrap: wrap;\r\n\r\n &.notopened {\r\n border: 2px solid $cRed;\r\n }\r\n\r\n .top {\r\n display: flex;\r\n justify-content: space-between;\r\n margin-bottom: 5px;\r\n width: 100%;\r\n\r\n ._users {\r\n display: flex;\r\n gap: 5px;\r\n flex-wrap: wrap;\r\n\r\n .user {\r\n display: flex;\r\n width: 25px;\r\n height: 25px;\r\n border-radius: .25rem;\r\n justify-content: center;\r\n align-items: center;\r\n color: #FFF;\r\n font-size: 12px;\r\n }\r\n }\r\n\r\n ._timer {\r\n display: flex;\r\n gap: 5px;\r\n\r\n .recursively {\r\n color: #FFF;\r\n background: #405189;\r\n border-radius: 3px;\r\n cursor: pointer;\r\n margin-bottom: 5px;\r\n width: 25px;\r\n height: 25px;\r\n text-align: center;\r\n display: block;\r\n\r\n i {\r\n font-size: 12px;\r\n }\r\n }\r\n\r\n .task_start {\r\n display: block;\r\n background: $cGreen;\r\n color: #FFF;\r\n border-radius: .25rem;\r\n cursor: pointer;\r\n margin-bottom: 5px;\r\n width: 25px;\r\n height: 25px;\r\n text-align: center;\r\n\r\n &.hidden {\r\n display: none;\r\n }\r\n\r\n i {\r\n font-size: 12px;\r\n }\r\n }\r\n\r\n .task_end {\r\n background: $cRed;\r\n display: block;\r\n color: #FFF;\r\n border-radius: .25rem;\r\n cursor: pointer;\r\n margin-bottom: 5px;\r\n width: 25px;\r\n height: 25px;\r\n text-align: center;\r\n\r\n &.hidden {\r\n display: none;\r\n }\r\n\r\n i {\r\n font-size: 12px;\r\n }\r\n }\r\n }\r\n }\r\n\r\n .middle {\r\n width: 100%;\r\n }\r\n\r\n .name {\r\n font-size: 14px;\r\n color: #333;\r\n text-decoration: none;\r\n display: block;\r\n margin-bottom: 5px;\r\n }\r\n\r\n .bottom {\r\n display: flex;\r\n justify-content: space-between;\r\n }\r\n\r\n .client_info,\r\n .current_status {\r\n font-size: 12px;\r\n font-weight: 400;\r\n\r\n strong {\r\n font-weight: 600;\r\n }\r\n }\r\n\r\n .current_status {\r\n position: relative;\r\n cursor: pointer;\r\n\r\n .status_change {\r\n position: absolute;\r\n left: 0;\r\n top: 20px;\r\n background: #fff;\r\n padding: 15px;\r\n border: 1px solid #dfdfdf;\r\n border-radius: 3px;\r\n cursor: pointer;\r\n box-shadow: 0 0 15px rgba(0, 0, 0, 0.1);\r\n z-index: 99;\r\n display: none;\r\n\r\n select {\r\n width: 250px;\r\n padding: 10px;\r\n border: 1px solid #ebebeb;\r\n border-radius: 3px;\r\n\r\n option {\r\n font-size: 15px;\r\n padding: 3px;\r\n }\r\n }\r\n }\r\n }\r\n\r\n .dates {\r\n margin-bottom: 5px;\r\n display: flex;\r\n justify-content: space-between;\r\n font-size: 12px;\r\n\r\n .danger {\r\n color: $cRed;\r\n font-weight: 600;\r\n }\r\n\r\n .warning {\r\n color: #ff8c00;\r\n }\r\n\r\n i {\r\n font-size: 12px;\r\n color: #C9CED4;\r\n margin-right: 5px;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n.action_menu {\r\n display: flex;\r\n margin-bottom: 25px;\r\n gap: 20px;\r\n\r\n .btn {\r\n display: inline-flex;\r\n padding: 7px 15px;\r\n color: #FFF;\r\n border-radius: 3px;\r\n text-decoration: none;\r\n align-items: center;\r\n justify-content: center;\r\n gap: 5px;\r\n\r\n &.btn_add {\r\n background: $cGreen;\r\n\r\n &:hover {\r\n background: #4a9c3b;\r\n }\r\n }\r\n\r\n &.btn_cancel {\r\n background: $cRed;\r\n\r\n &:hover {\r\n background: #b30000;\r\n }\r\n }\r\n\r\n &.disabled {\r\n opacity: .5;\r\n }\r\n }\r\n}\r\n\r\n.form_container {\r\n background: #FFF;\r\n padding: 25px;\r\n max-width: 1300px;\r\n\r\n &.full {\r\n max-width: 100%;\r\n }\r\n\r\n .form_group {\r\n margin-bottom: 10px;\r\n display: flex;\r\n\r\n >.label {\r\n width: 300px;\r\n display: inline-flex;\r\n align-items: flex-start;\r\n justify-content: right;\r\n padding-right: 10px;\r\n }\r\n\r\n .input {\r\n width: calc(100% - 300px);\r\n }\r\n }\r\n}\r\n\r\n.fullscreen_description {\r\n position: fixed !important;\r\n top: 25px;\r\n left: 25px;\r\n right: 25px;\r\n bottom: 25px;\r\n z-index: 9999;\r\n background: white;\r\n padding: 20px;\r\n overflow: auto;\r\n border-radius: 0.25rem;\r\n box-shadow: 0 0 20px rgba(0, 0, 0, 0.3);\r\n}\r\n\r\n.fullscreen {\r\n position: absolute;\r\n top: 10px;\r\n right: 10px;\r\n cursor: pointer;\r\n color: #FFF;\r\n background: $cRed;\r\n display: inline-flex;\r\n height: 40px;\r\n width: 40px;\r\n border-radius: .25rem;\r\n align-items: center;\r\n justify-content: center;\r\n transition: all 0.3s ease;\r\n\r\n &:hover {\r\n transform: scale(1.05);\r\n text-decoration: none;\r\n }\r\n}\r\n\r\n.task_popup {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n background: rgba(0, 0, 0, 0.5);\r\n display: none;\r\n z-index: 9999;\r\n\r\n .task_details {\r\n position: absolute;\r\n top: 50%;\r\n left: 50%;\r\n transform: translate(-50%, -50%);\r\n background: #FFF;\r\n padding: 25px;\r\n border-radius: .25rem;\r\n max-width: 1140px;\r\n width: 100%;\r\n transition: all 0.3s ease;\r\n height: 90vh;\r\n\r\n .content {\r\n height: calc(100% - 50px);\r\n }\r\n\r\n &.open_works_time {\r\n max-width: 1540px;\r\n\r\n .content {\r\n grid-template-columns: 1fr 300px 350px;\r\n\r\n .task_work_details {\r\n display: block;\r\n }\r\n }\r\n }\r\n\r\n .title {\r\n font-size: 20px;\r\n margin-bottom: 25px;\r\n display: flex;\r\n align-items: center;\r\n gap: 10px;\r\n\r\n a {\r\n border: 1px solid $cGreen;\r\n display: inline-flex;\r\n height: 30px;\r\n width: 30px;\r\n border-radius: .25rem;\r\n align-items: center;\r\n justify-content: center;\r\n\r\n &:hover {\r\n text-decoration: none;\r\n }\r\n\r\n i {\r\n color: $cGreen;\r\n }\r\n\r\n &.task-delete {\r\n border: 1px solid $cRed;\r\n\r\n i {\r\n color: $cRed;\r\n }\r\n }\r\n\r\n i {\r\n font-size: 14px;\r\n }\r\n }\r\n }\r\n\r\n .close {\r\n position: absolute;\r\n top: 10px;\r\n right: 10px;\r\n cursor: pointer;\r\n }\r\n\r\n .content {\r\n display: grid;\r\n font-size: 14px;\r\n grid-template-columns: 1fr 300px;\r\n gap: 30px;\r\n transition: all 0.3s ease;\r\n\r\n h3 {\r\n width: 100%;\r\n margin-top: 0;\r\n margin-bottom: 5px;\r\n font-weight: 500;\r\n color: #000;\r\n font-size: 17px;\r\n }\r\n\r\n .left {\r\n height: 100%;\r\n overflow: hidden;\r\n\r\n .users {\r\n display: flex;\r\n gap: 20px;\r\n\r\n .user {\r\n display: flex;\r\n gap: 10px;\r\n align-items: center;\r\n margin-bottom: 10px;\r\n\r\n .avatar {\r\n height: 30px;\r\n width: 30px;\r\n border-radius: .25rem;\r\n background: #ccc;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n color: #FFF;\r\n font-size: 12px;\r\n }\r\n }\r\n }\r\n\r\n .comments {\r\n border-radius: 3px;\r\n margin-bottom: 10px;\r\n\r\n .new_comment {\r\n margin-bottom: 10px;\r\n\r\n textarea {\r\n height: 75px;\r\n margin-bottom: 10px;\r\n border-radius: .25rem;\r\n }\r\n\r\n .add_comment {\r\n background: $cGreen;\r\n color: #FFF;\r\n padding: 10px;\r\n border-radius: .25rem;\r\n cursor: pointer;\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 200px;\r\n text-decoration: none;\r\n\r\n &:hover {\r\n background: #4a9c3b;\r\n }\r\n }\r\n }\r\n\r\n ul {\r\n margin: 0;\r\n padding: 0;\r\n list-style-type: none;\r\n\r\n li {\r\n background: #ced4da;\r\n margin-bottom: 5px;\r\n padding: 15px;\r\n border-radius: .25rem;\r\n position: relative;\r\n\r\n .delete_comment {\r\n position: absolute;\r\n top: 10px;\r\n right: 10px;\r\n cursor: pointer;\r\n color: $cRed;\r\n }\r\n\r\n .author {\r\n font-weight: 600;\r\n margin-bottom: 5px;\r\n display: inline-flex;\r\n margin-right: 10px;\r\n }\r\n\r\n .date {\r\n font-size: 12px;\r\n margin-bottom: 5px;\r\n display: inline-flex;\r\n }\r\n\r\n .text {\r\n margin-bottom: 15px;\r\n font-size: 13px;\r\n }\r\n }\r\n }\r\n }\r\n\r\n .checklist {\r\n border-radius: 3px;\r\n margin-bottom: 10px;\r\n\r\n .new_element {\r\n display: flex;\r\n margin-bottom: 10px;\r\n\r\n a {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n padding: 10px;\r\n border-radius: 0 .25rem .25rem 0;\r\n text-decoration: none;\r\n width: 35px;\r\n background: $cGreen;\r\n color: #FFF;\r\n }\r\n }\r\n\r\n ul {\r\n margin: 0;\r\n padding: 0;\r\n list-style-type: none;\r\n overflow-y: auto;\r\n max-height: calc(90vh - 400px);\r\n\r\n li {\r\n display: flex;\r\n gap: 10px;\r\n margin-bottom: 5px;\r\n background: #FFF;\r\n border-radius: 3px;\r\n padding: 10px;\r\n border: 1px solid #ebebeb;\r\n font-size: 13px;\r\n align-items: flex-start;\r\n\r\n a {\r\n margin-left: auto;\r\n margin-right: 0;\r\n cursor: pointer;\r\n background: $cRed;\r\n display: flex;\r\n height: 25px;\r\n width: 25px;\r\n min-width: 25px;\r\n justify-content: center;\r\n align-items: center;\r\n border: 0;\r\n border-radius: 3px;\r\n transition: all 0.3s ease;\r\n\r\n &:hover {\r\n text-decoration: none;\r\n background: #b30000;\r\n }\r\n\r\n i {\r\n color: #FFF;\r\n font-size: 12px;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n .description {\r\n padding: 15px;\r\n border-radius: 0.25rem;\r\n border: 1px solid #ebebeb;\r\n margin-bottom: 15px;\r\n max-height: 202px;\r\n overflow-x: hidden;\r\n position: relative;\r\n }\r\n }\r\n\r\n .right {\r\n\r\n .box {\r\n margin-bottom: 15px;\r\n }\r\n\r\n .time {\r\n a.time_worked_toggle {\r\n @extend .default-btn;\r\n color: #299cdb;\r\n display: inline-flex;\r\n border: 1px solid #299cdb;\r\n\r\n &:hover {\r\n background: #dff0fa;\r\n text-decoration: none;\r\n }\r\n\r\n &:active,\r\n &:focus {\r\n text-decoration: none;\r\n }\r\n }\r\n\r\n a:not(.time_worked_toggle) {\r\n @extend .default-btn;\r\n margin-top: 10px;\r\n text-decoration: none;\r\n gap: 10px;\r\n\r\n &.task_start {\r\n background: #0ab39c;\r\n color: #FFF;\r\n\r\n &:hover {\r\n background: #099885;\r\n }\r\n }\r\n\r\n &.task_end {\r\n background: $cRed;\r\n color: #FFF;\r\n }\r\n\r\n &.hidden {\r\n display: none;\r\n }\r\n }\r\n }\r\n\r\n .dates {\r\n display: flex;\r\n justify-content: space-between;\r\n flex-wrap: wrap;\r\n\r\n .danger {\r\n color: $cRed;\r\n font-weight: 600;\r\n }\r\n\r\n .warning {\r\n color: #ff8c00;\r\n }\r\n\r\n i {\r\n color: #C9CED4;\r\n margin-right: 5px;\r\n }\r\n }\r\n }\r\n\r\n .task_work_details {\r\n display: none;\r\n overflow-y: auto;\r\n max-height: 508px;\r\n width: 100%;\r\n padding-right: 10px;\r\n padding-top: 4px;\r\n\r\n ._line {\r\n display: flex;\r\n flex-wrap: wrap;\r\n justify-content: space-between;\r\n align-items: center;\r\n margin-bottom: 5px;\r\n\r\n ._user {\r\n width: 100%;\r\n font-size: 13px;\r\n }\r\n\r\n input {\r\n width: calc(50% - 25px);\r\n text-align: center;\r\n margin-left: 2px;\r\n margin-right: 2px;\r\n }\r\n }\r\n\r\n ._work_delete {\r\n display: inline-flex;\r\n height: 35px;\r\n width: 35px;\r\n border-radius: .25rem;\r\n align-items: center;\r\n justify-content: center;\r\n cursor: pointer;\r\n border: 1px solid $cRed;\r\n margin-left: 2px;\r\n transition: all 0.3s ease;\r\n\r\n &:hover {\r\n background: $cRed;\r\n\r\n i {\r\n color: #FFF;\r\n }\r\n }\r\n\r\n i {\r\n transition: all 0.3s ease;\r\n color: $cRed;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n.table {\r\n width: 100%;\r\n\r\n th,\r\n td {\r\n border: 1px solid #ebebeb;\r\n padding: 5px;\r\n }\r\n\r\n td.center {\r\n text-align: center;\r\n }\r\n\r\n td.left {\r\n text-align: left;\r\n }\r\n}\r\n\r\n.projects_container {\r\n background: #FFF;\r\n padding: 15px;\r\n border-radius: .25rem;\r\n display: flex;\r\n gap: 20px;\r\n\r\n .left {\r\n width: calc(100% - 250px);\r\n\r\n ._projects,\r\n ._users {\r\n display: flex;\r\n gap: 20px;\r\n flex-wrap: wrap;\r\n }\r\n }\r\n\r\n .right {\r\n width: 250px;\r\n display: flex;\r\n flex-wrap: wrap;\r\n align-items: flex-start;\r\n justify-content: center;\r\n gap: 20px;\r\n border-left: 1px solid #ebebeb;\r\n padding-left: 15px;\r\n\r\n select {\r\n width: 200px;\r\n }\r\n }\r\n}\r\n\r\n.default_popup {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n background: rgba(0, 0, 0, 0.5);\r\n display: none;\r\n\r\n .popup_content {\r\n position: absolute;\r\n top: 50%;\r\n left: 50%;\r\n transform: translate(-50%, -50%);\r\n background: #FFF;\r\n padding: 25px;\r\n border-radius: .25rem;\r\n max-width: 1140px;\r\n width: 100%;\r\n\r\n .close {\r\n position: absolute;\r\n top: 10px;\r\n right: 10px;\r\n cursor: pointer;\r\n }\r\n }\r\n}\r\n\r\n#fg-cron {\r\n margin: 10px 0;\r\n\r\n .countdown {\r\n background: $cGreen;\r\n color: #FFF;\r\n padding: 10px;\r\n }\r\n\r\n #cron-container {\r\n max-height: 300px;\r\n overflow-x: hidden;\r\n overflow-y: auto;\r\n\r\n .msg {\r\n font-size: 13px;\r\n padding: 5px;\r\n border-bottom: 1px solid #e8e8e8;\r\n }\r\n }\r\n}\r\n\r\n.card {\r\n background: #FFF;\r\n padding: 25px;\r\n border-radius: .25rem;\r\n color: #000;\r\n font-size: 15px;\r\n max-width: 1280px;\r\n\r\n &.mb25 {\r\n margin-bottom: 25px;\r\n }\r\n\r\n .card-header {\r\n font-weight: 600;\r\n }\r\n\r\n .card-body {\r\n padding-top: 10px;\r\n\r\n table {\r\n border-collapse: collapse;\r\n\r\n th,\r\n td {\r\n font-size: 14px;\r\n\r\n &.bold {\r\n font-weight: 600;\r\n }\r\n\r\n &.text-right {\r\n text-align: right;\r\n }\r\n\r\n &.text-center {\r\n text-align: center;\r\n }\r\n\r\n .close-task {\r\n text-decoration: none;\r\n color: $cBlue;\r\n\r\n &:hover {\r\n color: $cRed;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n.finance-summary {\r\n display: grid;\r\n grid-template-columns: 1fr 1fr 1fr 1fr;\r\n gap: 10px;\r\n\r\n .panel {\r\n background: #FFF;\r\n border-radius: .25rem;\r\n padding: 15px;\r\n\r\n h1 {\r\n font-size: 20px;\r\n margin: 0;\r\n }\r\n\r\n span {\r\n font-size: 0.85em;\r\n }\r\n }\r\n}\r\n\r\n.finance-manager {\r\n display: grid;\r\n gap: 10px;\r\n grid-template-columns: 200px 1fr 500px;\r\n padding-top: 25px;\r\n\r\n .manage-menu {\r\n display: inline-block;\r\n margin-right: 10px;\r\n\r\n a {\r\n color: #333333;\r\n text-decoration: none;\r\n font-weight: 300;\r\n display: block;\r\n }\r\n }\r\n\r\n .actions {\r\n width: 100px;\r\n text-align: center;\r\n\r\n a {\r\n display: inline-flex;\r\n margin: 0 2px;\r\n height: 25px;\r\n width: 25px;\r\n align-items: center;\r\n justify-content: center;\r\n text-decoration: none;\r\n color: #000;\r\n border: 1px solid #e7e7e7;\r\n font-size: 11px;\r\n border-radius: 3px;\r\n transition: all 0.3s ease;\r\n\r\n &:hover {\r\n border: 1px solid $cBlue;\r\n }\r\n }\r\n }\r\n}\r\n\r\n.bootstrap-tagsinput {\r\n .tag {\r\n background: $cBlue;\r\n font-size: 13px;\r\n padding: 5px 10px;\r\n border-radius: 12px;\r\n\r\n [data-role=\"remove\"] {\r\n color: #FFF !important;\r\n\r\n &:hover {\r\n box-shadow: none !important;\r\n color: #000 !important\r\n }\r\n }\r\n }\r\n}\r\n\r\n.finance-tags {\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: 5px;\r\n\r\n a:not(.btn) {\r\n display: flex;\r\n width: 100%;\r\n text-decoration: none;\r\n color: $cBlack;\r\n\r\n &.zoom-100 {\r\n font-size: 130%;\r\n }\r\n\r\n &.zoom-90 {\r\n font-size: 120%;\r\n }\r\n\r\n &.zoom-80 {\r\n font-size: 110%;\r\n }\r\n\r\n &.zoom-70 {\r\n font-size: 100%;\r\n }\r\n\r\n &.zoom-60 {\r\n font-size: 95%;\r\n }\r\n\r\n &.zoom-50 {\r\n font-size: 85%;\r\n }\r\n\r\n &.zoom-40 {\r\n font-size: 80%;\r\n }\r\n\r\n &.zoom-30 {\r\n font-size: 75%;\r\n }\r\n\r\n &.zoom-20 {\r\n font-size: 75%;\r\n }\r\n\r\n &.zoom-10 {\r\n font-size: 70%;\r\n }\r\n\r\n &.zoom-0 {\r\n font-size: 70%;\r\n }\r\n }\r\n}\r\n\r\n.manage-menu {\r\n position: relative;\r\n\r\n .context-menu {\r\n border-left: 4px dotted #000;\r\n width: 1px;\r\n height: 100%;\r\n }\r\n\r\n .context-menu-container {\r\n position: absolute;\r\n display: none;\r\n background: #FFF;\r\n box-shadow: 5px 5px 15px rgba(0, 0, 0, 0.1);\r\n top: 2px;\r\n left: 2px;\r\n\r\n ul {\r\n list-style-type: none;\r\n margin: 0;\r\n padding: 0;\r\n\r\n li {\r\n a {\r\n display: block;\r\n padding: 7px 15px;\r\n white-space: nowrap;\r\n\r\n &:hover {\r\n background: #f8f8f8;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n &:hover {\r\n .context-menu-container {\r\n display: block;\r\n }\r\n }\r\n}\r\n\r\n.wiki-categories {\r\n display: grid;\r\n gap: 10px;\r\n margin-top: 25px;\r\n grid-template-columns: 1fr 1fr 1fr 1fr;\r\n\r\n .category {\r\n background: #FFF;\r\n padding: 10px;\r\n\r\n .users {\r\n display: grid;\r\n grid-template-columns: 1fr 1fr 1fr 1fr;\r\n gap: 5px;\r\n\r\n .user {\r\n display: flex;\r\n height: 25px;\r\n width: 25px;\r\n border-radius: 50%;\r\n background: #ccc;\r\n justify-content: center;\r\n align-items: center;\r\n color: #FFF;\r\n font-size: 12px;\r\n }\r\n }\r\n\r\n .actions {\r\n display: grid;\r\n grid-template-columns: 1fr 1fr;\r\n\r\n a {\r\n display: block;\r\n color: $cBlack;\r\n font-size: 13px;\r\n text-align: center;\r\n }\r\n }\r\n\r\n .title {\r\n margin-bottom: 5px;\r\n\r\n a {\r\n display: block;\r\n color: $cBlack;\r\n font-size: 13px;\r\n font-weight: 600;\r\n }\r\n }\r\n }\r\n}\r\n\r\n.bootstrap-datetimepicker-widget .picker-switch {\r\n a {\r\n display: block;\r\n color: #000;\r\n }\r\n}"]} \ No newline at end of file diff --git a/layout/style.scss b/layout/style.scss index 79378ad..8d366ed 100644 --- a/layout/style.scss +++ b/layout/style.scss @@ -1460,4 +1460,11 @@ body>.top { } } } +} + +.bootstrap-datetimepicker-widget .picker-switch { + a { + display: block; + color: #000; + } } \ No newline at end of file diff --git a/libraries/Simple-Gant-master/LICENSE b/libraries/Simple-Gant-master/LICENSE new file mode 100644 index 0000000..2aecb5a --- /dev/null +++ b/libraries/Simple-Gant-master/LICENSE @@ -0,0 +1,23 @@ +MIT License + +Copyright (c) 2022 Malek mliki + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +#Only a credit or metion would be nice but no obligation diff --git a/libraries/Simple-Gant-master/README.md b/libraries/Simple-Gant-master/README.md new file mode 100644 index 0000000..d0b746e Binary files /dev/null and b/libraries/Simple-Gant-master/README.md differ diff --git a/libraries/Simple-Gant-master/frappe-gantt.css b/libraries/Simple-Gant-master/frappe-gantt.css new file mode 100644 index 0000000..9a45909 --- /dev/null +++ b/libraries/Simple-Gant-master/frappe-gantt.css @@ -0,0 +1,348 @@ +.add-task input[type="submit"] { + color: white; + width: 80px; + margin-top: 4px; + background-color: #27ae60; + padding: 4px; + border: none; + cursor: pointer; + align-self: flex-end; +} + +.add-task input[type="reset"] { + color: white; + width: 80px; + margin-top: 4px; + background-color: #e74c3c; + padding: 4px; + border: none; + cursor: pointer; + align-self: flex-end; +} + +.add-task input[type="submit"]:hover { + background-color: #27ae60b0; +} + +.add-task input[type="reset"]:hover { + background-color: #e74c3cb8; +} + +.circle { + fill: #14283c; +} + +.text-circle { + fill: #a3bbad; + font-weight: 600; +} + +.tools { + text-align: right; + +} + +.input1 { + background-color: rgba(0, 0, 0, 0.8); + border: 0; + width: 70%; + color: #959da5; +} + +.input2 { + background-color: rgba(0, 0, 0, 0.8); + border: 0; + width: 100%; + margin-bottom: 4px; + color: #959da5; + +} + +.tools svg, +.subtitle svg { + float: right; + display: block; + padding: 4px; + cursor: pointer; + fill: white; + padding: 8px; + font-weight: bold; + width: 20px; + height: 20px; + +} + +.tools svg:hover, +.subtitle svg:hover { + fill: #e74c3c; +} + +.tools svg path { + font-weight: 900; +} + +.contextmenu { + position: absolute; + width: 100px; + height: auto; + background: rgba(0, 0, 0, 0.1); + padding: 0; + color: black; + border-radius: 3px; + cursor: pointer; + display: block; + +} + +.disabled { + pointer-events: none; + color: #a9b5c1; +} + +.wrong { + border: 1px solid red; +} + +.add-task { + position: absolute; + width: 200px; + padding: 4px; + background-color: rgba(0, 0, 0, 0.2); + display: none; + +} + +.add-task form { + display: flex; + flex-direction: column; + margin-bottom: 2px; +} + + +.contextmenu span { + padding: 8px; + display: block; + font-weight: 600; +} + + + +.contextmenu span:hover { + background: rgba(0, 0, 0, 0.2); + +} + + +.triangle { + opacity: 0.6; + cursor: pointer; +} + +.triangle:hover { + opacity: 1; +} + +.gantt .red { + fill: #e74c3c; +} + +.gantt .orange { + fill: #FF6B30; +} + +.gantt .yellow { + fill: #FFD300; +} + +.gantt .green { + fill: #27ae60; +} + +.outline { + outline: 2px solid #333; +} + +.noopacity { + display: none; +} + +.opacity { + display: block; +} + +.gantt .grid-background { + fill: none; +} + +.gantt .grid-header { + fill: #ffffff; + stroke: #e0e0e0; + stroke-width: 1.4; +} + +.gantt .grid-row { + fill: #ffffff; +} + +.gantt .grid-row:nth-child(even) { + fill: #f5f5f5; +} + +.gantt .row-line { + stroke: #ebeff2; +} + +.gantt .tick { + stroke: #e0e0e0; + stroke-width: 0.2; +} + +.gantt .tick.thick { + stroke-width: 0.4; +} + +.gantt .today-highlight { + fill: #61b75e; + opacity: 0.5; +} + +.gantt .arrow { + fill: none; + stroke: #666; + stroke-width: 1.4; +} + +.gantt .bar { + fill: #b8c2cc; + stroke: #8D99A6; + stroke-width: 0; + transition: stroke-width .3s ease; + user-select: none; +} + +.gantt .bar.gantt-task-backlog { + fill: #640808; +} + +.gantt .bar-wrapper:hover .bar.gantt-task-backlog { + fill: #640808; +} + +.gantt .bar-progress { + fill: #a71e1e; +} + +.gantt .bar-invalid { + fill: transparent; + stroke: #8D99A6; + stroke-width: 1; + stroke-dasharray: 5; +} + +.gantt .bar-invalid~.bar-label { + fill: #555; +} + +.gantt .bar-label { + fill: #fff; + dominant-baseline: central; + text-anchor: middle; + font-size: 12px; + font-weight: lighter; +} + +.gantt .bar-label.big { + fill: #555; + text-anchor: start; +} + +.gantt .handle { + fill: #ddd; + cursor: ew-resize; + opacity: 0; + visibility: hidden; + transition: opacity .3s ease; +} + +.gantt .bar-wrapper { + cursor: pointer; + outline: none; +} + +.gantt .bar-wrapper:hover .bar { + fill: #a9b5c1; +} + +.gantt .bar-wrapper:hover .bar-progress { + fill: #8a8aff; +} + +.gantt .bar-wrapper:hover .handle { + visibility: visible; + opacity: 1; +} + +.gantt .bar-wrapper.active .bar { + fill: #a9b5c1; +} + +.gantt .bar-wrapper.active .bar-progress { + fill: #8a8aff; +} + +.gantt .lower-text, +.gantt .upper-text { + font-size: 12px; + text-anchor: middle; +} + +.gantt .upper-text { + fill: #555; +} + +.gantt .lower-text { + fill: #333; +} + +.gantt .hide { + display: none; +} + +.gantt-container { + position: relative; + overflow: auto; + font-size: 12px; +} + +.gantt-container .popup-wrapper { + position: absolute; + top: 0; + left: 0; + background: rgba(0, 0, 0, 0.8); + padding: 0; + color: #959da5; + border-radius: 3px; +} + +.gantt-container .popup-wrapper .title { + border-bottom: 3px solid #a3a3ff; + padding: 10px; +} + +.gantt-container .popup-wrapper .subtitle { + padding: 10px; + color: #dfe2e5; +} + +.gantt-container .popup-wrapper .pointer { + position: absolute; + height: 5px; + margin: 0 0 0 -5px; + border: 5px solid transparent; + border-top-color: rgba(0, 0, 0, 0.8); +} + +.upper-date-separator { + stroke: #ccc; + stroke-width: 1; +} \ No newline at end of file diff --git a/libraries/Simple-Gant-master/frappe-gantt.js b/libraries/Simple-Gant-master/frappe-gantt.js new file mode 100644 index 0000000..24830d4 --- /dev/null +++ b/libraries/Simple-Gant-master/frappe-gantt.js @@ -0,0 +1,2752 @@ +var Gantt = (function () { +'use strict'; + +const YEAR = 'year'; +const MONTH = 'month'; +const DAY = 'day'; +const HOUR = 'hour'; +const MINUTE = 'minute'; +const SECOND = 'second'; +const MILLISECOND = 'millisecond'; + +const month_names = { + en: [ + 'January', + 'February', + 'March', + 'April', + 'May', + 'June', + 'July', + 'August', + 'September', + 'October', + 'November', + 'December' + ], + ru: [ + 'Январь', + 'Февраль', + 'Март', + 'Апрель', + 'Май', + 'Июнь', + 'Июль', + 'Август', + 'Сентябрь', + 'Октябрь', + 'Ноябрь', + 'Декабрь' + ], + pl: [ + 'Styczeń', + 'Luty', + 'Marzec', + 'Kwiecień', + 'Maj', + 'Czerwiec', + 'Lipiec', + 'Sierpień', + 'Wrzesień', + 'Październik', + 'Listopad', + 'Grudzień' + ] +}; + +var date_utils = { + parse(date, date_separator = '-', time_separator = /[.:]/) { + if (date instanceof Date) { + return date; + } + if (typeof date === 'string') { + let date_parts, time_parts; + const parts = date.split(' '); + + date_parts = parts[0] + .split(date_separator) + .map(val => parseInt(val, 10)); + time_parts = parts[1] && parts[1].split(time_separator); + + // month is 0 indexed + date_parts[1] = date_parts[1] - 1; + + let vals = date_parts; + + if (time_parts && time_parts.length) { + if (time_parts.length == 4) { + time_parts[3] = '0.' + time_parts[3]; + time_parts[3] = parseFloat(time_parts[3]) * 1000; + } + vals = vals.concat(time_parts); + } + + return new Date(...vals); + } + }, + + to_string(date, with_time = false) { + if (!(date instanceof Date)) { + throw new TypeError('Invalid argument type'); + } + const vals = this.get_date_values(date).map((val, i) => { + if (i === 1) { + // add 1 for month + val = val + 1; + } + + if (i === 6) { + return padStart(val + '', 3, '0'); + } + + return padStart(val + '', 2, '0'); + }); + const date_string = `${vals[0]}-${vals[1]}-${vals[2]}`; + const time_string = `${vals[3]}:${vals[4]}:${vals[5]}.${vals[6]}`; + + return date_string + (with_time ? ' ' + time_string : ''); + }, + + format(date, format_string = 'YYYY-MM-DD HH:mm:ss.SSS', lang = 'en') { + const values = this.get_date_values(date).map(d => padStart(d, 2, 0)); + const format_map = { + YYYY: values[0], + MM: padStart(+values[1] + 1, 2, 0), + DD: values[2], + HH: values[3], + mm: values[4], + ss: values[5], + SSS:values[6], + D: values[2], + MMMM: month_names[lang][+values[1]], + MMM: month_names[lang][+values[1]] + }; + + let str = format_string; + const formatted_values = []; + + Object.keys(format_map) + .sort((a, b) => b.length - a.length) // big string first + .forEach(key => { + if (str.includes(key)) { + str = str.replace(key, `$${formatted_values.length}`); + formatted_values.push(format_map[key]); + } + }); + + formatted_values.forEach((value, i) => { + str = str.replace(`$${i}`, value); + }); + + return str; + }, + + diff(date_a, date_b, scale = DAY) { + let milliseconds, seconds, hours, minutes, days, months, years; + + milliseconds = date_a - date_b; + seconds = milliseconds / 1000; + minutes = seconds / 60; + hours = minutes / 60; + days = hours / 24; + months = days / 30; + years = months / 12; + + if (!scale.endsWith('s')) { + scale += 's'; + } + + return Math.floor( + { + milliseconds, + seconds, + minutes, + hours, + days, + months, + years + }[scale] + ); + }, + + today() { + const vals = this.get_date_values(new Date()).slice(0, 3); + return new Date(...vals); + }, + + now() { + return new Date(); + }, + + add(date, qty, scale) { + qty = parseInt(qty, 10); + const vals = [ + date.getFullYear() + (scale === YEAR ? qty : 0), + date.getMonth() + (scale === MONTH ? qty : 0), + date.getDate() + (scale === DAY ? qty : 0), + date.getHours() + (scale === HOUR ? qty : 0), + date.getMinutes() + (scale === MINUTE ? qty : 0), + date.getSeconds() + (scale === SECOND ? qty : 0), + date.getMilliseconds() + (scale === MILLISECOND ? qty : 0) + ]; + return new Date(...vals); + }, + + start_of(date, scale) { + const scores = { + [YEAR]: 6, + [MONTH]: 5, + [DAY]: 4, + [HOUR]: 3, + [MINUTE]: 2, + [SECOND]: 1, + [MILLISECOND]: 0 + }; + + function should_reset(_scale) { + const max_score = scores[scale]; + return scores[_scale] <= max_score; + } + + const vals = [ + date.getFullYear(), + should_reset(YEAR) ? 0 : date.getMonth(), + should_reset(MONTH) ? 1 : date.getDate(), + should_reset(DAY) ? 0 : date.getHours(), + should_reset(HOUR) ? 0 : date.getMinutes(), + should_reset(MINUTE) ? 0 : date.getSeconds(), + should_reset(SECOND) ? 0 : date.getMilliseconds() + ]; + + return new Date(...vals); + }, + + clone(date) { + return new Date(...this.get_date_values(date)); + }, + + get_date_values(date) { + return [ + date.getFullYear(), + date.getMonth(), + date.getDate(), + date.getHours(), + date.getMinutes(), + date.getSeconds(), + date.getMilliseconds() + ]; + }, + + get_days_in_month(date) { + const no_of_days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + + const month = date.getMonth(); + + if (month !== 1) { + return no_of_days[month]; + } + + // Feb + const year = date.getFullYear(); + if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) { + return 29; + } + return 28; + } +}; + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padStart +function padStart(str, targetLength, padString) { + str = str + ''; + targetLength = targetLength >> 0; + padString = String(typeof padString !== 'undefined' ? padString : ' '); + if (str.length > targetLength) { + return String(str); + } else { + targetLength = targetLength - str.length; + if (targetLength > padString.length) { + padString += padString.repeat(targetLength / padString.length); + } + return padString.slice(0, targetLength) + String(str); + } +} + +function $(expr, con) { + return typeof expr === 'string' + ? (con || document).querySelector(expr) + : expr || null; +} + +function createSVG(tag, attrs) { + const elem = document.createElementNS('http://www.w3.org/2000/svg', tag); + for (let attr in attrs) { + if (attr === 'append_to') { + const parent = attrs.append_to; + parent.appendChild(elem); + } else if (attr === 'innerHTML') { + elem.innerHTML = attrs.innerHTML; + } else { + elem.setAttribute(attr, attrs[attr]); + } + } + return elem; +} + +function animateSVG(svgElement, attr, from, to) { + const animatedSvgElement = getAnimationElement(svgElement, attr, from, to); + + if (animatedSvgElement === svgElement) { + // triggered 2nd time programmatically + // trigger artificial click event + const event = document.createEvent('HTMLEvents'); + event.initEvent('click', true, true); + event.eventName = 'click'; + animatedSvgElement.dispatchEvent(event); + } +} + +function getAnimationElement( + svgElement, + attr, + from, + to, + dur = '0.4s', + begin = '0.1s' +) { + const animEl = svgElement.querySelector('animate'); + if (animEl) { + $.attr(animEl, { + attributeName: attr, + from, + to, + dur, + begin: 'click + ' + begin // artificial click + }); + return svgElement; + } + + const animateElement = createSVG('animate', { + attributeName: attr, + from, + to, + dur, + begin, + calcMode: 'spline', + values: from + ';' + to, + keyTimes: '0; 1', + keySplines: cubic_bezier('ease-out') + }); + svgElement.appendChild(animateElement); + + return svgElement; +} + +function cubic_bezier(name) { + return { + ease: '.25 .1 .25 1', + linear: '0 0 1 1', + 'ease-in': '.42 0 1 1', + 'ease-out': '0 0 .58 1', + 'ease-in-out': '.42 0 .58 1' + }[name]; +} + +$.on = (element, event, selector, callback) => { + if (!callback) { + callback = selector; + $.bind(element, event, callback); + } else { + $.delegate(element, event, selector, callback); + } +}; + +$.off = (element, event, handler) => { + element.removeEventListener(event, handler); +}; + +$.bind = (element, event, callback) => { + event.split(/\s+/).forEach(function(event) { + element.addEventListener(event, callback); + }); +}; + +$.delegate = (element, event, selector, callback) => { + element.addEventListener(event, function(e) { + const delegatedTarget = e.target.closest(selector); + if (delegatedTarget) { + e.delegatedTarget = delegatedTarget; + callback.call(this, e, delegatedTarget); + } + }); +}; + +$.closest = (selector, element) => { + if (!element) return null; + + if (element.matches(selector)) { + return element; + } + + return $.closest(selector, element.parentNode); +}; + +$.attr = (element, attr, value) => { + if (!value && typeof attr === 'string') { + return element.getAttribute(attr); + } + + if (typeof attr === 'object') { + for (let key in attr) { + $.attr(element, key, attr[key]); + } + return; + } + + element.setAttribute(attr, value); +}; + +class Bar { + constructor(gantt, task) { + this.set_defaults(gantt, task); + this.prepare(); + this.draw(); + this.bind(); + } + + set_defaults(gantt, task) { + this.action_completed = false; + this.gantt = gantt; + this.task = task; + } + + prepare() { + this.prepare_values(); + this.prepare_helpers(); + } + + prepare_values() { + this.invalid = this.task.invalid; + this.height = this.gantt.options.bar_height; + this.x = this.compute_x(); + this.y = this.compute_y(); + this.corner_radius = this.gantt.options.bar_corner_radius; + this.duration = + date_utils.diff(this.task._end, this.task._start, 'hour') / + this.gantt.options.step; + this.width = this.gantt.options.column_width * this.duration; + this.progress_width = + this.gantt.options.column_width * + this.duration * + (this.task.progress / 100) || 0; + + this.group = createSVG('g', { + class: 'bar-wrapper ' + (this.task.custom_class || ''), + 'data-id': this.task.id + }); + console.log(this.task); + if(this.task.has.length==0) + this.bar_group = createSVG('g', { + class: 'bar-group', + append_to: this.group + }); + else + this.bar_group = createSVG('g', { + class: 'bar-group outline', + append_to: this.group + }); + this.handle_group = createSVG('g', { + class: 'handle-group', + append_to: this.group + }); + } + + prepare_helpers() { + SVGElement.prototype.getX = function() { + return +this.getAttribute('x'); + }; + SVGElement.prototype.getY = function() { + return +this.getAttribute('y'); + }; + SVGElement.prototype.getWidth = function() { + return +this.getAttribute('width'); + }; + SVGElement.prototype.getHeight = function() { + return +this.getAttribute('height'); + }; + SVGElement.prototype.getEndX = function() { + return this.getX() + this.getWidth(); + }; + } + + draw() { + this.draw_bar(); + this.draw_triangle(); + this.draw_progress_bar(); + this.draw_label(); + this.draw_resize_handles(); + // this.draw_circle(); + } + + + + + draw_bar() { + + this.$bar = createSVG('rect', { + x: this.x, + y: this.y, + width: this.width, + height: this.height, + rx: this.corner_radius, + ry: this.corner_radius, + class: 'bar ' + this.task.custom_class, + append_to: this.bar_group + }); + + animateSVG(this.$bar, 'width', 0, this.width); + + if (this.invalid) { + this.$bar.classList.add('bar-invalid'); + } + } + + + draw_triangle(){ + if(this.task.has.length==0){ + return; + } + let x= this.x; + let y= this.y; + + let point= (x-15) + ',' + (y + 15 )+' '+(x-25)+','+(y)+' '+(x-5)+','+(y); + if(this.task.dependencies.length!=0) + point=(x-30) + ',' + (y + 15 )+' '+(x-40)+','+(y)+' '+(x-20)+','+(y); + + this.$triangle = createSVG('polygon', { + points:point, + class: this.getColor(this.task.progress)+" triangle", + 'hide':'off', + 'triangle-id':this.task.id, + append_to: this.group + }); + } + draw_circle(){ + + let x= this.x+this.width-5; + let y=this.y+5; + + this.$circle= createSVG("circle",{ + cx:x, + cy:y, + r:10, + class:'circle', + append_to: this.group + }); + + this.$txt= createSVG("text",{ + x:x-3, + y:y+4, + innerHTML: this.task.people? this.task.people.length : 0, + class:'text-circle', + append_to: this.group + }); + animateSVG(this.$circle, 'cx', this.x, x); + animateSVG(this.$txt, 'x', this.x, x-3); + + } + + getColor(progress){ + if(progress<=50) + return "red"; + if(progress >90) + return "green"; + if(progress > 50 && progress <=80) + return "orange"; + if(progress > 80 && progress <=90) + return "yellow"; + + } + + + draw_progress_bar() { + if (this.invalid) return; + this.$bar_progress = createSVG('rect', { + x: this.x, + y: this.y, + width: this.progress_width, + height: this.height, + rx: this.corner_radius, + ry: this.corner_radius, + //here + class: this.getColor(this.task.progress), + append_to: this.bar_group + }); + + animateSVG(this.$bar_progress, 'width', 0, this.progress_width); + } + + draw_label() { + createSVG('text', { + x: this.x + this.width / 2, + y: this.y + this.height / 2, + innerHTML: this.task.name, + class: 'bar-label', + append_to: this.bar_group + }); + // labels get BBox in the next tick + requestAnimationFrame(() => this.update_label_position()); + } + + draw_resize_handles() { + if (this.invalid) return; + + const bar = this.$bar; + const handle_width = 8; + + createSVG('rect', { + x: bar.getX() + bar.getWidth() - 9, + y: bar.getY() + 1, + width: handle_width, + height: this.height - 2, + rx: this.corner_radius, + ry: this.corner_radius, + class: 'handle right', + append_to: this.handle_group + }); + + createSVG('rect', { + x: bar.getX() + 1, + y: bar.getY() + 1, + width: handle_width, + height: this.height - 2, + rx: this.corner_radius, + ry: this.corner_radius, + class: 'handle left', + append_to: this.handle_group + }); + + if (this.task.progress && this.task.progress < 100) { + this.$handle_progress = createSVG('polygon', { + points: this.get_progress_polygon_points().join(','), + class: 'handle progress', + append_to: this.handle_group + }); + } + } + + get_progress_polygon_points() { + const bar_progress = this.$bar_progress; + return [ + bar_progress.getEndX() - 5, + bar_progress.getY() + bar_progress.getHeight(), + bar_progress.getEndX() + 5, + bar_progress.getY() + bar_progress.getHeight(), + bar_progress.getEndX(), + bar_progress.getY() + bar_progress.getHeight() - 8.66 + ]; + } + + bind() { + if (this.invalid) return; + this.setup_click_event(); + this.triangle_event(); + } + + setup_click_event() { + + $.on(this.bar_group, 'focus ' + this.gantt.options.popup_trigger, e => { + if (this.action_completed) { + // just finished a move action, wait for a few seconds + return; + } + + if (e.type === 'click') { + this.gantt.trigger_event('click', [this.task]); + } + + this.gantt.unselect_all(); + this.group.classList.toggle('active'); + + this.show_popup(); + }); + + + + } + triangle_event(){ + if(!this.$triangle) + return; + + + $.on(this.$triangle,'click',e => { + + + + if(e.type=== 'click'){ + + //console.log(this.$triangle.getAttribute('hide')); + if(this.$triangle.getAttribute('hide')==='off'){ + this.$triangle.setAttribute('hide','on'); + this.toggle_children("noopacity"); + }else{ + this.$triangle.setAttribute('hide','off'); + this.toggle_children('opacity') + } + this.update_triangle_position(); + this.update_circle(); + } + + + }); + } + + toggle_children(className){ + if(!this.$triangle) + return; + let arr= this.task.has; + arr.forEach((taskid)=>{ + let g=document.querySelectorAll("[data-id='"+taskid+"']"); + g.forEach(i=>{ + i.setAttribute('class',className+' bar-wrapper '); + }); + let ar=document.querySelectorAll("[data-from='"+taskid+"'],[data-to='"+taskid+"']"); + ar.forEach(i=>{ + i.setAttribute('class',className); + }); + + let tr=document.querySelectorAll("[triangle-id='"+taskid+"']"); + tr.forEach(i=>{ + i.setAttribute('hide','off'); + }); + + }); + this.gantt.unselect_all(); + this.group.classList.toggle('active'); + + } + + show_popup() { + task_popup( this.task.id ); + // if (this.gantt.bar_being_dragged) return; + + // const start_date = date_utils.format(this.task._start, 'MMM D'); + // const end_date = date_utils.format( + // date_utils.add(this.task._end, -1, 'second'), + // 'MMM D' + // ); + // const subtitle = start_date + ' - ' + end_date; + + // this.gantt.show_popup({ + // target_element: this.$bar, + // title: this.task.name, + // subtitle: subtitle, + // task: this.task + // }); + } + + update_bar_position({ x = null, width = null }) { + const bar = this.$bar; + if (x) { + // get all x values of parent task + const xs = this.task.dependencies.map(dep => { + return this.gantt.get_bar(dep).$bar.getX(); + }); + // child task must not go before parent + const valid_x = xs.reduce((prev, curr) => { + return x >= curr; + }, x); + if (!valid_x) { + width = null; + return; + } + this.update_attr(bar, 'x', x); + } + if (width && width >= this.gantt.options.column_width) { + this.update_attr(bar, 'width', width); + } + this.update_label_position(); + this.update_handle_position(); + this.update_progressbar_position(); + this.update_arrow_position(); + this.update_triangle_position(); + this.update_circle(); + } + + date_changed() { + + let changed = false; + const { new_start_date, new_end_date } = this.compute_start_end_date(); + + if (Number(this.task._start) !== Number(new_start_date)) { + changed = true; + this.task._start = new_start_date; + } + + if (Number(this.task._end) !== Number(new_end_date)) { + changed = true; + this.task._end = new_end_date; + } + + if (!changed) return; + + this.gantt.trigger_event('date_change', [ + this.task, + new_start_date, + date_utils.add(new_end_date, -1, 'second') + ]); + } + + progress_changed() { + const new_progress = this.compute_progress(); + this.task.progress = new_progress; + this.gantt.trigger_event('progress_change', [this.task, new_progress]); + if(this.$triangle) + this.$triangle.setAttribute('class',this.getColor(this.task.progress)); + } + + set_action_completed() { + this.action_completed = true; + setTimeout(() => (this.action_completed = false), 1000); + } + + compute_start_end_date() { + const bar = this.$bar; + const x_in_units = bar.getX() / this.gantt.options.column_width; + const new_start_date = date_utils.add( + this.gantt.gantt_start, + x_in_units * this.gantt.options.step, + 'hour' + ); + const width_in_units = bar.getWidth() / this.gantt.options.column_width; + const new_end_date = date_utils.add( + new_start_date, + width_in_units * this.gantt.options.step, + 'hour' + ); + + return { new_start_date, new_end_date }; + } + + compute_progress() { + const progress = + this.$bar_progress.getWidth() / this.$bar.getWidth() * 100; + return parseInt(progress, 10); + } + + compute_x() { + const { step, column_width } = this.gantt.options; + const task_start = this.task._start; + const gantt_start = this.gantt.gantt_start; + + const diff = date_utils.diff(task_start, gantt_start, 'hour'); + let x = diff / step * column_width; + + if (this.gantt.view_is('Month')) { + const diff = date_utils.diff(task_start, gantt_start, 'day'); + x = diff * column_width / 30; + } + return x; + } + + compute_y() { + return ( + this.gantt.options.header_height + + this.gantt.options.padding + + this.task._index * (this.height + this.gantt.options.padding) + ); + } + + get_snap_position(dx) { + let odx = dx, + rem, + position; + + if (this.gantt.view_is('Week')) { + rem = dx % (this.gantt.options.column_width / 7); + position = + odx - + rem + + (rem < this.gantt.options.column_width / 14 + ? 0 + : this.gantt.options.column_width / 7); + } else if (this.gantt.view_is('Month')) { + rem = dx % (this.gantt.options.column_width / 30); + position = + odx - + rem + + (rem < this.gantt.options.column_width / 60 + ? 0 + : this.gantt.options.column_width / 30); + } else { + rem = dx % this.gantt.options.column_width; + position = + odx - + rem + + (rem < this.gantt.options.column_width / 2 + ? 0 + : this.gantt.options.column_width); + } + return position; + } + + update_attr(element, attr, value) { + value = +value; + if (!isNaN(value)) { + element.setAttribute(attr, value); + } + return element; + } + + update_progressbar_position() { + this.$bar_progress.setAttribute('x', this.$bar.getX()); + this.$bar_progress.setAttribute( + 'width', + this.$bar.getWidth() * (this.task.progress / 100) + ); + } + + + update_triangle_position() { + if(!this.$triangle) + return; + + + let x= this.$bar.getX(); + let y= this.$bar.getY(); + + let point=(x-15) + ',' + (y + 15 )+' '+(x-25)+','+(y)+' '+(x-5)+','+(y); + + if(this.$triangle.getAttribute('hide')==='off'){ + if(this.task.dependencies.length!=0) + point=(x-30) + ',' + (y + 15 )+' '+(x-40)+','+(y)+' '+(x-20)+','+(y); + + }else{ + point= (x-15) + ',' + (y)+' '+(x-25)+','+(y+15)+' '+(x-5)+','+(y+15); + + if(this.task.dependencies.length!=0) + point=(x-35) + ',' + (y)+' '+(x-45)+','+(y+15)+' '+(x-25)+','+(y+15); + + + } + this.$triangle.setAttribute('points', point); + + } + + update_circle(){ + if(!this.$circle) + return; + + + + + let x= this.$bar.getX()+this.$bar.getWidth()-5; + let y= this.$bar.getY()+5; + this.$circle.setAttribute('cx',x); + this.$circle.setAttribute('cy',y); + + this.$txt.setAttribute('x',x-3); + this.$txt.setAttribute('y',y+4); + + + } + + update_label_position() { + const bar = this.$bar, + label = this.group.querySelector('.bar-label'); + + if (label.getBBox().width > bar.getWidth()) { + label.classList.add('big'); + label.setAttribute('x', bar.getX() + bar.getWidth() + 5); + } else { + label.classList.remove('big'); + label.setAttribute('x', bar.getX() + bar.getWidth() / 2); + } + } + + update_handle_position() { + const bar = this.$bar; + this.handle_group + .querySelector('.handle.left') + .setAttribute('x', bar.getX() + 1); + this.handle_group + .querySelector('.handle.right') + .setAttribute('x', bar.getEndX() - 9); + const handle = this.group.querySelector('.handle.progress'); + handle && + handle.setAttribute('points', this.get_progress_polygon_points()); + } + + update_arrow_position() { + this.arrows = this.arrows || []; + for (let arrow of this.arrows) { + arrow.update(); + } + } +} + +class Arrow { + constructor(gantt, from_task, to_task) { + this.gantt = gantt; + this.from_task = from_task; + this.to_task = to_task; + + this.calculate_path(); + this.draw(); + } + + calculate_path() { + let start_x = + this.from_task.$bar.getX() + this.from_task.$bar.getWidth() / 2; + + const condition = () => + this.to_task.$bar.getX() < start_x + this.gantt.options.padding && + start_x > this.from_task.$bar.getX() + this.gantt.options.padding; + + while (condition()) { + start_x -= 10; + } + + const start_y = + this.gantt.options.header_height + + this.gantt.options.bar_height + + (this.gantt.options.padding + this.gantt.options.bar_height) * + this.from_task.task._index + + this.gantt.options.padding; + + const end_x = this.to_task.$bar.getX() - this.gantt.options.padding / 2; + const end_y = + this.gantt.options.header_height + + this.gantt.options.bar_height / 2 + + (this.gantt.options.padding + this.gantt.options.bar_height) * + this.to_task.task._index + + this.gantt.options.padding; + + const from_is_below_to = + this.from_task.task._index > this.to_task.task._index; + const curve = this.gantt.options.arrow_curve; + const clockwise = from_is_below_to ? 1 : 0; + const curve_y = from_is_below_to ? -curve : curve; + const offset = from_is_below_to + ? end_y + this.gantt.options.arrow_curve + : end_y - this.gantt.options.arrow_curve; + + this.path = ` + M ${start_x} ${start_y} + V ${offset} + a ${curve} ${curve} 0 0 ${clockwise} ${curve} ${curve_y} + L ${end_x} ${end_y} + m -5 -5 + l 5 5 + l -5 5`; + + if ( + this.to_task.$bar.getX() < + this.from_task.$bar.getX() + this.gantt.options.padding + ) { + const down_1 = this.gantt.options.padding / 2 - curve; + const down_2 = + this.to_task.$bar.getY() + + this.to_task.$bar.getHeight() / 2 - + curve_y; + const left = this.to_task.$bar.getX() - this.gantt.options.padding; + + this.path = ` + M ${start_x} ${start_y} + v ${down_1} + a ${curve} ${curve} 0 0 1 -${curve} ${curve} + H ${left} + a ${curve} ${curve} 0 0 ${clockwise} -${curve} ${curve_y} + V ${down_2} + a ${curve} ${curve} 0 0 ${clockwise} ${curve} ${curve_y} + L ${end_x} ${end_y} + m -5 -5 + l 5 5 + l -5 5`; + } + } + + draw() { + this.element = createSVG('path', { + d: this.path, + 'data-from': this.from_task.task.id, + 'data-to': this.to_task.task.id + }); + } + + update() { + this.calculate_path(); + this.element.setAttribute('d', this.path); + } +} + +class Popup { + constructor(parent,gantt, custom_html) { + this.gantt=gantt; + this.parent = parent; + this.edible=false; + + + + this.add=''; + this.edit=''; + + this.custom_html = custom_html; + this.make(); + + + } + + event_edit(parent,options,gantt){ + + let $edit=parent.querySelector("#edit"); + let $add=parent.querySelector("#add"); + + $add.addEventListener("click",function(){ + + //init + let size =3; + let drops = []; + let d=""; + let p = gantt.people; + let selectedPeople=[]; + let unselectedPeople=p; + parent.querySelector(".tools").innerHTML=''; + + parent.querySelector(".title").innerHTML="Assigned to "; + + + + + + + for(let i = 0 ; i'; + let op =' '; + op= op + p.map(p =>{ + return ''; + }); + + drop+=op+''; + d+=drop; + } + + const fn=(event)=>{ + console.log("in"); + let selectedItem =event.target; + let arr=[]; + parent.querySelector("#divselect").querySelectorAll("select").forEach(j=>{ + + + if(j.value != "") + arr.push(j.value); + }); + selectedPeople=arr; + + unselectedPeople= p.filter(pers =>{ + return !selectedPeople.includes(pers); + }); + + parent.querySelector("#divselect").querySelectorAll("select").forEach(j=>{ + + + + + let v = j.value; + let op =''; + if(v != "") + op+=''; + op= op + unselectedPeople.map(p =>{ + + return ''; + }); + j.innerHTML=op; + + + }); + + + } + const eventSelect=()=> { + + for(let i=0;i{ + let options = document.createElement('option'); + options.value=p; + options.text=p; + selectElement.appendChild(options); + + }); + + eventSelect(); + + }); + + + let valid = parent.querySelector("#valid"); + valid.addEventListener("click",function(){ + + let task = options.task; + task.people=selectedPeople; + + gantt.update_task(task); + + parent.style.opacity = 0; + + + }); + + + + + + + + }); + + + + + + + + + + + + + $edit.addEventListener("click",function(){ + + parent.querySelector(".tools").innerHTML=''; + parent.querySelector(".title").innerHTML=''; + parent.querySelector(".subtitle").innerHTML=''+ + ''; + + let valid = parent.querySelector("#valid"); + valid.addEventListener("click",function(){ + let task_name=parent.querySelector("#task_name").value; + let task_start=parent.querySelector("#task_start").value; + let task_end=parent.querySelector("#task_end").value; + let task = options.task; + task.name=task_name; + task.end=task_end; + task.start=task_start; + + gantt.update_task(task); + + parent.style.opacity = 0; + + + }); + + + + }); + + } + + make() { + + + + this.HtmlTools='
'; + console.log(this.edit); + + this.parent.innerHTML = this.HtmlTools; + + this.hide(); + + + this.tools = this.parent.querySelector('.tools'); + + this.title = this.parent.querySelector('.title'); + this.subtitle = this.parent.querySelector('.subtitle'); + this.pointer = this.parent.querySelector('.pointer'); + + + + + + + + + + } + + show(options) { + + this.tools.innerHTML= this.add +''+this.edit; + this.event_edit(this.parent,options,this.gantt); + + + + if (!options.target_element) { + throw new Error('target_element is required to show popup'); + } + if (!options.position) { + options.position = 'left'; + } + const target_element = options.target_element; + + + if (this.custom_html) { + let html = this.custom_html(options.task); + html += '
'; + this.parent.innerHTML = html; + this.pointer = this.parent.querySelector('.pointer'); + } else { + // set data + this.title.innerHTML = options.title; + this.subtitle.innerHTML = options.subtitle; + this.parent.style.width = this.parent.clientWidth + 'px'; + + + } + + + // set position + let position_meta; + if (target_element instanceof HTMLElement) { + position_meta = target_element.getBoundingClientRect(); + } else if (target_element instanceof SVGElement) { + position_meta = options.target_element.getBBox(); + } + + if (options.position === 'left') { + this.parent.style.left = + position_meta.x + (position_meta.width + 10) + 'px'; + this.parent.style.top = position_meta.y + 'px'; + + this.pointer.style.transform = 'rotateZ(90deg)'; + this.pointer.style.left = '-7px'; + this.pointer.style.top = '2px'; + } + + // show + this.parent.style.opacity = 1; + + + + //event + + + } + + hide() { + this.parent.style.opacity = 0; + } +} + +class Gantt { + constructor(wrapper, tasks, options) { + + this.people=["Bernadette Young", + "Robert Davis", + "Elena Reyes", + "Evelyn Goodrich", + "Remi Hakimi", + "Asmara Tewolde", + "Cristina Schwarzer", + "Anna Grimsdottir", + "Thomas Zotov", + "Arthur Maclean", + "Mauricio Mirella", + "Anthony Foccacia", + "Mark Waugh", + "Urbain Leverrier", + "John Adams", + "Chris Davis", + "Rania Ali", + "Spiro Agnew", + "Diana Frost", + "David Nixon"]; + + this.setup_wrapper(wrapper); + this.setup_options(options); + this.setup_tasks(tasks); + // initialize with default view mode + this.synchronizing_date(tasks); + this.setup_tasks(tasks); + this.our_menu(); + this.change_view_mode(); + this.bind_events(); + } + + synchronizing_date(tasks){ + + this.tasks= tasks.map((task,i)=>{ + let arr=this.get_all_dependent_tasks(task.id); + let s=null; + if(arr.length>0){ + s=this.get_task_obj(arr[0],this.tasks); + for(let a of arr){ + let aa=this.get_task_obj(a,this.tasks); + + if(Date.parse(date_utils.parse(aa.end))>Date.parse(date_utils.parse(s.end))) + s=aa; + + } + } + if(s) + task.end=s.end; + task.has=this.get_all_dependent_tasks(task.id); + + return task; + + + }); + + + + } + + get_task_obj(id,tasks) { + return tasks.find(task => + task.id === id + ); + } + + + + setup_wrapper(element) { + let svg_element, wrapper_element; + + // CSS Selector is passed + if (typeof element === 'string') { + element = document.querySelector(element); + } + + // get the SVGElement + if (element instanceof HTMLElement) { + wrapper_element = element; + svg_element = element.querySelector('svg'); + } else if (element instanceof SVGElement) { + svg_element = element; + } else { + throw new TypeError( + 'Frappé Gantt only supports usage of a string CSS selector,' + + " HTML DOM element or SVG DOM element for the 'element' parameter" + ); + } + + // svg element + if (!svg_element) { + // create it + this.$svg = createSVG('svg', { + append_to: wrapper_element, + class: 'gantt' + }); + } else { + this.$svg = svg_element; + this.$svg.classList.add('gantt'); + } + + // wrapper element + this.$container = document.createElement('div'); + this.$container.classList.add('gantt-container'); + + const parent_element = this.$svg.parentElement; + parent_element.appendChild(this.$container); + this.$container.appendChild(this.$svg); + + // popup wrapper + this.popup_wrapper = document.createElement('div'); + this.popup_wrapper.classList.add('popup-wrapper'); + this.$container.appendChild(this.popup_wrapper); + + + + + } + + our_menu(){ + + // context menu + this.contextmenu = document.createElement('div'); + this.contextmenu.classList.add('contextmenu'); + + this.contextmenu.style.display="none"; + + + this.add_task=document.createElement('span'); + this.add_sub=document.createElement('span'); + + this.add_task.appendChild(document.createTextNode("Add Task")); + this.add_sub.appendChild(document.createTextNode("Add Sub-Task")); + + + this.contextmenu.appendChild(this.add_task); + this.contextmenu.appendChild(this.add_sub); + + this.$container.appendChild(this.contextmenu); + + //Add Task + this.add_task_container=document.createElement('div'); + this.add_task_container.classList.add('add-task'); + + this.add_task_formulaire=document.createElement('form'); + + this.add_task_title=document.createElement('input'); + this.add_task_title.placeholder="Title..."; + this.add_task_title.type="text"; + + + this.add_task_start=document.createElement('input'); + this.add_task_start.type="date"; + + + this.add_task_end=document.createElement('input'); + this.add_task_end.type="date"; + + + this.add_task_completion=document.createElement('input'); + this.add_task_completion.placeholder="Completion %"; + this.add_task_completion.type="number"; + this.add_task_completion.min="0"; + this.add_task_completion.max="100"; + + + + this.add_task_people=document.createElement('input'); + this.add_task_people.placeholder="Assigned to..."; + this.add_task_people.type="text"; + + + this.add_task_submit=document.createElement('input'); + this.add_task_submit.value="ADD"; + this.add_task_submit.type="submit"; + + this.add_task_close=document.createElement('input'); + this.add_task_close.value="CLOSE"; + this.add_task_close.type="reset"; + + + this.add_task_formulaire.appendChild(this.add_task_title); + this.add_task_formulaire.appendChild(this.add_task_start); + this.add_task_formulaire.appendChild(this.add_task_end); + this.add_task_formulaire.appendChild(this.add_task_completion); + this.add_task_formulaire.appendChild(this.add_task_people); + this.add_task_formulaire.appendChild(this.add_task_submit); + this.add_task_formulaire.appendChild(this.add_task_close); + + this.add_task_container.appendChild(this.add_task_formulaire); + this.$container.appendChild(this.add_task_container); + + + + + //Add Sub-Task + + this.sub_task(); + } + sub_task(){ + + this.add_sub_task_container=document.createElement('div'); + this.add_sub_task_container.classList.add('add-task'); + + this.add_sub_task_formulaire=document.createElement('form'); + + this.add_sub_task_title=document.createElement('input'); + this.add_sub_task_title.placeholder="Title..."; + this.add_sub_task_title.type="text"; + + + this.add_sub_task_start=document.createElement('input'); + this.add_sub_task_start.type="date"; + + + this.add_sub_task_end=document.createElement('input'); + this.add_sub_task_end.type="date"; + + + this.add_sub_task_completion=document.createElement('input'); + this.add_sub_task_completion.placeholder="Completion %"; + this.add_sub_task_completion.type="number"; + this.add_sub_task_completion.min="0"; + this.add_sub_task_completion.max="100"; + + + + this.add_sub_task_dependencies=document.createElement('select'); + let mtasks= this.tasks; + + let arr=mtasks.map(task =>{ + return Object.assign({},{id:task.id,name:task.name}); + }); + + arr.forEach(o => { + let task_option= document.createElement('option'); + task_option.value=""+o.id; + task_option.appendChild(document.createTextNode(o.name)); + + this.add_sub_task_dependencies.appendChild(task_option); + }); + + + + this.add_sub_task_close=document.createElement('input'); + this.add_sub_task_close.value="CLOSE"; + this.add_sub_task_close.type="reset"; + + this.add_sub_task_submit=document.createElement('input'); + this.add_sub_task_submit.value="ADD"; + this.add_sub_task_submit.type="submit"; + + this.add_sub_task_formulaire.appendChild(this.add_sub_task_title); + this.add_sub_task_formulaire.appendChild(this.add_sub_task_start); + this.add_sub_task_formulaire.appendChild(this.add_sub_task_end); + this.add_sub_task_formulaire.appendChild(this.add_sub_task_completion); + this.add_sub_task_formulaire.appendChild(this.add_sub_task_dependencies); + this.add_sub_task_formulaire.appendChild(this.add_sub_task_submit); + this.add_sub_task_formulaire.appendChild(this.add_sub_task_close); + + this.add_sub_task_container.appendChild(this.add_sub_task_formulaire); + this.$container.appendChild(this.add_sub_task_container); + + + } + + setup_options(options) { + const default_options = { + header_height: 50, + column_width: 30, + step: 24, + view_modes: [ + 'Quarter Day', + 'Half Day', + 'Day', + 'Week', + 'Month', + 'Year' + ], + bar_height: 20, + bar_corner_radius: 3, + arrow_curve: 5, + padding: 18, + view_mode: 'Day', + date_format: 'YYYY-MM-DD', + popup_trigger: 'click', + custom_popup_html: null, + language: 'en' + }; + this.options = Object.assign({}, default_options, options); + } + + setup_tasks(tasks) { + // prepare tasks + this.tasks = tasks.map((task, i) => { + // convert to Date objects + task._start = date_utils.parse(task.start); + task._end = date_utils.parse(task.end); + + // make task invalid if duration too large + if (date_utils.diff(task._end, task._start, 'year') > 10) { + task.end = null; + } + + // cache index + task._index = i; + + // invalid dates + if (!task.start && !task.end) { + const today = date_utils.today(); + task._start = today; + task._end = date_utils.add(today, 2, 'day'); + } + + if (!task.start && task.end) { + task._start = date_utils.add(task._end, -2, 'day'); + } + + if (task.start && !task.end) { + task._end = date_utils.add(task._start, 2, 'day'); + } + + // if hours is not set, assume the last day is full day + // e.g: 2018-09-09 becomes 2018-09-09 23:59:59 + const task_end_values = date_utils.get_date_values(task._end); + if (task_end_values.slice(3).every(d => d === 0)) { + task._end = date_utils.add(task._end, 24, 'hour'); + } + + // invalid flag + if (!task.start || !task.end) { + task.invalid = true; + } + + // dependencies + if (typeof task.dependencies === 'string' || !task.dependencies) { + let deps = []; + if (task.dependencies) { + deps = task.dependencies + .split(',') + .map(d => d.trim()) + .filter(d => d); + } + task.dependencies = deps; + } + + // uids + if (!task.id) { + task.id = generate_id(task); + } + + return task; + }); + this.setup_dependencies(); + } + + setup_dependencies() { + this.dependency_map = {}; + for (let t of this.tasks) { + for (let d of t.dependencies) { + this.dependency_map[d] = this.dependency_map[d] || []; + this.dependency_map[d].push(t.id); + } + } + } + + update_task(task){ + this.tasks[task._index]=task; + this.refresh(this.tasks); + } + + refresh(tasks) { + this.setup_tasks(tasks); + this.synchronizing_date(tasks); + this.change_view_mode(); + } + + change_view_mode(mode = this.options.view_mode) { + this.update_view_scale(mode); + this.setup_dates(); + this.render(); + + // fire viewmode_change event + this.trigger_event('view_change', [mode]); + } + + update_view_scale(view_mode) { + this.options.view_mode = view_mode; + + if (view_mode === 'Day') { + this.options.step = 24; + this.options.column_width = 38; + } else if (view_mode === 'Half Day') { + this.options.step = 24 / 2; + this.options.column_width = 38; + } else if (view_mode === 'Quarter Day') { + this.options.step = 24 / 4; + this.options.column_width = 38; + } else if (view_mode === 'Week') { + this.options.step = 24 * 7; + this.options.column_width = 140; + } else if (view_mode === 'Month') { + this.options.step = 24 * 30; + this.options.column_width = 120; + } else if (view_mode === 'Year') { + this.options.step = 24 * 365; + this.options.column_width = 120; + } + } + + setup_dates() { + this.setup_gantt_dates(); + this.setup_date_values(); + } + + setup_gantt_dates() { + this.gantt_start = this.gantt_end = null; + + for (let task of this.tasks) { + // set global start and end date + if (!this.gantt_start || task._start < this.gantt_start) { + this.gantt_start = task._start; + } + if (!this.gantt_end || task._end > this.gantt_end) { + this.gantt_end = task._end; + } + } + + this.gantt_start = date_utils.start_of(this.gantt_start, 'day'); + this.gantt_end = date_utils.start_of(this.gantt_end, 'day'); + + // add date padding on both sides + if (this.view_is(['Quarter Day', 'Half Day'])) { + this.gantt_start = date_utils.add(this.gantt_start, -7, 'day'); + this.gantt_end = date_utils.add(this.gantt_end, 7, 'day'); + } else if (this.view_is('Month')) { + this.gantt_start = date_utils.start_of(this.gantt_start, 'year'); + this.gantt_end = date_utils.add(this.gantt_end, 1, 'year'); + } else if (this.view_is('Year')) { + this.gantt_start = date_utils.add(this.gantt_start, -2, 'year'); + this.gantt_end = date_utils.add(this.gantt_end, 2, 'year'); + } else { + this.gantt_start = date_utils.add(this.gantt_start, -1, 'month'); + this.gantt_end = date_utils.add(this.gantt_end, 1, 'month'); + } + } + + setup_date_values() { + this.dates = []; + let cur_date = null; + + while (cur_date === null || cur_date < this.gantt_end) { + if (!cur_date) { + cur_date = date_utils.clone(this.gantt_start); + } else { + if (this.view_is('Year')) { + cur_date = date_utils.add(cur_date, 1, 'year'); + } else if (this.view_is('Month')) { + cur_date = date_utils.add(cur_date, 1, 'month'); + } else { + cur_date = date_utils.add( + cur_date, + this.options.step, + 'hour' + ); + } + } + this.dates.push(cur_date); + } + } + clear_menu(){ + if(this.contextmenu.style.display==="block") + this.contextmenu.style.display="none"; + + else if(this.add_task_container.style.display==="block") + this.add_task_container.style.display="none"; + + else if(this.add_sub_task_container.style.display==="block") + this.add_sub_task_container.style.display="none"; + + } +//this the event listener + bind_events() { + let isOpen=false; + this.bind_grid_click(); + this.bind_bar_events(); + let y=0,x=0; + + this.$container.addEventListener('contextmenu',ev=>{ + ev.preventDefault(); + + if(!isOpen) + this.clear_menu(); + + if(this.tasks.length) + this.add_sub.classList.remove("disabled"); + else + this.add_sub.classList.add("disabled"); + + + this.contextmenu.style.display="block"; + x=ev.offsetX;y=ev.offsetY; + this.contextmenu.style.top=ev.offsetY+'px'; + this.contextmenu.style.left=ev.offsetX+'px'; + }); + + this.$container.addEventListener('click',ev=>{ + this.contextmenu.style.display="none"; + }); + + + + + + + this.add_task.addEventListener('click',ev=>{ + + this.add_task_container.style.display="block"; + this.add_task_container.style.top=y+'px'; + this.add_task_container.style.left=x+'px'; + }); + + this.add_sub.addEventListener('click',ev=>{ + + this.add_sub_task_container.style.display="block"; + this.add_sub_task_container.style.top=y+'px'; + this.add_sub_task_container.style.left=x+'px'; + }); + + this.add_task_formulaire.addEventListener('submit',ev=>{ + ev.preventDefault(); + let task={ + start: '', + end: '', + name: '', + id: 'Task '+this.tasks.length, + progress: 0, + people:'' + } + if(!this.add_task_start.value) + this.add_task_start.classList.add("wrong"); + + if(!this.add_task_end.value) + this.add_task_end.classList.add("wrong"); + + if(!this.add_task_title.value) + this.add_task_title.classList.add("wrong"); + + if(this.add_task_title.value && + this.add_task_start.value && + this.add_task_end.value){ + + task.name=this.add_task_title.value; + task.end=''+this.add_task_end.value; + task.start=''+this.add_task_start.value; + task.progress=this.add_task_completion.value; + task.people=this.add_task_people.value.split(","); + + + this.tasks.push(task); + this.update_sub_task(task); + this.refresh(this.tasks); + + this.add_task_title.classList.remove("wrong"); + this.add_task_title.classList.remove("wrong"); + this.add_task_title.classList.remove("wrong"); + + this.add_task_title.value=null; + this.add_task_end.value=null; + this.add_task_start.value=null; + this.add_task_completion.value=null; + + this.add_task_container.style.display="none"; + + + } + + } + + ); + + this.add_sub_task_formulaire.addEventListener('reset',ev=>{ + this.add_sub_task_container.style.display="none"; + + }); + + this.add_task_formulaire.addEventListener('reset',ev=>{ + this.add_task_container.style.display="none"; + + }); + + + this.add_sub_task_formulaire.addEventListener('submit',ev=>{ + + ev.preventDefault(); + let task={ + start: '', + end: '', + name: '', + id: 'Task '+this.tasks.length, + progress: 0, + dependencies:'' + } + if(!this.add_sub_task_start.value) + this.add_sub_task_start.classList.add("wrong"); + + if(!this.add_task_end.value) + this.add_sub_task_end.classList.add("wrong"); + + if(!this.add_sub_task_title.value) + this.add_sub_task_title.classList.add("wrong"); + + if(this.add_sub_task_title.value && + this.add_sub_task_start.value && + this.add_sub_task_end.value){ + + task.name=this.add_sub_task_title.value; + task.end=''+this.add_sub_task_end.value; + task.start=''+this.add_sub_task_start.value; + task.progress=this.add_sub_task_completion.value; + task.dependencies=''+this.add_sub_task_dependencies.value; + + this.tasks.push(task); + this.update_sub_task(task); + this.refresh(this.tasks); + + this.add_sub_task_title.classList.remove("wrong"); + this.add_sub_task_end.classList.remove("wrong"); + this.add_sub_task_start.classList.remove("wrong"); + + this.add_sub_task_title.value=null; + this.add_sub_task_end.value=null; + this.add_sub_task_start.value=null; + this.add_sub_task_completion.value=null; + this.add_sub_task_container.style.display="none"; + + + + } + + + }); + } + update_sub_task(task){ + + + + + + let task_option= document.createElement('option'); + task_option.value=""+task.id; + task_option.appendChild(document.createTextNode(task.name)); + + this.add_sub_task_dependencies.appendChild(task_option); + + } + render() { + this.clear(); + this.setup_layers(); + this.make_grid(); + this.make_dates(); + this.make_bars(); + this.make_arrows(); + this.map_arrows_on_bars(); + this.set_width(); + this.set_scroll_position(); + } + + setup_layers() { + this.layers = {}; + const layers = ['grid', 'date', 'arrow', 'progress', 'bar', 'details']; + // make group layers + for (let layer of layers) { + this.layers[layer] = createSVG('g', { + class: layer, + append_to: this.$svg + }); + } + } + + make_grid() { + this.make_grid_background(); + this.make_grid_rows(); + this.make_grid_header(); + this.make_grid_ticks(); + this.make_grid_highlights(); + } + + make_grid_background() { + const grid_width = this.dates.length * this.options.column_width; + const grid_height = + this.options.header_height + + this.options.padding + + (this.options.bar_height + this.options.padding) * + this.tasks.length; + + createSVG('rect', { + x: 0, + y: 0, + width: grid_width, + height: grid_height, + class: 'grid-background', + append_to: this.layers.grid + }); + + $.attr(this.$svg, { + height: grid_height + this.options.padding + 100, + width: '100%' + }); + } + + make_grid_rows() { + const rows_layer = createSVG('g', { append_to: this.layers.grid }); + const lines_layer = createSVG('g', { append_to: this.layers.grid }); + + const row_width = this.dates.length * this.options.column_width; + const row_height = this.options.bar_height + this.options.padding; + + let row_y = this.options.header_height + this.options.padding / 2; + + for (let task of this.tasks) { + createSVG('rect', { + x: 0, + y: row_y, + width: row_width, + height: row_height, + class: 'grid-row', + append_to: rows_layer + }); + + createSVG('line', { + x1: 0, + y1: row_y + row_height, + x2: row_width, + y2: row_y + row_height, + class: 'row-line', + append_to: lines_layer + }); + + row_y += this.options.bar_height + this.options.padding; + } + } + + make_grid_header() { + const header_width = this.dates.length * this.options.column_width; + const header_height = this.options.header_height + 10; + createSVG('rect', { + x: 0, + y: 0, + width: header_width, + height: header_height, + class: 'grid-header', + append_to: this.layers.grid + }); + } + + make_grid_ticks() { + let tick_x = 0; + let tick_y = this.options.header_height + this.options.padding / 2; + let tick_height = + (this.options.bar_height + this.options.padding) * + this.tasks.length; + + for (let date of this.dates) { + let tick_class = 'tick'; + // thick tick for monday + if (this.view_is('Day') && date.getDate() === 1) { + tick_class += ' thick'; + } + // thick tick for first week + if ( + this.view_is('Week') && + date.getDate() >= 1 && + date.getDate() < 8 + ) { + tick_class += ' thick'; + } + // thick ticks for quarters + if (this.view_is('Month') && (date.getMonth() + 1) % 3 === 0) { + tick_class += ' thick'; + } + + createSVG('path', { + d: `M ${tick_x} ${tick_y} v ${tick_height}`, + class: tick_class, + append_to: this.layers.grid + }); + + if (this.view_is('Month')) { + tick_x += + date_utils.get_days_in_month(date) * + this.options.column_width / + 30; + } else { + tick_x += this.options.column_width; + } + } + } + + make_grid_highlights() { + // highlight today's date + if (this.view_is('Day')) { + const x = + date_utils.diff(date_utils.today(), this.gantt_start, 'hour') / + this.options.step * + this.options.column_width; + const y = 0; + + const width = this.options.column_width; + const height = + (this.options.bar_height + this.options.padding) * + this.tasks.length + + this.options.header_height + + this.options.padding / 2; + + createSVG('rect', { + x, + y, + width, + height, + class: 'today-highlight', + append_to: this.layers.grid + }); + } + } + + make_dates() { + this.get_dates_to_draw().forEach((date, i) => { + const col_x = i * this.options.column_width; + + // Rysujemy górny tekst + if (date.upper_text) { + const $upper_text = createSVG('text', { + x: date.upper_x + this.options.column_width, + y: date.upper_y, + innerHTML: date.upper_text, + class: 'upper-text', + append_to: this.layers.date + }); + + // Ramka na końcu kolumny + createSVG('line', { + x1: col_x, + y1: 0, + x2: col_x, + y2: this.options.header_height, + class: 'upper-date-separator', + append_to: this.layers.date + }); + } + + // Rysujemy dolny tekst + createSVG('text', { + x: date.lower_x, + y: date.lower_y, + innerHTML: date.lower_text == '00' ? '12' : '00', + class: 'lower-text', + append_to: this.layers.date + }); + }); + + } + + get_dates_to_draw() { + let last_date = null; + const dates = this.dates.map((date, i) => { + const d = this.get_date_info(date, last_date, i); + last_date = date; + return d; + }); + return dates; + } + + get_date_info(date, last_date, i) { + if (!last_date) { + last_date = date_utils.add(date, 1, 'year'); + } + const date_text = { + 'Quarter Day_lower': date_utils.format( + date, + 'HH', + this.options.language + ), + 'Half Day_lower': date_utils.format( + date, + 'HH', + this.options.language + ), + Day_lower: + date.getDate() !== last_date.getDate() + ? date_utils.format(date, 'D', this.options.language) + : '', + Week_lower: + date.getMonth() !== last_date.getMonth() + ? date_utils.format(date, 'D MMM', this.options.language) + : date_utils.format(date, 'D', this.options.language), + Month_lower: date_utils.format(date, 'MMMM', this.options.language), + Year_lower: date_utils.format(date, 'YYYY', this.options.language), + 'Quarter Day_upper': + date.getDate() !== last_date.getDate() + ? date_utils.format(date, 'D MMM', this.options.language) + : '', + 'Half Day_upper': + date.getDate() !== last_date.getDate() + ? date.getMonth() !== last_date.getMonth() + ? date_utils.format(date, 'D MMM', this.options.language) + : date_utils.format(date, 'D', this.options.language) + : '', + Day_upper: + date.getMonth() !== last_date.getMonth() + ? date_utils.format(date, 'MMMM', this.options.language) + : '', + Week_upper: + date.getMonth() !== last_date.getMonth() + ? date_utils.format(date, 'MMMM', this.options.language) + : '', + Month_upper: + date.getFullYear() !== last_date.getFullYear() + ? date_utils.format(date, 'YYYY', this.options.language) + : '', + Year_upper: + date.getFullYear() !== last_date.getFullYear() + ? date_utils.format(date, 'YYYY', this.options.language) + : '' + }; + + const base_pos = { + x: i * this.options.column_width, + lower_y: this.options.header_height, + upper_y: this.options.header_height - 25 + }; + + const x_pos = { + 'Quarter Day_lower': this.options.column_width * 4 / 2, + 'Quarter Day_upper': 0, + 'Half Day_lower': this.options.column_width * 2 / 2, + 'Half Day_upper': 0, + Day_lower: this.options.column_width / 2, + Day_upper: this.options.column_width * 30 / 2, + Week_lower: 0, + Week_upper: this.options.column_width * 4 / 2, + Month_lower: this.options.column_width / 2, + Month_upper: this.options.column_width * 12 / 2, + Year_lower: this.options.column_width / 2, + Year_upper: this.options.column_width * 30 / 2 + }; + + return { + upper_text: date_text[`${this.options.view_mode}_upper`], + lower_text: date_text[`${this.options.view_mode}_lower`], + upper_x: base_pos.x + x_pos[`${this.options.view_mode}_upper`], + upper_y: base_pos.upper_y, + lower_x: base_pos.x + x_pos[`${this.options.view_mode}_lower`], + lower_y: base_pos.lower_y + }; + } + + make_bars() { + this.bars = this.tasks.map(task => { + const bar = new Bar(this, task); + this.layers.bar.appendChild(bar.group); + return bar; + }); + + } + + + + + make_arrows() { + this.arrows = []; + for (let task of this.tasks) { + let arrows = []; + arrows = task.dependencies + .map(task_id => { + const dependency = this.get_task(task_id); + if (!dependency) return; + const arrow = new Arrow( + this, + this.bars[dependency._index], // from_task + this.bars[task._index] // to_task + ); + this.layers.arrow.appendChild(arrow.element); + return arrow; + }) + .filter(Boolean); // filter falsy values + this.arrows = this.arrows.concat(arrows); + } + } + + map_arrows_on_bars() { + for (let bar of this.bars) { + bar.arrows = this.arrows.filter(arrow => { + return ( + arrow.from_task.task.id === bar.task.id || + arrow.to_task.task.id === bar.task.id + ); + }); + } + } + + set_width() { + const cur_width = this.$svg.getBoundingClientRect().width; + const actual_width = this.$svg + .querySelector('.grid .grid-row') + .getAttribute('width'); + if (cur_width < actual_width) { + this.$svg.setAttribute('width', actual_width); + } + } + + set_scroll_position() { + const parent_element = this.$svg.parentElement; + if (!parent_element) return; + + const hours_before_first_task = date_utils.diff( + this.get_oldest_starting_date(), + this.gantt_start, + 'hour' + ); + + const scroll_pos = + hours_before_first_task / + this.options.step * + this.options.column_width - + this.options.column_width; + + parent_element.scrollLeft = scroll_pos; + } + + bind_grid_click() { + this.hide_popup(); + + $.on( + this.$svg, + this.options.popup_trigger, + '.grid-row, .grid-header', + () => { + this.unselect_all(); + this.hide_popup(); + } + ); + } + + bind_bar_events() { + let is_dragging = false; + let x_on_start = 0; + let y_on_start = 0; + let is_resizing_left = false; + let is_resizing_right = false; + let parent_bar_id = null; + let bars = []; // instanceof Bar + this.bar_being_dragged = null; + + function action_in_progress() { + return is_dragging || is_resizing_left || is_resizing_right; + } + + $.on(this.$svg, 'mousedown', '.bar-wrapper, .handle', (e, element) => { + const bar_wrapper = $.closest('.bar-wrapper', element); + + this.hide_popup(); + if (element.classList.contains('left')) { + is_resizing_left = true; + } else if (element.classList.contains('right')) { + is_resizing_right = true; + } else if (element.classList.contains('bar-wrapper')) { + is_dragging = true; + } + + bar_wrapper.classList.add('active'); + + x_on_start = e.offsetX; + y_on_start = e.offsetY; + + parent_bar_id = bar_wrapper.getAttribute('data-id'); + + const ids = [ + parent_bar_id, + ...this.get_all_dependent_tasks(parent_bar_id) + ]; + + + bars = ids.map(id => this.get_bar(id)); + + this.bar_being_dragged = parent_bar_id; + + bars.forEach(bar => { + const $bar = bar.$bar; + $bar.ox = $bar.getX(); + $bar.oy = $bar.getY(); + $bar.owidth = $bar.getWidth(); + $bar.finaldx = 0; + }); + }); + + + $.on(this.$svg, 'mousemove', e => { + if (!action_in_progress()) return; + const dx = e.offsetX - x_on_start; + const dy = e.offsetY - y_on_start; + + bars.forEach(bar => { + const $bar = bar.$bar; + $bar.finaldx = this.get_snap_position(dx); + + if (is_resizing_left) { + if (parent_bar_id === bar.task.id) { + bar.update_bar_position({ + x: $bar.ox + $bar.finaldx, + width: $bar.owidth - $bar.finaldx + }); + } else { + bar.update_bar_position({ + x: $bar.ox + $bar.finaldx + }); + } + } else if (is_resizing_right) { + if (parent_bar_id === bar.task.id) { + bar.update_bar_position({ + width: $bar.owidth + $bar.finaldx + }); + } + } else if (is_dragging) { + bar.update_bar_position({ x: $bar.ox + $bar.finaldx }); + } + }); + }); + + document.addEventListener('mouseup', e => { + if (is_dragging || is_resizing_left || is_resizing_right) { + bars.forEach(bar => bar.group.classList.remove('active')); + } + + is_dragging = false; + is_resizing_left = false; + is_resizing_right = false; + // + + + + }); + + $.on(this.$svg, 'mouseup', e => { + this.bar_being_dragged = null; + bars.forEach(bar => { + const $bar = bar.$bar; + if (!$bar.finaldx) return; + bar.date_changed(); + bar.set_action_completed(); + }); + + }); + + this.bind_bar_progress(); + } + + getColor(progress){ + let colorFilled="green"; + if(progress <= 50) + colorFilled="red"; + if(progress > 50 && progress <=80) + colorFilled="orange"; + if(progress > 80 && progress <=90) + colorFilled="yellow"; + + + + return colorFilled; + + } + + bind_bar_progress() { + let x_on_start = 0; + let y_on_start = 0; + let is_resizing = null; + let bar = null; + let $bar_progress = null; + let $bar = null; + + $.on(this.$svg, 'mousedown', '.handle.progress', (e, handle) => { + is_resizing = true; + x_on_start = e.offsetX; + y_on_start = e.offsetY; + + const $bar_wrapper = $.closest('.bar-wrapper', handle); + const id = $bar_wrapper.getAttribute('data-id'); + bar = this.get_bar(id); + + $bar_progress = bar.$bar_progress; + $bar = bar.$bar; + + $bar_progress.finaldx = 0; + $bar_progress.owidth = $bar_progress.getWidth(); + $bar_progress.min_dx = -$bar_progress.getWidth(); + $bar_progress.max_dx = $bar.getWidth() - $bar_progress.getWidth(); + }); + + $.on(this.$svg, 'mousemove', e => { + if (!is_resizing) return; + let dx = e.offsetX - x_on_start; + let dy = e.offsetY - y_on_start; + + if (dx > $bar_progress.max_dx) { + dx = $bar_progress.max_dx; + } + if (dx < $bar_progress.min_dx) { + dx = $bar_progress.min_dx; + } + + const $handle = bar.$handle_progress; + $.attr($bar_progress, 'width', $bar_progress.owidth + dx); + $.attr($handle, 'points', bar.get_progress_polygon_points()); + $bar_progress.finaldx = dx; + + + }); + + $.on(this.$svg, 'mouseup', () => { + is_resizing = false; + if (!($bar_progress && $bar_progress.finaldx)) return; + bar.progress_changed(); + bar.set_action_completed(); + //Here when + bar.$bar_progress.classList=""+this.getColor(bar.task.progress); + + + }); + } + + get_all_dependent_tasks(task_id) { + let out = []; + let to_process = [task_id]; + while (to_process.length) { + const deps = to_process.reduce((acc, curr) => { + acc = acc.concat(this.dependency_map[curr]); + return acc; + }, []); + + out = out.concat(deps); + to_process = deps.filter(d => !to_process.includes(d)); + } + + return out.filter(Boolean); + } + + get_snap_position(dx) { + let odx = dx, + rem, + position; + + if (this.view_is('Week')) { + rem = dx % (this.options.column_width / 7); + position = + odx - + rem + + (rem < this.options.column_width / 14 + ? 0 + : this.options.column_width / 7); + } else if (this.view_is('Month')) { + rem = dx % (this.options.column_width / 30); + position = + odx - + rem + + (rem < this.options.column_width / 60 + ? 0 + : this.options.column_width / 30); + } else { + rem = dx % this.options.column_width; + position = + odx - + rem + + (rem < this.options.column_width / 2 + ? 0 + : this.options.column_width); + } + return position; + } + + unselect_all() { + [...this.$svg.querySelectorAll('.bar-wrapper')].forEach(el => { + el.classList.remove('active'); + }); + } + + view_is(modes) { + if (typeof modes === 'string') { + return this.options.view_mode === modes; + } + + if (Array.isArray(modes)) { + return modes.some(mode => this.options.view_mode === mode); + } + + return false; + } + + get_task(id) { + return this.tasks.find(task => { + return task.id === id; + }); + } + + get_bar(id) { + return this.bars.find(bar => { + return bar.task.id === id; + }); + } + + show_popup(options) { + if (!this.popup) { + this.popup = new Popup( + this.popup_wrapper, + this, + this.options.custom_popup_html + ); + } + this.popup.show(options); + } + + hide_popup() { + this.popup && this.popup.hide(); + } + + trigger_event(event, args) { + if (this.options['on_' + event]) { + this.options['on_' + event].apply(null, args); + } + } + + /** + * Gets the oldest starting date from the list of tasks + * + * @returns Date + * @memberof Gantt + */ + get_oldest_starting_date() { + return this.tasks + .map(task => task._start) + .reduce( + (prev_date, cur_date) => + cur_date <= prev_date ? cur_date : prev_date + ); + } + + /** + * Clear all elements from the parent svg element + * + * @memberof Gantt + */ + clear() { + this.$svg.innerHTML = ''; + } +} + +function generate_id(task) { + return ( + task.name + + '_' + + Math.random() + .toString(36) + .slice(2, 12) + ); +} + +return Gantt; + +}()); diff --git a/libraries/Simple-Gant-master/frappe-gantt.js.map b/libraries/Simple-Gant-master/frappe-gantt.js.map new file mode 100644 index 0000000..ae8e931 --- /dev/null +++ b/libraries/Simple-Gant-master/frappe-gantt.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///webpack/bootstrap 40f9d74a4b17f4d126f3","webpack:///./src/Gantt.js","webpack:///./src/gantt.scss?b27d","webpack:///./src/gantt.scss","webpack:///./~/css-loader/lib/css-base.js","webpack:///./~/style-loader/addStyles.js","webpack:///./src/Bar.js","webpack:///./src/Arrow.js","webpack:///./~/deepmerge/dist/umd.js"],"names":["Gantt","element","tasks","config","self","init","set_defaults","change_view_mode","unselect_all","view_is","get_bar","trigger_event","refresh","view_mode","merge","require","defaults","header_height","column_width","step","view_modes","bar","height","corner_radius","arrow","curve","padding","date_format","custom_popup_html","reset_variables","document","querySelector","SVGElement","HTMLElement","TypeError","_tasks","_bars","_arrows","element_groups","updated_tasks","mode","set_scale","prepare","render","prepare_tasks","prepare_dependencies","prepare_dates","prepare_canvas","map","task","i","_start","moment","start","_end","end","diff","_index","startOf","add","clone","invalid","dependencies","deps","split","d","trim","filter","id","generate_id","dependency_map","t","push","gantt_start","gantt_end","set_gantt_dates","setup_dates","canvas","Snap","addClass","clear","setup_groups","make_grid","make_dates","make_bars","make_arrows","map_arrows_on_bars","set_width","set_scroll_position","bind_grid_click","subtract","endOf","dates","cur_date","groups","group","attr","scale","cur_width","node","getBoundingClientRect","width","actual_width","select","parent_element","parentElement","scroll_pos","get_min_date","scrollLeft","reduce","acc","curr","isSameOrBefore","make_grid_background","make_grid_rows","make_grid_header","make_grid_ticks","make_grid_highlights","grid_width","length","grid_height","rect","appendTo","grid","header_width","rows","lines","row_width","row_height","row_y","line","tick_x","tick_y","tick_height","date","tick_class","day","month","path","format","x","y","daysInMonth","get_dates_to_draw","text","lower_x","lower_y","lower_text","upper_text","$upper_text","upper_x","upper_y","getBBox","x2","remove","last_date","get_date_info","date_text","year","base_pos","x_pos","arrows","dependency","get_task","dep","arr","concat","from_task","to_task","click","details","selectAll","forEach","el","removeClass","modes","Array","isArray","find","name","Math","random","toString","slice","event","args","apply","Bar","gt","draw","bind","action_completed","prepare_values","prepare_plugins","compute_x","compute_y","duration","progress_width","progress","custom_class","bar_group","handle_group","plugin","Element","Paper","global","Fragment","prototype","getX","getY","getWidth","getHeight","getEndX","draw_bar","draw_progress_bar","draw_label","draw_resize_handles","$bar","$bar_progress","update_label_position","handle_width","polygon","get_progress_polygon_points","bar_progress","setup_click_event","show_details","bind_resize","bind_drag","bind_resize_progress","popover_group","details_box","render_details","f","shadow","e","get_details_position","transform","html","get_details_html","foreign_object","parse","append","isFunction","start_date","end_date","heading","line_1","line_2","get_handles","left","right","drag","onmove_left","onstart","onstop_left","onmove_right","onstop_right","dx","dy","onmove_handle_right","onstop_handle_right","onmove_handle_left","onstop_handle_left","onmove","onstop","handle","on_move","on_start","on_stop","max_dx","min_dx","owidth","finaldx","progress_changed","set_action_completed","ox","oy","run_method_for_dependencies","get_snap_position","update_bar_position","date_changed","fn","dm","deptask","dt","xs","valid_x","prev","update_attr","update_handle_position","update_progressbar_position","update_arrow_position","update_details_position","hasClass","toggleClass","compute_start_end_date","new_start_date","new_end_date","new_progress","compute_progress","setTimeout","x_in_units","width_in_units","parseInt","odx","rem","position","value","isNaN","label","update","functionToCheck","getType","call","Arrow","start_x","condition","start_y","end_x","end_y","from_is_below_to","clockwise","curve_y","offset","down_1","down_2"],"mappings":"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,cAAc,0BAA0B,SAAS,mBAAmB,8BAA8B,qBAAqB,SAAS,OAAO,kBAAkB,cAAc,0BAA0B,SAAS,OAAO,KAAK,gCAAgC,sBAAsB,0BAA0B,KAAK,iBAAiB,wBAAwB,KAAK,iBAAiB,wBAAwB,KAAK,mCAAmC,uBAAuB,4BAA4B,oBAAoB,eAAe,kBAAkB,OAAO,YAAY,wBAAwB,0BAA0B,4BAA4B,2BAA2B,OAAO,WAAW,wBAAwB,2BAA2B,2BAA2B,OAAO,sBAAsB,yBAAyB,OAAO,KAAK,aAAa,oBAAoB,KAAK,GAAG,qBAAqB;;AAExxL;;;;;;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAgB,iBAAiB;AACjC;AACA;AACA,yCAAwC,gBAAgB;AACxD,KAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAgB,iBAAiB;AACjC;AACA;AACA;AACA;AACA,aAAY,oBAAoB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACjDA;AACA;AACA;AACA;AACA,qBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;AACF;AACA;AACA,GAAE;AACF;AACA;AACA,GAAE;AACF;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,iBAAgB,mBAAmB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAgB,sBAAsB;AACtC;AACA;AACA,mBAAkB,2BAA2B;AAC7C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,gBAAe,mBAAmB;AAClC;AACA;AACA;AACA;AACA,kBAAiB,2BAA2B;AAC5C;AACA;AACA,SAAQ,uBAAuB;AAC/B;AACA;AACA,IAAG;AACH;AACA,kBAAiB,uBAAuB;AACxC;AACA;AACA,4BAA2B;AAC3B;AACA;AACA;;AAEA;AACA;AACA;AACA,gBAAe,iBAAiB;AAChC;AACA;AACA;AACA;AACA;AACA,eAAc;AACd;AACA,iCAAgC,sBAAsB;AACtD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA,IAAG;AACH;AACA;AACA;AACA,GAAE;AACF;AACA,GAAE;AACF;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;AACF;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,EAAC;;AAED;AACA;;AAEA;AACA;AACA,GAAE;AACF;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,GAAE;AACF;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,wDAAuD;AACvD;;AAEA,8BAA6B,mBAAmB;;AAEhD;;AAEA;;AAEA;AACA;AACA;;;;;;;;;;;;mBC5OwBuL,G;AATxB;AACA;;;;;;;;AAQe,UAASA,GAAT,CAAaC,EAAb,EAAiB3I,IAAjB,EAAuB;;AAErC,MAAM7C,OAAO,EAAb;;AAEA,WAASC,IAAT,GAAgB;AACfC;AACAoC;AACAmJ;AACAC;AACA;;AAED,WAASxL,YAAT,GAAwB;AACvBF,QAAK2L,gBAAL,GAAwB,KAAxB;AACA3L,QAAK6C,IAAL,GAAYA,IAAZ;AACA;;AAED,WAASP,OAAT,GAAmB;AAClBsJ;AACAC;AACA;;AAED,WAASD,cAAT,GAA0B;AACzB5L,QAAKyD,OAAL,GAAezD,KAAK6C,IAAL,CAAUY,OAAzB;AACAzD,QAAKkB,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","file":"frappe-gantt.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"Gantt\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Gantt\"] = factory();\n\telse\n\t\troot[\"Gantt\"] = factory();\n})(this, function() {\nreturn \n\n\n/** WEBPACK FOOTER **\n ** webpack/universalModuleDefinition\n **/"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap 40f9d74a4b17f4d126f3\n **/","/* global moment, Snap */\n/**\n * Gantt:\n * \telement: querySelector string, HTML DOM or SVG DOM element, required\n * \ttasks: array of tasks, required\n * task: { id, name, start, end, progress, dependencies, custom_class }\n * \tconfig: configuration options, optional\n */\nimport './gantt.scss';\n\nimport Bar from './Bar';\nimport Arrow from './Arrow';\n\nexport default function Gantt(element, tasks, config = {}) {\n\n\tconst self = {};\n\n\tfunction init() {\n\t\tset_defaults();\n\n\t\t// expose methods\n\t\tself.change_view_mode = change_view_mode;\n\t\tself.unselect_all = unselect_all;\n\t\tself.view_is = view_is;\n\t\tself.get_bar = get_bar;\n\t\tself.trigger_event = trigger_event;\n\t\tself.refresh = refresh;\n\n\t\t// initialize with default view mode\n\t\tchange_view_mode(self.config.view_mode);\n\t}\n\n\tfunction set_defaults() {\n\n\t\tconst merge = require('deepmerge');\n\n\t\tconst defaults = {\n\t\t\theader_height: 50,\n\t\t\tcolumn_width: 30,\n\t\t\tstep: 24,\n\t\t\tview_modes: [\n\t\t\t\t'Quarter Day',\n\t\t\t\t'Half Day',\n\t\t\t\t'Day',\n\t\t\t\t'Week',\n\t\t\t\t'Month'\n\t\t\t],\n\t\t\tbar: {\n\t\t\t\theight: 20,\n\t\t\t\tcorner_radius: 3\n\t\t\t},\n\t\t\tarrow: {\n\t\t\t\tcurve: 5\n\t\t\t},\n\t\t\tpadding: 18,\n\t\t\tview_mode: 'Day',\n\t\t\tdate_format: 'YYYY-MM-DD',\n\t\t\tcustom_popup_html: null\n\t\t};\n\t\tself.config = merge(defaults, config);\n\n\t\treset_variables(tasks);\n\t}\n\n\tfunction reset_variables(tasks) {\n\t\tif(typeof element === 'string') {\n\t\t\tself.element = document.querySelector(element);\n\t\t} else if (element instanceof SVGElement) {\n\t\t\tself.element = element;\n\t\t} else if (element instanceof HTMLElement) {\n\t\t\tself.element = element.querySelector('svg');\n\t\t} else {\n\t\t\tthrow new TypeError('Frappé Gantt only supports usage of a string CSS selector,' +\n\t\t\t\t' HTML DOM element or SVG DOM element for the \\'element\\' parameter');\n\t\t}\n\n\t\tself._tasks = tasks;\n\n\t\tself._bars = [];\n\t\tself._arrows = [];\n\t\tself.element_groups = {};\n\t}\n\n\tfunction refresh(updated_tasks) {\n\t\treset_variables(updated_tasks);\n\t\tchange_view_mode(self.config.view_mode);\n\t}\n\n\tfunction change_view_mode(mode) {\n\t\tset_scale(mode);\n\t\tprepare();\n\t\trender();\n\t\t// fire viewmode_change event\n\t\ttrigger_event('view_change', [mode]);\n\t}\n\n\tfunction prepare() {\n\t\tprepare_tasks();\n\t\tprepare_dependencies();\n\t\tprepare_dates();\n\t\tprepare_canvas();\n\t}\n\n\tfunction prepare_tasks() {\n\n\t\t// prepare tasks\n\t\tself.tasks = self._tasks.map((task, i) => {\n\n\t\t\t// momentify\n\t\t\ttask._start = moment(task.start, self.config.date_format);\n\t\t\ttask._end = moment(task.end, self.config.date_format);\n\n\t\t\t// make task invalid if duration too large\n\t\t\tif(task._end.diff(task._start, 'years') > 10) {\n\t\t\t\ttask.end = null;\n\t\t\t}\n\n\t\t\t// cache index\n\t\t\ttask._index = i;\n\n\t\t\t// invalid dates\n\t\t\tif(!task.start && !task.end) {\n\t\t\t\ttask._start = moment().startOf('day');\n\t\t\t\ttask._end = moment().startOf('day').add(2, 'days');\n\t\t\t}\n\t\t\tif(!task.start && task.end) {\n\t\t\t\ttask._start = task._end.clone().add(-2, 'days');\n\t\t\t}\n\t\t\tif(task.start && !task.end) {\n\t\t\t\ttask._end = task._start.clone().add(2, 'days');\n\t\t\t}\n\n\t\t\t// invalid flag\n\t\t\tif(!task.start || !task.end) {\n\t\t\t\ttask.invalid = true;\n\t\t\t}\n\n\t\t\t// dependencies\n\t\t\tif(typeof task.dependencies === 'string' || !task.dependencies) {\n\t\t\t\tlet deps = [];\n\t\t\t\tif(task.dependencies) {\n\t\t\t\t\tdeps = task.dependencies\n\t\t\t\t\t\t.split(',')\n\t\t\t\t\t\t.map(d => d.trim())\n\t\t\t\t\t\t.filter((d) => d);\n\t\t\t\t}\n\t\t\t\ttask.dependencies = deps;\n\t\t\t}\n\n\t\t\t// uids\n\t\t\tif(!task.id) {\n\t\t\t\ttask.id = generate_id(task);\n\t\t\t}\n\n\t\t\treturn task;\n\t\t});\n\t}\n\n\tfunction prepare_dependencies() {\n\n\t\tself.dependency_map = {};\n\t\tfor(let t of self.tasks) {\n\t\t\tfor(let d of t.dependencies) {\n\t\t\t\tself.dependency_map[d] = self.dependency_map[d] || [];\n\t\t\t\tself.dependency_map[d].push(t.id);\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction prepare_dates() {\n\n\t\tself.gantt_start = self.gantt_end = null;\n\t\tfor(let task of self.tasks) {\n\t\t\t// set global start and end date\n\t\t\tif(!self.gantt_start || task._start < self.gantt_start) {\n\t\t\t\tself.gantt_start = task._start;\n\t\t\t}\n\t\t\tif(!self.gantt_end || task._end > self.gantt_end) {\n\t\t\t\tself.gantt_end = task._end;\n\t\t\t}\n\t\t}\n\t\tset_gantt_dates();\n\t\tsetup_dates();\n\t}\n\n\tfunction prepare_canvas() {\n\t\tif(self.canvas) return;\n\t\tself.canvas = Snap(self.element).addClass('gantt');\n\t}\n\n\tfunction render() {\n\t\tclear();\n\t\tsetup_groups();\n\t\tmake_grid();\n\t\tmake_dates();\n\t\tmake_bars();\n\t\tmake_arrows();\n\t\tmap_arrows_on_bars();\n\t\tset_width();\n\t\tset_scroll_position();\n\t\tbind_grid_click();\n\t}\n\n\tfunction clear() {\n\t\tself.canvas.clear();\n\t\tself._bars = [];\n\t\tself._arrows = [];\n\t}\n\n\tfunction set_gantt_dates() {\n\n\t\tif(view_is(['Quarter Day', 'Half Day'])) {\n\t\t\tself.gantt_start = self.gantt_start.clone().subtract(7, 'day');\n\t\t\tself.gantt_end = self.gantt_end.clone().add(7, 'day');\n\t\t} else if(view_is('Month')) {\n\t\t\tself.gantt_start = self.gantt_start.clone().startOf('year');\n\t\t\tself.gantt_end = self.gantt_end.clone().endOf('month').add(1, 'year');\n\t\t} else {\n\t\t\tself.gantt_start = self.gantt_start.clone().startOf('month').subtract(1, 'month');\n\t\t\tself.gantt_end = self.gantt_end.clone().endOf('month').add(1, 'month');\n\t\t}\n\t}\n\n\tfunction setup_dates() {\n\n\t\tself.dates = [];\n\t\tlet cur_date = null;\n\n\t\twhile(cur_date === null || cur_date < self.gantt_end) {\n\t\t\tif(!cur_date) {\n\t\t\t\tcur_date = self.gantt_start.clone();\n\t\t\t} else {\n\t\t\t\tcur_date = view_is('Month') ?\n\t\t\t\t\tcur_date.clone().add(1, 'month') :\n\t\t\t\t\tcur_date.clone().add(self.config.step, 'hours');\n\t\t\t}\n\t\t\tself.dates.push(cur_date);\n\t\t}\n\t}\n\n\tfunction setup_groups() {\n\n\t\tconst groups = ['grid', 'date', 'arrow', 'progress', 'bar', 'details'];\n\t\t// make group layers\n\t\tfor(let group of groups) {\n\t\t\tself.element_groups[group] = self.canvas.group().attr({'id': group});\n\t\t}\n\t}\n\n\tfunction set_scale(scale) {\n\t\tself.config.view_mode = scale;\n\n\t\tif(scale === 'Day') {\n\t\t\tself.config.step = 24;\n\t\t\tself.config.column_width = 38;\n\t\t} else if(scale === 'Half Day') {\n\t\t\tself.config.step = 24 / 2;\n\t\t\tself.config.column_width = 38;\n\t\t} else if(scale === 'Quarter Day') {\n\t\t\tself.config.step = 24 / 4;\n\t\t\tself.config.column_width = 38;\n\t\t} else if(scale === 'Week') {\n\t\t\tself.config.step = 24 * 7;\n\t\t\tself.config.column_width = 140;\n\t\t} else if(scale === 'Month') {\n\t\t\tself.config.step = 24 * 30;\n\t\t\tself.config.column_width = 120;\n\t\t}\n\t}\n\n\tfunction set_width() {\n\t\tconst cur_width = self.canvas.node.getBoundingClientRect().width;\n\t\tconst actual_width = self.canvas.select('#grid .grid-row').attr('width');\n\t\tif(cur_width < actual_width) {\n\t\t\tself.canvas.attr('width', actual_width);\n\t\t}\n\t}\n\n\tfunction set_scroll_position() {\n\t\tconst parent_element = self.element.parentElement;\n\n\t\tif(!parent_element) return;\n\n\t\tconst scroll_pos = get_min_date().diff(self.gantt_start, 'hours') /\n\t\t\tself.config.step * self.config.column_width - self.config.column_width;\n\t\tparent_element.scrollLeft = scroll_pos;\n\t}\n\n\tfunction get_min_date() {\n\t\tconst task = self.tasks.reduce((acc, curr) => {\n\t\t\treturn curr._start.isSameOrBefore(acc._start) ? curr : acc;\n\t\t});\n\t\treturn task._start;\n\t}\n\n\tfunction make_grid() {\n\t\tmake_grid_background();\n\t\tmake_grid_rows();\n\t\tmake_grid_header();\n\t\tmake_grid_ticks();\n\t\tmake_grid_highlights();\n\t}\n\n\tfunction make_grid_background() {\n\n\t\tconst grid_width = self.dates.length * self.config.column_width,\n\t\t\tgrid_height = self.config.header_height + self.config.padding +\n\t\t\t\t(self.config.bar.height + self.config.padding) * self.tasks.length;\n\n\t\tself.canvas.rect(0, 0, grid_width, grid_height)\n\t\t\t.addClass('grid-background')\n\t\t\t.appendTo(self.element_groups.grid);\n\n\t\tself.canvas.attr({\n\t\t\theight: grid_height + self.config.padding + 100,\n\t\t\twidth: '100%'\n\t\t});\n\t}\n\n\tfunction make_grid_header() {\n\t\tconst header_width = self.dates.length * self.config.column_width,\n\t\t\theader_height = self.config.header_height + 10;\n\t\tself.canvas.rect(0, 0, header_width, header_height)\n\t\t\t.addClass('grid-header')\n\t\t\t.appendTo(self.element_groups.grid);\n\t}\n\n\tfunction make_grid_rows() {\n\n\t\tconst rows = self.canvas.group().appendTo(self.element_groups.grid),\n\t\t\tlines = self.canvas.group().appendTo(self.element_groups.grid),\n\t\t\trow_width = self.dates.length * self.config.column_width,\n\t\t\trow_height = self.config.bar.height + self.config.padding;\n\n\t\tlet row_y = self.config.header_height + self.config.padding / 2;\n\n\t\tfor(let task of self.tasks) { // eslint-disable-line\n\t\t\tself.canvas.rect(0, row_y, row_width, row_height)\n\t\t\t\t.addClass('grid-row')\n\t\t\t\t.appendTo(rows);\n\n\t\t\tself.canvas.line(0, row_y + row_height, row_width, row_y + row_height)\n\t\t\t\t.addClass('row-line')\n\t\t\t\t.appendTo(lines);\n\n\t\t\trow_y += self.config.bar.height + self.config.padding;\n\t\t}\n\t}\n\n\tfunction make_grid_ticks() {\n\t\tlet tick_x = 0,\n\t\t\ttick_y = self.config.header_height + self.config.padding / 2,\n\t\t\ttick_height = (self.config.bar.height + self.config.padding) * self.tasks.length;\n\n\t\tfor(let date of self.dates) {\n\t\t\tlet tick_class = 'tick';\n\t\t\t// thick tick for monday\n\t\t\tif(view_is('Day') && date.day() === 1) {\n\t\t\t\ttick_class += ' thick';\n\t\t\t}\n\t\t\t// thick tick for first week\n\t\t\tif(view_is('Week') && date.date() >= 1 && date.date() < 8) {\n\t\t\t\ttick_class += ' thick';\n\t\t\t}\n\t\t\t// thick ticks for quarters\n\t\t\tif(view_is('Month') && date.month() % 3 === 0) {\n\t\t\t\ttick_class += ' thick';\n\t\t\t}\n\n\t\t\tself.canvas.path(Snap.format('M {x} {y} v {height}', {\n\t\t\t\tx: tick_x,\n\t\t\t\ty: tick_y,\n\t\t\t\theight: tick_height\n\t\t\t}))\n\t\t\t.addClass(tick_class)\n\t\t\t.appendTo(self.element_groups.grid);\n\n\t\t\tif(view_is('Month')) {\n\t\t\t\ttick_x += date.daysInMonth() * self.config.column_width / 30;\n\t\t\t} else {\n\t\t\t\ttick_x += self.config.column_width;\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction make_grid_highlights() {\n\n\t\t// highlight today's date\n\t\tif(view_is('Day')) {\n\t\t\tconst x = moment().startOf('day').diff(self.gantt_start, 'hours') /\n\t\t\t\t\tself.config.step * self.config.column_width;\n\t\t\tconst y = 0;\n\t\t\tconst width = self.config.column_width;\n\t\t\tconst height = (self.config.bar.height + self.config.padding) * self.tasks.length +\n\t\t\t\tself.config.header_height + self.config.padding / 2;\n\n\t\t\tself.canvas.rect(x, y, width, height)\n\t\t\t\t.addClass('today-highlight')\n\t\t\t\t.appendTo(self.element_groups.grid);\n\t\t}\n\t}\n\n\tfunction make_dates() {\n\n\t\tfor(let date of get_dates_to_draw()) {\n\t\t\tself.canvas.text(date.lower_x, date.lower_y, date.lower_text)\n\t\t\t\t.addClass('lower-text')\n\t\t\t\t.appendTo(self.element_groups.date);\n\n\t\t\tif(date.upper_text) {\n\t\t\t\tconst $upper_text = self.canvas.text(date.upper_x, date.upper_y, date.upper_text)\n\t\t\t\t\t.addClass('upper-text')\n\t\t\t\t\t.appendTo(self.element_groups.date);\n\n\t\t\t\t// remove out-of-bound dates\n\t\t\t\tif($upper_text.getBBox().x2 > self.element_groups.grid.getBBox().width) {\n\t\t\t\t\t$upper_text.remove();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction get_dates_to_draw() {\n\t\tlet last_date = null;\n\t\tconst dates = self.dates.map((date, i) => {\n\t\t\tconst d = get_date_info(date, last_date, i);\n\t\t\tlast_date = date;\n\t\t\treturn d;\n\t\t});\n\t\treturn dates;\n\t}\n\n\tfunction get_date_info(date, last_date, i) {\n\t\tif(!last_date) {\n\t\t\tlast_date = date.clone().add(1, 'year');\n\t\t}\n\t\tconst date_text = {\n\t\t\t'Quarter Day_lower': date.format('HH'),\n\t\t\t'Half Day_lower': date.format('HH'),\n\t\t\t'Day_lower': date.date() !== last_date.date() ? date.format('D') : '',\n\t\t\t'Week_lower': date.month() !== last_date.month() ?\n\t\t\t\tdate.format('D MMM') : date.format('D'),\n\t\t\t'Month_lower': date.format('MMMM'),\n\t\t\t'Quarter Day_upper': date.date() !== last_date.date() ? date.format('D MMM') : '',\n\t\t\t'Half Day_upper': date.date() !== last_date.date() ?\n\t\t\t\tdate.month() !== last_date.month() ?\n\t\t\t\tdate.format('D MMM') : date.format('D') : '',\n\t\t\t'Day_upper': date.month() !== last_date.month() ? date.format('MMMM') : '',\n\t\t\t'Week_upper': date.month() !== last_date.month() ? date.format('MMMM') : '',\n\t\t\t'Month_upper': date.year() !== last_date.year() ? date.format('YYYY') : ''\n\t\t};\n\n\t\tconst base_pos = {\n\t\t\tx: i * self.config.column_width,\n\t\t\tlower_y: self.config.header_height,\n\t\t\tupper_y: self.config.header_height - 25\n\t\t};\n\n\t\tconst x_pos = {\n\t\t\t'Quarter Day_lower': (self.config.column_width * 4) / 2,\n\t\t\t'Quarter Day_upper': 0,\n\t\t\t'Half Day_lower': (self.config.column_width * 2) / 2,\n\t\t\t'Half Day_upper': 0,\n\t\t\t'Day_lower': self.config.column_width / 2,\n\t\t\t'Day_upper': (self.config.column_width * 30) / 2,\n\t\t\t'Week_lower': 0,\n\t\t\t'Week_upper': (self.config.column_width * 4) / 2,\n\t\t\t'Month_lower': self.config.column_width / 2,\n\t\t\t'Month_upper': (self.config.column_width * 12) / 2\n\t\t};\n\n\t\treturn {\n\t\t\tupper_text: date_text[`${self.config.view_mode}_upper`],\n\t\t\tlower_text: date_text[`${self.config.view_mode}_lower`],\n\t\t\tupper_x: base_pos.x + x_pos[`${self.config.view_mode}_upper`],\n\t\t\tupper_y: base_pos.upper_y,\n\t\t\tlower_x: base_pos.x + x_pos[`${self.config.view_mode}_lower`],\n\t\t\tlower_y: base_pos.lower_y\n\t\t};\n\t}\n\n\tfunction make_arrows() {\n\t\tself._arrows = [];\n\t\tfor(let task of self.tasks) {\n\t\t\tlet arrows = [];\n\t\t\tarrows = task.dependencies.map(dep => {\n\t\t\t\tconst dependency = get_task(dep);\n\t\t\t\tif(!dependency) return;\n\n\t\t\t\tconst arrow = Arrow(\n\t\t\t\t\tself, // gt\n\t\t\t\t\tself._bars[dependency._index], // from_task\n\t\t\t\t\tself._bars[task._index] // to_task\n\t\t\t\t);\n\t\t\t\tself.element_groups.arrow.add(arrow.element);\n\t\t\t\treturn arrow; // eslint-disable-line\n\t\t\t}).filter(arr => arr); // filter falsy values\n\t\t\tself._arrows = self._arrows.concat(arrows);\n\t\t}\n\t}\n\n\tfunction make_bars() {\n\n\t\tself._bars = self.tasks.map((task) => {\n\t\t\tconst bar = Bar(self, task);\n\t\t\tself.element_groups.bar.add(bar.group);\n\t\t\treturn bar;\n\t\t});\n\t}\n\n\tfunction map_arrows_on_bars() {\n\t\tfor(let bar of self._bars) {\n\t\t\tbar.arrows = self._arrows.filter(arrow => {\n\t\t\t\treturn (arrow.from_task.task.id === bar.task.id) ||\n\t\t\t\t\t(arrow.to_task.task.id === bar.task.id);\n\t\t\t});\n\t\t}\n\t}\n\n\tfunction bind_grid_click() {\n\t\tself.element_groups.grid.click(() => {\n\t\t\tunselect_all();\n\t\t\tself.element_groups.details\n\t\t\t\t.selectAll('.details-wrapper')\n\t\t\t\t.forEach(el => el.addClass('hide'));\n\t\t});\n\t}\n\n\tfunction unselect_all() {\n\t\tself.canvas.selectAll('.bar-wrapper').forEach(el => {\n\t\t\tel.removeClass('active');\n\t\t});\n\t}\n\n\tfunction view_is(modes) {\n\t\tif (typeof modes === 'string') {\n\t\t\treturn self.config.view_mode === modes;\n\t\t} else if(Array.isArray(modes)) {\n\t\t\tfor (let mode of modes) {\n\t\t\t\tif(self.config.view_mode === mode) return true;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tfunction get_task(id) {\n\t\treturn self.tasks.find((task) => {\n\t\t\treturn task.id === id;\n\t\t});\n\t}\n\n\tfunction get_bar(id) {\n\t\treturn self._bars.find((bar) => {\n\t\t\treturn bar.task.id === id;\n\t\t});\n\t}\n\n\tfunction generate_id(task) {\n\t\treturn task.name + '_' + Math.random().toString(36).slice(2, 12);\n\t}\n\n\tfunction trigger_event(event, args) {\n\t\tif(self.config['on_' + event]) {\n\t\t\tself.config['on_' + event].apply(null, args);\n\t\t}\n\t}\n\n\tinit();\n\n\treturn self;\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./~/eslint-loader!./src/Gantt.js\n **/","// style-loader: Adds some css to the DOM by adding a + + + + +
+

Interactive Gantt

+
+
+ + + \ No newline at end of file diff --git a/libraries/Simple-Gant-master/names.txt b/libraries/Simple-Gant-master/names.txt new file mode 100644 index 0000000..f85a1f5 --- /dev/null +++ b/libraries/Simple-Gant-master/names.txt @@ -0,0 +1,20 @@ +"Bernadette Young", +"Robert Davis", +"Elena Reyes", +"Evelyn Goodrich", +"Remi Hakimi", +"Asmara Tewolde", +"Cristina Schwarzer", +"Anna Grimsdottir", +"Thomas Zotov", +"Arthur Maclean", +"Mauricio Mirella", +"Anthony Foccacia", +"Mark Waugh", +"Urbain Leverrier", +"John Adams", +"Chris Davis", +"Rania Ali", +"Spiro Agnew", +"Diana Frost", +"David Nixon", diff --git a/libraries/functions.js b/libraries/functions.js index e9d1f8f..5c587c4 100644 --- a/libraries/functions.js +++ b/libraries/functions.js @@ -13,7 +13,7 @@ $( document ).ready(function() $( 'input.datetime' ).datetimepicker({ language: 'pl', autoClose: true, - disabledDates: false, + disabledDates: [], pickTime: false, format: 'YYYY-MM-DD', }); diff --git a/libraries/jquery-gantt/jquery-gantt.js b/libraries/jquery-gantt/jquery-gantt.js index 8aa88b2..7226776 100644 --- a/libraries/jquery-gantt/jquery-gantt.js +++ b/libraries/jquery-gantt/jquery-gantt.js @@ -1,1816 +1,1859 @@ /*jshint shadow:true, laxbreak:true, jquery:true, strict:true, trailing:true */ (function ($, undefined) { - "use strict"; - - $.fn.gantt = function (options) { - - var cookieKey = "jquery.fn.gantt"; - var scales = ["hours", "days", "weeks", "months"]; - //Default settings - var settings = { - source: [], - itemsPerPage: 7, - months: ["Styczeń", "Luty", "Marzec", "Kwiecień", "Maj", "Czerwiec", "Lipiec", "Sierpień", "Wrzesień", "Październik", "Listopad", "Grudzień"], - dow: ["N", "P", "W", "Ś", "C", "P", "S"], // Niedziela, Poniedziałek, Wtorek, Środa, Czwartek, Piątek, Sobota - navigate: "buttons", - scale: "days", - useCookie: false, - maxScale: "months", - minScale: "hours", - waitText: "Please wait...", - onItemClick: function (data) { return; }, - onAddClick: function (data) { return; }, - onRender: function() { return; }, - scrollToToday: true, - saveEndpoint: null - }; - - /** - * Extend options with default values - */ - if (options) { - $.extend(settings, options); - } - - // can't use cookie if don't have `$.cookie` - settings.useCookie = settings.useCookie && $.isFunction($.cookie); - - // custom selector `:findday` used to match on specified day in ms. - // - // The selector is passed a date in ms and elements are added to the - // selection filter if the element date matches, as determined by the - // id attribute containing a parsable date in ms. - $.extend($.expr[":"], { - findday: function (a, i, m) { - var cd = new Date(parseInt(m[3], 10)); - var id = $(a).attr("id"); - id = id ? id : ""; - var si = id.indexOf("-") + 1; - var ed = new Date(parseInt(id.substring(si, id.length), 10)); - cd = new Date(cd.getFullYear(), cd.getMonth(), cd.getDate()); - ed = new Date(ed.getFullYear(), ed.getMonth(), ed.getDate()); - return cd.getTime() === ed.getTime(); - } - }); - // custom selector `:findweek` used to match on specified week in ms. - $.extend($.expr[":"], { - findweek: function (a, i, m) { - var cd = new Date(parseInt(m[3], 10)); - var id = $(a).attr("id"); - id = id ? id : ""; - var si = id.indexOf("-") + 1; - cd = cd.getFullYear() + "-" + cd.getDayForWeek().getWeekOfYear(); - var ed = id.substring(si, id.length); - return cd === ed; - } - }); - // custom selector `:findmonth` used to match on specified month in ms. - $.extend($.expr[":"], { - findmonth: function (a, i, m) { - var cd = new Date(parseInt(m[3], 10)); - cd = cd.getFullYear() + "-" + cd.getMonth(); - var id = $(a).attr("id"); - id = id ? id : ""; - var si = id.indexOf("-") + 1; - var ed = id.substring(si, id.length); - return cd === ed; - } - }); - - // Date prototype helpers - // ====================== - - // `getWeekId` returns a string in the form of 'dh-YYYY-WW', where WW is - // the week # for the year. - // It is used to add an id to the week divs - Date.prototype.getWeekId = function () { - var y = this.getFullYear(); - var w = this.getDayForWeek().getWeekOfYear(); - var m = this.getMonth(); - if (m === 11 && w === 1) { - y++; - } - return 'dh-' + y + "-" + w; - }; - - // `getRepDate` returns the seconds since the epoch for a given date - // depending on the active scale - Date.prototype.getRepDate = function () { - switch (settings.scale) { - case "hours": - return this.getTime(); - case "weeks": - return this.getDayForWeek().getTime(); - case "months": - return new Date(this.getFullYear(), this.getMonth(), 1).getTime(); - default: - return this.getTime(); - } - }; - - // `getDayOfYear` returns the day number for the year - Date.prototype.getDayOfYear = function () { - var fd = new Date(this.getFullYear(), 0, 0); - var sd = new Date(this.getFullYear(), this.getMonth(), this.getDate()); - return Math.ceil((sd - fd) / 86400000); - }; - - // `getWeekOfYear` returns the week number for the year - Date.prototype.getWeekOfYear = function () { - var ys = new Date(this.getFullYear(), 0, 1); - var sd = new Date(this.getFullYear(), this.getMonth(), this.getDate()); - if (ys.getDay() > 3) { - ys = new Date(sd.getFullYear(), 0, (7 - ys.getDay())); - } - var daysCount = sd.getDayOfYear() - ys.getDayOfYear(); - return Math.ceil(daysCount / 7); - - }; - - // `getDaysInMonth` returns the number of days in a month - Date.prototype.getDaysInMonth = function () { - return 32 - new Date(this.getFullYear(), this.getMonth(), 32).getDate(); - }; - - // `hasWeek` returns `true` if the date resides on a week boundary - // **????????????????? Don't know if this is true** - Date.prototype.hasWeek = function () { - var df = new Date(this.valueOf()); - df.setDate(df.getDate() - df.getDay()); - var dt = new Date(this.valueOf()); - dt.setDate(dt.getDate() + (6 - dt.getDay())); - - if (df.getMonth() === dt.getMonth()) { - return true; - } else { - return (df.getMonth() === this.getMonth() && dt.getDate() < 4) || (df.getMonth() !== this.getMonth() && dt.getDate() >= 4); - } - }; - - // `getDayForWeek` returns the Date object for the starting date of - // the week # for the year - Date.prototype.getDayForWeek = function () { - var df = new Date(this.valueOf()); - df.setDate(df.getDate() - df.getDay()); - var dt = new Date(this.valueOf()); - dt.setDate(dt.getDate() + (6 - dt.getDay())); - if ((df.getMonth() === dt.getMonth()) || (df.getMonth() !== dt.getMonth() && dt.getDate() >= 4)) { - return new Date(dt.setDate(dt.getDate() - 3)); - } else { - return new Date(df.setDate(df.getDate() + 3)); - } - }; - - // fixes https://github.com/taitems/jQuery.Gantt/issues/62 - function ktkGetNextDate(currentDate, scaleStep) { - for(var minIncrements = 1;; minIncrements++) { - var nextDate = new Date(currentDate); - nextDate.setHours(currentDate.getHours() + scaleStep * minIncrements); - - if (nextDate.getTime() !== currentDate.getTime()) { - return nextDate; - } - - // If code reaches here, it's because current didn't really increment (invalid local time) because of daylight-saving adjustments - // => retry adding 2, 3, 4 hours, and so on (until nextDate > current) - } - } - - // Grid management - // =============== - - // Core object is responsible for navigation and rendering - var core = { - // Return the element whose topmost point lies under the given point - // Normalizes for old browsers - elementFromPoint: (function(){ // IIFE - // version for normal browsers - if (document.compatMode === "CSS1Compat") { - return function (x, y) { - x -= window.pageXOffset; - y -= window.pageYOffset; - return document.elementFromPoint(x, y); - }; - } - // version for older browsers - return function (x, y) { - x -= $(document).scrollLeft(); - y -= $(document).scrollTop(); - return document.elementFromPoint(x, y); - }; - })(), - - // **Create the chart** - create: function (element) { - - // Initialize data with a json object or fetch via an xhr - // request depending on `settings.source` - if (typeof settings.source !== "string") { - element.data = settings.source; - core.init(element); - } else { - $.getJSON(settings.source, function (jsData) { - element.data = jsData; - core.init(element); - }); - } - }, - - // **Setup the initial view** - // Here we calculate the number of rows, pages and visible start - // and end dates once the data is ready - init: function (element) { - element.rowsNum = element.data.length; - element.pageCount = Math.ceil(element.rowsNum / settings.itemsPerPage); - element.rowsOnLastPage = element.rowsNum - (Math.floor(element.rowsNum / settings.itemsPerPage) * settings.itemsPerPage); - - element.dateStart = tools.getMinDate(element); - element.dateEnd = tools.getMaxDate(element); - - - /* core.render(element); */ - core.waitToggle(element, true, function () { core.render(element); }); - }, - - // **Render the grid** - render: function (element) { - var content = $('
'); - var $leftPanel = core.leftPanel(element); - content.append($leftPanel); - var $rightPanel = core.rightPanel(element, $leftPanel); - var mLeft, hPos; - - content.append($rightPanel); - content.append(core.navigation(element)); - - var $dataPanel = $rightPanel.find(".dataPanel"); - - element.gantt = $('
').append(content); - - $(element).empty().append(element.gantt); - - element.scrollNavigation.panelMargin = parseInt($dataPanel.css("margin-left").replace("px", ""), 10); - element.scrollNavigation.panelMaxPos = ($dataPanel.width() - $rightPanel.width()); - - element.scrollNavigation.canScroll = ($dataPanel.width() > $rightPanel.width()); - - core.markNow(element); - core.fillData(element, $dataPanel, $leftPanel); - - // Set a cookie to record current position in the view - if (settings.useCookie) { - var sc = $.cookie(this.cookieKey + "ScrollPos"); - if (sc) { - element.hPosition = sc; - } - } - - // Scroll the grid to today's date - if (settings.scrollToToday) { - core.navigateTo(element, 'now'); - core.scrollPanel(element, 0); - // or, scroll the grid to the left most date in the panel - } else { - if (element.hPosition !== 0) { - if (element.scaleOldWidth) { - mLeft = ($dataPanel.width() - $rightPanel.width()); - hPos = mLeft * element.hPosition / element.scaleOldWidth; - hPos = hPos > 0 ? 0 : hPos; - $dataPanel.css({ "margin-left": hPos + "px" }); - element.scrollNavigation.panelMargin = hPos; - element.hPosition = hPos; - element.scaleOldWidth = null; - } else { - $dataPanel.css({ "margin-left": element.hPosition + "px" }); - element.scrollNavigation.panelMargin = element.hPosition; - } - } - core.repositionLabel(element); - } - - $dataPanel.css({ height: $leftPanel.height() }); - core.waitToggle(element, false); - settings.onRender(); - }, - - // Create and return the left panel with labels - leftPanel: function (element) { - /* Left panel */ - var ganttLeftPanel = $('
') - .append($('
') - .css("height", tools.getCellSize() * element.headerRows + "px") - .css("width", "100%")); - - var entries = []; - $.each(element.data, function (i, entry) { - if (i >= element.pageNum * settings.itemsPerPage && i < (element.pageNum * settings.itemsPerPage + settings.itemsPerPage)) { - entries.push('
'); - entries.push('' + (entry.name || '') + ''); - entries.push('
'); - - if (entry.desc) { - entries.push('
'); - entries.push('' + entry.desc + ''); - entries.push('
'); - } - - } - }); - ganttLeftPanel.append(entries.join("")); - return ganttLeftPanel; - }, - - // Create and return the data panel element - dataPanel: function (element, width) { - var dataPanel = $('
'); - - // Handle mousewheel events for scrolling the data panel - // var wheel = 'onwheel' in element ? 'wheel' : document.onmousewheel !== undefined ? 'mousewheel' : 'DOMMouseScroll'; - // $(element).on(wheel, function (e) { core.wheelScroll(element, e); }); - - // Handle click events and dispatch to registered `onAddClick` - // function - dataPanel.click(function (e) { - - e.stopPropagation(); - var corrX/* <- never used? */, corrY; - var leftpanel = $(element).find(".fn-gantt .leftPanel"); - var datapanel = $(element).find(".fn-gantt .dataPanel"); - switch (settings.scale) { - case "weeks": - corrY = tools.getCellSize() * 2; - break; - case "months": - corrY = tools.getCellSize(); - break; - case "hours": - corrY = tools.getCellSize() * 4; - break; - case "days": - corrY = tools.getCellSize() * 3; - break; - default: - corrY = tools.getCellSize() * 2; - break; - } - - /* Adjust, so get middle of elm - corrY -= Math.floor(tools.getCellSize() / 2); - */ - - // Find column where click occurred - var col = core.elementFromPoint(e.pageX, datapanel.offset().top + corrY); - // Was the label clicked directly? - if (col.className === "fn-label") { - col = $(col.parentNode); - } else { - col = $(col); - } - - var dt = col.attr("repdate"); - // Find row where click occurred - var row = core.elementFromPoint(leftpanel.offset().left + leftpanel.width() - 10, e.pageY); - // Was the lable clicked directly? - if (row.className.indexOf("fn-label") === 0) { - row = $(row.parentNode); - } else { - row = $(row); - } - var rowId = row.data().id; - - // Dispatch user registered function with the DateTime in ms - // and the id if the clicked object is a row - settings.onAddClick(dt, rowId); - }); - return dataPanel; - }, - - // Creates and return the right panel containing the year/week/day - // header - rightPanel: function (element, leftPanel /* <- never used? */) { - - var range = null; - // Days of the week have a class of one of - // `sn` (Sunday), `sa` (Saturday), or `wd` (Weekday) - var dowClass = ["sn", "wd", "wd", "wd", "wd", "wd", "sa"]; - //TODO: was someone planning to allow styles to stretch to the bottom of the chart? - //var gridDowClass = [" sn", "", "", "", "", "", " sa"]; - - var yearArr = ['
']; - var daysInYear = 0; - - var monthArr = ['
']; - var daysInMonth = 0; - - var dayArr = []; - - var hoursInDay = 0; - - var dowArr = []; - - var horArr = []; - - - var today = new Date(); - today = new Date(today.getFullYear(), today.getMonth(), today.getDate()); - - // Setup the headings based on the chosen `settings.scale` - switch (settings.scale) { - // **Hours** - case "hours": - - range = tools.parseTimeRange(element.dateStart, element.dateEnd, element.scaleStep); - - var year = range[0].getFullYear(); - var month = range[0].getMonth(); - var day = range[0]; - - for (var i = 0, len = range.length; i < len; i++) { - var rday = range[i]; - - // Fill years - var rfy = rday.getFullYear(); - if (rfy !== year) { - yearArr.push( - ('
' - + year - + '
')); - - year = rfy; - daysInYear = 0; - } - daysInYear++; - - - // Fill months - var rm = rday.getMonth(); - if (rm !== month) { - monthArr.push( - ('
' - + settings.months[month] - + '
')); - - month = rm; - daysInMonth = 0; - } - daysInMonth++; - - - // Fill days & hours - - var rgetDay = rday.getDay(); - var getDay = day.getDay(); - var day_class = dowClass[rgetDay]; - if (tools.isHoliday(rday)) { - day_class = "holiday"; - } - if (rgetDay !== getDay) { - var day_class2 = (today - day === 0) ? "today" : tools.isHoliday( day.getTime() ) ? "holiday" : dowClass[getDay]; - - dayArr.push('
' - + '
' + day.getDate() + '
'); - dowArr.push('
' - + '
' + settings.dow[getDay] + '
'); - - day = rday; - hoursInDay = 0; - } - hoursInDay++; - - horArr.push('
' - + rday.getHours() - + '
'); - } - - - // Last year - yearArr.push( - '
' - + year - + '
'); - - // Last month - monthArr.push( - '
' - + settings.months[month] - + '
'); - - var day_class = dowClass[day.getDay()]; - - if ( tools.isHoliday(day) ) { - day_class = "holiday"; - } - - dayArr.push('
' - + '
' + day.getDate() + '
'); - - dowArr.push('
' - + '
' + settings.dow[day.getDay()] + '
'); - - var dataPanel = core.dataPanel(element, range.length * tools.getCellSize()); - - - // Append panel elements - dataPanel.append(yearArr.join("")); - dataPanel.append(monthArr.join("")); - dataPanel.append($('
').html(dayArr.join(""))); - dataPanel.append($('
').html(dowArr.join(""))); - dataPanel.append($('
').html(horArr.join(""))); - - break; - - // **Weeks** - case "weeks": - range = tools.parseWeeksRange(element.dateStart, element.dateEnd); - yearArr = ['
']; - monthArr = ['
']; - var year = range[0].getFullYear(); - var month = range[0].getMonth(); - var day = range[0]; - - for (var i = 0, len = range.length; i < len; i++) { - var rday = range[i]; - - // Fill years - if (rday.getFullYear() !== year) { - yearArr.push( - ('
' - + year - + '
')); - year = rday.getFullYear(); - daysInYear = 0; - } - daysInYear++; - - // Fill months - if (rday.getMonth() !== month) { - monthArr.push( - ('
' - + settings.months[month] - + '
')); - month = rday.getMonth(); - daysInMonth = 0; - } - daysInMonth++; - - // Fill weeks - dayArr.push('
' - + '
' + rday.getWeekOfYear() + '
'); - } - - - // Last year - yearArr.push( - '
' - + year - + '
'); - - // Last month - monthArr.push( - '
' - + settings.months[month] - + '
'); - - var dataPanel = core.dataPanel(element, range.length * tools.getCellSize()); - - dataPanel.append(yearArr.join("") + monthArr.join("") + dayArr.join("") + (dowArr.join(""))); - - break; - - // **Months** - case 'months': - range = tools.parseMonthsRange(element.dateStart, element.dateEnd); - - var year = range[0].getFullYear(); - var month = range[0].getMonth(); - var day = range[0]; - - for (var i = 0, len = range.length; i < len; i++) { - var rday = range[i]; - - // Fill years - if (rday.getFullYear() !== year) { - yearArr.push( - ('
' - + year - + '
')); - year = rday.getFullYear(); - daysInYear = 0; - } - daysInYear++; - monthArr.push('
' + (1 + rday.getMonth()) + '
'); - } - - - // Last year - yearArr.push( - '
' - + year - + '
'); - - // Last month - monthArr.push( - '
' - + settings.months[month] - + '
'); - - var dataPanel = core.dataPanel(element, range.length * tools.getCellSize()); - - // Append panel elements - dataPanel.append(yearArr.join("")); - dataPanel.append(monthArr.join("")); - dataPanel.append($('
').html(dayArr.join(""))); - dataPanel.append($('
').html(dowArr.join(""))); - - break; - - // **Days (default)** - default: - range = tools.parseDateRange(element.dateStart, element.dateEnd); - - var dateBefore = ktkGetNextDate(range[0], -1); - var year = dateBefore.getFullYear(); - var month = dateBefore.getMonth(); - var day = dateBefore; // <- never used? - - for (var i = 0, len = range.length; i < len; i++) { - var rday = range[i]; - - // Fill years - if (rday.getFullYear() !== year) { - yearArr.push( - ('
' - + year - + '
')); - year = rday.getFullYear(); - daysInYear = 0; - } - daysInYear++; - - // Fill months - if (rday.getMonth() !== month) { - monthArr.push( - ('
' - + settings.months[month] - + '
')); - month = rday.getMonth(); - daysInMonth = 0; - } - daysInMonth++; - - var getDay = rday.getDay(); - var day_class = dowClass[getDay]; - if ( tools.isHoliday(rday) ) { - day_class = "holiday"; - } - - dayArr.push('
' - + '
' + rday.getDate() + '
'); - dowArr.push('
' - + '
' + settings.dow[getDay] + '
'); - } //for - - // Last year - yearArr.push( - '
' - + year - + '
'); - - // Last month - monthArr.push( - '
' - + settings.months[month] - + '
'); - - var dataPanel = core.dataPanel(element, range.length * tools.getCellSize()); - - - // Append panel elements - - dataPanel.append(yearArr.join("")); - dataPanel.append(monthArr.join("")); - dataPanel.append($('
').html(dayArr.join(""))); - dataPanel.append($('
').html(dowArr.join(""))); - - break; - } - - return $('
').append(dataPanel); - }, - - // **Navigation** - navigation: function (element) { - var ganttNavigate = null; - // Scrolling navigation is provided by setting - // `settings.navigate='scroll'` - if (settings.navigate === "scroll") { - ganttNavigate = $('