@panneau/medias 3.0.181 → 3.0.183

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 (3) hide show
  1. package/es/index.js +114 -86
  2. package/lib/index.js +113 -85
  3. package/package.json +17 -16
package/es/index.js CHANGED
@@ -5,7 +5,7 @@ import PropTypes from 'prop-types';
5
5
  import React, { useContext, useMemo, useCallback, useState, useEffect } from 'react';
6
6
  import { FormattedMessage } from 'react-intl';
7
7
  import { useFieldComponent, usePanneauResource } from '@panneau/core/contexts';
8
- import { useForm, useQuery, useItemSelection } from '@panneau/core/hooks';
8
+ import { useForm, useQuery } 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';
@@ -14,6 +14,7 @@ import MediaPlayer from '@panneau/element-media-player';
14
14
  import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';
15
15
  import _objectWithoutProperties from '@babel/runtime/helpers/objectWithoutProperties';
16
16
  import _objectSpread from '@babel/runtime/helpers/objectSpread2';
17
+ import isArray from 'lodash/isArray';
17
18
  import uniqBy from 'lodash/uniqBy';
18
19
  import { PropTypes as PropTypes$1 } from '@panneau/core';
19
20
  import Buttons from '@panneau/element-buttons';
@@ -22,6 +23,7 @@ import Icon from '@panneau/element-icon';
22
23
  import MediaCard from '@panneau/element-media-card';
23
24
  import Pagination from '@panneau/element-pagination';
24
25
  import Table from '@panneau/element-table';
26
+ import UploadField from '@panneau/field-upload';
25
27
  import Filters from '@panneau/filter-filters';
26
28
  import { useItemsStore, useData, useApi } from '@panneau/data';
27
29
 
@@ -486,9 +488,12 @@ function MediaForm(_ref) {
486
488
  }, /*#__PURE__*/React.createElement("nav", {
487
489
  className: "navbar d-flex w-100 align-items-end justify-content-between border-bottom mb-3"
488
490
  }, /*#__PURE__*/React.createElement("div", {
489
- className: "d-flex align-items-end justify-content-end mb-1"
491
+ className: "d-flex align-items-end justify-content-start mb-1",
492
+ style: {
493
+ maxWidth: '66%'
494
+ }
490
495
  }, /*#__PURE__*/React.createElement("h4", {
491
- className: "d-inline text-break mb-0"
496
+ className: "d-inline text-truncate mb-0"
492
497
  }, name), /*#__PURE__*/React.createElement("span", {
493
498
  className: "mx-2"
494
499
  }, type)), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(Button, {
@@ -513,7 +518,7 @@ function MediaForm(_ref) {
513
518
  })), onSave !== null ? /*#__PURE__*/React.createElement(Button, {
514
519
  className: "mb-1 mt-1",
515
520
  theme: "primary",
516
- icon: changed ? 'check-all' : 'check',
521
+ icon: changed ? 'check' : 'check',
517
522
  iconPosition: "right",
518
523
  onClick: onSubmit,
519
524
  disabled: !changed || updating || deleting
@@ -729,7 +734,8 @@ var defaultColumns = [{
729
734
  var defaultFilters = [{
730
735
  id: 'search',
731
736
  component: 'search',
732
- name: 'search'
737
+ name: 'search',
738
+ width: 220
733
739
  }, {
734
740
  id: 'types',
735
741
  component: 'select',
@@ -806,7 +812,6 @@ var propTypes$5 = {
806
812
  items: PropTypes$1.medias,
807
813
  extraItems: PropTypes$1.medias,
808
814
  types: PropTypes.arrayOf(PropTypes.string),
809
- buttons: PropTypes$1.buttons,
810
815
  filters: PropTypes$1.filters,
811
816
  columns: PropTypes$1.tableColumns,
812
817
  query: PropTypes.shape({}),
@@ -815,22 +820,24 @@ var propTypes$5 = {
815
820
  layout: PropTypes.string,
816
821
  layouts: PropTypes.arrayOf(PropTypes.shape({})),
817
822
  theme: PropTypes.string,
818
- tableProps: PropTypes.bool,
823
+ onUpload: PropTypes.func,
819
824
  onItemsChange: PropTypes.func,
820
825
  onLayoutChange: PropTypes.func,
821
- selectedCount: PropTypes.number,
822
- onClearSelected: PropTypes.func,
826
+ selectable: PropTypes.bool,
827
+ selectedItems: PropTypes.arrayOf(PropTypes.shape({})),
828
+ onSelectionChange: PropTypes.func,
829
+ multipleSelection: PropTypes.bool,
830
+ uppyConfig: PropTypes.shape({}),
823
831
  withTrash: PropTypes.bool,
824
832
  withStickySelection: PropTypes.bool,
833
+ withoutUpload: PropTypes.bool,
825
834
  className: PropTypes.string,
826
- buttonsClassName: PropTypes.string,
827
835
  formChildren: PropTypes.node
828
836
  };
829
837
  var defaultProps$5 = {
830
838
  items: null,
831
839
  extraItems: null,
832
840
  types: null,
833
- buttons: null,
834
841
  filters: defaultFilters,
835
842
  columns: defaultColumns,
836
843
  fields: defaultFields,
@@ -849,15 +856,18 @@ var defaultProps$5 = {
849
856
  })
850
857
  }],
851
858
  theme: null,
852
- tableProps: null,
859
+ onUpload: null,
853
860
  onItemsChange: null,
854
861
  onLayoutChange: null,
855
- selectedCount: null,
856
- onClearSelected: null,
862
+ selectable: null,
863
+ selectedItems: null,
864
+ onSelectionChange: null,
865
+ multipleSelection: false,
866
+ uppyConfig: null,
857
867
  withTrash: false,
858
868
  withStickySelection: false,
869
+ withoutUpload: false,
859
870
  className: null,
860
- buttonsClassName: null,
861
871
  formChildren: null
862
872
  };
863
873
  function MediasBrowser(_ref) {
@@ -865,7 +875,6 @@ function MediasBrowser(_ref) {
865
875
  extraItems = _ref.extraItems,
866
876
  types = _ref.types,
867
877
  baseUrl = _ref.baseUrl,
868
- buttons = _ref.buttons,
869
878
  filters = _ref.filters,
870
879
  columns = _ref.columns,
871
880
  fields = _ref.fields,
@@ -873,15 +882,18 @@ function MediasBrowser(_ref) {
873
882
  initialLayout = _ref.layout,
874
883
  layouts = _ref.layouts,
875
884
  theme = _ref.theme,
876
- tableProps = _ref.tableProps,
885
+ onUpload = _ref.onUpload,
877
886
  onItemsChange = _ref.onItemsChange,
878
887
  onLayoutChange = _ref.onLayoutChange,
879
- selectedCount = _ref.selectedCount,
880
- onClearSelected = _ref.onClearSelected,
888
+ selectable = _ref.selectable,
889
+ selectedItems = _ref.selectedItems,
890
+ onSelectionChange = _ref.onSelectionChange,
891
+ multipleSelection = _ref.multipleSelection,
892
+ uppyConfig = _ref.uppyConfig,
881
893
  withTrash = _ref.withTrash,
882
894
  withStickySelection = _ref.withStickySelection,
895
+ withoutUpload = _ref.withoutUpload,
883
896
  className = _ref.className,
884
- buttonsClassName = _ref.buttonsClassName,
885
897
  formChildren = _ref.formChildren;
886
898
  var _useState = useState(initialItems || null),
887
899
  _useState2 = _slicedToArray(_useState, 1),
@@ -951,7 +963,8 @@ function MediasBrowser(_ref) {
951
963
  lastPage = _useMedias$pagination2.lastPage,
952
964
  total = _useMedias$pagination2.total,
953
965
  _useMedias$pages = _useMedias.pages,
954
- pages = _useMedias$pages === void 0 ? null : _useMedias$pages;
966
+ pages = _useMedias$pages === void 0 ? null : _useMedias$pages,
967
+ reload = _useMedias.reload;
955
968
 
956
969
  // For picker
957
970
  useEffect(function () {
@@ -987,6 +1000,21 @@ function MediasBrowser(_ref) {
987
1000
  setCurrentMedia(null);
988
1001
  updateItem(item);
989
1002
  }, [setCurrentMedia, updateItem]);
1003
+ var onMediaUploaded = useCallback(function (medias) {
1004
+ var rawMedias = isArray(medias) ? medias : [medias];
1005
+ if (onUpload !== null) {
1006
+ onUpload(rawMedias).then(function (newMedias) {
1007
+ if (onSelectionChange !== null) {
1008
+ onSelectionChange(newMedias);
1009
+ reload();
1010
+ }
1011
+ });
1012
+ }
1013
+ if (onSelectionChange !== null) {
1014
+ onSelectionChange(rawMedias);
1015
+ reload();
1016
+ }
1017
+ }, [onUpload]);
990
1018
  var pagination = /*#__PURE__*/React.createElement(Pagination, {
991
1019
  page: page,
992
1020
  lastPage: lastPage,
@@ -996,8 +1024,10 @@ function MediasBrowser(_ref) {
996
1024
  onClickPage: onPageChange,
997
1025
  theme: theme,
998
1026
  loading: loading && pages !== null,
999
- selectedCount: selectedCount,
1000
- onClearSelected: onClearSelected,
1027
+ selectable: selectable,
1028
+ selectedItems: selectedItems,
1029
+ onSelectionChange: onSelectionChange,
1030
+ multipleSelection: multipleSelection,
1001
1031
  withPreviousNext: true,
1002
1032
  alwaysShowButtons: true
1003
1033
  });
@@ -1065,7 +1095,7 @@ function MediasBrowser(_ref) {
1065
1095
  return /*#__PURE__*/React.createElement("div", {
1066
1096
  className: className
1067
1097
  }, currentMedia !== null ? /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
1068
- className: "mt-2 mb-4"
1098
+ className: "mt-2 mb-0"
1069
1099
  }, /*#__PURE__*/React.createElement(Button, {
1070
1100
  theme: "primary",
1071
1101
  onClick: onCloseMedia,
@@ -1083,29 +1113,29 @@ function MediasBrowser(_ref) {
1083
1113
  onSave: onSaveMedia,
1084
1114
  onClose: onCloseMedia,
1085
1115
  withTrash: withTrash
1086
- }, formChildren)) : /*#__PURE__*/React.createElement(React.Fragment, null, filters !== null ? /*#__PURE__*/React.createElement(Filters, {
1116
+ }, formChildren)) : /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
1117
+ className: classNames(['d-flex', 'justify-content-between'])
1118
+ }, filters !== null ? /*#__PURE__*/React.createElement(Filters, {
1087
1119
  value: query,
1088
1120
  clearValue: types !== null ? queryWithoutTypes : null,
1089
1121
  filters: finalFilters,
1090
1122
  onChange: onQueryChange,
1091
1123
  onReset: onQueryReset,
1092
1124
  theme: theme
1093
- }, buttons !== null ? /*#__PURE__*/React.createElement(Buttons, {
1094
- items: buttons,
1095
- className: buttonsClassName
1096
- }) : null) : null, filters === null && buttons !== null ? /*#__PURE__*/React.createElement("div", {
1097
- className: "mt-2 mb-2"
1098
- }, /*#__PURE__*/React.createElement(Buttons, {
1099
- items: buttons,
1100
- className: buttonsClassName
1101
- })) : null, /*#__PURE__*/React.createElement("div", {
1125
+ }) : null, !withoutUpload ? /*#__PURE__*/React.createElement(UploadField, {
1126
+ className: "ms-auto w-auto text-nowrap mt-2",
1127
+ withButton: true,
1128
+ withoutMedia: true,
1129
+ uppyConfig: uppyConfig,
1130
+ onChange: onMediaUploaded
1131
+ }) : null), /*#__PURE__*/React.createElement("div", {
1102
1132
  className: classNames(['d-flex', 'mt-1', 'mb-3', {
1103
1133
  'justify-content-between': hasLayouts,
1104
1134
  'justify-content-end': !hasLayouts
1105
1135
  }])
1106
1136
  }, hasLayouts ? /*#__PURE__*/React.createElement(Buttons, {
1107
1137
  size: "sm",
1108
- theme: "primary",
1138
+ theme: "secondary",
1109
1139
  outline: true,
1110
1140
  items: (layouts || []).map(function (lay) {
1111
1141
  return _objectSpread(_objectSpread({}, lay), {}, {
@@ -1116,7 +1146,7 @@ function MediasBrowser(_ref) {
1116
1146
  className: 'px-3'
1117
1147
  });
1118
1148
  })
1119
- }) : null, pagination), layout === 'grid' ? /*#__PURE__*/React.createElement(Grid, Object.assign({
1149
+ }) : null, pagination), layout === 'grid' ? /*#__PURE__*/React.createElement(Grid, {
1120
1150
  size: "small",
1121
1151
  theme: theme,
1122
1152
  component: MediaCard,
@@ -1128,22 +1158,22 @@ function MediasBrowser(_ref) {
1128
1158
  onOpenMedia(it);
1129
1159
  }
1130
1160
  },
1131
- onSelectItem: function onSelectItem(it) {
1132
- return onOpenMedia(it);
1133
- }
1134
- }, tableProps, {
1161
+ selectable: selectable,
1162
+ selectedItems: selectedItems,
1163
+ onSelectionChange: onSelectionChange,
1164
+ multipleSelection: multipleSelection,
1135
1165
  items: finalItems || [],
1136
1166
  loading: loading
1137
- })) : null, layout === 'table' ? /*#__PURE__*/React.createElement(Table, Object.assign({
1167
+ }) : null, layout === 'table' ? /*#__PURE__*/React.createElement(Table, {
1138
1168
  theme: theme,
1139
1169
  columns: finalColumns,
1140
1170
  displayPlaceholder: /*#__PURE__*/React.createElement("span", {
1141
1171
  className: "text-secondary text-opacity-75"
1142
1172
  }, "\u2014"),
1143
- onSelectItem: function onSelectItem(it) {
1144
- return onOpenMedia(it);
1145
- }
1146
- }, tableProps, {
1173
+ selectable: selectable,
1174
+ selectedItems: selectedItems,
1175
+ onSelectionChange: onSelectionChange,
1176
+ multipleSelection: multipleSelection,
1147
1177
  items: finalItems,
1148
1178
  loading: loading,
1149
1179
  actionsProps: {
@@ -1169,49 +1199,45 @@ function MediasBrowser(_ref) {
1169
1199
  };
1170
1200
  }
1171
1201
  }
1172
- })) : null, /*#__PURE__*/React.createElement("div", {
1202
+ }) : null, /*#__PURE__*/React.createElement("div", {
1173
1203
  className: classNames(['d-flex', 'mt-3', 'mb-1', 'justify-content-end'])
1174
1204
  }, pagination)));
1175
1205
  }
1176
1206
  MediasBrowser.propTypes = propTypes$5;
1177
1207
  MediasBrowser.defaultProps = defaultProps$5;
1178
1208
 
1179
- var _excluded$4 = ["items", "value", "types", "onChange", "onConfirm", "onClose", "multiple", "withoutButtons", "tableProps", "className"];
1209
+ var _excluded$4 = ["items", "value", "onSelectionChange", "multipleSelection", "types", "onChange", "onClose", "withoutButtons", "className"];
1180
1210
  var propTypes$4 = {
1181
1211
  // eslint-disable-next-line react/forbid-prop-types
1182
1212
  items: PropTypes.arrayOf(PropTypes.shape({})),
1183
1213
  value: PropTypes.arrayOf(PropTypes.shape({})),
1214
+ onSelectionChange: PropTypes.func,
1215
+ multipleSelection: PropTypes.bool,
1184
1216
  types: PropTypes.arrayOf(PropTypes.string),
1185
1217
  onChange: PropTypes.func.isRequired,
1186
- onConfirm: PropTypes.func.isRequired,
1187
1218
  onClose: PropTypes.func,
1188
- multiple: PropTypes.bool,
1189
1219
  withoutButtons: PropTypes.bool,
1190
- tableProps: PropTypes.shape({
1191
- theme: PropTypes.string
1192
- }),
1193
1220
  className: PropTypes.string
1194
1221
  };
1195
1222
  var defaultProps$4 = {
1196
1223
  items: null,
1197
1224
  value: null,
1225
+ onSelectionChange: null,
1226
+ multipleSelection: false,
1198
1227
  types: null,
1199
1228
  onClose: null,
1200
- multiple: false,
1201
1229
  withoutButtons: false,
1202
- tableProps: null,
1203
1230
  className: null
1204
1231
  };
1205
1232
  function MediasPicker(_ref) {
1206
1233
  var initialItems = _ref.items,
1207
1234
  initialSelectedItems = _ref.value,
1235
+ parentOnSelectionChange = _ref.onSelectionChange,
1236
+ multipleSelection = _ref.multipleSelection,
1208
1237
  types = _ref.types,
1209
1238
  onChange = _ref.onChange,
1210
- onConfirm = _ref.onConfirm,
1211
1239
  onClose = _ref.onClose,
1212
- multiple = _ref.multiple,
1213
1240
  withoutButtons = _ref.withoutButtons,
1214
- tableProps = _ref.tableProps,
1215
1241
  className = _ref.className,
1216
1242
  props = _objectWithoutProperties(_ref, _excluded$4);
1217
1243
  var _useMediasForm = useMediasForm(),
@@ -1226,42 +1252,44 @@ function MediasPicker(_ref) {
1226
1252
  var onItemsChange = useCallback(function (newPageItems) {
1227
1253
  setItems(newPageItems);
1228
1254
  }, [setItems]);
1229
- var _useItemSelection = useItemSelection({
1230
- items: pageItems,
1231
- selectedItems: initialSelectedItems,
1232
- onSelectionChange: onChange,
1233
- multipleSelection: multiple
1234
- }),
1235
- onSelectItem = _useItemSelection.onSelectItem,
1236
- onSelectPage = _useItemSelection.onSelectPage,
1237
- onClearSelected = _useItemSelection.onClearSelected,
1238
- pageSelected = _useItemSelection.pageSelected,
1239
- selectedCount = _useItemSelection.selectedCount,
1240
- selectedItems = _useItemSelection.selectedItems;
1255
+ var _useState3 = useState(initialSelectedItems || null),
1256
+ _useState4 = _slicedToArray(_useState3, 2),
1257
+ selectedItems = _useState4[0],
1258
+ setSelectedItems = _useState4[1];
1259
+ var onSelectionChange = useCallback(function (newSelection) {
1260
+ setSelectedItems(newSelection);
1261
+ }, [setSelectedItems]);
1262
+ // Sync from the top
1263
+ useEffect(function () {
1264
+ setSelectedItems(initialSelectedItems);
1265
+ }, [initialSelectedItems, setSelectedItems]);
1266
+ useEffect(function () {
1267
+ if (parentOnSelectionChange !== null) {
1268
+ parentOnSelectionChange(selectedItems);
1269
+ }
1270
+ }, [selectedItems, parentOnSelectionChange]);
1241
1271
  var onConfirmSelection = useCallback(function () {
1242
- if (onConfirm !== null) {
1243
- onConfirm(selectedItems);
1272
+ if (onChange !== null) {
1273
+ onChange(selectedItems);
1244
1274
  }
1245
- }, [selectedItems, onConfirm]);
1275
+ }, [selectedItems, onChange]);
1246
1276
  return /*#__PURE__*/React.createElement("div", {
1247
1277
  className: className
1248
1278
  }, /*#__PURE__*/React.createElement(MediasBrowser, Object.assign({
1249
- tableProps: _objectSpread({
1250
- selectable: true,
1251
- multipleSelection: multiple,
1252
- onSelectItem: onSelectItem,
1253
- onSelectPage: onSelectPage,
1254
- selectedItems: selectedItems,
1255
- pageSelected: pageSelected
1256
- }, tableProps)
1257
- // items={initialItems} // TODO: fix useItems if actually using this
1279
+ items: initialItems // TODO: fix useItems if actually using this
1258
1280
  ,
1281
+ selectable: true,
1282
+ selectedItems: selectedItems,
1283
+ onSelectionChange: onSelectionChange,
1284
+ multipleSelection: multipleSelection,
1259
1285
  onItemsChange: onItemsChange,
1260
- selectedCount: selectedCount,
1261
- onClearSelected: onClearSelected,
1262
- types: types,
1263
- extraItems: !multiple && initialSelectedItems !== null ? [initialSelectedItems] : initialSelectedItems
1264
- }, props)), multiple && !withoutButtons && currentMedia === null ? /*#__PURE__*/React.createElement("div", {
1286
+ types: types
1287
+ // extraItems={
1288
+ // !multiple && initialSelectedItems !== null
1289
+ // ? [initialSelectedItems]
1290
+ // : initialSelectedItems
1291
+ // }
1292
+ }, props)), !withoutButtons && currentMedia === null ? /*#__PURE__*/React.createElement("div", {
1265
1293
  className: "d-flex w-100 align-items-end justify-content-end mt-3"
1266
1294
  }, /*#__PURE__*/React.createElement("div", {
1267
1295
  className: "btn-group"
package/lib/index.js CHANGED
@@ -16,6 +16,7 @@ var MediaPlayer = require('@panneau/element-media-player');
16
16
  var _toConsumableArray = require('@babel/runtime/helpers/toConsumableArray');
17
17
  var _objectWithoutProperties = require('@babel/runtime/helpers/objectWithoutProperties');
18
18
  var _objectSpread = require('@babel/runtime/helpers/objectSpread2');
19
+ var isArray = require('lodash/isArray');
19
20
  var uniqBy = require('lodash/uniqBy');
20
21
  var core = require('@panneau/core');
21
22
  var Buttons = require('@panneau/element-buttons');
@@ -24,6 +25,7 @@ var Icon = require('@panneau/element-icon');
24
25
  var MediaCard = require('@panneau/element-media-card');
25
26
  var Pagination = require('@panneau/element-pagination');
26
27
  var Table = require('@panneau/element-table');
28
+ var UploadField = require('@panneau/field-upload');
27
29
  var Filters = require('@panneau/filter-filters');
28
30
  var data = require('@panneau/data');
29
31
 
@@ -488,9 +490,12 @@ function MediaForm(_ref) {
488
490
  }, /*#__PURE__*/React.createElement("nav", {
489
491
  className: "navbar d-flex w-100 align-items-end justify-content-between border-bottom mb-3"
490
492
  }, /*#__PURE__*/React.createElement("div", {
491
- className: "d-flex align-items-end justify-content-end mb-1"
493
+ className: "d-flex align-items-end justify-content-start mb-1",
494
+ style: {
495
+ maxWidth: '66%'
496
+ }
492
497
  }, /*#__PURE__*/React.createElement("h4", {
493
- className: "d-inline text-break mb-0"
498
+ className: "d-inline text-truncate mb-0"
494
499
  }, name), /*#__PURE__*/React.createElement("span", {
495
500
  className: "mx-2"
496
501
  }, type)), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(Button, {
@@ -515,7 +520,7 @@ function MediaForm(_ref) {
515
520
  })), onSave !== null ? /*#__PURE__*/React.createElement(Button, {
516
521
  className: "mb-1 mt-1",
517
522
  theme: "primary",
518
- icon: changed ? 'check-all' : 'check',
523
+ icon: changed ? 'check' : 'check',
519
524
  iconPosition: "right",
520
525
  onClick: onSubmit,
521
526
  disabled: !changed || updating || deleting
@@ -731,7 +736,8 @@ var defaultColumns = [{
731
736
  var defaultFilters = [{
732
737
  id: 'search',
733
738
  component: 'search',
734
- name: 'search'
739
+ name: 'search',
740
+ width: 220
735
741
  }, {
736
742
  id: 'types',
737
743
  component: 'select',
@@ -808,7 +814,6 @@ var propTypes$5 = {
808
814
  items: core.PropTypes.medias,
809
815
  extraItems: core.PropTypes.medias,
810
816
  types: PropTypes.arrayOf(PropTypes.string),
811
- buttons: core.PropTypes.buttons,
812
817
  filters: core.PropTypes.filters,
813
818
  columns: core.PropTypes.tableColumns,
814
819
  query: PropTypes.shape({}),
@@ -817,22 +822,24 @@ var propTypes$5 = {
817
822
  layout: PropTypes.string,
818
823
  layouts: PropTypes.arrayOf(PropTypes.shape({})),
819
824
  theme: PropTypes.string,
820
- tableProps: PropTypes.bool,
825
+ onUpload: PropTypes.func,
821
826
  onItemsChange: PropTypes.func,
822
827
  onLayoutChange: PropTypes.func,
823
- selectedCount: PropTypes.number,
824
- onClearSelected: PropTypes.func,
828
+ selectable: PropTypes.bool,
829
+ selectedItems: PropTypes.arrayOf(PropTypes.shape({})),
830
+ onSelectionChange: PropTypes.func,
831
+ multipleSelection: PropTypes.bool,
832
+ uppyConfig: PropTypes.shape({}),
825
833
  withTrash: PropTypes.bool,
826
834
  withStickySelection: PropTypes.bool,
835
+ withoutUpload: PropTypes.bool,
827
836
  className: PropTypes.string,
828
- buttonsClassName: PropTypes.string,
829
837
  formChildren: PropTypes.node
830
838
  };
831
839
  var defaultProps$5 = {
832
840
  items: null,
833
841
  extraItems: null,
834
842
  types: null,
835
- buttons: null,
836
843
  filters: defaultFilters,
837
844
  columns: defaultColumns,
838
845
  fields: defaultFields,
@@ -851,15 +858,18 @@ var defaultProps$5 = {
851
858
  })
852
859
  }],
853
860
  theme: null,
854
- tableProps: null,
861
+ onUpload: null,
855
862
  onItemsChange: null,
856
863
  onLayoutChange: null,
857
- selectedCount: null,
858
- onClearSelected: null,
864
+ selectable: null,
865
+ selectedItems: null,
866
+ onSelectionChange: null,
867
+ multipleSelection: false,
868
+ uppyConfig: null,
859
869
  withTrash: false,
860
870
  withStickySelection: false,
871
+ withoutUpload: false,
861
872
  className: null,
862
- buttonsClassName: null,
863
873
  formChildren: null
864
874
  };
865
875
  function MediasBrowser(_ref) {
@@ -867,7 +877,6 @@ function MediasBrowser(_ref) {
867
877
  extraItems = _ref.extraItems,
868
878
  types = _ref.types,
869
879
  baseUrl = _ref.baseUrl,
870
- buttons = _ref.buttons,
871
880
  filters = _ref.filters,
872
881
  columns = _ref.columns,
873
882
  fields = _ref.fields,
@@ -875,15 +884,18 @@ function MediasBrowser(_ref) {
875
884
  initialLayout = _ref.layout,
876
885
  layouts = _ref.layouts,
877
886
  theme = _ref.theme,
878
- tableProps = _ref.tableProps,
887
+ onUpload = _ref.onUpload,
879
888
  onItemsChange = _ref.onItemsChange,
880
889
  onLayoutChange = _ref.onLayoutChange,
881
- selectedCount = _ref.selectedCount,
882
- onClearSelected = _ref.onClearSelected,
890
+ selectable = _ref.selectable,
891
+ selectedItems = _ref.selectedItems,
892
+ onSelectionChange = _ref.onSelectionChange,
893
+ multipleSelection = _ref.multipleSelection,
894
+ uppyConfig = _ref.uppyConfig,
883
895
  withTrash = _ref.withTrash,
884
896
  withStickySelection = _ref.withStickySelection,
897
+ withoutUpload = _ref.withoutUpload,
885
898
  className = _ref.className,
886
- buttonsClassName = _ref.buttonsClassName,
887
899
  formChildren = _ref.formChildren;
888
900
  var _useState = React.useState(initialItems || null),
889
901
  _useState2 = _slicedToArray(_useState, 1),
@@ -953,7 +965,8 @@ function MediasBrowser(_ref) {
953
965
  lastPage = _useMedias$pagination2.lastPage,
954
966
  total = _useMedias$pagination2.total,
955
967
  _useMedias$pages = _useMedias.pages,
956
- pages = _useMedias$pages === void 0 ? null : _useMedias$pages;
968
+ pages = _useMedias$pages === void 0 ? null : _useMedias$pages,
969
+ reload = _useMedias.reload;
957
970
 
958
971
  // For picker
959
972
  React.useEffect(function () {
@@ -989,6 +1002,21 @@ function MediasBrowser(_ref) {
989
1002
  setCurrentMedia(null);
990
1003
  updateItem(item);
991
1004
  }, [setCurrentMedia, updateItem]);
1005
+ var onMediaUploaded = React.useCallback(function (medias) {
1006
+ var rawMedias = isArray(medias) ? medias : [medias];
1007
+ if (onUpload !== null) {
1008
+ onUpload(rawMedias).then(function (newMedias) {
1009
+ if (onSelectionChange !== null) {
1010
+ onSelectionChange(newMedias);
1011
+ reload();
1012
+ }
1013
+ });
1014
+ }
1015
+ if (onSelectionChange !== null) {
1016
+ onSelectionChange(rawMedias);
1017
+ reload();
1018
+ }
1019
+ }, [onUpload]);
992
1020
  var pagination = /*#__PURE__*/React.createElement(Pagination, {
993
1021
  page: page,
994
1022
  lastPage: lastPage,
@@ -998,8 +1026,10 @@ function MediasBrowser(_ref) {
998
1026
  onClickPage: onPageChange,
999
1027
  theme: theme,
1000
1028
  loading: loading && pages !== null,
1001
- selectedCount: selectedCount,
1002
- onClearSelected: onClearSelected,
1029
+ selectable: selectable,
1030
+ selectedItems: selectedItems,
1031
+ onSelectionChange: onSelectionChange,
1032
+ multipleSelection: multipleSelection,
1003
1033
  withPreviousNext: true,
1004
1034
  alwaysShowButtons: true
1005
1035
  });
@@ -1067,7 +1097,7 @@ function MediasBrowser(_ref) {
1067
1097
  return /*#__PURE__*/React.createElement("div", {
1068
1098
  className: className
1069
1099
  }, currentMedia !== null ? /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
1070
- className: "mt-2 mb-4"
1100
+ className: "mt-2 mb-0"
1071
1101
  }, /*#__PURE__*/React.createElement(Button, {
1072
1102
  theme: "primary",
1073
1103
  onClick: onCloseMedia,
@@ -1085,29 +1115,29 @@ function MediasBrowser(_ref) {
1085
1115
  onSave: onSaveMedia,
1086
1116
  onClose: onCloseMedia,
1087
1117
  withTrash: withTrash
1088
- }, formChildren)) : /*#__PURE__*/React.createElement(React.Fragment, null, filters !== null ? /*#__PURE__*/React.createElement(Filters, {
1118
+ }, formChildren)) : /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
1119
+ className: classNames(['d-flex', 'justify-content-between'])
1120
+ }, filters !== null ? /*#__PURE__*/React.createElement(Filters, {
1089
1121
  value: query,
1090
1122
  clearValue: types !== null ? queryWithoutTypes : null,
1091
1123
  filters: finalFilters,
1092
1124
  onChange: onQueryChange,
1093
1125
  onReset: onQueryReset,
1094
1126
  theme: theme
1095
- }, buttons !== null ? /*#__PURE__*/React.createElement(Buttons, {
1096
- items: buttons,
1097
- className: buttonsClassName
1098
- }) : null) : null, filters === null && buttons !== null ? /*#__PURE__*/React.createElement("div", {
1099
- className: "mt-2 mb-2"
1100
- }, /*#__PURE__*/React.createElement(Buttons, {
1101
- items: buttons,
1102
- className: buttonsClassName
1103
- })) : null, /*#__PURE__*/React.createElement("div", {
1127
+ }) : null, !withoutUpload ? /*#__PURE__*/React.createElement(UploadField, {
1128
+ className: "ms-auto w-auto text-nowrap mt-2",
1129
+ withButton: true,
1130
+ withoutMedia: true,
1131
+ uppyConfig: uppyConfig,
1132
+ onChange: onMediaUploaded
1133
+ }) : null), /*#__PURE__*/React.createElement("div", {
1104
1134
  className: classNames(['d-flex', 'mt-1', 'mb-3', {
1105
1135
  'justify-content-between': hasLayouts,
1106
1136
  'justify-content-end': !hasLayouts
1107
1137
  }])
1108
1138
  }, hasLayouts ? /*#__PURE__*/React.createElement(Buttons, {
1109
1139
  size: "sm",
1110
- theme: "primary",
1140
+ theme: "secondary",
1111
1141
  outline: true,
1112
1142
  items: (layouts || []).map(function (lay) {
1113
1143
  return _objectSpread(_objectSpread({}, lay), {}, {
@@ -1118,7 +1148,7 @@ function MediasBrowser(_ref) {
1118
1148
  className: 'px-3'
1119
1149
  });
1120
1150
  })
1121
- }) : null, pagination), layout === 'grid' ? /*#__PURE__*/React.createElement(Grid, Object.assign({
1151
+ }) : null, pagination), layout === 'grid' ? /*#__PURE__*/React.createElement(Grid, {
1122
1152
  size: "small",
1123
1153
  theme: theme,
1124
1154
  component: MediaCard,
@@ -1130,22 +1160,22 @@ function MediasBrowser(_ref) {
1130
1160
  onOpenMedia(it);
1131
1161
  }
1132
1162
  },
1133
- onSelectItem: function onSelectItem(it) {
1134
- return onOpenMedia(it);
1135
- }
1136
- }, tableProps, {
1163
+ selectable: selectable,
1164
+ selectedItems: selectedItems,
1165
+ onSelectionChange: onSelectionChange,
1166
+ multipleSelection: multipleSelection,
1137
1167
  items: finalItems || [],
1138
1168
  loading: loading
1139
- })) : null, layout === 'table' ? /*#__PURE__*/React.createElement(Table, Object.assign({
1169
+ }) : null, layout === 'table' ? /*#__PURE__*/React.createElement(Table, {
1140
1170
  theme: theme,
1141
1171
  columns: finalColumns,
1142
1172
  displayPlaceholder: /*#__PURE__*/React.createElement("span", {
1143
1173
  className: "text-secondary text-opacity-75"
1144
1174
  }, "\u2014"),
1145
- onSelectItem: function onSelectItem(it) {
1146
- return onOpenMedia(it);
1147
- }
1148
- }, tableProps, {
1175
+ selectable: selectable,
1176
+ selectedItems: selectedItems,
1177
+ onSelectionChange: onSelectionChange,
1178
+ multipleSelection: multipleSelection,
1149
1179
  items: finalItems,
1150
1180
  loading: loading,
1151
1181
  actionsProps: {
@@ -1171,49 +1201,45 @@ function MediasBrowser(_ref) {
1171
1201
  };
1172
1202
  }
1173
1203
  }
1174
- })) : null, /*#__PURE__*/React.createElement("div", {
1204
+ }) : null, /*#__PURE__*/React.createElement("div", {
1175
1205
  className: classNames(['d-flex', 'mt-3', 'mb-1', 'justify-content-end'])
1176
1206
  }, pagination)));
1177
1207
  }
1178
1208
  MediasBrowser.propTypes = propTypes$5;
1179
1209
  MediasBrowser.defaultProps = defaultProps$5;
1180
1210
 
1181
- var _excluded$4 = ["items", "value", "types", "onChange", "onConfirm", "onClose", "multiple", "withoutButtons", "tableProps", "className"];
1211
+ var _excluded$4 = ["items", "value", "onSelectionChange", "multipleSelection", "types", "onChange", "onClose", "withoutButtons", "className"];
1182
1212
  var propTypes$4 = {
1183
1213
  // eslint-disable-next-line react/forbid-prop-types
1184
1214
  items: PropTypes.arrayOf(PropTypes.shape({})),
1185
1215
  value: PropTypes.arrayOf(PropTypes.shape({})),
1216
+ onSelectionChange: PropTypes.func,
1217
+ multipleSelection: PropTypes.bool,
1186
1218
  types: PropTypes.arrayOf(PropTypes.string),
1187
1219
  onChange: PropTypes.func.isRequired,
1188
- onConfirm: PropTypes.func.isRequired,
1189
1220
  onClose: PropTypes.func,
1190
- multiple: PropTypes.bool,
1191
1221
  withoutButtons: PropTypes.bool,
1192
- tableProps: PropTypes.shape({
1193
- theme: PropTypes.string
1194
- }),
1195
1222
  className: PropTypes.string
1196
1223
  };
1197
1224
  var defaultProps$4 = {
1198
1225
  items: null,
1199
1226
  value: null,
1227
+ onSelectionChange: null,
1228
+ multipleSelection: false,
1200
1229
  types: null,
1201
1230
  onClose: null,
1202
- multiple: false,
1203
1231
  withoutButtons: false,
1204
- tableProps: null,
1205
1232
  className: null
1206
1233
  };
1207
1234
  function MediasPicker(_ref) {
1208
1235
  var initialItems = _ref.items,
1209
1236
  initialSelectedItems = _ref.value,
1237
+ parentOnSelectionChange = _ref.onSelectionChange,
1238
+ multipleSelection = _ref.multipleSelection,
1210
1239
  types = _ref.types,
1211
1240
  onChange = _ref.onChange,
1212
- onConfirm = _ref.onConfirm,
1213
1241
  onClose = _ref.onClose,
1214
- multiple = _ref.multiple,
1215
1242
  withoutButtons = _ref.withoutButtons,
1216
- tableProps = _ref.tableProps,
1217
1243
  className = _ref.className,
1218
1244
  props = _objectWithoutProperties(_ref, _excluded$4);
1219
1245
  var _useMediasForm = useMediasForm(),
@@ -1228,42 +1254,44 @@ function MediasPicker(_ref) {
1228
1254
  var onItemsChange = React.useCallback(function (newPageItems) {
1229
1255
  setItems(newPageItems);
1230
1256
  }, [setItems]);
1231
- var _useItemSelection = hooks.useItemSelection({
1232
- items: pageItems,
1233
- selectedItems: initialSelectedItems,
1234
- onSelectionChange: onChange,
1235
- multipleSelection: multiple
1236
- }),
1237
- onSelectItem = _useItemSelection.onSelectItem,
1238
- onSelectPage = _useItemSelection.onSelectPage,
1239
- onClearSelected = _useItemSelection.onClearSelected,
1240
- pageSelected = _useItemSelection.pageSelected,
1241
- selectedCount = _useItemSelection.selectedCount,
1242
- selectedItems = _useItemSelection.selectedItems;
1257
+ var _useState3 = React.useState(initialSelectedItems || null),
1258
+ _useState4 = _slicedToArray(_useState3, 2),
1259
+ selectedItems = _useState4[0],
1260
+ setSelectedItems = _useState4[1];
1261
+ var onSelectionChange = React.useCallback(function (newSelection) {
1262
+ setSelectedItems(newSelection);
1263
+ }, [setSelectedItems]);
1264
+ // Sync from the top
1265
+ React.useEffect(function () {
1266
+ setSelectedItems(initialSelectedItems);
1267
+ }, [initialSelectedItems, setSelectedItems]);
1268
+ React.useEffect(function () {
1269
+ if (parentOnSelectionChange !== null) {
1270
+ parentOnSelectionChange(selectedItems);
1271
+ }
1272
+ }, [selectedItems, parentOnSelectionChange]);
1243
1273
  var onConfirmSelection = React.useCallback(function () {
1244
- if (onConfirm !== null) {
1245
- onConfirm(selectedItems);
1274
+ if (onChange !== null) {
1275
+ onChange(selectedItems);
1246
1276
  }
1247
- }, [selectedItems, onConfirm]);
1277
+ }, [selectedItems, onChange]);
1248
1278
  return /*#__PURE__*/React.createElement("div", {
1249
1279
  className: className
1250
1280
  }, /*#__PURE__*/React.createElement(MediasBrowser, Object.assign({
1251
- tableProps: _objectSpread({
1252
- selectable: true,
1253
- multipleSelection: multiple,
1254
- onSelectItem: onSelectItem,
1255
- onSelectPage: onSelectPage,
1256
- selectedItems: selectedItems,
1257
- pageSelected: pageSelected
1258
- }, tableProps)
1259
- // items={initialItems} // TODO: fix useItems if actually using this
1281
+ items: initialItems // TODO: fix useItems if actually using this
1260
1282
  ,
1283
+ selectable: true,
1284
+ selectedItems: selectedItems,
1285
+ onSelectionChange: onSelectionChange,
1286
+ multipleSelection: multipleSelection,
1261
1287
  onItemsChange: onItemsChange,
1262
- selectedCount: selectedCount,
1263
- onClearSelected: onClearSelected,
1264
- types: types,
1265
- extraItems: !multiple && initialSelectedItems !== null ? [initialSelectedItems] : initialSelectedItems
1266
- }, props)), multiple && !withoutButtons && currentMedia === null ? /*#__PURE__*/React.createElement("div", {
1288
+ types: types
1289
+ // extraItems={
1290
+ // !multiple && initialSelectedItems !== null
1291
+ // ? [initialSelectedItems]
1292
+ // : initialSelectedItems
1293
+ // }
1294
+ }, props)), !withoutButtons && currentMedia === null ? /*#__PURE__*/React.createElement("div", {
1267
1295
  className: "d-flex w-100 align-items-end justify-content-end mt-3"
1268
1296
  }, /*#__PURE__*/React.createElement("div", {
1269
1297
  className: "btn-group"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@panneau/medias",
3
- "version": "3.0.181",
3
+ "version": "3.0.183",
4
4
  "description": "",
5
5
  "keywords": [
6
6
  "javascript"
@@ -46,20 +46,21 @@
46
46
  },
47
47
  "dependencies": {
48
48
  "@babel/runtime": "^7.12.5",
49
- "@panneau/core": "^3.0.176",
50
- "@panneau/data": "^3.0.178",
51
- "@panneau/display-image": "^3.0.181",
52
- "@panneau/element-button": "^3.0.177",
53
- "@panneau/element-buttons": "^3.0.177",
54
- "@panneau/element-form": "^3.0.177",
55
- "@panneau/element-form-status": "^3.0.176",
56
- "@panneau/element-grid": "^3.0.176",
57
- "@panneau/element-icon": "^3.0.176",
58
- "@panneau/element-media-card": "^3.0.177",
59
- "@panneau/element-media-player": "^3.0.176",
60
- "@panneau/element-pagination": "^3.0.177",
61
- "@panneau/element-table": "^3.0.177",
62
- "@panneau/filter-filters": "^3.0.177",
49
+ "@panneau/core": "^3.0.182",
50
+ "@panneau/data": "^3.0.182",
51
+ "@panneau/display-image": "^3.0.182",
52
+ "@panneau/element-button": "^3.0.182",
53
+ "@panneau/element-buttons": "^3.0.182",
54
+ "@panneau/element-form": "^3.0.182",
55
+ "@panneau/element-form-status": "^3.0.182",
56
+ "@panneau/element-grid": "^3.0.182",
57
+ "@panneau/element-icon": "^3.0.182",
58
+ "@panneau/element-media-card": "^3.0.182",
59
+ "@panneau/element-media-player": "^3.0.182",
60
+ "@panneau/element-pagination": "^3.0.182",
61
+ "@panneau/element-table": "^3.0.182",
62
+ "@panneau/field-upload": "^3.0.182",
63
+ "@panneau/filter-filters": "^3.0.182",
63
64
  "classnames": "^2.5.1",
64
65
  "lodash": "^4.17.21",
65
66
  "prop-types": "^15.7.2",
@@ -68,5 +69,5 @@
68
69
  "publishConfig": {
69
70
  "access": "public"
70
71
  },
71
- "gitHead": "d9cec00d148ce400f0fea0e2dd110e9632b189d4"
72
+ "gitHead": "1a43436f1a5e0db3a0b2951138e9280b21220467"
72
73
  }