{"version":3,"file":"liangdi-metamodeling-components.mjs","sources":["../../../../projects/liangdi/metamodeling-components/src/lib/service/meta-emit.service.ts","../../../../projects/liangdi/metamodeling-components/src/lib/page/nz-form-element.component.ts","../../../../projects/liangdi/metamodeling-components/src/lib/page/nz-form-element.component.html","../../../../projects/liangdi/metamodeling-components/src/lib/page/nz-form-dialog.component.ts","../../../../projects/liangdi/metamodeling-components/src/lib/page/nz-form-dialog.component.html","../../../../projects/liangdi/metamodeling-components/src/lib/page/nz-filter-element.component.ts","../../../../projects/liangdi/metamodeling-components/src/lib/page/nz-filter-element.component.html","../../../../projects/liangdi/metamodeling-components/src/lib/page/nz-sort-field.component.ts","../../../../projects/liangdi/metamodeling-components/src/lib/page/nz-sort-field.component.html","../../../../projects/liangdi/metamodeling-components/src/lib/page/nz-quick-search-tool.component.ts","../../../../projects/liangdi/metamodeling-components/src/lib/page/nz-quick-search-tool.component.html","../../../../projects/liangdi/metamodeling-components/src/lib/page/nz-table-model.component.ts","../../../../projects/liangdi/metamodeling-components/src/lib/page/nz-table-model.component.html","../../../../projects/liangdi/metamodeling-components/src/lib/page/nz-table-list.component.ts","../../../../projects/liangdi/metamodeling-components/src/lib/page/nz-table-list.component.html","../../../../projects/liangdi/metamodeling-components/src/lib/metamodeling-components.module.ts","../../../../projects/liangdi/metamodeling-components/src/index.ts","../../../../projects/liangdi/metamodeling-components/src/liangdi-metamodeling-components.ts"],"sourcesContent":["import {EventEmitter, Injectable} from '@angular/core';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class MetaEmitService {\n\n  parentSubmit = new EventEmitter<any>();\n  constructor() { }\n\n}\n","import { FormBuilder, FormGroup, Validators } from '@angular/forms';\r\nimport {\r\n    Component,\r\n    OnInit,\r\n    Input,\r\n    OnChanges,\r\n    EventEmitter,\r\n    Output,\r\n    SimpleChanges,\r\n    Inject,\r\n    OnDestroy, ViewChild, ElementRef, AfterViewInit\r\n} from '@angular/core';\r\nimport { NzUploadFile } from 'ng-zorro-antd/upload';\r\nimport { NzMessageService } from 'ng-zorro-antd/message';\r\nimport { NzNotificationService } from 'ng-zorro-antd/notification';\r\nimport { NzModalService } from 'ng-zorro-antd/modal';\r\n\r\nimport { CropperSettings, ImageCropperComponent } from 'ngx-img-cropper';\r\nimport { MetaEmitService } from '../service/meta-emit.service';\r\nimport {  MetamodelingService } from '@liangdi/metamodeling-service';\r\n\r\n// declare var ClassicEditor: any;\r\n\r\ndeclare var tinyMCE: any;\r\n\r\n@Component({\r\n    selector: 'nz-form-element',\r\n    templateUrl: './nz-form-element.component.html',\r\n    styleUrls: [\r\n        './nz-form-element.component.less'\r\n    ]\r\n})\r\nexport class NzFormElementComponent implements OnInit, OnChanges, OnDestroy {\r\n\r\n    loading = true;\r\n    /**\r\n     * 上传对象 src 存储 map\r\n     */\r\n    uploadUrls = {};\r\n    /**\r\n     * 存储整个上传对象\r\n     */\r\n    uploads = {};\r\n    /**\r\n     * 上传文件的服务器地址\r\n     */\r\n    uploadUrl = '';\r\n    /**\r\n     * 文件下载地址\r\n     */\r\n    fileUrl = '';\r\n\r\n    /**\r\n     * 关联对象列表\r\n     */\r\n    objects = {};\r\n\r\n    /**\r\n     * 存储代码编辑器数据\r\n     */\r\n    codes = {};\r\n\r\n    @Input() apiName: any;\r\n    columns: any;\r\n    formColumns = [];\r\n    formColumnsTemp = [];\r\n    @Input() uuid: any;\r\n    @Input() openType: number;\r\n    @Input() defaultSelect: any;\r\n\r\n    itemData: any;\r\n    form: FormGroup;\r\n    @Output() submitSuccess = new EventEmitter<any>();\r\n    subscription: any;\r\n    submited: boolean;\r\n    // @ViewChild('ckEditor') ckEditorElem: ElementRef;\r\n    ckEditor = {};\r\n\r\n    // 图片裁剪\r\n    logoCutter: any;\r\n    cropperSettings: CropperSettings;\r\n    @ViewChild('cropper')\r\n    cropper: ImageCropperComponent;\r\n    @ViewChild('imgCropperRef') imgCropperRef: ElementRef;\r\n    @ViewChild('imgCropperModal') imgCropperModal: any;\r\n\r\n\r\n    private urlPre;\r\n\r\n    constructor(private fb: FormBuilder,\r\n        private emitService: MetaEmitService,\r\n        private msg: NzMessageService,\r\n        private metaService: MetamodelingService,\r\n        private modal: NzModalService,\r\n        private notification: NzNotificationService) {\r\n        this.uploadUrl = this.urlPre + 'api/fs/file/upload';\r\n        this.fileUrl = this.urlPre + 'api/fs/file/';\r\n    }\r\n\r\n\r\n    ngOnInit() {\r\n        this.cropperSettings = new CropperSettings();\r\n        this.cropperSettings.width = 100;\r\n        this.cropperSettings.height = 100;\r\n        this.cropperSettings.croppedWidth = 100;\r\n        this.cropperSettings.croppedHeight = 100;\r\n        this.cropperSettings.canvasWidth = 400;\r\n        this.cropperSettings.canvasHeight = 300;\r\n        this.cropperSettings.noFileInput = true;\r\n\r\n        this.logoCutter = {};\r\n        this.subscription = this.emitService.parentSubmit.subscribe(e => {\r\n            this.submited = true;\r\n            this.modelSubmit(this.form);\r\n        });\r\n\r\n        // this.form;\r\n    }\r\n\r\n    ngOnChanges(changes: SimpleChanges) {\r\n        console.log('ng on changes:{}')\r\n        this.uploadUrls = {};\r\n        this.getFormColumns();\r\n        // console.log('uploadUrls:', this.uploadUrls)\r\n        // console.log('objects:', this.objects)\r\n    }\r\n\r\n\r\n    // 获取form字段\r\n    getFormColumns() {\r\n        console.log('getFormColumns')\r\n        const modelMap = this.metaService.getModelMap();\r\n        this.formColumns = [];\r\n        this.formColumnsTemp = [];\r\n        this.columns = modelMap[this.apiName]['fields'];\r\n        console.log('getFormColumns columns', this.apiName, this.columns);\r\n        this.columns.forEach(col => {\r\n            if (col.gridShow) {\r\n                this.formColumns.push(col);\r\n            }\r\n        });\r\n\r\n        setTimeout(() => {\r\n            this.createForm();\r\n\r\n        });\r\n    }\r\n\r\n    createForm() {\r\n        console.log('create form')\r\n        const group = {};\r\n        this.formColumns.forEach(col => {\r\n            const validators = [];\r\n            // 将 props 字段转成 json\r\n            try {\r\n                col['props'] = col['props'] ? JSON.parse(col['props']) : {};\r\n            } catch (e){\r\n                col['props'] = {};\r\n            }\r\n            if(typeof col['formStyle'] != 'undefined' && typeof col['formStyle'] == 'string') {\r\n                col['formStyle'] =  JSON.parse(col['formStyle']);\r\n            } else {\r\n                col['formStyle']  =  col['formStyle']  || {};\r\n            }\r\n           //  = col['formStyle'] ? JSON.parse(col['formStyle']) : {};\r\n            // 设置校验\r\n            col['required'] = false;\r\n            if (col.validators) {\r\n                col.validators.forEach(valid => {\r\n                    // 转小写\r\n                    valid.lowerCase = valid.validator === 'minLength' || valid.validator === 'maxLength' ? valid.validator.toLowerCase() : valid.validator;\r\n                    // 针对required的单独处理\r\n                    if (valid.validator === 'required') {\r\n                        col.required = true;\r\n                        // required = true;\r\n                        validators.push(Validators[valid.validator]);\r\n                    } else {\r\n                        validators.push(Validators[valid.validator](valid.value));\r\n                    }\r\n                });\r\n            }\r\n            group[col.name] = ['', Validators.compose(validators)];\r\n            // 富文本编辑器处理\r\n            if (col.type === 'editor') {\r\n                this.setEditorContent(col);\r\n            }\r\n            // 获取下拉选项，在openChange时调用会造成页面抖动\r\n            if (col.type === 'object_uuid') {\r\n                this.handelObjectSelect(null, col);\r\n            }\r\n        });\r\n        console.log('create form now....',group);\r\n        this.form = this.fb.group(group);\r\n        //this.formColumns = this.formColumnsTemp;\r\n        if (this.openType === 2) {\r\n            this.modifyForm();\r\n\r\n        }\r\n        if (this.defaultSelect) {\r\n            this.setParentSelect();\r\n        }\r\n    }\r\n\r\n    // 设置默认选中项\r\n    setParentSelect() {\r\n        let parentCls = '';\r\n        this.formColumns.forEach(col => {\r\n            if (col.name === this.defaultSelect.name) {\r\n                col.show = false;\r\n            }\r\n        });\r\n        this.columns.forEach(col => {\r\n            if (col.name === this.defaultSelect['name']) {\r\n                parentCls = col.association.cls;\r\n                this.metaService.get(parentCls, this.defaultSelect['uuid'])\r\n                    .subscribe(res => {\r\n                        const obj = { [this.defaultSelect.name]: res.value };\r\n                        this.objects[col.name] = [];\r\n                        this.objects[col.name].push(res.value);\r\n                        this.form.patchValue({ [this.defaultSelect.name]: res.value });\r\n                    });\r\n            }\r\n        });\r\n        // this.form.patchValue({[this.parent.name]: ''})\r\n    }\r\n\r\n    modifyForm() {\r\n        this.metaService.get(this.apiName, this.uuid)\r\n            .subscribe(res => {\r\n                if (res.success) {\r\n                    this.itemData = res.value;\r\n\r\n                    console.log('metadata modify form:', this.itemData);\r\n                    const group = {};\r\n                    this.formColumns.forEach(col => {\r\n                        console.log('form element process col type:',col.type);\r\n                        switch (col.type) {\r\n                            case 'date':\r\n\r\n                                group[col.name] = new Date(this.itemData[col.name]);\r\n                                console.log('form element process date type:',group[col.name]);\r\n                                return;\r\n\r\n                            case 'time':\r\n                                group[col.name] = new Date(this.itemData[col.name]);\r\n                                return;\r\n\r\n                            case 'datetime':\r\n                                group[col.name] = new Date(this.itemData[col.name]);\r\n                                return;\r\n\r\n\r\n                        }\r\n\r\n                        // 上传文件处理\r\n                        if (col.type === 'image' && this.itemData[col.name]) {\r\n                            this.uploadUrls[col.name] = [];\r\n                            const images = this.itemData[col.name].split(',');\r\n                            images.forEach(image => {\r\n                                if (image) {\r\n                                    this.uploadUrls[col.name].push({ uuid: image, image: `${this.fileUrl}${image}` });\r\n                                }\r\n                            });\r\n                            // this.uploadUrls[col.name] = `${this.fileUrl}${this.itemData[col.name]}`;\r\n                        }\r\n                        if (col.type === 'attachment') {\r\n                            this.itemData[col.name] && (this.uploadUrls[col.name] = this.fileUrl + this.itemData[col.name]['uuid']);\r\n                            this.itemData[col.name] && (this.uploads[col.name] = this.itemData[col.name]);\r\n                        }\r\n                        // 关联对象处理\r\n                        if (col.type === 'object') {\r\n                            this.objects[col.name] = [];\r\n                            this.itemData[col.name] && this.objects[col.name].push(this.itemData[col.name]);\r\n                        }\r\n                        // 多选\r\n                        if (col.type === 'object_uuid') {\r\n                            if (this.itemData[col.name]) {\r\n                                this.itemData[col.name] = this.itemData[col.name].split(',');\r\n                            }\r\n                        }\r\n                        // 设置富文本编辑器内容\r\n                        if (col.type === 'editor' && this.itemData[col.name]) {\r\n                            setTimeout(() => {\r\n                                if( this.ckEditor[col.name]) {\r\n                                    this.ckEditor[col.name].setContent(this.itemData[col.name]);\r\n                                } else {\r\n                                    setTimeout(() => {\r\n                                       try {\r\n                                        this.ckEditor[col.name].setContent(this.itemData[col.name]);\r\n                                       } catch (error) {\r\n\r\n                                       }\r\n                                    },100);\r\n                                }\r\n\r\n                            }, 100);\r\n                        }\r\n\r\n                        // 代码编辑器处理\r\n                        if (col.type === 'code') {\r\n                            console.log('代码字段:', col, this.itemData[col['name']]);\r\n                            this.codes[col['name']] = this.itemData[col['name']];\r\n                        }\r\n                        group[col.name] = this.itemData[col.name];\r\n                    });\r\n                    console.log('before patch:',group);\r\n                    this.form.patchValue(group);\r\n                }\r\n            });\r\n    }\r\n\r\n    // 设置编辑器内容\r\n    setEditorContent(col) {\r\n        setTimeout(() => {\r\n            console.log('init editor')\r\n            if(tinyMCE) {\r\n                tinyMCE.remove(`#${col.name}`);\r\n\r\n            tinyMCE.init({\r\n                \"selector\": `#${col.name}`,\r\n                branding: false,\r\n                language:'zh_CN',\r\n                height: 200,\r\n                init_instance_callback: (editor) => {\r\n                    console.log('this.init.ckEditor:', col.name);\r\n                    this.ckEditor[col.name] = editor;\r\n                }\r\n            });\r\n            }\r\n\r\n        });\r\n\r\n\r\n        // setTimeout(() => {\r\n        //     // ClassicEditor.create(document.querySelector(`#${col.name}`), {\r\n        //     //     toolbar: [ 'heading', 'font', '|', 'bold', 'highlight', 'italic', 'link', 'bulletedList', 'numberedList', 'blockQuote', 'undo', 'redo']\r\n        //     // })\r\n        //     //     .then(editor => {\r\n        //     //         this.ckEditor[col.name] = editor;\r\n        //     //         editor.plugins.get('FileRepository').createUploadAdapter = loader => {\r\n        //     //             return new UploadAdapter(loader);\r\n        //     //         };\r\n        //     //     })\r\n        //     //     .catch(error => {\r\n        //     //         console.error(error);\r\n        //     //     });\r\n\r\n\r\n\r\n        // });\r\n    }\r\n\r\n\r\n    beforeUpload = (file: File) => {\r\n        const isJPG = file.type === 'image/jpeg';\r\n        if (!isJPG) {\r\n            // this.msg.error('You can only upload JPG file!');\r\n        }\r\n        const isLt2M = file.size / 1024 / 1024 < 2;\r\n        if (!isLt2M) {\r\n            // this.msg.error('Image must smaller than 2MB!');\r\n        }\r\n        return true;\r\n    }\r\n\r\n    private getBase64(img: File, callback: (img: any) => void) {\r\n        const reader = new FileReader();\r\n        reader.addEventListener('load', () => callback(reader.result));\r\n        reader.readAsDataURL(img);\r\n    }\r\n\r\n    // 上传图片正常\r\n    handleChange(info: { file: NzUploadFile }, fieldName, type) {\r\n        if (info.file.status === 'uploading') {\r\n            this.loading = true;\r\n            return;\r\n        }\r\n        if (info.file.status === 'done') {\r\n            if (info.file.response.success) {\r\n                const bean = info.file.response.value;\r\n                // 回显图片\r\n                this.getBase64(info.file.originFileObj, (img: any) => {\r\n                    this.loading = false;\r\n                    if (!this.uploadUrls[fieldName] || type === 'single') {\r\n                        this.uploadUrls[fieldName] = [];\r\n                    }\r\n                    this.uploadUrls[fieldName].push({ uuid: bean.uuid, image: img });\r\n                });\r\n            } else {\r\n                this.msg.error('文件上传错误:' + info.file.response.message);\r\n            }\r\n        }\r\n    }\r\n\r\n    // 上传图片裁剪\r\n    imgCropperChanged(type, fieldName, e) {\r\n        const image: any = new Image();\r\n        const file: File = e.target.files[0];\r\n        const myReader: FileReader = new FileReader();\r\n        const that = this;\r\n        myReader.onloadend = function (loadEvent: any) {\r\n            image.src = loadEvent.target.result;\r\n            that.cropper.setImage(image);\r\n        };\r\n        myReader.readAsDataURL(file);\r\n        this.modal.create({\r\n            nzTitle: '编辑图片',\r\n            nzContent: this.imgCropperModal,\r\n            nzOnOk: () => {\r\n                this.metaService.uploadBase64Img({ fileName: file.name }, this.logoCutter.image)\r\n                    .subscribe(res => {\r\n                        if (res.success) {\r\n                            if (!this.uploadUrls[fieldName] || type === 'single') {\r\n                                this.uploadUrls[fieldName] = [];\r\n                            }\r\n                            this.uploadUrls[fieldName].push({ uuid: res.value.uuid, image: `${this.fileUrl}${res.value.uuid}` });\r\n                            this.imgCropperRef.nativeElement.value = '';\r\n                        }\r\n                    });\r\n            },\r\n            nzOnCancel: () => {\r\n                this.imgCropperRef.nativeElement.value = '';\r\n            }\r\n        });\r\n    }\r\n\r\n    // 多图上传删除\r\n    removeImage(image, fileName) {\r\n        this.uploadUrls[fileName].forEach((img, ind) => {\r\n            if (image === img) {\r\n                this.uploadUrls[fileName].splice(ind, 1);\r\n            }\r\n        });\r\n    }\r\n\r\n    // 上传文件\r\n    fileChanged(e, fieldName) {\r\n        if (e.file.status === 'done') {\r\n            if (e.file.response.success) {\r\n                const bean = e.file.response.value;\r\n                const obj = {};\r\n                // obj[fieldName] = bean.uuid;\r\n                // 文件对象保存整个 FileResource 对象\r\n                obj[fieldName] = bean;\r\n                this.uploadUrls[fieldName] = `${this.fileUrl}${bean.uuid}`;\r\n                this.uploadUrls[`${fieldName}Name`] = bean.name;\r\n                this.uploads[fieldName] = bean;\r\n                this.form.patchValue(obj);\r\n            } else {\r\n                this.msg.error('文件上传错误:' + e.file.response.message);\r\n            }\r\n        }\r\n    }\r\n\r\n    /**\r\n     * 关联对象下拉选择\r\n     * @param\r\n     */\r\n    handelObjectSelect($event, column) {\r\n        const cls = column['association']['cls'];\r\n        this.metaService.query(cls)\r\n            .subscribe(result => {\r\n                if (result.success) {\r\n                    this.objects[column['name']] = result.list;\r\n                } else {\r\n\r\n                }\r\n            });\r\n    }\r\n\r\n    // 提交\r\n    modelSubmit(form) {\r\n        this.columns.forEach(col => {\r\n            // 富文本\r\n            if (col.type === 'editor') {\r\n                form.value[col.name] = this.ckEditor[col.name].getContent();\r\n            }\r\n            // 时间\r\n            if (col.type === 'date' || col.type === 'time' || col.type === 'datetime') {\r\n                if (form.value[col.name] && typeof form.value[col.name]['getTime'] !== 'undefined') {\r\n                    form.value[col.name] = form.value[col.name].getTime();\r\n                }\r\n            }\r\n            // 代码编辑器处理\r\n            if (col.type === 'code') {\r\n                form.value[col.name] = this.codes[col.name];\r\n            }\r\n            // 将多选数组转化为字符串\r\n            if (col.type === 'object_uuid' && form.value[col.name] && typeof form.value[col.name].join !== 'undefined') {\r\n                const obj = {};\r\n                obj[col.name] = form.value[col.name].join(',');\r\n                form.patchValue(obj);\r\n            }\r\n\r\n            if(col.type === 'object')  {\r\n                // 对象处理\r\n                console.log('object:',form.value[col.name])\r\n                if(form.value[col.name] == '' || typeof form.value[col.name] != 'object') {\r\n                    delete form.value[col.name];\r\n                }\r\n\r\n            }\r\n\r\n            // 将图片数组转化为字符串\r\n            if (col.type === 'image' || col.type === 'image_crop') {\r\n                const images = [];\r\n                const obj = {};\r\n                if (this.uploadUrls[col.name]) {\r\n                    this.uploadUrls[col.name].forEach(img => {\r\n                        if (img) {\r\n                            images.push(img.uuid);\r\n                        }\r\n                    });\r\n                    obj[col.name] = images && images.length ? images.join(',') : '';\r\n                    form.patchValue(obj);\r\n                }\r\n            }\r\n        });\r\n        // 验证不通过不提交\r\n        if (this.form.invalid) {\r\n            return;\r\n        }\r\n        // openType = 1为添加 openType = 2为更改\r\n        if (this.openType === 2) {\r\n            // 更改\r\n            for (const key in form.value) {\r\n                this.itemData[key] = form.value[key];\r\n            }\r\n            this.metaService.update(this.apiName, this.itemData)\r\n                .subscribe(result => {\r\n                    this.submited = false;\r\n                    if (result.success) {\r\n                        this.submitSuccess.emit(result.value);\r\n                        this.notification.create('success', '提示信息', '更新成功');\r\n                    } else {\r\n                        this.notification.create('error', '错误信息', result.message);\r\n                    }\r\n                });\r\n        } else {\r\n            // 添加\r\n            this.metaService.add(this.apiName, form.value)\r\n                .subscribe(result => {\r\n                    this.submited = false;\r\n                    if (result.success) {\r\n                        this.submitSuccess.emit(result.value);\r\n                        this.notification.create('success', '提示信息', '添加成功');\r\n                    } else {\r\n                        this.notification.create('error', '错误信息', result.message);\r\n                    }\r\n                });\r\n        }\r\n    }\r\n\r\n    ngOnDestroy() {\r\n        this.subscription.unsubscribe();\r\n    }\r\n}\r\n","<form nz-form *ngIf=\"formColumns.length && form\" [formGroup]=\"form\" >\r\n\r\n    <ng-container *ngFor=\"let column of formColumns\">\r\n\r\n            <ng-container *ngIf=\"column.show\" [ngSwitch]=\"column.type\">\r\n                <!--文本-->\r\n                <nz-form-item *ngSwitchCase=\"'text'\">\r\n                    <nz-form-label [nzRequired]=\"column.required\"   [nzSpan]=\"6\">\r\n                        {{column.title}}\r\n                        <span nz-tooltip *ngIf=\"column.infomation\" [nzTooltipTitle]=\"column.infomation\">\r\n                            <i nz-tooltip class=\"anticon anticon-question-circle-o\"></i>\r\n                          </span>\r\n                    </nz-form-label>\r\n                    <nz-form-control [nzSpan]=\"14\" >\r\n                        <input nz-input [ngStyle]=\"column.formStyle\" [attr.placeholder]=\"column.placeholder\" [formControlName]=\"column.name\">\r\n                        <ng-container *ngIf=\"form.controls[column.name].dirty || form.controls[column.name].touched || submited\">\r\n                            <ng-container *ngFor=\"let err of column.validators\">\r\n                                <!-- <nz-form-explain *ngIf=\"form.controls[column.name].errors && form.controls[column.name].errors[err?.lowerCase]\">{{err?.message}}</nz-form-explain> -->\r\n                            </ng-container>\r\n                        </ng-container>\r\n                    </nz-form-control>\r\n                </nz-form-item>\r\n                <!--多行文本-->\r\n                <nz-form-item *ngSwitchCase=\"'textarea'\">\r\n                    <nz-form-label [nzRequired]=\"column.required\"   [nzSpan]=\"6\">\r\n                        {{column.title}}\r\n                        <span nz-tooltip *ngIf=\"column.infomation\" [nzTooltipTitle]=\"column.infomation\">\r\n                            <i nz-tooltip class=\"anticon anticon-question-circle-o\"></i>\r\n                          </span>\r\n                    </nz-form-label>\r\n                    <nz-form-control  [nzSpan]=\"14\" >\r\n                        <textarea nz-input [ngStyle]=\"column.formStyle\" [placeholder]=\"column.placeholder\" [formControlName]=\"column.name\">\r\n                            </textarea>\r\n                        <ng-container *ngIf=\"form.controls[column.name].dirty || form.controls[column.name].touched || submited\">\r\n                            <div *ngFor=\"let err of column.validators\">\r\n                                <!-- <nz-form-explain *ngIf=\"form.controls[column.name].errors && form.controls[column.name].errors[err?.lowerCase]\">{{err?.message}}</nz-form-explain> -->\r\n                            </div>\r\n                        </ng-container>\r\n                    </nz-form-control>\r\n                </nz-form-item>\r\n                <!--富文本-->\r\n                <nz-form-item *ngSwitchCase=\"'editor'\">\r\n                    \r\n                    <nz-form-label [nzRequired]=\"column.required\"  [nzSpan]=\"6\">\r\n                        {{column.title}}\r\n                        <span nz-tooltip *ngIf=\"column.infomation\" [nzTooltipTitle]=\"column.infomation\">\r\n                            <i nz-tooltip class=\"anticon anticon-question-circle-o\"></i>\r\n                          </span>\r\n                    </nz-form-label>\r\n                    <nz-form-control  [nzSpan]=\"14\" >\r\n                        <textarea [name]=\"column.name\" [formControlName]=\"column.name\" style=\"display: none;\"></textarea>\r\n                        <div [ngStyle]=\"column.formStyle\" [attr.id]=\"column.name\"></div>\r\n                        <ng-container *ngIf=\"form.controls[column.name].dirty || form.controls[column.name].touched || submited\">\r\n                            <div *ngFor=\"let err of column.validators\">\r\n                                <!-- <nz-form-explain *ngIf=\"form.controls[column.name].errors && form.controls[column.name].errors[err?.lowerCase]\">\r\n                                    {{err?.message}}\r\n                                </nz-form-explain> -->\r\n                            </div>\r\n                        </ng-container>\r\n                    </nz-form-control>\r\n                </nz-form-item>\r\n\r\n\r\n                <!--代码编辑器-->\r\n                <!-- <nz-form-item *ngSwitchCase=\"'code'\">\r\n                    <nz-form-label [nzRequired]=\"column.required\"   [nzSpan]=\"6\">\r\n                        {{column.title}}\r\n                        <nz-tooltip *ngIf=\"column.infomation\" [nzTitle]=\"column.infomation\">\r\n                            <i nz-tooltip class=\"anticon anticon-question-circle-o\"></i>\r\n                          </nz-tooltip>\r\n                    </nz-form-label>\r\n                    <nz-form-control   [nzSpan]=\"14\" >\r\n                        <ngx-monaco-editor class=\"border\" [formControlName]=\"column.name\" [options]=\"column.props.options\" [ngStyle]=\"column.formStyle\"\r\n                            [(ngModel)]=\"codes[column.name]\"></ngx-monaco-editor>\r\n                        <ng-container *ngIf=\"form.controls[column.name].dirty || form.controls[column.name].touched || submited\">\r\n                            <div *ngFor=\"let err of column.validators\">\r\n                                <nz-form-explain  \r\n                                *ngIf=\"form.controls[column.name].errors && form.controls[column.name].errors[err?.lowerCase]\">\r\n                                {{err?.message}}</nz-form-explain>\r\n                            </div>\r\n                        </ng-container>\r\n                    </nz-form-control>\r\n                </nz-form-item> -->\r\n\r\n                <!--数字-->\r\n                <nz-form-item *ngSwitchCase=\"'number'\">\r\n                    <nz-form-label [nzRequired]=\"column.required\"   [nzSpan]=\"6\">\r\n                        {{column.title}}\r\n                        <span nz-tooltip *ngIf=\"column.infomation\" [nzTooltipTitle]=\"column.infomation\">\r\n                            <i nz-tooltip class=\"anticon anticon-question-circle-o\"></i>\r\n                          </span>\r\n                    </nz-form-label>\r\n                    <nz-form-control   [nzSpan]=\"14\" >\r\n                        <nz-input-number [ngStyle]=\"column.formStyle\" [nzPlaceHolder]=\"column.placeholder\" [formControlName]=\"column.name\"></nz-input-number>\r\n                        <ng-container *ngIf=\"form.controls[column.name].dirty || form.controls[column.name].touched || submited\">\r\n                            <div *ngFor=\"let err of column.validators\">\r\n                                <!-- <nz-form-explain *ngIf=\"form.controls[column.name].errors && form.controls[column.name].errors[err?.lowerCase]\">{{err?.message}}</nz-form-explain> -->\r\n                            </div>\r\n                        </ng-container>\r\n                    </nz-form-control>\r\n                </nz-form-item>\r\n                <!--密码-->\r\n                <nz-form-item *ngSwitchCase=\"'password'\">\r\n                    <nz-form-label  [nzRequired]=\"column.required\"  [nzSpan]=\"6\">\r\n                        {{column.title}}\r\n                        <span nz-tooltip *ngIf=\"column.infomation\" [nzTooltipTitle]=\"column.infomation\">\r\n                            <i nz-tooltip class=\"anticon anticon-question-circle-o\"></i>\r\n                          </span>\r\n                    </nz-form-label>\r\n                    <nz-form-control   [nzSpan]=\"14\" >\r\n                        <input [ngStyle]=\"column.formStyle\" [placeholder]=\"column.placeholder\" nz-input [formControlName]=\"column.name\" type=\"password\">\r\n                        <ng-container *ngIf=\"form.controls[column.name].dirty || form.controls[column.name].touched || submited\">\r\n                            <div *ngFor=\"let err of column.validators\">\r\n                                <!-- <nz-form-explain *ngIf=\"form.controls[column.name].errors && form.controls[column.name].errors[err?.lowerCase]\">{{err?.message}}</nz-form-explain> -->\r\n                            </div>\r\n                        </ng-container>\r\n                    </nz-form-control >\r\n                </nz-form-item>\r\n                <!--开关-->\r\n                <nz-form-item *ngSwitchCase=\"'switch'\">\r\n                    <nz-form-label [nzRequired]=\"column.required\"   [nzSpan]=\"6\">\r\n                        {{column.title}}\r\n                        <span nz-tooltip *ngIf=\"column.infomation\" [nzTooltipTitle]=\"column.infomation\">\r\n                            <i nz-tooltip class=\"anticon anticon-question-circle-o\"></i>\r\n                          </span>\r\n                    </nz-form-label >\r\n                    <nz-form-control   [nzSpan]=\"14\" >\r\n                        <nz-switch [ngStyle]=\"column.formStyle\" [formControlName]=\"column.name\" [nzSize]=\"'large'\"></nz-switch>\r\n                        <ng-container *ngIf=\"form.controls[column.name].dirty || form.controls[column.name].touched || submited\">\r\n                            <div *ngFor=\"let err of column.validators\">\r\n                                <!-- <nz-form-explain *ngIf=\"form.controls[column.name].errors && form.controls[column.name].errors[err?.lowerCase]\">{{err?.message}}</nz-form-explain> -->\r\n                            </div>\r\n                        </ng-container>\r\n                    </nz-form-control>\r\n                </nz-form-item>\r\n                <!--日期-->\r\n                <nz-form-item *ngSwitchCase=\"'date'\">\r\n                    <nz-form-label [nzRequired]=\"column.required\"   [nzSpan]=\"6\">\r\n                        {{column.title}}\r\n                        <span nz-tooltip *ngIf=\"column.infomation\" [nzTooltipTitle]=\"column.infomation\">\r\n                            <i nz-tooltip class=\"anticon anticon-question-circle-o\"></i>\r\n                          </span>\r\n                    </nz-form-label>\r\n                    <nz-form-control   [nzSpan]=\"14\" >\r\n                        <nz-date-picker [ngStyle]=\"column.formStyle\" [nzPlaceHolder]=\"column.placeholder\" [formControlName]=\"column.name\"></nz-date-picker>\r\n                        <ng-container *ngIf=\"form.controls[column.name].dirty || form.controls[column.name].touched || submited\">\r\n                            <div *ngFor=\"let err of column.validators\">\r\n                                <!-- <nz-form-explain *ngIf=\"form.controls[column.name].errors && form.controls[column.name].errors[err?.lowerCase]\">{{err?.message}}</nz-form-explain> -->\r\n                            </div>\r\n                        </ng-container>\r\n                    </nz-form-control>\r\n                </nz-form-item>\r\n                <!--时间-->\r\n                <nz-form-item *ngSwitchCase=\"'time'\">\r\n                    <nz-form-label [nzRequired]=\"column.required\"  [nzSpan]=\"6\">\r\n                        {{column.title}}\r\n                        <span nz-tooltip *ngIf=\"column.infomation\" [nzTooltipTitle]=\"column.infomation\">\r\n                            <i nz-tooltip class=\"anticon anticon-question-circle-o\"></i>\r\n                          </span>\r\n                    </nz-form-label >\r\n                    <nz-form-control   [nzSpan]=\"14\" >\r\n                        <nz-time-picker [ngStyle]=\"column.formStyle\" [nzPlaceHolder]=\"column.placeholder\" [formControlName]=\"column.name\"></nz-time-picker>\r\n                        <ng-container *ngIf=\"form.controls[column.name].dirty || form.controls[column.name].touched || submited\">\r\n                            <div *ngFor=\"let err of column.validators\">\r\n                                <!-- <nz-form-explain *ngIf=\"form.controls[column.name].errors && form.controls[column.name].errors[err?.lowerCase]\">{{err?.message}}</nz-form-explain> -->\r\n                            </div>\r\n                        </ng-container>\r\n                    </nz-form-control>\r\n                </nz-form-item>\r\n                <!--日期时间-->\r\n                <nz-form-item *ngSwitchCase=\"'datetime'\">\r\n                    <nz-form-label [nzRequired]=\"column.required\"  [nzSpan]=\"6\">\r\n                        {{column.title}}\r\n                        <span nz-tooltip *ngIf=\"column.infomation\" [nzTooltipTitle]=\"column.infomation\">\r\n                            <i nz-tooltip class=\"anticon anticon-question-circle-o\"></i>\r\n                          </span>\r\n                    </nz-form-label>\r\n                    <nz-form-control   [nzSpan]=\"14\" >\r\n                        <nz-date-picker [ngStyle]=\"column.formStyle\" [nzPlaceHolder]=\"column.placeholder\" [formControlName]=\"column.name\" nzShowTime\r\n                            [nzFormat]=\"'YYYY-MM-DD HH:mm:ss'\"></nz-date-picker>\r\n                        <ng-container *ngIf=\"form.controls[column.name].dirty || form.controls[column.name].touched || submited\">\r\n                            <div *ngFor=\"let err of column.validators\">\r\n                                <!-- <nz-form-explain *ngIf=\"form.controls[column.name].errors && form.controls[column.name].errors[err?.lowerCase]\">{{err?.message}}</nz-form-explain> -->\r\n                            </div>\r\n                        </ng-container>\r\n                    </nz-form-control>\r\n                </nz-form-item>\r\n                <!--图片上传正常-->\r\n                <nz-form-item *ngSwitchCase=\"'image'\">\r\n                    <nz-form-label [nzRequired]=\"column.required\"   [nzSpan]=\"6\">\r\n                        {{column.title}}\r\n                        <span nz-tooltip *ngIf=\"column.infomation\" [nzTooltipTitle]=\"column.infomation\">\r\n                            <i nz-icon nz-tooltip nzType=\"cloud-upload\" nzTheme=\"outline\"></i>\r\n                          </span>\r\n                    </nz-form-label>\r\n                    <nz-form-control  [nzSpan]=\"14\" >\r\n                        <input nz-input [formControlName]=\"column.name\" [placeholder]=\"column.placeholder\" style=\"display:none;\">\r\n                        <!--单图上传-->\r\n                        <nz-upload [nzWithCredentials]=\"true\" class=\"avatar-uploader\" *ngIf=\"!column.multiple\" [nzAction]=\"uploadUrl\" nzName=\"file\" [nzShowUploadList]=\"false\"\r\n                            [nzBeforeUpload]=\"beforeUpload\" (nzChange)=\"handleChange($event,column.name,'single')\">\r\n                            <i nz-icon  nzType=\"cloud-upload\" class=\"anticon anticon-plus avatar-uploader-trigger\" *ngIf=\"!uploadUrls[column.name]||!uploadUrls[column.name].length\"></i>\r\n                            <img *ngIf=\"uploadUrls[column.name]&&uploadUrls[column.name].length\" [src]=\"uploadUrls[column.name][0]['image']\" class=\"avatar\">\r\n                        </nz-upload>\r\n                        <!--多图上传-->\r\n                        <div class=\"image-upload\" *ngIf=\"column.multiple\">\r\n                            <p class=\"image-item\" *ngFor=\"let img of uploadUrls[column.name]\">\r\n                                <i nz-icon  nzType=\"cloud-upload\" class=\"anticon anticon-minus-circle\" (click)=\"removeImage(img, column.name)\"></i>\r\n                                <span class=\"image\">\r\n                                    <img [src]=\"img.image\" class=\"avatar\">\r\n                                </span>\r\n                            </p>\r\n                            <nz-upload class=\"avatar-uploader\" [nzAction]=\"uploadUrl\" nzName=\"file\" [nzShowUploadList]=\"false\" [nzBeforeUpload]=\"beforeUpload\"\r\n                                (nzChange)=\"handleChange($event,column.name,'multiple')\">\r\n                                <i nz-icon  nzType=\"cloud-upload\" class=\"anticon anticon-plus avatar-uploader-trigger\"></i>\r\n                            </nz-upload>\r\n                        </div>\r\n                        <!--错误提示-->\r\n                        <ng-container *ngIf=\"form.controls[column.name].dirty || form.controls[column.name].touched || submited\">\r\n                            <div *ngFor=\"let err of column.validators\">\r\n                                <!-- <nz-form-explain *ngIf=\"form.controls[column.name].errors && form.controls[column.name].errors[err?.lowerCase]\">{{err?.message}}</nz-form-explain> -->\r\n                            </div>\r\n                        </ng-container>\r\n                    </nz-form-control >\r\n                </nz-form-item>\r\n                <!--图片上传裁剪-->\r\n                <nz-form-item *ngSwitchCase=\"'image_crop'\">\r\n                    <nz-form-label [nzRequired]=\"column.required\"   [nzSpan]=\"6\">\r\n                        {{column.title}}\r\n                        <span nz-tooltip *ngIf=\"column.infomation\" [nzTooltipTitle]=\"column.infomation\">\r\n                            <i nz-tooltip class=\"anticon anticon-question-circle-o\"></i>\r\n                          </span>\r\n                    </nz-form-label>\r\n                    <nz-form-control   [nzSpan]=\"14\" >\r\n                        <input nz-input [formControlName]=\"column.name\" [placeholder]=\"column.placeholder\" style=\"display:none;\">\r\n                        <!--多图上传-->\r\n                        <div class=\"image-upload\" *ngIf=\"column.multiple\">\r\n                            <p class=\"image-item\" *ngFor=\"let img of uploadUrls[column.name]\">\r\n                                <i class=\"anticon anticon-minus-circle\" (click)=\"removeImage(img, column.name)\"></i>\r\n                                <span class=\"image\">\r\n                                    <img [src]=\"img.image\" class=\"avatar\">\r\n                                </span>\r\n                            </p>\r\n                            <div class=\"img-cutter\">\r\n                                <label for=\"imgCropper\">\r\n                                    <input type=\"file\" id=\"imgCropper\" (change)=\"imgCropperChanged('multiple', column.name ,$event)\" #imgCropperRef>\r\n                                    <i class=\"anticon anticon-plus\"></i>\r\n                                </label>\r\n                            </div>\r\n                        </div>\r\n                        <!--单图上传-->\r\n                        <div class=\"img-cutter\" *ngIf=\"!column.multiple\">\r\n                            <label for=\"imgCropperA\">\r\n                                <input type=\"file\" id=\"imgCropperA\" (change)=\"imgCropperChanged('single', column.name, $event)\" #imgCropperRef>\r\n                                <i *ngIf=\"!uploadUrls[column.name]||!uploadUrls[column.name].length\" class=\"anticon anticon-plus\"></i>\r\n                                <img *ngIf=\"uploadUrls[column.name]&&uploadUrls[column.name].length\" [src]=\"uploadUrls[column.name][0]['image']\">\r\n                            </label>\r\n                        </div>\r\n                        <!--错误提示-->\r\n                        <ng-container *ngIf=\"form.controls[column.name].dirty || form.controls[column.name].touched || submited\">\r\n                            <div *ngFor=\"let err of column.validators\">\r\n                                <!-- <nz-form-explain  *ngIf=\"form.controls[column.name].errors && form.controls[column.name].errors[err?.lowerCase]\">{{err?.message}}</nz-form-explain> -->\r\n                            </div>\r\n                        </ng-container>\r\n                    </nz-form-control>\r\n                </nz-form-item>\r\n                <!--附件-->\r\n                <nz-form-item *ngSwitchCase=\"'attachment'\">\r\n                    <nz-form-label [nzRequired]=\"column.required\"  [nzSpan]=\"6\">\r\n                        {{column.title}}\r\n                        <span nz-tooltip *ngIf=\"column.infomation\" [nzTooltipTitle]=\"column.infomation\">\r\n                            <i nz-tooltip class=\"anticon anticon-question-circle-o\"></i>\r\n                          </span>\r\n                    </nz-form-label>\r\n                    <nz-form-control   [nzSpan]=\"14\" >\r\n                        <a class=\"mr-sm\" *ngIf=\"uploadUrls[column.name]\" target=\"_blank\" [href]=\"uploadUrls[column.name]\" [download]=\"uploadUrls[column.name+'Name']\">{{uploads[column.name]['name'] || column.title}}</a>\r\n                        <nz-upload [nzAction]=\"uploadUrl\" nzName=\"file\" [nzShowUploadList]=\"false\" (nzChange)=\"fileChanged($event,column.name)\">\r\n                            <button nz-button>\r\n                                <i class=\"anticon anticon-upload\"></i>\r\n                                <span>上传</span>\r\n                            </button>\r\n                        </nz-upload>\r\n                        <ng-container *ngIf=\"form.controls[column.name].dirty || form.controls[column.name].touched || submited\">\r\n                            <div *ngFor=\"let err of column.validators\">\r\n                                <!-- <nz-form-explain *ngIf=\"form.controls[column.name].errors && form.controls[column.name].errors[err?.lowerCase]\">{{err?.message}}</nz-form-explain> -->\r\n                            </div>\r\n                        </ng-container>\r\n                    </nz-form-control>\r\n                </nz-form-item>\r\n                <!--对象选择-->\r\n                <nz-form-item *ngSwitchCase=\"'object'\">\r\n                    <nz-form-label [nzRequired]=\"column.required\"  [nzSpan]=\"6\">\r\n                        <span>{{column.infomation}}</span>\r\n                        {{column.title}}\r\n                        <span nz-tooltip *ngIf=\"column.infomation\" [nzTooltipTitle]=\"column.infomation\">\r\n                            <i nz-tooltip class=\"anticon anticon-question-circle-o\"></i>\r\n                          </span>\r\n                    </nz-form-label>\r\n                    <nz-form-control  [nzSpan]=\"14\" >\r\n                        <!--<nz-modal-select [options]=\"column\" [formControlName]=\"column.name\" [control]=\"form.controls[column.name]\" ngDefaultControl></nz-modal-select>-->\r\n                        <nz-select nzShowSearch [ngStyle]=\"column.formStyle\" [nzPlaceHolder]=\"column.placeholder\" [formControlName]=\"column.name\" (nzOpenChange)=\"handelObjectSelect($event,column)\">\r\n                            <nz-option *ngFor=\"let opt of objects[column.name]\" [nzValue]=\"opt\" [nzLabel]=\"opt[column.association.labelField]\"></nz-option>\r\n                        </nz-select>\r\n                        <ng-container *ngIf=\"form.controls[column.name].dirty || form.controls[column.name].touched || submited\">\r\n                            <div *ngFor=\"let err of column.validators\">\r\n                                <!-- <nz-form-explain *ngIf=\"form.controls[column.name].errors && form.controls[column.name].errors[err?.lowerCase]\">{{err?.message}}</nz-form-explain> -->\r\n                            </div>\r\n                        </ng-container>\r\n                    </nz-form-control>\r\n                </nz-form-item>\r\n                <!--多选-->\r\n                <nz-form-item *ngSwitchCase=\"'object_uuid'\">\r\n                    <nz-form-label [nzRequired]=\"column.required\"  [nzSpan]=\"6\">\r\n                        {{column.title}}\r\n                        <span nz-tooltip *ngIf=\"column.infomation\" [nzTooltipTitle]=\"column.infomation\">\r\n                            <i nz-tooltip class=\"anticon anticon-question-circle-o\"></i>\r\n                        </span>\r\n                    </nz-form-label>\r\n                    <nz-form-control  [nzSpan]=\"14\" >\r\n                        <nz-select [nzMode]=\"'multiple'\" [ngStyle]=\"column.formStyle\" [nzPlaceHolder]=\"column.placeholder\" [formControlName]=\"column.name\"\r\n                            [nzNotFoundContent]=\"'无法找到'\">\r\n                            <nz-option *ngFor=\"let opt of objects[column.name]\" [nzValue]=\"opt.uuid\" [nzLabel]=\"opt[column.association.labelField]\">\r\n                            </nz-option>\r\n                        </nz-select>\r\n                        <ng-container *ngIf=\"form.controls[column.name].dirty || form.controls[column.name].touched || submited\">\r\n                            <div *ngFor=\"let err of column.validators\">\r\n                                <!-- <nz-form-explain *ngIf=\"form.controls[column.name].errors && form.controls[column.name].errors[err?.lowerCase]\">{{err?.message}}</nz-form-explain> -->\r\n                            </div>\r\n                        </ng-container>\r\n                    </nz-form-control>\r\n                </nz-form-item>\r\n                <!--下拉选择-->\r\n                <nz-form-item *ngSwitchCase=\"'select'\">\r\n                    <nz-form-label [nzRequired]=\"column.required\"   [nzSpan]=\"6\">\r\n                        {{column.title}}\r\n                        <span nz-tooltip *ngIf=\"column.infomation\" [nzTooltipTitle]=\"column.infomation\">\r\n                            <i nz-tooltip class=\"anticon anticon-question-circle-o\"></i>\r\n                          </span>\r\n                    </nz-form-label>\r\n                    <nz-form-control   [nzSpan]=\"14\" >\r\n                        <nz-select [ngStyle]=\"column.formStyle\" [formControlName]=\"column.name\" [nzPlaceHolder]=\"column.placeholder\">\r\n                            <nz-option *ngFor=\"let opt of column.option\" [nzValue]=\"opt.value\" [nzLabel]=\"opt.label\"></nz-option>\r\n                        </nz-select>\r\n                        <ng-container *ngIf=\"form.controls[column.name].dirty || form.controls[column.name].touched || submited\">\r\n                            <div *ngFor=\"let err of column.validators\">\r\n                                <!-- <nz-form-explain *ngIf=\"form.controls[column.name].errors && form.controls[column.name].errors[err?.lowerCase]\">{{err?.message}}</nz-form-explain> -->\r\n                            </div>\r\n                        </ng-container>\r\n                    </nz-form-control >\r\n                </nz-form-item>\r\n            </ng-container>\r\n    </ng-container>\r\n</form>\r\n\r\n<ng-template #imgCropperModal>\r\n    <img-cropper #cropper [image]=\"logoCutter\" [settings]=\"cropperSettings\" noFileInput></img-cropper>\r\n</ng-template>","import {Component, Input, OnInit} from '@angular/core';\nimport { NzModalRef } from 'ng-zorro-antd/modal';\nimport {ActivatedRoute, Router} from '@angular/router';\nimport { MetaEmitService } from '../service/meta-emit.service';\n\n@Component({\n  selector: 'nz-form-dialog',\n  templateUrl: './nz-form-dialog.component.html',\n  styleUrls: ['./nz-form-dialog.component.less']\n})\nexport class NzFormDialogComponent implements OnInit {\n\n    id: string;\n    modalOpenType: string;\n    className: any;\n    link: string;\n    parentObj: any;\n    parent: any;\n    @Input()\n    set apiName(value: string) {\n        this.className = value;\n    }\n    @Input()\n    set uuid(value: string) {\n        this.id = value;\n    }\n    // 编辑类型，添加或编辑\n    @Input()\n    set openType(value: string) {\n        this.modalOpenType = value;\n    }\n    // 完成后跳转的地址\n    @Input()\n    set linkTo(value: string) {\n        this.link = value;\n    }\n    // 表单中为某个字段设置默认值\n    @Input()\n    set defaultSelect(value) {\n        this.parentObj = value;\n    }\n    constructor(private modalSubject: NzModalRef,\n                private emitService: MetaEmitService,\n                private router: Router,\n                private route: ActivatedRoute) { }\n\n    ngOnInit() {\n\n    }\n\n    save() {\n        this.emitService.parentSubmit.emit();\n    }\n\n    cancel() {\n        this.modalSubject.destroy('onCancel');\n    }\n\n    submitSuccess(e) {\n        this.modalSubject.destroy('onOk');\n        // this.modalSubject.next(e);\n        if (this.link) {\n            this.router.navigate([this.link, {uuid: e.uuid, title: e.title}], {relativeTo: this.route});\n        }\n    }\n\n}\n","<nz-form-element [uuid]=\"id\"\n                 [openType]=\"modalOpenType\"\n                 (submitSuccess)=\"submitSuccess($event)\"\n                 [apiName]=\"className\"\n                 [defaultSelect]=\"parentObj\"></nz-form-element>\n<div nz-row class=\"dialog-footer\">\n    <div nz-col [nzSpan]=\"24\" class=\"text-right\">\n        <div class=\"dialog-actions\">\n            <button nz-button [nzType]=\"'default'\"  (click)=\"cancel()\">\n                取消\n            </button>\n            <button nz-button [nzType]=\"'primary'\" (click)=\"save()\">\n                确定 \n            </button>\n        </div>\n      \n    </div>\n</div>\n","import { MetamodelingService } from '@liangdi/metamodeling-service';\nimport {Component, Input, OnInit, Output, EventEmitter, OnChanges, ViewChild, SimpleChanges} from '@angular/core';\nimport {FormGroup} from '@angular/forms';\n\n@Component({\n  selector: 'nz-filter-element',\n  templateUrl: './nz-filter-element.component.html',\n})\nexport class NzFilterElementComponent implements OnInit, OnChanges {\n\n    isCollapse: boolean;\n    showCollapse = true;\n    objects = {};\n\n    @Input() columns: any;\n    @Output() submited = new EventEmitter<any>();\n    @Output() clear = new EventEmitter<any>();\n    @ViewChild('form') form: FormGroup;\n    constructor(private metaService: MetamodelingService) { }\n\n    ngOnInit() {\n    }\n\n    ngOnChanges(changes: SimpleChanges) {\n        if (changes.columns) {\n            this.showCollapse = this.columns.length > 3;\n            // 搜索条件为对象时选中处理\n            this.columns.forEach(col => {\n                if (!col.value) {\n                    col.value = '';\n                }\n                if (col.type === 'object') {\n                    this.getObjects(col).then((res) => {\n                        res.forEach(item => {\n                            if (item.uuid === col.value) {\n                                col.value = item;\n                            }\n                        });\n                    });\n                } else if ((col.type === 'date' || col.type === 'time' || col.type === 'datetime') && col.value) {\n                    col.value = new Date(col.value - 0);\n                    console.log('data value:',col.value);\n                }\n            });\n        }\n    }\n\n    handelObjectSelect($event, column) {\n        this.getObjects(column);\n    }\n\n    getObjects(column): Promise<any> {\n        const cls = column['association']['cls'];\n        return new Promise<any>((resolve, reject) => {\n            this.metaService.query(cls)\n                .subscribe(result => {\n                    if (result.success) {\n                        this.objects[column['name']] = result.list;\n                        resolve(result.list);\n                    }\n                });\n        });\n    }\n\n    search(form) {\n        this.submited.emit(form);\n    }\n\n    _clear(form) {\n        this.form.reset();\n        this.clear.emit(form);\n    }\n\n    toggleCollapse() {\n        this.isCollapse = !this.isCollapse;\n        this.columns.forEach((c, index) => {\n            c.show = this.isCollapse ? (index < 3) : true;\n        });\n    }\n\n}\n","<form nz-form #form=\"ngForm\">\n    <div nz-row [nzGutter]=\"32\">\n        <div nz-col [nzSpan]=\"8\" *ngFor=\"let column of columns\" [class.d-none]=\"!column.show\">\n            <ng-container [ngSwitch]=\"column.type\">\n                <!--文本-->\n                <nz-form-item  nz-row *ngSwitchCase=\"'text'\">\n                    <nz-form-label  class=\"d-flex\" nz-col [nzSpan]=\"6\">\n                        {{column.title}}\n                    </nz-form-label>\n                    <nz-form-control  nz-col [nzSpan]=\"18\">\n                        <input nz-input  [(ngModel)]=\"column.value\" [id]=\"column.name\" [name]=\"column.name\">\n                    </nz-form-control>\n                </nz-form-item>\n                <!--数字-->\n                <nz-form-item  nz-row *ngSwitchCase=\"'number'\">\n                    <nz-form-label  class=\"d-flex\"  nz-col [nzSpan]=\"6\">\n                        {{column.title}}\n                    </nz-form-label>\n                    <nz-form-control  nz-col [nzSpan]=\"18\">\n                        <nz-input-number [nzPlaceHolder]=\"column.placeholder\" [(ngModel)]=\"column.value\" [name]=\"column.name\"></nz-input-number>\n                    </nz-form-control>\n                </nz-form-item>\n                <!--开关-->\n                <nz-form-item  nz-row *ngSwitchCase=\"'switch'\">\n                    <nz-form-label  class=\"d-flex\"  nz-col [nzSpan]=\"6\">\n                        {{column.title}}\n                    </nz-form-label>\n                    <nz-form-control  nz-col [nzSpan]=\"18\">\n                        <nz-select [(ngModel)]=\"column.value\" [name]=\"column.name\" [nzPlaceHolder]=\"''\">\n                            <nz-option\n                                *ngFor=\"let o of column.option\"\n                                [nzLabel]=\"o.label\"\n                                [nzValue]=\"o.value\">\n                            </nz-option>\n                        </nz-select>\n                    </nz-form-control>\n                </nz-form-item>\n                <!--下拉-->\n                <nz-form-item   nz-row *ngSwitchCase=\"'select'\">\n                    <nz-form-label  class=\"d-flex\" nz-col [nzSpan]=\"6\">\n                        {{column.title}}\n                    </nz-form-label>\n                    <nz-form-control  nz-col [nzSpan]=\"18\">\n                        <nz-select [(ngModel)]=\"column.value\" [name]=\"column.name\" [nzPlaceHolder]=\"''\">\n                            <nz-option\n                                *ngFor=\"let o of column.option\"\n                                [nzLabel]=\"o.label\"\n                                [nzValue]=\"o.value\">\n                            </nz-option>\n                        </nz-select>\n                    </nz-form-control>\n                </nz-form-item>\n                <!--对象-->\n                <nz-form-item nz-row *ngSwitchCase=\"'object'\">\n                    <nz-form-label  class=\"d-flex\"  nz-col [nzSpan]=\"6\">\n                        {{column.title}}\n                    </nz-form-label>\n                    <nz-form-control  nz-col [nzSpan]=\"18\">\n                        <nz-select [(ngModel)]=\"column.value\" [name]=\"column.name\" [nzPlaceHolder]=\"column.placeholder\" (nzOpenChange)=\"handelObjectSelect($event,column)\">\n                            <nz-option *ngFor=\"let opt of objects[column.name]\"\n                                       [nzValue]=\"opt\"\n                                       [nzLabel]=\"opt[column.association.labelField]\"></nz-option>\n                        </nz-select>\n                    </nz-form-control>\n                </nz-form-item>\n                <!--日期-->\n                <nz-form-item   nz-row *ngSwitchCase=\"'date'\">\n                    <nz-form-label  class=\"d-flex\" nz-col [nzSpan]=\"6\">\n                        {{column.title}}\n                    </nz-form-label>\n                    <nz-form-control  nz-col [nzSpan]=\"18\">\n                        <nz-date-picker [nzPlaceHolder]=\"column.placeholder\" [(ngModel)]=\"column.value\" [name]=\"column.name\"></nz-date-picker>\n                    </nz-form-control>\n                </nz-form-item>\n                <!--时间-->\n                <nz-form-item   nz-row *ngSwitchCase=\"'time'\">\n                    <nz-form-label  class=\"d-flex\" nz-col [nzSpan]=\"6\">\n                        {{column.title}}\n                    </nz-form-label>\n                    <nz-form-control  nz-col [nzSpan]=\"18\">\n                        <nz-time-picker [nzPlaceHolder]=\"column.placeholder\" [(ngModel)]=\"column.value\" [name]=\"column.name\"></nz-time-picker>\n                    </nz-form-control>\n                </nz-form-item>\n                <!--日期时间-->\n                <nz-form-item   nz-row *ngSwitchCase=\"'datetime'\">\n                    <nz-form-label  class=\"d-flex\" nz-col [nzSpan]=\"6\">\n                        {{column.title}}\n                    </nz-form-label>\n                    <nz-form-control nz-col [nzSpan]=\"18\">\n                        <nz-date-picker [nzPlaceHolder]=\"column.placeholder\" [(ngModel)]=\"column.value\" [name]=\"column.name\" nzShowTime [nzFormat]=\"'YYYY-MM-DD HH:mm:ss'\"></nz-date-picker>\n                    </nz-form-control>\n                </nz-form-item>\n            </ng-container>\n        </div>\n    </div>\n    <div nz-row>\n        <div nz-col [nzSpan]=\"24\" class=\"text-right\">\n            <button nz-button [nzType]=\"'primary'\" (click)=\"search(form)\">搜索</button>\n            <button nz-button (click)=\"_clear(form)\" >重置</button>\n            <a class=\"pl-sm\" (click)=\"toggleCollapse()\" *ngIf=\"showCollapse\">\n                <span *ngIf=\"isCollapse\">展开</span>\n                <span *ngIf=\"!isCollapse\" >收起</span>\n                <i class=\"anticon\" [class.anticon-down]=\"isCollapse\" [class.anticon-up]=\"!isCollapse\"></i>\n            </a>\n        </div>\n    </div>\n</form>\n","import { Component, OnInit, Input, EventEmitter, Output } from '@angular/core';\r\n/**\r\n * 排序字段组件\r\n */\r\n@Component({\r\n  selector: 'nz-sort-field',\r\n  templateUrl: './nz-sort-field.component.html',\r\n  styleUrls: [\r\n      './nz-sort-field.component.less'\r\n  ]\r\n})\r\nexport class NzSortFieldComponent implements OnInit {\r\n    /**\r\n     * {\r\n     *  title:\r\n     *  order:排序 ASC|\"\"|DESC\r\n     * }\r\n     */\r\n    @Input()\r\n    field = {\r\n        title:\"\",\r\n        field:\"\",\r\n        order:\"\"\r\n    };\r\n\r\n\r\n    @Output()\r\n    change: EventEmitter<any> = new EventEmitter();\r\n\r\n    constructor(\r\n       \r\n    ) { }\r\n\r\n    ngOnInit() {\r\n        if(this.field.order == \"\") {\r\n\r\n        }\r\n        if(this.field.order == \"ASC\") {\r\n\r\n        }\r\n\r\n        if(this.field.order == \"DESC\") {\r\n\r\n        }\r\n    }\r\n\r\n    click() {\r\n        // console.log('this.field.order:',this.field)\r\n        switch (this.field.order) {\r\n            case \"DESC\":\r\n                this.field.order = \"\"\r\n                break;\r\n            case \"ASC\":\r\n                this.field.order = \"DESC\";\r\n                break;\r\n        \r\n            default:\r\n                this.field.order = \"ASC\";\r\n                break;\r\n        }\r\n\r\n        this.change.emit(this.field);\r\n    }\r\n\r\n}","<div class=\"sort-container point\" (click)=\"click()\">\r\n    <span class=\"title mr-sm\" [ngClass]=\"{'active': field.order!=''}\">{{field.title}}</span>\r\n    <div class=\"caret\">\r\n            <i class=\"anticon anticon-caret-up up\" [ngClass]=\"{\r\n                'active':field.order=='ASC'\r\n            }\"></i>\r\n            <i class=\"anticon anticon-caret-down down\" [ngClass]=\"{\r\n                'active':field.order=='DESC'\r\n            }\"></i>\r\n    </div>\r\n</div>\r\n","import { MetamodelingService } from '@liangdi/metamodeling-service';\r\nimport { EventEmitter, Output, Input } from '@angular/core';\r\nimport { Component, OnInit } from '@angular/core';\r\nexport class FilterOption {\r\n    label:string;\r\n    value:any;\r\n}\r\nexport class FilterField{\r\n    title?:string;\r\n    field?:string;\r\n    type?:string;\r\n    cls?:string;\r\n    defaultValue?:any;\r\n    options?:FilterOption[];\r\n}\r\n\r\n\r\n\r\n@Component({\r\n  selector: 'nz-quick-search-tool',\r\n  templateUrl: './nz-quick-search-tool.component.html',\r\n  styleUrls: [\r\n      './nz-quick-search-tool.component.less'\r\n  ]\r\n})\r\nexport class NzQuickSearchToolComponent implements OnInit {\r\n\r\n\r\n    @Input()\r\n    searchPlaceHolder = '请输入关键字';\r\n\r\n\r\n    @Input()\r\n    showKeyword = true;\r\n\r\n    @Input()\r\n    showExport = false;\r\n\r\n    @Input()\r\n    defaultExportParams:any;\r\n\r\n    @Input()\r\n    className = '';\r\n\r\n    keyword: string;\r\n    /**\r\n     * 过滤条件\r\n     * {\r\n     *  title\r\n     *  field\r\n     *  options: [{\r\n     *      lable:\r\n     *      uuid: ''\r\n     * }]\r\n     * }\r\n     */\r\n    @Input()\r\n    filterFields:FilterField[] = [];\r\n    /**\r\n     * 选中的值\r\n     */\r\n    filterFieldSelected:{\r\n        [key: string]: number | string | any,\r\n       } = {};\r\n    /**\r\n     * {\r\n     *  title\r\n     *  order\r\n     *  field\r\n     * }\r\n     */\r\n    @Input()\r\n    sortFields = [];\r\n\r\n    @Output()\r\n    onSearch: EventEmitter<any> = new EventEmitter();\r\n\r\n\r\n    @Input()\r\n    customAction = '';\r\n\r\n    constructor(\r\n        private metaService: MetamodelingService\r\n    ) { }\r\n\r\n    ngOnInit() {\r\n\r\n\r\n      /**\r\n       * 查询条件补充\r\n       */\r\n      this.filterFields.forEach(f => {\r\n        this.filterFieldSelected[f.field] = f.defaultValue||'';\r\n        if(f.cls) {\r\n            this.metaService.query(f.cls)\r\n            .subscribe(res => {\r\n                if (res['success']) {\r\n                    const list = res['list'] || [];\r\n                    list.forEach(cate => {\r\n                        f.options.push({\r\n                            label: cate.title,\r\n                            value: cate.uuid\r\n                        });\r\n                    });\r\n                }\r\n            });\r\n        }\r\n\r\n    });\r\n    }\r\n\r\n    buildParams() {\r\n        var sort = '';\r\n        if(this.sortFields) {\r\n            this.sortFields.forEach(f => {\r\n                if(f.order != '') {\r\n                    sort +=f.field + ':' + f.order;\r\n                }\r\n            })\r\n        }\r\n\r\n\r\n        const param = {\r\n            keyword: this.keyword\r\n        }\r\n\r\n        if(sort != '') {\r\n            param['sort'] = sort;\r\n        }\r\n\r\n        const query = {};\r\n        console.log('搜索条件:',this.filterFieldSelected);\r\n        for (const key in this.filterFieldSelected) {\r\n\r\n           // if (this.filterFieldSelected.hasOwnProperty(key)) {\r\n                const value = this.filterFieldSelected[key];\r\n                console.log('key,value:',key,value);\r\n                if( value !== '') {\r\n                    console.log('update map:',key,value);\r\n                    query[key] = value;\r\n                }\r\n           // }\r\n        }\r\n\r\n        param['query'] = JSON.parse(JSON.stringify(query));\r\n\r\n        return param;\r\n    }\r\n\r\n    emitSearch() {\r\n        var param = this.buildParams();\r\n\r\n        this.onSearch.emit(param)\r\n    }\r\n\r\n    /**\r\n     *\r\n     * @param  搜索框查询\r\n     */\r\n    onKeywordSearch($event) {\r\n        this.emitSearch();\r\n    }\r\n\r\n    /**\r\n     *\r\n     * @param field 排序字段事件\r\n     */\r\n    onSort(field) {\r\n        // console.log('onSort:',field);\r\n        // const param = {\r\n        //     keyword: this.keyword\r\n        // }\r\n        // if(field.order != \"\") {\r\n        //     param['sort'] = field.field +\":\" + field.order;\r\n        // }\r\n\r\n        // this.onSearch.emit(param);\r\n        this.emitSearch();\r\n\r\n    }\r\n    /**\r\n     * 排序字段点击事件处理\r\n     * @param\r\n     * @param field\r\n     */\r\n    sortClick($event,field) {\r\n        // console.log(\"sortClick:\",$event);\r\n\r\n        this.sortFields.forEach(f => {\r\n            if(f.field != field.field) {\r\n                f.order = '';\r\n            }\r\n        })\r\n    }\r\n\r\n    filterSelected($event,filter,option) {\r\n        console.log('filter:',$event,filter,option);\r\n\r\n        this.filterFieldSelected[filter.field] = option.value;\r\n\r\n        this.emitSearch();\r\n    }\r\n\r\n    /**\r\n     * 日期选择\r\n     * @param $event\r\n     * @param filter\r\n     */\r\n    dateRangeChange($event,filter) {\r\n        console.log('date range:',$event,filter);\r\n\r\n        if($event.length == 0) {\r\n            // 清除\r\n            delete this.filterFieldSelected[filter.field]\r\n        } else {\r\n            var start = $event[0].setHours(0,0,0,0);\r\n            var end = $event[1].setHours(23,59,59,0);\r\n\r\n            this.filterFieldSelected[filter.field] = {\r\n                '$between':[start,end],\r\n            }\r\n        }\r\n        this.emitSearch();\r\n    }\r\n\r\n    export(type) {\r\n        var param = this.buildParams();\r\n        var query = param['query'] || {};\r\n\r\n        if(this.defaultExportParams) {\r\n            Object.assign(query,this.defaultExportParams);\r\n        }\r\n        this.metaService.export(this.className, 'excel', param['query'] ,'', '');\r\n    }\r\n\r\n\r\n}\r\n","<div class=\"search-container mb-sm\" *ngIf=\"showKeyword\">\r\n    <!-- <input nz-inpug [nzType]=\"'search'\"\r\n [placeholder]=\"searchPlaceHolder\"\r\n  [nzSize]=\"'large'\" [(ngModel)]=\"keyword\" style=\"width: 100%;\" (nzOnSearch)=\"onKeywordSearch($event)\"> -->\r\n  \r\n  <ng-container>\r\n\r\n  </ng-container>\r\n\r\n  <div nz-row nzGutter=\"8\">\r\n    <div nz-col nzSpan=\"24\">\r\n            <nz-input-group  [nzPrefix]=\"prefix\" (click)=\"onKeywordSearch($event)\">\r\n                <ng-template #prefix><i nz-icon nzType=\"search\" nzTheme=\"outline\"></i></ng-template>\r\n                    <input type=\"text\" nz-input nzSize=\"large\" [placeholder]=\"searchPlaceHolder\" [(ngModel)]=\"keyword\" style=\"width: 100%;\" (keyup.enter)=\"onKeywordSearch($event)\">\r\n                </nz-input-group>\r\n    </div>\r\n   \r\n  </div>\r\n   \r\n</div>\r\n\r\n<div class=\"filter-container\" *ngIf=\"filterFields && filterFields.length >0\">\r\n    <ng-container *ngFor=\"let filter of filterFields\">\r\n        <div class=\"inner-filter-container\">\r\n            <div class=\"filter-title\"><span>{{filter.title}}:</span> </div>\r\n\r\n            <div class=\"filter-area\">\r\n                <ng-container [ngSwitch]=\"filter.type\">\r\n                    <div *ngSwitchCase=\"'date-range'\">\r\n                        <nz-range-picker [ngModel]=\"filter.value\" (ngModelChange)=\"dateRangeChange($event,filter)\"></nz-range-picker>\r\n                    </div>\r\n\r\n                    <div class=\"filter-item-container tag-select\" *ngSwitchDefault >\r\n                        <nz-tag class=\"mx-md\" nzMode=\"checkable\" [nzChecked]=\"filterFieldSelected[filter['field']] === option.value\" (nzCheckedChange)=\"filterSelected($event,filter,option)\"\r\n                            *ngFor=\"let option of filter.options\">{{option.label}}\r\n\r\n                        </nz-tag>\r\n                    </div>\r\n                </ng-container>\r\n\r\n            </div>\r\n        </div>\r\n\r\n    </ng-container>\r\n</div>\r\n\r\n<div class=\"filter-container\" *ngIf=\"sortFields && sortFields.length >0\">\r\n    <div class=\"inner-filter-container\">\r\n        <div class=\"filter-title\"><span>排序:</span> </div>\r\n        <div class=\"filter-area\">\r\n            <nz-sort-field class=\"mx-md\" *ngFor=\"let field of sortFields\" [field]=\"field\" (change)=\"onSort($event)\" (click)=\"sortClick($event,field)\"></nz-sort-field>\r\n\r\n        </div>\r\n    </div>\r\n</div>\r\n\r\n<div style=\"float: right;\" *ngIf=\"showExport\">\r\n    <!-- <nz-dropdown>\r\n        <button nz-button nz-dropdown>\r\n            <i class=\"anticon anticon-cloud-download\"></i>\r\n            <span >导出</span>\r\n            <i class=\"anticon anticon-down\"></i>\r\n        </button>\r\n        <ul nz-menu>\r\n            <li nz-menu-item>\r\n                <a (click)=\"export('excel')\">EXCEL</a>\r\n            </li>\r\n\r\n        </ul>\r\n    </nz-dropdown> -->\r\n</div>","import { NzFormDialogComponent } from './nz-form-dialog.component';\r\nimport { NzModalService } from 'ng-zorro-antd/modal';\r\nimport { NzNotificationService } from 'ng-zorro-antd/notification';\r\nimport { FormBuilder } from '@angular/forms';\r\nimport { Component, OnInit, Input, Inject, ContentChild, EventEmitter, Output } from '@angular/core';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { forkJoin } from 'rxjs';\r\nimport {  MetamodelingService } from '@liangdi/metamodeling-service';\r\n\r\n@Component({\r\n    selector: 'nz-table-model',\r\n    templateUrl: './nz-table-model.component.html',\r\n    styleUrls: ['./nz-table-model.component.less']\r\n})\r\nexport class NzTableModelComponent implements OnInit {\r\n\r\n    beans = [];\r\n    /**\r\n     * 后端对应类名\r\n     */\r\n\r\n    _className: any;\r\n\r\n    @Input()\r\n    set className(value) {\r\n        if (value) {\r\n            this._className = value;\r\n            this.getMetaDes();\r\n        }\r\n\r\n    }\r\n    // 当前页面的路径，供分页筛选路由跳转使用\r\n    @Input() path: string;\r\n    @Input() pathParams = {};\r\n    // 添加或编辑时某个字段的默认值\r\n    @Input() defaultSelect = {\r\n        name: '',\r\n        uuid: ''\r\n    };\r\n    // 添加或编辑时页面的标题\r\n    @Input() modalTitle = {\r\n        firstTitle: '',\r\n        secondTitle: ''\r\n    };\r\n    /**\r\n     * 是否顶部操作项\r\n     */\r\n    @Input() actionToolBar = false;\r\n\r\n    /**\r\n     * 表格列\r\n     */\r\n    columns = [];\r\n    /**\r\n     * 查询列\r\n     */\r\n    filterColumns = [];\r\n    /**\r\n     * 表单列\r\n     */\r\n    formColumns = [];\r\n\r\n    isPagination: boolean;\r\n\r\n    pageOpt = {\r\n        page: 1,\r\n        pageSize: 10\r\n    };\r\n\r\n    /**\r\n     * 模型配置信息\r\n     */\r\n    modelOption = {\r\n        queryable: false,\r\n        pageable: false,\r\n        pageSize: 25,\r\n        actions: false,\r\n        actionToolBar: false,\r\n        exportToolBar: false,\r\n        multiSelection: false,\r\n        customToolBar: false,\r\n        title: '',\r\n        editMode: 'popup',\r\n        layout: '',\r\n        actionColumnStyle: {}\r\n    };\r\n\r\n    pageParams = {};\r\n    @Input() filterOpt: any;\r\n\r\n    _defaultLoading = true;\r\n\r\n    @Input() set defaultLoading(value) {\r\n        console.log('set deaultLoading:', value);\r\n        this._defaultLoading = value;\r\n\r\n    }\r\n\r\n    @Input()\r\n    set defaultFilterOpt(value) {\r\n        if (value) {\r\n            Object.assign(this.filterOpt, value);\r\n            console.log('set default filterOpt:', value, this.filterOpt)\r\n        }\r\n    }\r\n\r\n    /**\r\n     * 用户配置项\r\n     */\r\n    @Input()\r\n    option;\r\n\r\n    /**\r\n     * 只显示的字段\r\n     */\r\n    @Input()\r\n    showFields;\r\n\r\n    /**\r\n     * 自定义字段\r\n     * {\r\n     *      custom:true,\r\n     *      index: 4,\r\n     *      title: '自定义字段',\r\n     *      field: 'inner.Field',\r\n     *      type: 'input'\r\n     * }\r\n     */\r\n    @Input()\r\n    customFields;\r\n\r\n\r\n    @Output()\r\n    itemClick: EventEmitter<any> = new EventEmitter<any>();\r\n\r\n    totalLength: number;\r\n    sortMap = {};\r\n    dataLoading: boolean;\r\n    fileUrl: string;\r\n    thumbUrl: string;\r\n\r\n    /**\r\n     * 自定义模板配置\r\n     * {\r\n     *      name: 'title',\r\n     *      ref: titleTemplateRef\r\n     * }\r\n     */\r\n    @Input()\r\n    columnTemplates: any[];\r\n\r\n    // 自定义模板配置\r\n\r\n    //actionColumn = 'actionColumn';\r\n    //actionRow = 'actionRow';\r\n    /**\r\n     * 附加操作栏按钮\r\n     */\r\n    @ContentChild('actionBarExtra') actionBarExtra: any;\r\n\r\n    /**\r\n     * 表格中 自定义 操作 表头 column\r\n     */\r\n    @ContentChild('actionColumn') actionColumn;\r\n    /**\r\n     * 表格中自定义操作列\r\n     */\r\n    @ContentChild('actionRow') actionRow;\r\n    @ContentChild('otherOption') otherOption;\r\n    objectUUIDView = {};\r\n\r\n\r\n    @Input()\r\n    defaultModelOption = {};\r\n\r\n    /**\r\n     * 存放关联对象列表，以 cls 作为 key\r\n     */\r\n    _objects = {};\r\n    private urlPre\r\n    constructor(private metaService: MetamodelingService,\r\n        private fb: FormBuilder,\r\n        private router: Router,\r\n        private route: ActivatedRoute,\r\n        private notification: NzNotificationService,\r\n        private dialogService: NzModalService,\r\n        ) {\r\n    }\r\n\r\n    ngOnInit() {\r\n        this.fileUrl = this.urlPre + 'api/fs/file/';\r\n        this.thumbUrl = `${this.urlPre}api/fs/file/thumb/`;\r\n        if (!this.filterOpt) {\r\n            this.filterOpt = {\r\n                query: {},\r\n                sort: ''\r\n            };\r\n        }\r\n        this.route.queryParams.subscribe(e => {\r\n            this.setDefaultValue(e);\r\n\r\n            this.loadData();\r\n\r\n        });\r\n\r\n        console.log('defaultLoading:', this._defaultLoading);\r\n        if (this._defaultLoading) {\r\n            this.loadData();\r\n        }\r\n    }\r\n\r\n    /*设置默认筛选条件*/\r\n    setDefaultValue(e) {\r\n        // 设置当前页数\r\n\r\n        console.log('set default value:', e);\r\n        if (e.page) {\r\n            this.pageParams = Object.assign({}, e);\r\n            for (const key in this.pageParams) {\r\n                if (this.pageOpt.hasOwnProperty(key)) {\r\n                    this.pageOpt[key] = isNaN(this.pageParams[key] - 0) ? this.pageParams[key] : this.pageParams[key] - 0;\r\n                }\r\n                // 当前排序字段\r\n                switch (key) {\r\n                    case 'sort':\r\n                        this.filterOpt[key] = this.pageParams[key];\r\n                        break;\r\n                }\r\n            }\r\n        } else {\r\n            this.pageParams = {};\r\n            this.pageOpt = {\r\n                page: 1,\r\n                pageSize: 10\r\n            };\r\n            if (!this.filterOpt) {\r\n                this.filterOpt = {\r\n                    query: {},\r\n                    sort: ''\r\n                };\r\n            }\r\n        }\r\n        this.getMetaDes();\r\n    }\r\n\r\n    getMetaDes() {\r\n        if (!this._className) {\r\n            console.warn('class name is undefined:', this._className);\r\n            return;\r\n        }\r\n        this.metaService.desc(this._className)\r\n            .subscribe(result => {\r\n                console.log('desc result', result);\r\n                if (result.class) {\r\n                    this.pageOpt.pageSize = result.class.pageSize;\r\n\r\n                    // 覆盖配置\r\n                    Object.assign(this.modelOption, result['class']);\r\n\r\n                    if (this.option) {\r\n                        Object.assign(this.modelOption, this.option);\r\n                        if (this.option['pageSize']) {\r\n                            this.pageOpt.pageSize = this.option['pageSize'];\r\n\r\n                        }\r\n                    }\r\n\r\n                    //this.modelOption['modalStyle']  = {};\r\n                    //this.modelOption['actionColumnStyle'] = {};\r\n\r\n                    try {\r\n                        this.modelOption['modalStyle'] = JSON.parse(this.modelOption['modalStyle']);\r\n                    } catch (error) {\r\n                        console.warn('解析 modal 错误', error);\r\n\r\n                        this.modelOption['modalStyle'] = {};\r\n                    }\r\n                    try {\r\n                        // this.modelOption['actionColumnStyle'] = JSON.parse(this.modelOption['actionColumnStyle']);\r\n\r\n                    } catch (error) {\r\n                        this.modelOption['actionColumnStyle'] = {};\r\n                    }\r\n\r\n                }\r\n\r\n                Object.assign(this.modelOption, this.defaultModelOption);\r\n\r\n                const fields = result.fields;\r\n                const columns = [];\r\n                const formColumns = [];\r\n                const filterColumns = [];\r\n                // 字段信息\r\n                fields.forEach(element => {\r\n                    // const column = {\r\n                    //     name: element['name'],\r\n                    //     show: element['show'],\r\n                    //     type: element['type'],\r\n                    //     title: element['title'],\r\n                    //     option: element['option'],\r\n                    //     sortable: element['sortable'],\r\n                    //     placeholder: element['placeholder'],\r\n                    //     association: element['association']\r\n                    // };\r\n                    // 字段属性赋值\r\n                    const column = Object.assign({}, element);\r\n\r\n                    column['headStyle'] = column['headStyle'] ? JSON.parse(column['headStyle']) : {};\r\n                    column['colStyle'] = column['colStyle'] ? JSON.parse(column['colStyle']) : {};\r\n\r\n                    // column['headStyle']  = {};\r\n                    console.log('配置字段:', this.showFields)\r\n                    if (this.showFields && this.showFields.length) {\r\n                        // 自定义 显示的字段\r\n\r\n                        if (this.showFields.indexOf(element['name']) > -1) {\r\n                            columns.push(column);\r\n                        }\r\n                        //console.log('自定义显示字段',columns)\r\n                    } else {\r\n                        // 根据配置的显示字段\r\n                        if (element.gridShow) {\r\n                            // console.log('column headStyle:', column, column['name'], column['title']);\r\n                            columns.push(column);\r\n                        }\r\n                        //console.log('根据配置的显示字段',columns)\r\n                    }\r\n\r\n                    /**\r\n                     * 添加自定义字段\r\n                     */\r\n                    if (this.customFields && this.customFields.length) {\r\n                        this.customFields.forEach(customeField => {\r\n                            columns.splice(customeField['index'], 0, this.customFields)\r\n                        });\r\n\r\n                    }\r\n\r\n                    // 表单需要所有字段\r\n                    if (element.show) {\r\n                        formColumns.push(column);\r\n                    }\r\n                    if (element.show && element.sortable) {\r\n                        // 可排序的字段\r\n                        this.sortMap[element['name']] = this.sortMap[element['name']] ? this.sortMap[element['name']] : null;\r\n                        // 设置排序箭头高亮\r\n                        for (const sortKey in this.sortMap) {\r\n                            if (this.filterOpt && this.filterOpt['sort']) {\r\n                                if (this.filterOpt['sort'].indexOf(sortKey) > -1) {\r\n                                    this.sortMap[sortKey] = this.filterOpt['sort'].indexOf('DESC') > -1 ? 'descend' : 'ascend';\r\n                                } else {\r\n                                    this.sortMap[sortKey] = null;\r\n                                }\r\n                            }\r\n\r\n                        }\r\n                    }\r\n                    // 可搜索字段\r\n                    if (element.show && element.queryable) {\r\n                        const columnItem = Object.assign({}, column);\r\n                        // 显示搜索内容\r\n                        filterColumns.push(columnItem);\r\n                        filterColumns.forEach(col => {\r\n                            // col.value = '';\r\n                            if (col.type === 'object') {\r\n                                col['value'] = this.pageParams[`${col.name}UUID`];\r\n                                this.filterOpt.query[`${col.name}UUID`] = this.pageParams[`${col.name}UUID`];\r\n                            } else {\r\n                                col['value'] = this.pageParams[col.name];\r\n                                this.filterOpt.query[col.name] = this.pageParams[col.name];\r\n                            }\r\n                        });\r\n                    }\r\n                });\r\n                this.columns = columns;\r\n                this.formColumns = formColumns;\r\n                this.filterColumns = filterColumns;\r\n\r\n\r\n            });\r\n    }\r\n\r\n\r\n    loadData() {\r\n        this.dataLoading = true;\r\n        if (!this.filterOpt) {\r\n            this.filterOpt = {\r\n                query: '',\r\n                sort: '',\r\n                keyword: ''\r\n            };\r\n        }\r\n        this.metaService.page(\r\n            this._className,\r\n            this.pageOpt.page,\r\n            this.pageOpt.pageSize,\r\n            this.filterOpt.query || \"\",\r\n            this.filterOpt.sort || \"\",\r\n            this.filterOpt.keyword || \"\"\r\n        )\r\n            .subscribe(result => {\r\n                this.dataLoading = false;\r\n                if (result.success) {\r\n                    this.beans = result.list;\r\n                    this.totalLength = result.total;\r\n                    this.setObjectUUIDView();\r\n                } else {\r\n                    // this.notification.create('error', '错误信息', result.message);\r\n                }\r\n            }, error => {\r\n                this.dataLoading = false;\r\n            });\r\n    }\r\n\r\n    // 设置多选字段视图显示\r\n    /**\r\n     * 根据字段配置，先去查询关联数据，然后再匹配\r\n     */\r\n    setObjectUUIDView() {\r\n\r\n        var clsList = [];\r\n        for (let index = 0; index < this.columns.length; index++) {\r\n            const col = this.columns[index];\r\n            if (col.type == 'object_uuid') {\r\n                var cls = col['association']['cls'];\r\n                if (!this._objects[cls]) {\r\n                    clsList.push(cls);\r\n                }\r\n            }\r\n        }\r\n\r\n\r\n\r\n        var queryList = [];\r\n\r\n        for (let index = 0; index < clsList.length; index++) {\r\n            const cls = clsList[index];\r\n\r\n            queryList.push(this.metaService.query(cls));\r\n\r\n        }\r\n\r\n\r\n        console.log('clsList:', clsList);\r\n        console.log('queryList:', queryList);\r\n\r\n        /**\r\n         * 合并查询\r\n         */\r\n        if (queryList.length > 0) {\r\n            forkJoin(queryList)\r\n                .subscribe(resList => {\r\n                    console.log('res list:', resList);\r\n                    for (let index = 0; index < resList.length; index++) {\r\n                        const result = resList[index];\r\n                        const cls = clsList[index];\r\n                        if (result['success']) {\r\n                            this._objects[cls] = result['list'];\r\n                        }\r\n                    }\r\n\r\n                    this.updateObjectUUIDs();\r\n                });\r\n        } else {\r\n            this.updateObjectUUIDs();\r\n        }\r\n\r\n\r\n\r\n    }\r\n\r\n\r\n    updateObjectUUIDs() {\r\n\r\n        this.beans.forEach(bean => {\r\n            this.columns.forEach(col => {\r\n                if (col.type == 'object_uuid' && bean[col.name]) {\r\n                    bean[col.name + 'Object'] = [];\r\n                    // 将字符串转为数字，遍历出对应的文本内容\r\n                    const obj = bean[col.name].split(',');\r\n                    const cls = col['association']['cls'];\r\n                    // 获取关联对象\r\n                    const list = this._objects[cls];\r\n                    if (list && list.length > 0) {\r\n                        list.forEach(o => {\r\n                            obj.forEach(id => {\r\n                                if (o.uuid === id) {\r\n                                    bean[col.name + 'Object'].push(o);\r\n                                }\r\n                            });\r\n\r\n                        });\r\n                    }\r\n                }\r\n            });\r\n        });\r\n    }\r\n\r\n    //\r\n    /**\r\n     * 搜索过滤 内部触发\r\n     * @param form\r\n     */\r\n    filterSubmit(form) {\r\n        const value = form.value;\r\n        this.filterOpt.query = Object.assign({}, value);\r\n        this.columns.forEach(col => {\r\n            if (this.filterOpt.query.hasOwnProperty(col.name)) {\r\n                if (this.filterOpt.query[col.name]) {\r\n                    if (col.type === 'object') {\r\n                        // 路由参数为字段名称，搜索参数为字段名称+uuid，需要转换\r\n                        this.filterOpt.query[`${col.name}UUID`] = this.filterOpt.query[col.name].uuid;\r\n                        delete this.filterOpt.query[`${col.name}`];\r\n                    } else if (col.type === 'date' || col.type === 'time' || col.type === 'datetime') {\r\n                        // 将日期转为时间戳\r\n                        this.filterOpt.query[col.name] = this.filterOpt.query[col.name].getTime();\r\n                    }\r\n                } else {\r\n                    this.filterOpt.query[col.name] = undefined;\r\n                }\r\n            }\r\n        });\r\n        this.reloadPage();\r\n    }\r\n\r\n    // 排序\r\n    sort(sortName, value) {\r\n        this.filterOpt['sort'] = value === 'ascend' ? `${sortName}:ASC` : `${sortName}:DESC`;\r\n        Object.keys(this.sortMap).forEach(key => {\r\n            if (key !== sortName) {\r\n                this.sortMap[key] = null;\r\n            } else {\r\n                this.sortMap[key] = value;\r\n            }\r\n        });\r\n        this.reloadPage();\r\n    }\r\n\r\n    // 翻页\r\n    pageChanged(idx) {\r\n        console.log('page change:', idx);\r\n        if (idx != undefined) {\r\n            this.pageOpt.page = idx;\r\n            const keys = Object.keys(this.pathParams);\r\n            if (keys.length) {\r\n                this.reloadPage();\r\n\r\n            } else {\r\n                this.loadData();\r\n            }\r\n        }\r\n    }\r\n\r\n    reloadPage() {\r\n        const keys = Object.keys(this.pathParams);\r\n        const page = Object.assign({ sort: this.filterOpt.sort }, this.pageOpt, this.filterOpt.query);\r\n        if (keys.length) {\r\n            this.router.navigate([this.path, this.pathParams], { queryParams: page, relativeTo: this.route });\r\n        } else {\r\n            this.router.navigate([this.path], { queryParams: page, relativeTo: this.route });\r\n        }\r\n    }\r\n\r\n    add(linkTo?) {\r\n        if (this.modelOption.editMode === 'popup') {\r\n            this.openDialog(1, null, linkTo ? linkTo : undefined);\r\n        } else {\r\n            this.router.navigate(['../modify'], {\r\n                queryParams: {\r\n                    className: this._className,\r\n                    openType: 1,\r\n                    linkTo: linkTo,\r\n                    defaultSelect: this.defaultSelect ? JSON.stringify(this.defaultSelect) : null\r\n                },\r\n                relativeTo: this.route\r\n            });\r\n        }\r\n\r\n    }\r\n\r\n    edit(bean, linkTo?) {\r\n        if (this.modelOption.editMode === 'popup') {\r\n            for (const key in bean) {\r\n                this.formColumns.forEach(col => {\r\n                    if (col.name === key) {\r\n                        col.value = bean[key];\r\n                    }\r\n                });\r\n            }\r\n            this.openDialog(2, bean, linkTo);\r\n        } else {\r\n            this.router.navigate(['../modify'], {\r\n                queryParams: { className: this._className, openType: 2, uuid: bean.uuid, linkTo: linkTo },\r\n                relativeTo: this.route\r\n            });\r\n        }\r\n    }\r\n\r\n    openDialog(type, item?, linkTo?) {\r\n        /*\r\n        type 1: 添加 2: 编辑\r\n        item: 编辑的内容\r\n        linkTo: 新建或编辑完的跳转\r\n         */\r\n        // 设置弹窗的title\r\n        const typeText = type === 1 ? '添加' : '编辑';\r\n        let title = '';\r\n        // 拼接title\r\n        if (this.modalTitle && this.modalTitle.firstTitle && this.modalTitle.secondTitle) {\r\n            title = `${this.modalTitle.firstTitle}${typeText}${this.modalTitle.secondTitle}`;\r\n        } else if (this.modalTitle && this.modalTitle.secondTitle) {\r\n            title = `${typeText}${this.modalTitle.secondTitle}`;\r\n        }\r\n        // 打开弹窗\r\n        console.log('dialog style:', this.modelOption['modalStyle']);\r\n        const subscription = this.dialogService.create({\r\n            nzTitle: title ? title : typeText,\r\n            nzContent: NzFormDialogComponent,\r\n            nzFooter: null,\r\n            nzMaskClosable: false,\r\n            nzStyle: this.modelOption['modalStyle'],\r\n            nzWidth: this.modelOption['width'] || '600px',\r\n            nzComponentParams: {\r\n                apiName: this._className,\r\n                openType: type,\r\n                uuid: item ? item.uuid : undefined,\r\n                linkTo: linkTo ? linkTo : undefined,\r\n                defaultSelect: this.defaultSelect ? this.defaultSelect : null\r\n            }\r\n        });\r\n        subscription.afterClose.subscribe((result) => {\r\n            console.log('result:', result);\r\n            this.loadData();\r\n        })\r\n    }\r\n\r\n    del(bean) {\r\n        const uuid = bean['uuid'];\r\n        this.metaService.delete(this._className, uuid)\r\n            .subscribe(result => {\r\n                if (result.success) {\r\n                    this.notification.create('success', '提示信息', '删除成功');\r\n                    this.loadData();\r\n                } else {\r\n                    this.notification.create('error', '错误信息', result.message);\r\n                }\r\n            });\r\n    }\r\n\r\n    /**\r\n     *\r\n     * @param query 过滤查询条件\r\n     */\r\n    filter(query: any) {\r\n        this.filterOpt.query = query;\r\n        this.loadData();\r\n    }\r\n\r\n    /**\r\n     * 检查是否有自定义 column 模板\r\n     * @param name\r\n     */\r\n    customTemplate(name) {\r\n        this.columnTemplates = this.columnTemplates || [];\r\n        for (let index = 0; index < this.columnTemplates.length; index++) {\r\n            const tpl = this.columnTemplates[index];\r\n            if (tpl['name'] == name) {\r\n                // console.log('custom template match:',name,tpl);\r\n                return tpl['ref'];\r\n            }\r\n\r\n        }\r\n\r\n        return false;\r\n    }\r\n\r\n    /**\r\n     * 外部调用搜索\r\n     * {\r\n     *  keyword:\r\n     *  query:\r\n     * }\r\n     * @param searchObject\r\n     */\r\n    search(searchObject) {\r\n        this.filterOpt.keyword = searchObject['keyword'] || '';\r\n        this.filterOpt.query = searchObject['query'] || {};\r\n        this.filterOpt.sort = searchObject['sort'] || '';\r\n        this.pageOpt.page = 1;\r\n        this.loadData();\r\n    }\r\n\r\n    export(type) {\r\n        this.metaService.export(this._className, 'excel', this.filterOpt['query'], this.filterOpt['sort'], '');\r\n    }\r\n\r\n    /**\r\n     *\r\n     * @param column 列点击\r\n     * @param row\r\n     */\r\n    _itemClick(column, row, $event) {\r\n        //console.log('_itemClick:',column,row,$event);\r\n        this.itemClick.emit({ column: column, row: row, $event: $event })\r\n    }\r\n}\r\n","<!--过滤-->\r\n<nz-filter-element *ngIf=\"modelOption.queryable && filterColumns.length >0\" [columns]=\"filterColumns\" (submited)=\"filterSubmit($event)\"\r\n    class=\"mb-md d-block\"></nz-filter-element>\r\n<!--其他操作-->\r\n<ng-template [ngTemplateOutlet]=\"otherOption\" *ngIf=\"modelOption.customToolBar\">\r\n</ng-template>\r\n\r\n<div class=\"b-flex mb-md\" *ngIf=\"modelOption.actionToolBar && !modelOption.customToolBar\">\r\n    <div style=\"float: left;margin-bottom: 5px;\" *ngIf=\"modelOption.actionToolBar\">\r\n        <button nz-button (click)=\"add()\" [nzType]=\"'primary'\">\r\n            添加\r\n        </button>\r\n        <ng-template [ngTemplateOutlet]=\"actionBarExtra\"></ng-template>\r\n    </div>\r\n    <div style=\"float: right;\" *ngIf=\"modelOption.exportToolBar\">\r\n        <!-- <nz-dropdown>\r\n            <button nz-button nz-dropdown>\r\n                <i class=\"anticon anticon-cloud-download\"></i>\r\n                <span>导出</span>\r\n                <i class=\"anticon anticon-down\"></i>\r\n            </button>\r\n            <ul nz-menu>\r\n                <li nz-menu-item>\r\n                    <a (click)=\"export('excel')\">EXCEL</a>\r\n                </li>\r\n\r\n            </ul>\r\n        </nz-dropdown> -->\r\n    </div>\r\n    <div class=\"clearfix\"></div>\r\n</div>\r\n<!--表格-->\r\n<nz-table #nzTable [nzData]=\"beans\"  [nzFrontPagination]=\"false\" [nzShowPagination]=\"modelOption.pageable\" [(nzPageIndex)]=\"pageOpt.page\"\r\n    [nzPageSize]=\"pageOpt.pageSize\" [nzTotal]=\"totalLength\" [nzLoading]=\"dataLoading\" (nzPageIndexChange)=\"pageChanged($event)\"\r\n    class=\"mt-md\">\r\n    <thead nz-thead>\r\n        <tr>\r\n            <th [nzShowSort]=\"column.sortable\" [(nzSortFn)]=\"sortMap[column['name']]\" (nzSortChange)=\"sort(column['name'], $event)\" nz-th\r\n                *ngFor=\"let column of columns\" [ngStyle]=\"column['headStyle']\">\r\n                <span>{{column.title}} </span>\r\n\r\n            </th>\r\n\r\n            <th nz-th *ngIf=\"modelOption.actions\" [ngStyle]=\"modelOption.actionColumnStyle\">\r\n                <span >操作</span>\r\n            </th>\r\n            <ng-template [ngTemplateOutlet]=\"actionColumn\">\r\n            </ng-template>\r\n        </tr>\r\n    </thead>\r\n    <tbody nz-tbody>\r\n        <tr nz-tbody-tr *ngFor=\"let row of nzTable.data\">\r\n            <td (click)=\"_itemClick(column,row,$event)\" nz-td *ngFor=\"let column of columns\">\r\n\r\n                <ng-container *ngIf=\"customTemplate(column['name']);else system_column_template\">\r\n                    <ng-template [ngTemplateOutlet]=\"customTemplate(column['name'])\" [ngTemplateOutletContext]=\"{\r\n                            'column':column,\r\n                            'row':row,\r\n                            'value': row[column['name']]\r\n                        }\"></ng-template>\r\n                </ng-container>\r\n                <ng-template #system_column_template>\r\n\r\n\r\n\r\n                    <span [ngSwitch]=\"column.type\" [ngStyle]=\"column['colStyle']\">\r\n                        <!--文本-->\r\n                        <span *ngSwitchCase=\"'text'\" [attr.title]=\"row[column['name']]\" class=\"text-ellipsis\">{{row[column['name']]}}</span>\r\n                        <span *ngSwitchCase=\"'textarea'\"  [attr.title]=\"row[column['name']]\" class=\"text-ellipsis\">{{row[column['name']]}}</span>\r\n                        <span *ngSwitchCase=\"'email'\">{{row[column['name']]}}</span>\r\n                        <span *ngSwitchCase=\"'number'\">{{row[column['name']]}}</span>\r\n                        <!--富文本-->\r\n                        <span *ngSwitchCase=\"'editor'\" [innerHtml]=\"row[column['name']]\"></span>\r\n                        <!--开关-->\r\n                        <span *ngSwitchCase=\"'switch'\">\r\n                            <ng-container *ngIf=\"column.option\"> \r\n                                    <span *ngFor=\"let o of column.option\">\r\n                                            <span *ngIf=\"(o.value&&row[column['name']])&&o.value.toString()==row[column['name']].toString()\">{{o.label}}</span>\r\n                                        </span>\r\n                            </ng-container>\r\n\r\n                            <ng-container *ngIf=\"!column.option\">\r\n                                    <span *ngIf=\"row[column['name']]\">是</span>\r\n                                    <span *ngIf=\"!row[column['name']]\">否</span>\r\n                            </ng-container>\r\n                           \r\n                        </span>\r\n                        <!--下拉-->\r\n                        <span *ngSwitchCase=\"'select'\">\r\n                            <span *ngFor=\"let o of column.option\">\r\n                                <span *ngIf=\"(o.value&&row[column['name']])&&o.value.toString()==row[column['name']].toString()\">{{o.label}}</span>\r\n                            </span>\r\n                        </span>\r\n                        <!--图片-->\r\n                        <span *ngSwitchCase=\"'image'\">\r\n                            <!--<span class=\"data-image no-img\">{{}}</span>-->\r\n                            <span class=\"data-image\" *ngIf=\"row[column['name']]\">\r\n                                <img [src]=\"this.thumbUrl+row[column['name']].split(',')[0]\" alt=\"\">\r\n                            </span>\r\n                        </span>\r\n                        <!--附件-->\r\n                        <span *ngSwitchCase=\"'attachment'\">\r\n                            <a target=\"_blank\" href=\"{{fileUrl+row[column['name']]?.uuid}}\">{{row[column['name']]?.name}}</a>\r\n                        </span>\r\n                        <!--对象-->\r\n                        <span *ngSwitchCase=\"'object'\">\r\n                            <span *ngIf=\"row[column['name']]\">{{row[column['name']][column.association.labelField]}}</span>\r\n                        </span>\r\n                        <!--多选对象-->\r\n                        <span *ngSwitchCase=\"'object_uuid'\">\r\n                            <span *ngIf=\"row[column['name']]\">\r\n                                <ng-container *ngFor=\"let o of row[column['name']+'Object'];let last=last;\">\r\n                                    {{o[column.association.labelField]}}\r\n                                    <span *ngIf=\"!last\">、</span>\r\n                                </ng-container>\r\n                            </span>\r\n                        </span>\r\n                        <!--日期-->\r\n                        <span *ngSwitchCase=\"'date'\">\r\n                            <ng-container *ngIf=\"row[column['name']]!=0\">\r\n                                {{row[column['name']] | date: 'yyyy/MM/dd'}}\r\n\r\n                            </ng-container>\r\n                        </span>\r\n                        <!--时间-->\r\n                        <span *ngSwitchCase=\"'time'\">\r\n                            <ng-container *ngIf=\"row[column['name']]!=0\">\r\n                                {{row[column['name']] | date: 'HH:mm:ss'}}\r\n\r\n                            </ng-container>\r\n\r\n                        </span>\r\n                        <!--日期时间-->\r\n                        <span *ngSwitchCase=\"'datetime'\">\r\n                            <ng-container *ngIf=\"row[column['name']]!=0\">\r\n                                {{row[column['name']] | date: 'yyyy/MM/dd HH:mm:ss'}}\r\n\r\n                            </ng-container>\r\n                        </span>\r\n\r\n                        <span *ngSwitchCase=\"'switch'\">\r\n                            <span *ngIf=\"row[column['name']]\">是</span>\r\n                            <span *ngIf=\"!row[column['name']]\">否</span>\r\n                        </span>\r\n                    </span>\r\n                </ng-template>\r\n            </td>\r\n            <td nz-td *ngIf=\"modelOption.actions\" nzRight>\r\n                <span>\r\n                    <a (click)=\"edit(row)\">\r\n                        <span >编辑</span>\r\n                    </a>\r\n                    <nz-divider nzType=\"vertical\"></nz-divider>\r\n                    <a nz-popconfirm [nzPopconfirmTitle]=\"'确认删除'\" (nzOnConfirm)=\"del(row)\">\r\n                       \r\n                            <span >删除</span>\r\n                    </a>\r\n                </span>\r\n            </td>\r\n            <ng-template [ngTemplateOutlet]=\"actionRow\" [ngTemplateOutletContext]=\"{\r\n                'item':row\r\n            }\"></ng-template>\r\n        </tr>\r\n    </tbody>\r\n</nz-table>","import { NzTableModelComponent } from './nz-table-model.component';\nimport { Component, OnInit, Input, ViewChild } from '@angular/core';\n/**\n * 以左栏菜单列表形式组合的 nz-table-model 组件\n */\n@Component({\n  selector: 'nz-table-list',\n  templateUrl: './nz-table-list.component.html',\n  styleUrls: ['./nz-table-list.component.less']\n})\nexport class NzTableListComponent implements OnInit {\n\n  /**\n   * model list 格式\n   * {\n   *    cls:'',             对应类名\n   *    title: '',          显示（菜单）名称\n   *    option:{},          默认配置\n   *    type: 'default'     类型:默认为通用table，后续可以增加其他交互形式\n   * }\n   */\n  @Input()\n  modelList;\n\n  current = 0;\n\n  clsObject = {\n    cls: '',\n    option:null\n  };\n\n  @ViewChild(\"modalTable\")\n  modalTable: NzTableModelComponent;\n\n  constructor() { }\n\n  ngOnInit() {\n    if(this.modelList && this.modelList.length) {\n        this.clsObject = this.modelList[0];\n    }\n  }\n\n  itemClick(item) {\n    this.clsObject = item;\n    setTimeout(()=>{\n      this.modalTable.loadData();\n\n    })\n  }\n\n}\n","<div nz-row nzGutter=\"8\">\n  <div nz-col nzSpan=\"6\" >\n\n    <nz-card>\n        <nz-list>\n            <!-- <ng-template #item let-item> -->\n              <nz-list-item class=\"list-item\" *ngFor=\"let item of modelList\" (click)=\"itemClick(item)\" [ngClass]=\"{'active-item':item.cls == clsObject.cls}\">\n           \n                <a>{{item.title}}</a>\n              </nz-list-item>\n            <!-- </ng-template> -->\n          </nz-list>\n    </nz-card>\n  \n  </div>\n\n  <div nz-col nzSpan=\"18\" >\n    <nz-card >\n      <nz-table-model #modalTable [className]=\"clsObject.cls\" [option]=\"clsObject.option\"></nz-table-model>\n\n    </nz-card>\n  </div>\n</div>","import { NzFormDialogComponent } from './page/nz-form-dialog.component';\nimport { NzFilterElementComponent } from './page/nz-filter-element.component';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule,ReactiveFormsModule } from '@angular/forms';\nimport { NgModule } from '@angular/core';\nimport { NzCardModule } from 'ng-zorro-antd/card';\nimport { NzListModule } from 'ng-zorro-antd/list';\nimport { NzUploadModule } from 'ng-zorro-antd/upload';\nimport { NzGridModule } from 'ng-zorro-antd/grid';\nimport { NzButtonModule } from 'ng-zorro-antd/button';\nimport { NzDatePickerModule } from 'ng-zorro-antd/date-picker';\nimport { NzFormModule } from 'ng-zorro-antd/form';\nimport { NzInputModule } from 'ng-zorro-antd/input';\nimport { NzSelectModule } from 'ng-zorro-antd/select';\nimport { NzTimePickerModule } from 'ng-zorro-antd/time-picker';\nimport { NzTagModule } from 'ng-zorro-antd/tag';\nimport { NzInputNumberModule } from 'ng-zorro-antd/input-number';\nimport { NzDividerModule } from 'ng-zorro-antd/divider';\nimport { NzPopconfirmModule } from 'ng-zorro-antd/popconfirm';\nimport { NzToolTipModule } from 'ng-zorro-antd/tooltip';\nimport { NzTableModule } from 'ng-zorro-antd/table';\nimport { NzSwitchModule } from 'ng-zorro-antd/switch';\nimport { ImageCropperModule } from 'ngx-img-cropper';\n\nimport { NzQuickSearchToolComponent } from './page/nz-quick-search-tool.component';\nimport { NzTableModelComponent } from './page/nz-table-model.component';\nimport { NzSortFieldComponent } from './page/nz-sort-field.component';\nimport { NzFormElementComponent } from './page/nz-form-element.component';\nimport { NzTableListComponent } from './page/nz-table-list.component';\n\nconst COMPONENTS = [\n  NzQuickSearchToolComponent,\n  NzFilterElementComponent,\n  NzSortFieldComponent,\n  NzTableModelComponent,\n  NzFormDialogComponent,\n  NzFormElementComponent,\n  NzFormDialogComponent,\n  NzTableListComponent\n];\n\n@NgModule({\n  declarations: [...COMPONENTS],\n  imports: [\n    CommonModule,\n    FormsModule,\n    ReactiveFormsModule,\n    NzCardModule,\n    NzGridModule,\n    NzButtonModule,\n    NzDatePickerModule,\n    NzFormModule,\n    NzListModule,\n    NzInputModule,\n    NzSelectModule,\n    NzTimePickerModule,\n    NzTagModule,\n    NzInputNumberModule,\n    NzDividerModule,\n    NzPopconfirmModule,\n    NzToolTipModule,\n    NzTableModule,\n    NzSwitchModule,\n    NzUploadModule,\n    NzListModule,\n    ImageCropperModule,\n  ],\n  entryComponents:[NzFormDialogComponent],\n  exports: [...COMPONENTS]\n})\nexport class MetamodelingComponentsModule { }\n","/*\n * Public API Surface of metamodeling-components\n */\n\nexport * from './lib/metamodeling-components.module';\nexport * from './lib/page/nz-table-model.component';\nexport * from './lib/page/nz-form-element.component';\nexport * from './lib/page/nz-form-dialog.component';\nexport * from './lib/page/nz-filter-element.component';\nexport * from './lib/page/nz-quick-search-tool.component';\nexport * from './lib/page/nz-sort-field.component';\nexport * from './lib/page/nz-table-list.component';\n\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}