arengibook 2.4.49 → 2.4.50

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 (2) hide show
  1. package/dist/index.js +249 -96
  2. package/package.json +2 -1
package/dist/index.js CHANGED
@@ -2101,11 +2101,13 @@ var ObjectUtils = /*#__PURE__*/function () {
2101
2101
  * @param {object} a - The first object to compare.
2102
2102
  * @param {object} b - The second object to compare.
2103
2103
  * @param {string[]} [keysToCompare] - The keys to compare. If not provided, performs a shallow comparison using absoluteCompare.
2104
+ * @param {number} [maxDepth=1] - The maximum depth to compare if the variables are objects.
2104
2105
  * @returns {boolean} True if all specified properties are equal, false otherwise.
2105
2106
  */
2106
2107
  }, {
2107
2108
  key: "selectiveCompare",
2108
2109
  value: function selectiveCompare(a, b, keysToCompare) {
2110
+ var maxDepth = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 1;
2109
2111
  if (a === b) return true;
2110
2112
  if (!a || !b || _typeof$f(a) !== 'object' || _typeof$f(b) !== 'object') return false;
2111
2113
  if (!keysToCompare) return this.absoluteCompare(a, b, 1); // If no keys are provided, the comparison is limited to one depth level.
@@ -2119,7 +2121,7 @@ var ObjectUtils = /*#__PURE__*/function () {
2119
2121
  var isObject = _typeof$f(aValue) === 'object' && aValue !== null && _typeof$f(bValue) === 'object' && bValue !== null;
2120
2122
 
2121
2123
  // If the current key is an object, they are compared in one further level only.
2122
- if (isObject && !this.absoluteCompare(aValue, bValue, 1)) return false;
2124
+ if (isObject && !this.absoluteCompare(aValue, bValue, maxDepth)) return false;
2123
2125
  if (!isObject && aValue !== bValue) return false;
2124
2126
  }
2125
2127
  } catch (err) {
@@ -2739,6 +2741,7 @@ var FilterMatchMode$2 = Object.freeze({
2739
2741
  EQUALS: 'equals',
2740
2742
  NOT_EQUALS: 'notEquals',
2741
2743
  IN: 'in',
2744
+ NOT_IN: 'notIn',
2742
2745
  LESS_THAN: 'lt',
2743
2746
  LESS_THAN_OR_EQUAL_TO: 'lte',
2744
2747
  GREATER_THAN: 'gt',
@@ -3116,6 +3119,7 @@ var locales$2 = {
3116
3119
  emptySelectionMessage: 'No selected item',
3117
3120
  endsWith: 'Ends with',
3118
3121
  equals: 'Equals',
3122
+ fileChosenMessage: '{0} files',
3119
3123
  fileSizeTypes: ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
3120
3124
  filter: 'Filter',
3121
3125
  firstDayOfWeek: 0,
@@ -3134,6 +3138,7 @@ var locales$2 = {
3134
3138
  nextMonth: 'Next Month',
3135
3139
  nextSecond: 'Next Second',
3136
3140
  nextYear: 'Next Year',
3141
+ noFileChosenMessage: 'No file chosen',
3137
3142
  noFilter: 'No Filter',
3138
3143
  notContains: 'Not contains',
3139
3144
  notEquals: 'Not equals',
@@ -3161,8 +3166,10 @@ var locales$2 = {
3161
3166
  aria: {
3162
3167
  cancelEdit: 'Cancel Edit',
3163
3168
  close: 'Close',
3169
+ collapseLabel: 'Collapse',
3164
3170
  collapseRow: 'Row Collapsed',
3165
3171
  editRow: 'Edit Row',
3172
+ expandLabel: 'Expand',
3166
3173
  expandRow: 'Row Expanded',
3167
3174
  falseLabel: 'False',
3168
3175
  filterConstraint: 'Filter Constraint',
@@ -3187,18 +3194,20 @@ var locales$2 = {
3187
3194
  next: 'Next',
3188
3195
  nextPageLabel: 'Next Page',
3189
3196
  nullLabel: 'Not Selected',
3190
- pageLabel: 'Page {page}',
3191
3197
  otpLabel: 'Please enter one time password character {0}',
3198
+ pageLabel: 'Page {page}',
3192
3199
  passwordHide: 'Hide Password',
3193
3200
  passwordShow: 'Show Password',
3194
3201
  previous: 'Previous',
3195
3202
  prevPageLabel: 'Previous Page',
3203
+ removeLabel: 'Remove',
3196
3204
  rotateLeft: 'Rotate Left',
3197
3205
  rotateRight: 'Rotate Right',
3198
3206
  rowsPerPageLabel: 'Rows per page',
3199
3207
  saveEdit: 'Save Edit',
3200
3208
  scrollTop: 'Scroll Top',
3201
3209
  selectAll: 'All items selected',
3210
+ selectLabel: 'Select',
3202
3211
  selectRow: 'Row Selected',
3203
3212
  showFilterMenu: 'Show Filter Menu',
3204
3213
  slide: 'Slide',
@@ -3207,6 +3216,7 @@ var locales$2 = {
3207
3216
  stars: '{star} stars',
3208
3217
  trueLabel: 'True',
3209
3218
  unselectAll: 'All items unselected',
3219
+ unselectLabel: 'Unselect',
3210
3220
  unselectRow: 'Row Unselected',
3211
3221
  zoomImage: 'Zoom Image',
3212
3222
  zoomIn: 'Zoom In',
@@ -11381,13 +11391,32 @@ var Calendar = /*#__PURE__*/React.memo(/*#__PURE__*/React.forwardRef(function (i
11381
11391
  return props.parseDateTime(text);
11382
11392
  }
11383
11393
  var date;
11384
- var parts = text.split(' ');
11385
11394
  if (props.timeOnly) {
11386
11395
  date = new Date();
11387
- populateTime(date, parts[0], parts[1]);
11396
+ var match = text.match(/(\d{1,2}:\d{2}(?::\d{2})?(?:\.\d{1,3})?)\s?(AM|PM)?/i);
11397
+ if (match) {
11398
+ populateTime(date, match[1], match[2]);
11399
+ } else {
11400
+ return null;
11401
+ }
11388
11402
  } else if (props.showTime) {
11389
- date = parseDate(parts[0], getDateFormat());
11390
- populateTime(date, parts[1], parts[2]);
11403
+ var time12 = /(\d{1,2}:\d{2}(?::\d{2})?(?:\.\d{1,3})?)\s?(AM|PM)/i;
11404
+ var time24 = /(\d{1,2}:\d{2}(?::\d{2})?(?:\.\d{1,3})?)$/;
11405
+ var _match, datePart, timePart, ampm;
11406
+ if (props.hourFormat === '12' && (_match = text.match(time12))) {
11407
+ timePart = _match[1];
11408
+ ampm = _match[2];
11409
+ datePart = text.replace(time12, '').trim();
11410
+ } else if (props.hourFormat === '24' && (_match = text.match(time24))) {
11411
+ timePart = _match[1];
11412
+ datePart = text.replace(time24, '').trim();
11413
+ }
11414
+ if (datePart && timePart) {
11415
+ date = parseDate(datePart, getDateFormat());
11416
+ populateTime(date, timePart, ampm);
11417
+ } else {
11418
+ date = parseDate(text, getDateFormat());
11419
+ }
11391
11420
  } else {
11392
11421
  date = parseDate(text, getDateFormat());
11393
11422
  }
@@ -11776,7 +11805,7 @@ var Calendar = /*#__PURE__*/React.memo(/*#__PURE__*/React.forwardRef(function (i
11776
11805
  viewDate.setHours(0, 0, 0);
11777
11806
  isClearClicked.current = false;
11778
11807
  }
11779
- if (!prevPropValue && propValue || propValue && propValue instanceof Date && propValue.getTime() !== prevPropValue.getTime()) {
11808
+ if (!prevPropValue && propValue || propValue && propValue instanceof Date && prevPropValue instanceof Date && propValue.getTime() !== prevPropValue.getTime()) {
11780
11809
  validateDate(viewDate);
11781
11810
  }
11782
11811
  setViewDateState(viewDate);
@@ -12030,6 +12059,9 @@ var Calendar = /*#__PURE__*/React.memo(/*#__PURE__*/React.forwardRef(function (i
12030
12059
  }),
12031
12060
  'aria-selected': selected,
12032
12061
  'aria-disabled': !date.selectable,
12062
+ onMouseDown: function onMouseDown(e) {
12063
+ return e.preventDefault();
12064
+ },
12033
12065
  onClick: function onClick(e) {
12034
12066
  return onDateSelect(e, date);
12035
12067
  },
@@ -12849,21 +12881,6 @@ var DatePicker = function DatePicker(_ref) {
12849
12881
  borderRadius: '6px'
12850
12882
  };
12851
12883
  var localLanguage = locale !== null && locale !== void 0 ? locale : 'fr';
12852
-
12853
- // const handleChange = (e) => {
12854
- // const newDate = e.value;
12855
- // setValeur(newDate);
12856
- // if (onChange) {
12857
- // onChange({ value: newDate });
12858
- // }
12859
- //
12860
- // if (inputRef.current) {
12861
- // const event = new Event('datePickerChange', { bubbles: true });
12862
- // inputRef.current.dispatchEvent(event);
12863
- // }
12864
- //
12865
- // };
12866
-
12867
12884
  var handleChange = function handleChange(e) {
12868
12885
  var newDate = e.value;
12869
12886
  setValeur(newDate);
@@ -12875,7 +12892,6 @@ var DatePicker = function DatePicker(_ref) {
12875
12892
  if (onSelect) {
12876
12893
  onSelect(newDate, {
12877
12894
  type: 'manual',
12878
- // ou 'select' si souhaité
12879
12895
  source: 'DatePicker'
12880
12896
  });
12881
12897
  }
@@ -12934,7 +12950,10 @@ var DatePickerPresets = {
12934
12950
  Default: {
12935
12951
  placeholder: 'Choisissez une date',
12936
12952
  dateFormat: 'dd/mm/yy',
12937
- view: 'date'
12953
+ view: 'date',
12954
+ onSelect: function onSelect(e) {
12955
+ return alert(e.getFullYear());
12956
+ }
12938
12957
  },
12939
12958
  MonthOnly: {
12940
12959
  placeholder: 'Choisissez un mois',
@@ -21346,7 +21365,7 @@ var InputNumber = /*#__PURE__*/React.memo(/*#__PURE__*/React.forwardRef(function
21346
21365
  var stacked = props.showButtons && props.buttonLayout === 'stacked';
21347
21366
  var horizontal = props.showButtons && props.buttonLayout === 'horizontal';
21348
21367
  var vertical = props.showButtons && props.buttonLayout === 'vertical';
21349
- var inputMode = props.inputMode || (props.mode === 'decimal' && !props.minFractionDigits ? 'numeric' : 'decimal');
21368
+ var inputMode = props.inputMode || (props.mode === 'decimal' && !props.minFractionDigits && !props.maxFractionDigits ? 'numeric' : 'decimal');
21350
21369
  var getOptions = function getOptions() {
21351
21370
  var _props$minFractionDig, _props$maxFractionDig;
21352
21371
  return {
@@ -21781,6 +21800,10 @@ var InputNumber = /*#__PURE__*/React.memo(/*#__PURE__*/React.forwardRef(function
21781
21800
  event.preventDefault();
21782
21801
  var _char2 = event.key;
21783
21802
  if (_char2) {
21803
+ // get decimal separator in current locale
21804
+ if (_char2 === '.') {
21805
+ _char2 = _decimalSeparator.current;
21806
+ }
21784
21807
  var _isDecimalSign = isDecimalSign(_char2);
21785
21808
  var _isMinusSign = isMinusSign(_char2);
21786
21809
  if (Number(_char2) >= 0 && Number(_char2) <= 9 || _isMinusSign || _isDecimalSign) {
@@ -21895,6 +21918,7 @@ var InputNumber = /*#__PURE__*/React.memo(/*#__PURE__*/React.forwardRef(function
21895
21918
  suffixCharIndex = _getCharIndexes2.suffixCharIndex,
21896
21919
  currencyCharIndex = _getCharIndexes2.currencyCharIndex;
21897
21920
  var maxFractionDigits = numberFormat.current.resolvedOptions().maximumFractionDigits;
21921
+ var hasBoundOrAffix = props.min || props.max || props.suffix || props.prefix; //only exception
21898
21922
  var newValueStr;
21899
21923
  if (sign.isMinusSign) {
21900
21924
  var isNewMinusSign = minusCharIndex === -1;
@@ -21914,7 +21938,7 @@ var InputNumber = /*#__PURE__*/React.memo(/*#__PURE__*/React.forwardRef(function
21914
21938
  newValueStr = insertText(inputValue, text, selectionStart, selectionEnd);
21915
21939
  updateValue(event, newValueStr, text, 'insert');
21916
21940
  } else if (decimalCharIndex === -1 && (maxFractionDigits || props.maxFractionDigits)) {
21917
- var allowedDecimal = inputMode !== 'numeric' || inputMode === 'numeric' && (props.min || props.max);
21941
+ var allowedDecimal = inputMode !== 'numeric' || inputMode === 'numeric' && hasBoundOrAffix;
21918
21942
  if (allowedDecimal) {
21919
21943
  newValueStr = insertText(inputValue, text, selectionStart, selectionEnd);
21920
21944
  updateValue(event, newValueStr, text, 'insert');
@@ -23811,6 +23835,7 @@ var DropdownBase = ComponentBase.extend({
23811
23835
  name: null,
23812
23836
  onBlur: null,
23813
23837
  onChange: null,
23838
+ onClick: null,
23814
23839
  onContextMenu: null,
23815
23840
  onFilter: null,
23816
23841
  onFocus: null,
@@ -24244,7 +24269,7 @@ function _unsupportedIterableToArray$4(r, a) { if (r) { if ("string" == typeof r
24244
24269
  function _arrayLikeToArray$4(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
24245
24270
  function ownKeys$i(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
24246
24271
  function _objectSpread$i(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$i(Object(t), true).forEach(function (r) { _defineProperty$3(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$i(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
24247
- var Dropdown = /*#__PURE__*/React.memo(/*#__PURE__*/React.forwardRef(function (inProps, ref) {
24272
+ var Dropdown$1 = /*#__PURE__*/React.memo(/*#__PURE__*/React.forwardRef(function (inProps, ref) {
24248
24273
  var mergeProps = useMergeProps();
24249
24274
  var context = React.useContext(PrimeReactContext);
24250
24275
  var props = DropdownBase.getProps(inProps, context);
@@ -24682,15 +24707,24 @@ var Dropdown = /*#__PURE__*/React.memo(/*#__PURE__*/React.forwardRef(function (i
24682
24707
  !pressedInInputText && onEnterKey(event);
24683
24708
  };
24684
24709
  var onEnterKey = function onEnterKey(event) {
24710
+ event.preventDefault();
24685
24711
  if (!overlayVisibleState) {
24686
24712
  setFocusedOptionIndex(-1);
24687
24713
  onArrowDownKey(event);
24688
24714
  } else {
24689
- if (focusedOptionIndex !== -1) {
24690
- onOptionSelect(event, visibleOptions[focusedOptionIndex]);
24715
+ if (focusedOptionIndex === -1) {
24716
+ return;
24691
24717
  }
24718
+ var focusedOption = visibleOptions[focusedOptionIndex];
24719
+ var optionValue = getOptionValue(focusedOption);
24720
+ if (optionValue == null || optionValue == undefined) {
24721
+ hide();
24722
+ resetFilter();
24723
+ updateEditableLabel(selectedOption);
24724
+ return;
24725
+ }
24726
+ onOptionSelect(event, focusedOption);
24692
24727
  }
24693
- event.preventDefault();
24694
24728
  };
24695
24729
  var onEscapeKey = function onEscapeKey(event) {
24696
24730
  overlayVisibleState && hide();
@@ -25280,7 +25314,7 @@ var Dropdown = /*#__PURE__*/React.memo(/*#__PURE__*/React.forwardRef(function (i
25280
25314
  pt: ptm('tooltip')
25281
25315
  }, props.tooltipOptions)));
25282
25316
  }));
25283
- Dropdown.displayName = 'Dropdown';
25317
+ Dropdown$1.displayName = 'Dropdown';
25284
25318
 
25285
25319
  function _arrayWithHoles$2(r) {
25286
25320
  if (Array.isArray(r)) return r;
@@ -25638,6 +25672,7 @@ var FilterMatchMode$1 = Object.freeze({
25638
25672
  EQUALS: 'equals',
25639
25673
  NOT_EQUALS: 'notEquals',
25640
25674
  IN: 'in',
25675
+ NOT_IN: 'notIn',
25641
25676
  LESS_THAN: 'lt',
25642
25677
  LESS_THAN_OR_EQUAL_TO: 'lte',
25643
25678
  GREATER_THAN: 'gt',
@@ -25726,6 +25761,7 @@ var locales$1 = {
25726
25761
  emptySelectionMessage: 'No selected item',
25727
25762
  endsWith: 'Ends with',
25728
25763
  equals: 'Equals',
25764
+ fileChosenMessage: '{0} files',
25729
25765
  fileSizeTypes: ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
25730
25766
  filter: 'Filter',
25731
25767
  firstDayOfWeek: 0,
@@ -25744,6 +25780,7 @@ var locales$1 = {
25744
25780
  nextMonth: 'Next Month',
25745
25781
  nextSecond: 'Next Second',
25746
25782
  nextYear: 'Next Year',
25783
+ noFileChosenMessage: 'No file chosen',
25747
25784
  noFilter: 'No Filter',
25748
25785
  notContains: 'Not contains',
25749
25786
  notEquals: 'Not equals',
@@ -25771,8 +25808,10 @@ var locales$1 = {
25771
25808
  aria: {
25772
25809
  cancelEdit: 'Cancel Edit',
25773
25810
  close: 'Close',
25811
+ collapseLabel: 'Collapse',
25774
25812
  collapseRow: 'Row Collapsed',
25775
25813
  editRow: 'Edit Row',
25814
+ expandLabel: 'Expand',
25776
25815
  expandRow: 'Row Expanded',
25777
25816
  falseLabel: 'False',
25778
25817
  filterConstraint: 'Filter Constraint',
@@ -25797,18 +25836,20 @@ var locales$1 = {
25797
25836
  next: 'Next',
25798
25837
  nextPageLabel: 'Next Page',
25799
25838
  nullLabel: 'Not Selected',
25800
- pageLabel: 'Page {page}',
25801
25839
  otpLabel: 'Please enter one time password character {0}',
25840
+ pageLabel: 'Page {page}',
25802
25841
  passwordHide: 'Hide Password',
25803
25842
  passwordShow: 'Show Password',
25804
25843
  previous: 'Previous',
25805
25844
  prevPageLabel: 'Previous Page',
25845
+ removeLabel: 'Remove',
25806
25846
  rotateLeft: 'Rotate Left',
25807
25847
  rotateRight: 'Rotate Right',
25808
25848
  rowsPerPageLabel: 'Rows per page',
25809
25849
  saveEdit: 'Save Edit',
25810
25850
  scrollTop: 'Scroll Top',
25811
25851
  selectAll: 'All items selected',
25852
+ selectLabel: 'Select',
25812
25853
  selectRow: 'Row Selected',
25813
25854
  showFilterMenu: 'Show Filter Menu',
25814
25855
  slide: 'Slide',
@@ -25817,6 +25858,7 @@ var locales$1 = {
25817
25858
  stars: '{star} stars',
25818
25859
  trueLabel: 'True',
25819
25860
  unselectAll: 'All items unselected',
25861
+ unselectLabel: 'Unselect',
25820
25862
  unselectRow: 'Row Unselected',
25821
25863
  zoomImage: 'Zoom Image',
25822
25864
  zoomIn: 'Zoom In',
@@ -26160,7 +26202,7 @@ var RowsPerPageDropdown = /*#__PURE__*/React.memo(function (inProps) {
26160
26202
  }) : [];
26161
26203
  var placeholderValue = localeOption('choose');
26162
26204
  var ariaLabelValue = ariaLabel$1('jumpToPageDropdownLabel');
26163
- var element = hasOptions ? /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Dropdown, {
26205
+ var element = hasOptions ? /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Dropdown$1, {
26164
26206
  value: props.value,
26165
26207
  options: options,
26166
26208
  onChange: props.onChange,
@@ -27987,7 +28029,7 @@ var Cell = function Cell(props) {
27987
28029
  editingRowDataStateRef.current = editingRowData;
27988
28030
  };
27989
28031
  var _onClick = function onClick(event) {
27990
- props.onClick(event, getCellCallbackParams(event), isEditable(), editingState, setEditingState, selfClick, props.column, bindDocumentClickListener, overlayEventListener);
28032
+ props.onClick(event, getCellCallbackParams(event), isEditable(), editingState, setEditingState, selfClick, props.column, bindDocumentClickListener, overlayEventListener, isOutsideClicked);
27991
28033
  };
27992
28034
  var _onMouseDown = function onMouseDown(event) {
27993
28035
  var params = getCellCallbackParams(event);
@@ -28109,7 +28151,7 @@ var Cell = function Cell(props) {
28109
28151
  field: props.field,
28110
28152
  index: props.rowIndex
28111
28153
  });
28112
- props.focusOnInit();
28154
+ props.focusOnInit(initFocusTimeout, elementRef);
28113
28155
  };
28114
28156
  React.useEffect(function () {
28115
28157
  if (props.frozenCol) props.updateStickyPosition(elementRef, props.frozenCol, props.alignFrozenCol, styleObjectState, setStyleObjectState);
@@ -28450,11 +28492,18 @@ var RadioCheckCell = /*#__PURE__*/React.memo(function (props) {
28450
28492
  return ObjectUtils.selectiveCompare(prevProps, nextProps, keysToCompare);
28451
28493
  });
28452
28494
  RadioCheckCell.displayName = 'RadioCheckCell';
28495
+ var defaultKeysToCompare = ['rowData', 'field', 'allowCellSelection', 'isCellSelected', 'editMode', 'index', 'tabIndex', 'editing', 'expanded', 'editingMeta', 'frozenCol', 'alignFrozenCol'];
28453
28496
  var BodyCell = /*#__PURE__*/React.memo(function (props) {
28454
28497
  return /*#__PURE__*/React.createElement(Cell, props);
28455
28498
  }, function (prevProps, nextProps) {
28456
- var keysToCompare = ['field', 'allowCellSelection', 'isCellSelected', 'editMode', 'index', 'tabIndex', 'editing', 'expanded', 'editingMeta', 'rowData', 'frozenCol', 'alignFrozenCol'];
28457
- return ObjectUtils.selectiveCompare(prevProps, nextProps, keysToCompare);
28499
+ if (nextProps.cellMemo === false) return false;
28500
+ var memoProps = nextProps.cellMemoProps;
28501
+ var keysToCompare = Array.isArray(memoProps) && memoProps.every(function (prop) {
28502
+ return typeof prop === 'string';
28503
+ }) ? memoProps : defaultKeysToCompare;
28504
+ var memoPropsDepth = nextProps.cellMemoPropsDepth;
28505
+ var depth = typeof memoPropsDepth === 'number' && memoPropsDepth > 0 ? memoPropsDepth : 1;
28506
+ return ObjectUtils.selectiveCompare(prevProps, nextProps, keysToCompare, depth);
28458
28507
  });
28459
28508
  BodyCell.displayName = 'BodyCell';
28460
28509
 
@@ -28931,7 +28980,7 @@ var BodyRow = /*#__PURE__*/React.memo(function (props) {
28931
28980
  !isSameStyle && setStyleObjectState(styleObject);
28932
28981
  }
28933
28982
  }, []);
28934
- var onCellClick = function onCellClick(event, params, isEditable, editingState, setEditingState, selfClick, column, bindDocumentClickListener, overlayEventListener) {
28983
+ var onCellClick = function onCellClick(event, params, isEditable, editingState, setEditingState, selfClick, column, bindDocumentClickListener, overlayEventListener, isOutsideClicked) {
28935
28984
  if (props.editMode !== 'row' && isEditable && !editingState && (props.selectOnEdit || !props.selectOnEdit && props.isRowSelected)) {
28936
28985
  selfClick.current = true;
28937
28986
  var onBeforeCellEditShow = getColumnProp(column, 'onBeforeCellEditShow');
@@ -28990,6 +29039,9 @@ var BodyRow = /*#__PURE__*/React.memo(function (props) {
28990
29039
  var cellProps = mergeProps({
28991
29040
  hostName: props.hostName,
28992
29041
  allowCellSelection: props.allowCellSelection,
29042
+ cellMemo: props.cellMemo,
29043
+ cellMemoProps: props.cellMemoProps,
29044
+ cellMemoPropsDepth: props.cellMemoPropsDepth,
28993
29045
  cellClassName: props.cellClassName,
28994
29046
  checkIcon: props.checkIcon,
28995
29047
  collapsedRowIcon: props.collapsedRowIcon,
@@ -29357,9 +29409,6 @@ var TableBody = /*#__PURE__*/React.memo(/*#__PURE__*/React.forwardRef(function (
29357
29409
  options = options || props.virtualScrollerOptions;
29358
29410
  return options ? options[option] : null;
29359
29411
  };
29360
- var getProcessedDataIndex = function getProcessedDataIndex(rowIndex) {
29361
- return props.lazy ? rowIndex - props.first : rowIndex;
29362
- };
29363
29412
  var findIndex = function findIndex(collection, rowData) {
29364
29413
  return (collection || []).findIndex(function (data) {
29365
29414
  return equals(rowData, data);
@@ -29530,16 +29579,14 @@ var TableBody = /*#__PURE__*/React.memo(/*#__PURE__*/React.forwardRef(function (
29530
29579
  var rangeStart;
29531
29580
  var rangeEnd;
29532
29581
  var isAllowCellSelection = allowCellSelection();
29533
- var rangeRowIndexInProcessedData = getProcessedDataIndex(rangeRowIndex.current);
29534
- var anchorRowIndexInProcessedData = getProcessedDataIndex(anchorRowIndex.current);
29535
- if (rangeRowIndexInProcessedData > anchorRowIndexInProcessedData) {
29536
- rangeStart = anchorRowIndexInProcessedData;
29537
- rangeEnd = rangeRowIndexInProcessedData;
29538
- } else if (rangeRowIndexInProcessedData < anchorRowIndexInProcessedData) {
29539
- rangeStart = rangeRowIndexInProcessedData;
29540
- rangeEnd = anchorRowIndexInProcessedData;
29582
+ if (rangeRowIndex.current > anchorRowIndex.current) {
29583
+ rangeStart = anchorRowIndex.current;
29584
+ rangeEnd = rangeRowIndex.current;
29585
+ } else if (rangeRowIndex.current < anchorRowIndex.current) {
29586
+ rangeStart = rangeRowIndex.current;
29587
+ rangeEnd = anchorRowIndex.current;
29541
29588
  } else {
29542
- rangeStart = rangeEnd = rangeRowIndexInProcessedData;
29589
+ rangeStart = rangeEnd = rangeRowIndex.current;
29543
29590
  }
29544
29591
  return isAllowCellSelection ? selectRangeOnCell(event, rangeStart, rangeEnd) : selectRangeOnRow(event, rangeStart, rangeEnd);
29545
29592
  };
@@ -29580,7 +29627,7 @@ var TableBody = /*#__PURE__*/React.memo(/*#__PURE__*/React.forwardRef(function (
29580
29627
  for (var i = rowRangeStart; i <= rowRangeEnd; i++) {
29581
29628
  var rowData = value[i];
29582
29629
  var columns = props.columns;
29583
- var rowIndex = props.lazy ? i + props.first : i;
29630
+ var rowIndex = props.paginator ? i + props.first : i;
29584
29631
  for (var j = cellRangeStart; j <= cellRangeEnd; j++) {
29585
29632
  var field = getColumnProp(columns[j], 'field');
29586
29633
  var _value = ObjectUtils.resolveFieldData(rowData, field);
@@ -29779,13 +29826,17 @@ var TableBody = /*#__PURE__*/React.memo(/*#__PURE__*/React.forwardRef(function (
29779
29826
  onRangeSelection(event, 'row');
29780
29827
  }
29781
29828
  };
29829
+ var expandedRowsRef = React.useRef(props.expandedRows);
29830
+ React.useEffect(function () {
29831
+ expandedRowsRef.current = props.expandedRows;
29832
+ }, [props.expandedRows]);
29782
29833
  var onRowToggle = function onRowToggle(event) {
29783
29834
  var expandedRows;
29784
29835
  var dataKey = props.dataKey;
29785
29836
  var hasDataKey = props.groupRowsBy ? dataKey === props.groupRowsBy : !!dataKey;
29786
29837
  if (hasDataKey) {
29787
29838
  var dataKeyValue = String(ObjectUtils.resolveFieldData(event.data, dataKey));
29788
- expandedRows = props.expandedRows ? _objectSpread$8({}, props.expandedRows) : {};
29839
+ expandedRows = expandedRowsRef.current ? _objectSpread$8({}, expandedRowsRef.current) : {};
29789
29840
  if (expandedRows[dataKeyValue] != null) {
29790
29841
  delete expandedRows[dataKeyValue];
29791
29842
  if (props.onRowCollapse) {
@@ -29804,8 +29855,8 @@ var TableBody = /*#__PURE__*/React.memo(/*#__PURE__*/React.forwardRef(function (
29804
29855
  }
29805
29856
  }
29806
29857
  } else {
29807
- var expandedRowIndex = findIndex(props.expandedRows, event.data);
29808
- expandedRows = props.expandedRows ? _toConsumableArray$1(props.expandedRows) : [];
29858
+ var expandedRowIndex = findIndex(expandedRowsRef.current, event.data);
29859
+ expandedRows = expandedRowsRef.current ? _toConsumableArray$1(expandedRowsRef.current) : [];
29809
29860
  if (expandedRowIndex !== -1) {
29810
29861
  expandedRows = expandedRows.filter(function (_, i) {
29811
29862
  return i !== expandedRowIndex;
@@ -30055,7 +30106,7 @@ var TableBody = /*#__PURE__*/React.memo(/*#__PURE__*/React.forwardRef(function (
30055
30106
  return null;
30056
30107
  };
30057
30108
  var createGroupHeader = function createGroupHeader(rowData, rowIndex, expanded, colSpan) {
30058
- if (isSubheaderGrouping && shouldRenderRowGroupHeader(props.value, rowData, getProcessedDataIndex(rowIndex))) {
30109
+ if (isSubheaderGrouping && shouldRenderRowGroupHeader(props.value, rowData, rowIndex - props.first)) {
30059
30110
  var style = rowGroupHeaderStyle();
30060
30111
  var toggler = props.expandableRowGroups && /*#__PURE__*/React.createElement(RowTogglerButton, {
30061
30112
  hostName: props.hostName,
@@ -30105,6 +30156,9 @@ var TableBody = /*#__PURE__*/React.memo(/*#__PURE__*/React.forwardRef(function (
30105
30156
  hostName: props.hostName,
30106
30157
  allowCellSelection: _allowCellSelection,
30107
30158
  allowRowSelection: _allowRowSelection,
30159
+ cellMemo: props.cellMemo,
30160
+ cellMemoProps: props.cellMemoProps,
30161
+ cellMemoPropsDepth: props.cellMemoPropsDepth,
30108
30162
  cellClassName: props.cellClassName,
30109
30163
  checkIcon: props.checkIcon,
30110
30164
  collapsedRowIcon: props.collapsedRowIcon,
@@ -30490,6 +30544,7 @@ var FilterMatchMode = Object.freeze({
30490
30544
  EQUALS: 'equals',
30491
30545
  NOT_EQUALS: 'notEquals',
30492
30546
  IN: 'in',
30547
+ NOT_IN: 'notIn',
30493
30548
  LESS_THAN: 'lt',
30494
30549
  LESS_THAN_OR_EQUAL_TO: 'lte',
30495
30550
  GREATER_THAN: 'gt',
@@ -30578,6 +30633,7 @@ var locales = {
30578
30633
  emptySelectionMessage: 'No selected item',
30579
30634
  endsWith: 'Ends with',
30580
30635
  equals: 'Equals',
30636
+ fileChosenMessage: '{0} files',
30581
30637
  fileSizeTypes: ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
30582
30638
  filter: 'Filter',
30583
30639
  firstDayOfWeek: 0,
@@ -30596,6 +30652,7 @@ var locales = {
30596
30652
  nextMonth: 'Next Month',
30597
30653
  nextSecond: 'Next Second',
30598
30654
  nextYear: 'Next Year',
30655
+ noFileChosenMessage: 'No file chosen',
30599
30656
  noFilter: 'No Filter',
30600
30657
  notContains: 'Not contains',
30601
30658
  notEquals: 'Not equals',
@@ -30623,8 +30680,10 @@ var locales = {
30623
30680
  aria: {
30624
30681
  cancelEdit: 'Cancel Edit',
30625
30682
  close: 'Close',
30683
+ collapseLabel: 'Collapse',
30626
30684
  collapseRow: 'Row Collapsed',
30627
30685
  editRow: 'Edit Row',
30686
+ expandLabel: 'Expand',
30628
30687
  expandRow: 'Row Expanded',
30629
30688
  falseLabel: 'False',
30630
30689
  filterConstraint: 'Filter Constraint',
@@ -30649,18 +30708,20 @@ var locales = {
30649
30708
  next: 'Next',
30650
30709
  nextPageLabel: 'Next Page',
30651
30710
  nullLabel: 'Not Selected',
30652
- pageLabel: 'Page {page}',
30653
30711
  otpLabel: 'Please enter one time password character {0}',
30712
+ pageLabel: 'Page {page}',
30654
30713
  passwordHide: 'Hide Password',
30655
30714
  passwordShow: 'Show Password',
30656
30715
  previous: 'Previous',
30657
30716
  prevPageLabel: 'Previous Page',
30717
+ removeLabel: 'Remove',
30658
30718
  rotateLeft: 'Rotate Left',
30659
30719
  rotateRight: 'Rotate Right',
30660
30720
  rowsPerPageLabel: 'Rows per page',
30661
30721
  saveEdit: 'Save Edit',
30662
30722
  scrollTop: 'Scroll Top',
30663
30723
  selectAll: 'All items selected',
30724
+ selectLabel: 'Select',
30664
30725
  selectRow: 'Row Selected',
30665
30726
  showFilterMenu: 'Show Filter Menu',
30666
30727
  slide: 'Slide',
@@ -30669,6 +30730,7 @@ var locales = {
30669
30730
  stars: '{star} stars',
30670
30731
  trueLabel: 'True',
30671
30732
  unselectAll: 'All items unselected',
30733
+ unselectLabel: 'Unselect',
30672
30734
  unselectRow: 'Row Unselected',
30673
30735
  zoomImage: 'Zoom Image',
30674
30736
  zoomIn: 'Zoom In',
@@ -31450,7 +31512,7 @@ var ColumnFilter = /*#__PURE__*/React.memo(function (props) {
31450
31512
  var filterOperatorProps = mergeProps({
31451
31513
  className: cx('filterOperator')
31452
31514
  }, getColumnPTOptions('filterOperator'));
31453
- return /*#__PURE__*/React.createElement("div", filterOperatorProps, /*#__PURE__*/React.createElement(Dropdown, {
31515
+ return /*#__PURE__*/React.createElement("div", filterOperatorProps, /*#__PURE__*/React.createElement(Dropdown$1, {
31454
31516
  options: options,
31455
31517
  value: value,
31456
31518
  onChange: onOperatorChange,
@@ -31468,7 +31530,7 @@ var ColumnFilter = /*#__PURE__*/React.memo(function (props) {
31468
31530
  var createMatchModeDropdown = function createMatchModeDropdown(constraint, index) {
31469
31531
  if (isShowMatchModes()) {
31470
31532
  var options = matchModes();
31471
- return /*#__PURE__*/React.createElement(Dropdown, {
31533
+ return /*#__PURE__*/React.createElement(Dropdown$1, {
31472
31534
  options: options,
31473
31535
  value: constraint.matchMode,
31474
31536
  onChange: function onChange(e) {
@@ -33595,58 +33657,60 @@ var DataTable = /*#__PURE__*/React.forwardRef(function (inProps, ref) {
33595
33657
  var exportCSV = function exportCSV(options) {
33596
33658
  var data;
33597
33659
  var csv = "\uFEFF";
33598
- var columns = getColumns();
33599
33660
  if (options && options.selectionOnly) {
33600
33661
  data = props.selection || [];
33601
33662
  } else {
33602
33663
  data = [].concat(_toConsumableArray$1(props.frozenValue || []), _toConsumableArray$1(processedData() || []));
33603
33664
  }
33604
33665
 
33605
- //headers
33606
- columns.forEach(function (column, i) {
33607
- var _ref5 = [getColumnProp(column, 'field'), getColumnProp(column, 'header'), getColumnProp(column, 'exportHeader'), getColumnProp(column, 'exportable')],
33666
+ // First build collection of exportable columns
33667
+ var exportableColumns = getColumns().filter(function (column) {
33668
+ var exportable = getColumnProp(column, 'exportable');
33669
+ var field = getColumnProp(column, 'field');
33670
+
33671
+ // Column must be exportable (or undefined/not set) and have a field defined
33672
+ return exportable !== false && field;
33673
+ });
33674
+
33675
+ // headers
33676
+ exportableColumns.forEach(function (column, i) {
33677
+ var _ref5 = [getColumnProp(column, 'field'), getColumnProp(column, 'header'), getColumnProp(column, 'exportHeader')],
33608
33678
  field = _ref5[0],
33609
33679
  header = _ref5[1],
33610
- exportHeader = _ref5[2],
33611
- exportable = _ref5[3];
33612
- if (exportable && field) {
33613
- var columnHeader = String(exportHeader || header || field).replace(/"/g, '""').replace(/\n/g, "\u2028");
33614
- csv = csv + ('"' + columnHeader + '"');
33615
- if (i < columns.length - 1) {
33616
- csv = csv + props.csvSeparator;
33617
- }
33680
+ exportHeader = _ref5[2];
33681
+ var columnHeader = String(exportHeader || header || field).replace(/"/g, '""').replace(/\n/g, "\u2028");
33682
+ csv = csv + ('"' + columnHeader + '"');
33683
+ if (i < exportableColumns.length - 1) {
33684
+ csv = csv + props.csvSeparator;
33618
33685
  }
33619
33686
  });
33620
33687
 
33621
- //body
33688
+ // body
33622
33689
  data.forEach(function (record) {
33623
33690
  csv = csv + '\n';
33624
- columns.forEach(function (column, i) {
33625
- var _ref6 = [getColumnProp(column, 'field'), getColumnProp(column, 'exportField'), getColumnProp(column, 'exportable')],
33691
+ exportableColumns.forEach(function (column, i) {
33692
+ var _ref6 = [getColumnProp(column, 'field'), getColumnProp(column, 'exportField')],
33626
33693
  colField = _ref6[0],
33627
- exportField = _ref6[1],
33628
- exportable = _ref6[2];
33694
+ exportField = _ref6[1];
33629
33695
  var field = exportField || colField;
33630
- if (exportable && field) {
33631
- var cellData = ObjectUtils.resolveFieldData(record, field);
33632
- if (cellData != null) {
33633
- if (props.exportFunction) {
33634
- cellData = props.exportFunction({
33635
- data: cellData,
33636
- field: field,
33637
- rowData: record,
33638
- column: column
33639
- });
33640
- } else {
33641
- cellData = String(cellData).replace(/"/g, '""').replace(/\n/g, "\u2028");
33642
- }
33696
+ var cellData = ObjectUtils.resolveFieldData(record, field);
33697
+ if (cellData != null) {
33698
+ if (props.exportFunction) {
33699
+ cellData = props.exportFunction({
33700
+ data: cellData,
33701
+ field: field,
33702
+ rowData: record,
33703
+ column: column
33704
+ });
33643
33705
  } else {
33644
- cellData = '';
33645
- }
33646
- csv = csv + ('"' + cellData + '"');
33647
- if (i < columns.length - 1) {
33648
- csv = csv + props.csvSeparator;
33706
+ cellData = String(cellData).replace(/"/g, '""').replace(/\n/g, "\u2028");
33649
33707
  }
33708
+ } else {
33709
+ cellData = '';
33710
+ }
33711
+ csv = csv + ('"' + cellData + '"');
33712
+ if (i < exportableColumns.length - 1) {
33713
+ csv = csv + props.csvSeparator;
33650
33714
  }
33651
33715
  });
33652
33716
  });
@@ -33911,6 +33975,9 @@ var DataTable = /*#__PURE__*/React.forwardRef(function (inProps, ref) {
33911
33975
  var frozenBody = ObjectUtils.isNotEmpty(props.frozenValue) && /*#__PURE__*/React.createElement(TableBody, {
33912
33976
  hostName: "DataTable",
33913
33977
  ref: frozenBodyRef,
33978
+ cellMemo: props.cellMemo,
33979
+ cellMemoProps: props.cellMemoProps,
33980
+ cellMemoPropsDepth: props.cellMemoPropsDepth,
33914
33981
  cellClassName: props.cellClassName,
33915
33982
  cellSelection: props.cellSelection,
33916
33983
  checkIcon: props.checkIcon,
@@ -33995,6 +34062,9 @@ var DataTable = /*#__PURE__*/React.forwardRef(function (inProps, ref) {
33995
34062
  var body = /*#__PURE__*/React.createElement(TableBody, {
33996
34063
  hostName: "DataTable",
33997
34064
  ref: bodyRef,
34065
+ cellMemo: props.cellMemo,
34066
+ cellMemoProps: props.cellMemoProps,
34067
+ cellMemoPropsDepth: props.cellMemoPropsDepth,
33998
34068
  cellClassName: props.cellClassName,
33999
34069
  cellSelection: props.cellSelection,
34000
34070
  checkIcon: props.checkIcon,
@@ -34789,6 +34859,7 @@ var DialogBase = ComponentBase.extend({
34789
34859
  resizable: true,
34790
34860
  rtl: false,
34791
34861
  showHeader: true,
34862
+ showCloseIcon: true,
34792
34863
  style: null,
34793
34864
  transitionOptions: null,
34794
34865
  visible: false,
@@ -34920,7 +34991,7 @@ var Dialog = /*#__PURE__*/React.forwardRef(function (inProps, ref) {
34920
34991
  var focus = function focus() {
34921
34992
  var activeElement = document.activeElement;
34922
34993
  var isActiveElementInDialog = activeElement && dialogRef.current && dialogRef.current.contains(activeElement);
34923
- if (!isActiveElementInDialog && props.closable && props.showHeader && closeRef.current) {
34994
+ if (!isActiveElementInDialog && props.closable && props.showCloseIcon && props.showHeader && closeRef.current) {
34924
34995
  closeRef.current.focus();
34925
34996
  }
34926
34997
  };
@@ -35226,7 +35297,7 @@ var Dialog = /*#__PURE__*/React.forwardRef(function (inProps, ref) {
35226
35297
  };
35227
35298
  });
35228
35299
  var createCloseIcon = function createCloseIcon() {
35229
- if (props.closable) {
35300
+ if (props.closable && props.showCloseIcon) {
35230
35301
  var labelAria = props.ariaCloseIconLabel || ariaLabel$2('close');
35231
35302
  var closeButtonIconProps = mergeProps({
35232
35303
  className: cx('closeButtonIcon'),
@@ -35687,4 +35758,86 @@ var PopupPresets = {
35687
35758
  }
35688
35759
  };
35689
35760
 
35690
- export { Accordeon, AccordeonPresets, Button, ButtonPresets, DatePicker, DatePickerPresets, Infobulle, InfobullePresets, Popup, PopupPresets };
35761
+ var Dropdown = function Dropdown(_ref) {
35762
+ var _ref$options = _ref.options,
35763
+ options = _ref$options === void 0 ? [] : _ref$options;
35764
+ _ref.value;
35765
+ var _ref$placeholder = _ref.placeholder,
35766
+ placeholder = _ref$placeholder === void 0 ? 'Sélectionnez une option' : _ref$placeholder,
35767
+ _ref$disabled = _ref.disabled,
35768
+ disabled = _ref$disabled === void 0 ? false : _ref$disabled,
35769
+ _ref$filter = _ref.filter,
35770
+ filter = _ref$filter === void 0 ? false : _ref$filter,
35771
+ _ref$optionLabel = _ref.optionLabel,
35772
+ optionLabel = _ref$optionLabel === void 0 ? 'label' : _ref$optionLabel;
35773
+ _ref.optionValue;
35774
+ var _ref$invalid = _ref.invalid,
35775
+ invalid = _ref$invalid === void 0 ? false : _ref$invalid,
35776
+ _ref$errorMessage = _ref.errorMessage,
35777
+ errorMessage = _ref$errorMessage === void 0 ? '' : _ref$errorMessage;
35778
+ var _useState = useState(null),
35779
+ _useState2 = _slicedToArray$8(_useState, 2),
35780
+ optionSelected = _useState2[0],
35781
+ setOptionSelected = _useState2[1];
35782
+ var style = {
35783
+ border: invalid ? '1px solid red' : '1px solid #ccc',
35784
+ width: '290px'
35785
+ };
35786
+ return /*#__PURE__*/React__default.createElement("div", {
35787
+ className: "flex flex-col gap-1",
35788
+ style: {
35789
+ width: '100%'
35790
+ }
35791
+ }, /*#__PURE__*/React__default.createElement(Dropdown$1, {
35792
+ value: optionSelected,
35793
+ options: options,
35794
+ onChange: function onChange(e) {
35795
+ return setOptionSelected(e.value);
35796
+ },
35797
+ placeholder: placeholder,
35798
+ disabled: disabled,
35799
+ filter: filter,
35800
+ optionLabel: optionLabel,
35801
+ style: style
35802
+ }), invalid && /*#__PURE__*/React__default.createElement("div", null, /*#__PURE__*/React__default.createElement("small", {
35803
+ style: {
35804
+ color: 'red',
35805
+ fontStyle: 'italic'
35806
+ }
35807
+ }, errorMessage || 'Sélection invalide')));
35808
+ };
35809
+
35810
+ var optionsExample = [{
35811
+ label: 'Option 1',
35812
+ code: '1'
35813
+ }, {
35814
+ label: 'Option 2',
35815
+ code: '2'
35816
+ }, {
35817
+ label: 'Option 3',
35818
+ code: '3'
35819
+ }];
35820
+ var DropdownPresets = {
35821
+ Default: {
35822
+ placeholder: 'Sélectionnez une option',
35823
+ options: optionsExample
35824
+ },
35825
+ Disabled: {
35826
+ placeholder: 'Sélection désactivée',
35827
+ options: optionsExample,
35828
+ disabled: true
35829
+ },
35830
+ Filterable: {
35831
+ placeholder: 'Filtrez une option',
35832
+ options: optionsExample,
35833
+ filter: true
35834
+ },
35835
+ Invalid: {
35836
+ placeholder: 'Sélection invalide',
35837
+ options: optionsExample,
35838
+ invalid: true,
35839
+ errorMessage: 'Vous devez choisir une option'
35840
+ }
35841
+ };
35842
+
35843
+ export { Accordeon, AccordeonPresets, Button, ButtonPresets, DatePicker, DatePickerPresets, Dropdown, DropdownPresets, Infobulle, InfobullePresets, Popup, PopupPresets };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "arengibook",
3
3
  "private": false,
4
- "version": "2.4.49",
4
+ "version": "2.4.50",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",
7
7
  "exports": {
@@ -37,6 +37,7 @@
37
37
  "@rollup/plugin-babel": "^6.0.4",
38
38
  "@rollup/plugin-commonjs": "^28.0.3",
39
39
  "@rollup/plugin-node-resolve": "^16.0.1",
40
+ "@rollup/plugin-url": "^8.0.2",
40
41
  "@storybook/addon-docs": "^8.6.12",
41
42
  "@storybook/addon-essentials": "^8.6.12",
42
43
  "@storybook/addon-onboarding": "^8.6.12",