ohayolibs
Version:
Ohayo is a set of essential modules for ohayojp.
166 lines (143 loc) • 4.65 kB
text/typescript
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Inject, OnDestroy, OnInit, ViewChild } from '@angular/core';
import { AppService, CodeService, I18NService } from '@core';
import { SFSchema } from '@ohayo/form';
import { OHAYO_I18N_TOKEN, _HttpClient } from '@ohayo/theme';
import { copy } from '@ohayo/util';
import { NuMonacoEditorComponent } from '@ng-util/monaco-editor';
import { NzSafeAny } from 'ng-zorro-antd/core/types';
import { NzMessageService } from 'ng-zorro-antd/message';
import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
const stackBlitzTpl = `
import { Component } from '@angular/core';
import { SFSchema } from '@ohayo/form';
import { NzMessageService } from 'ng-zorro-antd/message';
export class DemoComponent {
schema = {schema};
formData = {formData};
ui = {ui};
layout = '{layout}';
constructor(private msg: NzMessageService) { }
submit(value: any) {
this.msg.success(JSON.stringify(value));
}
change(value: any) {
console.log('formChange', value);
}
error(value: any) {
console.log('formError', value);
}
}`;
declare var ace: any;
export class FormValidatorComponent implements OnInit, OnDestroy {
private schemaEditor: NuMonacoEditorComponent;
private formCodeEditor: NuMonacoEditorComponent;
private uiEditor: NuMonacoEditorComponent;
private destroy$ = new Subject();
files: any[] = [
{ name: 'basic', title: '基本' },
{ name: 'conditional', title: '条件' },
{ name: 'sort', title: '顺序' },
{ name: 'validation', title: '自定义校验' },
{ name: 'fixed', title: '不规则布局' },
];
layout = 'horizontal';
name: string;
title: string;
schema: string;
schemaData: SFSchema;
formCode: string;
formData: {};
uiCode: string;
uiSchema: {};
expand = true;
editorOptions = { language: 'json', theme: 'vs' };
constructor(
private i18n: I18NService,
private codeSrv: CodeService,
private http: _HttpClient,
private msg: NzMessageService,
private appService: AppService,
private cdr: ChangeDetectorRef,
) {
const defaultIndex = 0;
this.name = this.files[defaultIndex].name;
this.title = this.files[defaultIndex].title;
this.appService.theme$.pipe(takeUntil(this.destroy$)).subscribe(data => {
this.editorOptions = { language: 'json', theme: data === 'dark' ? 'vs-dark' : 'vs' };
});
}
ngOnInit(): void {
this.getSchema();
}
refreshLayout(type: 'schemaEditor' | 'formCodeEditor' | 'uiEditor'): void {
setTimeout(() => {
this[type].editor.layout();
}, 100);
}
getSchema(): void {
const item = this.files.find(w => w.name === this.name);
if (!item) return;
this.name = item.name;
this.title = item.title;
if (item.cache) {
this.schema = item.cache;
this.run();
return;
}
this.http.get(`./assets/schema/${item.name}.json`, null, { responseType: 'text' }).subscribe(res => {
item.cache = res;
this.schema = item.cache;
this.run();
});
}
run(): void {
this.schemaData = JSON.parse(this.schema || '{}');
this.formData = JSON.parse(this.formCode || '{}');
this.uiSchema = JSON.parse(this.uiCode || '{}');
this.cdr.detectChanges();
}
openOnStackBlitz(): void {
const obj: { [key: string]: NzSafeAny } = {
schema: this.schema,
layout: this.layout,
formData: this.formCode || '{}',
ui: this.uiCode || '{}',
};
const componentCode = stackBlitzTpl.replace(/\{(\w+)\}/g, (_match: string, offset: any) => (obj[offset] || '').trim());
this.codeSrv.openOnStackBlitz(componentCode);
}
onCopy(): void {
copy(this.schema).then(() => this.msg.success(this.i18n.fanyi('app.demo.copied')));
}
submit(value: any): void {
this.msg.success(JSON.stringify(value));
}
change(value: any): void {
console.log('formChange', value);
}
valueChange(value: any): void {
console.log('formChange', value);
}
error(value: any): void {
console.log('formError', value);
}
ngOnDestroy(): void {
this.destroy$.next();
this.destroy$.complete();
}
}