@panneau/field-resource-item 2.0.72 → 2.0.77

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 +152 -90
  2. package/lib/index.js +151 -89
  3. package/package.json +10 -10
package/es/index.js CHANGED
@@ -7,7 +7,7 @@ import get from 'lodash/get';
7
7
  import isArray from 'lodash/isArray';
8
8
  import isEmpty from 'lodash/isEmpty';
9
9
  import PropTypes from 'prop-types';
10
- import React, { useState, useMemo, useCallback } from 'react';
10
+ import React, { useState, useCallback, useMemo } from 'react';
11
11
  import { useIntl, FormattedMessage } from 'react-intl';
12
12
  import { PropTypes as PropTypes$1 } from '@panneau/core';
13
13
  import { usePanneauResource } from '@panneau/core/contexts';
@@ -27,6 +27,7 @@ var propTypes = {
27
27
  errors: PropTypes$1.formErrors,
28
28
  resource: PropTypes.string,
29
29
  resourceType: PropTypes.string,
30
+ paginated: PropTypes.bool,
30
31
  query: PropTypes.object,
31
32
  // eslint-disable-line react/forbid-prop-types
32
33
  page: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
@@ -45,8 +46,10 @@ var propTypes = {
45
46
  itemLabelWithId: PropTypes.bool,
46
47
  placeholder: PropTypes.string,
47
48
  canCreate: PropTypes.bool,
48
- createInPlace: PropTypes.bool,
49
- createButtonLabel: PropTypes.string,
49
+ canEdit: PropTypes.bool,
50
+ withoutModal: PropTypes.bool,
51
+ createButtonLabel: PropTypes$1.string,
52
+ editButtonLabel: PropTypes$1.message,
50
53
  multiple: PropTypes.bool,
51
54
  disabled: PropTypes.bool,
52
55
  className: PropTypes.string,
@@ -59,6 +62,7 @@ var defaultProps = {
59
62
  errors: null,
60
63
  resource: null,
61
64
  resourceType: null,
65
+ paginated: true,
62
66
  query: null,
63
67
  page: null,
64
68
  count: null,
@@ -73,8 +77,10 @@ var defaultProps = {
73
77
  itemLabelWithId: false,
74
78
  placeholder: null,
75
79
  canCreate: false,
76
- createInPlace: false,
80
+ canEdit: false,
81
+ withoutModal: false,
77
82
  createButtonLabel: null,
83
+ editButtonLabel: null,
78
84
  multiple: false,
79
85
  disabled: false,
80
86
  className: null,
@@ -82,12 +88,13 @@ var defaultProps = {
82
88
  onChange: null
83
89
  };
84
90
  var ResourceItemField = function ResourceItemField(_ref) {
85
- var _ref8;
91
+ var _ref9;
86
92
  var name = _ref.name,
87
93
  value = _ref.value,
88
94
  errors = _ref.errors,
89
95
  resourceId = _ref.resource,
90
96
  resourceType = _ref.resourceType,
97
+ paginated = _ref.paginated,
91
98
  initialQuery = _ref.query,
92
99
  initialPage = _ref.page,
93
100
  initialCount = _ref.count,
@@ -102,45 +109,53 @@ var ResourceItemField = function ResourceItemField(_ref) {
102
109
  itemLabelWithId = _ref.itemLabelWithId,
103
110
  placeholder = _ref.placeholder,
104
111
  canCreate = _ref.canCreate,
105
- createInPlace = _ref.createInPlace,
112
+ canEdit = _ref.canEdit,
113
+ withoutModal = _ref.withoutModal,
106
114
  createButtonLabel = _ref.createButtonLabel,
115
+ editButtonLabel = _ref.editButtonLabel,
107
116
  multiple = _ref.multiple,
108
117
  disabled = _ref.disabled,
109
118
  className = _ref.className,
110
119
  inputClassName = _ref.inputClassName,
111
120
  onChange = _ref.onChange;
112
121
  var intl = useIntl();
122
+ var resource = usePanneauResource(resourceId);
123
+ var resourceValues = useResourceValues(resource);
124
+ var defaultPage = initialPage || (paginated ? 1 : null);
125
+ var defaultCount = initialCount || (paginated ? 10 : null);
113
126
  // const [initialValue] = useState(value);
114
- var _useState = useState(initialQuery),
127
+
128
+ var _useState = useState(initialCount),
115
129
  _useState2 = _slicedToArray(_useState, 2),
116
- query = _useState2[0];
117
- _useState2[1];
118
- var _useState3 = useState(initialPage),
130
+ formOpen = _useState2[0],
131
+ setFormOpen = _useState2[1];
132
+
133
+ // The text input search query
134
+ var _useState3 = useState(''),
119
135
  _useState4 = _slicedToArray(_useState3, 2),
120
- page = _useState4[0];
121
- _useState4[1];
122
- var _useState5 = useState(initialCount),
136
+ inputTextValue = _useState4[0],
137
+ setInputTextValue = _useState4[1];
138
+ var onInputChange = useCallback(function (textValue) {
139
+ setInputTextValue(textValue);
140
+ }, []);
141
+
142
+ // TODO: list state controls?
143
+ var _useState5 = useState(initialQuery),
123
144
  _useState6 = _slicedToArray(_useState5, 2),
124
- count = _useState6[0];
145
+ query = _useState6[0];
125
146
  _useState6[1];
126
- var _useState7 = useState(initialOptions),
147
+ var _useState7 = useState(defaultPage),
127
148
  _useState8 = _slicedToArray(_useState7, 2),
128
- resourceOptions = _useState8[0];
129
- _useState8[1];
130
-
131
- // The create option
132
- var _useState9 = useState(initialCount),
149
+ page = _useState8[0],
150
+ setPage = _useState8[1];
151
+ var _useState9 = useState(defaultCount),
133
152
  _useState10 = _slicedToArray(_useState9, 2),
134
- createOpen = _useState10[0],
135
- setCreateOpen = _useState10[1];
136
-
137
- // The search query
138
- var _useState11 = useState(''),
153
+ count = _useState10[0];
154
+ _useState10[1];
155
+ var _useState11 = useState(initialOptions),
139
156
  _useState12 = _slicedToArray(_useState11, 2),
140
- inputTextValue = _useState12[0],
141
- setInputTextValue = _useState12[1];
142
- var resource = usePanneauResource(resourceId);
143
- var resourceValues = useResourceValues(resource);
157
+ resourceOptions = _useState12[0];
158
+ _useState12[1];
144
159
  var queryResource = useMemo(function () {
145
160
  return {
146
161
  id: resourceId
@@ -148,19 +163,36 @@ var ResourceItemField = function ResourceItemField(_ref) {
148
163
  }, [resourceId]);
149
164
  var finalQuery = useMemo(function () {
150
165
  return _objectSpread(_objectSpread(_objectSpread({}, query), !isEmpty(inputTextValue) ? _defineProperty({}, searchParamName, inputTextValue) : null), {}, {
151
- paginated: false // TODO: implement this...
166
+ paginated: paginated
152
167
  });
153
- }, [inputTextValue]);
154
-
155
- // console.log('resource', resourceId, resource);
156
-
157
- var resourceItems = useResourceItems(queryResource, finalQuery, page, count, resourceOptions);
168
+ }, [inputTextValue, paginated]);
169
+ var resourceItems = useResourceItems(queryResource, finalQuery, paginated ? page : null, paginated ? count : null, resourceOptions);
158
170
  var _ref3 = resourceItems || {},
159
- _ref3$items = _ref3.items,
160
- partialItems = _ref3$items === void 0 ? null : _ref3$items;
171
+ _ref3$allItems = _ref3.allItems,
172
+ partialItems = _ref3$allItems === void 0 ? null : _ref3$allItems,
173
+ _ref3$reload = _ref3.reload,
174
+ reload = _ref3$reload === void 0 ? null : _ref3$reload,
175
+ _ref3$reloadPage = _ref3.reloadPage,
176
+ reloadPage = _ref3$reloadPage === void 0 ? null : _ref3$reloadPage,
177
+ _ref3$reset = _ref3.reset,
178
+ reset = _ref3$reset === void 0 ? null : _ref3$reset,
179
+ _ref3$lastPage = _ref3.lastPage,
180
+ lastPage = _ref3$lastPage === void 0 ? null : _ref3$lastPage;
161
181
  var items = (partialItems || []).concat(multiple && isArray(value) ? value : [value]).filter(function (it) {
162
182
  return it !== null;
183
+ }).filter(function (v, i, a) {
184
+ return a.findIndex(function (v2) {
185
+ return v2.id === v.id;
186
+ }) === i;
163
187
  });
188
+ var onScrollEnd = useCallback(function () {
189
+ if (page !== null && page >= lastPage) {
190
+ return;
191
+ }
192
+ if (paginated) {
193
+ setPage(page + 1);
194
+ }
195
+ }, [paginated, page, setPage, lastPage]);
164
196
  var getItemLabel = useCallback(function (it, path) {
165
197
  var id = get(it, 'id', null);
166
198
  if (itemLabelWithId) {
@@ -178,45 +210,32 @@ var ResourceItemField = function ResourceItemField(_ref) {
178
210
  label: finalLabel
179
211
  };
180
212
  }, [getItemLabel, getItemDescription, itemLabelPath, itemDescriptionPath]);
181
- var partialValue = multiple && isArray(value) ? value.map(function (it) {
182
- return parseItem(it);
183
- }) : value || null;
184
- var finalValue = multiple && isArray(partialValue) ? partialValue.map(function (_ref4) {
213
+ var finalValue = multiple && isArray(value) ? value.map(function (_ref4) {
185
214
  var _ref4$id = _ref4.id,
186
215
  id = _ref4$id === void 0 ? null : _ref4$id;
187
216
  return id;
188
217
  }) : (value === null || value === void 0 ? void 0 : value.id) || null;
218
+ var _ref5 = !multiple && value !== null ? value : {
219
+ type: resourceType
220
+ },
221
+ _ref5$type = _ref5.type,
222
+ finalType = _ref5$type === void 0 ? null : _ref5$type;
189
223
  var options = (items || []).map(function (it) {
190
224
  return parseItem(it);
191
225
  });
192
-
193
- // TODO: filter duplicate IDs blabla
194
- // const { id: valueId = null } = value || {};
195
- // const filteredItems =
196
- // responseItems !== null && valueId !== null
197
- // ? responseItems.filter((it) => (it !== null && it.id ? it.id !== valueId : true))
198
- // : responseItems || [];
199
- // const arrayedValue = multiple ? value : [value];
200
- // const items = [...filteredItems, ...(value !== null ? arrayedValue : [])];
201
- // console.log(options, items, value, finalValue, onChange);
202
- // console.log('ultimate', options, finalValue);
203
-
204
- var onInputChange = useCallback(function (textValue) {
205
- setInputTextValue(textValue);
206
- }, []);
207
226
  var onValueChange = useCallback(function (newId) {
208
227
  if (onChange === null) return;
209
228
  if (multiple) {
210
- var newValue = items.filter(function (_ref5) {
211
- var _ref5$id = _ref5.id,
212
- id = _ref5$id === void 0 ? null : _ref5$id;
229
+ var newValue = items.filter(function (_ref6) {
230
+ var _ref6$id = _ref6.id,
231
+ id = _ref6$id === void 0 ? null : _ref6$id;
213
232
  return newId.indexOf(id) !== -1;
214
233
  }) || [];
215
234
  onChange(newValue);
216
235
  } else {
217
- var _newValue = items.filter(function (_ref6) {
218
- var _ref6$id = _ref6.id,
219
- id = _ref6$id === void 0 ? null : _ref6$id;
236
+ var _newValue = items.filter(function (_ref7) {
237
+ var _ref7$id = _ref7.id,
238
+ id = _ref7$id === void 0 ? null : _ref7$id;
220
239
  return id === newId;
221
240
  }) || [];
222
241
  if (_newValue !== null && _newValue.length > 0) {
@@ -226,13 +245,13 @@ var ResourceItemField = function ResourceItemField(_ref) {
226
245
  }
227
246
  }
228
247
  }, [items, onChange, multiple]);
229
- var onOpenCreate = useCallback(function () {
230
- setCreateOpen(true);
231
- }, [setCreateOpen]);
232
- var onCloseCreate = useCallback(function () {
233
- setCreateOpen(false);
234
- }, [setCreateOpen]);
235
- var onCreateSuccess = useCallback(function (newValue) {
248
+ var onOpenForm = useCallback(function () {
249
+ setFormOpen(true);
250
+ }, [setFormOpen]);
251
+ var onCloseForm = useCallback(function () {
252
+ setFormOpen(false);
253
+ }, [setFormOpen]);
254
+ var onFormSuccess = useCallback(function (newValue) {
236
255
  if (onChange === null) return;
237
256
  var finalNewValue = resourceType !== null ? _objectSpread({
238
257
  type: resourceType
@@ -242,16 +261,45 @@ var ResourceItemField = function ResourceItemField(_ref) {
242
261
  } else {
243
262
  onChange(finalNewValue);
244
263
  }
245
- setCreateOpen(false);
246
- }, [onChange, multiple, value, setCreateOpen, resourceType]);
264
+ setFormOpen(false);
265
+ }, [onChange, multiple, value, setFormOpen, resourceType, paginated, initialPage]);
266
+
267
+ // If empty try to fetch
268
+ var onFocus = useCallback(function () {
269
+ if ((partialItems || []).length === 0) {
270
+ if (paginated) {
271
+ reloadPage();
272
+ } else {
273
+ reload();
274
+ }
275
+ }
276
+ }, [paginated, partialItems]);
247
277
  var onClickRemove = useCallback(function () {
248
278
  if (onChange !== null) {
249
279
  onChange(null);
250
280
  }
251
- }, [onChange]);
281
+ // Clear the page and be good
282
+ if (paginated) {
283
+ setPage(defaultPage);
284
+ reset();
285
+ } else {
286
+ reset();
287
+ }
288
+ }, [onChange, paginated, defaultPage, reload, reloadPage, reset]);
289
+ var form = formOpen ? /*#__PURE__*/React.createElement(ResourceForm, {
290
+ resource: resource,
291
+ type: finalType,
292
+ item: !multiple ? value : null,
293
+ onSuccess: onFormSuccess
294
+ }) : null;
252
295
  return /*#__PURE__*/React.createElement("div", {
253
296
  className: classNames(['position-relative', _defineProperty({}, className, className != null)])
254
- }, value !== null && !multiple ? /*#__PURE__*/React.createElement(ResourceCard, {
297
+ }, value !== null && !multiple ? /*#__PURE__*/React.createElement("div", {
298
+ className: "row"
299
+ }, /*#__PURE__*/React.createElement("div", {
300
+ className: "col-10 flex-grow-1"
301
+ }, /*#__PURE__*/React.createElement(ResourceCard, {
302
+ className: "flex-grow-1",
255
303
  item: value,
256
304
  getItemLabel: initialGetItemLabel,
257
305
  getItemDescription: getItemDescription,
@@ -262,12 +310,20 @@ var ResourceItemField = function ResourceItemField(_ref) {
262
310
  itemLabelWithId: itemLabelWithId,
263
311
  disable: disabled,
264
312
  onClickRemove: onClickRemove
265
- }) : /*#__PURE__*/React.createElement("div", {
266
- className: classNames(['row', 'align-items-center'])
313
+ })), canEdit && !multiple ? /*#__PURE__*/React.createElement("div", {
314
+ className: "col-auto"
315
+ }, /*#__PURE__*/React.createElement(Button, {
316
+ theme: "primary",
317
+ icon: editButtonLabel === null ? 'pencil-square' : null,
318
+ onClick: formOpen ? onCloseForm : onOpenForm,
319
+ outline: true,
320
+ disabled: finalValue === null
321
+ }, editButtonLabel)) : null) : /*#__PURE__*/React.createElement("div", {
322
+ className: "row align-items-center"
267
323
  }, /*#__PURE__*/React.createElement("div", {
268
- className: "col-auto flex-grow-1"
324
+ className: "col-10 flex-grow-1"
269
325
  }, /*#__PURE__*/React.createElement(Select, {
270
- className: classNames(['py-1', 'shadow-none', (_ref8 = {}, _defineProperty(_ref8, disabled, disabled), _defineProperty(_ref8, 'is-invalid', errors !== null), _defineProperty(_ref8, inputClassName, inputClassName !== null), _ref8)]),
326
+ className: classNames(['py-1', 'shadow-none', (_ref9 = {}, _defineProperty(_ref9, disabled, disabled), _defineProperty(_ref9, 'is-invalid', errors !== null), _defineProperty(_ref9, inputClassName, inputClassName !== null), _ref9)]),
271
327
  disabled: disabled,
272
328
  name: name,
273
329
  value: finalValue,
@@ -283,20 +339,30 @@ var ResourceItemField = function ResourceItemField(_ref) {
283
339
  }),
284
340
  onChange: onValueChange,
285
341
  onInputChange: onInputChange,
342
+ onFocus: onFocus,
343
+ onMenuScrollToBottom: onScrollEnd,
286
344
  multiple: multiple
287
345
  })), canCreate ? /*#__PURE__*/React.createElement("div", {
288
346
  className: "col-auto"
289
347
  }, /*#__PURE__*/React.createElement(Button, {
290
348
  theme: "primary",
291
349
  icon: createButtonLabel === null ? 'plus-lg' : null,
292
- onClick: createOpen ? onCloseCreate : onOpenCreate,
350
+ onClick: formOpen ? onCloseForm : onOpenForm,
293
351
  outline: true
294
- }, createButtonLabel)) : null, createOpen ? createInPlace ? /*#__PURE__*/React.createElement(ResourceForm, {
295
- resource: resource,
296
- type: resourceType,
297
- onSuccess: onCreateSuccess
298
- }) : /*#__PURE__*/React.createElement(Dialog, {
299
- title: /*#__PURE__*/React.createElement(FormattedMessage, {
352
+ }, createButtonLabel)) : null), formOpen ? withoutModal ? /*#__PURE__*/React.createElement("div", {
353
+ className: "card mt-4 p-4"
354
+ }, form) : /*#__PURE__*/React.createElement(Dialog, {
355
+ title: !multiple && value !== null ? /*#__PURE__*/React.createElement(FormattedMessage, {
356
+ values: resourceValues,
357
+ id: "mCfzkJ",
358
+ defaultMessage: [{
359
+ "type": 0,
360
+ "value": "Edit "
361
+ }, {
362
+ "type": 1,
363
+ "value": "a_singular"
364
+ }]
365
+ }) : /*#__PURE__*/React.createElement(FormattedMessage, {
300
366
  values: resourceValues,
301
367
  id: "6viUpq",
302
368
  defaultMessage: [{
@@ -308,12 +374,8 @@ var ResourceItemField = function ResourceItemField(_ref) {
308
374
  }]
309
375
  }),
310
376
  size: "lg",
311
- onClickClose: onCloseCreate
312
- }, /*#__PURE__*/React.createElement(ResourceForm, {
313
- resource: resource,
314
- type: resourceType,
315
- onSuccess: onCreateSuccess
316
- })) : null));
377
+ onClickClose: onCloseForm
378
+ }, form) : null);
317
379
  };
318
380
  ResourceItemField.propTypes = propTypes;
319
381
  ResourceItemField.defaultProps = defaultProps;
package/lib/index.js CHANGED
@@ -49,6 +49,7 @@ var propTypes = {
49
49
  errors: core.PropTypes.formErrors,
50
50
  resource: PropTypes__default["default"].string,
51
51
  resourceType: PropTypes__default["default"].string,
52
+ paginated: PropTypes__default["default"].bool,
52
53
  query: PropTypes__default["default"].object,
53
54
  // eslint-disable-line react/forbid-prop-types
54
55
  page: PropTypes__default["default"].oneOfType([PropTypes__default["default"].number, PropTypes__default["default"].string]),
@@ -67,8 +68,10 @@ var propTypes = {
67
68
  itemLabelWithId: PropTypes__default["default"].bool,
68
69
  placeholder: PropTypes__default["default"].string,
69
70
  canCreate: PropTypes__default["default"].bool,
70
- createInPlace: PropTypes__default["default"].bool,
71
- createButtonLabel: PropTypes__default["default"].string,
71
+ canEdit: PropTypes__default["default"].bool,
72
+ withoutModal: PropTypes__default["default"].bool,
73
+ createButtonLabel: core.PropTypes.string,
74
+ editButtonLabel: core.PropTypes.message,
72
75
  multiple: PropTypes__default["default"].bool,
73
76
  disabled: PropTypes__default["default"].bool,
74
77
  className: PropTypes__default["default"].string,
@@ -81,6 +84,7 @@ var defaultProps = {
81
84
  errors: null,
82
85
  resource: null,
83
86
  resourceType: null,
87
+ paginated: true,
84
88
  query: null,
85
89
  page: null,
86
90
  count: null,
@@ -95,8 +99,10 @@ var defaultProps = {
95
99
  itemLabelWithId: false,
96
100
  placeholder: null,
97
101
  canCreate: false,
98
- createInPlace: false,
102
+ canEdit: false,
103
+ withoutModal: false,
99
104
  createButtonLabel: null,
105
+ editButtonLabel: null,
100
106
  multiple: false,
101
107
  disabled: false,
102
108
  className: null,
@@ -104,12 +110,13 @@ var defaultProps = {
104
110
  onChange: null
105
111
  };
106
112
  var ResourceItemField = function ResourceItemField(_ref) {
107
- var _ref8;
113
+ var _ref9;
108
114
  var name = _ref.name,
109
115
  value = _ref.value,
110
116
  errors = _ref.errors,
111
117
  resourceId = _ref.resource,
112
118
  resourceType = _ref.resourceType,
119
+ paginated = _ref.paginated,
113
120
  initialQuery = _ref.query,
114
121
  initialPage = _ref.page,
115
122
  initialCount = _ref.count,
@@ -124,45 +131,53 @@ var ResourceItemField = function ResourceItemField(_ref) {
124
131
  itemLabelWithId = _ref.itemLabelWithId,
125
132
  placeholder = _ref.placeholder,
126
133
  canCreate = _ref.canCreate,
127
- createInPlace = _ref.createInPlace,
134
+ canEdit = _ref.canEdit,
135
+ withoutModal = _ref.withoutModal,
128
136
  createButtonLabel = _ref.createButtonLabel,
137
+ editButtonLabel = _ref.editButtonLabel,
129
138
  multiple = _ref.multiple,
130
139
  disabled = _ref.disabled,
131
140
  className = _ref.className,
132
141
  inputClassName = _ref.inputClassName,
133
142
  onChange = _ref.onChange;
134
143
  var intl$1 = reactIntl.useIntl();
144
+ var resource = contexts.usePanneauResource(resourceId);
145
+ var resourceValues = intl.useResourceValues(resource);
146
+ var defaultPage = initialPage || (paginated ? 1 : null);
147
+ var defaultCount = initialCount || (paginated ? 10 : null);
135
148
  // const [initialValue] = useState(value);
136
- var _useState = React.useState(initialQuery),
149
+
150
+ var _useState = React.useState(initialCount),
137
151
  _useState2 = _slicedToArray__default["default"](_useState, 2),
138
- query = _useState2[0];
139
- _useState2[1];
140
- var _useState3 = React.useState(initialPage),
152
+ formOpen = _useState2[0],
153
+ setFormOpen = _useState2[1];
154
+
155
+ // The text input search query
156
+ var _useState3 = React.useState(''),
141
157
  _useState4 = _slicedToArray__default["default"](_useState3, 2),
142
- page = _useState4[0];
143
- _useState4[1];
144
- var _useState5 = React.useState(initialCount),
158
+ inputTextValue = _useState4[0],
159
+ setInputTextValue = _useState4[1];
160
+ var onInputChange = React.useCallback(function (textValue) {
161
+ setInputTextValue(textValue);
162
+ }, []);
163
+
164
+ // TODO: list state controls?
165
+ var _useState5 = React.useState(initialQuery),
145
166
  _useState6 = _slicedToArray__default["default"](_useState5, 2),
146
- count = _useState6[0];
167
+ query = _useState6[0];
147
168
  _useState6[1];
148
- var _useState7 = React.useState(initialOptions),
169
+ var _useState7 = React.useState(defaultPage),
149
170
  _useState8 = _slicedToArray__default["default"](_useState7, 2),
150
- resourceOptions = _useState8[0];
151
- _useState8[1];
152
-
153
- // The create option
154
- var _useState9 = React.useState(initialCount),
171
+ page = _useState8[0],
172
+ setPage = _useState8[1];
173
+ var _useState9 = React.useState(defaultCount),
155
174
  _useState10 = _slicedToArray__default["default"](_useState9, 2),
156
- createOpen = _useState10[0],
157
- setCreateOpen = _useState10[1];
158
-
159
- // The search query
160
- var _useState11 = React.useState(''),
175
+ count = _useState10[0];
176
+ _useState10[1];
177
+ var _useState11 = React.useState(initialOptions),
161
178
  _useState12 = _slicedToArray__default["default"](_useState11, 2),
162
- inputTextValue = _useState12[0],
163
- setInputTextValue = _useState12[1];
164
- var resource = contexts.usePanneauResource(resourceId);
165
- var resourceValues = intl.useResourceValues(resource);
179
+ resourceOptions = _useState12[0];
180
+ _useState12[1];
166
181
  var queryResource = React.useMemo(function () {
167
182
  return {
168
183
  id: resourceId
@@ -170,19 +185,36 @@ var ResourceItemField = function ResourceItemField(_ref) {
170
185
  }, [resourceId]);
171
186
  var finalQuery = React.useMemo(function () {
172
187
  return _objectSpread__default["default"](_objectSpread__default["default"](_objectSpread__default["default"]({}, query), !isEmpty__default["default"](inputTextValue) ? _defineProperty__default["default"]({}, searchParamName, inputTextValue) : null), {}, {
173
- paginated: false // TODO: implement this...
188
+ paginated: paginated
174
189
  });
175
- }, [inputTextValue]);
176
-
177
- // console.log('resource', resourceId, resource);
178
-
179
- var resourceItems = data.useResourceItems(queryResource, finalQuery, page, count, resourceOptions);
190
+ }, [inputTextValue, paginated]);
191
+ var resourceItems = data.useResourceItems(queryResource, finalQuery, paginated ? page : null, paginated ? count : null, resourceOptions);
180
192
  var _ref3 = resourceItems || {},
181
- _ref3$items = _ref3.items,
182
- partialItems = _ref3$items === void 0 ? null : _ref3$items;
193
+ _ref3$allItems = _ref3.allItems,
194
+ partialItems = _ref3$allItems === void 0 ? null : _ref3$allItems,
195
+ _ref3$reload = _ref3.reload,
196
+ reload = _ref3$reload === void 0 ? null : _ref3$reload,
197
+ _ref3$reloadPage = _ref3.reloadPage,
198
+ reloadPage = _ref3$reloadPage === void 0 ? null : _ref3$reloadPage,
199
+ _ref3$reset = _ref3.reset,
200
+ reset = _ref3$reset === void 0 ? null : _ref3$reset,
201
+ _ref3$lastPage = _ref3.lastPage,
202
+ lastPage = _ref3$lastPage === void 0 ? null : _ref3$lastPage;
183
203
  var items = (partialItems || []).concat(multiple && isArray__default["default"](value) ? value : [value]).filter(function (it) {
184
204
  return it !== null;
205
+ }).filter(function (v, i, a) {
206
+ return a.findIndex(function (v2) {
207
+ return v2.id === v.id;
208
+ }) === i;
185
209
  });
210
+ var onScrollEnd = React.useCallback(function () {
211
+ if (page !== null && page >= lastPage) {
212
+ return;
213
+ }
214
+ if (paginated) {
215
+ setPage(page + 1);
216
+ }
217
+ }, [paginated, page, setPage, lastPage]);
186
218
  var getItemLabel = React.useCallback(function (it, path) {
187
219
  var id = get__default["default"](it, 'id', null);
188
220
  if (itemLabelWithId) {
@@ -200,45 +232,32 @@ var ResourceItemField = function ResourceItemField(_ref) {
200
232
  label: finalLabel
201
233
  };
202
234
  }, [getItemLabel, getItemDescription, itemLabelPath, itemDescriptionPath]);
203
- var partialValue = multiple && isArray__default["default"](value) ? value.map(function (it) {
204
- return parseItem(it);
205
- }) : value || null;
206
- var finalValue = multiple && isArray__default["default"](partialValue) ? partialValue.map(function (_ref4) {
235
+ var finalValue = multiple && isArray__default["default"](value) ? value.map(function (_ref4) {
207
236
  var _ref4$id = _ref4.id,
208
237
  id = _ref4$id === void 0 ? null : _ref4$id;
209
238
  return id;
210
239
  }) : (value === null || value === void 0 ? void 0 : value.id) || null;
240
+ var _ref5 = !multiple && value !== null ? value : {
241
+ type: resourceType
242
+ },
243
+ _ref5$type = _ref5.type,
244
+ finalType = _ref5$type === void 0 ? null : _ref5$type;
211
245
  var options = (items || []).map(function (it) {
212
246
  return parseItem(it);
213
247
  });
214
-
215
- // TODO: filter duplicate IDs blabla
216
- // const { id: valueId = null } = value || {};
217
- // const filteredItems =
218
- // responseItems !== null && valueId !== null
219
- // ? responseItems.filter((it) => (it !== null && it.id ? it.id !== valueId : true))
220
- // : responseItems || [];
221
- // const arrayedValue = multiple ? value : [value];
222
- // const items = [...filteredItems, ...(value !== null ? arrayedValue : [])];
223
- // console.log(options, items, value, finalValue, onChange);
224
- // console.log('ultimate', options, finalValue);
225
-
226
- var onInputChange = React.useCallback(function (textValue) {
227
- setInputTextValue(textValue);
228
- }, []);
229
248
  var onValueChange = React.useCallback(function (newId) {
230
249
  if (onChange === null) return;
231
250
  if (multiple) {
232
- var newValue = items.filter(function (_ref5) {
233
- var _ref5$id = _ref5.id,
234
- id = _ref5$id === void 0 ? null : _ref5$id;
251
+ var newValue = items.filter(function (_ref6) {
252
+ var _ref6$id = _ref6.id,
253
+ id = _ref6$id === void 0 ? null : _ref6$id;
235
254
  return newId.indexOf(id) !== -1;
236
255
  }) || [];
237
256
  onChange(newValue);
238
257
  } else {
239
- var _newValue = items.filter(function (_ref6) {
240
- var _ref6$id = _ref6.id,
241
- id = _ref6$id === void 0 ? null : _ref6$id;
258
+ var _newValue = items.filter(function (_ref7) {
259
+ var _ref7$id = _ref7.id,
260
+ id = _ref7$id === void 0 ? null : _ref7$id;
242
261
  return id === newId;
243
262
  }) || [];
244
263
  if (_newValue !== null && _newValue.length > 0) {
@@ -248,13 +267,13 @@ var ResourceItemField = function ResourceItemField(_ref) {
248
267
  }
249
268
  }
250
269
  }, [items, onChange, multiple]);
251
- var onOpenCreate = React.useCallback(function () {
252
- setCreateOpen(true);
253
- }, [setCreateOpen]);
254
- var onCloseCreate = React.useCallback(function () {
255
- setCreateOpen(false);
256
- }, [setCreateOpen]);
257
- var onCreateSuccess = React.useCallback(function (newValue) {
270
+ var onOpenForm = React.useCallback(function () {
271
+ setFormOpen(true);
272
+ }, [setFormOpen]);
273
+ var onCloseForm = React.useCallback(function () {
274
+ setFormOpen(false);
275
+ }, [setFormOpen]);
276
+ var onFormSuccess = React.useCallback(function (newValue) {
258
277
  if (onChange === null) return;
259
278
  var finalNewValue = resourceType !== null ? _objectSpread__default["default"]({
260
279
  type: resourceType
@@ -264,16 +283,45 @@ var ResourceItemField = function ResourceItemField(_ref) {
264
283
  } else {
265
284
  onChange(finalNewValue);
266
285
  }
267
- setCreateOpen(false);
268
- }, [onChange, multiple, value, setCreateOpen, resourceType]);
286
+ setFormOpen(false);
287
+ }, [onChange, multiple, value, setFormOpen, resourceType, paginated, initialPage]);
288
+
289
+ // If empty try to fetch
290
+ var onFocus = React.useCallback(function () {
291
+ if ((partialItems || []).length === 0) {
292
+ if (paginated) {
293
+ reloadPage();
294
+ } else {
295
+ reload();
296
+ }
297
+ }
298
+ }, [paginated, partialItems]);
269
299
  var onClickRemove = React.useCallback(function () {
270
300
  if (onChange !== null) {
271
301
  onChange(null);
272
302
  }
273
- }, [onChange]);
303
+ // Clear the page and be good
304
+ if (paginated) {
305
+ setPage(defaultPage);
306
+ reset();
307
+ } else {
308
+ reset();
309
+ }
310
+ }, [onChange, paginated, defaultPage, reload, reloadPage, reset]);
311
+ var form = formOpen ? /*#__PURE__*/React__default["default"].createElement(ResourceForm__default["default"], {
312
+ resource: resource,
313
+ type: finalType,
314
+ item: !multiple ? value : null,
315
+ onSuccess: onFormSuccess
316
+ }) : null;
274
317
  return /*#__PURE__*/React__default["default"].createElement("div", {
275
318
  className: classNames__default["default"](['position-relative', _defineProperty__default["default"]({}, className, className != null)])
276
- }, value !== null && !multiple ? /*#__PURE__*/React__default["default"].createElement(ResourceCard__default["default"], {
319
+ }, value !== null && !multiple ? /*#__PURE__*/React__default["default"].createElement("div", {
320
+ className: "row"
321
+ }, /*#__PURE__*/React__default["default"].createElement("div", {
322
+ className: "col-10 flex-grow-1"
323
+ }, /*#__PURE__*/React__default["default"].createElement(ResourceCard__default["default"], {
324
+ className: "flex-grow-1",
277
325
  item: value,
278
326
  getItemLabel: initialGetItemLabel,
279
327
  getItemDescription: getItemDescription,
@@ -284,12 +332,20 @@ var ResourceItemField = function ResourceItemField(_ref) {
284
332
  itemLabelWithId: itemLabelWithId,
285
333
  disable: disabled,
286
334
  onClickRemove: onClickRemove
287
- }) : /*#__PURE__*/React__default["default"].createElement("div", {
288
- className: classNames__default["default"](['row', 'align-items-center'])
335
+ })), canEdit && !multiple ? /*#__PURE__*/React__default["default"].createElement("div", {
336
+ className: "col-auto"
337
+ }, /*#__PURE__*/React__default["default"].createElement(Button__default["default"], {
338
+ theme: "primary",
339
+ icon: editButtonLabel === null ? 'pencil-square' : null,
340
+ onClick: formOpen ? onCloseForm : onOpenForm,
341
+ outline: true,
342
+ disabled: finalValue === null
343
+ }, editButtonLabel)) : null) : /*#__PURE__*/React__default["default"].createElement("div", {
344
+ className: "row align-items-center"
289
345
  }, /*#__PURE__*/React__default["default"].createElement("div", {
290
- className: "col-auto flex-grow-1"
346
+ className: "col-10 flex-grow-1"
291
347
  }, /*#__PURE__*/React__default["default"].createElement(Select__default["default"], {
292
- className: classNames__default["default"](['py-1', 'shadow-none', (_ref8 = {}, _defineProperty__default["default"](_ref8, disabled, disabled), _defineProperty__default["default"](_ref8, 'is-invalid', errors !== null), _defineProperty__default["default"](_ref8, inputClassName, inputClassName !== null), _ref8)]),
348
+ className: classNames__default["default"](['py-1', 'shadow-none', (_ref9 = {}, _defineProperty__default["default"](_ref9, disabled, disabled), _defineProperty__default["default"](_ref9, 'is-invalid', errors !== null), _defineProperty__default["default"](_ref9, inputClassName, inputClassName !== null), _ref9)]),
293
349
  disabled: disabled,
294
350
  name: name,
295
351
  value: finalValue,
@@ -305,20 +361,30 @@ var ResourceItemField = function ResourceItemField(_ref) {
305
361
  }),
306
362
  onChange: onValueChange,
307
363
  onInputChange: onInputChange,
364
+ onFocus: onFocus,
365
+ onMenuScrollToBottom: onScrollEnd,
308
366
  multiple: multiple
309
367
  })), canCreate ? /*#__PURE__*/React__default["default"].createElement("div", {
310
368
  className: "col-auto"
311
369
  }, /*#__PURE__*/React__default["default"].createElement(Button__default["default"], {
312
370
  theme: "primary",
313
371
  icon: createButtonLabel === null ? 'plus-lg' : null,
314
- onClick: createOpen ? onCloseCreate : onOpenCreate,
372
+ onClick: formOpen ? onCloseForm : onOpenForm,
315
373
  outline: true
316
- }, createButtonLabel)) : null, createOpen ? createInPlace ? /*#__PURE__*/React__default["default"].createElement(ResourceForm__default["default"], {
317
- resource: resource,
318
- type: resourceType,
319
- onSuccess: onCreateSuccess
320
- }) : /*#__PURE__*/React__default["default"].createElement(Dialog__default["default"], {
321
- title: /*#__PURE__*/React__default["default"].createElement(reactIntl.FormattedMessage, {
374
+ }, createButtonLabel)) : null), formOpen ? withoutModal ? /*#__PURE__*/React__default["default"].createElement("div", {
375
+ className: "card mt-4 p-4"
376
+ }, form) : /*#__PURE__*/React__default["default"].createElement(Dialog__default["default"], {
377
+ title: !multiple && value !== null ? /*#__PURE__*/React__default["default"].createElement(reactIntl.FormattedMessage, {
378
+ values: resourceValues,
379
+ id: "mCfzkJ",
380
+ defaultMessage: [{
381
+ "type": 0,
382
+ "value": "Edit "
383
+ }, {
384
+ "type": 1,
385
+ "value": "a_singular"
386
+ }]
387
+ }) : /*#__PURE__*/React__default["default"].createElement(reactIntl.FormattedMessage, {
322
388
  values: resourceValues,
323
389
  id: "6viUpq",
324
390
  defaultMessage: [{
@@ -330,12 +396,8 @@ var ResourceItemField = function ResourceItemField(_ref) {
330
396
  }]
331
397
  }),
332
398
  size: "lg",
333
- onClickClose: onCloseCreate
334
- }, /*#__PURE__*/React__default["default"].createElement(ResourceForm__default["default"], {
335
- resource: resource,
336
- type: resourceType,
337
- onSuccess: onCreateSuccess
338
- })) : null));
399
+ onClickClose: onCloseForm
400
+ }, form) : null);
339
401
  };
340
402
  ResourceItemField.propTypes = propTypes;
341
403
  ResourceItemField.defaultProps = defaultProps;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@panneau/field-resource-item",
3
- "version": "2.0.72",
3
+ "version": "2.0.77",
4
4
  "description": "An item mapping a resource",
5
5
  "keywords": [
6
6
  "javascript"
@@ -45,14 +45,14 @@
45
45
  },
46
46
  "dependencies": {
47
47
  "@babel/runtime": "^7.12.5",
48
- "@panneau/core": "^2.0.71",
49
- "@panneau/data": "^2.0.71",
50
- "@panneau/element-button": "^2.0.71",
51
- "@panneau/element-resource-card": "^2.0.72",
52
- "@panneau/element-select": "^2.0.71",
53
- "@panneau/form-resource": "^2.0.71",
54
- "@panneau/intl": "^2.0.71",
55
- "@panneau/modal-dialog": "^2.0.72",
48
+ "@panneau/core": "^2.0.75",
49
+ "@panneau/data": "^2.0.75",
50
+ "@panneau/element-button": "^2.0.75",
51
+ "@panneau/element-resource-card": "^2.0.75",
52
+ "@panneau/element-select": "^2.0.75",
53
+ "@panneau/form-resource": "^2.0.77",
54
+ "@panneau/intl": "^2.0.75",
55
+ "@panneau/modal-dialog": "^2.0.75",
56
56
  "classnames": "^2.2.6",
57
57
  "lodash": "^4.17.21",
58
58
  "prop-types": "^15.7.2",
@@ -61,5 +61,5 @@
61
61
  "publishConfig": {
62
62
  "access": "public"
63
63
  },
64
- "gitHead": "dec3ab57e02e99a81625bf5c2f7d8589fd222e57"
64
+ "gitHead": "ba3b77e9c0b5640790858793f96b48b7c20d0c97"
65
65
  }