You've already forked OpenIntegrations
mirror of
https://github.com/Bayselonarrend/OpenIntegrations.git
synced 2025-08-10 22:41:43 +02:00
PRX: Откад web, начало консольного
This commit is contained in:
@@ -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>";
|
||||
Возврат СтрШаблон(Шаблон, Ссылка, Текст);
|
||||
|
||||
КонецФункции
|
@@ -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>";
|
||||
|
||||
|
||||
КонецФункции
|
@@ -1,36 +0,0 @@
|
||||
Процедура ВернутьСтатику(Контекст, Путь) Экспорт
|
||||
|
||||
ПутьКФайлу = Прав(Путь, СтрДлина(Путь) - 4);
|
||||
ПутьКФайлу = ?(Не ЗначениеЗаполнено(ПутьКФайлу) Или ПутьКФайлу = "/", "/index.html", ПутьКФайлу);
|
||||
|
||||
ПутьКФайлуСтатики = КаталогСтатики() + ПутьКФайлу;
|
||||
ФайлСтатики = Новый Файл(ПутьКФайлуСтатики);
|
||||
|
||||
Если ФайлСтатики.Существует() Тогда
|
||||
Данные = Новый ФайловыйПоток(ПутьКФайлуСтатики, РежимОткрытияФайла.Открыть);
|
||||
Данные.КопироватьВ(Контекст.Ответ.Тело);
|
||||
Данные.Закрыть();
|
||||
Иначе
|
||||
Контекст.Ответ.КодСостояния = 404;
|
||||
КонецЕсли;
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Функция КаталогСтатики()
|
||||
|
||||
КаталогОбработчика = СтрЗаменить(ТекущийСценарий().Каталог, "\", "/");
|
||||
|
||||
ЭлементыПути = СтрРазделить(КаталогОбработчика, "/");
|
||||
|
||||
Для Н = 1 По 6 Цикл
|
||||
ЭлементыПути.Удалить(ЭлементыПути.ВГраница());
|
||||
КонецЦикла;
|
||||
|
||||
ЭлементыПути.Добавить("web");
|
||||
|
||||
ПутьСтатики = СтрСоединить(ЭлементыПути, "/");
|
||||
ПутьСтатики = ПутьСтатики + "/";
|
||||
|
||||
Возврат ПутьСтатики;
|
||||
|
||||
КонецФункции
|
@@ -26,20 +26,5 @@
|
||||
|
||||
Путь = Контекст.Запрос.Путь;
|
||||
|
||||
Если СтрНачинаетсяС(Путь, "/web") Тогда
|
||||
|
||||
Статика.ВернутьСтатику(Контекст, Путь);
|
||||
|
||||
ИначеЕсли Путь = "/ui/menu" Тогда
|
||||
|
||||
Меню.ОбработатьМеню(Контекст, Проект);
|
||||
|
||||
ИначеЕсли Путь = "/ui/handler" Тогда
|
||||
|
||||
Обработчики.ВернутьДанные(Контекст, Проект);
|
||||
|
||||
Иначе
|
||||
Инструменты.ВернутьНеНайдено(Контекст);
|
||||
КонецЕсли;
|
||||
|
||||
КонецПроцедуры
|
@@ -2,21 +2,41 @@
|
||||
|
||||
#Область СлужеюныйПрограммныйИнтерфейс
|
||||
|
||||
Процедура ПриСозданииОбъекта(Проект)
|
||||
ПутьКБазе = Проект;
|
||||
КонецПроцедуры
|
||||
Процедура ПриСозданииОбъекта(Проект, СоздаватьНовый = Ложь)
|
||||
|
||||
OPI_ПреобразованиеТипов.ПолучитьСтроку(Проект);
|
||||
|
||||
ПутьКБазе = Проект;
|
||||
|
||||
Если СоздаватьНовый Тогда
|
||||
Инициализировать();
|
||||
Иначе
|
||||
ПроверитьСуществование();
|
||||
КонецЕсли;
|
||||
|
||||
Процедура Инициализировать() Экспорт
|
||||
НормализоватьПроект();
|
||||
КонецПроцедуры
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#Область СлужебныеПроцедурыИФункции
|
||||
|
||||
Процедура ПроверитьСуществование()
|
||||
|
||||
ФайлПроекта = Новый Файл(ПутьКБазе);
|
||||
|
||||
Если Не ФайлПроекта.Существует() Тогда
|
||||
ВызватьИсключение "Файл проекта по указанному пути не найден";
|
||||
КонецЕсли;
|
||||
|
||||
Если ФайлПроекта.ЭтоКаталог() Тогда
|
||||
ВызватьИсключение "Передан путь к каталогу, а не файл проекта";
|
||||
КонецЕсли;
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура НормализоватьПроект()
|
||||
|
||||
ФайлБазы = Новый Файл(ПутьКБазе);
|
||||
ФайлБазы = Новый Файл(ПутьКБазе);
|
||||
|
||||
Если ФайлБазы.ЭтоКаталог() Тогда
|
||||
|
||||
@@ -35,6 +55,9 @@
|
||||
|
||||
Если Не ФайлБазы.Существует() Тогда
|
||||
СоздатьНовыйПроект();
|
||||
Сообщить("Файл проекта успешно создан!");
|
||||
Иначе
|
||||
Сообщить("Файл проекта по заданному пути уже существует!");
|
||||
КонецЕсли;
|
||||
|
||||
КонецПроцедуры
|
||||
|
@@ -4,26 +4,36 @@
|
||||
|
||||
#Область СлужебныйПрограммныйИнтерфейс
|
||||
|
||||
// Создать проект
|
||||
// Создает файл проекта по выбранному пути
|
||||
//
|
||||
// Параметры:
|
||||
// Путь - Строка - Путь к файлу проекта - path
|
||||
// Возвращаемое значение:
|
||||
// Неопределено - функция не возвращает данные
|
||||
Функция СоздатьПроект(Знач Путь) Экспорт
|
||||
|
||||
Проект = Новый Проект(Проект, Истина);
|
||||
Возврат Неопределено;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Запустить
|
||||
// Запускает прокси сервер интеграций
|
||||
//
|
||||
// Параметры:
|
||||
// Порт - Число - Порт запуска сервера - port
|
||||
// Проект - Строка - Путь к файлу проекта - proj
|
||||
// Пароль - Строка - Пароль проекта - pass
|
||||
// Возвращаемое значение:
|
||||
// Строка - пустая строка
|
||||
Функция Запустить(Знач Порт, Знач Проект, Знач Пароль) Экспорт
|
||||
Функция Запустить(Знач Порт, Знач Проект) Экспорт
|
||||
|
||||
OPI_ПреобразованиеТипов.ПолучитьЧисло(Порт);
|
||||
OPI_ПреобразованиеТипов.ПолучитьСтроку(Пароль);
|
||||
OPI_ПреобразованиеТипов.ПолучитьСтроку(Проект);
|
||||
|
||||
ТекущийПроект = Новый Проект(Проект);
|
||||
ТекущийПроект.Инициализировать();
|
||||
|
||||
ВебСервер = Новый ВебСервер(Порт);
|
||||
Обработчик = Новый ОбработчикЗапросов(ТекущийПроект);
|
||||
ВебСервер = Новый ВебСервер(Порт);
|
||||
Обработчик = Новый ОбработчикЗапросов(ТекущийПроект);
|
||||
|
||||
ВебСервер.ДобавитьОбработчикЗапросов(Обработчик, "ОсновнаяОбработка");
|
||||
ВебСервер.Запустить();
|
||||
|
3
src/ru/cli/web/bulma.min.css
vendored
3
src/ru/cli/web/bulma.min.css
vendored
File diff suppressed because one or more lines are too long
1
src/ru/cli/web/htmx.min.js
vendored
1
src/ru/cli/web/htmx.min.js
vendored
File diff suppressed because one or more lines are too long
@@ -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>
|
@@ -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();
|
||||
});
|
||||
});
|
@@ -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;
|
||||
}
|
Reference in New Issue
Block a user