@bigbinary/neeto-filters-frontend 2.11.19 → 2.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,14 +1,14 @@
1
1
  import React, { useContext, useState, useRef, useEffect, useCallback, useMemo } from 'react';
2
2
  import classnames from 'classnames';
3
- import { removeBy, findBy, isNotEmpty, humanize, noop as noop$2, toLabelAndValue, replaceBy, isPresent, existsBy, filterBy } from '@bigbinary/neeto-commons-frontend/pure';
3
+ import { capitalize as capitalize$1, removeBy, findBy, isNotEmpty, humanize, noop as noop$2, toLabelAndValue, replaceBy, isPresent, existsBy, filterBy } from '@bigbinary/neeto-commons-frontend/pure';
4
4
  import { Tooltip, Typography, Dropdown as Dropdown$2, Button, Pane as Pane$1, Alert, Select, DatePicker, TimePicker, Input as Input$1, Accordion, Spinner } from '@bigbinary/neetoui';
5
- import { groupBy, anyPass, isNil, isEmpty, any, mergeLeft, identity, omit, mergeRight, concat, pluck, either, has as has$1, toPairs, equals, pick, modify, prop, isNotNil, append, last } from 'ramda';
5
+ import { groupBy, anyPass, isNil, isEmpty, any, mergeLeft, identity, omit, mergeRight, concat, pluck, either, has as has$1, toPairs, equals, pick, modify, prop, isNotNil, append, last, not } from 'ramda';
6
6
  import { useHistory, useLocation } from 'react-router-dom';
7
7
  import { useHotKeys, useDebounce } from '@bigbinary/neeto-commons-frontend/react-utils';
8
8
  import { Close, Search, Check, MenuHorizontal, Down, Settings } from '@bigbinary/neeto-icons';
9
+ import dayjs from 'dayjs';
9
10
  import { getQueryParams, dateFormat } from '@bigbinary/neeto-commons-frontend/utils';
10
11
  import * as yup from 'yup';
11
- import dayjs from 'dayjs';
12
12
  import timezone from 'dayjs/plugin/timezone';
13
13
  import utc from 'dayjs/plugin/utc';
14
14
  import weekday from 'dayjs/plugin/weekday';
@@ -3360,6 +3360,12 @@ var DATE_OPTIONS = [{
3360
3360
  }, {
3361
3361
  label: "All time",
3362
3362
  value: "all-time"
3363
+ }, {
3364
+ label: "After",
3365
+ value: "after"
3366
+ }, {
3367
+ label: "Before",
3368
+ value: "before"
3363
3369
  }, {
3364
3370
  label: "Custom date range",
3365
3371
  value: "custom-date-range"
@@ -3504,28 +3510,28 @@ var groupByGroup = groupBy(function (_ref) {
3504
3510
  return group || "individual";
3505
3511
  });
3506
3512
  var isBoolean = function isBoolean(type) {
3507
- return type === "boolean";
3513
+ return type === "boolean" || type === "custom.boolean";
3508
3514
  };
3509
3515
  var isDate = function isDate(type) {
3510
- return type === "date";
3516
+ return type === "date" || type === "custom.date";
3511
3517
  };
3512
3518
  var isSingleDate = function isSingleDate(type) {
3513
- return type === "single_date";
3519
+ return type === "single_date" || type === "custom.single_date";
3514
3520
  };
3515
3521
  var isSingleTime = function isSingleTime(type) {
3516
- return type === "single_time";
3522
+ return type === "single_time" || type === "custom.single_time";
3517
3523
  };
3518
3524
  var isTime = function isTime(type) {
3519
- return type === "time";
3525
+ return type === "time" || type === "custom.time";
3520
3526
  };
3521
3527
  var isMulti = function isMulti(type) {
3522
- return type === "multi_option";
3528
+ return type === "multi_option" || type === "custom.multi_option";
3523
3529
  };
3524
3530
  var isText = function isText(type) {
3525
- return type === "text";
3531
+ return type === "text" || type === "custom.text";
3526
3532
  };
3527
3533
  var isDigit = function isDigit(type) {
3528
- return type === "number" || type === "decimal";
3534
+ return type === "number" || type === "decimal" || type === "custom.number";
3529
3535
  };
3530
3536
  var isCustomDateRange = function isCustomDateRange(value) {
3531
3537
  return !pluck("value", DATE_OPTIONS).includes(value);
@@ -3586,7 +3592,7 @@ var splitFilter = function splitFilter(multiColumnFilter) {
3586
3592
  var buildDateValue = function buildDateValue(_ref6) {
3587
3593
  var value = _ref6.value;
3588
3594
  var rule = DATE_RULES[value] || "between";
3589
- var dateValue = value === "custom-date-range" ? "" : value;
3595
+ var dateValue = ["before", "after", "custom-date-range"].includes(value) ? "" : value;
3590
3596
  return {
3591
3597
  value: dateValue,
3592
3598
  rule: rule,
@@ -4038,7 +4044,47 @@ var buildUrlFromSegment = function buildUrlFromSegment(_ref19) {
4038
4044
  var getKeywordValueFromUrl = function getKeywordValueFromUrl() {
4039
4045
  return getQueryParams()["keyword"] || "";
4040
4046
  };
4047
+ var buildFilterColumnsFromFields = function buildFilterColumnsFromFields(fields) {
4048
+ var selectedFields = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
4049
+ if (isEmpty(selectedFields)) {
4050
+ return fields.map(function (field) {
4051
+ var id = field.id,
4052
+ name = field.name,
4053
+ kind = field.kind;
4054
+ return {
4055
+ key: name,
4056
+ node: "".concat(name, ":").concat(id),
4057
+ label: capitalize$1(name),
4058
+ type: "custom.".concat(kind)
4059
+ };
4060
+ });
4061
+ }
4062
+ return fields.reduce(function (columns, field) {
4063
+ if (selectedFields.includes(field.name)) {
4064
+ var id = field.id,
4065
+ name = field.name,
4066
+ kind = field.kind;
4067
+ columns.push({
4068
+ key: name,
4069
+ node: "".concat(name, ":").concat(id),
4070
+ label: capitalize$1(name),
4071
+ type: "custom.".concat(kind)
4072
+ });
4073
+ }
4074
+ return columns;
4075
+ }, []);
4076
+ };
4041
4077
 
4078
+ var buildCustomDateValue = function buildCustomDateValue(value) {
4079
+ var isBeforeOrAfter = Math.abs(dayjs(value[1]).diff(dayjs(value[0]), "year")) >= 90;
4080
+ if (isBeforeOrAfter) {
4081
+ var currentMoment = dayjs();
4082
+ var diffWithStart = Math.abs(currentMoment.diff(dayjs(value[0]), "year"));
4083
+ var diffWithEnd = Math.abs(currentMoment.diff(dayjs(value[1]), "year"));
4084
+ return diffWithStart < diffWithEnd ? "after-".concat(dateFormat.date(dayjs(value[0]).subtract(1, "day"))) : "before-".concat(dateFormat.date(dayjs(value[1]).add(1, "day")));
4085
+ }
4086
+ return value.map(dateFormat.date).join(" - ");
4087
+ };
4042
4088
  var buildFilterValue = function buildFilterValue(filter) {
4043
4089
  var _findBy2;
4044
4090
  var _filter$defaultType = filter.defaultType,
@@ -4051,7 +4097,7 @@ var buildFilterValue = function buildFilterValue(filter) {
4051
4097
  return value.toString();
4052
4098
  }));
4053
4099
  if (isDate(defaultType) && isCustomDateRange(value)) {
4054
- return value.map(dateFormat.date).join(" - ");
4100
+ return buildCustomDateValue(value);
4055
4101
  } else if (isTime(defaultType) && isCustomTimeRange(value)) {
4056
4102
  return value.map(dateFormat.time).join(" - ");
4057
4103
  } else if (isDate(defaultType) || isTime(defaultType)) {
@@ -7101,13 +7147,6 @@ var buildDropdownValue = function buildDropdownValue(_ref) {
7101
7147
  value: filter.value
7102
7148
  }, options);
7103
7149
  };
7104
- var buildDatetimeValue = function buildDatetimeValue(filter) {
7105
- var _findBy;
7106
- if (!filter) return null;
7107
- return (_findBy = findBy({
7108
- value: filter.value
7109
- }, DATE_OPTIONS)) !== null && _findBy !== void 0 ? _findBy : last(DATE_OPTIONS);
7110
- };
7111
7150
  var buildSingleTimeValue = function buildSingleTimeValue(filter) {
7112
7151
  var _findBy2;
7113
7152
  if (!filter) return null;
@@ -7144,6 +7183,44 @@ var buildDropdownOptions = function buildDropdownOptions(_ref3) {
7144
7183
  }
7145
7184
  return options;
7146
7185
  };
7186
+ var initializeDateRule = function initializeDateRule(filter) {
7187
+ return filter ? findBy({
7188
+ value: filter === null || filter === void 0 ? void 0 : filter.value
7189
+ }, DATE_OPTIONS) || findDateOption(filter, DATE_OPTIONS) : {};
7190
+ };
7191
+ var getDateValue = function getDateValue(value, rule) {
7192
+ if (isEmpty(value) || isNil(value)) {
7193
+ return null;
7194
+ }
7195
+ if (rule.value === "custom-date-range") {
7196
+ return value;
7197
+ }
7198
+ return rule.value === "before" ? dayjs(value[1]).add(1, "day") : dayjs(value[0]).subtract(1, "day");
7199
+ };
7200
+ var findDateOption = function findDateOption(filter, options) {
7201
+ var value = filter.value;
7202
+ var isBeforeOrAfter = dayjs(value[1]).diff(dayjs(value[0]), "year") >= 90;
7203
+ if (not(isBeforeOrAfter)) {
7204
+ return last(options);
7205
+ }
7206
+ var currentMoment = dayjs();
7207
+ var diffWithStart = Math.abs(currentMoment.diff(dayjs(value[0]), "year"));
7208
+ var diffWithEnd = Math.abs(currentMoment.diff(dayjs(value[1]), "year"));
7209
+ var returnOption = diffWithStart < diffWithEnd ? findBy({
7210
+ value: "after"
7211
+ }, options) : findBy({
7212
+ value: "before"
7213
+ }, options);
7214
+ return returnOption;
7215
+ };
7216
+ var buildDateValues = function buildDateValues(dates, selectedRule) {
7217
+ if (selectedRule.value === "after") {
7218
+ return [dates.add(1, "day"), dates.add(100, "year")];
7219
+ } else if (selectedRule.value === "before") {
7220
+ return [dates.subtract(100, "year"), dates.subtract(1, "day")];
7221
+ }
7222
+ return dates;
7223
+ };
7147
7224
 
7148
7225
  var Boolean$1 = function Boolean(_ref) {
7149
7226
  var column = _ref.column,
@@ -7199,22 +7276,27 @@ var Datetime = function Datetime(_ref) {
7199
7276
  filter = _ref.filter,
7200
7277
  handleApplyFilter = _ref.handleApplyFilter,
7201
7278
  autoFocus = _ref.autoFocus;
7279
+ var _useState = useState(initializeDateRule(filter)),
7280
+ _useState2 = _slicedToArray(_useState, 2),
7281
+ selectedRule = _useState2[0],
7282
+ setSelectedRule = _useState2[1];
7283
+ var _useTranslation = useTranslation(),
7284
+ t = _useTranslation.t;
7202
7285
  var key = column.key,
7203
7286
  _column$defaultType = column.defaultType,
7204
7287
  defaultType = _column$defaultType === void 0 ? column.type : _column$defaultType,
7205
7288
  label = column.label;
7289
+ var isDatePickerShown = filter && isCustomDateRange(filter.value);
7206
7290
  var otherProps = getOtherProps(column);
7207
- var value = buildDatetimeValue(filter);
7208
- var isCustomDateRangeShown = filter && isCustomDateRange(filter.value);
7209
- var _useTranslation = useTranslation(),
7210
- t = _useTranslation.t;
7211
7291
  var handleChange = function handleChange(option) {
7212
7292
  if (isEmpty(option) || isNil(option)) {
7213
7293
  handleApplyFilter({
7214
7294
  _delete: true
7215
7295
  });
7296
+ setSelectedRule({});
7216
7297
  return;
7217
7298
  }
7299
+ setSelectedRule(option);
7218
7300
  var updatedFilter = buildUpdatedFilter({
7219
7301
  column: column,
7220
7302
  defaultType: defaultType,
@@ -7227,13 +7309,14 @@ var Datetime = function Datetime(_ref) {
7227
7309
  handleApplyFilter({
7228
7310
  _delete: true
7229
7311
  });
7312
+ setSelectedRule({});
7230
7313
  return;
7231
7314
  }
7232
7315
  var updatedFilter = buildUpdatedFilter({
7233
7316
  column: column,
7234
7317
  defaultType: defaultType,
7235
7318
  option: {
7236
- value: pluck("$d", dates).map(function (date) {
7319
+ value: pluck("$d", buildDateValues(dates, selectedRule)).map(function (date) {
7237
7320
  return date.toISOString();
7238
7321
  })
7239
7322
  }
@@ -7249,15 +7332,15 @@ var Datetime = function Datetime(_ref) {
7249
7332
  label: label,
7250
7333
  options: DATE_OPTIONS,
7251
7334
  strategy: "fixed",
7252
- value: value,
7335
+ value: selectedRule,
7253
7336
  placeholder: t("messages.selectResource", {
7254
7337
  resource: label.toLocaleLowerCase()
7255
7338
  }),
7256
7339
  onChange: handleChange
7257
- }), isCustomDateRangeShown && /*#__PURE__*/React.createElement(DatePicker, _extends$1({
7340
+ }), isDatePickerShown && /*#__PURE__*/React.createElement(DatePicker, _extends$1({
7258
7341
  "data-cy": "neeto-filters-".concat(key, "-date-range"),
7259
- type: "range",
7260
- value: filter.value,
7342
+ type: (selectedRule === null || selectedRule === void 0 ? void 0 : selectedRule.value) === "custom-date-range" ? "range" : "date",
7343
+ value: getDateValue(filter === null || filter === void 0 ? void 0 : filter.value, selectedRule),
7261
7344
  onChange: handleDateRangeChange
7262
7345
  }, otherProps)));
7263
7346
  };
@@ -7506,7 +7589,7 @@ var Text = function Text(_ref) {
7506
7589
  var ruleOptions = buildRuleOptions({
7507
7590
  defaultType: defaultType
7508
7591
  });
7509
- var inputType = defaultType === "text" ? "text" : "number";
7592
+ var inputType = defaultType === "text" || defaultType === "custom.text" ? "text" : "number";
7510
7593
  var _useState = useState(filter === null || filter === void 0 ? void 0 : filter.value),
7511
7594
  _useState2 = _slicedToArray(_useState, 2),
7512
7595
  inputValue = _useState2[0],
@@ -8361,5 +8444,5 @@ instance.use(initReactI18next).init({
8361
8444
  }
8362
8445
  });
8363
8446
 
8364
- export { Bar, Filters, index as Segments, buildFiltersFromURL, buildSelectorsFromURL };
8447
+ export { Bar, Filters, index as Segments, buildFilterColumnsFromFields, buildFiltersFromURL, buildSelectorsFromURL };
8365
8448
  //# sourceMappingURL=index.js.map