@malva-ui/editor 0.1.13 → 0.1.14
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.
- package/README.md +5 -5
- package/fesm2022/malva-ui-editor-ai.mjs +17 -0
- package/fesm2022/malva-ui-editor-ai.mjs.map +1 -0
- package/fesm2022/malva-ui-editor.mjs +10227 -0
- package/fesm2022/malva-ui-editor.mjs.map +1 -0
- package/package.json +35 -26
- package/types/malva-ui-editor-ai.d.ts +1 -0
- package/types/malva-ui-editor.d.ts +2995 -0
- package/ai/index.d.ts +0 -12
- package/ai/malva-ui-editor-ai.d.ts +0 -5
- package/esm2022/ai/index.js +0 -12
- package/esm2022/ai/index.js.map +0 -1
- package/esm2022/ai/malva-ui-editor-ai.js +0 -5
- package/esm2022/ai/malva-ui-editor-ai.js.map +0 -1
- package/esm2022/index.js +0 -37
- package/esm2022/index.js.map +0 -1
- package/esm2022/lib/ai/editor-ai-actions.js +0 -69
- package/esm2022/lib/ai/editor-ai-actions.js.map +0 -1
- package/esm2022/lib/ai/editor-ai-context.js +0 -612
- package/esm2022/lib/ai/editor-ai-context.js.map +0 -1
- package/esm2022/lib/ai/editor-ai-menu.js +0 -288
- package/esm2022/lib/ai/editor-ai-menu.js.map +0 -1
- package/esm2022/lib/ai/editor-ai-review-bar.js +0 -223
- package/esm2022/lib/ai/editor-ai-review-bar.js.map +0 -1
- package/esm2022/lib/ai/editor-ai-stream.js +0 -677
- package/esm2022/lib/ai/editor-ai-stream.js.map +0 -1
- package/esm2022/lib/ai/editor-ai-suggestions.js +0 -751
- package/esm2022/lib/ai/editor-ai-suggestions.js.map +0 -1
- package/esm2022/lib/ai/editor-ai.tokens.js +0 -10
- package/esm2022/lib/ai/editor-ai.tokens.js.map +0 -1
- package/esm2022/lib/ai/editor-ai.types.js +0 -1
- package/esm2022/lib/ai/editor-ai.types.js.map +0 -1
- package/esm2022/lib/editor/editor.js +0 -985
- package/esm2022/lib/editor/editor.js.map +0 -1
- package/esm2022/lib/editor-extension-preflight.js +0 -83
- package/esm2022/lib/editor-extension-preflight.js.map +0 -1
- package/esm2022/lib/editor-serialization.js +0 -152
- package/esm2022/lib/editor-serialization.js.map +0 -1
- package/esm2022/lib/editor-toolbar-context.js +0 -259
- package/esm2022/lib/editor-toolbar-context.js.map +0 -1
- package/esm2022/lib/editor.tokens.js +0 -10
- package/esm2022/lib/editor.tokens.js.map +0 -1
- package/esm2022/lib/editor.types.js +0 -48
- package/esm2022/lib/editor.types.js.map +0 -1
- package/esm2022/lib/extensions/editor-block-handle.js +0 -760
- package/esm2022/lib/extensions/editor-block-handle.js.map +0 -1
- package/esm2022/lib/extensions/editor-extensions.js +0 -321
- package/esm2022/lib/extensions/editor-extensions.js.map +0 -1
- package/esm2022/lib/extensions/editor-markdown-compatibility.js +0 -162
- package/esm2022/lib/extensions/editor-markdown-compatibility.js.map +0 -1
- package/esm2022/lib/extensions/editor-upload-placeholder.js +0 -156
- package/esm2022/lib/extensions/editor-upload-placeholder.js.map +0 -1
- package/esm2022/lib/status/editor-status.js +0 -64
- package/esm2022/lib/status/editor-status.js.map +0 -1
- package/esm2022/lib/toolbar/editor-alignment.js +0 -203
- package/esm2022/lib/toolbar/editor-alignment.js.map +0 -1
- package/esm2022/lib/toolbar/editor-block-insert.js +0 -101
- package/esm2022/lib/toolbar/editor-block-insert.js.map +0 -1
- package/esm2022/lib/toolbar/editor-color-control.js +0 -71
- package/esm2022/lib/toolbar/editor-color-control.js.map +0 -1
- package/esm2022/lib/toolbar/editor-command-button.js +0 -115
- package/esm2022/lib/toolbar/editor-command-button.js.map +0 -1
- package/esm2022/lib/toolbar/editor-heading.js +0 -266
- package/esm2022/lib/toolbar/editor-heading.js.map +0 -1
- package/esm2022/lib/toolbar/editor-highlight.js +0 -84
- package/esm2022/lib/toolbar/editor-highlight.js.map +0 -1
- package/esm2022/lib/toolbar/editor-image-upload-dialog.js +0 -289
- package/esm2022/lib/toolbar/editor-image-upload-dialog.js.map +0 -1
- package/esm2022/lib/toolbar/editor-image-upload.js +0 -315
- package/esm2022/lib/toolbar/editor-image-upload.js.map +0 -1
- package/esm2022/lib/toolbar/editor-inline-marks.js +0 -124
- package/esm2022/lib/toolbar/editor-inline-marks.js.map +0 -1
- package/esm2022/lib/toolbar/editor-link.js +0 -265
- package/esm2022/lib/toolbar/editor-link.js.map +0 -1
- package/esm2022/lib/toolbar/editor-list.js +0 -249
- package/esm2022/lib/toolbar/editor-list.js.map +0 -1
- package/esm2022/lib/toolbar/editor-table.js +0 -292
- package/esm2022/lib/toolbar/editor-table.js.map +0 -1
- package/esm2022/lib/toolbar/editor-text-color.js +0 -82
- package/esm2022/lib/toolbar/editor-text-color.js.map +0 -1
- package/esm2022/lib/toolbar/editor-toolbar-widget.js +0 -41
- package/esm2022/lib/toolbar/editor-toolbar-widget.js.map +0 -1
- package/esm2022/lib/toolbar/editor-toolbar.defs.js +0 -60
- package/esm2022/lib/toolbar/editor-toolbar.defs.js.map +0 -1
- package/esm2022/lib/toolbar/editor-toolbar.js +0 -826
- package/esm2022/lib/toolbar/editor-toolbar.js.map +0 -1
- package/esm2022/lib/toolbar/editor-undo-redo.js +0 -72
- package/esm2022/lib/toolbar/editor-undo-redo.js.map +0 -1
- package/esm2022/lib/toolbar/editor-zoom.js +0 -330
- package/esm2022/lib/toolbar/editor-zoom.js.map +0 -1
- package/esm2022/lib/upload/editor-image-upload-coordinator.js +0 -480
- package/esm2022/lib/upload/editor-image-upload-coordinator.js.map +0 -1
- package/esm2022/malva-ui-editor.js +0 -5
- package/esm2022/malva-ui-editor.js.map +0 -1
- package/index.d.ts +0 -35
- package/lib/ai/editor-ai-actions.d.ts +0 -27
- package/lib/ai/editor-ai-context.d.ts +0 -307
- package/lib/ai/editor-ai-menu.d.ts +0 -142
- package/lib/ai/editor-ai-review-bar.d.ts +0 -116
- package/lib/ai/editor-ai-stream.d.ts +0 -207
- package/lib/ai/editor-ai-suggestions.d.ts +0 -219
- package/lib/ai/editor-ai.tokens.d.ts +0 -10
- package/lib/ai/editor-ai.types.d.ts +0 -176
- package/lib/editor/editor.d.ts +0 -243
- package/lib/editor-extension-preflight.d.ts +0 -23
- package/lib/editor-serialization.d.ts +0 -74
- package/lib/editor-toolbar-context.d.ts +0 -116
- package/lib/editor.tokens.d.ts +0 -6
- package/lib/editor.types.d.ts +0 -194
- package/lib/extensions/editor-block-handle.d.ts +0 -59
- package/lib/extensions/editor-extensions.d.ts +0 -165
- package/lib/extensions/editor-markdown-compatibility.d.ts +0 -11
- package/lib/extensions/editor-upload-placeholder.d.ts +0 -75
- package/lib/status/editor-status.d.ts +0 -24
- package/lib/toolbar/editor-alignment.d.ts +0 -61
- package/lib/toolbar/editor-block-insert.d.ts +0 -26
- package/lib/toolbar/editor-color-control.d.ts +0 -32
- package/lib/toolbar/editor-command-button.d.ts +0 -29
- package/lib/toolbar/editor-heading.d.ts +0 -68
- package/lib/toolbar/editor-highlight.d.ts +0 -21
- package/lib/toolbar/editor-image-upload-dialog.d.ts +0 -96
- package/lib/toolbar/editor-image-upload.d.ts +0 -71
- package/lib/toolbar/editor-inline-marks.d.ts +0 -30
- package/lib/toolbar/editor-link.d.ts +0 -78
- package/lib/toolbar/editor-list.d.ts +0 -67
- package/lib/toolbar/editor-table.d.ts +0 -133
- package/lib/toolbar/editor-text-color.d.ts +0 -21
- package/lib/toolbar/editor-toolbar-widget.d.ts +0 -19
- package/lib/toolbar/editor-toolbar.d.ts +0 -157
- package/lib/toolbar/editor-toolbar.defs.d.ts +0 -35
- package/lib/toolbar/editor-undo-redo.d.ts +0 -26
- package/lib/toolbar/editor-zoom.d.ts +0 -108
- package/lib/upload/editor-image-upload-coordinator.d.ts +0 -55
- package/malva-ui-editor.d.ts +0 -5
|
@@ -1,289 +0,0 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, Component, computed, DestroyRef, effect, ElementRef, inject, signal, ViewEncapsulation, } from '@angular/core';
|
|
2
|
-
import { MlvButton } from '@malva-ui/core/button';
|
|
3
|
-
import { MlvDialog, MlvDialogBody, MlvDialogFooter, MlvDialogHeader, MlvDialogRef, } from '@malva-ui/core/dialog';
|
|
4
|
-
import { MlvFileUpload, } from '@malva-ui/core/file-upload';
|
|
5
|
-
import { MlvInput } from '@malva-ui/core/input';
|
|
6
|
-
import { MlvProgress } from '@malva-ui/core/progress';
|
|
7
|
-
import { MlvSwitch } from '@malva-ui/core/switch';
|
|
8
|
-
import { MLV_EDITOR_I18N, MLV_FILE_UPLOAD_I18N } from '@malva-ui/i18n';
|
|
9
|
-
import { MLV_EDITOR_TOOLBAR_CONTEXT } from '../editor-toolbar-context';
|
|
10
|
-
import { MLV_EDITOR_OVERLAY_REGISTRY } from '../editor-toolbar-context';
|
|
11
|
-
import { MLV_EDITOR_IMAGE_UPLOAD_COORDINATOR } from '../upload/editor-image-upload-coordinator';
|
|
12
|
-
import * as i0 from "@angular/core";
|
|
13
|
-
/**
|
|
14
|
-
* Malva modal content for selecting and uploading one editor image. Renders
|
|
15
|
-
* the dialog surface itself; the header title comes from the service config
|
|
16
|
-
* (`title`).
|
|
17
|
-
*/
|
|
18
|
-
export class MlvEditorImageUploadDialog {
|
|
19
|
-
/** @protected The exact editor-scoped upload coordinator. */
|
|
20
|
-
_coordinator = inject(MLV_EDITOR_IMAGE_UPLOAD_COORDINATOR);
|
|
21
|
-
/** @private Current editor state guarding mutation. */
|
|
22
|
-
_context = inject(MLV_EDITOR_TOOLBAR_CONTEXT);
|
|
23
|
-
/** @private Service-owned dialog lifecycle. */
|
|
24
|
-
_dialogRef = inject((MlvDialogRef));
|
|
25
|
-
/** @private Dialog content root registered inside the editor focus composite. */
|
|
26
|
-
_host = inject(ElementRef);
|
|
27
|
-
/** @private Editor-owned overlay registry for composite focus and teardown. */
|
|
28
|
-
_overlays = inject(MLV_EDITOR_OVERLAY_REGISTRY);
|
|
29
|
-
/** @private Component lifecycle for preview cleanup. */
|
|
30
|
-
_destroyRef = inject(DestroyRef);
|
|
31
|
-
/** @private Optional localized editor copy. */
|
|
32
|
-
_i18n = inject(MLV_EDITOR_I18N, { optional: true });
|
|
33
|
-
/** @private File-upload copy used for its localized remove action. */
|
|
34
|
-
_fileI18n = inject(MLV_FILE_UPLOAD_I18N);
|
|
35
|
-
/** @protected Selected descriptor retained as a single-file list. */
|
|
36
|
-
_files = signal([], /* @ts-ignore */
|
|
37
|
-
...(ngDevMode ? [{ debugName: "_files" }] : /* istanbul ignore next */ []));
|
|
38
|
-
/** @protected Single current selected descriptor. */
|
|
39
|
-
_file = computed(() => this._files()[0], /* @ts-ignore */
|
|
40
|
-
...(ngDevMode ? [{ debugName: "_file" }] : /* istanbul ignore next */ []));
|
|
41
|
-
/** @protected Alternative-text draft. */
|
|
42
|
-
_alt = signal('', /* @ts-ignore */
|
|
43
|
-
...(ngDevMode ? [{ debugName: "_alt" }] : /* istanbul ignore next */ []));
|
|
44
|
-
/** @protected Optional title draft. */
|
|
45
|
-
_title = signal('', /* @ts-ignore */
|
|
46
|
-
...(ngDevMode ? [{ debugName: "_title" }] : /* istanbul ignore next */ []));
|
|
47
|
-
/** @protected Whether the image is intentionally decorative. */
|
|
48
|
-
_decorative = signal(false, /* @ts-ignore */
|
|
49
|
-
...(ngDevMode ? [{ debugName: "_decorative" }] : /* istanbul ignore next */ []));
|
|
50
|
-
/** @protected Whether alt validation has been requested. */
|
|
51
|
-
_altInvalid = signal(false, /* @ts-ignore */
|
|
52
|
-
...(ngDevMode ? [{ debugName: "_altInvalid" }] : /* istanbul ignore next */ []));
|
|
53
|
-
/** @protected Stable coordinator ID for the submitted file. */
|
|
54
|
-
_activeId = signal(null, /* @ts-ignore */
|
|
55
|
-
...(ngDevMode ? [{ debugName: "_activeId" }] : /* istanbul ignore next */ []));
|
|
56
|
-
/** @protected Current matching coordinator item. */
|
|
57
|
-
_item = computed(() => {
|
|
58
|
-
const id = this._activeId();
|
|
59
|
-
return id
|
|
60
|
-
? this._coordinator.pending().find((candidate) => candidate.id === id)
|
|
61
|
-
: undefined;
|
|
62
|
-
}, /* @ts-ignore */
|
|
63
|
-
...(ngDevMode ? [{ debugName: "_item" }] : /* istanbul ignore next */ []));
|
|
64
|
-
/** @protected Polite dialog upload announcement. */
|
|
65
|
-
_announcement = signal('', /* @ts-ignore */
|
|
66
|
-
...(ngDevMode ? [{ debugName: "_announcement" }] : /* istanbul ignore next */ []));
|
|
67
|
-
/** @private Whether closing follows successful completion. */
|
|
68
|
-
_completed = false;
|
|
69
|
-
/** @private Releases live dialog ownership for the current upload. */
|
|
70
|
-
_releaseDialogOwnership;
|
|
71
|
-
/** @private Last preview URL whose lifecycle remains dialog-owned. */
|
|
72
|
-
_ownedPreviewUrl;
|
|
73
|
-
/** @private Last announced ten-percent bucket. */
|
|
74
|
-
_progressBucket = -1;
|
|
75
|
-
/** @protected Current accept string bound to Malva FileUpload. */
|
|
76
|
-
_accept = computed(() => this._coordinator.options().accept.join(','), /* @ts-ignore */
|
|
77
|
-
...(ngDevMode ? [{ debugName: "_accept" }] : /* istanbul ignore next */ []));
|
|
78
|
-
/** @protected Current maximum bytes bound to Malva FileUpload. */
|
|
79
|
-
_maxSize = computed(() => this._coordinator.options().maxSize, /* @ts-ignore */
|
|
80
|
-
...(ngDevMode ? [{ debugName: "_maxSize" }] : /* istanbul ignore next */ []));
|
|
81
|
-
/** @protected Whether all dialog inputs/actions are blocked. */
|
|
82
|
-
_disabled = computed(() => this._context.disabled() ||
|
|
83
|
-
this._context.readonly() ||
|
|
84
|
-
!this._coordinator.available(), /* @ts-ignore */
|
|
85
|
-
...(ngDevMode ? [{ debugName: "_disabled" }] : /* istanbul ignore next */ []));
|
|
86
|
-
/** @protected Whether upload can begin exactly once. */
|
|
87
|
-
_submitDisabled = computed(() => this._disabled() || !this._file() || !!this._activeId(), /* @ts-ignore */
|
|
88
|
-
...(ngDevMode ? [{ debugName: "_submitDisabled" }] : /* istanbul ignore next */ []));
|
|
89
|
-
/** @protected Meaningful preview alt, empty only for decorative images. */
|
|
90
|
-
_previewAlt = computed(() => this._decorative()
|
|
91
|
-
? ''
|
|
92
|
-
: this._alt().trim() || this._file()?.name || 'Selected image', /* @ts-ignore */
|
|
93
|
-
...(ngDevMode ? [{ debugName: "_previewAlt" }] : /* istanbul ignore next */ []));
|
|
94
|
-
/** @protected Reactive localized dialog copy. */
|
|
95
|
-
_copy = computed(() => {
|
|
96
|
-
const copy = this._i18n?.();
|
|
97
|
-
return {
|
|
98
|
-
title: copy?.uploadImage ?? 'Upload image',
|
|
99
|
-
alt: copy?.imageAltText ?? 'Alternative text',
|
|
100
|
-
imageTitle: copy?.imageTitle ?? 'Image title',
|
|
101
|
-
altRequired: copy?.imageAltRequired ?? 'Alternative text is required.',
|
|
102
|
-
decorative: copy?.decorativeImage ?? 'Decorative image',
|
|
103
|
-
failed: copy?.imageUploadFailed ?? 'Image upload failed.',
|
|
104
|
-
cancel: copy?.cancelUpload ?? 'Cancel upload',
|
|
105
|
-
retry: copy?.retryUpload ?? 'Retry upload',
|
|
106
|
-
progress: copy?.uploadProgress ?? 'Uploading image: {progress}%',
|
|
107
|
-
};
|
|
108
|
-
}, /* @ts-ignore */
|
|
109
|
-
...(ngDevMode ? [{ debugName: "_copy" }] : /* istanbul ignore next */ []));
|
|
110
|
-
constructor() {
|
|
111
|
-
const unregisterOverlay = this._overlays.register(this._host.nativeElement, () => this._dialogRef.close());
|
|
112
|
-
effect(() => {
|
|
113
|
-
const url = this._file()?.previewUrl;
|
|
114
|
-
if (url && url !== this._ownedPreviewUrl) {
|
|
115
|
-
// MlvFileUpload revokes a replaced/removed descriptor itself.
|
|
116
|
-
this._ownedPreviewUrl = url;
|
|
117
|
-
}
|
|
118
|
-
});
|
|
119
|
-
effect(() => {
|
|
120
|
-
if (this._context.disabled() || this._context.readonly()) {
|
|
121
|
-
this._dialogRef.close();
|
|
122
|
-
}
|
|
123
|
-
});
|
|
124
|
-
effect(() => {
|
|
125
|
-
const id = this._activeId();
|
|
126
|
-
if (!id)
|
|
127
|
-
return;
|
|
128
|
-
const item = this._item();
|
|
129
|
-
if (!item)
|
|
130
|
-
return;
|
|
131
|
-
if (item.status === 'failed') {
|
|
132
|
-
this._announcement.set(this._copy().failed);
|
|
133
|
-
this._progressBucket = -1;
|
|
134
|
-
return;
|
|
135
|
-
}
|
|
136
|
-
const bucket = Math.floor(item.progress / 10) * 10;
|
|
137
|
-
if (bucket !== this._progressBucket) {
|
|
138
|
-
this._progressBucket = bucket;
|
|
139
|
-
this._announcement.set(this._progressLabel(bucket));
|
|
140
|
-
}
|
|
141
|
-
});
|
|
142
|
-
const stopTerminalEvents = this._coordinator.onTerminal(({ id, reason }) => {
|
|
143
|
-
if (id !== this._activeId())
|
|
144
|
-
return;
|
|
145
|
-
if (reason === 'success') {
|
|
146
|
-
this._completed = true;
|
|
147
|
-
this._announcement.set(this._fileI18n().uploadComplete);
|
|
148
|
-
this._dialogRef.close();
|
|
149
|
-
return;
|
|
150
|
-
}
|
|
151
|
-
if (reason === 'cancelled') {
|
|
152
|
-
this._announcement.set(this._copy().cancel);
|
|
153
|
-
this._reset();
|
|
154
|
-
return;
|
|
155
|
-
}
|
|
156
|
-
if (reason === 'lifecycle-abort') {
|
|
157
|
-
this._reset();
|
|
158
|
-
this._dialogRef.close();
|
|
159
|
-
return;
|
|
160
|
-
}
|
|
161
|
-
this._reset();
|
|
162
|
-
});
|
|
163
|
-
this._dialogRef.beforeClose().subscribe(() => {
|
|
164
|
-
const id = this._activeId();
|
|
165
|
-
const item = this._item();
|
|
166
|
-
if (!this._completed &&
|
|
167
|
-
id &&
|
|
168
|
-
item?.status === 'uploading' &&
|
|
169
|
-
!this._context.disabled() &&
|
|
170
|
-
!this._context.readonly()) {
|
|
171
|
-
this._coordinator.cancel(id);
|
|
172
|
-
}
|
|
173
|
-
this._releaseOwnership();
|
|
174
|
-
this._revokeOwnedPreview();
|
|
175
|
-
});
|
|
176
|
-
this._destroyRef.onDestroy(() => {
|
|
177
|
-
stopTerminalEvents();
|
|
178
|
-
unregisterOverlay();
|
|
179
|
-
this._releaseOwnership();
|
|
180
|
-
this._revokeOwnedPreview();
|
|
181
|
-
});
|
|
182
|
-
}
|
|
183
|
-
/** @protected Retains only the current Malva selected descriptor. */
|
|
184
|
-
_onFilesChange(files) {
|
|
185
|
-
const retained = files.slice(-1);
|
|
186
|
-
const previousUrl = this._file()?.previewUrl;
|
|
187
|
-
if (previousUrl &&
|
|
188
|
-
!retained.some(({ previewUrl }) => previewUrl === previousUrl)) {
|
|
189
|
-
// FileUpload already revoked a descriptor it removed or replaced.
|
|
190
|
-
this._ownedPreviewUrl = undefined;
|
|
191
|
-
}
|
|
192
|
-
this._files.set(retained);
|
|
193
|
-
this._altInvalid.set(false);
|
|
194
|
-
}
|
|
195
|
-
/** @protected Begins exactly one normalized button upload. */
|
|
196
|
-
_submit() {
|
|
197
|
-
const selected = this._file();
|
|
198
|
-
if (!selected || this._activeId())
|
|
199
|
-
return;
|
|
200
|
-
const alt = this._decorative() ? '' : this._alt().trim();
|
|
201
|
-
if (!this._decorative() && !alt) {
|
|
202
|
-
this._altInvalid.set(true);
|
|
203
|
-
return;
|
|
204
|
-
}
|
|
205
|
-
this._altInvalid.set(false);
|
|
206
|
-
const title = this._title().trim();
|
|
207
|
-
const ids = this._coordinator.start([selected.file], 'button', {
|
|
208
|
-
alt,
|
|
209
|
-
...(title ? { title } : {}),
|
|
210
|
-
});
|
|
211
|
-
const id = ids[0];
|
|
212
|
-
if (!id)
|
|
213
|
-
return;
|
|
214
|
-
this._activeId.set(id);
|
|
215
|
-
this._releaseDialogOwnership = this._coordinator.claimDialogOwnership(id);
|
|
216
|
-
this._progressBucket = 0;
|
|
217
|
-
this._announcement.set(this._progressLabel(0));
|
|
218
|
-
}
|
|
219
|
-
/** @protected Cancels the current request and clears the dialog draft. */
|
|
220
|
-
_cancel() {
|
|
221
|
-
const id = this._activeId();
|
|
222
|
-
if (!id)
|
|
223
|
-
return;
|
|
224
|
-
this._coordinator.cancel(id);
|
|
225
|
-
}
|
|
226
|
-
/** @protected Retries the retained failed request. */
|
|
227
|
-
_retry() {
|
|
228
|
-
const id = this._activeId();
|
|
229
|
-
if (!id)
|
|
230
|
-
return;
|
|
231
|
-
this._progressBucket = -1;
|
|
232
|
-
this._coordinator.retry(id);
|
|
233
|
-
}
|
|
234
|
-
/** @protected Removes the failed item and clears the draft. */
|
|
235
|
-
_remove() {
|
|
236
|
-
const id = this._activeId();
|
|
237
|
-
if (!id)
|
|
238
|
-
return;
|
|
239
|
-
this._coordinator.remove(id);
|
|
240
|
-
}
|
|
241
|
-
/** @protected Creates a localized remove action label. */
|
|
242
|
-
_removeLabel() {
|
|
243
|
-
return this._fileI18n().removeFile.replace('{name}', this._file()?.name ?? '');
|
|
244
|
-
}
|
|
245
|
-
/** @protected Formats localized coarse progress. */
|
|
246
|
-
_progressLabel(progress) {
|
|
247
|
-
return this._copy().progress.replace('{progress}', String(progress));
|
|
248
|
-
}
|
|
249
|
-
/** @private Clears selected state and revokes the remaining preview once. */
|
|
250
|
-
_reset() {
|
|
251
|
-
this._releaseOwnership();
|
|
252
|
-
this._revokeOwnedPreview();
|
|
253
|
-
this._files.set([]);
|
|
254
|
-
this._activeId.set(null);
|
|
255
|
-
this._alt.set('');
|
|
256
|
-
this._title.set('');
|
|
257
|
-
this._decorative.set(false);
|
|
258
|
-
this._altInvalid.set(false);
|
|
259
|
-
}
|
|
260
|
-
/** @private Releases live dialog ownership exactly once. */
|
|
261
|
-
_releaseOwnership() {
|
|
262
|
-
this._releaseDialogOwnership?.();
|
|
263
|
-
this._releaseDialogOwnership = undefined;
|
|
264
|
-
}
|
|
265
|
-
/** @private Revokes the still-owned current URL at most once. */
|
|
266
|
-
_revokeOwnedPreview() {
|
|
267
|
-
const url = this._ownedPreviewUrl;
|
|
268
|
-
this._ownedPreviewUrl = undefined;
|
|
269
|
-
if (url)
|
|
270
|
-
URL.revokeObjectURL(url);
|
|
271
|
-
}
|
|
272
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvEditorImageUploadDialog, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
273
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: MlvEditorImageUploadDialog, isStandalone: true, selector: "mlv-editor-image-upload-dialog", host: { classAttribute: "mlv-editor-image-upload-dialog" }, ngImport: i0, template: "<mlv-dialog>\n <mlv-dialog-header />\n <mlv-dialog-body>\n <div class=\"mlv-editor-image-upload-dialog__body\">\n <mlv-file-upload\n [accept]=\"_accept()\"\n [maxSize]=\"_maxSize()\"\n [multiple]=\"false\"\n [disabled]=\"_disabled() || !!_activeId()\"\n [value]=\"_files()\"\n (filesChange)=\"_onFilesChange($event)\"\n />\n\n @if (_file(); as selected) { @if (selected.previewUrl) {\n <img\n class=\"mlv-editor-image-upload-dialog__preview\"\n [src]=\"selected.previewUrl\"\n [alt]=\"_previewAlt()\"\n />\n } @if (_item(); as item) { @if (item.status === 'uploading') {\n <mlv-progress\n [value]=\"item.progress\"\n [showPercentage]=\"true\"\n [ariaLabel]=\"_progressLabel(item.progress)\"\n />\n } @else {\n <p\n class=\"mlv-editor-image-upload-dialog__error\"\n role=\"alert\"\n aria-live=\"assertive\"\n >\n {{ _copy().failed }}\n </p>\n } } }\n\n <mlv-input\n [label]=\"_copy().alt\"\n [ariaLabel]=\"_copy().alt\"\n [value]=\"_alt()\"\n [disabled]=\"_disabled() || !!_activeId() || _decorative()\"\n [state]=\"_altInvalid() ? 'error' : 'default'\"\n [message]=\"_altInvalid() ? _copy().altRequired : ''\"\n (valueChange)=\"_alt.set($event)\"\n />\n <mlv-input\n [label]=\"_copy().imageTitle\"\n [ariaLabel]=\"_copy().imageTitle\"\n [value]=\"_title()\"\n [disabled]=\"_disabled() || !!_activeId()\"\n (valueChange)=\"_title.set($event)\"\n />\n <mlv-switch\n [ariaLabel]=\"_copy().decorative\"\n [checked]=\"_decorative()\"\n [disabled]=\"_disabled() || !!_activeId()\"\n (checkedChange)=\"_decorative.set($event)\"\n >\n {{ _copy().decorative }}\n </mlv-switch>\n\n <span\n class=\"mlv-editor-image-upload-dialog__live\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >{{ _announcement() }}</span\n >\n </div>\n </mlv-dialog-body>\n\n <mlv-dialog-footer>\n @if (_item()?.status === 'uploading') {\n <button\n mlvButton\n type=\"button\"\n variant=\"secondary\"\n [attr.aria-label]=\"_copy().cancel\"\n (click)=\"_cancel()\"\n >\n {{ _copy().cancel }}\n </button>\n } @else if (_item()?.status === 'failed') {\n <button\n mlvButton\n type=\"button\"\n variant=\"primary\"\n [attr.aria-label]=\"_copy().retry\"\n [disabled]=\"_disabled()\"\n (click)=\"_retry()\"\n >\n {{ _copy().retry }}\n </button>\n <button\n mlvButton\n type=\"button\"\n variant=\"secondary\"\n [attr.aria-label]=\"_removeLabel()\"\n [disabled]=\"_disabled()\"\n (click)=\"_remove()\"\n >\n {{ _removeLabel() }}\n </button>\n } @else {\n <button\n mlvButton\n type=\"button\"\n variant=\"primary\"\n [attr.aria-label]=\"_copy().title\"\n [disabled]=\"_submitDisabled()\"\n (click)=\"_submit()\"\n >\n {{ _copy().title }}\n </button>\n }\n </mlv-dialog-footer>\n</mlv-dialog>\n", styles: [".mlv-editor-image-upload-dialog{box-sizing:border-box;padding:0;margin:0;font-family:var(--mlv-typography-family-text);font-size:var(--mlv-font-size-m)}.mlv-editor-image-upload-dialog *{box-sizing:border-box}.mlv-editor-image-upload-dialog__body{display:grid;gap:var(--mlv-spacing-2)}.mlv-editor-image-upload-dialog__preview{display:block;max-block-size:12rem;max-inline-size:100%;margin-inline:auto;border-radius:var(--mlv-radius-card);object-fit:contain}.mlv-editor-image-upload-dialog__error{margin:0;color:var(--mlv-text-negative)}.mlv-editor-image-upload-dialog__live{position:absolute;width:.0625rem;height:.0625rem;overflow:hidden;clip-path:inset(50%);white-space:nowrap}.mlv-editor-image-upload-status{box-sizing:border-box;padding:0;margin:0;font-family:var(--mlv-typography-family-text);font-size:var(--mlv-font-size-m)}.mlv-editor-image-upload-status *{box-sizing:border-box}.mlv-editor-image-upload-status{display:block;padding:0 var(--mlv-spacing-4) var(--mlv-spacing-2)}.mlv-editor-image-upload-status__list{display:grid;gap:var(--mlv-spacing-1-5);padding:0;margin:0;list-style:none}.mlv-editor-image-upload-status__item{display:grid;grid-template-columns:minmax(0,1fr) minmax(8rem,2fr) auto auto;align-items:center;gap:var(--mlv-spacing-3)}.mlv-editor-image-upload-status__name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mlv-editor-image-upload-status__live{position:absolute;width:.0625rem;height:.0625rem;overflow:hidden;clip-path:inset(50%);white-space:nowrap}\n"], dependencies: [{ kind: "component", type: MlvButton, selector: "button[mlvButton], a[mlvButton]", inputs: ["variant", "shape", "disabled", "loading"] }, { kind: "component", type: MlvDialog, selector: "mlv-dialog" }, { kind: "component", type: MlvDialogBody, selector: "mlv-dialog-body, [mlvDialogBody]" }, { kind: "component", type: MlvDialogFooter, selector: "mlv-dialog-footer, [mlvDialogFooter]", inputs: ["align"] }, { kind: "component", type: MlvDialogHeader, selector: "mlv-dialog-header, [mlvDialogHeader]", inputs: ["title", "closable"] }, { kind: "component", type: MlvFileUpload, selector: "mlv-file-upload", inputs: ["value", "accept", "maxSize", "multiple", "title", "subtitle", "actionLabel", "compact", "previewMode"], outputs: ["valueChange", "filesChange"] }, { kind: "component", type: MlvInput, selector: "mlv-input", inputs: ["type", "placeholder", "autocomplete", "inputMode", "maxLength", "minLength", "pattern", "name", "autofocus", "min", "max", "step", "bare", "projectControl", "role", "ariaExpanded", "ariaHasPopup", "ariaAutocomplete", "ariaControls", "ariaActiveDescendant", "ariaDescribedBy", "value"], outputs: ["valueChange", "inputFocus", "inputBlur"] }, { kind: "component", type: MlvProgress, selector: "mlv-progress", inputs: ["shape", "value", "size", "tone", "showPercentage", "ariaLabel"] }, { kind: "component", type: MlvSwitch, selector: "mlv-switch", inputs: ["ariaLabelledBy", "checked"], outputs: ["checkedChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
274
|
-
}
|
|
275
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvEditorImageUploadDialog, decorators: [{
|
|
276
|
-
type: Component,
|
|
277
|
-
args: [{ selector: 'mlv-editor-image-upload-dialog', imports: [
|
|
278
|
-
MlvButton,
|
|
279
|
-
MlvDialog,
|
|
280
|
-
MlvDialogBody,
|
|
281
|
-
MlvDialogFooter,
|
|
282
|
-
MlvDialogHeader,
|
|
283
|
-
MlvFileUpload,
|
|
284
|
-
MlvInput,
|
|
285
|
-
MlvProgress,
|
|
286
|
-
MlvSwitch,
|
|
287
|
-
], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'mlv-editor-image-upload-dialog' }, template: "<mlv-dialog>\n <mlv-dialog-header />\n <mlv-dialog-body>\n <div class=\"mlv-editor-image-upload-dialog__body\">\n <mlv-file-upload\n [accept]=\"_accept()\"\n [maxSize]=\"_maxSize()\"\n [multiple]=\"false\"\n [disabled]=\"_disabled() || !!_activeId()\"\n [value]=\"_files()\"\n (filesChange)=\"_onFilesChange($event)\"\n />\n\n @if (_file(); as selected) { @if (selected.previewUrl) {\n <img\n class=\"mlv-editor-image-upload-dialog__preview\"\n [src]=\"selected.previewUrl\"\n [alt]=\"_previewAlt()\"\n />\n } @if (_item(); as item) { @if (item.status === 'uploading') {\n <mlv-progress\n [value]=\"item.progress\"\n [showPercentage]=\"true\"\n [ariaLabel]=\"_progressLabel(item.progress)\"\n />\n } @else {\n <p\n class=\"mlv-editor-image-upload-dialog__error\"\n role=\"alert\"\n aria-live=\"assertive\"\n >\n {{ _copy().failed }}\n </p>\n } } }\n\n <mlv-input\n [label]=\"_copy().alt\"\n [ariaLabel]=\"_copy().alt\"\n [value]=\"_alt()\"\n [disabled]=\"_disabled() || !!_activeId() || _decorative()\"\n [state]=\"_altInvalid() ? 'error' : 'default'\"\n [message]=\"_altInvalid() ? _copy().altRequired : ''\"\n (valueChange)=\"_alt.set($event)\"\n />\n <mlv-input\n [label]=\"_copy().imageTitle\"\n [ariaLabel]=\"_copy().imageTitle\"\n [value]=\"_title()\"\n [disabled]=\"_disabled() || !!_activeId()\"\n (valueChange)=\"_title.set($event)\"\n />\n <mlv-switch\n [ariaLabel]=\"_copy().decorative\"\n [checked]=\"_decorative()\"\n [disabled]=\"_disabled() || !!_activeId()\"\n (checkedChange)=\"_decorative.set($event)\"\n >\n {{ _copy().decorative }}\n </mlv-switch>\n\n <span\n class=\"mlv-editor-image-upload-dialog__live\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >{{ _announcement() }}</span\n >\n </div>\n </mlv-dialog-body>\n\n <mlv-dialog-footer>\n @if (_item()?.status === 'uploading') {\n <button\n mlvButton\n type=\"button\"\n variant=\"secondary\"\n [attr.aria-label]=\"_copy().cancel\"\n (click)=\"_cancel()\"\n >\n {{ _copy().cancel }}\n </button>\n } @else if (_item()?.status === 'failed') {\n <button\n mlvButton\n type=\"button\"\n variant=\"primary\"\n [attr.aria-label]=\"_copy().retry\"\n [disabled]=\"_disabled()\"\n (click)=\"_retry()\"\n >\n {{ _copy().retry }}\n </button>\n <button\n mlvButton\n type=\"button\"\n variant=\"secondary\"\n [attr.aria-label]=\"_removeLabel()\"\n [disabled]=\"_disabled()\"\n (click)=\"_remove()\"\n >\n {{ _removeLabel() }}\n </button>\n } @else {\n <button\n mlvButton\n type=\"button\"\n variant=\"primary\"\n [attr.aria-label]=\"_copy().title\"\n [disabled]=\"_submitDisabled()\"\n (click)=\"_submit()\"\n >\n {{ _copy().title }}\n </button>\n }\n </mlv-dialog-footer>\n</mlv-dialog>\n", styles: [".mlv-editor-image-upload-dialog{box-sizing:border-box;padding:0;margin:0;font-family:var(--mlv-typography-family-text);font-size:var(--mlv-font-size-m)}.mlv-editor-image-upload-dialog *{box-sizing:border-box}.mlv-editor-image-upload-dialog__body{display:grid;gap:var(--mlv-spacing-2)}.mlv-editor-image-upload-dialog__preview{display:block;max-block-size:12rem;max-inline-size:100%;margin-inline:auto;border-radius:var(--mlv-radius-card);object-fit:contain}.mlv-editor-image-upload-dialog__error{margin:0;color:var(--mlv-text-negative)}.mlv-editor-image-upload-dialog__live{position:absolute;width:.0625rem;height:.0625rem;overflow:hidden;clip-path:inset(50%);white-space:nowrap}.mlv-editor-image-upload-status{box-sizing:border-box;padding:0;margin:0;font-family:var(--mlv-typography-family-text);font-size:var(--mlv-font-size-m)}.mlv-editor-image-upload-status *{box-sizing:border-box}.mlv-editor-image-upload-status{display:block;padding:0 var(--mlv-spacing-4) var(--mlv-spacing-2)}.mlv-editor-image-upload-status__list{display:grid;gap:var(--mlv-spacing-1-5);padding:0;margin:0;list-style:none}.mlv-editor-image-upload-status__item{display:grid;grid-template-columns:minmax(0,1fr) minmax(8rem,2fr) auto auto;align-items:center;gap:var(--mlv-spacing-3)}.mlv-editor-image-upload-status__name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mlv-editor-image-upload-status__live{position:absolute;width:.0625rem;height:.0625rem;overflow:hidden;clip-path:inset(50%);white-space:nowrap}\n"] }]
|
|
288
|
-
}], ctorParameters: () => [] });
|
|
289
|
-
//# sourceMappingURL=editor-image-upload-dialog.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"editor-image-upload-dialog.js","sourceRoot":"","sources":["../../../../../../libs/editor/src/lib/toolbar/editor-image-upload-dialog.ts","../../../../../../libs/editor/src/lib/toolbar/editor-image-upload-dialog.html"],"names":[],"mappings":"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","sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n effect,\n ElementRef,\n inject,\n signal,\n ViewEncapsulation,\n} from '@angular/core';\nimport { MlvButton } from '@malva-ui/core/button';\nimport {\n MlvDialog,\n MlvDialogBody,\n MlvDialogFooter,\n MlvDialogHeader,\n MlvDialogRef,\n} from '@malva-ui/core/dialog';\nimport {\n MlvFileUpload,\n type MlvUploadedFile,\n} from '@malva-ui/core/file-upload';\nimport { MlvInput } from '@malva-ui/core/input';\nimport { MlvProgress } from '@malva-ui/core/progress';\nimport { MlvSwitch } from '@malva-ui/core/switch';\nimport { MLV_EDITOR_I18N, MLV_FILE_UPLOAD_I18N } from '@malva-ui/i18n';\nimport { MLV_EDITOR_TOOLBAR_CONTEXT } from '../editor-toolbar-context';\nimport { MLV_EDITOR_OVERLAY_REGISTRY } from '../editor-toolbar-context';\nimport { MLV_EDITOR_IMAGE_UPLOAD_COORDINATOR } from '../upload/editor-image-upload-coordinator';\n\n/**\n * Malva modal content for selecting and uploading one editor image. Renders\n * the dialog surface itself; the header title comes from the service config\n * (`title`).\n */\n@Component({\n selector: 'mlv-editor-image-upload-dialog',\n imports: [\n MlvButton,\n MlvDialog,\n MlvDialogBody,\n MlvDialogFooter,\n MlvDialogHeader,\n MlvFileUpload,\n MlvInput,\n MlvProgress,\n MlvSwitch,\n ],\n templateUrl: './editor-image-upload-dialog.html',\n styleUrl: './editor-image-upload-dialog.scss',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'mlv-editor-image-upload-dialog' },\n})\nexport class MlvEditorImageUploadDialog {\n /** @protected The exact editor-scoped upload coordinator. */\n protected readonly _coordinator = inject(MLV_EDITOR_IMAGE_UPLOAD_COORDINATOR);\n\n /** @private Current editor state guarding mutation. */\n private readonly _context = inject(MLV_EDITOR_TOOLBAR_CONTEXT);\n\n /** @private Service-owned dialog lifecycle. */\n private readonly _dialogRef = inject(MlvDialogRef<void>);\n\n /** @private Dialog content root registered inside the editor focus composite. */\n private readonly _host = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /** @private Editor-owned overlay registry for composite focus and teardown. */\n private readonly _overlays = inject(MLV_EDITOR_OVERLAY_REGISTRY);\n\n /** @private Component lifecycle for preview cleanup. */\n private readonly _destroyRef = inject(DestroyRef);\n\n /** @private Optional localized editor copy. */\n private readonly _i18n = inject(MLV_EDITOR_I18N, { optional: true });\n\n /** @private File-upload copy used for its localized remove action. */\n private readonly _fileI18n = inject(MLV_FILE_UPLOAD_I18N);\n\n /** @protected Selected descriptor retained as a single-file list. */\n protected readonly _files = signal<MlvUploadedFile[]>([]);\n\n /** @protected Single current selected descriptor. */\n protected readonly _file = computed(() => this._files()[0]);\n\n /** @protected Alternative-text draft. */\n protected readonly _alt = signal('');\n\n /** @protected Optional title draft. */\n protected readonly _title = signal('');\n\n /** @protected Whether the image is intentionally decorative. */\n protected readonly _decorative = signal(false);\n\n /** @protected Whether alt validation has been requested. */\n protected readonly _altInvalid = signal(false);\n\n /** @protected Stable coordinator ID for the submitted file. */\n protected readonly _activeId = signal<string | null>(null);\n\n /** @protected Current matching coordinator item. */\n protected readonly _item = computed(() => {\n const id = this._activeId();\n return id\n ? this._coordinator.pending().find((candidate) => candidate.id === id)\n : undefined;\n });\n\n /** @protected Polite dialog upload announcement. */\n protected readonly _announcement = signal('');\n\n /** @private Whether closing follows successful completion. */\n private _completed = false;\n\n /** @private Releases live dialog ownership for the current upload. */\n private _releaseDialogOwnership: (() => void) | undefined;\n\n /** @private Last preview URL whose lifecycle remains dialog-owned. */\n private _ownedPreviewUrl: string | undefined;\n\n /** @private Last announced ten-percent bucket. */\n private _progressBucket = -1;\n\n /** @protected Current accept string bound to Malva FileUpload. */\n protected readonly _accept = computed(() =>\n this._coordinator.options().accept.join(','),\n );\n\n /** @protected Current maximum bytes bound to Malva FileUpload. */\n protected readonly _maxSize = computed(\n () => this._coordinator.options().maxSize,\n );\n\n /** @protected Whether all dialog inputs/actions are blocked. */\n protected readonly _disabled = computed(\n () =>\n this._context.disabled() ||\n this._context.readonly() ||\n !this._coordinator.available(),\n );\n\n /** @protected Whether upload can begin exactly once. */\n protected readonly _submitDisabled = computed(\n () => this._disabled() || !this._file() || !!this._activeId(),\n );\n\n /** @protected Meaningful preview alt, empty only for decorative images. */\n protected readonly _previewAlt = computed(() =>\n this._decorative()\n ? ''\n : this._alt().trim() || this._file()?.name || 'Selected image',\n );\n\n /** @protected Reactive localized dialog copy. */\n protected readonly _copy = computed(() => {\n const copy = this._i18n?.();\n return {\n title: copy?.uploadImage ?? 'Upload image',\n alt: copy?.imageAltText ?? 'Alternative text',\n imageTitle: copy?.imageTitle ?? 'Image title',\n altRequired: copy?.imageAltRequired ?? 'Alternative text is required.',\n decorative: copy?.decorativeImage ?? 'Decorative image',\n failed: copy?.imageUploadFailed ?? 'Image upload failed.',\n cancel: copy?.cancelUpload ?? 'Cancel upload',\n retry: copy?.retryUpload ?? 'Retry upload',\n progress: copy?.uploadProgress ?? 'Uploading image: {progress}%',\n };\n });\n\n constructor() {\n const unregisterOverlay = this._overlays.register(\n this._host.nativeElement,\n () => this._dialogRef.close(),\n );\n\n effect(() => {\n const url = this._file()?.previewUrl;\n if (url && url !== this._ownedPreviewUrl) {\n // MlvFileUpload revokes a replaced/removed descriptor itself.\n this._ownedPreviewUrl = url;\n }\n });\n\n effect(() => {\n if (this._context.disabled() || this._context.readonly()) {\n this._dialogRef.close();\n }\n });\n\n effect(() => {\n const id = this._activeId();\n if (!id) return;\n const item = this._item();\n if (!item) return;\n if (item.status === 'failed') {\n this._announcement.set(this._copy().failed);\n this._progressBucket = -1;\n return;\n }\n const bucket = Math.floor(item.progress / 10) * 10;\n if (bucket !== this._progressBucket) {\n this._progressBucket = bucket;\n this._announcement.set(this._progressLabel(bucket));\n }\n });\n\n const stopTerminalEvents = this._coordinator.onTerminal(\n ({ id, reason }) => {\n if (id !== this._activeId()) return;\n if (reason === 'success') {\n this._completed = true;\n this._announcement.set(this._fileI18n().uploadComplete);\n this._dialogRef.close();\n return;\n }\n if (reason === 'cancelled') {\n this._announcement.set(this._copy().cancel);\n this._reset();\n return;\n }\n if (reason === 'lifecycle-abort') {\n this._reset();\n this._dialogRef.close();\n return;\n }\n this._reset();\n },\n );\n\n this._dialogRef.beforeClose().subscribe(() => {\n const id = this._activeId();\n const item = this._item();\n if (\n !this._completed &&\n id &&\n item?.status === 'uploading' &&\n !this._context.disabled() &&\n !this._context.readonly()\n ) {\n this._coordinator.cancel(id);\n }\n this._releaseOwnership();\n this._revokeOwnedPreview();\n });\n this._destroyRef.onDestroy(() => {\n stopTerminalEvents();\n unregisterOverlay();\n this._releaseOwnership();\n this._revokeOwnedPreview();\n });\n }\n\n /** @protected Retains only the current Malva selected descriptor. */\n protected _onFilesChange(files: MlvUploadedFile[]): void {\n const retained = files.slice(-1);\n const previousUrl = this._file()?.previewUrl;\n if (\n previousUrl &&\n !retained.some(({ previewUrl }) => previewUrl === previousUrl)\n ) {\n // FileUpload already revoked a descriptor it removed or replaced.\n this._ownedPreviewUrl = undefined;\n }\n this._files.set(retained);\n this._altInvalid.set(false);\n }\n\n /** @protected Begins exactly one normalized button upload. */\n protected _submit(): void {\n const selected = this._file();\n if (!selected || this._activeId()) return;\n const alt = this._decorative() ? '' : this._alt().trim();\n if (!this._decorative() && !alt) {\n this._altInvalid.set(true);\n return;\n }\n this._altInvalid.set(false);\n const title = this._title().trim();\n const ids = this._coordinator.start([selected.file], 'button', {\n alt,\n ...(title ? { title } : {}),\n });\n const id = ids[0];\n if (!id) return;\n this._activeId.set(id);\n this._releaseDialogOwnership = this._coordinator.claimDialogOwnership(id);\n this._progressBucket = 0;\n this._announcement.set(this._progressLabel(0));\n }\n\n /** @protected Cancels the current request and clears the dialog draft. */\n protected _cancel(): void {\n const id = this._activeId();\n if (!id) return;\n this._coordinator.cancel(id);\n }\n\n /** @protected Retries the retained failed request. */\n protected _retry(): void {\n const id = this._activeId();\n if (!id) return;\n this._progressBucket = -1;\n this._coordinator.retry(id);\n }\n\n /** @protected Removes the failed item and clears the draft. */\n protected _remove(): void {\n const id = this._activeId();\n if (!id) return;\n this._coordinator.remove(id);\n }\n\n /** @protected Creates a localized remove action label. */\n protected _removeLabel(): string {\n return this._fileI18n().removeFile.replace(\n '{name}',\n this._file()?.name ?? '',\n );\n }\n\n /** @protected Formats localized coarse progress. */\n protected _progressLabel(progress: number): string {\n return this._copy().progress.replace('{progress}', String(progress));\n }\n\n /** @private Clears selected state and revokes the remaining preview once. */\n private _reset(): void {\n this._releaseOwnership();\n this._revokeOwnedPreview();\n this._files.set([]);\n this._activeId.set(null);\n this._alt.set('');\n this._title.set('');\n this._decorative.set(false);\n this._altInvalid.set(false);\n }\n\n /** @private Releases live dialog ownership exactly once. */\n private _releaseOwnership(): void {\n this._releaseDialogOwnership?.();\n this._releaseDialogOwnership = undefined;\n }\n\n /** @private Revokes the still-owned current URL at most once. */\n private _revokeOwnedPreview(): void {\n const url = this._ownedPreviewUrl;\n this._ownedPreviewUrl = undefined;\n if (url) URL.revokeObjectURL(url);\n }\n}\n","<mlv-dialog>\n <mlv-dialog-header />\n <mlv-dialog-body>\n <div class=\"mlv-editor-image-upload-dialog__body\">\n <mlv-file-upload\n [accept]=\"_accept()\"\n [maxSize]=\"_maxSize()\"\n [multiple]=\"false\"\n [disabled]=\"_disabled() || !!_activeId()\"\n [value]=\"_files()\"\n (filesChange)=\"_onFilesChange($event)\"\n />\n\n @if (_file(); as selected) { @if (selected.previewUrl) {\n <img\n class=\"mlv-editor-image-upload-dialog__preview\"\n [src]=\"selected.previewUrl\"\n [alt]=\"_previewAlt()\"\n />\n } @if (_item(); as item) { @if (item.status === 'uploading') {\n <mlv-progress\n [value]=\"item.progress\"\n [showPercentage]=\"true\"\n [ariaLabel]=\"_progressLabel(item.progress)\"\n />\n } @else {\n <p\n class=\"mlv-editor-image-upload-dialog__error\"\n role=\"alert\"\n aria-live=\"assertive\"\n >\n {{ _copy().failed }}\n </p>\n } } }\n\n <mlv-input\n [label]=\"_copy().alt\"\n [ariaLabel]=\"_copy().alt\"\n [value]=\"_alt()\"\n [disabled]=\"_disabled() || !!_activeId() || _decorative()\"\n [state]=\"_altInvalid() ? 'error' : 'default'\"\n [message]=\"_altInvalid() ? _copy().altRequired : ''\"\n (valueChange)=\"_alt.set($event)\"\n />\n <mlv-input\n [label]=\"_copy().imageTitle\"\n [ariaLabel]=\"_copy().imageTitle\"\n [value]=\"_title()\"\n [disabled]=\"_disabled() || !!_activeId()\"\n (valueChange)=\"_title.set($event)\"\n />\n <mlv-switch\n [ariaLabel]=\"_copy().decorative\"\n [checked]=\"_decorative()\"\n [disabled]=\"_disabled() || !!_activeId()\"\n (checkedChange)=\"_decorative.set($event)\"\n >\n {{ _copy().decorative }}\n </mlv-switch>\n\n <span\n class=\"mlv-editor-image-upload-dialog__live\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >{{ _announcement() }}</span\n >\n </div>\n </mlv-dialog-body>\n\n <mlv-dialog-footer>\n @if (_item()?.status === 'uploading') {\n <button\n mlvButton\n type=\"button\"\n variant=\"secondary\"\n [attr.aria-label]=\"_copy().cancel\"\n (click)=\"_cancel()\"\n >\n {{ _copy().cancel }}\n </button>\n } @else if (_item()?.status === 'failed') {\n <button\n mlvButton\n type=\"button\"\n variant=\"primary\"\n [attr.aria-label]=\"_copy().retry\"\n [disabled]=\"_disabled()\"\n (click)=\"_retry()\"\n >\n {{ _copy().retry }}\n </button>\n <button\n mlvButton\n type=\"button\"\n variant=\"secondary\"\n [attr.aria-label]=\"_removeLabel()\"\n [disabled]=\"_disabled()\"\n (click)=\"_remove()\"\n >\n {{ _removeLabel() }}\n </button>\n } @else {\n <button\n mlvButton\n type=\"button\"\n variant=\"primary\"\n [attr.aria-label]=\"_copy().title\"\n [disabled]=\"_submitDisabled()\"\n (click)=\"_submit()\"\n >\n {{ _copy().title }}\n </button>\n }\n </mlv-dialog-footer>\n</mlv-dialog>\n"]}
|