@tomino/dynamic-form-semantic-ui
Version:
Semantic UI form renderer based on dynamic form generation
137 lines (111 loc) • 3.4 kB
text/typescript
import { FormElement, JSONSchema } from '@tomino/dynamic-form';
import { ProjectDataSet } from './form_store';
import { generateUid } from './editor_common';
import { toJS } from '../common';
import { formDatasetToJS, schemaDatasetToJS } from '../helpers';
import { IProject, IStorage } from '../storage/common_storage';
type Builder = (form: FormElement, schema: JSONSchema) => ProjectDataSet;
export class ProjectManager {
static LAST = 'CORPIX_LAST_PROJECT';
storage: IStorage;
// projectHandlers: string[];
private project: IProject;
private buildProject: Builder;
// dataSource: any;
// @computed get data() {
// if (!this.dataSource) {
// this.recomputeData();
// }
// // subscribe
// this.dataVersion;
// return this.dataSource;
// }
// @action recomputeData() {
// const data = toJS(this.dataSource);
// const dataSet = datasetToJS(this.currentProject.schema);
// try {
// this.dataSource = this.project ? buildDataSet(dataSet, data) : null;
// } catch (ex) {
// alert('Data is no longer valid, needed to remove temporary data');
// this.dataSource = this.project ? buildDataSet(dataSet) : null;
// }
// this.dataVersion++;
// }
constructor(storage: IStorage, builder: Builder) {
this.storage = storage;
this.buildProject = builder;
}
listProjects(): Promise<IProject[]> {
return this.storage.listProjects();
}
loadLastProject(): Promise<ProjectDataSet> {
let last = localStorage.getItem(ProjectManager.LAST);
if (last) {
return this.loadById(last);
}
return null;
}
async loadById(id: string): Promise<ProjectDataSet> {
let project = await this.storage.loadProject(id);
return this.load(project);
}
load(project: IProject, saveLast = true) {
this.project = project;
if (saveLast) {
localStorage.setItem(ProjectManager.LAST, project.id);
}
return this.buildProject(project.form || {}, project.schema || {});
}
duplicateProject(project: ProjectDataSet, name: string): ProjectDataSet {
let newProject = this.saveProject(project, generateUid(), name);
return this.load(newProject);
}
saveProject(project: ProjectDataSet, id?: string, name?: string): IProject {
const form = toJS(project.form) as any;
if (name) {
form.name = name;
}
return this.save({
form: formDatasetToJS(form),
schema: schemaDatasetToJS(project.schema, false),
style: {},
id: id || this.project.id,
created: this.project.created,
modified: Date.now()
});
}
save(project: IProject): IProject {
this.storage.saveProject(project);
this.project = project;
localStorage.setItem(ProjectManager.LAST, this.project.id);
return project;
}
deleteProject(id: string) {
this.storage.deleteProject(id);
if (this.project.id === id) {
this.project = null;
localStorage.removeItem(ProjectManager.LAST);
}
}
createProject(name: string): ProjectDataSet {
const id = generateUid();
return this.load({
form: {
control: 'Form',
props: {
label: name,
control: 'Form'
},
elements: []
},
schema: {
type: 'object',
properties: {}
},
style: {},
id,
created: Date.now(),
modified: null
});
}
}