oa-componentbook 1.0.1-stage.46 → 1.0.1-stage.460
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/build/components/oa-component-accordion/Accordion.js +139 -43
- package/build/components/oa-component-accordion/styles.js +2 -2
- package/build/components/oa-component-button/CustomButton.js +24 -19
- package/build/components/oa-component-button/styles.js +1 -1
- package/build/components/oa-component-checkbox/CustomCheckBox.js +20 -17
- package/build/components/oa-component-checkbox/styles.js +1 -1
- package/build/components/oa-component-datepicker/CustomDatePicker.js +37 -26
- package/build/components/oa-component-document-details-panel/DocumentDetailsPanel.js +154 -0
- package/build/components/oa-component-drawer/CustomDrawer.js +2 -0
- package/build/components/oa-component-dropdown/CustomDropdown.js +16 -4
- package/build/components/oa-component-icons/MaterialIcon.js +1 -1
- package/build/components/oa-component-info/CustomInfo.js +42 -6
- package/build/components/oa-component-info/styles.js +5 -4
- package/build/components/oa-component-modal/CustomModal.js +59 -48
- package/build/components/oa-component-modal/styles.js +3 -2
- package/build/components/oa-component-pagination/CustomPagination.js +111 -0
- package/build/components/oa-component-pagination/styles.js +12 -0
- package/build/components/oa-component-progress-bar/CustomProgressBar.js +8 -4
- package/build/components/oa-component-select/CustomSelect.js +130 -56
- package/build/components/oa-component-steps/CustomSteps.js +117 -0
- package/build/components/oa-component-steps/styles.js +12 -0
- package/build/components/oa-component-table/CustomTable.js +28 -5
- package/build/components/oa-component-table/CustomTableV1.js +614 -0
- package/build/components/oa-component-table/styles.js +1 -1
- package/build/components/oa-component-table/stylesV1.js +19 -0
- package/build/components/oa-component-table-with-search-and-filter/TableWithSearchAndFilter.js +515 -0
- package/build/components/oa-component-table-with-search-and-filter/styles.js +25 -0
- package/build/components/oa-component-tabs/CustomTabs.js +51 -4
- package/build/components/oa-component-tabs/styles.js +4 -3
- package/build/components/oa-component-tag/CustomTag.js +30 -11
- package/build/components/oa-component-tag/styles.js +30 -3
- package/build/components/oa-component-textarea/CustomTextArea.js +161 -0
- package/build/components/oa-component-textarea/constants.js +39 -0
- package/build/components/oa-component-textarea/styles.js +12 -3
- package/build/components/oa-component-tooltip/CustomTooltip.js +8 -4
- package/build/components/oa-component-upload/CustomUpload.js +129 -42
- package/build/components/oa-component-viewer/CustomViewer.js +17 -11
- package/build/dev/oa-component-document-viewer/CustomDocumentViewer.js +367 -0
- package/build/dev/oa-component-document-viewer/styles.js +12 -0
- package/build/dev/oa-component-upload/CustomUpload.js +116 -29
- package/build/dev/oa-component-upload/styles.js +2 -2
- package/build/dev/oa-widget-document-modal/DocumentSideModal.js +166 -0
- package/build/dev/oa-widget-document-modal/styles.js +12 -0
- package/build/dev/oa-widget-document-side-drawer/DocumentSideDrawer.js +200 -0
- package/build/dev/oa-widget-document-side-drawer/styles.js +12 -0
- package/build/dev/oa-widget-document-viewer-with-details/DocumentViewerWithDetails.js +123 -0
- package/build/global-css/GlobalCss.js +2 -1
- package/build/global-css/GridLayout.js +1 -1
- package/build/global-css/commonStyles.js +11 -0
- package/build/images/Car.png +0 -0
- package/build/images/TwoWheeler.png +0 -0
- package/build/images/astronaut_emptystate.png +0 -0
- package/build/images/exportGrp01.png +0 -0
- package/build/images/exportGrp02.png +0 -0
- package/build/images/exportGrp03.png +0 -0
- package/build/images/outOfStock.png +0 -0
- package/build/index.js +135 -2
- package/build/layout/DetailDataLayout/DetailDataLayout.js +20 -0
- package/build/layout/DetailDataLayout/components/Form.js +22 -0
- package/build/layout/DetailDataLayout/components/Header.js +32 -0
- package/build/layout/DetailDataLayout/style.css +9 -0
- package/build/layout/DetailDataLayout/styles.js +12 -0
- package/build/layout/EntityOverviewLayout/EntityOverviewLayout.js +403 -0
- package/build/layout/EntityOverviewLayout/reducer/entityOverviewLayoutReducer.js +85 -0
- package/build/layout/EntityOverviewLayout/styles.js +13 -0
- package/build/layout/GenricLayOut/GenricLayOut.js +2551 -0
- package/build/layout/GenricLayOut/components/AppliedFilters.js +90 -0
- package/build/layout/GenricLayOut/components/CardList.js +34 -0
- package/build/layout/GenricLayOut/components/DropdownSearch.js +48 -0
- package/build/layout/GenricLayOut/components/Header.js +74 -0
- package/build/layout/GenricLayOut/components/Modal.js +96 -0
- package/build/layout/GenricLayOut/components/ProfileSection.js +219 -0
- package/build/layout/GenricLayOut/components/Search.js +51 -0
- package/build/layout/GenricLayOut/components/StaticFilter.css +73 -0
- package/build/layout/GenricLayOut/components/StaticFilter.js +37 -0
- package/build/layout/GenricLayOut/reducer/layoutReducer.js +328 -0
- package/build/layout/GenricLayOut/resolver/staticConfigResolver.js +98 -0
- package/build/layout/GenricLayOut/styles.js +42 -0
- package/build/utils/download-file.js +23 -0
- package/build/widgets/oa-form-widget/FormWidget.js +577 -0
- package/build/widgets/oa-form-widget/FormWidgetStyle.js +18 -0
- package/build/widgets/oa-widget-add-spare-part/AddSparePartCollapseWidget.js +80 -16
- package/build/widgets/oa-widget-add-spare-part/AddSparePartWidget.js +50 -7
- package/build/widgets/oa-widget-address/AddressWidget.js +12 -17
- package/build/widgets/oa-widget-approval/ApprovalWidget.js +19 -11
- package/build/widgets/oa-widget-approval/ApprovalWidgetNew.js +492 -0
- package/build/widgets/oa-widget-approval/styles.js +2 -2
- package/build/widgets/oa-widget-chat/ChatWidget.js +5 -5
- package/build/widgets/oa-widget-close-claim/CloseClaimWidget.js +17 -5
- package/build/widgets/oa-widget-collapsible-key-value/CollapsibleKeyValueWidget.js +396 -0
- package/build/widgets/oa-widget-collapsible-key-value/styles.js +16 -0
- package/build/widgets/oa-widget-content-panel/ContentPanel.js +82 -0
- package/build/widgets/oa-widget-content-panel/styles.js +12 -0
- package/build/widgets/oa-widget-customer-rating-card/CustomerRatingCard.js +5 -5
- package/build/widgets/oa-widget-detailcard/styles.js +1 -1
- package/build/widgets/oa-widget-document-upload/DocUploadWidget.js +6 -9
- package/build/widgets/oa-widget-dropdown-search-input/DropdownSearchInput.js +53 -19
- package/build/widgets/oa-widget-dropdown-search-input/styles.js +1 -1
- package/build/widgets/oa-widget-guide/GuideWidget.js +70 -0
- package/build/widgets/oa-widget-guide/GuideWidgetStyle.js +12 -0
- package/build/widgets/oa-widget-hub-automation-modal/HubAutomationDeleteBiker.js +24 -0
- package/build/widgets/oa-widget-hub-automation-modal/HubAutomationModal.js +34 -0
- package/build/widgets/oa-widget-hub-automation-modal/HubAutomationModalStyle.js +13 -0
- package/build/widgets/oa-widget-image-carousel/ImageCarouselWidget.js +256 -0
- package/build/widgets/oa-widget-image-carousel/styles.js +23 -0
- package/build/widgets/oa-widget-image-gallery/FullscreenViewer.js +169 -0
- package/build/widgets/oa-widget-image-gallery/ImageGallery.js +87 -0
- package/build/widgets/oa-widget-image-gallery/ThumbnailGrid.js +146 -0
- package/build/widgets/oa-widget-image-gallery/imageCache.js +15 -0
- package/build/widgets/oa-widget-image-gallery/imageGalleryStyle.js +16 -0
- package/build/widgets/oa-widget-item-info-card/InfoCardListWidget.js +60 -0
- package/build/widgets/oa-widget-item-info-card/ItemInfoCardWidget.js +83 -0
- package/build/widgets/oa-widget-item-info-card/styles.css +50 -0
- package/build/widgets/oa-widget-item-info-card/styles.js +14 -0
- package/build/widgets/oa-widget-key-value/KeyValueWidget.js +46 -12
- package/build/widgets/oa-widget-key-value/styles.js +1 -1
- package/build/widgets/oa-widget-kpi/KPICardWidget.js +86 -0
- package/build/widgets/oa-widget-kpi/styles.js +12 -0
- package/build/widgets/oa-widget-map-base-location/AddressDetails.js +21 -7
- package/build/widgets/oa-widget-map-base-location/AddressForm.js +32 -5
- package/build/widgets/oa-widget-map-base-location/MapBaseLocation.js +9 -3
- package/build/widgets/oa-widget-map-base-location/MapComponent.js +17 -2
- package/build/widgets/oa-widget-membershipcard/MembershipCard.js +14 -3
- package/build/widgets/oa-widget-membershipcard/styles.js +1 -1
- package/build/widgets/oa-widget-notes/NotesWidget.js +32 -30
- package/build/widgets/oa-widget-notes/styles.js +4 -3
- package/build/widgets/oa-widget-profile-data/ProfileDataWidget.js +165 -0
- package/build/widgets/oa-widget-profile-data/styles.js +13 -0
- package/build/widgets/oa-widget-progressive-steps/ProgressiveStepsWidget.js +362 -0
- package/build/widgets/oa-widget-progressive-steps/styles.js +12 -0
- package/build/widgets/oa-widget-reimbursement-breakup/ReimbursementBreakupWidget.js +18 -9
- package/build/widgets/oa-widget-reimbursement-breakup/styles.js +1 -1
- package/build/widgets/oa-widget-reupload-drawer/ReUploadDrawer.js +164 -0
- package/build/widgets/oa-widget-select-list-item-modal/SelectListItemModal.js +91 -0
- package/build/widgets/oa-widget-sidebar/SidebarWidget.js +175 -0
- package/build/widgets/oa-widget-sidebar/components/Header.js +33 -0
- package/build/widgets/oa-widget-sidebar/styles.js +13 -0
- package/build/widgets/oa-widget-spare-part/SparePartsWidget.js +63 -35
- package/build/widgets/oa-widget-track-shipment-list/fn.js +16 -4
- package/build/widgets/oa-widget-user-management/UserManagementWidget.js +407 -0
- package/build/widgets/oa-widget-user-management/styles.js +15 -0
- package/package.json +4 -2
- package/build/components/oa-component-textarea/TextArea.js +0 -74
package/build/components/oa-component-table-with-search-and-filter/TableWithSearchAndFilter.js
ADDED
|
@@ -0,0 +1,515 @@
|
|
|
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
|
+
const [appliedFilters, setAppliedFilters] = (0, _react.useState)({});
|
|
120
|
+
|
|
121
|
+
// Search handlers
|
|
122
|
+
const handleSearchChange = e => {
|
|
123
|
+
const {
|
|
124
|
+
value
|
|
125
|
+
} = e.target;
|
|
126
|
+
setSearchValue(value);
|
|
127
|
+
if (onSearch) {
|
|
128
|
+
onSearch(value);
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
const handleSearchPressEnter = () => {
|
|
132
|
+
if (onSearch) {
|
|
133
|
+
onSearch(searchValue);
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
// Filter handlers
|
|
138
|
+
const handleOpenFilterDrawer = () => {
|
|
139
|
+
// Sync filterValues with appliedFilters when opening drawer
|
|
140
|
+
setFilterValues(appliedFilters);
|
|
141
|
+
setIsFilterDrawerVisible(true);
|
|
142
|
+
};
|
|
143
|
+
const handleCloseFilterDrawer = () => {
|
|
144
|
+
// Revert filterValues to appliedFilters when closing without applying
|
|
145
|
+
setFilterValues(appliedFilters);
|
|
146
|
+
setIsFilterDrawerVisible(false);
|
|
147
|
+
};
|
|
148
|
+
const handleFilterChange = function handleFilterChange(key, value) {
|
|
149
|
+
let action = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'change';
|
|
150
|
+
// Normalize empty values: convert empty string to null for consistency
|
|
151
|
+
const normalizedValue = value === '' ? null : value;
|
|
152
|
+
const updatedFilters = _objectSpread(_objectSpread({}, filterValues), {}, {
|
|
153
|
+
[key]: normalizedValue
|
|
154
|
+
});
|
|
155
|
+
setFilterValues(updatedFilters);
|
|
156
|
+
|
|
157
|
+
// Call onChange callback if provided for real-time filter changes
|
|
158
|
+
if (onFilterChange) {
|
|
159
|
+
onFilterChange(key, normalizedValue, updatedFilters, action);
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
const handleApplyFilters = () => {
|
|
163
|
+
setIsFilterDrawerVisible(false);
|
|
164
|
+
// Save applied filters
|
|
165
|
+
setAppliedFilters(filterValues);
|
|
166
|
+
if (onFiltersApply) {
|
|
167
|
+
onFiltersApply(filterValues);
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
const handleClearFilters = () => {
|
|
171
|
+
setFilterValues({});
|
|
172
|
+
setAppliedFilters({});
|
|
173
|
+
if (onFiltersClear) {
|
|
174
|
+
onFiltersClear();
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
|
|
178
|
+
// Memoized required keys calculation for better performance
|
|
179
|
+
const requiredKeys = (0, _react.useMemo)(() => {
|
|
180
|
+
const keys = [];
|
|
181
|
+
filterConfig.forEach(filter => {
|
|
182
|
+
const {
|
|
183
|
+
type,
|
|
184
|
+
key,
|
|
185
|
+
required,
|
|
186
|
+
fields = []
|
|
187
|
+
} = filter;
|
|
188
|
+
if (required) {
|
|
189
|
+
if (type === 'dateRange' || type === 'group') {
|
|
190
|
+
fields.forEach(field => {
|
|
191
|
+
keys.push(field.key);
|
|
192
|
+
});
|
|
193
|
+
} else {
|
|
194
|
+
keys.push(key);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
return keys;
|
|
199
|
+
}, [filterConfig]);
|
|
200
|
+
|
|
201
|
+
// Create a stable string representation of filterValues for required keys
|
|
202
|
+
// This ensures reliable dependency tracking in production builds
|
|
203
|
+
const requiredFieldsSignature = (0, _react.useMemo)(() => requiredKeys.map(key => {
|
|
204
|
+
const value = filterValues[key];
|
|
205
|
+
// Create a stable string representation that changes when value changes
|
|
206
|
+
if (value === undefined || value === null) return "".concat(key, ":null");
|
|
207
|
+
if (value instanceof Date) return "".concat(key, ":").concat(value.getTime());
|
|
208
|
+
return "".concat(key, ":").concat(JSON.stringify(value));
|
|
209
|
+
}).join('|'), [requiredKeys, filterValues]);
|
|
210
|
+
|
|
211
|
+
// Memoized check if all required fields are filled
|
|
212
|
+
const areAllRequiredFieldsFilled = (0, _react.useMemo)(() => {
|
|
213
|
+
// If no required fields, button should be enabled
|
|
214
|
+
if (requiredKeys.length === 0) {
|
|
215
|
+
return true;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// Check each required field has a valid value
|
|
219
|
+
return requiredKeys.every(requiredKey => {
|
|
220
|
+
const value = filterValues[requiredKey];
|
|
221
|
+
|
|
222
|
+
// Check if value exists and is not empty/null/undefined
|
|
223
|
+
// Also handle edge cases: empty arrays, empty objects, etc.
|
|
224
|
+
if (value === undefined || value === null || value === '') {
|
|
225
|
+
return false;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
// Handle arrays
|
|
229
|
+
if (Array.isArray(value)) {
|
|
230
|
+
return value.length > 0;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// Handle objects (but allow Date objects and other valid objects)
|
|
234
|
+
if (typeof value === 'object' && !(value instanceof Date)) {
|
|
235
|
+
return Object.keys(value).length > 0;
|
|
236
|
+
}
|
|
237
|
+
return true;
|
|
238
|
+
});
|
|
239
|
+
}, [requiredKeys, requiredFieldsSignature, filterValues]);
|
|
240
|
+
|
|
241
|
+
// Helper function to check if a value is non-empty
|
|
242
|
+
const isValueNonEmpty = value => {
|
|
243
|
+
if (value === undefined || value === null || value === '') {
|
|
244
|
+
return false;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
// Handle arrays
|
|
248
|
+
if (Array.isArray(value)) {
|
|
249
|
+
return value.length > 0;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
// Handle objects (but allow Date objects and other valid objects)
|
|
253
|
+
if (typeof value === 'object' && !(value instanceof Date)) {
|
|
254
|
+
return Object.keys(value).length > 0;
|
|
255
|
+
}
|
|
256
|
+
return true;
|
|
257
|
+
};
|
|
258
|
+
|
|
259
|
+
// Helper function to check if filters are applied
|
|
260
|
+
const hasAppliedFilters = (0, _react.useMemo)(() => {
|
|
261
|
+
// Check if filters were actually applied (Apply Filter button was clicked)
|
|
262
|
+
const appliedFilterKeys = Object.keys(appliedFilters);
|
|
263
|
+
if (appliedFilterKeys.length === 0) {
|
|
264
|
+
return false;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
// Check if any applied filter has a non-empty value
|
|
268
|
+
return appliedFilterKeys.some(key => isValueNonEmpty(appliedFilters[key]));
|
|
269
|
+
}, [appliedFilters]);
|
|
270
|
+
|
|
271
|
+
// Helper function to determine notFoundContent message
|
|
272
|
+
const getNotFoundContent = (isApiCallInProgress, query) => {
|
|
273
|
+
if (!isApiCallInProgress && (query === null || query === void 0 ? void 0 : query.length) < 3) {
|
|
274
|
+
return 'Start Typing atleast 3 characters';
|
|
275
|
+
}
|
|
276
|
+
if (isApiCallInProgress && (query === null || query === void 0 ? void 0 : query.length) > 0) {
|
|
277
|
+
return 'Loading...';
|
|
278
|
+
}
|
|
279
|
+
return 'No data found';
|
|
280
|
+
};
|
|
281
|
+
|
|
282
|
+
// Helper function to render CustomSelect (DRY principle)
|
|
283
|
+
const renderSelect = (fieldKey, fieldConfig) => {
|
|
284
|
+
const {
|
|
285
|
+
placeholder,
|
|
286
|
+
options = [],
|
|
287
|
+
loading = false,
|
|
288
|
+
isApiCallInProgress = false,
|
|
289
|
+
searchValue: query = '',
|
|
290
|
+
showSearch: fieldShowSearch = false,
|
|
291
|
+
filterOption,
|
|
292
|
+
disabled = false
|
|
293
|
+
} = fieldConfig;
|
|
294
|
+
const fieldValue = filterValues[fieldKey];
|
|
295
|
+
const isLoading = filtersLoading || loading || isApiCallInProgress;
|
|
296
|
+
const notFoundContent = getNotFoundContent(isApiCallInProgress, query);
|
|
297
|
+
return /*#__PURE__*/_react.default.createElement(_CustomSelect.default, {
|
|
298
|
+
placeholder: placeholder || 'Select an option',
|
|
299
|
+
value: fieldValue || undefined,
|
|
300
|
+
options: options,
|
|
301
|
+
onSelectionChange: val => {
|
|
302
|
+
// Normalize: null/undefined means clear action
|
|
303
|
+
const action = val === null || val === undefined ? 'clear' : 'select';
|
|
304
|
+
handleFilterChange(fieldKey, val, action);
|
|
305
|
+
},
|
|
306
|
+
onSearch: searchText => {
|
|
307
|
+
// For search, pass the search text as-is (don't normalize to null)
|
|
308
|
+
handleFilterChange(fieldKey, searchText || null, 'search');
|
|
309
|
+
},
|
|
310
|
+
onChange: val => {
|
|
311
|
+
// Catch clear from Ant Design's onChange (passes through {...props})
|
|
312
|
+
if (val === undefined || val === null) {
|
|
313
|
+
handleFilterChange(fieldKey, null, 'clear');
|
|
314
|
+
}
|
|
315
|
+
},
|
|
316
|
+
allowClear: true,
|
|
317
|
+
loading: isLoading,
|
|
318
|
+
showSearch: fieldShowSearch,
|
|
319
|
+
filterOption: filterOption,
|
|
320
|
+
disabled: disabled,
|
|
321
|
+
notFoundContent: notFoundContent
|
|
322
|
+
});
|
|
323
|
+
};
|
|
324
|
+
|
|
325
|
+
// Helper function to render CustomDatePicker (DRY principle)
|
|
326
|
+
const renderDatePicker = (fieldKey, fieldConfig) => {
|
|
327
|
+
const {
|
|
328
|
+
placeholder
|
|
329
|
+
} = fieldConfig;
|
|
330
|
+
const fieldValue = filterValues[fieldKey];
|
|
331
|
+
return /*#__PURE__*/_react.default.createElement(_CustomDatePicker.default, {
|
|
332
|
+
placeholder: placeholder || 'Select date',
|
|
333
|
+
value: fieldValue,
|
|
334
|
+
containerSize: "small",
|
|
335
|
+
onChange: date => handleFilterChange(fieldKey, date, 'change')
|
|
336
|
+
});
|
|
337
|
+
};
|
|
338
|
+
|
|
339
|
+
// Helper function to render CustomRadio.Group (DRY principle)
|
|
340
|
+
const renderRadioGroup = (fieldKey, fieldConfig) => {
|
|
341
|
+
const {
|
|
342
|
+
options = []
|
|
343
|
+
} = fieldConfig;
|
|
344
|
+
const fieldValue = filterValues[fieldKey];
|
|
345
|
+
return /*#__PURE__*/_react.default.createElement(_CustomRadio.default.Group, {
|
|
346
|
+
value: fieldValue,
|
|
347
|
+
onChange: e => handleFilterChange(fieldKey, e.target.value, 'change')
|
|
348
|
+
}, options.map(option => /*#__PURE__*/_react.default.createElement(_CustomRadio.default, {
|
|
349
|
+
key: option.value,
|
|
350
|
+
value: option.value,
|
|
351
|
+
label: option.label
|
|
352
|
+
})));
|
|
353
|
+
};
|
|
354
|
+
|
|
355
|
+
// Render filter input based on type
|
|
356
|
+
const renderFilterInput = filter => {
|
|
357
|
+
const {
|
|
358
|
+
type,
|
|
359
|
+
key,
|
|
360
|
+
fields = []
|
|
361
|
+
} = filter;
|
|
362
|
+
switch (type) {
|
|
363
|
+
case 'radio':
|
|
364
|
+
return renderRadioGroup(key, filter);
|
|
365
|
+
case 'select':
|
|
366
|
+
return /*#__PURE__*/_react.default.createElement(_styles.FilterSubField, null, renderSelect(key, filter));
|
|
367
|
+
case 'date':
|
|
368
|
+
return /*#__PURE__*/_react.default.createElement(_styles.FilterSubField, null, renderDatePicker(key, filter));
|
|
369
|
+
case 'dateRange':
|
|
370
|
+
return /*#__PURE__*/_react.default.createElement(_styles.DateRangeContainer, null, fields.map(field => /*#__PURE__*/_react.default.createElement(_styles.FilterSubField, {
|
|
371
|
+
key: field.key
|
|
372
|
+
}, /*#__PURE__*/_react.default.createElement(_styles.FilterSubLabel, null, field.label), renderDatePicker(field.key, field))));
|
|
373
|
+
case 'group':
|
|
374
|
+
return /*#__PURE__*/_react.default.createElement(_styles.FilterGroup, null, fields.map(field => /*#__PURE__*/_react.default.createElement(_styles.FilterSubField, {
|
|
375
|
+
key: field.key
|
|
376
|
+
}, /*#__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))));
|
|
377
|
+
default:
|
|
378
|
+
return null;
|
|
379
|
+
}
|
|
380
|
+
};
|
|
381
|
+
const displayData = dataSource;
|
|
382
|
+
const totalRecords = total !== null && total !== void 0 ? total : displayData.length;
|
|
383
|
+
|
|
384
|
+
// Button configuration for filter drawer footer
|
|
385
|
+
const filterDrawerButtonConfig = [{
|
|
386
|
+
callback: handleClearFilters,
|
|
387
|
+
label: 'Clear All',
|
|
388
|
+
type: 'secondary'
|
|
389
|
+
}, {
|
|
390
|
+
callback: handleApplyFilters,
|
|
391
|
+
label: 'Apply Filter',
|
|
392
|
+
type: 'primary',
|
|
393
|
+
disabled: !areAllRequiredFieldsFilled
|
|
394
|
+
}];
|
|
395
|
+
return /*#__PURE__*/_react.default.createElement(_styles.TableWithSearchAndFilterContainer, {
|
|
396
|
+
className: className
|
|
397
|
+
}, (showSearch || showFilters) && /*#__PURE__*/_react.default.createElement(_styles.Toolbar, null, showSearch && /*#__PURE__*/_react.default.createElement(_CustomInput.default, {
|
|
398
|
+
prefix: /*#__PURE__*/_react.default.createElement(_MaterialIcon.default, {
|
|
399
|
+
icon: _Search.default,
|
|
400
|
+
size: 20,
|
|
401
|
+
style: {
|
|
402
|
+
color: '#8c8c8c'
|
|
403
|
+
}
|
|
404
|
+
}),
|
|
405
|
+
placeholder: searchPlaceholder,
|
|
406
|
+
value: searchValue,
|
|
407
|
+
onChange: handleSearchChange,
|
|
408
|
+
onPressEnter: handleSearchPressEnter,
|
|
409
|
+
allowClear: true,
|
|
410
|
+
style: {
|
|
411
|
+
width: SEARCH_INPUT_WIDTH,
|
|
412
|
+
flexShrink: 0
|
|
413
|
+
}
|
|
414
|
+
}), showFilters && /*#__PURE__*/_react.default.createElement(_styles.FilterButtonWrapper, null, /*#__PURE__*/_react.default.createElement(_CustomButton.default, {
|
|
415
|
+
label: filterButtonLabel,
|
|
416
|
+
onClick: handleOpenFilterDrawer,
|
|
417
|
+
type: "secondary",
|
|
418
|
+
size: "medium",
|
|
419
|
+
iconConfig: {
|
|
420
|
+
icon: /*#__PURE__*/_react.default.createElement(_MaterialIcon.default, {
|
|
421
|
+
icon: _FilterList.default
|
|
422
|
+
}),
|
|
423
|
+
position: 'left'
|
|
424
|
+
},
|
|
425
|
+
style: {
|
|
426
|
+
borderColor: '#1890ff',
|
|
427
|
+
color: '#1890ff'
|
|
428
|
+
}
|
|
429
|
+
}), hasAppliedFilters && /*#__PURE__*/_react.default.createElement(_styles.FilterIndicatorDot, null))), showFilters && /*#__PURE__*/_react.default.createElement(_CustomDrawer.default, {
|
|
430
|
+
title: filterDrawerTitle,
|
|
431
|
+
placement: "right",
|
|
432
|
+
isBaseDrawer: true,
|
|
433
|
+
onClose: handleCloseFilterDrawer,
|
|
434
|
+
open: isFilterDrawerVisible,
|
|
435
|
+
visible: isFilterDrawerVisible,
|
|
436
|
+
closable: false,
|
|
437
|
+
width: 400,
|
|
438
|
+
buttonConfig: filterDrawerButtonConfig
|
|
439
|
+
}, /*#__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, {
|
|
440
|
+
key: filter.key
|
|
441
|
+
}, /*#__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(_CustomTable.default, _extends({
|
|
442
|
+
rowKey: rowKey,
|
|
443
|
+
dataSource: displayData,
|
|
444
|
+
columns: columns,
|
|
445
|
+
pagination: false,
|
|
446
|
+
emptyText: emptyText
|
|
447
|
+
}, restTableProps)), showPagination && totalRecords > pageSize && /*#__PURE__*/_react.default.createElement(_styles.PaginationContainer, null, /*#__PURE__*/_react.default.createElement(_CustomPagination.default, {
|
|
448
|
+
current: current,
|
|
449
|
+
pageSize: pageSize,
|
|
450
|
+
total: totalRecords,
|
|
451
|
+
onChange: onPaginationChange,
|
|
452
|
+
onShowSizeChange: onShowSizeChange,
|
|
453
|
+
pageSizeOptions: pageSizeOptions,
|
|
454
|
+
showSizeChanger: true,
|
|
455
|
+
showTotal: true
|
|
456
|
+
})));
|
|
457
|
+
}
|
|
458
|
+
TableWithSearchAndFilter.propTypes = {
|
|
459
|
+
tableProps: _propTypes.default.shape({
|
|
460
|
+
dataSource: _propTypes.default.array,
|
|
461
|
+
columns: _propTypes.default.array.isRequired,
|
|
462
|
+
rowKey: _propTypes.default.string,
|
|
463
|
+
emptyText: _propTypes.default.string
|
|
464
|
+
}),
|
|
465
|
+
searchProps: _propTypes.default.shape({
|
|
466
|
+
show: _propTypes.default.bool,
|
|
467
|
+
placeholder: _propTypes.default.string,
|
|
468
|
+
onSearch: _propTypes.default.func
|
|
469
|
+
}),
|
|
470
|
+
filterProps: _propTypes.default.shape({
|
|
471
|
+
show: _propTypes.default.bool,
|
|
472
|
+
config: _propTypes.default.array,
|
|
473
|
+
onApply: _propTypes.default.func,
|
|
474
|
+
onClear: _propTypes.default.func,
|
|
475
|
+
onChange: _propTypes.default.func,
|
|
476
|
+
loading: _propTypes.default.bool,
|
|
477
|
+
buttonLabel: _propTypes.default.string,
|
|
478
|
+
drawerTitle: _propTypes.default.string
|
|
479
|
+
}),
|
|
480
|
+
paginationProps: _propTypes.default.shape({
|
|
481
|
+
show: _propTypes.default.bool,
|
|
482
|
+
current: _propTypes.default.number,
|
|
483
|
+
pageSize: _propTypes.default.number,
|
|
484
|
+
total: _propTypes.default.number,
|
|
485
|
+
pageSizeOptions: _propTypes.default.array,
|
|
486
|
+
onChange: _propTypes.default.func,
|
|
487
|
+
onShowSizeChange: _propTypes.default.func
|
|
488
|
+
}),
|
|
489
|
+
className: _propTypes.default.string
|
|
490
|
+
};
|
|
491
|
+
TableWithSearchAndFilter.defaultProps = {
|
|
492
|
+
tableProps: {
|
|
493
|
+
dataSource: [],
|
|
494
|
+
rowKey: 'id',
|
|
495
|
+
emptyText: 'No data found'
|
|
496
|
+
},
|
|
497
|
+
searchProps: {
|
|
498
|
+
show: true,
|
|
499
|
+
placeholder: 'Search...'
|
|
500
|
+
},
|
|
501
|
+
filterProps: {
|
|
502
|
+
show: true,
|
|
503
|
+
config: [],
|
|
504
|
+
buttonLabel: 'Filters',
|
|
505
|
+
drawerTitle: 'FILTERS'
|
|
506
|
+
},
|
|
507
|
+
paginationProps: {
|
|
508
|
+
show: true,
|
|
509
|
+
current: 1,
|
|
510
|
+
pageSize: 10,
|
|
511
|
+
pageSizeOptions: [10, 20, 50, 100]
|
|
512
|
+
},
|
|
513
|
+
className: ''
|
|
514
|
+
};
|
|
515
|
+
var _default = exports.default = TableWithSearchAndFilter;
|
|
@@ -0,0 +1,25 @@
|
|
|
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.FilterIndicatorDot = exports.FilterGroup = exports.FilterDrawerContent = exports.FilterDrawerBody = exports.FilterButtonWrapper = 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, _templateObject15;
|
|
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 button.secondary {\n border-color: #1890ff !important;\n color: #1890ff !important;\n }\n button.secondary:hover {\n border-color: #1890ff !important;\n color: #1890ff !important;\n }\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 FilterGroup = exports.FilterGroup = _styledComponents.default.div(_templateObject9 || (_templateObject9 = _taggedTemplateLiteral(["\n display: flex;\n flex-direction: column;\n gap: 16px;\n"])));
|
|
20
|
+
const FilterSubField = exports.FilterSubField = _styledComponents.default.div(_templateObject10 || (_templateObject10 = _taggedTemplateLiteral(["\n display: flex;\n flex-direction: column;\n gap: 8px;\n"])));
|
|
21
|
+
const FilterSubLabel = exports.FilterSubLabel = _styledComponents.default.label(_templateObject11 || (_templateObject11 = _taggedTemplateLiteral(["\n display: flex;\n align-items: center;\n font-weight: 400;\n font-size: 14px;\n color: var(--color-primary-content, #212121);\n"])));
|
|
22
|
+
const FilterSubLabelText = exports.FilterSubLabelText = _styledComponents.default.span(_templateObject12 || (_templateObject12 = _taggedTemplateLiteral(["\n color: var(--color-primary-content, #212121);\n"])));
|
|
23
|
+
const DateRangeContainer = exports.DateRangeContainer = _styledComponents.default.div(_templateObject13 || (_templateObject13 = _taggedTemplateLiteral(["\n display: flex;\n flex-direction: column;\n gap: 16px;\n"])));
|
|
24
|
+
const FilterButtonWrapper = exports.FilterButtonWrapper = _styledComponents.default.div(_templateObject14 || (_templateObject14 = _taggedTemplateLiteral(["\n position: relative;\n"])));
|
|
25
|
+
const FilterIndicatorDot = exports.FilterIndicatorDot = _styledComponents.default.span(_templateObject15 || (_templateObject15 = _taggedTemplateLiteral(["\n width: 12px;\n height: 12px;\n background: #de350b;\n position: absolute;\n top: -4px;\n right: -4px;\n border-radius: 50%;\n z-index: 1;\n"])));
|
|
@@ -10,9 +10,12 @@ var _react = _interopRequireDefault(require("react"));
|
|
|
10
10
|
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
11
11
|
var _antd = require("antd");
|
|
12
12
|
var _utils = require("../../utils");
|
|
13
|
+
var _CustomToggle = _interopRequireDefault(require("../oa-component-toggle/CustomToggle"));
|
|
14
|
+
var _Typography = _interopRequireDefault(require("../oa-component-typography/Typography"));
|
|
13
15
|
var _styles = require("./styles");
|
|
14
|
-
const _excluded = ["data", "data-test", "defaultActiveKey", "disabled", "style", "tabPosition", "type"],
|
|
16
|
+
const _excluded = ["data", "data-test", "defaultActiveKey", "disabled", "extraAction", "style", "tabPosition", "type"],
|
|
15
17
|
_excluded2 = ["body", "disabled", "key", "label"];
|
|
18
|
+
/* eslint-disable */
|
|
16
19
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
17
20
|
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); }
|
|
18
21
|
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; }
|
|
@@ -29,6 +32,10 @@ function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) r
|
|
|
29
32
|
* @param {string} [data-test] - A string to be used as data-test attribute.
|
|
30
33
|
* @param {string} defaultActiveKey - Key of the initially active tab.
|
|
31
34
|
* @param {boolean} disabled - Whether the tabs are disabled.
|
|
35
|
+
* @param {Object} extraAction - Configuration for extra action on the right side of tabs.
|
|
36
|
+
* @param {string} extraAction.type - Type of extra action ('switch').
|
|
37
|
+
* @param {boolean} extraAction.visible - Whether to show the extra action (default: true).
|
|
38
|
+
* @param {Object} extraAction.props - Props to pass to the extra action component.
|
|
32
39
|
* @param {Object} style - An object containing CSS styles for the component.
|
|
33
40
|
* @param {'top'|'right'|'bottom'|'left'} tabPosition - Position of the tab headers.
|
|
34
41
|
* @param {'line'|'card'} type - Type of the tabs.
|
|
@@ -41,12 +48,13 @@ function CustomTabs(_ref) {
|
|
|
41
48
|
'data-test': dataTest,
|
|
42
49
|
defaultActiveKey,
|
|
43
50
|
disabled,
|
|
51
|
+
extraAction,
|
|
44
52
|
style,
|
|
45
53
|
tabPosition,
|
|
46
54
|
type
|
|
47
55
|
} = _ref,
|
|
48
56
|
antDesignProps = _objectWithoutProperties(_ref, _excluded);
|
|
49
|
-
const items = data.tabs.map(_ref2 => {
|
|
57
|
+
const items = data.tabs && data.tabs.map(_ref2 => {
|
|
50
58
|
let {
|
|
51
59
|
body,
|
|
52
60
|
disabled: isTabDisabed,
|
|
@@ -63,13 +71,42 @@ function CustomTabs(_ref) {
|
|
|
63
71
|
}, label) : label
|
|
64
72
|
}, otherProps);
|
|
65
73
|
});
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Renders the extra action component based on the type.
|
|
77
|
+
* @returns {React.ReactNode} The rendered extra action component or null.
|
|
78
|
+
*/
|
|
79
|
+
const renderExtraAction = () => {
|
|
80
|
+
if (!extraAction || !extraAction.type) {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Check if extraAction is visible (defaults to true if not specified)
|
|
85
|
+
if (extraAction.visible === false) {
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
switch (extraAction.type) {
|
|
89
|
+
case 'switch':
|
|
90
|
+
return /*#__PURE__*/_react.default.createElement(_styles.ExtraActionWrapper, null, extraAction.label && /*#__PURE__*/_react.default.createElement(_Typography.default, {
|
|
91
|
+
color: extraAction.labelColor || 'secondary-content',
|
|
92
|
+
typography: extraAction.labelTypography || 'type-b2-400'
|
|
93
|
+
}, extraAction.label), /*#__PURE__*/_react.default.createElement(_CustomToggle.default, _extends({
|
|
94
|
+
"data-test": dataTest ? "".concat(dataTest, "--extra-action-switch") : undefined,
|
|
95
|
+
size: extraAction.size || 'small'
|
|
96
|
+
}, extraAction.props)));
|
|
97
|
+
default:
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
const tabBarExtraContent = renderExtraAction();
|
|
66
102
|
return /*#__PURE__*/_react.default.createElement(_styles.StyledTabs, null, /*#__PURE__*/_react.default.createElement(_antd.Tabs, _extends({
|
|
67
103
|
defaultActiveKey: defaultActiveKey,
|
|
68
|
-
disabled:
|
|
104
|
+
disabled: disabled,
|
|
69
105
|
items: items,
|
|
70
106
|
style: _objectSpread({}, style),
|
|
71
107
|
tabPosition: tabPosition,
|
|
72
|
-
type: type
|
|
108
|
+
type: type,
|
|
109
|
+
tabBarExtraContent: tabBarExtraContent
|
|
73
110
|
}, antDesignProps)));
|
|
74
111
|
}
|
|
75
112
|
CustomTabs.propTypes = {
|
|
@@ -84,6 +121,15 @@ CustomTabs.propTypes = {
|
|
|
84
121
|
'data-test': _propTypes.default.string,
|
|
85
122
|
defaultActiveKey: _propTypes.default.string,
|
|
86
123
|
disabled: _propTypes.default.bool,
|
|
124
|
+
extraAction: _propTypes.default.shape({
|
|
125
|
+
type: _propTypes.default.oneOf(['switch']).isRequired,
|
|
126
|
+
visible: _propTypes.default.bool,
|
|
127
|
+
label: _propTypes.default.string,
|
|
128
|
+
labelColor: _propTypes.default.string,
|
|
129
|
+
labelTypography: _propTypes.default.string,
|
|
130
|
+
size: _propTypes.default.oneOf(['large', 'small']),
|
|
131
|
+
props: _propTypes.default.objectOf(_propTypes.default.any)
|
|
132
|
+
}),
|
|
87
133
|
tabPosition: _propTypes.default.oneOf(['top', 'right', 'bottom', 'left']),
|
|
88
134
|
type: _propTypes.default.oneOf(['line', 'card'
|
|
89
135
|
// 'editable-card',
|
|
@@ -97,6 +143,7 @@ CustomTabs.defaultProps = {
|
|
|
97
143
|
tabPosition: 'top',
|
|
98
144
|
type: 'line',
|
|
99
145
|
disabled: false,
|
|
146
|
+
extraAction: null,
|
|
100
147
|
style: {}
|
|
101
148
|
};
|
|
102
149
|
var _default = exports.default = CustomTabs;
|
|
@@ -3,11 +3,12 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.default = exports.StyledTabs = void 0;
|
|
6
|
+
exports.default = exports.StyledTabs = exports.ExtraActionWrapper = void 0;
|
|
7
7
|
var _antd = require("antd");
|
|
8
8
|
var _styledComponents = _interopRequireDefault(require("styled-components"));
|
|
9
|
-
var _templateObject;
|
|
9
|
+
var _templateObject, _templateObject2;
|
|
10
10
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
11
11
|
function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
|
|
12
12
|
var _default = exports.default = {};
|
|
13
|
-
const StyledTabs = exports.StyledTabs = _styledComponents.default.div(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n.ant-tabs .ant-tabs-tab{\n color: var(--color-secondary-content);\n padding: 12px;\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n }\n .ant-tabs-tab-disabled{\n color: var(--color-disabled-button) !important;\n }\n s.ant-tabs-tab-disabled:hover {\n color: var(--color-disabled-button) !important;\n}\n .ant-tabs .ant-tabs-tab+.ant-tabs-tab{\n margin: 0;\n }\n .ant-tabs-top >.ant-tabs-nav::before{\n border-bottom: 1px solid var(--color-divider)\n }\n .ant-tabs .ant-tabs-tab.ant-tabs-tab-active .ant-tabs-tab-btn {\n color: var(--color-primary);\n font-size: 14px;\n font-weight: 500;\n line-height: 20px; \n }\n .ant-tabs .ant-tabs-tab:hover{\n color: var(--color-primary-hover);\n }\n .ant-tabs .ant-tabs-ink-bar{\n background: var(--color-primary);\n }\n"])));
|
|
13
|
+
const StyledTabs = exports.StyledTabs = _styledComponents.default.div(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n.ant-tabs .ant-tabs-tab{\n color: var(--color-secondary-content);\n padding: 12px;\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n }\n .ant-tabs-tab-disabled{\n color: var(--color-disabled-button) !important;\n }\n s.ant-tabs-tab-disabled:hover {\n color: var(--color-disabled-button) !important;\n}\n .ant-tabs .ant-tabs-tab+.ant-tabs-tab{\n margin: 0;\n }\n .ant-tabs-top >.ant-tabs-nav::before{\n border-bottom: 1px solid var(--color-divider)\n }\n .ant-tabs .ant-tabs-tab.ant-tabs-tab-active .ant-tabs-tab-btn {\n color: var(--color-primary);\n font-size: 14px;\n font-weight: 500;\n line-height: 20px; \n }\n .ant-tabs .ant-tabs-tab:hover{\n color: var(--color-primary-hover);\n }\n .ant-tabs .ant-tabs-ink-bar{\n background: var(--color-primary);\n }\n"])));
|
|
14
|
+
const ExtraActionWrapper = exports.ExtraActionWrapper = _styledComponents.default.div(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n display: flex;\n align-items: center;\n gap: 12px;\n"])));
|