Базовые примитивы
Навигация
Вся навигация получается фронтедом по запросу graphql {navigations { ... }}
, и в дальнейшем обновляется по подписке {subscribe navigations { ... }}
# для тестирования
{navigations {
options
navigation_menu
}}
Название ключей options не чувствительны к регистру.
Меню блюд и разделы меню блюд
Меню блюд может быть 4 типов
Признаком того что конкретный обьект является навигацией по меню блюд, является свойство в { options.specification: "RestoMenu/v1"}
Базовый элемент:
{
"label": "Блинчики", // Название пункта меню *
"slug": "blinchiki", //Слаг группы *
"workTime": "10:00-12:00", // Время работы ( Поле существует для бекэнда, на фронтенде происходит обновление по подписке)
"active": true, // Дизейбл (реагирует на нажатие) (необязательное поле, по умолчанию считаем что true)
"visible": true, // Показывать ли пункт меню (необязательное поле, по умолчанию считаем что true)
}
PS
controller
не используется для меню блюд.
Концепт и разные версии одного и того же меню.
Для реализации функционала предоставления скидок на предлагаемое меню используется понятие “концепта”.
Концепт устанавливается в свойстве { options.concept: string | 'origin' }
.
‘origin’ - значение концепта по умолчанию.
Для получения соответствуюшего концепту списка групп меню и их блюд нужно:
- (при использовании библиотеки @webresto/ng-gql и стандартной схемы навигации)
Библиотека при загрузке групп и блюд автоматически использует значение концепта, указанное в
options.concept
объекта навигации. Дополнительно ничего предпринимать не нужно. - (при самостоятельном выполнении запросов к серверу) Передать актуальное значение concept в объекте criteria, который используется в качестве параметра запросов (и подписок) на получение групп ( query group …) и блюд ( query dish …).
query loadGroup {
group(criteria:{
slug:"dostavka",
concept:"dostavka"
}) {
childGroups {
slug
id
}
}
}
Типы обработки:
Дает возможность по разному реализовать поведение пунктов меню. Для этого нужно установить свойство { options.behavior: "NewPageBySlug"}
Свойство: если не установленно то по дефолту рендрит 3 тип.
Если массив пустой и есть initSlug то рендрит по второму типу
Если массив пустой и нету initSlug
то будет ошибка
NewPageBySlug
Построение через initSlug где каждый раздел создается на своей страницеOnePageBySlug
Построение через initSlug где все подразделы на одной страницы с навигацией по # (переход реализуется прокруткой)NewPageByNavigationMenu
Построение из меню которое пришло в navigation_menu где каждый раздел создается на своей страницеOnePageByNavigationMenu
Построение из меню которое пришло в navigation_menu где все разделы аккамулируются на одной странице, акамуляция происходит по массиву изnavigation_menu
с учетом очереди
Пример:
В текущем примере установленно значение NewPageByNavigationMenu это означает что при обработке меню фронтенд проигнорирует свойство initSlug
{
"mnemonicId": "menu",
"description": "Dish menu for delivery food website 2",
"navigation_menu": [
{
"label": "Снэк",
"slug": "snek",
"active": true
},
{
"label": "Пицца",
"slug": "picca",
"active": true
},
{
"label": "Бургеры",
"slug": "burgery",
"active": true
}
],
"options": {
"behavior": "NewPageByNavigationMenu",
"initGroupSlug": "dostavka"
}
}
Акции
Слайды акций имеют три разрешения
imageDesktop: 1920х510
px
imageTablet: 1280х510
px
imagePhone: 720х510
px
Для всех слайдов предусмотрен вариант картинки для retina: @x2 Эту картинку можно найти в json соответвующего image
Сортировку нужно производить по свойству order, по возрастанию числа.
линк для перехода по mnemonicId делает лейоут
Пример картинки
GraphQL scalar type (Не типизировано)
[
{
"id": 1,
"name": "420x315.jpg",
"url": "/seed_images/420x315.jpg",
"url@2x": "/seed_images/420x315.jpg",
"url@0_5x": "/seed_images/420x315,
"width": 420,
"height": 315
}
]
Для retina предусмотерна url@2x, Для предзагрузки предусмотрена url@0_5x
Отзывы
Отзывы представлены в виде простого обьекта. Для того чтобы оставить отзыв существует специальная мутация.
Для режима разработки все отзывы появляются автоматически без модерации
{
}