@emailmaker/emailmaker 1.0.116 → 1.0.117-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +275 -109
- package/asset-manifest.json +27 -27
- package/emailmaker-esm.js +1 -1
- package/emailmaker.d.ts +235 -38
- package/emailmaker.js +1 -1
- package/iframe/429.js +1 -1
- package/iframe/766.js +1 -1
- package/iframe/iframe-eblock.3b8240bd8d75c6ee2a77.html +1 -0
- package/iframe/iframe.3b8240bd8d75c6ee2a77.html +1 -0
- package/iframe/index.html +1 -1
- package/iframe/js/525.7e478fc1.js +1 -0
- package/iframe/js/667.4d0450c5.js +1 -0
- package/iframe/js/882.46943f9a.js +1 -0
- package/iframe/sandbox-eblock.js +1 -1
- package/package.json +1 -1
- package/static/css/{369.d740f134.chunk.css → 5072.f959228f.chunk.css} +2 -2
- package/static/css/{main.8c8bed31.css → main.f5e75ca4.css} +2 -2
- package/static/js/{1902.9e9ca2af.js → 1902.fa7e9fe6.js} +3 -3
- package/static/js/{2854.10396f08.js → 2854.95e1c8d0.js} +2 -2
- package/static/js/5072.e5ce1614.js +3 -0
- package/static/js/598.61e6a78a.js +2 -0
- package/static/js/8430.12bfa59b.js +2 -0
- package/static/js/{8580.4f3e7c56.js → 8580.47fa4f83.js} +2 -2
- package/static/js/{8727.97602af2.js → 8727.ef480f4b.js} +2 -2
- package/static/js/{emailmaker_core.d07551cd.js → emailmaker_core.1f145e15.js} +2 -2
- package/iframe/iframe-eblock.612f5e3292f38c64ed91.html +0 -1
- package/iframe/iframe.612f5e3292f38c64ed91.html +0 -1
- package/iframe/js/525.5461ecf3.js +0 -1
- package/iframe/js/667.25c21b63.js +0 -1
- package/iframe/js/882.de4b06e1.js +0 -1
- package/static/js/369.05739401.js +0 -3
- package/static/js/5215.a9897c36.js +0 -2
- package/static/js/6438.78acfa4a.js +0 -2
- /package/iframe/js/{525.5461ecf3.js.LICENSE.txt → 525.7e478fc1.js.LICENSE.txt} +0 -0
- /package/iframe/js/{667.25c21b63.js.LICENSE.txt → 667.4d0450c5.js.LICENSE.txt} +0 -0
- /package/iframe/js/{882.de4b06e1.js.LICENSE.txt → 882.46943f9a.js.LICENSE.txt} +0 -0
- /package/static/js/{1902.9e9ca2af.js.LICENSE.txt → 1902.fa7e9fe6.js.LICENSE.txt} +0 -0
- /package/static/js/{369.05739401.js.LICENSE.txt → 5072.e5ce1614.js.LICENSE.txt} +0 -0
package/README.md
CHANGED
|
@@ -4,59 +4,125 @@
|
|
|
4
4
|
|
|
5
5
|
# Установка
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
Установите пакет из npm:
|
|
8
8
|
|
|
9
|
-
```
|
|
10
|
-
|
|
9
|
+
```bash
|
|
10
|
+
npm install @emailmaker/emailmaker@1.0.117-alpha.1
|
|
11
11
|
```
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
### Полезные ссылки
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
- Каталог пакета на npm: [@emailmaker/emailmaker](https://www.npmjs.com/package/@emailmaker/emailmaker)
|
|
16
|
+
- Справка на сайте EmailMaker: [Подключение редактора](https://emailmaker.ru/docs/help/plugin/connecting-the-editor/)
|
|
16
17
|
|
|
17
|
-
|
|
18
|
+
Добавьте плагин сборки EmailMaker в конфигурацию приложения (он копирует статику пакета и задаёт **`EmailmakerEnvironment.publicPath`** для загрузки чанков). Без Webpack/Vite-плагина вручную нужно обеспечить корректный базовый путь к бандлу.
|
|
18
19
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
20
|
+
## Чеклист для агентов и автоматизации
|
|
21
|
+
|
|
22
|
+
Используйте таблицу при генерации кода интеграции или ревью. Источник типов — **`emailmaker.d.ts`** в пакете (**`ExportedApi`**); не подставляйте вымышленные поля API.
|
|
23
|
+
|
|
24
|
+
Подробнее о том, как в `.d.ts` сливаются **`ExportedApi.Options` / `Instance`**, что такое **`AppEvent`** и **`SaveEventPayload`**, и как читать исключения (**`handleSubjectChanged`** и др.): в репозитории EmailMaker — **`docs/plugin-types-agents.md`**.
|
|
25
|
+
|
|
26
|
+
| Правило | Детали |
|
|
27
|
+
| --- | --- |
|
|
28
|
+
| **`init`** | Обязательно **`content`**. Сигнатура: **`init(options)` → `Promise<Instance>`**. |
|
|
29
|
+
| Namespace vs **instance** | У модуля **`emailmaker`** — в основном **`init`** (+ именованные ESM-экспорты). **`setConfig`**, **`show`**, **`save`**, **`destroy`** — у **экземпляра** после **`init`**. |
|
|
30
|
+
| Повтор на том же DOM | Повторный **`init`** на тот же узел ведёт к **`reset`** — не запускайте два параллельных **`init`** на один контейнер. |
|
|
31
|
+
| События | **`instance.handle*(…)`** обычно возвращает **отписку**. **`handleSubjectChanged`** / **`handlePreheaderChanged`** — другая сигнатура (см. типы). |
|
|
32
|
+
| Async | Колбэки и **`getAuthToken`** могут быть **`async`**; ошибки — через **`handleError`** или свою логику. |
|
|
33
|
+
| Сборка | Без штатного плагина Webpack/Vite задайте **`publicPath`** (**`EmailmakerEnvironment`**). Бандл крупный (React, Monaco и др.). |
|
|
34
|
+
| Авторизация | **`getAuthToken`** или **`jwtAuth`**; **`client_secret`** только на сервере. |
|
|
35
|
+
| Файловый менеджер | **`storageProvider`**, **`config.imageCenterFileManagerView: true`**, при необходимости секция **`config.fileManager`** (**`ExportedApi.FileManagerOptions`**). Контракт **`StorageProvider`** объёмен — сверяйтесь с типами. |
|
|
36
|
+
| **`baseUrl`** | Базовый URL API приложения (**`AppInitMixin`**), если бэкенд не стандартный. |
|
|
37
|
+
| **`standaloneKey`** | Режимы с прокси файлов через события (см. код плагина); редкие сценарии. |
|
|
38
|
+
| **`commonStyles`** | Опционально на **`init` / `reset`**: объект стилей контента (частичный merge с **`COMMON_STYLES`**). Подробности — **`docs/plugin-content-styles.md`**. |
|
|
39
|
+
|
|
40
|
+
Примеры в репозитории: **`src/pluginExamples/`** (например **`plugin_default.html`**).
|
|
41
|
+
|
|
42
|
+
### Для сборщика Webpack
|
|
22
43
|
|
|
23
|
-
|
|
44
|
+
Импортируйте класс и передайте его в `plugins` под тем же именем:
|
|
24
45
|
|
|
25
46
|
```javascript
|
|
47
|
+
const EmailmakerWebpackPlugin = require('@emailmaker/emailmaker/webpack');
|
|
48
|
+
|
|
26
49
|
module.exports = {
|
|
27
|
-
plugins: [
|
|
50
|
+
plugins: [
|
|
51
|
+
new EmailmakerWebpackPlugin({
|
|
52
|
+
// По желанию: outputFolder, modulesPath, publicPath — см. пакет.
|
|
53
|
+
}),
|
|
54
|
+
],
|
|
28
55
|
};
|
|
29
56
|
```
|
|
30
57
|
|
|
31
58
|
### Для сборщика Vite
|
|
32
59
|
|
|
33
|
-
Импорт
|
|
60
|
+
Импорт только из **scoped-пакета**. Функция возвращает **массив из двух плагинов** — его нужно распаковать:
|
|
34
61
|
|
|
35
62
|
```javascript
|
|
36
|
-
import
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
Определение пакета в приложении:
|
|
63
|
+
import { defineConfig } from 'vite';
|
|
64
|
+
import emailmakerVite from '@emailmaker/emailmaker/vite';
|
|
40
65
|
|
|
41
|
-
```javascript
|
|
42
66
|
export default defineConfig({
|
|
43
|
-
plugins: [
|
|
67
|
+
plugins: [
|
|
68
|
+
...emailmakerVite({
|
|
69
|
+
// По желанию: outputFolder, modulesPath, publicPath — см. пакет.
|
|
70
|
+
}),
|
|
71
|
+
],
|
|
44
72
|
});
|
|
45
73
|
```
|
|
46
74
|
|
|
75
|
+
## `EmailmakerEnvironment`
|
|
76
|
+
|
|
77
|
+
Плагины Webpack/Vite добавляют в бандл объект **`EmailmakerEnvironment = { publicPath: '...' }`** с базовым URL к чанкам пакета. Вручную менять его обычно не нужно; без штатного плагина задайте **`publicPath`** самостоятельно так, чтобы загрузчик нашёл собранные **`emailmaker.js`** / **`emailmaker-esm.js`**.
|
|
78
|
+
|
|
79
|
+
Имя класса Webpack-плагина строится из имени приложения в `package.json` (для **`@emailmaker/emailmaker`** это **`EmailmakerWebpackPlugin`**).
|
|
80
|
+
|
|
47
81
|
# Инициализация
|
|
48
82
|
|
|
49
|
-
Импортируйте
|
|
83
|
+
Импортируйте плагин в коде приложения:
|
|
50
84
|
|
|
51
85
|
```javascript
|
|
52
86
|
import * as emailmaker from '@emailmaker/emailmaker';
|
|
53
87
|
```
|
|
54
88
|
|
|
55
|
-
|
|
89
|
+
У **`init`** обязательное поле — **`content`** (HTML-строка или объект письма / шаблона). После успешной инициализации методы **`setConfig`**, **`updateConfig`**, **`show`**, **`save`** и др. доступны у **экземпляра**, возвращённого из **`init`** (не у объекта `emailmaker`).
|
|
90
|
+
|
|
91
|
+
Частые поля верхнего уровня — в таблице; детали конфигурации и содержимого см. ниже в разделе **«Конфигурация»**.
|
|
92
|
+
|
|
93
|
+
| Поле | Назначение |
|
|
94
|
+
| --- | --- |
|
|
95
|
+
| **`getAuthToken`** или **`jwtAuth`** | OAuth-колбэк **или** вход по логину/паролю (**`ExportedApi.JWTMixin`** / **`jwtAuth`**). Не смешивайте сценарии без необходимости. |
|
|
96
|
+
| **`element`** | Контейнер монтирования (селектор, узел или фрагмент). |
|
|
97
|
+
| **`content`** | Обязательно: HTML-строка или объект письма/шаблона. |
|
|
98
|
+
| **`config`** | Настройки UI редактора (**`ExportedApi.Config`**). |
|
|
99
|
+
| **`project`** | Идентификатор проекта в вашей системе / в EmailMaker. |
|
|
100
|
+
| **`baseUrl`** | Базовый URL API при кастомном бэкенде (**`AppInitMixin.Options`**). |
|
|
101
|
+
| **`storageProvider`** | Реализация **`StorageProvider`** для файлового менеджера. |
|
|
102
|
+
| **`standaloneKey`** | Редкие режимы прокси файлов (**`instance.handleFileProxy`** / **`handleUrlProxy`**). |
|
|
103
|
+
| **`commonStyles`** | Объект стилей контента (частичный **merge** с **`COMMON_STYLES`**). См. **`docs/plugin-content-styles.md`**. |
|
|
104
|
+
|
|
105
|
+
- **`getAuthToken`** — функция **`(user?, project?, prevToken?) => string | Promise<string>`**, возвращающая OAuth access token. **`client_secret`** получайте **только на сервере**.
|
|
106
|
+
- **`jwtAuth`** — **`{ email, password, remember? }`** вместо **`getAuthToken`** (см. **`ExportedApi.JWTMixin`** в **`emailmaker.d.ts`**).
|
|
107
|
+
|
|
108
|
+
Именованные экспорты в ESM-сборке (**`emailmaker-esm.js`**):
|
|
109
|
+
|
|
110
|
+
```javascript
|
|
111
|
+
import { init, parseAMP, COMMON_STYLES, version, helpers, errors } from '@emailmaker/emailmaker';
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
| Экспорт | Назначение |
|
|
115
|
+
| --- | --- |
|
|
116
|
+
| **`init`** | То же, что **`emailmaker.init`**, с ленивой подгрузкой ядра (**`Promise<Instance>`**). |
|
|
117
|
+
| **`parseAMP`** | Разбор AMP: вход — строка или **`{ code }`**, результат **`ParsedAMP`** (html / ampHtml и т.д.). |
|
|
118
|
+
| **`COMMON_STYLES`** | Дефолтный пресет стилей контента текущей сборки EmailMaker. Для **`init({ commonStyles: { ...COMMON_STYLES, … } })`**. Исходник с JSDoc: **`src/constants/commonStyles.defaults.ts`**. |
|
|
119
|
+
| **`version`** | Строка версии сборки. |
|
|
120
|
+
| **`helpers`** | Вспомогательные утилиты (например, соответствие HTTP-статусов кодам ошибок). |
|
|
121
|
+
| **`errors`** | Ошибки API, в т.ч. **`errors.FileManagerApiError`** для контракта с файловым менеджером. |
|
|
56
122
|
|
|
57
123
|
### Получение OAuth токена на бэкенде
|
|
58
124
|
|
|
59
|
-
```
|
|
125
|
+
```bash
|
|
60
126
|
curl --location 'https://api.emailmaker.ru/oauth/token' \
|
|
61
127
|
--header 'Content-Type: application/x-www-form-urlencoded' \
|
|
62
128
|
--data-urlencode 'client_id=*******' \
|
|
@@ -64,15 +130,27 @@ curl --location 'https://api.emailmaker.ru/oauth/token' \
|
|
|
64
130
|
--data-urlencode 'grant_type=client_credentials'
|
|
65
131
|
```
|
|
66
132
|
|
|
133
|
+
Пример **клиентской** функции: токен отдаёт ваш бэкенд (секрет не уходит в браузер):
|
|
134
|
+
|
|
135
|
+
```javascript
|
|
136
|
+
async function getAuthToken(user, project, prevToken) {
|
|
137
|
+
const res = await fetch('/api/your-backend/emailmaker-token', { method: 'POST' });
|
|
138
|
+
const data = await res.json();
|
|
139
|
+
return data.access_token;
|
|
140
|
+
}
|
|
141
|
+
```
|
|
142
|
+
|
|
67
143
|
### Создание сущности EmailMaker plugin
|
|
68
144
|
|
|
145
|
+
Простейший вариант — HTML письма и тема:
|
|
146
|
+
|
|
69
147
|
```javascript
|
|
70
148
|
emailmaker
|
|
71
149
|
.init({
|
|
72
|
-
getAuthToken
|
|
150
|
+
getAuthToken,
|
|
73
151
|
element: '#test',
|
|
74
152
|
content: {
|
|
75
|
-
|
|
153
|
+
subject: 'Тема письма',
|
|
76
154
|
html: `КОД_ПИСЬМА`,
|
|
77
155
|
},
|
|
78
156
|
config: {},
|
|
@@ -80,52 +158,129 @@ emailmaker
|
|
|
80
158
|
.then((instance) => {});
|
|
81
159
|
```
|
|
82
160
|
|
|
161
|
+
Вариант с **шаблоном** и внешним id письма:
|
|
162
|
+
|
|
163
|
+
```javascript
|
|
164
|
+
emailmaker
|
|
165
|
+
.init({
|
|
166
|
+
getAuthToken,
|
|
167
|
+
element: '#editor',
|
|
168
|
+
project: 'ключ-проекта-в-вашей-системе',
|
|
169
|
+
content: {
|
|
170
|
+
templateId: 22304,
|
|
171
|
+
email: {
|
|
172
|
+
id: 'crm-email-id-123',
|
|
173
|
+
},
|
|
174
|
+
blocks: [],
|
|
175
|
+
},
|
|
176
|
+
config: {
|
|
177
|
+
theme: 'light',
|
|
178
|
+
// advancedConfigs: { editor: { … }, pro: { … } },
|
|
179
|
+
},
|
|
180
|
+
})
|
|
181
|
+
.then((instance) => {});
|
|
182
|
+
```
|
|
183
|
+
|
|
83
184
|
КОД_ПИСЬМА можно взять из <a href="https://emcdn.ru/plugin/new-email.html" target="_blank">нашего образца</a> или вставить HTML-код своего письма.
|
|
84
185
|
|
|
186
|
+
### React (обёртка)
|
|
187
|
+
|
|
188
|
+
Минимальный каркас: монтирование, **`destroy`** при размонтировании.
|
|
189
|
+
|
|
190
|
+
```tsx
|
|
191
|
+
import { useEffect, useRef } from 'react';
|
|
192
|
+
import * as emailmaker from '@emailmaker/emailmaker';
|
|
193
|
+
|
|
194
|
+
export function EmailmakerEditor({
|
|
195
|
+
project,
|
|
196
|
+
templateId,
|
|
197
|
+
getAuthToken,
|
|
198
|
+
}: {
|
|
199
|
+
project: string | number;
|
|
200
|
+
templateId: number;
|
|
201
|
+
getAuthToken: NonNullable<Parameters<typeof emailmaker.init>[0]['getAuthToken']>;
|
|
202
|
+
}) {
|
|
203
|
+
const rootRef = useRef<HTMLDivElement>(null);
|
|
204
|
+
|
|
205
|
+
useEffect(() => {
|
|
206
|
+
let instance: Awaited<ReturnType<typeof emailmaker.init>> | undefined;
|
|
207
|
+
|
|
208
|
+
(async () => {
|
|
209
|
+
instance = await emailmaker.init({
|
|
210
|
+
getAuthToken,
|
|
211
|
+
element: rootRef.current ?? '#emailmaker-root',
|
|
212
|
+
project,
|
|
213
|
+
content: { email: { id: 'new' }, templateId },
|
|
214
|
+
config: { theme: 'light' },
|
|
215
|
+
});
|
|
216
|
+
})();
|
|
217
|
+
|
|
218
|
+
return () => {
|
|
219
|
+
instance?.destroy();
|
|
220
|
+
};
|
|
221
|
+
}, [project, templateId, getAuthToken]);
|
|
222
|
+
|
|
223
|
+
return <div id="emailmaker-root" ref={rootRef} style={{ height: '100vh' }} />;
|
|
224
|
+
}
|
|
225
|
+
```
|
|
226
|
+
|
|
85
227
|
# Конфигурация
|
|
86
228
|
|
|
87
|
-
Конфигурация
|
|
229
|
+
Конфигурация задаётся объектом с несколькими уровнями вложенности: внешний вид редактора, стартовое содержимое и обработчики событий.
|
|
230
|
+
|
|
231
|
+
Повторный вызов **`init`** на **тот же DOM-элемент** внутри приводит к **`reset`** с новыми опциями — не запускайте параллельно два **`init`** на один контейнер.
|
|
88
232
|
|
|
89
233
|
### element
|
|
90
234
|
|
|
91
|
-
|
|
235
|
+
Строка-селектор, **`Element`** или **`DocumentFragment`**: контейнер, куда монтируется редактор. Если элемент не задан, приложение может работать в фоновом режиме без видимого контейнера.
|
|
92
236
|
|
|
93
237
|
### content
|
|
94
238
|
|
|
95
|
-
Секция
|
|
96
|
-
В этот параметр может быть передано:
|
|
239
|
+
Секция **`content`** задаёт данные для редактора. Варианты:
|
|
97
240
|
|
|
98
241
|
#### {string}
|
|
99
242
|
|
|
100
|
-
HTML
|
|
243
|
+
HTML-разметка письма.
|
|
101
244
|
|
|
102
|
-
#### {object}
|
|
245
|
+
#### {object} параметры письма
|
|
103
246
|
|
|
104
247
|
```javascript
|
|
105
248
|
{
|
|
106
|
-
id?: string; // Уникальный ID
|
|
107
|
-
html?: string; // HTML
|
|
249
|
+
id?: string; // Уникальный ID письма в вашей системе.
|
|
250
|
+
html?: string; // HTML письма.
|
|
108
251
|
subject?: string; // Тема письма.
|
|
109
|
-
preheader?: string; //
|
|
252
|
+
preheader?: string; // Прехедер.
|
|
110
253
|
}
|
|
111
254
|
```
|
|
112
255
|
|
|
113
|
-
#### {object}
|
|
256
|
+
#### {object} шаблон, блоки, комментарии
|
|
114
257
|
|
|
115
258
|
```javascript
|
|
116
259
|
{
|
|
117
|
-
|
|
118
|
-
email?: object; //
|
|
119
|
-
blocks?: []; //
|
|
120
|
-
comments?: []; //
|
|
260
|
+
templateId?: string | number; // ID шаблона в EmailMaker.
|
|
261
|
+
email?: object; // параметры письма (см. выше).
|
|
262
|
+
blocks?: []; // блоки.
|
|
263
|
+
comments?: []; // комментарии к письму.
|
|
121
264
|
}
|
|
122
265
|
```
|
|
123
266
|
|
|
124
|
-
|
|
267
|
+
Сменить контент после инициализации: **`instance.show(content)`**.
|
|
268
|
+
|
|
269
|
+
### Стили контента (`commonStyles`)
|
|
270
|
+
|
|
271
|
+
Не путать с **`config`**: объект **`commonStyles`** передаётся **на верхнем уровне** **`init`** / **`reset`** (тип **`ExportedApi.AppConfigMixin.Options`**).
|
|
272
|
+
|
|
273
|
+
- **Дефолт из сборки:** именованный экспорт **`COMMON_STYLES`** (см. исходник **`src/constants/commonStyles.defaults.ts`**, там же подробный **JSDoc** для IDE).
|
|
274
|
+
- **Частичное переопределение:** можно передать только нужные ветки (например `{ block: { backgroundColor: '#000' } }`) — приложение **сливает** их с **`COMMON_STYLES`**, чтобы панель «Стили контента», iframe и список общих блоков не ломались на «дырах» в объекте.
|
|
275
|
+
- **Приоритет:** сохранённое **`email.common_styles`** важнее, чем **`init.commonStyles`**.
|
|
276
|
+
- **Сброс** сохранённого в сторе плагина override: **`commonStyles: undefined`** в **`reset`** или **`updateConfig`** (с ключом).
|
|
277
|
+
- **Вкладка в UI:** флаг **`config.commonStylesEnabled`** (часто `true` по умолчанию).
|
|
278
|
+
|
|
279
|
+
Полное описание: **`docs/plugin-content-styles.md`** в репозитории EmailMaker.
|
|
125
280
|
|
|
126
281
|
### config
|
|
127
282
|
|
|
128
|
-
|
|
283
|
+
Настройки UI редактора. После **`init`** используйте **`instance.setConfig`**, **`instance.updateConfig`** и **`instance.getConfig`** — не методы объекта **`emailmaker`**.
|
|
129
284
|
|
|
130
285
|
##### Список параметров секции config
|
|
131
286
|
| Параметр | Описание | Значение по умолчанию |
|
|
@@ -135,7 +290,7 @@ HTML верстка письма.
|
|
|
135
290
|
| mergeTags | JSON со списком динамических переменных. | undefined |
|
|
136
291
|
| styles | Строка со стилями в формате CSS. | '' |
|
|
137
292
|
| | | |
|
|
138
|
-
| headerShow |
|
|
293
|
+
| headerShow | Показ шапки. | true |
|
|
139
294
|
| headerArrowBackVisible | Показ стрелки "Назад". | true |
|
|
140
295
|
| headerTitleVisible | Показ поля "Тема". | true |
|
|
141
296
|
| headerPreheaderVisible | Показ поля "Прехедер". | true |
|
|
@@ -172,7 +327,7 @@ HTML верстка письма.
|
|
|
172
327
|
| nextButtonEnabled | Показ второстепенной кнопки. | false |
|
|
173
328
|
| nextButtonText | Текст на второстепенной кнопке. | '' |
|
|
174
329
|
| saveButtonEnabled | Показ основной кнопки. | true |
|
|
175
|
-
| saveButtonText | Текст основной кнопки. |
|
|
330
|
+
| saveButtonText | Текст основной кнопки. | '' |
|
|
176
331
|
| commandButtonsEnabled | Показ основной и второстепенной кнопки. | true |
|
|
177
332
|
| | | |
|
|
178
333
|
| sidePanelFloating | Плавающая боковая панель. | true |
|
|
@@ -263,92 +418,103 @@ HTML верстка письма.
|
|
|
263
418
|
| imageCenterStockEnabled | Таб Стока фотографий. | true |
|
|
264
419
|
| imageCenterGifEnabled | Таб Стока гифок. | true |
|
|
265
420
|
| imageCenterEditorEnabled | Таб редактора изображений. | true |
|
|
266
|
-
| compressMaxSize | Макс.
|
|
267
|
-
| compressMaxWidthOrHeight | Макс.
|
|
268
|
-
### Обработка событий
|
|
421
|
+
| compressMaxSize | Макс. размер файла для клиентского сжатия в файловом менеджере, байт (по умолчанию порядка 5 MiB). | см. типы |
|
|
422
|
+
| compressMaxWidthOrHeight | Макс. ширина/высота после ресайза, px (по умолчанию 2000). | см. типы |
|
|
269
423
|
|
|
270
|
-
|
|
424
|
+
### Обработка событий
|
|
271
425
|
|
|
272
|
-
|
|
426
|
+
Обработчики передаются в **`init({ ... })`** или подписываются на экземпляре: **`instance.handle*(listener, priority?)`**. Подписка обычно возвращает **функцию отписки**. Обработчики могут быть **`async`**.
|
|
273
427
|
|
|
274
|
-
|
|
275
|
-
emailmaker.init({
|
|
276
|
-
....,
|
|
277
|
-
// Подписка на события в инициализации.
|
|
278
|
-
handleReadEmail: (e) => {},
|
|
279
|
-
handleSaveEmail: async (e) => {}
|
|
280
|
-
}).then((instance) => {
|
|
281
|
-
// Подписка на события после инициализации.
|
|
282
|
-
const dispose = instance.handleReadEmail(e => {});
|
|
283
|
-
const dispose = instance.handleSaveEmail(async (e) => {});
|
|
284
|
-
});
|
|
285
|
-
```
|
|
428
|
+
События **`handleSaveEmail`**, **`handleSaveBlock`**, **`handleSaveComment`** получают **не сырой объект**, а **`SaveEventPayload`**: **`{ patch, value, prev?, source? }`** — полезно сравнивать **`patch`** и итоговое **`value`**.
|
|
286
429
|
|
|
287
|
-
|
|
430
|
+
**`handleSubjectChanged`** и **`handlePreheaderChanged`** оформлены иначе: через них подписываются на строковые значения темы и прехедера — см. **`emailmaker.d.ts`**.
|
|
288
431
|
|
|
289
432
|
#### Пример
|
|
290
433
|
|
|
291
434
|
```javascript
|
|
292
435
|
emailmaker.init({
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
return await fetchData(id); // Ваша функция получения данных.
|
|
299
|
-
}
|
|
436
|
+
element: '#test',
|
|
437
|
+
content: { email: { id: '1' } },
|
|
438
|
+
getAuthToken,
|
|
439
|
+
handleReadEmail: async (id) => fetchEmail(id),
|
|
440
|
+
handleSaveEmail: async (payload) => saveEmail(payload.value),
|
|
300
441
|
}).then((instance) => {
|
|
301
|
-
|
|
442
|
+
const unsubscribe = instance.handleEmailChanged(async () => {
|
|
443
|
+
/* ... */
|
|
444
|
+
});
|
|
445
|
+
/* unsubscribe(); */
|
|
302
446
|
});
|
|
303
447
|
```
|
|
304
448
|
|
|
305
449
|
### События
|
|
306
450
|
|
|
307
|
-
| Обработчик
|
|
308
|
-
|
|
|
309
|
-
| handleReadEmail
|
|
310
|
-
| handleSaveEmail
|
|
311
|
-
|
|
|
312
|
-
|
|
|
313
|
-
|
|
|
314
|
-
|
|
|
315
|
-
|
|
|
316
|
-
|
|
|
317
|
-
|
|
|
318
|
-
|
|
|
319
|
-
|
|
|
320
|
-
|
|
|
321
|
-
|
|
|
322
|
-
|
|
|
323
|
-
|
|
|
324
|
-
|
|
|
325
|
-
|
|
|
326
|
-
|
|
|
327
|
-
|
|
|
328
|
-
|
|
|
329
|
-
|
|
|
330
|
-
|
|
|
331
|
-
|
|
|
451
|
+
| Обработчик | Описание |
|
|
452
|
+
| ---------- | -------- |
|
|
453
|
+
| handleReadEmail | Загрузка письма по id с вашего API (**аргумент — строка id**). |
|
|
454
|
+
| handleSaveEmail | Сохранение письма; полезная нагрузка — **`SaveEventPayload`** с **`value`** и **`patch`**. |
|
|
455
|
+
| handleRemoveEmail | Удаление письма. |
|
|
456
|
+
| handleReadEmailRevisions | Список автосохранений / ревизий для письма. |
|
|
457
|
+
| handleEmailAutosave | Создано автосохранение (**`EmailRevision`**). |
|
|
458
|
+
| handleRemoveEmailAutoSave | Удалено автосохранение. |
|
|
459
|
+
| handleReadBlocks | Список блоков проекта. |
|
|
460
|
+
| handleReadCommonBlocks | Общие блоки. |
|
|
461
|
+
| handleReadTemplateBlocks | Блоки шаблона в контексте письма. |
|
|
462
|
+
| handleSaveBlock | Сохранение блока (**`SaveEventPayload`**). |
|
|
463
|
+
| handleRemoveBlock | Удаление блока. |
|
|
464
|
+
| handleReadComments | Комментарии к письму. |
|
|
465
|
+
| handleSaveComment | Сохранение комментария. |
|
|
466
|
+
| handleRemoveComment | Удаление комментария. |
|
|
467
|
+
| handleSaveButtonClick | Клик по основной кнопке (например «Сохранить»). |
|
|
468
|
+
| handleNextButtonClick | Клик по «Далее». |
|
|
469
|
+
| handlePreviousButtonClick | Клик «Назад» в шапке. |
|
|
470
|
+
| handleEmailInit | Инициализирован контур письма. |
|
|
471
|
+
| handleEmailChanged | Изменился параметр письма. |
|
|
472
|
+
| handleHtmlChanged | Изменился HTML-код. |
|
|
473
|
+
| handleSubjectChanged | Изменилась тема (особая подпись — см. типы). |
|
|
474
|
+
| handlePreheaderChanged | Изменился прехедер (особая подпись — см. типы). |
|
|
475
|
+
| handleCloneEmail | Клонирование письма. |
|
|
476
|
+
| handleShareEmail | Поделиться. |
|
|
477
|
+
| handleLivePreviewEmail | Живой предпросмотр. |
|
|
478
|
+
| handlePreviewEmail | Предпросмотр. |
|
|
479
|
+
| handleValidate | Результат проверки кода (**`CodeError[]`**). |
|
|
480
|
+
| handleTestEmailSend | Отправка тестового письма. |
|
|
481
|
+
| handleTestEmailModal | Открыто окно тестовой отправки. |
|
|
482
|
+
| handleDestroy | Перед уничтожением экземпляра. |
|
|
483
|
+
| handleLoad | Завершена загрузка экземпляра; можно безопасно вызывать **`getEmail`** и др. |
|
|
484
|
+
| handleLoadImage | Загрузка изображения пользователем; **`handleFileProxy`**, **`handleUrlProxy`** — прокси файлов/URL при необходимости. |
|
|
485
|
+
| handleNotify | Произвольное уведомление. |
|
|
486
|
+
| handleError | Ошибка (можно переопределить UI). |
|
|
487
|
+
| handleSuccess | Успешная операция. |
|
|
488
|
+
| handleReadLocale | Язык интерфейса (**`AppConfigMixin`**). |
|
|
489
|
+
| handleTranslate | Пользовательский перевод строк. |
|
|
490
|
+
| handleLimitUsage | Отображение квот / лимитов. |
|
|
491
|
+
|
|
492
|
+
Полный перечень и сигнатуры — в **`emailmaker.d.ts`** (**`ExportedApi.DataMixin.Events`** и смежные миксины).
|
|
332
493
|
|
|
333
494
|
### Методы
|
|
334
495
|
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
|
338
|
-
|
|
|
339
|
-
|
|
|
340
|
-
|
|
|
341
|
-
|
|
|
342
|
-
|
|
|
343
|
-
|
|
|
344
|
-
|
|
|
345
|
-
|
|
|
346
|
-
|
|
|
347
|
-
|
|
|
348
|
-
|
|
|
349
|
-
|
|
|
350
|
-
|
|
|
351
|
-
|
|
|
496
|
+
Модуль экспортирует **`init`** (и именованные символы в ESM). Остальное — методы **экземпляра** после **`await emailmaker.init(...)`**.
|
|
497
|
+
|
|
498
|
+
| Метод | Описание |
|
|
499
|
+
| ----- | -------- |
|
|
500
|
+
| init | Асинхронная инициализация: **`Promise<Instance>`**. |
|
|
501
|
+
| show | Подмена контента (**строка или объект `Content`**). |
|
|
502
|
+
| save | Сохранить текущее письмо по цепочке приложения. |
|
|
503
|
+
| getEmail | Текущее письмо; для скомпилированных полей см. **`compileEmail`** / **`CompiledEmail`**. |
|
|
504
|
+
| compileEmail | Явная компиляция HTML/AMP/текста; опционально **`email`** и флаги форматов. |
|
|
505
|
+
| setEmailMeta | Обновить **`meta`** текущего письма без полной замены. |
|
|
506
|
+
| getBlocks | Блоки в текущем контексте. |
|
|
507
|
+
| getComments | Комментарии. |
|
|
508
|
+
| getEmailRevisions | Ревизии / автосохранения. |
|
|
509
|
+
| getCodeErrors | Ошибки линтера кода в редакторе. |
|
|
510
|
+
| getConfig | Текущий **`config`**. |
|
|
511
|
+
| setConfig | Полная замена настроек UI. |
|
|
512
|
+
| updateConfig | Глубокое слияние с текущим **`config`**. |
|
|
513
|
+
| notify | Показать уведомление (строка или объект). |
|
|
514
|
+
| getElement | DOM-узел или фрагмент монтирования. |
|
|
515
|
+
| destroy | Уничтожить экземпляр (вызывайте при размонтировании в SPA). |
|
|
516
|
+
| reset | Переинициализация с новыми **`Options`** (**`Promise<Instance>`**). |
|
|
517
|
+
| undoRedoService | Сервис отмены/повтора (**`undo`**, **`redo`**, снимки истории и др.). |
|
|
352
518
|
|
|
353
519
|
### 📂 Файловый менеджер
|
|
354
520
|
|