Перейти к основному содержимому

Кнопка (Button)

Поле типа Кнопка позволяет выполнять действия и автоматизации прямо из интерфейса записи.

Основные характеристики

  • Тип данных: Не хранит данные (действие)
  • Назначение: Выполнение действий и автоматизаций
  • Интерактивность: Кликабельный элемент в интерфейсе
  • Действия: Вызов API, запуск автоматизации, открытие URL

Настройки поля

При создании поля типа "Кнопка" доступны следующие настройки:

  • Название поля: Текст на кнопке
  • Системное имя: Уникальный идентификатор для API
  • Описание: Подсказка при наведении
  • Тип действия: API запрос, автоматизация, URL, скрипт
  • Стиль кнопки: Primary, Secondary, Success, Danger, Warning
  • Иконка: Иконка на кнопке
  • Подтверждение: Запрашивать подтверждение перед выполнением
  • Условие отображения: Показывать кнопку только при определенных условиях

Типы действий

API запрос

{
"name": "send_email",
"type": "button",
"label": "Отправить email",
"action": {
"type": "api",
"method": "POST",
"url": "/api/send-email",
"body": {
"recordId": "{{recordId}}",
"email": "{{email}}"
}
},
"style": "primary",
"confirm": true,
"confirmMessage": "Отправить email пользователю?"
}

Запуск автоматизации

{
"name": "approve",
"type": "button",
"label": "Утвердить",
"action": {
"type": "automation",
"automationId": "auto_approve_workflow"
},
"style": "success",
"icon": "check"
}

Открытие URL

{
"name": "view_invoice",
"type": "button",
"label": "Открыть счет",
"action": {
"type": "url",
"url": "/invoices/{{invoiceId}}",
"target": "_blank"
},
"style": "secondary"
}

Выполнение скрипта

{
"name": "calculate",
"type": "button",
"label": "Пересчитать",
"action": {
"type": "script",
"script": "return calculateTotal(record);"
},
"style": "primary"
}

Примеры использования

Отправка уведомления

{
"name": "notify_user",
"type": "button",
"label": "Уведомить пользователя",
"action": {
"type": "api",
"method": "POST",
"url": "/api/notifications/send",
"body": {
"userId": "{{userId}}",
"message": "Ваш заказ готов к отправке"
}
},
"style": "primary",
"icon": "bell",
"confirm": true
}

Смена статуса

{
"name": "mark_complete",
"type": "button",
"label": "Завершить",
"action": {
"type": "update",
"fields": {
"status": "Завершена",
"completed_at": "{{now}}"
}
},
"style": "success",
"icon": "check-circle",
"showIf": "status !== 'Завершена'"
}

Генерация документа

{
"name": "generate_pdf",
"type": "button",
"label": "Создать PDF",
"action": {
"type": "api",
"method": "POST",
"url": "/api/documents/generate-pdf",
"body": {
"recordId": "{{recordId}}",
"template": "invoice"
}
},
"style": "secondary",
"icon": "file-pdf"
}

Дублирование записи

{
"name": "duplicate",
"type": "button",
"label": "Дублировать",
"action": {
"type": "duplicate",
"excludeFields": ["_id", "created_at", "created_by"]
},
"style": "secondary",
"icon": "copy"
}

Работа через API

Выполнение действия кнопки

// Выполнить действие кнопки
const result = await emd.database.collection('tasks')
.record(recordId)
.button('send_email')
.execute();

console.log(result);
// {
// success: true,
// message: "Email отправлен",
// data: { ... }
// }

Выполнение с параметрами

const result = await emd.database.collection('orders')
.record(recordId)
.button('generate_invoice')
.execute({
format: 'pdf',
language: 'ru'
});

Условное отображение

Показывать только для определенного статуса

{
"name": "approve",
"type": "button",
"label": "Утвердить",
"showIf": "status === 'На проверке'",
"action": {
"type": "update",
"fields": {
"status": "Утверждено",
"approved_at": "{{now}}",
"approved_by": "{{currentUser.id}}"
}
}
}

Показывать только для автора

{
"name": "delete",
"type": "button",
"label": "Удалить",
"showIf": "created_by === currentUser.id || currentUser.role === 'admin'",
"action": {
"type": "delete"
},
"style": "danger",
"confirm": true,
"confirmMessage": "Вы уверены, что хотите удалить эту запись?"
}

Стили кнопок

Primary (основная)

{
"name": "save",
"type": "button",
"label": "Сохранить",
"style": "primary"
}

Success (успех)

{
"name": "approve",
"type": "button",
"label": "Утвердить",
"style": "success"
}

Danger (опасность)

{
"name": "delete",
"type": "button",
"label": "Удалить",
"style": "danger"
}

Warning (предупреждение)

{
"name": "archive",
"type": "button",
"label": "Архивировать",
"style": "warning"
}

Secondary (вторичная)

{
"name": "export",
"type": "button",
"label": "Экспорт",
"style": "secondary"
}

Подтверждение действия

Простое подтверждение

{
"name": "delete",
"type": "button",
"label": "Удалить",
"confirm": true,
"confirmMessage": "Вы уверены?"
}

Подтверждение с вводом текста

{
"name": "delete_account",
"type": "button",
"label": "Удалить аккаунт",
"confirm": true,
"confirmType": "text",
"confirmMessage": "Введите 'DELETE' для подтверждения",
"confirmMatch": "DELETE"
}

Обработка результата

Успешное выполнение

try {
const result = await emd.database.collection('tasks')
.record(recordId)
.button('send_email')
.execute();

if (result.success) {
console.log('Email отправлен успешно');
// Показать уведомление
showNotification('Email отправлен', 'success');
}
} catch (error) {
console.error('Ошибка:', error.message);
showNotification(error.message, 'error');
}

Обновление записи после выполнения

const result = await emd.database.collection('orders')
.record(recordId)
.button('process_payment')
.execute();

if (result.success) {
// Обновить запись
await emd.database.collection('orders').update(recordId, {
payment_status: 'Оплачено',
paid_at: new Date()
});
}

Интеграция с автоматизациями

Запуск workflow

{
"name": "start_approval",
"type": "button",
"label": "Отправить на утверждение",
"action": {
"type": "automation",
"automationId": "approval_workflow",
"params": {
"recordId": "{{recordId}}",
"approvers": ["user_123", "user_456"]
}
}
}

Цепочка действий

{
"name": "publish",
"type": "button",
"label": "Опубликовать",
"action": {
"type": "chain",
"actions": [
{
"type": "update",
"fields": { "status": "Опубликовано" }
},
{
"type": "api",
"url": "/api/notify-subscribers"
},
{
"type": "automation",
"automationId": "post_publish_tasks"
}
]
}
}

Примеры интеграций

Отправка в Telegram

{
"name": "send_to_telegram",
"type": "button",
"label": "Отправить в Telegram",
"action": {
"type": "api",
"method": "POST",
"url": "https://api.telegram.org/bot{{telegramToken}}/sendMessage",
"body": {
"chat_id": "{{telegramChatId}}",
"text": "{{message}}"
}
},
"icon": "telegram"
}

Создание задачи в Jira

{
"name": "create_jira_task",
"type": "button",
"label": "Создать задачу в Jira",
"action": {
"type": "api",
"method": "POST",
"url": "https://your-domain.atlassian.net/rest/api/3/issue",
"headers": {
"Authorization": "Basic {{jiraToken}}"
},
"body": {
"fields": {
"project": { "key": "PROJ" },
"summary": "{{title}}",
"description": "{{description}}"
}
}
}
}

Рекомендации

  • Используйте понятные названия для кнопок (глаголы действия)
  • Добавляйте подтверждение для опасных действий
  • Используйте иконки для лучшей визуализации
  • Применяйте условное отображение для релевантности
  • Используйте правильные стили (danger для удаления, success для утверждения)
  • Обрабатывайте ошибки и показывайте понятные сообщения
  • Не перегружайте форму большим количеством кнопок
  • Группируйте связанные действия

Отличие от других типов

  • Button vs Formula: Button выполняет действия, Formula вычисляет значения
  • Button vs Automation: Button запускается вручную, Automation автоматически
  • Button vs Relation: Button для действий, Relation для связей между записями