Документация по фронтенду

Схема API

Эта схема показывает, как данные проходят через приложение от и до API.

Сигналы

Система сигналов - это механизм, который VST Utils использует для настройки приложения.

Давайте посмотрим, как это работает.

Очень часто вам нужно что-то изменить после того, как произошло какое-то событие. Но как вы можете узнать о этом событии? А что, если вам нужно знать об этом событии в нескольких блоках кода?

Чтобы решить эту проблему, VST Utils использует систему сигналов, где:

  • вы можете отправить какой-то сигнал, который сообщит всем подписчикам, что произошло какое-то событие, и передать некоторые данные/переменные из контекста, где произошло это событие;

  • вы можете подписаться на какой-то сигнал, который уведомит вас о каком-то событии, и вы также можете передать некоторый обратный вызов (обработчик), который может делать что-то с данными/переменными, которые были переданы из контекста, где произошло событие.

Генерация сигнала

Чтобы сгенерировать сигнал, вам нужно написать следующее в своем коде:

tabSignal.emit(name_of_signal, context);

где:

  • name_of_signal - строка, которая хранит имя сигнала (события);

  • context - некоторая переменная любого типа, которая будет передана в обратный вызов (обработчик) во время подключения к этому сигналу.

Пример генерации сигнала:

let app = {
    name: 'example of app';
};

tabSignal.emit('app.created', app);

Подключение к сигналу

Чтобы подключиться к какому-то сигналу, вам нужно написать следующее в своем коде:

tabSignal.connect(name_of_signal, callback);

где:

  • name_of_signal - строка, которая хранит имя сигнала (события);

  • callback - функция, которая может выполнять действия с переменными, которые будут переданы из контекста события в этот обратный вызов в качестве аргументов.

Пример подключения к сигналу:

/* ... */
function callback(app) {
    app.title = 'example of app title';
}

tabSignal.connect('app.created', callback);
/* ... */

Список сигналов в VST Utils

VST Utils имеет несколько сигналов, которые генерируются во время работы приложения. Если вам нужно настроить что-то в вашем проекте, вы можете подписаться на эти сигналы и добавить функцию обратного вызова с желаемым поведением. Также вы можете генерировать свои сигналы в своем проекте.

openapi.loaded

Имя сигнала: «openapi.loaded».

Аргумент контекста: openapi - {object} - OpenAPI-схема, загруженная из API.

Описание: Этот сигнал генерируется после загрузки схемы OpenAPI. Вы можете использовать этот сигнал, если вам нужно что-то изменить в схеме OpenAPI, прежде чем она будет разобрана.

resource.loaded

Имя сигнала: «resource.loaded».

Аргумент контекста: Нет.

Описание: Этот сигнал генерируется после успешной загрузки всех статических файлов и их добавления на страницу.

app.version.updated

Имя сигнала: «app.version.updated».

Аргумент контекста: Нет.

Описание: Этот сигнал генерируется во время загрузки приложения, если VST Utils обнаруживает, что версия вашего проекта была обновлена.

app.beforeInitRouter

Имя сигнала: «app.beforeInitRouter».

Аргумент контекста: obj - {object} - Объект со следующей структурой: {routerConstructor: RouterConstructor}, где routerConstructor - это экземпляр RouterConstructor.

Описание: Этот сигнал генерируется после создания экземпляра RouterConstructor и перед созданием приложения.

app.beforeInit

Имя сигнала: «app.beforeInit».

Аргумент контекста: obj - {object} - Объект со следующей структурой: {app: app}, где app - это экземпляр класса App.

Описание: Этот сигнал генерируется после инициализации переменной приложения (разбор схемы OpenAPI, создание моделей и представлений), но перед тем, как приложение будет смонтировано на страницу.

app.afterInit

Имя сигнала: «app.afterInit».

Аргумент контекста: obj - {object} - Объект со следующей структурой: {app: app}, где app - это экземпляр класса App.

Описание: Этот сигнал генерируется после того, как приложение было смонтировано на страницу.

app.language.changed

Имя сигнала: «app.language.changed».

Аргумент контекста: obj - {object} - Объект со следующей структурой: {lang: lang}, где lang - это код примененного языка.

Описание: Этот сигнал генерируется после изменения языка интерфейса приложения.

models[model_name].fields.beforeInit

Имя сигнала: «models[» + model_name + «].fields.beforeInit». Например, для модели пользователя: «models[User].fields.beforeInit».

Контекстный аргумент: fields - {object} - Объект с парами ключ-значение, где ключ - имя поля, значение - объект с его опциями. На данный момент поле - просто объект с опциями, это не экземпляр guiFields.

Описание: Этот сигнал генерируется перед созданием экземпляров guiFields для полей модели.

models[model_name].fields.afterInit

Имя сигнала: «models[» + model_name + «].fields.afterInit». Например, для модели пользователя: «models[User].fields.afterInit».

Контекстный аргумент: fields - {object} - Объект с парами ключ-значение, где ключ - имя поля, значение - экземпляр guiFields.

Описание: Этот сигнал генерируется после создания экземпляров guiFields для полей модели.

models[model_name].created

Имя сигнала: «models[» + model_name + «].created». Например, для модели пользователя: «models[User].created».

Контекстный аргумент: obj - {object} - Объект со следующей структурой: {model: model}, где model - созданная модель.

Описание: Этот сигнал генерируется после создания объекта модели.

allModels.created

Имя сигнала: «allModels.created».

Контекстный аргумент: obj - {object} - Объект со следующей структурой: {models: models}, где models - объект, хранящий объекты моделей.

Описание: Этот сигнал генерируется после создания всех моделей.

allViews.created

Имя сигнала: «allViews.created».

Контекстный аргумент: obj - {object} - Объект со следующей структурой: {views: views}, где views - объект со всеми экземплярами представлений.

Описание: Этот сигнал генерируется после создания всех экземпляров представлений с установленными свойствами actions / child_links / multi_actions / operations / sublinks.

routes[name].created

Имя сигнала: «routes[» + name + «].created». Например, для представления /user/: «routes[/user/].created».

Контекстный аргумент: route - {object} - Объект со следующей структурой: {name: name, path: path, component: component}, где name - имя маршрута, path - шаблон пути маршрута, component - компонент, который будет отображаться для текущего маршрута.

Описание: Этот сигнал будет генерироваться после формирования маршрута и добавления его в список маршрутов.

allRoutes.created

Имя сигнала: «allRoutes.created».

Контекстный аргумент: routes - {array} - Массив объектов маршрутов со следующей структурой: {name: name, path: path, component: component}, где name - имя маршрута, path - шаблон пути маршрута, component - компонент, который будет отображаться для текущего маршрута.

Описание: Этот сигнал генерируется после формирования всех маршрутов и добавления их в список маршрутов.

<${PATH}>filterActions

Имя сигнала: «<${PATH}>filterActions».

Контекстный аргумент: obj - {actions: Object[], data} - Actions - массив объектов действий. Data представляет данные текущего экземпляра.

Описание: Этот сигнал будет выполнен для фильтрации действий.

Field Format

Файловые форматы

Часто при создании нового приложения разработчикам нужно создавать общие поля некоторых базовых типов и форматов (строка, булево, число и так далее). Создание каждый раз подобной функциональности довольно скучно и неэффективно, поэтому мы попытались решить эту проблему с помощью VST Utils.

VST Utils содержит набор встроенных полей наиболее распространенных типов и форматов, которые могут использоваться в различных случаях. Например, когда вам нужно добавить какое-то поле в веб-форму, которое должно скрывать значение вставленного значения, просто установите соответствующий формат поля на password вместо string, чтобы вместо фактических символов отображались звездочки.

Все доступные классы полей хранятся в переменной guiFields.На данный момент в VST Utils 44 формата полей:

  • base - базовое поле, все остальные поля наследуются от этого поля;

  • string - строковое поле для вставки и представления коротких значений „string“;

  • textarea - строковое поле для вставки и представления длинных значений „string“;

  • number - числовое поле для вставки и представления значений „number“;

  • integer - числовое поле для вставки и представления значений формата „integer“;

  • int32 - числовое поле для вставки и представления значений формата „int32“;

  • int64 - числовое поле для вставки и представления значений формата „int64“;

  • double - числовое поле для вставки и представления значений формата „double“;

  • float - числовое поле для вставки и представления значений формата „float“;

  • boolean - логическое поле для вставки и представления значений „boolean“;

  • choices - строковое поле с жестким набором предопределенных значений, пользователь может выбрать только одно из доступных значений;

  • autocomplete - строковое поле с набором предопределенных значений, пользователь может либо выбрать одно из доступных значений, либо ввести свое собственное значение;

  • password - строковое поле, скрывающее вставленное значение знаками „*“

  • file - строковое поле, способное считывать содержимое файла;

  • secretfile - строковое поле, которое может считать содержимое файла, а затем скрыть его при отображении;

  • binfile - строковое поле, которое может считать содержимое файла и преобразовывать его в формат „base64“;

  • namedbinfile - поле в формате JSON, которое принимает и возвращает JSON с 2 свойствами: name (строка) - имя файла и content (строка base64) - содержание файла;

  • namedbinimage - поле в формате JSON, которое принимает и возвращает JSON с 2 свойствами: name (строка) - имя изображения и content (строка base64) - содержание изображения;

  • multiplenamedbinimage - поле в формате JSON, которое принимает и возвращает массив объектов, состоящих из 2 свойств: name (строка) - имя изображения и content (строка base64) - содержание изображения;

  • multiplenamedbinimage - поле в формате JSON, которое принимает и возвращает массив объектов, состоящих из 2 свойств: name (строка) - имя изображения и content (строка base64) - содержание изображения;

  • text_paragraph - строковое поле, представленное в виде текстового абзаца (без каких-либо вводов);

  • plain_text - строковое поле, сохраняющее все непечатные символы во время представления;

  • html - строковое поле, содержащее различные теги HTML и отображающее их во время представления;

  • date - поле даты для вставки и представления значений „date“ в формате „YYYY-MM-DD“;

  • date_time - поле даты для вставки и представления значений „date“ в формате „YYYY-MM-DD HH:mm“;

  • uptime - строковое поле, которое преобразует продолжительность времени (количество секунд) в один из наиболее подходящих вариантов (23:59:59 / 01d 00:00:00 / 01m 30d 00:00:00 / 99y 11m 30d 22:23:24) в зависимости от его размера;

  • time_interval - числовое поле, которое преобразует время из миллисекунд в секунды;

  • crontab - строковое поле, которое имеет дополнительную форму для создания расписания в формате „crontab“;

  • json - поле в формате JSON, во время представления использует другие guiFields для представления текущих свойств поля;

  • api_object - поле, используемое для представления некоторого экземпляра модели из API (значение этого поля - все данные экземпляра модели). Это только для чтения поле;

  • fk - поле, используемое для представления некоторого экземпляра модели из API (значение этого поля - первичный ключ экземпляра модели). Во время режима редактирования у этого поля есть строгий набор предопределенных значений для выбора;

  • fk_autocomplete - поле, используемое для представления некоторого экземпляра модели из API (значение этого поля - первичный ключ экземпляра модели или некоторая строка). Во время режима редактирования пользователь может либо выбрать одно из предопределенных значений из списка автозаполнения, либо ввести свое собственное значение;

  • fk_multi_autocomplete - поле, используемое для представления некоторого экземпляра модели из API (значение этого поля - первичный ключ экземпляра модели или некоторая строка). Во время режима редактирования пользователь может либо выбрать одно из предопределенных значений из модального окна, либо ввести свое собственное значение;

  • color - строковое поле, которое сохраняет шестнадцатеричный код выбранного цвета;

  • inner_api_object - поле, которое связано с полями другой модели;

  • api_data - поле для представления некоторых данных из API;

  • dynamic - поле, которое может изменять свой формат в зависимости от значений окружающих полей;

  • hidden - поле, скрытое от представления;

  • form - поле, объединяющее несколько других полей и сохраняющее их значения как один JSON, где key - имя поля формы, value - значение поля формы;

  • button - специальное поле для формы, имитирующее кнопку в форме;

  • string_array - поле, преобразующее массив строк в одну строку;

  • string_id - строковое поле, предназначенное для использования в URL как ключ „id“. Он имеет дополнительную проверку, которая проверяет, что значение поля не равно некоторым другим ключам URL (new/ edit/ remove).

Настройка макета с использованием CSS

Если вам нужно настроить элементы с помощью CSS, у нас есть некоторая функциональность для этого. К корневым элементам EntityView (если он содержит ModelField), ModelField, ListTableRow и MultiActions применяются классы в зависимости от полей, которые они содержат. Классы формируются для полей типов «boolean» и «choices». Кроме того, классы применяются к кнопкам операций и ссылкам.

Правила генерации классов:

  • EntityView, ModelField и ListTableRow - field-[field_name]-[field-value]

    Пример:
    • «field-active-true» для модели, содержащей поле «boolean» с именем «active» и значением «true»

    • «field-tariff_type-WAREHOUSE» для модели, содержащей поле «choices» с именем «tariff_type» и значением «WAREHOUSE»

  • MultiActions - selected__field-[field_name]-[field-value]
    Пример:

    «selected__field-tariff_type-WAREHOUSE» и «selected__field-tariff_type-SLIDE», если выбраны 2 строки ListTableRow, содержащие поле «choices» с именем «tariff_type» и значениями «WAREHOUSE» и «SLIDE» соответственно.

  • Operation - operation__[operation_name]
    Предупреждение

    Если вы скрываете операции с использованием классов CSS и, например, все действия были скрыты, то кнопка выпадающего списка действий все равно будет видна.

    Для более тщательного контроля над действиями и подссылками см. Изменение действий или подссылок

    Пример:

    operation__pickup_point, если кнопка операции или ссылка имеют имя pickup_point

На основе этих классов вы можете изменять стили различных элементов.

Несколько вариантов использования:
  • Если вам нужно скрыть кнопку для действия «change_category» на странице подробной информации о продукте, когда продукт неактивен, вы можете сделать это, добавив селектор CSS:

    .field-status-true .operation__change_category {
        display: none;
    }
    
  • Скрыть кнопку для действия «remove» в меню MultiActions, если выбран хотя бы один продукт со статусом «active»:

    .selected__field-status-true .operation__remove {
        display: none;
    }
    
  • Если вам нужно изменить цвет фона на красный для заказа со статусом «CANCELLED» на компоненте ListView, сделайте следующее:

    .item-row.field-status-CANCELLED {
        background-color: red;
    }
    

    В этом случае вам нужно использовать дополнительный класс «item-row» (Используется для напримера, вы можете выбрать другой) для указания элемента, который будет выбран в селекторе, потому что класс «field-status-CANCELLED» добавляется в различные места на странице.