ngx-rs-ant 2.2.2 → 2.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/esm2020/data-grid/data-grid.component.mjs +3 -3
  2. package/esm2020/data-grid/instance-link-template/instance-link-template.component.mjs +3 -3
  3. package/esm2020/form/form.component.mjs +4 -4
  4. package/esm2020/public-api.mjs +11 -1
  5. package/esm2020/types/component/mark-item-component-base.mjs +8 -0
  6. package/esm2020/types/config/mark-item-config-base.mjs +4 -0
  7. package/esm2020/types/config/modal-config-base.mjs +1 -1
  8. package/esm2020/util/utils.mjs +17 -17
  9. package/esm2020/word/section/color.pipe.mjs +19 -0
  10. package/esm2020/word/section/mark.pipe.mjs +20 -0
  11. package/esm2020/word/section/node/node.component.mjs +31 -0
  12. package/esm2020/word/section/node/paragraph/paragraph.component.mjs +44 -0
  13. package/esm2020/word/section/node/paragraph/run/run.component.mjs +84 -0
  14. package/esm2020/word/section/node/paragraph-for-input/item/item.component.mjs +64 -0
  15. package/esm2020/word/section/node/paragraph-for-input/paragraph-for-input.component.mjs +46 -0
  16. package/esm2020/word/section/pt.pipe.mjs +22 -0
  17. package/esm2020/word/section/section.component.mjs +44 -0
  18. package/esm2020/word/section/section.module.mjs +50 -0
  19. package/esm2020/word/section/section.service.mjs +48 -0
  20. package/esm2020/word/word-designer/mark-config/mark-config.component.mjs +77 -0
  21. package/esm2020/word/word-designer/word-designer.component.mjs +207 -0
  22. package/esm2020/word/word-designer/word-designer.module.mjs +35 -0
  23. package/esm2020/word/word-designer/word-designer.service.mjs +69 -0
  24. package/esm2020/word/word-editor/word-editor.component.mjs +154 -0
  25. package/esm2020/word/word-editor/word-editor.module.mjs +32 -0
  26. package/esm2020/word/word-editor/word-editor.service.mjs +67 -0
  27. package/fesm2015/ngx-rs-ant.mjs +1038 -22
  28. package/fesm2015/ngx-rs-ant.mjs.map +1 -1
  29. package/fesm2020/ngx-rs-ant.mjs +1031 -22
  30. package/fesm2020/ngx-rs-ant.mjs.map +1 -1
  31. package/package.json +2 -2
  32. package/public-api.d.ts +10 -0
  33. package/types/component/mark-item-component-base.d.ts +21 -0
  34. package/types/config/mark-item-config-base.d.ts +17 -0
  35. package/types/config/modal-config-base.d.ts +8 -0
  36. package/util/utils.d.ts +10 -10
  37. package/word/section/color.pipe.d.ts +7 -0
  38. package/word/section/mark.pipe.d.ts +10 -0
  39. package/word/section/node/node.component.d.ts +12 -0
  40. package/word/section/node/paragraph/paragraph.component.d.ts +35 -0
  41. package/word/section/node/paragraph/run/run.component.d.ts +21 -0
  42. package/word/section/node/paragraph-for-input/item/item.component.d.ts +27 -0
  43. package/word/section/node/paragraph-for-input/paragraph-for-input.component.d.ts +35 -0
  44. package/word/section/pt.pipe.d.ts +7 -0
  45. package/word/section/section.component.d.ts +22 -0
  46. package/word/section/section.module.d.ts +16 -0
  47. package/word/section/section.service.d.ts +24 -0
  48. package/word/word-designer/mark-config/mark-config.component.d.ts +21 -0
  49. package/word/word-designer/word-designer.component.d.ts +48 -0
  50. package/word/word-designer/word-designer.module.d.ts +11 -0
  51. package/word/word-designer/word-designer.service.d.ts +13 -0
  52. package/word/word-editor/word-editor.component.d.ts +41 -0
  53. package/word/word-editor/word-editor.module.d.ts +10 -0
  54. package/word/word-editor/word-editor.service.d.ts +14 -0
@@ -0,0 +1,48 @@
1
+ import { EventEmitter, Injectable } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class SectionService {
4
+ constructor() {
5
+ this.scale = 1;
6
+ this.marks = [];
7
+ this.readonly = false;
8
+ this.activeMark = { name: '未定义书签' };
9
+ this.copiedMark = {};
10
+ this.readyPasteMarkNames = [];
11
+ this.lastClickToPasteMarkName = '';
12
+ this.valueUpdated = new EventEmitter();
13
+ }
14
+ switchMark(type) {
15
+ let index = this.marks.indexOf(this.activeMark);
16
+ if (index + type === -1) {
17
+ this.activeMark = this.marks[this.marks.length - 1];
18
+ }
19
+ else if (index + type === this.marks.length) {
20
+ this.activeMark = this.marks[0];
21
+ }
22
+ else {
23
+ this.activeMark = this.marks[index + type];
24
+ }
25
+ document.getElementById('mark-setting_' + this.activeMark.name)?.scrollIntoView({
26
+ block: 'center',
27
+ inline: 'center'
28
+ });
29
+ }
30
+ getMark(name) {
31
+ if (!name) {
32
+ return undefined;
33
+ }
34
+ return this.marks.find(m => m.name === name);
35
+ }
36
+ getMarkIndex(name) {
37
+ if (!name) {
38
+ return -1;
39
+ }
40
+ return this.marks.findIndex(m => m.name === name);
41
+ }
42
+ }
43
+ SectionService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: SectionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
44
+ SectionService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: SectionService });
45
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: SectionService, decorators: [{
46
+ type: Injectable
47
+ }] });
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXJzLWFudC9zcmMvd29yZC9zZWN0aW9uL3NlY3Rpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsWUFBWSxFQUFFLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQzs7QUFHdkQsTUFBTSxPQUFPLGNBQWM7SUFEM0I7UUFTRSxVQUFLLEdBQVcsQ0FBQyxDQUFDO1FBQ2xCLFVBQUssR0FBVSxFQUFFLENBQUM7UUFDbEIsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUNqQixlQUFVLEdBQVEsRUFBQyxJQUFJLEVBQUUsT0FBTyxFQUFDLENBQUM7UUFDbEMsZUFBVSxHQUFRLEVBQUUsQ0FBQztRQUNyQix3QkFBbUIsR0FBYSxFQUFFLENBQUM7UUFDbkMsNkJBQXdCLEdBQVcsRUFBRSxDQUFDO1FBQ3RDLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztLQThCekM7SUE1QkMsVUFBVSxDQUFDLElBQVk7UUFDckIsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hELElBQUksS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLENBQUMsRUFBRTtZQUN2QixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDckQ7YUFBTSxJQUFJLEtBQUssR0FBRyxJQUFJLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUU7WUFDN0MsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ2pDO2FBQU07WUFDTCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDO1NBQzVDO1FBQ0QsUUFBUSxDQUFDLGNBQWMsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxjQUFjLENBQUM7WUFDOUUsS0FBSyxFQUFFLFFBQVE7WUFDZixNQUFNLEVBQUUsUUFBUTtTQUNqQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsT0FBTyxDQUFDLElBQVM7UUFDZixJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1QsT0FBTyxTQUFTLENBQUM7U0FDbEI7UUFDRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQsWUFBWSxDQUFDLElBQVM7UUFDcEIsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNULE9BQU8sQ0FBQyxDQUFDLENBQUM7U0FDWDtRQUNELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDO0lBQ3BELENBQUM7OzRHQTVDVSxjQUFjO2dIQUFkLGNBQWM7NEZBQWQsY0FBYztrQkFEMUIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RXZlbnRFbWl0dGVyLCBJbmplY3RhYmxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFNlY3Rpb25TZXJ2aWNlIHtcbiAgdGVuYW50OiBhbnk7XG4gIHRlbXBsYXRlQ2xhc3NOYW1lOiBhbnk7XG4gIGluc3RhbmNlQ2xhc3NOYW1lOiBhbnk7XG4gIHRlbXBsYXRlT2lkOiBhbnk7XG4gIGluc3RhbmNlT2lkOiBhbnk7XG4gIHBhcmFtczogYW55O1xuICB0YWJWaWV3Q29udGFpbmVyUmVmOiBhbnk7XG4gIHNjYWxlOiBudW1iZXIgPSAxO1xuICBtYXJrczogYW55W10gPSBbXTtcbiAgcmVhZG9ubHkgPSBmYWxzZTtcbiAgYWN0aXZlTWFyazogYW55ID0ge25hbWU6ICfmnKrlrprkuYnkuabnrb4nfTtcbiAgY29waWVkTWFyazogYW55ID0ge307XG4gIHJlYWR5UGFzdGVNYXJrTmFtZXM6IHN0cmluZ1tdID0gW107XG4gIGxhc3RDbGlja1RvUGFzdGVNYXJrTmFtZTogc3RyaW5nID0gJyc7XG4gIHZhbHVlVXBkYXRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBzd2l0Y2hNYXJrKHR5cGU6IG51bWJlcikge1xuICAgIGxldCBpbmRleCA9IHRoaXMubWFya3MuaW5kZXhPZih0aGlzLmFjdGl2ZU1hcmspO1xuICAgIGlmIChpbmRleCArIHR5cGUgPT09IC0xKSB7XG4gICAgICB0aGlzLmFjdGl2ZU1hcmsgPSB0aGlzLm1hcmtzW3RoaXMubWFya3MubGVuZ3RoIC0gMV07XG4gICAgfSBlbHNlIGlmIChpbmRleCArIHR5cGUgPT09IHRoaXMubWFya3MubGVuZ3RoKSB7XG4gICAgICB0aGlzLmFjdGl2ZU1hcmsgPSB0aGlzLm1hcmtzWzBdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFjdGl2ZU1hcmsgPSB0aGlzLm1hcmtzW2luZGV4ICsgdHlwZV07XG4gICAgfVxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXJrLXNldHRpbmdfJyArIHRoaXMuYWN0aXZlTWFyay5uYW1lKT8uc2Nyb2xsSW50b1ZpZXcoe1xuICAgICAgYmxvY2s6ICdjZW50ZXInLFxuICAgICAgaW5saW5lOiAnY2VudGVyJ1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0TWFyayhuYW1lOiBhbnkpIHtcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1hcmtzLmZpbmQobSA9PiBtLm5hbWUgPT09IG5hbWUpO1xuICB9XG5cbiAgZ2V0TWFya0luZGV4KG5hbWU6IGFueSkge1xuICAgIGlmICghbmFtZSkge1xuICAgICAgcmV0dXJuIC0xO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5tYXJrcy5maW5kSW5kZXgobSA9PiBtLm5hbWUgPT09IG5hbWUpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,77 @@
1
+ import { Component, Input, ViewChild, ViewContainerRef } from '@angular/core';
2
+ import { MarkItemFactory } from "coast-plugin-register";
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "devextreme-angular/ui/nested";
5
+ import * as i2 from "devextreme-angular/ui/select-box";
6
+ import * as i3 from "devextreme-angular/ui/text-box";
7
+ import * as i4 from "devextreme-angular/ui/validator";
8
+ export class MarkConfigComponent {
9
+ constructor() {
10
+ this.changeMark = false;
11
+ }
12
+ get mark() {
13
+ return this._mark;
14
+ }
15
+ set mark(mark) {
16
+ if (!mark) {
17
+ return;
18
+ }
19
+ this._mark = mark;
20
+ this.changeMark = true;
21
+ this.loadMarkConfig();
22
+ }
23
+ ngOnInit() {
24
+ this.markTypes = MarkItemFactory.getMarkItems(...this.filterCategories || '');
25
+ }
26
+ loadMarkConfig() {
27
+ setTimeout(() => {
28
+ this.markItemConfigRef.clear();
29
+ let config = MarkItemFactory.getConfig(this.mark.type);
30
+ if (!config) {
31
+ return;
32
+ }
33
+ const componentRef = this.markItemConfigRef.createComponent(config.component);
34
+ const instance = componentRef.instance;
35
+ instance.tenant = this.tenant;
36
+ instance.templateClassName = this.templateClassName;
37
+ instance.templateOid = this.templateOid;
38
+ instance.instanceClassName = this.instanceClassName;
39
+ instance.mark = this.mark;
40
+ instance.marks = this.marks;
41
+ });
42
+ }
43
+ changeMarkType() {
44
+ if (this.changeMark) {
45
+ this.changeMark = false;
46
+ }
47
+ else {
48
+ this.mark.pickerCode = null;
49
+ this.mark.generatorCode = null;
50
+ }
51
+ this.loadMarkConfig();
52
+ }
53
+ }
54
+ MarkConfigComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MarkConfigComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
55
+ MarkConfigComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: MarkConfigComponent, selector: "rs-mark-config", inputs: { tenant: "tenant", templateClassName: "templateClassName", templateOid: "templateOid", instanceClassName: "instanceClassName", filterCategories: "filterCategories", mark: "mark", marks: "marks" }, viewQueries: [{ propertyName: "markItemConfigRef", first: true, predicate: ["markItemConfigRef"], descendants: true, read: ViewContainerRef, static: true }], ngImport: i0, template: "<div class=\"dx-field\">\n <div class=\"dx-field-label\">\n <span>\u4E66\u7B7E\u6807\u8BC6</span>\n <span class=\"required-mark\">&nbsp;*</span>\n </div>\n <div class=\"dx-field-value\">\n <dx-text-box [(value)]=\"mark.name\" [readOnly]=\"true\">\n <dx-validator>\n <dxi-validation-rule type=\"required\" message=\"\u503C\u4E0D\u80FD\u4E3A\u7A7A\"></dxi-validation-rule>\n </dx-validator>\n </dx-text-box>\n </div>\n</div>\n<div class=\"dx-field\">\n <div class=\"dx-field-label\">\n <span>\u4E66\u7B7E\u540D\u79F0</span>\n </div>\n <div class=\"dx-field-value\">\n <dx-text-box [(value)]=\"mark.display\"></dx-text-box>\n </div>\n</div>\n<div class=\"dx-field\">\n <div class=\"dx-field-label\">\n <span>\u7EC4\u4EF6\u7C7B\u578B</span>\n <span class=\"required-mark\">&nbsp;*</span>\n </div>\n <div class=\"dx-field-value\">\n <dx-select-box [dataSource]=\"markTypes\"\n valueExpr=\"name\"\n displayExpr=\"caption\"\n [(value)]=\"mark.type\"\n (onSelectionChanged)=\"changeMarkType()\">\n <dx-validator>\n <dxi-validation-rule type=\"required\" message=\"\u503C\u4E0D\u80FD\u4E3A\u7A7A\"></dxi-validation-rule>\n </dx-validator>\n </dx-select-box>\n </div>\n</div>\n<ng-container #markItemConfigRef></ng-container>\n", styles: [":host .dx-field{margin-bottom:8px;display:flex;flex-flow:row nowrap}:host .dx-field .dx-field-label{flex:0 0 80px}:host .dx-field .dx-field-value{flex:1}\n"], dependencies: [{ kind: "component", type: i1.DxiValidationRuleComponent, selector: "dxi-validation-rule", inputs: ["message", "trim", "type", "ignoreEmptyValue", "max", "min", "reevaluate", "validationCallback", "comparisonTarget", "comparisonType", "pattern"] }, { kind: "component", type: i2.DxSelectBoxComponent, selector: "dx-select-box", inputs: ["acceptCustomValue", "accessKey", "activeStateEnabled", "buttons", "customItemCreateEvent", "dataSource", "deferRendering", "disabled", "displayExpr", "displayValue", "dropDownButtonTemplate", "dropDownOptions", "elementAttr", "fieldTemplate", "focusStateEnabled", "grouped", "groupTemplate", "height", "hint", "hoverStateEnabled", "inputAttr", "isDirty", "isValid", "items", "itemTemplate", "label", "labelMode", "maxLength", "minSearchLength", "name", "noDataText", "opened", "openOnFieldClick", "placeholder", "readOnly", "rtlEnabled", "searchEnabled", "searchExpr", "searchMode", "searchTimeout", "selectedItem", "showClearButton", "showDataBeforeSearch", "showDropDownButton", "showSelectionControls", "spellcheck", "stylingMode", "tabIndex", "text", "useItemTextAsTitle", "validationError", "validationErrors", "validationMessageMode", "validationMessagePosition", "validationStatus", "value", "valueChangeEvent", "valueExpr", "visible", "width", "wrapItemText"], outputs: ["onChange", "onClosed", "onContentReady", "onCopy", "onCustomItemCreating", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onItemClick", "onKeyDown", "onKeyUp", "onOpened", "onOptionChanged", "onPaste", "onSelectionChanged", "onValueChanged", "acceptCustomValueChange", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "customItemCreateEventChange", "dataSourceChange", "deferRenderingChange", "disabledChange", "displayExprChange", "displayValueChange", "dropDownButtonTemplateChange", "dropDownOptionsChange", "elementAttrChange", "fieldTemplateChange", "focusStateEnabledChange", "groupedChange", "groupTemplateChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isDirtyChange", "isValidChange", "itemsChange", "itemTemplateChange", "labelChange", "labelModeChange", "maxLengthChange", "minSearchLengthChange", "nameChange", "noDataTextChange", "openedChange", "openOnFieldClickChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "searchEnabledChange", "searchExprChange", "searchModeChange", "searchTimeoutChange", "selectedItemChange", "showClearButtonChange", "showDataBeforeSearchChange", "showDropDownButtonChange", "showSelectionControlsChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useItemTextAsTitleChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationMessagePositionChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "valueExprChange", "visibleChange", "widthChange", "wrapItemTextChange", "onBlur"] }, { kind: "component", type: i3.DxTextBoxComponent, selector: "dx-text-box", inputs: ["accessKey", "activeStateEnabled", "buttons", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "inputAttr", "isDirty", "isValid", "label", "labelMode", "mask", "maskChar", "maskInvalidMessage", "maskRules", "maxLength", "mode", "name", "placeholder", "readOnly", "rtlEnabled", "showClearButton", "showMaskMode", "spellcheck", "stylingMode", "tabIndex", "text", "useMaskedValue", "validationError", "validationErrors", "validationMessageMode", "validationMessagePosition", "validationStatus", "value", "valueChangeEvent", "visible", "width"], outputs: ["onChange", "onContentReady", "onCopy", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onKeyDown", "onKeyUp", "onOptionChanged", "onPaste", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isDirtyChange", "isValidChange", "labelChange", "labelModeChange", "maskChange", "maskCharChange", "maskInvalidMessageChange", "maskRulesChange", "maxLengthChange", "modeChange", "nameChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "showClearButtonChange", "showMaskModeChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useMaskedValueChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationMessagePositionChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "component", type: i4.DxValidatorComponent, selector: "dx-validator", inputs: ["adapter", "elementAttr", "height", "name", "validationGroup", "validationRules", "width"], outputs: ["onDisposing", "onInitialized", "onOptionChanged", "onValidated", "adapterChange", "elementAttrChange", "heightChange", "nameChange", "validationGroupChange", "validationRulesChange", "widthChange"] }] });
56
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MarkConfigComponent, decorators: [{
57
+ type: Component,
58
+ args: [{ selector: 'rs-mark-config', template: "<div class=\"dx-field\">\n <div class=\"dx-field-label\">\n <span>\u4E66\u7B7E\u6807\u8BC6</span>\n <span class=\"required-mark\">&nbsp;*</span>\n </div>\n <div class=\"dx-field-value\">\n <dx-text-box [(value)]=\"mark.name\" [readOnly]=\"true\">\n <dx-validator>\n <dxi-validation-rule type=\"required\" message=\"\u503C\u4E0D\u80FD\u4E3A\u7A7A\"></dxi-validation-rule>\n </dx-validator>\n </dx-text-box>\n </div>\n</div>\n<div class=\"dx-field\">\n <div class=\"dx-field-label\">\n <span>\u4E66\u7B7E\u540D\u79F0</span>\n </div>\n <div class=\"dx-field-value\">\n <dx-text-box [(value)]=\"mark.display\"></dx-text-box>\n </div>\n</div>\n<div class=\"dx-field\">\n <div class=\"dx-field-label\">\n <span>\u7EC4\u4EF6\u7C7B\u578B</span>\n <span class=\"required-mark\">&nbsp;*</span>\n </div>\n <div class=\"dx-field-value\">\n <dx-select-box [dataSource]=\"markTypes\"\n valueExpr=\"name\"\n displayExpr=\"caption\"\n [(value)]=\"mark.type\"\n (onSelectionChanged)=\"changeMarkType()\">\n <dx-validator>\n <dxi-validation-rule type=\"required\" message=\"\u503C\u4E0D\u80FD\u4E3A\u7A7A\"></dxi-validation-rule>\n </dx-validator>\n </dx-select-box>\n </div>\n</div>\n<ng-container #markItemConfigRef></ng-container>\n", styles: [":host .dx-field{margin-bottom:8px;display:flex;flex-flow:row nowrap}:host .dx-field .dx-field-label{flex:0 0 80px}:host .dx-field .dx-field-value{flex:1}\n"] }]
59
+ }], propDecorators: { tenant: [{
60
+ type: Input
61
+ }], templateClassName: [{
62
+ type: Input
63
+ }], templateOid: [{
64
+ type: Input
65
+ }], instanceClassName: [{
66
+ type: Input
67
+ }], filterCategories: [{
68
+ type: Input
69
+ }], mark: [{
70
+ type: Input
71
+ }], marks: [{
72
+ type: Input
73
+ }], markItemConfigRef: [{
74
+ type: ViewChild,
75
+ args: ['markItemConfigRef', { static: true, read: ViewContainerRef }]
76
+ }] } });
77
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFyay1jb25maWcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXJzLWFudC9zcmMvd29yZC93b3JkLWRlc2lnbmVyL21hcmstY29uZmlnL21hcmstY29uZmlnLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1ycy1hbnQvc3JjL3dvcmQvd29yZC1kZXNpZ25lci9tYXJrLWNvbmZpZy9tYXJrLWNvbmZpZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDNUUsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHVCQUF1QixDQUFDOzs7Ozs7QUFPdEQsTUFBTSxPQUFPLG1CQUFtQjtJQUxoQztRQW1DVSxlQUFVLEdBQUcsS0FBSyxDQUFDO0tBa0M1QjtJQXBEQyxJQUNJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUVELElBQUksSUFBSSxDQUFDLElBQVM7UUFDaEIsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNULE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBU0QsUUFBUTtRQUNOLElBQUksQ0FBQyxTQUFTLEdBQUcsZUFBZSxDQUFDLFlBQVksQ0FBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNoRixDQUFDO0lBRUQsY0FBYztRQUNaLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDL0IsSUFBSSxNQUFNLEdBQUcsZUFBZSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3ZELElBQUksQ0FBQyxNQUFNLEVBQUU7Z0JBQ1gsT0FBTzthQUNSO1lBQ0QsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDOUUsTUFBTSxRQUFRLEdBQVEsWUFBWSxDQUFDLFFBQVEsQ0FBQztZQUM1QyxRQUFRLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDOUIsUUFBUSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztZQUNwRCxRQUFRLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7WUFDeEMsUUFBUSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztZQUNwRCxRQUFRLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDMUIsUUFBUSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQzlCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGNBQWM7UUFDWixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDbkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7U0FDekI7YUFBTTtZQUNMLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztZQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7U0FDaEM7UUFDRCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDeEIsQ0FBQzs7aUhBL0RVLG1CQUFtQjtxR0FBbkIsbUJBQW1CLHVXQStCdUIsZ0JBQWdCLDJDQ3ZDdkUsdTFDQXVDQTs0RkQvQmEsbUJBQW1CO2tCQUwvQixTQUFTOytCQUNFLGdCQUFnQjs4QkFNMUIsTUFBTTtzQkFETCxLQUFLO2dCQUdOLGlCQUFpQjtzQkFEaEIsS0FBSztnQkFHTixXQUFXO3NCQURWLEtBQUs7Z0JBR04saUJBQWlCO3NCQURoQixLQUFLO2dCQUdOLGdCQUFnQjtzQkFEZixLQUFLO2dCQUlGLElBQUk7c0JBRFAsS0FBSztnQkFnQk4sS0FBSztzQkFESixLQUFLO2dCQUlrRSxpQkFBaUI7c0JBQXhGLFNBQVM7dUJBQUMsbUJBQW1CLEVBQUUsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBJbnB1dCwgVmlld0NoaWxkLCBWaWV3Q29udGFpbmVyUmVmfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7TWFya0l0ZW1GYWN0b3J5fSBmcm9tIFwiY29hc3QtcGx1Z2luLXJlZ2lzdGVyXCI7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3JzLW1hcmstY29uZmlnJyxcbiAgdGVtcGxhdGVVcmw6ICcuL21hcmstY29uZmlnLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbWFyay1jb25maWcuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBNYXJrQ29uZmlnQ29tcG9uZW50IHtcbiAgQElucHV0KClcbiAgdGVuYW50OiBhbnk7XG4gIEBJbnB1dCgpXG4gIHRlbXBsYXRlQ2xhc3NOYW1lOiBhbnk7XG4gIEBJbnB1dCgpXG4gIHRlbXBsYXRlT2lkOiBhbnk7XG4gIEBJbnB1dCgpXG4gIGluc3RhbmNlQ2xhc3NOYW1lOiBhbnk7XG4gIEBJbnB1dCgpXG4gIGZpbHRlckNhdGVnb3JpZXM/OiBzdHJpbmdbXTtcblxuICBASW5wdXQoKVxuICBnZXQgbWFyaygpIHtcbiAgICByZXR1cm4gdGhpcy5fbWFyaztcbiAgfVxuXG4gIHNldCBtYXJrKG1hcms6IGFueSkge1xuICAgIGlmICghbWFyaykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9tYXJrID0gbWFyaztcbiAgICB0aGlzLmNoYW5nZU1hcmsgPSB0cnVlO1xuICAgIHRoaXMubG9hZE1hcmtDb25maWcoKTtcbiAgfVxuXG4gIHByaXZhdGUgX21hcms6IGFueTtcbiAgQElucHV0KClcbiAgbWFya3M6IGFueTtcbiAgcHJvdGVjdGVkIG1hcmtUeXBlczogYW55O1xuICBwcml2YXRlIGNoYW5nZU1hcmsgPSBmYWxzZTtcbiAgQFZpZXdDaGlsZCgnbWFya0l0ZW1Db25maWdSZWYnLCB7c3RhdGljOiB0cnVlLCByZWFkOiBWaWV3Q29udGFpbmVyUmVmfSkgbWFya0l0ZW1Db25maWdSZWYhOiBWaWV3Q29udGFpbmVyUmVmO1xuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMubWFya1R5cGVzID0gTWFya0l0ZW1GYWN0b3J5LmdldE1hcmtJdGVtcyguLi50aGlzLmZpbHRlckNhdGVnb3JpZXMgfHwgJycpO1xuICB9XG5cbiAgbG9hZE1hcmtDb25maWcoKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLm1hcmtJdGVtQ29uZmlnUmVmLmNsZWFyKCk7XG4gICAgICBsZXQgY29uZmlnID0gTWFya0l0ZW1GYWN0b3J5LmdldENvbmZpZyh0aGlzLm1hcmsudHlwZSk7XG4gICAgICBpZiAoIWNvbmZpZykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBjb21wb25lbnRSZWYgPSB0aGlzLm1hcmtJdGVtQ29uZmlnUmVmLmNyZWF0ZUNvbXBvbmVudChjb25maWcuY29tcG9uZW50KTtcbiAgICAgIGNvbnN0IGluc3RhbmNlOiBhbnkgPSBjb21wb25lbnRSZWYuaW5zdGFuY2U7XG4gICAgICBpbnN0YW5jZS50ZW5hbnQgPSB0aGlzLnRlbmFudDtcbiAgICAgIGluc3RhbmNlLnRlbXBsYXRlQ2xhc3NOYW1lID0gdGhpcy50ZW1wbGF0ZUNsYXNzTmFtZTtcbiAgICAgIGluc3RhbmNlLnRlbXBsYXRlT2lkID0gdGhpcy50ZW1wbGF0ZU9pZDtcbiAgICAgIGluc3RhbmNlLmluc3RhbmNlQ2xhc3NOYW1lID0gdGhpcy5pbnN0YW5jZUNsYXNzTmFtZTtcbiAgICAgIGluc3RhbmNlLm1hcmsgPSB0aGlzLm1hcms7XG4gICAgICBpbnN0YW5jZS5tYXJrcyA9IHRoaXMubWFya3M7XG4gICAgfSk7XG4gIH1cblxuICBjaGFuZ2VNYXJrVHlwZSgpIHtcbiAgICBpZiAodGhpcy5jaGFuZ2VNYXJrKSB7XG4gICAgICB0aGlzLmNoYW5nZU1hcmsgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tYXJrLnBpY2tlckNvZGUgPSBudWxsO1xuICAgICAgdGhpcy5tYXJrLmdlbmVyYXRvckNvZGUgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmxvYWRNYXJrQ29uZmlnKCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJkeC1maWVsZFwiPlxuICA8ZGl2IGNsYXNzPVwiZHgtZmllbGQtbGFiZWxcIj5cbiAgICA8c3Bhbj7kuabnrb7moIfor4Y8L3NwYW4+XG4gICAgPHNwYW4gY2xhc3M9XCJyZXF1aXJlZC1tYXJrXCI+Jm5ic3A7Kjwvc3Bhbj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJkeC1maWVsZC12YWx1ZVwiPlxuICAgIDxkeC10ZXh0LWJveCBbKHZhbHVlKV09XCJtYXJrLm5hbWVcIiBbcmVhZE9ubHldPVwidHJ1ZVwiPlxuICAgICAgPGR4LXZhbGlkYXRvcj5cbiAgICAgICAgPGR4aS12YWxpZGF0aW9uLXJ1bGUgdHlwZT1cInJlcXVpcmVkXCIgbWVzc2FnZT1cIuWAvOS4jeiDveS4uuepulwiPjwvZHhpLXZhbGlkYXRpb24tcnVsZT5cbiAgICAgIDwvZHgtdmFsaWRhdG9yPlxuICAgIDwvZHgtdGV4dC1ib3g+XG4gIDwvZGl2PlxuPC9kaXY+XG48ZGl2IGNsYXNzPVwiZHgtZmllbGRcIj5cbiAgPGRpdiBjbGFzcz1cImR4LWZpZWxkLWxhYmVsXCI+XG4gICAgPHNwYW4+5Lmm562+5ZCN56ewPC9zcGFuPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImR4LWZpZWxkLXZhbHVlXCI+XG4gICAgPGR4LXRleHQtYm94IFsodmFsdWUpXT1cIm1hcmsuZGlzcGxheVwiPjwvZHgtdGV4dC1ib3g+XG4gIDwvZGl2PlxuPC9kaXY+XG48ZGl2IGNsYXNzPVwiZHgtZmllbGRcIj5cbiAgPGRpdiBjbGFzcz1cImR4LWZpZWxkLWxhYmVsXCI+XG4gICAgPHNwYW4+57uE5Lu257G75Z6LPC9zcGFuPlxuICAgIDxzcGFuIGNsYXNzPVwicmVxdWlyZWQtbWFya1wiPiZuYnNwOyo8L3NwYW4+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiZHgtZmllbGQtdmFsdWVcIj5cbiAgICA8ZHgtc2VsZWN0LWJveCBbZGF0YVNvdXJjZV09XCJtYXJrVHlwZXNcIlxuICAgICAgICAgICAgICAgICAgIHZhbHVlRXhwcj1cIm5hbWVcIlxuICAgICAgICAgICAgICAgICAgIGRpc3BsYXlFeHByPVwiY2FwdGlvblwiXG4gICAgICAgICAgICAgICAgICAgWyh2YWx1ZSldPVwibWFyay50eXBlXCJcbiAgICAgICAgICAgICAgICAgICAob25TZWxlY3Rpb25DaGFuZ2VkKT1cImNoYW5nZU1hcmtUeXBlKClcIj5cbiAgICAgIDxkeC12YWxpZGF0b3I+XG4gICAgICAgIDxkeGktdmFsaWRhdGlvbi1ydWxlIHR5cGU9XCJyZXF1aXJlZFwiIG1lc3NhZ2U9XCLlgLzkuI3og73kuLrnqbpcIj48L2R4aS12YWxpZGF0aW9uLXJ1bGU+XG4gICAgICA8L2R4LXZhbGlkYXRvcj5cbiAgICA8L2R4LXNlbGVjdC1ib3g+XG4gIDwvZGl2PlxuPC9kaXY+XG48bmctY29udGFpbmVyICNtYXJrSXRlbUNvbmZpZ1JlZj48L25nLWNvbnRhaW5lcj5cbiJdfQ==
@@ -0,0 +1,207 @@
1
+ import { Component, HostListener, Input, ViewChild } from '@angular/core';
2
+ import { WordDesignerService } from "./word-designer.service";
3
+ import { deepClone, notifySuccess } from "../../util/utils";
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "../section/section.service";
6
+ import * as i2 from "./word-designer.service";
7
+ import * as i3 from "../../modal/modal.service";
8
+ import * as i4 from "@angular/common";
9
+ import * as i5 from "devextreme-angular/ui/nested";
10
+ import * as i6 from "devextreme-angular/ui/button";
11
+ import * as i7 from "devextreme-angular/ui/load-panel";
12
+ import * as i8 from "../section/section.component";
13
+ import * as i9 from "./mark-config/mark-config.component";
14
+ export class WordDesignerComponent {
15
+ handleKeyDown($event) {
16
+ switch ($event.code) {
17
+ case 'ArrowUp':
18
+ if ($event.altKey) {
19
+ this.service.switchMark(-1);
20
+ }
21
+ break;
22
+ case 'ArrowDown':
23
+ if ($event.altKey) {
24
+ this.service.switchMark(1);
25
+ }
26
+ break;
27
+ case 'KeyC':
28
+ if ($event.ctrlKey) {
29
+ const selection = window.getSelection();
30
+ if (selection?.toString()) {
31
+ return;
32
+ }
33
+ this.copyMarkConfig();
34
+ }
35
+ break;
36
+ case 'KeyV':
37
+ if ($event.ctrlKey) {
38
+ this.pasteMarkConfig();
39
+ }
40
+ break;
41
+ case 'Escape':
42
+ this.exitPasteMode();
43
+ break;
44
+ }
45
+ if (this.mouseInViewer && $event.ctrlKey && $event.key === '0') {
46
+ $event.preventDefault();
47
+ this.scale(0);
48
+ }
49
+ }
50
+ constructor(service, wordDesignerService, viewContainerRef, modalService) {
51
+ this.service = service;
52
+ this.wordDesignerService = wordDesignerService;
53
+ this.viewContainerRef = viewContainerRef;
54
+ this.modalService = modalService;
55
+ this.needUpload = false;
56
+ this.pasteMode = false;
57
+ this.mouseInViewer = false;
58
+ this.loading = false;
59
+ this.retainMarkConfig = false;
60
+ }
61
+ ngOnInit() {
62
+ this.service.tenant = this.tenant;
63
+ this.service.templateClassName = this.className;
64
+ this.service.templateOid = this.oid;
65
+ this.service.instanceClassName = this.instanceClassName;
66
+ this.service.params = this.params;
67
+ this.service.tabViewContainerRef = this.tabViewContainerRef;
68
+ this.loading = true;
69
+ this.wordDesignerService.loadTemplate(this.tenant, this.className, this.oid).subscribe(response => {
70
+ this.loadTemplateAndConfig(response);
71
+ this.loading = false;
72
+ });
73
+ }
74
+ loadTemplateAndConfig(response) {
75
+ this.sections = response.sections || [];
76
+ if (this.sections.length === 0) {
77
+ this.needUpload = true;
78
+ this.loading = false;
79
+ return;
80
+ }
81
+ this.needUpload = false;
82
+ this.service.marks = response.marks.map((mark) => {
83
+ mark.config = mark.config || {};
84
+ return mark;
85
+ });
86
+ if (this.service.marks.length > 0) {
87
+ this.service.activeMark = this.service.marks[0];
88
+ }
89
+ }
90
+ scaleByMouse($event) {
91
+ if ($event.ctrlKey) {
92
+ $event.preventDefault();
93
+ this.scale($event.deltaY < 0 ? 0.1 : -0.1);
94
+ }
95
+ }
96
+ scale(type) {
97
+ if (type === 0) {
98
+ this.service.scale = 1;
99
+ }
100
+ else {
101
+ this.service.scale += type;
102
+ }
103
+ }
104
+ upload() {
105
+ this.loading = true;
106
+ this.wordDesignerService.uploadTemplateFile(this.tenant, this.className, this.oid, this.retainMarkConfig, this.uploadInput.nativeElement.files[0]).subscribe(response => {
107
+ this.uploadInput.nativeElement.value = '';
108
+ this.loadTemplateAndConfig(response);
109
+ this.loading = false;
110
+ });
111
+ }
112
+ openReplaceTemplateFileModal() {
113
+ this.replaceFileModal = this.modalService.open(this.tabViewContainerRef, '替换文件', 'default', this.replaceFileModalTemplate, {});
114
+ }
115
+ replaceTemplateFile(retainMarkConfig) {
116
+ this.retainMarkConfig = retainMarkConfig;
117
+ this.uploadInput.nativeElement.click();
118
+ this.replaceFileModal?.hide();
119
+ }
120
+ downloadTemplateFile() {
121
+ this.loading = true;
122
+ this.wordDesignerService.downloadTemplateFile(this.tenant, this.className, this.oid, () => {
123
+ this.loading = false;
124
+ });
125
+ }
126
+ preview() {
127
+ for (let mark of this.service.marks) {
128
+ mark.value = undefined;
129
+ }
130
+ this.previewModal = this.modalService.open(this.tabViewContainerRef, '预览', 'full', this.previewTemplate, {}, this.previewFooterTemplate);
131
+ }
132
+ saveConfig() {
133
+ this.loading = true;
134
+ this.service.marks.map(mark => {
135
+ delete mark.value;
136
+ });
137
+ this.wordDesignerService.save(this.tenant, this.className, this.oid, {
138
+ templateConfig: JSON.stringify({
139
+ sections: this.sections,
140
+ marks: this.service.marks
141
+ })
142
+ }).subscribe(response => {
143
+ if (response.success) {
144
+ notifySuccess('保存成功');
145
+ this.loading = false;
146
+ }
147
+ });
148
+ }
149
+ copyMarkConfig() {
150
+ this.service.copiedMark = deepClone(this.service.activeMark);
151
+ this.pasteMode = true;
152
+ }
153
+ exitPasteMode() {
154
+ this.service.copiedMark = {};
155
+ this.service.readyPasteMarkNames = [];
156
+ this.service.lastClickToPasteMarkName = '';
157
+ this.pasteMode = false;
158
+ }
159
+ pasteMarkConfig() {
160
+ let readyPasteMark;
161
+ for (let readyPasteMarkName of this.service.readyPasteMarkNames) {
162
+ readyPasteMark = this.service.getMark(readyPasteMarkName);
163
+ const display = readyPasteMark.display;
164
+ Object.assign(readyPasteMark, deepClone(this.service.copiedMark));
165
+ readyPasteMark.name = readyPasteMarkName;
166
+ readyPasteMark.display = display;
167
+ }
168
+ this.service.activeMark = readyPasteMark || this.service.activeMark;
169
+ this.exitPasteMode();
170
+ }
171
+ }
172
+ WordDesignerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: WordDesignerComponent, deps: [{ token: i1.SectionService }, { token: i2.WordDesignerService }, { token: i0.ViewContainerRef }, { token: i3.ModalService }], target: i0.ɵɵFactoryTarget.Component });
173
+ WordDesignerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: WordDesignerComponent, selector: "rs-word-designer", inputs: { tenant: "tenant", className: "className", oid: "oid", instanceClassName: "instanceClassName", filterCategories: "filterCategories", params: "params", tabViewContainerRef: "tabViewContainerRef" }, host: { listeners: { "window:keydown": "handleKeyDown($event)" } }, providers: [WordDesignerService], viewQueries: [{ propertyName: "uploadInput", first: true, predicate: ["uploadInput"], descendants: true, static: true }, { propertyName: "replaceFileModalTemplate", first: true, predicate: ["replaceFileModalTemplate"], descendants: true, static: true }, { propertyName: "previewTemplate", first: true, predicate: ["previewTemplate"], descendants: true, static: true }, { propertyName: "previewFooterTemplate", first: true, predicate: ["previewFooterTemplate"], descendants: true, static: true }], ngImport: i0, template: "<dx-load-panel [container]=\"viewContainerRef.element.nativeElement\" [showPane]=\"false\" [visible]=\"loading\">\n <dxo-position [of]=\"viewContainerRef.element.nativeElement\"></dxo-position>\n</dx-load-panel>\n<input #uploadInput type=\"file\" name=\"file\"\n accept=\"application/vnd.openxmlformats-officedocument.wordprocessingml.document\" (change)=\"upload()\"\n style=\"display: none;\"/>\n<div class=\"coast-card\">\n <div class=\"coast-card-content\">\n <div class=\"content-main\" [class.show-upload-btn]=\"needUpload\">\n <ng-container *ngIf=\"needUpload\">\n <dx-button type=\"success\" text=\"\u4E0A\u4F20\u6587\u4EF6\" (onClick)=\"uploadInput.click()\"></dx-button>\n </ng-container>\n <div *ngIf=\"!needUpload\" class=\"left-panel\">\n <div *ngIf=\"pasteMode\" class=\"paste-mode-bar\">\n <span\n class=\"message\">\u5DF2\u8FDB\u5165\u6279\u91CF\u7C98\u8D34\u914D\u7F6E\u6A21\u5F0F\uFF0C\u652F\u6301Ctrl\u3001Shift\u952E\u5FEB\u6377\u9009\u62E9\uFF0C\u6309Ctrl+V\u7EC4\u5408\u952E\u7C98\u8D34\u914D\u7F6E\uFF0C\u6309Esc\u952E\u53D6\u6D88\u64CD\u4F5C\u5E76\u9000\u51FA\u8BE5\u6A21\u5F0F</span>\n <dx-button [width]=\"48\" text=\"\u9000\u51FA\" (onClick)=\"exitPasteMode()\"></dx-button>\n </div>\n <div class=\"content\"\n (mouseenter)=\"mouseInViewer = true;\"\n (mouseleave)=\"mouseInViewer = false;\"\n (mousewheel)=\"scaleByMouse($event)\">\n <div *ngIf=\"!needUpload\" class=\"viewer\">\n <ng-container *ngFor=\"let section of sections\">\n <rs-section [section]=\"section\" [editMode]=\"true\" [pasteMode]=\"pasteMode\"></rs-section>\n </ng-container>\n </div>\n </div>\n </div>\n <div *ngIf=\"!needUpload\" class=\"right-panel\">\n <div class=\"header\">\n <dx-button type=\"default\" text=\"\u66FF\u6362\u6587\u4EF6\" (onClick)=\"openReplaceTemplateFileModal()\"\n [disabled]=\"loading\"></dx-button>\n <dx-button icon=\"coast-icon coast-icon-download\" hint=\"\u4E0B\u8F7D\u6587\u4EF6\"\n (onClick)=\"downloadTemplateFile()\" [disabled]=\"loading\"></dx-button>\n <dx-button icon=\"coast-icon coast-icon-direction-up\" hint=\"\u4E0A\u4E00\u4E2A(Alt + \u2191)\"\n (onClick)=\"service.switchMark(-1)\" [disabled]=\"loading\"></dx-button>\n <dx-button icon=\"coast-icon coast-icon-direction-down\" hint=\"\u4E0B\u4E00\u4E2A(Alt + \u2193)\"\n (onClick)=\"service.switchMark(1)\" [disabled]=\"loading\"></dx-button>\n <dx-button [type]=\"pasteMode ? 'success' : 'default'\" text=\"\u590D\u5236\" hint=\"\u590D\u5236(Ctrl + c)\"\n (onClick)=\"copyMarkConfig()\"></dx-button>\n <dx-button type=\"danger\" text=\"\u7C98\u8D34\" hint=\"\u7C98\u8D34(Ctrl + v)\" (onClick)=\"pasteMarkConfig()\"\n [disabled]=\"loading || !pasteMode\"></dx-button>\n </div>\n <div class=\"config\" *ngIf=\"service.activeMark\">\n <rs-mark-config [tenant]=\"tenant\"\n [templateClassName]=\"className\"\n [templateOid]=\"oid\"\n [instanceClassName]=\"instanceClassName\"\n [filterCategories]=\"filterCategories\"\n [mark]=\"service.activeMark\"\n [marks]=\"service.marks\"></rs-mark-config>\n </div>\n </div>\n </div>\n </div>\n <div *ngIf=\"!needUpload\" class=\"footer\">\n <div class=\"left\">\n <dx-button text=\"\u653E\u5927\" (onClick)=\"scale(0.1)\"></dx-button>\n <dx-button text=\"\u8FD8\u539F\" (onClick)=\"scale(0)\"></dx-button>\n <dx-button text=\"\u7F29\u5C0F\" (onClick)=\"scale(-0.1)\"></dx-button>\n </div>\n <div class=\"right\">\n <dx-button type=\"default\" text=\"\u9884\u89C8\" (onClick)=\"preview()\" [disabled]=\"needUpload || loading\"></dx-button>\n <dx-button type=\"success\" text=\"\u4FDD\u5B58\" (onClick)=\"saveConfig()\" [disabled]=\"needUpload || loading\"></dx-button>\n </div>\n </div>\n</div>\n<ng-template #replaceFileModalTemplate>\n <div class=\"confirm-message\">\n <span>\u66FF\u6362\u6587\u4EF6\u53EF\u4EE5\u6309\u7167\u4E66\u7B7E\u6807\u8BC6\u7EE7\u627F\u5DF2\u4FDD\u5B58\u7684\u4E66\u7B7E\u914D\u7F6E\uFF0C\u8BF7\u9009\u62E9\u64CD\u4F5C\uFF1A</span>\n </div>\n <div class=\"form-buttons\">\n <div class=\"buttons-wrapper\">\n <dx-button type=\"default\" text=\"\u7EE7\u627F\u914D\u7F6E\" (onClick)=\"replaceTemplateFile(true)\"></dx-button>\n <dx-button type=\"danger\" text=\"\u6E05\u9664\u914D\u7F6E\" (onClick)=\"replaceTemplateFile(false)\"></dx-button>\n <dx-button type=\"normal\" text=\"\u53D6\u6D88\" (onClick)=\"replaceFileModal?.hide()\"></dx-button>\n </div>\n </div>\n</ng-template>\n<ng-template #previewTemplate>\n <div class=\"preview-viewer\">\n <div class=\"viewer-container\">\n <div class=\"viewer\">\n <ng-container *ngFor=\"let section of sections\">\n <rs-section [section]=\"section\"></rs-section>\n </ng-container>\n </div>\n </div>\n </div>\n</ng-template>\n<ng-template #previewFooterTemplate>\n <div class=\"form-buttons\">\n <div class=\"buttons-wrapper\">\n <dx-button type=\"normal\" text=\"\u5173\u95ED\" (onClick)=\"previewModal?.hide()\"></dx-button>\n </div>\n </div>\n</ng-template>\n", styles: [":host{flex:1;display:flex;flex-flow:column nowrap}:host .coast-card{flex:1;padding:0}:host .coast-card .content-main{display:flex;flex-flow:row nowrap;padding:16px 0 0 16px;margin:0}:host .coast-card .content-main.show-upload-btn{padding:16px;background-color:var(--coast-empty-color, rgb(229, 229, 229));align-items:center;justify-content:center}:host .coast-card .content-main .left-panel{flex:auto;width:0;overflow-x:auto;background-color:var(--coast-empty-color, rgb(229, 229, 229));display:flex;flex-flow:column nowrap}:host .coast-card .content-main .left-panel .paste-mode-bar{flex:none;padding:8px;background-color:var(--coast-base-bg-color, rgb(255, 255, 255));border:1px solid var(--coast-border-color, rgb(221, 221, 221));display:flex;flex-flow:row nowrap;justify-content:space-between;align-items:center}:host .coast-card .content-main .left-panel .paste-mode-bar .message{font-weight:700}:host .coast-card .content-main .left-panel .content{flex:auto;height:0;overflow-y:auto;padding:8px 16px 0;display:flex;flex-flow:row nowrap}:host .coast-card .content-main .left-panel .content .viewer{margin:auto;display:flex;flex-flow:column nowrap;align-items:center;z-index:0}:host .coast-card .content-main .right-panel{flex:0 0 320px;display:flex;flex-flow:column nowrap;border-left:1px solid var(--coast-border-color, rgb(221, 221, 221))}:host .coast-card .content-main .right-panel .header{flex:none;border-bottom:1px solid var(--coast-border-color, rgb(221, 221, 221));padding:0 16px 16px}:host .coast-card .content-main .right-panel .header>dx-button:not(:last-child){margin-right:8px}:host .coast-card .content-main .right-panel .config{flex:auto;height:0;overflow:auto;padding:24px;display:flex;flex-flow:column nowrap}:host .coast-card .footer{flex:none;border-top:1px solid var(--coast-border-color, rgb(221, 221, 221));padding:12px 24px;display:flex;flex-flow:row nowrap;justify-content:space-between}:host .coast-card .footer dx-button{width:80px}:host .coast-card .footer dx-button:not(:last-child){margin-right:8px}.confirm-message{padding:24px;margin-bottom:12px;border-bottom:1px solid var(--coast-border-color, rgb(221, 221, 221))}.confirm-message span{font-size:14px}.preview-viewer{flex:auto;height:0;overflow-y:auto;margin:0 16px;background-color:var(--coast-empty-color, rgb(229, 229, 229));display:flex;flex-flow:column nowrap}.preview-viewer .viewer-container{flex:auto;height:0;overflow-x:auto;padding:8px 16px 0;display:flex;flex-flow:row nowrap}.preview-viewer .viewer-container .viewer{margin:auto;display:flex;flex-flow:column nowrap;align-items:center;z-index:0}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.DxoPositionComponent, selector: "dxo-position", inputs: ["at", "boundary", "boundaryOffset", "collision", "my", "of", "offset"] }, { kind: "component", type: i6.DxButtonComponent, selector: "dx-button", inputs: ["accessKey", "activeStateEnabled", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "icon", "rtlEnabled", "stylingMode", "tabIndex", "template", "text", "type", "useSubmitBehavior", "validationGroup", "visible", "width"], outputs: ["onClick", "onContentReady", "onDisposing", "onInitialized", "onOptionChanged", "accessKeyChange", "activeStateEnabledChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "iconChange", "rtlEnabledChange", "stylingModeChange", "tabIndexChange", "templateChange", "textChange", "typeChange", "useSubmitBehaviorChange", "validationGroupChange", "visibleChange", "widthChange"] }, { kind: "component", type: i7.DxLoadPanelComponent, selector: "dx-load-panel", inputs: ["animation", "closeOnOutsideClick", "container", "copyRootClassesToWrapper", "deferRendering", "delay", "elementAttr", "focusStateEnabled", "height", "hideOnOutsideClick", "hideOnParentScroll", "hint", "hoverStateEnabled", "indicatorSrc", "maxHeight", "maxWidth", "message", "minHeight", "minWidth", "position", "rtlEnabled", "shading", "shadingColor", "showIndicator", "showPane", "visible", "width", "wrapperAttr"], outputs: ["onContentReady", "onDisposing", "onHidden", "onHiding", "onInitialized", "onOptionChanged", "onShowing", "onShown", "animationChange", "closeOnOutsideClickChange", "containerChange", "copyRootClassesToWrapperChange", "deferRenderingChange", "delayChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hideOnOutsideClickChange", "hideOnParentScrollChange", "hintChange", "hoverStateEnabledChange", "indicatorSrcChange", "maxHeightChange", "maxWidthChange", "messageChange", "minHeightChange", "minWidthChange", "positionChange", "rtlEnabledChange", "shadingChange", "shadingColorChange", "showIndicatorChange", "showPaneChange", "visibleChange", "widthChange", "wrapperAttrChange"] }, { kind: "component", type: i8.SectionComponent, selector: "rs-section", inputs: ["section", "editMode", "pasteMode", "readonly"] }, { kind: "component", type: i9.MarkConfigComponent, selector: "rs-mark-config", inputs: ["tenant", "templateClassName", "templateOid", "instanceClassName", "filterCategories", "mark", "marks"] }] });
174
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: WordDesignerComponent, decorators: [{
175
+ type: Component,
176
+ args: [{ selector: 'rs-word-designer', providers: [WordDesignerService], template: "<dx-load-panel [container]=\"viewContainerRef.element.nativeElement\" [showPane]=\"false\" [visible]=\"loading\">\n <dxo-position [of]=\"viewContainerRef.element.nativeElement\"></dxo-position>\n</dx-load-panel>\n<input #uploadInput type=\"file\" name=\"file\"\n accept=\"application/vnd.openxmlformats-officedocument.wordprocessingml.document\" (change)=\"upload()\"\n style=\"display: none;\"/>\n<div class=\"coast-card\">\n <div class=\"coast-card-content\">\n <div class=\"content-main\" [class.show-upload-btn]=\"needUpload\">\n <ng-container *ngIf=\"needUpload\">\n <dx-button type=\"success\" text=\"\u4E0A\u4F20\u6587\u4EF6\" (onClick)=\"uploadInput.click()\"></dx-button>\n </ng-container>\n <div *ngIf=\"!needUpload\" class=\"left-panel\">\n <div *ngIf=\"pasteMode\" class=\"paste-mode-bar\">\n <span\n class=\"message\">\u5DF2\u8FDB\u5165\u6279\u91CF\u7C98\u8D34\u914D\u7F6E\u6A21\u5F0F\uFF0C\u652F\u6301Ctrl\u3001Shift\u952E\u5FEB\u6377\u9009\u62E9\uFF0C\u6309Ctrl+V\u7EC4\u5408\u952E\u7C98\u8D34\u914D\u7F6E\uFF0C\u6309Esc\u952E\u53D6\u6D88\u64CD\u4F5C\u5E76\u9000\u51FA\u8BE5\u6A21\u5F0F</span>\n <dx-button [width]=\"48\" text=\"\u9000\u51FA\" (onClick)=\"exitPasteMode()\"></dx-button>\n </div>\n <div class=\"content\"\n (mouseenter)=\"mouseInViewer = true;\"\n (mouseleave)=\"mouseInViewer = false;\"\n (mousewheel)=\"scaleByMouse($event)\">\n <div *ngIf=\"!needUpload\" class=\"viewer\">\n <ng-container *ngFor=\"let section of sections\">\n <rs-section [section]=\"section\" [editMode]=\"true\" [pasteMode]=\"pasteMode\"></rs-section>\n </ng-container>\n </div>\n </div>\n </div>\n <div *ngIf=\"!needUpload\" class=\"right-panel\">\n <div class=\"header\">\n <dx-button type=\"default\" text=\"\u66FF\u6362\u6587\u4EF6\" (onClick)=\"openReplaceTemplateFileModal()\"\n [disabled]=\"loading\"></dx-button>\n <dx-button icon=\"coast-icon coast-icon-download\" hint=\"\u4E0B\u8F7D\u6587\u4EF6\"\n (onClick)=\"downloadTemplateFile()\" [disabled]=\"loading\"></dx-button>\n <dx-button icon=\"coast-icon coast-icon-direction-up\" hint=\"\u4E0A\u4E00\u4E2A(Alt + \u2191)\"\n (onClick)=\"service.switchMark(-1)\" [disabled]=\"loading\"></dx-button>\n <dx-button icon=\"coast-icon coast-icon-direction-down\" hint=\"\u4E0B\u4E00\u4E2A(Alt + \u2193)\"\n (onClick)=\"service.switchMark(1)\" [disabled]=\"loading\"></dx-button>\n <dx-button [type]=\"pasteMode ? 'success' : 'default'\" text=\"\u590D\u5236\" hint=\"\u590D\u5236(Ctrl + c)\"\n (onClick)=\"copyMarkConfig()\"></dx-button>\n <dx-button type=\"danger\" text=\"\u7C98\u8D34\" hint=\"\u7C98\u8D34(Ctrl + v)\" (onClick)=\"pasteMarkConfig()\"\n [disabled]=\"loading || !pasteMode\"></dx-button>\n </div>\n <div class=\"config\" *ngIf=\"service.activeMark\">\n <rs-mark-config [tenant]=\"tenant\"\n [templateClassName]=\"className\"\n [templateOid]=\"oid\"\n [instanceClassName]=\"instanceClassName\"\n [filterCategories]=\"filterCategories\"\n [mark]=\"service.activeMark\"\n [marks]=\"service.marks\"></rs-mark-config>\n </div>\n </div>\n </div>\n </div>\n <div *ngIf=\"!needUpload\" class=\"footer\">\n <div class=\"left\">\n <dx-button text=\"\u653E\u5927\" (onClick)=\"scale(0.1)\"></dx-button>\n <dx-button text=\"\u8FD8\u539F\" (onClick)=\"scale(0)\"></dx-button>\n <dx-button text=\"\u7F29\u5C0F\" (onClick)=\"scale(-0.1)\"></dx-button>\n </div>\n <div class=\"right\">\n <dx-button type=\"default\" text=\"\u9884\u89C8\" (onClick)=\"preview()\" [disabled]=\"needUpload || loading\"></dx-button>\n <dx-button type=\"success\" text=\"\u4FDD\u5B58\" (onClick)=\"saveConfig()\" [disabled]=\"needUpload || loading\"></dx-button>\n </div>\n </div>\n</div>\n<ng-template #replaceFileModalTemplate>\n <div class=\"confirm-message\">\n <span>\u66FF\u6362\u6587\u4EF6\u53EF\u4EE5\u6309\u7167\u4E66\u7B7E\u6807\u8BC6\u7EE7\u627F\u5DF2\u4FDD\u5B58\u7684\u4E66\u7B7E\u914D\u7F6E\uFF0C\u8BF7\u9009\u62E9\u64CD\u4F5C\uFF1A</span>\n </div>\n <div class=\"form-buttons\">\n <div class=\"buttons-wrapper\">\n <dx-button type=\"default\" text=\"\u7EE7\u627F\u914D\u7F6E\" (onClick)=\"replaceTemplateFile(true)\"></dx-button>\n <dx-button type=\"danger\" text=\"\u6E05\u9664\u914D\u7F6E\" (onClick)=\"replaceTemplateFile(false)\"></dx-button>\n <dx-button type=\"normal\" text=\"\u53D6\u6D88\" (onClick)=\"replaceFileModal?.hide()\"></dx-button>\n </div>\n </div>\n</ng-template>\n<ng-template #previewTemplate>\n <div class=\"preview-viewer\">\n <div class=\"viewer-container\">\n <div class=\"viewer\">\n <ng-container *ngFor=\"let section of sections\">\n <rs-section [section]=\"section\"></rs-section>\n </ng-container>\n </div>\n </div>\n </div>\n</ng-template>\n<ng-template #previewFooterTemplate>\n <div class=\"form-buttons\">\n <div class=\"buttons-wrapper\">\n <dx-button type=\"normal\" text=\"\u5173\u95ED\" (onClick)=\"previewModal?.hide()\"></dx-button>\n </div>\n </div>\n</ng-template>\n", styles: [":host{flex:1;display:flex;flex-flow:column nowrap}:host .coast-card{flex:1;padding:0}:host .coast-card .content-main{display:flex;flex-flow:row nowrap;padding:16px 0 0 16px;margin:0}:host .coast-card .content-main.show-upload-btn{padding:16px;background-color:var(--coast-empty-color, rgb(229, 229, 229));align-items:center;justify-content:center}:host .coast-card .content-main .left-panel{flex:auto;width:0;overflow-x:auto;background-color:var(--coast-empty-color, rgb(229, 229, 229));display:flex;flex-flow:column nowrap}:host .coast-card .content-main .left-panel .paste-mode-bar{flex:none;padding:8px;background-color:var(--coast-base-bg-color, rgb(255, 255, 255));border:1px solid var(--coast-border-color, rgb(221, 221, 221));display:flex;flex-flow:row nowrap;justify-content:space-between;align-items:center}:host .coast-card .content-main .left-panel .paste-mode-bar .message{font-weight:700}:host .coast-card .content-main .left-panel .content{flex:auto;height:0;overflow-y:auto;padding:8px 16px 0;display:flex;flex-flow:row nowrap}:host .coast-card .content-main .left-panel .content .viewer{margin:auto;display:flex;flex-flow:column nowrap;align-items:center;z-index:0}:host .coast-card .content-main .right-panel{flex:0 0 320px;display:flex;flex-flow:column nowrap;border-left:1px solid var(--coast-border-color, rgb(221, 221, 221))}:host .coast-card .content-main .right-panel .header{flex:none;border-bottom:1px solid var(--coast-border-color, rgb(221, 221, 221));padding:0 16px 16px}:host .coast-card .content-main .right-panel .header>dx-button:not(:last-child){margin-right:8px}:host .coast-card .content-main .right-panel .config{flex:auto;height:0;overflow:auto;padding:24px;display:flex;flex-flow:column nowrap}:host .coast-card .footer{flex:none;border-top:1px solid var(--coast-border-color, rgb(221, 221, 221));padding:12px 24px;display:flex;flex-flow:row nowrap;justify-content:space-between}:host .coast-card .footer dx-button{width:80px}:host .coast-card .footer dx-button:not(:last-child){margin-right:8px}.confirm-message{padding:24px;margin-bottom:12px;border-bottom:1px solid var(--coast-border-color, rgb(221, 221, 221))}.confirm-message span{font-size:14px}.preview-viewer{flex:auto;height:0;overflow-y:auto;margin:0 16px;background-color:var(--coast-empty-color, rgb(229, 229, 229));display:flex;flex-flow:column nowrap}.preview-viewer .viewer-container{flex:auto;height:0;overflow-x:auto;padding:8px 16px 0;display:flex;flex-flow:row nowrap}.preview-viewer .viewer-container .viewer{margin:auto;display:flex;flex-flow:column nowrap;align-items:center;z-index:0}\n"] }]
177
+ }], ctorParameters: function () { return [{ type: i1.SectionService }, { type: i2.WordDesignerService }, { type: i0.ViewContainerRef }, { type: i3.ModalService }]; }, propDecorators: { tenant: [{
178
+ type: Input
179
+ }], className: [{
180
+ type: Input
181
+ }], oid: [{
182
+ type: Input
183
+ }], instanceClassName: [{
184
+ type: Input
185
+ }], filterCategories: [{
186
+ type: Input
187
+ }], params: [{
188
+ type: Input
189
+ }], tabViewContainerRef: [{
190
+ type: Input
191
+ }], uploadInput: [{
192
+ type: ViewChild,
193
+ args: ['uploadInput', { static: true }]
194
+ }], replaceFileModalTemplate: [{
195
+ type: ViewChild,
196
+ args: ['replaceFileModalTemplate', { static: true }]
197
+ }], previewTemplate: [{
198
+ type: ViewChild,
199
+ args: ['previewTemplate', { static: true }]
200
+ }], previewFooterTemplate: [{
201
+ type: ViewChild,
202
+ args: ['previewFooterTemplate', { static: true }]
203
+ }], handleKeyDown: [{
204
+ type: HostListener,
205
+ args: ['window:keydown', ['$event']]
206
+ }] } });
207
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29yZC1kZXNpZ25lci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtcnMtYW50L3NyYy93b3JkL3dvcmQtZGVzaWduZXIvd29yZC1kZXNpZ25lci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtcnMtYW50L3NyYy93b3JkL3dvcmQtZGVzaWduZXIvd29yZC1kZXNpZ25lci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFjLFlBQVksRUFBRSxLQUFLLEVBQWUsU0FBUyxFQUFtQixNQUFNLGVBQWUsQ0FBQztBQUVuSCxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUc1RCxPQUFPLEVBQUMsU0FBUyxFQUFFLGFBQWEsRUFBQyxNQUFNLGtCQUFrQixDQUFDOzs7Ozs7Ozs7OztBQVExRCxNQUFNLE9BQU8scUJBQXFCO0lBNkJoQyxhQUFhLENBQUMsTUFBcUI7UUFDakMsUUFBUSxNQUFNLENBQUMsSUFBSSxFQUFFO1lBQ25CLEtBQUssU0FBUztnQkFDWixJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUU7b0JBQ2pCLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQzdCO2dCQUNELE1BQU07WUFDUixLQUFLLFdBQVc7Z0JBQ2QsSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFO29CQUNqQixJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDNUI7Z0JBQ0QsTUFBTTtZQUNSLEtBQUssTUFBTTtnQkFDVCxJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUU7b0JBQ2xCLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztvQkFDeEMsSUFBSSxTQUFTLEVBQUUsUUFBUSxFQUFFLEVBQUU7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QUM7Z0JBQ1EscUJBQXFCO3NCQUF4RSxTQUFTO3VCQUFDLHVCQUF1QixFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQztnQkFHbEQsYUFBYTtzQkFEWixZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIEVsZW1lbnRSZWYsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQsIFZpZXdDb250YWluZXJSZWZ9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtNb2RhbENvbXBvbmVudH0gZnJvbSBcIi4uLy4uL21vZGFsL21vZGFsLmNvbXBvbmVudFwiO1xuaW1wb3J0IHtXb3JkRGVzaWduZXJTZXJ2aWNlfSBmcm9tIFwiLi93b3JkLWRlc2lnbmVyLnNlcnZpY2VcIjtcbmltcG9ydCB7TW9kYWxTZXJ2aWNlfSBmcm9tIFwiLi4vLi4vbW9kYWwvbW9kYWwuc2VydmljZVwiO1xuaW1wb3J0IHtTZWN0aW9uU2VydmljZX0gZnJvbSBcIi4uL3NlY3Rpb24vc2VjdGlvbi5zZXJ2aWNlXCI7XG5pbXBvcnQge2RlZXBDbG9uZSwgbm90aWZ5U3VjY2Vzc30gZnJvbSBcIi4uLy4uL3V0aWwvdXRpbHNcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncnMtd29yZC1kZXNpZ25lcicsXG4gIHRlbXBsYXRlVXJsOiAnLi93b3JkLWRlc2lnbmVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vd29yZC1kZXNpZ25lci5jb21wb25lbnQuc2NzcyddLFxuICBwcm92aWRlcnM6IFtXb3JkRGVzaWduZXJTZXJ2aWNlXVxufSlcbmV4cG9ydCBjbGFzcyBXb3JkRGVzaWduZXJDb21wb25lbnQge1xuICBASW5wdXQoKVxuICB0ZW5hbnQ6IGFueTtcbiAgQElucHV0KClcbiAgY2xhc3NOYW1lOiBhbnk7XG4gIEBJbnB1dCgpXG4gIG9pZDogYW55O1xuICBASW5wdXQoKVxuICBpbnN0YW5jZUNsYXNzTmFtZTogYW55O1xuICBASW5wdXQoKVxuICBmaWx0ZXJDYXRlZ29yaWVzPzogc3RyaW5nW107XG4gIEBJbnB1dCgpXG4gIHBhcmFtcz86IGFueTtcbiAgQElucHV0KClcbiAgdGFiVmlld0NvbnRhaW5lclJlZiE6IGFueTtcbiAgcHJvdGVjdGVkIHNlY3Rpb25zOiBhbnk7XG4gIHByb3RlY3RlZCBuZWVkVXBsb2FkID0gZmFsc2U7XG4gIHByb3RlY3RlZCBwYXN0ZU1vZGUgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIG1vdXNlSW5WaWV3ZXIgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIGxvYWRpbmcgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIHJlcGxhY2VGaWxlTW9kYWw/OiBNb2RhbENvbXBvbmVudDtcbiAgcHJvdGVjdGVkIHJldGFpbk1hcmtDb25maWcgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIHByZXZpZXdNb2RhbD86IE1vZGFsQ29tcG9uZW50O1xuICBAVmlld0NoaWxkKCd1cGxvYWRJbnB1dCcsIHtzdGF0aWM6IHRydWV9KSB1cGxvYWRJbnB1dCE6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ3JlcGxhY2VGaWxlTW9kYWxUZW1wbGF0ZScsIHtzdGF0aWM6IHRydWV9KSByZXBsYWNlRmlsZU1vZGFsVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAVmlld0NoaWxkKCdwcmV2aWV3VGVtcGxhdGUnLCB7c3RhdGljOiB0cnVlfSkgcHJldmlld1RlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PjtcbiAgQFZpZXdDaGlsZCgncHJldmlld0Zvb3RlclRlbXBsYXRlJywge3N0YXRpYzogdHJ1ZX0pIHByZXZpZXdGb290ZXJUZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmtleWRvd24nLCBbJyRldmVudCddKVxuICBoYW5kbGVLZXlEb3duKCRldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIHN3aXRjaCAoJGV2ZW50LmNvZGUpIHtcbiAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICBpZiAoJGV2ZW50LmFsdEtleSkge1xuICAgICAgICAgIHRoaXMuc2VydmljZS5zd2l0Y2hNYXJrKC0xKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0Fycm93RG93bic6XG4gICAgICAgIGlmICgkZXZlbnQuYWx0S2V5KSB7XG4gICAgICAgICAgdGhpcy5zZXJ2aWNlLnN3aXRjaE1hcmsoMSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdLZXlDJzpcbiAgICAgICAgaWYgKCRldmVudC5jdHJsS2V5KSB7XG4gICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgICAgICAgIGlmIChzZWxlY3Rpb24/LnRvU3RyaW5nKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5jb3B5TWFya0NvbmZpZygpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnS2V5Vic6XG4gICAgICAgIGlmICgkZXZlbnQuY3RybEtleSkge1xuICAgICAgICAgIHRoaXMucGFzdGVNYXJrQ29uZmlnKCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdFc2NhcGUnOlxuICAgICAgICB0aGlzLmV4aXRQYXN0ZU1vZGUoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGlmICh0aGlzLm1vdXNlSW5WaWV3ZXIgJiYgJGV2ZW50LmN0cmxLZXkgJiYgJGV2ZW50LmtleSA9PT0gJzAnKSB7XG4gICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuc2NhbGUoMCk7XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIHNlcnZpY2U6IFNlY3Rpb25TZXJ2aWNlLCBwcml2YXRlIHdvcmREZXNpZ25lclNlcnZpY2U6IFdvcmREZXNpZ25lclNlcnZpY2UsXG4gICAgICAgICAgICAgIHByb3RlY3RlZCB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLCBwcml2YXRlIG1vZGFsU2VydmljZTogTW9kYWxTZXJ2aWNlKSB7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnNlcnZpY2UudGVuYW50ID0gdGhpcy50ZW5hbnQ7XG4gICAgdGhpcy5zZXJ2aWNlLnRlbXBsYXRlQ2xhc3NOYW1lID0gdGhpcy5jbGFzc05hbWU7XG4gICAgdGhpcy5zZXJ2aWNlLnRlbXBsYXRlT2lkID0gdGhpcy5vaWQ7XG4gICAgdGhpcy5zZXJ2aWNlLmluc3RhbmNlQ2xhc3NOYW1lID0gdGhpcy5pbnN0YW5jZUNsYXNzTmFtZTtcbiAgICB0aGlzLnNlcnZpY2UucGFyYW1zID0gdGhpcy5wYXJhbXM7XG4gICAgdGhpcy5zZXJ2aWNlLnRhYlZpZXdDb250YWluZXJSZWYgPSB0aGlzLnRhYlZpZXdDb250YWluZXJSZWY7XG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLndvcmREZXNpZ25lclNlcnZpY2UubG9hZFRlbXBsYXRlKHRoaXMudGVuYW50LCB0aGlzLmNsYXNzTmFtZSwgdGhpcy5vaWQpLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XG4gICAgICB0aGlzLmxvYWRUZW1wbGF0ZUFuZENvbmZpZyhyZXNwb25zZSk7XG4gICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICB9KTtcbiAgfVxuXG4gIGxvYWRUZW1wbGF0ZUFuZENvbmZpZyhyZXNwb25zZTogYW55KSB7XG4gICAgdGhpcy5zZWN0aW9ucyA9IHJlc3BvbnNlLnNlY3Rpb25zIHx8IFtdO1xuICAgIGlmICh0aGlzLnNlY3Rpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5uZWVkVXBsb2FkID0gdHJ1ZTtcbiAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm5lZWRVcGxvYWQgPSBmYWxzZTtcbiAgICB0aGlzLnNlcnZpY2UubWFya3MgPSByZXNwb25zZS5tYXJrcy5tYXAoKG1hcms6IGFueSkgPT4ge1xuICAgICAgbWFyay5jb25maWcgPSBtYXJrLmNvbmZpZyB8fCB7fTtcbiAgICAgIHJldHVybiBtYXJrO1xuICAgIH0pO1xuICAgIGlmICh0aGlzLnNlcnZpY2UubWFya3MubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zZXJ2aWNlLmFjdGl2ZU1hcmsgPSB0aGlzLnNlcnZpY2UubWFya3NbMF07XG4gICAgfVxuICB9XG5cbiAgc2NhbGVCeU1vdXNlKCRldmVudDogYW55KSB7XG4gICAgaWYgKCRldmVudC5jdHJsS2V5KSB7XG4gICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuc2NhbGUoJGV2ZW50LmRlbHRhWSA8IDAgPyAwLjEgOiAtMC4xKTtcbiAgICB9XG4gIH1cblxuICBzY2FsZSh0eXBlOiBudW1iZXIpIHtcbiAgICBpZiAodHlwZSA9PT0gMCkge1xuICAgICAgdGhpcy5zZXJ2aWNlLnNjYWxlID0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXJ2aWNlLnNjYWxlICs9IHR5cGU7XG4gICAgfVxuICB9XG5cbiAgdXBsb2FkKCkge1xuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgdGhpcy53b3JkRGVzaWduZXJTZXJ2aWNlLnVwbG9hZFRlbXBsYXRlRmlsZSh0aGlzLnRlbmFudCwgdGhpcy5jbGFzc05hbWUsIHRoaXMub2lkLCB0aGlzLnJldGFpbk1hcmtDb25maWcsIHRoaXMudXBsb2FkSW5wdXQubmF0aXZlRWxlbWVudC5maWxlc1swXSkuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgIHRoaXMudXBsb2FkSW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnO1xuICAgICAgdGhpcy5sb2FkVGVtcGxhdGVBbmRDb25maWcocmVzcG9uc2UpO1xuICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgfSk7XG4gIH1cblxuICBvcGVuUmVwbGFjZVRlbXBsYXRlRmlsZU1vZGFsKCkge1xuICAgIHRoaXMucmVwbGFjZUZpbGVNb2RhbCA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4odGhpcy50YWJWaWV3Q29udGFpbmVyUmVmLCAn5pu/5o2i5paH5Lu2JywgJ2RlZmF1bHQnLCB0aGlzLnJlcGxhY2VGaWxlTW9kYWxUZW1wbGF0ZSwge30pO1xuICB9XG5cbiAgcmVwbGFjZVRlbXBsYXRlRmlsZShyZXRhaW5NYXJrQ29uZmlnOiBib29sZWFuKSB7XG4gICAgdGhpcy5yZXRhaW5NYXJrQ29uZmlnID0gcmV0YWluTWFya0NvbmZpZztcbiAgICB0aGlzLnVwbG9hZElucHV0Lm5hdGl2ZUVsZW1lbnQuY2xpY2soKTtcbiAgICB0aGlzLnJlcGxhY2VGaWxlTW9kYWw/LmhpZGUoKTtcbiAgfVxuXG4gIGRvd25sb2FkVGVtcGxhdGVGaWxlKCkge1xuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgdGhpcy53b3JkRGVzaWduZXJTZXJ2aWNlLmRvd25sb2FkVGVtcGxhdGVGaWxlKHRoaXMudGVuYW50LCB0aGlzLmNsYXNzTmFtZSwgdGhpcy5vaWQsICgpID0+IHtcbiAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgIH0pO1xuICB9XG5cbiAgcHJldmlldygpIHtcbiAgICBmb3IgKGxldCBtYXJrIG9mIHRoaXMuc2VydmljZS5tYXJrcykge1xuICAgICAgbWFyay52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdGhpcy5wcmV2aWV3TW9kYWwgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKHRoaXMudGFiVmlld0NvbnRhaW5lclJlZiwgJ+mihOiniCcsICdmdWxsJyxcbiAgICAgIHRoaXMucHJldmlld1RlbXBsYXRlLCB7fSwgdGhpcy5wcmV2aWV3Rm9vdGVyVGVtcGxhdGUpO1xuICB9XG5cbiAgc2F2ZUNvbmZpZygpIHtcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgIHRoaXMuc2VydmljZS5tYXJrcy5tYXAobWFyayA9PiB7XG4gICAgICBkZWxldGUgbWFyay52YWx1ZTtcbiAgICB9KTtcbiAgICB0aGlzLndvcmREZXNpZ25lclNlcnZpY2Uuc2F2ZSh0aGlzLnRlbmFudCwgdGhpcy5jbGFzc05hbWUsIHRoaXMub2lkLCB7XG4gICAgICB0ZW1wbGF0ZUNvbmZpZzogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBzZWN0aW9uczogdGhpcy5zZWN0aW9ucyxcbiAgICAgICAgbWFya3M6IHRoaXMuc2VydmljZS5tYXJrc1xuICAgICAgfSlcbiAgICB9KS5zdWJzY3JpYmUocmVzcG9uc2UgPT4ge1xuICAgICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MpIHtcbiAgICAgICAgbm90aWZ5U3VjY2Vzcygn5L+d5a2Y5oiQ5YqfJyk7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgY29weU1hcmtDb25maWcoKSB7XG4gICAgdGhpcy5zZXJ2aWNlLmNvcGllZE1hcmsgPSBkZWVwQ2xvbmUodGhpcy5zZXJ2aWNlLmFjdGl2ZU1hcmspO1xuICAgIHRoaXMucGFzdGVNb2RlID0gdHJ1ZTtcbiAgfVxuXG4gIGV4aXRQYXN0ZU1vZGUoKSB7XG4gICAgdGhpcy5zZXJ2aWNlLmNvcGllZE1hcmsgPSB7fTtcbiAgICB0aGlzLnNlcnZpY2UucmVhZHlQYXN0ZU1hcmtOYW1lcyA9IFtdO1xuICAgIHRoaXMuc2VydmljZS5sYXN0Q2xpY2tUb1Bhc3RlTWFya05hbWUgPSAnJztcbiAgICB0aGlzLnBhc3RlTW9kZSA9IGZhbHNlO1xuICB9XG5cbiAgcGFzdGVNYXJrQ29uZmlnKCkge1xuICAgIGxldCByZWFkeVBhc3RlTWFyaztcbiAgICBmb3IgKGxldCByZWFkeVBhc3RlTWFya05hbWUgb2YgdGhpcy5zZXJ2aWNlLnJlYWR5UGFzdGVNYXJrTmFtZXMpIHtcbiAgICAgIHJlYWR5UGFzdGVNYXJrID0gdGhpcy5zZXJ2aWNlLmdldE1hcmsocmVhZHlQYXN0ZU1hcmtOYW1lKTtcbiAgICAgIGNvbnN0IGRpc3BsYXkgPSByZWFkeVBhc3RlTWFyay5kaXNwbGF5O1xuICAgICAgT2JqZWN0LmFzc2lnbihyZWFkeVBhc3RlTWFyaywgZGVlcENsb25lKHRoaXMuc2VydmljZS5jb3BpZWRNYXJrKSk7XG4gICAgICByZWFkeVBhc3RlTWFyay5uYW1lID0gcmVhZHlQYXN0ZU1hcmtOYW1lO1xuICAgICAgcmVhZHlQYXN0ZU1hcmsuZGlzcGxheSA9IGRpc3BsYXk7XG4gICAgfVxuICAgIHRoaXMuc2VydmljZS5hY3RpdmVNYXJrID0gcmVhZHlQYXN0ZU1hcmsgfHwgdGhpcy5zZXJ2aWNlLmFjdGl2ZU1hcms7XG4gICAgdGhpcy5leGl0UGFzdGVNb2RlKCk7XG4gIH1cbn1cblxuIiwiPGR4LWxvYWQtcGFuZWwgW2NvbnRhaW5lcl09XCJ2aWV3Q29udGFpbmVyUmVmLmVsZW1lbnQubmF0aXZlRWxlbWVudFwiIFtzaG93UGFuZV09XCJmYWxzZVwiIFt2aXNpYmxlXT1cImxvYWRpbmdcIj5cbiAgPGR4by1wb3NpdGlvbiBbb2ZdPVwidmlld0NvbnRhaW5lclJlZi5lbGVtZW50Lm5hdGl2ZUVsZW1lbnRcIj48L2R4by1wb3NpdGlvbj5cbjwvZHgtbG9hZC1wYW5lbD5cbjxpbnB1dCAjdXBsb2FkSW5wdXQgdHlwZT1cImZpbGVcIiBuYW1lPVwiZmlsZVwiXG4gICAgICAgYWNjZXB0PVwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LndvcmRwcm9jZXNzaW5nbWwuZG9jdW1lbnRcIiAoY2hhbmdlKT1cInVwbG9hZCgpXCJcbiAgICAgICBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIvPlxuPGRpdiBjbGFzcz1cImNvYXN0LWNhcmRcIj5cbiAgPGRpdiBjbGFzcz1cImNvYXN0LWNhcmQtY29udGVudFwiPlxuICAgIDxkaXYgY2xhc3M9XCJjb250ZW50LW1haW5cIiBbY2xhc3Muc2hvdy11cGxvYWQtYnRuXT1cIm5lZWRVcGxvYWRcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJuZWVkVXBsb2FkXCI+XG4gICAgICAgIDxkeC1idXR0b24gdHlwZT1cInN1Y2Nlc3NcIiB0ZXh0PVwi5LiK5Lyg5paH5Lu2XCIgKG9uQ2xpY2spPVwidXBsb2FkSW5wdXQuY2xpY2soKVwiPjwvZHgtYnV0dG9uPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8ZGl2ICpuZ0lmPVwiIW5lZWRVcGxvYWRcIiBjbGFzcz1cImxlZnQtcGFuZWxcIj5cbiAgICAgICAgPGRpdiAqbmdJZj1cInBhc3RlTW9kZVwiIGNsYXNzPVwicGFzdGUtbW9kZS1iYXJcIj5cbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgY2xhc3M9XCJtZXNzYWdlXCI+5bey6L+b5YWl5om56YeP57KY6LS06YWN572u5qih5byP77yM5pSv5oyBQ3RybOOAgVNoaWZ06ZSu5b+r5o236YCJ5oup77yM5oyJQ3RybCtW57uE5ZCI6ZSu57KY6LS06YWN572u77yM5oyJRXNj6ZSu5Y+W5raI5pON5L2c5bm26YCA5Ye66K+l5qih5byPPC9zcGFuPlxuICAgICAgICAgIDxkeC1idXR0b24gW3dpZHRoXT1cIjQ4XCIgdGV4dD1cIumAgOWHulwiIChvbkNsaWNrKT1cImV4aXRQYXN0ZU1vZGUoKVwiPjwvZHgtYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnRcIlxuICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cIm1vdXNlSW5WaWV3ZXIgPSB0cnVlO1wiXG4gICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwibW91c2VJblZpZXdlciA9IGZhbHNlO1wiXG4gICAgICAgICAgICAgKG1vdXNld2hlZWwpPVwic2NhbGVCeU1vdXNlKCRldmVudClcIj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIW5lZWRVcGxvYWRcIiBjbGFzcz1cInZpZXdlclwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc2VjdGlvbiBvZiBzZWN0aW9uc1wiPlxuICAgICAgICAgICAgICA8cnMtc2VjdGlvbiBbc2VjdGlvbl09XCJzZWN0aW9uXCIgW2VkaXRNb2RlXT1cInRydWVcIiBbcGFzdGVNb2RlXT1cInBhc3RlTW9kZVwiPjwvcnMtc2VjdGlvbj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cIiFuZWVkVXBsb2FkXCIgY2xhc3M9XCJyaWdodC1wYW5lbFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyXCI+XG4gICAgICAgICAgPGR4LWJ1dHRvbiB0eXBlPVwiZGVmYXVsdFwiIHRleHQ9XCLmm7/mjaLmlofku7ZcIiAob25DbGljayk9XCJvcGVuUmVwbGFjZVRlbXBsYXRlRmlsZU1vZGFsKClcIlxuICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImxvYWRpbmdcIj48L2R4LWJ1dHRvbj5cbiAgICAgICAgICA8ZHgtYnV0dG9uIGljb249XCJjb2FzdC1pY29uIGNvYXN0LWljb24tZG93bmxvYWRcIiBoaW50PVwi5LiL6L295paH5Lu2XCJcbiAgICAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cImRvd25sb2FkVGVtcGxhdGVGaWxlKClcIiBbZGlzYWJsZWRdPVwibG9hZGluZ1wiPjwvZHgtYnV0dG9uPlxuICAgICAgICAgIDxkeC1idXR0b24gaWNvbj1cImNvYXN0LWljb24gY29hc3QtaWNvbi1kaXJlY3Rpb24tdXBcIiBoaW50PVwi5LiK5LiA5LiqKEFsdCArIOKGkSlcIlxuICAgICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwic2VydmljZS5zd2l0Y2hNYXJrKC0xKVwiIFtkaXNhYmxlZF09XCJsb2FkaW5nXCI+PC9keC1idXR0b24+XG4gICAgICAgICAgPGR4LWJ1dHRvbiBpY29uPVwiY29hc3QtaWNvbiBjb2FzdC1pY29uLWRpcmVjdGlvbi1kb3duXCIgaGludD1cIuS4i+S4gOS4qihBbHQgKyDihpMpXCJcbiAgICAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cInNlcnZpY2Uuc3dpdGNoTWFyaygxKVwiIFtkaXNhYmxlZF09XCJsb2FkaW5nXCI+PC9keC1idXR0b24+XG4gICAgICAgICAgPGR4LWJ1dHRvbiBbdHlwZV09XCJwYXN0ZU1vZGUgPyAnc3VjY2VzcycgOiAnZGVmYXVsdCdcIiB0ZXh0PVwi5aSN5Yi2XCIgaGludD1cIuWkjeWItihDdHJsICsgYylcIlxuICAgICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwiY29weU1hcmtDb25maWcoKVwiPjwvZHgtYnV0dG9uPlxuICAgICAgICAgIDxkeC1idXR0b24gdHlwZT1cImRhbmdlclwiIHRleHQ9XCLnspjotLRcIiBoaW50PVwi57KY6LS0KEN0cmwgKyB2KVwiIChvbkNsaWNrKT1cInBhc3RlTWFya0NvbmZpZygpXCJcbiAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJsb2FkaW5nIHx8ICFwYXN0ZU1vZGVcIj48L2R4LWJ1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb25maWdcIiAqbmdJZj1cInNlcnZpY2UuYWN0aXZlTWFya1wiPlxuICAgICAgICAgIDxycy1tYXJrLWNvbmZpZyBbdGVuYW50XT1cInRlbmFudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt0ZW1wbGF0ZUNsYXNzTmFtZV09XCJjbGFzc05hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbdGVtcGxhdGVPaWRdPVwib2lkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2luc3RhbmNlQ2xhc3NOYW1lXT1cImluc3RhbmNlQ2xhc3NOYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZpbHRlckNhdGVnb3JpZXNdPVwiZmlsdGVyQ2F0ZWdvcmllc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFttYXJrXT1cInNlcnZpY2UuYWN0aXZlTWFya1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFttYXJrc109XCJzZXJ2aWNlLm1hcmtzXCI+PC9ycy1tYXJrLWNvbmZpZz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXYgKm5nSWY9XCIhbmVlZFVwbG9hZFwiIGNsYXNzPVwiZm9vdGVyXCI+XG4gICAgPGRpdiBjbGFzcz1cImxlZnRcIj5cbiAgICAgIDxkeC1idXR0b24gdGV4dD1cIuaUvuWkp1wiIChvbkNsaWNrKT1cInNjYWxlKDAuMSlcIj48L2R4LWJ1dHRvbj5cbiAgICAgIDxkeC1idXR0b24gdGV4dD1cIui/mOWOn1wiIChvbkNsaWNrKT1cInNjYWxlKDApXCI+PC9keC1idXR0b24+XG4gICAgICA8ZHgtYnV0dG9uIHRleHQ9XCLnvKnlsI9cIiAob25DbGljayk9XCJzY2FsZSgtMC4xKVwiPjwvZHgtYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJyaWdodFwiPlxuICAgICAgPGR4LWJ1dHRvbiB0eXBlPVwiZGVmYXVsdFwiIHRleHQ9XCLpooTop4hcIiAob25DbGljayk9XCJwcmV2aWV3KClcIiBbZGlzYWJsZWRdPVwibmVlZFVwbG9hZCB8fCBsb2FkaW5nXCI+PC9keC1idXR0b24+XG4gICAgICA8ZHgtYnV0dG9uIHR5cGU9XCJzdWNjZXNzXCIgdGV4dD1cIuS/neWtmFwiIChvbkNsaWNrKT1cInNhdmVDb25maWcoKVwiIFtkaXNhYmxlZF09XCJuZWVkVXBsb2FkIHx8IGxvYWRpbmdcIj48L2R4LWJ1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbjxuZy10ZW1wbGF0ZSAjcmVwbGFjZUZpbGVNb2RhbFRlbXBsYXRlPlxuICA8ZGl2IGNsYXNzPVwiY29uZmlybS1tZXNzYWdlXCI+XG4gICAgPHNwYW4+5pu/5o2i5paH5Lu25Y+v5Lul5oyJ54Wn5Lmm562+5qCH6K+G57un5om/5bey5L+d5a2Y55qE5Lmm562+6YWN572u77yM6K+36YCJ5oup5pON5L2c77yaPC9zcGFuPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImZvcm0tYnV0dG9uc1wiPlxuICAgIDxkaXYgY2xhc3M9XCJidXR0b25zLXdyYXBwZXJcIj5cbiAgICAgIDxkeC1idXR0b24gdHlwZT1cImRlZmF1bHRcIiB0ZXh0PVwi57un5om/6YWN572uXCIgKG9uQ2xpY2spPVwicmVwbGFjZVRlbXBsYXRlRmlsZSh0cnVlKVwiPjwvZHgtYnV0dG9uPlxuICAgICAgPGR4LWJ1dHRvbiB0eXBlPVwiZGFuZ2VyXCIgdGV4dD1cIua4hemZpOmFjee9rlwiIChvbkNsaWNrKT1cInJlcGxhY2VUZW1wbGF0ZUZpbGUoZmFsc2UpXCI+PC9keC1idXR0b24+XG4gICAgICA8ZHgtYnV0dG9uIHR5cGU9XCJub3JtYWxcIiB0ZXh0PVwi5Y+W5raIXCIgKG9uQ2xpY2spPVwicmVwbGFjZUZpbGVNb2RhbD8uaGlkZSgpXCI+PC9keC1idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjcHJldmlld1RlbXBsYXRlPlxuICA8ZGl2IGNsYXNzPVwicHJldmlldy12aWV3ZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwidmlld2VyLWNvbnRhaW5lclwiPlxuICAgICAgPGRpdiBjbGFzcz1cInZpZXdlclwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzZWN0aW9uIG9mIHNlY3Rpb25zXCI+XG4gICAgICAgICAgPHJzLXNlY3Rpb24gW3NlY3Rpb25dPVwic2VjdGlvblwiPjwvcnMtc2VjdGlvbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuPG5nLXRlbXBsYXRlICNwcmV2aWV3Rm9vdGVyVGVtcGxhdGU+XG4gIDxkaXYgY2xhc3M9XCJmb3JtLWJ1dHRvbnNcIj5cbiAgICA8ZGl2IGNsYXNzPVwiYnV0dG9ucy13cmFwcGVyXCI+XG4gICAgICA8ZHgtYnV0dG9uIHR5cGU9XCJub3JtYWxcIiB0ZXh0PVwi5YWz6ZetXCIgKG9uQ2xpY2spPVwicHJldmlld01vZGFsPy5oaWRlKClcIj48L2R4LWJ1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
@@ -0,0 +1,35 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { WordDesignerComponent } from './word-designer.component';
4
+ import { MarkConfigComponent } from "./mark-config/mark-config.component";
5
+ import { DevExtremeModule } from "devextreme-angular";
6
+ import { SectionModule } from "../section/section.module";
7
+ import * as i0 from "@angular/core";
8
+ export class WordDesignerModule {
9
+ }
10
+ WordDesignerModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: WordDesignerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
11
+ WordDesignerModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: WordDesignerModule, declarations: [WordDesignerComponent,
12
+ MarkConfigComponent], imports: [CommonModule,
13
+ DevExtremeModule,
14
+ SectionModule], exports: [WordDesignerComponent] });
15
+ WordDesignerModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: WordDesignerModule, imports: [CommonModule,
16
+ DevExtremeModule,
17
+ SectionModule] });
18
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: WordDesignerModule, decorators: [{
19
+ type: NgModule,
20
+ args: [{
21
+ declarations: [
22
+ WordDesignerComponent,
23
+ MarkConfigComponent
24
+ ],
25
+ imports: [
26
+ CommonModule,
27
+ DevExtremeModule,
28
+ SectionModule
29
+ ],
30
+ exports: [
31
+ WordDesignerComponent
32
+ ]
33
+ }]
34
+ }] });
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29yZC1kZXNpZ25lci5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtcnMtYW50L3NyYy93b3JkL3dvcmQtZGVzaWduZXIvd29yZC1kZXNpZ25lci5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN2QyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDN0MsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFDaEUsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0scUNBQXFDLENBQUM7QUFDeEUsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDcEQsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLDJCQUEyQixDQUFDOztBQWdCeEQsTUFBTSxPQUFPLGtCQUFrQjs7Z0hBQWxCLGtCQUFrQjtpSEFBbEIsa0JBQWtCLGlCQVozQixxQkFBcUI7UUFDckIsbUJBQW1CLGFBR25CLFlBQVk7UUFDWixnQkFBZ0I7UUFDaEIsYUFBYSxhQUdiLHFCQUFxQjtpSEFHWixrQkFBa0IsWUFSM0IsWUFBWTtRQUNaLGdCQUFnQjtRQUNoQixhQUFhOzRGQU1KLGtCQUFrQjtrQkFkOUIsUUFBUTttQkFBQztvQkFDUixZQUFZLEVBQUU7d0JBQ1oscUJBQXFCO3dCQUNyQixtQkFBbUI7cUJBQ3BCO29CQUNELE9BQU8sRUFBRTt3QkFDUCxZQUFZO3dCQUNaLGdCQUFnQjt3QkFDaEIsYUFBYTtxQkFDZDtvQkFDRCxPQUFPLEVBQUU7d0JBQ1AscUJBQXFCO3FCQUN0QjtpQkFDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TmdNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtDb21tb25Nb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1dvcmREZXNpZ25lckNvbXBvbmVudH0gZnJvbSAnLi93b3JkLWRlc2lnbmVyLmNvbXBvbmVudCc7XG5pbXBvcnQge01hcmtDb25maWdDb21wb25lbnR9IGZyb20gXCIuL21hcmstY29uZmlnL21hcmstY29uZmlnLmNvbXBvbmVudFwiO1xuaW1wb3J0IHtEZXZFeHRyZW1lTW9kdWxlfSBmcm9tIFwiZGV2ZXh0cmVtZS1hbmd1bGFyXCI7XG5pbXBvcnQge1NlY3Rpb25Nb2R1bGV9IGZyb20gXCIuLi9zZWN0aW9uL3NlY3Rpb24ubW9kdWxlXCI7XG5cbkBOZ01vZHVsZSh7XG4gIGRlY2xhcmF0aW9uczogW1xuICAgIFdvcmREZXNpZ25lckNvbXBvbmVudCxcbiAgICBNYXJrQ29uZmlnQ29tcG9uZW50XG4gIF0sXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgRGV2RXh0cmVtZU1vZHVsZSxcbiAgICBTZWN0aW9uTW9kdWxlXG4gIF0sXG4gIGV4cG9ydHM6IFtcbiAgICBXb3JkRGVzaWduZXJDb21wb25lbnRcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBXb3JkRGVzaWduZXJNb2R1bGUge1xufVxuIl19
@@ -0,0 +1,69 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { map } from "rxjs";
3
+ import { downloadFile, filenameFromDisposition } from "../../util/utils";
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/common/http";
6
+ export class WordDesignerService {
7
+ constructor(http) {
8
+ this.http = http;
9
+ }
10
+ loadTemplate(tenant, className, oid) {
11
+ return this.http.get('api/data/' + className + '/' + oid, {
12
+ params: {
13
+ tenant
14
+ }
15
+ }).pipe(map(response => {
16
+ if (response.data?.templateConfig) {
17
+ return JSON.parse(response.data.templateConfig);
18
+ }
19
+ return {};
20
+ }));
21
+ }
22
+ uploadTemplateFile(tenant, className, oid, retainMarkConfig, file) {
23
+ const formData = new FormData();
24
+ formData.append('file', file);
25
+ return this.http.post('api/data/custom/upload', formData, {
26
+ params: {
27
+ executor: 'com.cs.system.word.designer.UploadTemplateFile',
28
+ tenant,
29
+ className,
30
+ oid,
31
+ retainMarkConfig,
32
+ filename: file.name
33
+ }
34
+ }).pipe(map(response => {
35
+ return response.data || {};
36
+ }));
37
+ }
38
+ downloadTemplateFile(tenant, className, oid, callback) {
39
+ return this.http.get('api/data/custom/download', {
40
+ params: {
41
+ executor: 'com.cs.system.word.designer.DownloadTemplate',
42
+ tenant,
43
+ className,
44
+ oid
45
+ },
46
+ observe: 'response',
47
+ responseType: 'blob'
48
+ }).subscribe(response => {
49
+ const disposition = response.headers.get('Content-Disposition');
50
+ const filename = disposition && filenameFromDisposition(disposition);
51
+ if (response.body) {
52
+ downloadFile(response.body, filename || '未命名文件', callback);
53
+ }
54
+ });
55
+ }
56
+ save(tenant, className, oid, model) {
57
+ return this.http.post('api/data/' + className + '/' + oid, model, {
58
+ params: {
59
+ tenant
60
+ }
61
+ });
62
+ }
63
+ }
64
+ WordDesignerService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: WordDesignerService, deps: [{ token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
65
+ WordDesignerService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: WordDesignerService });
66
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: WordDesignerService, decorators: [{
67
+ type: Injectable
68
+ }], ctorParameters: function () { return [{ type: i1.HttpClient }]; } });
69
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29yZC1kZXNpZ25lci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXJzLWFudC9zcmMvd29yZC93b3JkLWRlc2lnbmVyL3dvcmQtZGVzaWduZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRXpDLE9BQU8sRUFBQyxHQUFHLEVBQWEsTUFBTSxNQUFNLENBQUM7QUFDckMsT0FBTyxFQUFDLFlBQVksRUFBRSx1QkFBdUIsRUFBQyxNQUFNLGtCQUFrQixDQUFDOzs7QUFHdkUsTUFBTSxPQUFPLG1CQUFtQjtJQUM5QixZQUFvQixJQUFnQjtRQUFoQixTQUFJLEdBQUosSUFBSSxDQUFZO0lBQ3BDLENBQUM7SUFFRCxZQUFZLENBQUMsTUFBVyxFQUFFLFNBQWMsRUFBRSxHQUFRO1FBQ2hELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQU0sV0FBVyxHQUFHLFNBQVMsR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFO1lBQzdELE1BQU0sRUFBRTtnQkFDTixNQUFNO2FBQ1A7U0FDRixDQUFDLENBQUMsSUFBSSxDQUNMLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNiLElBQUksUUFBUSxDQUFDLElBQUksRUFBRSxjQUFjLEVBQUU7Z0JBQ2pDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2FBQ2pEO1lBQ0QsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVELGtCQUFrQixDQUFDLE1BQVcsRUFBRSxTQUFjLEVBQUUsR0FBUSxFQUFFLGdCQUFxQixFQUFFLElBQVM7UUFDeEYsTUFBTSxRQUFRLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUNoQyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM5QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFNLHdCQUF3QixFQUFFLFFBQVEsRUFBRTtZQUM3RCxNQUFNLEVBQUU7Z0JBQ04sUUFBUSxFQUFFLGdEQUFnRDtnQkFDMUQsTUFBTTtnQkFDTixTQUFTO2dCQUNULEdBQUc7Z0JBQ0gsZ0JBQWdCO2dCQUNoQixRQUFRLEVBQUUsSUFBSSxDQUFDLElBQUk7YUFDcEI7U0FDRixDQUFDLENBQUMsSUFBSSxDQUNMLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNiLE9BQU8sUUFBUSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7UUFDN0IsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxNQUFXLEVBQUUsU0FBYyxFQUFFLEdBQVEsRUFBRSxRQUFjO1FBQ3hFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsMEJBQTBCLEVBQUU7WUFDL0MsTUFBTSxFQUFFO2dCQUNOLFFBQVEsRUFBRSw4Q0FBOEM7Z0JBQ3hELE1BQU07Z0JBQ04sU0FBUztnQkFDVCxHQUFHO2FBQ0o7WUFDRCxPQUFPLEVBQUUsVUFBVTtZQUNuQixZQUFZLEVBQUUsTUFBTTtTQUNyQixDQUFDLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ3RCLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLENBQUM7WUFDaEUsTUFBTSxRQUFRLEdBQUcsV0FBVyxJQUFJLHVCQUF1QixDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3JFLElBQUksUUFBUSxDQUFDLElBQUksRUFBRTtnQkFDakIsWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsUUFBUSxJQUFJLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQzthQUM1RDtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELElBQUksQ0FBQyxNQUFXLEVBQUUsU0FBYyxFQUFFLEdBQVEsRUFBRSxLQUFVO1FBQ3BELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQU0sV0FBVyxHQUFHLFNBQVMsR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLEtBQUssRUFBRTtZQUNyRSxNQUFNLEVBQUU7Z0JBQ04sTUFBTTthQUNQO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7aUhBL0RVLG1CQUFtQjtxSEFBbkIsbUJBQW1COzRGQUFuQixtQkFBbUI7a0JBRC9CLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdGFibGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtIdHRwQ2xpZW50fSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcbmltcG9ydCB7bWFwLCBPYnNlcnZhYmxlfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHtkb3dubG9hZEZpbGUsIGZpbGVuYW1lRnJvbURpc3Bvc2l0aW9ufSBmcm9tIFwiLi4vLi4vdXRpbC91dGlsc1wiO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgV29yZERlc2lnbmVyU2VydmljZSB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cDogSHR0cENsaWVudCkge1xuICB9XG5cbiAgbG9hZFRlbXBsYXRlKHRlbmFudDogYW55LCBjbGFzc05hbWU6IGFueSwgb2lkOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PGFueT4oJ2FwaS9kYXRhLycgKyBjbGFzc05hbWUgKyAnLycgKyBvaWQsIHtcbiAgICAgIHBhcmFtczoge1xuICAgICAgICB0ZW5hbnRcbiAgICAgIH1cbiAgICB9KS5waXBlKFxuICAgICAgbWFwKHJlc3BvbnNlID0+IHtcbiAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGE/LnRlbXBsYXRlQ29uZmlnKSB7XG4gICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UocmVzcG9uc2UuZGF0YS50ZW1wbGF0ZUNvbmZpZyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgdXBsb2FkVGVtcGxhdGVGaWxlKHRlbmFudDogYW55LCBjbGFzc05hbWU6IGFueSwgb2lkOiBhbnksIHJldGFpbk1hcmtDb25maWc6IGFueSwgZmlsZTogYW55KSB7XG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ2ZpbGUnLCBmaWxlKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8YW55PignYXBpL2RhdGEvY3VzdG9tL3VwbG9hZCcsIGZvcm1EYXRhLCB7XG4gICAgICBwYXJhbXM6IHtcbiAgICAgICAgZXhlY3V0b3I6ICdjb20uY3Muc3lzdGVtLndvcmQuZGVzaWduZXIuVXBsb2FkVGVtcGxhdGVGaWxlJyxcbiAgICAgICAgdGVuYW50LFxuICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgIG9pZCxcbiAgICAgICAgcmV0YWluTWFya0NvbmZpZyxcbiAgICAgICAgZmlsZW5hbWU6IGZpbGUubmFtZVxuICAgICAgfVxuICAgIH0pLnBpcGUoXG4gICAgICBtYXAocmVzcG9uc2UgPT4ge1xuICAgICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YSB8fCB7fTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGRvd25sb2FkVGVtcGxhdGVGaWxlKHRlbmFudDogYW55LCBjbGFzc05hbWU6IGFueSwgb2lkOiBhbnksIGNhbGxiYWNrPzogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoJ2FwaS9kYXRhL2N1c3RvbS9kb3dubG9hZCcsIHtcbiAgICAgIHBhcmFtczoge1xuICAgICAgICBleGVjdXRvcjogJ2NvbS5jcy5zeXN0ZW0ud29yZC5kZXNpZ25lci5Eb3dubG9hZFRlbXBsYXRlJyxcbiAgICAgICAgdGVuYW50LFxuICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgIG9pZFxuICAgICAgfSxcbiAgICAgIG9ic2VydmU6ICdyZXNwb25zZScsXG4gICAgICByZXNwb25zZVR5cGU6ICdibG9iJ1xuICAgIH0pLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XG4gICAgICBjb25zdCBkaXNwb3NpdGlvbiA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdDb250ZW50LURpc3Bvc2l0aW9uJyk7XG4gICAgICBjb25zdCBmaWxlbmFtZSA9IGRpc3Bvc2l0aW9uICYmIGZpbGVuYW1lRnJvbURpc3Bvc2l0aW9uKGRpc3Bvc2l0aW9uKTtcbiAgICAgIGlmIChyZXNwb25zZS5ib2R5KSB7XG4gICAgICAgIGRvd25sb2FkRmlsZShyZXNwb25zZS5ib2R5LCBmaWxlbmFtZSB8fCAn5pyq5ZG95ZCN5paH5Lu2JywgY2FsbGJhY2spO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgc2F2ZSh0ZW5hbnQ6IGFueSwgY2xhc3NOYW1lOiBhbnksIG9pZDogYW55LCBtb2RlbDogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PGFueT4oJ2FwaS9kYXRhLycgKyBjbGFzc05hbWUgKyAnLycgKyBvaWQsIG1vZGVsLCB7XG4gICAgICBwYXJhbXM6IHtcbiAgICAgICAgdGVuYW50XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==