@mirrormedia/lilith-draft-editor 3.0.12 → 3.0.14

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.
Files changed (26) hide show
  1. package/lib/index.js +8 -0
  2. package/lib/website/mirrortv/block-renderer/background-image-block.js +93 -0
  3. package/lib/website/mirrortv/block-renderer/background-video-block.js +93 -0
  4. package/lib/website/mirrortv/block-renderer/color-box-block.js +86 -0
  5. package/lib/website/mirrortv/block-renderer/embedded-code-block.js +88 -0
  6. package/lib/website/mirrortv/block-renderer/image-block.js +108 -0
  7. package/lib/website/mirrortv/block-renderer/info-box-block.js +86 -0
  8. package/lib/website/mirrortv/block-renderer/side-index-block.js +90 -0
  9. package/lib/website/mirrortv/block-renderer/slideshow-block.js +150 -0
  10. package/lib/website/mirrortv/block-renderer/table-block.js +408 -0
  11. package/lib/website/mirrortv/block-renderer-fn.js +151 -0
  12. package/lib/website/mirrortv/draft-editor.js +1027 -0
  13. package/lib/website/mirrortv/entity-decorator.js +27 -0
  14. package/lib/website/mirrortv/index.js +16 -0
  15. package/lib/website/mirrortv/selector/align-selector.js +71 -0
  16. package/lib/website/mirrortv/selector/audio-selector.js +279 -0
  17. package/lib/website/mirrortv/selector/image-selector.js +463 -0
  18. package/lib/website/mirrortv/selector/image-uploader.js +260 -0
  19. package/lib/website/mirrortv/selector/pagination.js +82 -0
  20. package/lib/website/mirrortv/selector/post-selector.js +321 -0
  21. package/lib/website/mirrortv/selector/search-box.js +46 -0
  22. package/lib/website/mirrortv/selector/video-selector.js +432 -0
  23. package/lib/website/mirrortv/shared-style/index.js +17 -0
  24. package/lib/website/mirrortv/theme/index.js +28 -0
  25. package/lib/website/mirrortv/utils/file-convert.js +67 -0
  26. package/package.json +3 -3
@@ -0,0 +1,463 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.ImageSelector = ImageSelector;
7
+
8
+ var _react = _interopRequireWildcard(require("react"));
9
+
10
+ var _debounce = _interopRequireDefault(require("lodash/debounce"));
11
+
12
+ var _styledComponents = _interopRequireWildcard(require("styled-components"));
13
+
14
+ var _fields = require("@keystone-ui/fields");
15
+
16
+ var _modals = require("@keystone-ui/modals");
17
+
18
+ var _apollo = require("@keystone-6/core/admin-ui/apollo");
19
+
20
+ var _alignSelector = require("./align-selector");
21
+
22
+ var _searchBox = require("./search-box");
23
+
24
+ var _pagination = require("./pagination");
25
+
26
+ var _button = require("@keystone-ui/button");
27
+
28
+ var _imageUploader = require("./image-uploader");
29
+
30
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
31
+
32
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
33
+
34
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
35
+
36
+ const imagesQuery = (0, _apollo.gql)`
37
+ query Images($searchText: String!, $take: Int, $skip: Int) {
38
+ imagesCount(where: { name: { contains: $searchText } })
39
+ images(
40
+ where: { name: { contains: $searchText } }
41
+ orderBy: { id: desc }
42
+ take: $take
43
+ skip: $skip
44
+ ) {
45
+ id
46
+ name
47
+ file {
48
+ url
49
+ width
50
+ height
51
+ }
52
+ resized {
53
+ original
54
+ w480
55
+ w800
56
+ w1200
57
+ w1600
58
+ w2400
59
+ }
60
+ resizedWebp {
61
+ original
62
+ w480
63
+ w800
64
+ w1200
65
+ w1600
66
+ w2400
67
+ }
68
+ }
69
+ }
70
+ `;
71
+ const _ = {
72
+ debounce: _debounce.default
73
+ };
74
+ const GlobalStyle = (0, _styledComponents.createGlobalStyle)`
75
+ form {
76
+ @media (max-width: 575px) {
77
+ width: 100vw !important;
78
+ }
79
+ }
80
+ `;
81
+ const ImageSearchBox = (0, _styledComponents.default)(_searchBox.SearchBox)`
82
+ margin-top: 10px;
83
+ `;
84
+ const CustomButton = (0, _styledComponents.default)(_button.Button)`
85
+ margin-top: 10px;
86
+ `;
87
+ const ImageSelectionWrapper = _styledComponents.default.div`
88
+ overflow: auto;
89
+ margin-top: 10px;
90
+ `;
91
+ const ImageBlockMetaWrapper = _styledComponents.default.div``;
92
+ const ImageGridsWrapper = _styledComponents.default.div`
93
+ display: flex;
94
+ flex-wrap: wrap;
95
+ overflow: auto;
96
+ margin-top: 5px;
97
+ `;
98
+ const ImageGridWrapper = _styledComponents.default.div`
99
+ width: 33.3333%;
100
+ cursor: pointer;
101
+ padding: 0 10px 10px;
102
+ `;
103
+ const ImageMetaGridsWrapper = _styledComponents.default.div`
104
+ display: flex;
105
+ flex-wrap: wrap;
106
+ overflow: auto;
107
+ `;
108
+ const ImageMetaGridWrapper = _styledComponents.default.div`
109
+ width: 100%;
110
+ cursor: pointer;
111
+ padding: 0 10px 10px;
112
+ `;
113
+ const Image = _styledComponents.default.img`
114
+ display: block;
115
+ width: 100%;
116
+ aspect-ratio: 2;
117
+ object-fit: cover;
118
+ `;
119
+ const Label = _styledComponents.default.label`
120
+ display: block;
121
+ margin: 10px 0;
122
+ font-weight: 600;
123
+ `;
124
+ const StyledTextInput = (0, _styledComponents.default)(_fields.TextInput)`
125
+ width: 100%;
126
+ `;
127
+ const SeparationLine = _styledComponents.default.div`
128
+ border: #e1e5e9 1px solid;
129
+ margin-top: 10px;
130
+ margin-bottom: 10px;
131
+ `;
132
+ const ImageSelected = _styledComponents.default.div`
133
+ height: 1.4rem;
134
+ `;
135
+ const ErrorWrapper = _styledComponents.default.div`
136
+ & * {
137
+ margin: 0;
138
+ }
139
+ `;
140
+ const ImageName = _styledComponents.default.p`
141
+ text-align: center;
142
+ `;
143
+
144
+ function ImageGrids(props) {
145
+ const {
146
+ images,
147
+ selected,
148
+ onSelect
149
+ } = props;
150
+ return /*#__PURE__*/_react.default.createElement(ImageGridsWrapper, null, images.map(image => {
151
+ return /*#__PURE__*/_react.default.createElement(ImageGrid, {
152
+ key: image.id,
153
+ isSelected: !!(selected !== null && selected !== void 0 && selected.find(selectedImage => selectedImage.id === image.id)),
154
+ onSelect: () => onSelect(image),
155
+ image: image
156
+ });
157
+ }));
158
+ }
159
+
160
+ function ImageGrid(props) {
161
+ var _image$resized, _image$file;
162
+
163
+ const {
164
+ image,
165
+ onSelect,
166
+ isSelected
167
+ } = props;
168
+ const initialSrc = (image === null || image === void 0 ? void 0 : (_image$resized = image.resized) === null || _image$resized === void 0 ? void 0 : _image$resized.w800) || (image === null || image === void 0 ? void 0 : (_image$file = image.file) === null || _image$file === void 0 ? void 0 : _image$file.url);
169
+ return /*#__PURE__*/_react.default.createElement(ImageGridWrapper, {
170
+ key: image === null || image === void 0 ? void 0 : image.id,
171
+ onClick: () => onSelect(image)
172
+ }, /*#__PURE__*/_react.default.createElement(ImageSelected, null, isSelected ? /*#__PURE__*/_react.default.createElement("i", {
173
+ className: "fas fa-check-circle",
174
+ style: {
175
+ color: '#007bff'
176
+ }
177
+ }) : null), /*#__PURE__*/_react.default.createElement(Image, {
178
+ src: initialSrc,
179
+ onError: e => {
180
+ var _image$file2;
181
+
182
+ if (image !== null && image !== void 0 && (_image$file2 = image.file) !== null && _image$file2 !== void 0 && _image$file2.url && e.currentTarget.src !== image.file.url) {
183
+ e.currentTarget.src = image.file.url;
184
+ }
185
+ }
186
+ }));
187
+ }
188
+
189
+ function ImageMetaGrids(props) {
190
+ const {
191
+ imageMetas,
192
+ onChange,
193
+ enableCaption,
194
+ enableUrl
195
+ } = props;
196
+ return /*#__PURE__*/_react.default.createElement(ImageMetaGridsWrapper, null, imageMetas.map(imageMeta => {
197
+ var _imageMeta$image;
198
+
199
+ return /*#__PURE__*/_react.default.createElement(ImageMetaGrid, {
200
+ key: imageMeta === null || imageMeta === void 0 ? void 0 : (_imageMeta$image = imageMeta.image) === null || _imageMeta$image === void 0 ? void 0 : _imageMeta$image.id,
201
+ imageMeta: imageMeta,
202
+ enableCaption: enableCaption,
203
+ enableUrl: enableUrl,
204
+ onChange: onChange
205
+ });
206
+ }));
207
+ }
208
+
209
+ function ImageMetaGrid(props) {
210
+ var _image$resized2, _image$file3;
211
+
212
+ const {
213
+ imageMeta,
214
+ enableCaption,
215
+ enableUrl,
216
+ onChange
217
+ } = props;
218
+ const {
219
+ image,
220
+ desc,
221
+ url
222
+ } = imageMeta;
223
+ const src = (image === null || image === void 0 ? void 0 : (_image$resized2 = image.resized) === null || _image$resized2 === void 0 ? void 0 : _image$resized2.w800) || (image === null || image === void 0 ? void 0 : (_image$file3 = image.file) === null || _image$file3 === void 0 ? void 0 : _image$file3.url);
224
+ return /*#__PURE__*/_react.default.createElement(ImageMetaGridWrapper, null, /*#__PURE__*/_react.default.createElement(Image, {
225
+ src: src,
226
+ onError: e => {
227
+ var _image$file4;
228
+
229
+ if (image !== null && image !== void 0 && (_image$file4 = image.file) !== null && _image$file4 !== void 0 && _image$file4.url && e.currentTarget.src !== image.file.url) {
230
+ e.currentTarget.src = image.file.url;
231
+ }
232
+ }
233
+ }), /*#__PURE__*/_react.default.createElement(ImageName, {
234
+ style: {
235
+ textAlign: 'left'
236
+ }
237
+ }, image === null || image === void 0 ? void 0 : image.name), enableCaption && /*#__PURE__*/_react.default.createElement(_react.Fragment, null, /*#__PURE__*/_react.default.createElement(Label, {
238
+ htmlFor: "caption"
239
+ }, "Image Caption:"), /*#__PURE__*/_react.default.createElement(_fields.TextInput, {
240
+ id: "caption",
241
+ type: "text",
242
+ placeholder: image === null || image === void 0 ? void 0 : image.name,
243
+ defaultValue: desc,
244
+ onChange: _.debounce(e => {
245
+ onChange({
246
+ image,
247
+ desc: e.target.value,
248
+ url
249
+ });
250
+ }, 300)
251
+ })), enableUrl && /*#__PURE__*/_react.default.createElement(_react.Fragment, null, /*#__PURE__*/_react.default.createElement(Label, {
252
+ htmlFor: "url"
253
+ }, "Url:"), /*#__PURE__*/_react.default.createElement(_fields.TextInput, {
254
+ id: "url",
255
+ type: "text",
256
+ placeholder: "(Optional)",
257
+ defaultValue: url,
258
+ onChange: _.debounce(e => {
259
+ onChange({
260
+ image,
261
+ desc,
262
+ url: e.target.value
263
+ });
264
+ }, 300)
265
+ })));
266
+ }
267
+
268
+ function DelayInput(props) {
269
+ const {
270
+ delay,
271
+ onChange
272
+ } = props;
273
+ return /*#__PURE__*/_react.default.createElement(_react.Fragment, null, /*#__PURE__*/_react.default.createElement(Label, null, "Slideshow delay:"), /*#__PURE__*/_react.default.createElement(_fields.TextInput, {
274
+ type: "number",
275
+ placeholder: "\u8ACB\u8F38\u5165\u81EA\u52D5\u5207\u63DB\u79D2\u6578",
276
+ step: "0.5",
277
+ min: "1",
278
+ value: delay,
279
+ onChange: e => {
280
+ onChange(e.target.value);
281
+ }
282
+ }));
283
+ }
284
+
285
+ function ImageSelector(props) {
286
+ const {
287
+ enableMultiSelect = false,
288
+ enableCaption = false,
289
+ enableUrl = false,
290
+ enableAlignment = false,
291
+ enableDelay = false,
292
+ onChange,
293
+ initialSelected = [],
294
+ initialAlign,
295
+ initialDelay
296
+ } = props;
297
+ const [queryImages, {
298
+ loading,
299
+ error,
300
+ data: {
301
+ images = [],
302
+ imagesCount = 0
303
+ } = {}
304
+ }] = (0, _apollo.useLazyQuery)(imagesQuery, {
305
+ fetchPolicy: 'no-cache'
306
+ });
307
+ const [currentPage, setCurrentPage] = (0, _react.useState)(0);
308
+ const [searchText, setSearchText] = (0, _react.useState)('');
309
+ const [selected, setSelected] = (0, _react.useState)(initialSelected);
310
+ const [delay, setDelay] = (0, _react.useState)((initialDelay === null || initialDelay === void 0 ? void 0 : initialDelay.toString()) ?? '5');
311
+ const [align, setAlign] = (0, _react.useState)(initialAlign);
312
+ const [showImageUploader, setShowImageUploader] = (0, _react.useState)(false);
313
+ const contentWrapperRef = (0, _react.useRef)(null);
314
+ const pageSize = 18; // Data Fetching Logic
315
+
316
+ (0, _react.useEffect)(() => {
317
+ if (currentPage !== 0) {
318
+ queryImages({
319
+ variables: {
320
+ searchText,
321
+ skip: (currentPage - 1) * pageSize,
322
+ take: pageSize
323
+ }
324
+ });
325
+ }
326
+ }, [currentPage, searchText, queryImages]); // Selection Handler
327
+
328
+ const onImagesGridSelect = imageEntity => {
329
+ setSelected(prev => {
330
+ const isSelected = prev.find(ele => {
331
+ var _ele$image;
332
+
333
+ return ((_ele$image = ele.image) === null || _ele$image === void 0 ? void 0 : _ele$image.id) === imageEntity.id;
334
+ });
335
+
336
+ if (isSelected) {
337
+ return prev.filter(ele => {
338
+ var _ele$image2;
339
+
340
+ return ((_ele$image2 = ele.image) === null || _ele$image2 === void 0 ? void 0 : _ele$image2.id) !== imageEntity.id;
341
+ });
342
+ }
343
+
344
+ const newItem = {
345
+ image: imageEntity,
346
+ desc: '',
347
+ url: ''
348
+ };
349
+
350
+ if (enableMultiSelect) {
351
+ return [...prev, newItem];
352
+ }
353
+
354
+ return [newItem];
355
+ });
356
+ }; // 3. Metadata Handler
357
+
358
+
359
+ const onImageMetaChange = updatedItem => {
360
+ setSelected(prev => prev.map(item => item.image.id === updatedItem.image.id ? updatedItem : item));
361
+ };
362
+
363
+ const onSave = () => {
364
+ const adjustedDelay = Math.max(1, parseFloat(delay) || 1);
365
+ onChange(selected, align, adjustedDelay);
366
+ };
367
+
368
+ const onCancel = () => {
369
+ onChange([]);
370
+ };
371
+
372
+ const onSearchBoxChange = searchInput => {
373
+ setSearchText(searchInput);
374
+ setCurrentPage(1);
375
+ };
376
+
377
+ const onImageUploaderChange = uploadedImages => {
378
+ const newItems = uploadedImages.map(img => ({
379
+ image: img,
380
+ desc: '',
381
+ url: ''
382
+ }));
383
+ setSelected(prev => [...prev, ...newItems]);
384
+ setShowImageUploader(false);
385
+ };
386
+
387
+ let searchResult = /*#__PURE__*/_react.default.createElement(_react.Fragment, null, /*#__PURE__*/_react.default.createElement(ImageGrids, {
388
+ images: images,
389
+ selected: selected.map(s => s.image),
390
+ onSelect: onImagesGridSelect
391
+ }), /*#__PURE__*/_react.default.createElement(_pagination.Pagination, {
392
+ currentPage: currentPage,
393
+ total: imagesCount,
394
+ pageSize: pageSize,
395
+ onChange: page => setCurrentPage(page)
396
+ }));
397
+
398
+ if (loading) searchResult = /*#__PURE__*/_react.default.createElement("p", null, "searching...");
399
+
400
+ if (error) {
401
+ searchResult = /*#__PURE__*/_react.default.createElement(ErrorWrapper, null, /*#__PURE__*/_react.default.createElement("h3", null, "Errors in query"), /*#__PURE__*/_react.default.createElement("div", null, error.message));
402
+ }
403
+
404
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(GlobalStyle, null), /*#__PURE__*/_react.default.createElement(_modals.DrawerController, {
405
+ isOpen: true
406
+ }, /*#__PURE__*/_react.default.createElement(_modals.Drawer, {
407
+ title: "Select images",
408
+ actions: {
409
+ cancel: {
410
+ label: 'Cancel',
411
+ action: onCancel
412
+ },
413
+ confirm: {
414
+ label: 'Confirm',
415
+ action: onSave
416
+ }
417
+ },
418
+ width: "narrow"
419
+ }, /*#__PURE__*/_react.default.createElement("div", {
420
+ ref: contentWrapperRef
421
+ }, /*#__PURE__*/_react.default.createElement(CustomButton, {
422
+ onClick: () => setShowImageUploader(true)
423
+ }, "\u4E0A\u50B3\u5716\u7247"), /*#__PURE__*/_react.default.createElement(ImageSearchBox, {
424
+ onChange: onSearchBoxChange
425
+ }), /*#__PURE__*/_react.default.createElement(ImageSelectionWrapper, null, /*#__PURE__*/_react.default.createElement("div", null, searchResult), !!selected.length && /*#__PURE__*/_react.default.createElement(SeparationLine, null), /*#__PURE__*/_react.default.createElement(ImageMetaGridsWrapper, null, selected.map(item => /*#__PURE__*/_react.default.createElement(ImageMetaGrid, {
426
+ key: item.image.id,
427
+ imageMeta: item,
428
+ enableCaption: enableCaption,
429
+ enableUrl: enableUrl,
430
+ onChange: onImageMetaChange
431
+ })))), /*#__PURE__*/_react.default.createElement("div", {
432
+ style: {
433
+ marginTop: '20px'
434
+ }
435
+ }, (enableDelay || enableAlignment) && /*#__PURE__*/_react.default.createElement(SeparationLine, null), enableDelay && /*#__PURE__*/_react.default.createElement(_react.Fragment, null, /*#__PURE__*/_react.default.createElement(Label, null, "Slideshow delay:"), /*#__PURE__*/_react.default.createElement(_fields.TextInput, {
436
+ type: "number",
437
+ step: "0.5",
438
+ min: "1",
439
+ value: delay,
440
+ onChange: e => setDelay(e.target.value)
441
+ })), enableAlignment && /*#__PURE__*/_react.default.createElement(_alignSelector.AlignSelector, {
442
+ align: align,
443
+ options: [{
444
+ value: undefined,
445
+ label: 'default'
446
+ }, {
447
+ value: 'left',
448
+ label: 'left'
449
+ }, {
450
+ value: 'right',
451
+ label: 'right'
452
+ }],
453
+ onChange: setAlign,
454
+ onOpen: () => {
455
+ var _contentWrapperRef$cu;
456
+
457
+ const wrapper = (_contentWrapperRef$cu = contentWrapperRef.current) === null || _contentWrapperRef$cu === void 0 ? void 0 : _contentWrapperRef$cu.parentElement;
458
+ if (wrapper) wrapper.scrollTop = wrapper.scrollHeight;
459
+ }
460
+ }))))), showImageUploader && /*#__PURE__*/_react.default.createElement(_imageUploader.ImageUploader, {
461
+ onChange: onImageUploaderChange
462
+ }));
463
+ }