Merge branch 'develop'

This commit is contained in:
lizerk 2026-04-16 21:18:09 +03:00
commit a682b88c3d
11 changed files with 52 additions and 40 deletions

View File

@ -364,7 +364,7 @@ DEFAULT_FROM_EMAIL = os.getenv(
# SITE SETTINGS
# -----------------------------------------------------------------------------
# Название сайта для email уведомлений и UI
SITE_NAME = os.getenv("SITE_NAME", "CORP HiRo")
SITE_NAME = os.getenv("SITE_NAME", "CORP - HiRo")
SITE_URL = os.getenv("SITE_URL", "https://corp.robotail.pro")
# -----------------------------------------------------------------------------
@ -436,7 +436,7 @@ REST_FRAMEWORK = {
SPECTACULAR_SETTINGS = {
"TITLE": f"{SITE_NAME} API",
"DESCRIPTION": (
"OpenAPI-документация backend API EUSRR. "
"OpenAPI-документация backend API CORP - HiRo. "
"Включает JWT-аутентификацию, session auth и основные REST endpoints."
),
"VERSION": "1.0.0",
@ -598,7 +598,7 @@ LDAP_POSITIONS_BASE = os.getenv(
"LDAP_POSITIONS_BASE", "OU=Positions,DC=eusrr,DC=local"
)
BRAND_NAME = os.getenv("BRAND_NAME", "HiRo")
BRAND_NAME = os.getenv("BRAND_NAME", "CORP - HiRo")
BRAND_LOGO = "img/logo.png"
# Web Push Notifications (VAPID)

View File

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>EUSRR WebSocket AsyncAPI</title>
<title>CORP - HiRo WebSocket AsyncAPI</title>
<style>
body {
margin: 0;
@ -88,7 +88,7 @@
<section class="hero">
<h1>WebSocket AsyncAPI</h1>
<p>
Отдельная документация realtime-контура EUSRR. HTTP API продолжает
Отдельная документация realtime-контура CORP - HiRo. HTTP API продолжает
жить в OpenAPI, а WebSocket-контур документируется отдельно через
AsyncAPI, без смешивания двух протоколов в одной схеме.
</p>

View File

@ -1,7 +1,7 @@
{% extends "base.html" %}
{% load static %}
{% block title %}Подтверждение email — HiRo{% endblock %}
{% block title %}Подтверждение email — CORP - HiRo{% endblock %}
{# ВАЖНО: применяем тему ещё в <head>, до рендера страницы #}
{% block extra_css %}

View File

@ -15,7 +15,7 @@
{# КРИТИЧНО: Применяем тему ДО загрузки CSS для предотвращения FOUC #}
<script src="{% static 'js/utils/themeInitializer.js' %}"></script>
<title>{% block title %}HiRo{% endblock %}</title>
<title>{% block title %}CORP - HiRo{% endblock %}</title>
<link rel="icon" type="image/png" sizes="32x32" href="{% static 'img/favicon-32.png' %}">
<link rel="apple-touch-icon" href="{% static 'img/apple-touch-icon.png' %}">
<link rel="icon" type="image/png" sizes="192x192" href="{% static 'img/logo-192.png' %}">

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -6,11 +6,12 @@
* нативные уведомления даже когда страница закрыта.
*/
const SW_VERSION = '2.0.0';
const SW_VERSION = '2.1.0';
const STATIC_CACHE = `eusrr-static-${SW_VERSION}`;
const PRECACHE_URLS = [
'/manifest.webmanifest',
'/favicon-source.svg',
'/notification-badge.png',
'/logo.png',
'/logo.webp',
'/icon-192.png',
@ -21,8 +22,8 @@ const PRECACHE_URLS = [
// Настройки по умолчанию для уведомлений
const DEFAULT_NOTIFICATION_OPTIONS = {
icon: '/logo.png',
badge: '/logo.png',
icon: '/icon-192.png',
badge: '/notification-badge.png',
vibrate: [100, 50, 100],
requireInteraction: false,
renotify: true,
@ -183,33 +184,44 @@ self.addEventListener('notificationclick', (event) => {
event.notification.close();
// Получаем URL из данных уведомления
const urlToOpen = event.notification.data?.url || '/';
const urlToOpen = new URL(
event.notification.data?.url || '/',
self.location.origin,
).toString();
// Открываем или фокусируемся на странице
// Для установленного PWA даём браузеру самому решить, открыть app window
// или вкладку. Не фокусируем произвольную already-open same-origin вкладку.
event.waitUntil(
clients.matchAll({ type: 'window', includeUncontrolled: true })
.then((windowClients) => {
// Ищем уже открытую вкладку с нашим сайтом
for (let client of windowClients) {
if (client.url.includes(self.location.origin) && 'focus' in client) {
return client.focus().then((client) => {
// Отправляем сообщение для навигации
if ('navigate' in client) {
return client.navigate(urlToOpen);
}
return client.postMessage({
type: 'NOTIFICATION_CLICK',
url: urlToOpen,
notificationId: event.notification.data?.notification_id
});
});
}
.then(async (windowClients) => {
const exactClient = windowClients.find(
(client) => client.url === urlToOpen && 'focus' in client,
);
if (exactClient) {
return exactClient.focus();
}
// Если открытой вкладки нет, открываем новую
if (clients.openWindow) {
return clients.openWindow(urlToOpen);
}
const sameOriginClient = windowClients.find(
(client) =>
client.url.startsWith(self.location.origin) &&
'focus' in client,
);
if (sameOriginClient) {
return sameOriginClient.focus().then((client) => {
if ('navigate' in client) {
return client.navigate(urlToOpen);
}
return client.postMessage({
type: 'NOTIFICATION_CLICK',
url: urlToOpen,
notificationId: event.notification.data?.notification_id
});
});
}
})
);
});

View File

@ -16,14 +16,14 @@ const geistMono = Geist_Mono({
});
export const metadata: Metadata = {
title: "EUSRR - Корпоративная система",
description: "Корпоративная система управления EUSRR",
applicationName: "EUSRR",
title: "CORP - HiRo",
description: "Корпоративная система управления CORP - HiRo",
applicationName: "CORP - HiRo",
manifest: "/manifest.webmanifest",
appleWebApp: {
capable: true,
statusBarStyle: "default",
title: "EUSRR",
title: "CORP - HiRo",
},
icons: {
icon: [

View File

@ -10,7 +10,7 @@ const sections = [
{
title: "1. Общие положения",
body: [
"Настоящая Политика определяет порядок обработки персональных данных пользователей сервиса EUSRR и действует в отношении всей информации, которую оператор может получить при использовании сайта, внутренних веб-интерфейсов и связанных сервисов.",
"Настоящая Политика определяет порядок обработки персональных данных пользователей сервиса CORP - HiRo и действует в отношении всей информации, которую оператор может получить при использовании сайта, внутренних веб-интерфейсов и связанных сервисов.",
"Политика подготовлена с учетом требований законодательства Российской Федерации о персональных данных, включая Федеральный закон от 27.07.2006 № 152-ФЗ.",
],
},

View File

@ -76,7 +76,7 @@ export default function TermsPage() {
<p className="app-text-muted text-xs uppercase tracking-[0.2em]">Legal</p>
<h1 className="mt-3 text-3xl font-semibold">Условия использования</h1>
<p className="app-text-muted mt-3 text-sm leading-6">
Общие правила доступа и использования сервиса EUSRR.
Общие правила доступа и использования сервиса CORP - HiRo.
</p>
</div>

View File

@ -2,9 +2,9 @@ import type { MetadataRoute } from "next";
export default function manifest(): MetadataRoute.Manifest {
return {
name: "EUSRR",
short_name: "EUSRR",
description: "Корпоративная система управления EUSRR",
name: "CORP - HiRo",
short_name: "CORP - HiRo",
description: "Корпоративная система управления CORP - HiRo",
start_url: "/",
scope: "/",
display: "standalone",

View File

@ -1,3 +1,3 @@
export const LEGAL_OPERATOR_NAME = "Сервис EUSRR";
export const LEGAL_OPERATOR_NAME = "Сервис CORP - HiRo";
export const LEGAL_SITE_URL = "https://corp.robotail.pro";
export const LEGAL_CONTACT_EMAIL = "robotail-info@yandex.ru";