jett.admin.npmpackage 1.0.90 → 1.0.91

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.
Files changed (3) hide show
  1. package/dist/index.js +1182 -1182
  2. package/dist/index.mjs +1152 -1152
  3. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -1,1182 +1,1182 @@
1
- var __create = Object.create;
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __getProtoOf = Object.getPrototypeOf;
6
- var __hasOwnProp = Object.prototype.hasOwnProperty;
7
- var __export = (target, all) => {
8
- for (var name in all)
9
- __defProp(target, name, { get: all[name], enumerable: true });
10
- };
11
- var __copyProps = (to, from, except, desc) => {
12
- if (from && typeof from === "object" || typeof from === "function") {
13
- for (let key of __getOwnPropNames(from))
14
- if (!__hasOwnProp.call(to, key) && key !== except)
15
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
- }
17
- return to;
18
- };
19
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
20
- // If the importer is in node compatibility mode or this is not an ESM
21
- // file that has been converted to a CommonJS file using a Babel-
22
- // compatible transform (i.e. "__esModule" has not been set), then set
23
- // "default" to the CommonJS "module.exports" for node compatibility.
24
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
25
- mod
26
- ));
27
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
28
-
29
- // src/index.js
30
- var index_exports = {};
31
- __export(index_exports, {
32
- AppSideBar: () => AppSideBar,
33
- Chip: () => Chip,
34
- CustomAutocomplete: () => CustomAutocomplete,
35
- CustomButton: () => CustomButton,
36
- CustomCheckbox: () => CustomCheckbox,
37
- CustomInput: () => CustomInput,
38
- CustomSearch: () => CustomSearch,
39
- CustomSelect: () => CustomSelect,
40
- CustomSwitch: () => CustomSwitch,
41
- CustomTable: () => CustomTable,
42
- CustomTextarea: () => CustomTextarea,
43
- CustomUpload: () => CustomUpload,
44
- Pagination: () => Pagination,
45
- ProgressBar: () => ProgressBar,
46
- RightSheet: () => RightSheet
47
- });
48
- module.exports = __toCommonJS(index_exports);
49
-
50
- // src/utils/cn.ts
51
- var import_clsx = require("clsx");
52
- var import_tailwind_merge = require("tailwind-merge");
53
- function cn(...inputs) {
54
- return (0, import_tailwind_merge.twMerge)((0, import_clsx.clsx)(inputs));
55
- }
56
-
57
- // src/Button.jsx
58
- var import_react = __toESM(require("react"));
59
- var variantStyles = {
60
- PRIMARY: "bg-white dark:bg-[#18181b] dark:text-white",
61
- SECONDARY: "bg-primary text-white dark:text-white",
62
- DEFAULT: "bg-white text-black dark:text-white",
63
- DANGER: "bg-[#ef4444] text-white dark:text-white"
64
- };
65
- var CustomButton = ({
66
- variant = "DEFAULT",
67
- children,
68
- className,
69
- onClick,
70
- disabled = false,
71
- icon
72
- }) => {
73
- return /* @__PURE__ */ import_react.default.createElement(
74
- "div",
75
- {
76
- className: cn(
77
- `cursor-pointer flex items-center py-2 px-3 min-h-10 justify-center border rounded-[6px] border-[#e5e5e5] dark:border-[#303036] ${variant == "DANGER" ? "bg-[#ef4444]" : "dark:bg-[#1d1d20]"} gap-2`,
78
- variantStyles[variant],
79
- className
80
- ),
81
- onClick
82
- },
83
- icon && /* @__PURE__ */ import_react.default.createElement("div", null, icon),
84
- children
85
- );
86
- };
87
-
88
- // src/inputs/Autocomplete.jsx
89
- var import_react2 = __toESM(require("react"));
90
- var import_lucide_react = require("lucide-react");
91
- var CustomAutocomplete = ({
92
- label,
93
- value,
94
- onChange,
95
- options,
96
- placeholder = "Search & select...",
97
- isRequired = false,
98
- error,
99
- heading,
100
- disabled = false
101
- }) => {
102
- const [open, setOpen] = (0, import_react2.useState)(false);
103
- const [search, setSearch] = (0, import_react2.useState)("");
104
- const wrapperRef = (0, import_react2.useRef)(null);
105
- const selectedOptions = options.filter((opt) => value.includes(opt.value));
106
- const handleBlur = (e) => {
107
- var _a;
108
- if (!((_a = wrapperRef.current) == null ? void 0 : _a.contains(e.relatedTarget))) {
109
- setOpen(false);
110
- }
111
- };
112
- const filteredOptions = options.filter(
113
- (opt) => opt.label.toLowerCase().includes(search.toLowerCase())
114
- );
115
- const toggleValue = (val) => {
116
- if (value.includes(val)) {
117
- onChange(value.filter((v) => v !== val));
118
- } else {
119
- onChange([...value, val]);
120
- }
121
- };
122
- return /* @__PURE__ */ import_react2.default.createElement(
123
- "div",
124
- {
125
- className: "flex flex-col w-full relative dark:bg-[#18181b] dark:text-white",
126
- ref: wrapperRef,
127
- tabIndex: disabled ? -1 : 0,
128
- onBlur: handleBlur
129
- },
130
- heading && /* @__PURE__ */ import_react2.default.createElement("h3", { className: "text-lg font-semibold leading-6 mb-1" }, heading),
131
- label && /* @__PURE__ */ import_react2.default.createElement(
132
- "label",
133
- {
134
- className: `font-[500] text-sm leading-5 mb-1 ${heading ? "text-[#737373]" : "text-black dark:text-white"}`
135
- },
136
- label,
137
- " ",
138
- isRequired && /* @__PURE__ */ import_react2.default.createElement("span", { className: "text-red-500" }, "*")
139
- ),
140
- /* @__PURE__ */ import_react2.default.createElement(
141
- "div",
142
- {
143
- onClick: () => {
144
- if (!disabled) setOpen((prev) => !prev);
145
- },
146
- className: `flex justify-between items-center flex-wrap gap-1 rounded-md px-3 py-2 text-sm transition border dark:border-[#303036] h-auto min-h-10 dark:bg-[#18181b] dark:text-white
147
- ${disabled ? "bg-gray-100 cursor-not-allowed text-gray-400" : "cursor-text"}
148
- ${error ? "border-red-500 bg-red-50" : "bg-white border-[hsl(0_0%_89.8%)] hover:border-gray-400 dark:bg-[#18181b] dark:text-white"}
149
- `
150
- },
151
- /* @__PURE__ */ import_react2.default.createElement("div", { className: "flex flex-wrap gap-1 flex-1" }, selectedOptions.length > 0 ? selectedOptions.map((opt) => /* @__PURE__ */ import_react2.default.createElement(
152
- "span",
153
- {
154
- key: opt.value,
155
- className: "bg-[#F7FAFC] dark:bg-[#303036] border border-gray-300 px-2 dark:text-white py-0.5 rounded text-xs flex items-center gap-1"
156
- },
157
- opt.label,
158
- /* @__PURE__ */ import_react2.default.createElement(
159
- "button",
160
- {
161
- onClick: (e) => {
162
- e.stopPropagation();
163
- toggleValue(opt.value);
164
- },
165
- className: "text-gray-500 hover:text-gray-700 dark:text-white cursor-pointer dark:hover:text-white"
166
- },
167
- "\u2715"
168
- )
169
- )) : /* @__PURE__ */ import_react2.default.createElement("span", { className: "text-gray-400" }, placeholder)),
170
- /* @__PURE__ */ import_react2.default.createElement(
171
- import_lucide_react.ChevronDown,
172
- {
173
- className: `w-4 h-4 text-gray-500 transition-transform ${open ? "rotate-180" : ""}`
174
- }
175
- )
176
- ),
177
- !disabled && open && /* @__PURE__ */ import_react2.default.createElement("div", { className: "absolute top-full mt-1 w-full bg-white border border-gray-200 rounded-lg shadow-lg z-10 max-h-60 overflow-y-auto dark:bg-[#18181b] dark:text-white" }, /* @__PURE__ */ import_react2.default.createElement("div", { className: "flex items-center gap-2 p-2 border-b border-gray-200" }, /* @__PURE__ */ import_react2.default.createElement(import_lucide_react.Search, { size: 16, className: "text-gray-400" }), /* @__PURE__ */ import_react2.default.createElement(
178
- "input",
179
- {
180
- type: "text",
181
- value: search,
182
- onChange: (e) => setSearch(e.target.value),
183
- placeholder: "Search...",
184
- className: "flex-1 text-sm focus:outline-none"
185
- }
186
- )), /* @__PURE__ */ import_react2.default.createElement("ul", null, filteredOptions.length > 0 ? filteredOptions.map((opt) => {
187
- const selected = value.includes(opt.value);
188
- return /* @__PURE__ */ import_react2.default.createElement(
189
- "li",
190
- {
191
- key: opt.value,
192
- onClick: () => toggleValue(opt.value),
193
- className: `flex items-center gap-2 px-3 py-2 text-sm cursor-pointer hover:bg-[#F7FAFC] dark:hover:bg-[#303036] ${selected ? "bg-[#F7FAFC] dark:bg-[#303036] font-medium" : ""}`
194
- },
195
- /* @__PURE__ */ import_react2.default.createElement(
196
- "span",
197
- {
198
- className: `w-4 h-4 flex items-center justify-center border rounded-sm ${selected ? "bg-blue-600 border-blue-600 text-white" : "border-gray-300"}`
199
- },
200
- selected && /* @__PURE__ */ import_react2.default.createElement(import_lucide_react.Check, { size: 14 })
201
- ),
202
- opt.label
203
- );
204
- }) : /* @__PURE__ */ import_react2.default.createElement("li", { className: "px-3 py-2 text-sm text-gray-400" }, "No results found")))
205
- );
206
- };
207
-
208
- // src/inputs/Checkbox.jsx
209
- var import_react3 = __toESM(require("react"));
210
- var CustomCheckbox = ({ onChange, checked }) => {
211
- const handleChange = (e) => {
212
- onChange(e.target.checked);
213
- };
214
- return /* @__PURE__ */ import_react3.default.createElement("label", { className: "inline-flex items-center cursor-pointer select-none" }, /* @__PURE__ */ import_react3.default.createElement(
215
- "input",
216
- {
217
- type: "checkbox",
218
- checked,
219
- onChange: handleChange,
220
- className: "peer hidden"
221
- }
222
- ), /* @__PURE__ */ import_react3.default.createElement(
223
- "span",
224
- {
225
- className: "\r\n w-4 h-4 flex items-center justify-center border-2 border-gray-400 rounded \r\n peer-checked:bg-primary peer-checked:border-primary\r\n transition-colors\r\n "
226
- },
227
- checked && /* @__PURE__ */ import_react3.default.createElement(
228
- "svg",
229
- {
230
- className: "w-4 h-4 text-white",
231
- fill: "none",
232
- stroke: "currentColor",
233
- strokeWidth: "3",
234
- viewBox: "0 0 24 24"
235
- },
236
- /* @__PURE__ */ import_react3.default.createElement("path", { d: "M5 13l4 4L19 7" })
237
- )
238
- ));
239
- };
240
-
241
- // src/inputs/Chip.jsx
242
- var import_react4 = __toESM(require("react"));
243
- var VARIANTS = {
244
- PRIMARY: "bg-gray-100 text-black dark:bg-gray-800 dark:text-white",
245
- GREEN: "bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-100",
246
- RED: "bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-100",
247
- YELLOW: "bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-100"
248
- };
249
- var Chip = ({ label, variant }) => {
250
- return /* @__PURE__ */ import_react4.default.createElement(
251
- "div",
252
- {
253
- className: `inline-flex text-[12px] items-center px-3 py-1 rounded-full ${VARIANTS[variant] || VARIANTS.PRIMARY} text-sm font-[600]`
254
- },
255
- label
256
- );
257
- };
258
-
259
- // src/inputs/CustomSwitch.jsx
260
- var import_react5 = __toESM(require("react"));
261
- var CustomSwitch = ({ checked, onChange, label, description }) => {
262
- return /* @__PURE__ */ import_react5.default.createElement("div", null, /* @__PURE__ */ import_react5.default.createElement(
263
- "button",
264
- {
265
- type: "button",
266
- role: "switch",
267
- "aria-checked": checked,
268
- onClick: () => onChange(!checked),
269
- className: `relative inline-flex h-6 w-11 shrink-0 items-center rounded-full transition-colors ${checked ? "bg-black" : "bg-gray-300"}`
270
- },
271
- /* @__PURE__ */ import_react5.default.createElement(
272
- "span",
273
- {
274
- className: `inline-block h-4 w-4 transform rounded-full bg-white shadow transition ${checked ? "translate-x-6" : "translate-x-1"}`
275
- }
276
- )
277
- ), /* @__PURE__ */ import_react5.default.createElement("div", { className: "flex flex-col" }, label && /* @__PURE__ */ import_react5.default.createElement("h3", { className: "font-[500] text-sm text-black mb-2" }, label), description && /* @__PURE__ */ import_react5.default.createElement("p", { className: "font-[500] text-sm text-[#737373]" }, description)));
278
- };
279
-
280
- // src/inputs/Input.jsx
281
- var import_react6 = __toESM(require("react"));
282
- var CustomInput = ({
283
- label,
284
- isRequired,
285
- value,
286
- onChange,
287
- placeholder,
288
- disabled = false,
289
- error,
290
- heading
291
- }) => {
292
- return /* @__PURE__ */ import_react6.default.createElement("div", { className: "flex flex-col gap-1 w-full" }, heading && /* @__PURE__ */ import_react6.default.createElement("h3", { className: "text-lg font-semibold" }, heading), /* @__PURE__ */ import_react6.default.createElement(
293
- "label",
294
- {
295
- className: `font-[500] text-sm ${heading ? "text-[#737373]" : "text-black"} dark:text-white`
296
- },
297
- label,
298
- " ",
299
- isRequired && /* @__PURE__ */ import_react6.default.createElement("span", { className: "text-red-500" }, "*")
300
- ), /* @__PURE__ */ import_react6.default.createElement(
301
- "input",
302
- {
303
- className: `border border-gray-200 rounded-md h-10 px-4 py-2 w-full text-[14px]
304
- focus:outline-2 outline-black dark:outline-white outline-offset-2
305
- dark:bg-transparent dark:text-white dark:border-[#303036]
306
- ${disabled ? "bg-gray-100 cursor-not-allowed text-gray-500 border-gray-300" : error ? "border-red-500 bg-red-50" : "bg-white border-[hsl(0_0%_89.8%)]"}
307
- `,
308
- value,
309
- onChange: (e) => onChange == null ? void 0 : onChange(e.target.value),
310
- placeholder,
311
- disabled,
312
- readOnly: disabled
313
- }
314
- ));
315
- };
316
-
317
- // src/inputs/ProgressBar.jsx
318
- var import_react7 = __toESM(require("react"));
319
- var ProgressBar = ({ step, totalSteps }) => {
320
- const progress = step / totalSteps * 100;
321
- return /* @__PURE__ */ import_react7.default.createElement("div", { className: "mb-6" }, /* @__PURE__ */ import_react7.default.createElement("p", { className: "text-gray-600 text-sm mb-2" }, "Step ", step, " of ", totalSteps), /* @__PURE__ */ import_react7.default.createElement("div", { className: "w-full bg-gray-200 rounded-full h-2" }, /* @__PURE__ */ import_react7.default.createElement(
322
- "div",
323
- {
324
- className: "bg-black h-2 rounded-full transition-all duration-300",
325
- style: { width: `${progress}%` }
326
- }
327
- )));
328
- };
329
-
330
- // src/inputs/Search.jsx
331
- var import_react8 = __toESM(require("react"));
332
- var import_lucide_react2 = require("lucide-react");
333
- var CustomSearch = ({
334
- value,
335
- onChange,
336
- placeholder = "Search Markets..."
337
- }) => {
338
- return /* @__PURE__ */ import_react8.default.createElement("div", { className: "flex items-center border bg-transparent text-[14px] border-[hsl(0_0%_89.8%)] dark:border-[#303036] \r\n rounded-md h-10 px-2 w-full focus-within:outline-2 focus-within:outline-black focus-within:outline-offset-2 dark:text-white" }, /* @__PURE__ */ import_react8.default.createElement(import_lucide_react2.Search, { width: 16, height: 16, color: "gray", className: "mr-2" }), /* @__PURE__ */ import_react8.default.createElement(
339
- "input",
340
- {
341
- type: "text",
342
- value,
343
- onChange,
344
- placeholder,
345
- className: "bg-transparent w-full h-full focus:outline-none"
346
- }
347
- ));
348
- };
349
-
350
- // src/inputs/TextArea.jsx
351
- var import_react9 = __toESM(require("react"));
352
- var CustomTextarea = ({
353
- label,
354
- isRequired,
355
- value,
356
- onChange,
357
- placeholder,
358
- disabled = false,
359
- error,
360
- heading,
361
- rows = 4
362
- }) => {
363
- return /* @__PURE__ */ import_react9.default.createElement("div", { className: "flex flex-col gap-1 w-full" }, heading && /* @__PURE__ */ import_react9.default.createElement("h3", { className: "text-lg font-semibold" }, heading), /* @__PURE__ */ import_react9.default.createElement(
364
- "label",
365
- {
366
- className: `font-[500] text-sm ${heading ? "text-[#737373]" : "text-black"}`
367
- },
368
- label,
369
- " ",
370
- isRequired && /* @__PURE__ */ import_react9.default.createElement("span", { className: "text-red-500" }, "*")
371
- ), /* @__PURE__ */ import_react9.default.createElement(
372
- "textarea",
373
- {
374
- rows,
375
- className: `border rounded-md px-4 py-2 w-full text-[14px]
376
- focus:outline-2 focus:outline-black focus:outline-offset-2
377
- focus:ring-0 focus:shadow-none focus:border-black
378
- ${disabled ? "bg-gray-100 text-gray-500 border-gray-300" : error ? "border-red-500 bg-red-50" : "bg-white border-[hsl(0_0%_89.8%)]"}
379
- `,
380
- value,
381
- onChange: (e) => onChange == null ? void 0 : onChange(e.target.value),
382
- placeholder,
383
- disabled,
384
- readOnly: disabled
385
- }
386
- ));
387
- };
388
-
389
- // src/inputs/Upload.jsx
390
- var import_react10 = __toESM(require("react"));
391
- var import_lucide_react3 = require("lucide-react");
392
- var CustomUpload = ({
393
- label = "Supporting documents",
394
- description = "Drop items here or Browse Files",
395
- accept = ".pdf,.jpg,.jpeg,.png",
396
- maxSizeMB = 5,
397
- onChange,
398
- error,
399
- value
400
- }) => {
401
- const inputRef = (0, import_react10.useRef)(null);
402
- const handleFileSelect = (files) => {
403
- if (!files || files.length === 0) return;
404
- const selectedFile = files[0];
405
- if (selectedFile.size > maxSizeMB * 1024 * 1024) {
406
- alert(`File size must be less than ${maxSizeMB} MB`);
407
- return;
408
- }
409
- onChange == null ? void 0 : onChange(selectedFile);
410
- };
411
- return /* @__PURE__ */ import_react10.default.createElement("div", { className: "flex flex-col gap-2 w-full" }, label && /* @__PURE__ */ import_react10.default.createElement("label", { className: "text-sm font-medium" }, label), /* @__PURE__ */ import_react10.default.createElement(
412
- "div",
413
- {
414
- className: `border-2 border-dashed rounded-lg p-6 flex flex-col items-center justify-center text-center cursor-pointer transition
415
- ${error ? "border-red-500 bg-red-50" : "border-gray-300 hover:border-gray-400 bg-gray-50"}`,
416
- onClick: () => {
417
- var _a;
418
- return (_a = inputRef.current) == null ? void 0 : _a.click();
419
- },
420
- onDragOver: (e) => e.preventDefault(),
421
- onDrop: (e) => {
422
- e.preventDefault();
423
- handleFileSelect(e.dataTransfer.files);
424
- }
425
- },
426
- /* @__PURE__ */ import_react10.default.createElement(import_lucide_react3.Upload, { className: "w-6 h-6 text-gray-500 mb-2" }),
427
- /* @__PURE__ */ import_react10.default.createElement("p", { className: "text-sm text-gray-700" }, description),
428
- /* @__PURE__ */ import_react10.default.createElement("p", { className: "text-xs text-gray-500 mt-1" }, "File Supported: PDF/JPG/PNG, up to ", maxSizeMB, " MB"),
429
- /* @__PURE__ */ import_react10.default.createElement(
430
- "input",
431
- {
432
- ref: inputRef,
433
- type: "file",
434
- accept,
435
- className: "hidden",
436
- onChange: (e) => handleFileSelect(e.target.files)
437
- }
438
- )
439
- ), value && /* @__PURE__ */ import_react10.default.createElement("span", { className: "text-sm truncate text-gray-500" }, "Selected: ", value.name), error && /* @__PURE__ */ import_react10.default.createElement("p", { className: "text-xs text-red-500" }, error));
440
- };
441
-
442
- // src/sideBar/SideBar.jsx
443
- var import_lucide_react6 = require("lucide-react");
444
- var import_react12 = __toESM(require("react"));
445
-
446
- // ConstantUI.js
447
- var import_lucide_react4 = require("lucide-react");
448
- var encodedAuthData = localStorage.getItem("encodedAuthData");
449
- var navItemsConstant = [
450
- {
451
- Icon: import_lucide_react4.Home,
452
- label: "Home",
453
- onClick: () => {
454
- window.location.href = "/";
455
- },
456
- isDropDown: false
457
- },
458
- {
459
- Icon: import_lucide_react4.Globe,
460
- label: "TMC Ecosystem",
461
- onClick: () => {
462
- },
463
- isDropDown: true,
464
- options: [
465
- {
466
- label: "Markets",
467
- onClick: () => {
468
- window.location.href = "/market/";
469
- }
470
- },
471
- {
472
- label: "Users",
473
- onClick: () => {
474
- window.location.href = "/orgselector/?path=users";
475
- }
476
- },
477
- {
478
- label: "Supplier Ecosystem",
479
- onClick: () => {
480
- window.location.href = "/supplier/";
481
- }
482
- }
483
- ]
484
- },
485
- {
486
- Icon: import_lucide_react4.Building,
487
- label: "Consumer Ecosystem",
488
- onClick: () => {
489
- },
490
- options: [
491
- {
492
- label: "Corporate",
493
- onClick: () => {
494
- window.location.href = "/corporate/";
495
- }
496
- },
497
- {
498
- label: "Trips",
499
- onClick: () => {
500
- window.location.href = "/trips/";
501
- }
502
- },
503
- {
504
- label: "Booking History",
505
- onClick: () => {
506
- window.location.href = "/finance/bookingHistory/";
507
- }
508
- },
509
- {
510
- label: "Reports",
511
- onClick: () => {
512
- window.open("https://viz.jett.travel", "_blank");
513
- }
514
- },
515
- {
516
- label: "Users",
517
- onClick: () => {
518
- window.location.href = "/orgselector/?path=users";
519
- }
520
- },
521
- {
522
- label: "Tags",
523
- onClick: () => {
524
- window.location.href = "/orgselector/?path=tag";
525
- }
526
- },
527
- {
528
- label: "Payment Ledger",
529
- onClick: () => {
530
- window.location.href = "/finance/paymentsLedger/";
531
- }
532
- },
533
- {
534
- label: "Special Request",
535
- onClick: () => {
536
- window.location.href = "/orgselector/?path=special-requests";
537
- }
538
- }
539
- ],
540
- isDropDown: true
541
- },
542
- {
543
- Icon: import_lucide_react4.DollarSign,
544
- label: "Revenue Management",
545
- onClick: () => {
546
- },
547
- isDropDown: true,
548
- options: [
549
- {
550
- label: "Pricing Policy",
551
- onClick: () => {
552
- window.location.href = "/orgselector/?path=pricing-policy";
553
- }
554
- },
555
- {
556
- label: "Offers",
557
- onClick: () => {
558
- window.location.href = "/orgselector/?path=offer";
559
- }
560
- },
561
- {
562
- label: "Vouchers",
563
- onClick: () => {
564
- window.location.href = "/orgselector/?path=voucher";
565
- }
566
- },
567
- {
568
- label: "Supplier Deals",
569
- onClick: () => {
570
- window.location.href = "/supplierdeals/";
571
- }
572
- },
573
- {
574
- label: "Invoices",
575
- onClick: () => {
576
- window.location.href = "/finance/invoices/";
577
- }
578
- }
579
- ]
580
- },
581
- {
582
- Icon: import_lucide_react4.Cog,
583
- label: "Settings",
584
- onClick: () => {
585
- },
586
- isDropDown: true,
587
- options: [
588
- {
589
- label: "Whitelabel",
590
- onClick: () => {
591
- window.location.href = "/whitelabel/";
592
- }
593
- }
594
- ]
595
- }
596
- ];
597
- var additionalItemsConstant = [
598
- {
599
- Icon: import_lucide_react4.LifeBuoy,
600
- label: "Help",
601
- onClick: () => {
602
- window.location.href = "/help";
603
- }
604
- }
605
- ];
606
-
607
- // src/assests/logo/logo-white.svg
608
- var logo_white_default = "./logo-white-RYMEJOWI.svg";
609
-
610
- // src/sideBar/SideBar.jsx
611
- var import_js_cookie = __toESM(require("js-cookie"));
612
-
613
- // src/inputs/CustomSelect.jsx
614
- var import_react11 = __toESM(require("react"));
615
- var import_lucide_react5 = require("lucide-react");
616
- var CustomSelect = ({
617
- label,
618
- value,
619
- onChange,
620
- options,
621
- placeholder = "Select...",
622
- isRequired = false,
623
- error,
624
- heading,
625
- disabled = false
626
- }) => {
627
- const [open, setOpen] = (0, import_react11.useState)(false);
628
- const [search, setSearch] = (0, import_react11.useState)("");
629
- const wrapperRef = (0, import_react11.useRef)(null);
630
- const handleBlur = (e) => {
631
- var _a;
632
- if (!((_a = wrapperRef.current) == null ? void 0 : _a.contains(e.relatedTarget))) {
633
- setOpen(false);
634
- }
635
- };
636
- const filteredOptions = options.filter(
637
- (opt) => opt.label.toLowerCase().includes(search.toLowerCase())
638
- );
639
- const handleSelect = (val) => {
640
- onChange(val);
641
- setOpen(false);
642
- };
643
- const selectedOption = options.find((opt) => opt.value === value);
644
- return /* @__PURE__ */ import_react11.default.createElement(
645
- "div",
646
- {
647
- className: "flex flex-col w-full relative",
648
- ref: wrapperRef,
649
- tabIndex: disabled ? -1 : 0,
650
- onBlur: handleBlur
651
- },
652
- heading && /* @__PURE__ */ import_react11.default.createElement("h3", { className: "text-lg font-semibold mb-1" }, heading),
653
- label && /* @__PURE__ */ import_react11.default.createElement(
654
- "label",
655
- {
656
- className: `font-medium text-sm mb-1 ${heading ? "text-[#737373] dark:text-white" : "text-black dark:text-white"}`
657
- },
658
- label,
659
- " ",
660
- isRequired && /* @__PURE__ */ import_react11.default.createElement("span", { className: "text-red-500" }, "*")
661
- ),
662
- /* @__PURE__ */ import_react11.default.createElement(
663
- "div",
664
- {
665
- onClick: () => !disabled && setOpen((prev) => !prev),
666
- className: `flex justify-between items-center rounded-md px-3 py-2 text-sm border h-10 cursor-pointer dark:border-[#303036] dark:bg-[#18181b] dark:text-white
667
- ${disabled ? "bg-gray-100 text-gray-400" : "bg-white dark:bg-[#18181b] dark:text-white"}
668
- ${error ? "border-red-500" : "border-gray-300"}
669
- `
670
- },
671
- /* @__PURE__ */ import_react11.default.createElement("span", { className: `${selectedOption ? "text-black dark:text-white" : "text-gray-400 dark:text-white"}` }, selectedOption ? selectedOption.label : placeholder),
672
- /* @__PURE__ */ import_react11.default.createElement(
673
- import_lucide_react5.ChevronDown,
674
- {
675
- className: `w-4 h-4 text-gray-500 transition-transform dark:text-white ${open ? "rotate-180" : ""}`
676
- }
677
- )
678
- ),
679
- open && !disabled && /* @__PURE__ */ import_react11.default.createElement("div", { className: "absolute top-full mt-1 w-full bg-white border border-gray-200 rounded-lg shadow-lg z-10 max-h-60 overflow-y-auto dark:bg-[#18181b] dark:text-white" }, /* @__PURE__ */ import_react11.default.createElement("div", { className: "flex items-center gap-2 p-2 border-b border-gray-200" }, /* @__PURE__ */ import_react11.default.createElement(import_lucide_react5.Search, { size: 16, className: "text-gray-400" }), /* @__PURE__ */ import_react11.default.createElement(
680
- "input",
681
- {
682
- type: "text",
683
- value: search,
684
- onChange: (e) => setSearch(e.target.value),
685
- placeholder: "Search...",
686
- className: "flex-1 text-sm focus:outline-none"
687
- }
688
- )), /* @__PURE__ */ import_react11.default.createElement("ul", null, filteredOptions.length > 0 ? filteredOptions.map((opt) => /* @__PURE__ */ import_react11.default.createElement(
689
- "li",
690
- {
691
- key: opt.value,
692
- onClick: () => handleSelect(opt.value),
693
- className: `px-3 py-2 text-sm cursor-pointer hover:bg-gray-100 dark:hover:bg-[#27272a] ${value === opt.value ? "bg-gray-100 font-medium dark:bg-[#27272a] dark:text-white" : ""}`
694
- },
695
- opt.label
696
- )) : /* @__PURE__ */ import_react11.default.createElement("li", { className: "px-3 py-2 text-sm text-gray-400 dark:text-white" }, "No results found")))
697
- );
698
- };
699
-
700
- // src/sideBar/SideBar.jsx
701
- var AppSideBar = ({
702
- username,
703
- role,
704
- navItems,
705
- additionalItems,
706
- sideBarLogo
707
- }) => {
708
- var _a, _b;
709
- const [authData, setAuthData] = (0, import_react12.useState)(null);
710
- const [selectedCountry, setSelectedCountry] = (0, import_react12.useState)("dubai");
711
- const [isMobileMenuOpen, setIsMobileMenuOpen] = (0, import_react12.useState)(false);
712
- const [currAppearance, setCurrAppearance] = (0, import_react12.useState)("light");
713
- (0, import_react12.useEffect)(() => {
714
- setCurrAppearance("light");
715
- localStorage.setItem("themeMode", "light");
716
- }, []);
717
- const countryOptions = [
718
- { label: "India", value: "india" },
719
- { label: "Dubai", value: "dubai" },
720
- { label: "Singapore", value: "singapore" },
721
- { label: "Qatar", value: "qatar" }
722
- ];
723
- const handleIconRotate = (e, index, additionalKey, parentIndex) => {
724
- let dropDownIcon = e.currentTarget.children[2];
725
- if (!dropDownIcon) return;
726
- if (dropDownIcon.classList.contains("rotate-180")) {
727
- dropDownIcon.classList.remove("rotate-180");
728
- } else {
729
- dropDownIcon.classList.add("transition-all");
730
- dropDownIcon.classList.add("rotate-180");
731
- }
732
- const optionsContainer = document.getElementById(
733
- `dropDownOptions-${index}${additionalKey ? `-${additionalKey}` : ""}${parentIndex ? `-${parentIndex}` : ""}`
734
- );
735
- if (!optionsContainer) return;
736
- optionsContainer.classList.add("transition-all");
737
- if (optionsContainer.classList.contains("max-h-0")) {
738
- optionsContainer.classList.remove("max-h-0");
739
- optionsContainer.classList.add("min-h-[50px]");
740
- } else {
741
- optionsContainer.classList.remove("min-h-[50px]");
742
- optionsContainer.classList.add("max-h-0");
743
- }
744
- };
745
- (0, import_react12.useEffect)(() => {
746
- const storedAuthData = localStorage.getItem("authData");
747
- if (storedAuthData) {
748
- let parseData = JSON.parse(storedAuthData);
749
- setAuthData(parseData);
750
- }
751
- }, [localStorage.getItem("authData")]);
752
- const navItemsLocal = navItems ?? navItemsConstant;
753
- const additionalItemsLocal = additionalItems ?? additionalItemsConstant;
754
- const sideBarLogoLocal = sideBarLogo ?? logo_white_default;
755
- const toggleMobileMenu = () => {
756
- setIsMobileMenuOpen(!isMobileMenuOpen);
757
- };
758
- const closeMobileMenu = () => {
759
- setIsMobileMenuOpen(false);
760
- };
761
- return /* @__PURE__ */ import_react12.default.createElement(import_react12.default.Fragment, null, /* @__PURE__ */ import_react12.default.createElement("div", { className: "fixed top-0 left-0 w-full z-50 flex items-center justify-between px-4 py-3 bg-white dark:bg-[#18181b] border-b border-gray-200 dark:border-[#303036] shadow-lg md:hidden" }, /* @__PURE__ */ import_react12.default.createElement(
762
- "button",
763
- {
764
- onClick: toggleMobileMenu,
765
- className: "p-2 rounded-lg hover:bg-gray-50 dark:hover:bg-[#27272a] transition-colors",
766
- "aria-label": "Toggle menu"
767
- },
768
- isMobileMenuOpen ? /* @__PURE__ */ import_react12.default.createElement(import_lucide_react6.X, { className: "w-6 h-6 text-gray-700 dark:text-[#f4f4f5cc]" }) : /* @__PURE__ */ import_react12.default.createElement(import_lucide_react6.Menu, { className: "w-6 h-6 text-gray-700 dark:text-[#f4f4f5cc]" })
769
- ), /* @__PURE__ */ import_react12.default.createElement("div", { className: "flex-1 flex justify-center" }, sideBarLogo && /* @__PURE__ */ import_react12.default.createElement(
770
- "img",
771
- {
772
- src: sideBarLogo,
773
- alt: "sidebarLogo",
774
- width: 108,
775
- height: 40,
776
- className: "object-contain"
777
- }
778
- )), /* @__PURE__ */ import_react12.default.createElement("div", { className: "w-10" })), isMobileMenuOpen && /* @__PURE__ */ import_react12.default.createElement(
779
- "div",
780
- {
781
- className: "fixed inset-0 bg-black/80 bg-opacity-50 z-40 md:hidden",
782
- onClick: closeMobileMenu
783
- }
784
- ), /* @__PURE__ */ import_react12.default.createElement(
785
- "div",
786
- {
787
- className: `fixed top-0 left-0 md:relative w-[320px] transition-all ease-in-out delay-100 bg-white dark:bg-[#18181b] border-r border-gray-200 dark:border-[#303036] flex flex-col p-4 pt-20 md:pt-4 h-full max-h-[100vh] xs:max-md:z-40 md:max-lg:w-[280px] ${isMobileMenuOpen ? "translate-x-0" : "-translate-x-full md:translate-x-0"}`
788
- },
789
- /* @__PURE__ */ import_react12.default.createElement("div", { className: "p-2 mb-2 hidden md:block" }, /* @__PURE__ */ import_react12.default.createElement("div", { className: "flex items-center justify-center w-full h-[60px] mb-2" }, sideBarLogo && /* @__PURE__ */ import_react12.default.createElement(
790
- "img",
791
- {
792
- src: sideBarLogo,
793
- alt: "sidebarLogo",
794
- width: 108,
795
- height: 40,
796
- className: "object-contain"
797
- }
798
- ))),
799
- /* @__PURE__ */ import_react12.default.createElement("div", { className: "mb-4" }),
800
- /* @__PURE__ */ import_react12.default.createElement("div", { className: "overflow-y-auto scrollbar-hide" }, /* @__PURE__ */ import_react12.default.createElement("div", null, navItemsLocal == null ? void 0 : navItemsLocal.map((item, index) => {
801
- return /* @__PURE__ */ import_react12.default.createElement("div", { key: index, className: "" }, /* @__PURE__ */ import_react12.default.createElement(
802
- "div",
803
- {
804
- className: "flex items-center gap-3 p-2.5 hover:bg-[#f4f4f5] dark:hover:bg-[#27272a] text-gray-700 dark:text-[#f4f4f5cc] cursor-pointer rounded-lg ml-2 mr-2 transition-colors duration-200",
805
- onClick: (e) => {
806
- item.onClick && item.onClick(e);
807
- handleIconRotate(e, index);
808
- if (!item.isDropDown) {
809
- closeMobileMenu();
810
- }
811
- }
812
- },
813
- /* @__PURE__ */ import_react12.default.createElement("div", { className: "text-primary" }, /* @__PURE__ */ import_react12.default.createElement(item.Icon, { width: 20, height: 20 })),
814
- /* @__PURE__ */ import_react12.default.createElement("span", { className: "font-medium text-[16px] text-[#000] dark:text-[#f4f4f5cc]" }, item.label),
815
- item.isDropDown && /* @__PURE__ */ import_react12.default.createElement("div", { className: `ml-auto transition-all delay-75` }, /* @__PURE__ */ import_react12.default.createElement(import_lucide_react6.ChevronDown, { width: 20, height: 20, className: "text-gray-500 dark:text-gray-400" }))
816
- ), item.options && item.options.length > 0 && /* @__PURE__ */ import_react12.default.createElement(
817
- "div",
818
- {
819
- className: "ml-[20px] max-h-0 overflow-hidden flex flex-col",
820
- id: `dropDownOptions-${index}`
821
- },
822
- item.options.map((options, optionsIndex) => {
823
- return /* @__PURE__ */ import_react12.default.createElement("div", { className: "" }, /* @__PURE__ */ import_react12.default.createElement(
824
- "div",
825
- {
826
- className: "flex items-center gap-3 py-2 px-3 ml-4 mr-2 hover:bg-[#f4f4f5] dark:hover:bg-[#27272a] text-gray-600 dark:text-[#a1a1aa] cursor-pointer rounded-md transition-colors duration-200",
827
- onClick: (e) => {
828
- options.onClick && options.onClick();
829
- options.isDropDown && handleIconRotate(
830
- e,
831
- optionsIndex,
832
- "subOption",
833
- index
834
- );
835
- if (!options.isDropDown) {
836
- closeMobileMenu();
837
- }
838
- }
839
- },
840
- /* @__PURE__ */ import_react12.default.createElement("div", null),
841
- /* @__PURE__ */ import_react12.default.createElement("span", { className: "font-medium text-[#3f3f46cc] text-sm dark:text-[#a1a1aa]" }, options.label),
842
- options.isDropDown && /* @__PURE__ */ import_react12.default.createElement(
843
- "div",
844
- {
845
- className: `ml-auto transition-all delay-75`
846
- },
847
- /* @__PURE__ */ import_react12.default.createElement(import_lucide_react6.ChevronDown, { width: 18, height: 18, className: "text-gray-400 dark:text-gray-500" })
848
- )
849
- ), options.options && options.options.length > 1 && /* @__PURE__ */ import_react12.default.createElement(
850
- "div",
851
- {
852
- className: "ml-[20px] max-h-0 overflow-hidden flex flex-col",
853
- id: `dropDownOptions-${optionsIndex}-subOption-${index}`
854
- },
855
- options.options.map((subOption) => {
856
- return /* @__PURE__ */ import_react12.default.createElement(
857
- "div",
858
- {
859
- className: "py-1.5 px-3 rounded-md hover:bg-[#f4f4f5] dark:hover:bg-[#27272a] text-gray-500 dark:text-[#71717a] font-medium text-sm cursor-pointer ml-8 mr-2 transition-colors duration-200",
860
- onClick: (e) => {
861
- subOption.onClick && subOption.onClick();
862
- closeMobileMenu();
863
- }
864
- },
865
- subOption.label
866
- );
867
- })
868
- ));
869
- })
870
- ));
871
- }))),
872
- /* @__PURE__ */ import_react12.default.createElement("div", { className: "mt-auto bg-[#fafafa] dark:bg-[#18181b] sticky bottom-0 mt-2" }, /* @__PURE__ */ import_react12.default.createElement(
873
- "div",
874
- {
875
- className: "flex items-center justify-between p-2 rounded-lg hover:bg-[#f4f4f5] dark:hover:bg-[#27272a] cursor-pointer transition-colors duration-200",
876
- onClick: () => {
877
- window.location.href = "/profile";
878
- }
879
- },
880
- /* @__PURE__ */ import_react12.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ import_react12.default.createElement("span", { className: "relative flex shrink-0 overflow-hidden dark:bg-[#27272a] rounded-full h-10 w-10" }, /* @__PURE__ */ import_react12.default.createElement("span", { className: "flex h-full w-full items-center justify-center rounded-full bg-muted dark:text-white" }, ((_a = authData == null ? void 0 : authData.userInfo) == null ? void 0 : _a.UserName) ? authData.userInfo.UserName.split("")[0] : "A")), /* @__PURE__ */ import_react12.default.createElement("div", null, /* @__PURE__ */ import_react12.default.createElement("p", { className: "font-semibold dark:text-white" }, ((_b = authData == null ? void 0 : authData.userInfo) == null ? void 0 : _b.UserName) ? authData.userInfo.UserName : "Admin User"), /* @__PURE__ */ import_react12.default.createElement("p", { className: "text-sm dark:text-[#f4f4f5cc]" }, role)))
881
- ))
882
- ));
883
- };
884
-
885
- // src/RightSheet/RightSheet.jsx
886
- var import_react13 = __toESM(require("react"));
887
- var RightSheet = ({
888
- open,
889
- setOpen,
890
- children,
891
- callBack,
892
- actionLabel = "Save",
893
- onAction = () => {
894
- }
895
- }) => {
896
- const [visible, setVisible] = (0, import_react13.useState)(open);
897
- (0, import_react13.useEffect)(() => {
898
- if (open) {
899
- document.body.style.overflow = "hidden";
900
- setVisible(true);
901
- }
902
- return () => {
903
- document.body.style.overflow = "auto";
904
- };
905
- }, [open]);
906
- const handleClose = () => {
907
- setVisible(false);
908
- setTimeout(() => {
909
- setOpen(false);
910
- callBack();
911
- }, 200);
912
- };
913
- const handleAction = () => {
914
- onAction();
915
- handleClose();
916
- };
917
- if (!visible) return null;
918
- return /* @__PURE__ */ import_react13.default.createElement(
919
- "div",
920
- {
921
- className: "fixed inset-0 overflow-x-hidden bg-black/80 sheetPopIn h-full overflow-auto ",
922
- onClick: handleClose
923
- },
924
- /* @__PURE__ */ import_react13.default.createElement(
925
- "div",
926
- {
927
- className: `absolute flex flex-col right-0 top-0 min-h-full min-w-[100%] md:min-w-[576px]
928
- ${visible ? "sheetRightSlide" : "transition-all duration-200 translate-x-[100%]"} justify-between bg-[#fff] dark:bg-[#18181b] dark:text-white`,
929
- onClick: (e) => e.stopPropagation()
930
- },
931
- /* @__PURE__ */ import_react13.default.createElement("div", { className: " min-h-full " }, children),
932
- /* @__PURE__ */ import_react13.default.createElement("div", { className: "h-[90px] flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2 p-6 border-t sticky bottom-0 bg-white border-[#e6e6e6] dark:border-[#303036] dark:bg-[#18181b] dark:text-white" }, /* @__PURE__ */ import_react13.default.createElement(CustomButton, { variant: "SECONDARY", onClick: () => handleClose() }, "Cancel"), /* @__PURE__ */ import_react13.default.createElement(CustomButton, { variant: "SECONDARY", onClick: handleAction }, actionLabel))
933
- )
934
- );
935
- };
936
-
937
- // src/Table/CustomTable.jsx
938
- var import_react14 = __toESM(require("react"));
939
- var CustomTable = ({
940
- tableHeader,
941
- setIsAllChecked,
942
- isAllChecked,
943
- children,
944
- isHideCheckbox = "false"
945
- }) => {
946
- return /* @__PURE__ */ import_react14.default.createElement("div", { className: "border border-[#e5e5e5] dark:border-[#303036] rounded-lg overflow-x-auto" }, /* @__PURE__ */ import_react14.default.createElement("div", { className: "w-full relative overflow-x-auto" }, /* @__PURE__ */ import_react14.default.createElement("table", { className: "w-full caption-bottom text-sm overflow-x-auto bg-white dark:bg-[#18181b] table-fixed border-collapse" }, /* @__PURE__ */ import_react14.default.createElement("thead", { className: "border-b border-[#e5e5e5] dark:border-[#303036] dark:bg-[#18181b]" }, /* @__PURE__ */ import_react14.default.createElement(
947
- "tr",
948
- {
949
- className: "transition-colors text-[#737373] hover:bg-muted/50 \r\n data-[state=selected]:bg-muted"
950
- },
951
- !isHideCheckbox && /* @__PURE__ */ import_react14.default.createElement("th", { className: "px-4 py-3 text-left w-[50px]" }, /* @__PURE__ */ import_react14.default.createElement(
952
- CustomCheckbox,
953
- {
954
- checked: isAllChecked,
955
- onChange: () => {
956
- setIsAllChecked(!isAllChecked);
957
- }
958
- }
959
- )),
960
- tableHeader.map((header, index) => {
961
- return /* @__PURE__ */ import_react14.default.createElement(
962
- "th",
963
- {
964
- className: `text-[#737373] px-4 py-3 text-sm dark:bg-[#18181b] font-medium ${index == tableHeader.length - 1 ? "text-right" : "text-left"}`,
965
- key: header + index
966
- },
967
- header
968
- );
969
- })
970
- )), /* @__PURE__ */ import_react14.default.createElement("tbody", null, children))));
971
- };
972
-
973
- // src/Pagination/Pagination.jsx
974
- var import_react15 = __toESM(require("react"));
975
- var import_lucide_react7 = require("lucide-react");
976
- var Pagination = ({
977
- data = [],
978
- component: Component,
979
- itemsPerPage = 6,
980
- itemsPerPageOptions = [5, 10, 20, 50, 100],
981
- // Controlled props (optional)
982
- currentPage: controlledCurrentPage,
983
- onPageChange: controlledOnPageChange,
984
- onItemsPerPageChange: controlledOnItemsPerPageChange,
985
- // Legacy props for backward compatibility
986
- totalPages,
987
- totalItems: legacyTotalItems,
988
- onPageChange: legacyOnPageChange,
989
- onItemsPerPageChange: legacyOnItemsPerPageChange,
990
- tableHeader,
991
- isHideCheckbox,
992
- callback,
993
- isTable = false,
994
- // Component props - any additional props to pass to the component
995
- componentProps = {},
996
- ...restProps
997
- }) => {
998
- const [internalCurrentPage, setInternalCurrentPage] = (0, import_react15.useState)(1);
999
- const [internalItemsPerPage, setInternalItemsPerPage] = (0, import_react15.useState)(itemsPerPage);
1000
- const isControlled = controlledCurrentPage !== void 0;
1001
- const isItemsPerPageControlled = controlledOnItemsPerPageChange !== void 0;
1002
- const currentPage = isControlled ? controlledCurrentPage : internalCurrentPage;
1003
- const activeItemsPerPage = isItemsPerPageControlled ? itemsPerPage : internalItemsPerPage;
1004
- const totalItems = legacyTotalItems !== void 0 ? legacyTotalItems : data.length;
1005
- const calculatedTotalPages = (0, import_react15.useMemo)(() => {
1006
- if (totalItems > 0 && activeItemsPerPage > 0) {
1007
- return Math.ceil(totalItems / activeItemsPerPage);
1008
- }
1009
- return 1;
1010
- }, [totalItems, activeItemsPerPage]);
1011
- const paginatedData = (0, import_react15.useMemo)(() => {
1012
- if (!data || data.length === 0) return [];
1013
- const startIndex = (currentPage - 1) * activeItemsPerPage;
1014
- const endIndex = startIndex + activeItemsPerPage;
1015
- return data.slice(startIndex, endIndex);
1016
- }, [data, currentPage, activeItemsPerPage]);
1017
- (0, import_react15.useEffect)(() => {
1018
- if (!isControlled && currentPage > calculatedTotalPages && calculatedTotalPages > 0) {
1019
- setInternalCurrentPage(1);
1020
- }
1021
- }, [calculatedTotalPages, isControlled, currentPage]);
1022
- const getPageNumbers = () => {
1023
- const pages = [];
1024
- const maxVisible = 5;
1025
- let startPage = Math.max(1, currentPage - Math.floor(maxVisible / 2));
1026
- let endPage = Math.min(calculatedTotalPages, startPage + maxVisible - 1);
1027
- if (endPage - startPage < maxVisible - 1) {
1028
- startPage = Math.max(1, endPage - maxVisible + 1);
1029
- }
1030
- for (let i = startPage; i <= endPage; i++) {
1031
- pages.push(i);
1032
- }
1033
- return pages;
1034
- };
1035
- const handlePageChange = (page) => {
1036
- if (page >= 1 && page <= calculatedTotalPages) {
1037
- if (isControlled && controlledOnPageChange) {
1038
- controlledOnPageChange(page);
1039
- } else if (legacyOnPageChange) {
1040
- legacyOnPageChange(page);
1041
- } else {
1042
- setInternalCurrentPage(page);
1043
- }
1044
- }
1045
- };
1046
- const startItem = totalItems !== void 0 ? (currentPage - 1) * activeItemsPerPage + 1 : null;
1047
- const endItem = totalItems !== void 0 ? Math.min(currentPage * activeItemsPerPage, totalItems) : null;
1048
- const renderContent = () => {
1049
- if (Component) {
1050
- if (import_react15.default.isValidElement(Component)) {
1051
- const ComponentType = Component.type;
1052
- const elementProps = Component.props;
1053
- if (isTable) {
1054
- return /* @__PURE__ */ import_react15.default.createElement(
1055
- CustomTable,
1056
- {
1057
- tableHeader,
1058
- isHideCheckbox
1059
- },
1060
- paginatedData.map((item, index) => {
1061
- return /* @__PURE__ */ import_react15.default.createElement(
1062
- ComponentType,
1063
- {
1064
- key: item.id || item._id || index,
1065
- data: item,
1066
- ...elementProps,
1067
- ...componentProps,
1068
- ...restProps
1069
- }
1070
- );
1071
- })
1072
- );
1073
- } else {
1074
- if (isTable) {
1075
- return /* @__PURE__ */ import_react15.default.createElement(
1076
- CustomTable,
1077
- {
1078
- tableHeader,
1079
- isHideCheckbox
1080
- },
1081
- paginatedData.map((item, index) => {
1082
- return /* @__PURE__ */ import_react15.default.createElement(
1083
- ComponentType,
1084
- {
1085
- key: item.id || item._id || index,
1086
- data: item,
1087
- ...elementProps,
1088
- ...componentProps,
1089
- ...restProps
1090
- }
1091
- );
1092
- })
1093
- );
1094
- }
1095
- }
1096
- } else {
1097
- return /* @__PURE__ */ import_react15.default.createElement(
1098
- CustomTable,
1099
- {
1100
- tableHeader,
1101
- isHideCheckbox
1102
- },
1103
- paginatedData.map((item, index) => {
1104
- return /* @__PURE__ */ import_react15.default.createElement(
1105
- Component,
1106
- {
1107
- key: item.id || item._id || index,
1108
- data: item,
1109
- ...componentProps,
1110
- ...restProps
1111
- }
1112
- );
1113
- })
1114
- );
1115
- }
1116
- }
1117
- return null;
1118
- };
1119
- return /* @__PURE__ */ import_react15.default.createElement(import_react15.default.Fragment, null, /* @__PURE__ */ import_react15.default.createElement(import_react15.default.Fragment, null, renderContent()), /* @__PURE__ */ import_react15.default.createElement("div", { className: "flex flex-col sm:flex-row justify-between items-center gap-4 px-4 py-3 border-t border-[#e5e5e5] dark:border-[#303036] bg-white dark:bg-[#18181b] z-10" }, totalItems !== void 0 && /* @__PURE__ */ import_react15.default.createElement("div", { className: "text-sm text-[#737373] dark:text-white" }, "Showing ", startItem, " to ", endItem, " of ", totalItems, " entries"), /* @__PURE__ */ import_react15.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react15.default.createElement(
1120
- "button",
1121
- {
1122
- onClick: () => handlePageChange(1),
1123
- disabled: currentPage === 1,
1124
- className: `flex items-center justify-center w-9 h-9 rounded-md border border-[#e5e5e5] dark:border-[#303036] text-sm transition-colors ${currentPage === 1 ? "bg-gray-100 text-gray-400 cursor-not-allowed dark:bg-[#27272a] dark:text-gray-600" : "bg-white text-black hover:bg-gray-50 cursor-pointer dark:bg-[#18181b] dark:text-white dark:hover:bg-[#27272a]"}`,
1125
- title: "First page"
1126
- },
1127
- /* @__PURE__ */ import_react15.default.createElement(import_lucide_react7.ChevronsLeft, { size: 16 })
1128
- ), /* @__PURE__ */ import_react15.default.createElement(
1129
- "button",
1130
- {
1131
- onClick: () => handlePageChange(currentPage - 1),
1132
- disabled: currentPage === 1,
1133
- className: `flex items-center justify-center w-9 h-9 rounded-md border border-[#e5e5e5] dark:border-[#303036] text-sm transition-colors ${currentPage === 1 ? "bg-gray-100 text-gray-400 cursor-not-allowed dark:bg-[#27272a] dark:text-gray-600" : "bg-white text-black hover:bg-gray-50 cursor-pointer dark:bg-[#18181b] dark:text-white dark:hover:bg-[#27272a]"}`,
1134
- title: "Previous page"
1135
- },
1136
- /* @__PURE__ */ import_react15.default.createElement(import_lucide_react7.ChevronLeft, { size: 16 })
1137
- ), getPageNumbers().map((pageNum) => /* @__PURE__ */ import_react15.default.createElement(
1138
- "button",
1139
- {
1140
- key: pageNum,
1141
- onClick: () => handlePageChange(pageNum),
1142
- className: `flex items-center justify-center min-w-9 h-9 px-3 rounded-md border border-[#e5e5e5] dark:border-[#303036] text-sm transition-colors ${currentPage === pageNum ? "bg-primary text-white border-primary dark:bg-primary" : "bg-white text-black hover:bg-gray-50 dark:bg-[#18181b] dark:text-white dark:hover:bg-[#27272a]"}`
1143
- },
1144
- pageNum
1145
- )), /* @__PURE__ */ import_react15.default.createElement(
1146
- "button",
1147
- {
1148
- onClick: () => handlePageChange(currentPage + 1),
1149
- disabled: currentPage === calculatedTotalPages || calculatedTotalPages === 0,
1150
- className: `flex items-center justify-center w-9 h-9 rounded-md border border-[#e5e5e5] dark:border-[#303036] text-sm transition-colors ${currentPage === calculatedTotalPages || calculatedTotalPages === 0 ? "bg-gray-100 text-gray-400 cursor-not-allowed dark:bg-[#27272a] dark:text-gray-600" : "bg-white text-black hover:bg-gray-50 cursor-pointer dark:bg-[#18181b] dark:text-white dark:hover:bg-[#27272a]"}`,
1151
- title: "Next page"
1152
- },
1153
- /* @__PURE__ */ import_react15.default.createElement(import_lucide_react7.ChevronRight, { size: 16 })
1154
- ), /* @__PURE__ */ import_react15.default.createElement(
1155
- "button",
1156
- {
1157
- onClick: () => handlePageChange(calculatedTotalPages),
1158
- disabled: currentPage === calculatedTotalPages || calculatedTotalPages === 0,
1159
- className: `flex items-center justify-center w-9 h-9 rounded-md border border-[#e5e5e5] dark:border-[#303036] text-sm transition-colors ${currentPage === calculatedTotalPages || calculatedTotalPages === 0 ? "bg-gray-100 text-gray-400 cursor-not-allowed dark:bg-[#27272a] dark:text-gray-600" : "bg-white text-black hover:bg-gray-50 cursor-pointer dark:bg-[#18181b] dark:text-white dark:hover:bg-[#27272a]"}`,
1160
- title: "Last page"
1161
- },
1162
- /* @__PURE__ */ import_react15.default.createElement(import_lucide_react7.ChevronsRight, { size: 16 })
1163
- ))));
1164
- };
1165
- // Annotate the CommonJS export names for ESM import in node:
1166
- 0 && (module.exports = {
1167
- AppSideBar,
1168
- Chip,
1169
- CustomAutocomplete,
1170
- CustomButton,
1171
- CustomCheckbox,
1172
- CustomInput,
1173
- CustomSearch,
1174
- CustomSelect,
1175
- CustomSwitch,
1176
- CustomTable,
1177
- CustomTextarea,
1178
- CustomUpload,
1179
- Pagination,
1180
- ProgressBar,
1181
- RightSheet
1182
- });
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
20
+ // If the importer is in node compatibility mode or this is not an ESM
21
+ // file that has been converted to a CommonJS file using a Babel-
22
+ // compatible transform (i.e. "__esModule" has not been set), then set
23
+ // "default" to the CommonJS "module.exports" for node compatibility.
24
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
25
+ mod
26
+ ));
27
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
28
+
29
+ // src/index.js
30
+ var index_exports = {};
31
+ __export(index_exports, {
32
+ AppSideBar: () => AppSideBar,
33
+ Chip: () => Chip,
34
+ CustomAutocomplete: () => CustomAutocomplete,
35
+ CustomButton: () => CustomButton,
36
+ CustomCheckbox: () => CustomCheckbox,
37
+ CustomInput: () => CustomInput,
38
+ CustomSearch: () => CustomSearch,
39
+ CustomSelect: () => CustomSelect,
40
+ CustomSwitch: () => CustomSwitch,
41
+ CustomTable: () => CustomTable,
42
+ CustomTextarea: () => CustomTextarea,
43
+ CustomUpload: () => CustomUpload,
44
+ Pagination: () => Pagination,
45
+ ProgressBar: () => ProgressBar,
46
+ RightSheet: () => RightSheet
47
+ });
48
+ module.exports = __toCommonJS(index_exports);
49
+
50
+ // src/utils/cn.ts
51
+ var import_clsx = require("clsx");
52
+ var import_tailwind_merge = require("tailwind-merge");
53
+ function cn(...inputs) {
54
+ return (0, import_tailwind_merge.twMerge)((0, import_clsx.clsx)(inputs));
55
+ }
56
+
57
+ // src/Button.jsx
58
+ var import_react = __toESM(require("react"));
59
+ var variantStyles = {
60
+ PRIMARY: "bg-white dark:bg-[#18181b] dark:text-white",
61
+ SECONDARY: "bg-primary text-white dark:text-white",
62
+ DEFAULT: "bg-white text-black dark:text-white",
63
+ DANGER: "bg-[#ef4444] text-white dark:text-white"
64
+ };
65
+ var CustomButton = ({
66
+ variant = "DEFAULT",
67
+ children,
68
+ className,
69
+ onClick,
70
+ disabled = false,
71
+ icon
72
+ }) => {
73
+ return /* @__PURE__ */ import_react.default.createElement(
74
+ "div",
75
+ {
76
+ className: cn(
77
+ `cursor-pointer flex items-center py-2 px-3 min-h-10 justify-center border rounded-[6px] border-[#e5e5e5] dark:border-[#303036] ${variant == "DANGER" ? "bg-[#ef4444]" : "dark:bg-[#1d1d20]"} gap-2`,
78
+ variantStyles[variant],
79
+ className
80
+ ),
81
+ onClick
82
+ },
83
+ icon && /* @__PURE__ */ import_react.default.createElement("div", null, icon),
84
+ children
85
+ );
86
+ };
87
+
88
+ // src/inputs/Autocomplete.jsx
89
+ var import_react2 = __toESM(require("react"));
90
+ var import_lucide_react = require("lucide-react");
91
+ var CustomAutocomplete = ({
92
+ label,
93
+ value,
94
+ onChange,
95
+ options,
96
+ placeholder = "Search & select...",
97
+ isRequired = false,
98
+ error,
99
+ heading,
100
+ disabled = false
101
+ }) => {
102
+ const [open, setOpen] = (0, import_react2.useState)(false);
103
+ const [search, setSearch] = (0, import_react2.useState)("");
104
+ const wrapperRef = (0, import_react2.useRef)(null);
105
+ const selectedOptions = options.filter((opt) => value.includes(opt.value));
106
+ const handleBlur = (e) => {
107
+ var _a;
108
+ if (!((_a = wrapperRef.current) == null ? void 0 : _a.contains(e.relatedTarget))) {
109
+ setOpen(false);
110
+ }
111
+ };
112
+ const filteredOptions = options.filter(
113
+ (opt) => opt.label.toLowerCase().includes(search.toLowerCase())
114
+ );
115
+ const toggleValue = (val) => {
116
+ if (value.includes(val)) {
117
+ onChange(value.filter((v) => v !== val));
118
+ } else {
119
+ onChange([...value, val]);
120
+ }
121
+ };
122
+ return /* @__PURE__ */ import_react2.default.createElement(
123
+ "div",
124
+ {
125
+ className: "flex flex-col w-full relative dark:bg-[#18181b] dark:text-white",
126
+ ref: wrapperRef,
127
+ tabIndex: disabled ? -1 : 0,
128
+ onBlur: handleBlur
129
+ },
130
+ heading && /* @__PURE__ */ import_react2.default.createElement("h3", { className: "text-lg font-semibold leading-6 mb-1" }, heading),
131
+ label && /* @__PURE__ */ import_react2.default.createElement(
132
+ "label",
133
+ {
134
+ className: `font-[500] text-sm leading-5 mb-1 ${heading ? "text-[#737373]" : "text-black dark:text-white"}`
135
+ },
136
+ label,
137
+ " ",
138
+ isRequired && /* @__PURE__ */ import_react2.default.createElement("span", { className: "text-red-500" }, "*")
139
+ ),
140
+ /* @__PURE__ */ import_react2.default.createElement(
141
+ "div",
142
+ {
143
+ onClick: () => {
144
+ if (!disabled) setOpen((prev) => !prev);
145
+ },
146
+ className: `flex justify-between items-center flex-wrap gap-1 rounded-md px-3 py-2 text-sm transition border dark:border-[#303036] h-auto min-h-10 dark:bg-[#18181b] dark:text-white
147
+ ${disabled ? "bg-gray-100 cursor-not-allowed text-gray-400" : "cursor-text"}
148
+ ${error ? "border-red-500 bg-red-50" : "bg-white border-[hsl(0_0%_89.8%)] hover:border-gray-400 dark:bg-[#18181b] dark:text-white"}
149
+ `
150
+ },
151
+ /* @__PURE__ */ import_react2.default.createElement("div", { className: "flex flex-wrap gap-1 flex-1" }, selectedOptions.length > 0 ? selectedOptions.map((opt) => /* @__PURE__ */ import_react2.default.createElement(
152
+ "span",
153
+ {
154
+ key: opt.value,
155
+ className: "bg-[#F7FAFC] dark:bg-[#303036] border border-gray-300 px-2 dark:text-white py-0.5 rounded text-xs flex items-center gap-1"
156
+ },
157
+ opt.label,
158
+ /* @__PURE__ */ import_react2.default.createElement(
159
+ "button",
160
+ {
161
+ onClick: (e) => {
162
+ e.stopPropagation();
163
+ toggleValue(opt.value);
164
+ },
165
+ className: "text-gray-500 hover:text-gray-700 dark:text-white cursor-pointer dark:hover:text-white"
166
+ },
167
+ "\u2715"
168
+ )
169
+ )) : /* @__PURE__ */ import_react2.default.createElement("span", { className: "text-gray-400" }, placeholder)),
170
+ /* @__PURE__ */ import_react2.default.createElement(
171
+ import_lucide_react.ChevronDown,
172
+ {
173
+ className: `w-4 h-4 text-gray-500 transition-transform ${open ? "rotate-180" : ""}`
174
+ }
175
+ )
176
+ ),
177
+ !disabled && open && /* @__PURE__ */ import_react2.default.createElement("div", { className: "absolute top-full mt-1 w-full bg-white border border-gray-200 rounded-lg shadow-lg z-10 max-h-60 overflow-y-auto dark:bg-[#18181b] dark:text-white" }, /* @__PURE__ */ import_react2.default.createElement("div", { className: "flex items-center gap-2 p-2 border-b border-gray-200" }, /* @__PURE__ */ import_react2.default.createElement(import_lucide_react.Search, { size: 16, className: "text-gray-400" }), /* @__PURE__ */ import_react2.default.createElement(
178
+ "input",
179
+ {
180
+ type: "text",
181
+ value: search,
182
+ onChange: (e) => setSearch(e.target.value),
183
+ placeholder: "Search...",
184
+ className: "flex-1 text-sm focus:outline-none"
185
+ }
186
+ )), /* @__PURE__ */ import_react2.default.createElement("ul", null, filteredOptions.length > 0 ? filteredOptions.map((opt) => {
187
+ const selected = value.includes(opt.value);
188
+ return /* @__PURE__ */ import_react2.default.createElement(
189
+ "li",
190
+ {
191
+ key: opt.value,
192
+ onClick: () => toggleValue(opt.value),
193
+ className: `flex items-center gap-2 px-3 py-2 text-sm cursor-pointer hover:bg-[#F7FAFC] dark:hover:bg-[#303036] ${selected ? "bg-[#F7FAFC] dark:bg-[#303036] font-medium" : ""}`
194
+ },
195
+ /* @__PURE__ */ import_react2.default.createElement(
196
+ "span",
197
+ {
198
+ className: `w-4 h-4 flex items-center justify-center border rounded-sm ${selected ? "bg-blue-600 border-blue-600 text-white" : "border-gray-300"}`
199
+ },
200
+ selected && /* @__PURE__ */ import_react2.default.createElement(import_lucide_react.Check, { size: 14 })
201
+ ),
202
+ opt.label
203
+ );
204
+ }) : /* @__PURE__ */ import_react2.default.createElement("li", { className: "px-3 py-2 text-sm text-gray-400" }, "No results found")))
205
+ );
206
+ };
207
+
208
+ // src/inputs/Checkbox.jsx
209
+ var import_react3 = __toESM(require("react"));
210
+ var CustomCheckbox = ({ onChange, checked }) => {
211
+ const handleChange = (e) => {
212
+ onChange(e.target.checked);
213
+ };
214
+ return /* @__PURE__ */ import_react3.default.createElement("label", { className: "inline-flex items-center cursor-pointer select-none" }, /* @__PURE__ */ import_react3.default.createElement(
215
+ "input",
216
+ {
217
+ type: "checkbox",
218
+ checked,
219
+ onChange: handleChange,
220
+ className: "peer hidden"
221
+ }
222
+ ), /* @__PURE__ */ import_react3.default.createElement(
223
+ "span",
224
+ {
225
+ className: "\r\n w-4 h-4 flex items-center justify-center border-2 border-gray-400 rounded \r\n peer-checked:bg-primary peer-checked:border-primary\r\n transition-colors\r\n "
226
+ },
227
+ checked && /* @__PURE__ */ import_react3.default.createElement(
228
+ "svg",
229
+ {
230
+ className: "w-4 h-4 text-white",
231
+ fill: "none",
232
+ stroke: "currentColor",
233
+ strokeWidth: "3",
234
+ viewBox: "0 0 24 24"
235
+ },
236
+ /* @__PURE__ */ import_react3.default.createElement("path", { d: "M5 13l4 4L19 7" })
237
+ )
238
+ ));
239
+ };
240
+
241
+ // src/inputs/Chip.jsx
242
+ var import_react4 = __toESM(require("react"));
243
+ var VARIANTS = {
244
+ PRIMARY: "bg-gray-100 text-black dark:bg-gray-800 dark:text-white",
245
+ GREEN: "bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-100",
246
+ RED: "bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-100",
247
+ YELLOW: "bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-100"
248
+ };
249
+ var Chip = ({ label, variant }) => {
250
+ return /* @__PURE__ */ import_react4.default.createElement(
251
+ "div",
252
+ {
253
+ className: `inline-flex text-[12px] items-center px-3 py-1 rounded-full ${VARIANTS[variant] || VARIANTS.PRIMARY} text-sm font-[600]`
254
+ },
255
+ label
256
+ );
257
+ };
258
+
259
+ // src/inputs/CustomSwitch.jsx
260
+ var import_react5 = __toESM(require("react"));
261
+ var CustomSwitch = ({ checked, onChange, label, description }) => {
262
+ return /* @__PURE__ */ import_react5.default.createElement("div", null, /* @__PURE__ */ import_react5.default.createElement(
263
+ "button",
264
+ {
265
+ type: "button",
266
+ role: "switch",
267
+ "aria-checked": checked,
268
+ onClick: () => onChange(!checked),
269
+ className: `relative inline-flex h-6 w-11 shrink-0 items-center rounded-full transition-colors ${checked ? "bg-black" : "bg-gray-300"}`
270
+ },
271
+ /* @__PURE__ */ import_react5.default.createElement(
272
+ "span",
273
+ {
274
+ className: `inline-block h-4 w-4 transform rounded-full bg-white shadow transition ${checked ? "translate-x-6" : "translate-x-1"}`
275
+ }
276
+ )
277
+ ), /* @__PURE__ */ import_react5.default.createElement("div", { className: "flex flex-col" }, label && /* @__PURE__ */ import_react5.default.createElement("h3", { className: "font-[500] text-sm text-black mb-2" }, label), description && /* @__PURE__ */ import_react5.default.createElement("p", { className: "font-[500] text-sm text-[#737373]" }, description)));
278
+ };
279
+
280
+ // src/inputs/Input.jsx
281
+ var import_react6 = __toESM(require("react"));
282
+ var CustomInput = ({
283
+ label,
284
+ isRequired,
285
+ value,
286
+ onChange,
287
+ placeholder,
288
+ disabled = false,
289
+ error,
290
+ heading
291
+ }) => {
292
+ return /* @__PURE__ */ import_react6.default.createElement("div", { className: "flex flex-col gap-1 w-full" }, heading && /* @__PURE__ */ import_react6.default.createElement("h3", { className: "text-lg font-semibold" }, heading), /* @__PURE__ */ import_react6.default.createElement(
293
+ "label",
294
+ {
295
+ className: `font-[500] text-sm ${heading ? "text-[#737373]" : "text-black"} dark:text-white`
296
+ },
297
+ label,
298
+ " ",
299
+ isRequired && /* @__PURE__ */ import_react6.default.createElement("span", { className: "text-red-500" }, "*")
300
+ ), /* @__PURE__ */ import_react6.default.createElement(
301
+ "input",
302
+ {
303
+ className: `border border-gray-200 rounded-md h-10 px-4 py-2 w-full text-[14px]
304
+ focus:outline-2 outline-black dark:outline-white outline-offset-2
305
+ dark:bg-transparent dark:text-white dark:border-[#303036]
306
+ ${disabled ? "bg-gray-100 cursor-not-allowed text-gray-500 border-gray-300" : error ? "border-red-500 bg-red-50" : "bg-white border-[hsl(0_0%_89.8%)]"}
307
+ `,
308
+ value,
309
+ onChange: (e) => onChange == null ? void 0 : onChange(e.target.value),
310
+ placeholder,
311
+ disabled,
312
+ readOnly: disabled
313
+ }
314
+ ));
315
+ };
316
+
317
+ // src/inputs/ProgressBar.jsx
318
+ var import_react7 = __toESM(require("react"));
319
+ var ProgressBar = ({ step, totalSteps }) => {
320
+ const progress = step / totalSteps * 100;
321
+ return /* @__PURE__ */ import_react7.default.createElement("div", { className: "mb-6" }, /* @__PURE__ */ import_react7.default.createElement("p", { className: "text-gray-600 text-sm mb-2" }, "Step ", step, " of ", totalSteps), /* @__PURE__ */ import_react7.default.createElement("div", { className: "w-full bg-gray-200 rounded-full h-2" }, /* @__PURE__ */ import_react7.default.createElement(
322
+ "div",
323
+ {
324
+ className: "bg-black h-2 rounded-full transition-all duration-300",
325
+ style: { width: `${progress}%` }
326
+ }
327
+ )));
328
+ };
329
+
330
+ // src/inputs/Search.jsx
331
+ var import_react8 = __toESM(require("react"));
332
+ var import_lucide_react2 = require("lucide-react");
333
+ var CustomSearch = ({
334
+ value,
335
+ onChange,
336
+ placeholder = "Search Markets..."
337
+ }) => {
338
+ return /* @__PURE__ */ import_react8.default.createElement("div", { className: "flex items-center border bg-transparent text-[14px] border-[hsl(0_0%_89.8%)] dark:border-[#303036] \r\n rounded-md h-10 px-2 w-full focus-within:outline-2 focus-within:outline-black focus-within:outline-offset-2 dark:text-white" }, /* @__PURE__ */ import_react8.default.createElement(import_lucide_react2.Search, { width: 16, height: 16, color: "gray", className: "mr-2" }), /* @__PURE__ */ import_react8.default.createElement(
339
+ "input",
340
+ {
341
+ type: "text",
342
+ value,
343
+ onChange,
344
+ placeholder,
345
+ className: "bg-transparent w-full h-full focus:outline-none"
346
+ }
347
+ ));
348
+ };
349
+
350
+ // src/inputs/TextArea.jsx
351
+ var import_react9 = __toESM(require("react"));
352
+ var CustomTextarea = ({
353
+ label,
354
+ isRequired,
355
+ value,
356
+ onChange,
357
+ placeholder,
358
+ disabled = false,
359
+ error,
360
+ heading,
361
+ rows = 4
362
+ }) => {
363
+ return /* @__PURE__ */ import_react9.default.createElement("div", { className: "flex flex-col gap-1 w-full" }, heading && /* @__PURE__ */ import_react9.default.createElement("h3", { className: "text-lg font-semibold" }, heading), /* @__PURE__ */ import_react9.default.createElement(
364
+ "label",
365
+ {
366
+ className: `font-[500] text-sm ${heading ? "text-[#737373]" : "text-black"}`
367
+ },
368
+ label,
369
+ " ",
370
+ isRequired && /* @__PURE__ */ import_react9.default.createElement("span", { className: "text-red-500" }, "*")
371
+ ), /* @__PURE__ */ import_react9.default.createElement(
372
+ "textarea",
373
+ {
374
+ rows,
375
+ className: `border rounded-md px-4 py-2 w-full text-[14px]
376
+ focus:outline-2 focus:outline-black focus:outline-offset-2
377
+ focus:ring-0 focus:shadow-none focus:border-black
378
+ ${disabled ? "bg-gray-100 text-gray-500 border-gray-300" : error ? "border-red-500 bg-red-50" : "bg-white border-[hsl(0_0%_89.8%)]"}
379
+ `,
380
+ value,
381
+ onChange: (e) => onChange == null ? void 0 : onChange(e.target.value),
382
+ placeholder,
383
+ disabled,
384
+ readOnly: disabled
385
+ }
386
+ ));
387
+ };
388
+
389
+ // src/inputs/Upload.jsx
390
+ var import_react10 = __toESM(require("react"));
391
+ var import_lucide_react3 = require("lucide-react");
392
+ var CustomUpload = ({
393
+ label = "Supporting documents",
394
+ description = "Drop items here or Browse Files",
395
+ accept = ".pdf,.jpg,.jpeg,.png",
396
+ maxSizeMB = 5,
397
+ onChange,
398
+ error,
399
+ value
400
+ }) => {
401
+ const inputRef = (0, import_react10.useRef)(null);
402
+ const handleFileSelect = (files) => {
403
+ if (!files || files.length === 0) return;
404
+ const selectedFile = files[0];
405
+ if (selectedFile.size > maxSizeMB * 1024 * 1024) {
406
+ alert(`File size must be less than ${maxSizeMB} MB`);
407
+ return;
408
+ }
409
+ onChange == null ? void 0 : onChange(selectedFile);
410
+ };
411
+ return /* @__PURE__ */ import_react10.default.createElement("div", { className: "flex flex-col gap-2 w-full" }, label && /* @__PURE__ */ import_react10.default.createElement("label", { className: "text-sm font-medium" }, label), /* @__PURE__ */ import_react10.default.createElement(
412
+ "div",
413
+ {
414
+ className: `border-2 border-dashed rounded-lg p-6 flex flex-col items-center justify-center text-center cursor-pointer transition
415
+ ${error ? "border-red-500 bg-red-50" : "border-gray-300 hover:border-gray-400 bg-gray-50"}`,
416
+ onClick: () => {
417
+ var _a;
418
+ return (_a = inputRef.current) == null ? void 0 : _a.click();
419
+ },
420
+ onDragOver: (e) => e.preventDefault(),
421
+ onDrop: (e) => {
422
+ e.preventDefault();
423
+ handleFileSelect(e.dataTransfer.files);
424
+ }
425
+ },
426
+ /* @__PURE__ */ import_react10.default.createElement(import_lucide_react3.Upload, { className: "w-6 h-6 text-gray-500 mb-2" }),
427
+ /* @__PURE__ */ import_react10.default.createElement("p", { className: "text-sm text-gray-700" }, description),
428
+ /* @__PURE__ */ import_react10.default.createElement("p", { className: "text-xs text-gray-500 mt-1" }, "File Supported: PDF/JPG/PNG, up to ", maxSizeMB, " MB"),
429
+ /* @__PURE__ */ import_react10.default.createElement(
430
+ "input",
431
+ {
432
+ ref: inputRef,
433
+ type: "file",
434
+ accept,
435
+ className: "hidden",
436
+ onChange: (e) => handleFileSelect(e.target.files)
437
+ }
438
+ )
439
+ ), value && /* @__PURE__ */ import_react10.default.createElement("span", { className: "text-sm truncate text-gray-500" }, "Selected: ", value.name), error && /* @__PURE__ */ import_react10.default.createElement("p", { className: "text-xs text-red-500" }, error));
440
+ };
441
+
442
+ // src/sideBar/SideBar.jsx
443
+ var import_lucide_react6 = require("lucide-react");
444
+ var import_react12 = __toESM(require("react"));
445
+
446
+ // ConstantUI.js
447
+ var import_lucide_react4 = require("lucide-react");
448
+ var encodedAuthData = localStorage.getItem("encodedAuthData");
449
+ var navItemsConstant = [
450
+ {
451
+ Icon: import_lucide_react4.Home,
452
+ label: "Home",
453
+ onClick: () => {
454
+ window.location.href = "/";
455
+ },
456
+ isDropDown: false
457
+ },
458
+ {
459
+ Icon: import_lucide_react4.Globe,
460
+ label: "TMC Ecosystem",
461
+ onClick: () => {
462
+ },
463
+ isDropDown: true,
464
+ options: [
465
+ {
466
+ label: "Markets",
467
+ onClick: () => {
468
+ window.location.href = "/market/";
469
+ }
470
+ },
471
+ {
472
+ label: "Users",
473
+ onClick: () => {
474
+ window.location.href = `/users/users?role=admin&auth=${encodedAuthData}`;
475
+ }
476
+ },
477
+ {
478
+ label: "Supplier Ecosystem",
479
+ onClick: () => {
480
+ window.location.href = "/supplier/";
481
+ }
482
+ }
483
+ ]
484
+ },
485
+ {
486
+ Icon: import_lucide_react4.Building,
487
+ label: "Consumer Ecosystem",
488
+ onClick: () => {
489
+ },
490
+ options: [
491
+ {
492
+ label: "Corporate",
493
+ onClick: () => {
494
+ window.location.href = "/corporate/";
495
+ }
496
+ },
497
+ {
498
+ label: "Trips",
499
+ onClick: () => {
500
+ window.location.href = "/trips/";
501
+ }
502
+ },
503
+ {
504
+ label: "Booking History",
505
+ onClick: () => {
506
+ window.location.href = "/finance/bookingHistory/";
507
+ }
508
+ },
509
+ {
510
+ label: "Reports",
511
+ onClick: () => {
512
+ window.open("https://viz.jett.travel", "_blank");
513
+ }
514
+ },
515
+ {
516
+ label: "Users",
517
+ onClick: () => {
518
+ window.location.href = "/orgselector/?path=users";
519
+ }
520
+ },
521
+ {
522
+ label: "Tags",
523
+ onClick: () => {
524
+ window.location.href = "/orgselector/?path=tag";
525
+ }
526
+ },
527
+ {
528
+ label: "Payment Ledger",
529
+ onClick: () => {
530
+ window.location.href = "/finance/paymentsLedger/";
531
+ }
532
+ },
533
+ {
534
+ label: "Special Request",
535
+ onClick: () => {
536
+ window.location.href = "/orgselector/?path=special-requests";
537
+ }
538
+ }
539
+ ],
540
+ isDropDown: true
541
+ },
542
+ {
543
+ Icon: import_lucide_react4.DollarSign,
544
+ label: "Revenue Management",
545
+ onClick: () => {
546
+ },
547
+ isDropDown: true,
548
+ options: [
549
+ {
550
+ label: "Pricing Policy",
551
+ onClick: () => {
552
+ window.location.href = "/orgselector/?path=pricing-policy";
553
+ }
554
+ },
555
+ {
556
+ label: "Offers",
557
+ onClick: () => {
558
+ window.location.href = "/orgselector/?path=offer";
559
+ }
560
+ },
561
+ {
562
+ label: "Vouchers",
563
+ onClick: () => {
564
+ window.location.href = "/orgselector/?path=voucher";
565
+ }
566
+ },
567
+ {
568
+ label: "Supplier Deals",
569
+ onClick: () => {
570
+ window.location.href = "/supplierdeals/";
571
+ }
572
+ },
573
+ {
574
+ label: "Invoices",
575
+ onClick: () => {
576
+ window.location.href = "/finance/invoices/";
577
+ }
578
+ }
579
+ ]
580
+ },
581
+ {
582
+ Icon: import_lucide_react4.Cog,
583
+ label: "Settings",
584
+ onClick: () => {
585
+ },
586
+ isDropDown: true,
587
+ options: [
588
+ {
589
+ label: "Whitelabel",
590
+ onClick: () => {
591
+ window.location.href = "/whitelabel/";
592
+ }
593
+ }
594
+ ]
595
+ }
596
+ ];
597
+ var additionalItemsConstant = [
598
+ {
599
+ Icon: import_lucide_react4.LifeBuoy,
600
+ label: "Help",
601
+ onClick: () => {
602
+ window.location.href = "/help";
603
+ }
604
+ }
605
+ ];
606
+
607
+ // src/assests/logo/logo-white.svg
608
+ var logo_white_default = "./logo-white-RYMEJOWI.svg";
609
+
610
+ // src/sideBar/SideBar.jsx
611
+ var import_js_cookie = __toESM(require("js-cookie"));
612
+
613
+ // src/inputs/CustomSelect.jsx
614
+ var import_react11 = __toESM(require("react"));
615
+ var import_lucide_react5 = require("lucide-react");
616
+ var CustomSelect = ({
617
+ label,
618
+ value,
619
+ onChange,
620
+ options,
621
+ placeholder = "Select...",
622
+ isRequired = false,
623
+ error,
624
+ heading,
625
+ disabled = false
626
+ }) => {
627
+ const [open, setOpen] = (0, import_react11.useState)(false);
628
+ const [search, setSearch] = (0, import_react11.useState)("");
629
+ const wrapperRef = (0, import_react11.useRef)(null);
630
+ const handleBlur = (e) => {
631
+ var _a;
632
+ if (!((_a = wrapperRef.current) == null ? void 0 : _a.contains(e.relatedTarget))) {
633
+ setOpen(false);
634
+ }
635
+ };
636
+ const filteredOptions = options.filter(
637
+ (opt) => opt.label.toLowerCase().includes(search.toLowerCase())
638
+ );
639
+ const handleSelect = (val) => {
640
+ onChange(val);
641
+ setOpen(false);
642
+ };
643
+ const selectedOption = options.find((opt) => opt.value === value);
644
+ return /* @__PURE__ */ import_react11.default.createElement(
645
+ "div",
646
+ {
647
+ className: "flex flex-col w-full relative",
648
+ ref: wrapperRef,
649
+ tabIndex: disabled ? -1 : 0,
650
+ onBlur: handleBlur
651
+ },
652
+ heading && /* @__PURE__ */ import_react11.default.createElement("h3", { className: "text-lg font-semibold mb-1" }, heading),
653
+ label && /* @__PURE__ */ import_react11.default.createElement(
654
+ "label",
655
+ {
656
+ className: `font-medium text-sm mb-1 ${heading ? "text-[#737373] dark:text-white" : "text-black dark:text-white"}`
657
+ },
658
+ label,
659
+ " ",
660
+ isRequired && /* @__PURE__ */ import_react11.default.createElement("span", { className: "text-red-500" }, "*")
661
+ ),
662
+ /* @__PURE__ */ import_react11.default.createElement(
663
+ "div",
664
+ {
665
+ onClick: () => !disabled && setOpen((prev) => !prev),
666
+ className: `flex justify-between items-center rounded-md px-3 py-2 text-sm border h-10 cursor-pointer dark:border-[#303036] dark:bg-[#18181b] dark:text-white
667
+ ${disabled ? "bg-gray-100 text-gray-400" : "bg-white dark:bg-[#18181b] dark:text-white"}
668
+ ${error ? "border-red-500" : "border-gray-300"}
669
+ `
670
+ },
671
+ /* @__PURE__ */ import_react11.default.createElement("span", { className: `${selectedOption ? "text-black dark:text-white" : "text-gray-400 dark:text-white"}` }, selectedOption ? selectedOption.label : placeholder),
672
+ /* @__PURE__ */ import_react11.default.createElement(
673
+ import_lucide_react5.ChevronDown,
674
+ {
675
+ className: `w-4 h-4 text-gray-500 transition-transform dark:text-white ${open ? "rotate-180" : ""}`
676
+ }
677
+ )
678
+ ),
679
+ open && !disabled && /* @__PURE__ */ import_react11.default.createElement("div", { className: "absolute top-full mt-1 w-full bg-white border border-gray-200 rounded-lg shadow-lg z-10 max-h-60 overflow-y-auto dark:bg-[#18181b] dark:text-white" }, /* @__PURE__ */ import_react11.default.createElement("div", { className: "flex items-center gap-2 p-2 border-b border-gray-200" }, /* @__PURE__ */ import_react11.default.createElement(import_lucide_react5.Search, { size: 16, className: "text-gray-400" }), /* @__PURE__ */ import_react11.default.createElement(
680
+ "input",
681
+ {
682
+ type: "text",
683
+ value: search,
684
+ onChange: (e) => setSearch(e.target.value),
685
+ placeholder: "Search...",
686
+ className: "flex-1 text-sm focus:outline-none"
687
+ }
688
+ )), /* @__PURE__ */ import_react11.default.createElement("ul", null, filteredOptions.length > 0 ? filteredOptions.map((opt) => /* @__PURE__ */ import_react11.default.createElement(
689
+ "li",
690
+ {
691
+ key: opt.value,
692
+ onClick: () => handleSelect(opt.value),
693
+ className: `px-3 py-2 text-sm cursor-pointer hover:bg-gray-100 dark:hover:bg-[#27272a] ${value === opt.value ? "bg-gray-100 font-medium dark:bg-[#27272a] dark:text-white" : ""}`
694
+ },
695
+ opt.label
696
+ )) : /* @__PURE__ */ import_react11.default.createElement("li", { className: "px-3 py-2 text-sm text-gray-400 dark:text-white" }, "No results found")))
697
+ );
698
+ };
699
+
700
+ // src/sideBar/SideBar.jsx
701
+ var AppSideBar = ({
702
+ username,
703
+ role,
704
+ navItems,
705
+ additionalItems,
706
+ sideBarLogo
707
+ }) => {
708
+ var _a, _b;
709
+ const [authData, setAuthData] = (0, import_react12.useState)(null);
710
+ const [selectedCountry, setSelectedCountry] = (0, import_react12.useState)("dubai");
711
+ const [isMobileMenuOpen, setIsMobileMenuOpen] = (0, import_react12.useState)(false);
712
+ const [currAppearance, setCurrAppearance] = (0, import_react12.useState)("light");
713
+ (0, import_react12.useEffect)(() => {
714
+ setCurrAppearance("light");
715
+ localStorage.setItem("themeMode", "light");
716
+ }, []);
717
+ const countryOptions = [
718
+ { label: "India", value: "india" },
719
+ { label: "Dubai", value: "dubai" },
720
+ { label: "Singapore", value: "singapore" },
721
+ { label: "Qatar", value: "qatar" }
722
+ ];
723
+ const handleIconRotate = (e, index, additionalKey, parentIndex) => {
724
+ let dropDownIcon = e.currentTarget.children[2];
725
+ if (!dropDownIcon) return;
726
+ if (dropDownIcon.classList.contains("rotate-180")) {
727
+ dropDownIcon.classList.remove("rotate-180");
728
+ } else {
729
+ dropDownIcon.classList.add("transition-all");
730
+ dropDownIcon.classList.add("rotate-180");
731
+ }
732
+ const optionsContainer = document.getElementById(
733
+ `dropDownOptions-${index}${additionalKey ? `-${additionalKey}` : ""}${parentIndex ? `-${parentIndex}` : ""}`
734
+ );
735
+ if (!optionsContainer) return;
736
+ optionsContainer.classList.add("transition-all");
737
+ if (optionsContainer.classList.contains("max-h-0")) {
738
+ optionsContainer.classList.remove("max-h-0");
739
+ optionsContainer.classList.add("min-h-[50px]");
740
+ } else {
741
+ optionsContainer.classList.remove("min-h-[50px]");
742
+ optionsContainer.classList.add("max-h-0");
743
+ }
744
+ };
745
+ (0, import_react12.useEffect)(() => {
746
+ const storedAuthData = localStorage.getItem("authData");
747
+ if (storedAuthData) {
748
+ let parseData = JSON.parse(storedAuthData);
749
+ setAuthData(parseData);
750
+ }
751
+ }, [localStorage.getItem("authData")]);
752
+ const navItemsLocal = navItems ?? navItemsConstant;
753
+ const additionalItemsLocal = additionalItems ?? additionalItemsConstant;
754
+ const sideBarLogoLocal = sideBarLogo ?? logo_white_default;
755
+ const toggleMobileMenu = () => {
756
+ setIsMobileMenuOpen(!isMobileMenuOpen);
757
+ };
758
+ const closeMobileMenu = () => {
759
+ setIsMobileMenuOpen(false);
760
+ };
761
+ return /* @__PURE__ */ import_react12.default.createElement(import_react12.default.Fragment, null, /* @__PURE__ */ import_react12.default.createElement("div", { className: "fixed top-0 left-0 w-full z-50 flex items-center justify-between px-4 py-3 bg-white dark:bg-[#18181b] border-b border-gray-200 dark:border-[#303036] shadow-lg md:hidden" }, /* @__PURE__ */ import_react12.default.createElement(
762
+ "button",
763
+ {
764
+ onClick: toggleMobileMenu,
765
+ className: "p-2 rounded-lg hover:bg-gray-50 dark:hover:bg-[#27272a] transition-colors",
766
+ "aria-label": "Toggle menu"
767
+ },
768
+ isMobileMenuOpen ? /* @__PURE__ */ import_react12.default.createElement(import_lucide_react6.X, { className: "w-6 h-6 text-gray-700 dark:text-[#f4f4f5cc]" }) : /* @__PURE__ */ import_react12.default.createElement(import_lucide_react6.Menu, { className: "w-6 h-6 text-gray-700 dark:text-[#f4f4f5cc]" })
769
+ ), /* @__PURE__ */ import_react12.default.createElement("div", { className: "flex-1 flex justify-center" }, sideBarLogo && /* @__PURE__ */ import_react12.default.createElement(
770
+ "img",
771
+ {
772
+ src: sideBarLogo,
773
+ alt: "sidebarLogo",
774
+ width: 108,
775
+ height: 40,
776
+ className: "object-contain"
777
+ }
778
+ )), /* @__PURE__ */ import_react12.default.createElement("div", { className: "w-10" })), isMobileMenuOpen && /* @__PURE__ */ import_react12.default.createElement(
779
+ "div",
780
+ {
781
+ className: "fixed inset-0 bg-black/80 bg-opacity-50 z-40 md:hidden",
782
+ onClick: closeMobileMenu
783
+ }
784
+ ), /* @__PURE__ */ import_react12.default.createElement(
785
+ "div",
786
+ {
787
+ className: `fixed top-0 left-0 md:relative w-[320px] transition-all ease-in-out delay-100 bg-white dark:bg-[#18181b] border-r border-gray-200 dark:border-[#303036] flex flex-col p-4 pt-20 md:pt-4 h-full max-h-[100vh] xs:max-md:z-40 md:max-lg:w-[280px] ${isMobileMenuOpen ? "translate-x-0" : "-translate-x-full md:translate-x-0"}`
788
+ },
789
+ /* @__PURE__ */ import_react12.default.createElement("div", { className: "p-2 mb-2 hidden md:block" }, /* @__PURE__ */ import_react12.default.createElement("div", { className: "flex items-center justify-center w-full h-[60px] mb-2" }, sideBarLogo && /* @__PURE__ */ import_react12.default.createElement(
790
+ "img",
791
+ {
792
+ src: sideBarLogo,
793
+ alt: "sidebarLogo",
794
+ width: 108,
795
+ height: 40,
796
+ className: "object-contain"
797
+ }
798
+ ))),
799
+ /* @__PURE__ */ import_react12.default.createElement("div", { className: "mb-4" }),
800
+ /* @__PURE__ */ import_react12.default.createElement("div", { className: "overflow-y-auto scrollbar-hide" }, /* @__PURE__ */ import_react12.default.createElement("div", null, navItemsLocal == null ? void 0 : navItemsLocal.map((item, index) => {
801
+ return /* @__PURE__ */ import_react12.default.createElement("div", { key: index, className: "" }, /* @__PURE__ */ import_react12.default.createElement(
802
+ "div",
803
+ {
804
+ className: "flex items-center gap-3 p-2.5 hover:bg-[#f4f4f5] dark:hover:bg-[#27272a] text-gray-700 dark:text-[#f4f4f5cc] cursor-pointer rounded-lg ml-2 mr-2 transition-colors duration-200",
805
+ onClick: (e) => {
806
+ item.onClick && item.onClick(e);
807
+ handleIconRotate(e, index);
808
+ if (!item.isDropDown) {
809
+ closeMobileMenu();
810
+ }
811
+ }
812
+ },
813
+ /* @__PURE__ */ import_react12.default.createElement("div", { className: "text-primary" }, /* @__PURE__ */ import_react12.default.createElement(item.Icon, { width: 20, height: 20 })),
814
+ /* @__PURE__ */ import_react12.default.createElement("span", { className: "font-medium text-[16px] text-[#000] dark:text-[#f4f4f5cc]" }, item.label),
815
+ item.isDropDown && /* @__PURE__ */ import_react12.default.createElement("div", { className: `ml-auto transition-all delay-75` }, /* @__PURE__ */ import_react12.default.createElement(import_lucide_react6.ChevronDown, { width: 20, height: 20, className: "text-gray-500 dark:text-gray-400" }))
816
+ ), item.options && item.options.length > 0 && /* @__PURE__ */ import_react12.default.createElement(
817
+ "div",
818
+ {
819
+ className: "ml-[20px] max-h-0 overflow-hidden flex flex-col",
820
+ id: `dropDownOptions-${index}`
821
+ },
822
+ item.options.map((options, optionsIndex) => {
823
+ return /* @__PURE__ */ import_react12.default.createElement("div", { className: "" }, /* @__PURE__ */ import_react12.default.createElement(
824
+ "div",
825
+ {
826
+ className: "flex items-center gap-3 py-2 px-3 ml-4 mr-2 hover:bg-[#f4f4f5] dark:hover:bg-[#27272a] text-gray-600 dark:text-[#a1a1aa] cursor-pointer rounded-md transition-colors duration-200",
827
+ onClick: (e) => {
828
+ options.onClick && options.onClick();
829
+ options.isDropDown && handleIconRotate(
830
+ e,
831
+ optionsIndex,
832
+ "subOption",
833
+ index
834
+ );
835
+ if (!options.isDropDown) {
836
+ closeMobileMenu();
837
+ }
838
+ }
839
+ },
840
+ /* @__PURE__ */ import_react12.default.createElement("div", null),
841
+ /* @__PURE__ */ import_react12.default.createElement("span", { className: "font-medium text-[#3f3f46cc] text-sm dark:text-[#a1a1aa]" }, options.label),
842
+ options.isDropDown && /* @__PURE__ */ import_react12.default.createElement(
843
+ "div",
844
+ {
845
+ className: `ml-auto transition-all delay-75`
846
+ },
847
+ /* @__PURE__ */ import_react12.default.createElement(import_lucide_react6.ChevronDown, { width: 18, height: 18, className: "text-gray-400 dark:text-gray-500" })
848
+ )
849
+ ), options.options && options.options.length > 1 && /* @__PURE__ */ import_react12.default.createElement(
850
+ "div",
851
+ {
852
+ className: "ml-[20px] max-h-0 overflow-hidden flex flex-col",
853
+ id: `dropDownOptions-${optionsIndex}-subOption-${index}`
854
+ },
855
+ options.options.map((subOption) => {
856
+ return /* @__PURE__ */ import_react12.default.createElement(
857
+ "div",
858
+ {
859
+ className: "py-1.5 px-3 rounded-md hover:bg-[#f4f4f5] dark:hover:bg-[#27272a] text-gray-500 dark:text-[#71717a] font-medium text-sm cursor-pointer ml-8 mr-2 transition-colors duration-200",
860
+ onClick: (e) => {
861
+ subOption.onClick && subOption.onClick();
862
+ closeMobileMenu();
863
+ }
864
+ },
865
+ subOption.label
866
+ );
867
+ })
868
+ ));
869
+ })
870
+ ));
871
+ }))),
872
+ /* @__PURE__ */ import_react12.default.createElement("div", { className: "mt-auto bg-[#fafafa] dark:bg-[#18181b] sticky bottom-0 mt-2" }, /* @__PURE__ */ import_react12.default.createElement(
873
+ "div",
874
+ {
875
+ className: "flex items-center justify-between p-2 rounded-lg hover:bg-[#f4f4f5] dark:hover:bg-[#27272a] cursor-pointer transition-colors duration-200",
876
+ onClick: () => {
877
+ window.location.href = "/profile";
878
+ }
879
+ },
880
+ /* @__PURE__ */ import_react12.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ import_react12.default.createElement("span", { className: "relative flex shrink-0 overflow-hidden dark:bg-[#27272a] rounded-full h-10 w-10" }, /* @__PURE__ */ import_react12.default.createElement("span", { className: "flex h-full w-full items-center justify-center rounded-full bg-muted dark:text-white" }, ((_a = authData == null ? void 0 : authData.userInfo) == null ? void 0 : _a.UserName) ? authData.userInfo.UserName.split("")[0] : "A")), /* @__PURE__ */ import_react12.default.createElement("div", null, /* @__PURE__ */ import_react12.default.createElement("p", { className: "font-semibold dark:text-white" }, ((_b = authData == null ? void 0 : authData.userInfo) == null ? void 0 : _b.UserName) ? authData.userInfo.UserName : "Admin User"), /* @__PURE__ */ import_react12.default.createElement("p", { className: "text-sm dark:text-[#f4f4f5cc]" }, role)))
881
+ ))
882
+ ));
883
+ };
884
+
885
+ // src/RightSheet/RightSheet.jsx
886
+ var import_react13 = __toESM(require("react"));
887
+ var RightSheet = ({
888
+ open,
889
+ setOpen,
890
+ children,
891
+ callBack,
892
+ actionLabel = "Save",
893
+ onAction = () => {
894
+ }
895
+ }) => {
896
+ const [visible, setVisible] = (0, import_react13.useState)(open);
897
+ (0, import_react13.useEffect)(() => {
898
+ if (open) {
899
+ document.body.style.overflow = "hidden";
900
+ setVisible(true);
901
+ }
902
+ return () => {
903
+ document.body.style.overflow = "auto";
904
+ };
905
+ }, [open]);
906
+ const handleClose = () => {
907
+ setVisible(false);
908
+ setTimeout(() => {
909
+ setOpen(false);
910
+ callBack();
911
+ }, 200);
912
+ };
913
+ const handleAction = () => {
914
+ onAction();
915
+ handleClose();
916
+ };
917
+ if (!visible) return null;
918
+ return /* @__PURE__ */ import_react13.default.createElement(
919
+ "div",
920
+ {
921
+ className: "fixed inset-0 overflow-x-hidden bg-black/80 sheetPopIn h-full overflow-auto ",
922
+ onClick: handleClose
923
+ },
924
+ /* @__PURE__ */ import_react13.default.createElement(
925
+ "div",
926
+ {
927
+ className: `absolute flex flex-col right-0 top-0 min-h-full min-w-[100%] md:min-w-[576px]
928
+ ${visible ? "sheetRightSlide" : "transition-all duration-200 translate-x-[100%]"} justify-between bg-[#fff] dark:bg-[#18181b] dark:text-white`,
929
+ onClick: (e) => e.stopPropagation()
930
+ },
931
+ /* @__PURE__ */ import_react13.default.createElement("div", { className: " min-h-full " }, children),
932
+ /* @__PURE__ */ import_react13.default.createElement("div", { className: "h-[90px] flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2 p-6 border-t sticky bottom-0 bg-white border-[#e6e6e6] dark:border-[#303036] dark:bg-[#18181b] dark:text-white" }, /* @__PURE__ */ import_react13.default.createElement(CustomButton, { variant: "SECONDARY", onClick: () => handleClose() }, "Cancel"), /* @__PURE__ */ import_react13.default.createElement(CustomButton, { variant: "SECONDARY", onClick: handleAction }, actionLabel))
933
+ )
934
+ );
935
+ };
936
+
937
+ // src/Table/CustomTable.jsx
938
+ var import_react14 = __toESM(require("react"));
939
+ var CustomTable = ({
940
+ tableHeader,
941
+ setIsAllChecked,
942
+ isAllChecked,
943
+ children,
944
+ isHideCheckbox = "false"
945
+ }) => {
946
+ return /* @__PURE__ */ import_react14.default.createElement("div", { className: "border border-[#e5e5e5] dark:border-[#303036] rounded-lg overflow-x-auto" }, /* @__PURE__ */ import_react14.default.createElement("div", { className: "w-full relative overflow-x-auto" }, /* @__PURE__ */ import_react14.default.createElement("table", { className: "w-full caption-bottom text-sm overflow-x-auto bg-white dark:bg-[#18181b] table-fixed border-collapse" }, /* @__PURE__ */ import_react14.default.createElement("thead", { className: "border-b border-[#e5e5e5] dark:border-[#303036] dark:bg-[#18181b]" }, /* @__PURE__ */ import_react14.default.createElement(
947
+ "tr",
948
+ {
949
+ className: "transition-colors text-[#737373] hover:bg-muted/50 \r\n data-[state=selected]:bg-muted"
950
+ },
951
+ !isHideCheckbox && /* @__PURE__ */ import_react14.default.createElement("th", { className: "px-4 py-3 text-left w-[50px]" }, /* @__PURE__ */ import_react14.default.createElement(
952
+ CustomCheckbox,
953
+ {
954
+ checked: isAllChecked,
955
+ onChange: () => {
956
+ setIsAllChecked(!isAllChecked);
957
+ }
958
+ }
959
+ )),
960
+ tableHeader.map((header, index) => {
961
+ return /* @__PURE__ */ import_react14.default.createElement(
962
+ "th",
963
+ {
964
+ className: `text-[#737373] px-4 py-3 text-sm dark:bg-[#18181b] font-medium ${index == tableHeader.length - 1 ? "text-right" : "text-left"}`,
965
+ key: header + index
966
+ },
967
+ header
968
+ );
969
+ })
970
+ )), /* @__PURE__ */ import_react14.default.createElement("tbody", null, children))));
971
+ };
972
+
973
+ // src/Pagination/Pagination.jsx
974
+ var import_react15 = __toESM(require("react"));
975
+ var import_lucide_react7 = require("lucide-react");
976
+ var Pagination = ({
977
+ data = [],
978
+ component: Component,
979
+ itemsPerPage = 6,
980
+ itemsPerPageOptions = [5, 10, 20, 50, 100],
981
+ // Controlled props (optional)
982
+ currentPage: controlledCurrentPage,
983
+ onPageChange: controlledOnPageChange,
984
+ onItemsPerPageChange: controlledOnItemsPerPageChange,
985
+ // Legacy props for backward compatibility
986
+ totalPages,
987
+ totalItems: legacyTotalItems,
988
+ onPageChange: legacyOnPageChange,
989
+ onItemsPerPageChange: legacyOnItemsPerPageChange,
990
+ tableHeader,
991
+ isHideCheckbox,
992
+ callback,
993
+ isTable = false,
994
+ // Component props - any additional props to pass to the component
995
+ componentProps = {},
996
+ ...restProps
997
+ }) => {
998
+ const [internalCurrentPage, setInternalCurrentPage] = (0, import_react15.useState)(1);
999
+ const [internalItemsPerPage, setInternalItemsPerPage] = (0, import_react15.useState)(itemsPerPage);
1000
+ const isControlled = controlledCurrentPage !== void 0;
1001
+ const isItemsPerPageControlled = controlledOnItemsPerPageChange !== void 0;
1002
+ const currentPage = isControlled ? controlledCurrentPage : internalCurrentPage;
1003
+ const activeItemsPerPage = isItemsPerPageControlled ? itemsPerPage : internalItemsPerPage;
1004
+ const totalItems = legacyTotalItems !== void 0 ? legacyTotalItems : data.length;
1005
+ const calculatedTotalPages = (0, import_react15.useMemo)(() => {
1006
+ if (totalItems > 0 && activeItemsPerPage > 0) {
1007
+ return Math.ceil(totalItems / activeItemsPerPage);
1008
+ }
1009
+ return 1;
1010
+ }, [totalItems, activeItemsPerPage]);
1011
+ const paginatedData = (0, import_react15.useMemo)(() => {
1012
+ if (!data || data.length === 0) return [];
1013
+ const startIndex = (currentPage - 1) * activeItemsPerPage;
1014
+ const endIndex = startIndex + activeItemsPerPage;
1015
+ return data.slice(startIndex, endIndex);
1016
+ }, [data, currentPage, activeItemsPerPage]);
1017
+ (0, import_react15.useEffect)(() => {
1018
+ if (!isControlled && currentPage > calculatedTotalPages && calculatedTotalPages > 0) {
1019
+ setInternalCurrentPage(1);
1020
+ }
1021
+ }, [calculatedTotalPages, isControlled, currentPage]);
1022
+ const getPageNumbers = () => {
1023
+ const pages = [];
1024
+ const maxVisible = 5;
1025
+ let startPage = Math.max(1, currentPage - Math.floor(maxVisible / 2));
1026
+ let endPage = Math.min(calculatedTotalPages, startPage + maxVisible - 1);
1027
+ if (endPage - startPage < maxVisible - 1) {
1028
+ startPage = Math.max(1, endPage - maxVisible + 1);
1029
+ }
1030
+ for (let i = startPage; i <= endPage; i++) {
1031
+ pages.push(i);
1032
+ }
1033
+ return pages;
1034
+ };
1035
+ const handlePageChange = (page) => {
1036
+ if (page >= 1 && page <= calculatedTotalPages) {
1037
+ if (isControlled && controlledOnPageChange) {
1038
+ controlledOnPageChange(page);
1039
+ } else if (legacyOnPageChange) {
1040
+ legacyOnPageChange(page);
1041
+ } else {
1042
+ setInternalCurrentPage(page);
1043
+ }
1044
+ }
1045
+ };
1046
+ const startItem = totalItems !== void 0 ? (currentPage - 1) * activeItemsPerPage + 1 : null;
1047
+ const endItem = totalItems !== void 0 ? Math.min(currentPage * activeItemsPerPage, totalItems) : null;
1048
+ const renderContent = () => {
1049
+ if (Component) {
1050
+ if (import_react15.default.isValidElement(Component)) {
1051
+ const ComponentType = Component.type;
1052
+ const elementProps = Component.props;
1053
+ if (isTable) {
1054
+ return /* @__PURE__ */ import_react15.default.createElement(
1055
+ CustomTable,
1056
+ {
1057
+ tableHeader,
1058
+ isHideCheckbox
1059
+ },
1060
+ paginatedData.map((item, index) => {
1061
+ return /* @__PURE__ */ import_react15.default.createElement(
1062
+ ComponentType,
1063
+ {
1064
+ key: item.id || item._id || index,
1065
+ data: item,
1066
+ ...elementProps,
1067
+ ...componentProps,
1068
+ ...restProps
1069
+ }
1070
+ );
1071
+ })
1072
+ );
1073
+ } else {
1074
+ if (isTable) {
1075
+ return /* @__PURE__ */ import_react15.default.createElement(
1076
+ CustomTable,
1077
+ {
1078
+ tableHeader,
1079
+ isHideCheckbox
1080
+ },
1081
+ paginatedData.map((item, index) => {
1082
+ return /* @__PURE__ */ import_react15.default.createElement(
1083
+ ComponentType,
1084
+ {
1085
+ key: item.id || item._id || index,
1086
+ data: item,
1087
+ ...elementProps,
1088
+ ...componentProps,
1089
+ ...restProps
1090
+ }
1091
+ );
1092
+ })
1093
+ );
1094
+ }
1095
+ }
1096
+ } else {
1097
+ return /* @__PURE__ */ import_react15.default.createElement(
1098
+ CustomTable,
1099
+ {
1100
+ tableHeader,
1101
+ isHideCheckbox
1102
+ },
1103
+ paginatedData.map((item, index) => {
1104
+ return /* @__PURE__ */ import_react15.default.createElement(
1105
+ Component,
1106
+ {
1107
+ key: item.id || item._id || index,
1108
+ data: item,
1109
+ ...componentProps,
1110
+ ...restProps
1111
+ }
1112
+ );
1113
+ })
1114
+ );
1115
+ }
1116
+ }
1117
+ return null;
1118
+ };
1119
+ return /* @__PURE__ */ import_react15.default.createElement(import_react15.default.Fragment, null, /* @__PURE__ */ import_react15.default.createElement(import_react15.default.Fragment, null, renderContent()), /* @__PURE__ */ import_react15.default.createElement("div", { className: "flex flex-col sm:flex-row justify-between items-center gap-4 px-4 py-3 border-t border-[#e5e5e5] dark:border-[#303036] bg-white dark:bg-[#18181b] z-10" }, totalItems !== void 0 && /* @__PURE__ */ import_react15.default.createElement("div", { className: "text-sm text-[#737373] dark:text-white" }, "Showing ", startItem, " to ", endItem, " of ", totalItems, " entries"), /* @__PURE__ */ import_react15.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react15.default.createElement(
1120
+ "button",
1121
+ {
1122
+ onClick: () => handlePageChange(1),
1123
+ disabled: currentPage === 1,
1124
+ className: `flex items-center justify-center w-9 h-9 rounded-md border border-[#e5e5e5] dark:border-[#303036] text-sm transition-colors ${currentPage === 1 ? "bg-gray-100 text-gray-400 cursor-not-allowed dark:bg-[#27272a] dark:text-gray-600" : "bg-white text-black hover:bg-gray-50 cursor-pointer dark:bg-[#18181b] dark:text-white dark:hover:bg-[#27272a]"}`,
1125
+ title: "First page"
1126
+ },
1127
+ /* @__PURE__ */ import_react15.default.createElement(import_lucide_react7.ChevronsLeft, { size: 16 })
1128
+ ), /* @__PURE__ */ import_react15.default.createElement(
1129
+ "button",
1130
+ {
1131
+ onClick: () => handlePageChange(currentPage - 1),
1132
+ disabled: currentPage === 1,
1133
+ className: `flex items-center justify-center w-9 h-9 rounded-md border border-[#e5e5e5] dark:border-[#303036] text-sm transition-colors ${currentPage === 1 ? "bg-gray-100 text-gray-400 cursor-not-allowed dark:bg-[#27272a] dark:text-gray-600" : "bg-white text-black hover:bg-gray-50 cursor-pointer dark:bg-[#18181b] dark:text-white dark:hover:bg-[#27272a]"}`,
1134
+ title: "Previous page"
1135
+ },
1136
+ /* @__PURE__ */ import_react15.default.createElement(import_lucide_react7.ChevronLeft, { size: 16 })
1137
+ ), getPageNumbers().map((pageNum) => /* @__PURE__ */ import_react15.default.createElement(
1138
+ "button",
1139
+ {
1140
+ key: pageNum,
1141
+ onClick: () => handlePageChange(pageNum),
1142
+ className: `flex items-center justify-center min-w-9 h-9 px-3 rounded-md border border-[#e5e5e5] dark:border-[#303036] text-sm transition-colors ${currentPage === pageNum ? "bg-primary text-white border-primary dark:bg-primary" : "bg-white text-black hover:bg-gray-50 dark:bg-[#18181b] dark:text-white dark:hover:bg-[#27272a]"}`
1143
+ },
1144
+ pageNum
1145
+ )), /* @__PURE__ */ import_react15.default.createElement(
1146
+ "button",
1147
+ {
1148
+ onClick: () => handlePageChange(currentPage + 1),
1149
+ disabled: currentPage === calculatedTotalPages || calculatedTotalPages === 0,
1150
+ className: `flex items-center justify-center w-9 h-9 rounded-md border border-[#e5e5e5] dark:border-[#303036] text-sm transition-colors ${currentPage === calculatedTotalPages || calculatedTotalPages === 0 ? "bg-gray-100 text-gray-400 cursor-not-allowed dark:bg-[#27272a] dark:text-gray-600" : "bg-white text-black hover:bg-gray-50 cursor-pointer dark:bg-[#18181b] dark:text-white dark:hover:bg-[#27272a]"}`,
1151
+ title: "Next page"
1152
+ },
1153
+ /* @__PURE__ */ import_react15.default.createElement(import_lucide_react7.ChevronRight, { size: 16 })
1154
+ ), /* @__PURE__ */ import_react15.default.createElement(
1155
+ "button",
1156
+ {
1157
+ onClick: () => handlePageChange(calculatedTotalPages),
1158
+ disabled: currentPage === calculatedTotalPages || calculatedTotalPages === 0,
1159
+ className: `flex items-center justify-center w-9 h-9 rounded-md border border-[#e5e5e5] dark:border-[#303036] text-sm transition-colors ${currentPage === calculatedTotalPages || calculatedTotalPages === 0 ? "bg-gray-100 text-gray-400 cursor-not-allowed dark:bg-[#27272a] dark:text-gray-600" : "bg-white text-black hover:bg-gray-50 cursor-pointer dark:bg-[#18181b] dark:text-white dark:hover:bg-[#27272a]"}`,
1160
+ title: "Last page"
1161
+ },
1162
+ /* @__PURE__ */ import_react15.default.createElement(import_lucide_react7.ChevronsRight, { size: 16 })
1163
+ ))));
1164
+ };
1165
+ // Annotate the CommonJS export names for ESM import in node:
1166
+ 0 && (module.exports = {
1167
+ AppSideBar,
1168
+ Chip,
1169
+ CustomAutocomplete,
1170
+ CustomButton,
1171
+ CustomCheckbox,
1172
+ CustomInput,
1173
+ CustomSearch,
1174
+ CustomSelect,
1175
+ CustomSwitch,
1176
+ CustomTable,
1177
+ CustomTextarea,
1178
+ CustomUpload,
1179
+ Pagination,
1180
+ ProgressBar,
1181
+ RightSheet
1182
+ });