| ID | +First Name | +Last Name | +Position | ++ | ||
|---|---|---|---|---|---|---|
| + Loading... + | +||||||
diff --git a/.github/workflows/docker-production-deployment.yml b/.github/workflows/docker-production-deployment.yml index 36e3e52f52..9b17554ae1 100644 --- a/.github/workflows/docker-production-deployment.yml +++ b/.github/workflows/docker-production-deployment.yml @@ -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!" diff --git a/Dockerfile b/Dockerfile index f818cf71aa..2ad398122e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -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 diff --git a/app/Core/Middleware/InitialHeaders.php b/app/Core/Middleware/InitialHeaders.php index 507e94c1f1..8a7c3aabfe 100644 --- a/app/Core/Middleware/InitialHeaders.php +++ b/app/Core/Middleware/InitialHeaders.php @@ -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); diff --git a/app/Domain/Menu/Repositories/Menu.php b/app/Domain/Menu/Repositories/Menu.php index d3e0b780f0..1e8cf0c868 100644 --- a/app/Domain/Menu/Repositories/Menu.php +++ b/app/Domain/Menu/Repositories/Menu.php @@ -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 => [ @@ -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]); diff --git a/app/Domain/Menu/Templates/partials/leftnav/item.blade.php b/app/Domain/Menu/Templates/partials/leftnav/item.blade.php index 925d073689..f80325d87e 100644 --- a/app/Domain/Menu/Templates/partials/leftnav/item.blade.php +++ b/app/Domain/Menu/Templates/partials/leftnav/item.blade.php @@ -18,6 +18,9 @@ class='active' @endforeach @endif > + @if(isset($menuItem['icon']) && !str_starts_with(trim((string)($menuItem['title'] ?? '')), '<')) + + @endif {!! $menuItem['title'] !!} diff --git a/app/Domain/Notifications/Services/Messengers.php b/app/Domain/Notifications/Services/Messengers.php index 3b2399c995..8cc98b3f40 100644 --- a/app/Domain/Notifications/Services/Messengers.php +++ b/app/Domain/Notifications/Services/Messengers.php @@ -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, diff --git a/app/Domain/Projects/Controllers/ShowProject.php b/app/Domain/Projects/Controllers/ShowProject.php index 47dfc66bea..4020d31134 100644 --- a/app/Domain/Projects/Controllers/ShowProject.php +++ b/app/Domain/Projects/Controllers/ShowProject.php @@ -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'); } @@ -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); diff --git a/app/Domain/Projects/Templates/showProject.tpl.php b/app/Domain/Projects/Templates/showProject.tpl.php index eff3fa756c..2858fda3ec 100644 --- a/app/Domain/Projects/Templates/showProject.tpl.php +++ b/app/Domain/Projects/Templates/showProject.tpl.php @@ -240,9 +240,15 @@ = $tpl->__('text.slack_instructions'); ?>
| ID | +First Name | +Last Name | +Position | ++ | ||
|---|---|---|---|---|---|---|
| + Loading... + | +||||||