22 | Angular wrapper for Jodit WYSIWYG
23 | editor. It supports Angular >= 16. Fore more information about installation,
24 | use, options and events see Github
25 | README.
26 |
27 |
28 |
29 |
30 |
Template driven form
31 |
32 |
33 |
34 |
Reactive form
35 |
38 |
39 |
40 |
41 |
Options
42 |
43 | All
44 | options
45 | from Jodit are supported. Plugins are not supported in this demo because you have to import it in your Typescript
46 | code (more
47 | information).
48 | The options are set via two-way data-binding. Insert
49 | your options as JSON to test it.
50 |
51 |
52 | For example you can insert {"disabled": true }
53 |
54 |
55 |
56 |
--------------------------------------------------------------------------------
/decorate-angular-cli.js:
--------------------------------------------------------------------------------
1 | /**
2 | * This file decorates the Angular CLI with the Nx CLI to enable features such as computation caching
3 | * and faster execution of tasks.
4 | *
5 | * It does this by:
6 | *
7 | * - Patching the Angular CLI to warn you in case you accidentally use the undecorated ng command.
8 | * - Symlinking the ng to nx command, so all commands run through the Nx CLI
9 | * - Updating the package.json postinstall script to give you control over this script
10 | *
11 | * The Nx CLI decorates the Angular CLI, so the Nx CLI is fully compatible with it.
12 | * Every command you run should work the same when using the Nx CLI, except faster.
13 | *
14 | * Because of symlinking you can still type `ng build/test/lint` in the terminal. The ng command, in this case,
15 | * will point to nx, which will perform optimizations before invoking ng. So the Angular CLI is always invoked.
16 | * The Nx CLI simply does some optimizations before invoking the Angular CLI.
17 | *
18 | * To opt out of this patch:
19 | * - Replace occurrences of nx with ng in your package.json
20 | * - Remove the script from your postinstall script in your package.json
21 | * - Delete and reinstall your node_modules
22 | */
23 |
24 | const fs = require('fs');
25 | const os = require('os');
26 | const cp = require('child_process');
27 | const isWindows = os.platform() === 'win32';
28 | let output;
29 | try {
30 | output = require('@nx/workspace').output;
31 | } catch (e) {
32 | console.warn(
33 | 'Angular CLI could not be decorated to enable computation caching. Please ensure @nx/workspace is installed.'
34 | );
35 | process.exit(0);
36 | }
37 |
38 | /**
39 | * Symlink of ng to nx, so you can keep using `ng build/test/lint` and still
40 | * invoke the Nx CLI and get the benefits of computation caching.
41 | */
42 | function symlinkNgCLItoNxCLI() {
43 | try {
44 | const ngPath = './node_modules/.bin/ng';
45 | const nxPath = './node_modules/.bin/nx';
46 | if (isWindows) {
47 | /**
48 | * This is the most reliable way to create symlink-like behavior on Windows.
49 | * Such that it works in all shells and works with npx.
50 | */
51 | ['', '.cmd', '.ps1'].forEach((ext) => {
52 | if (fs.existsSync(nxPath + ext))
53 | fs.writeFileSync(ngPath + ext, fs.readFileSync(nxPath + ext));
54 | });
55 | } else {
56 | // If unix-based, symlink
57 | cp.execSync(`ln -sf ./nx ${ngPath}`);
58 | }
59 | } catch (e) {
60 | output.error({
61 | title:
62 | 'Unable to create a symlink from the Angular CLI to the Nx CLI:' +
63 | e.message,
64 | });
65 | throw e;
66 | }
67 | }
68 |
69 | try {
70 | symlinkNgCLItoNxCLI();
71 | require('nx/src/adapter/decorate-cli').decorateCli();
72 | output.log({
73 | title: 'Angular CLI has been decorated to enable computation caching.',
74 | });
75 | } catch (e) {
76 | output.error({
77 | title: 'Decoration of the Angular CLI did not complete successfully',
78 | });
79 | }
80 |
--------------------------------------------------------------------------------
/docs/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | ngx-jodit-demo
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/apps/demo/project.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "demo",
3 | "$schema": "../../node_modules/nx/schemas/project-schema.json",
4 | "projectType": "application",
5 | "sourceRoot": "apps/demo/src",
6 | "prefix": "jodit",
7 | "tags": [],
8 | "targets": {
9 | "build": {
10 | "executor": "@angular-devkit/build-angular:browser",
11 | "outputs": ["{options.outputPath}"],
12 | "options": {
13 | "outputPath": "dist/apps/demo",
14 | "index": "apps/demo/src/index.html",
15 | "main": "apps/demo/src/main.ts",
16 | "polyfills": "apps/demo/src/polyfills.ts",
17 | "tsConfig": "apps/demo/tsconfig.app.json",
18 | "inlineStyleLanguage": "scss",
19 | "assets": ["apps/demo/src/favicon.ico", "apps/demo/src/assets"],
20 | "styles": [
21 | "node_modules/bootstrap-icons/font/bootstrap-icons.css",
22 | "node_modules/bootstrap/dist/css/bootstrap.min.css",
23 | "node_modules/jodit/es2021/jodit.min.css",
24 | "apps/demo/src/styles.scss"
25 | ],
26 | "scripts": []
27 | },
28 | "configurations": {
29 | "production": {
30 | "budgets": [
31 | {
32 | "type": "initial",
33 | "maximumWarning": "500kb",
34 | "maximumError": "2mb"
35 | },
36 | {
37 | "type": "anyComponentStyle",
38 | "maximumWarning": "2kb",
39 | "maximumError": "4kb"
40 | }
41 | ],
42 | "fileReplacements": [
43 | {
44 | "replace": "apps/demo/src/environments/environment.ts",
45 | "with": "apps/demo/src/environments/environment.prod.ts"
46 | }
47 | ],
48 | "outputHashing": "all"
49 | },
50 | "development": {
51 | "buildOptimizer": false,
52 | "optimization": false,
53 | "vendorChunk": true,
54 | "extractLicenses": false,
55 | "sourceMap": true,
56 | "namedChunks": true
57 | }
58 | },
59 | "defaultConfiguration": "production"
60 | },
61 | "serve": {
62 | "executor": "@angular-devkit/build-angular:dev-server",
63 | "configurations": {
64 | "production": {
65 | "buildTarget": "demo:build:production"
66 | },
67 | "development": {
68 | "buildTarget": "demo:build:development"
69 | }
70 | },
71 | "defaultConfiguration": "development",
72 | "continuous": true
73 | },
74 | "extract-i18n": {
75 | "executor": "@angular-devkit/build-angular:extract-i18n",
76 | "options": {
77 | "buildTarget": "demo:build"
78 | }
79 | },
80 | "lint": {
81 | "executor": "@nx/eslint:lint"
82 | },
83 | "test": {
84 | "executor": "@nx/jest:jest",
85 | "outputs": ["{workspaceRoot}/coverage/apps/demo"],
86 | "options": {
87 | "jestConfig": "apps/demo/jest.config.ts",
88 | "tsConfig": "apps/demo/tsconfig.spec.json"
89 | }
90 | }
91 | }
92 | }
93 |
--------------------------------------------------------------------------------
/apps/demo-pro/src/app/app.component.html:
--------------------------------------------------------------------------------
1 |
2 |
6 | ngx-jodit-pro v3
7 |
11 |
12 |
13 |
14 |
15 |
48 | Angular wrapper for
49 | Jodit Pro WYSIWYG editor. It
50 | supports Angular >= 16. Fore more information about installation, use,
51 | options and events see
52 | Github README.
56 |
57 |
58 |
59 |
60 |
Template driven form
61 |
66 |
67 |
68 |
Reactive form
69 |
75 |
76 |
77 |
78 |
Options
79 |
80 | All
81 | options
84 | from Jodit are supported.
85 | Plugins are not supported in this demo because you have to import it in
87 | your Typescript code (more information).
92 | The options are set via two-way data-binding. Insert your options as JSON to
93 | test it.
94 |
95 |
For example you can insert {{ '{' }} "disabled": true {{ '}' }}
29 |
30 | ## ngx-jodit-pro
31 |
32 | Angular wrapper for Jodit PRO WYSIWYG editor. You need a license key in order to use this wrapper.
33 | Buy here.
34 |
35 | ### Compatibility
36 |
37 |
21 |
22 | ## Jodit Pro, Multi & OEM
23 |
24 | For Jodit Pro, Multi and OEM you have to install the jodit-pro package and another Angular library: [ngx-jodit-pro](https://github.com/julianpoemp/ngx-jodit/blob/main/libs/ngx-jodit-pro/README.md). For more information click [here](https://github.com/julianpoemp/ngx-jodit/tree/v3.x/libs/ngx-jodit-pro).
25 |
26 | ## Demo
27 |
28 | You can find a demo for ngx-jodit 3.x [here](https://github.julianpoemp.com/ngx-jodit/3.x/).
29 |
30 | ## Options
31 |
32 | All [options](https://xdsoft.net/jodit/docs/classes/config.Config.html) from Jodit are supported.
33 |
34 | ## Installation
35 |
36 | 1. Make sure that the latest jodit v4 and ngx-jodit v3 is installed:
37 | ```
38 | npm install jodit@4 --save
39 | ```
40 | 2. ```
41 | npm install ngx-jodit@3 --save
42 | ```
43 | 3. Add jodit stylesheet to your app's styles in angular.json (or project.json for
44 | Nx).
45 | ```
46 | ...
47 | ,
48 | "styles": [
49 | ...
50 | "node_modules/jodit/es2021/jodit.min.css",
51 | ...
52 | ],
53 | ...
54 | ```
55 | 4. Add `NgxJoditComponent` to the `imports` array in your app.module.ts (it's standalone):
56 | ```
57 | @NgModule({
58 | ...
59 | imports: [
60 | ...,
61 | NgxJoditComponent
62 | ],
63 | ...
64 | })
65 | ```
66 | 5. Add `"skipLibCheck": true` to compilerOptions in your `tsconfig.app.json`. This is needed because the
67 | check fails to typing errors of the jodit package. **This is still the issue in v4**. If you know any other solution, let me know :):
68 | ```
69 | ...
70 | "compilerOptions": {
71 | ...,
72 | "skipLibCheck": true
73 | }
74 | ...
75 | ```
76 |
77 | 6. Each toolbar element by Jodit v4 ESM version is considered as plugin. While basic plugins are imported automatically, you have to import other plugins manually. See section "How to import plugins".
78 |
79 | 7. Now you can use the component. See [example here](https://github.com/julianpoemp/ngx-jodit/blob/v3.x/apps/demo/src/app/app.component.ts).
80 |
81 | - Without AngularForms:
82 |
83 | ```angular2html
84 |
85 | ```
86 |
87 | - With AngularForms (make sure to import AngularForms):
88 | - Template driven
89 |
90 | ```angular2html
91 |
92 | ```
93 | - Reactive
94 | ```angular2html
95 |
98 | ```
99 |
100 | If you are facing any issues have a look on [Troubleshooting](https://github.com/julianpoemp/ngx-jodit/blob/main/libs/ngx-jodit/README.md#troubleshooting) first. Create an issue if it's not solved.
101 |
102 | ## How to import plugins
103 |
104 | Jodit v4 automatically imports a [basic set of plugins](https://github.com/xdan/jodit/blob/main/tools/utils/resolve-alias-imports.ts#L59) and the English language. If you want to use more you have to import it separately. For example:
105 |
106 | ```typescript
107 | import {Jodit} from "jodit";
108 | import 'jodit/esm/plugins/add-new-line/add-new-line.js';
109 | import 'jodit/esm/plugins/fullsize/fullsize.js';
110 | import de from 'jodit/esm/langs/de.js'; // <-- make sure "compilerOptions.allowSyntheticDefaultImports" is set to "true" in tsconfig.json
111 |
112 | Jodit.lang.de = de;
113 |
114 | //..
115 | ```
116 |
117 | You can import your plugins wherever you want, e.g. in a global ts file that's imported anyway like index.ts or main.ts files.
118 |
119 | ## Options for ngx-jodit
120 |
121 |
122 |
123 |
124 |
Name
125 |
Type
126 |
Description
127 |
128 |
129 |
130 |
131 |
value
132 |
two-way data-binding
133 |
Updates as soon as HTML value of the editor changed. You can set your value, too.
134 |
135 |
136 |
options
137 |
one-way data-binding
138 |
Sets options for Jodit on the fly.
139 |
140 |
141 |
142 |
143 | ## Events for ngx-jodit
144 |
145 | You can bind events using the Angular way, e.g.:
146 |
147 | ```angular2html
148 |
149 |
150 | ```
151 |
152 |
153 |
154 |
155 |
Name
156 |
Description
157 |
158 |
159 |
160 |
161 |
joditChange
162 |
Triggers as soon as something of the HTML value changes.
163 |
164 |
165 |
joditKeyDown
166 |
Triggers as soon as a key is pressed down.
167 |
168 |
169 |
joditMousedown
170 |
Triggers as soon as the left mouse button is pressed.
171 |
172 |
173 |
joditClick
174 |
Triggers as soon as the user clicks on the editor.
175 |
176 |
177 |
joditFocus
178 |
Triggers as soon as Jodit gets focus.
179 |
180 |
181 |
joditPaste
182 |
Triggers as soon as something is pasted.
183 |
184 |
185 |
joditResize
186 |
Triggers as soon as the editor resizes.
187 |
188 |
189 |
joditBeforeEnter
190 |
Triggers as soon as enter key is pressed.
191 |
192 |
193 |
joditBeforeCommand
194 |
Triggers before a command is executed.
195 |
196 |
197 |
joditAfterExec
198 |
Triggers after a command is executed.
199 |
200 |
201 |
joditAfterPaste
202 |
Triggers after something pasted.
203 |
204 |
205 |
joditChangeSelection
206 |
Triggers as soon as selection is changed.
207 |
208 |
209 |
210 |
211 | ## Troubleshooting
212 |
213 | - **Some of the buttons don't show any icon** Check your options if you used the correct button names. If yes, check the folder `node_modules/jodit/esm/plugins/` for a folder named like the button you want to use. Then import the found plugin to your app as described [here](https://github.com/julianpoemp/ngx-jodit/blob/main/libs/ngx-jodit/README.md#how-to-import-plugins). If that doesn't helpt look in the web console for an error message that indicates a missing plugin.
214 |
--------------------------------------------------------------------------------
/libs/ngx-jodit-pro/src/lib/ngx-jodit-pro.component.ts:
--------------------------------------------------------------------------------
1 | import {
2 | AfterViewInit,
3 | ChangeDetectionStrategy,
4 | ChangeDetectorRef,
5 | Component,
6 | ElementRef,
7 | EventEmitter,
8 | forwardRef,
9 | Input,
10 | OnDestroy,
11 | Output,
12 | ViewChild,
13 | } from '@angular/core';
14 |
15 | import {IViewOptionsPro} from 'jodit-pro/types/types/view';
16 | import {IViewOptions} from 'jodit/types/types';
17 | import {IJodit} from 'jodit/types/types/jodit';
18 | import {ControlValueAccessor, FormsModule, NG_VALUE_ACCESSOR} from '@angular/forms';
19 | import {BehaviorSubject, combineLatest, delay, distinctUntilChanged, filter, Subscription, withLatestFrom} from 'rxjs';
20 |
21 | declare const Jodit: any;
22 | export type JoditProConfig = Partial>;
23 |
24 | @Component({
25 | selector: 'ngx-jodit-pro',
26 | standalone: true,
27 | imports: [FormsModule],
28 | templateUrl: './ngx-jodit-pro.component.html',
29 | providers: [{
30 | provide: NG_VALUE_ACCESSOR,
31 | useExisting: forwardRef(() => NgxJoditProComponent),
32 | multi: true
33 | }],
34 | styleUrls: ['./ngx-jodit-pro.component.scss'],
35 | changeDetection: ChangeDetectionStrategy.OnPush
36 | })
37 | export class NgxJoditProComponent implements ControlValueAccessor, AfterViewInit, OnDestroy {
38 | @ViewChild('joditContainer', {static: false}) joditContainer!: ElementRef;
39 | jodit?: IJodit;
40 |
41 | /**
42 | * options for jodit pro. It's of type partial because Config is imported from jodit packge and doesn't contain jodit-pro options.
43 | * You can add more supported options even Typescript doesn't suggest the options.
44 | */
45 | private _options?: JoditProConfig = {};
46 | @Input() set options(value: JoditProConfig) {
47 | this._options = value;
48 |
49 | if (value) {
50 | this.initJoditContainer().then();
51 | }
52 | }
53 |
54 | // value property (subject)
55 | private valueSubject: BehaviorSubject = new BehaviorSubject('');
56 |
57 | @Input() set value(value: string) {
58 | const sanitizedText = this.prepareText(value);
59 | if (!this.internValueChange) {
60 | this.valueSubject.next(sanitizedText);
61 | } else {
62 | this.internValueChange = false;
63 | }
64 | this.onChange(sanitizedText);
65 | }
66 |
67 | get value(): string {
68 | return this.valueSubject.getValue();
69 | }
70 |
71 | @Output() valueChange = new EventEmitter();
72 |
73 | //events
74 | @Output() joditChange = new EventEmitter();
75 | @Output() joditKeyDown = new EventEmitter();
76 | @Output() joditKeyUp = new EventEmitter();
77 | @Output() joditMousedown = new EventEmitter();
78 | @Output() joditMouseup = new EventEmitter();
79 | @Output() joditClick = new EventEmitter();
80 | @Output() joditFocus = new EventEmitter();
81 | @Output() joditPaste = new EventEmitter();
82 | @Output() joditResize = new EventEmitter();
83 | @Output() joditBeforeEnter = new EventEmitter();
84 | @Output() joditBeforeCommand = new EventEmitter();
85 | @Output() joditAfterExec = new EventEmitter();
86 | @Output() joditAfterPaste = new EventEmitter();
87 | @Output() joditChangeSelection = new EventEmitter();
88 |
89 | // Used for delay value assignment to wait for jodit to be initialized
90 | private joditInitializedSubject: BehaviorSubject = new BehaviorSubject(false);
91 | private valueSubscription?: Subscription;
92 | private internValueChange = false;
93 |
94 | constructor(
95 | private readonly cdr: ChangeDetectorRef,
96 | ) {
97 | this.valueSubscription = combineLatest([
98 | // Handle value changes ...
99 | this.valueSubject.asObservable().pipe(distinctUntilChanged()),
100 | // ...additionally ensuring that the value is reapplied if the editor was not initialized when value was set
101 | this.joditInitializedSubject.pipe(distinctUntilChanged(), filter(initialized => initialized))
102 | ]).pipe(
103 | // Pass through the latest value in case of editor initialization
104 | withLatestFrom(this.valueSubject),
105 | // Prevent ExpressionChangedAfterItHasBeenCheckedError
106 | delay(0)
107 | ).subscribe(([[_, initialized], text]) => {
108 | if (this.jodit && initialized) {
109 | this.jodit.setEditorValue(text);
110 | }
111 | });
112 | }
113 |
114 | isHTML(text: string) {
115 | const elem = document.createElement('div');
116 | elem.innerHTML = text;
117 |
118 | return (
119 | text &&
120 | elem.childNodes.length > 0 &&
121 | elem.childNodes.item(0).nodeType !== 3
122 | );
123 | }
124 |
125 | async ngAfterViewInit() {
126 | await this.initJoditContainer();
127 | }
128 |
129 | ngOnDestroy() {
130 | this.valueSubscription?.unsubscribe();
131 | this.jodit?.events.destruct();
132 | }
133 |
134 | async initJoditContainer() {
135 | if (this.joditContainer?.nativeElement) {
136 | if (this.jodit) {
137 | this.jodit.destruct();
138 | this.joditInitializedSubject.next(false);
139 | }
140 | this.jodit = Jodit.make(this.joditContainer.nativeElement, this._options) as IJodit;
141 | await this.jodit.waitForReady();
142 | this.jodit.setEditorValue(this.valueSubject.getValue());
143 |
144 | this.jodit.events.on('change', (text: string) => {
145 | this.internValueChange = true;
146 | this.changeValue(text);
147 | this.joditChange.emit(text);
148 | this.onChange(text);
149 | });
150 | this.jodit.events.on('keydown', (a: KeyboardEvent) => {
151 | this.joditKeyDown.emit(a);
152 | });
153 | this.jodit.events.on('keyup', (a: KeyboardEvent) => {
154 | this.joditKeyUp.emit(a);
155 | });
156 | this.jodit.events.on('mousedown', (a: MouseEvent) => {
157 | this.joditMousedown.emit(a);
158 | });
159 | this.jodit.events.on('mouseup', (a: MouseEvent) => {
160 | this.joditMouseup.emit(a);
161 | });
162 | this.jodit.events.on('click', (a: PointerEvent) => {
163 | this.joditClick.emit(a);
164 | this.onTouched();
165 | });
166 | this.jodit.events.on('focus', (a: FocusEvent) => {
167 | this.joditFocus.emit(a);
168 | });
169 | this.jodit.events.on('paste', (a: ClipboardEvent) => {
170 | this.joditPaste.emit(a);
171 | });
172 | this.jodit.events.on('resize', () => {
173 | this.joditResize.emit();
174 | });
175 | this.jodit.events.on('beforeEnter', (a: KeyboardEvent) => {
176 | this.joditBeforeEnter.emit(a);
177 | });
178 | this.jodit.events.on('beforeCommand', (a: string) => {
179 | this.joditBeforeCommand.emit(a);
180 | });
181 | this.jodit.events.on('afterExec', () => {
182 | this.joditAfterExec.emit();
183 | });
184 | this.jodit.events.on('afterPaste', (a: ClipboardEvent) => {
185 | this.joditAfterPaste.emit(a);
186 | });
187 | this.jodit.events.on('changeSelection', () => {
188 | this.joditChangeSelection.emit();
189 | });
190 |
191 | this.joditInitializedSubject.next(true);
192 | }
193 | }
194 |
195 | changeValue(value: string) {
196 | this.valueChange.emit(value);
197 | }
198 |
199 | /*
200 | FUNCTIONS RELEVANT FOR ANGULAR FORMS
201 | */
202 |
203 | onChange = (text: string) => {
204 | // implemented by user
205 | };
206 |
207 | onTouched = () => {
208 | // implemented by user
209 | };
210 |
211 | writeValue(text: string): void {
212 | this.valueSubject.next(this.prepareText(text));
213 | }
214 |
215 | registerOnChange(fn: (text: string) => void): void {
216 | this.onChange = fn;
217 | }
218 |
219 | registerOnTouched(fn: () => void): void {
220 | this.onTouched = fn;
221 | }
222 |
223 | setDisabledState?(isDisabled: boolean): void {
224 | this.options = {
225 | ...this._options,
226 | disabled: isDisabled
227 | };
228 | }
229 |
230 | private prepareText(text: string) {
231 | return this.isHTML(text) ? text : `
${text}
`;
232 | }
233 | }
234 |
--------------------------------------------------------------------------------
/libs/ngx-jodit-pro/README.md:
--------------------------------------------------------------------------------
1 | # ngx-jodit-pro v3.x
2 |
3 | Angular wrapper for Jodit PRO WYSIWYG editor. It supports Angular >= 16 and
4 | jodit-pro v2 beta. You need a license key in order to use this wrapper.
5 | Buy here.
6 |
7 | ## License
8 |
9 | This package does not contain the source code of Jodit Pro. You have to install it as described here (scroll down). This
10 | wrapper is licensed under MIT License, Jodit Pro is licensed
11 | seperately ([see license](https://xdsoft.net/jodit/pro/license/)).
12 |
13 | ## Compatibility
14 |
15 |
29 |
30 | ## Demo
31 |
32 | You can find a demo of ngx-jodit-pro 3.x [here](https://github.julianpoemp.com/ngx-jodit-pro/3.x/).
33 |
34 | ## Remarks
35 |
36 | ESM for Jodit-Pro is not currently working. See [issue 34](https://github.com/julianpoemp/ngx-jodit/issues/34). You have to include the es2021 build (see installation).
37 |
38 | ## Installation
39 |
40 | 1. Make sure that jodit-pro@4 AND jodit@4 is installed:
41 | ```
42 | npm install jodit-pro@4 jodit@4 --save
43 | ```
44 | 2. ```
45 | npm install ngx-jodit-pro --save
46 | ```
47 | 3. Add the following paths to your app's styles and scripts in angular.json (or project.json for
48 | Nx):
49 | ```
50 | ...
51 | ,
52 | "styles": [
53 | "node_modules/jodit-pro/es2021/jodit.min.css",
54 | ...
55 | ],
56 | "scripts": [
57 | "node_modules/jodit-pro/es2021/jodit.min.js",
58 | ...
59 | ],
60 | ...
61 | ```
62 |
63 | 4. Add `NgxJoditProComponent` (standalone) to the `imports` array in your app.module.ts:
64 | ```
65 | @NgModule({
66 | ...
67 | imports: [
68 | ...,
69 | NgxJoditProComponent
70 | ],
71 | ...
72 | })
73 | ```
74 | 5. Add `"skipLibCheck": true` to compilerOptions in your `tsconfig.app.json`. This is needed because the
75 | check fails to typing errors of the jodit package. **This is still the issue in v4**. If you know any other solution, let me know :):
76 | ```
77 | ...
78 | "compilerOptions": {
79 | ...,
80 | "skipLibCheck": true
81 | }
82 | ...
83 | ```
84 |
85 | 6. Each toolbar element by Jodit v4 is considered as plugin. While basic plugins are imported automatically, you have to import other plugins manually. See section "How to import plugins".
86 |
87 | 7. Now you can use the component. See [example here](https://github.com/julianpoemp/ngx-jodit/tree/main/apps/demo-pro).
88 |
89 | - Without AngularForms:
90 |
91 | ```angular2html
92 |
93 | ```
94 |
95 | - With AngularForms (make sure to import AngularForms):
96 | - Template driven
97 |
98 | ```angular2html
99 |
100 | ```
101 | - Reactive
102 | ```angular2html
103 |
106 | ```
107 |
108 | If you are facing any issues have a look on [Troubleshooting](https://github.com/julianpoemp/ngx-jodit/blob/main/libs/ngx-jodit/README.md#troubleshooting) first. Create an issue if it's not solved.
109 |
110 | ## How to import plugins
111 |
112 | You can install plugins from Jodit and Jodit Pro. For more information about Jodit Pro plugins see [Jodit Pro Docs](https://xdsoft.net/jodit/pro/docs/).
113 |
114 | 1. Open folder "node_modules/jodit-pro" or "node_modules/jodit" depending on if you want to add jodit oder jodit-pro plugins.
115 | 2. Open the plugin folder in "esm/plugins", e.g. "tune-block" in "jodit-pro".
116 | 3. Look for the main file named like the plugin e.g. "tune-block.js".
117 | 4. Import "jodit" and the path to this file in a Typescript file of your application. E.g. the Angular component that includes ngx-jodit-pro. For example:
118 |
119 | ```typescript
120 | import "node_modules/jodit-pro/esm/plugins/tune-block/tune-block.js";
121 |
122 | declare const Jodit: any; // <- needed because of missing ESM, see issue 34
123 | Jodit.lang.de = de;
124 | ```
125 |
126 | You can import your plugins wherever you want, e.g. in a global ts file that's imported anyway like index.ts or main.ts files.
127 |
128 | Now you can apply the plugin options to ngx-jodit-pro `options` property. For example:
129 |
130 | ```typescript
131 | import {JoditProConfig} from 'ngx-jodit-pro';
132 | import "node_modules/jodit-pro/esm/plugins/tune-block/tune-block.js";
133 |
134 | declare const Jodit: any; // <- needed because of missing ESM, see issue 34
135 |
136 | options: JoditProConfig = {
137 | tuneBlock: {
138 | popup: {
139 | p: Jodit.atom(['align', 'tune.up', 'tune.remove', 'tune.down'])
140 | }
141 | }
142 | }
143 | ```
144 |
145 | ### Add custom plugins
146 |
147 | You can access the initialized Jodit from the attribute "jodit" of the NgxJoditProComponent to use the Pro API:
148 |
149 | Any component.ts:
150 |
151 | ````Typescript
152 | import {ViewChild} from '@angular/core';
153 |
154 | //...
155 | @ViewChild("joditComponent")
156 | joditComponent ? : NgxJoditProComponent;
157 |
158 | // in ngAfterViewInit
159 | if (this.joditComponent) {
160 | // example:
161 | this.joditComponent.jodit.plugins.add("hello", () => {
162 | alert("hello!");
163 | });
164 | }
165 | ````
166 |
167 | Any component.html:
168 |
169 | ```HTML
170 |
171 |
172 | ```
173 |
174 | ### Options
175 |
176 | All [options](https://xdsoft.net/jodit/docs/classes/config.Config.html) from Jodit AND JoditPro are supported. Use type "JoditProConfig" for options.
177 |
178 | ### Options for ngx-jodit
179 |
180 |
181 |
182 |
183 |
Name
184 |
Type
185 |
Description
186 |
187 |
188 |
189 |
190 |
value
191 |
two-way data-binding
192 |
Updates as soon as HTML value of the editor changed. You can set your value, too.
193 |
194 |
195 |
options
196 |
one-way data-binding
197 |
Sets options for Jodit
198 |
199 |
200 |
201 |
202 | ## Events for ngx-jodit
203 |
204 | You can bind events using the Angular way, e.g.:
205 |
206 | ```angular2html
207 |
208 |
209 | ```
210 |
211 |
212 |
213 |
214 |
Name
215 |
Description
216 |
217 |
218 |
219 |
220 |
joditChange
221 |
Triggers as soon as something of the HTML value changes.
222 |
223 |
224 |
joditKeyDown
225 |
Triggers as soon as a key is pressed down.
226 |
227 |
228 |
joditKeyUp
229 |
Triggers as soon as a key is released.
230 |
231 |
232 |
joditMousedown
233 |
Triggers as soon as the left mouse button is pressed.
234 |
235 |
236 |
joditMouseup
237 |
Triggers as soon as the left mouse button is released.
238 |
239 |
240 |
joditClick
241 |
Triggers as soon as the user clicks on the editor.
242 |
243 |
244 |
joditFocus
245 |
Triggers as soon as Jodit gets focus.
246 |
247 |
248 |
joditPaste
249 |
Triggers as soon as something is pasted.
250 |
251 |
252 |
joditResize
253 |
Triggers as soon as the editor resizes.
254 |
255 |
256 |
joditBeforeEnter
257 |
Triggers as soon as enter key is pressed.
258 |
259 |
260 |
joditBeforeCommand
261 |
Triggers before a command is executed.
262 |
263 |
264 |
joditAfterExec
265 |
Triggers after a command is executed.
266 |
267 |
268 |
joditAfterPaste
269 |
Triggers after something pasted.
270 |
271 |
272 |
joditChangeSelection
273 |
Triggers as soon as selection is changed.
274 |
275 |
276 |
277 |
278 | ## Troubleshooting
279 |
280 | - **Some of the buttons don't show any icon** Check your options if you used the correct button names. If yes, check the folder `node_modules/jodit/es2021/plugins/` for a folder named like the button you want to use. Then import the found plugin to your app as described [here](https://github.com/julianpoemp/ngx-jodit/blob/main/libs/ngx-jodit-pro/README.md#how-to-import-plugins). If that doesn't helpt look in the web console for an error message that indicates a missing plugin.
281 |
--------------------------------------------------------------------------------
/migrations.json:
--------------------------------------------------------------------------------
1 | {
2 | "migrations": [
3 | {
4 | "version": "20.0.0-beta.7",
5 | "description": "Migration for v20.0.0-beta.7",
6 | "implementation": "./src/migrations/update-20-0-0/move-use-daemon-process",
7 | "package": "nx",
8 | "name": "move-use-daemon-process"
9 | },
10 | {
11 | "version": "20.0.1",
12 | "description": "Set `useLegacyCache` to true for migrating workspaces",
13 | "implementation": "./src/migrations/update-20-0-1/use-legacy-cache",
14 | "x-repair-skip": true,
15 | "package": "nx",
16 | "name": "use-legacy-cache"
17 | },
18 | {
19 | "version": "21.0.0-beta.8",
20 | "description": "Removes the legacy cache configuration from nx.json",
21 | "implementation": "./src/migrations/update-21-0-0/remove-legacy-cache",
22 | "package": "nx",
23 | "name": "remove-legacy-cache"
24 | },
25 | {
26 | "version": "21.0.0-beta.8",
27 | "description": "Removes the legacy cache configuration from nx.json",
28 | "implementation": "./src/migrations/update-21-0-0/remove-custom-tasks-runner",
29 | "package": "nx",
30 | "name": "remove-custom-tasks-runner"
31 | },
32 | {
33 | "version": "21.0.0-beta.11",
34 | "description": "Updates release version config based on the breaking changes in Nx v21",
35 | "implementation": "./src/migrations/update-21-0-0/release-version-config-changes",
36 | "package": "nx",
37 | "name": "release-version-config-changes"
38 | },
39 | {
40 | "version": "21.0.0-beta.11",
41 | "description": "Updates release changelog config based on the breaking changes in Nx v21",
42 | "implementation": "./src/migrations/update-21-0-0/release-changelog-config-changes",
43 | "package": "nx",
44 | "name": "release-changelog-config-changes"
45 | },
46 | {
47 | "version": "21.1.0-beta.2",
48 | "description": "Adds **/nx-rules.mdc and **/nx.instructions.md to .gitignore if not present",
49 | "implementation": "./src/migrations/update-21-1-0/add-gitignore-entry",
50 | "package": "nx",
51 | "name": "21-1-0-add-ignore-entries-for-nx-rule-files"
52 | },
53 | {
54 | "version": "22.0.0-beta.1",
55 | "description": "Updates release version config based on the breaking changes in Nx v22",
56 | "implementation": "./src/migrations/update-22-0-0/release-version-config-changes",
57 | "package": "nx",
58 | "name": "22-0-0-release-version-config-changes"
59 | },
60 | {
61 | "version": "22.0.0-beta.2",
62 | "description": "Consolidates releaseTag* options into nested releaseTag object structure",
63 | "implementation": "./src/migrations/update-22-0-0/consolidate-release-tag-config",
64 | "package": "nx",
65 | "name": "22-0-0-consolidate-release-tag-config"
66 | },
67 | {
68 | "cli": "nx",
69 | "version": "22.1.0-beta.5",
70 | "description": "Updates the nx wrapper.",
71 | "implementation": "./src/migrations/update-22-1-0/update-nx-wrapper",
72 | "package": "nx",
73 | "name": "22-1-0-update-nx-wrapper"
74 | },
75 | {
76 | "cli": "nx",
77 | "version": "20.0.0-beta.5",
78 | "description": "Replace usage of `getJestProjects` with `getJestProjectsAsync`.",
79 | "implementation": "./src/migrations/update-20-0-0/replace-getJestProjects-with-getJestProjectsAsync",
80 | "package": "@nx/jest",
81 | "name": "replace-getJestProjects-with-getJestProjectsAsync"
82 | },
83 | {
84 | "cli": "nx",
85 | "version": "21.0.0-beta.9",
86 | "description": "Replace usage of `getJestProjects` with `getJestProjectsAsync`.",
87 | "implementation": "./src/migrations/update-21-0-0/replace-getJestProjects-with-getJestProjectsAsync",
88 | "package": "@nx/jest",
89 | "name": "replace-getJestProjects-with-getJestProjectsAsync-v21"
90 | },
91 | {
92 | "version": "21.0.0-beta.10",
93 | "description": "Remove the previously deprecated and unused `tsConfig` option from the `@nx/jest:jest` executor.",
94 | "implementation": "./src/migrations/update-21-0-0/remove-tsconfig-option-from-jest-executor",
95 | "package": "@nx/jest",
96 | "name": "remove-tsconfig-option-from-jest-executor"
97 | },
98 | {
99 | "version": "21.3.0-beta.3",
100 | "description": "Rename the CLI option `testPathPattern` to `testPathPatterns`.",
101 | "implementation": "./src/migrations/update-21-3-0/rename-test-path-pattern",
102 | "package": "@nx/jest",
103 | "name": "rename-test-path-pattern"
104 | },
105 | {
106 | "version": "20.2.0-beta.5",
107 | "description": "Update TypeScript ESLint packages to v8.13.0 if they are already on v8",
108 | "implementation": "./src/migrations/update-20-2-0/update-typescript-eslint-v8-13-0",
109 | "package": "@nx/eslint",
110 | "name": "update-typescript-eslint-v8.13.0"
111 | },
112 | {
113 | "version": "20.3.0-beta.1",
114 | "description": "Update ESLint flat config to include .cjs, .mjs, .cts, and .mts files in overrides (if needed)",
115 | "implementation": "./src/migrations/update-20-3-0/add-file-extensions-to-overrides",
116 | "package": "@nx/eslint",
117 | "name": "add-file-extensions-to-overrides"
118 | },
119 | {
120 | "version": "21.5.0-beta.2",
121 | "description": "Migrate the legacy 'development' custom condition to a workspace-unique custom condition name.",
122 | "factory": "./src/migrations/update-21-5-0/migrate-development-custom-condition",
123 | "package": "@nx/js",
124 | "name": "migrate-development-custom-condition"
125 | },
126 | {
127 | "version": "22.0.0-beta.0",
128 | "description": "Remove the deprecated `external` and `externalBuildTargets` options from the `@nx/js:swc` and `@nx/js:tsc` executors.",
129 | "factory": "./src/migrations/update-22-0-0/remove-external-options-from-js-executors",
130 | "package": "@nx/js",
131 | "name": "remove-external-options-from-js-executors"
132 | },
133 | {
134 | "version": "22.1.0-rc.1",
135 | "description": "Removes redundant TypeScript project references from project's tsconfig.json files when runtime tsconfig files (e.g., tsconfig.lib.json, tsconfig.app.json) exist.",
136 | "factory": "./src/migrations/update-22-1-0/remove-redundant-ts-project-references",
137 | "package": "@nx/js",
138 | "name": "remove-redundant-ts-project-references"
139 | },
140 | {
141 | "version": "21.0.0-beta.10",
142 | "description": "Removes the `tsConfig` and `copyFiles` options from the `@nx/cypress:cypress` executor.",
143 | "implementation": "./src/migrations/update-21-0-0/remove-tsconfig-and-copy-files-options-from-cypress-executor",
144 | "package": "@nx/cypress",
145 | "name": "remove-tsconfig-and-copy-files-options-from-cypress-executor"
146 | },
147 | {
148 | "cli": "nx",
149 | "version": "20.2.0-beta.2",
150 | "description": "Update the ModuleFederationConfig import use @nx/module-federation.",
151 | "factory": "./src/migrations/update-20-2-0/migrate-mf-imports-to-new-package",
152 | "package": "@nx/angular",
153 | "name": "update-20-2-0-update-module-federation-config-import"
154 | },
155 | {
156 | "cli": "nx",
157 | "version": "20.2.0-beta.2",
158 | "description": "Update the withModuleFederation import use @nx/module-federation/angular.",
159 | "factory": "./src/migrations/update-20-2-0/migrate-with-mf-import-to-new-package",
160 | "package": "@nx/angular",
161 | "name": "update-20-2-0-update-with-module-federation-import"
162 | },
163 | {
164 | "cli": "nx",
165 | "version": "20.2.0-beta.5",
166 | "requires": { "@angular/core": ">=19.0.0" },
167 | "description": "Update the @angular/cli package version to ~19.0.0.",
168 | "factory": "./src/migrations/update-20-2-0/update-angular-cli",
169 | "package": "@nx/angular",
170 | "name": "update-angular-cli-version-19-0-0"
171 | },
172 | {
173 | "cli": "nx",
174 | "version": "20.2.0-beta.5",
175 | "requires": { "@angular/core": ">=19.0.0" },
176 | "description": "Add the '@angular/localize/init' polyfill to the 'polyfills' option of targets using esbuild-based executors.",
177 | "factory": "./src/migrations/update-20-2-0/add-localize-polyfill-to-targets",
178 | "package": "@nx/angular",
179 | "name": "add-localize-polyfill-to-targets"
180 | },
181 | {
182 | "cli": "nx",
183 | "version": "20.2.0-beta.5",
184 | "requires": { "@angular/core": ">=19.0.0" },
185 | "description": "Update '@angular/ssr' import paths to use the new '/node' entry point when 'CommonEngine' is detected.",
186 | "factory": "./src/migrations/update-20-2-0/update-angular-ssr-imports-to-use-node-entry-point",
187 | "package": "@nx/angular",
188 | "name": "update-angular-ssr-imports-to-use-node-entry-point"
189 | },
190 | {
191 | "cli": "nx",
192 | "version": "20.2.0-beta.6",
193 | "requires": { "@angular/core": ">=19.0.0" },
194 | "description": "Disable the Angular ESLint prefer-standalone rule if not set.",
195 | "factory": "./src/migrations/update-20-2-0/disable-angular-eslint-prefer-standalone",
196 | "package": "@nx/angular",
197 | "name": "disable-angular-eslint-prefer-standalone"
198 | },
199 | {
200 | "cli": "nx",
201 | "version": "20.2.0-beta.8",
202 | "requires": { "@angular/core": ">=19.0.0" },
203 | "description": "Remove Angular ESLint rules that were removed in v19.0.0.",
204 | "factory": "./src/migrations/update-20-2-0/remove-angular-eslint-rules",
205 | "package": "@nx/angular",
206 | "name": "remove-angular-eslint-rules"
207 | },
208 | {
209 | "cli": "nx",
210 | "version": "20.2.0-beta.8",
211 | "requires": { "@angular/core": ">=19.0.0" },
212 | "description": "Remove the deprecated 'tailwindConfig' option from ng-packagr executors. Tailwind CSS configurations located at the project or workspace root will be picked up automatically.",
213 | "factory": "./src/migrations/update-20-2-0/remove-tailwind-config-from-ng-packagr-executors",
214 | "package": "@nx/angular",
215 | "name": "remove-tailwind-config-from-ng-packagr-executors"
216 | },
217 | {
218 | "cli": "nx",
219 | "version": "20.3.0-beta.2",
220 | "description": "If workspace includes Module Federation projects, ensure the new @nx/module-federation package is installed.",
221 | "factory": "./src/migrations/update-20-3-0/ensure-nx-module-federation-package",
222 | "package": "@nx/angular",
223 | "name": "ensure-nx-module-federation-package"
224 | },
225 | {
226 | "cli": "nx",
227 | "version": "20.4.0-beta.1",
228 | "requires": { "@angular/core": ">=19.1.0" },
229 | "description": "Update the @angular/cli package version to ~19.1.0.",
230 | "factory": "./src/migrations/update-20-4-0/update-angular-cli",
231 | "package": "@nx/angular",
232 | "name": "update-angular-cli-version-19-1-0"
233 | },
234 | {
235 | "cli": "nx",
236 | "version": "20.5.0-beta.5",
237 | "requires": { "@angular/core": ">=19.2.0" },
238 | "description": "Update the @angular/cli package version to ~19.2.0.",
239 | "factory": "./src/migrations/update-20-5-0/update-angular-cli",
240 | "package": "@nx/angular",
241 | "name": "update-angular-cli-version-19-2-0"
242 | },
243 | {
244 | "cli": "nx",
245 | "version": "21.0.0-beta.3",
246 | "description": "Set the `continuous` option to `true` for continuous tasks.",
247 | "factory": "./src/migrations/update-21-0-0/set-continuous-option",
248 | "package": "@nx/angular",
249 | "name": "set-continuous-option"
250 | },
251 | {
252 | "cli": "nx",
253 | "version": "21.2.0-beta.3",
254 | "requires": { "@angular/core": ">=20.0.0" },
255 | "description": "Update the @angular/cli package version to ~20.0.0.",
256 | "factory": "./src/migrations/update-21-2-0/update-angular-cli",
257 | "package": "@nx/angular",
258 | "name": "update-angular-cli-version-20-0-0"
259 | },
260 | {
261 | "version": "21.2.0-beta.3",
262 | "requires": { "@angular/core": ">=20.0.0" },
263 | "description": "Migrate imports of `provideServerRendering` from `@angular/platform-server` to `@angular/ssr`.",
264 | "factory": "./src/migrations/update-21-2-0/migrate-provide-server-rendering-import",
265 | "package": "@nx/angular",
266 | "name": "migrate-provide-server-rendering-import"
267 | },
268 | {
269 | "version": "21.2.0-beta.3",
270 | "requires": { "@angular/core": ">=20.0.0" },
271 | "description": "Replace `provideServerRouting` and `provideServerRoutesConfig` with `provideServerRendering` using `withRoutes`.",
272 | "factory": "./src/migrations/update-21-2-0/replace-provide-server-routing",
273 | "package": "@nx/angular",
274 | "name": "replace-provide-server-routing"
275 | },
276 | {
277 | "version": "21.2.0-beta.3",
278 | "requires": { "@angular/core": ">=20.0.0" },
279 | "description": "Update the generator defaults to maintain the previous style guide behavior.",
280 | "factory": "./src/migrations/update-21-2-0/set-generator-defaults-for-previous-style-guide",
281 | "package": "@nx/angular",
282 | "name": "set-generator-defaults-for-previous-style-guide"
283 | },
284 | {
285 | "version": "21.2.0-beta.3",
286 | "requires": { "@angular/core": ">=20.0.0" },
287 | "description": "Update 'moduleResolution' to 'bundler' in TypeScript configurations. You can read more about this here: https://www.typescriptlang.org/tsconfig/#moduleResolution.",
288 | "factory": "./src/migrations/update-21-2-0/update-module-resolution",
289 | "package": "@nx/angular",
290 | "name": "update-module-resolution"
291 | },
292 | {
293 | "cli": "nx",
294 | "version": "21.3.0-beta.4",
295 | "requires": { "@angular/core": ">=20.1.0" },
296 | "description": "Update the @angular/cli package version to ~20.1.0.",
297 | "factory": "./src/migrations/update-21-3-0/update-angular-cli",
298 | "package": "@nx/angular",
299 | "name": "update-angular-cli-version-20-1-0"
300 | },
301 | {
302 | "version": "21.5.0-beta.0",
303 | "description": "Set the 'tsConfig' option to build and test targets to help with Angular migration issues.",
304 | "factory": "./src/migrations/update-21-5-0/set-tsconfig-option",
305 | "package": "@nx/angular",
306 | "name": "set-tsconfig-option"
307 | },
308 | {
309 | "cli": "nx",
310 | "version": "21.5.0-beta.2",
311 | "requires": { "@angular/core": ">=20.2.0" },
312 | "description": "Update the @angular/cli package version to ~20.2.0.",
313 | "factory": "./src/migrations/update-21-5-0/update-angular-cli",
314 | "package": "@nx/angular",
315 | "name": "update-angular-cli-version-20-2-0"
316 | },
317 | {
318 | "version": "21.5.0-beta.2",
319 | "requires": { "@angular/core": ">=20.2.0" },
320 | "description": "Remove any Karma configuration files that only contain the default content. The default configuration is automatically available without a specific project configurationfile.",
321 | "factory": "./src/migrations/update-21-5-0/remove-default-karma-configuration-files",
322 | "package": "@nx/angular",
323 | "name": "remove-default-karma-configuration-files"
324 | },
325 | {
326 | "cli": "nx",
327 | "version": "21.6.1-beta.2",
328 | "requires": { "@angular/core": ">=20.3.0" },
329 | "description": "Update the @angular/cli package version to ~20.3.0.",
330 | "factory": "./src/migrations/update-21-6-1/update-angular-cli",
331 | "package": "@nx/angular",
332 | "name": "update-angular-cli-version-20-3-0"
333 | },
334 | {
335 | "version": "20.0.0",
336 | "description": "Replaces usages of the deprecated InjectFlags enum",
337 | "factory": "./bundles/inject-flags.cjs#migrate",
338 | "package": "@angular/core",
339 | "name": "inject-flags"
340 | },
341 | {
342 | "version": "20.0.0",
343 | "description": "Replaces usages of the deprecated TestBed.get method with TestBed.inject",
344 | "factory": "./bundles/test-bed-get.cjs#migrate",
345 | "package": "@angular/core",
346 | "name": "test-bed-get"
347 | },
348 | {
349 | "version": "20.0.0",
350 | "description": "Converts the entire application to block control flow syntax",
351 | "factory": "./bundles/control-flow-migration.cjs#migrate",
352 | "optional": true,
353 | "package": "@angular/core",
354 | "name": "control-flow-migration"
355 | },
356 | {
357 | "version": "20.0.0",
358 | "description": "Moves imports of `DOCUMENT` from `@angular/common` to `@angular/core`",
359 | "factory": "./bundles/document-core.cjs#migrate",
360 | "package": "@angular/core",
361 | "name": "document-core"
362 | },
363 | {
364 | "version": "20.2.0",
365 | "description": "Replaces usages of the deprecated Router.getCurrentNavigation method with the Router.currentNavigation signal",
366 | "factory": "./bundles/router-current-navigation.cjs#migrate",
367 | "optional": true,
368 | "package": "@angular/core",
369 | "name": "router-current-navigation"
370 | },
371 | {
372 | "version": "20.3.0",
373 | "description": "Adds `BootstrapContext` to `bootstrapApplication` calls in `main.server.ts` to support server rendering.",
374 | "factory": "./bundles/add-bootstrap-context-to-server-main.cjs#migrate",
375 | "package": "@angular/core",
376 | "name": "add-bootstrap-context-to-server-main"
377 | }
378 | ]
379 | }
380 |
--------------------------------------------------------------------------------
/docs/3rdpartylicenses.txt:
--------------------------------------------------------------------------------
1 | @angular/common
2 | MIT
3 |
4 | @angular/core
5 | MIT
6 |
7 | @angular/forms
8 | MIT
9 |
10 | @angular/platform-browser
11 | MIT
12 |
13 | autobind-decorator
14 | MIT
15 | MIT License
16 |
17 | Copyright (c) Andrey Popp
18 |
19 | Permission is hereby granted, free of charge, to any person obtaining a copy
20 | of this software and associated documentation files (the "Software"), to deal
21 | in the Software without restriction, including without limitation the rights
22 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
23 | copies of the Software, and to permit persons to whom the Software is
24 | furnished to do so, subject to the following conditions:
25 |
26 | The above copyright notice and this permission notice shall be included in all
27 | copies or substantial portions of the Software.
28 |
29 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
30 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
31 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
32 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
33 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
34 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
35 | SOFTWARE.
36 |
37 |
38 | bootstrap
39 | MIT
40 | The MIT License (MIT)
41 |
42 | Copyright (c) 2011-2022 Twitter, Inc.
43 | Copyright (c) 2011-2022 The Bootstrap Authors
44 |
45 | Permission is hereby granted, free of charge, to any person obtaining a copy
46 | of this software and associated documentation files (the "Software"), to deal
47 | in the Software without restriction, including without limitation the rights
48 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
49 | copies of the Software, and to permit persons to whom the Software is
50 | furnished to do so, subject to the following conditions:
51 |
52 | The above copyright notice and this permission notice shall be included in
53 | all copies or substantial portions of the Software.
54 |
55 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
56 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
57 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
58 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
59 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
60 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
61 | THE SOFTWARE.
62 |
63 |
64 | bootstrap-icons
65 | MIT
66 | The MIT License (MIT)
67 |
68 | Copyright (c) 2019-2021 The Bootstrap Authors
69 |
70 | Permission is hereby granted, free of charge, to any person obtaining a copy
71 | of this software and associated documentation files (the "Software"), to deal
72 | in the Software without restriction, including without limitation the rights
73 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
74 | copies of the Software, and to permit persons to whom the Software is
75 | furnished to do so, subject to the following conditions:
76 |
77 | The above copyright notice and this permission notice shall be included in
78 | all copies or substantial portions of the Software.
79 |
80 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
81 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
82 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
83 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
84 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
85 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
86 | THE SOFTWARE.
87 |
88 |
89 | jodit
90 | MIT
91 | Copyright (c) 2013-2023 http://xdsoft.net
92 |
93 | Permission is hereby granted, free of charge, to any person obtaining a copy
94 | of this software and associated documentation files (the "Software"), to deal
95 | in the Software without restriction, including without limitation the rights
96 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
97 | copies of the Software, and to permit persons to whom the Software is
98 | furnished to do so, subject to the following conditions:
99 |
100 | The above copyright notice and this permission notice shall be included in
101 | all copies or substantial portions of the Software.
102 |
103 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
104 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
105 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
106 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
107 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
108 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
109 | THE SOFTWARE.
110 |
111 |
112 | ngx-jodit
113 | MIT
114 |
115 | rxjs
116 | Apache-2.0
117 | Apache License
118 | Version 2.0, January 2004
119 | http://www.apache.org/licenses/
120 |
121 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
122 |
123 | 1. Definitions.
124 |
125 | "License" shall mean the terms and conditions for use, reproduction,
126 | and distribution as defined by Sections 1 through 9 of this document.
127 |
128 | "Licensor" shall mean the copyright owner or entity authorized by
129 | the copyright owner that is granting the License.
130 |
131 | "Legal Entity" shall mean the union of the acting entity and all
132 | other entities that control, are controlled by, or are under common
133 | control with that entity. For the purposes of this definition,
134 | "control" means (i) the power, direct or indirect, to cause the
135 | direction or management of such entity, whether by contract or
136 | otherwise, or (ii) ownership of fifty percent (50%) or more of the
137 | outstanding shares, or (iii) beneficial ownership of such entity.
138 |
139 | "You" (or "Your") shall mean an individual or Legal Entity
140 | exercising permissions granted by this License.
141 |
142 | "Source" form shall mean the preferred form for making modifications,
143 | including but not limited to software source code, documentation
144 | source, and configuration files.
145 |
146 | "Object" form shall mean any form resulting from mechanical
147 | transformation or translation of a Source form, including but
148 | not limited to compiled object code, generated documentation,
149 | and conversions to other media types.
150 |
151 | "Work" shall mean the work of authorship, whether in Source or
152 | Object form, made available under the License, as indicated by a
153 | copyright notice that is included in or attached to the work
154 | (an example is provided in the Appendix below).
155 |
156 | "Derivative Works" shall mean any work, whether in Source or Object
157 | form, that is based on (or derived from) the Work and for which the
158 | editorial revisions, annotations, elaborations, or other modifications
159 | represent, as a whole, an original work of authorship. For the purposes
160 | of this License, Derivative Works shall not include works that remain
161 | separable from, or merely link (or bind by name) to the interfaces of,
162 | the Work and Derivative Works thereof.
163 |
164 | "Contribution" shall mean any work of authorship, including
165 | the original version of the Work and any modifications or additions
166 | to that Work or Derivative Works thereof, that is intentionally
167 | submitted to Licensor for inclusion in the Work by the copyright owner
168 | or by an individual or Legal Entity authorized to submit on behalf of
169 | the copyright owner. For the purposes of this definition, "submitted"
170 | means any form of electronic, verbal, or written communication sent
171 | to the Licensor or its representatives, including but not limited to
172 | communication on electronic mailing lists, source code control systems,
173 | and issue tracking systems that are managed by, or on behalf of, the
174 | Licensor for the purpose of discussing and improving the Work, but
175 | excluding communication that is conspicuously marked or otherwise
176 | designated in writing by the copyright owner as "Not a Contribution."
177 |
178 | "Contributor" shall mean Licensor and any individual or Legal Entity
179 | on behalf of whom a Contribution has been received by Licensor and
180 | subsequently incorporated within the Work.
181 |
182 | 2. Grant of Copyright License. Subject to the terms and conditions of
183 | this License, each Contributor hereby grants to You a perpetual,
184 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
185 | copyright license to reproduce, prepare Derivative Works of,
186 | publicly display, publicly perform, sublicense, and distribute the
187 | Work and such Derivative Works in Source or Object form.
188 |
189 | 3. Grant of Patent License. Subject to the terms and conditions of
190 | this License, each Contributor hereby grants to You a perpetual,
191 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
192 | (except as stated in this section) patent license to make, have made,
193 | use, offer to sell, sell, import, and otherwise transfer the Work,
194 | where such license applies only to those patent claims licensable
195 | by such Contributor that are necessarily infringed by their
196 | Contribution(s) alone or by combination of their Contribution(s)
197 | with the Work to which such Contribution(s) was submitted. If You
198 | institute patent litigation against any entity (including a
199 | cross-claim or counterclaim in a lawsuit) alleging that the Work
200 | or a Contribution incorporated within the Work constitutes direct
201 | or contributory patent infringement, then any patent licenses
202 | granted to You under this License for that Work shall terminate
203 | as of the date such litigation is filed.
204 |
205 | 4. Redistribution. You may reproduce and distribute copies of the
206 | Work or Derivative Works thereof in any medium, with or without
207 | modifications, and in Source or Object form, provided that You
208 | meet the following conditions:
209 |
210 | (a) You must give any other recipients of the Work or
211 | Derivative Works a copy of this License; and
212 |
213 | (b) You must cause any modified files to carry prominent notices
214 | stating that You changed the files; and
215 |
216 | (c) You must retain, in the Source form of any Derivative Works
217 | that You distribute, all copyright, patent, trademark, and
218 | attribution notices from the Source form of the Work,
219 | excluding those notices that do not pertain to any part of
220 | the Derivative Works; and
221 |
222 | (d) If the Work includes a "NOTICE" text file as part of its
223 | distribution, then any Derivative Works that You distribute must
224 | include a readable copy of the attribution notices contained
225 | within such NOTICE file, excluding those notices that do not
226 | pertain to any part of the Derivative Works, in at least one
227 | of the following places: within a NOTICE text file distributed
228 | as part of the Derivative Works; within the Source form or
229 | documentation, if provided along with the Derivative Works; or,
230 | within a display generated by the Derivative Works, if and
231 | wherever such third-party notices normally appear. The contents
232 | of the NOTICE file are for informational purposes only and
233 | do not modify the License. You may add Your own attribution
234 | notices within Derivative Works that You distribute, alongside
235 | or as an addendum to the NOTICE text from the Work, provided
236 | that such additional attribution notices cannot be construed
237 | as modifying the License.
238 |
239 | You may add Your own copyright statement to Your modifications and
240 | may provide additional or different license terms and conditions
241 | for use, reproduction, or distribution of Your modifications, or
242 | for any such Derivative Works as a whole, provided Your use,
243 | reproduction, and distribution of the Work otherwise complies with
244 | the conditions stated in this License.
245 |
246 | 5. Submission of Contributions. Unless You explicitly state otherwise,
247 | any Contribution intentionally submitted for inclusion in the Work
248 | by You to the Licensor shall be under the terms and conditions of
249 | this License, without any additional terms or conditions.
250 | Notwithstanding the above, nothing herein shall supersede or modify
251 | the terms of any separate license agreement you may have executed
252 | with Licensor regarding such Contributions.
253 |
254 | 6. Trademarks. This License does not grant permission to use the trade
255 | names, trademarks, service marks, or product names of the Licensor,
256 | except as required for reasonable and customary use in describing the
257 | origin of the Work and reproducing the content of the NOTICE file.
258 |
259 | 7. Disclaimer of Warranty. Unless required by applicable law or
260 | agreed to in writing, Licensor provides the Work (and each
261 | Contributor provides its Contributions) on an "AS IS" BASIS,
262 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
263 | implied, including, without limitation, any warranties or conditions
264 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
265 | PARTICULAR PURPOSE. You are solely responsible for determining the
266 | appropriateness of using or redistributing the Work and assume any
267 | risks associated with Your exercise of permissions under this License.
268 |
269 | 8. Limitation of Liability. In no event and under no legal theory,
270 | whether in tort (including negligence), contract, or otherwise,
271 | unless required by applicable law (such as deliberate and grossly
272 | negligent acts) or agreed to in writing, shall any Contributor be
273 | liable to You for damages, including any direct, indirect, special,
274 | incidental, or consequential damages of any character arising as a
275 | result of this License or out of the use or inability to use the
276 | Work (including but not limited to damages for loss of goodwill,
277 | work stoppage, computer failure or malfunction, or any and all
278 | other commercial damages or losses), even if such Contributor
279 | has been advised of the possibility of such damages.
280 |
281 | 9. Accepting Warranty or Additional Liability. While redistributing
282 | the Work or Derivative Works thereof, You may choose to offer,
283 | and charge a fee for, acceptance of support, warranty, indemnity,
284 | or other liability obligations and/or rights consistent with this
285 | License. However, in accepting such obligations, You may act only
286 | on Your own behalf and on Your sole responsibility, not on behalf
287 | of any other Contributor, and only if You agree to indemnify,
288 | defend, and hold each Contributor harmless for any liability
289 | incurred by, or claims asserted against, such Contributor by reason
290 | of your accepting any such warranty or additional liability.
291 |
292 | END OF TERMS AND CONDITIONS
293 |
294 | APPENDIX: How to apply the Apache License to your work.
295 |
296 | To apply the Apache License to your work, attach the following
297 | boilerplate notice, with the fields enclosed by brackets "[]"
298 | replaced with your own identifying information. (Don't include
299 | the brackets!) The text should be enclosed in the appropriate
300 | comment syntax for the file format. We also recommend that a
301 | file or class name and description of purpose be included on the
302 | same "printed page" as the copyright notice for easier
303 | identification within third-party archives.
304 |
305 | Copyright (c) 2015-2018 Google, Inc., Netflix, Inc., Microsoft Corp. and contributors
306 |
307 | Licensed under the Apache License, Version 2.0 (the "License");
308 | you may not use this file except in compliance with the License.
309 | You may obtain a copy of the License at
310 |
311 | http://www.apache.org/licenses/LICENSE-2.0
312 |
313 | Unless required by applicable law or agreed to in writing, software
314 | distributed under the License is distributed on an "AS IS" BASIS,
315 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
316 | See the License for the specific language governing permissions and
317 | limitations under the License.
318 |
319 |
320 |
321 | tslib
322 | 0BSD
323 | Copyright (c) Microsoft Corporation.
324 |
325 | Permission to use, copy, modify, and/or distribute this software for any
326 | purpose with or without fee is hereby granted.
327 |
328 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
329 | REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
330 | AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
331 | INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
332 | LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
333 | OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
334 | PERFORMANCE OF THIS SOFTWARE.
335 |
336 | zone.js
337 | MIT
338 | The MIT License
339 |
340 | Copyright (c) 2010-2023 Google LLC. https://angular.io/license
341 |
342 | Permission is hereby granted, free of charge, to any person obtaining a copy
343 | of this software and associated documentation files (the "Software"), to deal
344 | in the Software without restriction, including without limitation the rights
345 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
346 | copies of the Software, and to permit persons to whom the Software is
347 | furnished to do so, subject to the following conditions:
348 |
349 | The above copyright notice and this permission notice shall be included in
350 | all copies or substantial portions of the Software.
351 |
352 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
353 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
354 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
355 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
356 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
357 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
358 | THE SOFTWARE.
359 |
--------------------------------------------------------------------------------
/docs/polyfills.e8c516cd4b0b98b5.js:
--------------------------------------------------------------------------------
1 | "use strict";(self.webpackChunkdemo=self.webpackChunkdemo||[]).push([[429],{538:(ie,Ee,de)=>{de(583)},583:()=>{!function(e){const n=e.performance;function i(M){n&&n.mark&&n.mark(M)}function o(M,T){n&&n.measure&&n.measure(M,T)}i("Zone");const c=e.__Zone_symbol_prefix||"__zone_symbol__";function a(M){return c+M}const y=!0===e[a("forceDuplicateZoneCheck")];if(e.Zone){if(y||"function"!=typeof e.Zone.__symbol__)throw new Error("Zone already loaded.");return e.Zone}let d=(()=>{class M{static assertZonePatched(){if(e.Promise!==oe.ZoneAwarePromise)throw new Error("Zone.js has detected that ZoneAwarePromise `(window|global).Promise` has been overwritten.\nMost likely cause is that a Promise polyfill has been loaded after Zone.js (Polyfilling Promise api is not necessary when zone.js is loaded. If you must load one, do so before loading zone.js.)")}static get root(){let t=M.current;for(;t.parent;)t=t.parent;return t}static get current(){return U.zone}static get currentTask(){return re}static __load_patch(t,r,k=!1){if(oe.hasOwnProperty(t)){if(!k&&y)throw Error("Already loaded patch: "+t)}else if(!e["__Zone_disable_"+t]){const C="Zone:"+t;i(C),oe[t]=r(e,M,z),o(C,C)}}get parent(){return this._parent}get name(){return this._name}constructor(t,r){this._parent=t,this._name=r?r.name||"unnamed":"",this._properties=r&&r.properties||{},this._zoneDelegate=new v(this,this._parent&&this._parent._zoneDelegate,r)}get(t){const r=this.getZoneWith(t);if(r)return r._properties[t]}getZoneWith(t){let r=this;for(;r;){if(r._properties.hasOwnProperty(t))return r;r=r._parent}return null}fork(t){if(!t)throw new Error("ZoneSpec required!");return this._zoneDelegate.fork(this,t)}wrap(t,r){if("function"!=typeof t)throw new Error("Expecting function got: "+t);const k=this._zoneDelegate.intercept(this,t,r),C=this;return function(){return C.runGuarded(k,this,arguments,r)}}run(t,r,k,C){U={parent:U,zone:this};try{return this._zoneDelegate.invoke(this,t,r,k,C)}finally{U=U.parent}}runGuarded(t,r=null,k,C){U={parent:U,zone:this};try{try{return this._zoneDelegate.invoke(this,t,r,k,C)}catch($){if(this._zoneDelegate.handleError(this,$))throw $}}finally{U=U.parent}}runTask(t,r,k){if(t.zone!=this)throw new Error("A task can only be run in the zone of creation! (Creation: "+(t.zone||K).name+"; Execution: "+this.name+")");if(t.state===x&&(t.type===Q||t.type===P))return;const C=t.state!=E;C&&t._transitionTo(E,A),t.runCount++;const $=re;re=t,U={parent:U,zone:this};try{t.type==P&&t.data&&!t.data.isPeriodic&&(t.cancelFn=void 0);try{return this._zoneDelegate.invokeTask(this,t,r,k)}catch(l){if(this._zoneDelegate.handleError(this,l))throw l}}finally{t.state!==x&&t.state!==h&&(t.type==Q||t.data&&t.data.isPeriodic?C&&t._transitionTo(A,E):(t.runCount=0,this._updateTaskCount(t,-1),C&&t._transitionTo(x,E,x))),U=U.parent,re=$}}scheduleTask(t){if(t.zone&&t.zone!==this){let k=this;for(;k;){if(k===t.zone)throw Error(`can not reschedule task to ${this.name} which is descendants of the original zone ${t.zone.name}`);k=k.parent}}t._transitionTo(X,x);const r=[];t._zoneDelegates=r,t._zone=this;try{t=this._zoneDelegate.scheduleTask(this,t)}catch(k){throw t._transitionTo(h,X,x),this._zoneDelegate.handleError(this,k),k}return t._zoneDelegates===r&&this._updateTaskCount(t,1),t.state==X&&t._transitionTo(A,X),t}scheduleMicroTask(t,r,k,C){return this.scheduleTask(new p(I,t,r,k,C,void 0))}scheduleMacroTask(t,r,k,C,$){return this.scheduleTask(new p(P,t,r,k,C,$))}scheduleEventTask(t,r,k,C,$){return this.scheduleTask(new p(Q,t,r,k,C,$))}cancelTask(t){if(t.zone!=this)throw new Error("A task can only be cancelled in the zone of creation! (Creation: "+(t.zone||K).name+"; Execution: "+this.name+")");if(t.state===A||t.state===E){t._transitionTo(G,A,E);try{this._zoneDelegate.cancelTask(this,t)}catch(r){throw t._transitionTo(h,G),this._zoneDelegate.handleError(this,r),r}return this._updateTaskCount(t,-1),t._transitionTo(x,G),t.runCount=0,t}}_updateTaskCount(t,r){const k=t._zoneDelegates;-1==r&&(t._zoneDelegates=null);for(let C=0;CM.hasTask(t,r),onScheduleTask:(M,T,t,r)=>M.scheduleTask(t,r),onInvokeTask:(M,T,t,r,k,C)=>M.invokeTask(t,r,k,C),onCancelTask:(M,T,t,r)=>M.cancelTask(t,r)};class v{constructor(T,t,r){this._taskCounts={microTask:0,macroTask:0,eventTask:0},this.zone=T,this._parentDelegate=t,this._forkZS=r&&(r&&r.onFork?r:t._forkZS),this._forkDlgt=r&&(r.onFork?t:t._forkDlgt),this._forkCurrZone=r&&(r.onFork?this.zone:t._forkCurrZone),this._interceptZS=r&&(r.onIntercept?r:t._interceptZS),this._interceptDlgt=r&&(r.onIntercept?t:t._interceptDlgt),this._interceptCurrZone=r&&(r.onIntercept?this.zone:t._interceptCurrZone),this._invokeZS=r&&(r.onInvoke?r:t._invokeZS),this._invokeDlgt=r&&(r.onInvoke?t:t._invokeDlgt),this._invokeCurrZone=r&&(r.onInvoke?this.zone:t._invokeCurrZone),this._handleErrorZS=r&&(r.onHandleError?r:t._handleErrorZS),this._handleErrorDlgt=r&&(r.onHandleError?t:t._handleErrorDlgt),this._handleErrorCurrZone=r&&(r.onHandleError?this.zone:t._handleErrorCurrZone),this._scheduleTaskZS=r&&(r.onScheduleTask?r:t._scheduleTaskZS),this._scheduleTaskDlgt=r&&(r.onScheduleTask?t:t._scheduleTaskDlgt),this._scheduleTaskCurrZone=r&&(r.onScheduleTask?this.zone:t._scheduleTaskCurrZone),this._invokeTaskZS=r&&(r.onInvokeTask?r:t._invokeTaskZS),this._invokeTaskDlgt=r&&(r.onInvokeTask?t:t._invokeTaskDlgt),this._invokeTaskCurrZone=r&&(r.onInvokeTask?this.zone:t._invokeTaskCurrZone),this._cancelTaskZS=r&&(r.onCancelTask?r:t._cancelTaskZS),this._cancelTaskDlgt=r&&(r.onCancelTask?t:t._cancelTaskDlgt),this._cancelTaskCurrZone=r&&(r.onCancelTask?this.zone:t._cancelTaskCurrZone),this._hasTaskZS=null,this._hasTaskDlgt=null,this._hasTaskDlgtOwner=null,this._hasTaskCurrZone=null;const k=r&&r.onHasTask;(k||t&&t._hasTaskZS)&&(this._hasTaskZS=k?r:b,this._hasTaskDlgt=t,this._hasTaskDlgtOwner=this,this._hasTaskCurrZone=T,r.onScheduleTask||(this._scheduleTaskZS=b,this._scheduleTaskDlgt=t,this._scheduleTaskCurrZone=this.zone),r.onInvokeTask||(this._invokeTaskZS=b,this._invokeTaskDlgt=t,this._invokeTaskCurrZone=this.zone),r.onCancelTask||(this._cancelTaskZS=b,this._cancelTaskDlgt=t,this._cancelTaskCurrZone=this.zone))}fork(T,t){return this._forkZS?this._forkZS.onFork(this._forkDlgt,this.zone,T,t):new d(T,t)}intercept(T,t,r){return this._interceptZS?this._interceptZS.onIntercept(this._interceptDlgt,this._interceptCurrZone,T,t,r):t}invoke(T,t,r,k,C){return this._invokeZS?this._invokeZS.onInvoke(this._invokeDlgt,this._invokeCurrZone,T,t,r,k,C):t.apply(r,k)}handleError(T,t){return!this._handleErrorZS||this._handleErrorZS.onHandleError(this._handleErrorDlgt,this._handleErrorCurrZone,T,t)}scheduleTask(T,t){let r=t;if(this._scheduleTaskZS)this._hasTaskZS&&r._zoneDelegates.push(this._hasTaskDlgtOwner),r=this._scheduleTaskZS.onScheduleTask(this._scheduleTaskDlgt,this._scheduleTaskCurrZone,T,t),r||(r=t);else if(t.scheduleFn)t.scheduleFn(t);else{if(t.type!=I)throw new Error("Task is missing scheduleFn.");R(t)}return r}invokeTask(T,t,r,k){return this._invokeTaskZS?this._invokeTaskZS.onInvokeTask(this._invokeTaskDlgt,this._invokeTaskCurrZone,T,t,r,k):t.callback.apply(r,k)}cancelTask(T,t){let r;if(this._cancelTaskZS)r=this._cancelTaskZS.onCancelTask(this._cancelTaskDlgt,this._cancelTaskCurrZone,T,t);else{if(!t.cancelFn)throw Error("Task is not cancelable");r=t.cancelFn(t)}return r}hasTask(T,t){try{this._hasTaskZS&&this._hasTaskZS.onHasTask(this._hasTaskDlgt,this._hasTaskCurrZone,T,t)}catch(r){this.handleError(T,r)}}_updateTaskCount(T,t){const r=this._taskCounts,k=r[T],C=r[T]=k+t;if(C<0)throw new Error("More tasks executed then were scheduled.");0!=k&&0!=C||this.hasTask(this.zone,{microTask:r.microTask>0,macroTask:r.macroTask>0,eventTask:r.eventTask>0,change:T})}}class p{constructor(T,t,r,k,C,$){if(this._zone=null,this.runCount=0,this._zoneDelegates=null,this._state="notScheduled",this.type=T,this.source=t,this.data=k,this.scheduleFn=C,this.cancelFn=$,!r)throw new Error("callback is not defined");this.callback=r;const l=this;this.invoke=T===Q&&k&&k.useG?p.invokeTask:function(){return p.invokeTask.call(e,l,this,arguments)}}static invokeTask(T,t,r){T||(T=this),ee++;try{return T.runCount++,T.zone.runTask(T,t,r)}finally{1==ee&&_(),ee--}}get zone(){return this._zone}get state(){return this._state}cancelScheduleRequest(){this._transitionTo(x,X)}_transitionTo(T,t,r){if(this._state!==t&&this._state!==r)throw new Error(`${this.type} '${this.source}': can not transition to '${T}', expecting state '${t}'${r?" or '"+r+"'":""}, was '${this._state}'.`);this._state=T,T==x&&(this._zoneDelegates=null)}toString(){return this.data&&typeof this.data.handleId<"u"?this.data.handleId.toString():Object.prototype.toString.call(this)}toJSON(){return{type:this.type,state:this.state,source:this.source,zone:this.zone.name,runCount:this.runCount}}}const L=a("setTimeout"),Z=a("Promise"),N=a("then");let J,B=[],H=!1;function q(M){if(J||e[Z]&&(J=e[Z].resolve(0)),J){let T=J[N];T||(T=J.then),T.call(J,M)}else e[L](M,0)}function R(M){0===ee&&0===B.length&&q(_),M&&B.push(M)}function _(){if(!H){for(H=!0;B.length;){const M=B;B=[];for(let T=0;TU,onUnhandledError:W,microtaskDrainDone:W,scheduleMicroTask:R,showUncaughtError:()=>!d[a("ignoreConsoleErrorUncaughtError")],patchEventTarget:()=>[],patchOnProperties:W,patchMethod:()=>W,bindArguments:()=>[],patchThen:()=>W,patchMacroTask:()=>W,patchEventPrototype:()=>W,isIEOrEdge:()=>!1,getGlobalObjects:()=>{},ObjectDefineProperty:()=>W,ObjectGetOwnPropertyDescriptor:()=>{},ObjectCreate:()=>{},ArraySlice:()=>[],patchClass:()=>W,wrapWithCurrentZone:()=>W,filterProperties:()=>[],attachOriginToPatched:()=>W,_redefineProperty:()=>W,patchCallbacks:()=>W,nativeScheduleMicroTask:q};let U={parent:null,zone:new d(null,null)},re=null,ee=0;function W(){}o("Zone","Zone"),e.Zone=d}(typeof window<"u"&&window||typeof self<"u"&&self||global);const ie=Object.getOwnPropertyDescriptor,Ee=Object.defineProperty,de=Object.getPrototypeOf,ge=Object.create,Ve=Array.prototype.slice,Se="addEventListener",Oe="removeEventListener",Ze=Zone.__symbol__(Se),Ne=Zone.__symbol__(Oe),ce="true",ae="false",ke=Zone.__symbol__("");function Ie(e,n){return Zone.current.wrap(e,n)}function Me(e,n,i,o,c){return Zone.current.scheduleMacroTask(e,n,i,o,c)}const j=Zone.__symbol__,Pe=typeof window<"u",Te=Pe?window:void 0,Y=Pe&&Te||"object"==typeof self&&self||global,ct="removeAttribute";function Le(e,n){for(let i=e.length-1;i>=0;i--)"function"==typeof e[i]&&(e[i]=Ie(e[i],n+"_"+i));return e}function Fe(e){return!e||!1!==e.writable&&!("function"==typeof e.get&&typeof e.set>"u")}const Be=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope,we=!("nw"in Y)&&typeof Y.process<"u"&&"[object process]"==={}.toString.call(Y.process),Ae=!we&&!Be&&!(!Pe||!Te.HTMLElement),Ue=typeof Y.process<"u"&&"[object process]"==={}.toString.call(Y.process)&&!Be&&!(!Pe||!Te.HTMLElement),Re={},We=function(e){if(!(e=e||Y.event))return;let n=Re[e.type];n||(n=Re[e.type]=j("ON_PROPERTY"+e.type));const i=this||e.target||Y,o=i[n];let c;return Ae&&i===Te&&"error"===e.type?(c=o&&o.call(this,e.message,e.filename,e.lineno,e.colno,e.error),!0===c&&e.preventDefault()):(c=o&&o.apply(this,arguments),null!=c&&!c&&e.preventDefault()),c};function qe(e,n,i){let o=ie(e,n);if(!o&&i&&ie(i,n)&&(o={enumerable:!0,configurable:!0}),!o||!o.configurable)return;const c=j("on"+n+"patched");if(e.hasOwnProperty(c)&&e[c])return;delete o.writable,delete o.value;const a=o.get,y=o.set,d=n.slice(2);let b=Re[d];b||(b=Re[d]=j("ON_PROPERTY"+d)),o.set=function(v){let p=this;!p&&e===Y&&(p=Y),p&&("function"==typeof p[b]&&p.removeEventListener(d,We),y&&y.call(p,null),p[b]=v,"function"==typeof v&&p.addEventListener(d,We,!1))},o.get=function(){let v=this;if(!v&&e===Y&&(v=Y),!v)return null;const p=v[b];if(p)return p;if(a){let L=a.call(this);if(L)return o.set.call(this,L),"function"==typeof v[ct]&&v.removeAttribute(n),L}return null},Ee(e,n,o),e[c]=!0}function Xe(e,n,i){if(n)for(let o=0;ofunction(y,d){const b=i(y,d);return b.cbIdx>=0&&"function"==typeof d[b.cbIdx]?Me(b.name,d[b.cbIdx],b,c):a.apply(y,d)})}function ue(e,n){e[j("OriginalDelegate")]=n}let ze=!1,je=!1;function ft(){if(ze)return je;ze=!0;try{const e=Te.navigator.userAgent;(-1!==e.indexOf("MSIE ")||-1!==e.indexOf("Trident/")||-1!==e.indexOf("Edge/"))&&(je=!0)}catch{}return je}Zone.__load_patch("ZoneAwarePromise",(e,n,i)=>{const o=Object.getOwnPropertyDescriptor,c=Object.defineProperty,y=i.symbol,d=[],b=!0===e[y("DISABLE_WRAPPING_UNCAUGHT_PROMISE_REJECTION")],v=y("Promise"),p=y("then"),L="__creationTrace__";i.onUnhandledError=l=>{if(i.showUncaughtError()){const u=l&&l.rejection;u?console.error("Unhandled Promise rejection:",u instanceof Error?u.message:u,"; Zone:",l.zone.name,"; Task:",l.task&&l.task.source,"; Value:",u,u instanceof Error?u.stack:void 0):console.error(l)}},i.microtaskDrainDone=()=>{for(;d.length;){const l=d.shift();try{l.zone.runGuarded(()=>{throw l.throwOriginal?l.rejection:l})}catch(u){N(u)}}};const Z=y("unhandledPromiseRejectionHandler");function N(l){i.onUnhandledError(l);try{const u=n[Z];"function"==typeof u&&u.call(this,l)}catch{}}function B(l){return l&&l.then}function H(l){return l}function J(l){return t.reject(l)}const q=y("state"),R=y("value"),_=y("finally"),K=y("parentPromiseValue"),x=y("parentPromiseState"),X="Promise.then",A=null,E=!0,G=!1,h=0;function I(l,u){return s=>{try{z(l,u,s)}catch(f){z(l,!1,f)}}}const P=function(){let l=!1;return function(s){return function(){l||(l=!0,s.apply(null,arguments))}}},Q="Promise resolved with itself",oe=y("currentTaskTrace");function z(l,u,s){const f=P();if(l===s)throw new TypeError(Q);if(l[q]===A){let g=null;try{("object"==typeof s||"function"==typeof s)&&(g=s&&s.then)}catch(w){return f(()=>{z(l,!1,w)})(),l}if(u!==G&&s instanceof t&&s.hasOwnProperty(q)&&s.hasOwnProperty(R)&&s[q]!==A)re(s),z(l,s[q],s[R]);else if(u!==G&&"function"==typeof g)try{g.call(s,f(I(l,u)),f(I(l,!1)))}catch(w){f(()=>{z(l,!1,w)})()}else{l[q]=u;const w=l[R];if(l[R]=s,l[_]===_&&u===E&&(l[q]=l[x],l[R]=l[K]),u===G&&s instanceof Error){const m=n.currentTask&&n.currentTask.data&&n.currentTask.data[L];m&&c(s,oe,{configurable:!0,enumerable:!1,writable:!0,value:m})}for(let m=0;m{try{const D=l[R],S=!!s&&_===s[_];S&&(s[K]=D,s[x]=w);const O=u.run(m,void 0,S&&m!==J&&m!==H?[]:[D]);z(s,!0,O)}catch(D){z(s,!1,D)}},s)}const M=function(){},T=e.AggregateError;class t{static toString(){return"function ZoneAwarePromise() { [native code] }"}static resolve(u){return z(new this(null),E,u)}static reject(u){return z(new this(null),G,u)}static any(u){if(!u||"function"!=typeof u[Symbol.iterator])return Promise.reject(new T([],"All promises were rejected"));const s=[];let f=0;try{for(let m of u)f++,s.push(t.resolve(m))}catch{return Promise.reject(new T([],"All promises were rejected"))}if(0===f)return Promise.reject(new T([],"All promises were rejected"));let g=!1;const w=[];return new t((m,D)=>{for(let S=0;S{g||(g=!0,m(O))},O=>{w.push(O),f--,0===f&&(g=!0,D(new T(w,"All promises were rejected")))})})}static race(u){let s,f,g=new this((D,S)=>{s=D,f=S});function w(D){s(D)}function m(D){f(D)}for(let D of u)B(D)||(D=this.resolve(D)),D.then(w,m);return g}static all(u){return t.allWithCallback(u)}static allSettled(u){return(this&&this.prototype instanceof t?this:t).allWithCallback(u,{thenCallback:f=>({status:"fulfilled",value:f}),errorCallback:f=>({status:"rejected",reason:f})})}static allWithCallback(u,s){let f,g,w=new this((O,V)=>{f=O,g=V}),m=2,D=0;const S=[];for(let O of u){B(O)||(O=this.resolve(O));const V=D;try{O.then(F=>{S[V]=s?s.thenCallback(F):F,m--,0===m&&f(S)},F=>{s?(S[V]=s.errorCallback(F),m--,0===m&&f(S)):g(F)})}catch(F){g(F)}m++,D++}return m-=2,0===m&&f(S),w}constructor(u){const s=this;if(!(s instanceof t))throw new Error("Must be an instanceof Promise.");s[q]=A,s[R]=[];try{const f=P();u&&u(f(I(s,E)),f(I(s,G)))}catch(f){z(s,!1,f)}}get[Symbol.toStringTag](){return"Promise"}get[Symbol.species](){return t}then(u,s){let f=this.constructor?.[Symbol.species];(!f||"function"!=typeof f)&&(f=this.constructor||t);const g=new f(M),w=n.current;return this[q]==A?this[R].push(w,g,u,s):ee(this,w,g,u,s),g}catch(u){return this.then(null,u)}finally(u){let s=this.constructor?.[Symbol.species];(!s||"function"!=typeof s)&&(s=t);const f=new s(M);f[_]=_;const g=n.current;return this[q]==A?this[R].push(g,f,u,u):ee(this,g,f,u,u),f}}t.resolve=t.resolve,t.reject=t.reject,t.race=t.race,t.all=t.all;const r=e[v]=e.Promise;e.Promise=t;const k=y("thenPatched");function C(l){const u=l.prototype,s=o(u,"then");if(s&&(!1===s.writable||!s.configurable))return;const f=u.then;u[p]=f,l.prototype.then=function(g,w){return new t((D,S)=>{f.call(this,D,S)}).then(g,w)},l[k]=!0}return i.patchThen=C,r&&(C(r),le(e,"fetch",l=>function $(l){return function(u,s){let f=l.apply(u,s);if(f instanceof t)return f;let g=f.constructor;return g[k]||C(g),f}}(l))),Promise[n.__symbol__("uncaughtPromiseErrors")]=d,t}),Zone.__load_patch("toString",e=>{const n=Function.prototype.toString,i=j("OriginalDelegate"),o=j("Promise"),c=j("Error"),a=function(){if("function"==typeof this){const v=this[i];if(v)return"function"==typeof v?n.call(v):Object.prototype.toString.call(v);if(this===Promise){const p=e[o];if(p)return n.call(p)}if(this===Error){const p=e[c];if(p)return n.call(p)}}return n.call(this)};a[i]=n,Function.prototype.toString=a;const y=Object.prototype.toString;Object.prototype.toString=function(){return"function"==typeof Promise&&this instanceof Promise?"[object Promise]":y.call(this)}});let ye=!1;if(typeof window<"u")try{const e=Object.defineProperty({},"passive",{get:function(){ye=!0}});window.addEventListener("test",e,e),window.removeEventListener("test",e,e)}catch{ye=!1}const ht={useG:!0},te={},Ye={},$e=new RegExp("^"+ke+"(\\w+)(true|false)$"),Ke=j("propagationStopped");function Je(e,n){const i=(n?n(e):e)+ae,o=(n?n(e):e)+ce,c=ke+i,a=ke+o;te[e]={},te[e][ae]=c,te[e][ce]=a}function dt(e,n,i,o){const c=o&&o.add||Se,a=o&&o.rm||Oe,y=o&&o.listeners||"eventListeners",d=o&&o.rmAll||"removeAllListeners",b=j(c),v="."+c+":",p="prependListener",L="."+p+":",Z=function(R,_,K){if(R.isRemoved)return;const x=R.callback;let X;"object"==typeof x&&x.handleEvent&&(R.callback=E=>x.handleEvent(E),R.originalDelegate=x);try{R.invoke(R,_,[K])}catch(E){X=E}const A=R.options;return A&&"object"==typeof A&&A.once&&_[a].call(_,K.type,R.originalDelegate?R.originalDelegate:R.callback,A),X};function N(R,_,K){if(!(_=_||e.event))return;const x=R||_.target||e,X=x[te[_.type][K?ce:ae]];if(X){const A=[];if(1===X.length){const E=Z(X[0],x,_);E&&A.push(E)}else{const E=X.slice();for(let G=0;G{throw G})}}}const B=function(R){return N(this,R,!1)},H=function(R){return N(this,R,!0)};function J(R,_){if(!R)return!1;let K=!0;_&&void 0!==_.useG&&(K=_.useG);const x=_&&_.vh;let X=!0;_&&void 0!==_.chkDup&&(X=_.chkDup);let A=!1;_&&void 0!==_.rt&&(A=_.rt);let E=R;for(;E&&!E.hasOwnProperty(c);)E=de(E);if(!E&&R[c]&&(E=R),!E||E[b])return!1;const G=_&&_.eventNameToString,h={},I=E[b]=E[c],P=E[j(a)]=E[a],Q=E[j(y)]=E[y],oe=E[j(d)]=E[d];let z;_&&_.prepend&&(z=E[j(_.prepend)]=E[_.prepend]);const t=K?function(s){if(!h.isExisting)return I.call(h.target,h.eventName,h.capture?H:B,h.options)}:function(s){return I.call(h.target,h.eventName,s.invoke,h.options)},r=K?function(s){if(!s.isRemoved){const f=te[s.eventName];let g;f&&(g=f[s.capture?ce:ae]);const w=g&&s.target[g];if(w)for(let m=0;mfunction(c,a){c[Ke]=!0,o&&o.apply(c,a)})}function Et(e,n,i,o,c){const a=Zone.__symbol__(o);if(n[a])return;const y=n[a]=n[o];n[o]=function(d,b,v){return b&&b.prototype&&c.forEach(function(p){const L=`${i}.${o}::`+p,Z=b.prototype;try{if(Z.hasOwnProperty(p)){const N=e.ObjectGetOwnPropertyDescriptor(Z,p);N&&N.value?(N.value=e.wrapWithCurrentZone(N.value,L),e._redefineProperty(b.prototype,p,N)):Z[p]&&(Z[p]=e.wrapWithCurrentZone(Z[p],L))}else Z[p]&&(Z[p]=e.wrapWithCurrentZone(Z[p],L))}catch{}}),y.call(n,d,b,v)},e.attachOriginToPatched(n[o],y)}function et(e,n,i){if(!i||0===i.length)return n;const o=i.filter(a=>a.target===e);if(!o||0===o.length)return n;const c=o[0].ignoreProperties;return n.filter(a=>-1===c.indexOf(a))}function tt(e,n,i,o){e&&Xe(e,et(e,n,i),o)}function He(e){return Object.getOwnPropertyNames(e).filter(n=>n.startsWith("on")&&n.length>2).map(n=>n.substring(2))}Zone.__load_patch("util",(e,n,i)=>{const o=He(e);i.patchOnProperties=Xe,i.patchMethod=le,i.bindArguments=Le,i.patchMacroTask=lt;const c=n.__symbol__("BLACK_LISTED_EVENTS"),a=n.__symbol__("UNPATCHED_EVENTS");e[a]&&(e[c]=e[a]),e[c]&&(n[c]=n[a]=e[c]),i.patchEventPrototype=_t,i.patchEventTarget=dt,i.isIEOrEdge=ft,i.ObjectDefineProperty=Ee,i.ObjectGetOwnPropertyDescriptor=ie,i.ObjectCreate=ge,i.ArraySlice=Ve,i.patchClass=ve,i.wrapWithCurrentZone=Ie,i.filterProperties=et,i.attachOriginToPatched=ue,i._redefineProperty=Object.defineProperty,i.patchCallbacks=Et,i.getGlobalObjects=()=>({globalSources:Ye,zoneSymbolEventNames:te,eventNames:o,isBrowser:Ae,isMix:Ue,isNode:we,TRUE_STR:ce,FALSE_STR:ae,ZONE_SYMBOL_PREFIX:ke,ADD_EVENT_LISTENER_STR:Se,REMOVE_EVENT_LISTENER_STR:Oe})});const Ce=j("zoneTask");function pe(e,n,i,o){let c=null,a=null;i+=o;const y={};function d(v){const p=v.data;return p.args[0]=function(){return v.invoke.apply(this,arguments)},p.handleId=c.apply(e,p.args),v}function b(v){return a.call(e,v.data.handleId)}c=le(e,n+=o,v=>function(p,L){if("function"==typeof L[0]){const Z={isPeriodic:"Interval"===o,delay:"Timeout"===o||"Interval"===o?L[1]||0:void 0,args:L},N=L[0];L[0]=function(){try{return N.apply(this,arguments)}finally{Z.isPeriodic||("number"==typeof Z.handleId?delete y[Z.handleId]:Z.handleId&&(Z.handleId[Ce]=null))}};const B=Me(n,L[0],Z,d,b);if(!B)return B;const H=B.data.handleId;return"number"==typeof H?y[H]=B:H&&(H[Ce]=B),H&&H.ref&&H.unref&&"function"==typeof H.ref&&"function"==typeof H.unref&&(B.ref=H.ref.bind(H),B.unref=H.unref.bind(H)),"number"==typeof H||H?H:B}return v.apply(e,L)}),a=le(e,i,v=>function(p,L){const Z=L[0];let N;"number"==typeof Z?N=y[Z]:(N=Z&&Z[Ce],N||(N=Z)),N&&"string"==typeof N.type?"notScheduled"!==N.state&&(N.cancelFn&&N.data.isPeriodic||0===N.runCount)&&("number"==typeof Z?delete y[Z]:Z&&(Z[Ce]=null),N.zone.cancelTask(N)):v.apply(e,L)})}Zone.__load_patch("legacy",e=>{const n=e[Zone.__symbol__("legacyPatch")];n&&n()}),Zone.__load_patch("timers",e=>{const n="set",i="clear";pe(e,n,i,"Timeout"),pe(e,n,i,"Interval"),pe(e,n,i,"Immediate")}),Zone.__load_patch("requestAnimationFrame",e=>{pe(e,"request","cancel","AnimationFrame"),pe(e,"mozRequest","mozCancel","AnimationFrame"),pe(e,"webkitRequest","webkitCancel","AnimationFrame")}),Zone.__load_patch("blocking",(e,n)=>{const i=["alert","prompt","confirm"];for(let o=0;ofunction(b,v){return n.current.run(a,e,v,d)})}),Zone.__load_patch("EventTarget",(e,n,i)=>{(function gt(e,n){n.patchEventPrototype(e,n)})(e,i),function mt(e,n){if(Zone[n.symbol("patchEventTarget")])return;const{eventNames:i,zoneSymbolEventNames:o,TRUE_STR:c,FALSE_STR:a,ZONE_SYMBOL_PREFIX:y}=n.getGlobalObjects();for(let b=0;b{ve("MutationObserver"),ve("WebKitMutationObserver")}),Zone.__load_patch("IntersectionObserver",(e,n,i)=>{ve("IntersectionObserver")}),Zone.__load_patch("FileReader",(e,n,i)=>{ve("FileReader")}),Zone.__load_patch("on_property",(e,n,i)=>{!function Tt(e,n){if(we&&!Ue||Zone[e.symbol("patchEvents")])return;const i=n.__Zone_ignore_on_properties;let o=[];if(Ae){const c=window;o=o.concat(["Document","SVGElement","Element","HTMLElement","HTMLBodyElement","HTMLMediaElement","HTMLFrameSetElement","HTMLFrameElement","HTMLIFrameElement","HTMLMarqueeElement","Worker"]);const a=function ut(){try{const e=Te.navigator.userAgent;if(-1!==e.indexOf("MSIE ")||-1!==e.indexOf("Trident/"))return!0}catch{}return!1}()?[{target:c,ignoreProperties:["error"]}]:[];tt(c,He(c),i&&i.concat(a),de(c))}o=o.concat(["XMLHttpRequest","XMLHttpRequestEventTarget","IDBIndex","IDBRequest","IDBOpenDBRequest","IDBDatabase","IDBTransaction","IDBCursor","WebSocket"]);for(let c=0;c{!function pt(e,n){const{isBrowser:i,isMix:o}=n.getGlobalObjects();(i||o)&&e.customElements&&"customElements"in e&&n.patchCallbacks(n,e.customElements,"customElements","define",["connectedCallback","disconnectedCallback","adoptedCallback","attributeChangedCallback"])}(e,i)}),Zone.__load_patch("XHR",(e,n)=>{!function b(v){const p=v.XMLHttpRequest;if(!p)return;const L=p.prototype;let N=L[Ze],B=L[Ne];if(!N){const h=v.XMLHttpRequestEventTarget;if(h){const I=h.prototype;N=I[Ze],B=I[Ne]}}const H="readystatechange",J="scheduled";function q(h){const I=h.data,P=I.target;P[a]=!1,P[d]=!1;const Q=P[c];N||(N=P[Ze],B=P[Ne]),Q&&B.call(P,H,Q);const oe=P[c]=()=>{if(P.readyState===P.DONE)if(!I.aborted&&P[a]&&h.state===J){const U=P[n.__symbol__("loadfalse")];if(0!==P.status&&U&&U.length>0){const re=h.invoke;h.invoke=function(){const ee=P[n.__symbol__("loadfalse")];for(let W=0;Wfunction(h,I){return h[o]=0==I[2],h[y]=I[1],K.apply(h,I)}),X=j("fetchTaskAborting"),A=j("fetchTaskScheduling"),E=le(L,"send",()=>function(h,I){if(!0===n.current[A]||h[o])return E.apply(h,I);{const P={target:h,url:h[y],isPeriodic:!1,args:I,aborted:!1},Q=Me("XMLHttpRequest.send",R,P,q,_);h&&!0===h[d]&&!P.aborted&&Q.state===J&&Q.invoke()}}),G=le(L,"abort",()=>function(h,I){const P=function Z(h){return h[i]}(h);if(P&&"string"==typeof P.type){if(null==P.cancelFn||P.data&&P.data.aborted)return;P.zone.cancelTask(P)}else if(!0===n.current[X])return G.apply(h,I)})}(e);const i=j("xhrTask"),o=j("xhrSync"),c=j("xhrListener"),a=j("xhrScheduled"),y=j("xhrURL"),d=j("xhrErrorBeforeScheduled")}),Zone.__load_patch("geolocation",e=>{e.navigator&&e.navigator.geolocation&&function at(e,n){const i=e.constructor.name;for(let o=0;o{const b=function(){return d.apply(this,Le(arguments,i+"."+c))};return ue(b,d),b})(a)}}}(e.navigator.geolocation,["getCurrentPosition","watchPosition"])}),Zone.__load_patch("PromiseRejectionEvent",(e,n)=>{function i(o){return function(c){Qe(e,o).forEach(y=>{const d=e.PromiseRejectionEvent;if(d){const b=new d(o,{promise:c.promise,reason:c.rejection});y.invoke(b)}})}}e.PromiseRejectionEvent&&(n[j("unhandledPromiseRejectionHandler")]=i("unhandledrejection"),n[j("rejectionHandledHandler")]=i("rejectionhandled"))}),Zone.__load_patch("queueMicrotask",(e,n,i)=>{!function yt(e,n){n.patchMethod(e,"queueMicrotask",i=>function(o,c){Zone.current.scheduleMicroTask("queueMicrotask",c[0])})}(e,i)})}},ie=>{ie(ie.s=538)}]);
--------------------------------------------------------------------------------