@bigbinary/neeto-molecules 1.1.15 → 1.1.16
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/README.md +1 -0
- package/dist/Builder/Body.js +9 -0
- package/dist/Builder/ElementsPanel/ElementsList/Element.js +27 -0
- package/dist/Builder/ElementsPanel/ElementsList/Section.js +28 -0
- package/dist/Builder/ElementsPanel/ElementsList/TitleBar.js +28 -0
- package/dist/Builder/ElementsPanel/ElementsList/index.js +63 -0
- package/dist/Builder/ElementsPanel/SelectedElementsList/SelectedElement.js +73 -0
- package/dist/Builder/ElementsPanel/SelectedElementsList/TitleBar.js +50 -0
- package/dist/Builder/ElementsPanel/SelectedElementsList/index.js +91 -0
- package/dist/Builder/ElementsPanel/index.js +70 -0
- package/dist/Builder/PropertiesPanel/EmptyProperty.js +21 -0
- package/dist/Builder/PropertiesPanel/Skeleton.js +24 -0
- package/dist/Builder/PropertiesPanel/index.js +12 -0
- package/dist/Builder/index.js +3 -0
- package/dist/Builder/styles.scss +84 -0
- package/dist/CustomDomainDashboard/Manage/index.js +1 -0
- package/dist/EmailForm/EmailForm.js +1 -0
- package/dist/EmailForm/SendToField.js +2 -1
- package/dist/ShareViaEmail/Form.js +2 -1
- package/package.json +3 -1
- package/src/translations/en.json +10 -0
- package/types/Builder.d.ts +53 -0
package/README.md
CHANGED
|
@@ -58,6 +58,7 @@ https://neeto-molecules.neeto.com/
|
|
|
58
58
|
- [SendToFields](./docs/components.md#SendToFieldsComponent)
|
|
59
59
|
- [ConfirmationModal](./docs/components.md#ConfirmationModal)
|
|
60
60
|
- [MoreDropdown](./docs/components.md#MoreDropdown)
|
|
61
|
+
- [Builder](./docs/components.md#Builder)
|
|
61
62
|
- [Metadata](./docs/components.md#metadata)
|
|
62
63
|
|
|
63
64
|
## Installation Instructions
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import "./styles.scss";
|
|
3
|
+
var Body = function Body(props) {
|
|
4
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
5
|
+
className: "neeto-molecules-builder-questions-list-panel__scroll neeto-molecules-builder-questions-list-panel__scroll--small",
|
|
6
|
+
"data-testid": props["data-testid"]
|
|
7
|
+
}, props.children);
|
|
8
|
+
};
|
|
9
|
+
export default Body;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import classnames from "classnames";
|
|
3
|
+
import { noop } from "@bigbinary/neeto-commons-frontend/pure";
|
|
4
|
+
import { joinHyphenCase } from "@bigbinary/neeto-commons-frontend/utils";
|
|
5
|
+
import { Typography } from "@bigbinary/neetoui";
|
|
6
|
+
var Element = function Element(_ref) {
|
|
7
|
+
var label = _ref.label,
|
|
8
|
+
Icon = _ref.icon,
|
|
9
|
+
_ref$isCreatable = _ref.isCreatable,
|
|
10
|
+
isCreatable = _ref$isCreatable === void 0 ? true : _ref$isCreatable,
|
|
11
|
+
onClick = _ref.onClick;
|
|
12
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
13
|
+
"data-cy": "add-".concat(joinHyphenCase(label), "-element"),
|
|
14
|
+
className: classnames("neeto-ui-border-gray-400 neeto-ui-bg-white hover:neeto-ui-bg-gray-200 neeto-ui-rounded-lg mb-2 flex h-10 cursor-pointer items-center gap-2 border p-3 transition-all duration-300 ease-in-out", {
|
|
15
|
+
"neeto-ui-bg-gray-300 cursor-not-allowed": !isCreatable
|
|
16
|
+
}),
|
|
17
|
+
onClick: isCreatable ? onClick : noop
|
|
18
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
19
|
+
className: "flex flex-grow items-center gap-2"
|
|
20
|
+
}, Icon && /*#__PURE__*/React.createElement(Icon, {
|
|
21
|
+
"data-cy": "form-icon"
|
|
22
|
+
}), /*#__PURE__*/React.createElement(Typography, {
|
|
23
|
+
className: "leading-4",
|
|
24
|
+
style: "body2"
|
|
25
|
+
}, label)));
|
|
26
|
+
};
|
|
27
|
+
export default Element;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import _extends from "@babel/runtime/helpers/extends";
|
|
2
|
+
import React from "react";
|
|
3
|
+
import { Typography } from "@bigbinary/neetoui";
|
|
4
|
+
import { isEmpty } from "ramda";
|
|
5
|
+
import Element from "./Element";
|
|
6
|
+
var Section = function Section(_ref) {
|
|
7
|
+
var title = _ref.title,
|
|
8
|
+
elements = _ref.elements,
|
|
9
|
+
onSelect = _ref.onSelect,
|
|
10
|
+
isCreatable = _ref.isCreatable;
|
|
11
|
+
if (isEmpty(elements)) {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, title && /*#__PURE__*/React.createElement(Typography, {
|
|
15
|
+
className: "py-3",
|
|
16
|
+
style: "h6",
|
|
17
|
+
textTransform: "uppercase"
|
|
18
|
+
}, title), elements.map(function (element) {
|
|
19
|
+
return /*#__PURE__*/React.createElement(Element, _extends({}, element, {
|
|
20
|
+
isCreatable: isCreatable(element.value),
|
|
21
|
+
key: element.label,
|
|
22
|
+
onClick: function onClick() {
|
|
23
|
+
return onSelect(element);
|
|
24
|
+
}
|
|
25
|
+
}));
|
|
26
|
+
}));
|
|
27
|
+
};
|
|
28
|
+
export default Section;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { Button, Typography } from "@bigbinary/neetoui";
|
|
3
|
+
import { useTranslation } from "react-i18next";
|
|
4
|
+
var TitleBar = function TitleBar(_ref) {
|
|
5
|
+
var setIsElementsListVisible = _ref.setIsElementsListVisible,
|
|
6
|
+
isSelectedElementsEmpty = _ref.isSelectedElementsEmpty;
|
|
7
|
+
var _useTranslation = useTranslation(),
|
|
8
|
+
t = _useTranslation.t;
|
|
9
|
+
var onCancel = function onCancel() {
|
|
10
|
+
return setIsElementsListVisible(false);
|
|
11
|
+
};
|
|
12
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
13
|
+
className: "flex items-center justify-between p-6 pb-4",
|
|
14
|
+
"data-testid": "elements-panel-title"
|
|
15
|
+
}, /*#__PURE__*/React.createElement(Typography, {
|
|
16
|
+
"data-cy": "elements-list-title",
|
|
17
|
+
lineHeight: "normal",
|
|
18
|
+
style: "h3",
|
|
19
|
+
weight: "semibold"
|
|
20
|
+
}, t("neetoMolecules.builderSidebar.addNewElement")), !isSelectedElementsEmpty && /*#__PURE__*/React.createElement(Button, {
|
|
21
|
+
"data-cy": "cancel-button",
|
|
22
|
+
label: t("neetoMolecules.builderSidebar.cancel"),
|
|
23
|
+
size: "small",
|
|
24
|
+
style: "text",
|
|
25
|
+
onClick: onCancel
|
|
26
|
+
}));
|
|
27
|
+
};
|
|
28
|
+
export default TitleBar;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
2
|
+
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
3
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
4
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
5
|
+
import React, { useMemo, useState } from "react";
|
|
6
|
+
import { isNotEmpty, isPresent } from "@bigbinary/neeto-commons-frontend/pure";
|
|
7
|
+
import { withEventTargetValue } from "@bigbinary/neeto-commons-frontend/utils";
|
|
8
|
+
import { Search } from "@bigbinary/neeto-icons";
|
|
9
|
+
import { Input } from "@bigbinary/neetoui";
|
|
10
|
+
import { useTranslation } from "react-i18next";
|
|
11
|
+
import Body from "../../Body";
|
|
12
|
+
import Section from "./Section";
|
|
13
|
+
import TitleBar from "./TitleBar";
|
|
14
|
+
var ElementList = function ElementList(_ref) {
|
|
15
|
+
var setIsElementsListVisible = _ref.setIsElementsListVisible,
|
|
16
|
+
_ref$elementSections = _ref.elementSections,
|
|
17
|
+
elementSections = _ref$elementSections === void 0 ? [] : _ref$elementSections,
|
|
18
|
+
onSelect = _ref.onSelect,
|
|
19
|
+
isSelectedElementsEmpty = _ref.isSelectedElementsEmpty;
|
|
20
|
+
var _useTranslation = useTranslation(),
|
|
21
|
+
t = _useTranslation.t;
|
|
22
|
+
var _useState = useState(""),
|
|
23
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
24
|
+
searchString = _useState2[0],
|
|
25
|
+
setSearchString = _useState2[1];
|
|
26
|
+
var filteredSections = useMemo(function () {
|
|
27
|
+
return elementSections.map(function (section) {
|
|
28
|
+
return _objectSpread(_objectSpread({}, section), {}, {
|
|
29
|
+
elements: section.elements.filter(function (element) {
|
|
30
|
+
return element.label.toLowerCase().includes(searchString.toLowerCase());
|
|
31
|
+
})
|
|
32
|
+
});
|
|
33
|
+
}).filter(function (section) {
|
|
34
|
+
return isPresent(searchString) ? isNotEmpty(section.elements) : true;
|
|
35
|
+
});
|
|
36
|
+
}, [searchString, elementSections]);
|
|
37
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(TitleBar, {
|
|
38
|
+
isSelectedElementsEmpty: isSelectedElementsEmpty,
|
|
39
|
+
setIsElementsListVisible: setIsElementsListVisible
|
|
40
|
+
}), /*#__PURE__*/React.createElement("div", {
|
|
41
|
+
className: "mb-2 px-6"
|
|
42
|
+
}, /*#__PURE__*/React.createElement(Input, {
|
|
43
|
+
autoFocus: true,
|
|
44
|
+
"data-testid": "elements-panel-search-field",
|
|
45
|
+
placeholder: t("neetoMolecules.builderSidebar.searchElements"),
|
|
46
|
+
prefix: /*#__PURE__*/React.createElement(Search, null),
|
|
47
|
+
value: searchString,
|
|
48
|
+
onChange: withEventTargetValue(setSearchString)
|
|
49
|
+
})), /*#__PURE__*/React.createElement(Body, {
|
|
50
|
+
"data-testid": "elements-container"
|
|
51
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
52
|
+
className: "neeto-molecules-builder-questions-list-panel__scroll--small"
|
|
53
|
+
}, filteredSections.map(function (section) {
|
|
54
|
+
return /*#__PURE__*/React.createElement(Section, {
|
|
55
|
+
elements: section.elements,
|
|
56
|
+
isCreatable: section.isCreatable,
|
|
57
|
+
key: section.key,
|
|
58
|
+
title: section.title,
|
|
59
|
+
onSelect: onSelect
|
|
60
|
+
});
|
|
61
|
+
}))));
|
|
62
|
+
};
|
|
63
|
+
export default ElementList;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
|
|
2
|
+
var _excluded = ["element", "isActive", "handleSelectElement", "isSelectable", "index", "errors", "actions"];
|
|
3
|
+
import React, { memo, useEffect, useRef } from "react";
|
|
4
|
+
import classnames from "classnames";
|
|
5
|
+
import { noop, findById, isNotEmpty } from "@bigbinary/neeto-commons-frontend/pure";
|
|
6
|
+
import { Typography } from "@bigbinary/neetoui";
|
|
7
|
+
import { mergeRight } from "ramda";
|
|
8
|
+
import MoreDropdown from "../../../MoreDropdown";
|
|
9
|
+
var SelectedElement = function SelectedElement(_ref) {
|
|
10
|
+
var element = _ref.element,
|
|
11
|
+
isActive = _ref.isActive,
|
|
12
|
+
handleSelectElement = _ref.handleSelectElement,
|
|
13
|
+
_ref$isSelectable = _ref.isSelectable,
|
|
14
|
+
isSelectable = _ref$isSelectable === void 0 ? true : _ref$isSelectable,
|
|
15
|
+
index = _ref.index,
|
|
16
|
+
_ref$errors = _ref.errors,
|
|
17
|
+
errors = _ref$errors === void 0 ? [] : _ref$errors,
|
|
18
|
+
_ref$actions = _ref.actions,
|
|
19
|
+
actions = _ref$actions === void 0 ? [] : _ref$actions,
|
|
20
|
+
props = _objectWithoutProperties(_ref, _excluded);
|
|
21
|
+
var Icon = element.icon;
|
|
22
|
+
var rootElementRef = useRef();
|
|
23
|
+
var onClick = function onClick() {
|
|
24
|
+
return handleSelectElement(index);
|
|
25
|
+
};
|
|
26
|
+
var shouldShowDropdown = isNotEmpty(actions);
|
|
27
|
+
useEffect(function () {
|
|
28
|
+
var rootElement = rootElementRef.current;
|
|
29
|
+
if (!rootElement || !isActive || typeof (rootElement === null || rootElement === void 0 ? void 0 : rootElement.scrollIntoView) !== "function") {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
rootElement.scrollIntoView({
|
|
33
|
+
block: "center"
|
|
34
|
+
});
|
|
35
|
+
}, [isActive, rootElementRef]);
|
|
36
|
+
var error = findById(element.id, errors);
|
|
37
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
38
|
+
"data-testid": props["data-testid"],
|
|
39
|
+
ref: rootElementRef,
|
|
40
|
+
className: classnames("neeto-ui-border-gray-400 neeto-ui-bg-white hover:neeto-ui-bg-gray-200 neeto-ui-rounded-lg mb-2 flex h-10 cursor-pointer items-center gap-2 border p-3 transition-all duration-300 ease-in-out", {
|
|
41
|
+
"neeto-molecules-builder-element--active": isActive
|
|
42
|
+
}, {
|
|
43
|
+
"hover:neeto-ui-bg-error-100 neeto-ui-bg-error-100": error
|
|
44
|
+
}),
|
|
45
|
+
onClick: isSelectable ? onClick : noop
|
|
46
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
47
|
+
className: "flex flex-grow items-center gap-2 overflow-hidden",
|
|
48
|
+
"data-cy": "new-element-field"
|
|
49
|
+
}, Icon && /*#__PURE__*/React.createElement("div", {
|
|
50
|
+
className: "flex-shrink-0"
|
|
51
|
+
}, /*#__PURE__*/React.createElement(Icon, null)), /*#__PURE__*/React.createElement(Typography, {
|
|
52
|
+
className: "truncate leading-snug",
|
|
53
|
+
style: "body2"
|
|
54
|
+
}, element.label)), shouldShowDropdown && /*#__PURE__*/React.createElement(MoreDropdown, {
|
|
55
|
+
dropdownButtonProps: {
|
|
56
|
+
className: "min-h-0 flex-shrink-0"
|
|
57
|
+
},
|
|
58
|
+
dropdownProps: {
|
|
59
|
+
closeOnSelect: true,
|
|
60
|
+
onClick: function onClick(event) {
|
|
61
|
+
return event.stopPropagation();
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
menuItems: actions.map(function (action) {
|
|
65
|
+
return mergeRight(action, {
|
|
66
|
+
onClick: function onClick() {
|
|
67
|
+
action.onClick(element);
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
})
|
|
71
|
+
}));
|
|
72
|
+
};
|
|
73
|
+
export default /*#__PURE__*/memo(SelectedElement);
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { PLURAL } from "@bigbinary/neeto-commons-frontend/constants";
|
|
3
|
+
import { Flash } from "@bigbinary/neeto-icons";
|
|
4
|
+
import { Button, Typography } from "@bigbinary/neetoui";
|
|
5
|
+
import { useTranslation } from "react-i18next";
|
|
6
|
+
var TitleBar = function TitleBar(_ref) {
|
|
7
|
+
var setIsElementsListVisible = _ref.setIsElementsListVisible,
|
|
8
|
+
isLoading = _ref.isLoading,
|
|
9
|
+
showElementsFillButton = _ref.showElementsFillButton,
|
|
10
|
+
isAddingAllElements = _ref.isAddingAllElements,
|
|
11
|
+
addAllElements = _ref.addAllElements,
|
|
12
|
+
isAddingNewElement = _ref.isAddingNewElement;
|
|
13
|
+
var _useTranslation = useTranslation(),
|
|
14
|
+
t = _useTranslation.t;
|
|
15
|
+
var handleAddElement = function handleAddElement() {
|
|
16
|
+
return setIsElementsListVisible(true);
|
|
17
|
+
};
|
|
18
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
19
|
+
className: "flex items-center justify-between p-6 pb-4",
|
|
20
|
+
"data-testid": "selected-elements-title"
|
|
21
|
+
}, /*#__PURE__*/React.createElement(Typography, {
|
|
22
|
+
"data-cy": "elements-title",
|
|
23
|
+
lineHeight: "normal",
|
|
24
|
+
style: "h3",
|
|
25
|
+
weight: "semibold"
|
|
26
|
+
}, t("neetoMolecules.builderSidebar.element", PLURAL)), /*#__PURE__*/React.createElement("div", {
|
|
27
|
+
className: "flex items-center justify-between space-x-2"
|
|
28
|
+
}, /*#__PURE__*/React.createElement(Button, {
|
|
29
|
+
"data-cy": "add-element-button",
|
|
30
|
+
"data-testid": "add-element-button",
|
|
31
|
+
disabled: isLoading,
|
|
32
|
+
label: t("neetoMolecules.builderSidebar.addNewElement"),
|
|
33
|
+
loading: isAddingNewElement,
|
|
34
|
+
size: "small",
|
|
35
|
+
style: "secondary",
|
|
36
|
+
onClick: handleAddElement
|
|
37
|
+
}), showElementsFillButton && /*#__PURE__*/React.createElement(Button, {
|
|
38
|
+
"data-cy": "add-all-elements-button",
|
|
39
|
+
disabled: isAddingAllElements,
|
|
40
|
+
icon: Flash,
|
|
41
|
+
loading: isAddingAllElements,
|
|
42
|
+
size: "small",
|
|
43
|
+
style: "secondary",
|
|
44
|
+
tooltipProps: {
|
|
45
|
+
content: t("neetoMolecules.builderSidebar.addAllElements")
|
|
46
|
+
},
|
|
47
|
+
onClick: addAllElements
|
|
48
|
+
})));
|
|
49
|
+
};
|
|
50
|
+
export default TitleBar;
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import _extends from "@babel/runtime/helpers/extends";
|
|
2
|
+
import React from "react";
|
|
3
|
+
import { DragDropContext, Draggable, Droppable } from "@hello-pangea/dnd";
|
|
4
|
+
import { isPresent } from "@bigbinary/neeto-commons-frontend/pure";
|
|
5
|
+
import { joinHyphenCase } from "@bigbinary/neeto-commons-frontend/utils";
|
|
6
|
+
import Body from "../../Body";
|
|
7
|
+
import SelectedElement from "./SelectedElement";
|
|
8
|
+
import TitleBar from "./TitleBar";
|
|
9
|
+
var SelectedElementsList = function SelectedElementsList(_ref) {
|
|
10
|
+
var handleDragEnd = _ref.handleDragEnd,
|
|
11
|
+
handleSelectElement = _ref.handleSelectElement,
|
|
12
|
+
isDragDisabled = _ref.isDragDisabled,
|
|
13
|
+
isElementVisible = _ref.isElementVisible,
|
|
14
|
+
selectedElementIndex = _ref.selectedElementIndex,
|
|
15
|
+
selectedElements = _ref.selectedElements,
|
|
16
|
+
setIsElementsListVisible = _ref.setIsElementsListVisible,
|
|
17
|
+
fixedLastElementIndex = _ref.fixedLastElementIndex,
|
|
18
|
+
fixedLastElement = _ref.fixedLastElement,
|
|
19
|
+
fixedFirstElement = _ref.fixedFirstElement,
|
|
20
|
+
selectedElementActions = _ref.selectedElementActions,
|
|
21
|
+
addAllElements = _ref.addAllElements,
|
|
22
|
+
isAddingAllElements = _ref.isAddingAllElements,
|
|
23
|
+
showElementsFillButton = _ref.showElementsFillButton,
|
|
24
|
+
isAddingNewElement = _ref.isAddingNewElement;
|
|
25
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(TitleBar, {
|
|
26
|
+
addAllElements: addAllElements,
|
|
27
|
+
isAddingAllElements: isAddingAllElements,
|
|
28
|
+
isAddingNewElement: isAddingNewElement,
|
|
29
|
+
setIsElementsListVisible: setIsElementsListVisible,
|
|
30
|
+
showElementsFillButton: showElementsFillButton
|
|
31
|
+
}), /*#__PURE__*/React.createElement(Body, {
|
|
32
|
+
"data-testid": "selected-elements-container"
|
|
33
|
+
}, isPresent(fixedFirstElement) && /*#__PURE__*/React.createElement(SelectedElement, {
|
|
34
|
+
isSelectable: true,
|
|
35
|
+
handleSelectElement: handleSelectElement,
|
|
36
|
+
actions: fixedFirstElement.actions,
|
|
37
|
+
"data-testid": "welcome-record",
|
|
38
|
+
element: fixedFirstElement,
|
|
39
|
+
index: 0,
|
|
40
|
+
isActive: selectedElementIndex === 0
|
|
41
|
+
}), /*#__PURE__*/React.createElement(DragDropContext, {
|
|
42
|
+
onDragEnd: handleDragEnd
|
|
43
|
+
}, /*#__PURE__*/React.createElement(Droppable, {
|
|
44
|
+
droppableId: "droppable-question-list"
|
|
45
|
+
}, function (_ref2) {
|
|
46
|
+
var innerRef = _ref2.innerRef,
|
|
47
|
+
droppableProps = _ref2.droppableProps,
|
|
48
|
+
placeholder = _ref2.placeholder;
|
|
49
|
+
return /*#__PURE__*/React.createElement("div", _extends({
|
|
50
|
+
ref: innerRef
|
|
51
|
+
}, droppableProps, {
|
|
52
|
+
"data-testid": "selected-elements-droppable-container"
|
|
53
|
+
}), selectedElements === null || selectedElements === void 0 ? void 0 : selectedElements.map(function (element, index) {
|
|
54
|
+
var _isElementVisible, _element$id, _element$id2;
|
|
55
|
+
var isVisible = (_isElementVisible = isElementVisible === null || isElementVisible === void 0 ? void 0 : isElementVisible(element)) !== null && _isElementVisible !== void 0 ? _isElementVisible : true;
|
|
56
|
+
if (!isVisible) return null;
|
|
57
|
+
var key = (_element$id = element.id) !== null && _element$id !== void 0 ? _element$id : "element-".concat(joinHyphenCase(element.label));
|
|
58
|
+
return /*#__PURE__*/React.createElement(Draggable, {
|
|
59
|
+
draggableId: (_element$id2 = element.id) !== null && _element$id2 !== void 0 ? _element$id2 : "element-".concat(index),
|
|
60
|
+
index: index,
|
|
61
|
+
isDragDisabled: isDragDisabled,
|
|
62
|
+
key: key
|
|
63
|
+
}, function (_ref3) {
|
|
64
|
+
var _element$id3;
|
|
65
|
+
var innerRef = _ref3.innerRef,
|
|
66
|
+
draggableProps = _ref3.draggableProps,
|
|
67
|
+
dragHandleProps = _ref3.dragHandleProps;
|
|
68
|
+
return /*#__PURE__*/React.createElement("div", _extends({
|
|
69
|
+
ref: innerRef
|
|
70
|
+
}, draggableProps, dragHandleProps), /*#__PURE__*/React.createElement(SelectedElement, {
|
|
71
|
+
isSelectable: true,
|
|
72
|
+
element: element,
|
|
73
|
+
handleSelectElement: handleSelectElement,
|
|
74
|
+
index: index,
|
|
75
|
+
actions: selectedElementActions,
|
|
76
|
+
isActive: index === selectedElementIndex,
|
|
77
|
+
key: (_element$id3 = element.id) !== null && _element$id3 !== void 0 ? _element$id3 : index
|
|
78
|
+
}));
|
|
79
|
+
});
|
|
80
|
+
}), placeholder);
|
|
81
|
+
})), isPresent(fixedLastElement) && /*#__PURE__*/React.createElement(SelectedElement, {
|
|
82
|
+
isSelectable: true,
|
|
83
|
+
handleSelectElement: handleSelectElement,
|
|
84
|
+
actions: fixedLastElement.actions,
|
|
85
|
+
"data-testid": "submit-button-record",
|
|
86
|
+
element: fixedLastElement,
|
|
87
|
+
index: fixedLastElementIndex,
|
|
88
|
+
isActive: selectedElementIndex === fixedLastElementIndex
|
|
89
|
+
})));
|
|
90
|
+
};
|
|
91
|
+
export default SelectedElementsList;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
2
|
+
import React, { useState } from "react";
|
|
3
|
+
import { noop } from "@bigbinary/neeto-commons-frontend/pure";
|
|
4
|
+
import { isEmpty } from "ramda";
|
|
5
|
+
import ElementList from "./ElementsList";
|
|
6
|
+
import SelectedElementsList from "./SelectedElementsList";
|
|
7
|
+
import "../styles.scss";
|
|
8
|
+
var ElementsPanel = function ElementsPanel(_ref) {
|
|
9
|
+
var elementSections = _ref.elementSections,
|
|
10
|
+
_ref$selectedElements = _ref.selectedElements,
|
|
11
|
+
selectedElements = _ref$selectedElements === void 0 ? [] : _ref$selectedElements,
|
|
12
|
+
handleAddElement = _ref.handleAddElement,
|
|
13
|
+
isElementVisible = _ref.isElementVisible,
|
|
14
|
+
fixedFirstElement = _ref.fixedFirstElement,
|
|
15
|
+
fixedLastElement = _ref.fixedLastElement,
|
|
16
|
+
_ref$handleDragEnd = _ref.handleDragEnd,
|
|
17
|
+
handleDragEnd = _ref$handleDragEnd === void 0 ? noop : _ref$handleDragEnd,
|
|
18
|
+
_ref$isDragDisabled = _ref.isDragDisabled,
|
|
19
|
+
isDragDisabled = _ref$isDragDisabled === void 0 ? true : _ref$isDragDisabled,
|
|
20
|
+
handleSelectElement = _ref.handleSelectElement,
|
|
21
|
+
selectedElementIndex = _ref.selectedElementIndex,
|
|
22
|
+
fixedLastElementIndex = _ref.fixedLastElementIndex,
|
|
23
|
+
selectedElementActions = _ref.selectedElementActions,
|
|
24
|
+
_ref$addAllElements = _ref.addAllElements,
|
|
25
|
+
addAllElements = _ref$addAllElements === void 0 ? noop : _ref$addAllElements,
|
|
26
|
+
_ref$isAddingAllEleme = _ref.isAddingAllElements,
|
|
27
|
+
isAddingAllElements = _ref$isAddingAllEleme === void 0 ? false : _ref$isAddingAllEleme,
|
|
28
|
+
_ref$showElementsFill = _ref.showElementsFillButton,
|
|
29
|
+
showElementsFillButton = _ref$showElementsFill === void 0 ? false : _ref$showElementsFill,
|
|
30
|
+
_ref$isAddingNewEleme = _ref.isAddingNewElement,
|
|
31
|
+
isAddingNewElement = _ref$isAddingNewEleme === void 0 ? false : _ref$isAddingNewEleme;
|
|
32
|
+
var _useState = useState(false),
|
|
33
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
34
|
+
isElementsListVisible = _useState2[0],
|
|
35
|
+
setIsElementsListVisible = _useState2[1];
|
|
36
|
+
var isSelectedElementsEmpty = isEmpty(selectedElements);
|
|
37
|
+
var shouldShowElementsList = isSelectedElementsEmpty || isElementsListVisible;
|
|
38
|
+
var handleElementSelect = function handleElementSelect(element) {
|
|
39
|
+
setIsElementsListVisible(false);
|
|
40
|
+
handleAddElement(element);
|
|
41
|
+
};
|
|
42
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
43
|
+
className: "neeto-molecules-builder-elements-list-panel neeto-ui-bg-gray-100",
|
|
44
|
+
onClick: function onClick(event) {
|
|
45
|
+
return event.stopPropagation();
|
|
46
|
+
}
|
|
47
|
+
}, shouldShowElementsList ? /*#__PURE__*/React.createElement(ElementList, {
|
|
48
|
+
elementSections: elementSections,
|
|
49
|
+
isSelectedElementsEmpty: isSelectedElementsEmpty,
|
|
50
|
+
setIsElementsListVisible: setIsElementsListVisible,
|
|
51
|
+
onSelect: handleElementSelect
|
|
52
|
+
}) : /*#__PURE__*/React.createElement(SelectedElementsList, {
|
|
53
|
+
addAllElements: addAllElements,
|
|
54
|
+
fixedFirstElement: fixedFirstElement,
|
|
55
|
+
fixedLastElement: fixedLastElement,
|
|
56
|
+
fixedLastElementIndex: fixedLastElementIndex,
|
|
57
|
+
handleDragEnd: handleDragEnd,
|
|
58
|
+
handleSelectElement: handleSelectElement,
|
|
59
|
+
isAddingAllElements: isAddingAllElements,
|
|
60
|
+
isAddingNewElement: isAddingNewElement,
|
|
61
|
+
isDragDisabled: isDragDisabled,
|
|
62
|
+
isElementVisible: isElementVisible,
|
|
63
|
+
selectedElementActions: selectedElementActions,
|
|
64
|
+
selectedElementIndex: selectedElementIndex,
|
|
65
|
+
selectedElements: selectedElements,
|
|
66
|
+
setIsElementsListVisible: setIsElementsListVisible,
|
|
67
|
+
showElementsFillButton: showElementsFillButton
|
|
68
|
+
}));
|
|
69
|
+
};
|
|
70
|
+
export default ElementsPanel;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { withT } from "@bigbinary/neeto-commons-frontend/react-utils";
|
|
3
|
+
import { Typography } from "@bigbinary/neetoui";
|
|
4
|
+
var EmptyProperty = withT(function (_ref) {
|
|
5
|
+
var t = _ref.t;
|
|
6
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
7
|
+
className: "space-y-4 "
|
|
8
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
9
|
+
className: "neeto-ui-bg-gray-200 neeto-ui-text-gray-600 neeto-ui-rounded-lg flex w-full flex-col items-center justify-center space-y-2 px-16 py-8"
|
|
10
|
+
}, /*#__PURE__*/React.createElement(Typography, {
|
|
11
|
+
className: "text-center",
|
|
12
|
+
"data-cy": "build-page-text-label",
|
|
13
|
+
lineHeight: "normal",
|
|
14
|
+
style: "body2"
|
|
15
|
+
}, t("neetoMolecules.builderSidebar.noQuestionProperties"))), /*#__PURE__*/React.createElement("div", {
|
|
16
|
+
className: "neeto-ui-bg-gray-200 neeto-ui-rounded-lg h-40 w-full"
|
|
17
|
+
}), /*#__PURE__*/React.createElement("div", {
|
|
18
|
+
className: "neeto-ui-bg-gray-200 neeto-ui-rounded-lg h-72 w-full"
|
|
19
|
+
}));
|
|
20
|
+
});
|
|
21
|
+
export default EmptyProperty;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { withT } from "@bigbinary/neeto-commons-frontend/react-utils";
|
|
3
|
+
import { DownArrow } from "@bigbinary/neeto-icons";
|
|
4
|
+
import { Typography } from "@bigbinary/neetoui";
|
|
5
|
+
var Skeleton = withT(function (_ref) {
|
|
6
|
+
var t = _ref.t;
|
|
7
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
8
|
+
className: "space-y-4 pr-6"
|
|
9
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
10
|
+
className: "neeto-ui-bg-gray-200 neeto-ui-rounded-lg h-12 w-full"
|
|
11
|
+
}), /*#__PURE__*/React.createElement("div", {
|
|
12
|
+
className: "neeto-ui-bg-gray-200 neeto-ui-text-gray-600 neeto-ui-rounded-lg flex w-full flex-col items-center justify-center space-y-2 py-8 px-16"
|
|
13
|
+
}, /*#__PURE__*/React.createElement(Typography, {
|
|
14
|
+
className: "text-center",
|
|
15
|
+
"data-cy": "build-page-text-label",
|
|
16
|
+
lineHeight: "normal",
|
|
17
|
+
style: "body2"
|
|
18
|
+
}, t("neetoMolecules.builderSidebar.emptyQuestionProperties")), /*#__PURE__*/React.createElement(DownArrow, null)), /*#__PURE__*/React.createElement("div", {
|
|
19
|
+
className: "neeto-ui-bg-gray-200 neeto-ui-rounded-lg h-40 w-full"
|
|
20
|
+
}), /*#__PURE__*/React.createElement("div", {
|
|
21
|
+
className: "neeto-ui-bg-gray-200 neeto-ui-rounded-lg h-72 w-full"
|
|
22
|
+
}));
|
|
23
|
+
});
|
|
24
|
+
export default Skeleton;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import EmptyProperty from "./EmptyProperty";
|
|
3
|
+
import Skeleton from "./Skeleton";
|
|
4
|
+
import "../styles.scss";
|
|
5
|
+
var PropertiesPanel = function PropertiesPanel(_ref) {
|
|
6
|
+
var children = _ref.children;
|
|
7
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
8
|
+
className: "neeto-molecules-builder-element-properties-panel neeto-ui-bg-gray-100"
|
|
9
|
+
}, children !== null && children !== void 0 ? children : /*#__PURE__*/React.createElement(Skeleton, null));
|
|
10
|
+
};
|
|
11
|
+
PropertiesPanel.EmptyProperty = EmptyProperty;
|
|
12
|
+
export default PropertiesPanel;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
:root {
|
|
2
|
+
--neeto-molecule-builder-left-sidebar-width: 360px;
|
|
3
|
+
--neeto-molecule-builder-left-sidebar-header-height: 70px;
|
|
4
|
+
--neeto-molecule-builder-left-sidebar-search-height: 40px;
|
|
5
|
+
--neeto-molecule-builder-right-sidebar-width: 420px;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
.neeto-molecules-builder-elements-list-panel {
|
|
9
|
+
width: var(--neeto-molecule-builder-left-sidebar-width);
|
|
10
|
+
min-width: var(--neeto-molecule-builder-left-sidebar-width);
|
|
11
|
+
height: 100%;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
.neeto-molecules-builder-questions-list-panel__scroll {
|
|
15
|
+
height: calc(100% - var(--neeto-molecule-builder-left-sidebar-header-height));
|
|
16
|
+
padding: 8px 24px;
|
|
17
|
+
overflow-y: auto;
|
|
18
|
+
|
|
19
|
+
&.neeto-molecules-builder-questions-list-panel__scroll--small {
|
|
20
|
+
height: calc(
|
|
21
|
+
100% - var(--neeto-molecule-builder-left-sidebar-header-height) -
|
|
22
|
+
var(--neeto-molecule-builder-left-sidebar-search-height)
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.neeto-molecules-builder-elements-list {
|
|
28
|
+
margin-bottom: 24px;
|
|
29
|
+
|
|
30
|
+
.neeto-ui-accordion__wrapper {
|
|
31
|
+
border-bottom: none;
|
|
32
|
+
|
|
33
|
+
.neeto-ui-accordion__item {
|
|
34
|
+
padding: 12px 0;
|
|
35
|
+
|
|
36
|
+
.neeto-ui-accordion__item-handle {
|
|
37
|
+
font-size: var(--neeto-ui-text-xs);
|
|
38
|
+
font-weight: var(--neeto-ui-font-semibold);
|
|
39
|
+
text-transform: uppercase;
|
|
40
|
+
color: rgb(var(--neeto-ui-gray-600));
|
|
41
|
+
transition: var(--neeto-ui-transition);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.neeto-ui-accordion__item-toggle-icon {
|
|
45
|
+
transform: rotate(90deg) !important;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
&:hover {
|
|
49
|
+
background-color: transparent;
|
|
50
|
+
|
|
51
|
+
.neeto-ui-accordion__item-handle {
|
|
52
|
+
color: rgb(var(--neeto-ui-gray-800));
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
&.neeto-ui-accordion__item--open {
|
|
57
|
+
.neeto-ui-accordion__item-handle {
|
|
58
|
+
color: rgb(var(--neeto-ui-gray-800));
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.neeto-ui-accordion__item-toggle-icon {
|
|
62
|
+
transform: rotate(270deg) !important;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
.neeto-ui-accordion__drop {
|
|
68
|
+
padding: 0;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
.neeto-molecules-builder-element-properties-panel {
|
|
74
|
+
width: var(--neeto-molecule-builder-right-sidebar-width);
|
|
75
|
+
min-width: var(--neeto-molecule-builder-right-sidebar-width);
|
|
76
|
+
height: 100%;
|
|
77
|
+
padding-top: 24px;
|
|
78
|
+
padding-left: 24px;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.neeto-molecules-builder-element--active {
|
|
82
|
+
border-color: rgb(var(--neeto-ui-primary-500)) !important;
|
|
83
|
+
box-shadow: 0px 0px 0px 1px rgb(var(--neeto-ui-primary-500)) !important;
|
|
84
|
+
}
|
|
@@ -88,6 +88,7 @@ var Manage = function Manage(_ref) {
|
|
|
88
88
|
}), /*#__PURE__*/React.createElement("div", {
|
|
89
89
|
className: "space-y-2"
|
|
90
90
|
}, /*#__PURE__*/React.createElement(Label, {
|
|
91
|
+
required: true,
|
|
91
92
|
htmlFor: "hostname"
|
|
92
93
|
}, isNotEmpty(customDomain) ? t("neetoMolecules.customDomain.customDomain", SINGULAR) : t("neetoMolecules.customDomain.label")), /*#__PURE__*/React.createElement("div", {
|
|
93
94
|
className: "flex items-start gap-2"
|
|
@@ -20,7 +20,8 @@ var SendToField = withT(function (_ref) {
|
|
|
20
20
|
id: "sendTo",
|
|
21
21
|
name: "sendTo",
|
|
22
22
|
label: t("neetoMolecules.emailForm.labels.sendTo"),
|
|
23
|
-
placeholder: t("neetoMolecules.emailForm.placeholders.commaSeparatedEmails")
|
|
23
|
+
placeholder: t("neetoMolecules.emailForm.placeholders.commaSeparatedEmails"),
|
|
24
|
+
required: true
|
|
24
25
|
}
|
|
25
26
|
});
|
|
26
27
|
});
|
|
@@ -28,7 +28,8 @@ var Form = function Form(_ref) {
|
|
|
28
28
|
showUploadCsvButton: true,
|
|
29
29
|
emailInputProps: {
|
|
30
30
|
label: t("neetoMolecules.shareViaEmail.sendTo"),
|
|
31
|
-
name: "notifyEmails"
|
|
31
|
+
name: "notifyEmails",
|
|
32
|
+
required: true
|
|
32
33
|
}
|
|
33
34
|
}), /*#__PURE__*/React.createElement(Input, {
|
|
34
35
|
required: true,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bigbinary/neeto-molecules",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.16",
|
|
4
4
|
"description": "A package of reusable molecular components for neeto products.",
|
|
5
5
|
"repository": "git@github.com:bigbinary/neeto-molecules.git",
|
|
6
6
|
"author": "Amaljith K <amaljith.k@bigbinary.com>",
|
|
@@ -80,6 +80,7 @@
|
|
|
80
80
|
"@fullcalendar/interaction": "^6.1.8",
|
|
81
81
|
"@fullcalendar/react": "^6.1.8",
|
|
82
82
|
"@fullcalendar/timegrid": "^6.1.8",
|
|
83
|
+
"@hello-pangea/dnd": "^16.3.0",
|
|
83
84
|
"@honeybadger-io/react": "2.0.1",
|
|
84
85
|
"@storybook/addon-actions": "^6.5.16",
|
|
85
86
|
"@storybook/addon-essentials": "6.5.16",
|
|
@@ -166,6 +167,7 @@
|
|
|
166
167
|
"@fullcalendar/interaction": "^6.1.8",
|
|
167
168
|
"@fullcalendar/react": "^6.1.8",
|
|
168
169
|
"@fullcalendar/timegrid": "^6.1.8",
|
|
170
|
+
"@hello-pangea/dnd": "^16.3.0",
|
|
169
171
|
"@honeybadger-io/react": "2.0.1",
|
|
170
172
|
"antd": "5.9.2",
|
|
171
173
|
"axios": "^0.27.2",
|
package/src/translations/en.json
CHANGED
|
@@ -475,6 +475,16 @@
|
|
|
475
475
|
"fileTypeError": "Please upload a file with one of the following file types: {{acceptedTypes}}."
|
|
476
476
|
}
|
|
477
477
|
},
|
|
478
|
+
"builderSidebar": {
|
|
479
|
+
"element_one": "Element",
|
|
480
|
+
"element_other": "Elements",
|
|
481
|
+
"addNewElement": "Add new element",
|
|
482
|
+
"addAllElements": "Add all elements",
|
|
483
|
+
"searchElements": "Search elements",
|
|
484
|
+
"cancel": "Cancel",
|
|
485
|
+
"noQuestionProperties": "This element doesn't have any properties to configure.",
|
|
486
|
+
"emptyQuestionProperties": "The configuration will be displayed here after you add/select an element from the left hand side panel."
|
|
487
|
+
},
|
|
478
488
|
"emailForm": {
|
|
479
489
|
"errors": {
|
|
480
490
|
"required": "{{entity}} is required",
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
type Element = {
|
|
2
|
+
label: string;
|
|
3
|
+
value: string;
|
|
4
|
+
icon: React.ReactNode;
|
|
5
|
+
};
|
|
6
|
+
|
|
7
|
+
type ElementSection = {
|
|
8
|
+
title: string;
|
|
9
|
+
elements: Element[];
|
|
10
|
+
key: string;
|
|
11
|
+
isCreatable: (element: Element) => boolean;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
type SelectedElement = {
|
|
15
|
+
id: string;
|
|
16
|
+
kind: string;
|
|
17
|
+
position: number;
|
|
18
|
+
label: string;
|
|
19
|
+
icon: React.ReactNode;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
type dragResult = {
|
|
23
|
+
index: number;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
type SelectedElementAction = {
|
|
27
|
+
label: string;
|
|
28
|
+
key: string;
|
|
29
|
+
onClick: (element: Element) => void;
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
export const ElementsPanel: React.FC<{
|
|
33
|
+
elementSections: ElementSection[];
|
|
34
|
+
selectedElements: SelectedElement[];
|
|
35
|
+
handleAddElement: (element: Element) => void;
|
|
36
|
+
isElementVisible: (element: Element) => boolean;
|
|
37
|
+
fixedFirstElement?: SelectedElement;
|
|
38
|
+
fixedLastElement?: SelectedElement;
|
|
39
|
+
handleDragEnd?: ({ source: dragResult, destination: dragResult }) => void;
|
|
40
|
+
isDragDisabled?: boolean;
|
|
41
|
+
handleSelectElement: (index: number) => void;
|
|
42
|
+
selectedElementIndex: number;
|
|
43
|
+
fixedLastElementIndex: number;
|
|
44
|
+
selectedElementActions: SelectedElementAction[];
|
|
45
|
+
addAllElements: () => void;
|
|
46
|
+
isAddingAllElements?: boolean;
|
|
47
|
+
showElementsFillButton?: boolean;
|
|
48
|
+
isAddingNewElement?: boolean;
|
|
49
|
+
}>;
|
|
50
|
+
|
|
51
|
+
export const PropertiesPanel: React.FC<{
|
|
52
|
+
children: React.ReactNode;
|
|
53
|
+
}>;
|