oa-componentbook 0.18.378 → 0.18.380

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.
@@ -60,7 +60,18 @@ function renderCustomBody(customBody, onActionClick) {
60
60
  }, field.title), /*#__PURE__*/_react.default.createElement(_Typography.default, {
61
61
  typography: "type-b1-400",
62
62
  color: "secondary-content"
63
- }, field.subtitle))))), item.dataConfig && item.dataConfig.type === "button" && /*#__PURE__*/_react.default.createElement("div", {
63
+ }, field.subtitle))))), item.dataConfig && Array.isArray(item.dataConfig) && item.dataConfig.some(config => config.type === "button") && /*#__PURE__*/_react.default.createElement("div", {
64
+ className: "custom-body-content custom-body-buttons-container"
65
+ }, item.dataConfig.filter(config => config.type === "button").map((buttonConfig, btnIndex) => /*#__PURE__*/_react.default.createElement(_CustomButton.default, {
66
+ key: btnIndex,
67
+ type: buttonConfig.subType,
68
+ onClick: () => {
69
+ if (onActionClick && buttonConfig.onClick) {
70
+ onActionClick(buttonConfig.onClick, buttonConfig);
71
+ }
72
+ },
73
+ label: buttonConfig.label
74
+ }))), item.dataConfig && !Array.isArray(item.dataConfig) && item.dataConfig.type === "button" && /*#__PURE__*/_react.default.createElement("div", {
64
75
  className: "custom-body-content"
65
76
  }, /*#__PURE__*/_react.default.createElement(_CustomButton.default, {
66
77
  type: item.dataConfig.subType,
@@ -168,13 +179,18 @@ Accordion.propTypes = {
168
179
  type: _propTypes.default.string.isRequired,
169
180
  label: _propTypes.default.string.isRequired
170
181
  }),
171
- dataConfig: _propTypes.default.shape({
182
+ dataConfig: _propTypes.default.oneOfType([_propTypes.default.shape({
172
183
  type: _propTypes.default.string.isRequired,
173
184
  data: _propTypes.default.oneOfType([_propTypes.default.array, _propTypes.default.object]).isRequired,
174
185
  subType: _propTypes.default.string,
175
186
  label: _propTypes.default.string,
176
187
  onClick: _propTypes.default.string
177
- })
188
+ }), _propTypes.default.arrayOf(_propTypes.default.shape({
189
+ type: _propTypes.default.string.isRequired,
190
+ subType: _propTypes.default.string,
191
+ label: _propTypes.default.string,
192
+ onClick: _propTypes.default.string
193
+ }))])
178
194
  }))
179
195
  }),
180
196
  onActionClick: _propTypes.default.func
@@ -10,4 +10,4 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
10
10
  function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
11
11
  var _default = exports.default = {};
12
12
  const SmallText = exports.SmallText = _styledComponents.default.small(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n font-size: 18px;\n color: #e21616;\n margin: 0 0 0 4px;\n"])));
13
- const CollapseStyle = exports.CollapseStyle = _styledComponents.default.div(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n .ant-collapse .ant-collapse-item-disabled {\n background: var(--color-disabled-button);\n }\n /* .ant-collapse-item-active .ant-collapse-expand-icon{\n transform: rotate(180deg);\n } */\n /* .ant-collapse-expand-icon{\n padding-inline-start: 0 !important;\n } */\n .ant-collapse-header-text {\n color: var(--color-primary-content);\n }\n /* .ant-collapse-arrow{\n color: var(--color-secondary-content) !important;\n } */\n .ant-collapse > .ant-collapse-item:last-child,\n .ant-collapse > .ant-collapse-item:last-child > .ant-collapse-header,\n .ant-collapse .ant-collapse-item:last-child > .ant-collapse-content {\n border-radius: 0 0 4px 4px;\n }\n .ant-collapse > .ant-collapse-item {\n border: none;\n }\n .ant-collapse {\n border: 1px solid var(--color-divider);\n border-radius: 4px;\n overflow: hidden;\n }\n\n .ant-collapse > .ant-collapse-item > .ant-collapse-header {\n padding: 12px 12px;\n }\n\n /* New styles for header content layout */\n .header-content {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n width: 100%;\n }\n\n .header-main {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n flex: 1;\n gap: 8px;\n }\n\n .header-tag {\n margin-bottom: 4px;\n }\n\n .header-text {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .header-subtext {\n margin-top: 4px;\n color: var(--color-secondary-content);\n }\n\n /* Custom body styles */\n .custom-body-item {\n margin-bottom: 24px;\n }\n\n .custom-body-item:last-child {\n margin-bottom: 0;\n }\n\n .custom-body-heading {\n margin-bottom: 16px;\n }\n\n .custom-body-content {\n // margin-top: 8px;\n }\n\n .custom-body-button {\n margin-top: 16px;\n display: flex;\n justify-content: flex-end;\n }\n\n .gst-details-keyvalue {\n .key-value-item {\n margin-bottom: 4px;\n }\n\n .key {\n font-weight: 400;\n color: var(--color-primary-content);\n }\n\n .value {\n font-weight: 700;\n color: var(--color-primary-content);\n }\n }\n\n @media only screen and (max-width: 600px) {\n .ant-collapse .ant-collapse-content > .ant-collapse-content-box {\n padding: 16px;\n }\n .ant-collapse > .ant-collapse-item > .ant-collapse-header {\n padding: 12px 16px;\n }\n }\n\n .custom-body-content-titleSubtitle {\n display: flex;\n flex-direction: column;\n gap: 16px; /* spacing between each item */\n }\n\n .title-subtitle-item {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n }\n\n .title-subtitle-item .user-details {\n flex: 1;\n display: flex; /* \uD83D\uDC48 add this */\n flex-direction: column; /* stack name & email vertically */\n gap: 2px; /* optional: tighten spacing between name & email */\n }\n"])));
13
+ const CollapseStyle = exports.CollapseStyle = _styledComponents.default.div(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n .ant-collapse .ant-collapse-item-disabled {\n background: var(--color-disabled-button);\n }\n /* .ant-collapse-item-active .ant-collapse-expand-icon{\n transform: rotate(180deg);\n } */\n /* .ant-collapse-expand-icon{\n padding-inline-start: 0 !important;\n } */\n .ant-collapse-header-text {\n color: var(--color-primary-content);\n }\n /* .ant-collapse-arrow{\n color: var(--color-secondary-content) !important;\n } */\n .ant-collapse > .ant-collapse-item:last-child,\n .ant-collapse > .ant-collapse-item:last-child > .ant-collapse-header,\n .ant-collapse .ant-collapse-item:last-child > .ant-collapse-content {\n border-radius: 0 0 4px 4px;\n }\n .ant-collapse > .ant-collapse-item {\n border: none;\n }\n .ant-collapse {\n border: 1px solid var(--color-divider);\n border-radius: 4px;\n overflow: hidden;\n }\n\n .ant-collapse > .ant-collapse-item > .ant-collapse-header {\n padding: 12px 12px;\n }\n\n /* New styles for header content layout */\n .header-content {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n width: 100%;\n }\n\n .header-main {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n flex: 1;\n gap: 8px;\n }\n\n .header-tag {\n margin-bottom: 4px;\n }\n\n .header-text {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .header-subtext {\n margin-top: 4px;\n color: var(--color-secondary-content);\n }\n\n /* Custom body styles */\n .custom-body-item {\n margin-bottom: 24px;\n }\n\n .custom-body-item:last-child {\n margin-bottom: 0;\n }\n\n .custom-body-heading {\n margin-bottom: 16px;\n }\n\n .custom-body-content {\n // margin-top: 8px;\n }\n\n .custom-body-buttons-container {\n display: flex;\n gap: 24px;\n flex-wrap: wrap;\n }\n\n .custom-body-button {\n margin-top: 16px;\n display: flex;\n justify-content: flex-end;\n }\n\n .gst-details-keyvalue {\n .key-value-item {\n margin-bottom: 4px;\n }\n\n .key {\n font-weight: 400;\n color: var(--color-primary-content);\n }\n\n .value {\n font-weight: 700;\n color: var(--color-primary-content);\n }\n }\n\n @media only screen and (max-width: 600px) {\n .ant-collapse .ant-collapse-content > .ant-collapse-content-box {\n padding: 16px;\n }\n .ant-collapse > .ant-collapse-item > .ant-collapse-header {\n padding: 12px 16px;\n }\n }\n\n .custom-body-content-titleSubtitle {\n display: flex;\n flex-direction: column;\n gap: 16px; /* spacing between each item */\n }\n\n .title-subtitle-item {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n }\n\n .title-subtitle-item .user-details {\n flex: 1;\n display: flex; /* \uD83D\uDC48 add this */\n flex-direction: column; /* stack name & email vertically */\n gap: 2px; /* optional: tighten spacing between name & email */\n }\n"])));
@@ -0,0 +1,154 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _react = _interopRequireDefault(require("react"));
8
+ var _propTypes = _interopRequireDefault(require("prop-types"));
9
+ var _styledComponents = _interopRequireDefault(require("styled-components"));
10
+ var _Typography = _interopRequireDefault(require("../oa-component-typography/Typography"));
11
+ var _CustomButton = _interopRequireDefault(require("../oa-component-button/CustomButton"));
12
+ var _templateObject;
13
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
14
+ function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
15
+ /**
16
+ * Styled container for the details panel
17
+ */
18
+ const PanelContainer = _styledComponents.default.div(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n background: var(--color-background, #fff);\n height: 100%;\n width: 100%;\n box-sizing: border-box;\n\n .panel-title {\n margin: 0 0 24px 0;\n }\n\n .table-container {\n border: 1px solid var(--color-border, #e8e8e8);\n border-radius: 4px;\n overflow: hidden;\n margin-bottom: 24px;\n }\n\n .section-header {\n background: var(--color-background-secondary, #f5f5f5);\n padding: 12px 16px;\n margin: 0;\n border-bottom: 1px solid var(--color-border, #e8e8e8);\n }\n\n .details-table {\n width: 100%;\n margin: 0;\n border-collapse: collapse;\n background: var(--color-background, #fff);\n }\n\n .details-row {\n border-bottom: 1px solid var(--color-border-light, #f0f0f0);\n }\n\n .details-row:last-child {\n border-bottom: none;\n }\n\n .details-label {\n width: 140px;\n min-width: 140px;\n padding: 16px;\n padding-right: 16px;\n text-align: left;\n vertical-align: top;\n }\n\n .details-value {\n padding: 16px;\n word-break: break-word;\n font-weight: 500;\n vertical-align: top;\n }\n\n .details-actions {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n gap: 16px;\n margin-top: 0;\n padding-top: 0;\n border-top: none;\n }\n\n .details-actions button {\n padding: 0;\n }\n\n .children-container {\n margin-top: 24px;\n }\n"])));
19
+
20
+ /**
21
+ * DocumentDetailsPanel Component
22
+ *
23
+ * A reusable panel for displaying document/invoice details with key-value pairs.
24
+ * Can be used standalone or as children of DocumentSideDrawer, Modal, etc.
25
+ * Uses existing Typography and CustomButton components.
26
+ *
27
+ * @example
28
+ * // Standalone usage
29
+ * <DocumentDetailsPanel
30
+ * title="Check if the below details are correct"
31
+ * sectionTitle="INVOICE DETAILS"
32
+ * details={[
33
+ * { label: 'Date', value: '17 Nov 2025' },
34
+ * { label: 'Invoice Number', value: 'IEXPS8790L' },
35
+ * ]}
36
+ * actions={[
37
+ * { label: 'Download Invoice', onClick: () => {}, icon: <MaterialIcon icon={GetAppIcon} /> },
38
+ * ]}
39
+ * />
40
+ *
41
+ * @example
42
+ * // With DocumentSideDrawer
43
+ * <DocumentSideDrawer title="VALIDATE" documentConfig={...}>
44
+ * <DocumentDetailsPanel
45
+ * title="Verify the details"
46
+ * details={[...]}
47
+ * actions={[...]}
48
+ * />
49
+ * </DocumentSideDrawer>
50
+ */
51
+ function DocumentDetailsPanel(_ref) {
52
+ let {
53
+ title,
54
+ sectionTitle,
55
+ details,
56
+ actions,
57
+ children,
58
+ className,
59
+ style
60
+ } = _ref;
61
+ return /*#__PURE__*/_react.default.createElement(PanelContainer, {
62
+ className: className,
63
+ style: style
64
+ }, title && /*#__PURE__*/_react.default.createElement("div", {
65
+ className: "panel-title"
66
+ }, /*#__PURE__*/_react.default.createElement(_Typography.default, {
67
+ typography: "type-t2-700",
68
+ color: "primary-content"
69
+ }, title)), (sectionTitle || details && details.length > 0) && /*#__PURE__*/_react.default.createElement("div", {
70
+ className: "table-container"
71
+ }, sectionTitle && /*#__PURE__*/_react.default.createElement("div", {
72
+ className: "section-header"
73
+ }, /*#__PURE__*/_react.default.createElement(_Typography.default, {
74
+ typography: "type-sl1-700",
75
+ color: "secondary-content"
76
+ }, sectionTitle)), details && details.length > 0 && /*#__PURE__*/_react.default.createElement("table", {
77
+ className: "details-table",
78
+ role: "table",
79
+ "aria-label": sectionTitle || 'Details'
80
+ }, /*#__PURE__*/_react.default.createElement("tbody", null, details.map((detail, index) => {
81
+ const rowKey = detail.key || "detail-".concat(detail.label, "-").concat(index);
82
+ return /*#__PURE__*/_react.default.createElement("tr", {
83
+ className: "details-row",
84
+ key: rowKey
85
+ }, /*#__PURE__*/_react.default.createElement("th", {
86
+ className: "details-label",
87
+ scope: "row"
88
+ }, /*#__PURE__*/_react.default.createElement(_Typography.default, {
89
+ typography: "type-b2-400",
90
+ color: "secondary-content"
91
+ }, detail.label)), /*#__PURE__*/_react.default.createElement("td", {
92
+ className: "details-value"
93
+ }, /*#__PURE__*/_react.default.createElement(_Typography.default, {
94
+ typography: "type-b2-400",
95
+ color: "primary-content"
96
+ }, detail.value)));
97
+ })))), actions && actions.length > 0 && /*#__PURE__*/_react.default.createElement("div", {
98
+ className: "details-actions",
99
+ role: "group",
100
+ "aria-label": "Document actions"
101
+ }, actions.map((action, index) => {
102
+ const actionKey = action.key || "action-".concat(action.label, "-").concat(index);
103
+ return /*#__PURE__*/_react.default.createElement(_CustomButton.default, {
104
+ key: actionKey,
105
+ label: action.label,
106
+ onClick: action.onClick,
107
+ type: "text-only",
108
+ size: "medium",
109
+ "aria-label": action.ariaLabel || action.label,
110
+ iconConfig: {
111
+ icon: action.icon || null,
112
+ position: 'left'
113
+ }
114
+ });
115
+ })), children && /*#__PURE__*/_react.default.createElement("div", {
116
+ className: "children-container"
117
+ }, children));
118
+ }
119
+ DocumentDetailsPanel.propTypes = {
120
+ /** Title text displayed at the top of the panel */
121
+ title: _propTypes.default.string,
122
+ /** Section header text (e.g., "INVOICE DETAILS") */
123
+ sectionTitle: _propTypes.default.string,
124
+ /** Array of detail items to display as key-value pairs */
125
+ details: _propTypes.default.arrayOf(_propTypes.default.shape({
126
+ key: _propTypes.default.string,
127
+ label: _propTypes.default.string.isRequired,
128
+ value: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.number, _propTypes.default.node]).isRequired
129
+ })),
130
+ /** Array of action buttons/links to display */
131
+ actions: _propTypes.default.arrayOf(_propTypes.default.shape({
132
+ key: _propTypes.default.string,
133
+ label: _propTypes.default.string.isRequired,
134
+ onClick: _propTypes.default.func,
135
+ icon: _propTypes.default.node,
136
+ ariaLabel: _propTypes.default.string
137
+ })),
138
+ /** Additional content to render below the details */
139
+ children: _propTypes.default.node,
140
+ /** Additional CSS class */
141
+ className: _propTypes.default.string,
142
+ /** Inline styles */
143
+ style: _propTypes.default.object
144
+ };
145
+ DocumentDetailsPanel.defaultProps = {
146
+ title: null,
147
+ sectionTitle: null,
148
+ details: [],
149
+ actions: [],
150
+ children: null,
151
+ className: '',
152
+ style: {}
153
+ };
154
+ var _default = exports.default = DocumentDetailsPanel;
@@ -41,7 +41,7 @@ function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(
41
41
  const {
42
42
  Option
43
43
  } = _antd.Select;
44
- const StyledSelect = (0, _styledComponents.default)(_antd.Select)(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n /* Hiding the last tag in case of All being selected. */\n .ant-select-selection-overflow-item.ant-select-selection-overflow-item-rest {\n display: ", ";\n }\n .ant-select-selection-item-content {\n max-width: 70px;\n }\n"])), props => props.maxTagCount === 1 ? "none" : undefined);
44
+ const StyledSelect = (0, _styledComponents.default)(_antd.Select)(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n /* Hiding the last tag in case of All being selected. */\n .ant-select-selection-overflow-item.ant-select-selection-overflow-item-rest {\n display: ", ";\n }\n .ant-select-selection-item-content {\n max-width: 70px;\n }\n \n /* Fix clear icon position */\n .ant-select-clear {\n display: flex;\n align-items: center;\n justify-content: center;\n right: 32px;\n margin-top: 0;\n transform: translateY(-50%);\n top: 50%;\n }\n \n /* Ensure suffix icon (dropdown arrow) stays in correct position */\n .ant-select-arrow {\n right: 12px;\n }\n"])), props => props.maxTagCount === 1 ? "none" : undefined);
45
45
 
46
46
  /**
47
47
  * Takes an array of values and an object mapping values to labels and returns an
@@ -0,0 +1,466 @@
1
+ "use strict";
2
+
3
+ require("core-js/modules/es.symbol.description.js");
4
+ require("core-js/modules/es.object.assign.js");
5
+ require("core-js/modules/es.weak-map.js");
6
+ Object.defineProperty(exports, "__esModule", {
7
+ value: true
8
+ });
9
+ exports.default = void 0;
10
+ require("core-js/modules/web.dom-collections.iterator.js");
11
+ require("core-js/modules/es.json.stringify.js");
12
+ var _react = _interopRequireWildcard(require("react"));
13
+ var _Search = _interopRequireDefault(require("@material-ui/icons/Search"));
14
+ var _FilterList = _interopRequireDefault(require("@material-ui/icons/FilterList"));
15
+ var _propTypes = _interopRequireDefault(require("prop-types"));
16
+ var _CustomTable = _interopRequireDefault(require("../oa-component-table/CustomTable"));
17
+ var _CustomPagination = _interopRequireDefault(require("../oa-component-pagination/CustomPagination"));
18
+ var _MaterialIcon = _interopRequireDefault(require("../oa-component-icons/MaterialIcon"));
19
+ var _CustomDrawer = _interopRequireDefault(require("../oa-component-drawer/CustomDrawer"));
20
+ var _CustomButton = _interopRequireDefault(require("../oa-component-button/CustomButton"));
21
+ var _CustomInput = _interopRequireDefault(require("../oa-component-input/CustomInput"));
22
+ var _CustomSelect = _interopRequireDefault(require("../oa-component-select/CustomSelect"));
23
+ var _CustomRadio = _interopRequireDefault(require("../oa-component-radio/CustomRadio"));
24
+ var _CustomDatePicker = _interopRequireDefault(require("../oa-component-datepicker/CustomDatePicker"));
25
+ var _styles = require("./styles");
26
+ const _excluded = ["dataSource", "columns", "rowKey", "emptyText"];
27
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
28
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
29
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
30
+ function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
31
+ function ownKeys(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; }
32
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
33
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
34
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
35
+ function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
36
+ function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
37
+ function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
38
+ /**
39
+ * TableWithSearchAndFilter - A complete table component with search, filters and pagination
40
+ *
41
+ * @param {Object} tableProps - Table configuration
42
+ * @param {Object} searchProps - Search configuration
43
+ * @param {Object} filterProps - Filter configuration
44
+ * @param {boolean} filterProps.show - Show/hide filters
45
+ * @param {Array} filterProps.config - Filter field configurations
46
+ * @param {Function} filterProps.onApply - Callback when filters are applied
47
+ * @param {Function} filterProps.onClear - Callback when filters are cleared
48
+ * @param {Function} filterProps.onChange - Callback when any filter value changes (key, value, allFilters, action)
49
+ * - action can be: 'search', 'select', 'clear', or 'change'
50
+ * @param {boolean} filterProps.loading - Global loading state for all filter selects
51
+ * @param {string} filterProps.buttonLabel - Custom filter button label
52
+ * @param {string} filterProps.drawerTitle - Custom filter drawer title
53
+ * @param {Object} paginationProps - Pagination configuration
54
+ * @param {string} className - Additional CSS class
55
+ *
56
+ * Filter Config Options:
57
+ * - type: 'select' - Supports `loading`, `showSearch`, `filterOption`, `disabled` properties
58
+ * - type: 'radio' - Radio button group
59
+ * - type: 'date' - Single date picker
60
+ * - type: 'dateRange' - Two date pickers with fields array
61
+ * - type: 'group' - Group of fields, each supporting `loading`, `showSearch`, `filterOption`, `disabled` (for select type)
62
+ */
63
+ function TableWithSearchAndFilter(_ref) {
64
+ let {
65
+ tableProps = {},
66
+ searchProps = {},
67
+ filterProps = {},
68
+ paginationProps = {},
69
+ className = ''
70
+ } = _ref;
71
+ // Destructure tableProps with defaults
72
+ const {
73
+ dataSource = [],
74
+ columns = [],
75
+ rowKey = 'id',
76
+ emptyText = 'No data found'
77
+ } = tableProps,
78
+ restTableProps = _objectWithoutProperties(tableProps, _excluded);
79
+
80
+ // Destructure searchProps with defaults
81
+ const {
82
+ show: showSearch = true,
83
+ placeholder: searchPlaceholder = 'Search...',
84
+ onSearch
85
+ } = searchProps;
86
+
87
+ // Destructure filterProps with defaults
88
+ const {
89
+ show: showFilters = true,
90
+ config: filterConfig = [],
91
+ onApply: onFiltersApply,
92
+ onClear: onFiltersClear,
93
+ onChange: onFilterChange,
94
+ loading: filtersLoading = false,
95
+ buttonLabel: filterButtonLabel = 'Filters',
96
+ drawerTitle: filterDrawerTitle = 'FILTERS'
97
+ } = filterProps;
98
+
99
+ // Destructure paginationProps with defaults
100
+ const {
101
+ show: showPagination = true,
102
+ current = 1,
103
+ pageSize = 10,
104
+ total,
105
+ pageSizeOptions = [10, 20, 50, 100],
106
+ onChange: onPaginationChange,
107
+ onShowSizeChange
108
+ } = paginationProps;
109
+
110
+ // Constants
111
+ const SEARCH_INPUT_WIDTH = '350px';
112
+
113
+ // Search state
114
+ const [searchValue, setSearchValue] = (0, _react.useState)('');
115
+
116
+ // Filter drawer state
117
+ const [isFilterDrawerVisible, setIsFilterDrawerVisible] = (0, _react.useState)(false);
118
+ const [filterValues, setFilterValues] = (0, _react.useState)({});
119
+
120
+ // Search handlers
121
+ const handleSearchChange = e => {
122
+ const {
123
+ value
124
+ } = e.target;
125
+ setSearchValue(value);
126
+ if (onSearch) {
127
+ onSearch(value);
128
+ }
129
+ };
130
+ const handleSearchPressEnter = () => {
131
+ if (onSearch) {
132
+ onSearch(searchValue);
133
+ }
134
+ };
135
+
136
+ // Filter handlers
137
+ const handleOpenFilterDrawer = () => setIsFilterDrawerVisible(true);
138
+ const handleCloseFilterDrawer = () => setIsFilterDrawerVisible(false);
139
+ const handleFilterChange = function handleFilterChange(key, value) {
140
+ let action = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'change';
141
+ // Normalize empty values: convert empty string to null for consistency
142
+ const normalizedValue = value === '' ? null : value;
143
+ const updatedFilters = _objectSpread(_objectSpread({}, filterValues), {}, {
144
+ [key]: normalizedValue
145
+ });
146
+ setFilterValues(updatedFilters);
147
+
148
+ // Call onChange callback if provided for real-time filter changes
149
+ if (onFilterChange) {
150
+ onFilterChange(key, normalizedValue, updatedFilters, action);
151
+ }
152
+ };
153
+ const handleApplyFilters = () => {
154
+ setIsFilterDrawerVisible(false);
155
+ if (onFiltersApply) {
156
+ onFiltersApply(filterValues);
157
+ }
158
+ };
159
+ const handleClearFilters = () => {
160
+ setFilterValues({});
161
+ if (onFiltersClear) {
162
+ onFiltersClear();
163
+ }
164
+ };
165
+
166
+ // Memoized required keys calculation for better performance
167
+ const requiredKeys = (0, _react.useMemo)(() => {
168
+ const keys = [];
169
+ filterConfig.forEach(filter => {
170
+ const {
171
+ type,
172
+ key,
173
+ required,
174
+ fields = []
175
+ } = filter;
176
+ if (required) {
177
+ if (type === 'dateRange' || type === 'group') {
178
+ fields.forEach(field => {
179
+ keys.push(field.key);
180
+ });
181
+ } else {
182
+ keys.push(key);
183
+ }
184
+ }
185
+ });
186
+ return keys;
187
+ }, [filterConfig]);
188
+
189
+ // Create a stable string representation of filterValues for required keys
190
+ // This ensures reliable dependency tracking in production builds
191
+ const requiredFieldsSignature = (0, _react.useMemo)(() => requiredKeys.map(key => {
192
+ const value = filterValues[key];
193
+ // Create a stable string representation that changes when value changes
194
+ if (value === undefined || value === null) return "".concat(key, ":null");
195
+ if (value instanceof Date) return "".concat(key, ":").concat(value.getTime());
196
+ return "".concat(key, ":").concat(JSON.stringify(value));
197
+ }).join('|'), [requiredKeys, filterValues]);
198
+
199
+ // Memoized check if all required fields are filled
200
+ const areAllRequiredFieldsFilled = (0, _react.useMemo)(() => {
201
+ // If no required fields, button should be enabled
202
+ if (requiredKeys.length === 0) {
203
+ return true;
204
+ }
205
+
206
+ // Check each required field has a valid value
207
+ return requiredKeys.every(requiredKey => {
208
+ const value = filterValues[requiredKey];
209
+
210
+ // Check if value exists and is not empty/null/undefined
211
+ // Also handle edge cases: empty arrays, empty objects, etc.
212
+ if (value === undefined || value === null || value === '') {
213
+ return false;
214
+ }
215
+
216
+ // Handle arrays
217
+ if (Array.isArray(value)) {
218
+ return value.length > 0;
219
+ }
220
+
221
+ // Handle objects (but allow Date objects and other valid objects)
222
+ if (typeof value === 'object' && !(value instanceof Date)) {
223
+ return Object.keys(value).length > 0;
224
+ }
225
+ return true;
226
+ });
227
+ }, [requiredKeys, requiredFieldsSignature, filterValues]);
228
+
229
+ // Helper function to determine notFoundContent message
230
+ const getNotFoundContent = (isApiCallInProgress, query) => {
231
+ if (!isApiCallInProgress && (query === null || query === void 0 ? void 0 : query.length) < 3) {
232
+ return 'Start Typing atleast 3 characters';
233
+ }
234
+ if (isApiCallInProgress && (query === null || query === void 0 ? void 0 : query.length) > 0) {
235
+ return 'Loading...';
236
+ }
237
+ return 'No data found';
238
+ };
239
+
240
+ // Helper function to render CustomSelect (DRY principle)
241
+ const renderSelect = (fieldKey, fieldConfig) => {
242
+ const {
243
+ placeholder,
244
+ options = [],
245
+ loading = false,
246
+ isApiCallInProgress = false,
247
+ searchValue: query = '',
248
+ showSearch: fieldShowSearch = false,
249
+ filterOption,
250
+ disabled = false
251
+ } = fieldConfig;
252
+ const fieldValue = filterValues[fieldKey];
253
+ const isLoading = filtersLoading || loading || isApiCallInProgress;
254
+ const notFoundContent = getNotFoundContent(isApiCallInProgress, query);
255
+ return /*#__PURE__*/_react.default.createElement(_CustomSelect.default, {
256
+ placeholder: placeholder || 'Select an option',
257
+ value: fieldValue || undefined,
258
+ options: options,
259
+ onSelectionChange: val => {
260
+ // Normalize: null/undefined means clear action
261
+ const action = val === null || val === undefined ? 'clear' : 'select';
262
+ handleFilterChange(fieldKey, val, action);
263
+ },
264
+ onSearch: searchText => {
265
+ // For search, pass the search text as-is (don't normalize to null)
266
+ handleFilterChange(fieldKey, searchText || null, 'search');
267
+ },
268
+ onChange: val => {
269
+ // Catch clear from Ant Design's onChange (passes through {...props})
270
+ if (val === undefined || val === null) {
271
+ handleFilterChange(fieldKey, null, 'clear');
272
+ }
273
+ },
274
+ allowClear: true,
275
+ loading: isLoading,
276
+ showSearch: fieldShowSearch,
277
+ filterOption: filterOption,
278
+ disabled: disabled,
279
+ notFoundContent: notFoundContent
280
+ });
281
+ };
282
+
283
+ // Helper function to render CustomDatePicker (DRY principle)
284
+ const renderDatePicker = (fieldKey, fieldConfig) => {
285
+ const {
286
+ placeholder
287
+ } = fieldConfig;
288
+ const fieldValue = filterValues[fieldKey];
289
+ return /*#__PURE__*/_react.default.createElement(_CustomDatePicker.default, {
290
+ placeholder: placeholder || 'Select date',
291
+ value: fieldValue,
292
+ onChange: date => handleFilterChange(fieldKey, date, 'change')
293
+ });
294
+ };
295
+
296
+ // Helper function to render CustomRadio.Group (DRY principle)
297
+ const renderRadioGroup = (fieldKey, fieldConfig) => {
298
+ const {
299
+ options = []
300
+ } = fieldConfig;
301
+ const fieldValue = filterValues[fieldKey];
302
+ return /*#__PURE__*/_react.default.createElement(_CustomRadio.default.Group, {
303
+ value: fieldValue,
304
+ onChange: e => handleFilterChange(fieldKey, e.target.value, 'change')
305
+ }, options.map(option => /*#__PURE__*/_react.default.createElement(_CustomRadio.default, {
306
+ key: option.value,
307
+ value: option.value,
308
+ label: option.label
309
+ })));
310
+ };
311
+
312
+ // Render filter input based on type
313
+ const renderFilterInput = filter => {
314
+ const {
315
+ type,
316
+ key,
317
+ fields = []
318
+ } = filter;
319
+ switch (type) {
320
+ case 'radio':
321
+ return renderRadioGroup(key, filter);
322
+ case 'select':
323
+ return renderSelect(key, filter);
324
+ case 'date':
325
+ return renderDatePicker(key, filter);
326
+ case 'dateRange':
327
+ return /*#__PURE__*/_react.default.createElement(_styles.DateRangeContainer, null, fields.map(field => /*#__PURE__*/_react.default.createElement(_styles.FilterSubField, {
328
+ key: field.key
329
+ }, /*#__PURE__*/_react.default.createElement(_styles.FilterSubLabel, null, field.label), renderDatePicker(field.key, field))));
330
+ case 'group':
331
+ return /*#__PURE__*/_react.default.createElement(_styles.FilterGroup, null, fields.map(field => /*#__PURE__*/_react.default.createElement(_styles.FilterSubField, {
332
+ key: field.key
333
+ }, /*#__PURE__*/_react.default.createElement(_styles.FilterSubLabel, null, field.label), field.type === 'select' && renderSelect(field.key, field), field.type === 'date' && renderDatePicker(field.key, field), field.type === 'radio' && renderRadioGroup(field.key, field))));
334
+ default:
335
+ return null;
336
+ }
337
+ };
338
+ const displayData = dataSource;
339
+ const totalRecords = total !== null && total !== void 0 ? total : displayData.length;
340
+ return /*#__PURE__*/_react.default.createElement(_styles.TableWithSearchAndFilterContainer, {
341
+ className: className
342
+ }, (showSearch || showFilters) && /*#__PURE__*/_react.default.createElement(_styles.Toolbar, null, showSearch && /*#__PURE__*/_react.default.createElement(_CustomInput.default, {
343
+ prefix: /*#__PURE__*/_react.default.createElement(_MaterialIcon.default, {
344
+ icon: _Search.default,
345
+ size: 20,
346
+ style: {
347
+ color: '#8c8c8c'
348
+ }
349
+ }),
350
+ placeholder: searchPlaceholder,
351
+ value: searchValue,
352
+ onChange: handleSearchChange,
353
+ onPressEnter: handleSearchPressEnter,
354
+ allowClear: true,
355
+ style: {
356
+ width: SEARCH_INPUT_WIDTH,
357
+ flexShrink: 0
358
+ }
359
+ }), showFilters && /*#__PURE__*/_react.default.createElement(_CustomButton.default, {
360
+ label: filterButtonLabel,
361
+ onClick: handleOpenFilterDrawer,
362
+ type: "secondary",
363
+ size: "medium",
364
+ iconConfig: {
365
+ icon: /*#__PURE__*/_react.default.createElement(_MaterialIcon.default, {
366
+ icon: _FilterList.default
367
+ }),
368
+ position: 'left'
369
+ }
370
+ })), showFilters && /*#__PURE__*/_react.default.createElement(_CustomDrawer.default, {
371
+ title: filterDrawerTitle,
372
+ placement: "right",
373
+ isBaseDrawer: true,
374
+ onClose: handleCloseFilterDrawer,
375
+ open: isFilterDrawerVisible,
376
+ visible: isFilterDrawerVisible,
377
+ closable: false,
378
+ width: 400
379
+ }, /*#__PURE__*/_react.default.createElement(_styles.FilterDrawerContent, null, /*#__PURE__*/_react.default.createElement(_styles.FilterDrawerBody, null, filterConfig.length > 0 ? filterConfig.map(filter => /*#__PURE__*/_react.default.createElement(_styles.FilterSection, {
380
+ key: filter.key
381
+ }, /*#__PURE__*/_react.default.createElement(_styles.FilterLabel, null, filter.label, filter.required && /*#__PURE__*/_react.default.createElement(_styles.RequiredMark, null, "*")), renderFilterInput(filter))) : /*#__PURE__*/_react.default.createElement(_styles.FilterSection, null, /*#__PURE__*/_react.default.createElement(_styles.FilterLabel, null, "No filters configured"))), /*#__PURE__*/_react.default.createElement(_styles.FilterDrawerFooter, null, /*#__PURE__*/_react.default.createElement(_CustomButton.default, {
382
+ label: "Clear All",
383
+ onClick: handleClearFilters,
384
+ type: "secondary",
385
+ size: "medium"
386
+ }), /*#__PURE__*/_react.default.createElement(_CustomButton.default, {
387
+ label: "Apply Filter",
388
+ onClick: handleApplyFilters,
389
+ type: "primary",
390
+ size: "medium",
391
+ disabled: !areAllRequiredFieldsFilled
392
+ })))), /*#__PURE__*/_react.default.createElement(_CustomTable.default, _extends({
393
+ rowKey: rowKey,
394
+ dataSource: displayData,
395
+ columns: columns,
396
+ pagination: false,
397
+ emptyText: emptyText
398
+ }, restTableProps)), showPagination && totalRecords > pageSize && /*#__PURE__*/_react.default.createElement(_styles.PaginationContainer, null, /*#__PURE__*/_react.default.createElement(_CustomPagination.default, {
399
+ current: current,
400
+ pageSize: pageSize,
401
+ total: totalRecords,
402
+ onChange: onPaginationChange,
403
+ onShowSizeChange: onShowSizeChange,
404
+ pageSizeOptions: pageSizeOptions,
405
+ showSizeChanger: true,
406
+ showTotal: true
407
+ })));
408
+ }
409
+ TableWithSearchAndFilter.propTypes = {
410
+ tableProps: _propTypes.default.shape({
411
+ dataSource: _propTypes.default.array,
412
+ columns: _propTypes.default.array.isRequired,
413
+ rowKey: _propTypes.default.string,
414
+ emptyText: _propTypes.default.string
415
+ }),
416
+ searchProps: _propTypes.default.shape({
417
+ show: _propTypes.default.bool,
418
+ placeholder: _propTypes.default.string,
419
+ onSearch: _propTypes.default.func
420
+ }),
421
+ filterProps: _propTypes.default.shape({
422
+ show: _propTypes.default.bool,
423
+ config: _propTypes.default.array,
424
+ onApply: _propTypes.default.func,
425
+ onClear: _propTypes.default.func,
426
+ onChange: _propTypes.default.func,
427
+ loading: _propTypes.default.bool,
428
+ buttonLabel: _propTypes.default.string,
429
+ drawerTitle: _propTypes.default.string
430
+ }),
431
+ paginationProps: _propTypes.default.shape({
432
+ show: _propTypes.default.bool,
433
+ current: _propTypes.default.number,
434
+ pageSize: _propTypes.default.number,
435
+ total: _propTypes.default.number,
436
+ pageSizeOptions: _propTypes.default.array,
437
+ onChange: _propTypes.default.func,
438
+ onShowSizeChange: _propTypes.default.func
439
+ }),
440
+ className: _propTypes.default.string
441
+ };
442
+ TableWithSearchAndFilter.defaultProps = {
443
+ tableProps: {
444
+ dataSource: [],
445
+ rowKey: 'id',
446
+ emptyText: 'No data found'
447
+ },
448
+ searchProps: {
449
+ show: true,
450
+ placeholder: 'Search...'
451
+ },
452
+ filterProps: {
453
+ show: true,
454
+ config: [],
455
+ buttonLabel: 'Filters',
456
+ drawerTitle: 'FILTERS'
457
+ },
458
+ paginationProps: {
459
+ show: true,
460
+ current: 1,
461
+ pageSize: 10,
462
+ pageSizeOptions: [10, 20, 50, 100]
463
+ },
464
+ className: ''
465
+ };
466
+ var _default = exports.default = TableWithSearchAndFilter;
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.Toolbar = exports.TableWithSearchAndFilterContainer = exports.RequiredMark = exports.PaginationContainer = exports.FilterSubLabelText = exports.FilterSubLabel = exports.FilterSubField = exports.FilterSection = exports.FilterLabel = exports.FilterGroup = exports.FilterDrawerFooter = exports.FilterDrawerContent = exports.FilterDrawerBody = exports.DateRangeContainer = void 0;
7
+ var _styledComponents = _interopRequireDefault(require("styled-components"));
8
+ var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7, _templateObject8, _templateObject9, _templateObject10, _templateObject11, _templateObject12, _templateObject13, _templateObject14;
9
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
10
+ function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
11
+ const TableWithSearchAndFilterContainer = exports.TableWithSearchAndFilterContainer = _styledComponents.default.div(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n width: 100%;\n"])));
12
+ const Toolbar = exports.Toolbar = _styledComponents.default.div(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n gap: 16px;\n\n @media screen and (max-width: 768px) {\n flex-direction: column;\n align-items: stretch;\n }\n"])));
13
+ const FilterSection = exports.FilterSection = _styledComponents.default.div(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n margin-bottom: 24px;\n"])));
14
+ const FilterLabel = exports.FilterLabel = _styledComponents.default.label(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["\n display: flex;\n align-items: center;\n font-weight: 600;\n font-size: 14px;\n color: var(--color-primary-content, #212121);\n margin-bottom: 12px;\n"])));
15
+ const RequiredMark = exports.RequiredMark = _styledComponents.default.span(_templateObject5 || (_templateObject5 = _taggedTemplateLiteral(["\n color: #ff4d4f;\n margin-left: 2px;\n font-weight: 400;\n"])));
16
+ const PaginationContainer = exports.PaginationContainer = _styledComponents.default.div(_templateObject6 || (_templateObject6 = _taggedTemplateLiteral(["\n margin-top: 16px;\n display: flex;\n justify-content: flex-end;\n align-items: center;\n"])));
17
+ const FilterDrawerContent = exports.FilterDrawerContent = _styledComponents.default.div(_templateObject7 || (_templateObject7 = _taggedTemplateLiteral(["\n display: flex;\n flex-direction: column;\n min-height: calc(100vh - 150px);\n"])));
18
+ const FilterDrawerBody = exports.FilterDrawerBody = _styledComponents.default.div(_templateObject8 || (_templateObject8 = _taggedTemplateLiteral(["\n flex: 1;\n overflow-y: auto;\n \n /* Make radio buttons horizontal */\n .ant-radio-group {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n gap: 16px;\n }\n \n /* Ensure radio wrapper is visible - override line-height: 0 */\n .ant-radio-wrapper {\n display: inline-flex !important;\n align-items: center !important;\n margin-right: 0 !important;\n line-height: 1.5 !important;\n }\n \n /* Ensure radio label text is visible */\n .ant-radio-wrapper span:not(.ant-radio) {\n line-height: 1.5 !important;\n }\n \n .ant-radio-wrapper p {\n margin: 0;\n line-height: 1.5 !important;\n }\n"])));
19
+ const FilterDrawerFooter = exports.FilterDrawerFooter = _styledComponents.default.div(_templateObject9 || (_templateObject9 = _taggedTemplateLiteral(["\n display: flex;\n justify-content: flex-end;\n gap: 12px;\n padding: 16px 0;\n border-top: 1px solid #e8e8e8;\n margin-top: auto;\n"])));
20
+ const FilterGroup = exports.FilterGroup = _styledComponents.default.div(_templateObject10 || (_templateObject10 = _taggedTemplateLiteral(["\n display: flex;\n flex-direction: column;\n gap: 16px;\n"])));
21
+ const FilterSubField = exports.FilterSubField = _styledComponents.default.div(_templateObject11 || (_templateObject11 = _taggedTemplateLiteral(["\n display: flex;\n flex-direction: column;\n gap: 8px;\n"])));
22
+ const FilterSubLabel = exports.FilterSubLabel = _styledComponents.default.label(_templateObject12 || (_templateObject12 = _taggedTemplateLiteral(["\n display: flex;\n align-items: center;\n font-weight: 400;\n font-size: 14px;\n color: var(--color-primary-content, #212121);\n"])));
23
+ const FilterSubLabelText = exports.FilterSubLabelText = _styledComponents.default.span(_templateObject13 || (_templateObject13 = _taggedTemplateLiteral(["\n color: var(--color-primary-content, #212121);\n"])));
24
+ const DateRangeContainer = exports.DateRangeContainer = _styledComponents.default.div(_templateObject14 || (_templateObject14 = _taggedTemplateLiteral(["\n display: flex;\n flex-direction: column;\n gap: 16px;\n"])));
@@ -212,7 +212,7 @@ function DocumentUpload(_ref) {
212
212
  }
213
213
 
214
214
  // If file is done or error, show confirmation modal
215
- if ((file === null || file === void 0 ? void 0 : file.status) === 'done' || (file === null || file === void 0 ? void 0 : file.status) === 'error') {
215
+ if ((file === null || file === void 0 ? void 0 : file.status) === 'done' || (file === null || file === void 0 ? void 0 : file.status) === 'error' || file !== null && file !== void 0 && file.url) {
216
216
  setSelectedFile(file);
217
217
  setDeleteConfirmation(true);
218
218
  resolve(false); // Prevent removal until confirmed
@@ -19,7 +19,7 @@ var _MaterialIcon = _interopRequireDefault(require("../../components/oa-componen
19
19
  var _Close = _interopRequireDefault(require("@material-ui/icons/Close"));
20
20
  var _Check = _interopRequireDefault(require("@material-ui/icons/Check"));
21
21
  var _styles = _interopRequireDefault(require("./styles"));
22
- const _excluded = ["title", "handleCloseDrawer", "documentConfig", "drawerWidth", "drawerButtonConfig", "drawerTagConfig", "onlyDocumentView"];
22
+ const _excluded = ["title", "handleCloseDrawer", "documentConfig", "drawerWidth", "drawerButtonConfig", "drawerTagConfig", "onlyDocumentView", "containerClassName"];
23
23
  /* eslint-disable */
24
24
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
25
25
  function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
@@ -50,7 +50,8 @@ function DocumentSideDrawer(_ref) {
50
50
  drawerWidth,
51
51
  drawerButtonConfig,
52
52
  drawerTagConfig,
53
- onlyDocumentView
53
+ onlyDocumentView,
54
+ containerClassName
54
55
  } = _ref,
55
56
  props = _objectWithoutProperties(_ref, _excluded);
56
57
  // Calculate the drawer width based on documentConfig or fallback to 480
@@ -132,14 +133,16 @@ function DocumentSideDrawer(_ref) {
132
133
  color: item.type === "positive" ? "positive" : "negative"
133
134
  }), /*#__PURE__*/_react.default.createElement("p", null, item.title)))))));
134
135
  };
135
- return /*#__PURE__*/_react.default.createElement(_CustomDrawer.default, {
136
+ return /*#__PURE__*/_react.default.createElement(_CustomDrawer.default, _extends({
136
137
  buttonConfig: drawerButtonConfig,
137
138
  "data-test": "document-side-drawer",
138
139
  className: "documentDrawer",
139
140
  width: calculatedWidth,
140
141
  onClose: handleCloseDrawer,
141
142
  title: title
142
- }, /*#__PURE__*/_react.default.createElement(_styles.default, null, /*#__PURE__*/_react.default.createElement("div", {
143
+ }, props), /*#__PURE__*/_react.default.createElement(_styles.default, {
144
+ className: containerClassName
145
+ }, /*#__PURE__*/_react.default.createElement("div", {
143
146
  className: "viewerContainer"
144
147
  }, renderDocumentViewer(), !onlyDocumentView && /*#__PURE__*/_react.default.createElement("div", {
145
148
  className: "rightContSection"
@@ -180,7 +183,8 @@ DocumentSideDrawer.propTypes = {
180
183
  drawerWidth: _propTypes.default.string,
181
184
  drawerButtonConfig: _propTypes.default.object,
182
185
  drawerTagConfig: _propTypes.default.object,
183
- onlyDocumentView: _propTypes.default.bool
186
+ onlyDocumentView: _propTypes.default.bool,
187
+ containerClassName: _propTypes.default.string
184
188
  };
185
189
 
186
190
  // Default props to provide fallback values for optional props
@@ -8,5 +8,5 @@ var _styledComponents = _interopRequireDefault(require("styled-components"));
8
8
  var _templateObject;
9
9
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
10
10
  function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
11
- const ViewerContainer = _styledComponents.default.div(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n.ant-tabs-nav{\n margin: 0;\n}\n .ant-tabs-top>.ant-tabs-nav::before {\n border: none;\n border-right: 1px solid #E0E0E0;\n }\n .ant-tabs-content-holder .customDocumentViewerOverlayHeader{\n bottom: 60px;\n }\n .ant-tabs-tab{\n border-radius: 0px !important;\n border: none !important;\n border-bottom: 2px solid transparent !important;\n }\n .ant-tabs-tab-active{\n border-bottom: 2px solid var(--color-primary) !important;\n }\n .viewerContainer > div {\n flex: 1;\n box-sizing: border-box;\n }\n .viewerContainer {\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n }\n .rightContSection {\n display: flex;\n flex-direction: column;\n padding: 24px;\n }\n .grayBoxSec {\n border-radius: 8px;\n background: #f6f6f6;\n padding: 12px 16px;\n }\n .statusSec {\n display: flex;\n flex-direction: row;\n align-items: center;\n }\n .statusSec button {\n margin-left: 8px;\n }\n"])));
11
+ const ViewerContainer = _styledComponents.default.div(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n.ant-tabs-nav{\n margin: 0;\n}\n .ant-tabs-top>.ant-tabs-nav::before {\n border: none;\n border-right: 1px solid #E0E0E0;\n }\n .ant-tabs-content-holder .customDocumentViewerOverlayHeader{\n bottom: 60px;\n }\n .ant-tabs-tab{\n border-radius: 0px !important;\n border: none !important;\n border-bottom: 2px solid transparent !important;\n }\n .ant-tabs-tab-active{\n border-bottom: 2px solid var(--color-primary) !important;\n }\n .viewerContainer > div {\n flex: 1;\n box-sizing: border-box;\n }\n .viewerContainer {\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n }\n .rightContSection {\n display: flex;\n flex-direction: column;\n padding: 24px;\n min-width: 300px;\n max-width: 450px;\n overflow-x: visible;\n }\n /* Styles specific to DocumentViewerWithDetails */\n &.documentViewerWithDetails {\n .viewerContainer > div:first-child {\n flex: 1;\n box-sizing: border-box;\n min-width: 0;\n }\n .rightContSection {\n flex: 0 0 auto;\n width: fit-content;\n min-width: auto;\n max-width: none;\n }\n }\n .grayBoxSec {\n border-radius: 8px;\n background: #f6f6f6;\n padding: 12px 16px;\n }\n .statusSec {\n display: flex;\n flex-direction: row;\n align-items: center;\n }\n .statusSec button {\n margin-left: 8px;\n }\n"])));
12
12
  var _default = exports.default = ViewerContainer;
@@ -0,0 +1,123 @@
1
+ "use strict";
2
+
3
+ require("core-js/modules/es.object.assign.js");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = void 0;
8
+ var _react = _interopRequireDefault(require("react"));
9
+ var _propTypes = _interopRequireDefault(require("prop-types"));
10
+ var _DocumentSideDrawer = _interopRequireDefault(require("../oa-widget-document-side-drawer/DocumentSideDrawer"));
11
+ var _DocumentDetailsPanel = _interopRequireDefault(require("../../components/oa-component-document-details-panel/DocumentDetailsPanel"));
12
+ const _excluded = ["title", "onClose", "drawerWidth", "fileUrl", "fileType", "documentConfig", "detailsTitle", "sectionTitle", "details", "actions", "children"];
13
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
14
+ function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
15
+ function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
16
+ function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
17
+ /**
18
+ * DocumentViewerWithDetails Component
19
+ *
20
+ * A split-view component that displays a document viewer on the left
21
+ * and a details panel with actions on the right.
22
+ *
23
+ * Uses DocumentSideDrawer and DocumentDetailsPanel internally.
24
+ *
25
+ * @example
26
+ * <DocumentViewerWithDetails
27
+ * title="VIEW DOCUMENT"
28
+ * fileUrl="/path/to/document.pdf"
29
+ * fileType="pdf"
30
+ * detailsTitle="Document Information"
31
+ * sectionTitle="DETAILS"
32
+ * details={[
33
+ * { label: 'Date', value: '17 Nov 2025' },
34
+ * { label: 'Document Number', value: 'DOC-12345' },
35
+ * ]}
36
+ * actions={[
37
+ * { label: 'Download', onClick: () => {}, icon: <DownloadIcon /> },
38
+ * ]}
39
+ * onClose={() => setIsOpen(false)}
40
+ * />
41
+ */
42
+ function DocumentViewerWithDetails(_ref) {
43
+ let {
44
+ // Drawer props
45
+ title,
46
+ onClose,
47
+ drawerWidth,
48
+ // Document props
49
+ fileUrl,
50
+ fileType,
51
+ documentConfig,
52
+ // Details panel props
53
+ detailsTitle,
54
+ sectionTitle,
55
+ details,
56
+ actions,
57
+ // Additional children
58
+ children
59
+ } = _ref,
60
+ restProps = _objectWithoutProperties(_ref, _excluded);
61
+ // Build document config from fileUrl or use provided documentConfig
62
+ const finalDocumentConfig = documentConfig || (fileUrl ? {
63
+ fileUrl,
64
+ fileType: fileType || 'pdf'
65
+ } : null);
66
+ return /*#__PURE__*/_react.default.createElement(_DocumentSideDrawer.default, _extends({
67
+ title: title,
68
+ handleCloseDrawer: onClose,
69
+ documentConfig: finalDocumentConfig,
70
+ drawerWidth: drawerWidth,
71
+ containerClassName: "documentViewerWithDetails"
72
+ }, restProps), /*#__PURE__*/_react.default.createElement(_DocumentDetailsPanel.default, {
73
+ title: detailsTitle,
74
+ sectionTitle: sectionTitle,
75
+ details: details,
76
+ actions: actions
77
+ }, children));
78
+ }
79
+ DocumentViewerWithDetails.propTypes = {
80
+ /** Drawer title displayed in the header */
81
+ title: _propTypes.default.string,
82
+ /** Callback function when drawer is closed */
83
+ onClose: _propTypes.default.func,
84
+ /** Custom drawer width (default: 1200) */
85
+ drawerWidth: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.number]),
86
+ /** URL of the document to display */
87
+ fileUrl: _propTypes.default.string,
88
+ /** Type of document: 'pdf', 'pdfWithCarousel', or 'image' */
89
+ fileType: _propTypes.default.oneOf(['pdf', 'pdfWithCarousel', 'image']),
90
+ /** Full document config (alternative to fileUrl) */
91
+ documentConfig: _propTypes.default.object,
92
+ /** Title text for the details panel */
93
+ detailsTitle: _propTypes.default.string,
94
+ /** Section header text (e.g., "DETAILS") */
95
+ sectionTitle: _propTypes.default.string,
96
+ /** Array of detail items to display */
97
+ details: _propTypes.default.arrayOf(_propTypes.default.shape({
98
+ label: _propTypes.default.string.isRequired,
99
+ value: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.number]).isRequired
100
+ })),
101
+ /** Array of action buttons to display */
102
+ actions: _propTypes.default.arrayOf(_propTypes.default.shape({
103
+ label: _propTypes.default.string.isRequired,
104
+ onClick: _propTypes.default.func,
105
+ icon: _propTypes.default.node
106
+ })),
107
+ /** Additional content to render in the details panel */
108
+ children: _propTypes.default.node
109
+ };
110
+ DocumentViewerWithDetails.defaultProps = {
111
+ title: null,
112
+ onClose: () => {},
113
+ drawerWidth: '1200',
114
+ fileUrl: null,
115
+ fileType: null,
116
+ documentConfig: null,
117
+ detailsTitle: null,
118
+ sectionTitle: null,
119
+ details: [],
120
+ actions: [],
121
+ children: null
122
+ };
123
+ var _default = exports.default = DocumentViewerWithDetails;
package/build/index.js CHANGED
@@ -335,6 +335,12 @@ Object.defineProperty(exports, "DocUploadWidget", {
335
335
  return _DocUploadWidget.default;
336
336
  }
337
337
  });
338
+ Object.defineProperty(exports, "DocumentDetailsPanel", {
339
+ enumerable: true,
340
+ get: function get() {
341
+ return _DocumentDetailsPanel.default;
342
+ }
343
+ });
338
344
  Object.defineProperty(exports, "DocumentSideDrawer", {
339
345
  enumerable: true,
340
346
  get: function get() {
@@ -347,6 +353,12 @@ Object.defineProperty(exports, "DocumentSideModal", {
347
353
  return _DocumentSideModal.default;
348
354
  }
349
355
  });
356
+ Object.defineProperty(exports, "DocumentViewerWithDetails", {
357
+ enumerable: true,
358
+ get: function get() {
359
+ return _DocumentViewerWithDetails.default;
360
+ }
361
+ });
350
362
  Object.defineProperty(exports, "DropdownSearchInput", {
351
363
  enumerable: true,
352
364
  get: function get() {
@@ -575,6 +587,12 @@ Object.defineProperty(exports, "StageTimelineWidget", {
575
587
  return _StageTimelineWidget.default;
576
588
  }
577
589
  });
590
+ Object.defineProperty(exports, "TableWithSearchAndFilter", {
591
+ enumerable: true,
592
+ get: function get() {
593
+ return _TableWithSearchAndFilter.default;
594
+ }
595
+ });
578
596
  Object.defineProperty(exports, "TextArea", {
579
597
  enumerable: true,
580
598
  get: function get() {
@@ -683,6 +701,7 @@ var _CustomSelect = _interopRequireDefault(require("./components/oa-component-se
683
701
  var _CustomTimePicker = _interopRequireDefault(require("./components/oa-component-timepicker/CustomTimePicker"));
684
702
  var _CustomDatePicker = _interopRequireDefault(require("./components/oa-component-datepicker/CustomDatePicker"));
685
703
  var _CustomTable = _interopRequireDefault(require("./components/oa-component-table/CustomTable"));
704
+ var _TableWithSearchAndFilter = _interopRequireDefault(require("./components/oa-component-table-with-search-and-filter/TableWithSearchAndFilter"));
686
705
  var _CustomTabs = _interopRequireDefault(require("./components/oa-component-tabs/CustomTabs"));
687
706
  var _CustomTag = _interopRequireDefault(require("./components/oa-component-tag/CustomTag"));
688
707
  var _CustomTimeline = _interopRequireDefault(require("./components/oa-component-timeline/CustomTimeline"));
@@ -754,6 +773,8 @@ var _CustomUpload2 = _interopRequireDefault(require("./dev/oa-component-upload/C
754
773
  var _DocumentSideDrawer = _interopRequireDefault(require("./dev/oa-widget-document-side-drawer/DocumentSideDrawer"));
755
774
  var _CustomDocumentViewer = _interopRequireDefault(require("./dev/oa-component-document-viewer/CustomDocumentViewer"));
756
775
  var _DocumentSideModal = _interopRequireDefault(require("./dev/oa-widget-document-modal/DocumentSideModal"));
776
+ var _DocumentDetailsPanel = _interopRequireDefault(require("./components/oa-component-document-details-panel/DocumentDetailsPanel"));
777
+ var _DocumentViewerWithDetails = _interopRequireDefault(require("./dev/oa-widget-document-viewer-with-details/DocumentViewerWithDetails"));
757
778
  var _PaymentAndConsent = _interopRequireDefault(require("./layout/paymentAndConsent/PaymentAndConsent"));
758
779
  var _GenricLayOut = _interopRequireDefault(require("./layout/GenricLayOut/GenricLayOut"));
759
780
  var _EntityOverviewLayout = _interopRequireDefault(require("./layout/EntityOverviewLayout/EntityOverviewLayout"));
@@ -2229,7 +2229,7 @@ function GenricLayOut(_ref) {
2229
2229
  }
2230
2230
  })), /*#__PURE__*/_react.default.createElement("div", {
2231
2231
  className: "oaheaderButtonsRight"
2232
- }, (rightHeaderSecondButton === null || rightHeaderSecondButton === void 0 ? void 0 : rightHeaderSecondButton.visible) && /*#__PURE__*/_react.default.createElement(_CustomButton.default, {
2232
+ }, !isFiltersEmpty(customDrawer === null || customDrawer === void 0 ? void 0 : customDrawer.appliedFilters) && /*#__PURE__*/_react.default.createElement(_CustomButton.default, {
2233
2233
  label: rightHeaderSecondButton === null || rightHeaderSecondButton === void 0 ? void 0 : rightHeaderSecondButton.label,
2234
2234
  onClick: rightHeaderSecondButtonClick,
2235
2235
  type: rightHeaderSecondButton === null || rightHeaderSecondButton === void 0 ? void 0 : rightHeaderSecondButton.type,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oa-componentbook",
3
- "version": "0.18.378",
3
+ "version": "0.18.380",
4
4
  "private": false,
5
5
  "description": "Reusable components",
6
6
  "main": "build/index.js",