mirror of https://github.com/artf/grapesjs.git
nocodeframeworkdrag-and-dropsite-buildersite-generatortemplate-builderui-builderweb-builderweb-builder-frameworkwebsite-builderno-codepage-builder
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
77 lines
2.1 KiB
77 lines
2.1 KiB
import { AddOptions, CombinedModelConstructorOptions, Model, RemoveOptions } from '../../common';
|
|
import EditorModel from '../../editor/model/Editor';
|
|
import { DataRecordProps, DataSourceProps, DataSourceTransformers } from '../types';
|
|
import DataRecord from './DataRecord';
|
|
import DataRecords from './DataRecords';
|
|
import DataSources from './DataSources';
|
|
|
|
interface DataSourceOptions extends CombinedModelConstructorOptions<{ em: EditorModel }, DataSource> {}
|
|
|
|
export default class DataSource extends Model<DataSourceProps> {
|
|
transformers: DataSourceTransformers;
|
|
|
|
defaults() {
|
|
return {
|
|
records: [],
|
|
transformers: {},
|
|
};
|
|
}
|
|
|
|
constructor(props: DataSourceProps, opts: DataSourceOptions) {
|
|
super(props, opts);
|
|
const { records, transformers } = props;
|
|
this.transformers = transformers || {};
|
|
|
|
if (!(records instanceof DataRecords)) {
|
|
this.set({ records: new DataRecords(records!, { dataSource: this }) });
|
|
}
|
|
|
|
this.listenTo(this.records, 'add', this.onAdd);
|
|
}
|
|
|
|
get records() {
|
|
return this.attributes.records as DataRecords;
|
|
}
|
|
|
|
get em() {
|
|
return (this.collection as unknown as DataSources).em;
|
|
}
|
|
|
|
onAdd(dr: DataRecord) {
|
|
dr.triggerChange();
|
|
}
|
|
|
|
addRecord(record: DataRecordProps, opts?: AddOptions) {
|
|
const onRecordAdd = this.transformers.onRecordAdd;
|
|
if (onRecordAdd) {
|
|
record = onRecordAdd({ record });
|
|
}
|
|
|
|
return this.records.add(record, opts);
|
|
}
|
|
|
|
getRecord(id: string | number): DataRecord | undefined {
|
|
const onRecordRead = this.transformers.onRecordRead;
|
|
const record = this.records.get(id);
|
|
if (record && onRecordRead) {
|
|
return onRecordRead({ record });
|
|
}
|
|
|
|
return record;
|
|
}
|
|
|
|
getRecords() {
|
|
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);
|
|
}
|
|
}
|
|
|