Browse Source

feat: add onRecordDelete data source

ci/dependabot
danstarns 2 years ago
parent
commit
c31ef1a978
  1. 9
      src/data_sources/model/DataSource.ts
  2. 2
      src/data_sources/types.ts
  3. 35
      test/specs/data_sources/index.ts

9
src/data_sources/model/DataSource.ts

@ -61,10 +61,17 @@ export default class DataSource extends Model<DataSourceProps> {
}
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);
}
}

2
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;
}

35
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', () => {

Loading…
Cancel
Save