Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
70b5a47
#5958 pinned ticket stayed pinned
farukvukovic Feb 5, 2026
ea179fe
#5841 Remove session deletion from dockerfile
harismacic1 Feb 6, 2026
3a6261d
#5612 Add listener to type change and write the change in the ticket …
harismacic1 Feb 6, 2026
1921908
#5612 Add listener to project, milestone, sprint, related to, so we c…
harismacic1 Feb 6, 2026
44f930b
#5612 Add on change listener to work start, work end, planned hours a…
harismacic1 Feb 6, 2026
739b53c
#5612 Add statement to check whether old value is the same as the new…
harismacic1 Feb 9, 2026
edc9963
#5852 Change rounding from 2 to 4 decimals
harismacic1 Feb 6, 2026
9645421
#5746 Integrate sihterice with Pear Log
farukvukovic Jan 29, 2026
5468e53
#5780 Integrate Worksheet backend with pearlog
farukvukovic Feb 3, 2026
6145236
5788 Fix slack send date
farukvukovic Feb 5, 2026
c4938ad
#5885 Read Sihtarice addon backend address from env file
farukvukovic Feb 10, 2026
222c0c1
#5853 Add logic for waiting until jquery is loaded
harismacic1 Feb 9, 2026
65e2ef6
[#5853] Remove unnecessary check for jquery initialization
harismacic1 Feb 10, 2026
9e8066a
#5888 - Fix sihtarice connection with docker
farukvukovic Feb 10, 2026
eb08e76
#5516 Enhance test slack notification
farukvukovic Feb 11, 2026
fb5aad8
#5682 Logged hours not displayed in human readable format
farukvukovic Feb 4, 2026
6b9f9da
#5796 Add ticket URL copy icon to Ticket window
farukvukovic Feb 4, 2026
0931774
#5796 Move copy ticket url icon at the end of ticket title
farukvukovic Feb 12, 2026
72c577a
[#5746] Add Cube icon to Managment side menu
farukvukovic Feb 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/docker-production-deployment.yml
Original file line number Diff line number Diff line change
Expand Up @@ -259,7 +259,7 @@ jobs:

echo ""
echo "[INFO] Testing endpoint..."
curl -I https://pearlog-prod.pearshadow.com || echo "Endpoint test failed"
curl -I https://pearlog.pearshadow.com || echo "Endpoint test failed"

echo ""
echo "[SUCCESS] Verification complete!"
Expand Down
3 changes: 0 additions & 3 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -399,9 +399,6 @@ rm -rf /var/www/html/storage/framework/viewPaths.php || true
find /var/www/html/storage/framework/cache -type f ! -name '.gitignore' -delete 2>/dev/null || true
find /var/www/html/storage/framework/cache -type d -empty -delete 2>/dev/null || true

find /var/www/html/storage/framework/sessions -type f ! -name '.gitignore' -delete 2>/dev/null || true
find /var/www/html/storage/framework/sessions -type d -empty -delete 2>/dev/null || true

find /var/www/html/storage/framework/views -type f ! -name '.gitignore' -delete 2>/dev/null || true
find /var/www/html/storage/framework/views -type d -empty -delete 2>/dev/null || true

Expand Down
1 change: 1 addition & 0 deletions app/Core/Middleware/InitialHeaders.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ public function handle($request, Closure $next): Response
"img-src * 'self' *.leantime.io *.amazonaws.com data: blob: marketplace.localhost",
"frame-src 'self' *.google.com *.microsoft.com *.live.com",
"frame-ancestors 'self' *.google.com *.microsoft.com *.live.com",
"connect-src 'self' https://st-api.pearshadow.com http://host.docker.internal:3300 https://*.ngrok-free.app http://localhost:3300" . trim((string) (config('app.sihterice_address') ?? '')),
];
$cspParts = self::dispatchFilter('cspParts', $cspParts);
$csp = implode(';', $cspParts);
Expand Down
2 changes: 2 additions & 0 deletions app/Domain/Menu/Repositories/Menu.php
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,7 @@ class Menu
10 => ['type' => 'item', 'module' => 'projects', 'role' => 'manager', 'title' => 'menu.all_projects', 'icon' => 'fa fa-fw fa-briefcase', 'tooltip' => 'menu.all_projects_tooltip', 'href' => '/projects/showAll', 'active' => ['showAll']],
15 => ['type' => 'item', 'module' => 'clients', 'role' => 'admin', 'title' => 'menu.all_clients', 'icon' => 'fa fa-fw fa-address-book', 'tooltip' => 'menu.all_clients_tooltip', 'href' => '/clients/showAll', 'active' => ['showAll']],
20 => ['type' => 'item', 'module' => 'users', 'role' => 'admin', 'title' => 'menu.all_users', 'icon' => 'fa fa-fw fa-users', 'tooltip' => 'menu.all_users_tooltip', 'href' => '/users/showAll', 'active' => ['showAll']],
25 => ['type' => 'item', 'module' => 'sihterice', 'role' => 'admin', 'title' => 'Sihterice', 'icon' => 'fa fa-fw fa-cube', 'tooltip' => 'Sihterice Frontend', 'href' => '/sihterice/show', 'active' => ['show']],
],
],
15 => [
Expand Down Expand Up @@ -426,6 +427,7 @@ public function getSectionMenuType($currentRoute, $default = 'default')
'connector.integration' => 'company',
'billing.subscriptions' => 'company',
'llamadorian.statusCollector' => 'personal',
'sihterice.show' => 'company',
];

$sections = self::dispatch_filter('menuSections', $sections, ['currentRoute' => $currentRoute, 'default' => $default]);
Expand Down
3 changes: 3 additions & 0 deletions app/Domain/Menu/Templates/partials/leftnav/item.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@ class='active'
@endforeach
@endif
>
@if(isset($menuItem['icon']) && !str_starts_with(trim((string)($menuItem['title'] ?? '')), '<'))
<span class="{{ $menuItem['icon'] }}"></span>
@endif
{!! $menuItem['title'] !!}
</a>
</li>
Expand Down
21 changes: 20 additions & 1 deletion app/Domain/Notifications/Services/Messengers.php
Original file line number Diff line number Diff line change
Expand Up @@ -76,10 +76,29 @@ private function slackWebhook(NotificationModel $notification): bool
$statusLabelsArray = $ticketService->getStatusLabels($notification->projectId);

$slackWebhookURL = $this->settingsRepo->getSetting("projectsettings.{$notification->projectId}.slackWebhookURL");

if ($slackWebhookURL !== '' && $slackWebhookURL !== false && !is_array($notification->entity) && (str_contains(strtolower($statusLabelsArray[$notification->entity->status]['name']), 'ready to test') || str_contains(strtolower($statusLabelsArray[$notification->entity->status]['name']), 'qa')) ) {
$message = $this->prepareMessage($notification);

$entity = $notification->entity;

$ticketId = $entity->id ?? '';
$projectKey = trim($entity->projectKey ?? '');
$headline = $entity->headline ?? '';
$ticketUrl = $notification->url['url'] ?? '';

$ticketNumber = $projectKey ? $projectKey . '-' . $ticketId : ($ticketId ? '#' . $ticketId : '');

$title = $ticketNumber ? "$ticketNumber - $headline" : $headline;

$message[0] = [
'pretext' => session('userdata.name') . " has the ticket ready to test",
'fallback' => session('userdata.name') . " has the ticket ready to test",
'title' => $title,
'title_link' => $ticketUrl,
'color' => '#006d9f',
];

$data = [
'text' => '',
'attachments' => $message,
Expand Down
5 changes: 5 additions & 0 deletions app/Domain/Projects/Controllers/ShowProject.php
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,8 @@ public function run()
if (isset($_POST['slackSave'])) {
$webhook = strip_tags($_POST['slackWebhookURL']);
$this->settingsRepo->saveSetting('projectsettings.'.$id.'.slackWebhookURL', $webhook);
$channelId = strip_tags($_POST['slackChannelId'] ?? '');
$this->settingsRepo->saveSetting('projectsettings.'.$id.'.slackChannelId', $channelId);
$this->tpl->setNotification($this->language->__('notification.saved_slack_webhook'), 'success');
}

Expand Down Expand Up @@ -184,6 +186,9 @@ public function run()
$slackWebhook = $this->settingsRepo->getSetting('projectsettings.'.$id.'.slackWebhookURL');
$this->tpl->assign('slackWebhookURL', $slackWebhook);

$slackChannelId = $this->settingsRepo->getSetting('projectsettings.'.$id.'.slackChannelId');
$this->tpl->assign('slackChannelId', $slackChannelId);

for ($i = 1; $i <= 3; $i++) {
$discordWebhook = $this->settingsRepo->getSetting('projectsettings.'.$id.'.discordWebhookURL'.$i);
$this->tpl->assign('discordWebhookURL'.$i, $discordWebhook);
Expand Down
8 changes: 7 additions & 1 deletion app/Domain/Projects/Templates/showProject.tpl.php
Original file line number Diff line number Diff line change
Expand Up @@ -240,9 +240,15 @@
<?= $tpl->__('text.slack_instructions'); ?>
</div>
<div class="col-md-4">
<strong><?= $tpl->__('label.webhook_url'); ?></strong><br />
<form action="<?= BASE_URL ?>/projects/showProject/<?php echo $project['id']; ?>#integrations" method="post">
<strong><?= $tpl->__('label.webhook_url'); ?></strong><br />
<input type="text" name="slackWebhookURL" id="slackWebhookURL" value="<?php echo $tpl->escape($tpl->get('slackWebhookURL')); ?>"/>
<br /><br />
<strong><?= $tpl->__('label.slack_channel_id'); ?></strong><br />
<input type="text" name="slackChannelId" id="slackChannelId" placeholder="C0123456789" value="<?php echo $tpl->escape($tpl->get('slackChannelId')); ?>"/>
<small style="display: block; color: #666; margin-top: 4px;">
<?= $tpl->__('text.slack_channel_id_help'); ?>
</small>
<br />
<input type="submit" value="<?= $tpl->__('buttons.save'); ?>" name="slackSave" />
</form>
Expand Down
21 changes: 21 additions & 0 deletions app/Domain/Sihterice/Controllers/Show.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?php

namespace Leantime\Domain\Sihterice\Controllers;

use Leantime\Core\Controller\Controller;
use Leantime\Domain\Auth\Models\Roles;
use Leantime\Domain\Auth\Services\Auth;

class Show extends Controller
{
/* Display the Sihterice application frontend. */
public function run()
{
Auth::authOrRedirect([Roles::$owner, Roles::$admin], true);

$this->tpl->assign('sihtericeToken', env('SIHTERICE_TOKEN', ''));
$this->tpl->assign('sihtericeAddress', env('SIHTERICE_ADDRESS', 'http://localhost:3300'));

return $this->tpl->display('sihterice.show');
}
}
Loading
Loading