Skip to content

Commit b4e5c54

Browse files
authored
fix: fix delete selection with search (#2012)
1 parent b9affb8 commit b4e5c54

4 files changed

Lines changed: 44 additions & 1 deletion

File tree

‎apps/nestjs-backend/src/features/record/query-builder/record-query-builder.interface.ts‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ export interface ICreateRecordQueryBuilderOptions {
2828
limit?: number;
2929
/** Optional pagination offset (skip) */
3030
offset?: number;
31+
/** When true, hide-not-match search filtering is applied */
32+
hasSearch?: boolean;
3133
/** Optional fallback field used for default ordering */
3234
defaultOrderField?: string;
3335
/**

‎apps/nestjs-backend/src/features/record/query-builder/record-query-builder.service.ts‎

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ export class RecordQueryBuilderService implements IRecordQueryBuilder {
151151
sort: options.sort,
152152
currentUserId: options.currentUserId,
153153
defaultOrderField: options.defaultOrderField,
154+
hasSearch: options.hasSearch,
154155
});
155156
this.buildFieldCtes(qb, tables, state, options.projection);
156157
}
@@ -184,6 +185,7 @@ export class RecordQueryBuilderService implements IRecordQueryBuilder {
184185
sort,
185186
currentUserId,
186187
defaultOrderField: options.defaultOrderField,
188+
hasSearch: options.hasSearch,
187189
});
188190

189191
this.buildSelect(
@@ -297,9 +299,10 @@ export class RecordQueryBuilderService implements IRecordQueryBuilder {
297299
sort?: ISortItem[];
298300
currentUserId?: string;
299301
defaultOrderField?: string;
302+
hasSearch?: boolean;
300303
}
301304
): void {
302-
const { limit, offset, filter, sort, currentUserId, defaultOrderField } = params;
305+
const { limit, offset, filter, sort, currentUserId, defaultOrderField, hasSearch } = params;
303306
state.setBaseCteName(undefined);
304307

305308
if (state.getContext() !== 'table') {
@@ -316,6 +319,11 @@ export class RecordQueryBuilderService implements IRecordQueryBuilder {
316319
return;
317320
}
318321

322+
if (hasSearch) {
323+
// Avoid trimming candidate rows before search filter applies; search runs after base CTE.
324+
return;
325+
}
326+
319327
const requiredFieldIds = this.collectRequiredFieldIds(filter, sort, defaultOrderField);
320328
const fieldLookup = this.buildFieldLookup(table);
321329

‎apps/nestjs-backend/src/features/record/record.service.ts‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -576,6 +576,7 @@ export class RecordService {
576576
useQueryModel,
577577
limit: query.take,
578578
offset: query.skip,
579+
hasSearch: Boolean(search?.[2]),
579580
defaultOrderField: basicSortIndex,
580581
}
581582
);

‎apps/nestjs-backend/test/selection.e2e-spec.ts‎

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -588,6 +588,38 @@ describe('OpenAPI SelectionController (e2e)', () => {
588588
});
589589
expect(result.data.ids).toEqual([table.records[0].id, table.records[2].id]);
590590
});
591+
592+
it('should delete rows matched by hide-not-match search even when matches are beyond base range', async () => {
593+
const searchTable = await createTable(baseId, {
594+
name: 'search table',
595+
fields: [
596+
{
597+
name: 'name',
598+
type: FieldType.SingleLineText,
599+
},
600+
],
601+
records: [
602+
{ fields: { name: 'alpha' } },
603+
{ fields: { name: 'beta' } },
604+
{ fields: { name: 'gamma' } },
605+
{ fields: { name: 'target one' } },
606+
{ fields: { name: 'target two' } },
607+
],
608+
});
609+
try {
610+
const viewId = searchTable.views[0].id;
611+
const result = await deleteSelection(searchTable.id, {
612+
viewId,
613+
type: RangeType.Rows,
614+
ranges: [[0, 1]],
615+
search: ['target', searchTable.fields[0].id, true],
616+
});
617+
618+
expect(result.data.ids).toEqual([searchTable.records[3].id, searchTable.records[4].id]);
619+
} finally {
620+
await permanentDeleteTable(baseId, searchTable.id);
621+
}
622+
});
591623
});
592624

593625
describe('paste user', () => {

0 commit comments

Comments
 (0)