@universe-platform/ui 0.1.0-beta.34 → 0.1.0-beta.35

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