@adiba-banking-cloud/backoffice 0.0.106 → 0.2.1

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.
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./index-BLpjQkzt.js');
3
+ var index = require('./index-CWyl7EKZ.js');
4
4
 
5
5
  function _mergeNamespaces(n, m) {
6
6
  m.forEach(function (e) {
@@ -19,6 +19,11 @@ require('@fontsource/poppins/500.css');
19
19
  require('@fontsource/poppins/600.css');
20
20
  require('@fontsource/poppins/700.css');
21
21
  require('@fontsource/poppins/800.css');
22
+ var axios = require('axios');
23
+ var dates = require('@mantine/dates');
24
+ require('@mantine/dates/styles.css');
25
+ var reactQuery = require('@tanstack/react-query');
26
+ var reactQueryDevtools = require('@tanstack/react-query-devtools');
22
27
 
23
28
  function _interopNamespaceDefault(e) {
24
29
  var n = Object.create(null);
@@ -52,6 +57,7 @@ function _mergeNamespaces(n, m) {
52
57
  return Object.freeze(n);
53
58
  }
54
59
 
60
+ var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
55
61
  var IconSax__namespace = /*#__PURE__*/_interopNamespaceDefault(IconSax);
56
62
 
57
63
  function getDefaultExportFromCjs (x) {
@@ -12166,7 +12172,7 @@ const initChart$1 = props => {
12166
12172
  }
12167
12173
 
12168
12174
  // Fallback: use dynamic import (async, but will work in Vite/Storybook)
12169
- Promise.resolve().then(function () { return require('./heatmap-BJmii0aO.js'); }).then(function (n) { return n.heatmap; }).then(heatmapModule => {
12175
+ Promise.resolve().then(function () { return require('./heatmap-D-qDlLOI.js'); }).then(function (n) { return n.heatmap; }).then(heatmapModule => {
12170
12176
  const moduleFn = typeof heatmapModule === "function" ? heatmapModule : heatmapModule?.default || heatmapModule;
12171
12177
  if (typeof moduleFn === "function") {
12172
12178
  moduleFn(Highcharts);
@@ -14426,12 +14432,317 @@ const useManagedModals = () => {
14426
14432
  };
14427
14433
  };
14428
14434
 
14435
+ /**
14436
+ * Default pagination page size
14437
+ */
14438
+ const DEFAULT_PAGE_SIZE = 10;
14439
+
14440
+ /**
14441
+ * Maximum allowed page size for pagination
14442
+ */
14443
+ const MAX_PAGE_SIZE = 100;
14444
+
14445
+ /**
14446
+ * Default API request timeout in milliseconds
14447
+ */
14448
+ const DEFAULT_API_TIMEOUT = 30000;
14449
+
14450
+ /**
14451
+ * Configuration for URL filter hook
14452
+ */
14453
+
14454
+ /**
14455
+ * Return type for useUrlFilters hook
14456
+ */
14457
+
14458
+ /**
14459
+ * Generic hook for managing URL-based filters with pagination
14460
+ *
14461
+ * @example
14462
+ * ```tsx
14463
+ * interface MyFilters {
14464
+ * page: number;
14465
+ * limit: number;
14466
+ * name?: string;
14467
+ * status?: string;
14468
+ * }
14469
+ *
14470
+ * const { filters, updateFilters, clearFilters } = useUrlFilters<MyFilters>({
14471
+ * parseFilters: (params) => ({
14472
+ * page: parseInt(params.get('page') || '1', 10),
14473
+ * limit: parseInt(params.get('limit') || '10', 10),
14474
+ * name: params.get('name') || undefined,
14475
+ * status: params.get('status') || undefined,
14476
+ * }),
14477
+ * serializeFilters: (filters, params) => {
14478
+ * if (filters.page) params.set('page', String(filters.page));
14479
+ * if (filters.limit) params.set('limit', String(filters.limit));
14480
+ * if (filters.name) params.set('name', filters.name);
14481
+ * if (filters.status) params.set('status', filters.status);
14482
+ * },
14483
+ * });
14484
+ * ```
14485
+ */
14486
+ function useUrlFilters(options) {
14487
+ const {
14488
+ defaultPageSize = DEFAULT_PAGE_SIZE,
14489
+ parseFilters,
14490
+ serializeFilters,
14491
+ hasActiveFilters: checkActiveFilters,
14492
+ toApiParams
14493
+ } = options;
14494
+ const [searchParams, setSearchParams] = reactRouterDom.useSearchParams();
14495
+ const filters = React.useMemo(() => {
14496
+ const parsed = parseFilters(searchParams);
14497
+
14498
+ // Ensure page and limit are always present with valid defaults
14499
+ const page = typeof parsed.page === "number" && parsed.page > 0 ? parsed.page : 1;
14500
+ const limit = typeof parsed.limit === "number" && parsed.limit > 0 ? parsed.limit : defaultPageSize;
14501
+ return {
14502
+ ...parsed,
14503
+ page,
14504
+ limit
14505
+ };
14506
+ }, [searchParams, parseFilters, defaultPageSize]);
14507
+ const updateFilters = newFilters => {
14508
+ const params = new URLSearchParams(searchParams);
14509
+
14510
+ // Merge new filters with existing filters
14511
+ const mergedFilters = {
14512
+ ...filters,
14513
+ ...newFilters
14514
+ };
14515
+
14516
+ // Determine if we should reset page to 1
14517
+ // Reset if: page is not explicitly set AND other filters are changing
14518
+ const hasNonPaginationChanges = Object.keys(newFilters).some(key => key !== "page" && key !== "limit");
14519
+ if (newFilters.page === undefined && hasNonPaginationChanges) {
14520
+ mergedFilters.page = 1; // Reset to page 1
14521
+ }
14522
+
14523
+ // Ensure page and limit are numbers
14524
+ if (typeof mergedFilters.page !== "number" || mergedFilters.page < 1) {
14525
+ mergedFilters.page = 1;
14526
+ }
14527
+ if (typeof mergedFilters.limit !== "number" || mergedFilters.limit < 1) {
14528
+ mergedFilters.limit = defaultPageSize;
14529
+ }
14530
+
14531
+ // Serialize all filters
14532
+ serializeFilters(mergedFilters, params);
14533
+ setSearchParams(params, {
14534
+ replace: true
14535
+ });
14536
+ };
14537
+ const clearFilters = () => {
14538
+ const params = new URLSearchParams();
14539
+ params.set("page", "1");
14540
+ params.set("limit", String(defaultPageSize));
14541
+ setSearchParams(params, {
14542
+ replace: true
14543
+ });
14544
+ };
14545
+ const hasActiveFilters = React.useMemo(() => {
14546
+ if (checkActiveFilters) {
14547
+ return checkActiveFilters(filters);
14548
+ }
14549
+ // Default: check if any non-pagination fields have values
14550
+ return Object.keys(filters).some(key => {
14551
+ if (key === "page" || key === "limit") return false;
14552
+ const value = filters[key];
14553
+ return value !== undefined && value !== null && value !== "";
14554
+ });
14555
+ }, [filters, checkActiveFilters]);
14556
+ const apiParams = React.useMemo(() => {
14557
+ if (toApiParams) {
14558
+ return toApiParams(filters);
14559
+ }
14560
+ return undefined;
14561
+ }, [filters, toApiParams]);
14562
+ return {
14563
+ filters,
14564
+ updateFilters,
14565
+ clearFilters,
14566
+ hasActiveFilters,
14567
+ apiParams
14568
+ };
14569
+ }
14570
+
14571
+ class ApiClient {
14572
+ constructor(config) {
14573
+ const {
14574
+ baseURL = "/",
14575
+ timeout = DEFAULT_API_TIMEOUT,
14576
+ headers = {
14577
+ "Content-Type": "application/json"
14578
+ }
14579
+ } = config;
14580
+ this.client = axios.create({
14581
+ baseURL,
14582
+ timeout,
14583
+ headers
14584
+ });
14585
+ this.setupInterceptors();
14586
+ }
14587
+ setupInterceptors() {
14588
+ // Request interceptor
14589
+ this.client.interceptors.request.use(config => {
14590
+ // Add auth token, logging, etc. if needed
14591
+ return config;
14592
+ }, error => Promise.reject(error));
14593
+
14594
+ // Response interceptor
14595
+ this.client.interceptors.response.use(response => {
14596
+ return response;
14597
+ }, error => {
14598
+ // Handle errors globally
14599
+ return Promise.reject(this.handleError(error));
14600
+ });
14601
+ }
14602
+ handleError(error) {
14603
+ if (error && typeof error === "object" && "response" in error) {
14604
+ const axiosError = error;
14605
+ if (axiosError.response) {
14606
+ return {
14607
+ status: "error",
14608
+ code: axiosError.response.status,
14609
+ message: axiosError.response.data?.message || "An error occurred",
14610
+ error: axiosError.response.data?.error || axiosError.message || "An unexpected error occurred"
14611
+ };
14612
+ }
14613
+ }
14614
+ const errorMessage = error instanceof Error ? error.message : "An unexpected error occurred";
14615
+ return {
14616
+ status: "error",
14617
+ code: 500,
14618
+ message: "Network error",
14619
+ error: errorMessage
14620
+ };
14621
+ }
14622
+ async get(url, config) {
14623
+ const response = await this.client.get(url, config);
14624
+ return response.data;
14625
+ }
14626
+ async post(url, data, config) {
14627
+ const response = await this.client.post(url, data, config);
14628
+ return response.data;
14629
+ }
14630
+ async put(url, data, config) {
14631
+ const response = await this.client.put(url, data, config);
14632
+ return response.data;
14633
+ }
14634
+ async delete(url, config) {
14635
+ const response = await this.client.delete(url, config);
14636
+ return response.data;
14637
+ }
14638
+ }
14639
+
14640
+ /**
14641
+ * Factory function to create a configured API client instance
14642
+ * @param config - Configuration options for the API client
14643
+ * @returns Configured ApiClient instance
14644
+ */
14645
+ function createApiClient() {
14646
+ let config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
14647
+ return new ApiClient(config);
14648
+ }
14649
+
14650
+ /**
14651
+ * Default API client instance with default configuration
14652
+ * For custom configuration, use createApiClient() instead
14653
+ */
14654
+ const apiClient = createApiClient();
14655
+
14656
+ /**
14657
+ * Wrapper component for modal content to ensure MantineProvider context is available
14658
+ * This is needed because modals rendered by the appshell may not have access to the pilet's provider
14659
+ */
14660
+ const ModalContentWrapper = _ref => {
14661
+ let {
14662
+ children
14663
+ } = _ref;
14664
+ return /*#__PURE__*/React__namespace.createElement(core.MantineProvider, {
14665
+ theme: theme
14666
+ }, /*#__PURE__*/React__namespace.createElement(dates.DatesProvider, {
14667
+ settings: {
14668
+ locale: "en",
14669
+ timezone: "UTC"
14670
+ }
14671
+ }, children));
14672
+ };
14673
+
14674
+ /**
14675
+ * Default QueryClient configuration
14676
+ */
14677
+ const defaultQueryClient = new reactQuery.QueryClient({
14678
+ defaultOptions: {
14679
+ queries: {
14680
+ retry: 1,
14681
+ refetchOnWindowFocus: false,
14682
+ staleTime: 30000,
14683
+ // 30 seconds
14684
+ gcTime: 5 * 60 * 1000 // 5 minutes
14685
+ },
14686
+ mutations: {
14687
+ retry: false
14688
+ }
14689
+ }
14690
+ });
14691
+ /**
14692
+ * Higher-order component that wraps a component with all necessary providers:
14693
+ * - QueryClientProvider (React Query)
14694
+ * - MantineProvider (Mantine UI)
14695
+ * - DatesProvider (Mantine Dates)
14696
+ *
14697
+ * @param Component - Component to wrap
14698
+ * @param options - Optional configuration
14699
+ * @returns Wrapped component with all providers
14700
+ *
14701
+ * @example
14702
+ * ```tsx
14703
+ * // Using default configuration
14704
+ * const WrappedComponent = withProviders(MyComponent);
14705
+ *
14706
+ * // Using custom QueryClient
14707
+ * const customQueryClient = new QueryClient({ ... });
14708
+ * const WrappedComponent = withProviders(MyComponent, {
14709
+ * queryClient: customQueryClient,
14710
+ * });
14711
+ * ```
14712
+ */
14713
+ function withProviders(Component) {
14714
+ let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
14715
+ const {
14716
+ queryClient = defaultQueryClient,
14717
+ enableDevtools = true,
14718
+ theme: customTheme = theme,
14719
+ datesSettings = {
14720
+ locale: "en",
14721
+ timezone: "UTC"
14722
+ }
14723
+ } = options;
14724
+ const WrappedComponent = props => {
14725
+ const showDevtools = enableDevtools && typeof process !== "undefined" && process.env?.NODE_ENV === "development";
14726
+ return /*#__PURE__*/React__namespace.createElement(reactQuery.QueryClientProvider, {
14727
+ client: queryClient
14728
+ }, /*#__PURE__*/React__namespace.createElement(core.MantineProvider, {
14729
+ theme: customTheme
14730
+ }, /*#__PURE__*/React__namespace.createElement(dates.DatesProvider, {
14731
+ settings: datesSettings
14732
+ }, /*#__PURE__*/React__namespace.createElement(Component, props), showDevtools && /*#__PURE__*/React__namespace.createElement(reactQueryDevtools.ReactQueryDevtools, null))));
14733
+ };
14734
+ WrappedComponent.displayName = `withProviders(${Component.displayName || Component.name || "Component"})`;
14735
+ return WrappedComponent;
14736
+ }
14737
+
14429
14738
  exports.ApplicationMenu = ApplicationMenu;
14430
14739
  exports.ApplicationPanel = ApplicationPanel;
14431
14740
  exports.AvatarLabelPanel = AvatarLabelPanel;
14432
14741
  exports.BasicHeatmap = BasicHeatmap;
14433
14742
  exports.CalendarHeatmap = CalendarHeatmap;
14434
14743
  exports.ConnectionPanel = ConnectionPanel;
14744
+ exports.DEFAULT_API_TIMEOUT = DEFAULT_API_TIMEOUT;
14745
+ exports.DEFAULT_PAGE_SIZE = DEFAULT_PAGE_SIZE;
14435
14746
  exports.DonutChart = DonutChart;
14436
14747
  exports.Drawer = Drawer;
14437
14748
  exports.DynamicLogo = DynamicLogo;
@@ -14443,7 +14754,9 @@ exports.Icons = Icons;
14443
14754
  exports.InfoModal = InfoModal;
14444
14755
  exports.InterpolatedHeatmap = InterpolatedHeatmap;
14445
14756
  exports.LabelPanel = LabelPanel;
14757
+ exports.MAX_PAGE_SIZE = MAX_PAGE_SIZE;
14446
14758
  exports.MaskedTilePanel = MaskedTilePanel;
14759
+ exports.ModalContentWrapper = ModalContentWrapper;
14447
14760
  exports.MultiAxisArea = MultiAxisArea;
14448
14761
  exports.PageTitle = PageTitle;
14449
14762
  exports.PaymentMethod = PaymentMethod;
@@ -14466,7 +14779,11 @@ exports.TitleWithIndex = TitleWithIndex;
14466
14779
  exports.TitledPanel = TitledPanel;
14467
14780
  exports.TwoFactorModal = TwoFactorModal;
14468
14781
  exports.UserMenu = UserMenu;
14782
+ exports.apiClient = apiClient;
14783
+ exports.createApiClient = createApiClient;
14469
14784
  exports.getDefaultExportFromCjs = getDefaultExportFromCjs;
14470
14785
  exports.theme = theme;
14471
14786
  exports.useManagedModals = useManagedModals;
14472
14787
  exports.useModal = useModal;
14788
+ exports.useUrlFilters = useUrlFilters;
14789
+ exports.withProviders = withProviders;
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./index-BLpjQkzt.js');
3
+ var index = require('./index-CWyl7EKZ.js');
4
4
  require('@mantine/modals');
5
5
  require('react');
6
6
  require('@mantine/core');
@@ -20,6 +20,11 @@ require('@fontsource/poppins/500.css');
20
20
  require('@fontsource/poppins/600.css');
21
21
  require('@fontsource/poppins/700.css');
22
22
  require('@fontsource/poppins/800.css');
23
+ require('axios');
24
+ require('@mantine/dates');
25
+ require('@mantine/dates/styles.css');
26
+ require('@tanstack/react-query');
27
+ require('@tanstack/react-query-devtools');
23
28
 
24
29
 
25
30
 
@@ -29,6 +34,8 @@ exports.AvatarLabelPanel = index.AvatarLabelPanel;
29
34
  exports.BasicHeatmap = index.BasicHeatmap;
30
35
  exports.CalendarHeatmap = index.CalendarHeatmap;
31
36
  exports.ConnectionPanel = index.ConnectionPanel;
37
+ exports.DEFAULT_API_TIMEOUT = index.DEFAULT_API_TIMEOUT;
38
+ exports.DEFAULT_PAGE_SIZE = index.DEFAULT_PAGE_SIZE;
32
39
  exports.DonutChart = index.DonutChart;
33
40
  exports.Drawer = index.Drawer;
34
41
  exports.DynamicLogo = index.DynamicLogo;
@@ -40,7 +47,9 @@ exports.Icons = index.Icons;
40
47
  exports.InfoModal = index.InfoModal;
41
48
  exports.InterpolatedHeatmap = index.InterpolatedHeatmap;
42
49
  exports.LabelPanel = index.LabelPanel;
50
+ exports.MAX_PAGE_SIZE = index.MAX_PAGE_SIZE;
43
51
  exports.MaskedTilePanel = index.MaskedTilePanel;
52
+ exports.ModalContentWrapper = index.ModalContentWrapper;
44
53
  exports.MultiAxisArea = index.MultiAxisArea;
45
54
  exports.PageTitle = index.PageTitle;
46
55
  exports.PaymentMethod = index.PaymentMethod;
@@ -63,6 +72,10 @@ exports.TitleWithIndex = index.TitleWithIndex;
63
72
  exports.TitledPanel = index.TitledPanel;
64
73
  exports.TwoFactorModal = index.TwoFactorModal;
65
74
  exports.UserMenu = index.UserMenu;
75
+ exports.apiClient = index.apiClient;
76
+ exports.createApiClient = index.createApiClient;
66
77
  exports.theme = index.theme;
67
78
  exports.useManagedModals = index.useManagedModals;
68
79
  exports.useModal = index.useModal;
80
+ exports.useUrlFilters = index.useUrlFilters;
81
+ exports.withProviders = index.withProviders;
@@ -1,4 +1,4 @@
1
- import { g as getDefaultExportFromCjs } from './index-CWjYoFnK.js';
1
+ import { g as getDefaultExportFromCjs } from './index-D7Cza3cb.js';
2
2
 
3
3
  function _mergeNamespaces(n, m) {
4
4
  m.forEach(function (e) {