@brilo/base-blocks 0.1.58 → 0.1.61
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/build/.tsbuildinfo +1 -1
- package/build/blocks/anchor/anchor-group/icon.js +1 -1
- package/build/blocks/career/career-benefits/icon.js +1 -1
- package/build/blocks/career/career-header/icon.js +1 -1
- package/build/blocks/career/job-position-group/icon.js +1 -1
- package/build/blocks/column/column-item/edit.d.ts.map +1 -1
- package/build/blocks/column/column-item/index.d.ts.map +1 -1
- package/build/blocks/column/column-item/index.js +1 -0
- package/build/blocks/compare/compare-option/edit.d.ts +1 -1
- package/build/blocks/compare/compare-option/edit.d.ts.map +1 -1
- package/build/blocks/compare/compare-option/edit.js +1 -1
- package/build/blocks/contact/contact-item/factory.d.ts.map +1 -1
- package/build/blocks/document/documents-grid/icon.js +1 -1
- package/build/blocks/event/event-detail-content/icon.js +1 -1
- package/build/blocks/event/event-detail-header/icon.js +1 -1
- package/build/blocks/event/event-list-group/icon.js +1 -1
- package/build/blocks/faq/faq-item/edit.d.ts.map +1 -1
- package/build/blocks/faq/faq-item/edit.js +2 -2
- package/build/blocks/food-menu/food-menu-group/FoodMenuPreview.d.ts.map +1 -1
- package/build/blocks/food-menu/food-menu-group/FoodMenuPreview.js +36 -6
- package/build/blocks/food-menu/food-menu-group/constants.d.ts +51 -3
- package/build/blocks/food-menu/food-menu-group/constants.d.ts.map +1 -1
- package/build/blocks/food-menu/food-menu-group/constants.js +32 -6
- package/build/blocks/food-menu/food-menu-group/edit.d.ts.map +1 -1
- package/build/blocks/food-menu/food-menu-group/edit.js +61 -2
- package/build/blocks/food-menu/food-menu-group/factory.d.ts.map +1 -1
- package/build/blocks/food-menu/food-menu-group/factory.js +77 -45
- package/build/blocks/food-menu/food-menu-group/index.d.ts +1 -1
- package/build/blocks/food-menu/food-menu-group/index.d.ts.map +1 -1
- package/build/blocks/food-menu/food-menu-group/types.d.ts +12 -5
- package/build/blocks/food-menu/food-menu-group/types.d.ts.map +1 -1
- package/build/blocks/food-menu/food-reservation/edit.d.ts +7 -0
- package/build/blocks/food-menu/food-reservation/edit.d.ts.map +1 -0
- package/build/blocks/food-menu/food-reservation/edit.js +69 -0
- package/build/blocks/food-menu/food-reservation/factory.d.ts +4 -0
- package/build/blocks/food-menu/food-reservation/factory.d.ts.map +1 -0
- package/build/blocks/food-menu/food-reservation/factory.js +24 -0
- package/build/blocks/food-menu/food-reservation/icon.d.ts +2 -0
- package/build/blocks/food-menu/food-reservation/icon.d.ts.map +1 -0
- package/build/blocks/food-menu/food-reservation/icon.js +2 -0
- package/build/blocks/food-menu/food-reservation/index.d.ts +5 -0
- package/build/blocks/food-menu/food-reservation/index.d.ts.map +1 -0
- package/build/blocks/food-menu/food-reservation/index.js +6 -0
- package/build/blocks/food-menu/food-reservation/types.d.ts +7 -0
- package/build/blocks/food-menu/food-reservation/types.d.ts.map +1 -0
- package/build/blocks/food-menu/food-reservation/types.js +1 -0
- package/build/blocks/form/form-field/types.d.ts +1 -1
- package/build/blocks/form/form-field/types.d.ts.map +1 -1
- package/build/blocks/form/form-group/index.js +1 -1
- package/build/blocks/gallery/gallery-group/constants.d.ts +1 -19
- package/build/blocks/gallery/gallery-group/constants.d.ts.map +1 -1
- package/build/blocks/gallery/gallery-group/constants.js +1 -8
- package/build/blocks/gallery/gallery-group/edit.d.ts.map +1 -1
- package/build/blocks/gallery/gallery-group/edit.js +3 -19
- package/build/blocks/gallery/gallery-item/index.js +1 -1
- package/build/blocks/gallery/gallery-strip-group/constants.d.ts +34 -0
- package/build/blocks/gallery/gallery-strip-group/constants.d.ts.map +1 -0
- package/build/blocks/gallery/gallery-strip-group/constants.js +17 -0
- package/build/blocks/gallery/gallery-strip-group/edit.d.ts +7 -0
- package/build/blocks/gallery/gallery-strip-group/edit.d.ts.map +1 -0
- package/build/blocks/gallery/gallery-strip-group/edit.js +34 -0
- package/build/blocks/gallery/gallery-strip-group/factory.d.ts +5 -0
- package/build/blocks/gallery/gallery-strip-group/factory.d.ts.map +1 -0
- package/build/blocks/gallery/gallery-strip-group/factory.js +28 -0
- package/build/blocks/gallery/gallery-strip-group/index.d.ts +5 -0
- package/build/blocks/gallery/gallery-strip-group/index.d.ts.map +1 -0
- package/build/blocks/gallery/gallery-strip-group/index.js +7 -0
- package/build/blocks/gallery/gallery-strip-group/types.d.ts +18 -0
- package/build/blocks/gallery/gallery-strip-group/types.d.ts.map +1 -0
- package/build/blocks/gallery/gallery-strip-group/types.js +1 -0
- package/build/blocks/groups/banner-group/icon.js +1 -1
- package/build/blocks/groups/content-group/icon.js +1 -1
- package/build/blocks/groups/text-and-media-group/index.d.ts.map +1 -1
- package/build/blocks/groups/text-and-media-group/index.js +2 -0
- package/build/blocks/hero/hero-group/edit.js +1 -1
- package/build/blocks/hero/hero-group/icon.js +1 -1
- package/build/blocks/hero/hero-group/types.d.ts +1 -1
- package/build/blocks/hero/hero-group/types.d.ts.map +1 -1
- package/build/blocks/hero/hero-item/edit.js +1 -1
- package/build/blocks/hero/hero-item/index.js +1 -1
- package/build/blocks/layout/box/icon.js +1 -1
- package/build/blocks/layout/layout-aside/edit.d.ts +1 -2
- package/build/blocks/layout/layout-aside/edit.d.ts.map +1 -1
- package/build/blocks/layout/layout-aside/edit.js +1 -1
- package/build/blocks/layout/layout-aside/factory.d.ts.map +1 -1
- package/build/blocks/layout/layout-aside/icon.d.ts +1 -2
- package/build/blocks/layout/layout-aside/icon.d.ts.map +1 -1
- package/build/blocks/layout/layout-aside/icon.js +1 -1
- package/build/blocks/layout/layout-content/edit.d.ts +1 -2
- package/build/blocks/layout/layout-content/edit.d.ts.map +1 -1
- package/build/blocks/layout/layout-content/edit.js +1 -1
- package/build/blocks/layout/layout-content/factory.d.ts.map +1 -1
- package/build/blocks/layout/layout-content/icon.d.ts +1 -2
- package/build/blocks/layout/layout-content/icon.d.ts.map +1 -1
- package/build/blocks/layout/layout-content/icon.js +1 -1
- package/build/blocks/layout/layout-content-w-aside/edit.d.ts +1 -2
- package/build/blocks/layout/layout-content-w-aside/edit.d.ts.map +1 -1
- package/build/blocks/layout/layout-content-w-aside/factory.d.ts.map +1 -1
- package/build/blocks/layout/layout-content-w-aside/icon.d.ts +1 -2
- package/build/blocks/layout/layout-content-w-aside/icon.d.ts.map +1 -1
- package/build/blocks/layout/layout-content-w-aside/icon.js +1 -1
- package/build/blocks/link/link-item/icon.js +1 -1
- package/build/blocks/map/map-group/edit.d.ts.map +1 -1
- package/build/blocks/map/map-group/edit.js +1 -1
- package/build/blocks/map/map-group/factory.d.ts.map +1 -1
- package/build/blocks/map/map-group/types.d.ts.map +1 -1
- package/build/blocks/newsletter/newsletter-form/edit.d.ts.map +1 -1
- package/build/blocks/newsletter/newsletter-form/edit.js +2 -1
- package/build/blocks/person/person-group/icon.js +1 -1
- package/build/blocks/person/person-item/constants.d.ts.map +1 -1
- package/build/blocks/post/post-content/icon.js +1 -1
- package/build/blocks/post/post-content/types.d.ts.map +1 -1
- package/build/blocks/post/post-slider-group/icon.js +1 -1
- package/build/blocks/post/posts-grid/icon.js +1 -1
- package/build/blocks/review/review-summary-item/constants.d.ts +3 -0
- package/build/blocks/review/review-summary-item/constants.d.ts.map +1 -0
- package/build/blocks/review/review-summary-item/constants.js +2 -0
- package/build/blocks/review/review-summary-item/edit.d.ts +6 -0
- package/build/blocks/review/review-summary-item/edit.d.ts.map +1 -0
- package/build/blocks/review/review-summary-item/edit.js +17 -0
- package/build/blocks/review/review-summary-item/factory.d.ts +5 -0
- package/build/blocks/review/review-summary-item/factory.d.ts.map +1 -0
- package/build/blocks/review/review-summary-item/factory.js +23 -0
- package/build/blocks/review/review-summary-item/index.d.ts +5 -0
- package/build/blocks/review/review-summary-item/index.d.ts.map +1 -0
- package/build/blocks/review/review-summary-item/index.js +5 -0
- package/build/blocks/review/review-summary-item/types.d.ts +11 -0
- package/build/blocks/review/review-summary-item/types.d.ts.map +1 -0
- package/build/blocks/review/review-summary-item/types.js +1 -0
- package/build/blocks/share/share/icon.js +1 -1
- package/build/blocks/signpost/signpost-group/icon.js +1 -1
- package/build/blocks/step/step-group/factory.d.ts.map +1 -1
- package/build/blocks/step/step-group/icon.js +1 -1
- package/build/blocks/testimonial/testimonial-group/icon.js +1 -1
- package/build/blocks/urgency/urgency-item/constants.d.ts +56 -0
- package/build/blocks/urgency/urgency-item/constants.d.ts.map +1 -0
- package/build/blocks/urgency/urgency-item/constants.js +32 -0
- package/build/blocks/urgency/urgency-item/edit.d.ts +7 -0
- package/build/blocks/urgency/urgency-item/edit.d.ts.map +1 -0
- package/build/blocks/urgency/urgency-item/edit.js +83 -0
- package/build/blocks/urgency/urgency-item/factory.d.ts +5 -0
- package/build/blocks/urgency/urgency-item/factory.d.ts.map +1 -0
- package/build/blocks/urgency/urgency-item/factory.js +31 -0
- package/build/blocks/urgency/urgency-item/index.d.ts +5 -0
- package/build/blocks/urgency/urgency-item/index.d.ts.map +1 -0
- package/build/blocks/urgency/urgency-item/index.js +5 -0
- package/build/blocks/urgency/urgency-item/types.d.ts +22 -0
- package/build/blocks/urgency/urgency-item/types.d.ts.map +1 -0
- package/build/blocks/urgency/urgency-item/types.js +1 -0
- package/build/components/GalleryImagesAppender/index.d.ts +5 -0
- package/build/components/GalleryImagesAppender/index.d.ts.map +1 -0
- package/build/components/GalleryImagesAppender/index.js +12 -0
- package/build/components/ImagePicker/ImagePicker.d.ts.map +1 -1
- package/build/components/ImagePicker/ImagePicker.js +1 -5
- package/build/constants.d.ts +19 -0
- package/build/constants.d.ts.map +1 -1
- package/build/constants.js +8 -0
- package/build/hooks/useGroupBlock.d.ts.map +1 -1
- package/build/hooks/useGroupBlock.js +10 -3
- package/build/index.d.ts +8 -0
- package/build/index.d.ts.map +1 -1
- package/build/index.js +4 -0
- package/package.json +4 -3
- package/src/blocks/anchor/anchor-group/icon.tsx +1 -1
- package/src/blocks/career/career-benefits/icon.tsx +1 -1
- package/src/blocks/career/career-header/icon.tsx +1 -1
- package/src/blocks/career/job-position-group/icon.tsx +1 -1
- package/src/blocks/column/column-item/edit.tsx +0 -1
- package/src/blocks/column/column-item/index.ts +1 -0
- package/src/blocks/compare/compare-option/edit.tsx +1 -1
- package/src/blocks/contact/contact-item/factory.tsx +1 -2
- package/src/blocks/document/documents-grid/icon.tsx +1 -1
- package/src/blocks/event/event-detail-content/icon.tsx +1 -1
- package/src/blocks/event/event-detail-header/icon.tsx +1 -1
- package/src/blocks/event/event-list-group/icon.tsx +1 -1
- package/src/blocks/faq/faq-item/edit.tsx +23 -25
- package/src/blocks/food-menu/food-menu-group/FoodMenuPreview.tsx +58 -9
- package/src/blocks/food-menu/food-menu-group/constants.ts +37 -6
- package/src/blocks/food-menu/food-menu-group/edit.tsx +116 -20
- package/src/blocks/food-menu/food-menu-group/editor.scss +35 -6
- package/src/blocks/food-menu/food-menu-group/factory.tsx +77 -39
- package/src/blocks/food-menu/food-menu-group/index.ts +2 -0
- package/src/blocks/food-menu/food-menu-group/types.ts +18 -5
- package/src/blocks/food-menu/food-reservation/edit.tsx +179 -0
- package/src/blocks/food-menu/food-reservation/factory.tsx +28 -0
- package/src/blocks/food-menu/food-reservation/icon.tsx +9 -0
- package/src/blocks/food-menu/food-reservation/index.ts +10 -0
- package/src/blocks/food-menu/food-reservation/types.ts +8 -0
- package/src/blocks/form/form-field/types.ts +1 -7
- package/src/blocks/form/form-group/index.ts +1 -1
- package/src/blocks/gallery/gallery-group/constants.ts +1 -8
- package/src/blocks/gallery/gallery-group/edit.tsx +3 -39
- package/src/blocks/gallery/gallery-group/editor.scss +0 -12
- package/src/blocks/gallery/gallery-item/index.ts +1 -1
- package/src/blocks/gallery/gallery-strip-group/constants.ts +22 -0
- package/src/blocks/gallery/gallery-strip-group/edit.tsx +112 -0
- package/src/blocks/gallery/gallery-strip-group/editor.scss +36 -0
- package/src/blocks/gallery/gallery-strip-group/factory.tsx +32 -0
- package/src/blocks/gallery/gallery-strip-group/index.ts +11 -0
- package/src/blocks/gallery/gallery-strip-group/types.ts +20 -0
- package/src/blocks/groups/banner-group/edit.tsx +1 -1
- package/src/blocks/groups/banner-group/icon.tsx +1 -1
- package/src/blocks/groups/content-group/icon.tsx +1 -1
- package/src/blocks/groups/text-and-media-group/index.ts +2 -0
- package/src/blocks/hero/hero-group/edit.tsx +3 -3
- package/src/blocks/hero/hero-group/icon.tsx +1 -1
- package/src/blocks/hero/hero-group/types.ts +1 -1
- package/src/blocks/hero/hero-item/edit.tsx +5 -5
- package/src/blocks/hero/hero-item/index.ts +1 -1
- package/src/blocks/layout/box/icon.tsx +1 -1
- package/src/blocks/layout/layout-aside/edit.tsx +2 -3
- package/src/blocks/layout/layout-aside/factory.tsx +0 -1
- package/src/blocks/layout/layout-aside/icon.tsx +1 -3
- package/src/blocks/layout/layout-content/edit.tsx +2 -3
- package/src/blocks/layout/layout-content/factory.tsx +0 -1
- package/src/blocks/layout/layout-content/icon.tsx +1 -3
- package/src/blocks/layout/layout-content-w-aside/edit.tsx +0 -1
- package/src/blocks/layout/layout-content-w-aside/factory.tsx +0 -1
- package/src/blocks/layout/layout-content-w-aside/icon.tsx +1 -3
- package/src/blocks/link/link-item/icon.tsx +1 -1
- package/src/blocks/map/map-group/edit.tsx +8 -3
- package/src/blocks/map/map-group/factory.tsx +1 -1
- package/src/blocks/map/map-group/types.ts +1 -1
- package/src/blocks/newsletter/newsletter-form/edit.tsx +5 -2
- package/src/blocks/person/person-group/icon.tsx +1 -1
- package/src/blocks/person/person-item/constants.ts +1 -1
- package/src/blocks/post/post-content/icon.tsx +1 -1
- package/src/blocks/post/post-content/types.ts +0 -1
- package/src/blocks/post/post-slider-group/icon.tsx +1 -1
- package/src/blocks/post/posts-grid/icon.tsx +1 -1
- package/src/blocks/review/review-summary-item/constants.ts +2 -0
- package/src/blocks/review/review-summary-item/edit.tsx +86 -0
- package/src/blocks/review/review-summary-item/editor.scss +44 -0
- package/src/blocks/review/review-summary-item/factory.tsx +27 -0
- package/src/blocks/review/review-summary-item/index.ts +9 -0
- package/src/blocks/review/review-summary-item/types.ts +11 -0
- package/src/blocks/share/share/icon.tsx +1 -1
- package/src/blocks/signpost/signpost-group/icon.tsx +1 -1
- package/src/blocks/step/step-group/factory.tsx +1 -1
- package/src/blocks/step/step-group/icon.tsx +1 -1
- package/src/blocks/testimonial/testimonial-group/icon.tsx +1 -1
- package/src/blocks/urgency/urgency-item/constants.ts +39 -0
- package/src/blocks/urgency/urgency-item/edit.tsx +319 -0
- package/src/blocks/urgency/urgency-item/editor.scss +99 -0
- package/src/blocks/urgency/urgency-item/factory.tsx +36 -0
- package/src/blocks/urgency/urgency-item/index.ts +9 -0
- package/src/blocks/urgency/urgency-item/types.ts +23 -0
- package/src/components/GalleryImagesAppender/editor.scss +15 -0
- package/src/components/GalleryImagesAppender/index.tsx +29 -0
- package/src/components/ImagePicker/ImagePicker.tsx +6 -6
- package/src/components/ItemIconControl/types.d.ts +0 -1
- package/src/constants.ts +9 -0
- package/src/editor.scss +4 -0
- package/src/hooks/useGroupBlock.ts +10 -2
- package/src/index.ts +8 -0
|
@@ -34,6 +34,14 @@ $warn: #9a6700;
|
|
|
34
34
|
padding: 10px 0 14px;
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
+
// The block's own style (see `previewStyle`) overrides the admin palette
|
|
38
|
+
// through these properties; unset, the card looks as before.
|
|
39
|
+
.brilo-food-menu-preview__card {
|
|
40
|
+
color: var(--food-menu-preview-text, $fg);
|
|
41
|
+
border-radius: 4px;
|
|
42
|
+
box-shadow: var(--food-menu-preview-shadow, none);
|
|
43
|
+
}
|
|
44
|
+
|
|
37
45
|
.brilo-food-menu-preview__head {
|
|
38
46
|
display: flex;
|
|
39
47
|
flex-wrap: wrap;
|
|
@@ -41,8 +49,8 @@ $warn: #9a6700;
|
|
|
41
49
|
align-items: center;
|
|
42
50
|
justify-content: space-between;
|
|
43
51
|
padding: 10px 14px;
|
|
44
|
-
background: $surface;
|
|
45
|
-
border: 1px solid $line;
|
|
52
|
+
background: var(--food-menu-preview-background, $surface);
|
|
53
|
+
border: 1px solid var(--food-menu-preview-border, $line);
|
|
46
54
|
border-bottom: 0;
|
|
47
55
|
border-radius: 4px 4px 0 0;
|
|
48
56
|
}
|
|
@@ -105,7 +113,8 @@ $warn: #9a6700;
|
|
|
105
113
|
}
|
|
106
114
|
|
|
107
115
|
.brilo-food-menu-preview__body {
|
|
108
|
-
|
|
116
|
+
background: var(--food-menu-preview-background, transparent);
|
|
117
|
+
border: 1px solid var(--food-menu-preview-border, $line);
|
|
109
118
|
border-radius: 0 0 4px 4px;
|
|
110
119
|
}
|
|
111
120
|
|
|
@@ -164,9 +173,29 @@ $warn: #9a6700;
|
|
|
164
173
|
}
|
|
165
174
|
}
|
|
166
175
|
|
|
176
|
+
// Paired half sections of a standing lístek, side by side as on the page.
|
|
177
|
+
.brilo-food-menu-preview__sections--split {
|
|
178
|
+
display: grid;
|
|
179
|
+
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
180
|
+
|
|
181
|
+
.brilo-food-menu-preview__section:not(.brilo-food-menu-preview__section--half) {
|
|
182
|
+
grid-column: 1 / -1;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
.brilo-food-menu-preview__section--half:not(.brilo-food-menu-preview__section--first-half) {
|
|
186
|
+
border-left: 1px solid var(--food-menu-preview-border, $line);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// A pair opening the lístek has no line above either half.
|
|
190
|
+
.brilo-food-menu-preview__section--first-half:first-child + .brilo-food-menu-preview__section--half {
|
|
191
|
+
border-top: 0;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
167
195
|
.brilo-food-menu-preview__section-title {
|
|
168
196
|
margin: 0 0 4px;
|
|
169
|
-
color: $muted;
|
|
197
|
+
color: var(--food-menu-preview-text, $muted);
|
|
198
|
+
text-align: var(--food-menu-preview-align, center);
|
|
170
199
|
font-weight: 600;
|
|
171
200
|
font-size: 11px;
|
|
172
201
|
letter-spacing: 0.08em;
|
|
@@ -234,8 +263,8 @@ $warn: #9a6700;
|
|
|
234
263
|
padding: 8px 14px;
|
|
235
264
|
color: $muted;
|
|
236
265
|
font-size: 12px;
|
|
237
|
-
background: $surface;
|
|
238
|
-
border-top: 1px solid $line;
|
|
266
|
+
background: var(--food-menu-preview-background, $surface);
|
|
267
|
+
border-top: 1px solid var(--food-menu-preview-border, $line);
|
|
239
268
|
border-radius: 0 0 4px 4px;
|
|
240
269
|
}
|
|
241
270
|
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import type {BlockConfiguration} from '@wordpress/blocks'
|
|
2
2
|
import {__} from '@wordpress/i18n'
|
|
3
|
+
import {DEFAULT_SURFACE_SHADOWS, surfaceStyleAttribute} from '~/components/SurfaceStyleControl'
|
|
4
|
+
import {withObjectDefaults} from '~/utils/withObjectDefaults'
|
|
3
5
|
import {
|
|
4
6
|
FOOD_MENU_GROUP_EMPTY_BEHAVIOUR,
|
|
5
7
|
FOOD_MENU_GROUP_EMPTY_BEHAVIOURS,
|
|
@@ -7,12 +9,65 @@ import {
|
|
|
7
9
|
FOOD_MENU_GROUP_LAYOUTS,
|
|
8
10
|
FOOD_MENU_GROUP_MODE,
|
|
9
11
|
FOOD_MENU_GROUP_MODES,
|
|
12
|
+
FOOD_MENU_GROUP_RESERVATION_MODE,
|
|
13
|
+
FOOD_MENU_GROUP_RESERVATION_MODES,
|
|
14
|
+
FOOD_MENU_GROUP_TEXT_ALIGN,
|
|
15
|
+
FOOD_MENU_GROUP_TEXT_ALIGNS,
|
|
10
16
|
} from './constants'
|
|
11
17
|
import {createFoodMenuGroupEdit} from './edit'
|
|
12
18
|
import {icon as defaultIcon} from './icon'
|
|
13
19
|
import type {FoodMenuGroupAttributes, FoodMenuGroupOptions} from './types'
|
|
14
20
|
|
|
15
21
|
export function createFoodMenuGroupBlock(options: FoodMenuGroupOptions): BlockConfiguration<FoodMenuGroupAttributes> {
|
|
22
|
+
const attributes = {
|
|
23
|
+
mode: {
|
|
24
|
+
type: 'string',
|
|
25
|
+
default: FOOD_MENU_GROUP_MODE,
|
|
26
|
+
enum: FOOD_MENU_GROUP_MODES.map((option) => option.value),
|
|
27
|
+
},
|
|
28
|
+
layout: {
|
|
29
|
+
type: 'string',
|
|
30
|
+
default: FOOD_MENU_GROUP_LAYOUT,
|
|
31
|
+
enum: FOOD_MENU_GROUP_LAYOUTS.map((option) => option.value),
|
|
32
|
+
},
|
|
33
|
+
menuIds: {
|
|
34
|
+
type: 'array',
|
|
35
|
+
default: [],
|
|
36
|
+
items: {type: 'number'},
|
|
37
|
+
},
|
|
38
|
+
showPrices: {
|
|
39
|
+
type: 'boolean',
|
|
40
|
+
default: true,
|
|
41
|
+
},
|
|
42
|
+
showAllergens: {
|
|
43
|
+
type: 'boolean',
|
|
44
|
+
default: true,
|
|
45
|
+
},
|
|
46
|
+
reservationMode: {
|
|
47
|
+
type: 'string',
|
|
48
|
+
default: FOOD_MENU_GROUP_RESERVATION_MODE,
|
|
49
|
+
enum: FOOD_MENU_GROUP_RESERVATION_MODES.map((option) => option.value),
|
|
50
|
+
},
|
|
51
|
+
emptyBehaviour: {
|
|
52
|
+
type: 'string',
|
|
53
|
+
default: FOOD_MENU_GROUP_EMPTY_BEHAVIOUR,
|
|
54
|
+
enum: FOOD_MENU_GROUP_EMPTY_BEHAVIOURS.map((option) => option.value),
|
|
55
|
+
},
|
|
56
|
+
// Empty means "use the wording the server picks for this mode".
|
|
57
|
+
emptyText: {
|
|
58
|
+
type: 'string',
|
|
59
|
+
default: '',
|
|
60
|
+
},
|
|
61
|
+
style: surfaceStyleAttribute(options.shadows ?? DEFAULT_SURFACE_SHADOWS),
|
|
62
|
+
textAlign: {
|
|
63
|
+
type: 'string',
|
|
64
|
+
default: FOOD_MENU_GROUP_TEXT_ALIGN,
|
|
65
|
+
enum: FOOD_MENU_GROUP_TEXT_ALIGNS.map((align) => align.value),
|
|
66
|
+
},
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const {reservationMode: _reservationMode, ...withoutReservationMode} = attributes
|
|
70
|
+
|
|
16
71
|
return {
|
|
17
72
|
name: options.name,
|
|
18
73
|
title: options.title ?? __('Jídelní lístek', 'brilo-blocks'),
|
|
@@ -21,46 +76,29 @@ export function createFoodMenuGroupBlock(options: FoodMenuGroupOptions): BlockCo
|
|
|
21
76
|
...(options.parent && {parent: options.parent}),
|
|
22
77
|
icon: options.icon ?? {src: defaultIcon},
|
|
23
78
|
supports: {html: false, customClassName: false},
|
|
24
|
-
attributes
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
showAllergens: {
|
|
45
|
-
type: 'boolean',
|
|
46
|
-
default: true,
|
|
79
|
+
attributes,
|
|
80
|
+
// The on/off "Umožnit rezervaci obědu" toggle became a three-way choice.
|
|
81
|
+
// A dynamic block is always valid, so the migration opts in through
|
|
82
|
+
// `isEligible`, which sees the raw comment attributes. Blocks that never
|
|
83
|
+
// stored the toggle had it on, which is the new default too.
|
|
84
|
+
deprecated: [
|
|
85
|
+
{
|
|
86
|
+
attributes: {
|
|
87
|
+
...withoutReservationMode,
|
|
88
|
+
showReservation: {
|
|
89
|
+
type: 'boolean',
|
|
90
|
+
default: true,
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
isEligible: (raw: Record<string, unknown>) => 'showReservation' in raw && !('reservationMode' in raw),
|
|
94
|
+
migrate: ({showReservation, ...rest}: Record<string, unknown>) => ({
|
|
95
|
+
...rest,
|
|
96
|
+
reservationMode: false === showReservation ? 'off' : 'modal',
|
|
97
|
+
}),
|
|
98
|
+
save: () => null,
|
|
47
99
|
},
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
default: true,
|
|
51
|
-
},
|
|
52
|
-
emptyBehaviour: {
|
|
53
|
-
type: 'string',
|
|
54
|
-
default: FOOD_MENU_GROUP_EMPTY_BEHAVIOUR,
|
|
55
|
-
enum: [...FOOD_MENU_GROUP_EMPTY_BEHAVIOURS],
|
|
56
|
-
},
|
|
57
|
-
// Empty means "use the wording the server picks for this mode".
|
|
58
|
-
emptyText: {
|
|
59
|
-
type: 'string',
|
|
60
|
-
default: '',
|
|
61
|
-
},
|
|
62
|
-
},
|
|
63
|
-
edit: createFoodMenuGroupEdit(options),
|
|
100
|
+
],
|
|
101
|
+
edit: withObjectDefaults(createFoodMenuGroupEdit(options)),
|
|
64
102
|
save: () => null,
|
|
65
103
|
} as unknown as BlockConfiguration<FoodMenuGroupAttributes>
|
|
66
104
|
}
|
|
@@ -4,6 +4,8 @@ export type {
|
|
|
4
4
|
FoodMenuGroupLayout,
|
|
5
5
|
FoodMenuGroupMode,
|
|
6
6
|
FoodMenuGroupOptions,
|
|
7
|
+
FoodMenuGroupReservationMode,
|
|
8
|
+
FoodMenuGroupTextAlign,
|
|
7
9
|
} from './types'
|
|
8
10
|
export {createFoodMenuGroupBlock} from './factory'
|
|
9
11
|
export {FoodMenuSelectModal} from './FoodMenuSelectModal'
|
|
@@ -1,9 +1,18 @@
|
|
|
1
|
+
import type {SurfaceShadowOption, SurfaceStyle} from '~/components/SurfaceStyleControl'
|
|
1
2
|
import type {BriloBlockType, SelectControlProps} from '~/types'
|
|
2
|
-
import type {
|
|
3
|
+
import type {
|
|
4
|
+
FOOD_MENU_GROUP_EMPTY_BEHAVIOURS,
|
|
5
|
+
FOOD_MENU_GROUP_LAYOUTS,
|
|
6
|
+
FOOD_MENU_GROUP_MODES,
|
|
7
|
+
FOOD_MENU_GROUP_RESERVATION_MODES,
|
|
8
|
+
FOOD_MENU_GROUP_TEXT_ALIGNS,
|
|
9
|
+
} from './constants'
|
|
3
10
|
|
|
4
|
-
export type FoodMenuGroupMode = (typeof FOOD_MENU_GROUP_MODES)[number]
|
|
5
|
-
export type FoodMenuGroupLayout = (typeof FOOD_MENU_GROUP_LAYOUTS)[number]
|
|
6
|
-
export type FoodMenuGroupEmptyBehaviour = (typeof FOOD_MENU_GROUP_EMPTY_BEHAVIOURS)[number]
|
|
11
|
+
export type FoodMenuGroupMode = (typeof FOOD_MENU_GROUP_MODES)[number]['value']
|
|
12
|
+
export type FoodMenuGroupLayout = (typeof FOOD_MENU_GROUP_LAYOUTS)[number]['value']
|
|
13
|
+
export type FoodMenuGroupEmptyBehaviour = (typeof FOOD_MENU_GROUP_EMPTY_BEHAVIOURS)[number]['value']
|
|
14
|
+
export type FoodMenuGroupReservationMode = (typeof FOOD_MENU_GROUP_RESERVATION_MODES)[number]['value']
|
|
15
|
+
export type FoodMenuGroupTextAlign = (typeof FOOD_MENU_GROUP_TEXT_ALIGNS)[number]['value']
|
|
7
16
|
|
|
8
17
|
export interface FoodMenuGroupAttributes extends Record<string, unknown> {
|
|
9
18
|
mode: FoodMenuGroupMode
|
|
@@ -11,11 +20,15 @@ export interface FoodMenuGroupAttributes extends Record<string, unknown> {
|
|
|
11
20
|
menuIds: number[]
|
|
12
21
|
showPrices: boolean
|
|
13
22
|
showAllergens: boolean
|
|
14
|
-
|
|
23
|
+
reservationMode: FoodMenuGroupReservationMode
|
|
15
24
|
emptyBehaviour: FoodMenuGroupEmptyBehaviour
|
|
16
25
|
emptyText: string
|
|
26
|
+
style: SurfaceStyle<string>
|
|
27
|
+
textAlign: FoodMenuGroupTextAlign
|
|
17
28
|
}
|
|
18
29
|
|
|
19
30
|
export interface FoodMenuGroupOptions extends BriloBlockType {
|
|
20
31
|
renderMenusControl?: (props: SelectControlProps) => JSX.Element
|
|
32
|
+
/** Overrides the shared shadow presets — see `DEFAULT_SURFACE_SHADOWS`. */
|
|
33
|
+
shadows?: readonly SurfaceShadowOption[]
|
|
21
34
|
}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import apiFetch from '@wordpress/api-fetch'
|
|
2
|
+
import {InspectorControls, useBlockProps} from '@wordpress/block-editor'
|
|
3
|
+
import {Button, ExternalLink, Notice, PanelBody, Spinner, TextareaControl} from '@wordpress/components'
|
|
4
|
+
import {__, sprintf} from '@wordpress/i18n'
|
|
5
|
+
import clsx from 'clsx'
|
|
6
|
+
import type React from 'react'
|
|
7
|
+
import {useEffect, useState} from 'react'
|
|
8
|
+
import {icon as reservationIcon} from './icon'
|
|
9
|
+
import type {FoodReservationAttributes, FoodReservationOptions} from './types'
|
|
10
|
+
|
|
11
|
+
type PreviewDay = {
|
|
12
|
+
menuId: number
|
|
13
|
+
date: string
|
|
14
|
+
label: string
|
|
15
|
+
deadline: string
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
type PreviewResponse = {
|
|
19
|
+
enabled: boolean
|
|
20
|
+
settingsUrl: string
|
|
21
|
+
anchor: string
|
|
22
|
+
days: PreviewDay[]
|
|
23
|
+
emptyMessage: string
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// Shares the menu block's preview card styles (food-menu-group/editor.scss).
|
|
27
|
+
const BASE = 'brilo-food-menu-preview'
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Which days the form would offer is decided on the server (deadlines,
|
|
31
|
+
* sold-out dishes, the site's time zone), so the preview asks the block's
|
|
32
|
+
* own endpoint. It describes the form instead of drawing it.
|
|
33
|
+
*/
|
|
34
|
+
function useReservationPreview() {
|
|
35
|
+
const [data, setData] = useState<PreviewResponse | null>(null)
|
|
36
|
+
const [hasError, setHasError] = useState(false)
|
|
37
|
+
const [attempt, setAttempt] = useState(0)
|
|
38
|
+
|
|
39
|
+
// biome-ignore lint/correctness/useExhaustiveDependencies: attempt re-runs the effect on retry
|
|
40
|
+
useEffect(() => {
|
|
41
|
+
let cancelled = false
|
|
42
|
+
setHasError(false)
|
|
43
|
+
|
|
44
|
+
apiFetch<PreviewResponse>({path: '/brilo/v1/food-reservation/preview'})
|
|
45
|
+
.then((result) => {
|
|
46
|
+
if (!cancelled) {
|
|
47
|
+
setData(result)
|
|
48
|
+
}
|
|
49
|
+
})
|
|
50
|
+
.catch(() => {
|
|
51
|
+
if (!cancelled) {
|
|
52
|
+
setHasError(true)
|
|
53
|
+
}
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
return () => {
|
|
57
|
+
cancelled = true
|
|
58
|
+
}
|
|
59
|
+
}, [attempt])
|
|
60
|
+
|
|
61
|
+
return {data, hasError, retry: () => setAttempt((value) => value + 1)}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function DisabledNotice({settingsUrl}: {settingsUrl: string}) {
|
|
65
|
+
return (
|
|
66
|
+
<Notice status="warning" isDismissible={false}>
|
|
67
|
+
{__('Rezervace obědů jsou v nastavení modulu vypnuté, blok se na webu nezobrazí.', 'brilo-blocks')}{' '}
|
|
68
|
+
{settingsUrl && <ExternalLink href={settingsUrl}>{__('Nastavení jídelního lístku', 'brilo-blocks')}</ExternalLink>}
|
|
69
|
+
</Notice>
|
|
70
|
+
)
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function PreviewCard({data, emptyText}: {data: PreviewResponse; emptyText: string}) {
|
|
74
|
+
const [first] = data.days
|
|
75
|
+
|
|
76
|
+
return (
|
|
77
|
+
<div className={`${BASE}__card`}>
|
|
78
|
+
<div className={`${BASE}__head`}>
|
|
79
|
+
<div className={`${BASE}__title`}>
|
|
80
|
+
{reservationIcon}
|
|
81
|
+
<span>{__('Rezervace obědu', 'brilo-blocks')}</span>
|
|
82
|
+
</div>
|
|
83
|
+
|
|
84
|
+
<div className={`${BASE}__meta`}>
|
|
85
|
+
<span className={clsx(`${BASE}__pill`, `${BASE}__pill--muted`)}>{`#${data.anchor}`}</span>
|
|
86
|
+
{first && <span className={clsx(`${BASE}__pill`, `${BASE}__pill--ok`)}>{__('Rezervace otevřené', 'brilo-blocks')}</span>}
|
|
87
|
+
</div>
|
|
88
|
+
</div>
|
|
89
|
+
|
|
90
|
+
<div className={`${BASE}__body`}>
|
|
91
|
+
{first ? (
|
|
92
|
+
<div className={`${BASE}__section`}>
|
|
93
|
+
<div className={`${BASE}__section-title`}>{__('Formulář nabídne dny', 'brilo-blocks')}</div>
|
|
94
|
+
|
|
95
|
+
{data.days.map((day, index) => (
|
|
96
|
+
<div className={clsx(`${BASE}__row`, `${BASE}__row--no-price`)} key={day.menuId}>
|
|
97
|
+
<span className={`${BASE}__unit`}>{0 === index ? __('výchozí', 'brilo-blocks') : ''}</span>
|
|
98
|
+
<span className={`${BASE}__name`}>
|
|
99
|
+
{day.label}
|
|
100
|
+
{day.deadline && <small className={`${BASE}__note`}>{sprintf(__('Uzávěrka: %s', 'brilo-blocks'), day.deadline)}</small>}
|
|
101
|
+
</span>
|
|
102
|
+
</div>
|
|
103
|
+
))}
|
|
104
|
+
</div>
|
|
105
|
+
) : (
|
|
106
|
+
<div className={`${BASE}__empty`}>
|
|
107
|
+
<div>
|
|
108
|
+
<b>{__('Teď není na který den rezervovat', 'brilo-blocks')}</b>
|
|
109
|
+
{sprintf(__('Na webu se ukáže věta „%s“', 'brilo-blocks'), emptyText.trim() || data.emptyMessage)}
|
|
110
|
+
</div>
|
|
111
|
+
</div>
|
|
112
|
+
)}
|
|
113
|
+
|
|
114
|
+
<div className={`${BASE}__foot`}>
|
|
115
|
+
<span>{sprintf(__('Odkaz se stránkou?menu=ID#%s předvybere den daného lístku.', 'brilo-blocks'), data.anchor)}</span>
|
|
116
|
+
</div>
|
|
117
|
+
</div>
|
|
118
|
+
</div>
|
|
119
|
+
)
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export function createFoodReservationEdit(options: FoodReservationOptions) {
|
|
123
|
+
return function Edit({
|
|
124
|
+
attributes,
|
|
125
|
+
setAttributes,
|
|
126
|
+
}: {
|
|
127
|
+
attributes: FoodReservationAttributes
|
|
128
|
+
setAttributes: (a: Partial<FoodReservationAttributes>) => void
|
|
129
|
+
}) {
|
|
130
|
+
const {emptyText} = attributes
|
|
131
|
+
const blockProps = useBlockProps({className: clsx(options.blockClassName ?? 'g-food-reservation')})
|
|
132
|
+
const {data, hasError, retry} = useReservationPreview()
|
|
133
|
+
|
|
134
|
+
let content: React.ReactNode
|
|
135
|
+
|
|
136
|
+
if (hasError) {
|
|
137
|
+
content = (
|
|
138
|
+
<div className={`${BASE}__empty`}>
|
|
139
|
+
<div>
|
|
140
|
+
<b>{__('Náhled se nepodařilo načíst.', 'brilo-blocks')}</b>
|
|
141
|
+
<Button variant="secondary" size="small" className={`${BASE}__retry`} onClick={retry}>
|
|
142
|
+
{__('Zkusit znovu', 'brilo-blocks')}
|
|
143
|
+
</Button>
|
|
144
|
+
</div>
|
|
145
|
+
</div>
|
|
146
|
+
)
|
|
147
|
+
} else if (!data) {
|
|
148
|
+
content = <Spinner />
|
|
149
|
+
} else if (!data.enabled) {
|
|
150
|
+
content = <DisabledNotice settingsUrl={data.settingsUrl} />
|
|
151
|
+
} else {
|
|
152
|
+
content = <PreviewCard data={data} emptyText={emptyText} />
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
return (
|
|
156
|
+
<>
|
|
157
|
+
<InspectorControls>
|
|
158
|
+
<PanelBody title={__('Když není co rezervovat', 'brilo-blocks')}>
|
|
159
|
+
<TextareaControl
|
|
160
|
+
__nextHasNoMarginBottom
|
|
161
|
+
label={__('Vlastní text zprávy', 'brilo-blocks')}
|
|
162
|
+
help={__('Když zůstane prázdné, použije se výchozí věta.', 'brilo-blocks')}
|
|
163
|
+
rows={2}
|
|
164
|
+
value={emptyText}
|
|
165
|
+
onChange={(value) => setAttributes({emptyText: value})}
|
|
166
|
+
/>
|
|
167
|
+
</PanelBody>
|
|
168
|
+
</InspectorControls>
|
|
169
|
+
|
|
170
|
+
<div {...blockProps}>
|
|
171
|
+
{/* Left-aligned headings: the menu block's centre default is about the menu, not this list. */}
|
|
172
|
+
<div className={BASE} style={{'--food-menu-preview-align': 'left'} as React.CSSProperties}>
|
|
173
|
+
{content}
|
|
174
|
+
</div>
|
|
175
|
+
</div>
|
|
176
|
+
</>
|
|
177
|
+
)
|
|
178
|
+
}
|
|
179
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type {BlockConfiguration} from '@wordpress/blocks'
|
|
2
|
+
import {__} from '@wordpress/i18n'
|
|
3
|
+
import {createFoodReservationEdit} from './edit'
|
|
4
|
+
import {icon as defaultIcon} from './icon'
|
|
5
|
+
import type {FoodReservationAttributes, FoodReservationOptions} from './types'
|
|
6
|
+
|
|
7
|
+
export function createFoodReservationBlock(options: FoodReservationOptions): BlockConfiguration<FoodReservationAttributes> {
|
|
8
|
+
return {
|
|
9
|
+
name: options.name,
|
|
10
|
+
title: options.title ?? __('Rezervace obědu', 'brilo-blocks'),
|
|
11
|
+
description:
|
|
12
|
+
options.description ??
|
|
13
|
+
__('Rezervační formulář přímo na stránce. Tlačítka „Rezervovat oběd“ na něj vedou přes kotvu #rezervace.', 'brilo-blocks'),
|
|
14
|
+
category: options.category ?? 'widgets',
|
|
15
|
+
...(options.parent && {parent: options.parent}),
|
|
16
|
+
icon: options.icon ?? {src: defaultIcon},
|
|
17
|
+
// The anchor is fixed (`rezervace`), so the block takes no own HTML anchor.
|
|
18
|
+
supports: {html: false, customClassName: false, multiple: false},
|
|
19
|
+
attributes: {
|
|
20
|
+
emptyText: {
|
|
21
|
+
type: 'string',
|
|
22
|
+
default: '',
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
edit: createFoodReservationEdit(options),
|
|
26
|
+
save: () => null,
|
|
27
|
+
} as unknown as BlockConfiguration<FoodReservationAttributes>
|
|
28
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export const icon = (
|
|
2
|
+
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Rezervace obědu">
|
|
3
|
+
<rect x="3" y="4" width="14" height="13" stroke="currentColor" fill="none" />
|
|
4
|
+
<line x1="3" y1="8" x2="17" y2="8" stroke="currentColor" />
|
|
5
|
+
<line x1="7" y1="2" x2="7" y2="6" stroke="currentColor" />
|
|
6
|
+
<line x1="13" y1="2" x2="13" y2="6" stroke="currentColor" />
|
|
7
|
+
<polyline points="7,12.5 9,14.5 13,10.5" stroke="currentColor" fill="none" />
|
|
8
|
+
</svg>
|
|
9
|
+
)
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type {FoodReservationAttributes, FoodReservationOptions} from './types'
|
|
2
|
+
export {createFoodReservationBlock} from './factory'
|
|
3
|
+
|
|
4
|
+
import type {FoodReservationOptions} from './types'
|
|
5
|
+
|
|
6
|
+
export const foodReservationDefaults: FoodReservationOptions = {
|
|
7
|
+
name: 'brilo/food-reservation',
|
|
8
|
+
// A section of its own, or a column next to the day's menu.
|
|
9
|
+
parent: ['brilo/base-section', 'brilo/column-item'],
|
|
10
|
+
}
|
|
@@ -1,10 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
type FIELD_SELECT_MODE_VALUES,
|
|
3
|
-
FIELD_TEXT_TYPES,
|
|
4
|
-
type FIELD_TEXT_TYPE_VALUES,
|
|
5
|
-
type FIELD_TYPE_VALUES,
|
|
6
|
-
type FILE_BUTTON_VARIANT_VALUES,
|
|
7
|
-
} from './constants'
|
|
1
|
+
import type {FIELD_SELECT_MODE_VALUES, FIELD_TEXT_TYPE_VALUES, FIELD_TYPE_VALUES, FILE_BUTTON_VARIANT_VALUES} from './constants'
|
|
8
2
|
import type {BriloBlockType} from '~/types'
|
|
9
3
|
|
|
10
4
|
export type FormFieldType = (typeof FIELD_TYPE_VALUES)[number]
|
|
@@ -12,7 +12,7 @@ import type {FormGroupOptions} from './types'
|
|
|
12
12
|
|
|
13
13
|
export const formGroupDefaults: FormGroupOptions = {
|
|
14
14
|
name: 'brilo/form-group',
|
|
15
|
-
parent: ['brilo/base-section'],
|
|
15
|
+
parent: ['brilo/base-section', 'brilo/column-item', 'brilo/responsive-grid-item'],
|
|
16
16
|
allowedBlocks: ['brilo/form-field'],
|
|
17
17
|
template: [['brilo/form-field', {type: 'text'}]],
|
|
18
18
|
}
|
|
@@ -1,10 +1,3 @@
|
|
|
1
1
|
export const DEFAULT_COLUMNS = [2, 3, 4, 6] as const
|
|
2
2
|
|
|
3
|
-
export
|
|
4
|
-
{value: '4:3', label: '4:3'},
|
|
5
|
-
{value: '16:9', label: '16:9'},
|
|
6
|
-
{value: '3:2', label: '3:2'},
|
|
7
|
-
{value: '1:1', label: '1:1'},
|
|
8
|
-
{value: '2:1', label: '2:1'},
|
|
9
|
-
{value: '3:4', label: '3:4'},
|
|
10
|
-
] as const
|
|
3
|
+
export {GALLERY_RATIOS as DEFAULT_RATIOS} from '~/constants'
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {InspectorControls
|
|
1
|
+
import {InspectorControls} from '@wordpress/block-editor'
|
|
2
2
|
import {
|
|
3
3
|
PanelBody,
|
|
4
4
|
TextControl,
|
|
@@ -6,19 +6,13 @@ import {
|
|
|
6
6
|
__experimentalToggleGroupControlOption as ToggleGroupControlOption,
|
|
7
7
|
} from '@wordpress/components'
|
|
8
8
|
import {__} from '@wordpress/i18n'
|
|
9
|
-
import {useDispatch} from '@wordpress/data'
|
|
10
|
-
import {createBlock} from '@wordpress/blocks'
|
|
11
9
|
import clsx from 'clsx'
|
|
10
|
+
import {GalleryImagesAppender} from '~/components/GalleryImagesAppender'
|
|
12
11
|
import {ItemSpacingPanel, itemSpacingStyle} from '~/components/ItemSpacingControl'
|
|
13
12
|
import {useGroupBlock} from '~/hooks/useGroupBlock'
|
|
14
13
|
import {DEFAULT_COLUMNS, DEFAULT_RATIOS} from './constants'
|
|
15
14
|
import type {GalleryGroupAttributes, GalleryGroupOptions, GalleryRatio} from './types'
|
|
16
15
|
|
|
17
|
-
type Media = {
|
|
18
|
-
id: number
|
|
19
|
-
url: string
|
|
20
|
-
}
|
|
21
|
-
|
|
22
16
|
export function createGalleryGroupEdit(options: GalleryGroupOptions) {
|
|
23
17
|
const COLUMNS = options.columns ?? DEFAULT_COLUMNS
|
|
24
18
|
const RATIOS = options.ratios ?? DEFAULT_RATIOS
|
|
@@ -33,36 +27,6 @@ export function createGalleryGroupEdit(options: GalleryGroupOptions) {
|
|
|
33
27
|
clientId: string
|
|
34
28
|
}) {
|
|
35
29
|
const {columns, ratio, galleryId, spacing} = attributes
|
|
36
|
-
const {insertBlock} = useDispatch('core/block-editor')
|
|
37
|
-
|
|
38
|
-
const addNewBlock = (imageId: number) => {
|
|
39
|
-
const newBlock = createBlock(options.allowedBlocks[0], {
|
|
40
|
-
img: {
|
|
41
|
-
id: imageId,
|
|
42
|
-
},
|
|
43
|
-
})
|
|
44
|
-
|
|
45
|
-
insertBlock(newBlock, undefined, clientId)
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
const onSelectImages = (media: Media[]) => {
|
|
49
|
-
media.forEach((item) => addNewBlock(item.id))
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
const CustomAppender = () => {
|
|
53
|
-
return (
|
|
54
|
-
<MediaUpload
|
|
55
|
-
onSelect={onSelectImages}
|
|
56
|
-
multiple="add"
|
|
57
|
-
allowedTypes={['image']}
|
|
58
|
-
render={({open}) => (
|
|
59
|
-
<div onClick={open} className="g-gallery__appender">
|
|
60
|
-
{__('Přidat obrázky', 'brilo-blocks')}
|
|
61
|
-
</div>
|
|
62
|
-
)}
|
|
63
|
-
/>
|
|
64
|
-
)
|
|
65
|
-
}
|
|
66
30
|
|
|
67
31
|
const {blockProps, innerBlocksProps} = useGroupBlock({
|
|
68
32
|
blockClassName: clsx(options.blockClassName ?? 'g-gallery wp-block-section'),
|
|
@@ -73,7 +37,7 @@ export function createGalleryGroupEdit(options: GalleryGroupOptions) {
|
|
|
73
37
|
...itemSpacingStyle(spacing),
|
|
74
38
|
},
|
|
75
39
|
allowedBlocks: options.allowedBlocks,
|
|
76
|
-
renderAppender:
|
|
40
|
+
renderAppender: () => <GalleryImagesAppender clientId={clientId} itemBlock={options.allowedBlocks[0]} />,
|
|
77
41
|
template: options.template,
|
|
78
42
|
layout: {type: 'default'},
|
|
79
43
|
})
|
|
@@ -1,15 +1,3 @@
|
|
|
1
|
-
.g-gallery__appender {
|
|
2
|
-
padding: 16px;
|
|
3
|
-
display: flex;
|
|
4
|
-
align-items: center;
|
|
5
|
-
justify-content: center;
|
|
6
|
-
border: 2px dashed lightblue;
|
|
7
|
-
height: 100%;
|
|
8
|
-
cursor: pointer;
|
|
9
|
-
box-sizing: border-box;
|
|
10
|
-
min-height: 256px;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
1
|
.g-gallery {
|
|
14
2
|
.block-list-appender {
|
|
15
3
|
width: 100%;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import {__} from '@wordpress/i18n'
|
|
2
|
+
|
|
3
|
+
export const HEIGHTS = [
|
|
4
|
+
{value: 'sm', label: __('Malá', 'brilo-blocks')},
|
|
5
|
+
{value: 'md', label: __('Střední', 'brilo-blocks')},
|
|
6
|
+
{value: 'lg', label: __('Velká', 'brilo-blocks')},
|
|
7
|
+
] as const
|
|
8
|
+
|
|
9
|
+
export const SPEEDS = [
|
|
10
|
+
{value: 'slow', label: __('Pomalu', 'brilo-blocks')},
|
|
11
|
+
{value: 'medium', label: __('Středně', 'brilo-blocks')},
|
|
12
|
+
{value: 'fast', label: __('Rychle', 'brilo-blocks')},
|
|
13
|
+
] as const
|
|
14
|
+
|
|
15
|
+
export const DIRECTIONS = [
|
|
16
|
+
{value: 'left', label: __('Doleva', 'brilo-blocks')},
|
|
17
|
+
{value: 'right', label: __('Doprava', 'brilo-blocks')},
|
|
18
|
+
] as const
|
|
19
|
+
|
|
20
|
+
export {GALLERY_RATIOS as DEFAULT_RATIOS} from '~/constants'
|
|
21
|
+
|
|
22
|
+
export const HEIGHT_PIXELS = {sm: 160, md: 240, lg: 320} as const
|