@panneau/medias 3.0.171 → 3.0.173

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.
@@ -1 +1 @@
1
- .panneau-medias-mediaFrame{margin-bottom:10px;position:relative}.panneau-medias-playButton{left:50%;position:absolute;top:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}
1
+ .panneau-medias-mediaFrame{aspect-ratio:1/1;margin-bottom:10px;position:relative}.panneau-medias-playButton{left:50%;position:absolute;top:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}
package/es/index.js CHANGED
@@ -9,10 +9,12 @@ import { useForm, useQuery, useItemSelection } from '@panneau/core/hooks';
9
9
  import Button from '@panneau/element-button';
10
10
  import Form from '@panneau/element-form';
11
11
  import FormStatus from '@panneau/element-form-status';
12
+ import ImageDisplay from '@panneau/display-image';
12
13
  import MediaPlayer from '@panneau/element-media-player';
13
- import MediaPreview from '@panneau/element-media-preview';
14
+ import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';
14
15
  import _objectWithoutProperties from '@babel/runtime/helpers/objectWithoutProperties';
15
16
  import _objectSpread from '@babel/runtime/helpers/objectSpread2';
17
+ import uniqBy from 'lodash/uniqBy';
16
18
  import { PropTypes as PropTypes$1 } from '@panneau/core';
17
19
  import Buttons from '@panneau/element-buttons';
18
20
  import Grid from '@panneau/element-grid';
@@ -21,8 +23,7 @@ import MediaCard from '@panneau/element-media-card';
21
23
  import Pagination from '@panneau/element-pagination';
22
24
  import Table from '@panneau/element-table';
23
25
  import Filters from '@panneau/filter-filters';
24
- import { useItems, useData, useApi } from '@panneau/data';
25
- import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';
26
+ import { useItemsStore, useData, useApi } from '@panneau/data';
26
27
 
27
28
  /* eslint-disable react/jsx-props-no-spreading */
28
29
  var MediasApiContext = /*#__PURE__*/React.createContext(null);
@@ -59,7 +60,7 @@ function MediasApiProvider(_ref) {
59
60
  MediasApiProvider.propTypes = propTypes$9;
60
61
  MediasApiProvider.defaultProps = defaultProps$9;
61
62
 
62
- var _excluded$7 = ["items", "pageItems"];
63
+ var _excluded$7 = ["items"];
63
64
  var useMedias = function useMedias() {
64
65
  var query = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
65
66
  var page = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
@@ -70,18 +71,18 @@ var useMedias = function useMedias() {
70
71
  var requestedPage = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
71
72
  return api.get(query, requestedPage, count);
72
73
  }, [api, query, count]);
73
- var _useItems = useItems(_objectSpread({
74
+ var _useItemsStore = useItemsStore('medias', _objectSpread({
74
75
  getPage: page !== null ? getItems : null,
75
76
  getItems: page === null ? getItems : null,
76
- page: page
77
+ page: page,
78
+ count: count,
79
+ query: query
77
80
  }, opts)),
78
- items = _useItems.items,
79
- pageItems = _useItems.pageItems,
80
- request = _objectWithoutProperties(_useItems, _excluded$7);
81
+ items = _useItemsStore.items,
82
+ props = _objectWithoutProperties(_useItemsStore, _excluded$7);
81
83
  return _objectSpread({
82
- medias: page !== null ? pageItems : items,
83
- allMedias: items
84
- }, request);
84
+ items: items
85
+ }, props);
85
86
  };
86
87
  var useMedias$1 = useMedias;
87
88
 
@@ -214,22 +215,18 @@ function MediaFrame(_ref) {
214
215
  setShowPlayer(!showPlayer);
215
216
  }, [showPlayer, setShowPlayer]);
216
217
  return /*#__PURE__*/React.createElement("div", {
217
- className: classNames([className, 'position-relative', _defineProperty({}, className, className != null)])
218
+ className: classNames([styles.mediaFrame, 'position-relative', 'd-flex', 'flex-grow-1', 'w-100', 'mw-100', _defineProperty({}, className, className != null)])
218
219
  }, showPlayer ? /*#__PURE__*/React.createElement(MediaPlayer, {
219
220
  value: value,
220
221
  width: "100%"
221
- }) : /*#__PURE__*/React.createElement(MediaPreview, {
222
+ }) : /*#__PURE__*/React.createElement(ImageDisplay, {
223
+ className: "w-100",
222
224
  value: value,
223
- width: "100%"
224
- }, /*#__PURE__*/React.createElement("div", {
225
- className: styles.playButton
226
- }, !showPlayer && (type === 'video' || type === 'embed' || type === 'audio') ? /*#__PURE__*/React.createElement(Button, {
227
- className: "rounded-circle",
228
- theme: "secondary",
229
- onClick: onClick,
230
- icon: "play-fill",
231
- size: "lg"
232
- }) : null)));
225
+ maxWidth: "100%",
226
+ maxHeight: "100%",
227
+ withoutZoom: true,
228
+ onClick: type === 'video' || type === 'audio' ? onClick : null
229
+ }));
233
230
  }
234
231
  MediaFrame.propTypes = propTypes$8;
235
232
  MediaFrame.defaultProps = defaultProps$8;
@@ -775,10 +772,8 @@ var _excluded$5 = ["page", "count"],
775
772
  _excluded2 = ["types"];
776
773
  var propTypes$5 = {
777
774
  items: PropTypes$1.medias,
775
+ extraItems: PropTypes$1.medias,
778
776
  types: PropTypes.arrayOf(PropTypes.string),
779
- // uploadButton: PropTypes.shape({
780
- // value: PropTypes.oneOfType([PanneauPropTypes.medias, PanneauPropTypes.media]),
781
- // }),
782
777
  buttons: PropTypes$1.buttons,
783
778
  filters: PropTypes$1.filters,
784
779
  columns: PropTypes$1.tableColumns,
@@ -789,16 +784,17 @@ var propTypes$5 = {
789
784
  layouts: PropTypes.arrayOf(PropTypes.shape({})),
790
785
  theme: PropTypes.string,
791
786
  tableProps: PropTypes.bool,
792
- onSelectItem: PropTypes.func,
793
- onSelectItems: PropTypes.func,
794
787
  onItemsChange: PropTypes.func,
795
788
  onLayoutChange: PropTypes.func,
796
789
  selectedCount: PropTypes.number,
797
790
  onClearSelected: PropTypes.func,
798
- className: PropTypes.string
791
+ withStickySelection: PropTypes.bool,
792
+ className: PropTypes.string,
793
+ buttonsClassName: PropTypes.string
799
794
  };
800
795
  var defaultProps$5 = {
801
796
  items: null,
797
+ extraItems: null,
802
798
  types: null,
803
799
  buttons: null,
804
800
  filters: defaultFilters,
@@ -820,16 +816,17 @@ var defaultProps$5 = {
820
816
  }],
821
817
  theme: null,
822
818
  tableProps: null,
823
- onSelectItem: null,
824
- onSelectItems: null,
825
819
  onItemsChange: null,
826
820
  onLayoutChange: null,
827
821
  selectedCount: null,
828
822
  onClearSelected: null,
829
- className: null
823
+ withStickySelection: false,
824
+ className: null,
825
+ buttonsClassName: null
830
826
  };
831
827
  function MediasBrowser(_ref) {
832
828
  var initialItems = _ref.items,
829
+ extraItems = _ref.extraItems,
833
830
  types = _ref.types,
834
831
  baseUrl = _ref.baseUrl,
835
832
  buttons = _ref.buttons,
@@ -841,13 +838,13 @@ function MediasBrowser(_ref) {
841
838
  layouts = _ref.layouts,
842
839
  theme = _ref.theme,
843
840
  tableProps = _ref.tableProps,
844
- onSelectItem = _ref.onSelectItem,
845
- onSelectItems = _ref.onSelectItems,
846
841
  onItemsChange = _ref.onItemsChange,
847
842
  onLayoutChange = _ref.onLayoutChange,
848
843
  selectedCount = _ref.selectedCount,
849
844
  onClearSelected = _ref.onClearSelected,
850
- className = _ref.className;
845
+ withStickySelection = _ref.withStickySelection,
846
+ className = _ref.className,
847
+ buttonsClassName = _ref.buttonsClassName;
851
848
  var _useState = useState(initialItems || null),
852
849
  _useState2 = _slicedToArray(_useState, 1),
853
850
  baseItems = _useState2[0];
@@ -890,10 +887,16 @@ function MediasBrowser(_ref) {
890
887
  var _useMedias = useMedias$1(query, page, count, {
891
888
  items: baseItems
892
889
  }),
893
- items = _useMedias.medias,
894
- loading = _useMedias.loading,
895
- lastPage = _useMedias.lastPage,
896
- total = _useMedias.total;
890
+ items = _useMedias.items,
891
+ allItems = _useMedias.allItems,
892
+ _useMedias$loading = _useMedias.loading,
893
+ loading = _useMedias$loading === void 0 ? false : _useMedias$loading,
894
+ _useMedias$updateItem = _useMedias.updateItem,
895
+ updateItem = _useMedias$updateItem === void 0 ? null : _useMedias$updateItem,
896
+ _useMedias$pagination = _useMedias.pagination,
897
+ _useMedias$pagination2 = _useMedias$pagination === void 0 ? {} : _useMedias$pagination,
898
+ lastPage = _useMedias$pagination2.lastPage,
899
+ total = _useMedias$pagination2.total;
897
900
 
898
901
  // For picker
899
902
  useEffect(function () {
@@ -925,17 +928,10 @@ function MediasBrowser(_ref) {
925
928
  var onCloseMedia = useCallback(function () {
926
929
  setCurrentMedia(null);
927
930
  }, [setCurrentMedia]);
928
-
929
- // TODO: context for this?
930
- useCallback(function () {
931
- var media = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
932
- onSelectItems(media);
933
- onQueryReset();
934
- }, [setCurrentMedia, onQueryReset, onSelectItems]);
935
- var onSaveMedia = useCallback(function () {
931
+ var onSaveMedia = useCallback(function (item) {
936
932
  setCurrentMedia(null);
937
- onQueryReset();
938
- }, [setCurrentMedia, onQueryReset]);
933
+ updateItem(item);
934
+ }, [setCurrentMedia, updateItem]);
939
935
  var pagination = /*#__PURE__*/React.createElement(Pagination, {
940
936
  page: page,
941
937
  lastPage: lastPage,
@@ -963,13 +959,31 @@ function MediasBrowser(_ref) {
963
959
  }
964
960
  return filters;
965
961
  }, [filters, types]);
962
+ var finalItems = useMemo(function () {
963
+ if (withStickySelection && extraItems !== null) {
964
+ return uniqBy([].concat(_toConsumableArray((extraItems || []).map(function (item) {
965
+ var _item$id = item.id,
966
+ itemId = _item$id === void 0 ? null : _item$id;
967
+ return (allItems || []).find(function () {
968
+ var _ref5 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
969
+ _ref5$id = _ref5.id,
970
+ otherId = _ref5$id === void 0 ? null : _ref5$id;
971
+ return otherId === itemId;
972
+ }) || item || null;
973
+ }).filter(function (it) {
974
+ return it !== null;
975
+ })), _toConsumableArray(items || [])), function (it) {
976
+ return it === null || it === void 0 ? void 0 : it.id;
977
+ });
978
+ }
979
+ return items;
980
+ }, [items, page, allItems, withStickySelection, extraItems]);
966
981
  return /*#__PURE__*/React.createElement("div", {
967
982
  className: classNames([styles.container, className])
968
983
  }, currentMedia !== null ? /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
969
984
  className: "mt-2 mb-4"
970
985
  }, /*#__PURE__*/React.createElement(Button, {
971
986
  theme: "primary",
972
- outline: true,
973
987
  onClick: onCloseMedia,
974
988
  icon: "arrow-left"
975
989
  }, /*#__PURE__*/React.createElement(FormattedMessage, {
@@ -985,7 +999,6 @@ function MediasBrowser(_ref) {
985
999
  onSave: onSaveMedia,
986
1000
  onClose: onCloseMedia
987
1001
  })) : /*#__PURE__*/React.createElement(React.Fragment, null, filters !== null ? /*#__PURE__*/React.createElement(Filters, {
988
- className: "mt-0 pt-0",
989
1002
  value: query,
990
1003
  clearValue: types !== null ? queryWithoutTypes : null,
991
1004
  filters: finalFilters,
@@ -994,12 +1007,12 @@ function MediasBrowser(_ref) {
994
1007
  theme: theme
995
1008
  }, buttons !== null ? /*#__PURE__*/React.createElement(Buttons, {
996
1009
  items: buttons,
997
- className: "ms-xl-auto"
1010
+ className: buttonsClassName
998
1011
  }) : null) : null, filters === null && buttons !== null ? /*#__PURE__*/React.createElement("div", {
999
1012
  className: "mt-2 mb-2"
1000
1013
  }, buttons !== null ? /*#__PURE__*/React.createElement(Buttons, {
1001
1014
  items: buttons,
1002
- className: "ms-xl-auto"
1015
+ className: buttonsClassName
1003
1016
  }) : null) : null, /*#__PURE__*/React.createElement("div", {
1004
1017
  className: classNames(['d-flex', 'mt-1', 'mb-3', {
1005
1018
  'justify-content-between': hasLayouts,
@@ -1026,29 +1039,28 @@ function MediasBrowser(_ref) {
1026
1039
  className: 'd-flex w-100',
1027
1040
  cardClassName: 'flex-grow-1',
1028
1041
  vertical: true,
1029
- selectable: onSelectItem !== null,
1030
1042
  onClickDescription: function onClickDescription(it) {
1031
1043
  onOpenMedia(it);
1032
1044
  }
1033
- }
1034
- }, tableProps, {
1035
- items: items || [],
1036
- loading: loading,
1037
- onSelectItem: onSelectItem !== null ? onSelectItem : function (it) {
1045
+ },
1046
+ onSelectItem: function onSelectItem(it) {
1038
1047
  return onOpenMedia(it);
1039
1048
  }
1049
+ }, tableProps, {
1050
+ items: finalItems || [],
1051
+ loading: loading
1040
1052
  })) : null, layout === 'table' ? /*#__PURE__*/React.createElement(Table, Object.assign({
1041
1053
  theme: theme,
1042
1054
  columns: columns,
1043
1055
  displayPlaceholder: /*#__PURE__*/React.createElement("span", {
1044
1056
  className: "text-secondary text-opacity-75"
1045
- }, "\u2014")
1057
+ }, "\u2014"),
1058
+ onSelectItem: function onSelectItem(it) {
1059
+ return onOpenMedia(it);
1060
+ }
1046
1061
  }, tableProps, {
1047
- items: items,
1062
+ items: finalItems,
1048
1063
  loading: loading,
1049
- onSelectItem: onSelectItem !== null ? onSelectItem : function (it) {
1050
- return onOpenMedia(it);
1051
- },
1052
1064
  actionsProps: {
1053
1065
  getEditPropsFromItem: function getEditPropsFromItem(it) {
1054
1066
  return {
@@ -1104,24 +1116,25 @@ function MediasPicker(_ref) {
1104
1116
  tableProps = _ref.tableProps,
1105
1117
  className = _ref.className,
1106
1118
  props = _objectWithoutProperties(_ref, _excluded$4);
1119
+ var _useMediasForm = useMediasForm(),
1120
+ currentMedia = _useMediasForm.media;
1121
+
1122
+ // For selection
1107
1123
  var _useState = useState(initialItems),
1108
1124
  _useState2 = _slicedToArray(_useState, 2),
1109
- items = _useState2[0],
1125
+ pageItems = _useState2[0],
1110
1126
  setItems = _useState2[1];
1111
- var onItemsChange = useCallback(function (pageItems) {
1112
- setItems(pageItems);
1127
+ var disabled = pageItems === null || pageItems.length < 1;
1128
+ var onItemsChange = useCallback(function (newPageItems) {
1129
+ setItems(newPageItems);
1113
1130
  }, [setItems]);
1114
- var disabled = initialItems === null || initialItems.length < 1;
1115
- var _useMediasForm = useMediasForm(),
1116
- currentMedia = _useMediasForm.media;
1117
1131
  var _useItemSelection = useItemSelection({
1118
- items: items,
1132
+ items: pageItems,
1119
1133
  selectedItems: initialSelectedItems,
1120
1134
  onSelectionChange: onChange,
1121
1135
  multipleSelection: multiple
1122
1136
  }),
1123
1137
  onSelectItem = _useItemSelection.onSelectItem,
1124
- onSelectItems = _useItemSelection.onSelectItems,
1125
1138
  onSelectPage = _useItemSelection.onSelectPage,
1126
1139
  onClearSelected = _useItemSelection.onClearSelected,
1127
1140
  pageSelected = _useItemSelection.pageSelected,
@@ -1132,36 +1145,24 @@ function MediasPicker(_ref) {
1132
1145
  onConfirm(selectedItems);
1133
1146
  }
1134
1147
  }, [selectedItems, onConfirm]);
1135
-
1136
- // const finalUploadButton = useMemo(
1137
- // () => ({
1138
- // ...(uploadButton || null),
1139
- // ...(types !== null ? { types } : null),
1140
- // allowMultipleUploads: multiple,
1141
- // maxNumberOfFiles: multiple ? 10 : 0,
1142
- // value: selectedItems,
1143
- // }),
1144
- // [uploadButton, selectedItems, multiple],
1145
- // );
1146
-
1147
1148
  return /*#__PURE__*/React.createElement("div", {
1148
1149
  className: className
1149
1150
  }, /*#__PURE__*/React.createElement(MediasBrowser, Object.assign({
1150
1151
  tableProps: _objectSpread({
1151
- selectable: multiple,
1152
+ selectable: true,
1152
1153
  multipleSelection: multiple,
1153
1154
  onSelectItem: onSelectItem,
1154
1155
  onSelectPage: onSelectPage,
1155
1156
  selectedItems: selectedItems,
1156
1157
  pageSelected: pageSelected
1157
1158
  }, tableProps),
1158
- items: items,
1159
- onSelectItem: onSelectItem,
1160
- onSelectItems: onSelectItems,
1159
+ items: initialItems // TODO: fix useItems if actually using this
1160
+ ,
1161
1161
  onItemsChange: onItemsChange,
1162
1162
  selectedCount: selectedCount,
1163
1163
  onClearSelected: onClearSelected,
1164
- types: types
1164
+ types: types,
1165
+ extraItems: !multiple && initialSelectedItems !== null ? [initialSelectedItems] : initialSelectedItems
1165
1166
  }, props)), multiple && !withoutButtons && currentMedia === null ? /*#__PURE__*/React.createElement("div", {
1166
1167
  className: "d-flex w-100 align-items-end justify-content-end mt-3"
1167
1168
  }, /*#__PURE__*/React.createElement("div", {
package/lib/index.js CHANGED
@@ -11,10 +11,12 @@ var hooks = require('@panneau/core/hooks');
11
11
  var Button = require('@panneau/element-button');
12
12
  var Form = require('@panneau/element-form');
13
13
  var FormStatus = require('@panneau/element-form-status');
14
+ var ImageDisplay = require('@panneau/display-image');
14
15
  var MediaPlayer = require('@panneau/element-media-player');
15
- var MediaPreview = require('@panneau/element-media-preview');
16
+ var _toConsumableArray = require('@babel/runtime/helpers/toConsumableArray');
16
17
  var _objectWithoutProperties = require('@babel/runtime/helpers/objectWithoutProperties');
17
18
  var _objectSpread = require('@babel/runtime/helpers/objectSpread2');
19
+ var uniqBy = require('lodash/uniqBy');
18
20
  var core = require('@panneau/core');
19
21
  var Buttons = require('@panneau/element-buttons');
20
22
  var Grid = require('@panneau/element-grid');
@@ -24,7 +26,6 @@ var Pagination = require('@panneau/element-pagination');
24
26
  var Table = require('@panneau/element-table');
25
27
  var Filters = require('@panneau/filter-filters');
26
28
  var data = require('@panneau/data');
27
- var _toConsumableArray = require('@babel/runtime/helpers/toConsumableArray');
28
29
 
29
30
  /* eslint-disable react/jsx-props-no-spreading */
30
31
  var MediasApiContext = /*#__PURE__*/React.createContext(null);
@@ -61,7 +62,7 @@ function MediasApiProvider(_ref) {
61
62
  MediasApiProvider.propTypes = propTypes$9;
62
63
  MediasApiProvider.defaultProps = defaultProps$9;
63
64
 
64
- var _excluded$7 = ["items", "pageItems"];
65
+ var _excluded$7 = ["items"];
65
66
  var useMedias = function useMedias() {
66
67
  var query = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
67
68
  var page = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
@@ -72,18 +73,18 @@ var useMedias = function useMedias() {
72
73
  var requestedPage = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
73
74
  return api.get(query, requestedPage, count);
74
75
  }, [api, query, count]);
75
- var _useItems = data.useItems(_objectSpread({
76
+ var _useItemsStore = data.useItemsStore('medias', _objectSpread({
76
77
  getPage: page !== null ? getItems : null,
77
78
  getItems: page === null ? getItems : null,
78
- page: page
79
+ page: page,
80
+ count: count,
81
+ query: query
79
82
  }, opts)),
80
- items = _useItems.items,
81
- pageItems = _useItems.pageItems,
82
- request = _objectWithoutProperties(_useItems, _excluded$7);
83
+ items = _useItemsStore.items,
84
+ props = _objectWithoutProperties(_useItemsStore, _excluded$7);
83
85
  return _objectSpread({
84
- medias: page !== null ? pageItems : items,
85
- allMedias: items
86
- }, request);
86
+ items: items
87
+ }, props);
87
88
  };
88
89
  var useMedias$1 = useMedias;
89
90
 
@@ -216,22 +217,18 @@ function MediaFrame(_ref) {
216
217
  setShowPlayer(!showPlayer);
217
218
  }, [showPlayer, setShowPlayer]);
218
219
  return /*#__PURE__*/React.createElement("div", {
219
- className: classNames([className, 'position-relative', _defineProperty({}, className, className != null)])
220
+ className: classNames([styles.mediaFrame, 'position-relative', 'd-flex', 'flex-grow-1', 'w-100', 'mw-100', _defineProperty({}, className, className != null)])
220
221
  }, showPlayer ? /*#__PURE__*/React.createElement(MediaPlayer, {
221
222
  value: value,
222
223
  width: "100%"
223
- }) : /*#__PURE__*/React.createElement(MediaPreview, {
224
+ }) : /*#__PURE__*/React.createElement(ImageDisplay, {
225
+ className: "w-100",
224
226
  value: value,
225
- width: "100%"
226
- }, /*#__PURE__*/React.createElement("div", {
227
- className: styles.playButton
228
- }, !showPlayer && (type === 'video' || type === 'embed' || type === 'audio') ? /*#__PURE__*/React.createElement(Button, {
229
- className: "rounded-circle",
230
- theme: "secondary",
231
- onClick: onClick,
232
- icon: "play-fill",
233
- size: "lg"
234
- }) : null)));
227
+ maxWidth: "100%",
228
+ maxHeight: "100%",
229
+ withoutZoom: true,
230
+ onClick: type === 'video' || type === 'audio' ? onClick : null
231
+ }));
235
232
  }
236
233
  MediaFrame.propTypes = propTypes$8;
237
234
  MediaFrame.defaultProps = defaultProps$8;
@@ -777,10 +774,8 @@ var _excluded$5 = ["page", "count"],
777
774
  _excluded2 = ["types"];
778
775
  var propTypes$5 = {
779
776
  items: core.PropTypes.medias,
777
+ extraItems: core.PropTypes.medias,
780
778
  types: PropTypes.arrayOf(PropTypes.string),
781
- // uploadButton: PropTypes.shape({
782
- // value: PropTypes.oneOfType([PanneauPropTypes.medias, PanneauPropTypes.media]),
783
- // }),
784
779
  buttons: core.PropTypes.buttons,
785
780
  filters: core.PropTypes.filters,
786
781
  columns: core.PropTypes.tableColumns,
@@ -791,16 +786,17 @@ var propTypes$5 = {
791
786
  layouts: PropTypes.arrayOf(PropTypes.shape({})),
792
787
  theme: PropTypes.string,
793
788
  tableProps: PropTypes.bool,
794
- onSelectItem: PropTypes.func,
795
- onSelectItems: PropTypes.func,
796
789
  onItemsChange: PropTypes.func,
797
790
  onLayoutChange: PropTypes.func,
798
791
  selectedCount: PropTypes.number,
799
792
  onClearSelected: PropTypes.func,
800
- className: PropTypes.string
793
+ withStickySelection: PropTypes.bool,
794
+ className: PropTypes.string,
795
+ buttonsClassName: PropTypes.string
801
796
  };
802
797
  var defaultProps$5 = {
803
798
  items: null,
799
+ extraItems: null,
804
800
  types: null,
805
801
  buttons: null,
806
802
  filters: defaultFilters,
@@ -822,16 +818,17 @@ var defaultProps$5 = {
822
818
  }],
823
819
  theme: null,
824
820
  tableProps: null,
825
- onSelectItem: null,
826
- onSelectItems: null,
827
821
  onItemsChange: null,
828
822
  onLayoutChange: null,
829
823
  selectedCount: null,
830
824
  onClearSelected: null,
831
- className: null
825
+ withStickySelection: false,
826
+ className: null,
827
+ buttonsClassName: null
832
828
  };
833
829
  function MediasBrowser(_ref) {
834
830
  var initialItems = _ref.items,
831
+ extraItems = _ref.extraItems,
835
832
  types = _ref.types,
836
833
  baseUrl = _ref.baseUrl,
837
834
  buttons = _ref.buttons,
@@ -843,13 +840,13 @@ function MediasBrowser(_ref) {
843
840
  layouts = _ref.layouts,
844
841
  theme = _ref.theme,
845
842
  tableProps = _ref.tableProps,
846
- onSelectItem = _ref.onSelectItem,
847
- onSelectItems = _ref.onSelectItems,
848
843
  onItemsChange = _ref.onItemsChange,
849
844
  onLayoutChange = _ref.onLayoutChange,
850
845
  selectedCount = _ref.selectedCount,
851
846
  onClearSelected = _ref.onClearSelected,
852
- className = _ref.className;
847
+ withStickySelection = _ref.withStickySelection,
848
+ className = _ref.className,
849
+ buttonsClassName = _ref.buttonsClassName;
853
850
  var _useState = React.useState(initialItems || null),
854
851
  _useState2 = _slicedToArray(_useState, 1),
855
852
  baseItems = _useState2[0];
@@ -892,10 +889,16 @@ function MediasBrowser(_ref) {
892
889
  var _useMedias = useMedias$1(query, page, count, {
893
890
  items: baseItems
894
891
  }),
895
- items = _useMedias.medias,
896
- loading = _useMedias.loading,
897
- lastPage = _useMedias.lastPage,
898
- total = _useMedias.total;
892
+ items = _useMedias.items,
893
+ allItems = _useMedias.allItems,
894
+ _useMedias$loading = _useMedias.loading,
895
+ loading = _useMedias$loading === void 0 ? false : _useMedias$loading,
896
+ _useMedias$updateItem = _useMedias.updateItem,
897
+ updateItem = _useMedias$updateItem === void 0 ? null : _useMedias$updateItem,
898
+ _useMedias$pagination = _useMedias.pagination,
899
+ _useMedias$pagination2 = _useMedias$pagination === void 0 ? {} : _useMedias$pagination,
900
+ lastPage = _useMedias$pagination2.lastPage,
901
+ total = _useMedias$pagination2.total;
899
902
 
900
903
  // For picker
901
904
  React.useEffect(function () {
@@ -927,17 +930,10 @@ function MediasBrowser(_ref) {
927
930
  var onCloseMedia = React.useCallback(function () {
928
931
  setCurrentMedia(null);
929
932
  }, [setCurrentMedia]);
930
-
931
- // TODO: context for this?
932
- React.useCallback(function () {
933
- var media = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
934
- onSelectItems(media);
935
- onQueryReset();
936
- }, [setCurrentMedia, onQueryReset, onSelectItems]);
937
- var onSaveMedia = React.useCallback(function () {
933
+ var onSaveMedia = React.useCallback(function (item) {
938
934
  setCurrentMedia(null);
939
- onQueryReset();
940
- }, [setCurrentMedia, onQueryReset]);
935
+ updateItem(item);
936
+ }, [setCurrentMedia, updateItem]);
941
937
  var pagination = /*#__PURE__*/React.createElement(Pagination, {
942
938
  page: page,
943
939
  lastPage: lastPage,
@@ -965,13 +961,31 @@ function MediasBrowser(_ref) {
965
961
  }
966
962
  return filters;
967
963
  }, [filters, types]);
964
+ var finalItems = React.useMemo(function () {
965
+ if (withStickySelection && extraItems !== null) {
966
+ return uniqBy([].concat(_toConsumableArray((extraItems || []).map(function (item) {
967
+ var _item$id = item.id,
968
+ itemId = _item$id === void 0 ? null : _item$id;
969
+ return (allItems || []).find(function () {
970
+ var _ref5 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
971
+ _ref5$id = _ref5.id,
972
+ otherId = _ref5$id === void 0 ? null : _ref5$id;
973
+ return otherId === itemId;
974
+ }) || item || null;
975
+ }).filter(function (it) {
976
+ return it !== null;
977
+ })), _toConsumableArray(items || [])), function (it) {
978
+ return it === null || it === void 0 ? void 0 : it.id;
979
+ });
980
+ }
981
+ return items;
982
+ }, [items, page, allItems, withStickySelection, extraItems]);
968
983
  return /*#__PURE__*/React.createElement("div", {
969
984
  className: classNames([styles.container, className])
970
985
  }, currentMedia !== null ? /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
971
986
  className: "mt-2 mb-4"
972
987
  }, /*#__PURE__*/React.createElement(Button, {
973
988
  theme: "primary",
974
- outline: true,
975
989
  onClick: onCloseMedia,
976
990
  icon: "arrow-left"
977
991
  }, /*#__PURE__*/React.createElement(reactIntl.FormattedMessage, {
@@ -987,7 +1001,6 @@ function MediasBrowser(_ref) {
987
1001
  onSave: onSaveMedia,
988
1002
  onClose: onCloseMedia
989
1003
  })) : /*#__PURE__*/React.createElement(React.Fragment, null, filters !== null ? /*#__PURE__*/React.createElement(Filters, {
990
- className: "mt-0 pt-0",
991
1004
  value: query,
992
1005
  clearValue: types !== null ? queryWithoutTypes : null,
993
1006
  filters: finalFilters,
@@ -996,12 +1009,12 @@ function MediasBrowser(_ref) {
996
1009
  theme: theme
997
1010
  }, buttons !== null ? /*#__PURE__*/React.createElement(Buttons, {
998
1011
  items: buttons,
999
- className: "ms-xl-auto"
1012
+ className: buttonsClassName
1000
1013
  }) : null) : null, filters === null && buttons !== null ? /*#__PURE__*/React.createElement("div", {
1001
1014
  className: "mt-2 mb-2"
1002
1015
  }, buttons !== null ? /*#__PURE__*/React.createElement(Buttons, {
1003
1016
  items: buttons,
1004
- className: "ms-xl-auto"
1017
+ className: buttonsClassName
1005
1018
  }) : null) : null, /*#__PURE__*/React.createElement("div", {
1006
1019
  className: classNames(['d-flex', 'mt-1', 'mb-3', {
1007
1020
  'justify-content-between': hasLayouts,
@@ -1028,29 +1041,28 @@ function MediasBrowser(_ref) {
1028
1041
  className: 'd-flex w-100',
1029
1042
  cardClassName: 'flex-grow-1',
1030
1043
  vertical: true,
1031
- selectable: onSelectItem !== null,
1032
1044
  onClickDescription: function onClickDescription(it) {
1033
1045
  onOpenMedia(it);
1034
1046
  }
1035
- }
1036
- }, tableProps, {
1037
- items: items || [],
1038
- loading: loading,
1039
- onSelectItem: onSelectItem !== null ? onSelectItem : function (it) {
1047
+ },
1048
+ onSelectItem: function onSelectItem(it) {
1040
1049
  return onOpenMedia(it);
1041
1050
  }
1051
+ }, tableProps, {
1052
+ items: finalItems || [],
1053
+ loading: loading
1042
1054
  })) : null, layout === 'table' ? /*#__PURE__*/React.createElement(Table, Object.assign({
1043
1055
  theme: theme,
1044
1056
  columns: columns,
1045
1057
  displayPlaceholder: /*#__PURE__*/React.createElement("span", {
1046
1058
  className: "text-secondary text-opacity-75"
1047
- }, "\u2014")
1059
+ }, "\u2014"),
1060
+ onSelectItem: function onSelectItem(it) {
1061
+ return onOpenMedia(it);
1062
+ }
1048
1063
  }, tableProps, {
1049
- items: items,
1064
+ items: finalItems,
1050
1065
  loading: loading,
1051
- onSelectItem: onSelectItem !== null ? onSelectItem : function (it) {
1052
- return onOpenMedia(it);
1053
- },
1054
1066
  actionsProps: {
1055
1067
  getEditPropsFromItem: function getEditPropsFromItem(it) {
1056
1068
  return {
@@ -1106,24 +1118,25 @@ function MediasPicker(_ref) {
1106
1118
  tableProps = _ref.tableProps,
1107
1119
  className = _ref.className,
1108
1120
  props = _objectWithoutProperties(_ref, _excluded$4);
1121
+ var _useMediasForm = useMediasForm(),
1122
+ currentMedia = _useMediasForm.media;
1123
+
1124
+ // For selection
1109
1125
  var _useState = React.useState(initialItems),
1110
1126
  _useState2 = _slicedToArray(_useState, 2),
1111
- items = _useState2[0],
1127
+ pageItems = _useState2[0],
1112
1128
  setItems = _useState2[1];
1113
- var onItemsChange = React.useCallback(function (pageItems) {
1114
- setItems(pageItems);
1129
+ var disabled = pageItems === null || pageItems.length < 1;
1130
+ var onItemsChange = React.useCallback(function (newPageItems) {
1131
+ setItems(newPageItems);
1115
1132
  }, [setItems]);
1116
- var disabled = initialItems === null || initialItems.length < 1;
1117
- var _useMediasForm = useMediasForm(),
1118
- currentMedia = _useMediasForm.media;
1119
1133
  var _useItemSelection = hooks.useItemSelection({
1120
- items: items,
1134
+ items: pageItems,
1121
1135
  selectedItems: initialSelectedItems,
1122
1136
  onSelectionChange: onChange,
1123
1137
  multipleSelection: multiple
1124
1138
  }),
1125
1139
  onSelectItem = _useItemSelection.onSelectItem,
1126
- onSelectItems = _useItemSelection.onSelectItems,
1127
1140
  onSelectPage = _useItemSelection.onSelectPage,
1128
1141
  onClearSelected = _useItemSelection.onClearSelected,
1129
1142
  pageSelected = _useItemSelection.pageSelected,
@@ -1134,36 +1147,24 @@ function MediasPicker(_ref) {
1134
1147
  onConfirm(selectedItems);
1135
1148
  }
1136
1149
  }, [selectedItems, onConfirm]);
1137
-
1138
- // const finalUploadButton = useMemo(
1139
- // () => ({
1140
- // ...(uploadButton || null),
1141
- // ...(types !== null ? { types } : null),
1142
- // allowMultipleUploads: multiple,
1143
- // maxNumberOfFiles: multiple ? 10 : 0,
1144
- // value: selectedItems,
1145
- // }),
1146
- // [uploadButton, selectedItems, multiple],
1147
- // );
1148
-
1149
1150
  return /*#__PURE__*/React.createElement("div", {
1150
1151
  className: className
1151
1152
  }, /*#__PURE__*/React.createElement(MediasBrowser, Object.assign({
1152
1153
  tableProps: _objectSpread({
1153
- selectable: multiple,
1154
+ selectable: true,
1154
1155
  multipleSelection: multiple,
1155
1156
  onSelectItem: onSelectItem,
1156
1157
  onSelectPage: onSelectPage,
1157
1158
  selectedItems: selectedItems,
1158
1159
  pageSelected: pageSelected
1159
1160
  }, tableProps),
1160
- items: items,
1161
- onSelectItem: onSelectItem,
1162
- onSelectItems: onSelectItems,
1161
+ items: initialItems // TODO: fix useItems if actually using this
1162
+ ,
1163
1163
  onItemsChange: onItemsChange,
1164
1164
  selectedCount: selectedCount,
1165
1165
  onClearSelected: onClearSelected,
1166
- types: types
1166
+ types: types,
1167
+ extraItems: !multiple && initialSelectedItems !== null ? [initialSelectedItems] : initialSelectedItems
1167
1168
  }, props)), multiple && !withoutButtons && currentMedia === null ? /*#__PURE__*/React.createElement("div", {
1168
1169
  className: "d-flex w-100 align-items-end justify-content-end mt-3"
1169
1170
  }, /*#__PURE__*/React.createElement("div", {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@panneau/medias",
3
- "version": "3.0.171",
3
+ "version": "3.0.173",
4
4
  "description": "",
5
5
  "keywords": [
6
6
  "javascript"
@@ -47,16 +47,16 @@
47
47
  "dependencies": {
48
48
  "@babel/runtime": "^7.12.5",
49
49
  "@panneau/core": "^3.0.169",
50
- "@panneau/data": "^3.0.169",
50
+ "@panneau/data": "^3.0.173",
51
+ "@panneau/display-image": "^3.0.172",
51
52
  "@panneau/element-button": "^3.0.169",
52
53
  "@panneau/element-buttons": "^3.0.169",
53
54
  "@panneau/element-form": "^3.0.169",
54
55
  "@panneau/element-form-status": "^3.0.169",
55
- "@panneau/element-grid": "^3.0.169",
56
+ "@panneau/element-grid": "^3.0.172",
56
57
  "@panneau/element-icon": "^3.0.169",
57
- "@panneau/element-media-card": "^3.0.171",
58
- "@panneau/element-media-player": "^3.0.169",
59
- "@panneau/element-media-preview": "^3.0.169",
58
+ "@panneau/element-media-card": "^3.0.172",
59
+ "@panneau/element-media-player": "^3.0.172",
60
60
  "@panneau/element-pagination": "^3.0.169",
61
61
  "@panneau/element-table": "^3.0.170",
62
62
  "@panneau/filter-filters": "^3.0.171",
@@ -68,5 +68,5 @@
68
68
  "publishConfig": {
69
69
  "access": "public"
70
70
  },
71
- "gitHead": "38e041e7659ef78ddbec9da1232c1456366c2040"
71
+ "gitHead": "29037e4f0ed74d81586442a76daffcfb6d062200"
72
72
  }