From 6c26761b51b78b646f2fccab4b4c5269439f12b3 Mon Sep 17 00:00:00 2001
From: Pavel Antonov <antonov@perx.ru>
Date: Tue, 22 Aug 2023 11:00:17 +0400
Subject: [PATCH] =?UTF-8?q?Actions=20=D0=B4=D0=BE=D0=BF=D0=BE=D0=BB=D0=BD?=
 =?UTF-8?q?=D0=B5=D0=BD=D0=BE=20=D0=BE=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8?=
 =?UTF-8?q?=D0=B5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 proto/extensions/extension.proto | 76 ++++++++++++++++++++++++++++++++
 1 file changed, 76 insertions(+)

diff --git a/proto/extensions/extension.proto b/proto/extensions/extension.proto
index ba82ecd..754b258 100644
--- a/proto/extensions/extension.proto
+++ b/proto/extensions/extension.proto
@@ -151,11 +151,32 @@ message ActionResponse {
   }
 
   State state = 10000;  // Состояние расширение
+
   string msg = 10100; // Сообщение о выполнении действия
+  string title = 10110; // Текст для отображения в интерфейсе
+  string html = 10120; // HTML для отображения в интерфейсе (альтернатива msg)
+  string md = 10130; // HTML для отображения в интерфейсе (альтернатива msg)
+  string image = 10140; // Изображение для отображения в интерфейсе (шапке окна)
   string error = 10200; // Сообщение в случае ошибки
+
+  enum Target {
+    MODAL = 0; // Открыть во всплывающем окне
+    WIDE_MODAL = 1; // Открыть во всплывающем широком окне (вся страница)
+    WORKSPACE = 2; // Открыть в рабочей области (без меню)
+    NOTIFICATION = 3; // Открыть в виде уведомления
+    DRAWER = 4; // Открыть в виде выдвижной панели
+    NEW_WINDOW = 100; // Открыть в новом окне
+    NONE = 1000; // Без отображения результата
+  }
+
+  // Как открывать результат выполнения действия
+  // В случае ответа в виде HTML/MD, открывать аналогично WIDE_MODAL, или брать значние из заголовка 'X-Action-Target'
+  Target target = 10210;
+
   repeated Action next = 10300; // Следующие возможные действия. Интерфейс отображает как варианты дальнейших действий пользователя
   map<string,string>metadata = 10400; // Метаданные запроса
   repeated content.references.Reference refs = 10320; // Ссылки на записи (назначение ссылок зависит от действия и расширения)
+
 }
 
 
@@ -186,10 +207,52 @@ message Action {
     ITEMS = 5; // Действие связано с несколькими записями (требуется передача space_id, env_id, collection_id, item_ids). Отображается на экране списка записей.
     REVISION = 6; // Действие связано с ревизией записи (требуется передача space_id, env_id, collection_id, item_id, rev_id). На данный момент не используется.
     CREATE = 7; // Действие создание записи (требуется передача space_id, env_id, collection_id).
+    MAIN_MENU = 10000; // Действие отображается в главном меню (требуется передача space_id, env_id)
+    MAIN_MENU_BOTTOM = 10010; // Действие отображается в главном меню внизу (требуется передача space_id, env_id)
+  }
+
+  enum ActionType {
+    REQUEST = 0; // Действие выполняет запрос на сервер
+    NAVIGATION = 1; // Действие переносит пользователя в другую часть интерфейса
   }
 
+  ActionType action_type = 9000; // Тип действия
+
   string extension = 10000; // Расширение
   string action = 10100; // Идентификатор действия
+
+
+  // URL для запроса действия (альтернатива `extension` и `action`). В случае если параметр
+  // `action_url` указан, то интерфейс не запрашивает расширение и действие, а выполняет запрос по указанному URL используя
+  // указанный протокол. В случае если указан `action_url` то `extension` и `action` игнорируются.
+  //
+  // Для форматов HTML/MD относительные ссылки в тексте преобразуются в абсолютные используя `action_url` в качестве
+  // базового URL.
+  //
+  // Пример: `https://example.com/api/v1/action` - будет выполнен запрос HTTP по указанному URL.
+  // Сервер может вернуть ответ в формате JSON или HTML/MD. Дальнейшие действия определяется оп заголовку ответа
+  // `Content-Type`:
+  // - `application/json` - ответ в формате JSON. Структура ответа соответствует `ActionResponse` и интерпретируется
+  // тем же способом что и ответ от GRPC.
+  // - `text/html` - ответ в формате HTML. Интерфейс отображает ответ в виде сообщения.
+  // - `text/markdown` - ответ в формате MD. Интерфейс отображает ответ в виде сообщения.
+  //
+  // Пример: `grpc://example.com/api/v1/action` - будет выполнен запрос GRPC по указанному URL.
+  // Сервер может вернуть ответ в `ActionResponse`.
+  //
+  // action_type == "NAVIGATION" - Строка шаблон для перехода в интерфейсе
+  // При указании полного адреса (http(s)://xyz), URL открывается в новом окне браузера
+  // Относительный адрес в пользовательском интерфейсе переносит пользователя в соответствующий раздел без перезагрузки приложения
+  //
+  // Переменные `:var` заменяются на текуще значение в пользовательском интерфейсе (Пример: `/spaces/:spaceId/envs/:envId/cols/:colId`)
+  // Перечень переменных для подстановки:
+  // - :spaceId
+  // - :envId
+  // - :colId
+  // - :itemId
+  //
+  string action_url = 10110;
+
   string name = 10200; // Название действия для отображения в интерфейсе (пункт меню, кнопка).
   string description = 10210; // Описание действия для отображения в интерфейсе
   string icon = 10220; // Название иконки для отображения действия в интерфейсе
@@ -209,6 +272,8 @@ message Action {
   string params_collection = 10330;
 
   ActionRequest request = 10400; // Параметры запроса (используется в случае `ActionResponse.next`)
+
+  // DEPRECATED: Используйте `action_url` вместо `navigation_route`
   bool navigation_action = 10500; // Флаг указывающий что действие переносить пользователя в другую часть интерфейса, а не отправляет запрос на сервер
 
   // navigation_route - Строка шаблон для перехода в интерфейсе
@@ -222,5 +287,16 @@ message Action {
   // - :colId
   // - :itemId
   //
+  // DEPRECATED: Используйте `action_type == "NAVIGATION"`
   string navigation_route = 10510;
+
+  enum Autorun {
+    NONE = 0; // Действие не выполняется автоматически
+    ONCE_PER_USER = 1; // Действие выполняется при старте приложения
+    PER_USER_SESSION = 2; // Действие выполняется при старте приложения и при каждом перезапуске приложения
+    ONCE_SPACE = 3; // Действие выполняется при старте приложения и при каждом перезапуске приложения
+  }
+
+  Autorun autorun = 10520; // Параметр указывающий что действие выполняется автоматически
+  bool confirm = 10530; // Параметр указывающий что действие требует подтверждения пользователя
 }
\ No newline at end of file
-- 
GitLab