@synerise/ds-filter 1.0.10 → 1.1.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/CHANGELOG.md CHANGED
@@ -3,6 +3,17 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [1.1.0](https://github.com/Synerise/synerise-design/compare/@synerise/ds-filter@1.0.10...@synerise/ds-filter@1.1.0) (2025-06-05)
7
+
8
+
9
+ ### Features
10
+
11
+ * **filter:** change dnd lib and update ux ([f5a979e](https://github.com/Synerise/synerise-design/commit/f5a979e6c9e5d9c8251c3f57da8ce57c416dadab))
12
+
13
+
14
+
15
+
16
+
6
17
  ## [1.0.10](https://github.com/Synerise/synerise-design/compare/@synerise/ds-filter@1.0.9...@synerise/ds-filter@1.0.10) (2025-06-03)
7
18
 
8
19
  **Note:** Version bump only for package @synerise/ds-filter
package/dist/Filter.js CHANGED
@@ -1,22 +1,16 @@
1
1
  function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
2
2
  import React, { useCallback, useMemo, useEffect, useState, useRef } from 'react';
3
3
  import { useIntl } from 'react-intl';
4
- import { ReactSortable } from 'react-sortablejs';
5
- import Logic from '@synerise/ds-logic';
6
- import Matching from '@synerise/ds-logic/dist/Matching/Matching';
7
- import Placeholder from '@synerise/ds-logic/dist/Placeholder/Placeholder';
8
- import StepCard from '@synerise/ds-step-card';
9
- import { usePrevious } from '@synerise/ds-utils';
4
+ import Sortable from '@synerise/ds-sortable';
5
+ import { Matching, Placeholder } from '@synerise/ds-logic';
6
+ import { NOOP, usePrevious } from '@synerise/ds-utils';
10
7
  import * as S from './Filter.styles';
11
- var component = {
12
- LOGIC: Logic,
13
- STEP: StepCard
14
- };
8
+ import { ExpressionItem, DraggableExpressionItem } from './components/ExpressionItem';
9
+ import { isStepType } from './utils';
15
10
  var TRANSITION_DURATION = 0.5;
16
11
  var TRANSITION_DURATION_MAX = 1.5;
17
12
  var TOP_TRANSITION_ZINDEX = 1003;
18
13
  var BOTTOM_TRANSITION_ZINDEX = 1002;
19
- var DRAGGING_TRANSITION_ZINDEX = 1004;
20
14
  var rearrangeItems = function rearrangeItems(sourceArray, oldIndex, newIndex) {
21
15
  sourceArray.splice(newIndex, 0, sourceArray.splice(oldIndex, 1)[0]);
22
16
  return [].concat(sourceArray);
@@ -54,26 +48,6 @@ var Filter = function Filter(_ref) {
54
48
  setActiveExpressionId = _useState[1];
55
49
  var expressionRefs = useRef({});
56
50
  var movedExpressionId = useRef(null);
57
- var SORTABLE_CONFIG = useMemo(function () {
58
- return {
59
- ghostClass: 'ghost-element',
60
- className: 'sortable-list',
61
- handle: '.step-card-drag-handler',
62
- animation: 200,
63
- forceFallback: true,
64
- filter: '.ds-matching-toggle, .step-card-right-side',
65
- onStart: function onStart() {
66
- movedExpressionId.current = null;
67
- },
68
- onChoose: function onChoose(evt) {
69
- // eslint-disable-next-line no-param-reassign
70
- evt.item.style.zIndex = DRAGGING_TRANSITION_ZINDEX;
71
- },
72
- onUnchoose: function onUnchoose(evt) {
73
- evt.item.style.removeProperty('z-index');
74
- }
75
- };
76
- }, []);
77
51
  useEffect(function () {
78
52
  if (movedExpressionId.current && previousExpressions != null && previousExpressions.length) {
79
53
  var oldIndex = previousExpressions == null ? void 0 : previousExpressions.findIndex(function (expression) {
@@ -236,18 +210,18 @@ var Filter = function Filter(_ref) {
236
210
  return expression.type === 'STEP';
237
211
  }).length;
238
212
  }, [expressions]);
239
- var handleTransitionEnd = function handleTransitionEnd(event) {
213
+ var handleTransitionEnd = useCallback(function (event) {
240
214
  if (event.currentTarget && event.currentTarget instanceof HTMLElement) {
241
215
  event.currentTarget.style.removeProperty('z-index');
242
216
  }
243
- };
217
+ }, []);
244
218
  var handleMove = useCallback(function (index, offset) {
245
219
  var newIndex = index + offset;
246
220
  var newOrder = rearrangeItems([].concat(expressions), index, newIndex);
247
221
  movedExpressionId.current = newOrder[newIndex].id;
248
222
  onChangeOrder && onChangeOrder(newOrder);
249
223
  }, [expressions, onChangeOrder]);
250
- var componentProps = useCallback(function (expression, index) {
224
+ var getStepProps = useCallback(function (expression, index) {
251
225
  var contextTypeTexts = getContextTypeTexts(expression);
252
226
  var reorderProps = {
253
227
  expressionIndex: index,
@@ -255,73 +229,95 @@ var Filter = function Filter(_ref) {
255
229
  expressionCount: stepExpressionCount,
256
230
  onMove: handleMove
257
231
  };
258
- var props = {
259
- LOGIC: {
260
- onChange: onChangeLogic ? function (value) {
261
- return onChangeLogic(expression.id, value);
262
- } : undefined,
263
- options: logicOptions
264
- },
265
- STEP: _extends({}, reorderProps, {
266
- onChangeMatching: onChangeStepMatching ? function (value) {
267
- return onChangeStepMatching(expression.id, value);
268
- } : undefined,
269
- onChangeName: onChangeStepName ? function (value) {
270
- return onChangeStepName(expression.id, value);
271
- } : undefined,
272
- onDelete: onDeleteStep ? function () {
273
- return onDeleteStep(expression.id);
274
- } : undefined,
275
- onDuplicate: onDuplicateStep && !isLimitExceeded ? function () {
276
- return onDuplicateStep(expression.id);
277
- } : undefined,
278
- footer: renderStepFooter && renderStepFooter(expression),
279
- children: renderStepContent && renderStepContent(expression, !!activeExpressionId && !isActive(expression)),
280
- isHeaderVisible: visibilityConfig.isStepCardHeaderVisible,
281
- headerRightSide: renderStepHeaderRightSide && renderStepHeaderRightSide(expression, index),
282
- isDraggable: Boolean(onChangeOrder),
283
- singleStepCondition: Boolean(singleStepCondition),
284
- additionalFields: expression.data.additionalFields,
285
- getMoveByLabel: getMoveByLabel,
286
- texts: _extends({}, text.step, contextTypeTexts)
287
- })
232
+ return _extends({}, reorderProps, {
233
+ onChangeMatching: onChangeStepMatching ? function (value) {
234
+ return onChangeStepMatching(expression.id, value);
235
+ } : undefined,
236
+ onChangeName: onChangeStepName ? function (value) {
237
+ return onChangeStepName(expression.id, value);
238
+ } : undefined,
239
+ onDelete: onDeleteStep ? function () {
240
+ return onDeleteStep(expression.id);
241
+ } : undefined,
242
+ onDuplicate: onDuplicateStep && !isLimitExceeded ? function () {
243
+ return onDuplicateStep(expression.id);
244
+ } : undefined,
245
+ footer: renderStepFooter && renderStepFooter(expression),
246
+ children: renderStepContent && renderStepContent(expression, !!activeExpressionId && !isActive(expression)),
247
+ isHeaderVisible: visibilityConfig.isStepCardHeaderVisible,
248
+ renderHeaderRightSide: renderStepHeaderRightSide ? function (itemIndex, options) {
249
+ return renderStepHeaderRightSide(expression, itemIndex, options);
250
+ } : undefined,
251
+ isDraggable: Boolean(onChangeOrder),
252
+ singleStepCondition: Boolean(singleStepCondition),
253
+ additionalFields: expression.data.additionalFields,
254
+ getMoveByLabel: getMoveByLabel,
255
+ dropLabel: text.dropMeHere,
256
+ texts: _extends({}, text.step, contextTypeTexts)
257
+ });
258
+ }, [activeExpressionId, getContextTypeTexts, getMoveByLabel, handleMove, isActive, isLimitExceeded, onChangeStepMatching, onChangeStepName, onDeleteStep, onDuplicateStep, renderStepContent, renderStepFooter, renderStepHeaderRightSide, stepExpressionCount, text.step, text.dropMeHere, visibilityConfig.isStepCardHeaderVisible, singleStepCondition, onChangeOrder]);
259
+ var getLogicProps = useCallback(function (expression) {
260
+ return {
261
+ value: '',
262
+ onChange: onChangeLogic ? function (value) {
263
+ return onChangeLogic(expression.id, value);
264
+ } : NOOP,
265
+ options: logicOptions
288
266
  };
289
- return props[expression.type];
290
- }, [activeExpressionId, getContextTypeTexts, getMoveByLabel, handleMove, isActive, isLimitExceeded, logicOptions, onChangeLogic, onChangeStepMatching, onChangeStepName, onDeleteStep, onDuplicateStep, renderStepContent, renderStepFooter, renderStepHeaderRightSide, stepExpressionCount, text.step, visibilityConfig.isStepCardHeaderVisible, singleStepCondition, onChangeOrder]);
291
- var renderExpression = useCallback(
292
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
293
- function (expression, index) {
294
- var Component = component[expression.type];
295
- var LogicComponent = expression.logic && component[expression.logic.type];
296
- return /*#__PURE__*/React.createElement(S.ExpressionWrapper, {
297
- "data-testid": "condition-step",
298
- onTransitionEnd: handleTransitionEnd,
299
- ref: function ref(element) {
300
- return expressionRefs.current[expression.id] = element;
301
- },
302
- key: expression.id,
303
- "data-dropLabel": text.dropMeHere,
304
- index: index,
305
- onMouseDown: function onMouseDown() {
306
- return setActiveExpressionId(expression.id);
307
- }
308
- }, /*#__PURE__*/React.createElement(Component, _extends({}, expression.data, componentProps(expression, index), {
309
- readOnly: readOnly
310
- })), expression.logic && index + 1 < expressions.length && LogicComponent && /*#__PURE__*/React.createElement(S.LogicWrapper, {
311
- "data-testid": "condition-logic"
312
- }, /*#__PURE__*/React.createElement(LogicComponent, _extends({}, expression.logic.data, componentProps(expression.logic, index), {
313
- readOnly: readOnly
314
- }))));
315
- }, [text.dropMeHere, componentProps, expressions.length, readOnly]);
267
+ }, [onChangeLogic, logicOptions]);
268
+ var expressionData = useMemo(function () {
269
+ var expressionsOrder = expressions.map(function (expression) {
270
+ return expression.id;
271
+ });
272
+ return expressions.map(function (expression, index) {
273
+ var logicProps = isStepType(expression) && expression.logic ? getLogicProps(expression.logic) : {
274
+ value: '',
275
+ onChange: NOOP
276
+ };
277
+ var stepProps = isStepType(expression) ? getStepProps(expression, index) : {};
278
+ return {
279
+ wrapperRef: function wrapperRef(element) {
280
+ return expressionRefs.current[expression.id] = element;
281
+ },
282
+ dropLabel: text.dropMeHere,
283
+ logicProps: logicProps,
284
+ stepProps: stepProps,
285
+ handleMouseDown: function handleMouseDown() {
286
+ return setActiveExpressionId(expression.id);
287
+ },
288
+ handleTransitionEnd: handleTransitionEnd,
289
+ expression: expression,
290
+ expressionsOrder: expressionsOrder,
291
+ id: expression.id,
292
+ expressionIndex: index,
293
+ readOnly: readOnly,
294
+ isLast: index === expressions.length - 1
295
+ };
296
+ });
297
+ }, [expressions, readOnly, handleTransitionEnd, setActiveExpressionId, getStepProps, getLogicProps, text.dropMeHere]);
298
+ var handleChangeOrder = useCallback(function (newOrder) {
299
+ if (onChangeOrder) {
300
+ var idOrder = newOrder.map(function (item) {
301
+ return item.id;
302
+ });
303
+ var updatedExpressions = [].concat(expressions).sort(function (a, b) {
304
+ return idOrder.indexOf(a.id) - idOrder.indexOf(b.id);
305
+ });
306
+ onChangeOrder(updatedExpressions);
307
+ }
308
+ }, [onChangeOrder, expressions]);
316
309
  var renderExpressions = useCallback(function () {
317
310
  if (onChangeOrder) {
318
- return /*#__PURE__*/React.createElement(ReactSortable, _extends({}, SORTABLE_CONFIG, {
319
- list: expressions,
320
- setList: onChangeOrder
321
- }), expressions.map(renderExpression));
311
+ return /*#__PURE__*/React.createElement(Sortable, {
312
+ placeholderCss: S.placeholderCss,
313
+ axis: "y",
314
+ items: expressionData,
315
+ ItemComponent: DraggableExpressionItem,
316
+ onOrderChange: handleChangeOrder
317
+ });
322
318
  }
323
- return expressions.map(renderExpression);
324
- }, [renderExpression, SORTABLE_CONFIG, expressions, onChangeOrder]);
319
+ return expressionData.map(ExpressionItem);
320
+ }, [expressionData, handleChangeOrder, onChangeOrder]);
325
321
  return /*#__PURE__*/React.createElement(S.FilterWrapper, null, /*#__PURE__*/React.createElement(S.FilterHeader, null, texts != null && (_texts$overwritten = texts.overwritten) != null && _texts$overwritten.filterTitle ? /*#__PURE__*/React.createElement(S.FilterTitle, null, texts.overwritten.filterTitle) : /*#__PURE__*/React.createElement(S.MatchingAndConditionsWrapper, null, /*#__PURE__*/React.createElement(S.MatchingWrapper, null, matching && /*#__PURE__*/React.createElement(Matching, _extends({}, matching, {
326
322
  texts: text.matching,
327
323
  readOnly: readOnly
@@ -1,3 +1,4 @@
1
+ export declare const placeholderCss: import("styled-components").FlattenInterpolation<import("styled-components").ThemeProps<any>>;
1
2
  export declare const FilterWrapper: import("styled-components").StyledComponent<"div", any, {}, never>;
2
3
  export declare const FilterHeader: import("styled-components").StyledComponent<"div", any, {}, never>;
3
4
  export declare const FilterHeaderRightSide: import("styled-components").StyledComponent<"div", any, {}, never>;
@@ -7,7 +8,8 @@ export declare const ConditionsLimit: import("styled-components").StyledComponen
7
8
  export declare const ConditionsLimitResults: import("styled-components").StyledComponent<"span", any, {}, never>;
8
9
  export declare const LogicWrapper: import("styled-components").StyledComponent<"div", any, {}, never>;
9
10
  export declare const ExpressionWrapper: import("styled-components").StyledComponent<"div", any, {
10
- index: number;
11
+ index?: number | undefined;
12
+ isDragged?: boolean | undefined;
11
13
  }, never>;
12
14
  export declare const AddButtonWrapper: import("styled-components").StyledComponent<"div", any, {}, never>;
13
15
  export declare const FilterTitle: import("styled-components").StyledComponent<"div", any, {}, never>;
@@ -1,9 +1,14 @@
1
- import styled from 'styled-components';
2
- import { Body, DragIcon, Footer } from '@synerise/ds-step-card/dist/StepCard.styles';
1
+ import styled, { css } from 'styled-components';
2
+ import { SortableItemContent } from '@synerise/ds-sortable/dist/Sortable.styles';
3
+ export var placeholderCss = css(["height:calc(100% - 24px);background-color:", ";border:0;border-left:2px solid ", ";border-radius:3px;"], function (props) {
4
+ return props.theme.palette['blue-050'];
5
+ }, function (props) {
6
+ return props.theme.palette['blue-600'];
7
+ });
3
8
  export var FilterWrapper = styled.div.withConfig({
4
9
  displayName: "Filterstyles__FilterWrapper",
5
10
  componentId: "sc-w5f27p-0"
6
- })(["display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;width:100%;"]);
11
+ })(["display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;width:100%;", "{visibility:visible;opacity:1;}"], SortableItemContent);
7
12
  export var FilterHeader = styled.div.withConfig({
8
13
  displayName: "Filterstyles__FilterHeader",
9
14
  componentId: "sc-w5f27p-1"
@@ -35,12 +40,8 @@ export var LogicWrapper = styled.div.withConfig({
35
40
  export var ExpressionWrapper = styled.div.withConfig({
36
41
  displayName: "Filterstyles__ExpressionWrapper",
37
42
  componentId: "sc-w5f27p-8"
38
- })(["width:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;position:relative;&.sortable-chosen{cursor:grabbing;width:100%;opacity:1 !important;height:50px;display:flex;align-items:center;justify-content:center;padding:0;box-shadow:0 16px 32px 0 #23293619;&&&&.ghost-element{z-index:100 !important;}", "{visibility:visible;opacity:1;}", "{position:absolute;opacity:0;height:0;}", ",", "{display:none;}}&.ghost-element{cursor:grabbing;width:100%;background-color:", ";border-left:2px solid ", ";border-radius:3px;display:flex;align-items:center;justify-content:center;padding:0;margin-bottom:24px;height:68px;box-shadow:none;position:relative;&:before{content:attr(data-dropLabel);text-align:center;position:relative;color:", ";}*{position:absolute;opacity:0;height:0;}}"], DragIcon, Body, Footer, LogicWrapper, function (props) {
39
- return props.theme.palette['blue-050'];
40
- }, function (props) {
41
- return props.theme.palette['blue-600'];
42
- }, function (props) {
43
- return props.theme.palette['blue-600'];
43
+ })(["width:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;position:relative;", ""], function (props) {
44
+ return (props.isDragged || props.index === -1) && "\n " + LogicWrapper + " {\n display: none;\n }\n ";
44
45
  });
45
46
  export var AddButtonWrapper = styled.div.withConfig({
46
47
  displayName: "Filterstyles__AddButtonWrapper",
@@ -49,6 +50,6 @@ export var AddButtonWrapper = styled.div.withConfig({
49
50
  export var FilterTitle = styled.div.withConfig({
50
51
  displayName: "Filterstyles__FilterTitle",
51
52
  componentId: "sc-w5f27p-10"
52
- })(["font-size:16px;font-weight:500;line-height:1.25;color:", ";text-align:left;user-select:none;margin-bottom:24px;flex:0 0 auto;&:first-letter{text-transform:uppercase;}"], function (props) {
53
+ })(["font-size:16px;font-weight:500;line-height:1.25;color:", ";text-align:left;user-select:none;flex:0 0 auto;&:first-letter{text-transform:uppercase;}"], function (props) {
53
54
  return props.theme.palette['grey-800'];
54
55
  });
@@ -1,7 +1,7 @@
1
- import React from 'react';
2
- import { LogicOperator, LogicOperatorValue, LogicProps } from '@synerise/ds-logic/dist/Logic.types';
3
- import { StepCardProps } from '@synerise/ds-step-card';
4
- import { MatchingProps, MatchingTexts } from '@synerise/ds-logic/dist/Matching/Matching.types';
1
+ import type { ReactNode } from 'react';
2
+ import type { LogicOperator, LogicOperatorValue, LogicProps, MatchingProps, MatchingTexts } from '@synerise/ds-logic';
3
+ import type { StepCardProps } from '@synerise/ds-step-card';
4
+ import type { DeepPartial } from '@synerise/ds-utils';
5
5
  export type LogicType = {
6
6
  type: 'LOGIC';
7
7
  id: string;
@@ -18,6 +18,36 @@ export type Expression = LogicType | StepType;
18
18
  export type addFilterComponentProps = {
19
19
  isLimitExceeded: boolean;
20
20
  };
21
+ export type FilterTexts = {
22
+ matching: MatchingTexts;
23
+ step: {
24
+ matching?: string;
25
+ notMatching?: string;
26
+ have?: string;
27
+ performed?: string;
28
+ notHave?: string;
29
+ notPerformed?: string;
30
+ attribute?: string;
31
+ event?: string;
32
+ notAttribute?: string;
33
+ notEvent?: string;
34
+ namePlaceholder?: string;
35
+ moveTooltip?: string;
36
+ moveUpTooltip?: string;
37
+ moveDownTooltip?: string;
38
+ deleteTooltip?: string;
39
+ duplicateTooltip?: string;
40
+ };
41
+ placeholder: {
42
+ chooseCondition?: string;
43
+ getPreview?: string;
44
+ };
45
+ addFilter: string;
46
+ dropMeHere: string;
47
+ overwritten: {
48
+ filterTitle?: string;
49
+ };
50
+ };
21
51
  export type FilterProps = {
22
52
  maxConditionsLimit?: number;
23
53
  expressions: Expression[];
@@ -28,45 +58,18 @@ export type FilterProps = {
28
58
  onChangeStepName?: (id: string, name: string) => void;
29
59
  onDeleteStep?: (id: string) => void;
30
60
  onDuplicateStep?: (id: string) => void;
31
- renderStepFooter?: (expression: Expression) => React.ReactNode;
32
- renderStepContent?: (expression: Expression, hoverDisabled?: boolean) => React.ReactNode;
33
- renderStepHeaderRightSide?: (expression: Expression, index: number) => React.ReactNode;
34
- addFilterComponent?: React.ReactNode | ((arg: addFilterComponentProps) => React.ReactNode);
61
+ renderStepFooter?: (expression: Expression) => ReactNode;
62
+ renderStepContent?: (expression: Expression, hoverDisabled?: boolean) => ReactNode;
63
+ renderStepHeaderRightSide?: (expression: Expression, index: number, options?: {
64
+ placeholder?: boolean;
65
+ }) => ReactNode;
66
+ addFilterComponent?: ReactNode | ((arg: addFilterComponentProps) => ReactNode);
35
67
  logicOptions?: LogicOperator[];
36
68
  readOnly?: boolean;
37
69
  singleStepCondition?: boolean;
38
- renderHeaderRightSide?: (expressions: Expression[]) => React.ReactNode;
70
+ renderHeaderRightSide?: (expressions: Expression[]) => ReactNode;
39
71
  getMoveByLabel?: (moveByOffset: number) => string;
40
- texts?: {
41
- matching?: MatchingTexts;
42
- step?: {
43
- matching?: string;
44
- notMatching?: string;
45
- have?: string;
46
- performed?: string;
47
- notHave?: string;
48
- notPerformed?: string;
49
- attribute?: string;
50
- event?: string;
51
- notAttribute?: string;
52
- notEvent?: string;
53
- namePlaceholder?: string;
54
- moveTooltip?: string;
55
- moveUpTooltip?: string;
56
- moveDownTooltip?: string;
57
- deleteTooltip?: string;
58
- duplicateTooltip?: string;
59
- };
60
- placeholder?: {
61
- chooseCondition?: string;
62
- getPreview?: string;
63
- };
64
- addFilter?: string;
65
- dropMeHere?: string;
66
- overwritten?: {
67
- filterTitle?: string;
68
- };
69
- };
72
+ texts?: DeepPartial<FilterTexts>;
70
73
  visibilityConfig?: {
71
74
  isStepCardHeaderVisible?: boolean;
72
75
  };
@@ -0,0 +1,5 @@
1
+ import React from 'react';
2
+ import type { ExpressionItemProps } from './ExpressionItem.types';
3
+ export declare const DraggableExpressionItem: ({ expressionsOrder, expression, index: sortableIndex, ...rest }: ExpressionItemProps & {
4
+ index?: number;
5
+ }) => React.JSX.Element;
@@ -0,0 +1,34 @@
1
+ var _excluded = ["expressionsOrder", "expression", "index"];
2
+ function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
3
+ function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }
4
+ import React, { useEffect, useState } from 'react';
5
+ import { useDndMonitor, arrayMove } from '@synerise/ds-sortable';
6
+ import { ExpressionItem } from './ExpressionItem';
7
+ export var DraggableExpressionItem = function DraggableExpressionItem(_ref) {
8
+ var expressionsOrder = _ref.expressionsOrder,
9
+ expression = _ref.expression,
10
+ sortableIndex = _ref.index,
11
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded);
12
+ var _useState = useState(expressionsOrder.indexOf(expression.id)),
13
+ dragIndex = _useState[0],
14
+ setDragIndex = _useState[1];
15
+ useEffect(function () {
16
+ setDragIndex(expressionsOrder.indexOf(expression.id));
17
+ }, [expressionsOrder, expression.id]);
18
+ useDndMonitor({
19
+ onDragMove: function onDragMove(event) {
20
+ var _event$over;
21
+ if (((_event$over = event.over) == null || (_event$over = _event$over.data.current) == null || (_event$over = _event$over.sortable) == null ? void 0 : _event$over.index) !== undefined) {
22
+ var _event$active$data$cu, _event$over2;
23
+ var tempOrder = arrayMove(expressionsOrder, (_event$active$data$cu = event.active.data.current) == null || (_event$active$data$cu = _event$active$data$cu.sortable) == null ? void 0 : _event$active$data$cu.index, (_event$over2 = event.over) == null || (_event$over2 = _event$over2.data.current) == null || (_event$over2 = _event$over2.sortable) == null ? void 0 : _event$over2.index);
24
+ setDragIndex(tempOrder.indexOf(expression.id));
25
+ }
26
+ }
27
+ });
28
+ return /*#__PURE__*/React.createElement(ExpressionItem, _extends({
29
+ isDragOverlay: sortableIndex === -1,
30
+ dragIndex: dragIndex,
31
+ expression: expression,
32
+ expressionsOrder: expressionsOrder
33
+ }, rest));
34
+ };
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ import type { ExpressionItemProps } from './ExpressionItem.types';
3
+ export declare const ExpressionItem: ({ handleTransitionEnd, dragHandleProps, isDragged, isDragOverlay, expression, readOnly, handleMouseDown, isLast, stepProps, logicProps, wrapperRef, expressionIndex, dragIndex, expressionsOrder, }: ExpressionItemProps) => React.JSX.Element;
@@ -0,0 +1,45 @@
1
+ function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
2
+ import React from 'react';
3
+ import Logic from '@synerise/ds-logic';
4
+ import StepCard from '@synerise/ds-step-card';
5
+ import * as S from '../../Filter.styles';
6
+ import { isStepType } from '../../utils';
7
+ export var ExpressionItem = function ExpressionItem(_ref) {
8
+ var handleTransitionEnd = _ref.handleTransitionEnd,
9
+ dragHandleProps = _ref.dragHandleProps,
10
+ isDragged = _ref.isDragged,
11
+ isDragOverlay = _ref.isDragOverlay,
12
+ expression = _ref.expression,
13
+ readOnly = _ref.readOnly,
14
+ handleMouseDown = _ref.handleMouseDown,
15
+ isLast = _ref.isLast,
16
+ stepProps = _ref.stepProps,
17
+ logicProps = _ref.logicProps,
18
+ wrapperRef = _ref.wrapperRef,
19
+ expressionIndex = _ref.expressionIndex,
20
+ dragIndex = _ref.dragIndex,
21
+ expressionsOrder = _ref.expressionsOrder;
22
+ var data = expression.data,
23
+ id = expression.id;
24
+ var shouldRenderLogic = isStepType(expression) && expression.logic && !isLast && !isDragged && !isDragOverlay && expressionIndex !== -1;
25
+ return /*#__PURE__*/React.createElement(S.ExpressionWrapper, {
26
+ "data-testid": "condition-step",
27
+ onTransitionEnd: handleTransitionEnd,
28
+ ref: wrapperRef,
29
+ key: id,
30
+ onMouseDown: handleMouseDown
31
+ }, /*#__PURE__*/React.createElement(StepCard, _extends({
32
+ expressionIndex: expressionIndex,
33
+ expressionCount: expressionsOrder.length
34
+ }, data, stepProps, {
35
+ readOnly: readOnly,
36
+ dragHandleProps: dragHandleProps,
37
+ isDragged: isDragged,
38
+ isDragOverlay: isDragOverlay,
39
+ dragIndex: dragIndex
40
+ })), shouldRenderLogic && /*#__PURE__*/React.createElement(S.LogicWrapper, {
41
+ "data-testid": "condition-logic"
42
+ }, /*#__PURE__*/React.createElement(Logic, _extends({}, logicProps, expression.logic.data, {
43
+ readOnly: readOnly
44
+ }))));
45
+ };
@@ -0,0 +1,27 @@
1
+ import type { MouseEventHandler, ReactNode, TransitionEventHandler } from 'react';
2
+ import type { LogicProps } from '@synerise/ds-logic';
3
+ import type { StepCardProps } from '@synerise/ds-step-card';
4
+ import type { DragHandlePropType } from '@synerise/ds-sortable';
5
+ import type { Expression } from '../../Filter.types';
6
+ export type ExpressionItemProps = {
7
+ handleTransitionEnd: TransitionEventHandler;
8
+ id: string | number;
9
+ expression: Expression;
10
+ isLast?: boolean;
11
+ dragIndex?: number;
12
+ expressionsOrder: (string | number)[];
13
+ readOnly?: boolean;
14
+ stepProps: Partial<StepCardProps>;
15
+ logicProps: Partial<LogicProps>;
16
+ expressionIndex: number;
17
+ dropLabel: string;
18
+ renderHeaderRightSide?: (index: number) => ReactNode;
19
+ handleMouseDown?: MouseEventHandler<HTMLDivElement>;
20
+ wrapperRef: (node: HTMLDivElement) => void;
21
+ } & SortableItemProps;
22
+ export type SortableItemProps = {
23
+ dragHandleProps?: DragHandlePropType;
24
+ isDragged?: boolean;
25
+ isDragOverlay?: boolean;
26
+ isGrabbed?: boolean;
27
+ };
@@ -0,0 +1,3 @@
1
+ export { DraggableExpressionItem } from './DraggableExpressionItem';
2
+ export { ExpressionItem } from './ExpressionItem';
3
+ export type { ExpressionItemProps } from './ExpressionItem.types';
@@ -0,0 +1,2 @@
1
+ export { DraggableExpressionItem } from './DraggableExpressionItem';
2
+ export { ExpressionItem } from './ExpressionItem';
@@ -0,0 +1,2 @@
1
+ import type { Expression, StepType } from './Filter.types';
2
+ export declare const isStepType: (expression: Expression) => expression is StepType;
package/dist/utils.js ADDED
@@ -0,0 +1,3 @@
1
+ export var isStepType = function isStepType(expression) {
2
+ return expression.type === 'STEP';
3
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@synerise/ds-filter",
3
- "version": "1.0.10",
3
+ "version": "1.1.0",
4
4
  "description": "Filter UI Component for the Synerise Design System",
5
5
  "license": "ISC",
6
6
  "repository": "Synerise/synerise-design",
@@ -34,12 +34,11 @@
34
34
  ],
35
35
  "types": "dist/index.d.ts",
36
36
  "dependencies": {
37
- "@synerise/ds-button": "^1.3.2",
38
- "@synerise/ds-logic": "^1.0.9",
39
- "@synerise/ds-step-card": "^1.0.10",
40
- "@synerise/ds-utils": "^1.1.1",
41
- "react-sortablejs": "^6.0.0",
42
- "sortablejs": "1.15.1"
37
+ "@synerise/ds-button": "^1.3.3",
38
+ "@synerise/ds-logic": "^1.1.0",
39
+ "@synerise/ds-sortable": "^1.2.0",
40
+ "@synerise/ds-step-card": "^1.1.0",
41
+ "@synerise/ds-utils": "^1.2.0"
43
42
  },
44
43
  "peerDependencies": {
45
44
  "@synerise/ds-core": "*",
@@ -47,5 +46,5 @@
47
46
  "react-intl": ">=3.12.0 <= 6.8",
48
47
  "styled-components": "^5.3.3"
49
48
  },
50
- "gitHead": "12eaee0c6431aac9a7b2dbc42e0f8567b3de7244"
49
+ "gitHead": "93bc81d59d20bc8f3bc80c5d56ae7f7c0838380d"
51
50
  }