Skip to content

Commit 61e9f9b

Browse files
authored
feat!: version 7 (#1028)
## Slider - The old SlickSlider moved to `SliderOld` - New Slider is now based on Swiper - Migrated tests, stories, i18n, and styles for both new and old sliders ## YFM (Yandex Flavored Markdown) - All components with HTML content now use YFM - Block transformers updated for YFM - **Components:** `MetaInfo`, `Table`, `ContentList`, `Title`, `TitleItem` - **Blocks:** `Header`, `Share`, `Questions/QuestionBlockItem`, `ExtendedFeatures`, `FoldableList/FoldableListBlockItem`, `PromoFeaturesBlock`, `Tabs/TabContent` - **Sub-blocks:** `PriceCard`, `BannerCard`, `Content`, `Quote`, `PriceDetailed/PriceDescription`, `PriceDetailed/PriceDetails/Details/List`, `PriceDetailed/PriceDetails/Details/Settings` ## YandexForm - Default theme removed from the form - Cleaned up and simplified theme logic ## General - Code migration and refactoring, removed deprecated files - Updated dependencies and documentation
1 parent 7c422e1 commit 61e9f9b

File tree

162 files changed

+18600
-12880
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

162 files changed

+18600
-12880
lines changed

.eslintignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,4 @@ node_modules
99
/schema
1010

1111
/playwright/playwright/.cache/
12+
playwright

.prettierignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ CONTRIBUTING.md
1616
/schema
1717

1818
/playwright/playwright/.cache/
19+
playwright
1920

2021
# npm files
2122
package.json

.storybook/preview.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import '../styles/storybook/index.scss';
22
import '@gravity-ui/uikit/styles/styles.scss';
3+
import '@gravity-ui/uikit/styles/fonts.css';
34

45
import * as React from 'react';
56
import {MINIMAL_VIEWPORTS} from '@storybook/addon-viewport';
@@ -86,8 +87,6 @@ const preview: Preview = {
8687
},
8788
},
8889
},
89-
90-
tags: ['autodocs', 'autodocs', 'autodocs'],
9190
};
9291

9392
export default preview;

.storybook/stories/documentation/Blocks.mdx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,9 @@ _[Common field types](?path=/docs/documentation-types--docs)_
4949

5050
## [Share](?path=/docs/blocks-share--docs)
5151

52-
## [Slider](?path=/docs/blocks-slider--docs)
52+
## [<s>SliderOld</s>](?path=/story/blocks-sliderold-deprecated--docs&viewMode=docs) (Deprecated, use Slider instead)
53+
54+
## [Slider](?path=/story/blocks-slider--docs&viewMode=docs)
5355

5456
## [Table](?path=/docs/blocks-table--docs)
5557

.storybook/utils.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,27 @@ export const blockListTransform = (blocksList: ConstructorBlock[]) =>
99

1010
export const blockTransform = (block: ConstructorBlock) =>
1111
contentTransformer({content: {blocks: [block]}, options: {lang: 'en'}}).blocks[0];
12+
import {TitleItemProps} from '../src';
13+
14+
export const yfmTransformInline = (content: string) =>
15+
yfm(content, {renderInline: true}).result.html;
16+
export const transformTitle = (title: string | TitleItemProps) => {
17+
if (!title) {
18+
return undefined;
19+
}
20+
21+
if (typeof title === 'string') {
22+
return yfmTransformInline(title);
23+
}
24+
25+
const {text, ...rest} = title;
26+
27+
return {...rest, text: yfmTransformInline(text)};
28+
};
29+
export const transformOptionalTitle = (title?: string | TitleItemProps) => {
30+
if (!title) {
31+
return undefined;
32+
}
33+
34+
return transformTitle(title);
35+
};

README-ru.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,8 @@ const post = {
233233

234234
Список других доступных утилит можно найти в [этом разделе](https://github.com/gravity-ui/page-constructor/tree/main/src/text-transform).
235235

236+
Подробная инструкция по подготовке данных, использованию кастомных трансформеров находится в [дополнительном разделе документации](./docs/data-preparation.md).
237+
236238
### Пользователькие блоки
237239

238240
Конструктор страниц поддерживает возможность работы с блоками, определенными пользователем в его приложении. Блоки представляют собой обычные React-компоненты.

README.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,10 @@ const post = {
234234

235235
You can find more utilities in this [section](https://github.com/gravity-ui/page-constructor/tree/main/src/text-transform)
236236

237+
### Detailed Documentation on Server Utilities and Transformers
238+
239+
For a comprehensive guide on using server utilities, including detailed explanations and advanced use cases, visit the [additional chapter on server utils usage](./docs/data-preparation.md).
240+
237241
### Custom blocks
238242

239243
The page constructor lets you use blocks that are user-defined in their app. Blocks are regular React components.
@@ -254,6 +258,12 @@ To use mixins and constructor style variables when creating custom blocks, add i
254258
@import '~@gravity-ui/page-constructor/styles/styles.scss';
255259
```
256260

261+
To use default font, add import in your file:
262+
263+
```css
264+
@import '~@gravity-ui/page-constructor/styles/fonts.scss';
265+
```
266+
257267
### Loadable blocks
258268

259269
It's sometimes necessary that a block renders itself based on data to be loaded. In this case, loadable blocks are used.

docs/data-preparation-ru.md

Lines changed: 257 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,257 @@
1+
# Подготовка данных
2+
3+
Документацию по серверным утилитам для преобразования контента, включая конвертацию Yandex Flavored Markdown (YFM) в HTML и обработку текста. Основные возможности:
4+
5+
- **`fullTransform`**: Преобразует контент в формате YFM в HTML с настраиваемыми параметрами.
6+
- **Утилиты**: `typografToText`, `typografToHTML` и `yfmTransformer` для обработки текста в пользовательских компонентах.
7+
- **`createItemsParser`**: Утилита для преобразования определённых полей в блоках, поддерживающая вложенные поля и массивы.
8+
9+
### Серверные утилиты
10+
11+
Пакет включает набор серверных утилит для преобразования контента.
12+
13+
```ts
14+
const {fullTransform} = require('@gravity-ui/page-constructor/server');
15+
16+
const {html} = fullTransform(content, {
17+
lang,
18+
extractTitle: true,
19+
allowHTML: true,
20+
path: __dirname,
21+
plugins,
22+
});
23+
```
24+
25+
Для преобразования Yandex Flavored Markdown в HTML используется пакет `diplodoc/transfrom`, который входит в peer-зависимости.
26+
27+
Эти утилиты можно также использовать в кастомных компонентах или других частях проекта.
28+
29+
```ts
30+
const {
31+
typografToText,
32+
typografToHTML,
33+
yfmTransformer,
34+
} = require('@gravity-ui/page-constructor/server');
35+
36+
const post = {
37+
title: typografToText(title, lang),
38+
content: typografToHTML(content, lang),
39+
description: yfmTransformer(lang, description, {plugins}),
40+
};
41+
```
42+
43+
Список других доступных утилит можно найти в [этом разделе](https://github.com/gravity-ui/page-constructor/tree/main/src/text-transform).
44+
45+
## Документация к `createItemsParser`
46+
47+
Метод `createItemsParser` — это утилита, для создания парсеров блоков. Он помогает с преобразованием определённых полей с использованием трансформера. Метод имеет опции, позволяющие указать, какие поля нужно преобразовать и как обрабатывать вложенные поля.
48+
49+
### Сигнатура метода
50+
51+
```typescript
52+
export const createItemsParser = (fields: string[]) => (transformer: Transformer, items: Item[]) => Item[];
53+
```
54+
55+
### Параметры
56+
57+
- **fields**: Массив строк, указывающих поля для преобразования. Эти поля могут быть вложенными, используя точечную нотацию (например, `'nested.field'`).
58+
- **transformer**: Функция, которая принимает строку и возвращает преобразованную строку. Эта функция будет применена к указанным полям.
59+
- **items**: Массив элементов для парсинга и преобразования. Каждый элемент может быть строкой или сложным объектом.
60+
61+
### Возвращаемое значение
62+
63+
- Возвращает массив элементов с преобразованными указанными полями с помощью функции `transformer`.
64+
65+
## Примеры использования
66+
67+
### Пример 1: Базовое использование
68+
69+
В этом примере преобразуются поля `text` и `additionalInfo` каждого элемента в массиве `items` с использованием `yfmTransformer`.
70+
71+
```typescript
72+
const config = {
73+
fields: ['items'],
74+
transformer: yfmTransformer,
75+
parser: createItemsParser(['text', 'additionalInfo']),
76+
};
77+
```
78+
79+
**Input:**
80+
81+
```json
82+
[
83+
{"text": "Hello, world!", "additionalInfo": "This is a test."},
84+
{"text": "Another item", "additionalInfo": "More info here."}
85+
]
86+
```
87+
88+
**Output:**
89+
90+
```json
91+
[
92+
{"text": "Transformed: Hello, world!", "additionalInfo": "Transformed: This is a test."},
93+
{"text": "Transformed: Another item", "additionalInfo": "Transformed: More info here."}
94+
]
95+
```
96+
97+
### Пример 2: Вложенные поля
98+
99+
В этом примере преобразуется вложенное поле `list.text` внутри каждого элемента.
100+
101+
```typescript
102+
const config = {
103+
fields: ['items'],
104+
transformer: yfmTransformer,
105+
parser: createItemsParser(['list.text']),
106+
renderInline: true,
107+
};
108+
```
109+
110+
**Input:**
111+
112+
```json
113+
[{"list": {"text": "Вложенный текст 1"}}, {"list": {"text": "Вложенный текст 2"}}]
114+
```
115+
116+
**Output:**
117+
118+
```json
119+
[
120+
{"list": {"text": "Transformed: Вложенный текст 1"}},
121+
{"list": {"text": "Transformed: Вложенный текст 2"}}
122+
]
123+
```
124+
125+
### Пример 3: Смешанные типы данных
126+
127+
В этом примере массив `items` содержит как строки, так и сложные объекты. Метод `createItemsParser` корректно обрабатывает оба типа данных.
128+
129+
```typescript
130+
const config = {
131+
fields: ['items'],
132+
transformer: yfmTransformer,
133+
parser: createItemsParser(['text', 'list.text']),
134+
};
135+
```
136+
137+
**Input:**
138+
139+
```json
140+
["Простая строка", {"text": "Текст объекта", "list": {"text": "Вложенный текст"}}]
141+
```
142+
143+
**Output:**
144+
145+
```json
146+
[
147+
"Transformed: Простая строка",
148+
{"text": "Transformed: Текст объекта", "list": {"text": "Transformed: Вложенный текст"}}
149+
]
150+
```
151+
152+
## Примечания
153+
154+
- Если поле не найдено в элементе, оно будет пропущено.
155+
- Если указано вложенное поле, но родительский объект не является объектом или не является массивом, преобразование для этого поля будет пропущено.
156+
- Метод не изменяет исходные элементы, а возвращает новый массив с преобразованными данными.
157+
158+
### Обработка вложенных массивов
159+
160+
Если вложенное поле является массивом, метод `createItemsParser` будет итерировать по каждому элементу массива и применять трансформер к указанному полю. Это особенно полезно при работе с массивами объектов, содержащими поля, которые требуют преобразования.
161+
162+
### Пример 4: Вложенное поле как массив
163+
164+
В этом примере преобразуется поле `text` внутри каждого объекта в массиве `list`, который является вложенным полем элементов `items`.
165+
166+
```typescript
167+
const config = {
168+
fields: ['items'],
169+
transformer: yfmTransformer,
170+
parser: createItemsParser(['list.text']),
171+
};
172+
```
173+
174+
**Input:**
175+
176+
```json
177+
[
178+
{
179+
"list": [{"text": "Вложенный текст 1"}, {"text": "Вложенный текст 2"}]
180+
},
181+
{
182+
"list": [{"text": "Вложенный текст 3"}, {"text": "Вложенный текст 4"}]
183+
}
184+
]
185+
```
186+
187+
**Output:**
188+
189+
```json
190+
[
191+
{
192+
"list": [{"text": "Transformed: Вложенный текст 1"}, {"text": "Transformed: Вложенный текст 2"}]
193+
},
194+
{
195+
"list": [{"text": "Transformed: Вложенный текст 3"}, {"text": "Transformed: Вложенный текст 4"}]
196+
}
197+
]
198+
```
199+
200+
## Полный пример со всеми случаями
201+
202+
Вот комплексный пример, включающий все возможные случаи: обычные поля, вложенные объекты и вложенные массивы.
203+
204+
```typescript
205+
const config = {
206+
fields: ['items'],
207+
transformer: yfmTransformer,
208+
parser: createItemsParser(['text', 'list.text', 'details.info']),
209+
};
210+
211+
const transformedItems = config.parser(config.transformer, items);
212+
```
213+
214+
**Input:**
215+
216+
```json
217+
[
218+
{
219+
"text": "Обычный текст",
220+
"list": [{"text": "Вложенный текст 1"}, {"text": "Вложенный текст 2"}],
221+
"details": {
222+
"info": "Вложенная информация"
223+
}
224+
},
225+
{
226+
"text": "Другой обычный текст",
227+
"list": {"text": "Вложенный текст 3"},
228+
"details": {
229+
"info": "Другая вложенная информация"
230+
}
231+
}
232+
]
233+
```
234+
235+
**Output:**
236+
237+
```json
238+
[
239+
{
240+
"text": "Transformed: Обычный текст",
241+
"list": [
242+
{"text": "Transformed: Вложенный текст 1"},
243+
{"text": "Transformed: Вложенный текст 2"}
244+
],
245+
"details": {
246+
"info": "Transformed: Вложенная информация"
247+
}
248+
},
249+
{
250+
"text": "Transformed: Другой обычный текст",
251+
"list": {"text": "Transformed: Вложенный текст 3"},
252+
"details": {
253+
"info": "Transformed: Другая вложенная информация"
254+
}
255+
}
256+
]
257+
```

0 commit comments

Comments
 (0)