1
0
mirror of https://github.com/Bayselonarrend/OpenIntegrations.git synced 2025-08-10 22:41:43 +02:00

PRX: Откад web, начало консольного

This commit is contained in:
Anton Titovets
2025-01-29 13:46:42 +03:00
parent ea847c5175
commit a07b2cc985
12 changed files with 46 additions and 298 deletions

View File

@@ -1,50 +0,0 @@
Процедура ОбработатьМеню(Контекст, Проект) Экспорт
МассивПунктов = Новый Массив;
МассивПунктов.Добавить(ПолучитьПункт("Обработчик1", "/ui/handler?id=1"));
МассивПунктов.Добавить(ПолучитьПункт("Обработчик2", "/ui/handler?id=2"));
МассивПунктов.Добавить(ПолучитьПункт("Обработчик3", "/ui/handler?id=3"));
МассивЭлементов = Новый Массив;
МассивЭлементов.Добавить(ПолучитьПодменю("Обработчики", МассивПунктов));
Основа = ПолучитьОснову(МассивЭлементов);
Контекст.Ответ.Записать(Основа);
КонецПроцедуры
Функция ПолучитьОснову(МассивЭлементов)
Шаблон = "
|<aside class=""menu"">
| %1
| <div class=""button-container"">
| <a href=""#"" id=""new"" hx-get=""/ui/handler?id=new"" hx-target=""#main-content"" hx-swap=""innerHTML"" class=""button is-primary is-fullwidth"">Новый элемент</a>
| </div>
| <div class=""resizer""></div>
|</aside>";
Возврат СтрШаблон(Шаблон, СтрСоединить(МассивЭлементов, Символы.ПС));
КонецФункции
Функция ПолучитьПодменю(Заголовок, МассивЭлементов)
Шаблон = "<ul class=""menu-list"">
| <p class=""menu-label"">
| %1
| </p>
| %2
|</ul>";
Возврат СтрШаблон(Шаблон, Заголовок, СтрСоединить(МассивЭлементов, Символы.ПС));
КонецФункции
Функция ПолучитьПункт(Текст, Ссылка)
Шаблон = "<li><a href=""#"" hx-get=""%1"" hx-target=""#main-content"" hx-swap=""innerHTML"">%2</a></li>";
Возврат СтрШаблон(Шаблон, Ссылка, Текст);
КонецФункции

View File

@@ -1,60 +0,0 @@
#Использовать "internal"
Процедура ВернутьДанные(Контекст, Проект) Экспорт
Параметры = Инструменты.ПолучитьПараметры(Контекст);
Идентификатор = Параметры["id"];
Если Идентификатор = Неопределено Тогда
Инструменты.ВернутьНеНайдено(Контекст);
Возврат;
ИначеЕсли Идентификатор = "new" Тогда
Страница = СтраницаНового();
Иначе
Страница = СтраницаОбработчика(Идентификатор, Идентификатор);
КонецЕсли;
Контекст.Ответ.Записать(Страница);
КонецПроцедуры
Функция СтраницаОбработчика(Заголовок, Описание)
Шаблон = "<h1 class=""title"">%1</h1>
|<p>%2</p>";
Возврат СтрШаблон(Шаблон, Заголовок, Описание);
КонецФункции
Функция СтраницаНового()
Возврат
"<form id=""new-item-form"" hx-post=""/api/handler"" hx-target=""#main-content"" hx-swap=""innerHTML"">
| <div class=""field"">
| <label class=""label"">Название</label>
| <div class=""control"">
| <input class=""input"" type=""text"" name=""name"" required>
| </div>
| </div>
| <div class=""field"">
| <label class=""label"">Секрет</label>
| <div class=""control"">
| <input class=""input"" type=""text"" name=""secret"" required>
| </div>
| </div>
| <div class=""field is-grouped"">
| <div class=""control"">
| <button class=""button is-link"" type=""submit"">Сохранить</button>
| </div>
| </div>
|</form>";
КонецФункции

View File

@@ -1,36 +0,0 @@
Процедура ВернутьСтатику(Контекст, Путь) Экспорт
ПутьКФайлу = Прав(Путь, СтрДлина(Путь) - 4);
ПутьКФайлу = ?(Не ЗначениеЗаполнено(ПутьКФайлу) Или ПутьКФайлу = "/", "/index.html", ПутьКФайлу);
ПутьКФайлуСтатики = КаталогСтатики() + ПутьКФайлу;
ФайлСтатики = Новый Файл(ПутьКФайлуСтатики);
Если ФайлСтатики.Существует() Тогда
Данные = Новый ФайловыйПоток(ПутьКФайлуСтатики, РежимОткрытияФайла.Открыть);
Данные.КопироватьВ(Контекст.Ответ.Тело);
Данные.Закрыть();
Иначе
Контекст.Ответ.КодСостояния = 404;
КонецЕсли;
КонецПроцедуры
Функция КаталогСтатики()
КаталогОбработчика = СтрЗаменить(ТекущийСценарий().Каталог, "\", "/");
ЭлементыПути = СтрРазделить(КаталогОбработчика, "/");
Для Н = 1 По 6 Цикл
ЭлементыПути.Удалить(ЭлементыПути.ВГраница());
КонецЦикла;
ЭлементыПути.Добавить("web");
ПутьСтатики = СтрСоединить(ЭлементыПути, "/");
ПутьСтатики = ПутьСтатики + "/";
Возврат ПутьСтатики;
КонецФункции

View File

@@ -26,20 +26,5 @@
Путь = Контекст.Запрос.Путь;
Если СтрНачинаетсяС(Путь, "/web") Тогда
Статика.ВернутьСтатику(Контекст, Путь);
ИначеЕсли Путь = "/ui/menu" Тогда
Меню.ОбработатьМеню(Контекст, Проект);
ИначеЕсли Путь = "/ui/handler" Тогда
Обработчики.ВернутьДанные(Контекст, Проект);
Иначе
Инструменты.ВернутьНеНайдено(Контекст);
КонецЕсли;
КонецПроцедуры

View File

@@ -2,21 +2,41 @@
#Область СлужеюныйПрограммныйИнтерфейс
Процедура ПриСозданииОбъекта(Проект)
ПутьКБазе = Проект;
КонецПроцедуры
Процедура ПриСозданииОбъекта(Проект, СоздаватьНовый = Ложь)
OPI_ПреобразованиеТипов.ПолучитьСтроку(Проект);
ПутьКБазе = Проект;
Если СоздаватьНовый Тогда
Инициализировать();
Иначе
ПроверитьСуществование();
КонецЕсли;
Процедура Инициализировать() Экспорт
НормализоватьПроект();
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Процедура ПроверитьСуществование()
ФайлПроекта = Новый Файл(ПутьКБазе);
Если Не ФайлПроекта.Существует() Тогда
ВызватьИсключение "Файл проекта по указанному пути не найден";
КонецЕсли;
Если ФайлПроекта.ЭтоКаталог() Тогда
ВызватьИсключение "Передан путь к каталогу, а не файл проекта";
КонецЕсли;
КонецПроцедуры
Процедура НормализоватьПроект()
ФайлБазы = Новый Файл(ПутьКБазе);
ФайлБазы = Новый Файл(ПутьКБазе);
Если ФайлБазы.ЭтоКаталог() Тогда
@@ -35,6 +55,9 @@
Если Не ФайлБазы.Существует() Тогда
СоздатьНовыйПроект();
Сообщить("Файл проекта успешно создан!");
Иначе
Сообщить("Файл проекта по заданному пути уже существует!");
КонецЕсли;
КонецПроцедуры

View File

@@ -4,26 +4,36 @@
#Область СлужебныйПрограммныйИнтерфейс
// Создать проект
// Создает файл проекта по выбранному пути
//
// Параметры:
// Путь - Строка - Путь к файлу проекта - path
// Возвращаемое значение:
// Неопределено - функция не возвращает данные
Функция СоздатьПроект(Знач Путь) Экспорт
Проект = Новый Проект(Проект, Истина);
Возврат Неопределено;
КонецФункции
// Запустить
// Запускает прокси сервер интеграций
//
// Параметры:
// Порт - Число - Порт запуска сервера - port
// Проект - Строка - Путь к файлу проекта - proj
// Пароль - Строка - Пароль проекта - pass
// Возвращаемое значение:
// Строка - пустая строка
Функция Запустить(Знач Порт, Знач Проект, Знач Пароль) Экспорт
Функция Запустить(Знач Порт, Знач Проект) Экспорт
OPI_ПреобразованиеТипов.ПолучитьЧисло(Порт);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Пароль);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Проект);
ТекущийПроект = Новый Проект(Проект);
ТекущийПроект.Инициализировать();
ВебСервер = Новый ВебСервер(Порт);
Обработчик = Новый ОбработчикЗапросов(ТекущийПроект);
ВебСервер = Новый ВебСервер(Порт);
Обработчик = Новый ОбработчикЗапросов(ТекущийПроект);
ВебСервер.ДобавитьОбработчикЗапросов(Обработчик, "ОсновнаяОбработка");
ВебСервер.Запустить();

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,25 +0,0 @@
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>GitHub Actions Interface with HTMX</title>
<script src="/web/htmx.min.js"></script>
<script src="/web/script.js"></script>
<link rel="stylesheet" href="/web/bulma.min.css">
<link rel="stylesheet" href="/web/style.css">
</head>
<body>
<div class="columns is-mobile is-fullheight">
<div class="column is-3-desktop is-12-mobile sidebar" hx-get="/ui/menu" hx-trigger="load" hx-swap="innerHTML">
</div>
<main class="column is-9-desktop is-12-mobile content" id="main-content">
<h1 class="title">Добро пожаловать в панель управления</h1>
<p>Здесь будет основной контент вашей панели управления.</p>
</main>
</div>
</body>
</html>

View File

@@ -1,59 +0,0 @@
document.addEventListener('DOMContentLoaded', function () {
// Функция для изменения ширины боковой панели
function resizeSidebar() {
const sidebar = document.querySelector('.sidebar');
const resizer = document.querySelector('.resizer');
if (!sidebar || !resizer) {
console.warn('Sidebar or resizer not found.');
return;
}
let startX, startWidth;
resizer.addEventListener('mousedown', function (e) {
startX = e.pageX - sidebar.offsetLeft;
startWidth = parseInt(getComputedStyle(sidebar).width, 10);
document.documentElement.style.cursor = 'col-resize';
document.body.style.userSelect = 'none'; // Отключаем выделение текста
document.addEventListener('mousemove', onMouseMove);
document.addEventListener('mouseup', onMouseUp);
});
function onMouseMove(e) {
const width = startWidth + (e.pageX - startX);
if (width >= 100 && width <= window.innerWidth - 200) { // Минимальная и максимальная ширина
sidebar.style.width = `${width}px`;
}
}
function onMouseUp() {
document.documentElement.style.cursor = 'default';
document.body.style.userSelect = 'auto';
document.removeEventListener('mousemove', onMouseMove);
document.removeEventListener('mouseup', onMouseUp);
}
}
// Инициализация функции изменения ширины боковой панели
function initResizeSidebar() {
const sidebar = document.querySelector('.sidebar');
const resizer = document.querySelector('.resizer');
if (sidebar && resizer) {
resizeSidebar();
} else {
console.warn('Sidebar or resizer not found. Retrying...');
setTimeout(initResizeSidebar, 100); // Попробуем снова через 100 мс
}
}
// Вызываем инициализацию после загрузки DOM
initResizeSidebar();
// Подписываемся на событие htmx:afterSwap, чтобы инициализировать заново при обновлении контента
document.body.addEventListener('htmx:afterSwap', function (event) {
initResizeSidebar();
});
});

View File

@@ -1,36 +0,0 @@
.container {
display: flex;
height: 100vh;
}
.sidebar {
background-color: #f5f5f5;
padding-top: 20px;
display: flex;
flex-direction: column;
justify-content: space-between;
position: relative;
z-index: 1; /* Чтобы рычаг был поверх других элементов */
transition: width 0.3s ease; /* Добавляем анимацию изменения ширины */
}
.resizer {
width: 5px;
background-color: #ccc;
cursor: col-resize;
position: absolute;
right: 0;
top: 0;
bottom: 0;
z-index: 2; /* Чтобы рычаг был поверх других элементов */
}
.content {
padding: 20px;
flex-grow: 1;
}
.button-container {
width: 100%;
text-align: center;
margin-bottom: 20px;
}
.menu {
flex-grow: 1;
}