diff --git a/app/Domain/Canvas/Controllers/EditCanvasComment.php b/app/Domain/Canvas/Controllers/EditCanvasComment.php index fe6c339a83..6e088e2dbf 100644 --- a/app/Domain/Canvas/Controllers/EditCanvasComment.php +++ b/app/Domain/Canvas/Controllers/EditCanvasComment.php @@ -258,6 +258,7 @@ public function post($params) return Frontcontroller::redirect(BASE_URL . '/' . static::CANVAS_NAME . 'canvas' . '/editCanvasComment/' . $_GET['id']); } + $this->tpl->assign('id', $_GET['id']); $this->tpl->assign('canvasTypes', $this->canvasRepo->getCanvasTypes()); $this->tpl->assign('canvasItem', $this->canvasRepo->getSingleCanvasItem($_GET['id'])); return $this->tpl->displayPartial(static::CANVAS_NAME . 'canvas.canvasComment'); diff --git a/app/Domain/Canvas/Controllers/ShowCanvas.php b/app/Domain/Canvas/Controllers/ShowCanvas.php index d1d8caeffc..cdb55325bc 100644 --- a/app/Domain/Canvas/Controllers/ShowCanvas.php +++ b/app/Domain/Canvas/Controllers/ShowCanvas.php @@ -255,6 +255,12 @@ public function run() } } + $filter['status'] = $_GET['filter_status'] ?? (session('filter_status') ?? 'all'); + session(['filter_status' => $filter['status']]); + $filter['relates'] = $_GET['filter_relates'] ?? (session('filter_relates') ?? 'all'); + session(['filter_relates' => $filter['relates']]); + + $this->tpl->assign('filter', $filter); $this->tpl->assign('currentCanvas', $currentCanvasId); $this->tpl->assign('canvasIcon', $this->canvasRepo->getIcon()); $this->tpl->assign('canvasTypes', $this->canvasRepo->getCanvasTypes()); diff --git a/app/Domain/Goalcanvas/Controllers/Dashboard.php b/app/Domain/Goalcanvas/Controllers/Dashboard.php index b2f70629a9..d1ba321dee 100644 --- a/app/Domain/Goalcanvas/Controllers/Dashboard.php +++ b/app/Domain/Goalcanvas/Controllers/Dashboard.php @@ -39,8 +39,7 @@ public function init( ) { $this->projectService = $projectService; $this->goalService = $goalService; - $canvasName = Str::studly(static::CANVAS_NAME) . 'canvas'; - $repoName = app()->getNamespace() . "Domain\\$canvasName\\Repositories\\$canvasName"; + $repoName = app()->getNamespace() . "Domain\\goalcanvas\\Repositories\\goalcanvas"; $this->canvasRepo = app()->make($repoName); } @@ -305,6 +304,12 @@ public function run() } } + $filter['status'] = $_GET['filter_status'] ?? (session("filter_status") ?? 'all'); + session(["filter_status" => $filter['status']]); + $filter['relates'] = $_GET['filter_relates'] ?? (session("filter_relates") ?? 'all'); + session(["filter_relates" => $filter['relates']]); + + $this->tpl->assign('filter', $filter); $this->tpl->assign('currentCanvas', $currentCanvasId); $this->tpl->assign('goalStats', $goalAnalytics); $this->tpl->assign('canvasIcon', $this->canvasRepo->getIcon()); diff --git a/app/Domain/Goalcanvas/Controllers/DelCanvas.php b/app/Domain/Goalcanvas/Controllers/DelCanvas.php index 151d33af9c..c5aac1087c 100644 --- a/app/Domain/Goalcanvas/Controllers/DelCanvas.php +++ b/app/Domain/Goalcanvas/Controllers/DelCanvas.php @@ -1,16 +1,68 @@ getNamespace() . "Domain\\goalcanvas\\Repositories\\goalcanvas"; + $this->canvasRepo = app()->make($repoName); + } + + /** + * run - display template and edit data + * + * @access public + */ + public function run() + { + + Auth::authOrRedirect([Roles::$owner, Roles::$admin, Roles::$manager, Roles::$editor]); + + if (isset($_POST['del']) && isset($_GET['id'])) { + $id = (int)($_GET['id']); + $this->canvasRepo->deleteCanvas($id); + + $allCanvas = $this->canvasRepo->getAllCanvas(session("currentProject")); + session(["current' . strtoupper(static::CANVAS_NAME) . 'Canvas" => $allCanvas[0]['id'] ?? -1]); + + $this->tpl->setNotification($this->language->__('notification.board_deleted'), 'success', strtoupper(static::CANVAS_NAME) . 'canvas_deleted'); + + $allCanvas = $this->canvasRepo->getAllCanvas(session("currentProject")); + + //Create default canvas. + if (!$allCanvas || count($allCanvas) == 0) { + return Frontcontroller::redirect(BASE_URL . '/strategy/showBoards'); + } else { + return Frontcontroller::redirect(BASE_URL . '/' . static::CANVAS_NAME . 'canvas/showCanvas'); + } + } + + return $this->tpl->displayPartial(static::CANVAS_NAME . 'canvas.delCanvas'); + } } } diff --git a/app/Domain/Goalcanvas/Controllers/DelCanvasItem.php b/app/Domain/Goalcanvas/Controllers/DelCanvasItem.php index 81e5e8b9c0..b1a56ca705 100644 --- a/app/Domain/Goalcanvas/Controllers/DelCanvasItem.php +++ b/app/Domain/Goalcanvas/Controllers/DelCanvasItem.php @@ -1,17 +1,56 @@ getNamespace() . "Domain\\goalcanvas\\Repositories\\goalcanvas"; + $this->canvasRepo = app()->make($repoName); + } + + /** + * run - display template and edit data + * + * @access public + */ + public function run() + { + Auth::authOrRedirect([Roles::$owner, Roles::$admin, Roles::$manager, Roles::$editor]); + + if (isset($_POST['del']) && isset($_GET['id'])) { + $id = (int)($_GET['id']); + $this->canvasRepo->delCanvasItem($id); + + $this->tpl->setNotification($this->language->__('notification.element_deleted'), 'success', strtoupper(static::CANVAS_NAME) . 'canvasitem_deleted'); + return Frontcontroller::redirect(BASE_URL . '/' . static::CANVAS_NAME . 'canvas/showCanvas'); + } + + return $this->tpl->displayPartial(static::CANVAS_NAME . 'canvas.delCanvasItem'); + } + } } diff --git a/app/Domain/Goalcanvas/Controllers/EditCanvasComment.php b/app/Domain/Goalcanvas/Controllers/EditCanvasComment.php index 54e4f61917..18826e22e0 100644 --- a/app/Domain/Goalcanvas/Controllers/EditCanvasComment.php +++ b/app/Domain/Goalcanvas/Controllers/EditCanvasComment.php @@ -1,17 +1,285 @@ ticketRepo = $ticketRepo; + $this->commentsRepo = $commentsRepo; + $this->sprintService = $sprintService; + $this->ticketService = $ticketService; + $this->projectService = $projectService; + + $repoName = app()->getNamespace() . "Domain\\goalcanvas\\Repositories\\goalcanvas"; + $this->canvasRepo = app()->make($repoName); + } + + /** + * get - handle get requests + * + * @access public + * + */ + public function get($params) + { + + $canvasTypes = $this->canvasRepo->getCanvasTypes(); + if (isset($params['id'])) { + // Delete comment + if (isset($params['delComment']) === true) { + $commentId = (int)($params['delComment']); + $this->commentsRepo->deleteComment($commentId); + $this->tpl->setNotification($this->language->__('notifications.comment_deleted'), 'success', strtoupper(static::CANVAS_NAME) . 'canvascomment_deleted'); + } + + $canvasItem = $this->canvasRepo->getSingleCanvasItem($params['id']); + + $comments = $this->commentsRepo->getComments(static::CANVAS_NAME . 'canvasitem', $canvasItem['id']); + $this->tpl->assign('numComments', $this->commentsRepo->countComments(static::CANVAS_NAME . 'canvasitem', $canvasItem['id'])); + } else { + if (isset($params['type'])) { + $type = strip_tags($params['type']); + } else { + $type = array_key_first($canvasTypes); + } + + $canvasItem = array( + 'id' => '', + 'box' => $type, + 'description' => '', + 'status' => array_key_first($this->canvasRepo->getStatusList()), + 'relates' => array_key_first($this->canvasRepo->GetRelatesList()), + 'assumptions' => '', + 'data' => '', + 'conclusion' => '', + 'milestoneHeadline' => '', + 'milestoneId' => '', + ); + + $comments = []; + } + + $this->tpl->assign('comments', $comments); + + $this->tpl->assign('canvasTypes', $canvasTypes); + $this->tpl->assign('canvasItem', $canvasItem); + return $this->tpl->displayPartial(static::CANVAS_NAME . 'canvas.canvasComment'); + } + + /** + * post - handle post requests + * + * @access public + * + */ + public function post($params) + { + + if (isset($params['changeItem'])) { + if (isset($params['itemId']) && $params['itemId'] != '') { + if (isset($params['description']) && !empty($params['description'])) { + $currentCanvasId = (int)session("current" . strtoupper(static::CANVAS_NAME) . "Canvas"); + + $canvasItem = array( + 'box' => $params['box'], + 'author' => session("userdata.id"), + 'description' => $params['description'], + 'status' => $params['status'], + 'relates' => $params['relates'], + 'assumptions' => $params['assumptions'], + 'data' => $params['data'], + 'conclusion' => $params['conclusion'], + 'itemId' => $params['itemId'], + 'id' => $params['itemId'], + 'canvasId' => $currentCanvasId, + 'milestoneId' => $params['milestoneId'], + 'dependentMilstone' => '', + ); + + $this->canvasRepo->editCanvasComment($canvasItem); + + $comments = $this->commentsRepo->getComments(static::CANVAS_NAME . 'canvasitem', $params['itemId']); + $this->tpl->assign('numComments', $this->commentsRepo->countComments( + static::CANVAS_NAME . 'canvasitem', + $params['itemId'] + )); + $this->tpl->assign('comments', $comments); + + $this->tpl->setNotification($this->language->__('notifications.canvas_item_updates'), 'success', strtoupper(static::CANVAS_NAME) . 'canvasitem_updated'); + + + $notification = app()->make(NotificationModel::class); + $notification->url = array( + "url" => BASE_URL . '/' . static::CANVAS_NAME . 'canvas' . '/editCanvasComment/' . (int)$params['itemId'], + "text" => $this->language->__('email_notifications.canvas_item_update_cta'), + ); + $notification->entity = $canvasItem; + $notification->module = static::CANVAS_NAME . 'canvas'; + $notification->projectId = session("currentProject"); + $notification->subject = $this->language->__('email_notifications.canvas_board_edited'); + $notification->authorId = session("userdata.id"); + $notification->message = sprintf( + $this->language->__('email_notifications.canvas_item_update_message'), + session("userdata.name"), + $canvasItem['description'] + ); + + $this->projectService->notifyProjectUsers($notification); + + return Frontcontroller::redirect(BASE_URL . '/' . static::CANVAS_NAME . 'canvas' . '/editCanvasComment/' . $params['itemId']); + } else { + $this->tpl->setNotification($this->language->__('notification.please_enter_element_title'), 'error'); + } + } else { + if (isset($_POST['description']) && !empty($_POST['description'])) { + $currentCanvasId = (int)session("current" . strtoupper(static::CANVAS_NAME) . "Canvas"); + + $canvasItem = array( + 'box' => $params['box'], + 'author' => session("userdata.id"), + 'description' => $params['description'], + 'status' => $params['status'], + 'relates' => $params['relates'], + 'assumptions' => $params['assumptions'], + 'data' => $params['data'], + 'conclusion' => $params['conclusion'], + 'canvasId' => $currentCanvasId, + ); + + $id = $this->canvasRepo->addCanvasItem($canvasItem); + + $canvasItem['id'] = $id; + + $canvasTypes = $this->canvasRepo->getCanvasTypes(); + + $this->tpl->setNotification($canvasTypes[$params['box']] . ' successfully created', 'success', strtoupper(static::CANVAS_NAME) . 'canvasitem_created'); + + + $notification = app()->make(NotificationModel::class); + $notification->url = array( + "url" => BASE_URL . '/' . static::CANVAS_NAME . 'canvas' . '/editCanvasComment/' . (int)$params['itemId'], + "text" => $this->language->__('email_notifications.canvas_item_update_cta'), + ); + $notification->entity = $canvasItem; + $notification->module = static::CANVAS_NAME . 'canvas'; + $notification->projectId = session("currentProject"); + $notification->subject = $this->language->__('email_notifications.canvas_board_item_created'); + $notification->authorId = session("userdata.id"); + $notification->message = sprintf( + $this->language->__('email_notifications.canvas_item_created_message'), + session("userdata.name"), + $canvasItem['description'] + ); + + $this->projectService->notifyProjectUsers($notification); + + $this->tpl->setNotification($this->language->__('notification.element_created'), 'success', strtoupper(static::CANVAS_NAME) . 'canvasitem_created'); + + return Frontcontroller::redirect(BASE_URL . '/' . static::CANVAS_NAME . 'canvas' . '/editCanvasComment/' . $id); + } else { + $this->tpl->setNotification($this->language->__('notification.please_enter_element_title'), 'error'); + } + } + } + + if (isset($params['comment']) === true) { + $values = array( + 'text' => $params['text'], + 'date' => date('Y-m-d H:i:s'), + 'userId' => (session("userdata.id")), + 'moduleId' => $_GET['id'], + 'commentParent' => ($params['father']), + ); + + $message = $this->commentsRepo->addComment($values, static::CANVAS_NAME . 'canvasitem'); + $this->tpl->setNotification($this->language->__('notifications.comment_create_success'), 'success', strtoupper(static::CANVAS_NAME) . 'canvasitemcomment_created'); + + $notification = app()->make(NotificationModel::class); + $notification->url = array( + "url" => BASE_URL . '/' . static::CANVAS_NAME . 'canvas' . '/editCanvasComment/' . (int)$_GET['id'], + "text" => $this->language->__('email_notifications.canvas_item_update_cta'), + ); + $notification->entity = $values; + $notification->module = static::CANVAS_NAME . 'canvas'; + $notification->projectId = session("currentProject"); + $notification->subject = $this->language->__('email_notifications.canvas_board_comment_created'); + $notification->authorId = session("userdata.id"); + $notification->message = sprintf( + $this->language->__('email_notifications.canvas_item__comment_created_message'), + session("userdata.name") + ); + + $this->projectService->notifyProjectUsers($notification); + + + return Frontcontroller::redirect(BASE_URL . '/' . static::CANVAS_NAME . 'canvas' . '/editCanvasComment/' . $_GET['id']); + } + + $this->tpl->assign('canvasTypes', $this->canvasRepo->getCanvasTypes()); + $this->tpl->assign('canvasItem', $this->canvasRepo->getSingleCanvasItem($_GET['id'])); + return $this->tpl->displayPartial(static::CANVAS_NAME . 'canvas.canvasComment'); + } + + /** + * put - handle put requests + * + * @access public + * + */ + public function put($params) + { + } + + /** + * delete - handle delete requests + * + * @access public + * + */ + public function delete($params) + { + } + } } diff --git a/app/Domain/Goalcanvas/Controllers/EditCanvasItem.php b/app/Domain/Goalcanvas/Controllers/EditCanvasItem.php index bff0b2bc8c..5c59614114 100644 --- a/app/Domain/Goalcanvas/Controllers/EditCanvasItem.php +++ b/app/Domain/Goalcanvas/Controllers/EditCanvasItem.php @@ -116,6 +116,8 @@ public function get($params): Response $comments = []; } + $this->tpl->assign('id', $canvasItem['id']??""); + $this->tpl->assign('canvasId', $canvasItem['canvasId']); $this->tpl->assign('comments', $comments); @@ -123,6 +125,7 @@ public function get($params): Response $allProjectMilestones = $this->ticketService->getAllMilestones(["sprint" => '', "type" => "milestone", "currentProject" => session("currentProject")]); $this->tpl->assign('milestones', $allProjectMilestones); + $this->tpl->assign('currentCanvas', $canvasItem['canvasId']); $this->tpl->assign('canvasItem', $canvasItem); $this->tpl->assign('canvasIcon', $this->canvasRepo->getIcon()); @@ -283,8 +286,7 @@ public function post($params): Response 'metricType' => $params['metricType'], 'assignedTo' => $params['assignedTo'] ?? '', ); - - $id = $this->canvasRepo->addCanvasItem($canvasItem); + $id = $this->canvasRepo->addCanvasItem($canvasItem); $canvasTypes = $this->canvasRepo->getCanvasTypes(); $this->tpl->setNotification($canvasTypes[$params['box']]['title'] . ' successfully created', 'success', "goal_item_created"); diff --git a/app/Domain/Goalcanvas/Controllers/ShowCanvas.php b/app/Domain/Goalcanvas/Controllers/ShowCanvas.php index 5fda1347a2..8ab9fa51df 100644 --- a/app/Domain/Goalcanvas/Controllers/ShowCanvas.php +++ b/app/Domain/Goalcanvas/Controllers/ShowCanvas.php @@ -36,8 +36,7 @@ public function init(Projects $projectService, Goalcanvas $goalService) { $this->projectService = $projectService; $this->goalService = $goalService; - $canvasName = Str::studly(static::CANVAS_NAME) . 'canvas'; - $repoName = app()->getNamespace() . "Domain\\$canvasName\\Repositories\\$canvasName"; + $repoName = app()->getNamespace() . "Domain\\goalcanvas\\Repositories\\goalcanvas"; $this->canvasRepo = app()->make($repoName); } diff --git a/app/Domain/Goalcanvas/Templates/bigRockDialog.blade.php b/app/Domain/Goalcanvas/Templates/bigRockDialog.blade.php index 8dd5e8618e..1388cf0b08 100644 --- a/app/Domain/Goalcanvas/Templates/bigRockDialog.blade.php +++ b/app/Domain/Goalcanvas/Templates/bigRockDialog.blade.php @@ -1,19 +1,19 @@

- {{ empty($bigRock["title"]) ? __('label.create_new_goalboard') : __('label.goalboard') }} {{ $bigRock["title"] }}

+ {{ empty($bigRock['title']) ? __('label.create_new_goalboard') : __('label.goalboard') }} {{ $bigRock['title'] }} + -{!! $tpl->displayNotification(); !!} - -
+
-
+

- +
@@ -23,26 +23,25 @@ - diff --git a/app/Domain/Goalcanvas/Templates/canvasComment.blade.php b/app/Domain/Goalcanvas/Templates/canvasComment.blade.php new file mode 100644 index 0000000000..013455dc03 --- /dev/null +++ b/app/Domain/Goalcanvas/Templates/canvasComment.blade.php @@ -0,0 +1,65 @@ +@extends($layout) +@section('content') + +@php + +/** +* canvasComment.inc template - Generic template for comments +* +*/ + + + +@endphp + + + + + + + + +@endsection diff --git a/app/Domain/Goalcanvas/Templates/canvasComment.tpl.php b/app/Domain/Goalcanvas/Templates/canvasComment.tpl.php deleted file mode 100644 index de9180cf57..0000000000 --- a/app/Domain/Goalcanvas/Templates/canvasComment.tpl.php +++ /dev/null @@ -1,13 +0,0 @@ - $val) { - $$var = $val; // necessary for blade refactor -} -echo $tpl->viewFactory->make( - $tpl->getTemplatePath('canvas', 'canvasComment'), - array_merge($__data, ['canvasName' => 'goal']) -)->render(); diff --git a/app/Domain/Goalcanvas/Templates/canvasDialog.blade.php b/app/Domain/Goalcanvas/Templates/canvasDialog.blade.php new file mode 100644 index 0000000000..4409efab0f --- /dev/null +++ b/app/Domain/Goalcanvas/Templates/canvasDialog.blade.php @@ -0,0 +1,167 @@ +@extends($layout) +@section('content') + + +
+ +

+ {{ $canvasTypes[$canvasItem['box']]['title'] }}

+ + +
+ + + + + + + +
+ +
+ + @if (!empty($relatesLabels)) + +
+ @else + + @endif +
+

+ {{ __('Metrics') }}

+ + @dispatchEvent('beforeMeasureGoalContainer', $canvasItem) +
+ +
+
+ +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+ @if ($login::userIsAtLeast($roles::$editor)) + + + @endif + + @if ($id !== '') +


+ +

{{ $tpl->__('subtitles.discussion') }}

+ @php + $tpl->assign('formUrl', '/goalcanvas/editCanvasItem/' . $id . ''); + $tpl->displaySubmodule('comments-generalComment'); + @endphp + @endif +
+ + @if ($id != '') + + {{ __('links.delete') }} + + @endif + +
+ + +
+ + +@endsection diff --git a/app/Domain/Goalcanvas/Templates/canvasDialog.tpl.php b/app/Domain/Goalcanvas/Templates/canvasDialog.tpl.php deleted file mode 100644 index 20cc318ca3..0000000000 --- a/app/Domain/Goalcanvas/Templates/canvasDialog.tpl.php +++ /dev/null @@ -1,307 +0,0 @@ - $val) { - $$var = $val; // necessary for blade refactor -} -$canvasName = 'goal'; - - -/** - * canvasDialog.inc template - Generic template for comments - * - * Required variables: - * - $canvasName Name of current canvas - */ -defined('RESTRICTED') or die('Restricted access'); - -$canvasItem = $tpl->get('canvasItem'); -$canvasTypes = $tpl->get('canvasTypes'); -$hiddenStatusLabels = $tpl->get('statusLabels'); -$statusLabels = $statusLabels ?? $hiddenStatusLabels; -$hiddenRelatesLabels = $tpl->get('relatesLabels'); -$relatesLabels = $relatesLabels ?? $hiddenRelatesLabels; -$dataLabels = $tpl->get('dataLabels'); - -$id = ""; -if (isset($canvasItem['id']) && $canvasItem['id'] != '') { - $id = $canvasItem['id']; -} - -$currentCanvas = $tpl->get('currentCanvas'); - -if (isset($_GET['canvasId'])) { - $currentCanvas = (int)$_GET['canvasId']; -} -?> - - - -
- -

- - displayNotification(); ?> - -
- - - - - - - -
-
- - - -
- - - -
- - - -
-

__("Metrics") ?>

- - - dispatchTplEvent('beforeMeasureGoalContainer', $canvasItem); ?> -
- -
-
- -
-
- - -
-
- - - - style="width:105px"/> -
-
- - -
-
- - -
-
- -
- - " id="primaryCanvasSubmitButton"/> - - - - - - -


- -

__('subtitles.discussion'); ?>

- assign("formUrl", "/strategyPro/editCanvasItem/" . $id . ""); - $tpl->displaySubmodule('comments-generalComment');?> - -
- -
- - - - -

- - - - - - - - - - - -

Dates

- - - - - - - - - -

-

__("headlines.linked_milestone") ?> ">

- - - - -
-

__("headlines.no_milestone_link") ?>

-
- - - -
- - - - -
- - - - -
-
- __("label.loading_milestone") ?> -
-
- __("links.remove") ?> - - - - - - - - -
-
- - - __("links.delete") ?> - - -
- - -
- - diff --git a/app/Domain/Goalcanvas/Templates/dashboard.blade.php b/app/Domain/Goalcanvas/Templates/dashboard.blade.php new file mode 100644 index 0000000000..90e1a10977 --- /dev/null +++ b/app/Domain/Goalcanvas/Templates/dashboard.blade.php @@ -0,0 +1,368 @@ +@extends($layout) +@section('content') + +@php + +use Leantime\Domain\Comments\Repositories\Comments; +use Leantime\Domain\Goalcanvas\Services\Goalcanvas; + + +$elementName = 'goal'; + +/** + * showCanvasTop.inc template - Top part of the main canvas page + * + * Required variables: + * - goal Name of current canvas + */ + +$canvasTitle = ''; + +//get canvas title +foreach ($allCanvas as $canvasRow) { + if ($canvasRow["id"] == $currentCanvas) { + $canvasTitle = $canvasRow["title"]; + $canvasId = $canvasRow["id"]; + break; + } +} + +@endphp + + + + + +
+ +
+
+
+

Progress: {{ round($goalStats['avgPercentComplete']) }}%

+ +
+
+ {{ sprintf(__("text.percent_complete"), round($goalStats['avgPercentComplete'])) }} +
+
+
+
+
+
+
+

On Track

+ {{ $goalStats['goalsOnTrack'] }} +
+
+
+
+

At Risk

+ {{ $goalStats['goalsAtRisk'] }} +
+
+
+
+

Miss

+ {{ $goalStats['goalsMiss'] }} +
+
+
+ +
+
+
+
+ @if (count($allCanvas) > 0) + @foreach ($allCanvas as $canvasRow) + +
+ @php + $canvasSvc = app()->make(Goalcanvas::class); + $canvasItems = $canvasSvc->getCanvasItemsById($canvasRow["id"]); + @endphp +
+
+
+
+ @if (!is_countable($canvasItems) || count($canvasItems) == 0) +
No goals on this board yet. Open the board to start adding goals
+ @endif + @foreach ($canvasItems as $row) + @php + $filterStatus = $filter['status'] ?? 'all'; + $filterRelates = $filter['relates'] ?? 'all'; + @endphp + @if ($row['box'] === $elementName && ($filterStatus == 'all' || $filterStatus == $row['status']) && ($filterRelates == 'all' || $filterRelates == $row['relates'])) + @php + $comments = app()->make(Comments::class); + $nbcomments = $comments->countComments(moduleId: $row['id']); + @endphp +
+
+
+
+
+ @if ($login::userIsAtLeast($roles::$editor)) + + + + @endif + @if ($login::userIsAtLeast($roles::$editor)) +     + + @endif +
+ +

+ Goal: + + {{ $tpl->e($row["title"]) }} + +

+
+ Metric: {{ $tpl->escape($row["description"]) }} +

+ + @php + $percentDone = $row["goalProgress"]; + $metricTypeFront = ''; + $metricTypeBack = ''; + if ($row["metricType"] == "percent") { + $metricTypeBack = '%'; + } elseif ($row["metricType"] == "currency") { + $metricTypeFront = __("language.currency"); + } + @endphp + +
+
+
+ {{ sprintf(__("text.percent_complete"), $percentDone) }} +
+
+
+
+
+ {{ sprintf(__("text.percent_complete"), $percentDone) }} +
+
+
+
+ Start:
{{ $metricTypeFront . $row["startValue"] . $metricTypeBack }}
+
+
+ {{ __('label.current') }}:
{{ $metricTypeFront . $row["currentValue"] . $metricTypeBack }}
+
+
+ {{ __('label.goal') }}:
{{ $metricTypeFront . $row["endValue"] . $metricTypeBack }}
+
+
+ +
+ + @if (!empty($statusLabels)) + + @endif + + @if (!empty($relatesLabels)) + + @endif + + + +
+ + + + {{ $nbcomments }} +
+
+
+ + @if ($row['milestoneHeadline'] != '') +
+
+
+ {{ __("label.loading_milestone") }} +
+
+ @endif +
+
+ @endif + @endforeach +
+
+
+
+
+
+ @endforeach + @endif +
+ + + +{{-- + * showCanvasBottom.blade.php template - Bottom part of the main canvas page + * + * Required variables: + * - goal Name of current canvas +--}} + +@if (count($allCanvas) > 0) + {{-- --}} +@else +

+
+
+ {!! file_get_contents(ROOT . "/dist/images/svg/undraw_design_data_khdb.svg") !!} +
+

{{ __("headlines.goal.analysis") }}

+
{!! __("text.goal.helper_content") !!} + + @if ($login::userIsAtLeast($roles::$editor)) +

+ + {{ __("links.icon.create_new_board") }} + + @endif +
+@endif + +@if (!empty($disclaimer) && count($allCanvas) > 0) + {{ $disclaimer }} +@endif + +{!! $tpl->viewFactory->make($tpl->getTemplatePath('canvas', 'modals'), $__data)->render() !!} + +
+
+ + + +@endsection \ No newline at end of file diff --git a/app/Domain/Goalcanvas/Templates/dashboard.tpl.php b/app/Domain/Goalcanvas/Templates/dashboard.tpl.php deleted file mode 100644 index dddd1fcfb1..0000000000 --- a/app/Domain/Goalcanvas/Templates/dashboard.tpl.php +++ /dev/null @@ -1,724 +0,0 @@ - $val) { - $$var = $val; // necessary for blade refactor -} -$canvasName = 'goal'; -$elementName = 'goal'; - - -/** - * showCanvasTop.inc template - Top part of the main canvas page - * - * Required variables: - * - $canvasName Name of current canvas - */ - -$canvasTitle = ''; -$allCanvas = $tpl->get('allCanvas'); -$canvasIcon = $tpl->get('canvasIcon'); -$canvasTypes = $tpl->get('canvasTypes'); -$statusLabels = $statusLabels ?? $tpl->get('statusLabels'); -$relatesLabels = $relatesLabels ?? $tpl->get('relatesLabels'); -$dataLabels = $tpl->get('dataLabels'); -$disclaimer = $tpl->get('disclaimer'); -$canvasItems = $tpl->get('canvasItems'); - -$filter['status'] = $_GET['filter_status'] ?? (session("filter_status") ?? 'all'); -session(["filter_status" => $filter['status']]); -$filter['relates'] = $_GET['filter_relates'] ?? (session("filter_relates") ?? 'all'); -session(["filter_relates" => $filter['relates']]); - -//get canvas title -foreach ($tpl->get('allCanvas') as $canvasRow) { - if ($canvasRow["id"] == $tpl->get('currentCanvas')) { - $canvasTitle = $canvasRow["title"]; - $canvasId = $canvasRow["id"]; - break; - } -} - -$goalStats = $tpl->get("goalStats"); - -?> - - - - -
- - -displayNotification(); ?> - - - -
-
-
-

Progress: %

- -
-
- __("text.percent_complete"), round($goalStats['avgPercentComplete']))?> -
-
-
- -
-
-
-
-
-

On Track

- -
-
-
-
-

At Risk

- -
-
-
-
-

Miss

- - -
- -
-
- - - - -
-
-
- - -
-
- 0) {?> - get('allCanvas') as $canvasRow) { ?> - -
- make(Goalcanvas::class); - $canvasItems = $canvasSvc->getCanvasItemsById($canvasRow["id"]); - ?> -
" class="sortableTicketList disabled col-md-12" style="padding-top:15px;"> -
-
-
- - No goals on this board yet. Open the board to start adding goals
"; - } - ?> - make(Comments::class); - $nbcomments = $comments->countComments(moduleId: $row['id']); - ?> -
-
"> -
-
- - -

- Goal: - " - class="CanvasModal" - data="item_"> - e($row["title"]);?> - -

-
- Metric: escape($row["description"]) ?> -

- - __("language.currency"); - } - ?> - -
-
-
- - __("text.percent_complete"), $percentDone); ?> -
-
-
-
-
- __("text.percent_complete"), $percentDone)?> -
-
-
-
- Start:
-
-
- __('label.current') ?>:
-
-
- __('label.goal') ?>:
-
-
- -
- - - - - - - - - - - -
- - > -
- -
-
- - -
-
-
- __("label.loading_milestone") ?> -
-
- -
-
- - - - - -
-
- - - -
-
-
- -
- - - - - - - - - - -
- -
- -
-
-
- 0 && !empty($statusLabels)) {?> - - - - - - - -
- -
- 0 && !empty($relatesLabels)) {?> - - - - - - - -
- -
-
- -
- -
- - - - - - - - - - - - - - - - - - - - - get('allCanvas')) > 0) { ?> -
-
-
-
- make(\Leantime\Domain\Comments\Repositories\Comments::class); - $nbcomments = $comments->countComments(moduleId: $row['id']); - ?> -
-
"> -
-
- - -

" - class="CanvasModal" - data="item_">e($row["description"]);?>

-
- escape($row["assumptions"]) ?> -
- - - - -
- -
- __('label.current') ?>: -
-
- __("text.percent_complete"), $percentDone); ?> -
-
- __('label.goal') ?>: -
-
-
-
- __("text.percent_complete"), $percentDone)?> -
-
- -
- - - - - - - - - - - - -
- > -
- -
-
- - -
-
-
- 60 ? - $tpl->e(substr(($row['milestoneHeadline']), 0, 60) . " ...") : $tpl->e($row['milestoneHeadline']); ?> -
-
- __("text.percent_complete"), $row['percentDone'])?> -
-
-
-
-
-
- __("text.percent_complete"), $row['percentDone'])?> -
-
-
-
- -
-
- - - -
-
- - - -
-
-
- -
"; - - echo "
"; - echo file_get_contents(ROOT . "/dist/images/svg/undraw_design_data_khdb.svg"); - echo "
"; - - echo"

" . $tpl->__("headlines.goal.analysis") . "

"; - echo "
" . $tpl->__("text.goal.helper_content"); - - - echo"
"; - } ?> - - -
- - - */ - -echo $tpl->viewFactory->make( - $tpl->getTemplatePath('canvas', 'showCanvasBottom'), - array_merge($__data, ['canvasName' => 'goal']) -)->render(); ?> diff --git a/app/Domain/Goalcanvas/Templates/delCanvas.blade.php b/app/Domain/Goalcanvas/Templates/delCanvas.blade.php new file mode 100644 index 0000000000..4ad4588393 --- /dev/null +++ b/app/Domain/Goalcanvas/Templates/delCanvas.blade.php @@ -0,0 +1,15 @@ +@extends($layout) +@section('content') + +

{!!__("subtitles.delete") !!}

+ +
+ @if(isset($csrf_token)) + + @endif +

{{ __('text.confirm_board_deletion') }}


+ + {{ __('buttons.back') }} +
+ +@endsection \ No newline at end of file diff --git a/app/Domain/Goalcanvas/Templates/delCanvas.tpl.php b/app/Domain/Goalcanvas/Templates/delCanvas.tpl.php deleted file mode 100644 index 608a99bf40..0000000000 --- a/app/Domain/Goalcanvas/Templates/delCanvas.tpl.php +++ /dev/null @@ -1,13 +0,0 @@ - $val) { - $$var = $val; // necessary for blade refactor -} -echo $tpl->viewFactory->make( - $tpl->getTemplatePath('canvas', 'delCanvas'), - array_merge($__data, ['canvasName' => 'goal']) -)->render(); diff --git a/app/Domain/Goalcanvas/Templates/delCanvasItem.blade.php b/app/Domain/Goalcanvas/Templates/delCanvasItem.blade.php new file mode 100644 index 0000000000..455a37ed6b --- /dev/null +++ b/app/Domain/Goalcanvas/Templates/delCanvasItem.blade.php @@ -0,0 +1,12 @@ +@extends($layout) +@section('content') + +

{!! __("subtitles.delete") !!}

+
+ +
+

{{ __('text.confirm_board_item_deletion') }}


+ + {{ __('buttons.back') }} +
+@endsection diff --git a/app/Domain/Goalcanvas/Templates/delCanvasItem.tpl.php b/app/Domain/Goalcanvas/Templates/delCanvasItem.tpl.php deleted file mode 100644 index 155d8a1b4c..0000000000 --- a/app/Domain/Goalcanvas/Templates/delCanvasItem.tpl.php +++ /dev/null @@ -1,13 +0,0 @@ - $val) { - $$var = $val; // necessary for blade refactor -} -echo $tpl->viewFactory->make( - $tpl->getTemplatePath('canvas', 'delCanvasItem'), - array_merge($__data, ['canvasName' => 'goal']) -)->render(); diff --git a/app/Domain/Goalcanvas/Templates/showBottomCanvas.blade.php b/app/Domain/Goalcanvas/Templates/showBottomCanvas.blade.php new file mode 100644 index 0000000000..eb952ac662 --- /dev/null +++ b/app/Domain/Goalcanvas/Templates/showBottomCanvas.blade.php @@ -0,0 +1,66 @@ +@if (count($allCanvas) > 0) +@else +

+
+
+ {!! file_get_contents(ROOT . '/dist/images/svg/undraw_design_data_khdb.svg') !!} +
+ +

{{ __("headlines.goal.analysis") }}

+
{{ __("text.goal.helper_content") }} + + @if ($login::userIsAtLeast($roles::$editor)) +

+ + {{ __('links.icon.create_new_board') }} + + @endif +
+@endif + +@if (!empty($disclaimer) && count($allCanvas) > 0) + {{ $disclaimer }} +@endif + +{!! $tpl->viewFactory->make($tpl->getTemplatePath('canvas', 'modals'), $__data)->render() !!} +
+ + + + diff --git a/app/Domain/Goalcanvas/Templates/showCanvas.blade.php b/app/Domain/Goalcanvas/Templates/showCanvas.blade.php new file mode 100644 index 0000000000..881d6de6c3 --- /dev/null +++ b/app/Domain/Goalcanvas/Templates/showCanvas.blade.php @@ -0,0 +1,488 @@ +@extends($layout) +@section('content') + + + @php + $elementName = 'goal'; + + @endphp + + @php + + $canvasTitle = ''; + + //get canvas title + foreach ($allCanvas as $canvasRow) { + if ($canvasRow['id'] == $currentCanvas) { + $canvasTitle = $canvasRow['title']; + break; + } + } + + $tpl->assign('canvasTitle', $canvasTitle); + + @endphp + + + + + +
+
+ + displayNotification(); ?> + +
+
+ @if ($login::userIsAtLeast($roles::$editor) && count($canvasTypes) == 1 && count($allCanvas) > 0) + {!! __('links.add_new_canvas_itemgoal') !!} + @endif +
+ +
+
+ +
+
+
+ @if (count($allCanvas) > 0 && !empty($statusLabels)) + @if ($filter['status'] == 'all') + + @else + + @endif + + @endif +
+ +
+ @if (count($allCanvas) > 0 && !empty($relatesLabels)) + @if ($filter['relates'] == 'all') + + @else + + @endif + + @endif +
+
+
+
+ +
+ + + @if (count($allCanvas) > 0) +
+
+
+
+ @foreach ($canvasItems as $row) + @php + $filterStatus = $filter['status'] ?? 'all'; + $filterRelates = $filter['relates'] ?? 'all'; + @endphp + + @if ( + $row['box'] === $elementName && + ($filterStatus == 'all' || $filterStatus == $row['status']) && + ($filterRelates == 'all' || $filterRelates == $row['relates'])) + @php + $comments = app()->make(Comments::class); + $nbcomments = $comments->countComments(moduleId: $row['id']); + @endphp +
+
+
+
+
+ @if ($login::userIsAtLeast($roles::$editor)) + + + + + @endif +
+ +

Goal: {{ $row['title'] }} +

+
+ Metric: {{ $row['description'] }} +

+ + @php + $percentDone = $row['goalProgress']; + $metricTypeFront = ''; + $metricTypeBack = ''; + if ($row['metricType'] == 'percent') { + $metricTypeBack = '%'; + } elseif ($row['metricType'] == 'currency') { + $metricTypeFront = __('language.currency'); + } + @endphp + +
+
+
+ {{ sprintf(__('text.percent_complete'), $percentDone) }} +
+
+
+
+
+ {{ sprintf(__('text.percent_complete'), $percentDone) }} +
+
+
+
+ Start:
{{ $metricTypeFront . $row['startValue'] . $metricTypeBack }}
+
+
+ {{ __('label.current') }}:
{{ $metricTypeFront . $row['currentValue'] . $metricTypeBack }}
+
+
+ {{ __('label.goal') }}:
{{ $metricTypeFront . $row['endValue'] . $metricTypeBack }}
+
+
+ +
+ + @if (!empty($statusLabels)) + + @endif + + @if (!empty($relatesLabels)) + + @endif + + + +
+ + {{ $nbcomments }} +
+ +
+
+ + @if ($row['milestoneHeadline'] != '') +
+
+
+ {{ __('label.loading_milestone') }} +
+
+ @endif +
+
+ @endif + @endforeach +
+
+
+
+
+ + @if (count($canvasItems) == 0) +

+
+
+ {!! file_get_contents(ROOT . '/dist/images/svg/undraw_design_data_khdb.svg') !!} +
+

{{ __('headlines.goal.analysis') }}

+
{!! __('text.goal.helper_content') !!} +
+ @endif + +
+ @endif + + + + + + + + @if (count($allCanvas) > 0) + @else +

+
+
+ {!! file_get_contents(ROOT . '/dist/images/svg/undraw_design_data_khdb.svg') !!} +
+ +

{{ __('headlines.goal.analysis') }}

+
{{ __('text.goal.helper_content') }} + + @if ($login::userIsAtLeast($roles::$editor)) +

+ + {{ __('links.icon.create_new_board') }} + + @endif +
+ @endif + + @if (!empty($disclaimer) && count($allCanvas) > 0) + {{ $disclaimer }} + @endif + + {!! $tpl->viewFactory->make($tpl->getTemplatePath('canvas', 'modals'), $__data)->render() !!} +
+
+ + + + + + +@endsection diff --git a/app/Domain/Goalcanvas/Templates/showCanvas.tpl.php b/app/Domain/Goalcanvas/Templates/showCanvas.tpl.php deleted file mode 100644 index 2137b1e6a3..0000000000 --- a/app/Domain/Goalcanvas/Templates/showCanvas.tpl.php +++ /dev/null @@ -1,404 +0,0 @@ - $val) { - $$var = $val; // necessary for blade refactor -} -$canvasName = 'goal'; -$elementName = 'goal'; - -?> - -get('allCanvas'); -$canvasIcon = $tpl->get('canvasIcon'); -$canvasTypes = $tpl->get('canvasTypes'); -$statusLabels = $statusLabels ?? $tpl->get('statusLabels'); -$relatesLabels = $relatesLabels ?? $tpl->get('relatesLabels'); -$dataLabels = $tpl->get('dataLabels'); -$disclaimer = $tpl->get('disclaimer'); -$canvasItems = $tpl->get('canvasItems'); - -$filter['status'] = $_GET['filter_status'] ?? (session("filter_status") ?? 'all'); -session(["filter_status" => $filter['status']]); -$filter['relates'] = $_GET['filter_relates'] ?? (session("filter_relates") ?? 'all'); -session(["filter_relates" => $filter['relates']]); - -//get canvas title -foreach ($tpl->get('allCanvas') as $canvasRow) { - if ($canvasRow["id"] == $tpl->get('currentCanvas')) { - $canvasTitle = $canvasRow["title"]; - break; - } -} - -$tpl->assign('canvasTitle', $canvasTitle); - -?> - - - - -
-
- - displayNotification(); ?> - -
- - -
- -
- -
-
-
- 0 && !empty($statusLabels)) {?> - - - - - - - -
- -
- 0 && !empty($relatesLabels)) {?> - - - - - - - -
- -
-
- -
- -
- - - get('allCanvas')) > 0) { ?> -
-
-
-
- make(Comments::class); - $nbcomments = $comments->countComments(moduleId: $row['id']); - ?> -
-
"> -
-
- - -

Goal: " - data="item_">e($row['title']);?>

-
- Metric: escape($row["description"]) ?> -

- - - - - __("language.currency"); - } - - ?> - -
-
-
- - __("text.percent_complete"), $percentDone); ?> -
-
-
-
-
- __("text.percent_complete"), $percentDone)?> -
-
-
-
- Start:
-
-
- __('label.current') ?>:
-
-
- __('label.goal') ?>:
-
-
- -
- - - - - - - - - - - - -
- -
- -
-
- - -
-
-
- __("label.loading_milestone") ?> -
-
- -
-
- - - -
-
- - - -
-
-
- -
"; - - echo "
"; - echo file_get_contents(ROOT . "/dist/images/svg/undraw_design_data_khdb.svg"); - echo "
"; - - echo"

" . $tpl->__("headlines.goal.analysis") . "

"; - echo "
" . $tpl->__("text.goal.helper_content"); - - - echo"
"; - } ?> - - -
- - -viewFactory->make( - $tpl->getTemplatePath('canvas', 'showCanvasBottom'), - array_merge($__data, ['canvasName' => 'goal']) -)->render(); ?> diff --git a/app/Language/en-US.ini b/app/Language/en-US.ini index cc0d5e820d..4ef6055233 100644 --- a/app/Language/en-US.ini +++ b/app/Language/en-US.ini @@ -2518,6 +2518,16 @@ headlines.set_up_your_account = "Set up your account" text.challenges_brings_you_here = "Tell us about the challenge that brings you here." text.point_to_where_it_hurts = "🩺 Point to where it hurts" +text.what_metric_will_you_be_using = "How will you measure this objective. What metric will you be using." + +label.starting_value = "Starting Value" +label.currennt_value = "Current Value" +label.goal_value = "Goal Value" +label.type = "Type" +label.number = "Number" +label.percent = "% Percent" + label.start="start date" label.end="end date" label.status_lowercase="status" + diff --git a/app/helpers.php b/app/helpers.php index c76d65423a..5a7d462736 100644 --- a/app/helpers.php +++ b/app/helpers.php @@ -7,6 +7,7 @@ use Leantime\Core\Application; use Leantime\Core\AppSettings; use Leantime\Core\Bootloader; +use Leantime\Core\IncomingRequest; use Leantime\Core\Language; use Leantime\Core\Support\Build; use Leantime\Core\Support\Cast; @@ -341,3 +342,27 @@ function storage_path($path = '') } } + +if (! function_exists('request')) { + /** + * Get an instance of the current request or an input item from the request. + * + * @param list|string|null $key + * @param mixed $default + * @return ($key is null ? \Illuminate\Http\Request : ($key is string ? mixed : array)) + */ + function request($key = null, $default = null) + { + if (is_null($key)) { + return app()->make(IncomingRequest::class); + } + + if (is_array($key)) { + return app()->make(IncomingRequest::class)->only($key); + } + + $value = app()->make(IncomingRequest::class)->__get($key); + + return is_null($value) ? value($default) : $value; + } +} diff --git a/public/dist/mix-manifest.json b/public/dist/mix-manifest.json index 50ccac5584..37425f04eb 100644 --- a/public/dist/mix-manifest.json +++ b/public/dist/mix-manifest.json @@ -66,23 +66,16 @@ "/images/backgrounds/bg6.png": "/images/backgrounds/bg6.png", "/images/backgrounds/bg7.png": "/images/backgrounds/bg7.png", "/images/calarrow.png": "/images/calarrow.png", - "/images/canvas.PNG": "/images/canvas.PNG", "/images/chosen-sprite-light.png": "/images/chosen-sprite-light.png", "/images/chosen-sprite-light@2x.png": "/images/chosen-sprite-light@2x.png", "/images/chosen-sprite.png": "/images/chosen-sprite.png", "/images/close.png": "/images/close.png", - "/images/controls.png": "/images/controls.png", - "/images/default-user.png": "/images/default-user.png", "/images/discord-logo.png": "/images/discord-logo.png", "/images/doc.png": "/images/doc.png", - "/images/emptyChartBg.png": "/images/emptyChartBg.png", "/images/favicon.png": "/images/favicon.png", - "/images/glyphicons-halflings-white.png": "/images/glyphicons-halflings-white.png", - "/images/glyphicons-halflings.png": "/images/glyphicons-halflings.png", "/images/icon-192.png": "/images/icon-192.png", "/images/icon-512.png": "/images/icon-512.png", "/images/index.html": "/images/index.html", - "/images/leantime-no-access.jpg": "/images/leantime-no-access.jpg", "/images/loading-animation.svg": "/images/loading-animation.svg", "/images/logo-powered-by-leantime.png": "/images/logo-powered-by-leantime.png", "/images/logo.png": "/images/logo.png", @@ -90,6 +83,19 @@ "/images/logo_blue.png": "/images/logo_blue.png", "/images/logo_blue.svg": "/images/logo_blue.svg", "/images/mattermost-logoHorizontal.png": "/images/mattermost-logoHorizontal.png", + "/images/openid-icon.png": "/images/openid-icon.png", + "/images/Screenshots/apps.png": "/images/Screenshots/apps.png", + "/images/Screenshots/blueprints.png": "/images/Screenshots/blueprints.png", + "/images/Screenshots/calendar.png": "/images/Screenshots/calendar.png", + "/images/Screenshots/dark.png": "/images/Screenshots/dark.png", + "/images/Screenshots/docs.png": "/images/Screenshots/docs.png", + "/images/Screenshots/goals.png": "/images/Screenshots/goals.png", + "/images/Screenshots/kanban.png": "/images/Screenshots/kanban.png", + "/images/Screenshots/mywork.png": "/images/Screenshots/mywork.png", + "/images/Screenshots/projectDashboard.png": "/images/Screenshots/projectDashboard.png", + "/images/Screenshots/table.png": "/images/Screenshots/table.png", + "/images/Screenshots/timeline.png": "/images/Screenshots/timeline.png", + "/images/Screenshots/timesheet.png": "/images/Screenshots/timesheet.png", "/images/onboarding/canvasScreen.png": "/images/onboarding/canvasScreen.png", "/images/onboarding/ideaScreen.png": "/images/onboarding/ideaScreen.png", "/images/onboarding/retroScreen.png": "/images/onboarding/retroScreen.png", @@ -97,18 +103,14 @@ "/images/onboarding/todoScreen.png": "/images/onboarding/todoScreen.png", "/images/openid-icon.png": "/images/openid-icon.png", "/images/spotlightBg.png": "/images/spotlightBg.png", - "/images/svg/30h/logo.png": "/images/svg/30h/logo.png", - "/images/svg/SVG/logo.svg": "/images/svg/SVG/logo.svg", "/images/svg/apps-grid-icon.svg": "/images/svg/apps-grid-icon.svg", "/images/svg/csv-icon.svg": "/images/svg/csv-icon.svg", "/images/svg/loading-animation.svg": "/images/svg/loading-animation.svg", - "/images/svg/logo.svg": "/images/svg/logo.svg", - "/images/svg/undraw_Organizing_projects_0p9a.svg": "/images/svg/undraw_Organizing_projects_0p9a.svg", - "/images/svg/undraw_a_moment_to_relax_bbpa.svg": "/images/svg/undraw_a_moment_to_relax_bbpa.svg", "/images/svg/undraw_adjustments_p22m.svg": "/images/svg/undraw_adjustments_p22m.svg", "/images/svg/undraw_adventure_map_hnin.svg": "/images/svg/undraw_adventure_map_hnin.svg", "/images/svg/undraw_air_support_re_nybl.svg": "/images/svg/undraw_air_support_re_nybl.svg", "/images/svg/undraw_attached_file_re_0n9b.svg": "/images/svg/undraw_attached_file_re_0n9b.svg", + "/images/svg/undraw_a_moment_to_relax_bbpa.svg": "/images/svg/undraw_a_moment_to_relax_bbpa.svg", "/images/svg/undraw_blooming_re_2kc4.svg": "/images/svg/undraw_blooming_re_2kc4.svg", "/images/svg/undraw_book_reading_re_fu2c.svg": "/images/svg/undraw_book_reading_re_fu2c.svg", "/images/svg/undraw_business_decisions_re_84ag.svg": "/images/svg/undraw_business_decisions_re_84ag.svg", @@ -137,8 +139,9 @@ "/images/svg/undraw_no_data_re_kwbl.svg": "/images/svg/undraw_no_data_re_kwbl.svg", "/images/svg/undraw_online_connection_6778.svg": "/images/svg/undraw_online_connection_6778.svg", "/images/svg/undraw_online_party_re_7t6g.svg": "/images/svg/undraw_online_party_re_7t6g.svg", - "/images/svg/undraw_party_re_nmwj.svg": "/images/svg/undraw_party_re_nmwj.svg", + "/images/svg/undraw_Organizing_projects_0p9a.svg": "/images/svg/undraw_Organizing_projects_0p9a.svg", "/images/svg/undraw_partying_re_at7f.svg": "/images/svg/undraw_partying_re_at7f.svg", + "/images/svg/undraw_party_re_nmwj.svg": "/images/svg/undraw_party_re_nmwj.svg", "/images/svg/undraw_photos_re_pvh3.svg": "/images/svg/undraw_photos_re_pvh3.svg", "/images/svg/undraw_powerful_re_frhr.svg": "/images/svg/undraw_powerful_re_frhr.svg", "/images/svg/undraw_progressive_app_m-9-ms.svg": "/images/svg/undraw_progressive_app_m-9-ms.svg", @@ -166,32 +169,6 @@ "/images/throbber.gif": "/images/throbber.gif", "/images/undraw_progressive_app_m9ms.png": "/images/undraw_progressive_app_m9ms.png", "/images/zulip-org-logo.png": "/images/zulip-org-logo.png", - "/fonts/Atkinson-Hyperlegible-Bold-102.ttf": "/fonts/Atkinson-Hyperlegible-Bold-102.ttf", - "/fonts/Atkinson-Hyperlegible-Bold-102a.woff2": "/fonts/Atkinson-Hyperlegible-Bold-102a.woff2", - "/fonts/Atkinson-Hyperlegible-BoldItalic-102.ttf": "/fonts/Atkinson-Hyperlegible-BoldItalic-102.ttf", - "/fonts/Atkinson-Hyperlegible-BoldItalic-102a.woff2": "/fonts/Atkinson-Hyperlegible-BoldItalic-102a.woff2", - "/fonts/Atkinson-Hyperlegible-Italic-102.ttf": "/fonts/Atkinson-Hyperlegible-Italic-102.ttf", - "/fonts/Atkinson-Hyperlegible-Italic-102a.woff2": "/fonts/Atkinson-Hyperlegible-Italic-102a.woff2", - "/fonts/Atkinson-Hyperlegible-Regular-102.ttf": "/fonts/Atkinson-Hyperlegible-Regular-102.ttf", - "/fonts/Atkinson-Hyperlegible-Regular-102a.woff2": "/fonts/Atkinson-Hyperlegible-Regular-102a.woff2", - "/fonts/Roboto-Bold.ttf": "/fonts/Roboto-Bold.ttf", - "/fonts/Roboto-Bold.woff2": "/fonts/Roboto-Bold.woff2", - "/fonts/Roboto-Italic.ttf": "/fonts/Roboto-Italic.ttf", - "/fonts/Roboto-Italic.woff2": "/fonts/Roboto-Italic.woff2", - "/fonts/Roboto-Light.ttf": "/fonts/Roboto-Light.ttf", - "/fonts/Roboto-Light.woff2": "/fonts/Roboto-Light.woff2", - "/fonts/Roboto-LightItalic.ttf": "/fonts/Roboto-LightItalic.ttf", - "/fonts/Roboto-LightItalic.woff2": "/fonts/Roboto-LightItalic.woff2", - "/fonts/Roboto-Medium.ttf": "/fonts/Roboto-Medium.ttf", - "/fonts/Roboto-Medium.woff2": "/fonts/Roboto-Medium.woff2", - "/fonts/Roboto-MediumItalic.ttf": "/fonts/Roboto-MediumItalic.ttf", - "/fonts/Roboto-MediumItalic.woff2": "/fonts/Roboto-MediumItalic.woff2", - "/fonts/Roboto-Regular.ttf": "/fonts/Roboto-Regular.ttf", - "/fonts/Roboto-Regular.woff2": "/fonts/Roboto-Regular.woff2", - "/fonts/Shantell_Sans-Informal_Bold.woff2": "/fonts/Shantell_Sans-Informal_Bold.woff2", - "/fonts/Shantell_Sans-Informal_Bold_Italic.woff2": "/fonts/Shantell_Sans-Informal_Bold_Italic.woff2", - "/fonts/Shantell_Sans-Informal_Regular.woff2": "/fonts/Shantell_Sans-Informal_Regular.woff2", - "/fonts/Shantell_Sans-Informal_Regular_Italic.woff2": "/fonts/Shantell_Sans-Informal_Regular_Italic.woff2", "/fonts/atkinson/Atkinson-Hyperlegible-Bold-102.ttf": "/fonts/atkinson/Atkinson-Hyperlegible-Bold-102.ttf", "/fonts/atkinson/Atkinson-Hyperlegible-Bold-102a.woff2": "/fonts/atkinson/Atkinson-Hyperlegible-Bold-102a.woff2", "/fonts/atkinson/Atkinson-Hyperlegible-BoldItalic-102.ttf": "/fonts/atkinson/Atkinson-Hyperlegible-BoldItalic-102.ttf", @@ -201,6 +178,14 @@ "/fonts/atkinson/Atkinson-Hyperlegible-Italic-102a.woff2": "/fonts/atkinson/Atkinson-Hyperlegible-Italic-102a.woff2", "/fonts/atkinson/Atkinson-Hyperlegible-Regular-102.ttf": "/fonts/atkinson/Atkinson-Hyperlegible-Regular-102.ttf", "/fonts/atkinson/Atkinson-Hyperlegible-Regular-102a.woff2": "/fonts/atkinson/Atkinson-Hyperlegible-Regular-102a.woff2", + "/fonts/Atkinson-Hyperlegible-Bold-102.ttf": "/fonts/Atkinson-Hyperlegible-Bold-102.ttf", + "/fonts/Atkinson-Hyperlegible-Bold-102a.woff2": "/fonts/Atkinson-Hyperlegible-Bold-102a.woff2", + "/fonts/Atkinson-Hyperlegible-BoldItalic-102.ttf": "/fonts/Atkinson-Hyperlegible-BoldItalic-102.ttf", + "/fonts/Atkinson-Hyperlegible-BoldItalic-102a.woff2": "/fonts/Atkinson-Hyperlegible-BoldItalic-102a.woff2", + "/fonts/Atkinson-Hyperlegible-Italic-102.ttf": "/fonts/Atkinson-Hyperlegible-Italic-102.ttf", + "/fonts/Atkinson-Hyperlegible-Italic-102a.woff2": "/fonts/Atkinson-Hyperlegible-Italic-102a.woff2", + "/fonts/Atkinson-Hyperlegible-Regular-102.ttf": "/fonts/Atkinson-Hyperlegible-Regular-102.ttf", + "/fonts/Atkinson-Hyperlegible-Regular-102a.woff2": "/fonts/Atkinson-Hyperlegible-Regular-102a.woff2", "/fonts/fa-brands-400.ttf": "/fonts/fa-brands-400.ttf", "/fonts/fa-brands-400.woff2": "/fonts/fa-brands-400.woff2", "/fonts/fa-regular-400.ttf": "/fonts/fa-regular-400.ttf", @@ -235,10 +220,28 @@ "/fonts/roboto/Roboto-Thin.woff2": "/fonts/roboto/Roboto-Thin.woff2", "/fonts/roboto/Roboto-ThinItalic.ttf": "/fonts/roboto/Roboto-ThinItalic.ttf", "/fonts/roboto/Roboto-ThinItalic.woff2": "/fonts/roboto/Roboto-ThinItalic.woff2", + "/fonts/Roboto-Bold.ttf": "/fonts/Roboto-Bold.ttf", + "/fonts/Roboto-Bold.woff2": "/fonts/Roboto-Bold.woff2", + "/fonts/Roboto-Italic.ttf": "/fonts/Roboto-Italic.ttf", + "/fonts/Roboto-Italic.woff2": "/fonts/Roboto-Italic.woff2", + "/fonts/Roboto-Light.ttf": "/fonts/Roboto-Light.ttf", + "/fonts/Roboto-Light.woff2": "/fonts/Roboto-Light.woff2", + "/fonts/Roboto-LightItalic.ttf": "/fonts/Roboto-LightItalic.ttf", + "/fonts/Roboto-LightItalic.woff2": "/fonts/Roboto-LightItalic.woff2", + "/fonts/Roboto-Medium.ttf": "/fonts/Roboto-Medium.ttf", + "/fonts/Roboto-Medium.woff2": "/fonts/Roboto-Medium.woff2", + "/fonts/Roboto-MediumItalic.ttf": "/fonts/Roboto-MediumItalic.ttf", + "/fonts/Roboto-MediumItalic.woff2": "/fonts/Roboto-MediumItalic.woff2", "/fonts/shantell/Shantell_Sans-Informal_Bold.woff2": "/fonts/shantell/Shantell_Sans-Informal_Bold.woff2", "/fonts/shantell/Shantell_Sans-Informal_Bold_Italic.woff2": "/fonts/shantell/Shantell_Sans-Informal_Bold_Italic.woff2", "/fonts/shantell/Shantell_Sans-Informal_Regular.woff2": "/fonts/shantell/Shantell_Sans-Informal_Regular.woff2", "/fonts/shantell/Shantell_Sans-Informal_Regular_Italic.woff2": "/fonts/shantell/Shantell_Sans-Informal_Regular_Italic.woff2", + + "/fonts/Shantell_Sans-Informal_Bold.woff2": "/fonts/Shantell_Sans-Informal_Bold.woff2", + "/fonts/Shantell_Sans-Informal_Bold_Italic.woff2": "/fonts/Shantell_Sans-Informal_Bold_Italic.woff2", + "/fonts/Shantell_Sans-Informal_Regular.woff2": "/fonts/Shantell_Sans-Informal_Regular.woff2", + "/fonts/Shantell_Sans-Informal_Regular_Italic.woff2": "/fonts/Shantell_Sans-Informal_Regular_Italic.woff2", + "/lottie/leo/Dino.json": "/lottie/leo/Dino.json", "/lottie/leo/Loading_Clock_Animation.json": "/lottie/leo/Loading_Clock_Animation.json", "/lottie/leo/Lochnes.json": "/lottie/leo/Lochnes.json", @@ -247,15 +250,24 @@ "/lottie/leo/Peek_Unicorn.json": "/lottie/leo/Peek_Unicorn.json", "/lottie/leo/Rainbow_Unicorn.json": "/lottie/leo/Rainbow_Unicorn.json", "/lottie/leo/Rolling LEO.json": "/lottie/leo/Rolling LEO.json", + "/lottie/leo/announcement.json": "/lottie/leo/announcement.json", + "/lottie/leo/Dino.json": "/lottie/leo/Dino.json", "/lottie/leo/exclamation.json": "/lottie/leo/exclamation.json", "/lottie/leo/happy.json": "/lottie/leo/happy.json", "/lottie/leo/heart.json": "/lottie/leo/heart.json", "/lottie/leo/in-robo.json": "/lottie/leo/in-robo.json", "/lottie/leo/king_arthur.json": "/lottie/leo/king_arthur.json", + "/lottie/leo/Loading_Clock_Animation.json": "/lottie/leo/Loading_Clock_Animation.json", + "/lottie/leo/Lochnes.json": "/lottie/leo/Lochnes.json", + "/lottie/leo/Mermaid.json": "/lottie/leo/Mermaid.json", "/lottie/leo/motivational_speaker.json": "/lottie/leo/motivational_speaker.json", + "/lottie/leo/Narhwal.json": "/lottie/leo/Narhwal.json", "/lottie/leo/peaking.json": "/lottie/leo/peaking.json", + "/lottie/leo/Peek_Unicorn.json": "/lottie/leo/Peek_Unicorn.json", "/lottie/leo/pirate.json": "/lottie/leo/pirate.json", + "/lottie/leo/Rainbow_Unicorn.json": "/lottie/leo/Rainbow_Unicorn.json", + "/lottie/leo/Rolling LEO.json": "/lottie/leo/Rolling LEO.json", "/lottie/leo/sleep.json": "/lottie/leo/sleep.json", "/lottie/leo/smoking.json": "/lottie/leo/smoking.json", "/lottie/leo/still.json": "/lottie/leo/still.json",