@universe-platform/ui 0.1.0-beta.34 → 0.1.0-beta.35
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.d.mts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +485 -315
- package/dist/index.mjs +356 -195
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -66,6 +66,7 @@ __export(src_exports, {
|
|
|
66
66
|
COLUMN_TYPE_LABELS: () => COLUMN_TYPE_LABELS,
|
|
67
67
|
ColumnHeaderTitle: () => ColumnHeaderTitle,
|
|
68
68
|
CreateTemplateModal: () => CreateTemplateModal,
|
|
69
|
+
DEFAULT_FILTER_COLUMN_TYPES: () => DEFAULT_FILTER_COLUMN_TYPES,
|
|
69
70
|
DEFAULT_PLACEMENT_STATUS_COLORS: () => DEFAULT_PLACEMENT_STATUS_COLORS,
|
|
70
71
|
DatePickerCell: () => DatePickerCell,
|
|
71
72
|
DynamicFiltersBlock: () => DynamicFiltersBlock,
|
|
@@ -80,6 +81,7 @@ __export(src_exports, {
|
|
|
80
81
|
RELATION_BUTTON_COUNTS_ACTION: () => RELATION_BUTTON_COUNTS_ACTION,
|
|
81
82
|
RELATION_LABEL_KEY: () => RELATION_LABEL_KEY,
|
|
82
83
|
RELATION_SEP: () => RELATION_SEP,
|
|
84
|
+
RESOLVE_DEFAULT_FILTERS_ACTION: () => RESOLVE_DEFAULT_FILTERS_ACTION,
|
|
83
85
|
RelationFilterPopover: () => RelationFilterPopover,
|
|
84
86
|
RelationPickerCell: () => RelationPickerCell,
|
|
85
87
|
SettingsAndActionsBlock: () => SettingsAndActionsBlock,
|
|
@@ -100,6 +102,7 @@ __export(src_exports, {
|
|
|
100
102
|
buildRelationRef: () => buildRelationRef,
|
|
101
103
|
calculateMinColumnWidth: () => calculateMinColumnWidth,
|
|
102
104
|
checkElementTruncation: () => checkElementTruncation,
|
|
105
|
+
cleanPlacementFilterDefaults: () => cleanPlacementFilterDefaults,
|
|
103
106
|
cn: () => cn,
|
|
104
107
|
columnRefLabel: () => columnRefLabel,
|
|
105
108
|
computeFormulaValue: () => computeFormulaValue,
|
|
@@ -115,6 +118,8 @@ __export(src_exports, {
|
|
|
115
118
|
formatTimeInput: () => formatTimeInput,
|
|
116
119
|
formatTimeIso: () => formatTimeIso,
|
|
117
120
|
generateWhatsAppLink: () => generateWhatsAppLink,
|
|
121
|
+
getColumnDefaultFilter: () => getColumnDefaultFilter,
|
|
122
|
+
getDefaultFilterColumns: () => getDefaultFilterColumns,
|
|
118
123
|
getDeterministicPastelBadge: () => getDeterministicPastelBadge,
|
|
119
124
|
getEligibleCopyTargets: () => getEligibleCopyTargets,
|
|
120
125
|
getNextVariableIndex: () => getNextVariableIndex,
|
|
@@ -150,11 +155,14 @@ __export(src_exports, {
|
|
|
150
155
|
renameCopyTarget: () => renameCopyTarget,
|
|
151
156
|
resolveDefaultStatusId: () => resolveDefaultStatusId,
|
|
152
157
|
resolveProtocol: () => resolveProtocol,
|
|
158
|
+
sanitizeDefaultFilter: () => sanitizeDefaultFilter,
|
|
153
159
|
sanitizePhoneNumber: () => sanitizePhoneNumber,
|
|
154
160
|
sanitizeTemplateNameInput: () => sanitizeTemplateNameInput,
|
|
155
161
|
seamlessVariableEngine: () => seamlessVariableEngine,
|
|
156
162
|
splitHeaderTitle: () => splitHeaderTitle,
|
|
163
|
+
supportsDefaultFilter: () => supportsDefaultFilter,
|
|
157
164
|
tableColumns: () => tableColumns,
|
|
165
|
+
toColumnFilterValue: () => toColumnFilterValue,
|
|
158
166
|
useColumnReorder: () => useColumnReorder,
|
|
159
167
|
useColumnResize: () => useColumnResize,
|
|
160
168
|
useSmartTooltip: () => useSmartTooltip,
|
|
@@ -166,7 +174,8 @@ __export(src_exports, {
|
|
|
166
174
|
validateTemplateBody: () => validateTemplateBody,
|
|
167
175
|
validateTemplateButtons: () => validateTemplateButtons,
|
|
168
176
|
validateWhatsAppTemplate: () => validateWhatsAppTemplate,
|
|
169
|
-
validateWordToVariableRatio: () => validateWordToVariableRatio
|
|
177
|
+
validateWordToVariableRatio: () => validateWordToVariableRatio,
|
|
178
|
+
withDefaultFilter: () => withDefaultFilter
|
|
170
179
|
});
|
|
171
180
|
module.exports = __toCommonJS(src_exports);
|
|
172
181
|
|
|
@@ -1203,8 +1212,57 @@ function getRelationButtonColumns(columns) {
|
|
|
1203
1212
|
return (columns || []).filter((c) => isRelationButtonsColumn(c) && c.name !== "_id");
|
|
1204
1213
|
}
|
|
1205
1214
|
|
|
1215
|
+
// ../shared/src/defaultFilters.ts
|
|
1216
|
+
var DEFAULT_FILTER_COLUMN_TYPES = ["STRING", "RELATION"];
|
|
1217
|
+
var RESOLVE_DEFAULT_FILTERS_ACTION = "RESOLVE_DEFAULT_FILTERS";
|
|
1218
|
+
var isString = (v) => typeof v === "string";
|
|
1219
|
+
function supportsDefaultFilter(type) {
|
|
1220
|
+
if (!type) return false;
|
|
1221
|
+
return DEFAULT_FILTER_COLUMN_TYPES.includes(String(type).toUpperCase());
|
|
1222
|
+
}
|
|
1223
|
+
function sanitizeDefaultFilter(raw) {
|
|
1224
|
+
if (!raw || typeof raw !== "object") return null;
|
|
1225
|
+
const value = raw.value;
|
|
1226
|
+
if (!isString(value) || value.trim() === "") return null;
|
|
1227
|
+
const label = raw.label;
|
|
1228
|
+
return __spreadValues({ value: value.trim() }, isString(label) && label.trim() ? { label: label.trim() } : {});
|
|
1229
|
+
}
|
|
1230
|
+
function getColumnDefaultFilter(col) {
|
|
1231
|
+
var _a;
|
|
1232
|
+
if (!col || !supportsDefaultFilter(col.type)) return null;
|
|
1233
|
+
return sanitizeDefaultFilter((_a = col.config) == null ? void 0 : _a.defaultFilter);
|
|
1234
|
+
}
|
|
1235
|
+
function getDefaultFilterColumns(columns) {
|
|
1236
|
+
const out = [];
|
|
1237
|
+
for (const c of columns || []) {
|
|
1238
|
+
if (!(c == null ? void 0 : c.name) || c.name === "_id") continue;
|
|
1239
|
+
const setting = getColumnDefaultFilter(c);
|
|
1240
|
+
if (setting) out.push({ name: c.name, type: String(c.type).toUpperCase(), setting });
|
|
1241
|
+
}
|
|
1242
|
+
return out;
|
|
1243
|
+
}
|
|
1244
|
+
function toColumnFilterValue(type, value) {
|
|
1245
|
+
return String(type).toUpperCase() === "RELATION" ? [value] : value;
|
|
1246
|
+
}
|
|
1247
|
+
function withDefaultFilter(config, type, setting) {
|
|
1248
|
+
const next = __spreadValues({}, config || {});
|
|
1249
|
+
const clean = supportsDefaultFilter(type) ? sanitizeDefaultFilter(setting) : null;
|
|
1250
|
+
if (clean) next.defaultFilter = clean;
|
|
1251
|
+
else delete next.defaultFilter;
|
|
1252
|
+
return next;
|
|
1253
|
+
}
|
|
1254
|
+
function cleanPlacementFilterDefaults(defaults, allowedKeys) {
|
|
1255
|
+
if (!defaults || typeof defaults !== "object") return void 0;
|
|
1256
|
+
const out = {};
|
|
1257
|
+
for (const key of allowedKeys) {
|
|
1258
|
+
const v = defaults[key];
|
|
1259
|
+
if (key && isString(v) && v.trim() !== "") out[key] = v;
|
|
1260
|
+
}
|
|
1261
|
+
return Object.keys(out).length > 0 ? out : void 0;
|
|
1262
|
+
}
|
|
1263
|
+
|
|
1206
1264
|
// src/components/TableBlock/TableBlockClient.tsx
|
|
1207
|
-
var
|
|
1265
|
+
var import_react18 = __toESM(require("react"));
|
|
1208
1266
|
|
|
1209
1267
|
// src/hooks/useToast.ts
|
|
1210
1268
|
var import_react2 = require("react");
|
|
@@ -6245,6 +6303,49 @@ function RelationButtonsBar({
|
|
|
6245
6303
|
);
|
|
6246
6304
|
}
|
|
6247
6305
|
|
|
6306
|
+
// src/components/TableBlock/useDefaultColumnFilters.ts
|
|
6307
|
+
var import_react17 = require("react");
|
|
6308
|
+
var RESOLVE_TIMEOUT_MS = 8e3;
|
|
6309
|
+
function unwrap2(res) {
|
|
6310
|
+
const body = (res == null ? void 0 : res.data) && typeof res.data === "object" && !Array.isArray(res.data) ? res.data : res;
|
|
6311
|
+
const filters = body == null ? void 0 : body.filters;
|
|
6312
|
+
return filters && typeof filters === "object" ? filters : {};
|
|
6313
|
+
}
|
|
6314
|
+
function useDefaultColumnFilters({ columns, tableId, executeAction, onResolved }) {
|
|
6315
|
+
const hasDefaults = getDefaultFilterColumns(columns).length > 0;
|
|
6316
|
+
const [ready, setReady] = (0, import_react17.useState)(() => !hasDefaults);
|
|
6317
|
+
const doneRef = (0, import_react17.useRef)(false);
|
|
6318
|
+
const onResolvedRef = (0, import_react17.useRef)(onResolved);
|
|
6319
|
+
onResolvedRef.current = onResolved;
|
|
6320
|
+
const actionRef = (0, import_react17.useRef)(executeAction);
|
|
6321
|
+
actionRef.current = executeAction;
|
|
6322
|
+
(0, import_react17.useEffect)(() => {
|
|
6323
|
+
if (doneRef.current || !hasDefaults) return;
|
|
6324
|
+
doneRef.current = true;
|
|
6325
|
+
const exec = actionRef.current;
|
|
6326
|
+
if (!tableId || !exec) {
|
|
6327
|
+
setReady(true);
|
|
6328
|
+
return;
|
|
6329
|
+
}
|
|
6330
|
+
let settled = false;
|
|
6331
|
+
const finish = (filters) => {
|
|
6332
|
+
if (settled) return;
|
|
6333
|
+
settled = true;
|
|
6334
|
+
if (filters && Object.keys(filters).length > 0) onResolvedRef.current(filters);
|
|
6335
|
+
setReady(true);
|
|
6336
|
+
};
|
|
6337
|
+
const timer = setTimeout(() => finish(), RESOLVE_TIMEOUT_MS);
|
|
6338
|
+
Promise.resolve(exec(RESOLVE_DEFAULT_FILTERS_ACTION, { tableId })).then(
|
|
6339
|
+
(res) => finish(unwrap2(res)),
|
|
6340
|
+
(err) => {
|
|
6341
|
+
console.warn("[TableBlock] Failed to resolve default filters:", err);
|
|
6342
|
+
finish();
|
|
6343
|
+
}
|
|
6344
|
+
).finally(() => clearTimeout(timer));
|
|
6345
|
+
}, [hasDefaults, tableId]);
|
|
6346
|
+
return ready;
|
|
6347
|
+
}
|
|
6348
|
+
|
|
6248
6349
|
// src/components/TableBlock/TableBlockClient.tsx
|
|
6249
6350
|
var import_jsx_runtime15 = require("react/jsx-runtime");
|
|
6250
6351
|
function TableBlockClient({
|
|
@@ -6273,7 +6374,7 @@ function TableBlockClient({
|
|
|
6273
6374
|
hideRelationButtons
|
|
6274
6375
|
}) {
|
|
6275
6376
|
const { showError, addToast } = useToast();
|
|
6276
|
-
const [isExporting, setIsExporting] = (0,
|
|
6377
|
+
const [isExporting, setIsExporting] = (0, import_react18.useState)(false);
|
|
6277
6378
|
const resolvedRole = role ? getRolePermissions(role) : void 0;
|
|
6278
6379
|
const effectivePermissions = permissions || (resolvedRole == null ? void 0 : resolvedRole.permissions) || {
|
|
6279
6380
|
canCreate: !readOnly,
|
|
@@ -6292,18 +6393,18 @@ function TableBlockClient({
|
|
|
6292
6393
|
return calculateMinColumnWidth(colName, false, col == null ? void 0 : col.type);
|
|
6293
6394
|
}
|
|
6294
6395
|
});
|
|
6295
|
-
const executeActionRef = (0,
|
|
6296
|
-
(0,
|
|
6396
|
+
const executeActionRef = (0, import_react18.useRef)(executeAction);
|
|
6397
|
+
(0, import_react18.useEffect)(() => {
|
|
6297
6398
|
executeActionRef.current = executeAction;
|
|
6298
6399
|
}, [executeAction]);
|
|
6299
|
-
const [isMounted, setIsMounted] = (0,
|
|
6300
|
-
const [isInitialLoading, setIsInitialLoading] = (0,
|
|
6301
|
-
const [page, setPage] = (0,
|
|
6302
|
-
const [limit, setLimit] = (0,
|
|
6303
|
-
const [totalRecords, setTotalRecords] = (0,
|
|
6304
|
-
const [totalPages, setTotalPages] = (0,
|
|
6305
|
-
const [showSummary, setShowSummary] = (0,
|
|
6306
|
-
(0,
|
|
6400
|
+
const [isMounted, setIsMounted] = (0, import_react18.useState)(false);
|
|
6401
|
+
const [isInitialLoading, setIsInitialLoading] = (0, import_react18.useState)(true);
|
|
6402
|
+
const [page, setPage] = (0, import_react18.useState)(1);
|
|
6403
|
+
const [limit, setLimit] = (0, import_react18.useState)(50);
|
|
6404
|
+
const [totalRecords, setTotalRecords] = (0, import_react18.useState)(0);
|
|
6405
|
+
const [totalPages, setTotalPages] = (0, import_react18.useState)(1);
|
|
6406
|
+
const [showSummary, setShowSummary] = (0, import_react18.useState)(false);
|
|
6407
|
+
(0, import_react18.useEffect)(() => {
|
|
6307
6408
|
if (typeof window !== "undefined") {
|
|
6308
6409
|
const savedSummary = localStorage.getItem(`table_summary_${tableKey}`);
|
|
6309
6410
|
if (savedSummary !== null) {
|
|
@@ -6352,7 +6453,7 @@ function TableBlockClient({
|
|
|
6352
6453
|
return __spreadProps(__spreadValues({}, row), { id: String(row.id || ""), data: rowData });
|
|
6353
6454
|
});
|
|
6354
6455
|
};
|
|
6355
|
-
const mergeColumnDefs = (0,
|
|
6456
|
+
const mergeColumnDefs = (0, import_react18.useCallback)((existingCols, incomingCols) => {
|
|
6356
6457
|
if (!incomingCols || incomingCols.length === 0) return existingCols || [];
|
|
6357
6458
|
if (!existingCols || existingCols.length === 0) return incomingCols;
|
|
6358
6459
|
const existingMap = new Map(existingCols.map((c) => [c.name, c]));
|
|
@@ -6372,18 +6473,18 @@ function TableBlockClient({
|
|
|
6372
6473
|
return ((_a = a.order) != null ? _a : 0) - ((_b = b.order) != null ? _b : 0);
|
|
6373
6474
|
});
|
|
6374
6475
|
}, []);
|
|
6375
|
-
const [localColumns, setLocalColumns] = (0,
|
|
6376
|
-
(0,
|
|
6476
|
+
const [localColumns, setLocalColumns] = (0, import_react18.useState)(() => (schema == null ? void 0 : schema.columns) || []);
|
|
6477
|
+
(0, import_react18.useEffect)(() => {
|
|
6377
6478
|
if ((schema == null ? void 0 : schema.columns) && schema.columns.length > 0) {
|
|
6378
6479
|
setLocalColumns((prev) => mergeColumnDefs(prev, schema.columns));
|
|
6379
6480
|
}
|
|
6380
6481
|
}, [schema == null ? void 0 : schema.columns, mergeColumnDefs]);
|
|
6381
|
-
const [dirty, setDirty] = (0,
|
|
6382
|
-
const dirtyRef = (0,
|
|
6383
|
-
(0,
|
|
6482
|
+
const [dirty, setDirty] = (0, import_react18.useState)({ added: [], modified: {}, deleted: [] });
|
|
6483
|
+
const dirtyRef = (0, import_react18.useRef)(dirty);
|
|
6484
|
+
(0, import_react18.useEffect)(() => {
|
|
6384
6485
|
dirtyRef.current = dirty;
|
|
6385
6486
|
}, [dirty]);
|
|
6386
|
-
const mergeWithDirty = (0,
|
|
6487
|
+
const mergeWithDirty = (0, import_react18.useCallback)((baseRecords) => {
|
|
6387
6488
|
const { added, modified, deleted } = dirtyRef.current;
|
|
6388
6489
|
const nonDeleted = (baseRecords || []).filter((r) => !deleted.includes(r.id));
|
|
6389
6490
|
const modifiedRecords = nonDeleted.map((r) => {
|
|
@@ -6396,8 +6497,8 @@ function TableBlockClient({
|
|
|
6396
6497
|
const uniqueAdded = added.filter((r) => !baseIds.has(r.id));
|
|
6397
6498
|
return [...uniqueAdded, ...modifiedRecords];
|
|
6398
6499
|
}, []);
|
|
6399
|
-
const [data, setData] = (0,
|
|
6400
|
-
const [serverRecords, setServerRecords] = (0,
|
|
6500
|
+
const [data, setData] = (0, import_react18.useState)(() => normalizeRecords(initialRecords));
|
|
6501
|
+
const [serverRecords, setServerRecords] = (0, import_react18.useState)(() => normalizeRecords(initialRecords));
|
|
6401
6502
|
const filteredData = data;
|
|
6402
6503
|
const isEqualValues = (a, b) => {
|
|
6403
6504
|
if (a === b) return true;
|
|
@@ -6409,30 +6510,30 @@ function TableBlockClient({
|
|
|
6409
6510
|
}
|
|
6410
6511
|
return false;
|
|
6411
6512
|
};
|
|
6412
|
-
const [baseRecordsMap, setBaseRecordsMap] = (0,
|
|
6513
|
+
const [baseRecordsMap, setBaseRecordsMap] = (0, import_react18.useState)(() => {
|
|
6413
6514
|
const map = /* @__PURE__ */ new Map();
|
|
6414
6515
|
(normalizeRecords(initialRecords) || []).forEach((r) => map.set(r.id, __spreadValues({}, r.data)));
|
|
6415
6516
|
return map;
|
|
6416
6517
|
});
|
|
6417
|
-
(0,
|
|
6518
|
+
(0, import_react18.useEffect)(() => {
|
|
6418
6519
|
if (initialRecords && initialRecords.length > 0) {
|
|
6419
6520
|
const map = /* @__PURE__ */ new Map();
|
|
6420
6521
|
(normalizeRecords(initialRecords) || []).forEach((r) => map.set(r.id, __spreadValues({}, r.data)));
|
|
6421
6522
|
setBaseRecordsMap(map);
|
|
6422
6523
|
}
|
|
6423
6524
|
}, [initialRecords]);
|
|
6424
|
-
const [searchQuery, setSearchQuery] = (0,
|
|
6425
|
-
const [columnFilters, setColumnFilters] = (0,
|
|
6426
|
-
const [activeSearchCol, setActiveSearchCol] = (0,
|
|
6427
|
-
const activeSearchRef = (0,
|
|
6428
|
-
const [activeRelationCol, setActiveRelationCol] = (0,
|
|
6429
|
-
const [relationTriggerRect, setRelationTriggerRect] = (0,
|
|
6430
|
-
const filterButtonRefs = (0,
|
|
6431
|
-
const [relationOptions, setRelationOptions] = (0,
|
|
6432
|
-
const [relationFilterOptions, setRelationFilterOptions] = (0,
|
|
6433
|
-
const [loadingFilterCol, setLoadingFilterCol] = (0,
|
|
6434
|
-
const relationDictionaryRef = (0,
|
|
6435
|
-
const mergeRelationOptions = (0,
|
|
6525
|
+
const [searchQuery, setSearchQuery] = (0, import_react18.useState)("");
|
|
6526
|
+
const [columnFilters, setColumnFilters] = (0, import_react18.useState)({});
|
|
6527
|
+
const [activeSearchCol, setActiveSearchCol] = (0, import_react18.useState)(null);
|
|
6528
|
+
const activeSearchRef = (0, import_react18.useRef)(null);
|
|
6529
|
+
const [activeRelationCol, setActiveRelationCol] = (0, import_react18.useState)(null);
|
|
6530
|
+
const [relationTriggerRect, setRelationTriggerRect] = (0, import_react18.useState)(null);
|
|
6531
|
+
const filterButtonRefs = (0, import_react18.useRef)({});
|
|
6532
|
+
const [relationOptions, setRelationOptions] = (0, import_react18.useState)({});
|
|
6533
|
+
const [relationFilterOptions, setRelationFilterOptions] = (0, import_react18.useState)({});
|
|
6534
|
+
const [loadingFilterCol, setLoadingFilterCol] = (0, import_react18.useState)(null);
|
|
6535
|
+
const relationDictionaryRef = (0, import_react18.useRef)({});
|
|
6536
|
+
const mergeRelationOptions = (0, import_react18.useCallback)((colName, newOptions) => {
|
|
6436
6537
|
if (!Array.isArray(newOptions) || newOptions.length === 0) return;
|
|
6437
6538
|
if (!relationDictionaryRef.current[colName]) {
|
|
6438
6539
|
relationDictionaryRef.current[colName] = /* @__PURE__ */ new Map();
|
|
@@ -6455,7 +6556,7 @@ function TableBlockClient({
|
|
|
6455
6556
|
}));
|
|
6456
6557
|
}
|
|
6457
6558
|
}, []);
|
|
6458
|
-
(0,
|
|
6559
|
+
(0, import_react18.useEffect)(() => {
|
|
6459
6560
|
if (!activeSearchCol) return;
|
|
6460
6561
|
const handleMouseDown = (e) => {
|
|
6461
6562
|
if (activeSearchRef.current && !activeSearchRef.current.contains(e.target)) {
|
|
@@ -6467,7 +6568,7 @@ function TableBlockClient({
|
|
|
6467
6568
|
document.removeEventListener("mousedown", handleMouseDown);
|
|
6468
6569
|
};
|
|
6469
6570
|
}, [activeSearchCol]);
|
|
6470
|
-
const filtersKey = (0,
|
|
6571
|
+
const filtersKey = (0, import_react18.useMemo)(() => {
|
|
6471
6572
|
const active = {};
|
|
6472
6573
|
Object.entries(columnFilters).forEach(([k, v]) => {
|
|
6473
6574
|
if (Array.isArray(v) && v.length > 0) active[k] = v;
|
|
@@ -6476,24 +6577,30 @@ function TableBlockClient({
|
|
|
6476
6577
|
});
|
|
6477
6578
|
return JSON.stringify(active);
|
|
6478
6579
|
}, [columnFilters]);
|
|
6479
|
-
const
|
|
6480
|
-
|
|
6580
|
+
const defaultFiltersReady = useDefaultColumnFilters({
|
|
6581
|
+
columns: localColumns,
|
|
6582
|
+
tableId: (schema == null ? void 0 : schema.tableMetaId) || (schema == null ? void 0 : schema.tableId) || (schema == null ? void 0 : schema.id),
|
|
6583
|
+
executeAction,
|
|
6584
|
+
onResolved: (resolved) => setColumnFilters((prev) => __spreadValues(__spreadValues({}, resolved), prev))
|
|
6585
|
+
});
|
|
6586
|
+
const [debouncedSearch, setDebouncedSearch] = (0, import_react18.useState)(searchQuery);
|
|
6587
|
+
(0, import_react18.useEffect)(() => {
|
|
6481
6588
|
const timer = setTimeout(() => {
|
|
6482
6589
|
setDebouncedSearch(searchQuery.trim());
|
|
6483
6590
|
}, 300);
|
|
6484
6591
|
return () => clearTimeout(timer);
|
|
6485
6592
|
}, [searchQuery]);
|
|
6486
|
-
const isSearchMountedRef = (0,
|
|
6487
|
-
(0,
|
|
6593
|
+
const isSearchMountedRef = (0, import_react18.useRef)(false);
|
|
6594
|
+
(0, import_react18.useEffect)(() => {
|
|
6488
6595
|
if (!isSearchMountedRef.current) {
|
|
6489
6596
|
isSearchMountedRef.current = true;
|
|
6490
6597
|
return;
|
|
6491
6598
|
}
|
|
6492
6599
|
setPage(1);
|
|
6493
6600
|
}, [debouncedSearch]);
|
|
6494
|
-
const [isFetching, setIsFetching] = (0,
|
|
6495
|
-
const fetchRequestIdRef = (0,
|
|
6496
|
-
const fetchTableData = (0,
|
|
6601
|
+
const [isFetching, setIsFetching] = (0, import_react18.useState)(false);
|
|
6602
|
+
const fetchRequestIdRef = (0, import_react18.useRef)(0);
|
|
6603
|
+
const fetchTableData = (0, import_react18.useCallback)((targetPage, targetLimit, targetSearch, targetFiltersKey) => {
|
|
6497
6604
|
const tableId = (schema == null ? void 0 : schema.tableMetaId) || (schema == null ? void 0 : schema.tableId) || (schema == null ? void 0 : schema.id);
|
|
6498
6605
|
const action = executeActionRef.current;
|
|
6499
6606
|
if (!tableId || !action) {
|
|
@@ -6617,11 +6724,12 @@ function TableBlockClient({
|
|
|
6617
6724
|
}
|
|
6618
6725
|
});
|
|
6619
6726
|
}, [schema == null ? void 0 : schema.tableMetaId, schema == null ? void 0 : schema.tableId, schema == null ? void 0 : schema.id, mergeColumnDefs, mergeWithDirty, mergeRelationOptions]);
|
|
6620
|
-
(0,
|
|
6727
|
+
(0, import_react18.useEffect)(() => {
|
|
6728
|
+
if (!defaultFiltersReady) return;
|
|
6621
6729
|
fetchTableData(page, limit, debouncedSearch, filtersKey);
|
|
6622
|
-
}, [page, limit, debouncedSearch, filtersKey, fetchTableData]);
|
|
6623
|
-
(0,
|
|
6624
|
-
if (initialRecords) {
|
|
6730
|
+
}, [page, limit, debouncedSearch, filtersKey, fetchTableData, defaultFiltersReady]);
|
|
6731
|
+
(0, import_react18.useEffect)(() => {
|
|
6732
|
+
if (initialRecords && defaultFiltersReady) {
|
|
6625
6733
|
const norm = normalizeRecords(initialRecords);
|
|
6626
6734
|
setServerRecords(norm);
|
|
6627
6735
|
const hasActiveFilters = Boolean(debouncedSearch) || Object.keys(columnFilters).length > 0;
|
|
@@ -6682,11 +6790,11 @@ function TableBlockClient({
|
|
|
6682
6790
|
setData(mergeWithDirty(norm));
|
|
6683
6791
|
}
|
|
6684
6792
|
}
|
|
6685
|
-
}, [initialRecords, mergeWithDirty, debouncedSearch, columnFilters, fetchTableData, page, limit, filtersKey]);
|
|
6686
|
-
const refetchTableData = (0,
|
|
6793
|
+
}, [initialRecords, mergeWithDirty, debouncedSearch, columnFilters, fetchTableData, page, limit, filtersKey, defaultFiltersReady]);
|
|
6794
|
+
const refetchTableData = (0, import_react18.useCallback)(() => {
|
|
6687
6795
|
return fetchTableData(page, limit, debouncedSearch, filtersKey);
|
|
6688
6796
|
}, [page, limit, debouncedSearch, filtersKey, fetchTableData]);
|
|
6689
|
-
const handleApplyColumnFilter = (0,
|
|
6797
|
+
const handleApplyColumnFilter = (0, import_react18.useCallback)((colName, nextVal) => {
|
|
6690
6798
|
setColumnFilters((prev) => {
|
|
6691
6799
|
const next = __spreadValues({}, prev);
|
|
6692
6800
|
if (nextVal === void 0 || Array.isArray(nextVal) && nextVal.length === 0 || typeof nextVal === "string" && !nextVal.trim() || typeof nextVal === "object" && "values" in nextVal && Array.isArray(nextVal.values) && nextVal.values.length === 0) {
|
|
@@ -6711,9 +6819,9 @@ function TableBlockClient({
|
|
|
6711
6819
|
const handleNextPage = () => {
|
|
6712
6820
|
setPage((prev) => Math.min(totalPages, prev + 1));
|
|
6713
6821
|
};
|
|
6714
|
-
const [selectedIds, setSelectedIds] = (0,
|
|
6715
|
-
const isExternalSyncRef = (0,
|
|
6716
|
-
(0,
|
|
6822
|
+
const [selectedIds, setSelectedIds] = (0, import_react18.useState)(/* @__PURE__ */ new Set());
|
|
6823
|
+
const isExternalSyncRef = (0, import_react18.useRef)(false);
|
|
6824
|
+
(0, import_react18.useEffect)(() => {
|
|
6717
6825
|
if (selectedRowIds !== void 0) {
|
|
6718
6826
|
const nextSet = new Set(selectedRowIds);
|
|
6719
6827
|
setSelectedIds((prev) => {
|
|
@@ -6725,8 +6833,8 @@ function TableBlockClient({
|
|
|
6725
6833
|
});
|
|
6726
6834
|
}
|
|
6727
6835
|
}, [selectedRowIds]);
|
|
6728
|
-
const isFirstSelectionChangeRef = (0,
|
|
6729
|
-
(0,
|
|
6836
|
+
const isFirstSelectionChangeRef = (0, import_react18.useRef)(true);
|
|
6837
|
+
(0, import_react18.useEffect)(() => {
|
|
6730
6838
|
if (isFirstSelectionChangeRef.current) {
|
|
6731
6839
|
isFirstSelectionChangeRef.current = false;
|
|
6732
6840
|
if (selectedIds.size === 0) return;
|
|
@@ -6737,13 +6845,13 @@ function TableBlockClient({
|
|
|
6737
6845
|
}
|
|
6738
6846
|
onSelectionChange == null ? void 0 : onSelectionChange(Array.from(selectedIds));
|
|
6739
6847
|
}, [selectedIds, onSelectionChange]);
|
|
6740
|
-
const [pendingDeletions, setPendingDeletions] = (0,
|
|
6741
|
-
const [isSaving, setIsSaving] = (0,
|
|
6848
|
+
const [pendingDeletions, setPendingDeletions] = (0, import_react18.useState)([]);
|
|
6849
|
+
const [isSaving, setIsSaving] = (0, import_react18.useState)(false);
|
|
6742
6850
|
const isUpdatingActive = Boolean(isUpdating || isSaving);
|
|
6743
|
-
const [isSaveSuccess, setIsSaveSuccess] = (0,
|
|
6744
|
-
const [expandedRowIds, setExpandedRowIds] = (0,
|
|
6745
|
-
const schemaColsString = (0,
|
|
6746
|
-
const refetchRelation = (0,
|
|
6851
|
+
const [isSaveSuccess, setIsSaveSuccess] = (0, import_react18.useState)(false);
|
|
6852
|
+
const [expandedRowIds, setExpandedRowIds] = (0, import_react18.useState)(/* @__PURE__ */ new Set());
|
|
6853
|
+
const schemaColsString = (0, import_react18.useMemo)(() => JSON.stringify(localColumns || []), [localColumns]);
|
|
6854
|
+
const refetchRelation = (0, import_react18.useCallback)(async (colName, params) => {
|
|
6747
6855
|
var _a, _b, _c, _d, _e, _f, _g;
|
|
6748
6856
|
let parsedCols = [];
|
|
6749
6857
|
try {
|
|
@@ -6782,7 +6890,7 @@ function TableBlockClient({
|
|
|
6782
6890
|
}
|
|
6783
6891
|
return [];
|
|
6784
6892
|
}, [schemaColsString, executeAction, mergeRelationOptions]);
|
|
6785
|
-
const fetchRelationFilterOptions = (0,
|
|
6893
|
+
const fetchRelationFilterOptions = (0, import_react18.useCallback)(async (colName) => {
|
|
6786
6894
|
var _a;
|
|
6787
6895
|
let parsedCols = [];
|
|
6788
6896
|
try {
|
|
@@ -6818,8 +6926,8 @@ function TableBlockClient({
|
|
|
6818
6926
|
setLoadingFilterCol(null);
|
|
6819
6927
|
}
|
|
6820
6928
|
}, [schemaColsString, schema == null ? void 0 : schema.tableMetaId, schema == null ? void 0 : schema.tableId, schema == null ? void 0 : schema.id, executeAction, mergeRelationOptions]);
|
|
6821
|
-
const requestedRelationIdsRef = (0,
|
|
6822
|
-
(0,
|
|
6929
|
+
const requestedRelationIdsRef = (0, import_react18.useRef)({});
|
|
6930
|
+
(0, import_react18.useEffect)(() => {
|
|
6823
6931
|
if (!executeAction || !data || data.length === 0) return;
|
|
6824
6932
|
let parsedCols = [];
|
|
6825
6933
|
try {
|
|
@@ -6872,7 +6980,7 @@ function TableBlockClient({
|
|
|
6872
6980
|
}
|
|
6873
6981
|
});
|
|
6874
6982
|
}, [data, schemaColsString, executeAction, relationOptions, mergeRelationOptions]);
|
|
6875
|
-
(0,
|
|
6983
|
+
(0, import_react18.useEffect)(() => {
|
|
6876
6984
|
let parsedCols = [];
|
|
6877
6985
|
try {
|
|
6878
6986
|
parsedCols = JSON.parse(schemaColsString);
|
|
@@ -6886,7 +6994,7 @@ function TableBlockClient({
|
|
|
6886
6994
|
refetchRelation(col.name);
|
|
6887
6995
|
});
|
|
6888
6996
|
}, [schemaColsString, refetchRelation]);
|
|
6889
|
-
const normalizedColumns = (0,
|
|
6997
|
+
const normalizedColumns = (0, import_react18.useMemo)(() => {
|
|
6890
6998
|
return (localColumns || []).map((col, idx) => {
|
|
6891
6999
|
const isRequired = col.isRequired === true || String(col.isRequired) === "true";
|
|
6892
7000
|
const isUnique = col.isUnique === true || String(col.isUnique) === "true";
|
|
@@ -6900,17 +7008,17 @@ function TableBlockClient({
|
|
|
6900
7008
|
return ((_a = a.order) != null ? _a : 0) - ((_b = b.order) != null ? _b : 0);
|
|
6901
7009
|
});
|
|
6902
7010
|
}, [localColumns]);
|
|
6903
|
-
const filteredColumns = (0,
|
|
7011
|
+
const filteredColumns = (0, import_react18.useMemo)(() => {
|
|
6904
7012
|
const systemFields = ["_id", "createdAt", "updatedAt", "orgId", "tableId"];
|
|
6905
7013
|
return normalizedColumns.filter((col) => !systemFields.includes(col.name) && !col.isHidden);
|
|
6906
7014
|
}, [normalizedColumns]);
|
|
6907
|
-
const customizableColumns = (0,
|
|
7015
|
+
const customizableColumns = (0, import_react18.useMemo)(() => {
|
|
6908
7016
|
const systemFields = ["_id", "createdAt", "updatedAt", "orgId", "tableId"];
|
|
6909
7017
|
return normalizedColumns.filter((col) => !systemFields.includes(col.name));
|
|
6910
7018
|
}, [normalizedColumns]);
|
|
6911
|
-
const [isColumnsDropdownOpen, setIsColumnsDropdownOpen] = (0,
|
|
6912
|
-
const dropdownRef = (0,
|
|
6913
|
-
(0,
|
|
7019
|
+
const [isColumnsDropdownOpen, setIsColumnsDropdownOpen] = (0, import_react18.useState)(false);
|
|
7020
|
+
const dropdownRef = (0, import_react18.useRef)(null);
|
|
7021
|
+
(0, import_react18.useEffect)(() => {
|
|
6914
7022
|
const handleClickOutside = (e) => {
|
|
6915
7023
|
if (dropdownRef.current && !dropdownRef.current.contains(e.target)) {
|
|
6916
7024
|
setIsColumnsDropdownOpen(false);
|
|
@@ -7120,7 +7228,7 @@ function TableBlockClient({
|
|
|
7120
7228
|
setData((prev) => [newRow, ...prev]);
|
|
7121
7229
|
setDirty((prev) => __spreadProps(__spreadValues({}, prev), { added: [newRow, ...prev.added] }));
|
|
7122
7230
|
};
|
|
7123
|
-
const handleCellChange = (0,
|
|
7231
|
+
const handleCellChange = (0, import_react18.useCallback)((rowId, colName, value) => {
|
|
7124
7232
|
setData((prev) => prev.map(
|
|
7125
7233
|
(row) => row.id === rowId ? __spreadProps(__spreadValues({}, row), { data: __spreadProps(__spreadValues({}, row.data), { [colName]: value }) }) : row
|
|
7126
7234
|
));
|
|
@@ -7153,13 +7261,13 @@ function TableBlockClient({
|
|
|
7153
7261
|
});
|
|
7154
7262
|
}, [baseRecordsMap]);
|
|
7155
7263
|
const handleCellChangeWithCopy = useRelationCopyHandler({ columns: localColumns, handleCellChange });
|
|
7156
|
-
const triggerSaveSuccess = (0,
|
|
7264
|
+
const triggerSaveSuccess = (0, import_react18.useCallback)(() => {
|
|
7157
7265
|
setIsSaveSuccess(true);
|
|
7158
7266
|
setTimeout(() => {
|
|
7159
7267
|
setIsSaveSuccess(false);
|
|
7160
7268
|
}, 2500);
|
|
7161
7269
|
}, []);
|
|
7162
|
-
const handleQuietCellChange = (0,
|
|
7270
|
+
const handleQuietCellChange = (0, import_react18.useCallback)((rowId, colName, value) => {
|
|
7163
7271
|
setData((prev) => prev.map(
|
|
7164
7272
|
(row) => row.id === rowId ? __spreadProps(__spreadValues({}, row), { data: __spreadProps(__spreadValues({}, row.data), { [colName]: value }) }) : row
|
|
7165
7273
|
));
|
|
@@ -7183,12 +7291,12 @@ function TableBlockClient({
|
|
|
7183
7291
|
});
|
|
7184
7292
|
}
|
|
7185
7293
|
}, []);
|
|
7186
|
-
const toggleSelectAll = (0,
|
|
7294
|
+
const toggleSelectAll = (0, import_react18.useCallback)((checked) => {
|
|
7187
7295
|
onRowToggle == null ? void 0 : onRowToggle("ALL", checked);
|
|
7188
7296
|
const next = checked ? new Set(filteredData.map((r) => r.id)) : /* @__PURE__ */ new Set();
|
|
7189
7297
|
setSelectedIds(next);
|
|
7190
7298
|
}, [filteredData, onRowToggle]);
|
|
7191
|
-
const toggleSelectRow = (0,
|
|
7299
|
+
const toggleSelectRow = (0, import_react18.useCallback)((rowId, checked) => {
|
|
7192
7300
|
onRowToggle == null ? void 0 : onRowToggle(rowId, checked);
|
|
7193
7301
|
setSelectedIds((prev) => {
|
|
7194
7302
|
const next = new Set(prev);
|
|
@@ -7197,7 +7305,7 @@ function TableBlockClient({
|
|
|
7197
7305
|
return next;
|
|
7198
7306
|
});
|
|
7199
7307
|
}, [onRowToggle]);
|
|
7200
|
-
const handleToggleExpand = (0,
|
|
7308
|
+
const handleToggleExpand = (0, import_react18.useCallback)((rowId) => {
|
|
7201
7309
|
setExpandedRowIds((prev) => {
|
|
7202
7310
|
const next = new Set(prev);
|
|
7203
7311
|
if (next.has(rowId)) next.delete(rowId);
|
|
@@ -7205,7 +7313,7 @@ function TableBlockClient({
|
|
|
7205
7313
|
return next;
|
|
7206
7314
|
});
|
|
7207
7315
|
}, []);
|
|
7208
|
-
const handleMarkForDeletion = (0,
|
|
7316
|
+
const handleMarkForDeletion = (0, import_react18.useCallback)((fileId) => {
|
|
7209
7317
|
setPendingDeletions((prev) => [...prev, fileId]);
|
|
7210
7318
|
}, []);
|
|
7211
7319
|
const handleDeleteSelected = () => {
|
|
@@ -7433,7 +7541,7 @@ function TableBlockClient({
|
|
|
7433
7541
|
setIsSaving(false);
|
|
7434
7542
|
}
|
|
7435
7543
|
};
|
|
7436
|
-
const getRowRelationLabels = (0,
|
|
7544
|
+
const getRowRelationLabels = (0, import_react18.useCallback)((rowVal, col) => {
|
|
7437
7545
|
const ids = normalizeRelationValue(rowVal);
|
|
7438
7546
|
if (ids.length === 0) return [];
|
|
7439
7547
|
const options = relationOptions[col.name] || [];
|
|
@@ -7452,7 +7560,7 @@ function TableBlockClient({
|
|
|
7452
7560
|
return "";
|
|
7453
7561
|
}).filter(Boolean);
|
|
7454
7562
|
}, [relationOptions]);
|
|
7455
|
-
const getUniqueRelationOptions = (0,
|
|
7563
|
+
const getUniqueRelationOptions = (0, import_react18.useCallback)((col) => {
|
|
7456
7564
|
if (relationFilterOptions[col.name]) {
|
|
7457
7565
|
return relationFilterOptions[col.name];
|
|
7458
7566
|
}
|
|
@@ -7484,7 +7592,7 @@ function TableBlockClient({
|
|
|
7484
7592
|
return results.sort((a, b) => a.label.localeCompare(b.label));
|
|
7485
7593
|
}, [data, relationOptions, relationFilterOptions]);
|
|
7486
7594
|
const errorMessage = error ? typeof error === "string" ? error : error.message || String(error) : null;
|
|
7487
|
-
const columnTotals = (0,
|
|
7595
|
+
const columnTotals = (0, import_react18.useMemo)(() => {
|
|
7488
7596
|
const totals = {};
|
|
7489
7597
|
if (!showSummary) return totals;
|
|
7490
7598
|
filteredColumns.forEach((col) => {
|
|
@@ -8173,7 +8281,7 @@ function ExpandedSubTables({
|
|
|
8173
8281
|
context
|
|
8174
8282
|
}) {
|
|
8175
8283
|
var _a;
|
|
8176
|
-
const [activeTab, setActiveTab] = (0,
|
|
8284
|
+
const [activeTab, setActiveTab] = (0, import_react18.useState)((_a = subTableColumns[0]) == null ? void 0 : _a.name);
|
|
8177
8285
|
if (subTableColumns.length === 0) return null;
|
|
8178
8286
|
if (subTableColumns.length === 1) {
|
|
8179
8287
|
const stCol = subTableColumns[0];
|
|
@@ -8214,7 +8322,7 @@ function ExpandedSubTables({
|
|
|
8214
8322
|
) })
|
|
8215
8323
|
] }) });
|
|
8216
8324
|
}
|
|
8217
|
-
var TableRow =
|
|
8325
|
+
var TableRow = import_react18.default.memo(function TableRow2({
|
|
8218
8326
|
row,
|
|
8219
8327
|
isSelected,
|
|
8220
8328
|
rowStatus,
|
|
@@ -8246,7 +8354,7 @@ var TableRow = import_react17.default.memo(function TableRow2({
|
|
|
8246
8354
|
permissions
|
|
8247
8355
|
}) {
|
|
8248
8356
|
const lockedCopyTargets = getRelationCopyLockedTargets(schema == null ? void 0 : schema.columns);
|
|
8249
|
-
return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
|
|
8357
|
+
return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_react18.default.Fragment, { children: [
|
|
8250
8358
|
/* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("tr", { className: `transition-colors group hover:bg-blue-50 ${isSelected ? "bg-blue-50" : ""}`, children: [
|
|
8251
8359
|
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("td", { className: "border-b border-l border-slate-200 p-1.5 text-center bg-white group-hover:bg-transparent", style: { width: 80, minWidth: 80, maxWidth: 80 }, children: /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "flex items-center justify-center gap-1.5", children: [
|
|
8252
8360
|
rowStatus && (() => {
|
|
@@ -8402,13 +8510,13 @@ function TableBlock(props) {
|
|
|
8402
8510
|
}
|
|
8403
8511
|
|
|
8404
8512
|
// src/components/PlacementBlock/PlacementBlock.tsx
|
|
8405
|
-
var
|
|
8513
|
+
var import_react21 = require("react");
|
|
8406
8514
|
var import_ag_grid_react = require("ag-grid-react");
|
|
8407
8515
|
var import_ag_grid_community = require("ag-grid-community");
|
|
8408
8516
|
var import_lucide_react10 = require("lucide-react");
|
|
8409
8517
|
|
|
8410
8518
|
// src/components/PlacementBlock/PlacementSettings.tsx
|
|
8411
|
-
var
|
|
8519
|
+
var import_react19 = __toESM(require("react"));
|
|
8412
8520
|
|
|
8413
8521
|
// src/components/PlacementBlock/placementColumns.ts
|
|
8414
8522
|
var RELATION_SEP = "::";
|
|
@@ -8530,7 +8638,7 @@ var SummaryRow = ({ label, value, hint }) => /* @__PURE__ */ (0, import_jsx_runt
|
|
|
8530
8638
|
] });
|
|
8531
8639
|
var PlacementStatusEditor = ({ config, onChange }) => {
|
|
8532
8640
|
var _a;
|
|
8533
|
-
const radioName = `placement-default-status-${
|
|
8641
|
+
const radioName = `placement-default-status-${import_react19.default.useId()}`;
|
|
8534
8642
|
const statuses = ((_a = config.statusColors) == null ? void 0 : _a.length) ? config.statusColors : DEFAULT_PLACEMENT_STATUS_COLORS;
|
|
8535
8643
|
const defaultStatusId = resolveDefaultStatusId(statuses, config.defaultReturnStatusId);
|
|
8536
8644
|
const setStatuses = (next, defId = defaultStatusId) => {
|
|
@@ -8801,7 +8909,7 @@ var PlacementSettings = ({ config, onChange, tables }) => {
|
|
|
8801
8909
|
};
|
|
8802
8910
|
|
|
8803
8911
|
// src/components/PlacementBlock/PlacementRelationButtons.tsx
|
|
8804
|
-
var
|
|
8912
|
+
var import_react20 = require("react");
|
|
8805
8913
|
var import_jsx_runtime18 = require("react/jsx-runtime");
|
|
8806
8914
|
var GROUP_COLORS = [
|
|
8807
8915
|
{ title: "bg-blue-600 text-white", active: "bg-blue-600 border-blue-600 text-white hover:bg-blue-700", count: "text-blue-700" },
|
|
@@ -8823,7 +8931,7 @@ var PlacementRelationButtons = ({
|
|
|
8823
8931
|
relationOptions,
|
|
8824
8932
|
className = ""
|
|
8825
8933
|
}) => {
|
|
8826
|
-
const groups = (0,
|
|
8934
|
+
const groups = (0, import_react20.useMemo)(() => {
|
|
8827
8935
|
const activeEntries = Object.entries(filters).filter(([, v]) => v !== void 0 && v !== null && v !== "");
|
|
8828
8936
|
return (columnNames || []).map((colName) => {
|
|
8829
8937
|
var _a, _b, _c, _d;
|
|
@@ -8899,6 +9007,43 @@ var PlacementRelationButtons = ({
|
|
|
8899
9007
|
);
|
|
8900
9008
|
};
|
|
8901
9009
|
|
|
9010
|
+
// src/components/PlacementBlock/placementDefaultFilters.ts
|
|
9011
|
+
function getPlacementFilterRefs(config) {
|
|
9012
|
+
const defined = Array.isArray(config == null ? void 0 : config.filterFields) ? config.filterFields : [];
|
|
9013
|
+
const legacy = [config == null ? void 0 : config.targetFilterField1Id, config == null ? void 0 : config.targetFilterField2Id].filter(Boolean);
|
|
9014
|
+
return (defined.length > 0 ? defined : legacy).filter((r) => typeof r === "string" && r);
|
|
9015
|
+
}
|
|
9016
|
+
function resolveFilterColName(ref, targetColumns) {
|
|
9017
|
+
const direct = (targetColumns || []).find((c) => (c == null ? void 0 : c.id) === ref || (c == null ? void 0 : c.name) === ref);
|
|
9018
|
+
if (direct) return direct.name;
|
|
9019
|
+
const { relationColumn } = parseColumnRef(ref);
|
|
9020
|
+
if (relationColumn) {
|
|
9021
|
+
const rel = (targetColumns || []).find(
|
|
9022
|
+
(c) => (c == null ? void 0 : c.name) === relationColumn && String(c == null ? void 0 : c.type).toUpperCase() === "RELATION"
|
|
9023
|
+
);
|
|
9024
|
+
if (rel) return rel.name;
|
|
9025
|
+
}
|
|
9026
|
+
return ref;
|
|
9027
|
+
}
|
|
9028
|
+
function computePlacementDefaultFilters(args) {
|
|
9029
|
+
const { refs, defaults, targetColumns, rows, getText } = args;
|
|
9030
|
+
const applied = {};
|
|
9031
|
+
if (!defaults) return applied;
|
|
9032
|
+
for (const ref of refs) {
|
|
9033
|
+
const want = defaults[ref];
|
|
9034
|
+
if (typeof want !== "string" || want === "") continue;
|
|
9035
|
+
const colName = resolveFilterColName(ref, targetColumns);
|
|
9036
|
+
if (colName in applied) continue;
|
|
9037
|
+
const validRows = rows.filter(
|
|
9038
|
+
(r) => Object.entries(applied).every(([name, value]) => getText(name, r.data) === value)
|
|
9039
|
+
);
|
|
9040
|
+
if (validRows.some((r) => getText(colName, r.data) === want)) {
|
|
9041
|
+
applied[colName] = want;
|
|
9042
|
+
}
|
|
9043
|
+
}
|
|
9044
|
+
return applied;
|
|
9045
|
+
}
|
|
9046
|
+
|
|
8902
9047
|
// src/components/PlacementBlock/PlacementBlock.tsx
|
|
8903
9048
|
var import_jsx_runtime19 = require("react/jsx-runtime");
|
|
8904
9049
|
import_ag_grid_community.ModuleRegistry.registerModules([import_ag_grid_community.AllCommunityModule]);
|
|
@@ -8976,7 +9121,7 @@ var CheckHeader = (props) => /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div"
|
|
|
8976
9121
|
}
|
|
8977
9122
|
) });
|
|
8978
9123
|
var RelationFilterHeader = (props) => {
|
|
8979
|
-
const btnRef = (0,
|
|
9124
|
+
const btnRef = (0, import_react21.useRef)(null);
|
|
8980
9125
|
return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { className: "flex flex-col items-center justify-center w-full min-w-0 leading-tight select-none", title: props.displayName, children: [
|
|
8981
9126
|
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
|
|
8982
9127
|
"button",
|
|
@@ -9003,20 +9148,20 @@ var RelationFilterHeader = (props) => {
|
|
|
9003
9148
|
var PlacementBlock = (props) => {
|
|
9004
9149
|
var _a, _b;
|
|
9005
9150
|
const { executeAction, fetchSourceData, fetchTargetData, updateAssignment, className = "" } = props;
|
|
9006
|
-
const config = (0,
|
|
9151
|
+
const config = (0, import_react21.useMemo)(() => {
|
|
9007
9152
|
var _a2, _b2, _c;
|
|
9008
9153
|
const raw = (_a2 = props.config) != null ? _a2 : props.settings;
|
|
9009
9154
|
if (!raw) return void 0;
|
|
9010
9155
|
return ((_b2 = raw.config) == null ? void 0 : _b2.sourceTableId) || ((_c = raw.config) == null ? void 0 : _c.targetTableId) ? raw.config : raw;
|
|
9011
9156
|
}, [props.config, props.settings]);
|
|
9012
|
-
const statuses = (0,
|
|
9157
|
+
const statuses = (0, import_react21.useMemo)(
|
|
9013
9158
|
() => {
|
|
9014
9159
|
var _a2;
|
|
9015
9160
|
return ((_a2 = config == null ? void 0 : config.statusColors) == null ? void 0 : _a2.length) ? config.statusColors : DEFAULT_PLACEMENT_STATUS_COLORS;
|
|
9016
9161
|
},
|
|
9017
9162
|
[config == null ? void 0 : config.statusColors]
|
|
9018
9163
|
);
|
|
9019
|
-
const defaultStatusId = (0,
|
|
9164
|
+
const defaultStatusId = (0, import_react21.useMemo)(
|
|
9020
9165
|
() => resolveDefaultStatusId(statuses, config == null ? void 0 : config.defaultReturnStatusId),
|
|
9021
9166
|
[statuses, config == null ? void 0 : config.defaultReturnStatusId]
|
|
9022
9167
|
);
|
|
@@ -9024,31 +9169,31 @@ var PlacementBlock = (props) => {
|
|
|
9024
9169
|
const targetTableId = config == null ? void 0 : config.targetTableId;
|
|
9025
9170
|
const displayField = (config == null ? void 0 : config.sourceDisplayFieldId) || "name";
|
|
9026
9171
|
const assignmentField = config == null ? void 0 : config.targetAssignmentFieldId;
|
|
9027
|
-
const executeActionRef = (0,
|
|
9172
|
+
const executeActionRef = (0, import_react21.useRef)(executeAction);
|
|
9028
9173
|
executeActionRef.current = executeAction;
|
|
9029
|
-
const legacyRef = (0,
|
|
9174
|
+
const legacyRef = (0, import_react21.useRef)({ fetchSourceData, fetchTargetData, updateAssignment });
|
|
9030
9175
|
legacyRef.current = { fetchSourceData, fetchTargetData, updateAssignment };
|
|
9031
|
-
const [sourceRows, setSourceRows] = (0,
|
|
9032
|
-
const [sourceColumns, setSourceColumns] = (0,
|
|
9033
|
-
const [sourceRelOptions, setSourceRelOptions] = (0,
|
|
9034
|
-
const [sourceRelFilters, setSourceRelFilters] = (0,
|
|
9035
|
-
const [targetRows, setTargetRows] = (0,
|
|
9036
|
-
const [targetColumns, setTargetColumns] = (0,
|
|
9037
|
-
const [targetRelOptions, setTargetRelOptions] = (0,
|
|
9038
|
-
const [selectedTargetId, setSelectedTargetId] = (0,
|
|
9039
|
-
const [candidateIds, setCandidateIds] = (0,
|
|
9040
|
-
const [checkedIds, setCheckedIds] = (0,
|
|
9041
|
-
const [isSaving, setIsSaving] = (0,
|
|
9042
|
-
const [sourceSearch, setSourceSearch] = (0,
|
|
9043
|
-
const [candidateSearch, setCandidateSearch] = (0,
|
|
9044
|
-
const [statusMap, setStatusMap] = (0,
|
|
9045
|
-
const [isLoading, setIsLoading] = (0,
|
|
9046
|
-
const [loadError, setLoadError] = (0,
|
|
9047
|
-
const [saveError, setSaveError] = (0,
|
|
9048
|
-
const [colFilters, setColFilters] = (0,
|
|
9049
|
-
const [filterPopover, setFilterPopover] = (0,
|
|
9050
|
-
const [targetFilters, setTargetFilters] = (0,
|
|
9051
|
-
const loadTable = (0,
|
|
9176
|
+
const [sourceRows, setSourceRows] = (0, import_react21.useState)([]);
|
|
9177
|
+
const [sourceColumns, setSourceColumns] = (0, import_react21.useState)([]);
|
|
9178
|
+
const [sourceRelOptions, setSourceRelOptions] = (0, import_react21.useState)({});
|
|
9179
|
+
const [sourceRelFilters, setSourceRelFilters] = (0, import_react21.useState)({});
|
|
9180
|
+
const [targetRows, setTargetRows] = (0, import_react21.useState)([]);
|
|
9181
|
+
const [targetColumns, setTargetColumns] = (0, import_react21.useState)([]);
|
|
9182
|
+
const [targetRelOptions, setTargetRelOptions] = (0, import_react21.useState)({});
|
|
9183
|
+
const [selectedTargetId, setSelectedTargetId] = (0, import_react21.useState)("");
|
|
9184
|
+
const [candidateIds, setCandidateIds] = (0, import_react21.useState)([]);
|
|
9185
|
+
const [checkedIds, setCheckedIds] = (0, import_react21.useState)([]);
|
|
9186
|
+
const [isSaving, setIsSaving] = (0, import_react21.useState)(false);
|
|
9187
|
+
const [sourceSearch, setSourceSearch] = (0, import_react21.useState)("");
|
|
9188
|
+
const [candidateSearch, setCandidateSearch] = (0, import_react21.useState)("");
|
|
9189
|
+
const [statusMap, setStatusMap] = (0, import_react21.useState)({});
|
|
9190
|
+
const [isLoading, setIsLoading] = (0, import_react21.useState)(false);
|
|
9191
|
+
const [loadError, setLoadError] = (0, import_react21.useState)(null);
|
|
9192
|
+
const [saveError, setSaveError] = (0, import_react21.useState)(null);
|
|
9193
|
+
const [colFilters, setColFilters] = (0, import_react21.useState)({ source: {}, cand: {} });
|
|
9194
|
+
const [filterPopover, setFilterPopover] = (0, import_react21.useState)(null);
|
|
9195
|
+
const [targetFilters, setTargetFilters] = (0, import_react21.useState)({});
|
|
9196
|
+
const loadTable = (0, import_react21.useCallback)(async (tableId, kind) => {
|
|
9052
9197
|
const exec = executeActionRef.current;
|
|
9053
9198
|
if (exec) {
|
|
9054
9199
|
const res = await exec("FETCH_TABLE_DATA", { tableId, tableMetaId: tableId, limit: FETCH_LIMIT, skip: 0 });
|
|
@@ -9061,7 +9206,7 @@ var PlacementBlock = (props) => {
|
|
|
9061
9206
|
}
|
|
9062
9207
|
throw new Error("executeAction \u05DC\u05D0 \u05D4\u05D5\u05E2\u05D1\u05E8 \u05DC\u05E8\u05DB\u05D9\u05D1 \u05D4\u05E9\u05D9\u05D1\u05D5\u05E5");
|
|
9063
9208
|
}, []);
|
|
9064
|
-
(0,
|
|
9209
|
+
(0, import_react21.useEffect)(() => {
|
|
9065
9210
|
if (!sourceTableId || !targetTableId) return;
|
|
9066
9211
|
let cancelled = false;
|
|
9067
9212
|
(async () => {
|
|
@@ -9089,7 +9234,7 @@ var PlacementBlock = (props) => {
|
|
|
9089
9234
|
cancelled = true;
|
|
9090
9235
|
};
|
|
9091
9236
|
}, [sourceTableId, targetTableId, loadTable]);
|
|
9092
|
-
const displayValue = (0,
|
|
9237
|
+
const displayValue = (0, import_react21.useCallback)((col, val) => {
|
|
9093
9238
|
var _a2, _b2, _c, _d, _e;
|
|
9094
9239
|
let text2 = cellText(val);
|
|
9095
9240
|
if (text2 && /^[a-fA-F0-9]{24}$/.test(text2)) {
|
|
@@ -9109,7 +9254,7 @@ var PlacementBlock = (props) => {
|
|
|
9109
9254
|
}
|
|
9110
9255
|
return text2;
|
|
9111
9256
|
}, [targetRelOptions, targetRows, sourceRows]);
|
|
9112
|
-
const relationLabelMaps = (0,
|
|
9257
|
+
const relationLabelMaps = (0, import_react21.useMemo)(() => {
|
|
9113
9258
|
const maps = {};
|
|
9114
9259
|
Object.entries(sourceRelOptions || {}).forEach(([colName, opts]) => {
|
|
9115
9260
|
const m = /* @__PURE__ */ new Map();
|
|
@@ -9122,7 +9267,7 @@ var PlacementBlock = (props) => {
|
|
|
9122
9267
|
});
|
|
9123
9268
|
return maps;
|
|
9124
9269
|
}, [sourceRelOptions]);
|
|
9125
|
-
const relationLabelsOf = (0,
|
|
9270
|
+
const relationLabelsOf = (0, import_react21.useCallback)((row, colName) => {
|
|
9126
9271
|
var _a2;
|
|
9127
9272
|
const map = relationLabelMaps[colName];
|
|
9128
9273
|
const ids = normalizeRelationValue((_a2 = row.data) == null ? void 0 : _a2[colName]);
|
|
@@ -9131,7 +9276,7 @@ var PlacementBlock = (props) => {
|
|
|
9131
9276
|
const txt = cellText(readColumnValue(row.data, colName));
|
|
9132
9277
|
return txt && !/^[a-fA-F0-9]{24}$/.test(txt) ? txt.split(", ").filter(Boolean) : [];
|
|
9133
9278
|
}, [relationLabelMaps]);
|
|
9134
|
-
const rowPassesColFilters = (0,
|
|
9279
|
+
const rowPassesColFilters = (0, import_react21.useCallback)((row, filters) => {
|
|
9135
9280
|
return Object.entries(filters).every(([colName, f]) => {
|
|
9136
9281
|
if (!f) return true;
|
|
9137
9282
|
const labels = relationLabelsOf(row, colName);
|
|
@@ -9140,7 +9285,7 @@ var PlacementBlock = (props) => {
|
|
|
9140
9285
|
return true;
|
|
9141
9286
|
});
|
|
9142
9287
|
}, [relationLabelsOf]);
|
|
9143
|
-
const setColFilter = (0,
|
|
9288
|
+
const setColFilter = (0, import_react21.useCallback)((grid, colName, payload) => {
|
|
9144
9289
|
setColFilters((prev) => {
|
|
9145
9290
|
const next = __spreadValues({}, prev[grid]);
|
|
9146
9291
|
if (payload === void 0) delete next[colName];
|
|
@@ -9148,11 +9293,11 @@ var PlacementBlock = (props) => {
|
|
|
9148
9293
|
return __spreadProps(__spreadValues({}, prev), { [grid]: next });
|
|
9149
9294
|
});
|
|
9150
9295
|
}, []);
|
|
9151
|
-
const openColFilter = (0,
|
|
9296
|
+
const openColFilter = (0, import_react21.useCallback)((grid, colName, rect) => {
|
|
9152
9297
|
setFilterPopover((cur) => cur && cur.grid === grid && cur.colName === colName ? null : { grid, colName, rect });
|
|
9153
9298
|
}, []);
|
|
9154
|
-
const closeColFilter = (0,
|
|
9155
|
-
const filterColumns = (0,
|
|
9299
|
+
const closeColFilter = (0, import_react21.useCallback)(() => setFilterPopover(null), []);
|
|
9300
|
+
const filterColumns = (0, import_react21.useMemo)(() => {
|
|
9156
9301
|
const definedFilters = (config == null ? void 0 : config.filterFields) || [];
|
|
9157
9302
|
const legacyFilters = [config == null ? void 0 : config.targetFilterField1Id, config == null ? void 0 : config.targetFilterField2Id].filter(Boolean);
|
|
9158
9303
|
const fieldsToUse = definedFilters.length > 0 ? definedFilters : legacyFilters;
|
|
@@ -9178,7 +9323,7 @@ var PlacementBlock = (props) => {
|
|
|
9178
9323
|
return targetColumns.filter((c) => isUserColumn(c) && c.name !== assignmentField && !["id", "_id", "id_", "statusId"].includes(c.name)).slice(0, 3);
|
|
9179
9324
|
}, [targetColumns, assignmentField, config]);
|
|
9180
9325
|
const rawSelectorField = (config == null ? void 0 : config.targetSelectorFieldId) || (config == null ? void 0 : config.targetDisplayFieldId) || ((_a = filterColumns[0]) == null ? void 0 : _a.name) || "";
|
|
9181
|
-
const selectorField = (0,
|
|
9326
|
+
const selectorField = (0, import_react21.useMemo)(() => {
|
|
9182
9327
|
const { relationColumn } = parseColumnRef(rawSelectorField);
|
|
9183
9328
|
if (relationColumn && !targetColumns.some((c) => c.name === rawSelectorField) && targetColumns.some((c) => {
|
|
9184
9329
|
var _a2;
|
|
@@ -9188,7 +9333,7 @@ var PlacementBlock = (props) => {
|
|
|
9188
9333
|
}
|
|
9189
9334
|
return rawSelectorField;
|
|
9190
9335
|
}, [rawSelectorField, targetColumns]);
|
|
9191
|
-
const filteredTargetRows = (0,
|
|
9336
|
+
const filteredTargetRows = (0, import_react21.useMemo)(() => {
|
|
9192
9337
|
return targetRows.filter((r) => {
|
|
9193
9338
|
return filterColumns.every((col) => {
|
|
9194
9339
|
const filterVal = targetFilters[col.name];
|
|
@@ -9197,7 +9342,7 @@ var PlacementBlock = (props) => {
|
|
|
9197
9342
|
});
|
|
9198
9343
|
});
|
|
9199
9344
|
}, [targetRows, targetFilters, filterColumns, displayValue]);
|
|
9200
|
-
(0,
|
|
9345
|
+
(0, import_react21.useEffect)(() => {
|
|
9201
9346
|
if (filteredTargetRows.length > 0) {
|
|
9202
9347
|
if (!selectedTargetId || !filteredTargetRows.some((r) => r.id === selectedTargetId)) {
|
|
9203
9348
|
setSelectedTargetId(filteredTargetRows[0].id);
|
|
@@ -9206,11 +9351,27 @@ var PlacementBlock = (props) => {
|
|
|
9206
9351
|
setSelectedTargetId("");
|
|
9207
9352
|
}
|
|
9208
9353
|
}, [filteredTargetRows, selectedTargetId]);
|
|
9209
|
-
const
|
|
9354
|
+
const appliedDefaultsKeyRef = (0, import_react21.useRef)("");
|
|
9355
|
+
(0, import_react21.useEffect)(() => {
|
|
9356
|
+
const defaults = config == null ? void 0 : config.targetFilterDefaults;
|
|
9357
|
+
if (isLoading || !defaults || targetRows.length === 0 || targetColumns.length === 0) return;
|
|
9358
|
+
const key = `${targetTableId}|${JSON.stringify(defaults)}`;
|
|
9359
|
+
if (appliedDefaultsKeyRef.current === key) return;
|
|
9360
|
+
appliedDefaultsKeyRef.current = key;
|
|
9361
|
+
const resolved = computePlacementDefaultFilters({
|
|
9362
|
+
refs: getPlacementFilterRefs(config),
|
|
9363
|
+
defaults,
|
|
9364
|
+
targetColumns,
|
|
9365
|
+
rows: targetRows,
|
|
9366
|
+
getText: (colName, data) => displayValue(targetColumns.find((c) => c.name === colName) || { name: colName }, readColumnValue(data, colName))
|
|
9367
|
+
});
|
|
9368
|
+
if (Object.keys(resolved).length > 0) setTargetFilters((prev) => __spreadValues(__spreadValues({}, resolved), prev));
|
|
9369
|
+
}, [config, isLoading, targetRows, targetColumns, targetTableId, displayValue]);
|
|
9370
|
+
const assignmentColumn = (0, import_react21.useMemo)(() => targetColumns.find((c) => c.name === assignmentField), [targetColumns, assignmentField]);
|
|
9210
9371
|
const isRelationField = ((_b = assignmentColumn == null ? void 0 : assignmentColumn.type) == null ? void 0 : _b.toUpperCase()) === "RELATION";
|
|
9211
9372
|
const assignmentLabel = (assignmentColumn == null ? void 0 : assignmentColumn.label) || (assignmentColumn == null ? void 0 : assignmentColumn.name) || assignmentField || "";
|
|
9212
|
-
const nameOf = (0,
|
|
9213
|
-
const assignedIds = (0,
|
|
9373
|
+
const nameOf = (0, import_react21.useCallback)((row) => cellText(readColumnValue(row.data, displayField)) || "\u05DC\u05DC\u05D0 \u05E9\u05DD", [displayField]);
|
|
9374
|
+
const assignedIds = (0, import_react21.useMemo)(() => {
|
|
9214
9375
|
var _a2;
|
|
9215
9376
|
const target = targetRows.find((r) => r.id === selectedTargetId);
|
|
9216
9377
|
if (!target || !assignmentField) return [];
|
|
@@ -9224,36 +9385,36 @@ var PlacementBlock = (props) => {
|
|
|
9224
9385
|
}).filter((id) => !!id && sourceRows.some((s) => s.id === id));
|
|
9225
9386
|
return Array.from(new Set(ids));
|
|
9226
9387
|
}, [selectedTargetId, targetRows, sourceRows, assignmentField, isRelationField, nameOf]);
|
|
9227
|
-
const assignedIdsRef = (0,
|
|
9388
|
+
const assignedIdsRef = (0, import_react21.useRef)(assignedIds);
|
|
9228
9389
|
assignedIdsRef.current = assignedIds;
|
|
9229
|
-
(0,
|
|
9390
|
+
(0, import_react21.useEffect)(() => {
|
|
9230
9391
|
setCandidateIds(assignedIdsRef.current);
|
|
9231
9392
|
setCheckedIds(assignedIdsRef.current);
|
|
9232
9393
|
}, [selectedTargetId, sourceRows]);
|
|
9233
|
-
const toGridRow = (0,
|
|
9234
|
-
const candidateRows = (0,
|
|
9235
|
-
const candidateGridData = (0,
|
|
9394
|
+
const toGridRow = (0, import_react21.useCallback)((r, checked = false) => __spreadProps(__spreadValues({}, r.data), { id: r.id, __label: nameOf(r), __checked: checked, statusId: statusMap[r.id] || defaultStatusId }), [nameOf, statusMap, defaultStatusId]);
|
|
9395
|
+
const candidateRows = (0, import_react21.useMemo)(() => candidateIds.map((id) => sourceRows.find((r) => r.id === id)).filter((r) => !!r), [candidateIds, sourceRows]);
|
|
9396
|
+
const candidateGridData = (0, import_react21.useMemo)(() => {
|
|
9236
9397
|
const checked = new Set(checkedIds);
|
|
9237
9398
|
return candidateRows.filter((r) => rowPassesColFilters(r, colFilters.cand)).map((r) => toGridRow(r, checked.has(r.id)));
|
|
9238
9399
|
}, [candidateRows, checkedIds, toGridRow, rowPassesColFilters, colFilters.cand]);
|
|
9239
|
-
const availableRows = (0,
|
|
9400
|
+
const availableRows = (0, import_react21.useMemo)(() => {
|
|
9240
9401
|
const set = new Set(candidateIds);
|
|
9241
9402
|
return sourceRows.filter((r) => !set.has(r.id));
|
|
9242
9403
|
}, [candidateIds, sourceRows]);
|
|
9243
|
-
const relationButtonColumns = (0,
|
|
9404
|
+
const relationButtonColumns = (0, import_react21.useMemo)(() => {
|
|
9244
9405
|
const wanted = Array.isArray(config == null ? void 0 : config.relationButtonColumns) ? config.relationButtonColumns : [];
|
|
9245
9406
|
return wanted.filter((name) => sourceColumns.some((c) => (c == null ? void 0 : c.name) === name && String(c == null ? void 0 : c.type).toUpperCase() === "RELATION"));
|
|
9246
9407
|
}, [config, sourceColumns]);
|
|
9247
9408
|
const hasRelationButtons = relationButtonColumns.length > 0;
|
|
9248
|
-
const handleRelationFilterChange = (0,
|
|
9409
|
+
const handleRelationFilterChange = (0, import_react21.useCallback)((colName, id) => {
|
|
9249
9410
|
setSourceRelFilters((prev) => __spreadProps(__spreadValues({}, prev), { [colName]: id }));
|
|
9250
9411
|
}, []);
|
|
9251
|
-
const availableGridData = (0,
|
|
9412
|
+
const availableGridData = (0, import_react21.useMemo)(() => {
|
|
9252
9413
|
const active = Object.entries(sourceRelFilters).filter(([name, v]) => !!v && relationButtonColumns.includes(name));
|
|
9253
9414
|
const byButtons = active.length === 0 ? availableRows : availableRows.filter((r) => active.every(([name, v]) => rowMatchesRelationFilter(r, name, v)));
|
|
9254
9415
|
return byButtons.filter((r) => rowPassesColFilters(r, colFilters.source)).map((r) => toGridRow(r));
|
|
9255
9416
|
}, [availableRows, sourceRelFilters, relationButtonColumns, toGridRow, rowPassesColFilters, colFilters.source]);
|
|
9256
|
-
const persistAssignment = (0,
|
|
9417
|
+
const persistAssignment = (0, import_react21.useCallback)(async (nextIds) => {
|
|
9257
9418
|
const exec = executeActionRef.current;
|
|
9258
9419
|
if (exec && targetTableId && assignmentField && selectedTargetId) {
|
|
9259
9420
|
const value = isRelationField ? nextIds : nextIds.map((id) => sourceRows.find((r) => r.id === id)).filter((r) => !!r).map(nameOf).join(", ");
|
|
@@ -9265,33 +9426,33 @@ var PlacementBlock = (props) => {
|
|
|
9265
9426
|
for (const id of nextIds.filter((i) => !assignedIds.includes(i))) await legacyRef.current.updateAssignment(selectedTargetId, id);
|
|
9266
9427
|
}
|
|
9267
9428
|
}, [targetTableId, assignmentField, selectedTargetId, isRelationField, sourceRows, nameOf, assignedIds]);
|
|
9268
|
-
const moveToCandidates = (0,
|
|
9429
|
+
const moveToCandidates = (0, import_react21.useCallback)((id) => {
|
|
9269
9430
|
setCandidateIds((prev) => prev.includes(id) ? prev : [...prev, id]);
|
|
9270
9431
|
}, []);
|
|
9271
|
-
const moveToSource = (0,
|
|
9432
|
+
const moveToSource = (0, import_react21.useCallback)((id) => {
|
|
9272
9433
|
setCandidateIds((prev) => prev.filter((x) => x !== id));
|
|
9273
9434
|
setCheckedIds((prev) => prev.filter((x) => x !== id));
|
|
9274
9435
|
setStatusMap((prev) => __spreadProps(__spreadValues({}, prev), { [id]: defaultStatusId }));
|
|
9275
9436
|
}, [defaultStatusId]);
|
|
9276
|
-
const moveToCandidatesRef = (0,
|
|
9437
|
+
const moveToCandidatesRef = (0, import_react21.useRef)(moveToCandidates);
|
|
9277
9438
|
moveToCandidatesRef.current = moveToCandidates;
|
|
9278
|
-
const moveToSourceRef = (0,
|
|
9439
|
+
const moveToSourceRef = (0, import_react21.useRef)(moveToSource);
|
|
9279
9440
|
moveToSourceRef.current = moveToSource;
|
|
9280
|
-
const toggleChecked = (0,
|
|
9441
|
+
const toggleChecked = (0, import_react21.useCallback)((id) => {
|
|
9281
9442
|
setCheckedIds((prev) => prev.includes(id) ? prev.filter((x) => x !== id) : [...prev, id]);
|
|
9282
9443
|
}, []);
|
|
9283
9444
|
const allChecked = candidateIds.length > 0 && candidateIds.every((id) => checkedIds.includes(id));
|
|
9284
9445
|
const someChecked = candidateIds.some((id) => checkedIds.includes(id));
|
|
9285
|
-
const toggleAll = (0,
|
|
9446
|
+
const toggleAll = (0, import_react21.useCallback)(() => {
|
|
9286
9447
|
setCheckedIds(allChecked ? [] : [...candidateIds]);
|
|
9287
9448
|
}, [allChecked, candidateIds]);
|
|
9288
|
-
const returnAll = (0,
|
|
9449
|
+
const returnAll = (0, import_react21.useCallback)(() => {
|
|
9289
9450
|
setCandidateIds([]);
|
|
9290
9451
|
setCheckedIds([]);
|
|
9291
9452
|
}, []);
|
|
9292
|
-
const checkedCandidates = (0,
|
|
9453
|
+
const checkedCandidates = (0, import_react21.useMemo)(() => candidateIds.filter((id) => checkedIds.includes(id)), [candidateIds, checkedIds]);
|
|
9293
9454
|
const isDirty = checkedCandidates.length !== assignedIds.length || checkedCandidates.some((id) => !assignedIds.includes(id));
|
|
9294
|
-
const submitAssignment = (0,
|
|
9455
|
+
const submitAssignment = (0, import_react21.useCallback)(async () => {
|
|
9295
9456
|
if (!selectedTargetId) {
|
|
9296
9457
|
alert("\u05D0\u05E0\u05D0 \u05D1\u05D7\u05E8 \u05E7\u05D5\u05D3\u05DD \u05E8\u05E9\u05D5\u05DE\u05EA \u05D9\u05E2\u05D3 \u05DC\u05E4\u05E0\u05D9 \u05D4\u05E9\u05D9\u05D1\u05D5\u05E5");
|
|
9297
9458
|
return;
|
|
@@ -9307,14 +9468,14 @@ var PlacementBlock = (props) => {
|
|
|
9307
9468
|
setIsSaving(false);
|
|
9308
9469
|
}
|
|
9309
9470
|
}, [selectedTargetId, persistAssignment, checkedCandidates]);
|
|
9310
|
-
const cycleStatus = (0,
|
|
9471
|
+
const cycleStatus = (0, import_react21.useCallback)((recordId) => {
|
|
9311
9472
|
setStatusMap((prev) => {
|
|
9312
9473
|
const current = prev[recordId] || defaultStatusId;
|
|
9313
9474
|
const idx = statuses.findIndex((c) => c.id === current);
|
|
9314
9475
|
return __spreadProps(__spreadValues({}, prev), { [recordId]: statuses[(idx + 1) % statuses.length].id });
|
|
9315
9476
|
});
|
|
9316
9477
|
}, [statuses, defaultStatusId]);
|
|
9317
|
-
const cancelAssignment = (0,
|
|
9478
|
+
const cancelAssignment = (0, import_react21.useCallback)(async () => {
|
|
9318
9479
|
if (!selectedTargetId || assignedIds.length === 0) return;
|
|
9319
9480
|
if (!window.confirm(`\u05DC\u05D1\u05D8\u05DC \u05D0\u05EA \u05D4\u05E9\u05D9\u05D1\u05D5\u05E5 \u05D5\u05DC\u05DE\u05D7\u05D5\u05E7 \u05D0\u05EA \u05D4\u05E0\u05EA\u05D5\u05DF \u05DE\u05E9\u05D3\u05D4 "${assignmentLabel}"?`)) return;
|
|
9320
9481
|
const removed = new Set(assignedIds);
|
|
@@ -9330,7 +9491,7 @@ var PlacementBlock = (props) => {
|
|
|
9330
9491
|
setIsSaving(false);
|
|
9331
9492
|
}
|
|
9332
9493
|
}, [selectedTargetId, assignedIds, assignmentLabel, persistAssignment]);
|
|
9333
|
-
const makeColDefs = (0,
|
|
9494
|
+
const makeColDefs = (0, import_react21.useCallback)((columns, fallbackName, grid, withCheckbox = false) => {
|
|
9334
9495
|
const gridFilters = colFilters[grid];
|
|
9335
9496
|
const defs = [];
|
|
9336
9497
|
if (withCheckbox) {
|
|
@@ -9375,36 +9536,36 @@ var PlacementBlock = (props) => {
|
|
|
9375
9536
|
return defs;
|
|
9376
9537
|
}, [cycleStatus, statuses, defaultStatusId, displayField, displayValue, toggleChecked, toggleAll, allChecked, someChecked, colFilters, openColFilter]);
|
|
9377
9538
|
const sourceHeader = displayField === "name" ? "\u05E9\u05DD" : columnRefLabel(displayField);
|
|
9378
|
-
const sourceColDefs = (0,
|
|
9379
|
-
const candidateColDefs = (0,
|
|
9380
|
-
const defaultColDef = (0,
|
|
9539
|
+
const sourceColDefs = (0, import_react21.useMemo)(() => makeColDefs(sourceColumns, sourceHeader, "source"), [makeColDefs, sourceColumns, sourceHeader]);
|
|
9540
|
+
const candidateColDefs = (0, import_react21.useMemo)(() => makeColDefs(sourceColumns, sourceHeader, "cand", true), [makeColDefs, sourceColumns, sourceHeader]);
|
|
9541
|
+
const defaultColDef = (0, import_react21.useMemo)(() => ({ resizable: true }), []);
|
|
9381
9542
|
const scrollableColIds = (defs) => defs.filter((d) => !d.pinned).map((d) => {
|
|
9382
9543
|
var _a2;
|
|
9383
9544
|
return (_a2 = d.colId) != null ? _a2 : d.field;
|
|
9384
9545
|
}).filter(Boolean);
|
|
9385
|
-
const expandColumns = (0,
|
|
9546
|
+
const expandColumns = (0, import_react21.useCallback)((api) => {
|
|
9386
9547
|
api == null ? void 0 : api.sizeColumnsToFit();
|
|
9387
9548
|
}, []);
|
|
9388
|
-
const shrinkColumns = (0,
|
|
9549
|
+
const shrinkColumns = (0, import_react21.useCallback)((api, defs) => {
|
|
9389
9550
|
api == null ? void 0 : api.autoSizeColumns(scrollableColIds(defs));
|
|
9390
9551
|
}, []);
|
|
9391
|
-
const popoverOptions = (0,
|
|
9552
|
+
const popoverOptions = (0, import_react21.useMemo)(() => {
|
|
9392
9553
|
if (!filterPopover) return [];
|
|
9393
9554
|
const rows = filterPopover.grid === "source" ? availableRows : candidateRows;
|
|
9394
9555
|
const set = /* @__PURE__ */ new Set();
|
|
9395
9556
|
rows.forEach((r) => relationLabelsOf(r, filterPopover.colName).forEach((l) => set.add(l)));
|
|
9396
9557
|
return Array.from(set).sort((a, b) => a.localeCompare(b, "he")).map((label) => ({ id: label, label }));
|
|
9397
9558
|
}, [filterPopover, availableRows, candidateRows, relationLabelsOf]);
|
|
9398
|
-
const popoverColumn = (0,
|
|
9559
|
+
const popoverColumn = (0, import_react21.useMemo)(
|
|
9399
9560
|
() => filterPopover ? sourceColumns.find((c) => c.name === filterPopover.colName) : void 0,
|
|
9400
9561
|
[filterPopover, sourceColumns]
|
|
9401
9562
|
);
|
|
9402
|
-
const getRowId = (0,
|
|
9403
|
-
const sourceContainerRef = (0,
|
|
9404
|
-
const assignedContainerRef = (0,
|
|
9405
|
-
const [sourceApi, setSourceApi] = (0,
|
|
9406
|
-
const [assignedApi, setAssignedApi] = (0,
|
|
9407
|
-
(0,
|
|
9563
|
+
const getRowId = (0, import_react21.useCallback)((p) => p.data.id, []);
|
|
9564
|
+
const sourceContainerRef = (0, import_react21.useRef)(null);
|
|
9565
|
+
const assignedContainerRef = (0, import_react21.useRef)(null);
|
|
9566
|
+
const [sourceApi, setSourceApi] = (0, import_react21.useState)(null);
|
|
9567
|
+
const [assignedApi, setAssignedApi] = (0, import_react21.useState)(null);
|
|
9568
|
+
(0, import_react21.useEffect)(() => {
|
|
9408
9569
|
if (!sourceApi || !assignedApi) return;
|
|
9409
9570
|
const toAssigned = { getContainer: () => assignedContainerRef.current, onDragStop: (p) => {
|
|
9410
9571
|
var _a2, _b2;
|
|
@@ -9427,20 +9588,20 @@ var PlacementBlock = (props) => {
|
|
|
9427
9588
|
}
|
|
9428
9589
|
};
|
|
9429
9590
|
}, [sourceApi, assignedApi]);
|
|
9430
|
-
const selectorLabel = (0,
|
|
9591
|
+
const selectorLabel = (0, import_react21.useMemo)(() => {
|
|
9431
9592
|
const col = targetColumns.find((c) => c.name === selectorField || c.id === selectorField);
|
|
9432
9593
|
return (col == null ? void 0 : col.label) || columnRefLabel(selectorField) || "\u05D1\u05D7\u05D9\u05E8\u05EA \u05E8\u05E9\u05D5\u05DE\u05D4 \u05DC\u05E9\u05D9\u05D1\u05D5\u05E5";
|
|
9433
9594
|
}, [targetColumns, selectorField]);
|
|
9434
|
-
const assignedText = (0,
|
|
9595
|
+
const assignedText = (0, import_react21.useMemo)(
|
|
9435
9596
|
() => assignedIds.map((id) => sourceRows.find((r) => r.id === id)).filter((r) => !!r).map(nameOf).join(", "),
|
|
9436
9597
|
[assignedIds, sourceRows, nameOf]
|
|
9437
9598
|
);
|
|
9438
9599
|
const activeTarget = targetRows.find((r) => r.id === selectedTargetId);
|
|
9439
|
-
const targetLabel = (0,
|
|
9600
|
+
const targetLabel = (0, import_react21.useCallback)((r) => {
|
|
9440
9601
|
const col = targetColumns.find((c) => c.name === selectorField || c.id === selectorField);
|
|
9441
9602
|
return displayValue(col || { name: selectorField }, readColumnValue(r.data, selectorField)) || "\u05DC\u05DC\u05D0 \u05E9\u05DD";
|
|
9442
9603
|
}, [selectorField, targetColumns, displayValue]);
|
|
9443
|
-
const previewColumns = (0,
|
|
9604
|
+
const previewColumns = (0, import_react21.useMemo)(() => targetColumns.filter((c) => isUserColumn(c) && c.name !== assignmentField && !["id", "_id", "id_", "statusId"].includes(c.name)), [targetColumns, assignmentField]);
|
|
9444
9605
|
if (!config || !sourceTableId || !targetTableId) {
|
|
9445
9606
|
return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { className: "p-4 text-xs text-slate-500 border border-dashed border-slate-300 rounded-xl", dir: "rtl", children: "\u05E8\u05DB\u05D9\u05D1 \u05D4\u05E9\u05D9\u05D1\u05D5\u05E5 \u05DC\u05D0 \u05D4\u05D5\u05D2\u05D3\u05E8 (\u05D7\u05E1\u05E8\u05D5\u05EA \u05D8\u05D1\u05DC\u05EA \u05DE\u05E7\u05D5\u05E8 / \u05D8\u05D1\u05DC\u05EA \u05D9\u05E2\u05D3)." });
|
|
9446
9607
|
}
|
|
@@ -9603,11 +9764,11 @@ var PlacementBlock = (props) => {
|
|
|
9603
9764
|
};
|
|
9604
9765
|
|
|
9605
9766
|
// src/components/WhatsAppComponent/WhatsAppComponent.tsx
|
|
9606
|
-
var
|
|
9767
|
+
var import_react27 = __toESM(require("react"));
|
|
9607
9768
|
var import_lucide_react17 = require("lucide-react");
|
|
9608
9769
|
|
|
9609
9770
|
// src/components/WhatsAppComponent/CreateTemplateModal.tsx
|
|
9610
|
-
var
|
|
9771
|
+
var import_react22 = require("react");
|
|
9611
9772
|
var import_lucide_react11 = require("lucide-react");
|
|
9612
9773
|
var import_emoji_picker_react = __toESM(require("emoji-picker-react"));
|
|
9613
9774
|
|
|
@@ -9737,26 +9898,26 @@ function CreateTemplateModal({
|
|
|
9737
9898
|
executeAction,
|
|
9738
9899
|
orgId
|
|
9739
9900
|
}) {
|
|
9740
|
-
const [templateName, setTemplateName] = (0,
|
|
9741
|
-
const [language, setLanguage] = (0,
|
|
9742
|
-
const [category, setCategory] = (0,
|
|
9743
|
-
const [bodyText, setBodyText] = (0,
|
|
9744
|
-
const [variableSamples, setVariableSamples] = (0,
|
|
9745
|
-
const [hasFileHeader, setHasFileHeader] = (0,
|
|
9746
|
-
const [selectedFile, setSelectedFile] = (0,
|
|
9747
|
-
const [fileBase64, setFileBase64] = (0,
|
|
9748
|
-
const [buttons, setButtons] = (0,
|
|
9749
|
-
const [isAddButtonOpen, setIsAddButtonOpen] = (0,
|
|
9750
|
-
const addButtonDropdownRef = (0,
|
|
9751
|
-
const [isSubmitting, setIsSubmitting] = (0,
|
|
9752
|
-
const [submittingStep, setSubmittingStep] = (0,
|
|
9753
|
-
const [submitError, setSubmitError] = (0,
|
|
9754
|
-
const [fileError, setFileError] = (0,
|
|
9755
|
-
const textareaRef = (0,
|
|
9756
|
-
const fileInputRef = (0,
|
|
9757
|
-
const emojiPickerRef = (0,
|
|
9758
|
-
const [isEmojiPickerOpen, setIsEmojiPickerOpen] = (0,
|
|
9759
|
-
(0,
|
|
9901
|
+
const [templateName, setTemplateName] = (0, import_react22.useState)("");
|
|
9902
|
+
const [language, setLanguage] = (0, import_react22.useState)("he");
|
|
9903
|
+
const [category, setCategory] = (0, import_react22.useState)("MARKETING");
|
|
9904
|
+
const [bodyText, setBodyText] = (0, import_react22.useState)("");
|
|
9905
|
+
const [variableSamples, setVariableSamples] = (0, import_react22.useState)({});
|
|
9906
|
+
const [hasFileHeader, setHasFileHeader] = (0, import_react22.useState)(false);
|
|
9907
|
+
const [selectedFile, setSelectedFile] = (0, import_react22.useState)(null);
|
|
9908
|
+
const [fileBase64, setFileBase64] = (0, import_react22.useState)("");
|
|
9909
|
+
const [buttons, setButtons] = (0, import_react22.useState)([]);
|
|
9910
|
+
const [isAddButtonOpen, setIsAddButtonOpen] = (0, import_react22.useState)(false);
|
|
9911
|
+
const addButtonDropdownRef = (0, import_react22.useRef)(null);
|
|
9912
|
+
const [isSubmitting, setIsSubmitting] = (0, import_react22.useState)(false);
|
|
9913
|
+
const [submittingStep, setSubmittingStep] = (0, import_react22.useState)("");
|
|
9914
|
+
const [submitError, setSubmitError] = (0, import_react22.useState)(null);
|
|
9915
|
+
const [fileError, setFileError] = (0, import_react22.useState)(null);
|
|
9916
|
+
const textareaRef = (0, import_react22.useRef)(null);
|
|
9917
|
+
const fileInputRef = (0, import_react22.useRef)(null);
|
|
9918
|
+
const emojiPickerRef = (0, import_react22.useRef)(null);
|
|
9919
|
+
const [isEmojiPickerOpen, setIsEmojiPickerOpen] = (0, import_react22.useState)(false);
|
|
9920
|
+
(0, import_react22.useEffect)(() => {
|
|
9760
9921
|
function handleClickOutside(event) {
|
|
9761
9922
|
if (emojiPickerRef.current && !emojiPickerRef.current.contains(event.target)) {
|
|
9762
9923
|
setIsEmojiPickerOpen(false);
|
|
@@ -9780,7 +9941,7 @@ function CreateTemplateModal({
|
|
|
9780
9941
|
document.removeEventListener("keydown", handleKeyDown2);
|
|
9781
9942
|
};
|
|
9782
9943
|
}, [isEmojiPickerOpen, isAddButtonOpen]);
|
|
9783
|
-
(0,
|
|
9944
|
+
(0, import_react22.useEffect)(() => {
|
|
9784
9945
|
if (isOpen) {
|
|
9785
9946
|
setTemplateName("");
|
|
9786
9947
|
setLanguage("he");
|
|
@@ -9799,10 +9960,10 @@ function CreateTemplateModal({
|
|
|
9799
9960
|
setIsEmojiPickerOpen(false);
|
|
9800
9961
|
}
|
|
9801
9962
|
}, [isOpen]);
|
|
9802
|
-
const uniqueVariables = (0,
|
|
9963
|
+
const uniqueVariables = (0, import_react22.useMemo)(() => {
|
|
9803
9964
|
return extractUniqueVariableIndices(bodyText);
|
|
9804
9965
|
}, [bodyText]);
|
|
9805
|
-
(0,
|
|
9966
|
+
(0, import_react22.useEffect)(() => {
|
|
9806
9967
|
setVariableSamples((prev) => {
|
|
9807
9968
|
const next = {};
|
|
9808
9969
|
uniqueVariables.forEach((idx) => {
|
|
@@ -9813,7 +9974,7 @@ function CreateTemplateModal({
|
|
|
9813
9974
|
}, [uniqueVariables]);
|
|
9814
9975
|
const isNameEmpty = templateName.trim().length === 0;
|
|
9815
9976
|
const isNamePatternValid = isValidTemplateName(templateName);
|
|
9816
|
-
const isNameDuplicate = (0,
|
|
9977
|
+
const isNameDuplicate = (0, import_react22.useMemo)(() => {
|
|
9817
9978
|
const trimmedName = templateName.trim().toLowerCase();
|
|
9818
9979
|
if (!trimmedName) return false;
|
|
9819
9980
|
if (existingTemplates && existingTemplates.length > 0) {
|
|
@@ -9823,9 +9984,9 @@ function CreateTemplateModal({
|
|
|
9823
9984
|
}
|
|
9824
9985
|
return isDuplicateTemplateName(trimmedName, existingTemplateNames, language);
|
|
9825
9986
|
}, [templateName, language, existingTemplates, existingTemplateNames]);
|
|
9826
|
-
const ratioInfo = (0,
|
|
9827
|
-
const seqInfo = (0,
|
|
9828
|
-
const validationResult = (0,
|
|
9987
|
+
const ratioInfo = (0, import_react22.useMemo)(() => validateWordToVariableRatio(bodyText), [bodyText]);
|
|
9988
|
+
const seqInfo = (0, import_react22.useMemo)(() => validateSequentialVariables(bodyText), [bodyText]);
|
|
9989
|
+
const validationResult = (0, import_react22.useMemo)(() => {
|
|
9829
9990
|
return validateWhatsAppTemplate({
|
|
9830
9991
|
name: templateName,
|
|
9831
9992
|
language,
|
|
@@ -10819,7 +10980,7 @@ function CreateTemplateModal({
|
|
|
10819
10980
|
}
|
|
10820
10981
|
|
|
10821
10982
|
// src/components/WhatsAppComponent/hooks/useWhatsAppState.ts
|
|
10822
|
-
var
|
|
10983
|
+
var import_react23 = require("react");
|
|
10823
10984
|
|
|
10824
10985
|
// src/components/WhatsAppComponent/utils/recipientEngine.ts
|
|
10825
10986
|
var STORAGE_KEY_TEST_PHONE = "whatsapp_test_phone";
|
|
@@ -12124,29 +12285,29 @@ function useWhatsAppState(props) {
|
|
|
12124
12285
|
data: injectedData
|
|
12125
12286
|
} = props;
|
|
12126
12287
|
const orgId = props.orgId || props.organizationId || (settings == null ? void 0 : settings.orgId) || (settings == null ? void 0 : settings.organizationId) || (injectedData == null ? void 0 : injectedData.orgId) || (injectedData == null ? void 0 : injectedData.organizationId);
|
|
12127
|
-
const [tableColumns2, setTableColumns] = (0,
|
|
12288
|
+
const [tableColumns2, setTableColumns] = (0, import_react23.useState)(() => {
|
|
12128
12289
|
return Array.isArray(settings == null ? void 0 : settings.columns) ? settings.columns : [];
|
|
12129
12290
|
});
|
|
12130
|
-
const [rawRecords, setRawRecords] = (0,
|
|
12291
|
+
const [rawRecords, setRawRecords] = (0, import_react23.useState)(() => {
|
|
12131
12292
|
if (Array.isArray(injectedData)) return injectedData;
|
|
12132
12293
|
if (Array.isArray(injectedData == null ? void 0 : injectedData.records)) return injectedData.records;
|
|
12133
12294
|
return [];
|
|
12134
12295
|
});
|
|
12135
|
-
const [relationOptions, setRelationOptions] = (0,
|
|
12296
|
+
const [relationOptions, setRelationOptions] = (0, import_react23.useState)(() => {
|
|
12136
12297
|
return (injectedData == null ? void 0 : injectedData.relationOptions) || {};
|
|
12137
12298
|
});
|
|
12138
|
-
const [isLoadingTableData, setIsLoadingTableData] = (0,
|
|
12139
|
-
const [activeSubtableScans, setActiveSubtableScans] = (0,
|
|
12140
|
-
const [tableError, setTableError] = (0,
|
|
12141
|
-
const [filters, setFilters] = (0,
|
|
12142
|
-
const [selectedRowIds, setSelectedRowIds] = (0,
|
|
12143
|
-
const [autoSelectCount, setAutoSelectCount] = (0,
|
|
12144
|
-
const isAutoSelectingRef = (0,
|
|
12145
|
-
const isManualOverrideRef = (0,
|
|
12146
|
-
const prevAutoSelectCountRef = (0,
|
|
12147
|
-
const fetchedTableIdsRef = (0,
|
|
12148
|
-
const fullyFetchedRelationKeysRef = (0,
|
|
12149
|
-
const loadTableData = (0,
|
|
12299
|
+
const [isLoadingTableData, setIsLoadingTableData] = (0, import_react23.useState)(() => Boolean(settings == null ? void 0 : settings.tableMetaId));
|
|
12300
|
+
const [activeSubtableScans, setActiveSubtableScans] = (0, import_react23.useState)(0);
|
|
12301
|
+
const [tableError, setTableError] = (0, import_react23.useState)(null);
|
|
12302
|
+
const [filters, setFilters] = (0, import_react23.useState)({});
|
|
12303
|
+
const [selectedRowIds, setSelectedRowIds] = (0, import_react23.useState)([]);
|
|
12304
|
+
const [autoSelectCount, setAutoSelectCount] = (0, import_react23.useState)(null);
|
|
12305
|
+
const isAutoSelectingRef = (0, import_react23.useRef)(false);
|
|
12306
|
+
const isManualOverrideRef = (0, import_react23.useRef)(false);
|
|
12307
|
+
const prevAutoSelectCountRef = (0, import_react23.useRef)(null);
|
|
12308
|
+
const fetchedTableIdsRef = (0, import_react23.useRef)(/* @__PURE__ */ new Set());
|
|
12309
|
+
const fullyFetchedRelationKeysRef = (0, import_react23.useRef)(/* @__PURE__ */ new Set());
|
|
12310
|
+
const loadTableData = (0, import_react23.useCallback)(async () => {
|
|
12150
12311
|
var _a2;
|
|
12151
12312
|
const tableId = (settings == null ? void 0 : settings.tableMetaId) || (injectedData == null ? void 0 : injectedData.tableMetaId) || (injectedData == null ? void 0 : injectedData.tableId);
|
|
12152
12313
|
if (!tableId || !executeAction) return;
|
|
@@ -12213,10 +12374,10 @@ function useWhatsAppState(props) {
|
|
|
12213
12374
|
executeAction,
|
|
12214
12375
|
orgId
|
|
12215
12376
|
]);
|
|
12216
|
-
(0,
|
|
12377
|
+
(0, import_react23.useEffect)(() => {
|
|
12217
12378
|
loadTableData();
|
|
12218
12379
|
}, [loadTableData]);
|
|
12219
|
-
const filterableColumns = (0,
|
|
12380
|
+
const filterableColumns = (0, import_react23.useMemo)(() => {
|
|
12220
12381
|
return (tableColumns2 || []).filter((col) => {
|
|
12221
12382
|
var _a2;
|
|
12222
12383
|
if (!col || col.name === "_id" || col.id === "_id") return false;
|
|
@@ -12224,15 +12385,15 @@ function useWhatsAppState(props) {
|
|
|
12224
12385
|
return type === "RELATION" || type === "BOOLEAN";
|
|
12225
12386
|
});
|
|
12226
12387
|
}, [tableColumns2]);
|
|
12227
|
-
const [referencedTableSchemas, setReferencedTableSchemas] = (0,
|
|
12228
|
-
const subtableCols = (0,
|
|
12388
|
+
const [referencedTableSchemas, setReferencedTableSchemas] = (0, import_react23.useState)({});
|
|
12389
|
+
const subtableCols = (0, import_react23.useMemo)(() => {
|
|
12229
12390
|
return (tableColumns2 || []).filter((col) => {
|
|
12230
12391
|
var _a2;
|
|
12231
12392
|
const type = (_a2 = col.type) == null ? void 0 : _a2.toUpperCase();
|
|
12232
12393
|
return type === "RELATION" || type === "SUB_TABLE" || type === "SUBTABLE";
|
|
12233
12394
|
});
|
|
12234
12395
|
}, [tableColumns2]);
|
|
12235
|
-
(0,
|
|
12396
|
+
(0, import_react23.useEffect)(() => {
|
|
12236
12397
|
if (!executeAction) return;
|
|
12237
12398
|
const unrequestedCols = subtableCols.filter((col) => {
|
|
12238
12399
|
var _a2;
|
|
@@ -12278,20 +12439,20 @@ function useWhatsAppState(props) {
|
|
|
12278
12439
|
const isScanningPhoneColumns = Boolean(
|
|
12279
12440
|
isLoadingTableData || activeSubtableScans > 0 || tableColumns2.length === 0 && Boolean(settings == null ? void 0 : settings.tableMetaId)
|
|
12280
12441
|
);
|
|
12281
|
-
const targetPhoneOptions = (0,
|
|
12442
|
+
const targetPhoneOptions = (0, import_react23.useMemo)(() => {
|
|
12282
12443
|
const cols = tableColumns2 && tableColumns2.length > 0 ? tableColumns2 : Array.isArray(settings == null ? void 0 : settings.columns) ? settings.columns : [];
|
|
12283
12444
|
return scanTargetPhoneOptions(cols, referencedTableSchemas);
|
|
12284
12445
|
}, [tableColumns2, settings == null ? void 0 : settings.columns, referencedTableSchemas]);
|
|
12285
|
-
const phoneColumns = (0,
|
|
12446
|
+
const phoneColumns = (0, import_react23.useMemo)(() => {
|
|
12286
12447
|
return targetPhoneOptions.map((opt) => ({ name: opt.label, id: opt.id, type: "PHONE" }));
|
|
12287
12448
|
}, [targetPhoneOptions]);
|
|
12288
|
-
const [phoneColumnId, setPhoneColumnId] = (0,
|
|
12289
|
-
const [subtableFilterColumn, setSubtableFilterColumn] = (0,
|
|
12290
|
-
const [subtableFilterValue, setSubtableFilterValue] = (0,
|
|
12291
|
-
const [subtableSendLimit, setSubtableSendLimit] = (0,
|
|
12449
|
+
const [phoneColumnId, setPhoneColumnId] = (0, import_react23.useState)("");
|
|
12450
|
+
const [subtableFilterColumn, setSubtableFilterColumn] = (0, import_react23.useState)("");
|
|
12451
|
+
const [subtableFilterValue, setSubtableFilterValue] = (0, import_react23.useState)("");
|
|
12452
|
+
const [subtableSendLimit, setSubtableSendLimit] = (0, import_react23.useState)(
|
|
12292
12453
|
(settings == null ? void 0 : settings.subtableSendLimit) || "PRIMARY"
|
|
12293
12454
|
);
|
|
12294
|
-
(0,
|
|
12455
|
+
(0, import_react23.useEffect)(() => {
|
|
12295
12456
|
if (targetPhoneOptions.length > 0) {
|
|
12296
12457
|
const isValid = targetPhoneOptions.some(
|
|
12297
12458
|
(opt) => opt.id === phoneColumnId || opt.columnName === phoneColumnId
|
|
@@ -12303,13 +12464,13 @@ function useWhatsAppState(props) {
|
|
|
12303
12464
|
setPhoneColumnId("");
|
|
12304
12465
|
}
|
|
12305
12466
|
}, [targetPhoneOptions, phoneColumnId]);
|
|
12306
|
-
const selectedPhoneOption = (0,
|
|
12467
|
+
const selectedPhoneOption = (0, import_react23.useMemo)(() => {
|
|
12307
12468
|
if (!phoneColumnId) return targetPhoneOptions[0] || null;
|
|
12308
12469
|
return targetPhoneOptions.find(
|
|
12309
12470
|
(opt) => opt.id === phoneColumnId || opt.columnName === phoneColumnId
|
|
12310
12471
|
) || targetPhoneOptions[0] || null;
|
|
12311
12472
|
}, [targetPhoneOptions, phoneColumnId]);
|
|
12312
|
-
const subtableFilterableColumns = (0,
|
|
12473
|
+
const subtableFilterableColumns = (0, import_react23.useMemo)(() => {
|
|
12313
12474
|
var _a2, _b2, _c;
|
|
12314
12475
|
if (!selectedPhoneOption || selectedPhoneOption.type !== "SUBTABLE") {
|
|
12315
12476
|
return [];
|
|
@@ -12328,14 +12489,14 @@ function useWhatsAppState(props) {
|
|
|
12328
12489
|
return type === "BOOLEAN" || type === "RELATION";
|
|
12329
12490
|
});
|
|
12330
12491
|
}, [selectedPhoneOption, referencedTableSchemas, tableColumns2]);
|
|
12331
|
-
const selectedSubtableFilterCol = (0,
|
|
12492
|
+
const selectedSubtableFilterCol = (0, import_react23.useMemo)(() => {
|
|
12332
12493
|
return subtableFilterableColumns.find((c) => c.name === subtableFilterColumn);
|
|
12333
12494
|
}, [subtableFilterableColumns, subtableFilterColumn]);
|
|
12334
|
-
const [enablePostSendAction, setEnablePostSendAction] = (0,
|
|
12335
|
-
const [postSendActionColumn, setPostSendActionColumn] = (0,
|
|
12336
|
-
const [postSendActionValue, setPostSendActionValue] = (0,
|
|
12337
|
-
const [postSendActionTargetType, setPostSendActionTargetType] = (0,
|
|
12338
|
-
const postSendActionTargetOptions = (0,
|
|
12495
|
+
const [enablePostSendAction, setEnablePostSendAction] = (0, import_react23.useState)(false);
|
|
12496
|
+
const [postSendActionColumn, setPostSendActionColumn] = (0, import_react23.useState)("");
|
|
12497
|
+
const [postSendActionValue, setPostSendActionValue] = (0, import_react23.useState)("");
|
|
12498
|
+
const [postSendActionTargetType, setPostSendActionTargetType] = (0, import_react23.useState)("MAIN");
|
|
12499
|
+
const postSendActionTargetOptions = (0, import_react23.useMemo)(() => {
|
|
12339
12500
|
var _a2, _b2, _c;
|
|
12340
12501
|
const options = [];
|
|
12341
12502
|
(tableColumns2 || []).forEach((col) => {
|
|
@@ -12380,14 +12541,14 @@ function useWhatsAppState(props) {
|
|
|
12380
12541
|
}
|
|
12381
12542
|
return options;
|
|
12382
12543
|
}, [tableColumns2, selectedPhoneOption, referencedTableSchemas]);
|
|
12383
|
-
const selectedPostSendOption = (0,
|
|
12544
|
+
const selectedPostSendOption = (0, import_react23.useMemo)(() => {
|
|
12384
12545
|
return postSendActionTargetOptions.find(
|
|
12385
12546
|
(opt) => opt.id === postSendActionColumn || opt.columnName === postSendActionColumn
|
|
12386
12547
|
);
|
|
12387
12548
|
}, [postSendActionTargetOptions, postSendActionColumn]);
|
|
12388
12549
|
const selectedPostSendCol = selectedPostSendOption;
|
|
12389
|
-
const [isTestPromptOpen, setIsTestPromptOpen] = (0,
|
|
12390
|
-
const [testPhoneNumber, setTestPhoneNumber] = (0,
|
|
12550
|
+
const [isTestPromptOpen, setIsTestPromptOpen] = (0, import_react23.useState)(false);
|
|
12551
|
+
const [testPhoneNumber, setTestPhoneNumber] = (0, import_react23.useState)(() => {
|
|
12391
12552
|
if (typeof window !== "undefined") {
|
|
12392
12553
|
try {
|
|
12393
12554
|
return localStorage.getItem(STORAGE_KEY_TEST_PHONE) || "";
|
|
@@ -12397,10 +12558,10 @@ function useWhatsAppState(props) {
|
|
|
12397
12558
|
}
|
|
12398
12559
|
return "";
|
|
12399
12560
|
});
|
|
12400
|
-
const [testFeedback, setTestFeedback] = (0,
|
|
12401
|
-
const [isSendingTest, setIsSendingTest] = (0,
|
|
12402
|
-
const [isSendingBroadcast, setIsSendingBroadcast] = (0,
|
|
12403
|
-
const [broadcastProgress, setBroadcastProgress] = (0,
|
|
12561
|
+
const [testFeedback, setTestFeedback] = (0, import_react23.useState)(null);
|
|
12562
|
+
const [isSendingTest, setIsSendingTest] = (0, import_react23.useState)(false);
|
|
12563
|
+
const [isSendingBroadcast, setIsSendingBroadcast] = (0, import_react23.useState)(false);
|
|
12564
|
+
const [broadcastProgress, setBroadcastProgress] = (0, import_react23.useState)({
|
|
12404
12565
|
current: 0,
|
|
12405
12566
|
total: 0,
|
|
12406
12567
|
successful: 0,
|
|
@@ -12408,12 +12569,12 @@ function useWhatsAppState(props) {
|
|
|
12408
12569
|
skipped: 0,
|
|
12409
12570
|
percent: 0
|
|
12410
12571
|
});
|
|
12411
|
-
const [broadcastSummary, setBroadcastSummary] = (0,
|
|
12412
|
-
const [rowStatusMap, setRowStatusMap] = (0,
|
|
12413
|
-
const clearBroadcastSummary = (0,
|
|
12572
|
+
const [broadcastSummary, setBroadcastSummary] = (0, import_react23.useState)(null);
|
|
12573
|
+
const [rowStatusMap, setRowStatusMap] = (0, import_react23.useState)({});
|
|
12574
|
+
const clearBroadcastSummary = (0, import_react23.useCallback)(() => {
|
|
12414
12575
|
setBroadcastSummary(null);
|
|
12415
12576
|
}, []);
|
|
12416
|
-
const handleTestPhoneChange = (0,
|
|
12577
|
+
const handleTestPhoneChange = (0, import_react23.useCallback)((val) => {
|
|
12417
12578
|
setTestPhoneNumber(val);
|
|
12418
12579
|
if (typeof window !== "undefined") {
|
|
12419
12580
|
try {
|
|
@@ -12423,7 +12584,7 @@ function useWhatsAppState(props) {
|
|
|
12423
12584
|
}
|
|
12424
12585
|
}
|
|
12425
12586
|
}, []);
|
|
12426
|
-
const getRelationOptionsForCol = (0,
|
|
12587
|
+
const getRelationOptionsForCol = (0, import_react23.useCallback)(
|
|
12427
12588
|
(colName, parentColName) => {
|
|
12428
12589
|
var _a2, _b2, _c, _d;
|
|
12429
12590
|
if (parentColName) {
|
|
@@ -12466,7 +12627,7 @@ function useWhatsAppState(props) {
|
|
|
12466
12627
|
},
|
|
12467
12628
|
[relationOptions, subtableFilterableColumns, postSendActionTargetOptions, tableColumns2, filterableColumns]
|
|
12468
12629
|
);
|
|
12469
|
-
(0,
|
|
12630
|
+
(0, import_react23.useEffect)(() => {
|
|
12470
12631
|
var _a2, _b2, _c, _d, _e;
|
|
12471
12632
|
if (!executeAction) return;
|
|
12472
12633
|
const targets = [];
|
|
@@ -12560,7 +12721,7 @@ function useWhatsAppState(props) {
|
|
|
12560
12721
|
}
|
|
12561
12722
|
});
|
|
12562
12723
|
}, [filterableColumns, selectedPhoneOption, referencedTableSchemas, tableColumns2, executeAction, selectedPostSendOption, orgId]);
|
|
12563
|
-
(0,
|
|
12724
|
+
(0, import_react23.useEffect)(() => {
|
|
12564
12725
|
var _a2, _b2, _c;
|
|
12565
12726
|
if (!executeAction || !selectedSubtableFilterCol) return;
|
|
12566
12727
|
if (((_a2 = selectedSubtableFilterCol.type) == null ? void 0 : _a2.toUpperCase()) !== "RELATION") return;
|
|
@@ -12611,7 +12772,7 @@ function useWhatsAppState(props) {
|
|
|
12611
12772
|
}
|
|
12612
12773
|
})();
|
|
12613
12774
|
}, [selectedSubtableFilterCol, selectedPhoneOption, executeAction, orgId]);
|
|
12614
|
-
(0,
|
|
12775
|
+
(0, import_react23.useEffect)(() => {
|
|
12615
12776
|
var _a2, _b2;
|
|
12616
12777
|
if (!executeAction || !selectedPostSendOption) return;
|
|
12617
12778
|
if (selectedPostSendOption.type !== "RELATION") return;
|
|
@@ -12664,7 +12825,7 @@ function useWhatsAppState(props) {
|
|
|
12664
12825
|
}
|
|
12665
12826
|
})();
|
|
12666
12827
|
}, [selectedPostSendOption, executeAction, orgId]);
|
|
12667
|
-
const filteredRecords = (0,
|
|
12828
|
+
const filteredRecords = (0, import_react23.useMemo)(() => {
|
|
12668
12829
|
const activeEntries = Object.entries(filters).filter(
|
|
12669
12830
|
([_, val]) => val !== void 0 && val !== null && val !== ""
|
|
12670
12831
|
);
|
|
@@ -12696,7 +12857,7 @@ function useWhatsAppState(props) {
|
|
|
12696
12857
|
});
|
|
12697
12858
|
}, [rawRecords, filters, filterableColumns]);
|
|
12698
12859
|
const filteredData = filteredRecords;
|
|
12699
|
-
(0,
|
|
12860
|
+
(0, import_react23.useEffect)(() => {
|
|
12700
12861
|
if (autoSelectCount !== null && autoSelectCount > 0) {
|
|
12701
12862
|
isAutoSelectingRef.current = true;
|
|
12702
12863
|
const sliced = filteredData.slice(0, autoSelectCount);
|
|
@@ -12714,7 +12875,7 @@ function useWhatsAppState(props) {
|
|
|
12714
12875
|
isManualOverrideRef.current = false;
|
|
12715
12876
|
prevAutoSelectCountRef.current = autoSelectCount;
|
|
12716
12877
|
}, [autoSelectCount, filteredData]);
|
|
12717
|
-
const embeddedTableExecuteAction = (0,
|
|
12878
|
+
const embeddedTableExecuteAction = (0, import_react23.useCallback)(async (actionType, payload) => {
|
|
12718
12879
|
if (actionType === "FETCH_TABLE_DATA") {
|
|
12719
12880
|
const colFilters = (payload == null ? void 0 : payload.columnFilters) || (payload == null ? void 0 : payload.filters);
|
|
12720
12881
|
const searchQuery = payload == null ? void 0 : payload.search;
|
|
@@ -12757,10 +12918,10 @@ function useWhatsAppState(props) {
|
|
|
12757
12918
|
const handleClearFilters = () => {
|
|
12758
12919
|
setFilters({});
|
|
12759
12920
|
};
|
|
12760
|
-
const activeFiltersCount = (0,
|
|
12921
|
+
const activeFiltersCount = (0, import_react23.useMemo)(() => {
|
|
12761
12922
|
return Object.values(filters).filter((v) => v !== "").length;
|
|
12762
12923
|
}, [filters]);
|
|
12763
|
-
const handleSelectionChange = (0,
|
|
12924
|
+
const handleSelectionChange = (0, import_react23.useCallback)((selectedIds) => {
|
|
12764
12925
|
setSelectedRowIds((prev) => {
|
|
12765
12926
|
if (prev.length === selectedIds.length && prev.every((id, idx) => id === selectedIds[idx])) {
|
|
12766
12927
|
return prev;
|
|
@@ -12774,13 +12935,13 @@ function useWhatsAppState(props) {
|
|
|
12774
12935
|
return selectedIds;
|
|
12775
12936
|
});
|
|
12776
12937
|
}, [autoSelectCount]);
|
|
12777
|
-
const handleRowToggle = (0,
|
|
12938
|
+
const handleRowToggle = (0, import_react23.useCallback)((rowId, checked) => {
|
|
12778
12939
|
if (autoSelectCount !== null && autoSelectCount > 0) {
|
|
12779
12940
|
isManualOverrideRef.current = true;
|
|
12780
12941
|
setAutoSelectCount(null);
|
|
12781
12942
|
}
|
|
12782
12943
|
}, [autoSelectCount]);
|
|
12783
|
-
const toggleRowSelection = (0,
|
|
12944
|
+
const toggleRowSelection = (0, import_react23.useCallback)((rowId, checked) => {
|
|
12784
12945
|
if (autoSelectCount !== null && autoSelectCount > 0) {
|
|
12785
12946
|
isManualOverrideRef.current = true;
|
|
12786
12947
|
setAutoSelectCount(null);
|
|
@@ -12796,15 +12957,15 @@ function useWhatsAppState(props) {
|
|
|
12796
12957
|
return prev;
|
|
12797
12958
|
});
|
|
12798
12959
|
}, [autoSelectCount]);
|
|
12799
|
-
const [templates, setTemplates] = (0,
|
|
12800
|
-
const [selectedTemplateId, setSelectedTemplateId] = (0,
|
|
12801
|
-
const [isLoading, setIsLoading] = (0,
|
|
12802
|
-
const [fetchError, setFetchError] = (0,
|
|
12803
|
-
const [isModalOpen, setIsModalOpen] = (0,
|
|
12804
|
-
const [isDropdownOpen, setIsDropdownOpen] = (0,
|
|
12805
|
-
const [isDeleting, setIsDeleting] = (0,
|
|
12806
|
-
const [feedback, setFeedback] = (0,
|
|
12807
|
-
const loadTemplates = (0,
|
|
12960
|
+
const [templates, setTemplates] = (0, import_react23.useState)([]);
|
|
12961
|
+
const [selectedTemplateId, setSelectedTemplateId] = (0, import_react23.useState)(null);
|
|
12962
|
+
const [isLoading, setIsLoading] = (0, import_react23.useState)(true);
|
|
12963
|
+
const [fetchError, setFetchError] = (0, import_react23.useState)(null);
|
|
12964
|
+
const [isModalOpen, setIsModalOpen] = (0, import_react23.useState)(false);
|
|
12965
|
+
const [isDropdownOpen, setIsDropdownOpen] = (0, import_react23.useState)(false);
|
|
12966
|
+
const [isDeleting, setIsDeleting] = (0, import_react23.useState)(false);
|
|
12967
|
+
const [feedback, setFeedback] = (0, import_react23.useState)(null);
|
|
12968
|
+
const loadTemplates = (0, import_react23.useCallback)(async () => {
|
|
12808
12969
|
var _a2, _b2;
|
|
12809
12970
|
if (!executeAction) {
|
|
12810
12971
|
setIsLoading(false);
|
|
@@ -12856,13 +13017,13 @@ function useWhatsAppState(props) {
|
|
|
12856
13017
|
setIsLoading(false);
|
|
12857
13018
|
}
|
|
12858
13019
|
}, [executeAction, orgId]);
|
|
12859
|
-
(0,
|
|
13020
|
+
(0, import_react23.useEffect)(() => {
|
|
12860
13021
|
loadTemplates();
|
|
12861
13022
|
}, [loadTemplates]);
|
|
12862
|
-
const selectedTemplate = (0,
|
|
13023
|
+
const selectedTemplate = (0, import_react23.useMemo)(() => {
|
|
12863
13024
|
return templates.find((t) => t.id === selectedTemplateId) || null;
|
|
12864
13025
|
}, [templates, selectedTemplateId]);
|
|
12865
|
-
const templateBodyText = (0,
|
|
13026
|
+
const templateBodyText = (0, import_react23.useMemo)(() => {
|
|
12866
13027
|
if (!(selectedTemplate == null ? void 0 : selectedTemplate.components)) return "";
|
|
12867
13028
|
const bodyComp = selectedTemplate.components.find(
|
|
12868
13029
|
(c) => {
|
|
@@ -12872,7 +13033,7 @@ function useWhatsAppState(props) {
|
|
|
12872
13033
|
);
|
|
12873
13034
|
return (bodyComp == null ? void 0 : bodyComp.text) || "";
|
|
12874
13035
|
}, [selectedTemplate]);
|
|
12875
|
-
const templateHeaderComp = (0,
|
|
13036
|
+
const templateHeaderComp = (0, import_react23.useMemo)(() => {
|
|
12876
13037
|
if (!(selectedTemplate == null ? void 0 : selectedTemplate.components)) return null;
|
|
12877
13038
|
return selectedTemplate.components.find(
|
|
12878
13039
|
(c) => {
|
|
@@ -12881,8 +13042,8 @@ function useWhatsAppState(props) {
|
|
|
12881
13042
|
}
|
|
12882
13043
|
) || null;
|
|
12883
13044
|
}, [selectedTemplate]);
|
|
12884
|
-
const [headerMediaUrl, setHeaderMediaUrl] = (0,
|
|
12885
|
-
(0,
|
|
13045
|
+
const [headerMediaUrl, setHeaderMediaUrl] = (0, import_react23.useState)("");
|
|
13046
|
+
(0, import_react23.useEffect)(() => {
|
|
12886
13047
|
if (!templateHeaderComp) {
|
|
12887
13048
|
setHeaderMediaUrl("");
|
|
12888
13049
|
return;
|
|
@@ -12899,7 +13060,7 @@ function useWhatsAppState(props) {
|
|
|
12899
13060
|
setHeaderMediaUrl("");
|
|
12900
13061
|
}
|
|
12901
13062
|
}, [templateHeaderComp, selectedTemplate == null ? void 0 : selectedTemplate.name]);
|
|
12902
|
-
const handleHeaderMediaUrlChange = (0,
|
|
13063
|
+
const handleHeaderMediaUrlChange = (0, import_react23.useCallback)(
|
|
12903
13064
|
(newUrl) => {
|
|
12904
13065
|
setHeaderMediaUrl(newUrl);
|
|
12905
13066
|
if ((selectedTemplate == null ? void 0 : selectedTemplate.name) && typeof window !== "undefined") {
|
|
@@ -12918,7 +13079,7 @@ function useWhatsAppState(props) {
|
|
|
12918
13079
|
},
|
|
12919
13080
|
[selectedTemplate == null ? void 0 : selectedTemplate.name]
|
|
12920
13081
|
);
|
|
12921
|
-
const handleResetHeaderMediaUrl = (0,
|
|
13082
|
+
const handleResetHeaderMediaUrl = (0, import_react23.useCallback)(() => {
|
|
12922
13083
|
if ((selectedTemplate == null ? void 0 : selectedTemplate.name) && typeof window !== "undefined") {
|
|
12923
13084
|
try {
|
|
12924
13085
|
localStorage.removeItem(`whatsapp_template_media_${selectedTemplate.name}`);
|
|
@@ -12932,8 +13093,8 @@ function useWhatsAppState(props) {
|
|
|
12932
13093
|
);
|
|
12933
13094
|
setHeaderMediaUrl(defaultUrl || "");
|
|
12934
13095
|
}, [templateHeaderComp, selectedTemplate == null ? void 0 : selectedTemplate.name]);
|
|
12935
|
-
const [isUploadingMedia, setIsUploadingMedia] = (0,
|
|
12936
|
-
const handleFileUpload = (0,
|
|
13096
|
+
const [isUploadingMedia, setIsUploadingMedia] = (0, import_react23.useState)(false);
|
|
13097
|
+
const handleFileUpload = (0, import_react23.useCallback)(
|
|
12937
13098
|
async (file, templateName) => {
|
|
12938
13099
|
const tplName = templateName || (selectedTemplate == null ? void 0 : selectedTemplate.name) || "";
|
|
12939
13100
|
if (!file) return;
|
|
@@ -12974,14 +13135,14 @@ function useWhatsAppState(props) {
|
|
|
12974
13135
|
},
|
|
12975
13136
|
[selectedTemplate == null ? void 0 : selectedTemplate.name]
|
|
12976
13137
|
);
|
|
12977
|
-
const templateVariables = (0,
|
|
13138
|
+
const templateVariables = (0, import_react23.useMemo)(() => {
|
|
12978
13139
|
return extractTemplateVariables(selectedTemplate);
|
|
12979
13140
|
}, [selectedTemplate]);
|
|
12980
|
-
const [variableMapping, setVariableMapping] = (0,
|
|
12981
|
-
(0,
|
|
13141
|
+
const [variableMapping, setVariableMapping] = (0, import_react23.useState)({});
|
|
13142
|
+
(0, import_react23.useEffect)(() => {
|
|
12982
13143
|
setVariableMapping({});
|
|
12983
13144
|
}, [selectedTemplateId]);
|
|
12984
|
-
const textableColumnOptions = (0,
|
|
13145
|
+
const textableColumnOptions = (0, import_react23.useMemo)(() => {
|
|
12985
13146
|
return getTextableColumnOptions({
|
|
12986
13147
|
tableColumns: tableColumns2,
|
|
12987
13148
|
selectedPhoneOption,
|
|
@@ -13007,7 +13168,7 @@ function useWhatsAppState(props) {
|
|
|
13007
13168
|
});
|
|
13008
13169
|
});
|
|
13009
13170
|
};
|
|
13010
|
-
const existingTemplateNames = (0,
|
|
13171
|
+
const existingTemplateNames = (0, import_react23.useMemo)(() => {
|
|
13011
13172
|
return templates.map((t) => t.name);
|
|
13012
13173
|
}, [templates]);
|
|
13013
13174
|
const handleDeleteTemplate = async () => {
|
|
@@ -13054,14 +13215,14 @@ function useWhatsAppState(props) {
|
|
|
13054
13215
|
postSendActionColumn,
|
|
13055
13216
|
postSendActionValue
|
|
13056
13217
|
);
|
|
13057
|
-
const isStaticVariableMissing = (0,
|
|
13218
|
+
const isStaticVariableMissing = (0, import_react23.useMemo)(() => {
|
|
13058
13219
|
return isStaticVariableIncomplete(templateVariables, variableMapping);
|
|
13059
13220
|
}, [templateVariables, variableMapping]);
|
|
13060
|
-
const currentRecords = (0,
|
|
13221
|
+
const currentRecords = (0, import_react23.useMemo)(() => {
|
|
13061
13222
|
var _a2;
|
|
13062
13223
|
return rawRecords && rawRecords.length > 0 ? rawRecords : Array.isArray(props.data) ? props.data : Array.isArray((_a2 = props.data) == null ? void 0 : _a2.records) ? props.data.records : [];
|
|
13063
13224
|
}, [rawRecords, props.data]);
|
|
13064
|
-
const preparedRecipients = (0,
|
|
13225
|
+
const preparedRecipients = (0, import_react23.useMemo)(() => {
|
|
13065
13226
|
return prepareRecipients({
|
|
13066
13227
|
selectedIds: selectedRowIds,
|
|
13067
13228
|
records: currentRecords,
|
|
@@ -13081,7 +13242,7 @@ function useWhatsAppState(props) {
|
|
|
13081
13242
|
selectedSubtableFilterCol
|
|
13082
13243
|
]);
|
|
13083
13244
|
const finalRecipientCount = preparedRecipients.length;
|
|
13084
|
-
const validMainRowsCount = (0,
|
|
13245
|
+
const validMainRowsCount = (0, import_react23.useMemo)(() => {
|
|
13085
13246
|
const rowIdSet = new Set(
|
|
13086
13247
|
preparedRecipients.map((r) => r.mainRowId).filter(Boolean)
|
|
13087
13248
|
);
|
|
@@ -13190,7 +13351,7 @@ function useWhatsAppState(props) {
|
|
|
13190
13351
|
setIsSendingTest(false);
|
|
13191
13352
|
}
|
|
13192
13353
|
};
|
|
13193
|
-
const handleSendMessages = (0,
|
|
13354
|
+
const handleSendMessages = (0, import_react23.useCallback)(async () => {
|
|
13194
13355
|
var _a2, _b2;
|
|
13195
13356
|
if (isSendDisabled || isSendingBroadcast) return;
|
|
13196
13357
|
const recipients = preparedRecipients;
|
|
@@ -13496,7 +13657,7 @@ function useWhatsAppState(props) {
|
|
|
13496
13657
|
}
|
|
13497
13658
|
|
|
13498
13659
|
// src/components/WhatsAppComponent/ui/TemplateSelectionBlock.tsx
|
|
13499
|
-
var
|
|
13660
|
+
var import_react24 = require("react");
|
|
13500
13661
|
var import_lucide_react12 = require("lucide-react");
|
|
13501
13662
|
var import_jsx_runtime21 = require("react/jsx-runtime");
|
|
13502
13663
|
function TemplateSelectionBlock({
|
|
@@ -13524,7 +13685,7 @@ function TemplateSelectionBlock({
|
|
|
13524
13685
|
isUploadingMedia = false,
|
|
13525
13686
|
handleFileUpload
|
|
13526
13687
|
}) {
|
|
13527
|
-
const fileInputRef = (0,
|
|
13688
|
+
const fileInputRef = (0, import_react24.useRef)(null);
|
|
13528
13689
|
return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: "col-span-12 lg:col-span-5 min-h-[26rem] h-full flex flex-col bg-slate-50/70 border border-slate-200 rounded-2xl p-3.5 relative", children: [
|
|
13529
13690
|
/* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: "space-y-1.5 shrink-0", children: [
|
|
13530
13691
|
/* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: "flex items-center justify-between pb-1.5 border-b border-slate-200/70 shrink-0 gap-2", children: [
|
|
@@ -14476,19 +14637,19 @@ function SettingsAndActionsBlock({
|
|
|
14476
14637
|
}
|
|
14477
14638
|
|
|
14478
14639
|
// src/components/WhatsAppComponent/inbox/useInboxState.ts
|
|
14479
|
-
var
|
|
14640
|
+
var import_react25 = require("react");
|
|
14480
14641
|
function useInboxState(orgId, actions) {
|
|
14481
|
-
const [conversations, setConversations] = (0,
|
|
14482
|
-
const [activeConversationId, setActiveConversationId] = (0,
|
|
14483
|
-
const [messages, setMessages] = (0,
|
|
14484
|
-
const [isLoading, setIsLoading] = (0,
|
|
14485
|
-
const [isSending, setIsSending] = (0,
|
|
14486
|
-
const [error, setError] = (0,
|
|
14487
|
-
const actionsRef = (0,
|
|
14488
|
-
(0,
|
|
14642
|
+
const [conversations, setConversations] = (0, import_react25.useState)([]);
|
|
14643
|
+
const [activeConversationId, setActiveConversationId] = (0, import_react25.useState)(null);
|
|
14644
|
+
const [messages, setMessages] = (0, import_react25.useState)([]);
|
|
14645
|
+
const [isLoading, setIsLoading] = (0, import_react25.useState)(false);
|
|
14646
|
+
const [isSending, setIsSending] = (0, import_react25.useState)(false);
|
|
14647
|
+
const [error, setError] = (0, import_react25.useState)(null);
|
|
14648
|
+
const actionsRef = (0, import_react25.useRef)(actions);
|
|
14649
|
+
(0, import_react25.useEffect)(() => {
|
|
14489
14650
|
actionsRef.current = actions;
|
|
14490
14651
|
});
|
|
14491
|
-
const fetchConversations = (0,
|
|
14652
|
+
const fetchConversations = (0, import_react25.useCallback)(async () => {
|
|
14492
14653
|
if (!orgId) return;
|
|
14493
14654
|
const res = await actionsRef.current.getConversations(orgId);
|
|
14494
14655
|
if (res.success && res.data) {
|
|
@@ -14497,7 +14658,7 @@ function useInboxState(orgId, actions) {
|
|
|
14497
14658
|
setError(res.error);
|
|
14498
14659
|
}
|
|
14499
14660
|
}, [orgId]);
|
|
14500
|
-
const fetchMessages = (0,
|
|
14661
|
+
const fetchMessages = (0, import_react25.useCallback)(async (conversationId, silent = false) => {
|
|
14501
14662
|
if (!silent) setIsLoading(true);
|
|
14502
14663
|
const res = await actionsRef.current.getMessages(conversationId);
|
|
14503
14664
|
if (res.success && res.data) {
|
|
@@ -14510,7 +14671,7 @@ function useInboxState(orgId, actions) {
|
|
|
14510
14671
|
}
|
|
14511
14672
|
if (!silent) setIsLoading(false);
|
|
14512
14673
|
}, []);
|
|
14513
|
-
(0,
|
|
14674
|
+
(0, import_react25.useEffect)(() => {
|
|
14514
14675
|
fetchConversations();
|
|
14515
14676
|
const interval = setInterval(() => {
|
|
14516
14677
|
fetchConversations();
|
|
@@ -14609,17 +14770,17 @@ function ConversationList({ conversations, activeId, onSelect }) {
|
|
|
14609
14770
|
}
|
|
14610
14771
|
|
|
14611
14772
|
// src/components/WhatsAppComponent/inbox/ChatWindow.tsx
|
|
14612
|
-
var
|
|
14773
|
+
var import_react26 = require("react");
|
|
14613
14774
|
var import_lucide_react16 = require("lucide-react");
|
|
14614
14775
|
var import_jsx_runtime25 = require("react/jsx-runtime");
|
|
14615
14776
|
function ChatWindow({ activeConversation, messages, isLoading, isSending, onSendMessage }) {
|
|
14616
|
-
const [inputText, setInputText] = (0,
|
|
14617
|
-
const messagesTopRef = (0,
|
|
14777
|
+
const [inputText, setInputText] = (0, import_react26.useState)("");
|
|
14778
|
+
const messagesTopRef = (0, import_react26.useRef)(null);
|
|
14618
14779
|
const scrollToTop = () => {
|
|
14619
14780
|
var _a;
|
|
14620
14781
|
(_a = messagesTopRef.current) == null ? void 0 : _a.scrollIntoView({ behavior: "smooth" });
|
|
14621
14782
|
};
|
|
14622
|
-
(0,
|
|
14783
|
+
(0, import_react26.useEffect)(() => {
|
|
14623
14784
|
scrollToTop();
|
|
14624
14785
|
}, [messages.length, activeConversation == null ? void 0 : activeConversation.id]);
|
|
14625
14786
|
const handleSend = (e) => {
|
|
@@ -14735,7 +14896,7 @@ function WhatsAppComponent(props) {
|
|
|
14735
14896
|
var _a;
|
|
14736
14897
|
const { className = "", settings, orgId, componentId, executeAction } = props;
|
|
14737
14898
|
const state = useWhatsAppState(props);
|
|
14738
|
-
const [activeTab, setActiveTab] =
|
|
14899
|
+
const [activeTab, setActiveTab] = import_react27.default.useState("broadcast");
|
|
14739
14900
|
return /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(
|
|
14740
14901
|
"div",
|
|
14741
14902
|
{
|
|
@@ -15140,18 +15301,18 @@ function WhatsAppComponent(props) {
|
|
|
15140
15301
|
}
|
|
15141
15302
|
|
|
15142
15303
|
// src/components/FormBlock/FormBlock.tsx
|
|
15143
|
-
var
|
|
15304
|
+
var import_react28 = require("react");
|
|
15144
15305
|
var import_lucide_react18 = require("lucide-react");
|
|
15145
15306
|
var import_jsx_runtime28 = require("react/jsx-runtime");
|
|
15146
15307
|
function FormBlock({ settings: schema, executeAction, componentId, className = "", onSuccess }) {
|
|
15147
15308
|
const { showError, addToast } = useToast();
|
|
15148
|
-
const [formData, setFormData] = (0,
|
|
15149
|
-
const [isSubmitting, setIsSubmitting] = (0,
|
|
15150
|
-
const [isSubmitted, setIsSubmitted] = (0,
|
|
15151
|
-
const [columns, setColumns] = (0,
|
|
15152
|
-
const [isLoadingSchema, setIsLoadingSchema] = (0,
|
|
15309
|
+
const [formData, setFormData] = (0, import_react28.useState)({});
|
|
15310
|
+
const [isSubmitting, setIsSubmitting] = (0, import_react28.useState)(false);
|
|
15311
|
+
const [isSubmitted, setIsSubmitted] = (0, import_react28.useState)(false);
|
|
15312
|
+
const [columns, setColumns] = (0, import_react28.useState)((schema == null ? void 0 : schema.columns) || []);
|
|
15313
|
+
const [isLoadingSchema, setIsLoadingSchema] = (0, import_react28.useState)(false);
|
|
15153
15314
|
const targetTableId = (schema == null ? void 0 : schema.tableMetaId) || (schema == null ? void 0 : schema.tableId) || (schema == null ? void 0 : schema.id);
|
|
15154
|
-
(0,
|
|
15315
|
+
(0, import_react28.useEffect)(() => {
|
|
15155
15316
|
let isMounted = true;
|
|
15156
15317
|
if ((!(schema == null ? void 0 : schema.columns) || schema.columns.length === 0) && targetTableId && executeAction) {
|
|
15157
15318
|
setIsLoadingSchema(true);
|
|
@@ -15317,6 +15478,7 @@ var UNIVERSE_COMPONENTS = {
|
|
|
15317
15478
|
COLUMN_TYPE_LABELS,
|
|
15318
15479
|
ColumnHeaderTitle,
|
|
15319
15480
|
CreateTemplateModal,
|
|
15481
|
+
DEFAULT_FILTER_COLUMN_TYPES,
|
|
15320
15482
|
DEFAULT_PLACEMENT_STATUS_COLORS,
|
|
15321
15483
|
DatePickerCell,
|
|
15322
15484
|
DynamicFiltersBlock,
|
|
@@ -15331,6 +15493,7 @@ var UNIVERSE_COMPONENTS = {
|
|
|
15331
15493
|
RELATION_BUTTON_COUNTS_ACTION,
|
|
15332
15494
|
RELATION_LABEL_KEY,
|
|
15333
15495
|
RELATION_SEP,
|
|
15496
|
+
RESOLVE_DEFAULT_FILTERS_ACTION,
|
|
15334
15497
|
RelationFilterPopover,
|
|
15335
15498
|
RelationPickerCell,
|
|
15336
15499
|
SettingsAndActionsBlock,
|
|
@@ -15351,6 +15514,7 @@ var UNIVERSE_COMPONENTS = {
|
|
|
15351
15514
|
buildRelationRef,
|
|
15352
15515
|
calculateMinColumnWidth,
|
|
15353
15516
|
checkElementTruncation,
|
|
15517
|
+
cleanPlacementFilterDefaults,
|
|
15354
15518
|
cn,
|
|
15355
15519
|
columnRefLabel,
|
|
15356
15520
|
computeFormulaValue,
|
|
@@ -15366,6 +15530,8 @@ var UNIVERSE_COMPONENTS = {
|
|
|
15366
15530
|
formatTimeInput,
|
|
15367
15531
|
formatTimeIso,
|
|
15368
15532
|
generateWhatsAppLink,
|
|
15533
|
+
getColumnDefaultFilter,
|
|
15534
|
+
getDefaultFilterColumns,
|
|
15369
15535
|
getDeterministicPastelBadge,
|
|
15370
15536
|
getEligibleCopyTargets,
|
|
15371
15537
|
getNextVariableIndex,
|
|
@@ -15401,11 +15567,14 @@ var UNIVERSE_COMPONENTS = {
|
|
|
15401
15567
|
renameCopyTarget,
|
|
15402
15568
|
resolveDefaultStatusId,
|
|
15403
15569
|
resolveProtocol,
|
|
15570
|
+
sanitizeDefaultFilter,
|
|
15404
15571
|
sanitizePhoneNumber,
|
|
15405
15572
|
sanitizeTemplateNameInput,
|
|
15406
15573
|
seamlessVariableEngine,
|
|
15407
15574
|
splitHeaderTitle,
|
|
15575
|
+
supportsDefaultFilter,
|
|
15408
15576
|
tableColumns,
|
|
15577
|
+
toColumnFilterValue,
|
|
15409
15578
|
useColumnReorder,
|
|
15410
15579
|
useColumnResize,
|
|
15411
15580
|
useSmartTooltip,
|
|
@@ -15417,5 +15586,6 @@ var UNIVERSE_COMPONENTS = {
|
|
|
15417
15586
|
validateTemplateBody,
|
|
15418
15587
|
validateTemplateButtons,
|
|
15419
15588
|
validateWhatsAppTemplate,
|
|
15420
|
-
validateWordToVariableRatio
|
|
15589
|
+
validateWordToVariableRatio,
|
|
15590
|
+
withDefaultFilter
|
|
15421
15591
|
});
|