@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.mjs CHANGED
@@ -1064,8 +1064,57 @@ function getRelationButtonColumns(columns) {
1064
1064
  return (columns || []).filter((c) => isRelationButtonsColumn(c) && c.name !== "_id");
1065
1065
  }
1066
1066
 
1067
+ // ../shared/src/defaultFilters.ts
1068
+ var DEFAULT_FILTER_COLUMN_TYPES = ["STRING", "RELATION"];
1069
+ var RESOLVE_DEFAULT_FILTERS_ACTION = "RESOLVE_DEFAULT_FILTERS";
1070
+ var isString = (v) => typeof v === "string";
1071
+ function supportsDefaultFilter(type) {
1072
+ if (!type) return false;
1073
+ return DEFAULT_FILTER_COLUMN_TYPES.includes(String(type).toUpperCase());
1074
+ }
1075
+ function sanitizeDefaultFilter(raw) {
1076
+ if (!raw || typeof raw !== "object") return null;
1077
+ const value = raw.value;
1078
+ if (!isString(value) || value.trim() === "") return null;
1079
+ const label = raw.label;
1080
+ return __spreadValues({ value: value.trim() }, isString(label) && label.trim() ? { label: label.trim() } : {});
1081
+ }
1082
+ function getColumnDefaultFilter(col) {
1083
+ var _a;
1084
+ if (!col || !supportsDefaultFilter(col.type)) return null;
1085
+ return sanitizeDefaultFilter((_a = col.config) == null ? void 0 : _a.defaultFilter);
1086
+ }
1087
+ function getDefaultFilterColumns(columns) {
1088
+ const out = [];
1089
+ for (const c of columns || []) {
1090
+ if (!(c == null ? void 0 : c.name) || c.name === "_id") continue;
1091
+ const setting = getColumnDefaultFilter(c);
1092
+ if (setting) out.push({ name: c.name, type: String(c.type).toUpperCase(), setting });
1093
+ }
1094
+ return out;
1095
+ }
1096
+ function toColumnFilterValue(type, value) {
1097
+ return String(type).toUpperCase() === "RELATION" ? [value] : value;
1098
+ }
1099
+ function withDefaultFilter(config, type, setting) {
1100
+ const next = __spreadValues({}, config || {});
1101
+ const clean = supportsDefaultFilter(type) ? sanitizeDefaultFilter(setting) : null;
1102
+ if (clean) next.defaultFilter = clean;
1103
+ else delete next.defaultFilter;
1104
+ return next;
1105
+ }
1106
+ function cleanPlacementFilterDefaults(defaults, allowedKeys) {
1107
+ if (!defaults || typeof defaults !== "object") return void 0;
1108
+ const out = {};
1109
+ for (const key of allowedKeys) {
1110
+ const v = defaults[key];
1111
+ if (key && isString(v) && v.trim() !== "") out[key] = v;
1112
+ }
1113
+ return Object.keys(out).length > 0 ? out : void 0;
1114
+ }
1115
+
1067
1116
  // src/components/TableBlock/TableBlockClient.tsx
1068
- import React13, { useState as useState14, useMemo as useMemo7, useEffect as useEffect12, useCallback as useCallback12, useRef as useRef12 } from "react";
1117
+ import React13, { useState as useState15, useMemo as useMemo7, useEffect as useEffect13, useCallback as useCallback12, useRef as useRef13 } from "react";
1069
1118
 
1070
1119
  // src/hooks/useToast.ts
1071
1120
  import { useContext as useContext2 } from "react";
@@ -6106,6 +6155,49 @@ function RelationButtonsBar({
6106
6155
  );
6107
6156
  }
6108
6157
 
6158
+ // src/components/TableBlock/useDefaultColumnFilters.ts
6159
+ import { useEffect as useEffect12, useRef as useRef12, useState as useState14 } from "react";
6160
+ var RESOLVE_TIMEOUT_MS = 8e3;
6161
+ function unwrap2(res) {
6162
+ const body = (res == null ? void 0 : res.data) && typeof res.data === "object" && !Array.isArray(res.data) ? res.data : res;
6163
+ const filters = body == null ? void 0 : body.filters;
6164
+ return filters && typeof filters === "object" ? filters : {};
6165
+ }
6166
+ function useDefaultColumnFilters({ columns, tableId, executeAction, onResolved }) {
6167
+ const hasDefaults = getDefaultFilterColumns(columns).length > 0;
6168
+ const [ready, setReady] = useState14(() => !hasDefaults);
6169
+ const doneRef = useRef12(false);
6170
+ const onResolvedRef = useRef12(onResolved);
6171
+ onResolvedRef.current = onResolved;
6172
+ const actionRef = useRef12(executeAction);
6173
+ actionRef.current = executeAction;
6174
+ useEffect12(() => {
6175
+ if (doneRef.current || !hasDefaults) return;
6176
+ doneRef.current = true;
6177
+ const exec = actionRef.current;
6178
+ if (!tableId || !exec) {
6179
+ setReady(true);
6180
+ return;
6181
+ }
6182
+ let settled = false;
6183
+ const finish = (filters) => {
6184
+ if (settled) return;
6185
+ settled = true;
6186
+ if (filters && Object.keys(filters).length > 0) onResolvedRef.current(filters);
6187
+ setReady(true);
6188
+ };
6189
+ const timer = setTimeout(() => finish(), RESOLVE_TIMEOUT_MS);
6190
+ Promise.resolve(exec(RESOLVE_DEFAULT_FILTERS_ACTION, { tableId })).then(
6191
+ (res) => finish(unwrap2(res)),
6192
+ (err) => {
6193
+ console.warn("[TableBlock] Failed to resolve default filters:", err);
6194
+ finish();
6195
+ }
6196
+ ).finally(() => clearTimeout(timer));
6197
+ }, [hasDefaults, tableId]);
6198
+ return ready;
6199
+ }
6200
+
6109
6201
  // src/components/TableBlock/TableBlockClient.tsx
6110
6202
  import { jsx as jsx15, jsxs as jsxs13 } from "react/jsx-runtime";
6111
6203
  function TableBlockClient({
@@ -6134,7 +6226,7 @@ function TableBlockClient({
6134
6226
  hideRelationButtons
6135
6227
  }) {
6136
6228
  const { showError, addToast } = useToast();
6137
- const [isExporting, setIsExporting] = useState14(false);
6229
+ const [isExporting, setIsExporting] = useState15(false);
6138
6230
  const resolvedRole = role ? getRolePermissions(role) : void 0;
6139
6231
  const effectivePermissions = permissions || (resolvedRole == null ? void 0 : resolvedRole.permissions) || {
6140
6232
  canCreate: !readOnly,
@@ -6153,18 +6245,18 @@ function TableBlockClient({
6153
6245
  return calculateMinColumnWidth(colName, false, col == null ? void 0 : col.type);
6154
6246
  }
6155
6247
  });
6156
- const executeActionRef = useRef12(executeAction);
6157
- useEffect12(() => {
6248
+ const executeActionRef = useRef13(executeAction);
6249
+ useEffect13(() => {
6158
6250
  executeActionRef.current = executeAction;
6159
6251
  }, [executeAction]);
6160
- const [isMounted, setIsMounted] = useState14(false);
6161
- const [isInitialLoading, setIsInitialLoading] = useState14(true);
6162
- const [page, setPage] = useState14(1);
6163
- const [limit, setLimit] = useState14(50);
6164
- const [totalRecords, setTotalRecords] = useState14(0);
6165
- const [totalPages, setTotalPages] = useState14(1);
6166
- const [showSummary, setShowSummary] = useState14(false);
6167
- useEffect12(() => {
6252
+ const [isMounted, setIsMounted] = useState15(false);
6253
+ const [isInitialLoading, setIsInitialLoading] = useState15(true);
6254
+ const [page, setPage] = useState15(1);
6255
+ const [limit, setLimit] = useState15(50);
6256
+ const [totalRecords, setTotalRecords] = useState15(0);
6257
+ const [totalPages, setTotalPages] = useState15(1);
6258
+ const [showSummary, setShowSummary] = useState15(false);
6259
+ useEffect13(() => {
6168
6260
  if (typeof window !== "undefined") {
6169
6261
  const savedSummary = localStorage.getItem(`table_summary_${tableKey}`);
6170
6262
  if (savedSummary !== null) {
@@ -6233,15 +6325,15 @@ function TableBlockClient({
6233
6325
  return ((_a = a.order) != null ? _a : 0) - ((_b = b.order) != null ? _b : 0);
6234
6326
  });
6235
6327
  }, []);
6236
- const [localColumns, setLocalColumns] = useState14(() => (schema == null ? void 0 : schema.columns) || []);
6237
- useEffect12(() => {
6328
+ const [localColumns, setLocalColumns] = useState15(() => (schema == null ? void 0 : schema.columns) || []);
6329
+ useEffect13(() => {
6238
6330
  if ((schema == null ? void 0 : schema.columns) && schema.columns.length > 0) {
6239
6331
  setLocalColumns((prev) => mergeColumnDefs(prev, schema.columns));
6240
6332
  }
6241
6333
  }, [schema == null ? void 0 : schema.columns, mergeColumnDefs]);
6242
- const [dirty, setDirty] = useState14({ added: [], modified: {}, deleted: [] });
6243
- const dirtyRef = useRef12(dirty);
6244
- useEffect12(() => {
6334
+ const [dirty, setDirty] = useState15({ added: [], modified: {}, deleted: [] });
6335
+ const dirtyRef = useRef13(dirty);
6336
+ useEffect13(() => {
6245
6337
  dirtyRef.current = dirty;
6246
6338
  }, [dirty]);
6247
6339
  const mergeWithDirty = useCallback12((baseRecords) => {
@@ -6257,8 +6349,8 @@ function TableBlockClient({
6257
6349
  const uniqueAdded = added.filter((r) => !baseIds.has(r.id));
6258
6350
  return [...uniqueAdded, ...modifiedRecords];
6259
6351
  }, []);
6260
- const [data, setData] = useState14(() => normalizeRecords(initialRecords));
6261
- const [serverRecords, setServerRecords] = useState14(() => normalizeRecords(initialRecords));
6352
+ const [data, setData] = useState15(() => normalizeRecords(initialRecords));
6353
+ const [serverRecords, setServerRecords] = useState15(() => normalizeRecords(initialRecords));
6262
6354
  const filteredData = data;
6263
6355
  const isEqualValues = (a, b) => {
6264
6356
  if (a === b) return true;
@@ -6270,29 +6362,29 @@ function TableBlockClient({
6270
6362
  }
6271
6363
  return false;
6272
6364
  };
6273
- const [baseRecordsMap, setBaseRecordsMap] = useState14(() => {
6365
+ const [baseRecordsMap, setBaseRecordsMap] = useState15(() => {
6274
6366
  const map = /* @__PURE__ */ new Map();
6275
6367
  (normalizeRecords(initialRecords) || []).forEach((r) => map.set(r.id, __spreadValues({}, r.data)));
6276
6368
  return map;
6277
6369
  });
6278
- useEffect12(() => {
6370
+ useEffect13(() => {
6279
6371
  if (initialRecords && initialRecords.length > 0) {
6280
6372
  const map = /* @__PURE__ */ new Map();
6281
6373
  (normalizeRecords(initialRecords) || []).forEach((r) => map.set(r.id, __spreadValues({}, r.data)));
6282
6374
  setBaseRecordsMap(map);
6283
6375
  }
6284
6376
  }, [initialRecords]);
6285
- const [searchQuery, setSearchQuery] = useState14("");
6286
- const [columnFilters, setColumnFilters] = useState14({});
6287
- const [activeSearchCol, setActiveSearchCol] = useState14(null);
6288
- const activeSearchRef = useRef12(null);
6289
- const [activeRelationCol, setActiveRelationCol] = useState14(null);
6290
- const [relationTriggerRect, setRelationTriggerRect] = useState14(null);
6291
- const filterButtonRefs = useRef12({});
6292
- const [relationOptions, setRelationOptions] = useState14({});
6293
- const [relationFilterOptions, setRelationFilterOptions] = useState14({});
6294
- const [loadingFilterCol, setLoadingFilterCol] = useState14(null);
6295
- const relationDictionaryRef = useRef12({});
6377
+ const [searchQuery, setSearchQuery] = useState15("");
6378
+ const [columnFilters, setColumnFilters] = useState15({});
6379
+ const [activeSearchCol, setActiveSearchCol] = useState15(null);
6380
+ const activeSearchRef = useRef13(null);
6381
+ const [activeRelationCol, setActiveRelationCol] = useState15(null);
6382
+ const [relationTriggerRect, setRelationTriggerRect] = useState15(null);
6383
+ const filterButtonRefs = useRef13({});
6384
+ const [relationOptions, setRelationOptions] = useState15({});
6385
+ const [relationFilterOptions, setRelationFilterOptions] = useState15({});
6386
+ const [loadingFilterCol, setLoadingFilterCol] = useState15(null);
6387
+ const relationDictionaryRef = useRef13({});
6296
6388
  const mergeRelationOptions = useCallback12((colName, newOptions) => {
6297
6389
  if (!Array.isArray(newOptions) || newOptions.length === 0) return;
6298
6390
  if (!relationDictionaryRef.current[colName]) {
@@ -6316,7 +6408,7 @@ function TableBlockClient({
6316
6408
  }));
6317
6409
  }
6318
6410
  }, []);
6319
- useEffect12(() => {
6411
+ useEffect13(() => {
6320
6412
  if (!activeSearchCol) return;
6321
6413
  const handleMouseDown = (e) => {
6322
6414
  if (activeSearchRef.current && !activeSearchRef.current.contains(e.target)) {
@@ -6337,23 +6429,29 @@ function TableBlockClient({
6337
6429
  });
6338
6430
  return JSON.stringify(active);
6339
6431
  }, [columnFilters]);
6340
- const [debouncedSearch, setDebouncedSearch] = useState14(searchQuery);
6341
- useEffect12(() => {
6432
+ const defaultFiltersReady = useDefaultColumnFilters({
6433
+ columns: localColumns,
6434
+ tableId: (schema == null ? void 0 : schema.tableMetaId) || (schema == null ? void 0 : schema.tableId) || (schema == null ? void 0 : schema.id),
6435
+ executeAction,
6436
+ onResolved: (resolved) => setColumnFilters((prev) => __spreadValues(__spreadValues({}, resolved), prev))
6437
+ });
6438
+ const [debouncedSearch, setDebouncedSearch] = useState15(searchQuery);
6439
+ useEffect13(() => {
6342
6440
  const timer = setTimeout(() => {
6343
6441
  setDebouncedSearch(searchQuery.trim());
6344
6442
  }, 300);
6345
6443
  return () => clearTimeout(timer);
6346
6444
  }, [searchQuery]);
6347
- const isSearchMountedRef = useRef12(false);
6348
- useEffect12(() => {
6445
+ const isSearchMountedRef = useRef13(false);
6446
+ useEffect13(() => {
6349
6447
  if (!isSearchMountedRef.current) {
6350
6448
  isSearchMountedRef.current = true;
6351
6449
  return;
6352
6450
  }
6353
6451
  setPage(1);
6354
6452
  }, [debouncedSearch]);
6355
- const [isFetching, setIsFetching] = useState14(false);
6356
- const fetchRequestIdRef = useRef12(0);
6453
+ const [isFetching, setIsFetching] = useState15(false);
6454
+ const fetchRequestIdRef = useRef13(0);
6357
6455
  const fetchTableData = useCallback12((targetPage, targetLimit, targetSearch, targetFiltersKey) => {
6358
6456
  const tableId = (schema == null ? void 0 : schema.tableMetaId) || (schema == null ? void 0 : schema.tableId) || (schema == null ? void 0 : schema.id);
6359
6457
  const action = executeActionRef.current;
@@ -6478,11 +6576,12 @@ function TableBlockClient({
6478
6576
  }
6479
6577
  });
6480
6578
  }, [schema == null ? void 0 : schema.tableMetaId, schema == null ? void 0 : schema.tableId, schema == null ? void 0 : schema.id, mergeColumnDefs, mergeWithDirty, mergeRelationOptions]);
6481
- useEffect12(() => {
6579
+ useEffect13(() => {
6580
+ if (!defaultFiltersReady) return;
6482
6581
  fetchTableData(page, limit, debouncedSearch, filtersKey);
6483
- }, [page, limit, debouncedSearch, filtersKey, fetchTableData]);
6484
- useEffect12(() => {
6485
- if (initialRecords) {
6582
+ }, [page, limit, debouncedSearch, filtersKey, fetchTableData, defaultFiltersReady]);
6583
+ useEffect13(() => {
6584
+ if (initialRecords && defaultFiltersReady) {
6486
6585
  const norm = normalizeRecords(initialRecords);
6487
6586
  setServerRecords(norm);
6488
6587
  const hasActiveFilters = Boolean(debouncedSearch) || Object.keys(columnFilters).length > 0;
@@ -6543,7 +6642,7 @@ function TableBlockClient({
6543
6642
  setData(mergeWithDirty(norm));
6544
6643
  }
6545
6644
  }
6546
- }, [initialRecords, mergeWithDirty, debouncedSearch, columnFilters, fetchTableData, page, limit, filtersKey]);
6645
+ }, [initialRecords, mergeWithDirty, debouncedSearch, columnFilters, fetchTableData, page, limit, filtersKey, defaultFiltersReady]);
6547
6646
  const refetchTableData = useCallback12(() => {
6548
6647
  return fetchTableData(page, limit, debouncedSearch, filtersKey);
6549
6648
  }, [page, limit, debouncedSearch, filtersKey, fetchTableData]);
@@ -6572,9 +6671,9 @@ function TableBlockClient({
6572
6671
  const handleNextPage = () => {
6573
6672
  setPage((prev) => Math.min(totalPages, prev + 1));
6574
6673
  };
6575
- const [selectedIds, setSelectedIds] = useState14(/* @__PURE__ */ new Set());
6576
- const isExternalSyncRef = useRef12(false);
6577
- useEffect12(() => {
6674
+ const [selectedIds, setSelectedIds] = useState15(/* @__PURE__ */ new Set());
6675
+ const isExternalSyncRef = useRef13(false);
6676
+ useEffect13(() => {
6578
6677
  if (selectedRowIds !== void 0) {
6579
6678
  const nextSet = new Set(selectedRowIds);
6580
6679
  setSelectedIds((prev) => {
@@ -6586,8 +6685,8 @@ function TableBlockClient({
6586
6685
  });
6587
6686
  }
6588
6687
  }, [selectedRowIds]);
6589
- const isFirstSelectionChangeRef = useRef12(true);
6590
- useEffect12(() => {
6688
+ const isFirstSelectionChangeRef = useRef13(true);
6689
+ useEffect13(() => {
6591
6690
  if (isFirstSelectionChangeRef.current) {
6592
6691
  isFirstSelectionChangeRef.current = false;
6593
6692
  if (selectedIds.size === 0) return;
@@ -6598,11 +6697,11 @@ function TableBlockClient({
6598
6697
  }
6599
6698
  onSelectionChange == null ? void 0 : onSelectionChange(Array.from(selectedIds));
6600
6699
  }, [selectedIds, onSelectionChange]);
6601
- const [pendingDeletions, setPendingDeletions] = useState14([]);
6602
- const [isSaving, setIsSaving] = useState14(false);
6700
+ const [pendingDeletions, setPendingDeletions] = useState15([]);
6701
+ const [isSaving, setIsSaving] = useState15(false);
6603
6702
  const isUpdatingActive = Boolean(isUpdating || isSaving);
6604
- const [isSaveSuccess, setIsSaveSuccess] = useState14(false);
6605
- const [expandedRowIds, setExpandedRowIds] = useState14(/* @__PURE__ */ new Set());
6703
+ const [isSaveSuccess, setIsSaveSuccess] = useState15(false);
6704
+ const [expandedRowIds, setExpandedRowIds] = useState15(/* @__PURE__ */ new Set());
6606
6705
  const schemaColsString = useMemo7(() => JSON.stringify(localColumns || []), [localColumns]);
6607
6706
  const refetchRelation = useCallback12(async (colName, params) => {
6608
6707
  var _a, _b, _c, _d, _e, _f, _g;
@@ -6679,8 +6778,8 @@ function TableBlockClient({
6679
6778
  setLoadingFilterCol(null);
6680
6779
  }
6681
6780
  }, [schemaColsString, schema == null ? void 0 : schema.tableMetaId, schema == null ? void 0 : schema.tableId, schema == null ? void 0 : schema.id, executeAction, mergeRelationOptions]);
6682
- const requestedRelationIdsRef = useRef12({});
6683
- useEffect12(() => {
6781
+ const requestedRelationIdsRef = useRef13({});
6782
+ useEffect13(() => {
6684
6783
  if (!executeAction || !data || data.length === 0) return;
6685
6784
  let parsedCols = [];
6686
6785
  try {
@@ -6733,7 +6832,7 @@ function TableBlockClient({
6733
6832
  }
6734
6833
  });
6735
6834
  }, [data, schemaColsString, executeAction, relationOptions, mergeRelationOptions]);
6736
- useEffect12(() => {
6835
+ useEffect13(() => {
6737
6836
  let parsedCols = [];
6738
6837
  try {
6739
6838
  parsedCols = JSON.parse(schemaColsString);
@@ -6769,9 +6868,9 @@ function TableBlockClient({
6769
6868
  const systemFields = ["_id", "createdAt", "updatedAt", "orgId", "tableId"];
6770
6869
  return normalizedColumns.filter((col) => !systemFields.includes(col.name));
6771
6870
  }, [normalizedColumns]);
6772
- const [isColumnsDropdownOpen, setIsColumnsDropdownOpen] = useState14(false);
6773
- const dropdownRef = useRef12(null);
6774
- useEffect12(() => {
6871
+ const [isColumnsDropdownOpen, setIsColumnsDropdownOpen] = useState15(false);
6872
+ const dropdownRef = useRef13(null);
6873
+ useEffect13(() => {
6775
6874
  const handleClickOutside = (e) => {
6776
6875
  if (dropdownRef.current && !dropdownRef.current.contains(e.target)) {
6777
6876
  setIsColumnsDropdownOpen(false);
@@ -8034,7 +8133,7 @@ function ExpandedSubTables({
8034
8133
  context
8035
8134
  }) {
8036
8135
  var _a;
8037
- const [activeTab, setActiveTab] = useState14((_a = subTableColumns[0]) == null ? void 0 : _a.name);
8136
+ const [activeTab, setActiveTab] = useState15((_a = subTableColumns[0]) == null ? void 0 : _a.name);
8038
8137
  if (subTableColumns.length === 0) return null;
8039
8138
  if (subTableColumns.length === 1) {
8040
8139
  const stCol = subTableColumns[0];
@@ -8263,7 +8362,7 @@ function TableBlock(props) {
8263
8362
  }
8264
8363
 
8265
8364
  // src/components/PlacementBlock/PlacementBlock.tsx
8266
- import { useState as useState15, useEffect as useEffect13, useRef as useRef13, useCallback as useCallback13, useMemo as useMemo9 } from "react";
8365
+ import { useState as useState16, useEffect as useEffect14, useRef as useRef14, useCallback as useCallback13, useMemo as useMemo9 } from "react";
8267
8366
  import { AgGridReact } from "ag-grid-react";
8268
8367
  import {
8269
8368
  ModuleRegistry,
@@ -8763,6 +8862,43 @@ var PlacementRelationButtons = ({
8763
8862
  );
8764
8863
  };
8765
8864
 
8865
+ // src/components/PlacementBlock/placementDefaultFilters.ts
8866
+ function getPlacementFilterRefs(config) {
8867
+ const defined = Array.isArray(config == null ? void 0 : config.filterFields) ? config.filterFields : [];
8868
+ const legacy = [config == null ? void 0 : config.targetFilterField1Id, config == null ? void 0 : config.targetFilterField2Id].filter(Boolean);
8869
+ return (defined.length > 0 ? defined : legacy).filter((r) => typeof r === "string" && r);
8870
+ }
8871
+ function resolveFilterColName(ref, targetColumns) {
8872
+ const direct = (targetColumns || []).find((c) => (c == null ? void 0 : c.id) === ref || (c == null ? void 0 : c.name) === ref);
8873
+ if (direct) return direct.name;
8874
+ const { relationColumn } = parseColumnRef(ref);
8875
+ if (relationColumn) {
8876
+ const rel = (targetColumns || []).find(
8877
+ (c) => (c == null ? void 0 : c.name) === relationColumn && String(c == null ? void 0 : c.type).toUpperCase() === "RELATION"
8878
+ );
8879
+ if (rel) return rel.name;
8880
+ }
8881
+ return ref;
8882
+ }
8883
+ function computePlacementDefaultFilters(args) {
8884
+ const { refs, defaults, targetColumns, rows, getText } = args;
8885
+ const applied = {};
8886
+ if (!defaults) return applied;
8887
+ for (const ref of refs) {
8888
+ const want = defaults[ref];
8889
+ if (typeof want !== "string" || want === "") continue;
8890
+ const colName = resolveFilterColName(ref, targetColumns);
8891
+ if (colName in applied) continue;
8892
+ const validRows = rows.filter(
8893
+ (r) => Object.entries(applied).every(([name, value]) => getText(name, r.data) === value)
8894
+ );
8895
+ if (validRows.some((r) => getText(colName, r.data) === want)) {
8896
+ applied[colName] = want;
8897
+ }
8898
+ }
8899
+ return applied;
8900
+ }
8901
+
8766
8902
  // src/components/PlacementBlock/PlacementBlock.tsx
8767
8903
  import { jsx as jsx19, jsxs as jsxs16 } from "react/jsx-runtime";
8768
8904
  ModuleRegistry.registerModules([AllCommunityModule]);
@@ -8840,7 +8976,7 @@ var CheckHeader = (props) => /* @__PURE__ */ jsx19("div", { className: "flex ite
8840
8976
  }
8841
8977
  ) });
8842
8978
  var RelationFilterHeader = (props) => {
8843
- const btnRef = useRef13(null);
8979
+ const btnRef = useRef14(null);
8844
8980
  return /* @__PURE__ */ jsxs16("div", { className: "flex flex-col items-center justify-center w-full min-w-0 leading-tight select-none", title: props.displayName, children: [
8845
8981
  /* @__PURE__ */ jsx19(
8846
8982
  "button",
@@ -8888,30 +9024,30 @@ var PlacementBlock = (props) => {
8888
9024
  const targetTableId = config == null ? void 0 : config.targetTableId;
8889
9025
  const displayField = (config == null ? void 0 : config.sourceDisplayFieldId) || "name";
8890
9026
  const assignmentField = config == null ? void 0 : config.targetAssignmentFieldId;
8891
- const executeActionRef = useRef13(executeAction);
9027
+ const executeActionRef = useRef14(executeAction);
8892
9028
  executeActionRef.current = executeAction;
8893
- const legacyRef = useRef13({ fetchSourceData, fetchTargetData, updateAssignment });
9029
+ const legacyRef = useRef14({ fetchSourceData, fetchTargetData, updateAssignment });
8894
9030
  legacyRef.current = { fetchSourceData, fetchTargetData, updateAssignment };
8895
- const [sourceRows, setSourceRows] = useState15([]);
8896
- const [sourceColumns, setSourceColumns] = useState15([]);
8897
- const [sourceRelOptions, setSourceRelOptions] = useState15({});
8898
- const [sourceRelFilters, setSourceRelFilters] = useState15({});
8899
- const [targetRows, setTargetRows] = useState15([]);
8900
- const [targetColumns, setTargetColumns] = useState15([]);
8901
- const [targetRelOptions, setTargetRelOptions] = useState15({});
8902
- const [selectedTargetId, setSelectedTargetId] = useState15("");
8903
- const [candidateIds, setCandidateIds] = useState15([]);
8904
- const [checkedIds, setCheckedIds] = useState15([]);
8905
- const [isSaving, setIsSaving] = useState15(false);
8906
- const [sourceSearch, setSourceSearch] = useState15("");
8907
- const [candidateSearch, setCandidateSearch] = useState15("");
8908
- const [statusMap, setStatusMap] = useState15({});
8909
- const [isLoading, setIsLoading] = useState15(false);
8910
- const [loadError, setLoadError] = useState15(null);
8911
- const [saveError, setSaveError] = useState15(null);
8912
- const [colFilters, setColFilters] = useState15({ source: {}, cand: {} });
8913
- const [filterPopover, setFilterPopover] = useState15(null);
8914
- const [targetFilters, setTargetFilters] = useState15({});
9031
+ const [sourceRows, setSourceRows] = useState16([]);
9032
+ const [sourceColumns, setSourceColumns] = useState16([]);
9033
+ const [sourceRelOptions, setSourceRelOptions] = useState16({});
9034
+ const [sourceRelFilters, setSourceRelFilters] = useState16({});
9035
+ const [targetRows, setTargetRows] = useState16([]);
9036
+ const [targetColumns, setTargetColumns] = useState16([]);
9037
+ const [targetRelOptions, setTargetRelOptions] = useState16({});
9038
+ const [selectedTargetId, setSelectedTargetId] = useState16("");
9039
+ const [candidateIds, setCandidateIds] = useState16([]);
9040
+ const [checkedIds, setCheckedIds] = useState16([]);
9041
+ const [isSaving, setIsSaving] = useState16(false);
9042
+ const [sourceSearch, setSourceSearch] = useState16("");
9043
+ const [candidateSearch, setCandidateSearch] = useState16("");
9044
+ const [statusMap, setStatusMap] = useState16({});
9045
+ const [isLoading, setIsLoading] = useState16(false);
9046
+ const [loadError, setLoadError] = useState16(null);
9047
+ const [saveError, setSaveError] = useState16(null);
9048
+ const [colFilters, setColFilters] = useState16({ source: {}, cand: {} });
9049
+ const [filterPopover, setFilterPopover] = useState16(null);
9050
+ const [targetFilters, setTargetFilters] = useState16({});
8915
9051
  const loadTable = useCallback13(async (tableId, kind) => {
8916
9052
  const exec = executeActionRef.current;
8917
9053
  if (exec) {
@@ -8925,7 +9061,7 @@ var PlacementBlock = (props) => {
8925
9061
  }
8926
9062
  throw new Error("executeAction \u05DC\u05D0 \u05D4\u05D5\u05E2\u05D1\u05E8 \u05DC\u05E8\u05DB\u05D9\u05D1 \u05D4\u05E9\u05D9\u05D1\u05D5\u05E5");
8927
9063
  }, []);
8928
- useEffect13(() => {
9064
+ useEffect14(() => {
8929
9065
  if (!sourceTableId || !targetTableId) return;
8930
9066
  let cancelled = false;
8931
9067
  (async () => {
@@ -9061,7 +9197,7 @@ var PlacementBlock = (props) => {
9061
9197
  });
9062
9198
  });
9063
9199
  }, [targetRows, targetFilters, filterColumns, displayValue]);
9064
- useEffect13(() => {
9200
+ useEffect14(() => {
9065
9201
  if (filteredTargetRows.length > 0) {
9066
9202
  if (!selectedTargetId || !filteredTargetRows.some((r) => r.id === selectedTargetId)) {
9067
9203
  setSelectedTargetId(filteredTargetRows[0].id);
@@ -9070,6 +9206,22 @@ var PlacementBlock = (props) => {
9070
9206
  setSelectedTargetId("");
9071
9207
  }
9072
9208
  }, [filteredTargetRows, selectedTargetId]);
9209
+ const appliedDefaultsKeyRef = useRef14("");
9210
+ useEffect14(() => {
9211
+ const defaults = config == null ? void 0 : config.targetFilterDefaults;
9212
+ if (isLoading || !defaults || targetRows.length === 0 || targetColumns.length === 0) return;
9213
+ const key = `${targetTableId}|${JSON.stringify(defaults)}`;
9214
+ if (appliedDefaultsKeyRef.current === key) return;
9215
+ appliedDefaultsKeyRef.current = key;
9216
+ const resolved = computePlacementDefaultFilters({
9217
+ refs: getPlacementFilterRefs(config),
9218
+ defaults,
9219
+ targetColumns,
9220
+ rows: targetRows,
9221
+ getText: (colName, data) => displayValue(targetColumns.find((c) => c.name === colName) || { name: colName }, readColumnValue(data, colName))
9222
+ });
9223
+ if (Object.keys(resolved).length > 0) setTargetFilters((prev) => __spreadValues(__spreadValues({}, resolved), prev));
9224
+ }, [config, isLoading, targetRows, targetColumns, targetTableId, displayValue]);
9073
9225
  const assignmentColumn = useMemo9(() => targetColumns.find((c) => c.name === assignmentField), [targetColumns, assignmentField]);
9074
9226
  const isRelationField = ((_b = assignmentColumn == null ? void 0 : assignmentColumn.type) == null ? void 0 : _b.toUpperCase()) === "RELATION";
9075
9227
  const assignmentLabel = (assignmentColumn == null ? void 0 : assignmentColumn.label) || (assignmentColumn == null ? void 0 : assignmentColumn.name) || assignmentField || "";
@@ -9088,9 +9240,9 @@ var PlacementBlock = (props) => {
9088
9240
  }).filter((id) => !!id && sourceRows.some((s) => s.id === id));
9089
9241
  return Array.from(new Set(ids));
9090
9242
  }, [selectedTargetId, targetRows, sourceRows, assignmentField, isRelationField, nameOf]);
9091
- const assignedIdsRef = useRef13(assignedIds);
9243
+ const assignedIdsRef = useRef14(assignedIds);
9092
9244
  assignedIdsRef.current = assignedIds;
9093
- useEffect13(() => {
9245
+ useEffect14(() => {
9094
9246
  setCandidateIds(assignedIdsRef.current);
9095
9247
  setCheckedIds(assignedIdsRef.current);
9096
9248
  }, [selectedTargetId, sourceRows]);
@@ -9137,9 +9289,9 @@ var PlacementBlock = (props) => {
9137
9289
  setCheckedIds((prev) => prev.filter((x) => x !== id));
9138
9290
  setStatusMap((prev) => __spreadProps(__spreadValues({}, prev), { [id]: defaultStatusId }));
9139
9291
  }, [defaultStatusId]);
9140
- const moveToCandidatesRef = useRef13(moveToCandidates);
9292
+ const moveToCandidatesRef = useRef14(moveToCandidates);
9141
9293
  moveToCandidatesRef.current = moveToCandidates;
9142
- const moveToSourceRef = useRef13(moveToSource);
9294
+ const moveToSourceRef = useRef14(moveToSource);
9143
9295
  moveToSourceRef.current = moveToSource;
9144
9296
  const toggleChecked = useCallback13((id) => {
9145
9297
  setCheckedIds((prev) => prev.includes(id) ? prev.filter((x) => x !== id) : [...prev, id]);
@@ -9264,11 +9416,11 @@ var PlacementBlock = (props) => {
9264
9416
  [filterPopover, sourceColumns]
9265
9417
  );
9266
9418
  const getRowId = useCallback13((p) => p.data.id, []);
9267
- const sourceContainerRef = useRef13(null);
9268
- const assignedContainerRef = useRef13(null);
9269
- const [sourceApi, setSourceApi] = useState15(null);
9270
- const [assignedApi, setAssignedApi] = useState15(null);
9271
- useEffect13(() => {
9419
+ const sourceContainerRef = useRef14(null);
9420
+ const assignedContainerRef = useRef14(null);
9421
+ const [sourceApi, setSourceApi] = useState16(null);
9422
+ const [assignedApi, setAssignedApi] = useState16(null);
9423
+ useEffect14(() => {
9272
9424
  if (!sourceApi || !assignedApi) return;
9273
9425
  const toAssigned = { getContainer: () => assignedContainerRef.current, onDragStop: (p) => {
9274
9426
  var _a2, _b2;
@@ -9471,7 +9623,7 @@ import React20 from "react";
9471
9623
  import { CheckCircle2 as CheckCircle24, AlertCircle as AlertCircle5, X as X12, Loader2 as Loader28, Phone as Phone4, Send as Send3, Image as ImageIcon3, FileText as FileText4, Video as Video3 } from "lucide-react";
9472
9624
 
9473
9625
  // src/components/WhatsAppComponent/CreateTemplateModal.tsx
9474
- import { useState as useState16, useEffect as useEffect14, useRef as useRef14, useMemo as useMemo10 } from "react";
9626
+ import { useState as useState17, useEffect as useEffect15, useRef as useRef15, useMemo as useMemo10 } from "react";
9475
9627
  import {
9476
9628
  X as X9,
9477
9629
  Plus,
@@ -9624,26 +9776,26 @@ function CreateTemplateModal({
9624
9776
  executeAction,
9625
9777
  orgId
9626
9778
  }) {
9627
- const [templateName, setTemplateName] = useState16("");
9628
- const [language, setLanguage] = useState16("he");
9629
- const [category, setCategory] = useState16("MARKETING");
9630
- const [bodyText, setBodyText] = useState16("");
9631
- const [variableSamples, setVariableSamples] = useState16({});
9632
- const [hasFileHeader, setHasFileHeader] = useState16(false);
9633
- const [selectedFile, setSelectedFile] = useState16(null);
9634
- const [fileBase64, setFileBase64] = useState16("");
9635
- const [buttons, setButtons] = useState16([]);
9636
- const [isAddButtonOpen, setIsAddButtonOpen] = useState16(false);
9637
- const addButtonDropdownRef = useRef14(null);
9638
- const [isSubmitting, setIsSubmitting] = useState16(false);
9639
- const [submittingStep, setSubmittingStep] = useState16("");
9640
- const [submitError, setSubmitError] = useState16(null);
9641
- const [fileError, setFileError] = useState16(null);
9642
- const textareaRef = useRef14(null);
9643
- const fileInputRef = useRef14(null);
9644
- const emojiPickerRef = useRef14(null);
9645
- const [isEmojiPickerOpen, setIsEmojiPickerOpen] = useState16(false);
9646
- useEffect14(() => {
9779
+ const [templateName, setTemplateName] = useState17("");
9780
+ const [language, setLanguage] = useState17("he");
9781
+ const [category, setCategory] = useState17("MARKETING");
9782
+ const [bodyText, setBodyText] = useState17("");
9783
+ const [variableSamples, setVariableSamples] = useState17({});
9784
+ const [hasFileHeader, setHasFileHeader] = useState17(false);
9785
+ const [selectedFile, setSelectedFile] = useState17(null);
9786
+ const [fileBase64, setFileBase64] = useState17("");
9787
+ const [buttons, setButtons] = useState17([]);
9788
+ const [isAddButtonOpen, setIsAddButtonOpen] = useState17(false);
9789
+ const addButtonDropdownRef = useRef15(null);
9790
+ const [isSubmitting, setIsSubmitting] = useState17(false);
9791
+ const [submittingStep, setSubmittingStep] = useState17("");
9792
+ const [submitError, setSubmitError] = useState17(null);
9793
+ const [fileError, setFileError] = useState17(null);
9794
+ const textareaRef = useRef15(null);
9795
+ const fileInputRef = useRef15(null);
9796
+ const emojiPickerRef = useRef15(null);
9797
+ const [isEmojiPickerOpen, setIsEmojiPickerOpen] = useState17(false);
9798
+ useEffect15(() => {
9647
9799
  function handleClickOutside(event) {
9648
9800
  if (emojiPickerRef.current && !emojiPickerRef.current.contains(event.target)) {
9649
9801
  setIsEmojiPickerOpen(false);
@@ -9667,7 +9819,7 @@ function CreateTemplateModal({
9667
9819
  document.removeEventListener("keydown", handleKeyDown2);
9668
9820
  };
9669
9821
  }, [isEmojiPickerOpen, isAddButtonOpen]);
9670
- useEffect14(() => {
9822
+ useEffect15(() => {
9671
9823
  if (isOpen) {
9672
9824
  setTemplateName("");
9673
9825
  setLanguage("he");
@@ -9689,7 +9841,7 @@ function CreateTemplateModal({
9689
9841
  const uniqueVariables = useMemo10(() => {
9690
9842
  return extractUniqueVariableIndices(bodyText);
9691
9843
  }, [bodyText]);
9692
- useEffect14(() => {
9844
+ useEffect15(() => {
9693
9845
  setVariableSamples((prev) => {
9694
9846
  const next = {};
9695
9847
  uniqueVariables.forEach((idx) => {
@@ -10706,7 +10858,7 @@ function CreateTemplateModal({
10706
10858
  }
10707
10859
 
10708
10860
  // src/components/WhatsAppComponent/hooks/useWhatsAppState.ts
10709
- import { useState as useState17, useEffect as useEffect15, useRef as useRef15, useMemo as useMemo11, useCallback as useCallback14 } from "react";
10861
+ import { useState as useState18, useEffect as useEffect16, useRef as useRef16, useMemo as useMemo11, useCallback as useCallback14 } from "react";
10710
10862
 
10711
10863
  // src/components/WhatsAppComponent/utils/recipientEngine.ts
10712
10864
  var STORAGE_KEY_TEST_PHONE = "whatsapp_test_phone";
@@ -12011,28 +12163,28 @@ function useWhatsAppState(props) {
12011
12163
  data: injectedData
12012
12164
  } = props;
12013
12165
  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);
12014
- const [tableColumns2, setTableColumns] = useState17(() => {
12166
+ const [tableColumns2, setTableColumns] = useState18(() => {
12015
12167
  return Array.isArray(settings == null ? void 0 : settings.columns) ? settings.columns : [];
12016
12168
  });
12017
- const [rawRecords, setRawRecords] = useState17(() => {
12169
+ const [rawRecords, setRawRecords] = useState18(() => {
12018
12170
  if (Array.isArray(injectedData)) return injectedData;
12019
12171
  if (Array.isArray(injectedData == null ? void 0 : injectedData.records)) return injectedData.records;
12020
12172
  return [];
12021
12173
  });
12022
- const [relationOptions, setRelationOptions] = useState17(() => {
12174
+ const [relationOptions, setRelationOptions] = useState18(() => {
12023
12175
  return (injectedData == null ? void 0 : injectedData.relationOptions) || {};
12024
12176
  });
12025
- const [isLoadingTableData, setIsLoadingTableData] = useState17(() => Boolean(settings == null ? void 0 : settings.tableMetaId));
12026
- const [activeSubtableScans, setActiveSubtableScans] = useState17(0);
12027
- const [tableError, setTableError] = useState17(null);
12028
- const [filters, setFilters] = useState17({});
12029
- const [selectedRowIds, setSelectedRowIds] = useState17([]);
12030
- const [autoSelectCount, setAutoSelectCount] = useState17(null);
12031
- const isAutoSelectingRef = useRef15(false);
12032
- const isManualOverrideRef = useRef15(false);
12033
- const prevAutoSelectCountRef = useRef15(null);
12034
- const fetchedTableIdsRef = useRef15(/* @__PURE__ */ new Set());
12035
- const fullyFetchedRelationKeysRef = useRef15(/* @__PURE__ */ new Set());
12177
+ const [isLoadingTableData, setIsLoadingTableData] = useState18(() => Boolean(settings == null ? void 0 : settings.tableMetaId));
12178
+ const [activeSubtableScans, setActiveSubtableScans] = useState18(0);
12179
+ const [tableError, setTableError] = useState18(null);
12180
+ const [filters, setFilters] = useState18({});
12181
+ const [selectedRowIds, setSelectedRowIds] = useState18([]);
12182
+ const [autoSelectCount, setAutoSelectCount] = useState18(null);
12183
+ const isAutoSelectingRef = useRef16(false);
12184
+ const isManualOverrideRef = useRef16(false);
12185
+ const prevAutoSelectCountRef = useRef16(null);
12186
+ const fetchedTableIdsRef = useRef16(/* @__PURE__ */ new Set());
12187
+ const fullyFetchedRelationKeysRef = useRef16(/* @__PURE__ */ new Set());
12036
12188
  const loadTableData = useCallback14(async () => {
12037
12189
  var _a2;
12038
12190
  const tableId = (settings == null ? void 0 : settings.tableMetaId) || (injectedData == null ? void 0 : injectedData.tableMetaId) || (injectedData == null ? void 0 : injectedData.tableId);
@@ -12100,7 +12252,7 @@ function useWhatsAppState(props) {
12100
12252
  executeAction,
12101
12253
  orgId
12102
12254
  ]);
12103
- useEffect15(() => {
12255
+ useEffect16(() => {
12104
12256
  loadTableData();
12105
12257
  }, [loadTableData]);
12106
12258
  const filterableColumns = useMemo11(() => {
@@ -12111,7 +12263,7 @@ function useWhatsAppState(props) {
12111
12263
  return type === "RELATION" || type === "BOOLEAN";
12112
12264
  });
12113
12265
  }, [tableColumns2]);
12114
- const [referencedTableSchemas, setReferencedTableSchemas] = useState17({});
12266
+ const [referencedTableSchemas, setReferencedTableSchemas] = useState18({});
12115
12267
  const subtableCols = useMemo11(() => {
12116
12268
  return (tableColumns2 || []).filter((col) => {
12117
12269
  var _a2;
@@ -12119,7 +12271,7 @@ function useWhatsAppState(props) {
12119
12271
  return type === "RELATION" || type === "SUB_TABLE" || type === "SUBTABLE";
12120
12272
  });
12121
12273
  }, [tableColumns2]);
12122
- useEffect15(() => {
12274
+ useEffect16(() => {
12123
12275
  if (!executeAction) return;
12124
12276
  const unrequestedCols = subtableCols.filter((col) => {
12125
12277
  var _a2;
@@ -12172,13 +12324,13 @@ function useWhatsAppState(props) {
12172
12324
  const phoneColumns = useMemo11(() => {
12173
12325
  return targetPhoneOptions.map((opt) => ({ name: opt.label, id: opt.id, type: "PHONE" }));
12174
12326
  }, [targetPhoneOptions]);
12175
- const [phoneColumnId, setPhoneColumnId] = useState17("");
12176
- const [subtableFilterColumn, setSubtableFilterColumn] = useState17("");
12177
- const [subtableFilterValue, setSubtableFilterValue] = useState17("");
12178
- const [subtableSendLimit, setSubtableSendLimit] = useState17(
12327
+ const [phoneColumnId, setPhoneColumnId] = useState18("");
12328
+ const [subtableFilterColumn, setSubtableFilterColumn] = useState18("");
12329
+ const [subtableFilterValue, setSubtableFilterValue] = useState18("");
12330
+ const [subtableSendLimit, setSubtableSendLimit] = useState18(
12179
12331
  (settings == null ? void 0 : settings.subtableSendLimit) || "PRIMARY"
12180
12332
  );
12181
- useEffect15(() => {
12333
+ useEffect16(() => {
12182
12334
  if (targetPhoneOptions.length > 0) {
12183
12335
  const isValid = targetPhoneOptions.some(
12184
12336
  (opt) => opt.id === phoneColumnId || opt.columnName === phoneColumnId
@@ -12218,10 +12370,10 @@ function useWhatsAppState(props) {
12218
12370
  const selectedSubtableFilterCol = useMemo11(() => {
12219
12371
  return subtableFilterableColumns.find((c) => c.name === subtableFilterColumn);
12220
12372
  }, [subtableFilterableColumns, subtableFilterColumn]);
12221
- const [enablePostSendAction, setEnablePostSendAction] = useState17(false);
12222
- const [postSendActionColumn, setPostSendActionColumn] = useState17("");
12223
- const [postSendActionValue, setPostSendActionValue] = useState17("");
12224
- const [postSendActionTargetType, setPostSendActionTargetType] = useState17("MAIN");
12373
+ const [enablePostSendAction, setEnablePostSendAction] = useState18(false);
12374
+ const [postSendActionColumn, setPostSendActionColumn] = useState18("");
12375
+ const [postSendActionValue, setPostSendActionValue] = useState18("");
12376
+ const [postSendActionTargetType, setPostSendActionTargetType] = useState18("MAIN");
12225
12377
  const postSendActionTargetOptions = useMemo11(() => {
12226
12378
  var _a2, _b2, _c;
12227
12379
  const options = [];
@@ -12273,8 +12425,8 @@ function useWhatsAppState(props) {
12273
12425
  );
12274
12426
  }, [postSendActionTargetOptions, postSendActionColumn]);
12275
12427
  const selectedPostSendCol = selectedPostSendOption;
12276
- const [isTestPromptOpen, setIsTestPromptOpen] = useState17(false);
12277
- const [testPhoneNumber, setTestPhoneNumber] = useState17(() => {
12428
+ const [isTestPromptOpen, setIsTestPromptOpen] = useState18(false);
12429
+ const [testPhoneNumber, setTestPhoneNumber] = useState18(() => {
12278
12430
  if (typeof window !== "undefined") {
12279
12431
  try {
12280
12432
  return localStorage.getItem(STORAGE_KEY_TEST_PHONE) || "";
@@ -12284,10 +12436,10 @@ function useWhatsAppState(props) {
12284
12436
  }
12285
12437
  return "";
12286
12438
  });
12287
- const [testFeedback, setTestFeedback] = useState17(null);
12288
- const [isSendingTest, setIsSendingTest] = useState17(false);
12289
- const [isSendingBroadcast, setIsSendingBroadcast] = useState17(false);
12290
- const [broadcastProgress, setBroadcastProgress] = useState17({
12439
+ const [testFeedback, setTestFeedback] = useState18(null);
12440
+ const [isSendingTest, setIsSendingTest] = useState18(false);
12441
+ const [isSendingBroadcast, setIsSendingBroadcast] = useState18(false);
12442
+ const [broadcastProgress, setBroadcastProgress] = useState18({
12291
12443
  current: 0,
12292
12444
  total: 0,
12293
12445
  successful: 0,
@@ -12295,8 +12447,8 @@ function useWhatsAppState(props) {
12295
12447
  skipped: 0,
12296
12448
  percent: 0
12297
12449
  });
12298
- const [broadcastSummary, setBroadcastSummary] = useState17(null);
12299
- const [rowStatusMap, setRowStatusMap] = useState17({});
12450
+ const [broadcastSummary, setBroadcastSummary] = useState18(null);
12451
+ const [rowStatusMap, setRowStatusMap] = useState18({});
12300
12452
  const clearBroadcastSummary = useCallback14(() => {
12301
12453
  setBroadcastSummary(null);
12302
12454
  }, []);
@@ -12353,7 +12505,7 @@ function useWhatsAppState(props) {
12353
12505
  },
12354
12506
  [relationOptions, subtableFilterableColumns, postSendActionTargetOptions, tableColumns2, filterableColumns]
12355
12507
  );
12356
- useEffect15(() => {
12508
+ useEffect16(() => {
12357
12509
  var _a2, _b2, _c, _d, _e;
12358
12510
  if (!executeAction) return;
12359
12511
  const targets = [];
@@ -12447,7 +12599,7 @@ function useWhatsAppState(props) {
12447
12599
  }
12448
12600
  });
12449
12601
  }, [filterableColumns, selectedPhoneOption, referencedTableSchemas, tableColumns2, executeAction, selectedPostSendOption, orgId]);
12450
- useEffect15(() => {
12602
+ useEffect16(() => {
12451
12603
  var _a2, _b2, _c;
12452
12604
  if (!executeAction || !selectedSubtableFilterCol) return;
12453
12605
  if (((_a2 = selectedSubtableFilterCol.type) == null ? void 0 : _a2.toUpperCase()) !== "RELATION") return;
@@ -12498,7 +12650,7 @@ function useWhatsAppState(props) {
12498
12650
  }
12499
12651
  })();
12500
12652
  }, [selectedSubtableFilterCol, selectedPhoneOption, executeAction, orgId]);
12501
- useEffect15(() => {
12653
+ useEffect16(() => {
12502
12654
  var _a2, _b2;
12503
12655
  if (!executeAction || !selectedPostSendOption) return;
12504
12656
  if (selectedPostSendOption.type !== "RELATION") return;
@@ -12583,7 +12735,7 @@ function useWhatsAppState(props) {
12583
12735
  });
12584
12736
  }, [rawRecords, filters, filterableColumns]);
12585
12737
  const filteredData = filteredRecords;
12586
- useEffect15(() => {
12738
+ useEffect16(() => {
12587
12739
  if (autoSelectCount !== null && autoSelectCount > 0) {
12588
12740
  isAutoSelectingRef.current = true;
12589
12741
  const sliced = filteredData.slice(0, autoSelectCount);
@@ -12683,14 +12835,14 @@ function useWhatsAppState(props) {
12683
12835
  return prev;
12684
12836
  });
12685
12837
  }, [autoSelectCount]);
12686
- const [templates, setTemplates] = useState17([]);
12687
- const [selectedTemplateId, setSelectedTemplateId] = useState17(null);
12688
- const [isLoading, setIsLoading] = useState17(true);
12689
- const [fetchError, setFetchError] = useState17(null);
12690
- const [isModalOpen, setIsModalOpen] = useState17(false);
12691
- const [isDropdownOpen, setIsDropdownOpen] = useState17(false);
12692
- const [isDeleting, setIsDeleting] = useState17(false);
12693
- const [feedback, setFeedback] = useState17(null);
12838
+ const [templates, setTemplates] = useState18([]);
12839
+ const [selectedTemplateId, setSelectedTemplateId] = useState18(null);
12840
+ const [isLoading, setIsLoading] = useState18(true);
12841
+ const [fetchError, setFetchError] = useState18(null);
12842
+ const [isModalOpen, setIsModalOpen] = useState18(false);
12843
+ const [isDropdownOpen, setIsDropdownOpen] = useState18(false);
12844
+ const [isDeleting, setIsDeleting] = useState18(false);
12845
+ const [feedback, setFeedback] = useState18(null);
12694
12846
  const loadTemplates = useCallback14(async () => {
12695
12847
  var _a2, _b2;
12696
12848
  if (!executeAction) {
@@ -12743,7 +12895,7 @@ function useWhatsAppState(props) {
12743
12895
  setIsLoading(false);
12744
12896
  }
12745
12897
  }, [executeAction, orgId]);
12746
- useEffect15(() => {
12898
+ useEffect16(() => {
12747
12899
  loadTemplates();
12748
12900
  }, [loadTemplates]);
12749
12901
  const selectedTemplate = useMemo11(() => {
@@ -12768,8 +12920,8 @@ function useWhatsAppState(props) {
12768
12920
  }
12769
12921
  ) || null;
12770
12922
  }, [selectedTemplate]);
12771
- const [headerMediaUrl, setHeaderMediaUrl] = useState17("");
12772
- useEffect15(() => {
12923
+ const [headerMediaUrl, setHeaderMediaUrl] = useState18("");
12924
+ useEffect16(() => {
12773
12925
  if (!templateHeaderComp) {
12774
12926
  setHeaderMediaUrl("");
12775
12927
  return;
@@ -12819,7 +12971,7 @@ function useWhatsAppState(props) {
12819
12971
  );
12820
12972
  setHeaderMediaUrl(defaultUrl || "");
12821
12973
  }, [templateHeaderComp, selectedTemplate == null ? void 0 : selectedTemplate.name]);
12822
- const [isUploadingMedia, setIsUploadingMedia] = useState17(false);
12974
+ const [isUploadingMedia, setIsUploadingMedia] = useState18(false);
12823
12975
  const handleFileUpload = useCallback14(
12824
12976
  async (file, templateName) => {
12825
12977
  const tplName = templateName || (selectedTemplate == null ? void 0 : selectedTemplate.name) || "";
@@ -12864,8 +13016,8 @@ function useWhatsAppState(props) {
12864
13016
  const templateVariables = useMemo11(() => {
12865
13017
  return extractTemplateVariables(selectedTemplate);
12866
13018
  }, [selectedTemplate]);
12867
- const [variableMapping, setVariableMapping] = useState17({});
12868
- useEffect15(() => {
13019
+ const [variableMapping, setVariableMapping] = useState18({});
13020
+ useEffect16(() => {
12869
13021
  setVariableMapping({});
12870
13022
  }, [selectedTemplateId]);
12871
13023
  const textableColumnOptions = useMemo11(() => {
@@ -13383,7 +13535,7 @@ function useWhatsAppState(props) {
13383
13535
  }
13384
13536
 
13385
13537
  // src/components/WhatsAppComponent/ui/TemplateSelectionBlock.tsx
13386
- import { useRef as useRef16 } from "react";
13538
+ import { useRef as useRef17 } from "react";
13387
13539
  import {
13388
13540
  FileText as FileText3,
13389
13541
  Trash2 as Trash23,
@@ -13426,7 +13578,7 @@ function TemplateSelectionBlock({
13426
13578
  isUploadingMedia = false,
13427
13579
  handleFileUpload
13428
13580
  }) {
13429
- const fileInputRef = useRef16(null);
13581
+ const fileInputRef = useRef17(null);
13430
13582
  return /* @__PURE__ */ jsxs18("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: [
13431
13583
  /* @__PURE__ */ jsxs18("div", { className: "space-y-1.5 shrink-0", children: [
13432
13584
  /* @__PURE__ */ jsxs18("div", { className: "flex items-center justify-between pb-1.5 border-b border-slate-200/70 shrink-0 gap-2", children: [
@@ -14393,16 +14545,16 @@ function SettingsAndActionsBlock({
14393
14545
  }
14394
14546
 
14395
14547
  // src/components/WhatsAppComponent/inbox/useInboxState.ts
14396
- import { useState as useState18, useEffect as useEffect16, useCallback as useCallback15, useRef as useRef17 } from "react";
14548
+ import { useState as useState19, useEffect as useEffect17, useCallback as useCallback15, useRef as useRef18 } from "react";
14397
14549
  function useInboxState(orgId, actions) {
14398
- const [conversations, setConversations] = useState18([]);
14399
- const [activeConversationId, setActiveConversationId] = useState18(null);
14400
- const [messages, setMessages] = useState18([]);
14401
- const [isLoading, setIsLoading] = useState18(false);
14402
- const [isSending, setIsSending] = useState18(false);
14403
- const [error, setError] = useState18(null);
14404
- const actionsRef = useRef17(actions);
14405
- useEffect16(() => {
14550
+ const [conversations, setConversations] = useState19([]);
14551
+ const [activeConversationId, setActiveConversationId] = useState19(null);
14552
+ const [messages, setMessages] = useState19([]);
14553
+ const [isLoading, setIsLoading] = useState19(false);
14554
+ const [isSending, setIsSending] = useState19(false);
14555
+ const [error, setError] = useState19(null);
14556
+ const actionsRef = useRef18(actions);
14557
+ useEffect17(() => {
14406
14558
  actionsRef.current = actions;
14407
14559
  });
14408
14560
  const fetchConversations = useCallback15(async () => {
@@ -14427,7 +14579,7 @@ function useInboxState(orgId, actions) {
14427
14579
  }
14428
14580
  if (!silent) setIsLoading(false);
14429
14581
  }, []);
14430
- useEffect16(() => {
14582
+ useEffect17(() => {
14431
14583
  fetchConversations();
14432
14584
  const interval = setInterval(() => {
14433
14585
  fetchConversations();
@@ -14526,17 +14678,17 @@ function ConversationList({ conversations, activeId, onSelect }) {
14526
14678
  }
14527
14679
 
14528
14680
  // src/components/WhatsAppComponent/inbox/ChatWindow.tsx
14529
- import { useState as useState19, useRef as useRef18, useEffect as useEffect17 } from "react";
14681
+ import { useState as useState20, useRef as useRef19, useEffect as useEffect18 } from "react";
14530
14682
  import { Send as Send2, User as User2, Loader2 as Loader27 } from "lucide-react";
14531
14683
  import { jsx as jsx25, jsxs as jsxs22 } from "react/jsx-runtime";
14532
14684
  function ChatWindow({ activeConversation, messages, isLoading, isSending, onSendMessage }) {
14533
- const [inputText, setInputText] = useState19("");
14534
- const messagesTopRef = useRef18(null);
14685
+ const [inputText, setInputText] = useState20("");
14686
+ const messagesTopRef = useRef19(null);
14535
14687
  const scrollToTop = () => {
14536
14688
  var _a;
14537
14689
  (_a = messagesTopRef.current) == null ? void 0 : _a.scrollIntoView({ behavior: "smooth" });
14538
14690
  };
14539
- useEffect17(() => {
14691
+ useEffect18(() => {
14540
14692
  scrollToTop();
14541
14693
  }, [messages.length, activeConversation == null ? void 0 : activeConversation.id]);
14542
14694
  const handleSend = (e) => {
@@ -15057,18 +15209,18 @@ function WhatsAppComponent(props) {
15057
15209
  }
15058
15210
 
15059
15211
  // src/components/FormBlock/FormBlock.tsx
15060
- import { useState as useState20, useEffect as useEffect18 } from "react";
15212
+ import { useState as useState21, useEffect as useEffect19 } from "react";
15061
15213
  import { Loader2 as Loader29, CheckCircle2 as CheckCircle25 } from "lucide-react";
15062
15214
  import { jsx as jsx28, jsxs as jsxs25 } from "react/jsx-runtime";
15063
15215
  function FormBlock({ settings: schema, executeAction, componentId, className = "", onSuccess }) {
15064
15216
  const { showError, addToast } = useToast();
15065
- const [formData, setFormData] = useState20({});
15066
- const [isSubmitting, setIsSubmitting] = useState20(false);
15067
- const [isSubmitted, setIsSubmitted] = useState20(false);
15068
- const [columns, setColumns] = useState20((schema == null ? void 0 : schema.columns) || []);
15069
- const [isLoadingSchema, setIsLoadingSchema] = useState20(false);
15217
+ const [formData, setFormData] = useState21({});
15218
+ const [isSubmitting, setIsSubmitting] = useState21(false);
15219
+ const [isSubmitted, setIsSubmitted] = useState21(false);
15220
+ const [columns, setColumns] = useState21((schema == null ? void 0 : schema.columns) || []);
15221
+ const [isLoadingSchema, setIsLoadingSchema] = useState21(false);
15070
15222
  const targetTableId = (schema == null ? void 0 : schema.tableMetaId) || (schema == null ? void 0 : schema.tableId) || (schema == null ? void 0 : schema.id);
15071
- useEffect18(() => {
15223
+ useEffect19(() => {
15072
15224
  let isMounted = true;
15073
15225
  if ((!(schema == null ? void 0 : schema.columns) || schema.columns.length === 0) && targetTableId && executeAction) {
15074
15226
  setIsLoadingSchema(true);
@@ -15233,6 +15385,7 @@ export {
15233
15385
  COLUMN_TYPE_LABELS,
15234
15386
  ColumnHeaderTitle,
15235
15387
  CreateTemplateModal,
15388
+ DEFAULT_FILTER_COLUMN_TYPES,
15236
15389
  DEFAULT_PLACEMENT_STATUS_COLORS,
15237
15390
  DatePickerCell,
15238
15391
  DynamicFiltersBlock,
@@ -15247,6 +15400,7 @@ export {
15247
15400
  RELATION_BUTTON_COUNTS_ACTION,
15248
15401
  RELATION_LABEL_KEY,
15249
15402
  RELATION_SEP,
15403
+ RESOLVE_DEFAULT_FILTERS_ACTION,
15250
15404
  RelationFilterPopover,
15251
15405
  RelationPickerCell,
15252
15406
  SettingsAndActionsBlock,
@@ -15267,6 +15421,7 @@ export {
15267
15421
  buildRelationRef,
15268
15422
  calculateMinColumnWidth,
15269
15423
  checkElementTruncation,
15424
+ cleanPlacementFilterDefaults,
15270
15425
  cn,
15271
15426
  columnRefLabel,
15272
15427
  computeFormulaValue,
@@ -15282,6 +15437,8 @@ export {
15282
15437
  formatTimeInput,
15283
15438
  formatTimeIso,
15284
15439
  generateWhatsAppLink,
15440
+ getColumnDefaultFilter,
15441
+ getDefaultFilterColumns,
15285
15442
  getDeterministicPastelBadge,
15286
15443
  getEligibleCopyTargets,
15287
15444
  getNextVariableIndex,
@@ -15317,11 +15474,14 @@ export {
15317
15474
  renameCopyTarget,
15318
15475
  resolveDefaultStatusId,
15319
15476
  resolveProtocol,
15477
+ sanitizeDefaultFilter,
15320
15478
  sanitizePhoneNumber,
15321
15479
  sanitizeTemplateNameInput,
15322
15480
  seamlessVariableEngine,
15323
15481
  splitHeaderTitle,
15482
+ supportsDefaultFilter,
15324
15483
  tableColumns,
15484
+ toColumnFilterValue,
15325
15485
  useColumnReorder,
15326
15486
  useColumnResize,
15327
15487
  useSmartTooltip,
@@ -15333,5 +15493,6 @@ export {
15333
15493
  validateTemplateBody,
15334
15494
  validateTemplateButtons,
15335
15495
  validateWhatsAppTemplate,
15336
- validateWordToVariableRatio
15496
+ validateWordToVariableRatio,
15497
+ withDefaultFilter
15337
15498
  };