@react-pakistan/util-functions 1.25.36 → 1.25.38

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.
@@ -5,7 +5,15 @@
5
5
  * Generates tables, forms, drawers, and other common UI patterns.
6
6
  */
7
7
  import React, { FC } from 'react';
8
- import { COMPONENT_TYPE, HeaderAction, TableColumn } from '@appcorp/shadcn/components/enhanced-table';
8
+ type COMPONENT_TYPE = string;
9
+ interface HeaderAction {
10
+ [key: string]: any;
11
+ }
12
+ interface TableColumn {
13
+ label: string;
14
+ width?: string | number;
15
+ [key: string]: any;
16
+ }
9
17
  export declare const DRAWER_TYPES: {
10
18
  FORM_DRAWER: string;
11
19
  FILTER_DRAWER: string;
@@ -42,14 +42,38 @@ var __importStar = (this && this.__importStar) || (function () {
42
42
  Object.defineProperty(exports, "__esModule", { value: true });
43
43
  exports.createGenericModulePage = exports.GenericDrawer = exports.GenericTable = exports.DRAWER_TYPES = void 0;
44
44
  var react_1 = __importStar(require("react"));
45
- var next_intl_1 = require("next-intl");
46
45
  var general_1 = require("../general");
47
46
  var use_rtl_1 = require("../hooks/use-rtl");
48
- var enhanced_table_1 = require("@appcorp/shadcn/components/enhanced-table");
49
- var sonner_1 = require("@appcorp/shadcn/components/ui/sonner");
50
- var drawer_generic_1 = require("@appcorp/shadcn/components/drawer-generic");
51
- var enhanced_drawer_header_1 = require("@appcorp/shadcn/components/enhanced-drawer-header");
52
- var enhanced_drawer_footer_1 = require("@appcorp/shadcn/components/enhanced-drawer-footer");
47
+ // Local constants to avoid static imports from @appcorp/shadcn
48
+ var DRAWER_FOOTER_COMPONENT_TYPE = {
49
+ FORM_DRAWER: 'FORM_DRAWER',
50
+ VIEW_DRAWER: 'VIEW_DRAWER',
51
+ FILTER_DRAWER: 'FILTER_DRAWER',
52
+ MORE_ACTIONS_DRAWER: 'MORE_ACTIONS_DRAWER',
53
+ };
54
+ // Helper to either lazy-load a component/value or require it synchronously in tests
55
+ var isTestEnv = typeof process !== 'undefined' && !!process.env.JEST_WORKER_ID;
56
+ var lazyOrSync = function (path, name, isComponent) {
57
+ if (isComponent === void 0) { isComponent = true; }
58
+ if (isTestEnv) {
59
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
60
+ var mod = require(path);
61
+ return mod[name];
62
+ }
63
+ if (isComponent) {
64
+ return react_1.default.lazy(function () {
65
+ return Promise.resolve("".concat(/* @vite-ignore */ path)).then(function (s) { return __importStar(require(s)); }).then(function (m) { return ({ default: m[name] }); });
66
+ });
67
+ }
68
+ // For non-components (constants, enums), lazy-load the module and return the value
69
+ return Promise.resolve("".concat(/* @vite-ignore */ path)).then(function (s) { return __importStar(require(s)); }).then(function (m) { return m[name]; });
70
+ };
71
+ // Lazy-load components
72
+ var EnhancedTable = lazyOrSync('@appcorp/shadcn/components/enhanced-table', 'EnhancedTable');
73
+ var Toaster = lazyOrSync('@appcorp/shadcn/components/ui/sonner', 'Toaster');
74
+ var DrawerGeneric = lazyOrSync('@appcorp/shadcn/components/drawer-generic', 'DrawerGeneric');
75
+ var EnhancedDrawerHeader = lazyOrSync('@appcorp/shadcn/components/enhanced-drawer-header', 'EnhancedDrawerHeader');
76
+ var EnhancedDrawerFooter = lazyOrSync('@appcorp/shadcn/components/enhanced-drawer-footer', 'EnhancedDrawerFooter');
53
77
  // ============================================================================
54
78
  // CONSTANTS
55
79
  // ============================================================================
@@ -61,7 +85,18 @@ exports.DRAWER_TYPES = {
61
85
  };
62
86
  var GenericTable = function (_a) {
63
87
  var config = _a.config, context = _a.context, tableBodyCols = _a.tableBodyCols, headerActions = _a.headerActions, rowActions = _a.rowActions;
64
- var t = (0, next_intl_1.useTranslations)(config.moduleName);
88
+ // get a useTranslations hook if available, otherwise a fallback translator
89
+ var maybeUseTranslations = (function () {
90
+ try {
91
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
92
+ var useTranslations = require('next-intl').useTranslations;
93
+ return useTranslations;
94
+ }
95
+ catch (_a) {
96
+ return function (_ns) { return function (key) { return key; }; };
97
+ }
98
+ })();
99
+ var t = maybeUseTranslations(config.moduleName);
65
100
  var isRTL = (0, use_rtl_1.useRTL)();
66
101
  var tableHeadItems = (0, react_1.useMemo)(function () {
67
102
  return config.tableColumns.map(function (col) { return ({
@@ -73,15 +108,26 @@ var GenericTable = function (_a) {
73
108
  // Build header actions from context or props
74
109
  var allHeaderActions = (0, react_1.useMemo)(function () { return headerActions || context.headerActions || []; }, [headerActions, context.headerActions]);
75
110
  return (react_1.default.createElement("div", { className: "space-y-4 ".concat(isRTL ? 'rtl' : 'ltr'), dir: isRTL ? 'rtl' : 'ltr' },
76
- react_1.default.createElement(enhanced_table_1.EnhancedTable, { currentPage: Number(context.state.currentPage), handleNextOnClick: context.handlePageChange, handleOnSelect: context.handlePageLimitChange, handlePreviousOnClick: function () {
77
- return context.handlePageChange(context.state.currentPage - 1);
78
- }, handleSearchInput: context.handleSearch, headerActions: allHeaderActions, isNextDisabled: (0, general_1.isNextButtonDisabled)(context.state.currentPage, totalPages), isPreviousDisabled: (0, general_1.isPreviousButtonDisabled)(context.state.currentPage), listOptions: (0, general_1.getAvailablePageLimits)(context.state.count), loading: context.listLoading, nodeSelectKey: "pageLimit", pageLimit: context.state.pageLimit, rowActions: rowActions || context.rowActions || [], searchDisabled: false, searchEnabled: true, searchId: "".concat(config.moduleName.toLowerCase(), "-search"), searchPlaceholder: t(config.searchPlaceholder), searchValue: context.state.searchQuery, tableBodyCols: tableBodyCols, tableBodyRows: context.state.items, tableDescription: t(config.tableDescription), tableHeadItems: tableHeadItems, tableHeading: t(config.tableTitle), totalPages: Number(totalPages) })));
111
+ react_1.default.createElement(react_1.default.Suspense, { fallback: null },
112
+ react_1.default.createElement(EnhancedTable, { currentPage: Number(context.state.currentPage), handleNextOnClick: context.handlePageChange, handleOnSelect: context.handlePageLimitChange, handlePreviousOnClick: function () {
113
+ return context.handlePageChange(context.state.currentPage - 1);
114
+ }, handleSearchInput: context.handleSearch, headerActions: allHeaderActions, isNextDisabled: (0, general_1.isNextButtonDisabled)(context.state.currentPage, totalPages), isPreviousDisabled: (0, general_1.isPreviousButtonDisabled)(context.state.currentPage), listOptions: (0, general_1.getAvailablePageLimits)(context.state.count), loading: context.listLoading, nodeSelectKey: "pageLimit", pageLimit: context.state.pageLimit, rowActions: rowActions || context.rowActions || [], searchDisabled: false, searchEnabled: true, searchId: "".concat(config.moduleName.toLowerCase(), "-search"), searchPlaceholder: t(config.searchPlaceholder), searchValue: context.state.searchQuery, tableBodyCols: tableBodyCols, tableBodyRows: context.state.items, tableDescription: t(config.tableDescription), tableHeadItems: tableHeadItems, tableHeading: t(config.tableTitle), totalPages: Number(totalPages) }))));
79
115
  };
80
116
  exports.GenericTable = GenericTable;
81
117
  var GenericDrawer = function (_a) {
82
118
  var _b, _c, _d, _e, _f, _g;
83
119
  var config = _a.config, context = _a.context, formContent = _a.formContent, viewContent = _a.viewContent, filterContent = _a.filterContent, moreActionsContent = _a.moreActionsContent;
84
- var t = (0, next_intl_1.useTranslations)(config.moduleName);
120
+ var maybeUseTranslations = (function () {
121
+ try {
122
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
123
+ var useTranslations = require('next-intl').useTranslations;
124
+ return useTranslations;
125
+ }
126
+ catch (_a) {
127
+ return function (_ns) { return function (key) { return key; }; };
128
+ }
129
+ })();
130
+ var t = maybeUseTranslations(config.moduleName);
85
131
  var isRTL = (0, use_rtl_1.useRTL)();
86
132
  var closeDrawer = context.closeDrawer || context.handleCloseDrawer;
87
133
  var _h = context.state, disableSaveButton = _h.disableSaveButton, drawer = _h.drawer;
@@ -95,15 +141,16 @@ var GenericDrawer = function (_a) {
95
141
  ? t(config.drawerDescription)
96
142
  : '';
97
143
  var errors = (_b = context.state.errors) !== null && _b !== void 0 ? _b : {};
98
- var formHeader = isFormDrawer ? (react_1.default.createElement(enhanced_drawer_header_1.EnhancedDrawerHeader, { title: drawerTitle, description: drawerDescription })) : null;
99
- var viewHeader = isViewDrawer ? (react_1.default.createElement(enhanced_drawer_header_1.EnhancedDrawerHeader, { title: drawerTitle, description: drawerDescription })) : null;
100
- var filterHeader = isFilterDrawer ? (react_1.default.createElement(enhanced_drawer_header_1.EnhancedDrawerHeader, { title: drawerTitle, description: drawerDescription })) : null;
101
- var moreActionsHeader = isMoreActionsDrawer ? (react_1.default.createElement(enhanced_drawer_header_1.EnhancedDrawerHeader, { title: drawerTitle, description: drawerDescription })) : null;
102
- var formFooter = isFormDrawer ? (react_1.default.createElement(enhanced_drawer_footer_1.EnhancedDrawerFooter, { applyFilters: function () { }, clearFilters: function () { }, closeDrawer: closeDrawer, disableSaveButton: disableSaveButton, drawerType: enhanced_drawer_footer_1.DRAWER_FOOTER_COMPONENT_TYPE.FORM_DRAWER, errors: errors, handleSubmit: context.handleSubmit, updateLoading: (_c = context.updateLoading) !== null && _c !== void 0 ? _c : false })) : null;
103
- var viewFooter = isViewDrawer ? (react_1.default.createElement(enhanced_drawer_footer_1.EnhancedDrawerFooter, { applyFilters: function () { }, clearFilters: function () { }, closeDrawer: closeDrawer, disableSaveButton: false, drawerType: enhanced_drawer_footer_1.DRAWER_FOOTER_COMPONENT_TYPE.VIEW_DRAWER, errors: errors, handleSubmit: function () { }, updateLoading: false })) : null;
104
- var filterFooter = isFilterDrawer ? (react_1.default.createElement(enhanced_drawer_footer_1.EnhancedDrawerFooter, { applyFilters: (_d = context.applyFilters) !== null && _d !== void 0 ? _d : (function () { }), clearFilters: (_e = context.clearFilters) !== null && _e !== void 0 ? _e : (function () { }), closeDrawer: closeDrawer, disableSaveButton: false, drawerType: enhanced_drawer_footer_1.DRAWER_FOOTER_COMPONENT_TYPE.FILTER_DRAWER, errors: errors, handleSubmit: (_f = context.handleSubmit) !== null && _f !== void 0 ? _f : (function () { }), updateLoading: false })) : null;
105
- var moreActionsFooter = isMoreActionsDrawer ? (react_1.default.createElement(enhanced_drawer_footer_1.EnhancedDrawerFooter, { applyFilters: function () { }, clearFilters: function () { }, closeDrawer: closeDrawer, disableSaveButton: false, drawerType: enhanced_drawer_footer_1.DRAWER_FOOTER_COMPONENT_TYPE.MORE_ACTIONS_DRAWER, errors: errors, handleSubmit: function () { }, updateLoading: false })) : null;
106
- return (react_1.default.createElement(drawer_generic_1.DrawerGeneric, { direction: isRTL ? 'left' : 'right', filterDrawer: isFilterDrawer ? filterContent : null, filterDrawerFooter: filterFooter, filterDrawerHeader: filterHeader, formDrawer: isFormDrawer ? formContent : null, formDrawerFooter: formFooter, formDrawerHeader: formHeader, moreActionsDrawer: isMoreActionsDrawer ? moreActionsContent : null, moreActionsDrawerFooter: moreActionsFooter, moreActionsDrawerHeader: moreActionsHeader, onOpenChange: function (open) { return !open && closeDrawer(); }, open: isOpen, viewDrawer: isViewDrawer ? viewContent : null, viewDrawerFooter: viewFooter, viewDrawerHeader: viewHeader, width: (_g = config.size) !== null && _g !== void 0 ? _g : 'small' }));
144
+ var formHeader = isFormDrawer ? (react_1.default.createElement(EnhancedDrawerHeader, { title: drawerTitle, description: drawerDescription })) : null;
145
+ var viewHeader = isViewDrawer ? (react_1.default.createElement(EnhancedDrawerHeader, { title: drawerTitle, description: drawerDescription })) : null;
146
+ var filterHeader = isFilterDrawer ? (react_1.default.createElement(EnhancedDrawerHeader, { title: drawerTitle, description: drawerDescription })) : null;
147
+ var moreActionsHeader = isMoreActionsDrawer ? (react_1.default.createElement(EnhancedDrawerHeader, { title: drawerTitle, description: drawerDescription })) : null;
148
+ var formFooter = isFormDrawer ? (react_1.default.createElement(EnhancedDrawerFooter, { applyFilters: function () { }, clearFilters: function () { }, closeDrawer: closeDrawer, disableSaveButton: disableSaveButton, drawerType: DRAWER_FOOTER_COMPONENT_TYPE.FORM_DRAWER, errors: errors, handleSubmit: context.handleSubmit, updateLoading: (_c = context.updateLoading) !== null && _c !== void 0 ? _c : false })) : null;
149
+ var viewFooter = isViewDrawer ? (react_1.default.createElement(EnhancedDrawerFooter, { applyFilters: function () { }, clearFilters: function () { }, closeDrawer: closeDrawer, disableSaveButton: false, drawerType: DRAWER_FOOTER_COMPONENT_TYPE.VIEW_DRAWER, errors: errors, handleSubmit: function () { }, updateLoading: false })) : null;
150
+ var filterFooter = isFilterDrawer ? (react_1.default.createElement(EnhancedDrawerFooter, { applyFilters: (_d = context.applyFilters) !== null && _d !== void 0 ? _d : (function () { }), clearFilters: (_e = context.clearFilters) !== null && _e !== void 0 ? _e : (function () { }), closeDrawer: closeDrawer, disableSaveButton: false, drawerType: DRAWER_FOOTER_COMPONENT_TYPE.FILTER_DRAWER, errors: errors, handleSubmit: (_f = context.handleSubmit) !== null && _f !== void 0 ? _f : (function () { }), updateLoading: false })) : null;
151
+ var moreActionsFooter = isMoreActionsDrawer ? (react_1.default.createElement(EnhancedDrawerFooter, { applyFilters: function () { }, clearFilters: function () { }, closeDrawer: closeDrawer, disableSaveButton: false, drawerType: DRAWER_FOOTER_COMPONENT_TYPE.MORE_ACTIONS_DRAWER, errors: errors, handleSubmit: function () { }, updateLoading: false })) : null;
152
+ return (react_1.default.createElement(react_1.default.Suspense, { fallback: null },
153
+ react_1.default.createElement(DrawerGeneric, { direction: isRTL ? 'left' : 'right', filterDrawer: isFilterDrawer ? filterContent : null, filterDrawerFooter: filterFooter, filterDrawerHeader: filterHeader, formDrawer: isFormDrawer ? formContent : null, formDrawerFooter: formFooter, formDrawerHeader: formHeader, moreActionsDrawer: isMoreActionsDrawer ? moreActionsContent : null, moreActionsDrawerFooter: moreActionsFooter, moreActionsDrawerHeader: moreActionsHeader, onOpenChange: function (open) { return !open && closeDrawer(); }, open: isOpen, viewDrawer: isViewDrawer ? viewContent : null, viewDrawerFooter: viewFooter, viewDrawerHeader: viewHeader, width: (_g = config.size) !== null && _g !== void 0 ? _g : 'small' })));
107
154
  };
108
155
  exports.GenericDrawer = GenericDrawer;
109
156
  var createGenericModulePage = function (config) {
@@ -112,7 +159,8 @@ var createGenericModulePage = function (config) {
112
159
  return (react_1.default.createElement("div", { className: "space-y-6" },
113
160
  react_1.default.createElement(exports.GenericTable, { config: config, context: context, tableBodyCols: tableBodyCols, headerActions: headerActions, rowActions: rowActions, iconMap: iconMap }),
114
161
  react_1.default.createElement(exports.GenericDrawer, { config: config, context: context, formContent: config.formContent, viewContent: config.viewContent, filterContent: config.filterContent, moreActionsContent: config.moreActionsContent }),
115
- react_1.default.createElement(sonner_1.Toaster, null)));
162
+ react_1.default.createElement(react_1.default.Suspense, { fallback: null },
163
+ react_1.default.createElement(Toaster, null))));
116
164
  };
117
165
  return GenericModulePage;
118
166
  };
@@ -2,7 +2,7 @@
2
2
  * Hook to detect RTL (Right-to-Left) layout based on current locale
3
3
  * @returns {boolean} true if current locale requires RTL layout (Urdu), false otherwise
4
4
  */
5
- export declare const useRTL: () => boolean;
5
+ export declare const useRTL: (forcedLocale?: string) => boolean;
6
6
  /**
7
7
  * Hook to get RTL-aware CSS classes
8
8
  *
package/hooks/use-rtl.js CHANGED
@@ -1,14 +1,23 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.useRTLClasses = exports.useRTL = void 0;
4
- var next_intl_1 = require("next-intl");
5
4
  /**
6
5
  * Hook to detect RTL (Right-to-Left) layout based on current locale
7
6
  * @returns {boolean} true if current locale requires RTL layout (Urdu), false otherwise
8
7
  */
9
- var useRTL = function () {
10
- var locale = (0, next_intl_1.useLocale)();
11
- return locale === 'ur';
8
+ var useRTL = function (forcedLocale) {
9
+ if (forcedLocale)
10
+ return forcedLocale === 'ur';
11
+ try {
12
+ // Require at runtime so bundlers don't statically include next-intl unless used
13
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
14
+ var useLocale = require('next-intl').useLocale;
15
+ var locale = useLocale();
16
+ return locale === 'ur';
17
+ }
18
+ catch (_a) {
19
+ return false;
20
+ }
12
21
  };
13
22
  exports.useRTL = useRTL;
14
23
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@react-pakistan/util-functions",
3
- "version": "1.25.36",
3
+ "version": "1.25.38",
4
4
  "description": "A library of all util functions",
5
5
  "main": "index.js",
6
6
  "scripts": {