UNPKG

@tomino/dynamic-form-semantic-ui

Version:

Semantic UI form renderer based on dynamic form generation

137 lines (111 loc) 3.4 kB
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 }); } }