@universe-platform/ui 0.1.0-beta.34 → 0.1.0-beta.36
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 +497 -315
- package/dist/index.mjs +368 -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");
|
|
@@ -3359,6 +3417,18 @@ function RelationPickerCell({
|
|
|
3359
3417
|
_displayLabel: resolveRelationLabel(opt, column) || opt.label || "",
|
|
3360
3418
|
data: opt.data
|
|
3361
3419
|
})).filter((opt) => opt._displayLabel && opt._displayLabel.trim() !== "" && !isRawObjectId(opt._displayLabel));
|
|
3420
|
+
if (mapped.some((o) => {
|
|
3421
|
+
var _a2;
|
|
3422
|
+
return typeof ((_a2 = o.data) == null ? void 0 : _a2._order) === "number";
|
|
3423
|
+
})) {
|
|
3424
|
+
mapped.sort((a, b) => {
|
|
3425
|
+
var _a2, _b2;
|
|
3426
|
+
const oa = typeof ((_a2 = a.data) == null ? void 0 : _a2._order) === "number" ? a.data._order : Number.POSITIVE_INFINITY;
|
|
3427
|
+
const ob = typeof ((_b2 = b.data) == null ? void 0 : _b2._order) === "number" ? b.data._order : Number.POSITIVE_INFINITY;
|
|
3428
|
+
return oa === ob ? 0 : oa - ob;
|
|
3429
|
+
});
|
|
3430
|
+
return mapped;
|
|
3431
|
+
}
|
|
3362
3432
|
const orderField = mapped.some((o) => {
|
|
3363
3433
|
var _a2;
|
|
3364
3434
|
return ((_a2 = o.data) == null ? void 0 : _a2["\u05DE\u05E1\u05E4\u05E8 \u05E9\u05E0\u05D4"]) !== void 0;
|
|
@@ -6245,6 +6315,49 @@ function RelationButtonsBar({
|
|
|
6245
6315
|
);
|
|
6246
6316
|
}
|
|
6247
6317
|
|
|
6318
|
+
// src/components/TableBlock/useDefaultColumnFilters.ts
|
|
6319
|
+
var import_react17 = require("react");
|
|
6320
|
+
var RESOLVE_TIMEOUT_MS = 8e3;
|
|
6321
|
+
function unwrap2(res) {
|
|
6322
|
+
const body = (res == null ? void 0 : res.data) && typeof res.data === "object" && !Array.isArray(res.data) ? res.data : res;
|
|
6323
|
+
const filters = body == null ? void 0 : body.filters;
|
|
6324
|
+
return filters && typeof filters === "object" ? filters : {};
|
|
6325
|
+
}
|
|
6326
|
+
function useDefaultColumnFilters({ columns, tableId, executeAction, onResolved }) {
|
|
6327
|
+
const hasDefaults = getDefaultFilterColumns(columns).length > 0;
|
|
6328
|
+
const [ready, setReady] = (0, import_react17.useState)(() => !hasDefaults);
|
|
6329
|
+
const doneRef = (0, import_react17.useRef)(false);
|
|
6330
|
+
const onResolvedRef = (0, import_react17.useRef)(onResolved);
|
|
6331
|
+
onResolvedRef.current = onResolved;
|
|
6332
|
+
const actionRef = (0, import_react17.useRef)(executeAction);
|
|
6333
|
+
actionRef.current = executeAction;
|
|
6334
|
+
(0, import_react17.useEffect)(() => {
|
|
6335
|
+
if (doneRef.current || !hasDefaults) return;
|
|
6336
|
+
doneRef.current = true;
|
|
6337
|
+
const exec = actionRef.current;
|
|
6338
|
+
if (!tableId || !exec) {
|
|
6339
|
+
setReady(true);
|
|
6340
|
+
return;
|
|
6341
|
+
}
|
|
6342
|
+
let settled = false;
|
|
6343
|
+
const finish = (filters) => {
|
|
6344
|
+
if (settled) return;
|
|
6345
|
+
settled = true;
|
|
6346
|
+
if (filters && Object.keys(filters).length > 0) onResolvedRef.current(filters);
|
|
6347
|
+
setReady(true);
|
|
6348
|
+
};
|
|
6349
|
+
const timer = setTimeout(() => finish(), RESOLVE_TIMEOUT_MS);
|
|
6350
|
+
Promise.resolve(exec(RESOLVE_DEFAULT_FILTERS_ACTION, { tableId })).then(
|
|
6351
|
+
(res) => finish(unwrap2(res)),
|
|
6352
|
+
(err) => {
|
|
6353
|
+
console.warn("[TableBlock] Failed to resolve default filters:", err);
|
|
6354
|
+
finish();
|
|
6355
|
+
}
|
|
6356
|
+
).finally(() => clearTimeout(timer));
|
|
6357
|
+
}, [hasDefaults, tableId]);
|
|
6358
|
+
return ready;
|
|
6359
|
+
}
|
|
6360
|
+
|
|
6248
6361
|
// src/components/TableBlock/TableBlockClient.tsx
|
|
6249
6362
|
var import_jsx_runtime15 = require("react/jsx-runtime");
|
|
6250
6363
|
function TableBlockClient({
|
|
@@ -6273,7 +6386,7 @@ function TableBlockClient({
|
|
|
6273
6386
|
hideRelationButtons
|
|
6274
6387
|
}) {
|
|
6275
6388
|
const { showError, addToast } = useToast();
|
|
6276
|
-
const [isExporting, setIsExporting] = (0,
|
|
6389
|
+
const [isExporting, setIsExporting] = (0, import_react18.useState)(false);
|
|
6277
6390
|
const resolvedRole = role ? getRolePermissions(role) : void 0;
|
|
6278
6391
|
const effectivePermissions = permissions || (resolvedRole == null ? void 0 : resolvedRole.permissions) || {
|
|
6279
6392
|
canCreate: !readOnly,
|
|
@@ -6292,18 +6405,18 @@ function TableBlockClient({
|
|
|
6292
6405
|
return calculateMinColumnWidth(colName, false, col == null ? void 0 : col.type);
|
|
6293
6406
|
}
|
|
6294
6407
|
});
|
|
6295
|
-
const executeActionRef = (0,
|
|
6296
|
-
(0,
|
|
6408
|
+
const executeActionRef = (0, import_react18.useRef)(executeAction);
|
|
6409
|
+
(0, import_react18.useEffect)(() => {
|
|
6297
6410
|
executeActionRef.current = executeAction;
|
|
6298
6411
|
}, [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,
|
|
6412
|
+
const [isMounted, setIsMounted] = (0, import_react18.useState)(false);
|
|
6413
|
+
const [isInitialLoading, setIsInitialLoading] = (0, import_react18.useState)(true);
|
|
6414
|
+
const [page, setPage] = (0, import_react18.useState)(1);
|
|
6415
|
+
const [limit, setLimit] = (0, import_react18.useState)(50);
|
|
6416
|
+
const [totalRecords, setTotalRecords] = (0, import_react18.useState)(0);
|
|
6417
|
+
const [totalPages, setTotalPages] = (0, import_react18.useState)(1);
|
|
6418
|
+
const [showSummary, setShowSummary] = (0, import_react18.useState)(false);
|
|
6419
|
+
(0, import_react18.useEffect)(() => {
|
|
6307
6420
|
if (typeof window !== "undefined") {
|
|
6308
6421
|
const savedSummary = localStorage.getItem(`table_summary_${tableKey}`);
|
|
6309
6422
|
if (savedSummary !== null) {
|
|
@@ -6352,7 +6465,7 @@ function TableBlockClient({
|
|
|
6352
6465
|
return __spreadProps(__spreadValues({}, row), { id: String(row.id || ""), data: rowData });
|
|
6353
6466
|
});
|
|
6354
6467
|
};
|
|
6355
|
-
const mergeColumnDefs = (0,
|
|
6468
|
+
const mergeColumnDefs = (0, import_react18.useCallback)((existingCols, incomingCols) => {
|
|
6356
6469
|
if (!incomingCols || incomingCols.length === 0) return existingCols || [];
|
|
6357
6470
|
if (!existingCols || existingCols.length === 0) return incomingCols;
|
|
6358
6471
|
const existingMap = new Map(existingCols.map((c) => [c.name, c]));
|
|
@@ -6372,18 +6485,18 @@ function TableBlockClient({
|
|
|
6372
6485
|
return ((_a = a.order) != null ? _a : 0) - ((_b = b.order) != null ? _b : 0);
|
|
6373
6486
|
});
|
|
6374
6487
|
}, []);
|
|
6375
|
-
const [localColumns, setLocalColumns] = (0,
|
|
6376
|
-
(0,
|
|
6488
|
+
const [localColumns, setLocalColumns] = (0, import_react18.useState)(() => (schema == null ? void 0 : schema.columns) || []);
|
|
6489
|
+
(0, import_react18.useEffect)(() => {
|
|
6377
6490
|
if ((schema == null ? void 0 : schema.columns) && schema.columns.length > 0) {
|
|
6378
6491
|
setLocalColumns((prev) => mergeColumnDefs(prev, schema.columns));
|
|
6379
6492
|
}
|
|
6380
6493
|
}, [schema == null ? void 0 : schema.columns, mergeColumnDefs]);
|
|
6381
|
-
const [dirty, setDirty] = (0,
|
|
6382
|
-
const dirtyRef = (0,
|
|
6383
|
-
(0,
|
|
6494
|
+
const [dirty, setDirty] = (0, import_react18.useState)({ added: [], modified: {}, deleted: [] });
|
|
6495
|
+
const dirtyRef = (0, import_react18.useRef)(dirty);
|
|
6496
|
+
(0, import_react18.useEffect)(() => {
|
|
6384
6497
|
dirtyRef.current = dirty;
|
|
6385
6498
|
}, [dirty]);
|
|
6386
|
-
const mergeWithDirty = (0,
|
|
6499
|
+
const mergeWithDirty = (0, import_react18.useCallback)((baseRecords) => {
|
|
6387
6500
|
const { added, modified, deleted } = dirtyRef.current;
|
|
6388
6501
|
const nonDeleted = (baseRecords || []).filter((r) => !deleted.includes(r.id));
|
|
6389
6502
|
const modifiedRecords = nonDeleted.map((r) => {
|
|
@@ -6396,8 +6509,8 @@ function TableBlockClient({
|
|
|
6396
6509
|
const uniqueAdded = added.filter((r) => !baseIds.has(r.id));
|
|
6397
6510
|
return [...uniqueAdded, ...modifiedRecords];
|
|
6398
6511
|
}, []);
|
|
6399
|
-
const [data, setData] = (0,
|
|
6400
|
-
const [serverRecords, setServerRecords] = (0,
|
|
6512
|
+
const [data, setData] = (0, import_react18.useState)(() => normalizeRecords(initialRecords));
|
|
6513
|
+
const [serverRecords, setServerRecords] = (0, import_react18.useState)(() => normalizeRecords(initialRecords));
|
|
6401
6514
|
const filteredData = data;
|
|
6402
6515
|
const isEqualValues = (a, b) => {
|
|
6403
6516
|
if (a === b) return true;
|
|
@@ -6409,30 +6522,30 @@ function TableBlockClient({
|
|
|
6409
6522
|
}
|
|
6410
6523
|
return false;
|
|
6411
6524
|
};
|
|
6412
|
-
const [baseRecordsMap, setBaseRecordsMap] = (0,
|
|
6525
|
+
const [baseRecordsMap, setBaseRecordsMap] = (0, import_react18.useState)(() => {
|
|
6413
6526
|
const map = /* @__PURE__ */ new Map();
|
|
6414
6527
|
(normalizeRecords(initialRecords) || []).forEach((r) => map.set(r.id, __spreadValues({}, r.data)));
|
|
6415
6528
|
return map;
|
|
6416
6529
|
});
|
|
6417
|
-
(0,
|
|
6530
|
+
(0, import_react18.useEffect)(() => {
|
|
6418
6531
|
if (initialRecords && initialRecords.length > 0) {
|
|
6419
6532
|
const map = /* @__PURE__ */ new Map();
|
|
6420
6533
|
(normalizeRecords(initialRecords) || []).forEach((r) => map.set(r.id, __spreadValues({}, r.data)));
|
|
6421
6534
|
setBaseRecordsMap(map);
|
|
6422
6535
|
}
|
|
6423
6536
|
}, [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,
|
|
6537
|
+
const [searchQuery, setSearchQuery] = (0, import_react18.useState)("");
|
|
6538
|
+
const [columnFilters, setColumnFilters] = (0, import_react18.useState)({});
|
|
6539
|
+
const [activeSearchCol, setActiveSearchCol] = (0, import_react18.useState)(null);
|
|
6540
|
+
const activeSearchRef = (0, import_react18.useRef)(null);
|
|
6541
|
+
const [activeRelationCol, setActiveRelationCol] = (0, import_react18.useState)(null);
|
|
6542
|
+
const [relationTriggerRect, setRelationTriggerRect] = (0, import_react18.useState)(null);
|
|
6543
|
+
const filterButtonRefs = (0, import_react18.useRef)({});
|
|
6544
|
+
const [relationOptions, setRelationOptions] = (0, import_react18.useState)({});
|
|
6545
|
+
const [relationFilterOptions, setRelationFilterOptions] = (0, import_react18.useState)({});
|
|
6546
|
+
const [loadingFilterCol, setLoadingFilterCol] = (0, import_react18.useState)(null);
|
|
6547
|
+
const relationDictionaryRef = (0, import_react18.useRef)({});
|
|
6548
|
+
const mergeRelationOptions = (0, import_react18.useCallback)((colName, newOptions) => {
|
|
6436
6549
|
if (!Array.isArray(newOptions) || newOptions.length === 0) return;
|
|
6437
6550
|
if (!relationDictionaryRef.current[colName]) {
|
|
6438
6551
|
relationDictionaryRef.current[colName] = /* @__PURE__ */ new Map();
|
|
@@ -6455,7 +6568,7 @@ function TableBlockClient({
|
|
|
6455
6568
|
}));
|
|
6456
6569
|
}
|
|
6457
6570
|
}, []);
|
|
6458
|
-
(0,
|
|
6571
|
+
(0, import_react18.useEffect)(() => {
|
|
6459
6572
|
if (!activeSearchCol) return;
|
|
6460
6573
|
const handleMouseDown = (e) => {
|
|
6461
6574
|
if (activeSearchRef.current && !activeSearchRef.current.contains(e.target)) {
|
|
@@ -6467,7 +6580,7 @@ function TableBlockClient({
|
|
|
6467
6580
|
document.removeEventListener("mousedown", handleMouseDown);
|
|
6468
6581
|
};
|
|
6469
6582
|
}, [activeSearchCol]);
|
|
6470
|
-
const filtersKey = (0,
|
|
6583
|
+
const filtersKey = (0, import_react18.useMemo)(() => {
|
|
6471
6584
|
const active = {};
|
|
6472
6585
|
Object.entries(columnFilters).forEach(([k, v]) => {
|
|
6473
6586
|
if (Array.isArray(v) && v.length > 0) active[k] = v;
|
|
@@ -6476,24 +6589,30 @@ function TableBlockClient({
|
|
|
6476
6589
|
});
|
|
6477
6590
|
return JSON.stringify(active);
|
|
6478
6591
|
}, [columnFilters]);
|
|
6479
|
-
const
|
|
6480
|
-
|
|
6592
|
+
const defaultFiltersReady = useDefaultColumnFilters({
|
|
6593
|
+
columns: localColumns,
|
|
6594
|
+
tableId: (schema == null ? void 0 : schema.tableMetaId) || (schema == null ? void 0 : schema.tableId) || (schema == null ? void 0 : schema.id),
|
|
6595
|
+
executeAction,
|
|
6596
|
+
onResolved: (resolved) => setColumnFilters((prev) => __spreadValues(__spreadValues({}, resolved), prev))
|
|
6597
|
+
});
|
|
6598
|
+
const [debouncedSearch, setDebouncedSearch] = (0, import_react18.useState)(searchQuery);
|
|
6599
|
+
(0, import_react18.useEffect)(() => {
|
|
6481
6600
|
const timer = setTimeout(() => {
|
|
6482
6601
|
setDebouncedSearch(searchQuery.trim());
|
|
6483
6602
|
}, 300);
|
|
6484
6603
|
return () => clearTimeout(timer);
|
|
6485
6604
|
}, [searchQuery]);
|
|
6486
|
-
const isSearchMountedRef = (0,
|
|
6487
|
-
(0,
|
|
6605
|
+
const isSearchMountedRef = (0, import_react18.useRef)(false);
|
|
6606
|
+
(0, import_react18.useEffect)(() => {
|
|
6488
6607
|
if (!isSearchMountedRef.current) {
|
|
6489
6608
|
isSearchMountedRef.current = true;
|
|
6490
6609
|
return;
|
|
6491
6610
|
}
|
|
6492
6611
|
setPage(1);
|
|
6493
6612
|
}, [debouncedSearch]);
|
|
6494
|
-
const [isFetching, setIsFetching] = (0,
|
|
6495
|
-
const fetchRequestIdRef = (0,
|
|
6496
|
-
const fetchTableData = (0,
|
|
6613
|
+
const [isFetching, setIsFetching] = (0, import_react18.useState)(false);
|
|
6614
|
+
const fetchRequestIdRef = (0, import_react18.useRef)(0);
|
|
6615
|
+
const fetchTableData = (0, import_react18.useCallback)((targetPage, targetLimit, targetSearch, targetFiltersKey) => {
|
|
6497
6616
|
const tableId = (schema == null ? void 0 : schema.tableMetaId) || (schema == null ? void 0 : schema.tableId) || (schema == null ? void 0 : schema.id);
|
|
6498
6617
|
const action = executeActionRef.current;
|
|
6499
6618
|
if (!tableId || !action) {
|
|
@@ -6617,11 +6736,12 @@ function TableBlockClient({
|
|
|
6617
6736
|
}
|
|
6618
6737
|
});
|
|
6619
6738
|
}, [schema == null ? void 0 : schema.tableMetaId, schema == null ? void 0 : schema.tableId, schema == null ? void 0 : schema.id, mergeColumnDefs, mergeWithDirty, mergeRelationOptions]);
|
|
6620
|
-
(0,
|
|
6739
|
+
(0, import_react18.useEffect)(() => {
|
|
6740
|
+
if (!defaultFiltersReady) return;
|
|
6621
6741
|
fetchTableData(page, limit, debouncedSearch, filtersKey);
|
|
6622
|
-
}, [page, limit, debouncedSearch, filtersKey, fetchTableData]);
|
|
6623
|
-
(0,
|
|
6624
|
-
if (initialRecords) {
|
|
6742
|
+
}, [page, limit, debouncedSearch, filtersKey, fetchTableData, defaultFiltersReady]);
|
|
6743
|
+
(0, import_react18.useEffect)(() => {
|
|
6744
|
+
if (initialRecords && defaultFiltersReady) {
|
|
6625
6745
|
const norm = normalizeRecords(initialRecords);
|
|
6626
6746
|
setServerRecords(norm);
|
|
6627
6747
|
const hasActiveFilters = Boolean(debouncedSearch) || Object.keys(columnFilters).length > 0;
|
|
@@ -6682,11 +6802,11 @@ function TableBlockClient({
|
|
|
6682
6802
|
setData(mergeWithDirty(norm));
|
|
6683
6803
|
}
|
|
6684
6804
|
}
|
|
6685
|
-
}, [initialRecords, mergeWithDirty, debouncedSearch, columnFilters, fetchTableData, page, limit, filtersKey]);
|
|
6686
|
-
const refetchTableData = (0,
|
|
6805
|
+
}, [initialRecords, mergeWithDirty, debouncedSearch, columnFilters, fetchTableData, page, limit, filtersKey, defaultFiltersReady]);
|
|
6806
|
+
const refetchTableData = (0, import_react18.useCallback)(() => {
|
|
6687
6807
|
return fetchTableData(page, limit, debouncedSearch, filtersKey);
|
|
6688
6808
|
}, [page, limit, debouncedSearch, filtersKey, fetchTableData]);
|
|
6689
|
-
const handleApplyColumnFilter = (0,
|
|
6809
|
+
const handleApplyColumnFilter = (0, import_react18.useCallback)((colName, nextVal) => {
|
|
6690
6810
|
setColumnFilters((prev) => {
|
|
6691
6811
|
const next = __spreadValues({}, prev);
|
|
6692
6812
|
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 +6831,9 @@ function TableBlockClient({
|
|
|
6711
6831
|
const handleNextPage = () => {
|
|
6712
6832
|
setPage((prev) => Math.min(totalPages, prev + 1));
|
|
6713
6833
|
};
|
|
6714
|
-
const [selectedIds, setSelectedIds] = (0,
|
|
6715
|
-
const isExternalSyncRef = (0,
|
|
6716
|
-
(0,
|
|
6834
|
+
const [selectedIds, setSelectedIds] = (0, import_react18.useState)(/* @__PURE__ */ new Set());
|
|
6835
|
+
const isExternalSyncRef = (0, import_react18.useRef)(false);
|
|
6836
|
+
(0, import_react18.useEffect)(() => {
|
|
6717
6837
|
if (selectedRowIds !== void 0) {
|
|
6718
6838
|
const nextSet = new Set(selectedRowIds);
|
|
6719
6839
|
setSelectedIds((prev) => {
|
|
@@ -6725,8 +6845,8 @@ function TableBlockClient({
|
|
|
6725
6845
|
});
|
|
6726
6846
|
}
|
|
6727
6847
|
}, [selectedRowIds]);
|
|
6728
|
-
const isFirstSelectionChangeRef = (0,
|
|
6729
|
-
(0,
|
|
6848
|
+
const isFirstSelectionChangeRef = (0, import_react18.useRef)(true);
|
|
6849
|
+
(0, import_react18.useEffect)(() => {
|
|
6730
6850
|
if (isFirstSelectionChangeRef.current) {
|
|
6731
6851
|
isFirstSelectionChangeRef.current = false;
|
|
6732
6852
|
if (selectedIds.size === 0) return;
|
|
@@ -6737,13 +6857,13 @@ function TableBlockClient({
|
|
|
6737
6857
|
}
|
|
6738
6858
|
onSelectionChange == null ? void 0 : onSelectionChange(Array.from(selectedIds));
|
|
6739
6859
|
}, [selectedIds, onSelectionChange]);
|
|
6740
|
-
const [pendingDeletions, setPendingDeletions] = (0,
|
|
6741
|
-
const [isSaving, setIsSaving] = (0,
|
|
6860
|
+
const [pendingDeletions, setPendingDeletions] = (0, import_react18.useState)([]);
|
|
6861
|
+
const [isSaving, setIsSaving] = (0, import_react18.useState)(false);
|
|
6742
6862
|
const isUpdatingActive = Boolean(isUpdating || isSaving);
|
|
6743
|
-
const [isSaveSuccess, setIsSaveSuccess] = (0,
|
|
6744
|
-
const [expandedRowIds, setExpandedRowIds] = (0,
|
|
6745
|
-
const schemaColsString = (0,
|
|
6746
|
-
const refetchRelation = (0,
|
|
6863
|
+
const [isSaveSuccess, setIsSaveSuccess] = (0, import_react18.useState)(false);
|
|
6864
|
+
const [expandedRowIds, setExpandedRowIds] = (0, import_react18.useState)(/* @__PURE__ */ new Set());
|
|
6865
|
+
const schemaColsString = (0, import_react18.useMemo)(() => JSON.stringify(localColumns || []), [localColumns]);
|
|
6866
|
+
const refetchRelation = (0, import_react18.useCallback)(async (colName, params) => {
|
|
6747
6867
|
var _a, _b, _c, _d, _e, _f, _g;
|
|
6748
6868
|
let parsedCols = [];
|
|
6749
6869
|
try {
|
|
@@ -6782,7 +6902,7 @@ function TableBlockClient({
|
|
|
6782
6902
|
}
|
|
6783
6903
|
return [];
|
|
6784
6904
|
}, [schemaColsString, executeAction, mergeRelationOptions]);
|
|
6785
|
-
const fetchRelationFilterOptions = (0,
|
|
6905
|
+
const fetchRelationFilterOptions = (0, import_react18.useCallback)(async (colName) => {
|
|
6786
6906
|
var _a;
|
|
6787
6907
|
let parsedCols = [];
|
|
6788
6908
|
try {
|
|
@@ -6818,8 +6938,8 @@ function TableBlockClient({
|
|
|
6818
6938
|
setLoadingFilterCol(null);
|
|
6819
6939
|
}
|
|
6820
6940
|
}, [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,
|
|
6941
|
+
const requestedRelationIdsRef = (0, import_react18.useRef)({});
|
|
6942
|
+
(0, import_react18.useEffect)(() => {
|
|
6823
6943
|
if (!executeAction || !data || data.length === 0) return;
|
|
6824
6944
|
let parsedCols = [];
|
|
6825
6945
|
try {
|
|
@@ -6872,7 +6992,7 @@ function TableBlockClient({
|
|
|
6872
6992
|
}
|
|
6873
6993
|
});
|
|
6874
6994
|
}, [data, schemaColsString, executeAction, relationOptions, mergeRelationOptions]);
|
|
6875
|
-
(0,
|
|
6995
|
+
(0, import_react18.useEffect)(() => {
|
|
6876
6996
|
let parsedCols = [];
|
|
6877
6997
|
try {
|
|
6878
6998
|
parsedCols = JSON.parse(schemaColsString);
|
|
@@ -6886,7 +7006,7 @@ function TableBlockClient({
|
|
|
6886
7006
|
refetchRelation(col.name);
|
|
6887
7007
|
});
|
|
6888
7008
|
}, [schemaColsString, refetchRelation]);
|
|
6889
|
-
const normalizedColumns = (0,
|
|
7009
|
+
const normalizedColumns = (0, import_react18.useMemo)(() => {
|
|
6890
7010
|
return (localColumns || []).map((col, idx) => {
|
|
6891
7011
|
const isRequired = col.isRequired === true || String(col.isRequired) === "true";
|
|
6892
7012
|
const isUnique = col.isUnique === true || String(col.isUnique) === "true";
|
|
@@ -6900,17 +7020,17 @@ function TableBlockClient({
|
|
|
6900
7020
|
return ((_a = a.order) != null ? _a : 0) - ((_b = b.order) != null ? _b : 0);
|
|
6901
7021
|
});
|
|
6902
7022
|
}, [localColumns]);
|
|
6903
|
-
const filteredColumns = (0,
|
|
7023
|
+
const filteredColumns = (0, import_react18.useMemo)(() => {
|
|
6904
7024
|
const systemFields = ["_id", "createdAt", "updatedAt", "orgId", "tableId"];
|
|
6905
7025
|
return normalizedColumns.filter((col) => !systemFields.includes(col.name) && !col.isHidden);
|
|
6906
7026
|
}, [normalizedColumns]);
|
|
6907
|
-
const customizableColumns = (0,
|
|
7027
|
+
const customizableColumns = (0, import_react18.useMemo)(() => {
|
|
6908
7028
|
const systemFields = ["_id", "createdAt", "updatedAt", "orgId", "tableId"];
|
|
6909
7029
|
return normalizedColumns.filter((col) => !systemFields.includes(col.name));
|
|
6910
7030
|
}, [normalizedColumns]);
|
|
6911
|
-
const [isColumnsDropdownOpen, setIsColumnsDropdownOpen] = (0,
|
|
6912
|
-
const dropdownRef = (0,
|
|
6913
|
-
(0,
|
|
7031
|
+
const [isColumnsDropdownOpen, setIsColumnsDropdownOpen] = (0, import_react18.useState)(false);
|
|
7032
|
+
const dropdownRef = (0, import_react18.useRef)(null);
|
|
7033
|
+
(0, import_react18.useEffect)(() => {
|
|
6914
7034
|
const handleClickOutside = (e) => {
|
|
6915
7035
|
if (dropdownRef.current && !dropdownRef.current.contains(e.target)) {
|
|
6916
7036
|
setIsColumnsDropdownOpen(false);
|
|
@@ -7120,7 +7240,7 @@ function TableBlockClient({
|
|
|
7120
7240
|
setData((prev) => [newRow, ...prev]);
|
|
7121
7241
|
setDirty((prev) => __spreadProps(__spreadValues({}, prev), { added: [newRow, ...prev.added] }));
|
|
7122
7242
|
};
|
|
7123
|
-
const handleCellChange = (0,
|
|
7243
|
+
const handleCellChange = (0, import_react18.useCallback)((rowId, colName, value) => {
|
|
7124
7244
|
setData((prev) => prev.map(
|
|
7125
7245
|
(row) => row.id === rowId ? __spreadProps(__spreadValues({}, row), { data: __spreadProps(__spreadValues({}, row.data), { [colName]: value }) }) : row
|
|
7126
7246
|
));
|
|
@@ -7153,13 +7273,13 @@ function TableBlockClient({
|
|
|
7153
7273
|
});
|
|
7154
7274
|
}, [baseRecordsMap]);
|
|
7155
7275
|
const handleCellChangeWithCopy = useRelationCopyHandler({ columns: localColumns, handleCellChange });
|
|
7156
|
-
const triggerSaveSuccess = (0,
|
|
7276
|
+
const triggerSaveSuccess = (0, import_react18.useCallback)(() => {
|
|
7157
7277
|
setIsSaveSuccess(true);
|
|
7158
7278
|
setTimeout(() => {
|
|
7159
7279
|
setIsSaveSuccess(false);
|
|
7160
7280
|
}, 2500);
|
|
7161
7281
|
}, []);
|
|
7162
|
-
const handleQuietCellChange = (0,
|
|
7282
|
+
const handleQuietCellChange = (0, import_react18.useCallback)((rowId, colName, value) => {
|
|
7163
7283
|
setData((prev) => prev.map(
|
|
7164
7284
|
(row) => row.id === rowId ? __spreadProps(__spreadValues({}, row), { data: __spreadProps(__spreadValues({}, row.data), { [colName]: value }) }) : row
|
|
7165
7285
|
));
|
|
@@ -7183,12 +7303,12 @@ function TableBlockClient({
|
|
|
7183
7303
|
});
|
|
7184
7304
|
}
|
|
7185
7305
|
}, []);
|
|
7186
|
-
const toggleSelectAll = (0,
|
|
7306
|
+
const toggleSelectAll = (0, import_react18.useCallback)((checked) => {
|
|
7187
7307
|
onRowToggle == null ? void 0 : onRowToggle("ALL", checked);
|
|
7188
7308
|
const next = checked ? new Set(filteredData.map((r) => r.id)) : /* @__PURE__ */ new Set();
|
|
7189
7309
|
setSelectedIds(next);
|
|
7190
7310
|
}, [filteredData, onRowToggle]);
|
|
7191
|
-
const toggleSelectRow = (0,
|
|
7311
|
+
const toggleSelectRow = (0, import_react18.useCallback)((rowId, checked) => {
|
|
7192
7312
|
onRowToggle == null ? void 0 : onRowToggle(rowId, checked);
|
|
7193
7313
|
setSelectedIds((prev) => {
|
|
7194
7314
|
const next = new Set(prev);
|
|
@@ -7197,7 +7317,7 @@ function TableBlockClient({
|
|
|
7197
7317
|
return next;
|
|
7198
7318
|
});
|
|
7199
7319
|
}, [onRowToggle]);
|
|
7200
|
-
const handleToggleExpand = (0,
|
|
7320
|
+
const handleToggleExpand = (0, import_react18.useCallback)((rowId) => {
|
|
7201
7321
|
setExpandedRowIds((prev) => {
|
|
7202
7322
|
const next = new Set(prev);
|
|
7203
7323
|
if (next.has(rowId)) next.delete(rowId);
|
|
@@ -7205,7 +7325,7 @@ function TableBlockClient({
|
|
|
7205
7325
|
return next;
|
|
7206
7326
|
});
|
|
7207
7327
|
}, []);
|
|
7208
|
-
const handleMarkForDeletion = (0,
|
|
7328
|
+
const handleMarkForDeletion = (0, import_react18.useCallback)((fileId) => {
|
|
7209
7329
|
setPendingDeletions((prev) => [...prev, fileId]);
|
|
7210
7330
|
}, []);
|
|
7211
7331
|
const handleDeleteSelected = () => {
|
|
@@ -7433,7 +7553,7 @@ function TableBlockClient({
|
|
|
7433
7553
|
setIsSaving(false);
|
|
7434
7554
|
}
|
|
7435
7555
|
};
|
|
7436
|
-
const getRowRelationLabels = (0,
|
|
7556
|
+
const getRowRelationLabels = (0, import_react18.useCallback)((rowVal, col) => {
|
|
7437
7557
|
const ids = normalizeRelationValue(rowVal);
|
|
7438
7558
|
if (ids.length === 0) return [];
|
|
7439
7559
|
const options = relationOptions[col.name] || [];
|
|
@@ -7452,7 +7572,7 @@ function TableBlockClient({
|
|
|
7452
7572
|
return "";
|
|
7453
7573
|
}).filter(Boolean);
|
|
7454
7574
|
}, [relationOptions]);
|
|
7455
|
-
const getUniqueRelationOptions = (0,
|
|
7575
|
+
const getUniqueRelationOptions = (0, import_react18.useCallback)((col) => {
|
|
7456
7576
|
if (relationFilterOptions[col.name]) {
|
|
7457
7577
|
return relationFilterOptions[col.name];
|
|
7458
7578
|
}
|
|
@@ -7484,7 +7604,7 @@ function TableBlockClient({
|
|
|
7484
7604
|
return results.sort((a, b) => a.label.localeCompare(b.label));
|
|
7485
7605
|
}, [data, relationOptions, relationFilterOptions]);
|
|
7486
7606
|
const errorMessage = error ? typeof error === "string" ? error : error.message || String(error) : null;
|
|
7487
|
-
const columnTotals = (0,
|
|
7607
|
+
const columnTotals = (0, import_react18.useMemo)(() => {
|
|
7488
7608
|
const totals = {};
|
|
7489
7609
|
if (!showSummary) return totals;
|
|
7490
7610
|
filteredColumns.forEach((col) => {
|
|
@@ -8173,7 +8293,7 @@ function ExpandedSubTables({
|
|
|
8173
8293
|
context
|
|
8174
8294
|
}) {
|
|
8175
8295
|
var _a;
|
|
8176
|
-
const [activeTab, setActiveTab] = (0,
|
|
8296
|
+
const [activeTab, setActiveTab] = (0, import_react18.useState)((_a = subTableColumns[0]) == null ? void 0 : _a.name);
|
|
8177
8297
|
if (subTableColumns.length === 0) return null;
|
|
8178
8298
|
if (subTableColumns.length === 1) {
|
|
8179
8299
|
const stCol = subTableColumns[0];
|
|
@@ -8214,7 +8334,7 @@ function ExpandedSubTables({
|
|
|
8214
8334
|
) })
|
|
8215
8335
|
] }) });
|
|
8216
8336
|
}
|
|
8217
|
-
var TableRow =
|
|
8337
|
+
var TableRow = import_react18.default.memo(function TableRow2({
|
|
8218
8338
|
row,
|
|
8219
8339
|
isSelected,
|
|
8220
8340
|
rowStatus,
|
|
@@ -8246,7 +8366,7 @@ var TableRow = import_react17.default.memo(function TableRow2({
|
|
|
8246
8366
|
permissions
|
|
8247
8367
|
}) {
|
|
8248
8368
|
const lockedCopyTargets = getRelationCopyLockedTargets(schema == null ? void 0 : schema.columns);
|
|
8249
|
-
return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
|
|
8369
|
+
return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_react18.default.Fragment, { children: [
|
|
8250
8370
|
/* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("tr", { className: `transition-colors group hover:bg-blue-50 ${isSelected ? "bg-blue-50" : ""}`, children: [
|
|
8251
8371
|
/* @__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
8372
|
rowStatus && (() => {
|
|
@@ -8402,13 +8522,13 @@ function TableBlock(props) {
|
|
|
8402
8522
|
}
|
|
8403
8523
|
|
|
8404
8524
|
// src/components/PlacementBlock/PlacementBlock.tsx
|
|
8405
|
-
var
|
|
8525
|
+
var import_react21 = require("react");
|
|
8406
8526
|
var import_ag_grid_react = require("ag-grid-react");
|
|
8407
8527
|
var import_ag_grid_community = require("ag-grid-community");
|
|
8408
8528
|
var import_lucide_react10 = require("lucide-react");
|
|
8409
8529
|
|
|
8410
8530
|
// src/components/PlacementBlock/PlacementSettings.tsx
|
|
8411
|
-
var
|
|
8531
|
+
var import_react19 = __toESM(require("react"));
|
|
8412
8532
|
|
|
8413
8533
|
// src/components/PlacementBlock/placementColumns.ts
|
|
8414
8534
|
var RELATION_SEP = "::";
|
|
@@ -8530,7 +8650,7 @@ var SummaryRow = ({ label, value, hint }) => /* @__PURE__ */ (0, import_jsx_runt
|
|
|
8530
8650
|
] });
|
|
8531
8651
|
var PlacementStatusEditor = ({ config, onChange }) => {
|
|
8532
8652
|
var _a;
|
|
8533
|
-
const radioName = `placement-default-status-${
|
|
8653
|
+
const radioName = `placement-default-status-${import_react19.default.useId()}`;
|
|
8534
8654
|
const statuses = ((_a = config.statusColors) == null ? void 0 : _a.length) ? config.statusColors : DEFAULT_PLACEMENT_STATUS_COLORS;
|
|
8535
8655
|
const defaultStatusId = resolveDefaultStatusId(statuses, config.defaultReturnStatusId);
|
|
8536
8656
|
const setStatuses = (next, defId = defaultStatusId) => {
|
|
@@ -8801,7 +8921,7 @@ var PlacementSettings = ({ config, onChange, tables }) => {
|
|
|
8801
8921
|
};
|
|
8802
8922
|
|
|
8803
8923
|
// src/components/PlacementBlock/PlacementRelationButtons.tsx
|
|
8804
|
-
var
|
|
8924
|
+
var import_react20 = require("react");
|
|
8805
8925
|
var import_jsx_runtime18 = require("react/jsx-runtime");
|
|
8806
8926
|
var GROUP_COLORS = [
|
|
8807
8927
|
{ 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 +8943,7 @@ var PlacementRelationButtons = ({
|
|
|
8823
8943
|
relationOptions,
|
|
8824
8944
|
className = ""
|
|
8825
8945
|
}) => {
|
|
8826
|
-
const groups = (0,
|
|
8946
|
+
const groups = (0, import_react20.useMemo)(() => {
|
|
8827
8947
|
const activeEntries = Object.entries(filters).filter(([, v]) => v !== void 0 && v !== null && v !== "");
|
|
8828
8948
|
return (columnNames || []).map((colName) => {
|
|
8829
8949
|
var _a, _b, _c, _d;
|
|
@@ -8899,6 +9019,43 @@ var PlacementRelationButtons = ({
|
|
|
8899
9019
|
);
|
|
8900
9020
|
};
|
|
8901
9021
|
|
|
9022
|
+
// src/components/PlacementBlock/placementDefaultFilters.ts
|
|
9023
|
+
function getPlacementFilterRefs(config) {
|
|
9024
|
+
const defined = Array.isArray(config == null ? void 0 : config.filterFields) ? config.filterFields : [];
|
|
9025
|
+
const legacy = [config == null ? void 0 : config.targetFilterField1Id, config == null ? void 0 : config.targetFilterField2Id].filter(Boolean);
|
|
9026
|
+
return (defined.length > 0 ? defined : legacy).filter((r) => typeof r === "string" && r);
|
|
9027
|
+
}
|
|
9028
|
+
function resolveFilterColName(ref, targetColumns) {
|
|
9029
|
+
const direct = (targetColumns || []).find((c) => (c == null ? void 0 : c.id) === ref || (c == null ? void 0 : c.name) === ref);
|
|
9030
|
+
if (direct) return direct.name;
|
|
9031
|
+
const { relationColumn } = parseColumnRef(ref);
|
|
9032
|
+
if (relationColumn) {
|
|
9033
|
+
const rel = (targetColumns || []).find(
|
|
9034
|
+
(c) => (c == null ? void 0 : c.name) === relationColumn && String(c == null ? void 0 : c.type).toUpperCase() === "RELATION"
|
|
9035
|
+
);
|
|
9036
|
+
if (rel) return rel.name;
|
|
9037
|
+
}
|
|
9038
|
+
return ref;
|
|
9039
|
+
}
|
|
9040
|
+
function computePlacementDefaultFilters(args) {
|
|
9041
|
+
const { refs, defaults, targetColumns, rows, getText } = args;
|
|
9042
|
+
const applied = {};
|
|
9043
|
+
if (!defaults) return applied;
|
|
9044
|
+
for (const ref of refs) {
|
|
9045
|
+
const want = defaults[ref];
|
|
9046
|
+
if (typeof want !== "string" || want === "") continue;
|
|
9047
|
+
const colName = resolveFilterColName(ref, targetColumns);
|
|
9048
|
+
if (colName in applied) continue;
|
|
9049
|
+
const validRows = rows.filter(
|
|
9050
|
+
(r) => Object.entries(applied).every(([name, value]) => getText(name, r.data) === value)
|
|
9051
|
+
);
|
|
9052
|
+
if (validRows.some((r) => getText(colName, r.data) === want)) {
|
|
9053
|
+
applied[colName] = want;
|
|
9054
|
+
}
|
|
9055
|
+
}
|
|
9056
|
+
return applied;
|
|
9057
|
+
}
|
|
9058
|
+
|
|
8902
9059
|
// src/components/PlacementBlock/PlacementBlock.tsx
|
|
8903
9060
|
var import_jsx_runtime19 = require("react/jsx-runtime");
|
|
8904
9061
|
import_ag_grid_community.ModuleRegistry.registerModules([import_ag_grid_community.AllCommunityModule]);
|
|
@@ -8976,7 +9133,7 @@ var CheckHeader = (props) => /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div"
|
|
|
8976
9133
|
}
|
|
8977
9134
|
) });
|
|
8978
9135
|
var RelationFilterHeader = (props) => {
|
|
8979
|
-
const btnRef = (0,
|
|
9136
|
+
const btnRef = (0, import_react21.useRef)(null);
|
|
8980
9137
|
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
9138
|
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
|
|
8982
9139
|
"button",
|
|
@@ -9003,20 +9160,20 @@ var RelationFilterHeader = (props) => {
|
|
|
9003
9160
|
var PlacementBlock = (props) => {
|
|
9004
9161
|
var _a, _b;
|
|
9005
9162
|
const { executeAction, fetchSourceData, fetchTargetData, updateAssignment, className = "" } = props;
|
|
9006
|
-
const config = (0,
|
|
9163
|
+
const config = (0, import_react21.useMemo)(() => {
|
|
9007
9164
|
var _a2, _b2, _c;
|
|
9008
9165
|
const raw = (_a2 = props.config) != null ? _a2 : props.settings;
|
|
9009
9166
|
if (!raw) return void 0;
|
|
9010
9167
|
return ((_b2 = raw.config) == null ? void 0 : _b2.sourceTableId) || ((_c = raw.config) == null ? void 0 : _c.targetTableId) ? raw.config : raw;
|
|
9011
9168
|
}, [props.config, props.settings]);
|
|
9012
|
-
const statuses = (0,
|
|
9169
|
+
const statuses = (0, import_react21.useMemo)(
|
|
9013
9170
|
() => {
|
|
9014
9171
|
var _a2;
|
|
9015
9172
|
return ((_a2 = config == null ? void 0 : config.statusColors) == null ? void 0 : _a2.length) ? config.statusColors : DEFAULT_PLACEMENT_STATUS_COLORS;
|
|
9016
9173
|
},
|
|
9017
9174
|
[config == null ? void 0 : config.statusColors]
|
|
9018
9175
|
);
|
|
9019
|
-
const defaultStatusId = (0,
|
|
9176
|
+
const defaultStatusId = (0, import_react21.useMemo)(
|
|
9020
9177
|
() => resolveDefaultStatusId(statuses, config == null ? void 0 : config.defaultReturnStatusId),
|
|
9021
9178
|
[statuses, config == null ? void 0 : config.defaultReturnStatusId]
|
|
9022
9179
|
);
|
|
@@ -9024,31 +9181,31 @@ var PlacementBlock = (props) => {
|
|
|
9024
9181
|
const targetTableId = config == null ? void 0 : config.targetTableId;
|
|
9025
9182
|
const displayField = (config == null ? void 0 : config.sourceDisplayFieldId) || "name";
|
|
9026
9183
|
const assignmentField = config == null ? void 0 : config.targetAssignmentFieldId;
|
|
9027
|
-
const executeActionRef = (0,
|
|
9184
|
+
const executeActionRef = (0, import_react21.useRef)(executeAction);
|
|
9028
9185
|
executeActionRef.current = executeAction;
|
|
9029
|
-
const legacyRef = (0,
|
|
9186
|
+
const legacyRef = (0, import_react21.useRef)({ fetchSourceData, fetchTargetData, updateAssignment });
|
|
9030
9187
|
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,
|
|
9188
|
+
const [sourceRows, setSourceRows] = (0, import_react21.useState)([]);
|
|
9189
|
+
const [sourceColumns, setSourceColumns] = (0, import_react21.useState)([]);
|
|
9190
|
+
const [sourceRelOptions, setSourceRelOptions] = (0, import_react21.useState)({});
|
|
9191
|
+
const [sourceRelFilters, setSourceRelFilters] = (0, import_react21.useState)({});
|
|
9192
|
+
const [targetRows, setTargetRows] = (0, import_react21.useState)([]);
|
|
9193
|
+
const [targetColumns, setTargetColumns] = (0, import_react21.useState)([]);
|
|
9194
|
+
const [targetRelOptions, setTargetRelOptions] = (0, import_react21.useState)({});
|
|
9195
|
+
const [selectedTargetId, setSelectedTargetId] = (0, import_react21.useState)("");
|
|
9196
|
+
const [candidateIds, setCandidateIds] = (0, import_react21.useState)([]);
|
|
9197
|
+
const [checkedIds, setCheckedIds] = (0, import_react21.useState)([]);
|
|
9198
|
+
const [isSaving, setIsSaving] = (0, import_react21.useState)(false);
|
|
9199
|
+
const [sourceSearch, setSourceSearch] = (0, import_react21.useState)("");
|
|
9200
|
+
const [candidateSearch, setCandidateSearch] = (0, import_react21.useState)("");
|
|
9201
|
+
const [statusMap, setStatusMap] = (0, import_react21.useState)({});
|
|
9202
|
+
const [isLoading, setIsLoading] = (0, import_react21.useState)(false);
|
|
9203
|
+
const [loadError, setLoadError] = (0, import_react21.useState)(null);
|
|
9204
|
+
const [saveError, setSaveError] = (0, import_react21.useState)(null);
|
|
9205
|
+
const [colFilters, setColFilters] = (0, import_react21.useState)({ source: {}, cand: {} });
|
|
9206
|
+
const [filterPopover, setFilterPopover] = (0, import_react21.useState)(null);
|
|
9207
|
+
const [targetFilters, setTargetFilters] = (0, import_react21.useState)({});
|
|
9208
|
+
const loadTable = (0, import_react21.useCallback)(async (tableId, kind) => {
|
|
9052
9209
|
const exec = executeActionRef.current;
|
|
9053
9210
|
if (exec) {
|
|
9054
9211
|
const res = await exec("FETCH_TABLE_DATA", { tableId, tableMetaId: tableId, limit: FETCH_LIMIT, skip: 0 });
|
|
@@ -9061,7 +9218,7 @@ var PlacementBlock = (props) => {
|
|
|
9061
9218
|
}
|
|
9062
9219
|
throw new Error("executeAction \u05DC\u05D0 \u05D4\u05D5\u05E2\u05D1\u05E8 \u05DC\u05E8\u05DB\u05D9\u05D1 \u05D4\u05E9\u05D9\u05D1\u05D5\u05E5");
|
|
9063
9220
|
}, []);
|
|
9064
|
-
(0,
|
|
9221
|
+
(0, import_react21.useEffect)(() => {
|
|
9065
9222
|
if (!sourceTableId || !targetTableId) return;
|
|
9066
9223
|
let cancelled = false;
|
|
9067
9224
|
(async () => {
|
|
@@ -9089,7 +9246,7 @@ var PlacementBlock = (props) => {
|
|
|
9089
9246
|
cancelled = true;
|
|
9090
9247
|
};
|
|
9091
9248
|
}, [sourceTableId, targetTableId, loadTable]);
|
|
9092
|
-
const displayValue = (0,
|
|
9249
|
+
const displayValue = (0, import_react21.useCallback)((col, val) => {
|
|
9093
9250
|
var _a2, _b2, _c, _d, _e;
|
|
9094
9251
|
let text2 = cellText(val);
|
|
9095
9252
|
if (text2 && /^[a-fA-F0-9]{24}$/.test(text2)) {
|
|
@@ -9109,7 +9266,7 @@ var PlacementBlock = (props) => {
|
|
|
9109
9266
|
}
|
|
9110
9267
|
return text2;
|
|
9111
9268
|
}, [targetRelOptions, targetRows, sourceRows]);
|
|
9112
|
-
const relationLabelMaps = (0,
|
|
9269
|
+
const relationLabelMaps = (0, import_react21.useMemo)(() => {
|
|
9113
9270
|
const maps = {};
|
|
9114
9271
|
Object.entries(sourceRelOptions || {}).forEach(([colName, opts]) => {
|
|
9115
9272
|
const m = /* @__PURE__ */ new Map();
|
|
@@ -9122,7 +9279,7 @@ var PlacementBlock = (props) => {
|
|
|
9122
9279
|
});
|
|
9123
9280
|
return maps;
|
|
9124
9281
|
}, [sourceRelOptions]);
|
|
9125
|
-
const relationLabelsOf = (0,
|
|
9282
|
+
const relationLabelsOf = (0, import_react21.useCallback)((row, colName) => {
|
|
9126
9283
|
var _a2;
|
|
9127
9284
|
const map = relationLabelMaps[colName];
|
|
9128
9285
|
const ids = normalizeRelationValue((_a2 = row.data) == null ? void 0 : _a2[colName]);
|
|
@@ -9131,7 +9288,7 @@ var PlacementBlock = (props) => {
|
|
|
9131
9288
|
const txt = cellText(readColumnValue(row.data, colName));
|
|
9132
9289
|
return txt && !/^[a-fA-F0-9]{24}$/.test(txt) ? txt.split(", ").filter(Boolean) : [];
|
|
9133
9290
|
}, [relationLabelMaps]);
|
|
9134
|
-
const rowPassesColFilters = (0,
|
|
9291
|
+
const rowPassesColFilters = (0, import_react21.useCallback)((row, filters) => {
|
|
9135
9292
|
return Object.entries(filters).every(([colName, f]) => {
|
|
9136
9293
|
if (!f) return true;
|
|
9137
9294
|
const labels = relationLabelsOf(row, colName);
|
|
@@ -9140,7 +9297,7 @@ var PlacementBlock = (props) => {
|
|
|
9140
9297
|
return true;
|
|
9141
9298
|
});
|
|
9142
9299
|
}, [relationLabelsOf]);
|
|
9143
|
-
const setColFilter = (0,
|
|
9300
|
+
const setColFilter = (0, import_react21.useCallback)((grid, colName, payload) => {
|
|
9144
9301
|
setColFilters((prev) => {
|
|
9145
9302
|
const next = __spreadValues({}, prev[grid]);
|
|
9146
9303
|
if (payload === void 0) delete next[colName];
|
|
@@ -9148,11 +9305,11 @@ var PlacementBlock = (props) => {
|
|
|
9148
9305
|
return __spreadProps(__spreadValues({}, prev), { [grid]: next });
|
|
9149
9306
|
});
|
|
9150
9307
|
}, []);
|
|
9151
|
-
const openColFilter = (0,
|
|
9308
|
+
const openColFilter = (0, import_react21.useCallback)((grid, colName, rect) => {
|
|
9152
9309
|
setFilterPopover((cur) => cur && cur.grid === grid && cur.colName === colName ? null : { grid, colName, rect });
|
|
9153
9310
|
}, []);
|
|
9154
|
-
const closeColFilter = (0,
|
|
9155
|
-
const filterColumns = (0,
|
|
9311
|
+
const closeColFilter = (0, import_react21.useCallback)(() => setFilterPopover(null), []);
|
|
9312
|
+
const filterColumns = (0, import_react21.useMemo)(() => {
|
|
9156
9313
|
const definedFilters = (config == null ? void 0 : config.filterFields) || [];
|
|
9157
9314
|
const legacyFilters = [config == null ? void 0 : config.targetFilterField1Id, config == null ? void 0 : config.targetFilterField2Id].filter(Boolean);
|
|
9158
9315
|
const fieldsToUse = definedFilters.length > 0 ? definedFilters : legacyFilters;
|
|
@@ -9178,7 +9335,7 @@ var PlacementBlock = (props) => {
|
|
|
9178
9335
|
return targetColumns.filter((c) => isUserColumn(c) && c.name !== assignmentField && !["id", "_id", "id_", "statusId"].includes(c.name)).slice(0, 3);
|
|
9179
9336
|
}, [targetColumns, assignmentField, config]);
|
|
9180
9337
|
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,
|
|
9338
|
+
const selectorField = (0, import_react21.useMemo)(() => {
|
|
9182
9339
|
const { relationColumn } = parseColumnRef(rawSelectorField);
|
|
9183
9340
|
if (relationColumn && !targetColumns.some((c) => c.name === rawSelectorField) && targetColumns.some((c) => {
|
|
9184
9341
|
var _a2;
|
|
@@ -9188,7 +9345,7 @@ var PlacementBlock = (props) => {
|
|
|
9188
9345
|
}
|
|
9189
9346
|
return rawSelectorField;
|
|
9190
9347
|
}, [rawSelectorField, targetColumns]);
|
|
9191
|
-
const filteredTargetRows = (0,
|
|
9348
|
+
const filteredTargetRows = (0, import_react21.useMemo)(() => {
|
|
9192
9349
|
return targetRows.filter((r) => {
|
|
9193
9350
|
return filterColumns.every((col) => {
|
|
9194
9351
|
const filterVal = targetFilters[col.name];
|
|
@@ -9197,7 +9354,7 @@ var PlacementBlock = (props) => {
|
|
|
9197
9354
|
});
|
|
9198
9355
|
});
|
|
9199
9356
|
}, [targetRows, targetFilters, filterColumns, displayValue]);
|
|
9200
|
-
(0,
|
|
9357
|
+
(0, import_react21.useEffect)(() => {
|
|
9201
9358
|
if (filteredTargetRows.length > 0) {
|
|
9202
9359
|
if (!selectedTargetId || !filteredTargetRows.some((r) => r.id === selectedTargetId)) {
|
|
9203
9360
|
setSelectedTargetId(filteredTargetRows[0].id);
|
|
@@ -9206,11 +9363,27 @@ var PlacementBlock = (props) => {
|
|
|
9206
9363
|
setSelectedTargetId("");
|
|
9207
9364
|
}
|
|
9208
9365
|
}, [filteredTargetRows, selectedTargetId]);
|
|
9209
|
-
const
|
|
9366
|
+
const appliedDefaultsKeyRef = (0, import_react21.useRef)("");
|
|
9367
|
+
(0, import_react21.useEffect)(() => {
|
|
9368
|
+
const defaults = config == null ? void 0 : config.targetFilterDefaults;
|
|
9369
|
+
if (isLoading || !defaults || targetRows.length === 0 || targetColumns.length === 0) return;
|
|
9370
|
+
const key = `${targetTableId}|${JSON.stringify(defaults)}`;
|
|
9371
|
+
if (appliedDefaultsKeyRef.current === key) return;
|
|
9372
|
+
appliedDefaultsKeyRef.current = key;
|
|
9373
|
+
const resolved = computePlacementDefaultFilters({
|
|
9374
|
+
refs: getPlacementFilterRefs(config),
|
|
9375
|
+
defaults,
|
|
9376
|
+
targetColumns,
|
|
9377
|
+
rows: targetRows,
|
|
9378
|
+
getText: (colName, data) => displayValue(targetColumns.find((c) => c.name === colName) || { name: colName }, readColumnValue(data, colName))
|
|
9379
|
+
});
|
|
9380
|
+
if (Object.keys(resolved).length > 0) setTargetFilters((prev) => __spreadValues(__spreadValues({}, resolved), prev));
|
|
9381
|
+
}, [config, isLoading, targetRows, targetColumns, targetTableId, displayValue]);
|
|
9382
|
+
const assignmentColumn = (0, import_react21.useMemo)(() => targetColumns.find((c) => c.name === assignmentField), [targetColumns, assignmentField]);
|
|
9210
9383
|
const isRelationField = ((_b = assignmentColumn == null ? void 0 : assignmentColumn.type) == null ? void 0 : _b.toUpperCase()) === "RELATION";
|
|
9211
9384
|
const assignmentLabel = (assignmentColumn == null ? void 0 : assignmentColumn.label) || (assignmentColumn == null ? void 0 : assignmentColumn.name) || assignmentField || "";
|
|
9212
|
-
const nameOf = (0,
|
|
9213
|
-
const assignedIds = (0,
|
|
9385
|
+
const nameOf = (0, import_react21.useCallback)((row) => cellText(readColumnValue(row.data, displayField)) || "\u05DC\u05DC\u05D0 \u05E9\u05DD", [displayField]);
|
|
9386
|
+
const assignedIds = (0, import_react21.useMemo)(() => {
|
|
9214
9387
|
var _a2;
|
|
9215
9388
|
const target = targetRows.find((r) => r.id === selectedTargetId);
|
|
9216
9389
|
if (!target || !assignmentField) return [];
|
|
@@ -9224,36 +9397,36 @@ var PlacementBlock = (props) => {
|
|
|
9224
9397
|
}).filter((id) => !!id && sourceRows.some((s) => s.id === id));
|
|
9225
9398
|
return Array.from(new Set(ids));
|
|
9226
9399
|
}, [selectedTargetId, targetRows, sourceRows, assignmentField, isRelationField, nameOf]);
|
|
9227
|
-
const assignedIdsRef = (0,
|
|
9400
|
+
const assignedIdsRef = (0, import_react21.useRef)(assignedIds);
|
|
9228
9401
|
assignedIdsRef.current = assignedIds;
|
|
9229
|
-
(0,
|
|
9402
|
+
(0, import_react21.useEffect)(() => {
|
|
9230
9403
|
setCandidateIds(assignedIdsRef.current);
|
|
9231
9404
|
setCheckedIds(assignedIdsRef.current);
|
|
9232
9405
|
}, [selectedTargetId, sourceRows]);
|
|
9233
|
-
const toGridRow = (0,
|
|
9234
|
-
const candidateRows = (0,
|
|
9235
|
-
const candidateGridData = (0,
|
|
9406
|
+
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]);
|
|
9407
|
+
const candidateRows = (0, import_react21.useMemo)(() => candidateIds.map((id) => sourceRows.find((r) => r.id === id)).filter((r) => !!r), [candidateIds, sourceRows]);
|
|
9408
|
+
const candidateGridData = (0, import_react21.useMemo)(() => {
|
|
9236
9409
|
const checked = new Set(checkedIds);
|
|
9237
9410
|
return candidateRows.filter((r) => rowPassesColFilters(r, colFilters.cand)).map((r) => toGridRow(r, checked.has(r.id)));
|
|
9238
9411
|
}, [candidateRows, checkedIds, toGridRow, rowPassesColFilters, colFilters.cand]);
|
|
9239
|
-
const availableRows = (0,
|
|
9412
|
+
const availableRows = (0, import_react21.useMemo)(() => {
|
|
9240
9413
|
const set = new Set(candidateIds);
|
|
9241
9414
|
return sourceRows.filter((r) => !set.has(r.id));
|
|
9242
9415
|
}, [candidateIds, sourceRows]);
|
|
9243
|
-
const relationButtonColumns = (0,
|
|
9416
|
+
const relationButtonColumns = (0, import_react21.useMemo)(() => {
|
|
9244
9417
|
const wanted = Array.isArray(config == null ? void 0 : config.relationButtonColumns) ? config.relationButtonColumns : [];
|
|
9245
9418
|
return wanted.filter((name) => sourceColumns.some((c) => (c == null ? void 0 : c.name) === name && String(c == null ? void 0 : c.type).toUpperCase() === "RELATION"));
|
|
9246
9419
|
}, [config, sourceColumns]);
|
|
9247
9420
|
const hasRelationButtons = relationButtonColumns.length > 0;
|
|
9248
|
-
const handleRelationFilterChange = (0,
|
|
9421
|
+
const handleRelationFilterChange = (0, import_react21.useCallback)((colName, id) => {
|
|
9249
9422
|
setSourceRelFilters((prev) => __spreadProps(__spreadValues({}, prev), { [colName]: id }));
|
|
9250
9423
|
}, []);
|
|
9251
|
-
const availableGridData = (0,
|
|
9424
|
+
const availableGridData = (0, import_react21.useMemo)(() => {
|
|
9252
9425
|
const active = Object.entries(sourceRelFilters).filter(([name, v]) => !!v && relationButtonColumns.includes(name));
|
|
9253
9426
|
const byButtons = active.length === 0 ? availableRows : availableRows.filter((r) => active.every(([name, v]) => rowMatchesRelationFilter(r, name, v)));
|
|
9254
9427
|
return byButtons.filter((r) => rowPassesColFilters(r, colFilters.source)).map((r) => toGridRow(r));
|
|
9255
9428
|
}, [availableRows, sourceRelFilters, relationButtonColumns, toGridRow, rowPassesColFilters, colFilters.source]);
|
|
9256
|
-
const persistAssignment = (0,
|
|
9429
|
+
const persistAssignment = (0, import_react21.useCallback)(async (nextIds) => {
|
|
9257
9430
|
const exec = executeActionRef.current;
|
|
9258
9431
|
if (exec && targetTableId && assignmentField && selectedTargetId) {
|
|
9259
9432
|
const value = isRelationField ? nextIds : nextIds.map((id) => sourceRows.find((r) => r.id === id)).filter((r) => !!r).map(nameOf).join(", ");
|
|
@@ -9265,33 +9438,33 @@ var PlacementBlock = (props) => {
|
|
|
9265
9438
|
for (const id of nextIds.filter((i) => !assignedIds.includes(i))) await legacyRef.current.updateAssignment(selectedTargetId, id);
|
|
9266
9439
|
}
|
|
9267
9440
|
}, [targetTableId, assignmentField, selectedTargetId, isRelationField, sourceRows, nameOf, assignedIds]);
|
|
9268
|
-
const moveToCandidates = (0,
|
|
9441
|
+
const moveToCandidates = (0, import_react21.useCallback)((id) => {
|
|
9269
9442
|
setCandidateIds((prev) => prev.includes(id) ? prev : [...prev, id]);
|
|
9270
9443
|
}, []);
|
|
9271
|
-
const moveToSource = (0,
|
|
9444
|
+
const moveToSource = (0, import_react21.useCallback)((id) => {
|
|
9272
9445
|
setCandidateIds((prev) => prev.filter((x) => x !== id));
|
|
9273
9446
|
setCheckedIds((prev) => prev.filter((x) => x !== id));
|
|
9274
9447
|
setStatusMap((prev) => __spreadProps(__spreadValues({}, prev), { [id]: defaultStatusId }));
|
|
9275
9448
|
}, [defaultStatusId]);
|
|
9276
|
-
const moveToCandidatesRef = (0,
|
|
9449
|
+
const moveToCandidatesRef = (0, import_react21.useRef)(moveToCandidates);
|
|
9277
9450
|
moveToCandidatesRef.current = moveToCandidates;
|
|
9278
|
-
const moveToSourceRef = (0,
|
|
9451
|
+
const moveToSourceRef = (0, import_react21.useRef)(moveToSource);
|
|
9279
9452
|
moveToSourceRef.current = moveToSource;
|
|
9280
|
-
const toggleChecked = (0,
|
|
9453
|
+
const toggleChecked = (0, import_react21.useCallback)((id) => {
|
|
9281
9454
|
setCheckedIds((prev) => prev.includes(id) ? prev.filter((x) => x !== id) : [...prev, id]);
|
|
9282
9455
|
}, []);
|
|
9283
9456
|
const allChecked = candidateIds.length > 0 && candidateIds.every((id) => checkedIds.includes(id));
|
|
9284
9457
|
const someChecked = candidateIds.some((id) => checkedIds.includes(id));
|
|
9285
|
-
const toggleAll = (0,
|
|
9458
|
+
const toggleAll = (0, import_react21.useCallback)(() => {
|
|
9286
9459
|
setCheckedIds(allChecked ? [] : [...candidateIds]);
|
|
9287
9460
|
}, [allChecked, candidateIds]);
|
|
9288
|
-
const returnAll = (0,
|
|
9461
|
+
const returnAll = (0, import_react21.useCallback)(() => {
|
|
9289
9462
|
setCandidateIds([]);
|
|
9290
9463
|
setCheckedIds([]);
|
|
9291
9464
|
}, []);
|
|
9292
|
-
const checkedCandidates = (0,
|
|
9465
|
+
const checkedCandidates = (0, import_react21.useMemo)(() => candidateIds.filter((id) => checkedIds.includes(id)), [candidateIds, checkedIds]);
|
|
9293
9466
|
const isDirty = checkedCandidates.length !== assignedIds.length || checkedCandidates.some((id) => !assignedIds.includes(id));
|
|
9294
|
-
const submitAssignment = (0,
|
|
9467
|
+
const submitAssignment = (0, import_react21.useCallback)(async () => {
|
|
9295
9468
|
if (!selectedTargetId) {
|
|
9296
9469
|
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
9470
|
return;
|
|
@@ -9307,14 +9480,14 @@ var PlacementBlock = (props) => {
|
|
|
9307
9480
|
setIsSaving(false);
|
|
9308
9481
|
}
|
|
9309
9482
|
}, [selectedTargetId, persistAssignment, checkedCandidates]);
|
|
9310
|
-
const cycleStatus = (0,
|
|
9483
|
+
const cycleStatus = (0, import_react21.useCallback)((recordId) => {
|
|
9311
9484
|
setStatusMap((prev) => {
|
|
9312
9485
|
const current = prev[recordId] || defaultStatusId;
|
|
9313
9486
|
const idx = statuses.findIndex((c) => c.id === current);
|
|
9314
9487
|
return __spreadProps(__spreadValues({}, prev), { [recordId]: statuses[(idx + 1) % statuses.length].id });
|
|
9315
9488
|
});
|
|
9316
9489
|
}, [statuses, defaultStatusId]);
|
|
9317
|
-
const cancelAssignment = (0,
|
|
9490
|
+
const cancelAssignment = (0, import_react21.useCallback)(async () => {
|
|
9318
9491
|
if (!selectedTargetId || assignedIds.length === 0) return;
|
|
9319
9492
|
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
9493
|
const removed = new Set(assignedIds);
|
|
@@ -9330,7 +9503,7 @@ var PlacementBlock = (props) => {
|
|
|
9330
9503
|
setIsSaving(false);
|
|
9331
9504
|
}
|
|
9332
9505
|
}, [selectedTargetId, assignedIds, assignmentLabel, persistAssignment]);
|
|
9333
|
-
const makeColDefs = (0,
|
|
9506
|
+
const makeColDefs = (0, import_react21.useCallback)((columns, fallbackName, grid, withCheckbox = false) => {
|
|
9334
9507
|
const gridFilters = colFilters[grid];
|
|
9335
9508
|
const defs = [];
|
|
9336
9509
|
if (withCheckbox) {
|
|
@@ -9375,36 +9548,36 @@ var PlacementBlock = (props) => {
|
|
|
9375
9548
|
return defs;
|
|
9376
9549
|
}, [cycleStatus, statuses, defaultStatusId, displayField, displayValue, toggleChecked, toggleAll, allChecked, someChecked, colFilters, openColFilter]);
|
|
9377
9550
|
const sourceHeader = displayField === "name" ? "\u05E9\u05DD" : columnRefLabel(displayField);
|
|
9378
|
-
const sourceColDefs = (0,
|
|
9379
|
-
const candidateColDefs = (0,
|
|
9380
|
-
const defaultColDef = (0,
|
|
9551
|
+
const sourceColDefs = (0, import_react21.useMemo)(() => makeColDefs(sourceColumns, sourceHeader, "source"), [makeColDefs, sourceColumns, sourceHeader]);
|
|
9552
|
+
const candidateColDefs = (0, import_react21.useMemo)(() => makeColDefs(sourceColumns, sourceHeader, "cand", true), [makeColDefs, sourceColumns, sourceHeader]);
|
|
9553
|
+
const defaultColDef = (0, import_react21.useMemo)(() => ({ resizable: true }), []);
|
|
9381
9554
|
const scrollableColIds = (defs) => defs.filter((d) => !d.pinned).map((d) => {
|
|
9382
9555
|
var _a2;
|
|
9383
9556
|
return (_a2 = d.colId) != null ? _a2 : d.field;
|
|
9384
9557
|
}).filter(Boolean);
|
|
9385
|
-
const expandColumns = (0,
|
|
9558
|
+
const expandColumns = (0, import_react21.useCallback)((api) => {
|
|
9386
9559
|
api == null ? void 0 : api.sizeColumnsToFit();
|
|
9387
9560
|
}, []);
|
|
9388
|
-
const shrinkColumns = (0,
|
|
9561
|
+
const shrinkColumns = (0, import_react21.useCallback)((api, defs) => {
|
|
9389
9562
|
api == null ? void 0 : api.autoSizeColumns(scrollableColIds(defs));
|
|
9390
9563
|
}, []);
|
|
9391
|
-
const popoverOptions = (0,
|
|
9564
|
+
const popoverOptions = (0, import_react21.useMemo)(() => {
|
|
9392
9565
|
if (!filterPopover) return [];
|
|
9393
9566
|
const rows = filterPopover.grid === "source" ? availableRows : candidateRows;
|
|
9394
9567
|
const set = /* @__PURE__ */ new Set();
|
|
9395
9568
|
rows.forEach((r) => relationLabelsOf(r, filterPopover.colName).forEach((l) => set.add(l)));
|
|
9396
9569
|
return Array.from(set).sort((a, b) => a.localeCompare(b, "he")).map((label) => ({ id: label, label }));
|
|
9397
9570
|
}, [filterPopover, availableRows, candidateRows, relationLabelsOf]);
|
|
9398
|
-
const popoverColumn = (0,
|
|
9571
|
+
const popoverColumn = (0, import_react21.useMemo)(
|
|
9399
9572
|
() => filterPopover ? sourceColumns.find((c) => c.name === filterPopover.colName) : void 0,
|
|
9400
9573
|
[filterPopover, sourceColumns]
|
|
9401
9574
|
);
|
|
9402
|
-
const getRowId = (0,
|
|
9403
|
-
const sourceContainerRef = (0,
|
|
9404
|
-
const assignedContainerRef = (0,
|
|
9405
|
-
const [sourceApi, setSourceApi] = (0,
|
|
9406
|
-
const [assignedApi, setAssignedApi] = (0,
|
|
9407
|
-
(0,
|
|
9575
|
+
const getRowId = (0, import_react21.useCallback)((p) => p.data.id, []);
|
|
9576
|
+
const sourceContainerRef = (0, import_react21.useRef)(null);
|
|
9577
|
+
const assignedContainerRef = (0, import_react21.useRef)(null);
|
|
9578
|
+
const [sourceApi, setSourceApi] = (0, import_react21.useState)(null);
|
|
9579
|
+
const [assignedApi, setAssignedApi] = (0, import_react21.useState)(null);
|
|
9580
|
+
(0, import_react21.useEffect)(() => {
|
|
9408
9581
|
if (!sourceApi || !assignedApi) return;
|
|
9409
9582
|
const toAssigned = { getContainer: () => assignedContainerRef.current, onDragStop: (p) => {
|
|
9410
9583
|
var _a2, _b2;
|
|
@@ -9427,20 +9600,20 @@ var PlacementBlock = (props) => {
|
|
|
9427
9600
|
}
|
|
9428
9601
|
};
|
|
9429
9602
|
}, [sourceApi, assignedApi]);
|
|
9430
|
-
const selectorLabel = (0,
|
|
9603
|
+
const selectorLabel = (0, import_react21.useMemo)(() => {
|
|
9431
9604
|
const col = targetColumns.find((c) => c.name === selectorField || c.id === selectorField);
|
|
9432
9605
|
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
9606
|
}, [targetColumns, selectorField]);
|
|
9434
|
-
const assignedText = (0,
|
|
9607
|
+
const assignedText = (0, import_react21.useMemo)(
|
|
9435
9608
|
() => assignedIds.map((id) => sourceRows.find((r) => r.id === id)).filter((r) => !!r).map(nameOf).join(", "),
|
|
9436
9609
|
[assignedIds, sourceRows, nameOf]
|
|
9437
9610
|
);
|
|
9438
9611
|
const activeTarget = targetRows.find((r) => r.id === selectedTargetId);
|
|
9439
|
-
const targetLabel = (0,
|
|
9612
|
+
const targetLabel = (0, import_react21.useCallback)((r) => {
|
|
9440
9613
|
const col = targetColumns.find((c) => c.name === selectorField || c.id === selectorField);
|
|
9441
9614
|
return displayValue(col || { name: selectorField }, readColumnValue(r.data, selectorField)) || "\u05DC\u05DC\u05D0 \u05E9\u05DD";
|
|
9442
9615
|
}, [selectorField, targetColumns, displayValue]);
|
|
9443
|
-
const previewColumns = (0,
|
|
9616
|
+
const previewColumns = (0, import_react21.useMemo)(() => targetColumns.filter((c) => isUserColumn(c) && c.name !== assignmentField && !["id", "_id", "id_", "statusId"].includes(c.name)), [targetColumns, assignmentField]);
|
|
9444
9617
|
if (!config || !sourceTableId || !targetTableId) {
|
|
9445
9618
|
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
9619
|
}
|
|
@@ -9603,11 +9776,11 @@ var PlacementBlock = (props) => {
|
|
|
9603
9776
|
};
|
|
9604
9777
|
|
|
9605
9778
|
// src/components/WhatsAppComponent/WhatsAppComponent.tsx
|
|
9606
|
-
var
|
|
9779
|
+
var import_react27 = __toESM(require("react"));
|
|
9607
9780
|
var import_lucide_react17 = require("lucide-react");
|
|
9608
9781
|
|
|
9609
9782
|
// src/components/WhatsAppComponent/CreateTemplateModal.tsx
|
|
9610
|
-
var
|
|
9783
|
+
var import_react22 = require("react");
|
|
9611
9784
|
var import_lucide_react11 = require("lucide-react");
|
|
9612
9785
|
var import_emoji_picker_react = __toESM(require("emoji-picker-react"));
|
|
9613
9786
|
|
|
@@ -9737,26 +9910,26 @@ function CreateTemplateModal({
|
|
|
9737
9910
|
executeAction,
|
|
9738
9911
|
orgId
|
|
9739
9912
|
}) {
|
|
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,
|
|
9913
|
+
const [templateName, setTemplateName] = (0, import_react22.useState)("");
|
|
9914
|
+
const [language, setLanguage] = (0, import_react22.useState)("he");
|
|
9915
|
+
const [category, setCategory] = (0, import_react22.useState)("MARKETING");
|
|
9916
|
+
const [bodyText, setBodyText] = (0, import_react22.useState)("");
|
|
9917
|
+
const [variableSamples, setVariableSamples] = (0, import_react22.useState)({});
|
|
9918
|
+
const [hasFileHeader, setHasFileHeader] = (0, import_react22.useState)(false);
|
|
9919
|
+
const [selectedFile, setSelectedFile] = (0, import_react22.useState)(null);
|
|
9920
|
+
const [fileBase64, setFileBase64] = (0, import_react22.useState)("");
|
|
9921
|
+
const [buttons, setButtons] = (0, import_react22.useState)([]);
|
|
9922
|
+
const [isAddButtonOpen, setIsAddButtonOpen] = (0, import_react22.useState)(false);
|
|
9923
|
+
const addButtonDropdownRef = (0, import_react22.useRef)(null);
|
|
9924
|
+
const [isSubmitting, setIsSubmitting] = (0, import_react22.useState)(false);
|
|
9925
|
+
const [submittingStep, setSubmittingStep] = (0, import_react22.useState)("");
|
|
9926
|
+
const [submitError, setSubmitError] = (0, import_react22.useState)(null);
|
|
9927
|
+
const [fileError, setFileError] = (0, import_react22.useState)(null);
|
|
9928
|
+
const textareaRef = (0, import_react22.useRef)(null);
|
|
9929
|
+
const fileInputRef = (0, import_react22.useRef)(null);
|
|
9930
|
+
const emojiPickerRef = (0, import_react22.useRef)(null);
|
|
9931
|
+
const [isEmojiPickerOpen, setIsEmojiPickerOpen] = (0, import_react22.useState)(false);
|
|
9932
|
+
(0, import_react22.useEffect)(() => {
|
|
9760
9933
|
function handleClickOutside(event) {
|
|
9761
9934
|
if (emojiPickerRef.current && !emojiPickerRef.current.contains(event.target)) {
|
|
9762
9935
|
setIsEmojiPickerOpen(false);
|
|
@@ -9780,7 +9953,7 @@ function CreateTemplateModal({
|
|
|
9780
9953
|
document.removeEventListener("keydown", handleKeyDown2);
|
|
9781
9954
|
};
|
|
9782
9955
|
}, [isEmojiPickerOpen, isAddButtonOpen]);
|
|
9783
|
-
(0,
|
|
9956
|
+
(0, import_react22.useEffect)(() => {
|
|
9784
9957
|
if (isOpen) {
|
|
9785
9958
|
setTemplateName("");
|
|
9786
9959
|
setLanguage("he");
|
|
@@ -9799,10 +9972,10 @@ function CreateTemplateModal({
|
|
|
9799
9972
|
setIsEmojiPickerOpen(false);
|
|
9800
9973
|
}
|
|
9801
9974
|
}, [isOpen]);
|
|
9802
|
-
const uniqueVariables = (0,
|
|
9975
|
+
const uniqueVariables = (0, import_react22.useMemo)(() => {
|
|
9803
9976
|
return extractUniqueVariableIndices(bodyText);
|
|
9804
9977
|
}, [bodyText]);
|
|
9805
|
-
(0,
|
|
9978
|
+
(0, import_react22.useEffect)(() => {
|
|
9806
9979
|
setVariableSamples((prev) => {
|
|
9807
9980
|
const next = {};
|
|
9808
9981
|
uniqueVariables.forEach((idx) => {
|
|
@@ -9813,7 +9986,7 @@ function CreateTemplateModal({
|
|
|
9813
9986
|
}, [uniqueVariables]);
|
|
9814
9987
|
const isNameEmpty = templateName.trim().length === 0;
|
|
9815
9988
|
const isNamePatternValid = isValidTemplateName(templateName);
|
|
9816
|
-
const isNameDuplicate = (0,
|
|
9989
|
+
const isNameDuplicate = (0, import_react22.useMemo)(() => {
|
|
9817
9990
|
const trimmedName = templateName.trim().toLowerCase();
|
|
9818
9991
|
if (!trimmedName) return false;
|
|
9819
9992
|
if (existingTemplates && existingTemplates.length > 0) {
|
|
@@ -9823,9 +9996,9 @@ function CreateTemplateModal({
|
|
|
9823
9996
|
}
|
|
9824
9997
|
return isDuplicateTemplateName(trimmedName, existingTemplateNames, language);
|
|
9825
9998
|
}, [templateName, language, existingTemplates, existingTemplateNames]);
|
|
9826
|
-
const ratioInfo = (0,
|
|
9827
|
-
const seqInfo = (0,
|
|
9828
|
-
const validationResult = (0,
|
|
9999
|
+
const ratioInfo = (0, import_react22.useMemo)(() => validateWordToVariableRatio(bodyText), [bodyText]);
|
|
10000
|
+
const seqInfo = (0, import_react22.useMemo)(() => validateSequentialVariables(bodyText), [bodyText]);
|
|
10001
|
+
const validationResult = (0, import_react22.useMemo)(() => {
|
|
9829
10002
|
return validateWhatsAppTemplate({
|
|
9830
10003
|
name: templateName,
|
|
9831
10004
|
language,
|
|
@@ -10819,7 +10992,7 @@ function CreateTemplateModal({
|
|
|
10819
10992
|
}
|
|
10820
10993
|
|
|
10821
10994
|
// src/components/WhatsAppComponent/hooks/useWhatsAppState.ts
|
|
10822
|
-
var
|
|
10995
|
+
var import_react23 = require("react");
|
|
10823
10996
|
|
|
10824
10997
|
// src/components/WhatsAppComponent/utils/recipientEngine.ts
|
|
10825
10998
|
var STORAGE_KEY_TEST_PHONE = "whatsapp_test_phone";
|
|
@@ -12124,29 +12297,29 @@ function useWhatsAppState(props) {
|
|
|
12124
12297
|
data: injectedData
|
|
12125
12298
|
} = props;
|
|
12126
12299
|
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,
|
|
12300
|
+
const [tableColumns2, setTableColumns] = (0, import_react23.useState)(() => {
|
|
12128
12301
|
return Array.isArray(settings == null ? void 0 : settings.columns) ? settings.columns : [];
|
|
12129
12302
|
});
|
|
12130
|
-
const [rawRecords, setRawRecords] = (0,
|
|
12303
|
+
const [rawRecords, setRawRecords] = (0, import_react23.useState)(() => {
|
|
12131
12304
|
if (Array.isArray(injectedData)) return injectedData;
|
|
12132
12305
|
if (Array.isArray(injectedData == null ? void 0 : injectedData.records)) return injectedData.records;
|
|
12133
12306
|
return [];
|
|
12134
12307
|
});
|
|
12135
|
-
const [relationOptions, setRelationOptions] = (0,
|
|
12308
|
+
const [relationOptions, setRelationOptions] = (0, import_react23.useState)(() => {
|
|
12136
12309
|
return (injectedData == null ? void 0 : injectedData.relationOptions) || {};
|
|
12137
12310
|
});
|
|
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,
|
|
12311
|
+
const [isLoadingTableData, setIsLoadingTableData] = (0, import_react23.useState)(() => Boolean(settings == null ? void 0 : settings.tableMetaId));
|
|
12312
|
+
const [activeSubtableScans, setActiveSubtableScans] = (0, import_react23.useState)(0);
|
|
12313
|
+
const [tableError, setTableError] = (0, import_react23.useState)(null);
|
|
12314
|
+
const [filters, setFilters] = (0, import_react23.useState)({});
|
|
12315
|
+
const [selectedRowIds, setSelectedRowIds] = (0, import_react23.useState)([]);
|
|
12316
|
+
const [autoSelectCount, setAutoSelectCount] = (0, import_react23.useState)(null);
|
|
12317
|
+
const isAutoSelectingRef = (0, import_react23.useRef)(false);
|
|
12318
|
+
const isManualOverrideRef = (0, import_react23.useRef)(false);
|
|
12319
|
+
const prevAutoSelectCountRef = (0, import_react23.useRef)(null);
|
|
12320
|
+
const fetchedTableIdsRef = (0, import_react23.useRef)(/* @__PURE__ */ new Set());
|
|
12321
|
+
const fullyFetchedRelationKeysRef = (0, import_react23.useRef)(/* @__PURE__ */ new Set());
|
|
12322
|
+
const loadTableData = (0, import_react23.useCallback)(async () => {
|
|
12150
12323
|
var _a2;
|
|
12151
12324
|
const tableId = (settings == null ? void 0 : settings.tableMetaId) || (injectedData == null ? void 0 : injectedData.tableMetaId) || (injectedData == null ? void 0 : injectedData.tableId);
|
|
12152
12325
|
if (!tableId || !executeAction) return;
|
|
@@ -12213,10 +12386,10 @@ function useWhatsAppState(props) {
|
|
|
12213
12386
|
executeAction,
|
|
12214
12387
|
orgId
|
|
12215
12388
|
]);
|
|
12216
|
-
(0,
|
|
12389
|
+
(0, import_react23.useEffect)(() => {
|
|
12217
12390
|
loadTableData();
|
|
12218
12391
|
}, [loadTableData]);
|
|
12219
|
-
const filterableColumns = (0,
|
|
12392
|
+
const filterableColumns = (0, import_react23.useMemo)(() => {
|
|
12220
12393
|
return (tableColumns2 || []).filter((col) => {
|
|
12221
12394
|
var _a2;
|
|
12222
12395
|
if (!col || col.name === "_id" || col.id === "_id") return false;
|
|
@@ -12224,15 +12397,15 @@ function useWhatsAppState(props) {
|
|
|
12224
12397
|
return type === "RELATION" || type === "BOOLEAN";
|
|
12225
12398
|
});
|
|
12226
12399
|
}, [tableColumns2]);
|
|
12227
|
-
const [referencedTableSchemas, setReferencedTableSchemas] = (0,
|
|
12228
|
-
const subtableCols = (0,
|
|
12400
|
+
const [referencedTableSchemas, setReferencedTableSchemas] = (0, import_react23.useState)({});
|
|
12401
|
+
const subtableCols = (0, import_react23.useMemo)(() => {
|
|
12229
12402
|
return (tableColumns2 || []).filter((col) => {
|
|
12230
12403
|
var _a2;
|
|
12231
12404
|
const type = (_a2 = col.type) == null ? void 0 : _a2.toUpperCase();
|
|
12232
12405
|
return type === "RELATION" || type === "SUB_TABLE" || type === "SUBTABLE";
|
|
12233
12406
|
});
|
|
12234
12407
|
}, [tableColumns2]);
|
|
12235
|
-
(0,
|
|
12408
|
+
(0, import_react23.useEffect)(() => {
|
|
12236
12409
|
if (!executeAction) return;
|
|
12237
12410
|
const unrequestedCols = subtableCols.filter((col) => {
|
|
12238
12411
|
var _a2;
|
|
@@ -12278,20 +12451,20 @@ function useWhatsAppState(props) {
|
|
|
12278
12451
|
const isScanningPhoneColumns = Boolean(
|
|
12279
12452
|
isLoadingTableData || activeSubtableScans > 0 || tableColumns2.length === 0 && Boolean(settings == null ? void 0 : settings.tableMetaId)
|
|
12280
12453
|
);
|
|
12281
|
-
const targetPhoneOptions = (0,
|
|
12454
|
+
const targetPhoneOptions = (0, import_react23.useMemo)(() => {
|
|
12282
12455
|
const cols = tableColumns2 && tableColumns2.length > 0 ? tableColumns2 : Array.isArray(settings == null ? void 0 : settings.columns) ? settings.columns : [];
|
|
12283
12456
|
return scanTargetPhoneOptions(cols, referencedTableSchemas);
|
|
12284
12457
|
}, [tableColumns2, settings == null ? void 0 : settings.columns, referencedTableSchemas]);
|
|
12285
|
-
const phoneColumns = (0,
|
|
12458
|
+
const phoneColumns = (0, import_react23.useMemo)(() => {
|
|
12286
12459
|
return targetPhoneOptions.map((opt) => ({ name: opt.label, id: opt.id, type: "PHONE" }));
|
|
12287
12460
|
}, [targetPhoneOptions]);
|
|
12288
|
-
const [phoneColumnId, setPhoneColumnId] = (0,
|
|
12289
|
-
const [subtableFilterColumn, setSubtableFilterColumn] = (0,
|
|
12290
|
-
const [subtableFilterValue, setSubtableFilterValue] = (0,
|
|
12291
|
-
const [subtableSendLimit, setSubtableSendLimit] = (0,
|
|
12461
|
+
const [phoneColumnId, setPhoneColumnId] = (0, import_react23.useState)("");
|
|
12462
|
+
const [subtableFilterColumn, setSubtableFilterColumn] = (0, import_react23.useState)("");
|
|
12463
|
+
const [subtableFilterValue, setSubtableFilterValue] = (0, import_react23.useState)("");
|
|
12464
|
+
const [subtableSendLimit, setSubtableSendLimit] = (0, import_react23.useState)(
|
|
12292
12465
|
(settings == null ? void 0 : settings.subtableSendLimit) || "PRIMARY"
|
|
12293
12466
|
);
|
|
12294
|
-
(0,
|
|
12467
|
+
(0, import_react23.useEffect)(() => {
|
|
12295
12468
|
if (targetPhoneOptions.length > 0) {
|
|
12296
12469
|
const isValid = targetPhoneOptions.some(
|
|
12297
12470
|
(opt) => opt.id === phoneColumnId || opt.columnName === phoneColumnId
|
|
@@ -12303,13 +12476,13 @@ function useWhatsAppState(props) {
|
|
|
12303
12476
|
setPhoneColumnId("");
|
|
12304
12477
|
}
|
|
12305
12478
|
}, [targetPhoneOptions, phoneColumnId]);
|
|
12306
|
-
const selectedPhoneOption = (0,
|
|
12479
|
+
const selectedPhoneOption = (0, import_react23.useMemo)(() => {
|
|
12307
12480
|
if (!phoneColumnId) return targetPhoneOptions[0] || null;
|
|
12308
12481
|
return targetPhoneOptions.find(
|
|
12309
12482
|
(opt) => opt.id === phoneColumnId || opt.columnName === phoneColumnId
|
|
12310
12483
|
) || targetPhoneOptions[0] || null;
|
|
12311
12484
|
}, [targetPhoneOptions, phoneColumnId]);
|
|
12312
|
-
const subtableFilterableColumns = (0,
|
|
12485
|
+
const subtableFilterableColumns = (0, import_react23.useMemo)(() => {
|
|
12313
12486
|
var _a2, _b2, _c;
|
|
12314
12487
|
if (!selectedPhoneOption || selectedPhoneOption.type !== "SUBTABLE") {
|
|
12315
12488
|
return [];
|
|
@@ -12328,14 +12501,14 @@ function useWhatsAppState(props) {
|
|
|
12328
12501
|
return type === "BOOLEAN" || type === "RELATION";
|
|
12329
12502
|
});
|
|
12330
12503
|
}, [selectedPhoneOption, referencedTableSchemas, tableColumns2]);
|
|
12331
|
-
const selectedSubtableFilterCol = (0,
|
|
12504
|
+
const selectedSubtableFilterCol = (0, import_react23.useMemo)(() => {
|
|
12332
12505
|
return subtableFilterableColumns.find((c) => c.name === subtableFilterColumn);
|
|
12333
12506
|
}, [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,
|
|
12507
|
+
const [enablePostSendAction, setEnablePostSendAction] = (0, import_react23.useState)(false);
|
|
12508
|
+
const [postSendActionColumn, setPostSendActionColumn] = (0, import_react23.useState)("");
|
|
12509
|
+
const [postSendActionValue, setPostSendActionValue] = (0, import_react23.useState)("");
|
|
12510
|
+
const [postSendActionTargetType, setPostSendActionTargetType] = (0, import_react23.useState)("MAIN");
|
|
12511
|
+
const postSendActionTargetOptions = (0, import_react23.useMemo)(() => {
|
|
12339
12512
|
var _a2, _b2, _c;
|
|
12340
12513
|
const options = [];
|
|
12341
12514
|
(tableColumns2 || []).forEach((col) => {
|
|
@@ -12380,14 +12553,14 @@ function useWhatsAppState(props) {
|
|
|
12380
12553
|
}
|
|
12381
12554
|
return options;
|
|
12382
12555
|
}, [tableColumns2, selectedPhoneOption, referencedTableSchemas]);
|
|
12383
|
-
const selectedPostSendOption = (0,
|
|
12556
|
+
const selectedPostSendOption = (0, import_react23.useMemo)(() => {
|
|
12384
12557
|
return postSendActionTargetOptions.find(
|
|
12385
12558
|
(opt) => opt.id === postSendActionColumn || opt.columnName === postSendActionColumn
|
|
12386
12559
|
);
|
|
12387
12560
|
}, [postSendActionTargetOptions, postSendActionColumn]);
|
|
12388
12561
|
const selectedPostSendCol = selectedPostSendOption;
|
|
12389
|
-
const [isTestPromptOpen, setIsTestPromptOpen] = (0,
|
|
12390
|
-
const [testPhoneNumber, setTestPhoneNumber] = (0,
|
|
12562
|
+
const [isTestPromptOpen, setIsTestPromptOpen] = (0, import_react23.useState)(false);
|
|
12563
|
+
const [testPhoneNumber, setTestPhoneNumber] = (0, import_react23.useState)(() => {
|
|
12391
12564
|
if (typeof window !== "undefined") {
|
|
12392
12565
|
try {
|
|
12393
12566
|
return localStorage.getItem(STORAGE_KEY_TEST_PHONE) || "";
|
|
@@ -12397,10 +12570,10 @@ function useWhatsAppState(props) {
|
|
|
12397
12570
|
}
|
|
12398
12571
|
return "";
|
|
12399
12572
|
});
|
|
12400
|
-
const [testFeedback, setTestFeedback] = (0,
|
|
12401
|
-
const [isSendingTest, setIsSendingTest] = (0,
|
|
12402
|
-
const [isSendingBroadcast, setIsSendingBroadcast] = (0,
|
|
12403
|
-
const [broadcastProgress, setBroadcastProgress] = (0,
|
|
12573
|
+
const [testFeedback, setTestFeedback] = (0, import_react23.useState)(null);
|
|
12574
|
+
const [isSendingTest, setIsSendingTest] = (0, import_react23.useState)(false);
|
|
12575
|
+
const [isSendingBroadcast, setIsSendingBroadcast] = (0, import_react23.useState)(false);
|
|
12576
|
+
const [broadcastProgress, setBroadcastProgress] = (0, import_react23.useState)({
|
|
12404
12577
|
current: 0,
|
|
12405
12578
|
total: 0,
|
|
12406
12579
|
successful: 0,
|
|
@@ -12408,12 +12581,12 @@ function useWhatsAppState(props) {
|
|
|
12408
12581
|
skipped: 0,
|
|
12409
12582
|
percent: 0
|
|
12410
12583
|
});
|
|
12411
|
-
const [broadcastSummary, setBroadcastSummary] = (0,
|
|
12412
|
-
const [rowStatusMap, setRowStatusMap] = (0,
|
|
12413
|
-
const clearBroadcastSummary = (0,
|
|
12584
|
+
const [broadcastSummary, setBroadcastSummary] = (0, import_react23.useState)(null);
|
|
12585
|
+
const [rowStatusMap, setRowStatusMap] = (0, import_react23.useState)({});
|
|
12586
|
+
const clearBroadcastSummary = (0, import_react23.useCallback)(() => {
|
|
12414
12587
|
setBroadcastSummary(null);
|
|
12415
12588
|
}, []);
|
|
12416
|
-
const handleTestPhoneChange = (0,
|
|
12589
|
+
const handleTestPhoneChange = (0, import_react23.useCallback)((val) => {
|
|
12417
12590
|
setTestPhoneNumber(val);
|
|
12418
12591
|
if (typeof window !== "undefined") {
|
|
12419
12592
|
try {
|
|
@@ -12423,7 +12596,7 @@ function useWhatsAppState(props) {
|
|
|
12423
12596
|
}
|
|
12424
12597
|
}
|
|
12425
12598
|
}, []);
|
|
12426
|
-
const getRelationOptionsForCol = (0,
|
|
12599
|
+
const getRelationOptionsForCol = (0, import_react23.useCallback)(
|
|
12427
12600
|
(colName, parentColName) => {
|
|
12428
12601
|
var _a2, _b2, _c, _d;
|
|
12429
12602
|
if (parentColName) {
|
|
@@ -12466,7 +12639,7 @@ function useWhatsAppState(props) {
|
|
|
12466
12639
|
},
|
|
12467
12640
|
[relationOptions, subtableFilterableColumns, postSendActionTargetOptions, tableColumns2, filterableColumns]
|
|
12468
12641
|
);
|
|
12469
|
-
(0,
|
|
12642
|
+
(0, import_react23.useEffect)(() => {
|
|
12470
12643
|
var _a2, _b2, _c, _d, _e;
|
|
12471
12644
|
if (!executeAction) return;
|
|
12472
12645
|
const targets = [];
|
|
@@ -12560,7 +12733,7 @@ function useWhatsAppState(props) {
|
|
|
12560
12733
|
}
|
|
12561
12734
|
});
|
|
12562
12735
|
}, [filterableColumns, selectedPhoneOption, referencedTableSchemas, tableColumns2, executeAction, selectedPostSendOption, orgId]);
|
|
12563
|
-
(0,
|
|
12736
|
+
(0, import_react23.useEffect)(() => {
|
|
12564
12737
|
var _a2, _b2, _c;
|
|
12565
12738
|
if (!executeAction || !selectedSubtableFilterCol) return;
|
|
12566
12739
|
if (((_a2 = selectedSubtableFilterCol.type) == null ? void 0 : _a2.toUpperCase()) !== "RELATION") return;
|
|
@@ -12611,7 +12784,7 @@ function useWhatsAppState(props) {
|
|
|
12611
12784
|
}
|
|
12612
12785
|
})();
|
|
12613
12786
|
}, [selectedSubtableFilterCol, selectedPhoneOption, executeAction, orgId]);
|
|
12614
|
-
(0,
|
|
12787
|
+
(0, import_react23.useEffect)(() => {
|
|
12615
12788
|
var _a2, _b2;
|
|
12616
12789
|
if (!executeAction || !selectedPostSendOption) return;
|
|
12617
12790
|
if (selectedPostSendOption.type !== "RELATION") return;
|
|
@@ -12664,7 +12837,7 @@ function useWhatsAppState(props) {
|
|
|
12664
12837
|
}
|
|
12665
12838
|
})();
|
|
12666
12839
|
}, [selectedPostSendOption, executeAction, orgId]);
|
|
12667
|
-
const filteredRecords = (0,
|
|
12840
|
+
const filteredRecords = (0, import_react23.useMemo)(() => {
|
|
12668
12841
|
const activeEntries = Object.entries(filters).filter(
|
|
12669
12842
|
([_, val]) => val !== void 0 && val !== null && val !== ""
|
|
12670
12843
|
);
|
|
@@ -12696,7 +12869,7 @@ function useWhatsAppState(props) {
|
|
|
12696
12869
|
});
|
|
12697
12870
|
}, [rawRecords, filters, filterableColumns]);
|
|
12698
12871
|
const filteredData = filteredRecords;
|
|
12699
|
-
(0,
|
|
12872
|
+
(0, import_react23.useEffect)(() => {
|
|
12700
12873
|
if (autoSelectCount !== null && autoSelectCount > 0) {
|
|
12701
12874
|
isAutoSelectingRef.current = true;
|
|
12702
12875
|
const sliced = filteredData.slice(0, autoSelectCount);
|
|
@@ -12714,7 +12887,7 @@ function useWhatsAppState(props) {
|
|
|
12714
12887
|
isManualOverrideRef.current = false;
|
|
12715
12888
|
prevAutoSelectCountRef.current = autoSelectCount;
|
|
12716
12889
|
}, [autoSelectCount, filteredData]);
|
|
12717
|
-
const embeddedTableExecuteAction = (0,
|
|
12890
|
+
const embeddedTableExecuteAction = (0, import_react23.useCallback)(async (actionType, payload) => {
|
|
12718
12891
|
if (actionType === "FETCH_TABLE_DATA") {
|
|
12719
12892
|
const colFilters = (payload == null ? void 0 : payload.columnFilters) || (payload == null ? void 0 : payload.filters);
|
|
12720
12893
|
const searchQuery = payload == null ? void 0 : payload.search;
|
|
@@ -12757,10 +12930,10 @@ function useWhatsAppState(props) {
|
|
|
12757
12930
|
const handleClearFilters = () => {
|
|
12758
12931
|
setFilters({});
|
|
12759
12932
|
};
|
|
12760
|
-
const activeFiltersCount = (0,
|
|
12933
|
+
const activeFiltersCount = (0, import_react23.useMemo)(() => {
|
|
12761
12934
|
return Object.values(filters).filter((v) => v !== "").length;
|
|
12762
12935
|
}, [filters]);
|
|
12763
|
-
const handleSelectionChange = (0,
|
|
12936
|
+
const handleSelectionChange = (0, import_react23.useCallback)((selectedIds) => {
|
|
12764
12937
|
setSelectedRowIds((prev) => {
|
|
12765
12938
|
if (prev.length === selectedIds.length && prev.every((id, idx) => id === selectedIds[idx])) {
|
|
12766
12939
|
return prev;
|
|
@@ -12774,13 +12947,13 @@ function useWhatsAppState(props) {
|
|
|
12774
12947
|
return selectedIds;
|
|
12775
12948
|
});
|
|
12776
12949
|
}, [autoSelectCount]);
|
|
12777
|
-
const handleRowToggle = (0,
|
|
12950
|
+
const handleRowToggle = (0, import_react23.useCallback)((rowId, checked) => {
|
|
12778
12951
|
if (autoSelectCount !== null && autoSelectCount > 0) {
|
|
12779
12952
|
isManualOverrideRef.current = true;
|
|
12780
12953
|
setAutoSelectCount(null);
|
|
12781
12954
|
}
|
|
12782
12955
|
}, [autoSelectCount]);
|
|
12783
|
-
const toggleRowSelection = (0,
|
|
12956
|
+
const toggleRowSelection = (0, import_react23.useCallback)((rowId, checked) => {
|
|
12784
12957
|
if (autoSelectCount !== null && autoSelectCount > 0) {
|
|
12785
12958
|
isManualOverrideRef.current = true;
|
|
12786
12959
|
setAutoSelectCount(null);
|
|
@@ -12796,15 +12969,15 @@ function useWhatsAppState(props) {
|
|
|
12796
12969
|
return prev;
|
|
12797
12970
|
});
|
|
12798
12971
|
}, [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,
|
|
12972
|
+
const [templates, setTemplates] = (0, import_react23.useState)([]);
|
|
12973
|
+
const [selectedTemplateId, setSelectedTemplateId] = (0, import_react23.useState)(null);
|
|
12974
|
+
const [isLoading, setIsLoading] = (0, import_react23.useState)(true);
|
|
12975
|
+
const [fetchError, setFetchError] = (0, import_react23.useState)(null);
|
|
12976
|
+
const [isModalOpen, setIsModalOpen] = (0, import_react23.useState)(false);
|
|
12977
|
+
const [isDropdownOpen, setIsDropdownOpen] = (0, import_react23.useState)(false);
|
|
12978
|
+
const [isDeleting, setIsDeleting] = (0, import_react23.useState)(false);
|
|
12979
|
+
const [feedback, setFeedback] = (0, import_react23.useState)(null);
|
|
12980
|
+
const loadTemplates = (0, import_react23.useCallback)(async () => {
|
|
12808
12981
|
var _a2, _b2;
|
|
12809
12982
|
if (!executeAction) {
|
|
12810
12983
|
setIsLoading(false);
|
|
@@ -12856,13 +13029,13 @@ function useWhatsAppState(props) {
|
|
|
12856
13029
|
setIsLoading(false);
|
|
12857
13030
|
}
|
|
12858
13031
|
}, [executeAction, orgId]);
|
|
12859
|
-
(0,
|
|
13032
|
+
(0, import_react23.useEffect)(() => {
|
|
12860
13033
|
loadTemplates();
|
|
12861
13034
|
}, [loadTemplates]);
|
|
12862
|
-
const selectedTemplate = (0,
|
|
13035
|
+
const selectedTemplate = (0, import_react23.useMemo)(() => {
|
|
12863
13036
|
return templates.find((t) => t.id === selectedTemplateId) || null;
|
|
12864
13037
|
}, [templates, selectedTemplateId]);
|
|
12865
|
-
const templateBodyText = (0,
|
|
13038
|
+
const templateBodyText = (0, import_react23.useMemo)(() => {
|
|
12866
13039
|
if (!(selectedTemplate == null ? void 0 : selectedTemplate.components)) return "";
|
|
12867
13040
|
const bodyComp = selectedTemplate.components.find(
|
|
12868
13041
|
(c) => {
|
|
@@ -12872,7 +13045,7 @@ function useWhatsAppState(props) {
|
|
|
12872
13045
|
);
|
|
12873
13046
|
return (bodyComp == null ? void 0 : bodyComp.text) || "";
|
|
12874
13047
|
}, [selectedTemplate]);
|
|
12875
|
-
const templateHeaderComp = (0,
|
|
13048
|
+
const templateHeaderComp = (0, import_react23.useMemo)(() => {
|
|
12876
13049
|
if (!(selectedTemplate == null ? void 0 : selectedTemplate.components)) return null;
|
|
12877
13050
|
return selectedTemplate.components.find(
|
|
12878
13051
|
(c) => {
|
|
@@ -12881,8 +13054,8 @@ function useWhatsAppState(props) {
|
|
|
12881
13054
|
}
|
|
12882
13055
|
) || null;
|
|
12883
13056
|
}, [selectedTemplate]);
|
|
12884
|
-
const [headerMediaUrl, setHeaderMediaUrl] = (0,
|
|
12885
|
-
(0,
|
|
13057
|
+
const [headerMediaUrl, setHeaderMediaUrl] = (0, import_react23.useState)("");
|
|
13058
|
+
(0, import_react23.useEffect)(() => {
|
|
12886
13059
|
if (!templateHeaderComp) {
|
|
12887
13060
|
setHeaderMediaUrl("");
|
|
12888
13061
|
return;
|
|
@@ -12899,7 +13072,7 @@ function useWhatsAppState(props) {
|
|
|
12899
13072
|
setHeaderMediaUrl("");
|
|
12900
13073
|
}
|
|
12901
13074
|
}, [templateHeaderComp, selectedTemplate == null ? void 0 : selectedTemplate.name]);
|
|
12902
|
-
const handleHeaderMediaUrlChange = (0,
|
|
13075
|
+
const handleHeaderMediaUrlChange = (0, import_react23.useCallback)(
|
|
12903
13076
|
(newUrl) => {
|
|
12904
13077
|
setHeaderMediaUrl(newUrl);
|
|
12905
13078
|
if ((selectedTemplate == null ? void 0 : selectedTemplate.name) && typeof window !== "undefined") {
|
|
@@ -12918,7 +13091,7 @@ function useWhatsAppState(props) {
|
|
|
12918
13091
|
},
|
|
12919
13092
|
[selectedTemplate == null ? void 0 : selectedTemplate.name]
|
|
12920
13093
|
);
|
|
12921
|
-
const handleResetHeaderMediaUrl = (0,
|
|
13094
|
+
const handleResetHeaderMediaUrl = (0, import_react23.useCallback)(() => {
|
|
12922
13095
|
if ((selectedTemplate == null ? void 0 : selectedTemplate.name) && typeof window !== "undefined") {
|
|
12923
13096
|
try {
|
|
12924
13097
|
localStorage.removeItem(`whatsapp_template_media_${selectedTemplate.name}`);
|
|
@@ -12932,8 +13105,8 @@ function useWhatsAppState(props) {
|
|
|
12932
13105
|
);
|
|
12933
13106
|
setHeaderMediaUrl(defaultUrl || "");
|
|
12934
13107
|
}, [templateHeaderComp, selectedTemplate == null ? void 0 : selectedTemplate.name]);
|
|
12935
|
-
const [isUploadingMedia, setIsUploadingMedia] = (0,
|
|
12936
|
-
const handleFileUpload = (0,
|
|
13108
|
+
const [isUploadingMedia, setIsUploadingMedia] = (0, import_react23.useState)(false);
|
|
13109
|
+
const handleFileUpload = (0, import_react23.useCallback)(
|
|
12937
13110
|
async (file, templateName) => {
|
|
12938
13111
|
const tplName = templateName || (selectedTemplate == null ? void 0 : selectedTemplate.name) || "";
|
|
12939
13112
|
if (!file) return;
|
|
@@ -12974,14 +13147,14 @@ function useWhatsAppState(props) {
|
|
|
12974
13147
|
},
|
|
12975
13148
|
[selectedTemplate == null ? void 0 : selectedTemplate.name]
|
|
12976
13149
|
);
|
|
12977
|
-
const templateVariables = (0,
|
|
13150
|
+
const templateVariables = (0, import_react23.useMemo)(() => {
|
|
12978
13151
|
return extractTemplateVariables(selectedTemplate);
|
|
12979
13152
|
}, [selectedTemplate]);
|
|
12980
|
-
const [variableMapping, setVariableMapping] = (0,
|
|
12981
|
-
(0,
|
|
13153
|
+
const [variableMapping, setVariableMapping] = (0, import_react23.useState)({});
|
|
13154
|
+
(0, import_react23.useEffect)(() => {
|
|
12982
13155
|
setVariableMapping({});
|
|
12983
13156
|
}, [selectedTemplateId]);
|
|
12984
|
-
const textableColumnOptions = (0,
|
|
13157
|
+
const textableColumnOptions = (0, import_react23.useMemo)(() => {
|
|
12985
13158
|
return getTextableColumnOptions({
|
|
12986
13159
|
tableColumns: tableColumns2,
|
|
12987
13160
|
selectedPhoneOption,
|
|
@@ -13007,7 +13180,7 @@ function useWhatsAppState(props) {
|
|
|
13007
13180
|
});
|
|
13008
13181
|
});
|
|
13009
13182
|
};
|
|
13010
|
-
const existingTemplateNames = (0,
|
|
13183
|
+
const existingTemplateNames = (0, import_react23.useMemo)(() => {
|
|
13011
13184
|
return templates.map((t) => t.name);
|
|
13012
13185
|
}, [templates]);
|
|
13013
13186
|
const handleDeleteTemplate = async () => {
|
|
@@ -13054,14 +13227,14 @@ function useWhatsAppState(props) {
|
|
|
13054
13227
|
postSendActionColumn,
|
|
13055
13228
|
postSendActionValue
|
|
13056
13229
|
);
|
|
13057
|
-
const isStaticVariableMissing = (0,
|
|
13230
|
+
const isStaticVariableMissing = (0, import_react23.useMemo)(() => {
|
|
13058
13231
|
return isStaticVariableIncomplete(templateVariables, variableMapping);
|
|
13059
13232
|
}, [templateVariables, variableMapping]);
|
|
13060
|
-
const currentRecords = (0,
|
|
13233
|
+
const currentRecords = (0, import_react23.useMemo)(() => {
|
|
13061
13234
|
var _a2;
|
|
13062
13235
|
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
13236
|
}, [rawRecords, props.data]);
|
|
13064
|
-
const preparedRecipients = (0,
|
|
13237
|
+
const preparedRecipients = (0, import_react23.useMemo)(() => {
|
|
13065
13238
|
return prepareRecipients({
|
|
13066
13239
|
selectedIds: selectedRowIds,
|
|
13067
13240
|
records: currentRecords,
|
|
@@ -13081,7 +13254,7 @@ function useWhatsAppState(props) {
|
|
|
13081
13254
|
selectedSubtableFilterCol
|
|
13082
13255
|
]);
|
|
13083
13256
|
const finalRecipientCount = preparedRecipients.length;
|
|
13084
|
-
const validMainRowsCount = (0,
|
|
13257
|
+
const validMainRowsCount = (0, import_react23.useMemo)(() => {
|
|
13085
13258
|
const rowIdSet = new Set(
|
|
13086
13259
|
preparedRecipients.map((r) => r.mainRowId).filter(Boolean)
|
|
13087
13260
|
);
|
|
@@ -13190,7 +13363,7 @@ function useWhatsAppState(props) {
|
|
|
13190
13363
|
setIsSendingTest(false);
|
|
13191
13364
|
}
|
|
13192
13365
|
};
|
|
13193
|
-
const handleSendMessages = (0,
|
|
13366
|
+
const handleSendMessages = (0, import_react23.useCallback)(async () => {
|
|
13194
13367
|
var _a2, _b2;
|
|
13195
13368
|
if (isSendDisabled || isSendingBroadcast) return;
|
|
13196
13369
|
const recipients = preparedRecipients;
|
|
@@ -13496,7 +13669,7 @@ function useWhatsAppState(props) {
|
|
|
13496
13669
|
}
|
|
13497
13670
|
|
|
13498
13671
|
// src/components/WhatsAppComponent/ui/TemplateSelectionBlock.tsx
|
|
13499
|
-
var
|
|
13672
|
+
var import_react24 = require("react");
|
|
13500
13673
|
var import_lucide_react12 = require("lucide-react");
|
|
13501
13674
|
var import_jsx_runtime21 = require("react/jsx-runtime");
|
|
13502
13675
|
function TemplateSelectionBlock({
|
|
@@ -13524,7 +13697,7 @@ function TemplateSelectionBlock({
|
|
|
13524
13697
|
isUploadingMedia = false,
|
|
13525
13698
|
handleFileUpload
|
|
13526
13699
|
}) {
|
|
13527
|
-
const fileInputRef = (0,
|
|
13700
|
+
const fileInputRef = (0, import_react24.useRef)(null);
|
|
13528
13701
|
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
13702
|
/* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: "space-y-1.5 shrink-0", children: [
|
|
13530
13703
|
/* @__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 +14649,19 @@ function SettingsAndActionsBlock({
|
|
|
14476
14649
|
}
|
|
14477
14650
|
|
|
14478
14651
|
// src/components/WhatsAppComponent/inbox/useInboxState.ts
|
|
14479
|
-
var
|
|
14652
|
+
var import_react25 = require("react");
|
|
14480
14653
|
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,
|
|
14654
|
+
const [conversations, setConversations] = (0, import_react25.useState)([]);
|
|
14655
|
+
const [activeConversationId, setActiveConversationId] = (0, import_react25.useState)(null);
|
|
14656
|
+
const [messages, setMessages] = (0, import_react25.useState)([]);
|
|
14657
|
+
const [isLoading, setIsLoading] = (0, import_react25.useState)(false);
|
|
14658
|
+
const [isSending, setIsSending] = (0, import_react25.useState)(false);
|
|
14659
|
+
const [error, setError] = (0, import_react25.useState)(null);
|
|
14660
|
+
const actionsRef = (0, import_react25.useRef)(actions);
|
|
14661
|
+
(0, import_react25.useEffect)(() => {
|
|
14489
14662
|
actionsRef.current = actions;
|
|
14490
14663
|
});
|
|
14491
|
-
const fetchConversations = (0,
|
|
14664
|
+
const fetchConversations = (0, import_react25.useCallback)(async () => {
|
|
14492
14665
|
if (!orgId) return;
|
|
14493
14666
|
const res = await actionsRef.current.getConversations(orgId);
|
|
14494
14667
|
if (res.success && res.data) {
|
|
@@ -14497,7 +14670,7 @@ function useInboxState(orgId, actions) {
|
|
|
14497
14670
|
setError(res.error);
|
|
14498
14671
|
}
|
|
14499
14672
|
}, [orgId]);
|
|
14500
|
-
const fetchMessages = (0,
|
|
14673
|
+
const fetchMessages = (0, import_react25.useCallback)(async (conversationId, silent = false) => {
|
|
14501
14674
|
if (!silent) setIsLoading(true);
|
|
14502
14675
|
const res = await actionsRef.current.getMessages(conversationId);
|
|
14503
14676
|
if (res.success && res.data) {
|
|
@@ -14510,7 +14683,7 @@ function useInboxState(orgId, actions) {
|
|
|
14510
14683
|
}
|
|
14511
14684
|
if (!silent) setIsLoading(false);
|
|
14512
14685
|
}, []);
|
|
14513
|
-
(0,
|
|
14686
|
+
(0, import_react25.useEffect)(() => {
|
|
14514
14687
|
fetchConversations();
|
|
14515
14688
|
const interval = setInterval(() => {
|
|
14516
14689
|
fetchConversations();
|
|
@@ -14609,17 +14782,17 @@ function ConversationList({ conversations, activeId, onSelect }) {
|
|
|
14609
14782
|
}
|
|
14610
14783
|
|
|
14611
14784
|
// src/components/WhatsAppComponent/inbox/ChatWindow.tsx
|
|
14612
|
-
var
|
|
14785
|
+
var import_react26 = require("react");
|
|
14613
14786
|
var import_lucide_react16 = require("lucide-react");
|
|
14614
14787
|
var import_jsx_runtime25 = require("react/jsx-runtime");
|
|
14615
14788
|
function ChatWindow({ activeConversation, messages, isLoading, isSending, onSendMessage }) {
|
|
14616
|
-
const [inputText, setInputText] = (0,
|
|
14617
|
-
const messagesTopRef = (0,
|
|
14789
|
+
const [inputText, setInputText] = (0, import_react26.useState)("");
|
|
14790
|
+
const messagesTopRef = (0, import_react26.useRef)(null);
|
|
14618
14791
|
const scrollToTop = () => {
|
|
14619
14792
|
var _a;
|
|
14620
14793
|
(_a = messagesTopRef.current) == null ? void 0 : _a.scrollIntoView({ behavior: "smooth" });
|
|
14621
14794
|
};
|
|
14622
|
-
(0,
|
|
14795
|
+
(0, import_react26.useEffect)(() => {
|
|
14623
14796
|
scrollToTop();
|
|
14624
14797
|
}, [messages.length, activeConversation == null ? void 0 : activeConversation.id]);
|
|
14625
14798
|
const handleSend = (e) => {
|
|
@@ -14735,7 +14908,7 @@ function WhatsAppComponent(props) {
|
|
|
14735
14908
|
var _a;
|
|
14736
14909
|
const { className = "", settings, orgId, componentId, executeAction } = props;
|
|
14737
14910
|
const state = useWhatsAppState(props);
|
|
14738
|
-
const [activeTab, setActiveTab] =
|
|
14911
|
+
const [activeTab, setActiveTab] = import_react27.default.useState("broadcast");
|
|
14739
14912
|
return /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(
|
|
14740
14913
|
"div",
|
|
14741
14914
|
{
|
|
@@ -15140,18 +15313,18 @@ function WhatsAppComponent(props) {
|
|
|
15140
15313
|
}
|
|
15141
15314
|
|
|
15142
15315
|
// src/components/FormBlock/FormBlock.tsx
|
|
15143
|
-
var
|
|
15316
|
+
var import_react28 = require("react");
|
|
15144
15317
|
var import_lucide_react18 = require("lucide-react");
|
|
15145
15318
|
var import_jsx_runtime28 = require("react/jsx-runtime");
|
|
15146
15319
|
function FormBlock({ settings: schema, executeAction, componentId, className = "", onSuccess }) {
|
|
15147
15320
|
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,
|
|
15321
|
+
const [formData, setFormData] = (0, import_react28.useState)({});
|
|
15322
|
+
const [isSubmitting, setIsSubmitting] = (0, import_react28.useState)(false);
|
|
15323
|
+
const [isSubmitted, setIsSubmitted] = (0, import_react28.useState)(false);
|
|
15324
|
+
const [columns, setColumns] = (0, import_react28.useState)((schema == null ? void 0 : schema.columns) || []);
|
|
15325
|
+
const [isLoadingSchema, setIsLoadingSchema] = (0, import_react28.useState)(false);
|
|
15153
15326
|
const targetTableId = (schema == null ? void 0 : schema.tableMetaId) || (schema == null ? void 0 : schema.tableId) || (schema == null ? void 0 : schema.id);
|
|
15154
|
-
(0,
|
|
15327
|
+
(0, import_react28.useEffect)(() => {
|
|
15155
15328
|
let isMounted = true;
|
|
15156
15329
|
if ((!(schema == null ? void 0 : schema.columns) || schema.columns.length === 0) && targetTableId && executeAction) {
|
|
15157
15330
|
setIsLoadingSchema(true);
|
|
@@ -15317,6 +15490,7 @@ var UNIVERSE_COMPONENTS = {
|
|
|
15317
15490
|
COLUMN_TYPE_LABELS,
|
|
15318
15491
|
ColumnHeaderTitle,
|
|
15319
15492
|
CreateTemplateModal,
|
|
15493
|
+
DEFAULT_FILTER_COLUMN_TYPES,
|
|
15320
15494
|
DEFAULT_PLACEMENT_STATUS_COLORS,
|
|
15321
15495
|
DatePickerCell,
|
|
15322
15496
|
DynamicFiltersBlock,
|
|
@@ -15331,6 +15505,7 @@ var UNIVERSE_COMPONENTS = {
|
|
|
15331
15505
|
RELATION_BUTTON_COUNTS_ACTION,
|
|
15332
15506
|
RELATION_LABEL_KEY,
|
|
15333
15507
|
RELATION_SEP,
|
|
15508
|
+
RESOLVE_DEFAULT_FILTERS_ACTION,
|
|
15334
15509
|
RelationFilterPopover,
|
|
15335
15510
|
RelationPickerCell,
|
|
15336
15511
|
SettingsAndActionsBlock,
|
|
@@ -15351,6 +15526,7 @@ var UNIVERSE_COMPONENTS = {
|
|
|
15351
15526
|
buildRelationRef,
|
|
15352
15527
|
calculateMinColumnWidth,
|
|
15353
15528
|
checkElementTruncation,
|
|
15529
|
+
cleanPlacementFilterDefaults,
|
|
15354
15530
|
cn,
|
|
15355
15531
|
columnRefLabel,
|
|
15356
15532
|
computeFormulaValue,
|
|
@@ -15366,6 +15542,8 @@ var UNIVERSE_COMPONENTS = {
|
|
|
15366
15542
|
formatTimeInput,
|
|
15367
15543
|
formatTimeIso,
|
|
15368
15544
|
generateWhatsAppLink,
|
|
15545
|
+
getColumnDefaultFilter,
|
|
15546
|
+
getDefaultFilterColumns,
|
|
15369
15547
|
getDeterministicPastelBadge,
|
|
15370
15548
|
getEligibleCopyTargets,
|
|
15371
15549
|
getNextVariableIndex,
|
|
@@ -15401,11 +15579,14 @@ var UNIVERSE_COMPONENTS = {
|
|
|
15401
15579
|
renameCopyTarget,
|
|
15402
15580
|
resolveDefaultStatusId,
|
|
15403
15581
|
resolveProtocol,
|
|
15582
|
+
sanitizeDefaultFilter,
|
|
15404
15583
|
sanitizePhoneNumber,
|
|
15405
15584
|
sanitizeTemplateNameInput,
|
|
15406
15585
|
seamlessVariableEngine,
|
|
15407
15586
|
splitHeaderTitle,
|
|
15587
|
+
supportsDefaultFilter,
|
|
15408
15588
|
tableColumns,
|
|
15589
|
+
toColumnFilterValue,
|
|
15409
15590
|
useColumnReorder,
|
|
15410
15591
|
useColumnResize,
|
|
15411
15592
|
useSmartTooltip,
|
|
@@ -15417,5 +15598,6 @@ var UNIVERSE_COMPONENTS = {
|
|
|
15417
15598
|
validateTemplateBody,
|
|
15418
15599
|
validateTemplateButtons,
|
|
15419
15600
|
validateWhatsAppTemplate,
|
|
15420
|
-
validateWordToVariableRatio
|
|
15601
|
+
validateWordToVariableRatio,
|
|
15602
|
+
withDefaultFilter
|
|
15421
15603
|
});
|