@fctc/widget-logic 4.8.8 → 4.9.0
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/dist/index.js +95 -97
- package/dist/index.mjs +95 -97
- package/dist/widget.d.mts +16 -13
- package/dist/widget.d.ts +16 -13
- package/dist/widget.js +95 -97
- package/dist/widget.mjs +95 -97
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -4415,6 +4415,28 @@ function useStorageState(key) {
|
|
|
4415
4415
|
);
|
|
4416
4416
|
return [state, setValue];
|
|
4417
4417
|
}
|
|
4418
|
+
var guessTypeFromUrl = (url) => {
|
|
4419
|
+
const ext = url.split(".").pop()?.toLowerCase();
|
|
4420
|
+
if (!ext) return null;
|
|
4421
|
+
const map = {
|
|
4422
|
+
jpg: "image/jpeg",
|
|
4423
|
+
jpeg: "image/jpeg",
|
|
4424
|
+
png: "image/png",
|
|
4425
|
+
webp: "image/webp",
|
|
4426
|
+
gif: "image/gif",
|
|
4427
|
+
svg: "image/svg+xml",
|
|
4428
|
+
bmp: "image/bmp",
|
|
4429
|
+
tiff: "image/tiff",
|
|
4430
|
+
pdf: "application/pdf",
|
|
4431
|
+
zip: "application/zip",
|
|
4432
|
+
rar: "application/x-rar-compressed",
|
|
4433
|
+
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
|
4434
|
+
xls: "application/vnd.ms-excel",
|
|
4435
|
+
mp4: "video/mp4",
|
|
4436
|
+
mov: "video/quicktime"
|
|
4437
|
+
};
|
|
4438
|
+
return map[ext] || null;
|
|
4439
|
+
};
|
|
4418
4440
|
|
|
4419
4441
|
// src/utils.ts
|
|
4420
4442
|
__reExport(utils_exports, require("@fctc/interface-logic/utils"));
|
|
@@ -6208,126 +6230,102 @@ var colorFieldController = (props) => {
|
|
|
6208
6230
|
|
|
6209
6231
|
// src/widget/basic/binary-field/controller.ts
|
|
6210
6232
|
var import_react22 = require("react");
|
|
6211
|
-
var import_utils16 = require("@fctc/interface-logic/utils");
|
|
6212
|
-
var ALLOWED_TYPES = [
|
|
6213
|
-
"image/jpeg",
|
|
6214
|
-
"image/png",
|
|
6215
|
-
"application/pdf",
|
|
6216
|
-
"video/mp4",
|
|
6217
|
-
"application/zip",
|
|
6218
|
-
"application/x-zip-compressed",
|
|
6219
|
-
"application/vnd.ms-excel",
|
|
6220
|
-
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
|
6221
|
-
"application/json"
|
|
6222
|
-
];
|
|
6223
|
-
var MAX_FILE_SIZE = 10 * 1024 * 1024;
|
|
6224
|
-
var MAX_TOTAL_SIZE = 50 * 1024 * 1024;
|
|
6225
6233
|
var binaryFieldController = (props) => {
|
|
6226
6234
|
const {
|
|
6227
6235
|
name,
|
|
6228
6236
|
methods,
|
|
6229
6237
|
readonly = false,
|
|
6230
|
-
value,
|
|
6231
6238
|
filename,
|
|
6239
|
+
onChange: handleOnchange,
|
|
6240
|
+
service,
|
|
6241
|
+
xNode,
|
|
6242
|
+
path,
|
|
6232
6243
|
rootField,
|
|
6233
6244
|
index,
|
|
6234
|
-
|
|
6245
|
+
value
|
|
6235
6246
|
} = props;
|
|
6236
|
-
const
|
|
6237
|
-
const
|
|
6238
|
-
const [
|
|
6239
|
-
const [
|
|
6240
|
-
|
|
6241
|
-
|
|
6247
|
+
const { useUploadFile: useUploadFile2 } = (0, provider_exports.useService)();
|
|
6248
|
+
const { mutateAsync } = useUploadFile2();
|
|
6249
|
+
const [url, setUrl] = (0, import_react22.useState)(value || null);
|
|
6250
|
+
const [fileInfo, setFileInfo] = (0, import_react22.useState)(null);
|
|
6251
|
+
(0, import_react22.useEffect)(() => {
|
|
6252
|
+
if (!value) return;
|
|
6253
|
+
fetchFileMeta(value);
|
|
6254
|
+
}, [value]);
|
|
6255
|
+
const formatSize = (bytes) => {
|
|
6256
|
+
if (bytes < 1024) return bytes + " B";
|
|
6257
|
+
let kb = bytes / 1024;
|
|
6258
|
+
if (kb < 1024) return kb.toFixed(2) + " KB";
|
|
6259
|
+
let mb = kb / 1024;
|
|
6260
|
+
if (mb < 1024) return mb.toFixed(2) + " MB";
|
|
6261
|
+
return (mb / 1024).toFixed(2) + " GB";
|
|
6262
|
+
};
|
|
6263
|
+
const fetchFileMeta = async (url2) => {
|
|
6242
6264
|
try {
|
|
6243
|
-
const
|
|
6244
|
-
const
|
|
6245
|
-
|
|
6246
|
-
|
|
6247
|
-
|
|
6248
|
-
|
|
6249
|
-
|
|
6265
|
+
const res = await fetch(url2, { method: "HEAD" });
|
|
6266
|
+
const size = res.headers.get("content-length") || "";
|
|
6267
|
+
let type = res.headers.get("content-type") || "";
|
|
6268
|
+
const date = res.headers.get("last-modified") || "";
|
|
6269
|
+
const guessed = guessTypeFromUrl(url2);
|
|
6270
|
+
if (guessed) type = guessed;
|
|
6271
|
+
setFileInfo({
|
|
6272
|
+
size: size ? formatSize(Number(size)) : "--",
|
|
6273
|
+
type,
|
|
6274
|
+
date: date ? new Date(date).toLocaleString() : "--"
|
|
6250
6275
|
});
|
|
6251
|
-
|
|
6252
|
-
|
|
6253
|
-
|
|
6276
|
+
setUrl(url2);
|
|
6277
|
+
} catch (e) {
|
|
6278
|
+
console.error(e);
|
|
6254
6279
|
}
|
|
6255
6280
|
};
|
|
6256
|
-
const
|
|
6257
|
-
|
|
6258
|
-
|
|
6259
|
-
|
|
6260
|
-
|
|
6261
|
-
|
|
6262
|
-
|
|
6263
|
-
|
|
6264
|
-
|
|
6265
|
-
|
|
6266
|
-
if (base64.startsWith("iVBORw0KGgo")) mimeType = "image/png";
|
|
6267
|
-
else if (base64.startsWith("/9j/")) mimeType = "image/jpeg";
|
|
6268
|
-
else if (base64.startsWith("R0lGOD")) mimeType = "image/gif";
|
|
6269
|
-
else if (base64.startsWith("Qk")) mimeType = "image/bmp";
|
|
6270
|
-
else if (base64.startsWith("UklGR")) mimeType = "image/webp";
|
|
6271
|
-
return mimeType ? `data:${mimeType};base64,${base64}` : null;
|
|
6272
|
-
};
|
|
6273
|
-
const handleFileChange = async (e, onChange) => {
|
|
6274
|
-
if (readonly) return;
|
|
6275
|
-
const file = e?.target?.files?.[0];
|
|
6276
|
-
if (!file) return;
|
|
6277
|
-
if (!ALLOWED_TYPES.includes(file.type)) {
|
|
6278
|
-
alert(`File type not allowed: ${file.type}`);
|
|
6279
|
-
return;
|
|
6280
|
-
}
|
|
6281
|
-
if (file.size > MAX_FILE_SIZE) {
|
|
6282
|
-
alert(`File exceeds 10MB limit.`);
|
|
6283
|
-
return;
|
|
6284
|
-
}
|
|
6285
|
-
const fileUrl = URL.createObjectURL(file);
|
|
6286
|
-
setSelectedFile(file);
|
|
6287
|
-
setSelectedPreview(fileUrl);
|
|
6288
|
-
const base64 = await convertUrlToBase64(fileUrl);
|
|
6289
|
-
const base64Data = extractBase64Data(base64);
|
|
6290
|
-
methods?.setValue(name, base64Data, { shouldDirty: true });
|
|
6291
|
-
onChange(base64Data);
|
|
6292
|
-
handleOnchange && handleOnchange(name ?? "", base64Data);
|
|
6281
|
+
const onUploadFile = async (formData) => {
|
|
6282
|
+
const res = await mutateAsync({
|
|
6283
|
+
formData,
|
|
6284
|
+
service,
|
|
6285
|
+
xNode,
|
|
6286
|
+
path
|
|
6287
|
+
});
|
|
6288
|
+
const url2 = res?.url;
|
|
6289
|
+
methods?.setValue(name, url2, { shouldDirty: true });
|
|
6290
|
+
handleOnchange && handleOnchange(name ?? "", url2);
|
|
6293
6291
|
if (filename) {
|
|
6294
6292
|
methods?.setValue(
|
|
6295
6293
|
rootField ? `${rootField?.name}.${index}.${filename}` : filename,
|
|
6296
|
-
|
|
6294
|
+
url2?.split("/").pop(),
|
|
6297
6295
|
{ shouldDirty: true }
|
|
6298
6296
|
);
|
|
6299
6297
|
handleOnchange && handleOnchange(
|
|
6300
6298
|
rootField ? `${rootField?.name}.${index}.${filename}` : filename,
|
|
6301
|
-
|
|
6299
|
+
url2?.split("/").pop()
|
|
6302
6300
|
);
|
|
6303
6301
|
}
|
|
6302
|
+
setUrl(url2);
|
|
6303
|
+
fetchFileMeta(url2);
|
|
6304
|
+
return url2;
|
|
6304
6305
|
};
|
|
6305
|
-
const
|
|
6306
|
-
if (
|
|
6307
|
-
|
|
6308
|
-
|
|
6309
|
-
|
|
6310
|
-
|
|
6306
|
+
const onDeleteFile = () => {
|
|
6307
|
+
if (filename) {
|
|
6308
|
+
methods?.setValue(
|
|
6309
|
+
rootField ? `${rootField?.name}.${index}.${filename}` : filename,
|
|
6310
|
+
null,
|
|
6311
|
+
{ shouldDirty: true }
|
|
6312
|
+
);
|
|
6313
|
+
handleOnchange && handleOnchange(
|
|
6314
|
+
rootField ? `${rootField?.name}.${index}.${filename}` : filename,
|
|
6315
|
+
null
|
|
6316
|
+
);
|
|
6317
|
+
}
|
|
6318
|
+
setUrl(null);
|
|
6319
|
+
setFileInfo(null);
|
|
6320
|
+
onDeleteFile && onDeleteFile();
|
|
6321
|
+
methods?.setValue(name, null, { shouldDirty: true });
|
|
6311
6322
|
handleOnchange && handleOnchange(name ?? "", null);
|
|
6312
6323
|
};
|
|
6313
|
-
(0, import_react22.useEffect)(() => {
|
|
6314
|
-
return () => {
|
|
6315
|
-
if (selectedPreview) {
|
|
6316
|
-
URL.revokeObjectURL(selectedPreview);
|
|
6317
|
-
}
|
|
6318
|
-
};
|
|
6319
|
-
}, [selectedPreview]);
|
|
6320
6324
|
return {
|
|
6321
|
-
|
|
6322
|
-
|
|
6323
|
-
|
|
6324
|
-
|
|
6325
|
-
binaryRef,
|
|
6326
|
-
handleFileChange,
|
|
6327
|
-
handleRemoveFile,
|
|
6328
|
-
checkIsImageLink,
|
|
6329
|
-
getBase64WithMimeType,
|
|
6330
|
-
setInitialFile
|
|
6325
|
+
onUploadFile,
|
|
6326
|
+
onDeleteFile,
|
|
6327
|
+
fileInfo,
|
|
6328
|
+
url
|
|
6331
6329
|
};
|
|
6332
6330
|
};
|
|
6333
6331
|
|
|
@@ -6399,7 +6397,7 @@ var tableHeadController = (props) => {
|
|
|
6399
6397
|
|
|
6400
6398
|
// src/widget/advance/table/table-view/controller.ts
|
|
6401
6399
|
var import_react24 = require("react");
|
|
6402
|
-
var
|
|
6400
|
+
var import_utils17 = require("@fctc/interface-logic/utils");
|
|
6403
6401
|
var tableController = ({ data }) => {
|
|
6404
6402
|
const [rows, setRows] = (0, import_react24.useState)([]);
|
|
6405
6403
|
const [columnVisibility, setColumnVisibility] = (0, import_react24.useState)({});
|
|
@@ -6442,10 +6440,10 @@ var tableController = ({ data }) => {
|
|
|
6442
6440
|
const columns = (0, import_react24.useMemo)(() => {
|
|
6443
6441
|
try {
|
|
6444
6442
|
return mergeFields?.filter((item) => {
|
|
6445
|
-
return item?.widget !== "details_Receive_money" && !(item?.column_invisible ?
|
|
6443
|
+
return item?.widget !== "details_Receive_money" && !(item?.column_invisible ? import_utils17.domainHelper.matchDomains(
|
|
6446
6444
|
data.context,
|
|
6447
6445
|
item?.column_invisible
|
|
6448
|
-
) : item?.invisible ?
|
|
6446
|
+
) : item?.invisible ? import_utils17.domainHelper.matchDomains(data.context, item?.invisible) : false);
|
|
6449
6447
|
})?.map((field) => {
|
|
6450
6448
|
const overridden = columnVisibility[field?.name];
|
|
6451
6449
|
return {
|
package/dist/index.mjs
CHANGED
|
@@ -4504,6 +4504,28 @@ function useStorageState(key) {
|
|
|
4504
4504
|
);
|
|
4505
4505
|
return [state, setValue];
|
|
4506
4506
|
}
|
|
4507
|
+
var guessTypeFromUrl = (url) => {
|
|
4508
|
+
const ext = url.split(".").pop()?.toLowerCase();
|
|
4509
|
+
if (!ext) return null;
|
|
4510
|
+
const map = {
|
|
4511
|
+
jpg: "image/jpeg",
|
|
4512
|
+
jpeg: "image/jpeg",
|
|
4513
|
+
png: "image/png",
|
|
4514
|
+
webp: "image/webp",
|
|
4515
|
+
gif: "image/gif",
|
|
4516
|
+
svg: "image/svg+xml",
|
|
4517
|
+
bmp: "image/bmp",
|
|
4518
|
+
tiff: "image/tiff",
|
|
4519
|
+
pdf: "application/pdf",
|
|
4520
|
+
zip: "application/zip",
|
|
4521
|
+
rar: "application/x-rar-compressed",
|
|
4522
|
+
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
|
4523
|
+
xls: "application/vnd.ms-excel",
|
|
4524
|
+
mp4: "video/mp4",
|
|
4525
|
+
mov: "video/quicktime"
|
|
4526
|
+
};
|
|
4527
|
+
return map[ext] || null;
|
|
4528
|
+
};
|
|
4507
4529
|
|
|
4508
4530
|
// src/utils.ts
|
|
4509
4531
|
__reExport(utils_exports, utils_star);
|
|
@@ -6302,132 +6324,108 @@ var colorFieldController = (props) => {
|
|
|
6302
6324
|
};
|
|
6303
6325
|
|
|
6304
6326
|
// src/widget/basic/binary-field/controller.ts
|
|
6305
|
-
import { useEffect as useEffect13,
|
|
6306
|
-
import { isBase64Image } from "@fctc/interface-logic/utils";
|
|
6307
|
-
var ALLOWED_TYPES = [
|
|
6308
|
-
"image/jpeg",
|
|
6309
|
-
"image/png",
|
|
6310
|
-
"application/pdf",
|
|
6311
|
-
"video/mp4",
|
|
6312
|
-
"application/zip",
|
|
6313
|
-
"application/x-zip-compressed",
|
|
6314
|
-
"application/vnd.ms-excel",
|
|
6315
|
-
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
|
6316
|
-
"application/json"
|
|
6317
|
-
];
|
|
6318
|
-
var MAX_FILE_SIZE = 10 * 1024 * 1024;
|
|
6319
|
-
var MAX_TOTAL_SIZE = 50 * 1024 * 1024;
|
|
6327
|
+
import { useEffect as useEffect13, useState as useState12 } from "react";
|
|
6320
6328
|
var binaryFieldController = (props) => {
|
|
6321
6329
|
const {
|
|
6322
6330
|
name,
|
|
6323
6331
|
methods,
|
|
6324
6332
|
readonly = false,
|
|
6325
|
-
value,
|
|
6326
6333
|
filename,
|
|
6334
|
+
onChange: handleOnchange,
|
|
6335
|
+
service,
|
|
6336
|
+
xNode,
|
|
6337
|
+
path,
|
|
6327
6338
|
rootField,
|
|
6328
6339
|
index,
|
|
6329
|
-
|
|
6340
|
+
value
|
|
6330
6341
|
} = props;
|
|
6331
|
-
const
|
|
6332
|
-
const
|
|
6333
|
-
const [
|
|
6334
|
-
const [
|
|
6335
|
-
|
|
6336
|
-
|
|
6342
|
+
const { useUploadFile: useUploadFile2 } = (0, provider_exports.useService)();
|
|
6343
|
+
const { mutateAsync } = useUploadFile2();
|
|
6344
|
+
const [url, setUrl] = useState12(value || null);
|
|
6345
|
+
const [fileInfo, setFileInfo] = useState12(null);
|
|
6346
|
+
useEffect13(() => {
|
|
6347
|
+
if (!value) return;
|
|
6348
|
+
fetchFileMeta(value);
|
|
6349
|
+
}, [value]);
|
|
6350
|
+
const formatSize = (bytes) => {
|
|
6351
|
+
if (bytes < 1024) return bytes + " B";
|
|
6352
|
+
let kb = bytes / 1024;
|
|
6353
|
+
if (kb < 1024) return kb.toFixed(2) + " KB";
|
|
6354
|
+
let mb = kb / 1024;
|
|
6355
|
+
if (mb < 1024) return mb.toFixed(2) + " MB";
|
|
6356
|
+
return (mb / 1024).toFixed(2) + " GB";
|
|
6357
|
+
};
|
|
6358
|
+
const fetchFileMeta = async (url2) => {
|
|
6337
6359
|
try {
|
|
6338
|
-
const
|
|
6339
|
-
const
|
|
6340
|
-
|
|
6341
|
-
|
|
6342
|
-
|
|
6343
|
-
|
|
6344
|
-
|
|
6360
|
+
const res = await fetch(url2, { method: "HEAD" });
|
|
6361
|
+
const size = res.headers.get("content-length") || "";
|
|
6362
|
+
let type = res.headers.get("content-type") || "";
|
|
6363
|
+
const date = res.headers.get("last-modified") || "";
|
|
6364
|
+
const guessed = guessTypeFromUrl(url2);
|
|
6365
|
+
if (guessed) type = guessed;
|
|
6366
|
+
setFileInfo({
|
|
6367
|
+
size: size ? formatSize(Number(size)) : "--",
|
|
6368
|
+
type,
|
|
6369
|
+
date: date ? new Date(date).toLocaleString() : "--"
|
|
6345
6370
|
});
|
|
6346
|
-
|
|
6347
|
-
|
|
6348
|
-
|
|
6371
|
+
setUrl(url2);
|
|
6372
|
+
} catch (e) {
|
|
6373
|
+
console.error(e);
|
|
6349
6374
|
}
|
|
6350
6375
|
};
|
|
6351
|
-
const
|
|
6352
|
-
|
|
6353
|
-
|
|
6354
|
-
|
|
6355
|
-
|
|
6356
|
-
|
|
6357
|
-
|
|
6358
|
-
|
|
6359
|
-
|
|
6360
|
-
|
|
6361
|
-
if (base64.startsWith("iVBORw0KGgo")) mimeType = "image/png";
|
|
6362
|
-
else if (base64.startsWith("/9j/")) mimeType = "image/jpeg";
|
|
6363
|
-
else if (base64.startsWith("R0lGOD")) mimeType = "image/gif";
|
|
6364
|
-
else if (base64.startsWith("Qk")) mimeType = "image/bmp";
|
|
6365
|
-
else if (base64.startsWith("UklGR")) mimeType = "image/webp";
|
|
6366
|
-
return mimeType ? `data:${mimeType};base64,${base64}` : null;
|
|
6367
|
-
};
|
|
6368
|
-
const handleFileChange = async (e, onChange) => {
|
|
6369
|
-
if (readonly) return;
|
|
6370
|
-
const file = e?.target?.files?.[0];
|
|
6371
|
-
if (!file) return;
|
|
6372
|
-
if (!ALLOWED_TYPES.includes(file.type)) {
|
|
6373
|
-
alert(`File type not allowed: ${file.type}`);
|
|
6374
|
-
return;
|
|
6375
|
-
}
|
|
6376
|
-
if (file.size > MAX_FILE_SIZE) {
|
|
6377
|
-
alert(`File exceeds 10MB limit.`);
|
|
6378
|
-
return;
|
|
6379
|
-
}
|
|
6380
|
-
const fileUrl = URL.createObjectURL(file);
|
|
6381
|
-
setSelectedFile(file);
|
|
6382
|
-
setSelectedPreview(fileUrl);
|
|
6383
|
-
const base64 = await convertUrlToBase64(fileUrl);
|
|
6384
|
-
const base64Data = extractBase64Data(base64);
|
|
6385
|
-
methods?.setValue(name, base64Data, { shouldDirty: true });
|
|
6386
|
-
onChange(base64Data);
|
|
6387
|
-
handleOnchange && handleOnchange(name ?? "", base64Data);
|
|
6376
|
+
const onUploadFile = async (formData) => {
|
|
6377
|
+
const res = await mutateAsync({
|
|
6378
|
+
formData,
|
|
6379
|
+
service,
|
|
6380
|
+
xNode,
|
|
6381
|
+
path
|
|
6382
|
+
});
|
|
6383
|
+
const url2 = res?.url;
|
|
6384
|
+
methods?.setValue(name, url2, { shouldDirty: true });
|
|
6385
|
+
handleOnchange && handleOnchange(name ?? "", url2);
|
|
6388
6386
|
if (filename) {
|
|
6389
6387
|
methods?.setValue(
|
|
6390
6388
|
rootField ? `${rootField?.name}.${index}.${filename}` : filename,
|
|
6391
|
-
|
|
6389
|
+
url2?.split("/").pop(),
|
|
6392
6390
|
{ shouldDirty: true }
|
|
6393
6391
|
);
|
|
6394
6392
|
handleOnchange && handleOnchange(
|
|
6395
6393
|
rootField ? `${rootField?.name}.${index}.${filename}` : filename,
|
|
6396
|
-
|
|
6394
|
+
url2?.split("/").pop()
|
|
6397
6395
|
);
|
|
6398
6396
|
}
|
|
6397
|
+
setUrl(url2);
|
|
6398
|
+
fetchFileMeta(url2);
|
|
6399
|
+
return url2;
|
|
6399
6400
|
};
|
|
6400
|
-
const
|
|
6401
|
-
if (
|
|
6402
|
-
|
|
6403
|
-
|
|
6404
|
-
|
|
6405
|
-
|
|
6401
|
+
const onDeleteFile = () => {
|
|
6402
|
+
if (filename) {
|
|
6403
|
+
methods?.setValue(
|
|
6404
|
+
rootField ? `${rootField?.name}.${index}.${filename}` : filename,
|
|
6405
|
+
null,
|
|
6406
|
+
{ shouldDirty: true }
|
|
6407
|
+
);
|
|
6408
|
+
handleOnchange && handleOnchange(
|
|
6409
|
+
rootField ? `${rootField?.name}.${index}.${filename}` : filename,
|
|
6410
|
+
null
|
|
6411
|
+
);
|
|
6412
|
+
}
|
|
6413
|
+
setUrl(null);
|
|
6414
|
+
setFileInfo(null);
|
|
6415
|
+
onDeleteFile && onDeleteFile();
|
|
6416
|
+
methods?.setValue(name, null, { shouldDirty: true });
|
|
6406
6417
|
handleOnchange && handleOnchange(name ?? "", null);
|
|
6407
6418
|
};
|
|
6408
|
-
useEffect13(() => {
|
|
6409
|
-
return () => {
|
|
6410
|
-
if (selectedPreview) {
|
|
6411
|
-
URL.revokeObjectURL(selectedPreview);
|
|
6412
|
-
}
|
|
6413
|
-
};
|
|
6414
|
-
}, [selectedPreview]);
|
|
6415
6419
|
return {
|
|
6416
|
-
|
|
6417
|
-
|
|
6418
|
-
|
|
6419
|
-
|
|
6420
|
-
binaryRef,
|
|
6421
|
-
handleFileChange,
|
|
6422
|
-
handleRemoveFile,
|
|
6423
|
-
checkIsImageLink,
|
|
6424
|
-
getBase64WithMimeType,
|
|
6425
|
-
setInitialFile
|
|
6420
|
+
onUploadFile,
|
|
6421
|
+
onDeleteFile,
|
|
6422
|
+
fileInfo,
|
|
6423
|
+
url
|
|
6426
6424
|
};
|
|
6427
6425
|
};
|
|
6428
6426
|
|
|
6429
6427
|
// src/widget/advance/table/table-head/controller.ts
|
|
6430
|
-
import { useMemo as useMemo9, useRef as
|
|
6428
|
+
import { useMemo as useMemo9, useRef as useRef4 } from "react";
|
|
6431
6429
|
var tableHeadController = (props) => {
|
|
6432
6430
|
const {
|
|
6433
6431
|
typeTable,
|
|
@@ -6438,7 +6436,7 @@ var tableHeadController = (props) => {
|
|
|
6438
6436
|
setSelectedRowKeys
|
|
6439
6437
|
} = props;
|
|
6440
6438
|
const { rowIds: recordIds } = useGetRowIds(tableRef);
|
|
6441
|
-
const selectedRowKeysRef =
|
|
6439
|
+
const selectedRowKeysRef = useRef4(recordIds);
|
|
6442
6440
|
const isGroupTable = typeTable === "group";
|
|
6443
6441
|
const recordsCheckedGroup = useMemo9(() => {
|
|
6444
6442
|
if (!rows || !groupByList) return 0;
|
package/dist/widget.d.mts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import * as react from 'react';
|
|
2
|
-
import { ChangeEvent } from 'react';
|
|
3
2
|
import { IInputFieldProps } from './types.mjs';
|
|
4
3
|
import moment from 'moment';
|
|
5
4
|
import '@fctc/interface-logic/types';
|
|
@@ -213,20 +212,24 @@ declare const colorFieldController: (props: IColorFieldProps) => {
|
|
|
213
212
|
savePickColor: (colorObject: any) => Promise<void>;
|
|
214
213
|
};
|
|
215
214
|
|
|
216
|
-
|
|
215
|
+
interface IBinaryFieldProps extends IInputFieldProps {
|
|
216
|
+
service?: string;
|
|
217
|
+
xNode?: string;
|
|
218
|
+
path?: string;
|
|
217
219
|
rootField?: any;
|
|
218
220
|
index?: number;
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
type FileInfor = {
|
|
224
|
+
type?: string;
|
|
225
|
+
date?: string;
|
|
226
|
+
size?: string;
|
|
227
|
+
};
|
|
228
|
+
declare const binaryFieldController: (props: IBinaryFieldProps) => {
|
|
229
|
+
onUploadFile: (formData: FormData) => Promise<any>;
|
|
230
|
+
onDeleteFile: () => void;
|
|
231
|
+
fileInfo: FileInfor | null;
|
|
232
|
+
url: any;
|
|
230
233
|
};
|
|
231
234
|
|
|
232
235
|
declare const tableHeadController: (props: any) => {
|
package/dist/widget.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import * as react from 'react';
|
|
2
|
-
import { ChangeEvent } from 'react';
|
|
3
2
|
import { IInputFieldProps } from './types.js';
|
|
4
3
|
import moment from 'moment';
|
|
5
4
|
import '@fctc/interface-logic/types';
|
|
@@ -213,20 +212,24 @@ declare const colorFieldController: (props: IColorFieldProps) => {
|
|
|
213
212
|
savePickColor: (colorObject: any) => Promise<void>;
|
|
214
213
|
};
|
|
215
214
|
|
|
216
|
-
|
|
215
|
+
interface IBinaryFieldProps extends IInputFieldProps {
|
|
216
|
+
service?: string;
|
|
217
|
+
xNode?: string;
|
|
218
|
+
path?: string;
|
|
217
219
|
rootField?: any;
|
|
218
220
|
index?: number;
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
type FileInfor = {
|
|
224
|
+
type?: string;
|
|
225
|
+
date?: string;
|
|
226
|
+
size?: string;
|
|
227
|
+
};
|
|
228
|
+
declare const binaryFieldController: (props: IBinaryFieldProps) => {
|
|
229
|
+
onUploadFile: (formData: FormData) => Promise<any>;
|
|
230
|
+
onDeleteFile: () => void;
|
|
231
|
+
fileInfo: FileInfor | null;
|
|
232
|
+
url: any;
|
|
230
233
|
};
|
|
231
234
|
|
|
232
235
|
declare const tableHeadController: (props: any) => {
|
package/dist/widget.js
CHANGED
|
@@ -4305,6 +4305,28 @@ function useStorageState(key) {
|
|
|
4305
4305
|
);
|
|
4306
4306
|
return [state, setValue];
|
|
4307
4307
|
}
|
|
4308
|
+
var guessTypeFromUrl = (url) => {
|
|
4309
|
+
const ext = url.split(".").pop()?.toLowerCase();
|
|
4310
|
+
if (!ext) return null;
|
|
4311
|
+
const map = {
|
|
4312
|
+
jpg: "image/jpeg",
|
|
4313
|
+
jpeg: "image/jpeg",
|
|
4314
|
+
png: "image/png",
|
|
4315
|
+
webp: "image/webp",
|
|
4316
|
+
gif: "image/gif",
|
|
4317
|
+
svg: "image/svg+xml",
|
|
4318
|
+
bmp: "image/bmp",
|
|
4319
|
+
tiff: "image/tiff",
|
|
4320
|
+
pdf: "application/pdf",
|
|
4321
|
+
zip: "application/zip",
|
|
4322
|
+
rar: "application/x-rar-compressed",
|
|
4323
|
+
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
|
4324
|
+
xls: "application/vnd.ms-excel",
|
|
4325
|
+
mp4: "video/mp4",
|
|
4326
|
+
mov: "video/quicktime"
|
|
4327
|
+
};
|
|
4328
|
+
return map[ext] || null;
|
|
4329
|
+
};
|
|
4308
4330
|
|
|
4309
4331
|
// src/utils.ts
|
|
4310
4332
|
__reExport(utils_exports, require("@fctc/interface-logic/utils"));
|
|
@@ -5448,126 +5470,102 @@ var colorFieldController = (props) => {
|
|
|
5448
5470
|
|
|
5449
5471
|
// src/widget/basic/binary-field/controller.ts
|
|
5450
5472
|
var import_react22 = require("react");
|
|
5451
|
-
var import_utils16 = require("@fctc/interface-logic/utils");
|
|
5452
|
-
var ALLOWED_TYPES = [
|
|
5453
|
-
"image/jpeg",
|
|
5454
|
-
"image/png",
|
|
5455
|
-
"application/pdf",
|
|
5456
|
-
"video/mp4",
|
|
5457
|
-
"application/zip",
|
|
5458
|
-
"application/x-zip-compressed",
|
|
5459
|
-
"application/vnd.ms-excel",
|
|
5460
|
-
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
|
5461
|
-
"application/json"
|
|
5462
|
-
];
|
|
5463
|
-
var MAX_FILE_SIZE = 10 * 1024 * 1024;
|
|
5464
|
-
var MAX_TOTAL_SIZE = 50 * 1024 * 1024;
|
|
5465
5473
|
var binaryFieldController = (props) => {
|
|
5466
5474
|
const {
|
|
5467
5475
|
name,
|
|
5468
5476
|
methods,
|
|
5469
5477
|
readonly = false,
|
|
5470
|
-
value,
|
|
5471
5478
|
filename,
|
|
5479
|
+
onChange: handleOnchange,
|
|
5480
|
+
service,
|
|
5481
|
+
xNode,
|
|
5482
|
+
path,
|
|
5472
5483
|
rootField,
|
|
5473
5484
|
index,
|
|
5474
|
-
|
|
5485
|
+
value
|
|
5475
5486
|
} = props;
|
|
5476
|
-
const
|
|
5477
|
-
const
|
|
5478
|
-
const [
|
|
5479
|
-
const [
|
|
5480
|
-
|
|
5481
|
-
|
|
5487
|
+
const { useUploadFile: useUploadFile2 } = (0, provider_exports.useService)();
|
|
5488
|
+
const { mutateAsync } = useUploadFile2();
|
|
5489
|
+
const [url, setUrl] = (0, import_react22.useState)(value || null);
|
|
5490
|
+
const [fileInfo, setFileInfo] = (0, import_react22.useState)(null);
|
|
5491
|
+
(0, import_react22.useEffect)(() => {
|
|
5492
|
+
if (!value) return;
|
|
5493
|
+
fetchFileMeta(value);
|
|
5494
|
+
}, [value]);
|
|
5495
|
+
const formatSize = (bytes) => {
|
|
5496
|
+
if (bytes < 1024) return bytes + " B";
|
|
5497
|
+
let kb = bytes / 1024;
|
|
5498
|
+
if (kb < 1024) return kb.toFixed(2) + " KB";
|
|
5499
|
+
let mb = kb / 1024;
|
|
5500
|
+
if (mb < 1024) return mb.toFixed(2) + " MB";
|
|
5501
|
+
return (mb / 1024).toFixed(2) + " GB";
|
|
5502
|
+
};
|
|
5503
|
+
const fetchFileMeta = async (url2) => {
|
|
5482
5504
|
try {
|
|
5483
|
-
const
|
|
5484
|
-
const
|
|
5485
|
-
|
|
5486
|
-
|
|
5487
|
-
|
|
5488
|
-
|
|
5489
|
-
|
|
5505
|
+
const res = await fetch(url2, { method: "HEAD" });
|
|
5506
|
+
const size = res.headers.get("content-length") || "";
|
|
5507
|
+
let type = res.headers.get("content-type") || "";
|
|
5508
|
+
const date = res.headers.get("last-modified") || "";
|
|
5509
|
+
const guessed = guessTypeFromUrl(url2);
|
|
5510
|
+
if (guessed) type = guessed;
|
|
5511
|
+
setFileInfo({
|
|
5512
|
+
size: size ? formatSize(Number(size)) : "--",
|
|
5513
|
+
type,
|
|
5514
|
+
date: date ? new Date(date).toLocaleString() : "--"
|
|
5490
5515
|
});
|
|
5491
|
-
|
|
5492
|
-
|
|
5493
|
-
|
|
5516
|
+
setUrl(url2);
|
|
5517
|
+
} catch (e) {
|
|
5518
|
+
console.error(e);
|
|
5494
5519
|
}
|
|
5495
5520
|
};
|
|
5496
|
-
const
|
|
5497
|
-
|
|
5498
|
-
|
|
5499
|
-
|
|
5500
|
-
|
|
5501
|
-
|
|
5502
|
-
|
|
5503
|
-
|
|
5504
|
-
|
|
5505
|
-
|
|
5506
|
-
if (base64.startsWith("iVBORw0KGgo")) mimeType = "image/png";
|
|
5507
|
-
else if (base64.startsWith("/9j/")) mimeType = "image/jpeg";
|
|
5508
|
-
else if (base64.startsWith("R0lGOD")) mimeType = "image/gif";
|
|
5509
|
-
else if (base64.startsWith("Qk")) mimeType = "image/bmp";
|
|
5510
|
-
else if (base64.startsWith("UklGR")) mimeType = "image/webp";
|
|
5511
|
-
return mimeType ? `data:${mimeType};base64,${base64}` : null;
|
|
5512
|
-
};
|
|
5513
|
-
const handleFileChange = async (e, onChange) => {
|
|
5514
|
-
if (readonly) return;
|
|
5515
|
-
const file = e?.target?.files?.[0];
|
|
5516
|
-
if (!file) return;
|
|
5517
|
-
if (!ALLOWED_TYPES.includes(file.type)) {
|
|
5518
|
-
alert(`File type not allowed: ${file.type}`);
|
|
5519
|
-
return;
|
|
5520
|
-
}
|
|
5521
|
-
if (file.size > MAX_FILE_SIZE) {
|
|
5522
|
-
alert(`File exceeds 10MB limit.`);
|
|
5523
|
-
return;
|
|
5524
|
-
}
|
|
5525
|
-
const fileUrl = URL.createObjectURL(file);
|
|
5526
|
-
setSelectedFile(file);
|
|
5527
|
-
setSelectedPreview(fileUrl);
|
|
5528
|
-
const base64 = await convertUrlToBase64(fileUrl);
|
|
5529
|
-
const base64Data = extractBase64Data(base64);
|
|
5530
|
-
methods?.setValue(name, base64Data, { shouldDirty: true });
|
|
5531
|
-
onChange(base64Data);
|
|
5532
|
-
handleOnchange && handleOnchange(name ?? "", base64Data);
|
|
5521
|
+
const onUploadFile = async (formData) => {
|
|
5522
|
+
const res = await mutateAsync({
|
|
5523
|
+
formData,
|
|
5524
|
+
service,
|
|
5525
|
+
xNode,
|
|
5526
|
+
path
|
|
5527
|
+
});
|
|
5528
|
+
const url2 = res?.url;
|
|
5529
|
+
methods?.setValue(name, url2, { shouldDirty: true });
|
|
5530
|
+
handleOnchange && handleOnchange(name ?? "", url2);
|
|
5533
5531
|
if (filename) {
|
|
5534
5532
|
methods?.setValue(
|
|
5535
5533
|
rootField ? `${rootField?.name}.${index}.${filename}` : filename,
|
|
5536
|
-
|
|
5534
|
+
url2?.split("/").pop(),
|
|
5537
5535
|
{ shouldDirty: true }
|
|
5538
5536
|
);
|
|
5539
5537
|
handleOnchange && handleOnchange(
|
|
5540
5538
|
rootField ? `${rootField?.name}.${index}.${filename}` : filename,
|
|
5541
|
-
|
|
5539
|
+
url2?.split("/").pop()
|
|
5542
5540
|
);
|
|
5543
5541
|
}
|
|
5542
|
+
setUrl(url2);
|
|
5543
|
+
fetchFileMeta(url2);
|
|
5544
|
+
return url2;
|
|
5544
5545
|
};
|
|
5545
|
-
const
|
|
5546
|
-
if (
|
|
5547
|
-
|
|
5548
|
-
|
|
5549
|
-
|
|
5550
|
-
|
|
5546
|
+
const onDeleteFile = () => {
|
|
5547
|
+
if (filename) {
|
|
5548
|
+
methods?.setValue(
|
|
5549
|
+
rootField ? `${rootField?.name}.${index}.${filename}` : filename,
|
|
5550
|
+
null,
|
|
5551
|
+
{ shouldDirty: true }
|
|
5552
|
+
);
|
|
5553
|
+
handleOnchange && handleOnchange(
|
|
5554
|
+
rootField ? `${rootField?.name}.${index}.${filename}` : filename,
|
|
5555
|
+
null
|
|
5556
|
+
);
|
|
5557
|
+
}
|
|
5558
|
+
setUrl(null);
|
|
5559
|
+
setFileInfo(null);
|
|
5560
|
+
onDeleteFile && onDeleteFile();
|
|
5561
|
+
methods?.setValue(name, null, { shouldDirty: true });
|
|
5551
5562
|
handleOnchange && handleOnchange(name ?? "", null);
|
|
5552
5563
|
};
|
|
5553
|
-
(0, import_react22.useEffect)(() => {
|
|
5554
|
-
return () => {
|
|
5555
|
-
if (selectedPreview) {
|
|
5556
|
-
URL.revokeObjectURL(selectedPreview);
|
|
5557
|
-
}
|
|
5558
|
-
};
|
|
5559
|
-
}, [selectedPreview]);
|
|
5560
5564
|
return {
|
|
5561
|
-
|
|
5562
|
-
|
|
5563
|
-
|
|
5564
|
-
|
|
5565
|
-
binaryRef,
|
|
5566
|
-
handleFileChange,
|
|
5567
|
-
handleRemoveFile,
|
|
5568
|
-
checkIsImageLink,
|
|
5569
|
-
getBase64WithMimeType,
|
|
5570
|
-
setInitialFile
|
|
5565
|
+
onUploadFile,
|
|
5566
|
+
onDeleteFile,
|
|
5567
|
+
fileInfo,
|
|
5568
|
+
url
|
|
5571
5569
|
};
|
|
5572
5570
|
};
|
|
5573
5571
|
|
|
@@ -5639,7 +5637,7 @@ var tableHeadController = (props) => {
|
|
|
5639
5637
|
|
|
5640
5638
|
// src/widget/advance/table/table-view/controller.ts
|
|
5641
5639
|
var import_react24 = require("react");
|
|
5642
|
-
var
|
|
5640
|
+
var import_utils17 = require("@fctc/interface-logic/utils");
|
|
5643
5641
|
var tableController = ({ data }) => {
|
|
5644
5642
|
const [rows, setRows] = (0, import_react24.useState)([]);
|
|
5645
5643
|
const [columnVisibility, setColumnVisibility] = (0, import_react24.useState)({});
|
|
@@ -5682,10 +5680,10 @@ var tableController = ({ data }) => {
|
|
|
5682
5680
|
const columns = (0, import_react24.useMemo)(() => {
|
|
5683
5681
|
try {
|
|
5684
5682
|
return mergeFields?.filter((item) => {
|
|
5685
|
-
return item?.widget !== "details_Receive_money" && !(item?.column_invisible ?
|
|
5683
|
+
return item?.widget !== "details_Receive_money" && !(item?.column_invisible ? import_utils17.domainHelper.matchDomains(
|
|
5686
5684
|
data.context,
|
|
5687
5685
|
item?.column_invisible
|
|
5688
|
-
) : item?.invisible ?
|
|
5686
|
+
) : item?.invisible ? import_utils17.domainHelper.matchDomains(data.context, item?.invisible) : false);
|
|
5689
5687
|
})?.map((field) => {
|
|
5690
5688
|
const overridden = columnVisibility[field?.name];
|
|
5691
5689
|
return {
|
package/dist/widget.mjs
CHANGED
|
@@ -4372,6 +4372,28 @@ function useStorageState(key) {
|
|
|
4372
4372
|
);
|
|
4373
4373
|
return [state, setValue];
|
|
4374
4374
|
}
|
|
4375
|
+
var guessTypeFromUrl = (url) => {
|
|
4376
|
+
const ext = url.split(".").pop()?.toLowerCase();
|
|
4377
|
+
if (!ext) return null;
|
|
4378
|
+
const map = {
|
|
4379
|
+
jpg: "image/jpeg",
|
|
4380
|
+
jpeg: "image/jpeg",
|
|
4381
|
+
png: "image/png",
|
|
4382
|
+
webp: "image/webp",
|
|
4383
|
+
gif: "image/gif",
|
|
4384
|
+
svg: "image/svg+xml",
|
|
4385
|
+
bmp: "image/bmp",
|
|
4386
|
+
tiff: "image/tiff",
|
|
4387
|
+
pdf: "application/pdf",
|
|
4388
|
+
zip: "application/zip",
|
|
4389
|
+
rar: "application/x-rar-compressed",
|
|
4390
|
+
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
|
4391
|
+
xls: "application/vnd.ms-excel",
|
|
4392
|
+
mp4: "video/mp4",
|
|
4393
|
+
mov: "video/quicktime"
|
|
4394
|
+
};
|
|
4395
|
+
return map[ext] || null;
|
|
4396
|
+
};
|
|
4375
4397
|
|
|
4376
4398
|
// src/utils.ts
|
|
4377
4399
|
__reExport(utils_exports, utils_star);
|
|
@@ -5519,132 +5541,108 @@ var colorFieldController = (props) => {
|
|
|
5519
5541
|
};
|
|
5520
5542
|
|
|
5521
5543
|
// src/widget/basic/binary-field/controller.ts
|
|
5522
|
-
import { useEffect as useEffect13,
|
|
5523
|
-
import { isBase64Image } from "@fctc/interface-logic/utils";
|
|
5524
|
-
var ALLOWED_TYPES = [
|
|
5525
|
-
"image/jpeg",
|
|
5526
|
-
"image/png",
|
|
5527
|
-
"application/pdf",
|
|
5528
|
-
"video/mp4",
|
|
5529
|
-
"application/zip",
|
|
5530
|
-
"application/x-zip-compressed",
|
|
5531
|
-
"application/vnd.ms-excel",
|
|
5532
|
-
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
|
5533
|
-
"application/json"
|
|
5534
|
-
];
|
|
5535
|
-
var MAX_FILE_SIZE = 10 * 1024 * 1024;
|
|
5536
|
-
var MAX_TOTAL_SIZE = 50 * 1024 * 1024;
|
|
5544
|
+
import { useEffect as useEffect13, useState as useState12 } from "react";
|
|
5537
5545
|
var binaryFieldController = (props) => {
|
|
5538
5546
|
const {
|
|
5539
5547
|
name,
|
|
5540
5548
|
methods,
|
|
5541
5549
|
readonly = false,
|
|
5542
|
-
value,
|
|
5543
5550
|
filename,
|
|
5551
|
+
onChange: handleOnchange,
|
|
5552
|
+
service,
|
|
5553
|
+
xNode,
|
|
5554
|
+
path,
|
|
5544
5555
|
rootField,
|
|
5545
5556
|
index,
|
|
5546
|
-
|
|
5557
|
+
value
|
|
5547
5558
|
} = props;
|
|
5548
|
-
const
|
|
5549
|
-
const
|
|
5550
|
-
const [
|
|
5551
|
-
const [
|
|
5552
|
-
|
|
5553
|
-
|
|
5559
|
+
const { useUploadFile: useUploadFile2 } = (0, provider_exports.useService)();
|
|
5560
|
+
const { mutateAsync } = useUploadFile2();
|
|
5561
|
+
const [url, setUrl] = useState12(value || null);
|
|
5562
|
+
const [fileInfo, setFileInfo] = useState12(null);
|
|
5563
|
+
useEffect13(() => {
|
|
5564
|
+
if (!value) return;
|
|
5565
|
+
fetchFileMeta(value);
|
|
5566
|
+
}, [value]);
|
|
5567
|
+
const formatSize = (bytes) => {
|
|
5568
|
+
if (bytes < 1024) return bytes + " B";
|
|
5569
|
+
let kb = bytes / 1024;
|
|
5570
|
+
if (kb < 1024) return kb.toFixed(2) + " KB";
|
|
5571
|
+
let mb = kb / 1024;
|
|
5572
|
+
if (mb < 1024) return mb.toFixed(2) + " MB";
|
|
5573
|
+
return (mb / 1024).toFixed(2) + " GB";
|
|
5574
|
+
};
|
|
5575
|
+
const fetchFileMeta = async (url2) => {
|
|
5554
5576
|
try {
|
|
5555
|
-
const
|
|
5556
|
-
const
|
|
5557
|
-
|
|
5558
|
-
|
|
5559
|
-
|
|
5560
|
-
|
|
5561
|
-
|
|
5577
|
+
const res = await fetch(url2, { method: "HEAD" });
|
|
5578
|
+
const size = res.headers.get("content-length") || "";
|
|
5579
|
+
let type = res.headers.get("content-type") || "";
|
|
5580
|
+
const date = res.headers.get("last-modified") || "";
|
|
5581
|
+
const guessed = guessTypeFromUrl(url2);
|
|
5582
|
+
if (guessed) type = guessed;
|
|
5583
|
+
setFileInfo({
|
|
5584
|
+
size: size ? formatSize(Number(size)) : "--",
|
|
5585
|
+
type,
|
|
5586
|
+
date: date ? new Date(date).toLocaleString() : "--"
|
|
5562
5587
|
});
|
|
5563
|
-
|
|
5564
|
-
|
|
5565
|
-
|
|
5588
|
+
setUrl(url2);
|
|
5589
|
+
} catch (e) {
|
|
5590
|
+
console.error(e);
|
|
5566
5591
|
}
|
|
5567
5592
|
};
|
|
5568
|
-
const
|
|
5569
|
-
|
|
5570
|
-
|
|
5571
|
-
|
|
5572
|
-
|
|
5573
|
-
|
|
5574
|
-
|
|
5575
|
-
|
|
5576
|
-
|
|
5577
|
-
|
|
5578
|
-
if (base64.startsWith("iVBORw0KGgo")) mimeType = "image/png";
|
|
5579
|
-
else if (base64.startsWith("/9j/")) mimeType = "image/jpeg";
|
|
5580
|
-
else if (base64.startsWith("R0lGOD")) mimeType = "image/gif";
|
|
5581
|
-
else if (base64.startsWith("Qk")) mimeType = "image/bmp";
|
|
5582
|
-
else if (base64.startsWith("UklGR")) mimeType = "image/webp";
|
|
5583
|
-
return mimeType ? `data:${mimeType};base64,${base64}` : null;
|
|
5584
|
-
};
|
|
5585
|
-
const handleFileChange = async (e, onChange) => {
|
|
5586
|
-
if (readonly) return;
|
|
5587
|
-
const file = e?.target?.files?.[0];
|
|
5588
|
-
if (!file) return;
|
|
5589
|
-
if (!ALLOWED_TYPES.includes(file.type)) {
|
|
5590
|
-
alert(`File type not allowed: ${file.type}`);
|
|
5591
|
-
return;
|
|
5592
|
-
}
|
|
5593
|
-
if (file.size > MAX_FILE_SIZE) {
|
|
5594
|
-
alert(`File exceeds 10MB limit.`);
|
|
5595
|
-
return;
|
|
5596
|
-
}
|
|
5597
|
-
const fileUrl = URL.createObjectURL(file);
|
|
5598
|
-
setSelectedFile(file);
|
|
5599
|
-
setSelectedPreview(fileUrl);
|
|
5600
|
-
const base64 = await convertUrlToBase64(fileUrl);
|
|
5601
|
-
const base64Data = extractBase64Data(base64);
|
|
5602
|
-
methods?.setValue(name, base64Data, { shouldDirty: true });
|
|
5603
|
-
onChange(base64Data);
|
|
5604
|
-
handleOnchange && handleOnchange(name ?? "", base64Data);
|
|
5593
|
+
const onUploadFile = async (formData) => {
|
|
5594
|
+
const res = await mutateAsync({
|
|
5595
|
+
formData,
|
|
5596
|
+
service,
|
|
5597
|
+
xNode,
|
|
5598
|
+
path
|
|
5599
|
+
});
|
|
5600
|
+
const url2 = res?.url;
|
|
5601
|
+
methods?.setValue(name, url2, { shouldDirty: true });
|
|
5602
|
+
handleOnchange && handleOnchange(name ?? "", url2);
|
|
5605
5603
|
if (filename) {
|
|
5606
5604
|
methods?.setValue(
|
|
5607
5605
|
rootField ? `${rootField?.name}.${index}.${filename}` : filename,
|
|
5608
|
-
|
|
5606
|
+
url2?.split("/").pop(),
|
|
5609
5607
|
{ shouldDirty: true }
|
|
5610
5608
|
);
|
|
5611
5609
|
handleOnchange && handleOnchange(
|
|
5612
5610
|
rootField ? `${rootField?.name}.${index}.${filename}` : filename,
|
|
5613
|
-
|
|
5611
|
+
url2?.split("/").pop()
|
|
5614
5612
|
);
|
|
5615
5613
|
}
|
|
5614
|
+
setUrl(url2);
|
|
5615
|
+
fetchFileMeta(url2);
|
|
5616
|
+
return url2;
|
|
5616
5617
|
};
|
|
5617
|
-
const
|
|
5618
|
-
if (
|
|
5619
|
-
|
|
5620
|
-
|
|
5621
|
-
|
|
5622
|
-
|
|
5618
|
+
const onDeleteFile = () => {
|
|
5619
|
+
if (filename) {
|
|
5620
|
+
methods?.setValue(
|
|
5621
|
+
rootField ? `${rootField?.name}.${index}.${filename}` : filename,
|
|
5622
|
+
null,
|
|
5623
|
+
{ shouldDirty: true }
|
|
5624
|
+
);
|
|
5625
|
+
handleOnchange && handleOnchange(
|
|
5626
|
+
rootField ? `${rootField?.name}.${index}.${filename}` : filename,
|
|
5627
|
+
null
|
|
5628
|
+
);
|
|
5629
|
+
}
|
|
5630
|
+
setUrl(null);
|
|
5631
|
+
setFileInfo(null);
|
|
5632
|
+
onDeleteFile && onDeleteFile();
|
|
5633
|
+
methods?.setValue(name, null, { shouldDirty: true });
|
|
5623
5634
|
handleOnchange && handleOnchange(name ?? "", null);
|
|
5624
5635
|
};
|
|
5625
|
-
useEffect13(() => {
|
|
5626
|
-
return () => {
|
|
5627
|
-
if (selectedPreview) {
|
|
5628
|
-
URL.revokeObjectURL(selectedPreview);
|
|
5629
|
-
}
|
|
5630
|
-
};
|
|
5631
|
-
}, [selectedPreview]);
|
|
5632
5636
|
return {
|
|
5633
|
-
|
|
5634
|
-
|
|
5635
|
-
|
|
5636
|
-
|
|
5637
|
-
binaryRef,
|
|
5638
|
-
handleFileChange,
|
|
5639
|
-
handleRemoveFile,
|
|
5640
|
-
checkIsImageLink,
|
|
5641
|
-
getBase64WithMimeType,
|
|
5642
|
-
setInitialFile
|
|
5637
|
+
onUploadFile,
|
|
5638
|
+
onDeleteFile,
|
|
5639
|
+
fileInfo,
|
|
5640
|
+
url
|
|
5643
5641
|
};
|
|
5644
5642
|
};
|
|
5645
5643
|
|
|
5646
5644
|
// src/widget/advance/table/table-head/controller.ts
|
|
5647
|
-
import { useMemo as useMemo9, useRef as
|
|
5645
|
+
import { useMemo as useMemo9, useRef as useRef4 } from "react";
|
|
5648
5646
|
var tableHeadController = (props) => {
|
|
5649
5647
|
const {
|
|
5650
5648
|
typeTable,
|
|
@@ -5655,7 +5653,7 @@ var tableHeadController = (props) => {
|
|
|
5655
5653
|
setSelectedRowKeys
|
|
5656
5654
|
} = props;
|
|
5657
5655
|
const { rowIds: recordIds } = useGetRowIds(tableRef);
|
|
5658
|
-
const selectedRowKeysRef =
|
|
5656
|
+
const selectedRowKeysRef = useRef4(recordIds);
|
|
5659
5657
|
const isGroupTable = typeTable === "group";
|
|
5660
5658
|
const recordsCheckedGroup = useMemo9(() => {
|
|
5661
5659
|
if (!rows || !groupByList) return 0;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fctc/widget-logic",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.9.0",
|
|
4
4
|
"types": "dist/index.d.ts",
|
|
5
5
|
"main": "dist/index.cjs",
|
|
6
6
|
"module": "dist/index.mjs",
|
|
@@ -74,7 +74,7 @@
|
|
|
74
74
|
"test": "jest"
|
|
75
75
|
},
|
|
76
76
|
"dependencies": {
|
|
77
|
-
"@fctc/interface-logic": "^4.1
|
|
77
|
+
"@fctc/interface-logic": "^4.2.1",
|
|
78
78
|
"@headlessui/react": "^2.2.6",
|
|
79
79
|
"@tanstack/react-query": "^5.84.0",
|
|
80
80
|
"i18next": "^25.3.2",
|