diff --git a/src/data_sources/model/DataSource.ts b/src/data_sources/model/DataSource.ts index b953f429b..7ecc601c9 100644 --- a/src/data_sources/model/DataSource.ts +++ b/src/data_sources/model/DataSource.ts @@ -61,10 +61,17 @@ export default class DataSource extends Model { } getRecords() { - return [...this.records.models]; + return [...this.records.models].map(record => this.getRecord(record.id)); } removeRecord(id: string | number, opts?: RemoveOptions): DataRecord | undefined { + const onRecordDelete = this.transformers.onRecordDelete; + const record = this.getRecord(id); + + if (record && onRecordDelete) { + onRecordDelete({ record }); + } + return this.records.remove(id, opts); } } diff --git a/src/data_sources/types.ts b/src/data_sources/types.ts index 094c0e841..756312de0 100644 --- a/src/data_sources/types.ts +++ b/src/data_sources/types.ts @@ -23,7 +23,7 @@ export interface DataSourceProps { export interface DataSourceTransformers { onRecordAdd?: (args: { record: DataRecordProps }) => DataRecordProps; onRecordSet?: (args: { id: string | number; key: string; value: any }) => any; - onRecordDelete?: (args: { record: DataRecord }) => DataRecord; + onRecordDelete?: (args: { record: DataRecord }) => void; onRecordRead?: (args: { record: DataRecord }) => DataRecord; } diff --git a/test/specs/data_sources/index.ts b/test/specs/data_sources/index.ts index 3266ec865..a7fbb11f2 100644 --- a/test/specs/data_sources/index.ts +++ b/test/specs/data_sources/index.ts @@ -261,6 +261,41 @@ describe('DataSourceManager', () => { const result = ds.getRecord('id1')?.get('content'); expect(result).toBe('I LOVE GRAPES'); }); + + test('onRecordDelete', () => { + const testDataSource: DataSourceProps = { + id: 'test-data-source', + records: [], + transformers: { + onRecordDelete: ({ record }) => { + if (record.get('content') === 'i love grapes') { + throw new Error('Cannot delete record with content "i love grapes"'); + } + }, + }, + }; + dsm.add(testDataSource); + + const cmp = cmpRoot.append({ + tagName: 'h1', + type: 'text', + components: [ + { + type: 'data-variable', + value: 'default', + path: 'test-data-source.id1.content', + }, + ], + })[0]; + + const ds = dsm.get('test-data-source'); + ds.addRecord({ id: 'id1', content: 'i love grapes' }); + + let el = cmp.getEl(); + expect(el?.innerHTML).toContain('i love grapes'); + + expect(() => ds.removeRecord('id1')).toThrowError('Cannot delete record with content "i love grapes"'); + }); }); test('add DataSource with records', () => {