@puninar-logistics/pds-sdk 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +128 -0
- package/dist/chunk-6NBFV4YQ.js +441 -0
- package/dist/chunk-6NBFV4YQ.js.map +1 -0
- package/dist/chunk-LCT4PDW4.js +403 -0
- package/dist/chunk-LCT4PDW4.js.map +1 -0
- package/dist/chunk-NTC4K7PW.js +379 -0
- package/dist/chunk-NTC4K7PW.js.map +1 -0
- package/dist/chunk-NTC7P4ZY.js +440 -0
- package/dist/chunk-NTC7P4ZY.js.map +1 -0
- package/dist/chunk-OCHH4OB7.js +486 -0
- package/dist/chunk-OCHH4OB7.js.map +1 -0
- package/dist/chunk-VFUBVERU.js +440 -0
- package/dist/chunk-VFUBVERU.js.map +1 -0
- package/dist/chunk-YL5EXHSB.js +462 -0
- package/dist/chunk-YL5EXHSB.js.map +1 -0
- package/dist/custom.css +111 -0
- package/dist/global.css +142 -0
- package/dist/index.d.ts +43 -0
- package/dist/index.js +334 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/index.d.ts +80 -0
- package/dist/utils/index.js +61 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1,379 @@
|
|
|
1
|
+
// src/utils/localStorage.ts
|
|
2
|
+
var setLocalStorage = (key, value) => {
|
|
3
|
+
try {
|
|
4
|
+
const serializedValue = typeof value === "string" ? value : JSON.stringify(value);
|
|
5
|
+
localStorage.setItem(key, serializedValue);
|
|
6
|
+
} catch (error) {
|
|
7
|
+
console.error(`Gagal menyimpan ke localStorage: ${key}`, error);
|
|
8
|
+
}
|
|
9
|
+
};
|
|
10
|
+
var getLocalStorage = (key, defaultValue = null) => {
|
|
11
|
+
try {
|
|
12
|
+
const value = localStorage.getItem(key);
|
|
13
|
+
if (value === null) return defaultValue;
|
|
14
|
+
try {
|
|
15
|
+
return JSON.parse(value);
|
|
16
|
+
} catch {
|
|
17
|
+
return value;
|
|
18
|
+
}
|
|
19
|
+
} catch (error) {
|
|
20
|
+
console.error(`Gagal membaca dari localStorage: ${key}`, error);
|
|
21
|
+
return defaultValue;
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
var removeLocalStorage = (key) => {
|
|
25
|
+
try {
|
|
26
|
+
localStorage.removeItem(key);
|
|
27
|
+
} catch (error) {
|
|
28
|
+
console.error(`Gagal menghapus localStorage: ${key}`, error);
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
var clearLocalStorage = () => {
|
|
32
|
+
try {
|
|
33
|
+
localStorage.clear();
|
|
34
|
+
} catch (error) {
|
|
35
|
+
console.error("Gagal membersihkan localStorage", error);
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
// src/utils/accessCheck.ts
|
|
40
|
+
var getByPath = (obj, path) => {
|
|
41
|
+
const keys = path.split(".");
|
|
42
|
+
let current = obj;
|
|
43
|
+
for (const key of keys) {
|
|
44
|
+
if (current == null || !(key in current)) return null;
|
|
45
|
+
current = current[key];
|
|
46
|
+
}
|
|
47
|
+
return current;
|
|
48
|
+
};
|
|
49
|
+
var accessCheck = (keyPath, requiredAccess) => {
|
|
50
|
+
try {
|
|
51
|
+
const list = getLocalStorage("menu-access");
|
|
52
|
+
if (!list) return false;
|
|
53
|
+
const accessRoot = Object.assign({}, ...list);
|
|
54
|
+
const node = getByPath(accessRoot, keyPath);
|
|
55
|
+
if (!node || !Array.isArray(node.access)) return false;
|
|
56
|
+
const userAccessList = node.access;
|
|
57
|
+
if (Array.isArray(requiredAccess)) {
|
|
58
|
+
return requiredAccess.some((a) => userAccessList.includes(a));
|
|
59
|
+
}
|
|
60
|
+
return userAccessList.includes(requiredAccess);
|
|
61
|
+
} catch (error) {
|
|
62
|
+
console.error("Invalid menu-access format:", error);
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
// src/utils/aliasBundlingTypeArchive.ts
|
|
68
|
+
var aliasBundlingTypeArchive = (bundlingTypeArchive) => {
|
|
69
|
+
const alias = {
|
|
70
|
+
TRUCKING_ONLY: "Trucking Only",
|
|
71
|
+
CUSTOMS_CLEARANCE: "Customs Clearance"
|
|
72
|
+
};
|
|
73
|
+
return bundlingTypeArchive ? alias[bundlingTypeArchive] : "N/A";
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
// src/utils/convertToArrayOfObject.ts
|
|
77
|
+
function convertToArrayOfObject(arr, fields) {
|
|
78
|
+
if (!Array.isArray(arr) || arr.length === 0) {
|
|
79
|
+
return [];
|
|
80
|
+
}
|
|
81
|
+
return arr.map((item) => {
|
|
82
|
+
if (typeof item !== "string") return {};
|
|
83
|
+
const parts = item.split("|");
|
|
84
|
+
const obj = {};
|
|
85
|
+
parts.forEach((value, index) => {
|
|
86
|
+
const key = fields && fields[index] ? fields[index] : `field${index + 1}`;
|
|
87
|
+
obj[key] = value?.trim?.() ?? "";
|
|
88
|
+
});
|
|
89
|
+
return obj;
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// src/utils/decodeFlateBase64.ts
|
|
94
|
+
import pako from "pako";
|
|
95
|
+
function decodeFlateBase64(encoded) {
|
|
96
|
+
if (!encoded) return null;
|
|
97
|
+
const binary = atob(encoded);
|
|
98
|
+
const bytes = Uint8Array.from(binary, (c) => c.charCodeAt(0));
|
|
99
|
+
const text = pako.inflateRaw(bytes, { to: "string" });
|
|
100
|
+
return JSON.parse(text);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// src/utils/encodeDecode.ts
|
|
104
|
+
function encodeData(data) {
|
|
105
|
+
try {
|
|
106
|
+
const json = JSON.stringify(data);
|
|
107
|
+
return btoa(unescape(encodeURIComponent(json)));
|
|
108
|
+
} catch (error) {
|
|
109
|
+
console.error("Failed to encode data:", error);
|
|
110
|
+
return "";
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
function decodeData(encoded) {
|
|
114
|
+
try {
|
|
115
|
+
const decoded = decodeURIComponent(escape(atob(encoded)));
|
|
116
|
+
const parsed = JSON.parse(decoded);
|
|
117
|
+
if (typeof parsed === "string" || typeof parsed === "number" || Array.isArray(parsed) || typeof parsed === "object") {
|
|
118
|
+
return parsed;
|
|
119
|
+
}
|
|
120
|
+
return decoded;
|
|
121
|
+
} catch (error) {
|
|
122
|
+
console.error("Failed to decode data:", error);
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// src/utils/formatCurrency.ts
|
|
128
|
+
function formatCurrency(value, decimals = 2, withLabel = true) {
|
|
129
|
+
if (value === null || value === void 0 || value === "") {
|
|
130
|
+
return withLabel ? "Rp0" : "0";
|
|
131
|
+
}
|
|
132
|
+
let number;
|
|
133
|
+
if (typeof value === "string") {
|
|
134
|
+
const normalized = value.replace(/\./g, "").replace(",", ".");
|
|
135
|
+
number = parseFloat(normalized);
|
|
136
|
+
} else {
|
|
137
|
+
number = value;
|
|
138
|
+
}
|
|
139
|
+
if (isNaN(number)) return withLabel ? "Rp0" : "0";
|
|
140
|
+
const rounded = Math.round(number * Math.pow(10, decimals)) / Math.pow(10, decimals);
|
|
141
|
+
return (withLabel ? "Rp" : "") + rounded.toFixed(decimals).replace(".", ",").replace(/\B(?=(\d{3})+(?!\d))/g, ".");
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// src/utils/generateHeaders.ts
|
|
145
|
+
import SHA256 from "crypto-js/sha256";
|
|
146
|
+
import Hex from "crypto-js/enc-hex";
|
|
147
|
+
function generateHeaders(api_key) {
|
|
148
|
+
const date = /* @__PURE__ */ new Date();
|
|
149
|
+
const timestamp = date.toISOString().slice(0, 19).replace("T", " ");
|
|
150
|
+
const encryptionKey = `${api_key}${timestamp}`;
|
|
151
|
+
const keyPun = SHA256(encryptionKey).toString(Hex);
|
|
152
|
+
return {
|
|
153
|
+
// "Content-Type": "application/json",
|
|
154
|
+
"Authorization": `Bearer ${getLocalStorage("odong-token")}`,
|
|
155
|
+
"key-puninar": keyPun,
|
|
156
|
+
timestamp
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// src/utils/getInitials.ts
|
|
161
|
+
function getInitials(name) {
|
|
162
|
+
if (!name) return "";
|
|
163
|
+
const parts = name.trim().split(/\s+/);
|
|
164
|
+
if (parts.length === 1) {
|
|
165
|
+
return parts[0][0].toUpperCase();
|
|
166
|
+
}
|
|
167
|
+
const first = parts[0][0].toUpperCase();
|
|
168
|
+
const last = parts[parts.length - 1][0].toUpperCase();
|
|
169
|
+
return first + last;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// src/utils/formatRupiah.ts
|
|
173
|
+
var formatRupiah = (value) => {
|
|
174
|
+
if (value === null || value === void 0 || value === "") {
|
|
175
|
+
return "";
|
|
176
|
+
}
|
|
177
|
+
let numberValue;
|
|
178
|
+
if (typeof value === "number") {
|
|
179
|
+
numberValue = value;
|
|
180
|
+
} else {
|
|
181
|
+
const normalized = value.toString().replace(/\s/g, "").replace(/Rp/gi, "").replace(/\./g, "").replace(/,/g, ".").replace(/[^0-9.-]/g, "");
|
|
182
|
+
numberValue = Number(normalized);
|
|
183
|
+
}
|
|
184
|
+
if (Number.isNaN(numberValue)) {
|
|
185
|
+
return "";
|
|
186
|
+
}
|
|
187
|
+
const hasDecimal = Math.round(numberValue * 100) % 100 !== 0;
|
|
188
|
+
return new Intl.NumberFormat("id-ID", {
|
|
189
|
+
style: "currency",
|
|
190
|
+
currency: "IDR",
|
|
191
|
+
minimumFractionDigits: hasDecimal ? 2 : 0,
|
|
192
|
+
maximumFractionDigits: 2
|
|
193
|
+
}).format(numberValue);
|
|
194
|
+
};
|
|
195
|
+
var transformThousands = (value, mode = "format") => {
|
|
196
|
+
if (value === null || value === void 0) {
|
|
197
|
+
return mode === "format" ? "" : 0;
|
|
198
|
+
}
|
|
199
|
+
const str = value.toString();
|
|
200
|
+
if (mode === "parse") {
|
|
201
|
+
const normalized = str.replace(/\./g, "").replace(/,/g, ".").replace(/[^0-9.]/g, "");
|
|
202
|
+
const num = Number(normalized);
|
|
203
|
+
return isNaN(num) ? 0 : num;
|
|
204
|
+
}
|
|
205
|
+
const endsWithComma = str.endsWith(",");
|
|
206
|
+
const cleaned = str.replace(/[^0-9,]/g, "");
|
|
207
|
+
const [intRaw = "", decRaw = ""] = cleaned.split(",");
|
|
208
|
+
const intPart = intRaw.replace(/\D/g, "");
|
|
209
|
+
const formattedInt = intPart.replace(/\B(?=(\d{3})+(?!\d))/g, ".");
|
|
210
|
+
let decimalPart = decRaw.replace(/\D/g, "").slice(0, 2);
|
|
211
|
+
if (endsWithComma && decimalPart.length === 0) {
|
|
212
|
+
return `${formattedInt},`;
|
|
213
|
+
}
|
|
214
|
+
if (decimalPart.length > 0) {
|
|
215
|
+
return `${formattedInt},${decimalPart}`;
|
|
216
|
+
}
|
|
217
|
+
return formattedInt;
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
// src/utils/formatDate.ts
|
|
221
|
+
import dayjs from "dayjs";
|
|
222
|
+
import "dayjs/locale/id";
|
|
223
|
+
dayjs.locale("id");
|
|
224
|
+
var formatDate = (value, format = "DD MMM YYYY HH:mm") => {
|
|
225
|
+
if (!value) return "-";
|
|
226
|
+
let sanitized = value;
|
|
227
|
+
if (typeof value === "string" && value.endsWith("Z")) {
|
|
228
|
+
sanitized = value.replace(/Z$/, "");
|
|
229
|
+
}
|
|
230
|
+
const parsed = dayjs(sanitized);
|
|
231
|
+
if (!parsed.isValid()) return "-";
|
|
232
|
+
return parsed.format(format);
|
|
233
|
+
};
|
|
234
|
+
|
|
235
|
+
// src/utils/dateFormat.ts
|
|
236
|
+
function formatDateTime(date) {
|
|
237
|
+
const day = String(date.getDate()).padStart(2, "0");
|
|
238
|
+
const year = date.getFullYear();
|
|
239
|
+
const months = [
|
|
240
|
+
"Januari",
|
|
241
|
+
"Februari",
|
|
242
|
+
"Maret",
|
|
243
|
+
"April",
|
|
244
|
+
"Mei",
|
|
245
|
+
"Juni",
|
|
246
|
+
"Juli",
|
|
247
|
+
"Agustus",
|
|
248
|
+
"September",
|
|
249
|
+
"Oktober",
|
|
250
|
+
"November",
|
|
251
|
+
"Desember"
|
|
252
|
+
];
|
|
253
|
+
const month = months[date.getMonth()];
|
|
254
|
+
const hours = String(date.getHours()).padStart(2, "0");
|
|
255
|
+
const minutes = String(date.getMinutes()).padStart(2, "0");
|
|
256
|
+
const seconds = String(date.getSeconds()).padStart(2, "0");
|
|
257
|
+
return `${day} ${month} ${year}, ${hours}:${minutes}:${seconds}`;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
// src/utils/formatter.ts
|
|
261
|
+
var MASK = "___.___-__.________";
|
|
262
|
+
var DIGIT_INDEXES = [
|
|
263
|
+
0,
|
|
264
|
+
1,
|
|
265
|
+
2,
|
|
266
|
+
// ___
|
|
267
|
+
4,
|
|
268
|
+
5,
|
|
269
|
+
6,
|
|
270
|
+
// ___
|
|
271
|
+
8,
|
|
272
|
+
9,
|
|
273
|
+
// __
|
|
274
|
+
11,
|
|
275
|
+
12,
|
|
276
|
+
13,
|
|
277
|
+
14,
|
|
278
|
+
15,
|
|
279
|
+
16,
|
|
280
|
+
17,
|
|
281
|
+
18
|
|
282
|
+
// ________
|
|
283
|
+
];
|
|
284
|
+
function applyEFakturMask(raw) {
|
|
285
|
+
const digits = raw.replace(/\D/g, "").slice(0, DIGIT_INDEXES.length);
|
|
286
|
+
const chars = MASK.split("");
|
|
287
|
+
digits.split("").forEach((d, i) => {
|
|
288
|
+
chars[DIGIT_INDEXES[i]] = d;
|
|
289
|
+
});
|
|
290
|
+
return chars.join("");
|
|
291
|
+
}
|
|
292
|
+
var CORETAX_MASK = "____-____-____-____";
|
|
293
|
+
var CORETAX_INDEXES = [
|
|
294
|
+
0,
|
|
295
|
+
1,
|
|
296
|
+
2,
|
|
297
|
+
3,
|
|
298
|
+
5,
|
|
299
|
+
6,
|
|
300
|
+
7,
|
|
301
|
+
8,
|
|
302
|
+
10,
|
|
303
|
+
11,
|
|
304
|
+
12,
|
|
305
|
+
13,
|
|
306
|
+
15,
|
|
307
|
+
16,
|
|
308
|
+
17,
|
|
309
|
+
18
|
|
310
|
+
];
|
|
311
|
+
function applyCoretaxMask(raw) {
|
|
312
|
+
const digits = raw.replace(/\D/g, "").slice(0, 16);
|
|
313
|
+
const chars = CORETAX_MASK.split("");
|
|
314
|
+
digits.split("").forEach((d, i) => {
|
|
315
|
+
chars[CORETAX_INDEXES[i]] = d;
|
|
316
|
+
});
|
|
317
|
+
return chars.join("");
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
// src/utils/generateUUID.ts
|
|
321
|
+
var generateUUID = () => {
|
|
322
|
+
if (typeof crypto !== "undefined" && crypto.randomUUID) {
|
|
323
|
+
return crypto.randomUUID();
|
|
324
|
+
}
|
|
325
|
+
return `temp-${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;
|
|
326
|
+
};
|
|
327
|
+
|
|
328
|
+
// src/utils/taxFormat.ts
|
|
329
|
+
var pphFormat = (str) => {
|
|
330
|
+
const match = str.match(/(?:PPH|WHT.*?PPH)(\d+)_(\d+)%$/);
|
|
331
|
+
return match ? `${match[1]}_${match[2]}%` : null;
|
|
332
|
+
};
|
|
333
|
+
|
|
334
|
+
// src/utils/rolesCheck.ts
|
|
335
|
+
function matchRole(selectedRole, comparator, mode = "exact") {
|
|
336
|
+
if (!selectedRole) return false;
|
|
337
|
+
const role = selectedRole.toUpperCase();
|
|
338
|
+
const comparators = Array.isArray(comparator) ? comparator.map((c) => c.toUpperCase()) : [comparator.toUpperCase()];
|
|
339
|
+
return comparators.some((c) => {
|
|
340
|
+
switch (mode) {
|
|
341
|
+
case "exact":
|
|
342
|
+
return role === c;
|
|
343
|
+
case "startsWith":
|
|
344
|
+
return role.startsWith(c);
|
|
345
|
+
case "includes":
|
|
346
|
+
return role.includes(c);
|
|
347
|
+
case "regex":
|
|
348
|
+
return new RegExp(c, "i").test(selectedRole);
|
|
349
|
+
default:
|
|
350
|
+
return false;
|
|
351
|
+
}
|
|
352
|
+
});
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
export {
|
|
356
|
+
setLocalStorage,
|
|
357
|
+
getLocalStorage,
|
|
358
|
+
removeLocalStorage,
|
|
359
|
+
clearLocalStorage,
|
|
360
|
+
accessCheck,
|
|
361
|
+
aliasBundlingTypeArchive,
|
|
362
|
+
convertToArrayOfObject,
|
|
363
|
+
decodeFlateBase64,
|
|
364
|
+
encodeData,
|
|
365
|
+
decodeData,
|
|
366
|
+
formatCurrency,
|
|
367
|
+
generateHeaders,
|
|
368
|
+
getInitials,
|
|
369
|
+
formatRupiah,
|
|
370
|
+
transformThousands,
|
|
371
|
+
formatDate,
|
|
372
|
+
formatDateTime,
|
|
373
|
+
applyEFakturMask,
|
|
374
|
+
applyCoretaxMask,
|
|
375
|
+
generateUUID,
|
|
376
|
+
pphFormat,
|
|
377
|
+
matchRole
|
|
378
|
+
};
|
|
379
|
+
//# sourceMappingURL=chunk-NTC4K7PW.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/localStorage.ts","../src/utils/accessCheck.ts","../src/utils/aliasBundlingTypeArchive.ts","../src/utils/convertToArrayOfObject.ts","../src/utils/decodeFlateBase64.ts","../src/utils/encodeDecode.ts","../src/utils/formatCurrency.ts","../src/utils/generateHeaders.ts","../src/utils/getInitials.ts","../src/utils/formatRupiah.ts","../src/utils/formatDate.ts","../src/utils/dateFormat.ts","../src/utils/formatter.ts","../src/utils/generateUUID.ts","../src/utils/taxFormat.ts","../src/utils/rolesCheck.ts"],"sourcesContent":["// utils/localStorage.ts\r\n\r\n/**\r\n * Simpan data ke localStorage dengan aman.\r\n */\r\nexport const setLocalStorage = (key: string, value: unknown): void => {\r\n try {\r\n const serializedValue =\r\n typeof value === \"string\" ? value : JSON.stringify(value);\r\n localStorage.setItem(key, serializedValue);\r\n } catch (error) {\r\n console.error(`Gagal menyimpan ke localStorage: ${key}`, error);\r\n }\r\n};\r\n\r\n/**\r\n * Ambil data dari localStorage dengan aman (auto-parse JSON jika valid).\r\n * Generic <T> agar hasil bisa ditentukan tipenya.\r\n */\r\nexport const getLocalStorage = <T = unknown>(\r\n key: string,\r\n defaultValue: T | null = null\r\n): T | string | null => {\r\n try {\r\n const value = localStorage.getItem(key);\r\n if (value === null) return defaultValue;\r\n\r\n try {\r\n return JSON.parse(value) as T;\r\n } catch {\r\n return value; // Jika bukan JSON, kembalikan string\r\n }\r\n } catch (error) {\r\n console.error(`Gagal membaca dari localStorage: ${key}`, error);\r\n return defaultValue;\r\n }\r\n};\r\n\r\n/**\r\n * Hapus data dari localStorage.\r\n */\r\nexport const removeLocalStorage = (key: string): void => {\r\n try {\r\n localStorage.removeItem(key);\r\n } catch (error) {\r\n console.error(`Gagal menghapus localStorage: ${key}`, error);\r\n }\r\n};\r\n\r\n/**\r\n * Hapus seluruh localStorage.\r\n */\r\nexport const clearLocalStorage = (): void => {\r\n try {\r\n localStorage.clear();\r\n } catch (error) {\r\n console.error(\"Gagal membersihkan localStorage\", error);\r\n }\r\n};","import { getLocalStorage } from \"./localStorage\";\r\n\r\ntype AnyObject = Record<string, any>;\r\n\r\n/**\r\n * Ambil value dari object berdasarkan path (misal: \"a.b.c\")\r\n */\r\nconst getByPath = (obj: AnyObject, path: string): any => {\r\n const keys = path.split(\".\");\r\n let current: any = obj;\r\n\r\n for (const key of keys) {\r\n if (current == null || !(key in current)) return null;\r\n current = current[key];\r\n }\r\n\r\n return current;\r\n};\r\n\r\ninterface AccessNode {\r\n access?: string[];\r\n}\r\n\r\n/**\r\n * Cek otorisasi akses berdasarkan path dan list akses user.\r\n */\r\nexport const accessCheck = (\r\n keyPath: string,\r\n requiredAccess: string | string[]\r\n): boolean => {\r\n try {\r\n const list = getLocalStorage<AnyObject[]>(\"menu-access\");\r\n if (!list) return false;\r\n\r\n // Gabungkan array of object menjadi satu object\r\n const accessRoot: AnyObject = Object.assign({}, ...list);\r\n\r\n const node = getByPath(accessRoot, keyPath) as AccessNode | null;\r\n if (!node || !Array.isArray(node.access)) return false;\r\n\r\n const userAccessList = node.access;\r\n\r\n if (Array.isArray(requiredAccess)) {\r\n return requiredAccess.some((a) => userAccessList.includes(a));\r\n }\r\n\r\n return userAccessList.includes(requiredAccess);\r\n } catch (error) {\r\n console.error(\"Invalid menu-access format:\", error);\r\n return false;\r\n }\r\n};\r\n","type BundlingTypeArchive = 'TRUCKING_ONLY' | 'CUSTOMS_CLEARANCE';\r\n\r\nexport const aliasBundlingTypeArchive = (bundlingTypeArchive: BundlingTypeArchive | undefined): string => {\r\n const alias: Record<BundlingTypeArchive, string> = {\r\n TRUCKING_ONLY: 'Trucking Only',\r\n CUSTOMS_CLEARANCE: 'Customs Clearance',\r\n };\r\n\r\n return bundlingTypeArchive ? alias[bundlingTypeArchive] : 'N/A';\r\n};\r\n","// utils.ts\r\n\r\n/**\r\n * Convert an array of pipe-separated strings into an array of objects.\r\n * If field names are provided, they will be used instead of generic field1, field2, etc.\r\n * Example:\r\n * convertToArrayOfObject([\"1|01|PUJA|PUNINAR JAYA\"], [\"id\",\"code\",\"short_name\",\"full_name\"])\r\n * → [{ id: \"1\", code: \"01\", short_name: \"PUJA\", full_name: \"PUNINAR JAYA\" }]\r\n */\r\nexport function convertToArrayOfObject(\r\n arr?: string[] | null,\r\n fields?: string[]\r\n): Record<string, string>[] {\r\n if (!Array.isArray(arr) || arr.length === 0) {\r\n return [];\r\n }\r\n\r\n return arr.map((item) => {\r\n if (typeof item !== \"string\") return {};\r\n\r\n const parts = item.split(\"|\");\r\n const obj: Record<string, string> = {};\r\n\r\n parts.forEach((value, index) => {\r\n const key =\r\n fields && fields[index]\r\n ? fields[index]\r\n : `field${index + 1}`;\r\n obj[key] = value?.trim?.() ?? \"\";\r\n });\r\n\r\n return obj;\r\n });\r\n}\r\n","import pako from \"pako\";\r\n\r\nexport function decodeFlateBase64<T = any>(encoded: string): T {\r\n if (!encoded) return null as T;\r\n\r\n const binary = atob(encoded);\r\n\r\n const bytes = Uint8Array.from(binary, (c) => c.charCodeAt(0));\r\n const text = pako.inflateRaw(bytes, { to: \"string\" });\r\n\r\n return JSON.parse(text) as T;\r\n}\r\n","// utils/encodeDecode.ts\r\nexport function encodeData(data: unknown): string {\r\n try {\r\n // pastikan semua tipe diubah ke string JSON\r\n const json = JSON.stringify(data);\r\n return btoa(unescape(encodeURIComponent(json)));\r\n } catch (error) {\r\n console.error(\"Failed to encode data:\", error);\r\n return \"\";\r\n }\r\n}\r\n\r\nexport function decodeData<T = unknown>(encoded: string): T | string | number | null {\r\n try {\r\n const decoded = decodeURIComponent(escape(atob(encoded)));\r\n const parsed = JSON.parse(decoded);\r\n\r\n // Kalau hasilnya string atau number biasa, langsung return\r\n if (typeof parsed === \"string\" || typeof parsed === \"number\" || Array.isArray(parsed) || typeof parsed === \"object\") {\r\n return parsed as T;\r\n }\r\n\r\n return decoded; // fallback kalau bukan JSON\r\n } catch (error) {\r\n console.error(\"Failed to decode data:\", error);\r\n return null;\r\n }\r\n}\r\n","export function formatCurrency(\r\n value: number | string,\r\n decimals: number = 2,\r\n withLabel: boolean = true\r\n): string {\r\n if (value === null || value === undefined || value === '') {\r\n return withLabel ? 'Rp0' : '0'\r\n }\r\n\r\n let number: number\r\n\r\n if (typeof value === 'string') {\r\n // handle \"1.234,56\" atau \"1,234.56\"\r\n const normalized = value\r\n .replace(/\\./g, '')\r\n .replace(',', '.')\r\n\r\n number = parseFloat(normalized)\r\n } else {\r\n number = value\r\n }\r\n\r\n if (isNaN(number)) return withLabel ? 'Rp0' : '0'\r\n\r\n // 🔹 ROUNDING EXPLICIT (lebih jelas)\r\n const rounded = Math.round(number * Math.pow(10, decimals)) / Math.pow(10, decimals)\r\n\r\n return (\r\n (withLabel ? 'Rp' : '') +\r\n rounded\r\n .toFixed(decimals)\r\n .replace('.', ',')\r\n .replace(/\\B(?=(\\d{3})+(?!\\d))/g, '.')\r\n )\r\n}\r\n","import SHA256 from \"crypto-js/sha256\";\r\nimport Hex from \"crypto-js/enc-hex\";\r\nimport { getLocalStorage } from \"./localStorage\";\r\n\r\nexport function generateHeaders(api_key: string): Record<string, string> {\r\n const date = new Date();\r\n const timestamp = date.toISOString().slice(0, 19).replace(\"T\", \" \"); // 2025-10-02 12:34:56\r\n const encryptionKey = `${api_key}${timestamp}`;\r\n const keyPun = SHA256(encryptionKey).toString(Hex);\r\n\r\n return {\r\n // \"Content-Type\": \"application/json\",\r\n \"Authorization\": `Bearer ${getLocalStorage(\"odong-token\")}`,\r\n \"key-puninar\": keyPun,\r\n timestamp,\r\n };\r\n}","/**\r\n * Generate initials from a name\r\n * @param name - Full name\r\n * @returns Initials (first and last letter)\r\n */\r\nexport function getInitials(name?: string): string {\r\n if (!name) return \"\";\r\n\r\n const parts = name.trim().split(/\\s+/); // pisah berdasarkan spasi\r\n\r\n if (parts.length === 1) {\r\n return parts[0][0].toUpperCase(); // satu kata → ambil huruf pertama\r\n }\r\n\r\n const first = parts[0][0].toUpperCase();\r\n const last = parts[parts.length - 1][0].toUpperCase();\r\n return first + last;\r\n}","export const formatRupiah = (\r\n value: number | string | null | undefined\r\n): string => {\r\n if (value === null || value === undefined || value === '') {\r\n return '';\r\n }\r\n\r\n let numberValue: number;\r\n\r\n if (typeof value === 'number') {\r\n numberValue = value;\r\n } else {\r\n // support \"1.234,56\", \"1234.56\", \"Rp 1.234,56\"\r\n const normalized = value\r\n .toString()\r\n .replace(/\\s/g, '')\r\n .replace(/Rp/gi, '')\r\n .replace(/\\./g, '')\r\n .replace(/,/g, '.')\r\n .replace(/[^0-9.-]/g, '');\r\n\r\n numberValue = Number(normalized);\r\n }\r\n\r\n if (Number.isNaN(numberValue)) {\r\n return '';\r\n }\r\n\r\n const hasDecimal = Math.round(numberValue * 100) % 100 !== 0;\r\n\r\n return new Intl.NumberFormat('id-ID', {\r\n style: 'currency',\r\n currency: 'IDR',\r\n minimumFractionDigits: hasDecimal ? 2 : 0,\r\n maximumFractionDigits: 2,\r\n }).format(numberValue);\r\n};\r\n\r\nexport const transformThousands = (\r\n value: string | number | null | undefined,\r\n mode: \"format\" | \"parse\" = \"format\"\r\n): string | number => {\r\n if (value === null || value === undefined) {\r\n return mode === \"format\" ? \"\" : 0;\r\n }\r\n\r\n const str = value.toString();\r\n\r\n if (mode === \"parse\") {\r\n const normalized = str\r\n .replace(/\\./g, \"\")\r\n .replace(/,/g, \".\")\r\n .replace(/[^0-9.]/g, \"\");\r\n\r\n const num = Number(normalized);\r\n return isNaN(num) ? 0 : num;\r\n }\r\n\r\n // ===== FORMAT MODE =====\r\n\r\n const endsWithComma = str.endsWith(\",\");\r\n\r\n const cleaned = str.replace(/[^0-9,]/g, \"\");\r\n const [intRaw = \"\", decRaw = \"\"] = cleaned.split(\",\");\r\n\r\n const intPart = intRaw.replace(/\\D/g, \"\");\r\n const formattedInt = intPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, \".\");\r\n\r\n let decimalPart = decRaw.replace(/\\D/g, \"\").slice(0, 2);\r\n\r\n // Case: user baru mengetik koma → simpan koma\r\n if (endsWithComma && decimalPart.length === 0) {\r\n return `${formattedInt},`;\r\n }\r\n\r\n if (decimalPart.length > 0) {\r\n return `${formattedInt},${decimalPart}`;\r\n }\r\n\r\n return formattedInt;\r\n};\r\n","import dayjs from \"dayjs\";\r\nimport \"dayjs/locale/id\";\r\n\r\ndayjs.locale(\"id\");\r\n\r\nexport const formatDate = (\r\n value?: string | Date | null,\r\n format = \"DD MMM YYYY HH:mm\"\r\n): string => {\r\n if (!value) return \"-\";\r\n\r\n let sanitized = value;\r\n\r\n if (typeof value === \"string\" && value.endsWith(\"Z\")) {\r\n sanitized = value.replace(/Z$/, \"\");\r\n }\r\n\r\n const parsed = dayjs(sanitized);\r\n\r\n if (!parsed.isValid()) return \"-\";\r\n\r\n return parsed.format(format);\r\n};","export function formatDateTime(date: Date): string {\r\n const day: string = String(date.getDate()).padStart(2, '0')\r\n const year: number = date.getFullYear()\r\n\r\n const months: string[] = [\r\n 'Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni',\r\n 'Juli', 'Agustus', 'September', 'Oktober', 'November', 'Desember'\r\n ]\r\n\r\n const month: string = months[date.getMonth()]\r\n\r\n const hours: string = String(date.getHours()).padStart(2, '0')\r\n const minutes: string = String(date.getMinutes()).padStart(2, '0')\r\n const seconds: string = String(date.getSeconds()).padStart(2, '0')\r\n\r\n return `${day} ${month} ${year}, ${hours}:${minutes}:${seconds}`\r\n}\r\n","// EFaktur: XXX.XXX-XX.XXXXXXXX\r\nconst MASK = '___.___-__.________'\r\nconst DIGIT_INDEXES = [\r\n 0, 1, 2, // ___\r\n 4, 5, 6, // ___\r\n 8, 9, // __\r\n 11, 12, 13, 14, 15, 16, 17, 18 // ________\r\n]\r\n\r\nexport function applyEFakturMask(\r\n raw: string\r\n): string {\r\n const digits = raw.replace(/\\D/g, '').slice(0, DIGIT_INDEXES.length)\r\n\r\n const chars = MASK.split('')\r\n\r\n digits.split('').forEach((d, i) => {\r\n chars[DIGIT_INDEXES[i]] = d\r\n })\r\n\r\n return chars.join('')\r\n}\r\n\r\n\r\n// Coretax: 16 digit angka\r\nconst CORETAX_MASK = '____-____-____-____'\r\nconst CORETAX_INDEXES = [\r\n 0, 1, 2, 3,\r\n 5, 6, 7, 8,\r\n 10, 11, 12, 13,\r\n 15, 16, 17, 18\r\n]\r\n\r\nexport function applyCoretaxMask(raw: string): string {\r\n const digits = raw.replace(/\\D/g, '').slice(0, 16)\r\n const chars = CORETAX_MASK.split('')\r\n\r\n digits.split('').forEach((d, i) => {\r\n chars[CORETAX_INDEXES[i]] = d\r\n })\r\n\r\n return chars.join('')\r\n}","export const generateUUID = (): string => {\r\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\r\n return crypto.randomUUID();\r\n }\r\n // Fallback sederhana (bukan UUID asli, tapi cukup unik untuk UI)\r\n return `temp-${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;\r\n};","export const pphFormat = (str: string): string | null => {\r\n // Match pola seperti PPH23_15% atau WHT_PPH23_15%\r\n const match = str.match(/(?:PPH|WHT.*?PPH)(\\d+)_(\\d+)%$/);\r\n return match ? `${match[1]}_${match[2]}%` : null;\r\n};\r\n","type MatchMode = \"exact\" | \"startsWith\" | \"includes\" | \"regex\";\r\n\r\nexport function matchRole(\r\n selectedRole: string | undefined,\r\n comparator: string | string[],\r\n mode: MatchMode = \"exact\"\r\n): boolean {\r\n if (!selectedRole) return false;\r\n\r\n const role = selectedRole.toUpperCase();\r\n const comparators = Array.isArray(comparator)\r\n ? comparator.map((c) => c.toUpperCase())\r\n : [comparator.toUpperCase()];\r\n\r\n return comparators.some((c) => {\r\n switch (mode) {\r\n case \"exact\":\r\n return role === c;\r\n\r\n case \"startsWith\":\r\n return role.startsWith(c);\r\n\r\n case \"includes\":\r\n return role.includes(c);\r\n\r\n case \"regex\":\r\n return new RegExp(c, \"i\").test(selectedRole);\r\n\r\n default:\r\n return false;\r\n }\r\n });\r\n}\r\n"],"mappings":"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","names":[]}
|