@panneau/medias 3.0.140 → 3.0.143

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/lib/index.js CHANGED
@@ -8,8 +8,10 @@ var PropTypes = require('prop-types');
8
8
  var _objectSpread = require('@babel/runtime/helpers/objectSpread2');
9
9
  var _slicedToArray = require('@babel/runtime/helpers/slicedToArray');
10
10
  var classNames = require('classnames');
11
+ var reactIntl = require('react-intl');
11
12
  var core = require('@panneau/core');
12
13
  var hooks = require('@panneau/core/hooks');
14
+ var Button = require('@panneau/element-button');
13
15
  var Buttons = require('@panneau/element-buttons');
14
16
  var Grid = require('@panneau/element-grid');
15
17
  var Icon = require('@panneau/element-icon');
@@ -17,10 +19,13 @@ var MediaCard = require('@panneau/element-media-card');
17
19
  var Pagination = require('@panneau/element-pagination');
18
20
  var Table = require('@panneau/element-table');
19
21
  var Filters = require('@panneau/filter-filters');
20
- var reactIntl = require('react-intl');
21
- var data = require('@panneau/data');
22
- var Button = require('@panneau/element-button');
22
+ var _defineProperty = require('@babel/runtime/helpers/defineProperty');
23
23
  var contexts = require('@panneau/core/contexts');
24
+ var Form = require('@panneau/element-form');
25
+ var MediaPlayer = require('@panneau/element-media-player');
26
+ var MediaPreview = require('@panneau/element-media-preview');
27
+ var lodash = require('lodash');
28
+ var data = require('@panneau/data');
24
29
  var _toConsumableArray = require('@babel/runtime/helpers/toConsumableArray');
25
30
 
26
31
  /* eslint-disable react/jsx-props-no-spreading */
@@ -35,11 +40,11 @@ var apiPropTypes = PropTypes.shape({
35
40
  update: PropTypes.func.isRequired,
36
41
  "delete": PropTypes.func.isRequired
37
42
  });
38
- var propTypes$5 = {
43
+ var propTypes$8 = {
39
44
  api: apiPropTypes,
40
45
  children: PropTypes.node.isRequired
41
46
  };
42
- var defaultProps$5 = {
47
+ var defaultProps$8 = {
43
48
  api: null
44
49
  };
45
50
  function MediasApiProvider(_ref) {
@@ -53,10 +58,10 @@ function MediasApiProvider(_ref) {
53
58
  value: api
54
59
  }, children);
55
60
  }
56
- MediasApiProvider.propTypes = propTypes$5;
57
- MediasApiProvider.defaultProps = defaultProps$5;
61
+ MediasApiProvider.propTypes = propTypes$8;
62
+ MediasApiProvider.defaultProps = defaultProps$8;
58
63
 
59
- var _excluded$6 = ["items", "pageItems"];
64
+ var _excluded$7 = ["items", "pageItems"];
60
65
  var useMedias = function useMedias() {
61
66
  var query = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
62
67
  var page = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
@@ -74,7 +79,7 @@ var useMedias = function useMedias() {
74
79
  }, opts)),
75
80
  items = _useItems.items,
76
81
  pageItems = _useItems.pageItems,
77
- request = _objectWithoutProperties(_useItems, _excluded$6);
82
+ request = _objectWithoutProperties(_useItems, _excluded$7);
78
83
  return _objectSpread({
79
84
  medias: page !== null ? pageItems : items,
80
85
  allMedias: items
@@ -110,7 +115,7 @@ var useMediasRecent = function useMediasRecent(opts) {
110
115
  };
111
116
  var useMediasRecent$1 = useMediasRecent;
112
117
 
113
- var _excluded$5 = ["data"];
118
+ var _excluded$6 = ["data"];
114
119
  var useMedia = function useMedia(id, opts) {
115
120
  var api = useMediasApi();
116
121
  var loader = React.useCallback(function () {
@@ -118,7 +123,7 @@ var useMedia = function useMedia(id, opts) {
118
123
  }, [api, id]);
119
124
  var _useData = data.useData(loader, opts),
120
125
  data$1 = _useData.data,
121
- request = _objectWithoutProperties(_useData, _excluded$5);
126
+ request = _objectWithoutProperties(_useData, _excluded$6);
122
127
  return _objectSpread({
123
128
  story: data$1
124
129
  }, request);
@@ -165,6 +170,456 @@ var useMediaUpdate = function useMediaUpdate() {
165
170
  };
166
171
  var useMediaUpdate$1 = useMediaUpdate;
167
172
 
173
+ var useMediaDestroy = function useMediaDestroy() {
174
+ var _useState = React.useState(false),
175
+ _useState2 = _slicedToArray(_useState, 2),
176
+ loading = _useState2[0],
177
+ setLoading = _useState2[1];
178
+ var api = useMediasApi();
179
+ var destroy = React.useCallback(function (id, data) {
180
+ setLoading(true);
181
+ return api["delete"](id, data).then(function (response) {
182
+ setLoading(false);
183
+ return response;
184
+ });
185
+ }, [api, setLoading]);
186
+ return {
187
+ destroy: destroy,
188
+ loading: loading
189
+ };
190
+ };
191
+
192
+ var styles = {"mediaFrame":"panneau-medias-mediaFrame","playButton":"panneau-medias-playButton"};
193
+
194
+ var propTypes$7 = {
195
+ value: PropTypes.shape({
196
+ id: PropTypes.string,
197
+ type: PropTypes.string
198
+ }),
199
+ className: PropTypes.string
200
+ };
201
+ var defaultProps$7 = {
202
+ value: null,
203
+ className: null
204
+ };
205
+ function MediaFrame(_ref) {
206
+ var value = _ref.value,
207
+ className = _ref.className;
208
+ var _useState = React.useState(false),
209
+ _useState2 = _slicedToArray(_useState, 2),
210
+ showPlayer = _useState2[0],
211
+ setShowPlayer = _useState2[1];
212
+ var _ref2 = value || {},
213
+ _ref2$type = _ref2.type,
214
+ type = _ref2$type === void 0 ? null : _ref2$type;
215
+ var onClick = React.useCallback(function () {
216
+ setShowPlayer(!showPlayer);
217
+ }, [showPlayer, setShowPlayer]);
218
+ return /*#__PURE__*/React.createElement("div", {
219
+ className: classNames([className, _defineProperty({}, className, className != null)])
220
+ }, showPlayer ? /*#__PURE__*/React.createElement(MediaPlayer, {
221
+ value: value
222
+ }) : /*#__PURE__*/React.createElement(MediaPreview, {
223
+ value: value,
224
+ width: "100%"
225
+ }), /*#__PURE__*/React.createElement("div", {
226
+ className: styles.playButton
227
+ }, !showPlayer && (type === 'video' || type === 'embed' || type === 'audio') ? /*#__PURE__*/React.createElement(Button, {
228
+ className: "rounded-circle",
229
+ theme: "secondary",
230
+ onClick: onClick,
231
+ icon: "play-fill"
232
+ }) : null));
233
+ }
234
+ MediaFrame.propTypes = propTypes$7;
235
+ MediaFrame.defaultProps = defaultProps$7;
236
+
237
+ var _excluded$5 = ["label", "path", "component"];
238
+ var propTypes$6 = {
239
+ value: PropTypes.shape({
240
+ metadata: PropTypes.shape({}),
241
+ user: PropTypes.shape({}),
242
+ createdAt: PropTypes.string
243
+ }),
244
+ sections: PropTypes.arrayOf(PropTypes.shape({
245
+ title: PropTypes.node,
246
+ items: PropTypes.arrayOf(PropTypes.shape({})) // displays
247
+ })),
248
+ displays: PropTypes.arrayOf(PropTypes.shape({
249
+ section: PropTypes.string
250
+ })),
251
+ className: PropTypes.string
252
+ };
253
+ var defaultProps$6 = {
254
+ value: null,
255
+ sections: null,
256
+ displays: null,
257
+ className: null
258
+ };
259
+ function MediaMetadata(_ref) {
260
+ var sections = _ref.sections,
261
+ displays = _ref.displays,
262
+ value = _ref.value,
263
+ className = _ref.className;
264
+ var displayComponents = contexts.useDisplaysComponentsManager();
265
+ var finalSections = React.useMemo(function () {
266
+ var displaysWithoutSection = (displays || []).filter(function (_ref2) {
267
+ var _ref2$section = _ref2.section,
268
+ section = _ref2$section === void 0 ? null : _ref2$section;
269
+ return section === null;
270
+ });
271
+ return (sections || []).map(function (_ref3) {
272
+ var _ref3$id = _ref3.id,
273
+ id = _ref3$id === void 0 ? null : _ref3$id,
274
+ _ref3$title = _ref3.title,
275
+ title = _ref3$title === void 0 ? null : _ref3$title;
276
+ return {
277
+ id: id,
278
+ title: title,
279
+ items: (displays || []).filter(function (_ref4) {
280
+ var _ref4$section = _ref4.section,
281
+ section = _ref4$section === void 0 ? null : _ref4$section;
282
+ return section === id;
283
+ })
284
+ };
285
+ }).concat({
286
+ title: null,
287
+ items: displaysWithoutSection
288
+ });
289
+ }, [sections, displays]);
290
+ return /*#__PURE__*/React.createElement("div", {
291
+ className: classNames(['px-2', _defineProperty({}, className, className !== null)])
292
+ }, (finalSections || []).map(function (_ref6, i) {
293
+ var _ref6$title = _ref6.title,
294
+ title = _ref6$title === void 0 ? null : _ref6$title,
295
+ _ref6$items = _ref6.items,
296
+ items = _ref6$items === void 0 ? [] : _ref6$items;
297
+ return /*#__PURE__*/React.createElement("div", {
298
+ className: "mb-5",
299
+ key: "section-".concat(i + 1)
300
+ }, title !== null ? /*#__PURE__*/React.createElement("h6", {
301
+ className: "px-1"
302
+ }, title) : null, /*#__PURE__*/React.createElement("ul", {
303
+ className: "list-group list-group-flush"
304
+ }, (items || []).map(function (_ref7, index) {
305
+ var label = _ref7.label,
306
+ path = _ref7.path,
307
+ _ref7$component = _ref7.component,
308
+ component = _ref7$component === void 0 ? null : _ref7$component,
309
+ props = _objectWithoutProperties(_ref7, _excluded$5);
310
+ var Component = displayComponents.getComponent(component || 'text');
311
+ var itemValue = lodash.get(value, path, null);
312
+ return Component !== null && itemValue !== null ? /*#__PURE__*/React.createElement("li", {
313
+ className: classNames(['row', 'd-flex', 'align-items-center', 'justify-content-between', 'p-1', 'border-secondary-1', 'border-1', 'border-bottom', 'text-small', {
314
+ 'border-top': index === 0
315
+ }]),
316
+ key: "item-".concat(index + 1)
317
+ }, /*#__PURE__*/React.createElement("div", {
318
+ className: "col-auto"
319
+ }, label), /*#__PURE__*/React.createElement("div", {
320
+ className: "col-auto align-right"
321
+ }, /*#__PURE__*/React.createElement(Component, Object.assign({}, props, {
322
+ value: itemValue
323
+ })))) : null;
324
+ })));
325
+ }));
326
+ }
327
+ MediaMetadata.propTypes = propTypes$6;
328
+ MediaMetadata.defaultProps = defaultProps$6;
329
+
330
+ var defaultFields = [
331
+ // { name: 'type', label: 'Type', type: 'string', component: 'text', disabled: true },
332
+ {
333
+ name: 'name',
334
+ label: /*#__PURE__*/React.createElement(reactIntl.FormattedMessage, {
335
+ id: "WX83V9",
336
+ defaultMessage: [{
337
+ "type": 0,
338
+ "value": "File name"
339
+ }]
340
+ }),
341
+ type: 'text',
342
+ component: 'text'
343
+ }, {
344
+ name: 'description',
345
+ label: /*#__PURE__*/React.createElement(reactIntl.FormattedMessage, {
346
+ id: "ygNvmz",
347
+ defaultMessage: [{
348
+ "type": 0,
349
+ "value": "Description"
350
+ }]
351
+ }),
352
+ type: 'text',
353
+ component: 'text'
354
+ }
355
+ // {
356
+ // name: 'url',
357
+ // label: <FormattedMessage defaultMessage="URL" description="Field name" />,
358
+ // type: 'text',
359
+ // component: 'url',
360
+ // },
361
+ // {
362
+ // name: 'thumbnail_url',
363
+ // label: <FormattedMessage defaultMessage="Thumbnail URL" description="Field name" />,
364
+ // type: 'text',
365
+ // component: 'url',
366
+ // },
367
+ ];
368
+
369
+ var defaultDisplays = [{
370
+ id: 'user',
371
+ label: /*#__PURE__*/React.createElement(reactIntl.FormattedMessage, {
372
+ id: "yByaBh",
373
+ defaultMessage: [{
374
+ "type": 0,
375
+ "value": "Added by"
376
+ }]
377
+ }),
378
+ component: 'avatar',
379
+ path: 'user',
380
+ section: 'info'
381
+ }, {
382
+ id: 'created_at',
383
+ label: /*#__PURE__*/React.createElement(reactIntl.FormattedMessage, {
384
+ id: "PN+75e",
385
+ defaultMessage: [{
386
+ "type": 0,
387
+ "value": "Created at"
388
+ }]
389
+ }),
390
+ component: 'date',
391
+ path: 'created_at',
392
+ format: 'yyyy-MM-dd hh:ss',
393
+ section: 'info'
394
+ }, {
395
+ id: 'format',
396
+ label: /*#__PURE__*/React.createElement(reactIntl.FormattedMessage, {
397
+ id: "JuxiUN",
398
+ defaultMessage: [{
399
+ "type": 0,
400
+ "value": "Format"
401
+ }]
402
+ }),
403
+ component: 'unit',
404
+ format: 'format',
405
+ path: 'format',
406
+ section: 'technical'
407
+ }, {
408
+ id: 'dimensions',
409
+ label: /*#__PURE__*/React.createElement(reactIntl.FormattedMessage, {
410
+ id: "rmJBin",
411
+ defaultMessage: [{
412
+ "type": 0,
413
+ "value": "Dimensions"
414
+ }]
415
+ }),
416
+ component: 'unit',
417
+ format: 'dimensions',
418
+ path: 'metadata',
419
+ section: 'technical'
420
+ }, {
421
+ id: 'size',
422
+ label: /*#__PURE__*/React.createElement(reactIntl.FormattedMessage, {
423
+ id: "g2CRt5",
424
+ defaultMessage: [{
425
+ "type": 0,
426
+ "value": "Size"
427
+ }]
428
+ }),
429
+ component: 'unit',
430
+ format: 'bytes',
431
+ path: 'metadata.size',
432
+ section: 'technical'
433
+ }, {
434
+ id: 'duration',
435
+ label: /*#__PURE__*/React.createElement(reactIntl.FormattedMessage, {
436
+ id: "wU++NJ",
437
+ defaultMessage: [{
438
+ "type": 0,
439
+ "value": "Duration"
440
+ }]
441
+ }),
442
+ component: 'unit',
443
+ format: 'duration',
444
+ path: 'metadata.duration',
445
+ section: 'technical'
446
+ }];
447
+
448
+ var defaultSections = [{
449
+ id: 'info',
450
+ title: /*#__PURE__*/React.createElement(reactIntl.FormattedMessage, {
451
+ id: "3RT69u",
452
+ defaultMessage: [{
453
+ "type": 0,
454
+ "value": "Informations"
455
+ }]
456
+ })
457
+ }, {
458
+ id: 'technical',
459
+ title: /*#__PURE__*/React.createElement(reactIntl.FormattedMessage, {
460
+ id: "xKUOLG",
461
+ defaultMessage: [{
462
+ "type": 0,
463
+ "value": "Technical details"
464
+ }]
465
+ })
466
+ }];
467
+
468
+ var propTypes$5 = {
469
+ value: PropTypes.shape({
470
+ id: PropTypes.string
471
+ }),
472
+ fields: PropTypes.arrayOf(PropTypes.shape({
473
+ name: PropTypes.string
474
+ })),
475
+ sections: PropTypes.arrayOf(PropTypes.shape({
476
+ id: PropTypes.string,
477
+ title: PropTypes.string
478
+ })),
479
+ displays: PropTypes.arrayOf(PropTypes.shape({
480
+ name: PropTypes.string
481
+ })),
482
+ onChange: PropTypes.func.isRequired,
483
+ onConfirm: PropTypes.func.isRequired,
484
+ onDelete: PropTypes.func,
485
+ onClose: PropTypes.func,
486
+ className: PropTypes.string
487
+ };
488
+ var defaultProps$5 = {
489
+ value: null,
490
+ fields: defaultFields,
491
+ sections: defaultSections,
492
+ displays: defaultDisplays,
493
+ onClose: null,
494
+ onDelete: null,
495
+ className: null
496
+ };
497
+ function MediaForm(_ref) {
498
+ var initialValue = _ref.value,
499
+ initialFields = _ref.fields,
500
+ sections = _ref.sections,
501
+ displays = _ref.displays,
502
+ onChange = _ref.onChange,
503
+ onConfirm = _ref.onConfirm,
504
+ onDelete = _ref.onDelete,
505
+ onClose = _ref.onClose,
506
+ className = _ref.className;
507
+ var FieldsComponent = contexts.useFieldComponent('fields');
508
+ var _useMediaUpdate = useMediaUpdate$1(),
509
+ update = _useMediaUpdate.update,
510
+ updating = _useMediaUpdate.loading;
511
+ var _useMediaDestroy = useMediaDestroy(),
512
+ destroy = _useMediaDestroy.destroy,
513
+ destroying = _useMediaDestroy.loading;
514
+ var _useState = React.useState(false),
515
+ _useState2 = _slicedToArray(_useState, 2);
516
+ _useState2[0];
517
+ var setChanged = _useState2[1];
518
+ var disabled = updating || destroying || initialValue === null;
519
+ var _ref2 = initialValue || {},
520
+ _ref2$name = _ref2.name,
521
+ name = _ref2$name === void 0 ? null : _ref2$name,
522
+ _ref2$type = _ref2.type,
523
+ type = _ref2$type === void 0 ? null : _ref2$type;
524
+ var onChangeMedia = React.useCallback(function (newValue) {
525
+ if (onChange !== null) {
526
+ onChange(newValue);
527
+ }
528
+ setChanged(true);
529
+ }, [onChange, setChanged]);
530
+ var onMediaSaved = React.useCallback(function (newValue) {
531
+ if (onConfirm !== null) {
532
+ onConfirm(newValue);
533
+ }
534
+ setChanged(false);
535
+ }, [onChange, setChanged]);
536
+ var onDeleteMedia = React.useCallback(function () {
537
+ // Destroy
538
+ if (onClose !== null) {
539
+ onClose();
540
+ }
541
+ if (onDelete !== null) {
542
+ onDelete();
543
+ }
544
+ setChanged(false);
545
+ }, [destroy, setChanged]);
546
+ var postForm = React.useCallback(function (action, data) {
547
+ return initialValue !== null ? update(initialValue.id, data) : new Promise();
548
+ }, [initialValue, update]);
549
+ var _useForm = hooks.useForm({
550
+ fields: initialFields,
551
+ postForm: postForm,
552
+ onComplete: onMediaSaved,
553
+ value: initialValue,
554
+ setValue: onChange
555
+ }),
556
+ value = _useForm.value,
557
+ setValue = _useForm.setValue,
558
+ fields = _useForm.fields;
559
+ _useForm.onSubmit;
560
+ _useForm.status;
561
+ _useForm.generalError;
562
+ _useForm.errors;
563
+ return /*#__PURE__*/React.createElement("div", {
564
+ className: classNames(['text-body', _defineProperty({}, className, className !== null)])
565
+ }, /*#__PURE__*/React.createElement("div", {
566
+ className: "d-flex w-100 justify-content-between mb-2 pb-2 border-bottom"
567
+ }, /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("h4", {
568
+ className: "d-inline"
569
+ }, name), /*#__PURE__*/React.createElement("span", {
570
+ className: "mx-2"
571
+ }, type)), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(Button, {
572
+ className: "me-2",
573
+ theme: "danger",
574
+ onClick: onDeleteMedia
575
+ }, /*#__PURE__*/React.createElement(reactIntl.FormattedMessage, {
576
+ id: "Bhu3B2",
577
+ defaultMessage: [{
578
+ "type": 0,
579
+ "value": "Delete"
580
+ }]
581
+ })), onConfirm !== null ? /*#__PURE__*/React.createElement(Button, {
582
+ theme: "primary",
583
+ onClick: onConfirm
584
+ }, /*#__PURE__*/React.createElement(reactIntl.FormattedMessage, {
585
+ id: "R1HYj0",
586
+ defaultMessage: [{
587
+ "type": 0,
588
+ "value": "Save"
589
+ }]
590
+ })) : null)), /*#__PURE__*/React.createElement("div", {
591
+ className: "row"
592
+ }, /*#__PURE__*/React.createElement("div", {
593
+ className: "col-md-6"
594
+ }, /*#__PURE__*/React.createElement("div", {
595
+ className: "position-relative w-100",
596
+ style: {
597
+ height: 400
598
+ }
599
+ }, /*#__PURE__*/React.createElement("div", {
600
+ className: styles.mediaFrame
601
+ }, /*#__PURE__*/React.createElement(MediaFrame, {
602
+ value: value
603
+ })))), /*#__PURE__*/React.createElement("div", {
604
+ className: "col-md-6"
605
+ }, /*#__PURE__*/React.createElement(Form, {
606
+ onChange: onChangeMedia,
607
+ withoutActions: true
608
+ }, /*#__PURE__*/React.createElement(FieldsComponent, {
609
+ fields: fields,
610
+ value: value,
611
+ onChange: setValue,
612
+ disabled: disabled
613
+ })), /*#__PURE__*/React.createElement(MediaMetadata, {
614
+ className: "mt-5",
615
+ value: value,
616
+ sections: sections,
617
+ displays: displays
618
+ }))));
619
+ }
620
+ MediaForm.propTypes = propTypes$5;
621
+ MediaForm.defaultProps = defaultProps$5;
622
+
168
623
  var defaultColumns = [{
169
624
  id: 'image',
170
625
  label: /*#__PURE__*/React.createElement(reactIntl.FormattedMessage, {
@@ -362,20 +817,20 @@ var defaultFilters = [{
362
817
  name: 'search'
363
818
  }];
364
819
 
365
- var styles = {};
366
-
367
820
  var _excluded$4 = ["page", "count"];
368
821
  var propTypes$4 = {
369
822
  items: core.PropTypes.medias,
823
+ buttons: core.PropTypes.buttons,
370
824
  filters: core.PropTypes.filters,
371
825
  columns: core.PropTypes.tableColumns,
372
826
  query: PropTypes.shape({}),
373
827
  baseUrl: PropTypes.string,
374
- // fields: PanneauPropTypes.fields,
828
+ fields: core.PropTypes.fields,
375
829
  layout: PropTypes.string,
376
830
  layouts: PropTypes.arrayOf(PropTypes.shape({})),
377
831
  theme: PropTypes.string,
378
832
  tableProps: PropTypes.bool,
833
+ onSelectItem: PropTypes.func,
379
834
  onItemsChange: PropTypes.func,
380
835
  selectedCount: PropTypes.number,
381
836
  onClearSelected: PropTypes.func,
@@ -383,9 +838,10 @@ var propTypes$4 = {
383
838
  };
384
839
  var defaultProps$4 = {
385
840
  items: null,
841
+ buttons: null,
386
842
  filters: defaultFilters,
387
843
  columns: defaultColumns,
388
- // fields: null,
844
+ fields: defaultFields,
389
845
  query: null,
390
846
  baseUrl: null,
391
847
  layout: 'table',
@@ -402,6 +858,7 @@ var defaultProps$4 = {
402
858
  }],
403
859
  theme: null,
404
860
  tableProps: null,
861
+ onSelectItem: null,
405
862
  onItemsChange: null,
406
863
  selectedCount: null,
407
864
  onClearSelected: null,
@@ -410,6 +867,7 @@ var defaultProps$4 = {
410
867
  function MediasBrowser(_ref) {
411
868
  var initialItems = _ref.items,
412
869
  baseUrl = _ref.baseUrl,
870
+ buttons = _ref.buttons,
413
871
  filters = _ref.filters,
414
872
  columns = _ref.columns,
415
873
  initialQuery = _ref.query,
@@ -417,6 +875,7 @@ function MediasBrowser(_ref) {
417
875
  layouts = _ref.layouts,
418
876
  theme = _ref.theme,
419
877
  tableProps = _ref.tableProps,
878
+ onSelectItem = _ref.onSelectItem,
420
879
  onItemsChange = _ref.onItemsChange,
421
880
  selectedCount = _ref.selectedCount,
422
881
  onClearSelected = _ref.onClearSelected,
@@ -456,7 +915,9 @@ function MediasBrowser(_ref) {
456
915
  lastPage = _useMedias.lastPage,
457
916
  total = _useMedias.total;
458
917
  React.useEffect(function () {
459
- onItemsChange(items);
918
+ if (onItemsChange !== null) {
919
+ onItemsChange(items);
920
+ }
460
921
  }, [items, onItemsChange]);
461
922
  var _useState = React.useState(initialLayout || 'grid'),
462
923
  _useState2 = _slicedToArray(_useState, 2),
@@ -468,6 +929,16 @@ function MediasBrowser(_ref) {
468
929
  var onClickLayout = React.useCallback(function (lay) {
469
930
  setLayout(lay);
470
931
  }, [setLayout]);
932
+ var _useState3 = React.useState(null),
933
+ _useState4 = _slicedToArray(_useState3, 2),
934
+ media = _useState4[0],
935
+ setMedia = _useState4[1];
936
+ var onOpenMedia = React.useCallback(function (currentMedia) {
937
+ setMedia(currentMedia);
938
+ }, [setMedia]);
939
+ var onCloseMedia = React.useCallback(function () {
940
+ setMedia(null);
941
+ }, [setMedia]);
471
942
  var pagination = /*#__PURE__*/React.createElement(Pagination, {
472
943
  page: page,
473
944
  lastPage: lastPage,
@@ -484,13 +955,32 @@ function MediasBrowser(_ref) {
484
955
  });
485
956
  return /*#__PURE__*/React.createElement("div", {
486
957
  className: classNames([styles.container, className])
487
- }, /*#__PURE__*/React.createElement(Filters, {
958
+ }, media !== null ? /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
959
+ className: "mt-2 mb-4"
960
+ }, /*#__PURE__*/React.createElement(Button, {
961
+ theme: "primary",
962
+ outline: true,
963
+ onClick: onCloseMedia,
964
+ icon: "arrow-left"
965
+ }, /*#__PURE__*/React.createElement(reactIntl.FormattedMessage, {
966
+ id: "ac4218",
967
+ defaultMessage: [{
968
+ "type": 0,
969
+ "value": "Back to files"
970
+ }]
971
+ }))), /*#__PURE__*/React.createElement(MediaForm, {
972
+ value: media,
973
+ onClose: onCloseMedia
974
+ })) : /*#__PURE__*/React.createElement(React.Fragment, null, buttons !== null ? /*#__PURE__*/React.createElement(Buttons, {
975
+ items: buttons,
976
+ className: "mb-2"
977
+ }) : null, filters !== null ? /*#__PURE__*/React.createElement(Filters, {
488
978
  value: query,
489
979
  filters: filters,
490
980
  onChange: onQueryChange,
491
981
  onReset: onQueryReset,
492
982
  theme: theme
493
- }), /*#__PURE__*/React.createElement("div", {
983
+ }) : null, /*#__PURE__*/React.createElement("div", {
494
984
  className: classNames(['d-flex', 'mt-1', 'mb-3', {
495
985
  'justify-content-between': hasLayouts,
496
986
  'justify-content-end': !hasLayouts
@@ -509,21 +999,29 @@ function MediasBrowser(_ref) {
509
999
  });
510
1000
  })
511
1001
  }) : null, pagination), layout === 'grid' ? /*#__PURE__*/React.createElement(Grid, Object.assign({}, tableProps, {
1002
+ size: "xsmall",
512
1003
  items: items || [],
513
1004
  component: MediaCard,
514
1005
  componentProps: {
515
1006
  className: 'd-flex w-100',
516
- cardClassName: 'flex-grow-1'
1007
+ cardClassName: 'flex-grow-1',
1008
+ vertical: true
1009
+ },
1010
+ onSelectItem: onSelectItem !== null ? onSelectItem : function (it) {
1011
+ return onOpenMedia(it);
517
1012
  }
518
- })) : /*#__PURE__*/React.createElement(Table, Object.assign({}, tableProps, {
1013
+ })) : null, layout === 'table' ? /*#__PURE__*/React.createElement(Table, Object.assign({}, tableProps, {
519
1014
  columns: columns,
520
1015
  items: items,
521
1016
  displayPlaceholder: /*#__PURE__*/React.createElement("span", {
522
1017
  className: "text-secondary text-opacity-75"
523
- }, "\u2014")
524
- })), /*#__PURE__*/React.createElement("div", {
1018
+ }, "\u2014"),
1019
+ onSelectItem: onSelectItem !== null ? onSelectItem : function (it) {
1020
+ return onOpenMedia(it);
1021
+ }
1022
+ })) : null, /*#__PURE__*/React.createElement("div", {
525
1023
  className: classNames(['d-flex', 'mt-3', 'mb-1', 'justify-content-end'])
526
- }, pagination));
1024
+ }, pagination)));
527
1025
  }
528
1026
  MediasBrowser.propTypes = propTypes$4;
529
1027
  MediasBrowser.defaultProps = defaultProps$4;
@@ -606,6 +1104,7 @@ function MediasPicker(_ref) {
606
1104
  selectedItems: selectedItems,
607
1105
  pageSelected: pageSelected
608
1106
  },
1107
+ onSelectItem: onSelectItem,
609
1108
  onItemsChange: onItemsChange,
610
1109
  selectedCount: selectedCount,
611
1110
  onClearSelected: onClearSelected
@@ -721,6 +1220,7 @@ function MediasResourceBrowser(_ref) {
721
1220
  MediasResourceBrowser.propTypes = propTypes;
722
1221
  MediasResourceBrowser.defaultProps = defaultProps;
723
1222
 
1223
+ exports.MediaForm = MediaForm;
724
1224
  exports.MediasApiProvider = MediasApiProvider;
725
1225
  exports.MediasBrowser = MediasBrowser;
726
1226
  exports.MediasPicker = MediasPicker;