@bnsights/bbsf-controls 1.2.24 → 1.2.26
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 +38 -11
- package/fesm2022/bnsights-bbsf-controls.mjs +466 -208
- package/fesm2022/bnsights-bbsf-controls.mjs.map +1 -1
- package/lib/controls/LogoCropper/LogoCropper.component.d.ts +33 -0
- package/lib/controls/MarkdownEditor/markdown-editor.component.d.ts +56 -64
- package/lib/modules/bbsf-editors.module.d.ts +7 -9
- package/lib/modules/bbsf-uploads.module.d.ts +2 -1
- package/package.json +36 -7
- package/public-api.d.ts +1 -0
- package/src/lib/assets/Style.scss +7 -7
- package/src/lib/assets/ace-builds/ace.js +0 -23
- package/src/lib/assets/ace-builds/mode-markdown.js +0 -8
- package/src/lib/assets/ngx-markdown-editor/highlight.js/agate.min.css +0 -17
- package/src/lib/assets/ngx-markdown-editor/highlight.js/highlight.min.js +0 -2
- package/src/lib/assets/ngx-markdown-editor/marked.min.js +0 -6
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { Optional, Injectable, EventEmitter, Output, Input, Component, SkipSelf, CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA, NgModule, Pipe, ViewChild, HostListener, Directive, Self, Inject, ViewEncapsulation, forwardRef, ViewContainerRef, ViewChildren } from '@angular/core';
|
|
2
|
+
import { Optional, Injectable, EventEmitter, Output, Input, Component, SkipSelf, CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA, NgModule, Pipe, ViewChild, HostListener, Directive, Self, Inject, ViewEncapsulation, signal, computed, forwardRef, ViewContainerRef, ViewChildren } from '@angular/core';
|
|
3
3
|
import * as i5 from '@angular/common';
|
|
4
4
|
import { CommonModule, DatePipe, KeyValuePipe } from '@angular/common';
|
|
5
5
|
import * as i2 from '@angular/forms';
|
|
@@ -20,7 +20,7 @@ import * as i3 from '@bnsights/bbsf-utilities/ui';
|
|
|
20
20
|
import { UtilityService } from '@bnsights/bbsf-utilities/ui';
|
|
21
21
|
import * as i3$1 from '@bnsights/bbsf-utilities/http';
|
|
22
22
|
import { RequestOptionsModel } from '@bnsights/bbsf-utilities/http';
|
|
23
|
-
import { Subject, Subscription,
|
|
23
|
+
import { Subject, Subscription, Observable, noop as noop$1, of, EMPTY } from 'rxjs';
|
|
24
24
|
import * as i4 from '@bnsights/bbsf-utilities/translate';
|
|
25
25
|
import * as i6 from '@angular/material/slide-toggle';
|
|
26
26
|
import { MatSlideToggleModule } from '@angular/material/slide-toggle';
|
|
@@ -37,23 +37,31 @@ import Swal from 'sweetalert2/dist/sweetalert2.js';
|
|
|
37
37
|
import { plainToClass } from 'class-transformer';
|
|
38
38
|
import * as i1 from '@angular/common/http';
|
|
39
39
|
import { HttpEventType, HttpHeaders, HttpParams } from '@angular/common/http';
|
|
40
|
-
import * as i7$3 from 'ngx-markdown-editor';
|
|
41
|
-
import { LMarkdownEditorModule } from 'ngx-markdown-editor';
|
|
42
40
|
import * as i6$2 from '@kolkov/angular-editor';
|
|
43
41
|
import { AngularEditorModule } from '@kolkov/angular-editor';
|
|
44
|
-
import
|
|
45
|
-
import {
|
|
46
|
-
import
|
|
42
|
+
import { Editor } from '@tiptap/core';
|
|
43
|
+
import { Markdown } from '@tiptap/markdown';
|
|
44
|
+
import { CharacterCount } from '@tiptap/extension-character-count';
|
|
45
|
+
import { Table, TableRow, TableHeader, TableCell } from '@tiptap/extension-table';
|
|
46
|
+
import TaskItem from '@tiptap/extension-task-item';
|
|
47
|
+
import TaskList from '@tiptap/extension-task-list';
|
|
48
|
+
import { Typography } from '@tiptap/extension-typography';
|
|
49
|
+
import Underline from '@tiptap/extension-underline';
|
|
50
|
+
import StarterKit from '@tiptap/starter-kit';
|
|
51
|
+
import * as i7$3 from 'ngx-dropzone';
|
|
47
52
|
import { NgxDropzoneModule } from 'ngx-dropzone';
|
|
48
53
|
import * as i8 from 'angular-cropperjs';
|
|
49
54
|
import { AngularCropperjsModule } from 'angular-cropperjs';
|
|
50
|
-
import * as i5$
|
|
55
|
+
import * as i5$2 from 'ng2-file-upload';
|
|
51
56
|
import { FileUploader, FileUploadModule } from 'ng2-file-upload';
|
|
52
|
-
import { takeUntil, switchMap
|
|
53
|
-
import
|
|
57
|
+
import { takeUntil, switchMap, map, tap } from 'rxjs/operators';
|
|
58
|
+
import { ImageCropperComponent } from 'ngx-image-cropper';
|
|
59
|
+
import * as i7$4 from '@fullcalendar/angular';
|
|
54
60
|
import { FullCalendarModule } from '@fullcalendar/angular';
|
|
55
61
|
import * as i8$1 from '@angular/google-maps';
|
|
56
62
|
import { GoogleMapsModule } from '@angular/google-maps';
|
|
63
|
+
import * as i6$3 from 'ngx-script-loader';
|
|
64
|
+
import { ScriptLoaderModule } from 'ngx-script-loader';
|
|
57
65
|
import * as i9 from 'angular-ng-autocomplete';
|
|
58
66
|
import { AutocompleteLibModule } from 'angular-ng-autocomplete';
|
|
59
67
|
import { InfiniteScrollModule } from 'ngx-infinite-scroll';
|
|
@@ -6385,137 +6393,273 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.16", ngImpo
|
|
|
6385
6393
|
type: Output
|
|
6386
6394
|
}] } });
|
|
6387
6395
|
|
|
6388
|
-
|
|
6389
|
-
|
|
6390
|
-
|
|
6391
|
-
|
|
6392
|
-
|
|
6393
|
-
|
|
6394
|
-
|
|
6395
|
-
|
|
6396
|
-
|
|
6397
|
-
|
|
6398
|
-
|
|
6399
|
-
|
|
6400
|
-
|
|
6401
|
-
|
|
6402
|
-
|
|
6403
|
-
|
|
6404
|
-
|
|
6405
|
-
|
|
6406
|
-
|
|
6407
|
-
|
|
6396
|
+
const MARKDOWN_TOOLBAR_ITEMS = [
|
|
6397
|
+
'undo', 'redo', '|',
|
|
6398
|
+
'h1', 'h2', 'h3', '|',
|
|
6399
|
+
'bold', 'italic', 'underline', 'strike', 'code', '|',
|
|
6400
|
+
'bulletList', 'orderedList', 'taskList', '|',
|
|
6401
|
+
'blockquote', 'codeBlock', 'horizontalRule', 'table', '|',
|
|
6402
|
+
'link',
|
|
6403
|
+
];
|
|
6404
|
+
const TOOLBAR_BUTTONS = {
|
|
6405
|
+
undo: { icon: 'pi-undo', label: 'Undo', cmd: (editor) => editor.commands.undo() },
|
|
6406
|
+
redo: { icon: 'pi-refresh', label: 'Redo', cmd: (editor) => editor.commands.redo() },
|
|
6407
|
+
bold: { icon: '', label: 'Bold', cmd: (editor) => editor.chain().focus().toggleBold().run(), active: { name: 'bold' } },
|
|
6408
|
+
italic: { icon: '', label: 'Italic', cmd: (editor) => editor.chain().focus().toggleItalic().run(), active: { name: 'italic' } },
|
|
6409
|
+
underline: { icon: '', label: 'Underline', cmd: (editor) => editor.chain().focus().toggleUnderline().run(), active: { name: 'underline' } },
|
|
6410
|
+
strike: { icon: '', label: 'Strikethrough', cmd: (editor) => editor.chain().focus().toggleStrike().run(), active: { name: 'strike' } },
|
|
6411
|
+
code: { icon: 'pi-code', label: 'Inline code', cmd: (editor) => editor.chain().focus().toggleCode().run(), active: { name: 'code' } },
|
|
6412
|
+
codeBlock: { icon: 'pi-file-edit', label: 'Code block', cmd: (editor) => editor.chain().focus().toggleCodeBlock().run(), active: { name: 'codeBlock' } },
|
|
6413
|
+
blockquote: { icon: 'pi-comment', label: 'Quote', cmd: (editor) => editor.chain().focus().toggleBlockquote().run(), active: { name: 'blockquote' } },
|
|
6414
|
+
bulletList: { icon: 'pi-list', label: 'Bulleted list', cmd: (editor) => editor.chain().focus().toggleBulletList().run(), active: { name: 'bulletList' } },
|
|
6415
|
+
orderedList: { icon: 'pi-sort-numeric-down', label: 'Numbered list', cmd: (editor) => editor.chain().focus().toggleOrderedList().run(), active: { name: 'orderedList' } },
|
|
6416
|
+
taskList: { icon: 'pi-check-square', label: 'Task list', cmd: (editor) => editor.chain().focus().toggleTaskList().run(), active: { name: 'taskList' } },
|
|
6417
|
+
horizontalRule: { icon: 'pi-minus', label: 'Divider', cmd: (editor) => editor.chain().focus().setHorizontalRule().run() },
|
|
6418
|
+
h1: { icon: '', label: 'Heading 1', cmd: (editor) => editor.chain().focus().toggleHeading({ level: 1 }).run(), active: { name: 'heading', attrs: { level: 1 } } },
|
|
6419
|
+
h2: { icon: '', label: 'Heading 2', cmd: (editor) => editor.chain().focus().toggleHeading({ level: 2 }).run(), active: { name: 'heading', attrs: { level: 2 } } },
|
|
6420
|
+
h3: { icon: '', label: 'Heading 3', cmd: (editor) => editor.chain().focus().toggleHeading({ level: 3 }).run(), active: { name: 'heading', attrs: { level: 3 } } },
|
|
6421
|
+
};
|
|
6422
|
+
const TABLE_OPS = {
|
|
6423
|
+
addRowAbove: { icon: 'pi-arrow-up', label: 'Add row above', cmd: (editor) => editor.chain().focus().addRowBefore().run() },
|
|
6424
|
+
addRowBelow: { icon: 'pi-arrow-down', label: 'Add row below', cmd: (editor) => editor.chain().focus().addRowAfter().run() },
|
|
6425
|
+
addColBefore: { icon: 'pi-chevron-left', label: 'Add column before', cmd: (editor) => editor.chain().focus().addColumnBefore().run() },
|
|
6426
|
+
addColAfter: { icon: 'pi-chevron-right', label: 'Add column after', cmd: (editor) => editor.chain().focus().addColumnAfter().run() },
|
|
6427
|
+
deleteRow: { icon: 'pi-minus', label: 'Delete row', cmd: (editor) => editor.chain().focus().deleteRow().run() },
|
|
6428
|
+
deleteCol: { icon: 'pi-minus-circle', label: 'Delete column', cmd: (editor) => editor.chain().focus().deleteColumn().run() },
|
|
6429
|
+
toggleHeader: { icon: 'pi-table', label: 'Toggle header row', cmd: (editor) => editor.chain().focus().toggleHeaderRow().run() },
|
|
6430
|
+
mergeSplit: { icon: 'pi-clone', label: 'Merge / split cells', cmd: (editor) => editor.chain().focus().mergeOrSplit().run() },
|
|
6431
|
+
alignLeft: { icon: 'pi-align-left', label: 'Align left', cmd: (editor) => editor.chain().focus().setCellAttribute('align', 'left').run() },
|
|
6432
|
+
alignCenter: { icon: 'pi-align-center', label: 'Align center', cmd: (editor) => editor.chain().focus().setCellAttribute('align', 'center').run() },
|
|
6433
|
+
alignRight: { icon: 'pi-align-right', label: 'Align right', cmd: (editor) => editor.chain().focus().setCellAttribute('align', 'right').run() },
|
|
6434
|
+
deleteTable: { icon: 'pi-trash', label: 'Delete table', cmd: (editor) => editor.chain().focus().deleteTable().run() },
|
|
6435
|
+
};
|
|
6436
|
+
const HIDDEN_ICON_MAP = {
|
|
6437
|
+
Bold: ['bold'],
|
|
6438
|
+
Italic: ['italic'],
|
|
6439
|
+
Heading: ['h1', 'h2', 'h3'],
|
|
6440
|
+
Reference: ['blockquote'],
|
|
6441
|
+
Link: ['link'],
|
|
6442
|
+
Image: [],
|
|
6443
|
+
UnorderedList: ['bulletList', 'taskList'],
|
|
6444
|
+
OrderedList: ['orderedList'],
|
|
6445
|
+
CodeBlock: ['codeBlock', 'code'],
|
|
6446
|
+
ShowPreview: [],
|
|
6447
|
+
HidePreview: [],
|
|
6448
|
+
Fullscreen: [],
|
|
6449
|
+
Ul: ['bulletList', 'taskList'],
|
|
6450
|
+
Ol: ['orderedList'],
|
|
6451
|
+
Code: ['codeBlock', 'code'],
|
|
6452
|
+
TogglePreview: [],
|
|
6453
|
+
FullScreen: [],
|
|
6454
|
+
};
|
|
6408
6455
|
class MarkdownEditorComponent {
|
|
6409
6456
|
static { this.controlContainerstatic = null; }
|
|
6410
|
-
constructor(utilityService, globalSettings, controlValidationService, controlUtility, markdownEditorControlHost,
|
|
6457
|
+
constructor(utilityService, globalSettings, controlValidationService, controlUtility, markdownEditorControlHost, cdr, controlContainer) {
|
|
6411
6458
|
this.utilityService = utilityService;
|
|
6412
6459
|
this.globalSettings = globalSettings;
|
|
6413
6460
|
this.controlValidationService = controlValidationService;
|
|
6414
6461
|
this.controlUtility = controlUtility;
|
|
6415
6462
|
this.markdownEditorControlHost = markdownEditorControlHost;
|
|
6416
|
-
this.
|
|
6463
|
+
this.cdr = cdr;
|
|
6417
6464
|
this.controlContainer = controlContainer;
|
|
6418
6465
|
this.OnChange = new EventEmitter();
|
|
6419
|
-
this.hideToolbar = false;
|
|
6420
6466
|
this.validationRules = [];
|
|
6421
6467
|
this.validationRulesasync = [];
|
|
6422
6468
|
this.markAllAsTouched = false;
|
|
6423
|
-
this.
|
|
6424
|
-
this.
|
|
6425
|
-
|
|
6426
|
-
|
|
6427
|
-
|
|
6428
|
-
|
|
6429
|
-
|
|
6430
|
-
|
|
6431
|
-
|
|
6432
|
-
|
|
6433
|
-
|
|
6434
|
-
|
|
6435
|
-
|
|
6436
|
-
|
|
6437
|
-
|
|
6438
|
-
|
|
6439
|
-
|
|
6440
|
-
|
|
6441
|
-
|
|
6442
|
-
}
|
|
6443
|
-
};
|
|
6444
|
-
this.locales = {
|
|
6445
|
-
en: this.btnsText,
|
|
6446
|
-
ar: this.btnsText
|
|
6447
|
-
};
|
|
6469
|
+
this.activeStates = signal({});
|
|
6470
|
+
this.canUndo = signal(false);
|
|
6471
|
+
this.canRedo = signal(false);
|
|
6472
|
+
this.showLinkPopover = signal(false);
|
|
6473
|
+
this.linkInputValue = signal('');
|
|
6474
|
+
this.showTablePopover = signal(false);
|
|
6475
|
+
this.characters = signal(0);
|
|
6476
|
+
this.words = signal(0);
|
|
6477
|
+
this.isOverLimit = computed(() => {
|
|
6478
|
+
const max = this.options?.maxLength;
|
|
6479
|
+
return max != null && max > 0 && this.characters() > max;
|
|
6480
|
+
});
|
|
6481
|
+
this.toolbarItems = [...MARKDOWN_TOOLBAR_ITEMS];
|
|
6482
|
+
this.tableMenuGroups = [
|
|
6483
|
+
['addRowAbove', 'addRowBelow', 'addColBefore', 'addColAfter'],
|
|
6484
|
+
['deleteRow', 'deleteCol', 'toggleHeader', 'mergeSplit'],
|
|
6485
|
+
['alignLeft', 'alignCenter', 'alignRight'],
|
|
6486
|
+
['deleteTable'],
|
|
6487
|
+
];
|
|
6448
6488
|
this.resetError = () => {
|
|
6449
6489
|
this.controlValidationService.removeGlobalError();
|
|
6450
6490
|
};
|
|
6451
|
-
//External Method
|
|
6452
6491
|
this.removeRequiredValidation = () => {
|
|
6453
6492
|
this.controlUtility.removeRequiredValidation(this.markdownEditorFormControl, this.validationRules, this.options);
|
|
6454
6493
|
};
|
|
6455
|
-
//External Method
|
|
6456
6494
|
this.addRequiredValidation = () => {
|
|
6457
6495
|
this.controlUtility.addRequiredValidation(this.markdownEditorFormControl, this.validationRules, this.options);
|
|
6458
6496
|
};
|
|
6459
|
-
//External Method
|
|
6460
6497
|
this.removeCustomValidation = (customValidation) => {
|
|
6461
6498
|
this.controlUtility.removeCustomValidation(this.markdownEditorFormControl, this.validationRules, customValidation);
|
|
6462
6499
|
};
|
|
6463
|
-
//External Method
|
|
6464
6500
|
this.addCustomValidation = (customValidation) => {
|
|
6465
6501
|
this.controlUtility.addCustomValidation(this.markdownEditorFormControl, this.validationRules, customValidation);
|
|
6466
6502
|
};
|
|
6467
|
-
//External Method
|
|
6468
6503
|
this.isValid = () => {
|
|
6469
6504
|
this.controlUtility.isValid(this.markdownEditorFormControl);
|
|
6470
6505
|
};
|
|
6471
6506
|
MarkdownEditorComponent.controlContainerstatic = this.controlContainer;
|
|
6472
|
-
this.currentLocale = this.utilityService.getCurrentLanguage();
|
|
6473
|
-
}
|
|
6474
|
-
loadAllScripts() {
|
|
6475
|
-
return this.scriptService.loadScript('assets/ace-builds/ace.js').pipe(switchMap(() => this.scriptService.loadScript('assets/ace-builds/mode-markdown.js')), switchMap(() => this.scriptService.loadScript('assets/ngx-markdown-editor/marked.min.js')), switchMap(() => this.scriptService.loadScript('assets/ngx-markdown-editor/highlight.js/highlight.min.js')));
|
|
6476
6507
|
}
|
|
6477
6508
|
ngOnInit() {
|
|
6478
|
-
this.loadAllScripts()
|
|
6479
|
-
.subscribe({
|
|
6480
|
-
next: () => this.showMarkdown = true,
|
|
6481
|
-
error: (err) => console.error('Error loading scripts', err)
|
|
6482
|
-
});
|
|
6483
|
-
this.mode = this.options.isReadonly ? MarkdownMode.preview : MarkdownMode.editor;
|
|
6484
|
-
this.editorOptions = {
|
|
6485
|
-
hideIcons: this.options.hideIcons,
|
|
6486
|
-
showPreviewPanel: this.options.showPreviewPanelOnLoad,
|
|
6487
|
-
resizable: false,
|
|
6488
|
-
enablePreviewContentClick: this.options.isReadonly, // Allow user fire the click event on the preview panel, like href etc.
|
|
6489
|
-
markedjsOpt: {
|
|
6490
|
-
breaks: true,
|
|
6491
|
-
sanitize: true,
|
|
6492
|
-
smartypants: true,
|
|
6493
|
-
xhtml: true,
|
|
6494
|
-
},
|
|
6495
|
-
customRender: this.options.customRender,
|
|
6496
|
-
placeholder: this.options.placeholder,
|
|
6497
|
-
locales: this.locales,
|
|
6498
|
-
customIcons: {
|
|
6499
|
-
CodeBlock: {
|
|
6500
|
-
fontClass: 'fa fa-file-code'
|
|
6501
|
-
}
|
|
6502
|
-
}
|
|
6503
|
-
};
|
|
6504
6509
|
this.controlValidationService.isCreatedBefor = false;
|
|
6505
|
-
this.
|
|
6506
|
-
this.
|
|
6507
|
-
this.
|
|
6508
|
-
|
|
6510
|
+
this.initializeOptions();
|
|
6511
|
+
this.initializeControl();
|
|
6512
|
+
this.subscribeToControlChanges();
|
|
6513
|
+
this.subscribeToSubmit();
|
|
6514
|
+
}
|
|
6515
|
+
ngAfterViewInit() {
|
|
6516
|
+
this.initializeEditor();
|
|
6517
|
+
}
|
|
6518
|
+
ngOnDestroy() {
|
|
6519
|
+
this.valueChangesSubscription?.unsubscribe();
|
|
6520
|
+
this.submitSubscription?.unsubscribe();
|
|
6521
|
+
this.editor?.destroy();
|
|
6522
|
+
}
|
|
6523
|
+
button(id) {
|
|
6524
|
+
const button = TOOLBAR_BUTTONS[id];
|
|
6525
|
+
return button ? { icon: button.icon, label: button.label } : null;
|
|
6526
|
+
}
|
|
6527
|
+
textLabel(id) {
|
|
6528
|
+
switch (id) {
|
|
6529
|
+
case 'bold': return 'B';
|
|
6530
|
+
case 'italic': return 'I';
|
|
6531
|
+
case 'underline': return 'U';
|
|
6532
|
+
case 'strike': return 'S';
|
|
6533
|
+
case 'h1': return 'H1';
|
|
6534
|
+
case 'h2': return 'H2';
|
|
6535
|
+
case 'h3': return 'H3';
|
|
6536
|
+
default: return null;
|
|
6537
|
+
}
|
|
6538
|
+
}
|
|
6539
|
+
run(id) {
|
|
6540
|
+
const button = TOOLBAR_BUTTONS[id];
|
|
6541
|
+
if (!this.editor || !button || this.isReadonly())
|
|
6542
|
+
return;
|
|
6543
|
+
button.cmd(this.editor);
|
|
6544
|
+
this.refreshState();
|
|
6545
|
+
this.cdr.markForCheck();
|
|
6546
|
+
}
|
|
6547
|
+
isActive(id) {
|
|
6548
|
+
return this.activeStates()[id] ?? false;
|
|
6549
|
+
}
|
|
6550
|
+
disabled(id) {
|
|
6551
|
+
if (this.isReadonly())
|
|
6552
|
+
return true;
|
|
6553
|
+
if (id === 'undo')
|
|
6554
|
+
return !this.canUndo();
|
|
6555
|
+
if (id === 'redo')
|
|
6556
|
+
return !this.canRedo();
|
|
6557
|
+
return false;
|
|
6558
|
+
}
|
|
6559
|
+
openLinkPopover() {
|
|
6560
|
+
if (!this.editor || this.isReadonly())
|
|
6561
|
+
return;
|
|
6562
|
+
this.showTablePopover.set(false);
|
|
6563
|
+
this.linkInputValue.set(this.editor.getAttributes('link')['href'] ?? '');
|
|
6564
|
+
this.showLinkPopover.set(true);
|
|
6565
|
+
}
|
|
6566
|
+
onLinkInput(value) {
|
|
6567
|
+
this.linkInputValue.set(value);
|
|
6568
|
+
}
|
|
6569
|
+
commitLink() {
|
|
6570
|
+
if (!this.editor)
|
|
6571
|
+
return;
|
|
6572
|
+
const url = this.linkInputValue().trim();
|
|
6573
|
+
const chain = this.editor.chain().focus().extendMarkRange('link');
|
|
6574
|
+
if (url === '')
|
|
6575
|
+
chain.unsetLink().run();
|
|
6576
|
+
else
|
|
6577
|
+
chain.setLink({ href: url }).run();
|
|
6578
|
+
this.showLinkPopover.set(false);
|
|
6579
|
+
this.refreshState();
|
|
6580
|
+
this.cdr.markForCheck();
|
|
6581
|
+
}
|
|
6582
|
+
cancelLink() {
|
|
6583
|
+
this.showLinkPopover.set(false);
|
|
6584
|
+
}
|
|
6585
|
+
onLinkKeydown(event) {
|
|
6586
|
+
if (event.key === 'Enter') {
|
|
6587
|
+
event.preventDefault();
|
|
6588
|
+
this.commitLink();
|
|
6589
|
+
}
|
|
6590
|
+
if (event.key === 'Escape') {
|
|
6591
|
+
this.cancelLink();
|
|
6592
|
+
}
|
|
6593
|
+
}
|
|
6594
|
+
inTable() {
|
|
6595
|
+
return this.isActive('table');
|
|
6596
|
+
}
|
|
6597
|
+
toggleTablePopover() {
|
|
6598
|
+
if (!this.editor || this.isReadonly())
|
|
6599
|
+
return;
|
|
6600
|
+
this.showLinkPopover.set(false);
|
|
6601
|
+
this.showTablePopover.update((open) => !open);
|
|
6602
|
+
}
|
|
6603
|
+
insertTable() {
|
|
6604
|
+
if (!this.editor)
|
|
6605
|
+
return;
|
|
6606
|
+
this.editor.chain().focus().insertTable({ rows: 3, cols: 3, withHeaderRow: true }).run();
|
|
6607
|
+
this.showTablePopover.set(false);
|
|
6608
|
+
this.refreshState();
|
|
6609
|
+
this.cdr.markForCheck();
|
|
6610
|
+
}
|
|
6611
|
+
tableOpMeta(id) {
|
|
6612
|
+
const op = TABLE_OPS[id];
|
|
6613
|
+
return op ? { icon: op.icon, label: op.label } : { icon: '', label: '' };
|
|
6614
|
+
}
|
|
6615
|
+
tableOp(id) {
|
|
6616
|
+
if (!this.editor)
|
|
6617
|
+
return;
|
|
6618
|
+
const op = TABLE_OPS[id];
|
|
6619
|
+
if (!op)
|
|
6620
|
+
return;
|
|
6621
|
+
op.cmd(this.editor);
|
|
6622
|
+
if (id === 'deleteTable')
|
|
6623
|
+
this.showTablePopover.set(false);
|
|
6624
|
+
this.refreshState();
|
|
6625
|
+
this.cdr.markForCheck();
|
|
6626
|
+
}
|
|
6627
|
+
showGlobalError() {
|
|
6628
|
+
this.controlUtility.showGlobalError();
|
|
6629
|
+
}
|
|
6630
|
+
getErrorValidation(ErrorList) {
|
|
6631
|
+
if (this.markAllAsTouched && this.group.invalid) {
|
|
6632
|
+
this.showGlobalError();
|
|
6633
|
+
this.markAllAsTouched = false;
|
|
6634
|
+
}
|
|
6635
|
+
return this.controlUtility.getErrorValidationMassage(ErrorList, this.group, this.options);
|
|
6636
|
+
}
|
|
6637
|
+
get editorHeight() {
|
|
6638
|
+
return this.options?.height || '400px';
|
|
6639
|
+
}
|
|
6640
|
+
get maxLength() {
|
|
6641
|
+
return this.options?.maxLength && this.options.maxLength > 0 ? this.options.maxLength : null;
|
|
6642
|
+
}
|
|
6643
|
+
initializeOptions() {
|
|
6644
|
+
if (!this.options.viewType) {
|
|
6509
6645
|
this.options.viewType = this.globalSettings.viewType;
|
|
6510
|
-
if (this.options.customValidation.length > 0) {
|
|
6511
|
-
let validations = this.options.customValidation;
|
|
6512
|
-
for (let index = 0; index < validations.length; index++) {
|
|
6513
|
-
const Validation = validations[index];
|
|
6514
|
-
this.validationRules.push(Validation.functionBody);
|
|
6515
|
-
}
|
|
6516
6646
|
}
|
|
6517
|
-
if (this.options.labelKey != null && this.options.labelKey
|
|
6647
|
+
if (this.options.labelKey != null && this.options.labelKey !== '') {
|
|
6518
6648
|
this.options.labelValue = this.utilityService.getResourceValue(this.options.labelKey);
|
|
6649
|
+
}
|
|
6650
|
+
this.toolbarItems = this.buildToolbarItems(this.options.hideIcons ?? []);
|
|
6651
|
+
}
|
|
6652
|
+
initializeControl() {
|
|
6653
|
+
if (!this.group.controls[this.options.name]) {
|
|
6654
|
+
this.group.addControl(this.options.name, new FormControl(''));
|
|
6655
|
+
}
|
|
6656
|
+
this.markdownEditorFormControl = this.group.controls[this.options.name];
|
|
6657
|
+
this.markdownEditorFormControl.setValue(this.options.value ?? '', { emitEvent: false });
|
|
6658
|
+
if (this.options.customValidation?.length > 0) {
|
|
6659
|
+
for (const validation of this.options.customValidation) {
|
|
6660
|
+
this.validationRules.push(validation.functionBody);
|
|
6661
|
+
}
|
|
6662
|
+
}
|
|
6519
6663
|
if (this.options.minLength > 0) {
|
|
6520
6664
|
this.validationRules.push(Validators.minLength(this.options.minLength));
|
|
6521
6665
|
}
|
|
@@ -6528,102 +6672,122 @@ class MarkdownEditorComponent {
|
|
|
6528
6672
|
this.markdownEditorFormControl.setValidators(this.validationRules);
|
|
6529
6673
|
this.markdownEditorFormControl.setAsyncValidators(this.validationRulesasync);
|
|
6530
6674
|
if (this.options.isDisabled) {
|
|
6531
|
-
this.markdownEditorFormControl.disable();
|
|
6532
|
-
}
|
|
6533
|
-
|
|
6675
|
+
this.markdownEditorFormControl.disable({ emitEvent: false });
|
|
6676
|
+
}
|
|
6677
|
+
}
|
|
6678
|
+
initializeEditor() {
|
|
6679
|
+
this.editor = new Editor({
|
|
6680
|
+
extensions: [
|
|
6681
|
+
StarterKit.configure({ link: { openOnClick: false } }),
|
|
6682
|
+
Underline,
|
|
6683
|
+
Markdown,
|
|
6684
|
+
TaskList,
|
|
6685
|
+
TaskItem.configure({ nested: true }),
|
|
6686
|
+
Table.configure({ resizable: true }),
|
|
6687
|
+
TableRow,
|
|
6688
|
+
TableHeader,
|
|
6689
|
+
TableCell,
|
|
6690
|
+
Typography,
|
|
6691
|
+
CharacterCount,
|
|
6692
|
+
],
|
|
6693
|
+
element: this.editorBody.nativeElement,
|
|
6694
|
+
content: this.markdownEditorFormControl.value ?? '',
|
|
6695
|
+
editorProps: {
|
|
6696
|
+
attributes: {
|
|
6697
|
+
class: 'md-editor__prosemirror',
|
|
6698
|
+
spellcheck: 'true',
|
|
6699
|
+
'data-placeholder': this.options.placeholder ?? '',
|
|
6700
|
+
'aria-label': this.options.labelValue ?? this.options.name
|
|
6701
|
+
},
|
|
6702
|
+
},
|
|
6703
|
+
onCreate: ({ editor }) => {
|
|
6704
|
+
editor.commands.setContent(this.markdownEditorFormControl.value ?? '', { emitUpdate: false, contentType: 'markdown' });
|
|
6705
|
+
editor.setEditable(!this.isReadonly());
|
|
6706
|
+
this.refreshState();
|
|
6707
|
+
},
|
|
6708
|
+
onUpdate: () => {
|
|
6709
|
+
const value = this.editor.getMarkdown();
|
|
6710
|
+
this.options.value = value;
|
|
6711
|
+
this.markdownEditorFormControl.setValue(value, { emitEvent: false });
|
|
6712
|
+
this.markdownEditorFormControl.markAsDirty();
|
|
6713
|
+
this.OnChange.emit(value);
|
|
6714
|
+
this.refreshState();
|
|
6715
|
+
this.cdr.markForCheck();
|
|
6716
|
+
},
|
|
6717
|
+
onSelectionUpdate: () => {
|
|
6718
|
+
this.refreshState();
|
|
6719
|
+
this.cdr.markForCheck();
|
|
6720
|
+
},
|
|
6721
|
+
onBlur: () => {
|
|
6722
|
+
this.markdownEditorFormControl.markAsTouched();
|
|
6723
|
+
},
|
|
6724
|
+
});
|
|
6725
|
+
}
|
|
6726
|
+
subscribeToControlChanges() {
|
|
6727
|
+
this.valueChangesSubscription = this.markdownEditorFormControl.valueChanges.subscribe((value) => {
|
|
6728
|
+
const nextValue = value ?? '';
|
|
6729
|
+
if (nextValue !== this.options.value) {
|
|
6730
|
+
this.options.value = nextValue;
|
|
6731
|
+
}
|
|
6732
|
+
if (this.editor && this.editor.getMarkdown() !== nextValue) {
|
|
6733
|
+
this.editor.commands.setContent(nextValue, { emitUpdate: false, contentType: 'markdown' });
|
|
6734
|
+
this.refreshState();
|
|
6735
|
+
}
|
|
6736
|
+
this.editor?.setEditable(!this.isReadonly());
|
|
6737
|
+
});
|
|
6738
|
+
}
|
|
6739
|
+
subscribeToSubmit() {
|
|
6740
|
+
this.submitSubscription = this.markdownEditorControlHost.ngSubmit.subscribe(() => {
|
|
6534
6741
|
this.group.markAllAsTouched();
|
|
6535
6742
|
this.markAllAsTouched = true;
|
|
6536
6743
|
});
|
|
6537
6744
|
}
|
|
6538
|
-
|
|
6539
|
-
if (!
|
|
6745
|
+
refreshState() {
|
|
6746
|
+
if (!this.editor)
|
|
6540
6747
|
return;
|
|
6541
|
-
|
|
6542
|
-
|
|
6543
|
-
|
|
6544
|
-
|
|
6545
|
-
|
|
6546
|
-
|
|
6547
|
-
|
|
6548
|
-
|
|
6549
|
-
|
|
6550
|
-
this.
|
|
6551
|
-
|
|
6552
|
-
|
|
6553
|
-
this.
|
|
6554
|
-
}
|
|
6555
|
-
|
|
6556
|
-
|
|
6557
|
-
|
|
6558
|
-
|
|
6559
|
-
|
|
6560
|
-
|
|
6561
|
-
|
|
6562
|
-
|
|
6563
|
-
|
|
6564
|
-
|
|
6565
|
-
const
|
|
6566
|
-
|
|
6567
|
-
|
|
6568
|
-
|
|
6569
|
-
|
|
6570
|
-
|
|
6571
|
-
|
|
6572
|
-
|
|
6573
|
-
|
|
6574
|
-
//fires on drag and drop or copy paste
|
|
6575
|
-
//if not set will can't add files or images using this way
|
|
6576
|
-
onDragFile(files) {
|
|
6577
|
-
const results = [];
|
|
6578
|
-
// Function to handle a single file
|
|
6579
|
-
const processFile = (file) => {
|
|
6580
|
-
return new Promise((resolve, reject) => {
|
|
6581
|
-
const reader = new FileReader();
|
|
6582
|
-
reader.onload = () => {
|
|
6583
|
-
const fileUrl = reader.result;
|
|
6584
|
-
const result = {
|
|
6585
|
-
name: file.name,
|
|
6586
|
-
url: fileUrl,
|
|
6587
|
-
isImg: file.type.startsWith('image/')
|
|
6588
|
-
};
|
|
6589
|
-
resolve(result);
|
|
6590
|
-
};
|
|
6591
|
-
reader.onerror = (error) => {
|
|
6592
|
-
reject(error);
|
|
6593
|
-
};
|
|
6594
|
-
// Read the file as a data URL
|
|
6595
|
-
reader.readAsDataURL(file);
|
|
6596
|
-
});
|
|
6597
|
-
};
|
|
6598
|
-
// // Iterate over files and process each one
|
|
6599
|
-
const processAllFiles = async () => {
|
|
6600
|
-
for (const file of files) {
|
|
6601
|
-
try {
|
|
6602
|
-
const result = await processFile(file);
|
|
6603
|
-
results.push(result);
|
|
6604
|
-
}
|
|
6605
|
-
catch (error) {
|
|
6606
|
-
console.error('Error processing file:', error);
|
|
6607
|
-
}
|
|
6608
|
-
}
|
|
6609
|
-
return results;
|
|
6610
|
-
};
|
|
6611
|
-
//Return the promise that resolves when all files are processed
|
|
6612
|
-
return processAllFiles();
|
|
6613
|
-
}
|
|
6614
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.16", ngImport: i0, type: MarkdownEditorComponent, deps: [{ token: i3.UtilityService }, { token: GlobalSettings }, { token: i3.ControlValidationService }, { token: ControlUtility }, { token: i2.FormGroupDirective }, { token: i5$2.ScriptService }, { token: i2.ControlContainer, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
6615
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.16", type: MarkdownEditorComponent, isStandalone: true, selector: "BBSF-MarkdownEditor", inputs: { group: "group", options: "options" }, outputs: { OnChange: "OnChange" }, ngImport: i0, template: "<ng-container *ngIf=\"showMarkdown\">\r\n <div class=\"form-group bbsf-control bbsf-htmleditor\" [formGroup]=\"group\">\r\n <div [ngClass]=\"(options.viewType==1)?'bbsf-vertical':'bbsf-horizontal'\">\r\n <!--label-->\r\n <label *ngIf=\"!options.hideLabel\" class=\"bbsf-label {{options.labelExtraClasses}}\">\r\n {{options.labelValue}}\r\n <!--Asterisk-->\r\n <span *ngIf=\"((options.showAsterisk&&options.isRequired)||(options.isRequired))&&!options.isReadonly\"\r\n class=\"text-danger\">*</span>\r\n </label>\r\n <div class=\"bbsf-input-container {{options.extraClasses}}\">\r\n <md-editor id=\"{{options.name}}\" formControlName=\"{{options.name}}\"\r\n (onPreviewDomChanged)=\"onPreviewDomChanged($event)\"\r\n [(ngModel)]=\"options.value\" [mode]=\"mode\" [options]=\"editorOptions\" [attr.required]=\"options.isRequired ? true : null\" [upload]=\"onDragFile\" \r\n [maxlength]=\"options.maxLength\" [height]=\"options.height\" [locale]=\"currentLocale\" (onEditorLoaded)=\"onEditorLoaded($event)\" [hideToolbar]=\"hideToolbar\">\r\n <!-- [ngStyle]=\"{ 'direction': textDirection, 'text-align': textDirection === 'rtl' ? 'right' : 'left' }\" -->\r\n <div custom-btns>\r\n <input #imgInput type=\"file\" style=\"display: none\" (change)=\"uploadImg($event)\" />\r\n <button type=\"button\" class=\"btn btn-sm btn-default\" (click)=\"imgInput.click()\">\r\n {{utilityService.getResourceValue(\"UploadImg\")}}\r\n </button>\r\n </div>\r\n </md-editor>\r\n </div>\r\n\r\n <div class=\"subtext-container\">\r\n <div class=\"bbsf-control-desc\" *ngIf=\"options.labelDescription!=null\">{{options.labelDescription}}</div>\r\n <div class=\"bbsf-validation\" *ngIf=\"(markdownEditorFormControl.invalid && markdownEditorFormControl.touched)\">\r\n {{getErrorValidation(markdownEditorFormControl.errors|keyvalue)}}\r\n </div>\r\n </div>\r\n <div *ngIf=\"(group.valid&&group.dirty&&group.touched )||(group.untouched&&group.invalid&&group.dirty) \">\r\n {{resetError()}}</div>\r\n </div>\r\n </div>\r\n</ng-container>\r\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i5.KeyValuePipe, name: "keyvalue" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: LMarkdownEditorModule }, { kind: "component", type: i7$3.MarkdownEditorComponent, selector: "md-editor", inputs: ["hideToolbar", "height", "preRender", "postRender", "upload", "locale", "maxlength", "mode", "options"], outputs: ["onEditorLoaded", "onPreviewDomChanged"] }, { kind: "ngmodule", type: ScriptLoaderModule }] }); }
|
|
6748
|
+
this.canUndo.set(this.editor.can().undo());
|
|
6749
|
+
this.canRedo.set(this.editor.can().redo());
|
|
6750
|
+
const states = {};
|
|
6751
|
+
for (const [id, button] of Object.entries(TOOLBAR_BUTTONS)) {
|
|
6752
|
+
if (button.active)
|
|
6753
|
+
states[id] = this.editor.isActive(button.active.name, button.active.attrs ?? {});
|
|
6754
|
+
}
|
|
6755
|
+
states['link'] = this.editor.isActive('link');
|
|
6756
|
+
states['table'] = this.editor.isActive('table');
|
|
6757
|
+
this.activeStates.set(states);
|
|
6758
|
+
const characterCount = this.editor.storage['characterCount'];
|
|
6759
|
+
this.characters.set(characterCount?.characters?.() ?? 0);
|
|
6760
|
+
this.words.set(characterCount?.words?.() ?? 0);
|
|
6761
|
+
}
|
|
6762
|
+
buildToolbarItems(hiddenIcons) {
|
|
6763
|
+
const hidden = new Set();
|
|
6764
|
+
for (const icon of hiddenIcons) {
|
|
6765
|
+
for (const item of HIDDEN_ICON_MAP[icon] ?? []) {
|
|
6766
|
+
hidden.add(item);
|
|
6767
|
+
}
|
|
6768
|
+
}
|
|
6769
|
+
return MARKDOWN_TOOLBAR_ITEMS.filter((item, index, items) => {
|
|
6770
|
+
if (item !== '|')
|
|
6771
|
+
return !hidden.has(item);
|
|
6772
|
+
const previousVisible = items.slice(0, index).some((candidate) => candidate !== '|' && !hidden.has(candidate));
|
|
6773
|
+
const nextVisible = items.slice(index + 1).some((candidate) => candidate !== '|' && !hidden.has(candidate));
|
|
6774
|
+
return previousVisible && nextVisible;
|
|
6775
|
+
}).filter((item, index, items) => item !== '|' || items[index - 1] !== '|');
|
|
6776
|
+
}
|
|
6777
|
+
isReadonly() {
|
|
6778
|
+
return !!(this.options?.isReadonly || this.options?.isDisabled || this.markdownEditorFormControl?.disabled);
|
|
6779
|
+
}
|
|
6780
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.16", ngImport: i0, type: MarkdownEditorComponent, deps: [{ token: i3.UtilityService }, { token: GlobalSettings }, { token: i3.ControlValidationService }, { token: ControlUtility }, { token: i2.FormGroupDirective }, { token: i0.ChangeDetectorRef }, { token: i2.ControlContainer, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
6781
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.16", type: MarkdownEditorComponent, isStandalone: true, selector: "BBSF-MarkdownEditor", inputs: { group: "group", options: "options" }, outputs: { OnChange: "OnChange" }, viewQueries: [{ propertyName: "editorBody", first: true, predicate: ["editorBody"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"form-group bbsf-control bbsf-htmleditor bbsf-markdowneditor\" [formGroup]=\"group\">\n <div [ngClass]=\"(options.viewType==1)?'bbsf-vertical':'bbsf-horizontal'\">\n <label *ngIf=\"!options.hideLabel\" class=\"bbsf-label {{options.labelExtraClasses}}\">\n {{options.labelValue}}\n <span *ngIf=\"((options.showAsterisk&&options.isRequired)||(options.isRequired))&&!options.isReadonly\"\n class=\"text-danger\">*</span>\n </label>\n\n <div class=\"bbsf-input-container {{options.extraClasses}}\">\n <div class=\"md-editor\" [style.height]=\"editorHeight\">\n <div class=\"md-editor__toolbar\" role=\"toolbar\" [attr.aria-label]=\"utilityService.getResourceValue('FormattingToolbar') || 'Formatting toolbar'\">\n @for (item of toolbarItems; track $index) {\n @switch (item) {\n @case ('|') {\n <span class=\"md-editor__divider\" aria-hidden=\"true\"></span>\n }\n @case ('link') {\n <div class=\"md-editor__link-wrap\">\n <button type=\"button\" class=\"md-editor__btn\" [class.is-active]=\"isActive('link')\"\n [disabled]=\"disabled('link')\" (click)=\"openLinkPopover()\" title=\"Link\" aria-label=\"Link\">\n <i class=\"pi pi-link\" aria-hidden=\"true\"></i>\n </button>\n @if (showLinkPopover()) {\n <div class=\"md-editor__link-popover\" role=\"dialog\" aria-label=\"Link\">\n <input class=\"md-editor__link-input\" type=\"url\"\n [value]=\"linkInputValue()\" (input)=\"onLinkInput($any($event.target).value)\"\n (keydown)=\"onLinkKeydown($event)\"\n placeholder=\"https://...\" aria-label=\"Link URL\" />\n <button type=\"button\" class=\"md-editor__link-ok\" (click)=\"commitLink()\" title=\"Apply\">\n <i class=\"pi pi-check\" aria-hidden=\"true\"></i>\n </button>\n <button type=\"button\" class=\"md-editor__link-cancel\" (click)=\"cancelLink()\" title=\"Cancel\">\n <i class=\"pi pi-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n }\n </div>\n }\n @case ('table') {\n <div class=\"md-editor__table-wrap\">\n <button type=\"button\" class=\"md-editor__btn\" [class.is-active]=\"isActive('table') || showTablePopover()\"\n [disabled]=\"disabled('table')\" (click)=\"toggleTablePopover()\" [attr.aria-expanded]=\"showTablePopover()\"\n aria-haspopup=\"menu\" title=\"Table\" aria-label=\"Table\">\n <i class=\"pi pi-table\" aria-hidden=\"true\"></i>\n </button>\n @if (showTablePopover()) {\n <div class=\"md-editor__table-popover\" role=\"menu\" aria-label=\"Table\">\n @if (inTable()) {\n @for (group of tableMenuGroups; track $index) {\n <div class=\"md-editor__table-group\" role=\"group\">\n @for (id of group; track id) {\n <button type=\"button\" class=\"md-editor__btn\" role=\"menuitem\"\n [class.md-editor__btn--danger]=\"id === 'deleteTable'\"\n (click)=\"tableOp(id)\"\n [title]=\"tableOpMeta(id).label\" [attr.aria-label]=\"tableOpMeta(id).label\">\n <i class=\"pi {{ tableOpMeta(id).icon }}\" aria-hidden=\"true\"></i>\n </button>\n }\n </div>\n }\n } @else {\n <button type=\"button\" class=\"md-editor__table-insert\" role=\"menuitem\" (click)=\"insertTable()\">\n <i class=\"pi pi-table\" aria-hidden=\"true\"></i>\n <span>Insert table</span>\n </button>\n }\n </div>\n }\n </div>\n }\n @default {\n <button type=\"button\" class=\"md-editor__btn\"\n [class.is-active]=\"isActive(item)\" [disabled]=\"disabled(item)\"\n (click)=\"run(item)\"\n [title]=\"button(item)?.label ?? ''\" [attr.aria-label]=\"button(item)?.label ?? ''\">\n @if (textLabel(item); as txt) {\n <span class=\"md-editor__btn-text\">{{ txt }}</span>\n } @else {\n <i class=\"pi {{ button(item)?.icon }}\" aria-hidden=\"true\"></i>\n }\n </button>\n }\n }\n }\n @if (maxLength !== null) {\n <span class=\"md-editor__count\" [class.md-editor__count--over]=\"isOverLimit()\"\n aria-live=\"polite\">{{ characters() }} / {{ maxLength }}</span>\n }\n </div>\n\n <div #editorBody class=\"md-editor__body\"\n [attr.aria-label]=\"options.labelValue || options.name\"\n [attr.data-placeholder]=\"options.placeholder || ''\"></div>\n </div>\n </div>\n\n <div class=\"subtext-container\">\n <div class=\"bbsf-control-desc\" *ngIf=\"options.labelDescription!=null\">{{options.labelDescription}}</div>\n <div class=\"bbsf-validation\" *ngIf=\"(markdownEditorFormControl.invalid && markdownEditorFormControl.touched)\">\n {{getErrorValidation(markdownEditorFormControl.errors|keyvalue)}}\n </div>\n </div>\n <div *ngIf=\"(group.valid&&group.dirty&&group.touched )||(group.untouched&&group.invalid&&group.dirty) \">\n {{resetError()}}</div>\n </div>\n</div>\n", styles: [":host{display:block;--mde-text: #1d1d1f;--mde-text-secondary: #6e6e73;--mde-border: rgba(0, 0, 0, .14);--mde-hover: rgba(0, 0, 0, .05);--mde-primary: #1b84ff;--mde-primary-subtle: rgba(27, 132, 255, .12);--mde-popover-bg: #ffffff;--mde-popover-border: rgba(0, 0, 0, .12);--mde-danger: #d70015;--mde-danger-subtle: rgba(215, 0, 21, .1);--mde-cell-selected: rgba(27, 132, 255, .15);--mde-th-bg: rgba(0, 0, 0, .04);--mde-code-bg: rgba(0, 0, 0, .06)}.bbsf-markdowneditor .md-editor{display:flex;flex-direction:column;min-height:180px;position:relative;color:var(--mde-text);border:1px solid var(--mde-border);border-radius:.475rem;background:#fff;overflow:visible}.bbsf-markdowneditor .md-editor__toolbar{display:flex;align-items:center;flex-wrap:wrap;gap:2px;padding:4px 6px;border-bottom:1px solid var(--mde-border)}.bbsf-markdowneditor .md-editor__divider{width:1px;height:18px;margin-inline:4px;background:var(--mde-border)}.bbsf-markdowneditor .md-editor__btn{min-width:28px;height:28px;padding-inline:7px;border-radius:6px;border:1px solid transparent;background:transparent;color:var(--mde-text-secondary);font-size:12px;line-height:1;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;transition:background .12s ease,color .12s ease}.bbsf-markdowneditor .md-editor__btn:hover:not(:disabled){background:var(--mde-hover)}.bbsf-markdowneditor .md-editor__btn.is-active{background:var(--mde-primary-subtle);color:var(--mde-primary);border-color:var(--mde-primary-subtle)}.bbsf-markdowneditor .md-editor__btn:disabled{opacity:.4;cursor:default}.bbsf-markdowneditor .md-editor__btn i.pi{font-size:13px}.bbsf-markdowneditor .md-editor__btn-text{font-weight:600;font-style:normal}.bbsf-markdowneditor .md-editor__link-wrap,.bbsf-markdowneditor .md-editor__table-wrap{position:relative;display:inline-flex}.bbsf-markdowneditor .md-editor__link-popover,.bbsf-markdowneditor .md-editor__table-popover{position:absolute;top:calc(100% + 4px);inset-inline-start:0;z-index:1000;color:var(--mde-text);background:var(--mde-popover-bg);border:1px solid var(--mde-popover-border);box-shadow:0 8px 24px #0000002e}.bbsf-markdowneditor .md-editor__link-popover{display:flex;gap:4px;padding:4px;border-radius:6px}.bbsf-markdowneditor .md-editor__link-input{width:200px;padding:4px 6px;font-size:12px;border:1px solid var(--mde-border);border-radius:4px;outline:none;background:transparent;color:inherit}.bbsf-markdowneditor .md-editor__link-input:focus{border-color:var(--mde-primary)}.bbsf-markdowneditor .md-editor__link-ok,.bbsf-markdowneditor .md-editor__link-cancel{width:24px;height:24px;border-radius:4px;border:none;background:transparent;cursor:pointer;color:var(--mde-text-secondary)}.bbsf-markdowneditor .md-editor__link-ok:hover,.bbsf-markdowneditor .md-editor__link-cancel:hover{background:var(--mde-hover)}.bbsf-markdowneditor .md-editor__table-popover{display:flex;flex-direction:column;gap:4px;padding:6px;border-radius:8px}.bbsf-markdowneditor .md-editor__table-group{display:flex;gap:2px}.bbsf-markdowneditor .md-editor__table-group:not(:last-child){padding-bottom:4px;border-bottom:1px solid var(--mde-border)}.bbsf-markdowneditor .md-editor__table-insert{display:inline-flex;align-items:center;gap:6px;padding:6px 10px;border-radius:6px;border:1px solid transparent;background:transparent;color:inherit;font-size:12px;white-space:nowrap;cursor:pointer}.bbsf-markdowneditor .md-editor__table-insert:hover{background:var(--mde-hover)}.bbsf-markdowneditor .md-editor__btn--danger{color:var(--mde-danger)}.bbsf-markdowneditor .md-editor__btn--danger:hover:not(:disabled){background:var(--mde-danger-subtle)}.bbsf-markdowneditor .md-editor__count{margin-inline-start:auto;padding-inline:6px;font-size:11px;font-variant-numeric:tabular-nums;color:var(--mde-text-secondary)}.bbsf-markdowneditor .md-editor__count--over{color:var(--mde-danger);font-weight:600}.bbsf-markdowneditor .md-editor__body{flex:1;min-height:56px;overflow-y:auto;padding:8px 10px;font-size:13px;line-height:1.55;color:var(--mde-text);cursor:text}.bbsf-markdowneditor .md-editor__body:focus-within{outline:none}:host ::ng-deep .md-editor__prosemirror{outline:none}:host ::ng-deep .md-editor__prosemirror>*{margin-block:0 .5em}:host ::ng-deep .md-editor__prosemirror>:last-child{margin-block-end:0}:host ::ng-deep .md-editor__prosemirror h1{font-size:1.4em;font-weight:700}:host ::ng-deep .md-editor__prosemirror h2{font-size:1.2em;font-weight:700}:host ::ng-deep .md-editor__prosemirror h3{font-size:1.05em;font-weight:700}:host ::ng-deep .md-editor__prosemirror ul,:host ::ng-deep .md-editor__prosemirror ol{padding-inline-start:1.4em}:host ::ng-deep .md-editor__prosemirror a{color:var(--mde-primary);text-decoration:underline;cursor:pointer}:host ::ng-deep .md-editor__prosemirror code{background:var(--mde-code-bg);padding:1px 4px;border-radius:4px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:.95em}:host ::ng-deep .md-editor__prosemirror pre{background:var(--mde-code-bg);border-radius:6px;padding:8px 10px;overflow-x:auto}:host ::ng-deep .md-editor__prosemirror pre code{background:transparent;padding:0}:host ::ng-deep .md-editor__prosemirror blockquote{margin-inline:0;padding-inline-start:10px;border-inline-start:3px solid var(--mde-border);color:var(--mde-text-secondary)}:host ::ng-deep .md-editor__prosemirror ul[data-type=taskList]{list-style:none;padding-inline-start:.2em}:host ::ng-deep .md-editor__prosemirror ul[data-type=taskList] li{display:flex;align-items:flex-start;gap:6px}:host ::ng-deep .md-editor__prosemirror ul[data-type=taskList] li>label{margin-block-start:.15em}:host ::ng-deep .md-editor__prosemirror .tableWrapper{overflow-x:auto}:host ::ng-deep .md-editor__prosemirror table{border-collapse:collapse;table-layout:fixed;width:100%;margin:0;overflow:hidden}:host ::ng-deep .md-editor__prosemirror table td,:host ::ng-deep .md-editor__prosemirror table th{position:relative;box-sizing:border-box;min-width:3em;padding:4px 8px;border:1px solid var(--mde-border);vertical-align:top;text-align:start}:host ::ng-deep .md-editor__prosemirror table td>*,:host ::ng-deep .md-editor__prosemirror table th>*{margin-block:0}:host ::ng-deep .md-editor__prosemirror table th{font-weight:600;background:var(--mde-th-bg)}:host ::ng-deep .md-editor__prosemirror table .selectedCell:after{content:\"\";position:absolute;inset:0;background:var(--mde-cell-selected);pointer-events:none;z-index:2}:host ::ng-deep .md-editor__prosemirror table .column-resize-handle{position:absolute;inset-inline-end:-2px;inset-block:0;width:4px;background:var(--mde-primary);cursor:col-resize}:host ::ng-deep .md-editor__prosemirror.resize-cursor{cursor:col-resize}:host ::ng-deep .md-editor__prosemirror p.is-editor-empty:first-child:before{content:attr(data-placeholder);color:var(--mde-text-secondary);float:inline-start;pointer-events:none;height:0}:host ::ng-deep .ProseMirror-gapcursor{display:none;pointer-events:none;position:absolute}:host ::ng-deep .ProseMirror-gapcursor:after{content:\"\";display:block;position:absolute;top:-2px;width:20px;border-top:1px solid var(--mde-text, currentColor);animation:md-editor-gapcursor-blink 1.1s steps(2,start) infinite}:host ::ng-deep .ProseMirror-focused .ProseMirror-gapcursor{display:block}@keyframes md-editor-gapcursor-blink{to{visibility:hidden}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i5.KeyValuePipe, name: "keyvalue" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }] }); }
|
|
6616
6782
|
}
|
|
6617
6783
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.16", ngImport: i0, type: MarkdownEditorComponent, decorators: [{
|
|
6618
6784
|
type: Component,
|
|
6619
6785
|
args: [{ selector: 'BBSF-MarkdownEditor', standalone: true, imports: [
|
|
6620
6786
|
CommonModule,
|
|
6621
6787
|
FormsModule,
|
|
6622
|
-
ReactiveFormsModule
|
|
6623
|
-
LMarkdownEditorModule,
|
|
6624
|
-
|
|
6625
|
-
], schemas: [CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA], template: "<ng-container *ngIf=\"showMarkdown\">\r\n <div class=\"form-group bbsf-control bbsf-htmleditor\" [formGroup]=\"group\">\r\n <div [ngClass]=\"(options.viewType==1)?'bbsf-vertical':'bbsf-horizontal'\">\r\n <!--label-->\r\n <label *ngIf=\"!options.hideLabel\" class=\"bbsf-label {{options.labelExtraClasses}}\">\r\n {{options.labelValue}}\r\n <!--Asterisk-->\r\n <span *ngIf=\"((options.showAsterisk&&options.isRequired)||(options.isRequired))&&!options.isReadonly\"\r\n class=\"text-danger\">*</span>\r\n </label>\r\n <div class=\"bbsf-input-container {{options.extraClasses}}\">\r\n <md-editor id=\"{{options.name}}\" formControlName=\"{{options.name}}\"\r\n (onPreviewDomChanged)=\"onPreviewDomChanged($event)\"\r\n [(ngModel)]=\"options.value\" [mode]=\"mode\" [options]=\"editorOptions\" [attr.required]=\"options.isRequired ? true : null\" [upload]=\"onDragFile\" \r\n [maxlength]=\"options.maxLength\" [height]=\"options.height\" [locale]=\"currentLocale\" (onEditorLoaded)=\"onEditorLoaded($event)\" [hideToolbar]=\"hideToolbar\">\r\n <!-- [ngStyle]=\"{ 'direction': textDirection, 'text-align': textDirection === 'rtl' ? 'right' : 'left' }\" -->\r\n <div custom-btns>\r\n <input #imgInput type=\"file\" style=\"display: none\" (change)=\"uploadImg($event)\" />\r\n <button type=\"button\" class=\"btn btn-sm btn-default\" (click)=\"imgInput.click()\">\r\n {{utilityService.getResourceValue(\"UploadImg\")}}\r\n </button>\r\n </div>\r\n </md-editor>\r\n </div>\r\n\r\n <div class=\"subtext-container\">\r\n <div class=\"bbsf-control-desc\" *ngIf=\"options.labelDescription!=null\">{{options.labelDescription}}</div>\r\n <div class=\"bbsf-validation\" *ngIf=\"(markdownEditorFormControl.invalid && markdownEditorFormControl.touched)\">\r\n {{getErrorValidation(markdownEditorFormControl.errors|keyvalue)}}\r\n </div>\r\n </div>\r\n <div *ngIf=\"(group.valid&&group.dirty&&group.touched )||(group.untouched&&group.invalid&&group.dirty) \">\r\n {{resetError()}}</div>\r\n </div>\r\n </div>\r\n</ng-container>\r\n" }]
|
|
6626
|
-
}], ctorParameters: () => [{ type: i3.UtilityService }, { type: GlobalSettings }, { type: i3.ControlValidationService }, { type: ControlUtility }, { type: i2.FormGroupDirective }, { type: i5$2.ScriptService }, { type: i2.ControlContainer, decorators: [{
|
|
6788
|
+
ReactiveFormsModule
|
|
6789
|
+
], schemas: [CUSTOM_ELEMENTS_SCHEMA], template: "<div class=\"form-group bbsf-control bbsf-htmleditor bbsf-markdowneditor\" [formGroup]=\"group\">\n <div [ngClass]=\"(options.viewType==1)?'bbsf-vertical':'bbsf-horizontal'\">\n <label *ngIf=\"!options.hideLabel\" class=\"bbsf-label {{options.labelExtraClasses}}\">\n {{options.labelValue}}\n <span *ngIf=\"((options.showAsterisk&&options.isRequired)||(options.isRequired))&&!options.isReadonly\"\n class=\"text-danger\">*</span>\n </label>\n\n <div class=\"bbsf-input-container {{options.extraClasses}}\">\n <div class=\"md-editor\" [style.height]=\"editorHeight\">\n <div class=\"md-editor__toolbar\" role=\"toolbar\" [attr.aria-label]=\"utilityService.getResourceValue('FormattingToolbar') || 'Formatting toolbar'\">\n @for (item of toolbarItems; track $index) {\n @switch (item) {\n @case ('|') {\n <span class=\"md-editor__divider\" aria-hidden=\"true\"></span>\n }\n @case ('link') {\n <div class=\"md-editor__link-wrap\">\n <button type=\"button\" class=\"md-editor__btn\" [class.is-active]=\"isActive('link')\"\n [disabled]=\"disabled('link')\" (click)=\"openLinkPopover()\" title=\"Link\" aria-label=\"Link\">\n <i class=\"pi pi-link\" aria-hidden=\"true\"></i>\n </button>\n @if (showLinkPopover()) {\n <div class=\"md-editor__link-popover\" role=\"dialog\" aria-label=\"Link\">\n <input class=\"md-editor__link-input\" type=\"url\"\n [value]=\"linkInputValue()\" (input)=\"onLinkInput($any($event.target).value)\"\n (keydown)=\"onLinkKeydown($event)\"\n placeholder=\"https://...\" aria-label=\"Link URL\" />\n <button type=\"button\" class=\"md-editor__link-ok\" (click)=\"commitLink()\" title=\"Apply\">\n <i class=\"pi pi-check\" aria-hidden=\"true\"></i>\n </button>\n <button type=\"button\" class=\"md-editor__link-cancel\" (click)=\"cancelLink()\" title=\"Cancel\">\n <i class=\"pi pi-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n }\n </div>\n }\n @case ('table') {\n <div class=\"md-editor__table-wrap\">\n <button type=\"button\" class=\"md-editor__btn\" [class.is-active]=\"isActive('table') || showTablePopover()\"\n [disabled]=\"disabled('table')\" (click)=\"toggleTablePopover()\" [attr.aria-expanded]=\"showTablePopover()\"\n aria-haspopup=\"menu\" title=\"Table\" aria-label=\"Table\">\n <i class=\"pi pi-table\" aria-hidden=\"true\"></i>\n </button>\n @if (showTablePopover()) {\n <div class=\"md-editor__table-popover\" role=\"menu\" aria-label=\"Table\">\n @if (inTable()) {\n @for (group of tableMenuGroups; track $index) {\n <div class=\"md-editor__table-group\" role=\"group\">\n @for (id of group; track id) {\n <button type=\"button\" class=\"md-editor__btn\" role=\"menuitem\"\n [class.md-editor__btn--danger]=\"id === 'deleteTable'\"\n (click)=\"tableOp(id)\"\n [title]=\"tableOpMeta(id).label\" [attr.aria-label]=\"tableOpMeta(id).label\">\n <i class=\"pi {{ tableOpMeta(id).icon }}\" aria-hidden=\"true\"></i>\n </button>\n }\n </div>\n }\n } @else {\n <button type=\"button\" class=\"md-editor__table-insert\" role=\"menuitem\" (click)=\"insertTable()\">\n <i class=\"pi pi-table\" aria-hidden=\"true\"></i>\n <span>Insert table</span>\n </button>\n }\n </div>\n }\n </div>\n }\n @default {\n <button type=\"button\" class=\"md-editor__btn\"\n [class.is-active]=\"isActive(item)\" [disabled]=\"disabled(item)\"\n (click)=\"run(item)\"\n [title]=\"button(item)?.label ?? ''\" [attr.aria-label]=\"button(item)?.label ?? ''\">\n @if (textLabel(item); as txt) {\n <span class=\"md-editor__btn-text\">{{ txt }}</span>\n } @else {\n <i class=\"pi {{ button(item)?.icon }}\" aria-hidden=\"true\"></i>\n }\n </button>\n }\n }\n }\n @if (maxLength !== null) {\n <span class=\"md-editor__count\" [class.md-editor__count--over]=\"isOverLimit()\"\n aria-live=\"polite\">{{ characters() }} / {{ maxLength }}</span>\n }\n </div>\n\n <div #editorBody class=\"md-editor__body\"\n [attr.aria-label]=\"options.labelValue || options.name\"\n [attr.data-placeholder]=\"options.placeholder || ''\"></div>\n </div>\n </div>\n\n <div class=\"subtext-container\">\n <div class=\"bbsf-control-desc\" *ngIf=\"options.labelDescription!=null\">{{options.labelDescription}}</div>\n <div class=\"bbsf-validation\" *ngIf=\"(markdownEditorFormControl.invalid && markdownEditorFormControl.touched)\">\n {{getErrorValidation(markdownEditorFormControl.errors|keyvalue)}}\n </div>\n </div>\n <div *ngIf=\"(group.valid&&group.dirty&&group.touched )||(group.untouched&&group.invalid&&group.dirty) \">\n {{resetError()}}</div>\n </div>\n</div>\n", styles: [":host{display:block;--mde-text: #1d1d1f;--mde-text-secondary: #6e6e73;--mde-border: rgba(0, 0, 0, .14);--mde-hover: rgba(0, 0, 0, .05);--mde-primary: #1b84ff;--mde-primary-subtle: rgba(27, 132, 255, .12);--mde-popover-bg: #ffffff;--mde-popover-border: rgba(0, 0, 0, .12);--mde-danger: #d70015;--mde-danger-subtle: rgba(215, 0, 21, .1);--mde-cell-selected: rgba(27, 132, 255, .15);--mde-th-bg: rgba(0, 0, 0, .04);--mde-code-bg: rgba(0, 0, 0, .06)}.bbsf-markdowneditor .md-editor{display:flex;flex-direction:column;min-height:180px;position:relative;color:var(--mde-text);border:1px solid var(--mde-border);border-radius:.475rem;background:#fff;overflow:visible}.bbsf-markdowneditor .md-editor__toolbar{display:flex;align-items:center;flex-wrap:wrap;gap:2px;padding:4px 6px;border-bottom:1px solid var(--mde-border)}.bbsf-markdowneditor .md-editor__divider{width:1px;height:18px;margin-inline:4px;background:var(--mde-border)}.bbsf-markdowneditor .md-editor__btn{min-width:28px;height:28px;padding-inline:7px;border-radius:6px;border:1px solid transparent;background:transparent;color:var(--mde-text-secondary);font-size:12px;line-height:1;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;transition:background .12s ease,color .12s ease}.bbsf-markdowneditor .md-editor__btn:hover:not(:disabled){background:var(--mde-hover)}.bbsf-markdowneditor .md-editor__btn.is-active{background:var(--mde-primary-subtle);color:var(--mde-primary);border-color:var(--mde-primary-subtle)}.bbsf-markdowneditor .md-editor__btn:disabled{opacity:.4;cursor:default}.bbsf-markdowneditor .md-editor__btn i.pi{font-size:13px}.bbsf-markdowneditor .md-editor__btn-text{font-weight:600;font-style:normal}.bbsf-markdowneditor .md-editor__link-wrap,.bbsf-markdowneditor .md-editor__table-wrap{position:relative;display:inline-flex}.bbsf-markdowneditor .md-editor__link-popover,.bbsf-markdowneditor .md-editor__table-popover{position:absolute;top:calc(100% + 4px);inset-inline-start:0;z-index:1000;color:var(--mde-text);background:var(--mde-popover-bg);border:1px solid var(--mde-popover-border);box-shadow:0 8px 24px #0000002e}.bbsf-markdowneditor .md-editor__link-popover{display:flex;gap:4px;padding:4px;border-radius:6px}.bbsf-markdowneditor .md-editor__link-input{width:200px;padding:4px 6px;font-size:12px;border:1px solid var(--mde-border);border-radius:4px;outline:none;background:transparent;color:inherit}.bbsf-markdowneditor .md-editor__link-input:focus{border-color:var(--mde-primary)}.bbsf-markdowneditor .md-editor__link-ok,.bbsf-markdowneditor .md-editor__link-cancel{width:24px;height:24px;border-radius:4px;border:none;background:transparent;cursor:pointer;color:var(--mde-text-secondary)}.bbsf-markdowneditor .md-editor__link-ok:hover,.bbsf-markdowneditor .md-editor__link-cancel:hover{background:var(--mde-hover)}.bbsf-markdowneditor .md-editor__table-popover{display:flex;flex-direction:column;gap:4px;padding:6px;border-radius:8px}.bbsf-markdowneditor .md-editor__table-group{display:flex;gap:2px}.bbsf-markdowneditor .md-editor__table-group:not(:last-child){padding-bottom:4px;border-bottom:1px solid var(--mde-border)}.bbsf-markdowneditor .md-editor__table-insert{display:inline-flex;align-items:center;gap:6px;padding:6px 10px;border-radius:6px;border:1px solid transparent;background:transparent;color:inherit;font-size:12px;white-space:nowrap;cursor:pointer}.bbsf-markdowneditor .md-editor__table-insert:hover{background:var(--mde-hover)}.bbsf-markdowneditor .md-editor__btn--danger{color:var(--mde-danger)}.bbsf-markdowneditor .md-editor__btn--danger:hover:not(:disabled){background:var(--mde-danger-subtle)}.bbsf-markdowneditor .md-editor__count{margin-inline-start:auto;padding-inline:6px;font-size:11px;font-variant-numeric:tabular-nums;color:var(--mde-text-secondary)}.bbsf-markdowneditor .md-editor__count--over{color:var(--mde-danger);font-weight:600}.bbsf-markdowneditor .md-editor__body{flex:1;min-height:56px;overflow-y:auto;padding:8px 10px;font-size:13px;line-height:1.55;color:var(--mde-text);cursor:text}.bbsf-markdowneditor .md-editor__body:focus-within{outline:none}:host ::ng-deep .md-editor__prosemirror{outline:none}:host ::ng-deep .md-editor__prosemirror>*{margin-block:0 .5em}:host ::ng-deep .md-editor__prosemirror>:last-child{margin-block-end:0}:host ::ng-deep .md-editor__prosemirror h1{font-size:1.4em;font-weight:700}:host ::ng-deep .md-editor__prosemirror h2{font-size:1.2em;font-weight:700}:host ::ng-deep .md-editor__prosemirror h3{font-size:1.05em;font-weight:700}:host ::ng-deep .md-editor__prosemirror ul,:host ::ng-deep .md-editor__prosemirror ol{padding-inline-start:1.4em}:host ::ng-deep .md-editor__prosemirror a{color:var(--mde-primary);text-decoration:underline;cursor:pointer}:host ::ng-deep .md-editor__prosemirror code{background:var(--mde-code-bg);padding:1px 4px;border-radius:4px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:.95em}:host ::ng-deep .md-editor__prosemirror pre{background:var(--mde-code-bg);border-radius:6px;padding:8px 10px;overflow-x:auto}:host ::ng-deep .md-editor__prosemirror pre code{background:transparent;padding:0}:host ::ng-deep .md-editor__prosemirror blockquote{margin-inline:0;padding-inline-start:10px;border-inline-start:3px solid var(--mde-border);color:var(--mde-text-secondary)}:host ::ng-deep .md-editor__prosemirror ul[data-type=taskList]{list-style:none;padding-inline-start:.2em}:host ::ng-deep .md-editor__prosemirror ul[data-type=taskList] li{display:flex;align-items:flex-start;gap:6px}:host ::ng-deep .md-editor__prosemirror ul[data-type=taskList] li>label{margin-block-start:.15em}:host ::ng-deep .md-editor__prosemirror .tableWrapper{overflow-x:auto}:host ::ng-deep .md-editor__prosemirror table{border-collapse:collapse;table-layout:fixed;width:100%;margin:0;overflow:hidden}:host ::ng-deep .md-editor__prosemirror table td,:host ::ng-deep .md-editor__prosemirror table th{position:relative;box-sizing:border-box;min-width:3em;padding:4px 8px;border:1px solid var(--mde-border);vertical-align:top;text-align:start}:host ::ng-deep .md-editor__prosemirror table td>*,:host ::ng-deep .md-editor__prosemirror table th>*{margin-block:0}:host ::ng-deep .md-editor__prosemirror table th{font-weight:600;background:var(--mde-th-bg)}:host ::ng-deep .md-editor__prosemirror table .selectedCell:after{content:\"\";position:absolute;inset:0;background:var(--mde-cell-selected);pointer-events:none;z-index:2}:host ::ng-deep .md-editor__prosemirror table .column-resize-handle{position:absolute;inset-inline-end:-2px;inset-block:0;width:4px;background:var(--mde-primary);cursor:col-resize}:host ::ng-deep .md-editor__prosemirror.resize-cursor{cursor:col-resize}:host ::ng-deep .md-editor__prosemirror p.is-editor-empty:first-child:before{content:attr(data-placeholder);color:var(--mde-text-secondary);float:inline-start;pointer-events:none;height:0}:host ::ng-deep .ProseMirror-gapcursor{display:none;pointer-events:none;position:absolute}:host ::ng-deep .ProseMirror-gapcursor:after{content:\"\";display:block;position:absolute;top:-2px;width:20px;border-top:1px solid var(--mde-text, currentColor);animation:md-editor-gapcursor-blink 1.1s steps(2,start) infinite}:host ::ng-deep .ProseMirror-focused .ProseMirror-gapcursor{display:block}@keyframes md-editor-gapcursor-blink{to{visibility:hidden}}\n"] }]
|
|
6790
|
+
}], ctorParameters: () => [{ type: i3.UtilityService }, { type: GlobalSettings }, { type: i3.ControlValidationService }, { type: ControlUtility }, { type: i2.FormGroupDirective }, { type: i0.ChangeDetectorRef }, { type: i2.ControlContainer, decorators: [{
|
|
6627
6791
|
type: Optional
|
|
6628
6792
|
}] }], propDecorators: { group: [{
|
|
6629
6793
|
type: Input
|
|
@@ -6631,6 +6795,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.16", ngImpo
|
|
|
6631
6795
|
type: Input
|
|
6632
6796
|
}], OnChange: [{
|
|
6633
6797
|
type: Output
|
|
6798
|
+
}], editorBody: [{
|
|
6799
|
+
type: ViewChild,
|
|
6800
|
+
args: ['editorBody', { static: true }]
|
|
6634
6801
|
}] } });
|
|
6635
6802
|
|
|
6636
6803
|
class MultiLingualHtmlEditorComponent {
|
|
@@ -7080,13 +7247,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.16", ngImpo
|
|
|
7080
7247
|
*
|
|
7081
7248
|
* Contains rich text editor controls (~800 KB gzipped):
|
|
7082
7249
|
* - HtmlEditorComponent: WYSIWYG HTML editor
|
|
7083
|
-
* - MarkdownEditorComponent:
|
|
7250
|
+
* - MarkdownEditorComponent: Tiptap-powered markdown editor
|
|
7084
7251
|
* - MultiLingualHtmlEditorComponent: HTML editor with multilingual support
|
|
7085
7252
|
*
|
|
7086
7253
|
* Dependencies:
|
|
7087
7254
|
* - @kolkov/angular-editor (~300 KB)
|
|
7088
|
-
* -
|
|
7089
|
-
* - ngx-script-loader
|
|
7255
|
+
* - Tiptap
|
|
7090
7256
|
*
|
|
7091
7257
|
* @example New way (Recommended):
|
|
7092
7258
|
* ```typescript
|
|
@@ -7113,7 +7279,6 @@ class BBSFEditorsModule {
|
|
|
7113
7279
|
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.16", ngImport: i0, type: BBSFEditorsModule, imports: [CommonModule,
|
|
7114
7280
|
FormsModule,
|
|
7115
7281
|
ReactiveFormsModule,
|
|
7116
|
-
LMarkdownEditorModule,
|
|
7117
7282
|
BBSFUtilitiesModule,
|
|
7118
7283
|
// Import standalone components
|
|
7119
7284
|
HtmlEditorComponent,
|
|
@@ -7126,7 +7291,6 @@ class BBSFEditorsModule {
|
|
|
7126
7291
|
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.2.16", ngImport: i0, type: BBSFEditorsModule, imports: [CommonModule,
|
|
7127
7292
|
FormsModule,
|
|
7128
7293
|
ReactiveFormsModule,
|
|
7129
|
-
LMarkdownEditorModule,
|
|
7130
7294
|
BBSFUtilitiesModule,
|
|
7131
7295
|
// Import standalone components
|
|
7132
7296
|
HtmlEditorComponent,
|
|
@@ -7141,7 +7305,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.16", ngImpo
|
|
|
7141
7305
|
CommonModule,
|
|
7142
7306
|
FormsModule,
|
|
7143
7307
|
ReactiveFormsModule,
|
|
7144
|
-
LMarkdownEditorModule,
|
|
7145
7308
|
BBSFUtilitiesModule,
|
|
7146
7309
|
// Import standalone components
|
|
7147
7310
|
HtmlEditorComponent,
|
|
@@ -7917,7 +8080,7 @@ class FileUploadComponent {
|
|
|
7917
8080
|
this.OnChange.emit(value);
|
|
7918
8081
|
}
|
|
7919
8082
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.16", ngImport: i0, type: FileUploadComponent, deps: [{ token: i2.ControlContainer, optional: true }, { token: i2.FormGroupDirective }, { token: ControlUtility }, { token: i3.UtilityService }, { token: i3.ControlValidationService }, { token: GlobalSettings }, { token: FileUploadService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
7920
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.16", type: FileUploadComponent, isStandalone: true, selector: "BBSF-FileUpload", inputs: { group: "group", options: "options" }, outputs: { OnChange: "OnChange", isUploadComplete: "isUploadComplete" }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true }], ngImport: i0, template: "<div class=\"form-group bbsf-control bbsf-file-upload\" [formGroup]=\"group\">\r\n <div [ngClass]=\"options.viewType == 1 ? 'bbsf-vertical' : 'bbsf-horizontal'\">\r\n <!--label-->\r\n <label [hidden]=\"options.hideLabel\" class=\"bbsf-label {{ options.labelExtraClasses }}\">\r\n {{ options.labelValue }}\r\n <!--Asterisk-->\r\n <span *ngIf=\"((options.showAsterisk && options.isRequired) || options.isRequired) && !options.isReadonly\"\r\n class=\"text-danger\">*</span>\r\n </label>\r\n <!--Allow dropZone-->\r\n <div ng2FileDrop class=\"bbsf-input-container {{ options.extraClasses }}\"\r\n *ngIf=\"options.isDropZone && !(options.isMultipleFile == false && uploader.queue.length > 0) && !options.isReadonly\"\r\n [ngClass]=\"{ 'another-file-over-class': hasAnotherDropZoneOver }\" (onFileDrop)=\"onFileChange()\"\r\n (fileOver)=\"fileOverAnother($event)\" [uploader]=\"uploader\" [accept]=\"acceptedType\" id=\"{{ options.name }}\"\r\n multiple=\"{{ options.isMultipleFile ? 'multiple' : '' }}\" aria-invalid=\"true\" type=\"file\"\r\n [class.is-invalid]=\"fileUploadFormControl.invalid && fileUploadFormControl.touched\"\r\n (click)=\"fileInputDropZone.click()\">\r\n <div class=\"dropzone-label\">\r\n <div class=\"svg-and-validation\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"70\" height=\"70\" viewBox=\"0 0 70 70\" fill=\"none\">\r\n <path opacity=\"0.4\"\r\n d=\"M58.333 48.8332C61.8957 45.8908 64.1663 41.4397 64.1663 36.4583C64.1663 27.5988 56.9843 20.4167 48.1247 20.4167C47.4874 20.4167 46.8912 20.0842 46.5675 19.5351C42.7641 13.0808 35.7417 8.75 27.708 8.75C15.6268 8.75 5.83301 18.5438 5.83301 30.625C5.83301 36.6511 8.26974 42.1082 12.2116 46.0644\"\r\n stroke=\"#4B5489\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path d=\"M23.333 46.6667L34.9997 35M34.9997 35L46.6663 46.6667M34.9997 35V61.25\" stroke=\"#4B5489\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <!--Validation text-->\r\n <div class=\"bbsf-validation-msg validation-msg-header text-center\">\r\n {{ dropHeaderLabel }}\r\n </div>\r\n <div class=\"bbsf-validation-msg text-center\" *ngIf=\"validationMessage\" [innerHTML]=\"validationMessage\"></div>\r\n </div>\r\n </div>\r\n <input ng2FileSelect [uploader]=\"uploader\" [accept]=\"acceptedType\"\r\n class=\"fileSelector customFileUploadPlacment hidden v-required-multiplefiles d-none\"\r\n multiple=\"{{ options.isMultipleFile ? 'multiple' : '' }}\" name=\"file\" type=\"file\" value=\"\" autocomplete=\"off\"\r\n (change)=\"onFileChange()\" [ngClass]=\"options.viewType == 1 ? '' : 'col-md-9'\" id=\"{{ options.name }}\"\r\n aria-invalid=\"true\" #fileInputDropZone\r\n [class.is-invalid]=\"fileUploadFormControl.invalid && fileUploadFormControl.touched\" />\r\n </div>\r\n <!--Not allowed dropZone-->\r\n <div class=\"bbsf-input-container\" *ngIf=\"!options.isDropZone && !isHideInput() && !options.isReadonly\"\r\n (click)=\"fileInput.click()\">\r\n <div class=\"dropzone-label\">\r\n <div class=\"svg-and-validation\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"70\" height=\"70\" viewBox=\"0 0 70 70\" fill=\"none\">\r\n <path opacity=\"0.4\"\r\n d=\"M58.333 48.8332C61.8957 45.8908 64.1663 41.4397 64.1663 36.4583C64.1663 27.5988 56.9843 20.4167 48.1247 20.4167C47.4874 20.4167 46.8912 20.0842 46.5675 19.5351C42.7641 13.0808 35.7417 8.75 27.708 8.75C15.6268 8.75 5.83301 18.5438 5.83301 30.625C5.83301 36.6511 8.26974 42.1082 12.2116 46.0644\"\r\n stroke=\"#4B5489\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path d=\"M23.333 46.6667L34.9997 35M34.9997 35L46.6663 46.6667M34.9997 35V61.25\" stroke=\"#4B5489\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <!--Validation text-->\r\n <div class=\"bbsf-validation-msg text-center\">{{ headerLabel }}</div>\r\n <div class=\"bbsf-validation-msg text-center\" *ngIf=\"validationMessage\" [innerHTML]=\"validationMessage\"></div>\r\n </div>\r\n </div>\r\n <input ng2FileSelect [uploader]=\"uploader\" [accept]=\"acceptedType\"\r\n class=\"fileSelector customFileUploadPlacment hidden v-required-multiplefiles d-none\"\r\n multiple=\"{{ options.isMultipleFile ? 'multiple' : '' }}\" name=\"file\" type=\"file\" value=\"\" autocomplete=\"off\"\r\n (change)=\"onFileChange()\" [ngClass]=\"options.viewType == 1 ? '' : 'col-md-9'\" id=\"{{ options.name }}\"\r\n aria-invalid=\"true\" #fileInput\r\n [class.is-invalid]=\"fileUploadFormControl.invalid && fileUploadFormControl.touched\" />\r\n </div>\r\n <!-- readonly -->\r\n <div *ngIf=\"options.isReadonly && !options.value\">\r\n <span class=\"readonly-view\">{{ UtilityService.getResourceValue('NA') }}</span>\r\n </div>\r\n </div>\r\n <!--items uploaded-->\r\n <div class=\"uploaded-items\">\r\n <div class=\"btn-group\" *ngFor=\"let item of uploader.queue\">\r\n <ng-container *ngIf=\"item?.progress == 100 && options.isUploadFileAsync\">\r\n <a *ngIf=\"item?.file?.rawFile['url']\" href=\"{{ item?.file?.rawFile['url'] }}\"\r\n class=\"btn-download-file btn-sm btn-progress-upload\" download>\r\n <span class=\"file-name\">{{ sanitizeFileName(item?.file?.name || '') }}</span>\r\n </a>\r\n <a *ngIf=\"item?.file?.rawFile['url'] == null\" class=\"btn-download-file btn-sm btn-progress-upload\">\r\n <span class=\"file-name\">{{ sanitizeFileName(item?.file?.name || '') }}</span>\r\n </a>\r\n <button *ngIf=\"!options.isReadonly\" class=\"btn btn-download-file btn-sm\"\r\n (click)=\"item.remove(); removeFromControlValue(item)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\r\n <path opacity=\"0.4\"\r\n d=\"M9.33301 3.70584V3.26663C9.33301 2.65166 9.33301 2.34419 9.20587 2.1093C9.09405 1.9027 8.91555 1.73471 8.69604 1.62944C8.44647 1.50977 8.11977 1.50977 7.46638 1.50977H6.53305C5.87965 1.50977 5.55296 1.50977 5.30339 1.62944C5.08387 1.73471 4.90539 1.9027 4.79354 2.1093C4.66638 2.34419 4.66638 2.65166 4.66638 3.26663V3.70584\"\r\n stroke=\"#D83731\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M1.75 3.70605H12.25M11.0834 3.70605V9.8551C11.0834 10.7775 11.0834 11.2387 10.8926 11.591C10.7248 11.901 10.4571 12.1529 10.1278 12.3109C9.75345 12.4904 9.26345 12.4904 8.28334 12.4904H5.71666C4.73658 12.4904 4.24653 12.4904 3.87218 12.3109C3.5429 12.1529 3.27519 11.901 3.10741 11.591C2.91666 11.2387 2.91666 10.7775 2.91666 9.8551V3.70605\"\r\n stroke=\"#D83731\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n </ng-container>\r\n <ng-container *ngIf=\"!options.isUploadFileAsync\">\r\n <a href=\"{{ item?.file?.rawFile['url'] }}\" *ngIf=\"item?.file?.rawFile['url']\" class=\"btn btn-download-file btn-sm\" download>\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M21 22H3C2.4 22 2 21.6 2 21C2 20.4 2.4 20 3 20H21C21.6 20 22 20.4 22 21C22 21.6 21.6 22 21 22ZM13 13.4V3C13 2.4 12.6 2 12 2C11.4 2 11 2.4 11 3V13.4H13Z\"\r\n fill=\"currentColor\"></path>\r\n <path opacity=\"0.3\" d=\"M7 13.4H17L12.7 17.7C12.3 18.1 11.7 18.1 11.3 17.7L7 13.4Z\" fill=\"currentColor\">\r\n </path>\r\n </svg>\r\n <span class=\"file-name\">{{ sanitizeFileName(item?.file?.name || '') }}</span>\r\n </a>\r\n <a *ngIf=\"item?.file?.rawFile['url'] == null\" class=\"btn-download-file btn-sm btn-progress-upload\">\r\n <span class=\"file-name\">{{ sanitizeFileName(item?.file?.name || '') }}</span>\r\n </a>\r\n <button *ngIf=\"!options.isReadonly\" class=\"btn btn-download-file btn-sm btn-danger\"\r\n (click)=\"item.remove(); removeFromControlValue(item)\">\r\n <i class=\"fa fa-times px-0\"></i>\r\n </button>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <!--progress bar file upload-->\r\n <div *ngFor=\"let item of uploader.queue\">\r\n <div class=\"upload-items\" [ngClass]=\"{ 'mt-4': options.isMultipleFile == true }\"\r\n *ngIf=\"item?.progress < 100 && options.isUploadFileAsync\">\r\n <div class=\"upload-items-toolbar\">\r\n <h4>{{ item?.file?.name }}</h4>\r\n <span (click)=\"item.remove(); removeFromControlValue(item)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1324_13216)\">\r\n <path opacity=\"0.4\"\r\n d=\"M9 16.5C13.1421 16.5 16.5 13.1421 16.5 9C16.5 4.85786 13.1421 1.5 9 1.5C4.85786 1.5 1.5 4.85786 1.5 9C1.5 13.1421 4.85786 16.5 9 16.5Z\"\r\n stroke=\"#DBE1F0\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path d=\"M11.25 6.75L6.75 11.25M6.75 6.75L11.25 11.25\" stroke=\"#DBE1F0\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1324_13216\">\r\n <rect width=\"18\" height=\"18\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </span>\r\n </div>\r\n <div class=\"progress\">\r\n <div class=\"progress-bar\" role=\"progressbar\" aria-valuenow=\"70\" aria-valuemin=\"0\" aria-valuemax=\"100\"\r\n [class.file-uploaded]=\"item?.progress < 100\" [style.width.%]=\"item?.progress\" *ngIf=\"item?.progress > 0\">\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"subtext-container\" *ngIf=\"!options.isReadonly\">\r\n <!-- required text-->\r\n <div class=\"bbsf-validation\" *ngIf=\"maxFilesReached\">\r\n {{maxFilesValidationMsg}}\r\n </div>\r\n <div class=\"bbsf-validation\" *ngIf=\"fileUploadFormControl.invalid && fileUploadFormControl.touched\">\r\n {{ getErrorValidation(fileUploadFormControl.errors | keyvalue) }}\r\n </div>\r\n <!-- LabelDescription-->\r\n <div class=\"bbsf-control-desc\" *ngIf=\"options.labelDescription != null\">{{ options.labelDescription }}</div>\r\n <div *ngIf=\"(group.valid && group.dirty && group.touched) || (group.untouched && group.invalid && group.dirty)\">\r\n {{ resetError() }}\r\n </div>\r\n </div>\r\n</div>\r\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i5.KeyValuePipe, name: "keyvalue" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: FileUploadModule }, { kind: "directive", type: i5$3.FileDropDirective, selector: "[ng2FileDrop]", inputs: ["uploader"], outputs: ["fileOver", "onFileDrop"] }, { kind: "directive", type: i5$3.FileSelectDirective, selector: "[ng2FileSelect]", inputs: ["uploader"], outputs: ["onFileSelected"] }, { kind: "ngmodule", type: NgxDropzoneModule }] }); }
|
|
8083
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.16", type: FileUploadComponent, isStandalone: true, selector: "BBSF-FileUpload", inputs: { group: "group", options: "options" }, outputs: { OnChange: "OnChange", isUploadComplete: "isUploadComplete" }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true }], ngImport: i0, template: "<div class=\"form-group bbsf-control bbsf-file-upload\" [formGroup]=\"group\">\r\n <div [ngClass]=\"options.viewType == 1 ? 'bbsf-vertical' : 'bbsf-horizontal'\">\r\n <!--label-->\r\n <label [hidden]=\"options.hideLabel\" class=\"bbsf-label {{ options.labelExtraClasses }}\">\r\n {{ options.labelValue }}\r\n <!--Asterisk-->\r\n <span *ngIf=\"((options.showAsterisk && options.isRequired) || options.isRequired) && !options.isReadonly\"\r\n class=\"text-danger\">*</span>\r\n </label>\r\n <!--Allow dropZone-->\r\n <div ng2FileDrop class=\"bbsf-input-container {{ options.extraClasses }}\"\r\n *ngIf=\"options.isDropZone && !(options.isMultipleFile == false && uploader.queue.length > 0) && !options.isReadonly\"\r\n [ngClass]=\"{ 'another-file-over-class': hasAnotherDropZoneOver }\" (onFileDrop)=\"onFileChange()\"\r\n (fileOver)=\"fileOverAnother($event)\" [uploader]=\"uploader\" [accept]=\"acceptedType\" id=\"{{ options.name }}\"\r\n multiple=\"{{ options.isMultipleFile ? 'multiple' : '' }}\" aria-invalid=\"true\" type=\"file\"\r\n [class.is-invalid]=\"fileUploadFormControl.invalid && fileUploadFormControl.touched\"\r\n (click)=\"fileInputDropZone.click()\">\r\n <div class=\"dropzone-label\">\r\n <div class=\"svg-and-validation\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"70\" height=\"70\" viewBox=\"0 0 70 70\" fill=\"none\">\r\n <path opacity=\"0.4\"\r\n d=\"M58.333 48.8332C61.8957 45.8908 64.1663 41.4397 64.1663 36.4583C64.1663 27.5988 56.9843 20.4167 48.1247 20.4167C47.4874 20.4167 46.8912 20.0842 46.5675 19.5351C42.7641 13.0808 35.7417 8.75 27.708 8.75C15.6268 8.75 5.83301 18.5438 5.83301 30.625C5.83301 36.6511 8.26974 42.1082 12.2116 46.0644\"\r\n stroke=\"#4B5489\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path d=\"M23.333 46.6667L34.9997 35M34.9997 35L46.6663 46.6667M34.9997 35V61.25\" stroke=\"#4B5489\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <!--Validation text-->\r\n <div class=\"bbsf-validation-msg validation-msg-header text-center\">\r\n {{ dropHeaderLabel }}\r\n </div>\r\n <div class=\"bbsf-validation-msg text-center\" *ngIf=\"validationMessage\" [innerHTML]=\"validationMessage\"></div>\r\n </div>\r\n </div>\r\n <input ng2FileSelect [uploader]=\"uploader\" [accept]=\"acceptedType\"\r\n class=\"fileSelector customFileUploadPlacment hidden v-required-multiplefiles d-none\"\r\n multiple=\"{{ options.isMultipleFile ? 'multiple' : '' }}\" name=\"file\" type=\"file\" value=\"\" autocomplete=\"off\"\r\n (change)=\"onFileChange()\" [ngClass]=\"options.viewType == 1 ? '' : 'col-md-9'\" id=\"{{ options.name }}\"\r\n aria-invalid=\"true\" #fileInputDropZone\r\n [class.is-invalid]=\"fileUploadFormControl.invalid && fileUploadFormControl.touched\" />\r\n </div>\r\n <!--Not allowed dropZone-->\r\n <div class=\"bbsf-input-container\" *ngIf=\"!options.isDropZone && !isHideInput() && !options.isReadonly\"\r\n (click)=\"fileInput.click()\">\r\n <div class=\"dropzone-label\">\r\n <div class=\"svg-and-validation\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"70\" height=\"70\" viewBox=\"0 0 70 70\" fill=\"none\">\r\n <path opacity=\"0.4\"\r\n d=\"M58.333 48.8332C61.8957 45.8908 64.1663 41.4397 64.1663 36.4583C64.1663 27.5988 56.9843 20.4167 48.1247 20.4167C47.4874 20.4167 46.8912 20.0842 46.5675 19.5351C42.7641 13.0808 35.7417 8.75 27.708 8.75C15.6268 8.75 5.83301 18.5438 5.83301 30.625C5.83301 36.6511 8.26974 42.1082 12.2116 46.0644\"\r\n stroke=\"#4B5489\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path d=\"M23.333 46.6667L34.9997 35M34.9997 35L46.6663 46.6667M34.9997 35V61.25\" stroke=\"#4B5489\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <!--Validation text-->\r\n <div class=\"bbsf-validation-msg text-center\">{{ headerLabel }}</div>\r\n <div class=\"bbsf-validation-msg text-center\" *ngIf=\"validationMessage\" [innerHTML]=\"validationMessage\"></div>\r\n </div>\r\n </div>\r\n <input ng2FileSelect [uploader]=\"uploader\" [accept]=\"acceptedType\"\r\n class=\"fileSelector customFileUploadPlacment hidden v-required-multiplefiles d-none\"\r\n multiple=\"{{ options.isMultipleFile ? 'multiple' : '' }}\" name=\"file\" type=\"file\" value=\"\" autocomplete=\"off\"\r\n (change)=\"onFileChange()\" [ngClass]=\"options.viewType == 1 ? '' : 'col-md-9'\" id=\"{{ options.name }}\"\r\n aria-invalid=\"true\" #fileInput\r\n [class.is-invalid]=\"fileUploadFormControl.invalid && fileUploadFormControl.touched\" />\r\n </div>\r\n <!-- readonly -->\r\n <div *ngIf=\"options.isReadonly && !options.value\">\r\n <span class=\"readonly-view\">{{ UtilityService.getResourceValue('NA') }}</span>\r\n </div>\r\n </div>\r\n <!--items uploaded-->\r\n <div class=\"uploaded-items\">\r\n <div class=\"btn-group\" *ngFor=\"let item of uploader.queue\">\r\n <ng-container *ngIf=\"item?.progress == 100 && options.isUploadFileAsync\">\r\n <a *ngIf=\"item?.file?.rawFile['url']\" href=\"{{ item?.file?.rawFile['url'] }}\"\r\n class=\"btn-download-file btn-sm btn-progress-upload\" download>\r\n <span class=\"file-name\">{{ sanitizeFileName(item?.file?.name || '') }}</span>\r\n </a>\r\n <a *ngIf=\"item?.file?.rawFile['url'] == null\" class=\"btn-download-file btn-sm btn-progress-upload\">\r\n <span class=\"file-name\">{{ sanitizeFileName(item?.file?.name || '') }}</span>\r\n </a>\r\n <button *ngIf=\"!options.isReadonly\" class=\"btn btn-download-file btn-sm\"\r\n (click)=\"item.remove(); removeFromControlValue(item)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\r\n <path opacity=\"0.4\"\r\n d=\"M9.33301 3.70584V3.26663C9.33301 2.65166 9.33301 2.34419 9.20587 2.1093C9.09405 1.9027 8.91555 1.73471 8.69604 1.62944C8.44647 1.50977 8.11977 1.50977 7.46638 1.50977H6.53305C5.87965 1.50977 5.55296 1.50977 5.30339 1.62944C5.08387 1.73471 4.90539 1.9027 4.79354 2.1093C4.66638 2.34419 4.66638 2.65166 4.66638 3.26663V3.70584\"\r\n stroke=\"#D83731\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M1.75 3.70605H12.25M11.0834 3.70605V9.8551C11.0834 10.7775 11.0834 11.2387 10.8926 11.591C10.7248 11.901 10.4571 12.1529 10.1278 12.3109C9.75345 12.4904 9.26345 12.4904 8.28334 12.4904H5.71666C4.73658 12.4904 4.24653 12.4904 3.87218 12.3109C3.5429 12.1529 3.27519 11.901 3.10741 11.591C2.91666 11.2387 2.91666 10.7775 2.91666 9.8551V3.70605\"\r\n stroke=\"#D83731\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n </ng-container>\r\n <ng-container *ngIf=\"!options.isUploadFileAsync\">\r\n <a href=\"{{ item?.file?.rawFile['url'] }}\" *ngIf=\"item?.file?.rawFile['url']\" class=\"btn btn-download-file btn-sm\" download>\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M21 22H3C2.4 22 2 21.6 2 21C2 20.4 2.4 20 3 20H21C21.6 20 22 20.4 22 21C22 21.6 21.6 22 21 22ZM13 13.4V3C13 2.4 12.6 2 12 2C11.4 2 11 2.4 11 3V13.4H13Z\"\r\n fill=\"currentColor\"></path>\r\n <path opacity=\"0.3\" d=\"M7 13.4H17L12.7 17.7C12.3 18.1 11.7 18.1 11.3 17.7L7 13.4Z\" fill=\"currentColor\">\r\n </path>\r\n </svg>\r\n <span class=\"file-name\">{{ sanitizeFileName(item?.file?.name || '') }}</span>\r\n </a>\r\n <a *ngIf=\"item?.file?.rawFile['url'] == null\" class=\"btn-download-file btn-sm btn-progress-upload\">\r\n <span class=\"file-name\">{{ sanitizeFileName(item?.file?.name || '') }}</span>\r\n </a>\r\n <button *ngIf=\"!options.isReadonly\" class=\"btn btn-download-file btn-sm btn-danger\"\r\n (click)=\"item.remove(); removeFromControlValue(item)\">\r\n <i class=\"fa fa-times px-0\"></i>\r\n </button>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <!--progress bar file upload-->\r\n <div *ngFor=\"let item of uploader.queue\">\r\n <div class=\"upload-items\" [ngClass]=\"{ 'mt-4': options.isMultipleFile == true }\"\r\n *ngIf=\"item?.progress < 100 && options.isUploadFileAsync\">\r\n <div class=\"upload-items-toolbar\">\r\n <h4>{{ item?.file?.name }}</h4>\r\n <span (click)=\"item.remove(); removeFromControlValue(item)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1324_13216)\">\r\n <path opacity=\"0.4\"\r\n d=\"M9 16.5C13.1421 16.5 16.5 13.1421 16.5 9C16.5 4.85786 13.1421 1.5 9 1.5C4.85786 1.5 1.5 4.85786 1.5 9C1.5 13.1421 4.85786 16.5 9 16.5Z\"\r\n stroke=\"#DBE1F0\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path d=\"M11.25 6.75L6.75 11.25M6.75 6.75L11.25 11.25\" stroke=\"#DBE1F0\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1324_13216\">\r\n <rect width=\"18\" height=\"18\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </span>\r\n </div>\r\n <div class=\"progress\">\r\n <div class=\"progress-bar\" role=\"progressbar\" aria-valuenow=\"70\" aria-valuemin=\"0\" aria-valuemax=\"100\"\r\n [class.file-uploaded]=\"item?.progress < 100\" [style.width.%]=\"item?.progress\" *ngIf=\"item?.progress > 0\">\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"subtext-container\" *ngIf=\"!options.isReadonly\">\r\n <!-- required text-->\r\n <div class=\"bbsf-validation\" *ngIf=\"maxFilesReached\">\r\n {{maxFilesValidationMsg}}\r\n </div>\r\n <div class=\"bbsf-validation\" *ngIf=\"fileUploadFormControl.invalid && fileUploadFormControl.touched\">\r\n {{ getErrorValidation(fileUploadFormControl.errors | keyvalue) }}\r\n </div>\r\n <!-- LabelDescription-->\r\n <div class=\"bbsf-control-desc\" *ngIf=\"options.labelDescription != null\">{{ options.labelDescription }}</div>\r\n <div *ngIf=\"(group.valid && group.dirty && group.touched) || (group.untouched && group.invalid && group.dirty)\">\r\n {{ resetError() }}\r\n </div>\r\n </div>\r\n</div>\r\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i5.KeyValuePipe, name: "keyvalue" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: FileUploadModule }, { kind: "directive", type: i5$2.FileDropDirective, selector: "[ng2FileDrop]", inputs: ["uploader"], outputs: ["fileOver", "onFileDrop"] }, { kind: "directive", type: i5$2.FileSelectDirective, selector: "[ng2FileSelect]", inputs: ["uploader"], outputs: ["onFileSelected"] }, { kind: "ngmodule", type: NgxDropzoneModule }] }); }
|
|
7921
8084
|
}
|
|
7922
8085
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.16", ngImport: i0, type: FileUploadComponent, decorators: [{
|
|
7923
8086
|
type: Component,
|
|
@@ -8261,7 +8424,7 @@ class ImageUploaderComponent {
|
|
|
8261
8424
|
this.mdlSampleIsOpen = open;
|
|
8262
8425
|
}
|
|
8263
8426
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.16", ngImport: i0, type: ImageUploaderComponent, deps: [{ token: i0.NgZone }, { token: ControlUtility }, { token: i2.ControlContainer, optional: true }, { token: i2.FormGroupDirective }, { token: i3.UtilityService }, { token: i3.ControlValidationService }, { token: GlobalSettings }, { token: i3$2.NgbModal }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
8264
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.16", type: ImageUploaderComponent, isStandalone: true, selector: "BBSF-ImageUpload", inputs: { group: "group", options: "options" }, outputs: { onChange: "onChange" }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true }, { propertyName: "angularCropper", first: true, predicate: ["angularCropper"], descendants: true }], ngImport: i0, template: "<div class=\"form-group bbsf-control bbsf-image-upload\" [formGroup]=\"group\">\r\n <div [ngClass]=\"(options.viewType==1)?'bbsf-vertical':'bbsf-horizontal'\">\r\n <!--label-->\r\n <label [hidden]=\"options.hideLabel\" class=\"bbsf-label {{options.labelExtraClasses}}\">\r\n {{options.labelValue}}\r\n <!--Asterisk-->\r\n <span *ngIf=\"((options.showAsterisk&&options.isRequired)||(options.isRequired))&&!options.isReadonly\"\r\n class=\"text-danger\">*</span>\r\n </label>\r\n <!--Allow dropZone-->\r\n <div *ngIf=\"options.allowDropZone&&!options.isReadonly\" class=\"bbsf-input-container {{options.extraClasses}}\"\r\n ngx-dropzone [disabled]=\"options.isDisabled\" [accept]=\"acceptedType\" [multiple]=\"options.isMultiple\"\r\n (change)=\"onFileChange($event)\" ngDefaultControl formControlName=\"{{options.name}}\" [maxFileSize]=\"maxFileSize\"\r\n id=\"{{options.name}}\" [class.is-invalid]=\"imageUploadFormControl.invalid && imageUploadFormControl.touched\">\r\n <ngx-dropzone-label class=\"dropzone-label\">\r\n <img *ngIf=\"imageSource\" [src]=\"imageSource\"\r\n style=\"align-items: center;border-radius: 5px;display: flex;height: 100px;justify-content: center;margin: 10px;max-width: 180px;min-height: 100px;min-width: 180px;padding: 0px 20px;position: relative;\" />\r\n <div class=\"svg-and-validation\" *ngIf=\"!imageSource\">\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\r\n style=\"width: 50px; height: 50px;\">\r\n <path opacity=\"0.3\"\r\n d=\"M5 16C3.3 16 2 14.7 2 13C2 11.3 3.3 10 5 10H5.1C5 9.7 5 9.3 5 9C5 6.2 7.2 4 10 4C11.9 4 13.5 5 14.3 6.5C14.8 6.2 15.4 6 16 6C17.7 6 19 7.3 19 9C19 9.4 18.9 9.7 18.8 10C18.9 10 18.9 10 19 10C20.7 10 22 11.3 22 13C22 14.7 20.7 16 19 16H5ZM8 13.6H16L12.7 10.3C12.3 9.89999 11.7 9.89999 11.3 10.3L8 13.6Z\"\r\n fill=\"currentColor\" style=\"fill: #a1a1a1;\"></path>\r\n <path d=\"M11 13.6V19C11 19.6 11.4 20 12 20C12.6 20 13 19.6 13 19V13.6H11Z\" fill=\"currentColor\"\r\n style=\"fill: #989898;\"></path>\r\n </svg>\r\n <!--Validation text-->\r\n <div class=\"bbsf-validation-msg\" *ngIf=\"validationMessage\" [innerHTML]=\"validationMessage\"></div>\r\n </div>\r\n </ngx-dropzone-label>\r\n <ngx-dropzone-image-preview class=\"dropzone-preview\" *ngFor=\"let f of files\" [file]=\"f\" [removable]=\"true\"\r\n (removed)=\"removeFromControlValue(f)\" ngProjectAs=\"ngx-dropzone-preview\">\r\n </ngx-dropzone-image-preview>\r\n </div>\r\n <!--Not allowed dropZone-->\r\n <div *ngIf=\"!options.allowDropZone&&!options.isReadonly\">\r\n <ngx-dropzone-label *ngIf=\"files.length==0\">\r\n <div #element (click)=\"showImageUploader(element)\">\r\n <img [src]=\"imageSource\" />\r\n </div>\r\n </ngx-dropzone-label>\r\n <div class=\"d-none {{options.extraClasses}}\" ngx-dropzone [disabled]=\"options.isDisabled\" [accept]=\"acceptedType\"\r\n [multiple]=\"options.isMultiple\" (change)=\"onFileChange($event)\" ngDefaultControl\r\n formControlName=\"{{options.name}}\" [maxFileSize]=\"maxFileSize\" id=\"{{options.name}}\"\r\n [class.is-invalid]=\"imageUploadFormControl.invalid && imageUploadFormControl.touched\">\r\n </div>\r\n <ngx-dropzone-image-preview *ngFor=\"let f of files\" [file]=\"f\" [removable]=\"true\"\r\n (removed)=\"removeFromControlValue(f)\" ngProjectAs=\"ngx-dropzone-preview\">\r\n </ngx-dropzone-image-preview>\r\n <!--Validation text-->\r\n <div class=\"bbsf-validation-msg\" *ngIf=\"validationMessage\" [innerHTML]=\"validationMessage\"></div>\r\n </div>\r\n\r\n <ngx-dropzone-label *ngIf=\"files.length==0&&options.isReadonly\">\r\n <div *ngIf=\"imageSource\" #element>\r\n <img [src]=\"imageSource\" />\r\n </div>\r\n <div *ngIf=\"!imageSource\">\r\n <span class=\"readonly-view\">{{utilityService.getResourceValue('NA')}}</span>\r\n </div>\r\n </ngx-dropzone-label>\r\n </div>\r\n <div class=\"subtext-container\" *ngIf=\"!options.isReadonly\">\r\n <!-- required text-->\r\n <div class=\"bbsf-validation\" *ngIf=\"(imageUploadFormControl.invalid && imageUploadFormControl.touched)\">\r\n {{getErrorValidation(imageUploadFormControl.errors|keyvalue)}}\r\n </div>\r\n\r\n <!-- LabelDescription-->\r\n <div class=\"bbsf-control-desc\" *ngIf=\"options.labelDescription!=null\">{{options.labelDescription}}</div>\r\n <div *ngIf=\"(group.valid&&group.dirty&&group.touched )||(group.untouched&&group.invalid&&group.dirty) \">\r\n {{resetError()}}</div>\r\n </div>\r\n <!-- image cropper modal-->\r\n <div id=\"mdlSample\" class=\"modal bbsf-cropper-modal\" role=\"dialog\"\r\n [ngStyle]=\"{'display': mdlSampleIsOpen ? 'block' : 'none', 'opacity': 1}\">\r\n <div class=\"modal-dialog modal-lg\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title\">\r\n {{utilityService.getResourceValue(\"CropImage\")}}\r\n </h4>\r\n <button type=\"button\" class=\"btn-close\" data-dismiss=\"modal\" (click)=\"openModal(false)\"></button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div *ngIf=\"imageUrl\">\r\n <angular-cropper #angularCropper [cropperOptions]=\"config\" [imageUrl]=\"imageUrl\">\r\n </angular-cropper>\r\n <img [src]=\"imgwUrl\" />\r\n </div>\r\n <div class=\"cropper-btns\">\r\n <div class=\"btn-group\">\r\n <button type=\"button\" (click)=\"zoomImage(0.1)\" class=\"btn btn-default\"\r\n ngbTooltip='{{utilityService.getResourceValue(\"ZoomIn\")}}'>\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-search-plus\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"zoomImage(-0.1)\" class=\"btn btn-default\"\r\n ngbTooltip='{{utilityService.getResourceValue(\"ZoomOut\")}}'>\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-search-minus\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"btn-group\">\r\n <button type=\"button\" (click)=\"moveImage(-10,0)\" class=\"btn btn-default\"\r\n ngbTooltip='{{utilityService.getResourceValue(\"MoveLeft\")}}'>\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-arrow-left\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"moveImage(10,0)\" class=\"btn btn-default\"\r\n ngbTooltip='{{utilityService.getResourceValue(\"MoveRight\")}}'>\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-arrow-right\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"moveImage(0,-10)\" class=\"btn btn-default\"\r\n ngbTooltip='{{utilityService.getResourceValue(\"MoveUp\")}}'>\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-arrow-up\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"moveImage(0,10)\" class=\"btn btn-default\"\r\n ngbTooltip='{{utilityService.getResourceValue(\"MoveDown\")}}'>\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-arrow-down\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"btn-group\">\r\n <button type=\"button\" (click)=\"rotateImage(-45)\" class=\"btn btn-default\"\r\n ngbTooltip='{{utilityService.getResourceValue(\"RotateLeft\")}}'>\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-undo-alt\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"rotateImage(45)\" class=\"btn btn-default\"\r\n ngbTooltip='{{utilityService.getResourceValue(\"RotateRight\")}}'>\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-redo-alt\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\" align=\"right\">\r\n <button type=\"button\" id=\"btnClose\" class=\"btn btn-sm btn-light\" (click)=\"openModal(false)\">\r\n {{utilityService.getResourceValue(\"CancelLabel\")}}\r\n </button>\r\n <button type=\"button\" (click)=\"cropImage()\" id=\"btnOK\" class=\"btn btn-sm btn-brand\">\r\n {{utilityService.getResourceValue(\"Crop\")}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- readonly -->\r\n\r\n\r\n</div>", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "pipe", type: i5.KeyValuePipe, name: "keyvalue" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: FileUploadModule }, { kind: "ngmodule", type: NgxDropzoneModule }, { kind: "component", type: i7$4.NgxDropzoneComponent, selector: "ngx-dropzone, [ngx-dropzone]", inputs: ["accept", "disabled", "multiple", "maxFileSize", "expandable", "disableClick", "processDirectoryDrop", "id", "aria-label", "aria-labelledby", "aria-describedby"], outputs: ["change"] }, { kind: "directive", type: i7$4.NgxDropzoneLabelDirective, selector: "ngx-dropzone-label" }, { kind: "component", type: i7$4.NgxDropzoneImagePreviewComponent, selector: "ngx-dropzone-image-preview", inputs: ["file"] }, { kind: "ngmodule", type: AngularCropperjsModule }, { kind: "component", type: i8.CropperComponent, selector: "angular-cropper", inputs: ["imageUrl", "settings", "cropbox", "loadImageErrorText", "cropperOptions"], outputs: ["export", "ready"] }, { kind: "ngmodule", type: NgbModule }, { kind: "directive", type: i3$2.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }] }); }
|
|
8427
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.16", type: ImageUploaderComponent, isStandalone: true, selector: "BBSF-ImageUpload", inputs: { group: "group", options: "options" }, outputs: { onChange: "onChange" }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true }, { propertyName: "angularCropper", first: true, predicate: ["angularCropper"], descendants: true }], ngImport: i0, template: "<div class=\"form-group bbsf-control bbsf-image-upload\" [formGroup]=\"group\">\r\n <div [ngClass]=\"(options.viewType==1)?'bbsf-vertical':'bbsf-horizontal'\">\r\n <!--label-->\r\n <label [hidden]=\"options.hideLabel\" class=\"bbsf-label {{options.labelExtraClasses}}\">\r\n {{options.labelValue}}\r\n <!--Asterisk-->\r\n <span *ngIf=\"((options.showAsterisk&&options.isRequired)||(options.isRequired))&&!options.isReadonly\"\r\n class=\"text-danger\">*</span>\r\n </label>\r\n <!--Allow dropZone-->\r\n <div *ngIf=\"options.allowDropZone&&!options.isReadonly\" class=\"bbsf-input-container {{options.extraClasses}}\"\r\n ngx-dropzone [disabled]=\"options.isDisabled\" [accept]=\"acceptedType\" [multiple]=\"options.isMultiple\"\r\n (change)=\"onFileChange($event)\" ngDefaultControl formControlName=\"{{options.name}}\" [maxFileSize]=\"maxFileSize\"\r\n id=\"{{options.name}}\" [class.is-invalid]=\"imageUploadFormControl.invalid && imageUploadFormControl.touched\">\r\n <ngx-dropzone-label class=\"dropzone-label\">\r\n <img *ngIf=\"imageSource\" [src]=\"imageSource\"\r\n style=\"align-items: center;border-radius: 5px;display: flex;height: 100px;justify-content: center;margin: 10px;max-width: 180px;min-height: 100px;min-width: 180px;padding: 0px 20px;position: relative;\" />\r\n <div class=\"svg-and-validation\" *ngIf=\"!imageSource\">\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\r\n style=\"width: 50px; height: 50px;\">\r\n <path opacity=\"0.3\"\r\n d=\"M5 16C3.3 16 2 14.7 2 13C2 11.3 3.3 10 5 10H5.1C5 9.7 5 9.3 5 9C5 6.2 7.2 4 10 4C11.9 4 13.5 5 14.3 6.5C14.8 6.2 15.4 6 16 6C17.7 6 19 7.3 19 9C19 9.4 18.9 9.7 18.8 10C18.9 10 18.9 10 19 10C20.7 10 22 11.3 22 13C22 14.7 20.7 16 19 16H5ZM8 13.6H16L12.7 10.3C12.3 9.89999 11.7 9.89999 11.3 10.3L8 13.6Z\"\r\n fill=\"currentColor\" style=\"fill: #a1a1a1;\"></path>\r\n <path d=\"M11 13.6V19C11 19.6 11.4 20 12 20C12.6 20 13 19.6 13 19V13.6H11Z\" fill=\"currentColor\"\r\n style=\"fill: #989898;\"></path>\r\n </svg>\r\n <!--Validation text-->\r\n <div class=\"bbsf-validation-msg\" *ngIf=\"validationMessage\" [innerHTML]=\"validationMessage\"></div>\r\n </div>\r\n </ngx-dropzone-label>\r\n <ngx-dropzone-image-preview class=\"dropzone-preview\" *ngFor=\"let f of files\" [file]=\"f\" [removable]=\"true\"\r\n (removed)=\"removeFromControlValue(f)\" ngProjectAs=\"ngx-dropzone-preview\">\r\n </ngx-dropzone-image-preview>\r\n </div>\r\n <!--Not allowed dropZone-->\r\n <div *ngIf=\"!options.allowDropZone&&!options.isReadonly\">\r\n <ngx-dropzone-label *ngIf=\"files.length==0\">\r\n <div #element (click)=\"showImageUploader(element)\">\r\n <img [src]=\"imageSource\" />\r\n </div>\r\n </ngx-dropzone-label>\r\n <div class=\"d-none {{options.extraClasses}}\" ngx-dropzone [disabled]=\"options.isDisabled\" [accept]=\"acceptedType\"\r\n [multiple]=\"options.isMultiple\" (change)=\"onFileChange($event)\" ngDefaultControl\r\n formControlName=\"{{options.name}}\" [maxFileSize]=\"maxFileSize\" id=\"{{options.name}}\"\r\n [class.is-invalid]=\"imageUploadFormControl.invalid && imageUploadFormControl.touched\">\r\n </div>\r\n <ngx-dropzone-image-preview *ngFor=\"let f of files\" [file]=\"f\" [removable]=\"true\"\r\n (removed)=\"removeFromControlValue(f)\" ngProjectAs=\"ngx-dropzone-preview\">\r\n </ngx-dropzone-image-preview>\r\n <!--Validation text-->\r\n <div class=\"bbsf-validation-msg\" *ngIf=\"validationMessage\" [innerHTML]=\"validationMessage\"></div>\r\n </div>\r\n\r\n <ngx-dropzone-label *ngIf=\"files.length==0&&options.isReadonly\">\r\n <div *ngIf=\"imageSource\" #element>\r\n <img [src]=\"imageSource\" />\r\n </div>\r\n <div *ngIf=\"!imageSource\">\r\n <span class=\"readonly-view\">{{utilityService.getResourceValue('NA')}}</span>\r\n </div>\r\n </ngx-dropzone-label>\r\n </div>\r\n <div class=\"subtext-container\" *ngIf=\"!options.isReadonly\">\r\n <!-- required text-->\r\n <div class=\"bbsf-validation\" *ngIf=\"(imageUploadFormControl.invalid && imageUploadFormControl.touched)\">\r\n {{getErrorValidation(imageUploadFormControl.errors|keyvalue)}}\r\n </div>\r\n\r\n <!-- LabelDescription-->\r\n <div class=\"bbsf-control-desc\" *ngIf=\"options.labelDescription!=null\">{{options.labelDescription}}</div>\r\n <div *ngIf=\"(group.valid&&group.dirty&&group.touched )||(group.untouched&&group.invalid&&group.dirty) \">\r\n {{resetError()}}</div>\r\n </div>\r\n <!-- image cropper modal-->\r\n <div id=\"mdlSample\" class=\"modal bbsf-cropper-modal\" role=\"dialog\"\r\n [ngStyle]=\"{'display': mdlSampleIsOpen ? 'block' : 'none', 'opacity': 1}\">\r\n <div class=\"modal-dialog modal-lg\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title\">\r\n {{utilityService.getResourceValue(\"CropImage\")}}\r\n </h4>\r\n <button type=\"button\" class=\"btn-close\" data-dismiss=\"modal\" (click)=\"openModal(false)\"></button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div *ngIf=\"imageUrl\">\r\n <angular-cropper #angularCropper [cropperOptions]=\"config\" [imageUrl]=\"imageUrl\">\r\n </angular-cropper>\r\n <img [src]=\"imgwUrl\" />\r\n </div>\r\n <div class=\"cropper-btns\">\r\n <div class=\"btn-group\">\r\n <button type=\"button\" (click)=\"zoomImage(0.1)\" class=\"btn btn-default\"\r\n ngbTooltip='{{utilityService.getResourceValue(\"ZoomIn\")}}'>\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-search-plus\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"zoomImage(-0.1)\" class=\"btn btn-default\"\r\n ngbTooltip='{{utilityService.getResourceValue(\"ZoomOut\")}}'>\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-search-minus\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"btn-group\">\r\n <button type=\"button\" (click)=\"moveImage(-10,0)\" class=\"btn btn-default\"\r\n ngbTooltip='{{utilityService.getResourceValue(\"MoveLeft\")}}'>\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-arrow-left\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"moveImage(10,0)\" class=\"btn btn-default\"\r\n ngbTooltip='{{utilityService.getResourceValue(\"MoveRight\")}}'>\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-arrow-right\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"moveImage(0,-10)\" class=\"btn btn-default\"\r\n ngbTooltip='{{utilityService.getResourceValue(\"MoveUp\")}}'>\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-arrow-up\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"moveImage(0,10)\" class=\"btn btn-default\"\r\n ngbTooltip='{{utilityService.getResourceValue(\"MoveDown\")}}'>\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-arrow-down\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"btn-group\">\r\n <button type=\"button\" (click)=\"rotateImage(-45)\" class=\"btn btn-default\"\r\n ngbTooltip='{{utilityService.getResourceValue(\"RotateLeft\")}}'>\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-undo-alt\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"rotateImage(45)\" class=\"btn btn-default\"\r\n ngbTooltip='{{utilityService.getResourceValue(\"RotateRight\")}}'>\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-redo-alt\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\" align=\"right\">\r\n <button type=\"button\" id=\"btnClose\" class=\"btn btn-sm btn-light\" (click)=\"openModal(false)\">\r\n {{utilityService.getResourceValue(\"CancelLabel\")}}\r\n </button>\r\n <button type=\"button\" (click)=\"cropImage()\" id=\"btnOK\" class=\"btn btn-sm btn-brand\">\r\n {{utilityService.getResourceValue(\"Crop\")}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- readonly -->\r\n\r\n\r\n</div>", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "pipe", type: i5.KeyValuePipe, name: "keyvalue" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: FileUploadModule }, { kind: "ngmodule", type: NgxDropzoneModule }, { kind: "component", type: i7$3.NgxDropzoneComponent, selector: "ngx-dropzone, [ngx-dropzone]", inputs: ["accept", "disabled", "multiple", "maxFileSize", "expandable", "disableClick", "processDirectoryDrop", "id", "aria-label", "aria-labelledby", "aria-describedby"], outputs: ["change"] }, { kind: "directive", type: i7$3.NgxDropzoneLabelDirective, selector: "ngx-dropzone-label" }, { kind: "component", type: i7$3.NgxDropzoneImagePreviewComponent, selector: "ngx-dropzone-image-preview", inputs: ["file"] }, { kind: "ngmodule", type: AngularCropperjsModule }, { kind: "component", type: i8.CropperComponent, selector: "angular-cropper", inputs: ["imageUrl", "settings", "cropbox", "loadImageErrorText", "cropperOptions"], outputs: ["export", "ready"] }, { kind: "ngmodule", type: NgbModule }, { kind: "directive", type: i3$2.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }] }); }
|
|
8265
8428
|
}
|
|
8266
8429
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.16", ngImport: i0, type: ImageUploaderComponent, decorators: [{
|
|
8267
8430
|
type: Component,
|
|
@@ -8637,7 +8800,7 @@ class ProfileImageUploaderComponent {
|
|
|
8637
8800
|
this.mdlSampleIsOpen = open;
|
|
8638
8801
|
}
|
|
8639
8802
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.16", ngImport: i0, type: ProfileImageUploaderComponent, deps: [{ token: i0.NgZone }, { token: ControlUtility }, { token: i2.ControlContainer, optional: true }, { token: i2.FormGroupDirective }, { token: i3.UtilityService }, { token: i3.ControlValidationService }, { token: GlobalSettings }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
8640
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.16", type: ProfileImageUploaderComponent, isStandalone: true, selector: "BBSF-ProfileImageUploader", inputs: { group: "group", options: "options" }, outputs: { onChange: "onChange" }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true }, { propertyName: "angularCropper", first: true, predicate: ["angularCropper"], descendants: true }], ngImport: i0, template: "<div class=\"form-group bbsf-control bbsf-profile-image-upload\" [formGroup]=\"group\">\r\n <div [ngClass]=\"(options.viewType==1)?'bbsf-vertical':'bbsf-horizontal'\">\r\n <!--label-->\r\n <label [hidden]=\"options.hideLabel\" class=\"bbsf-label {{options.labelExtraClasses}}\">\r\n {{options.labelValue}}\r\n <!--Asterisk-->\r\n <span *ngIf=\"((options.showAsterisk&&options.isRequired)||(options.isRequired))&&!options.isReadonly\"\r\n class=\"text-danger\">*</span>\r\n </label>\r\n <!--Allow dropZone-->\r\n <div *ngIf=\"options.allowDropZone&&!options.isReadonly\" class=\"bbsf-input-container {{options.extraClasses}}\"\r\n ngx-dropzone [disabled]=\"options.isDisabled\" [accept]=\"acceptedType\" (change)=\"onFileChange($event)\"\r\n aria-describedby=\"email-error\" aria-invalid=\"true\" ngDefaultControl formControlName=\"{{options.name}}\"\r\n id=\"{{options.name}}\"\r\n [class.is-invalid]=\"profileImageUploadFormControl.invalid && profileImageUploadFormControl.touched\">\r\n <ngx-dropzone-label class=\"dropzone-label\">\r\n <div class=\"svg-and-validation\">\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\r\n style=\"width: 50px; height: 50px;\">\r\n <path opacity=\"0.3\"\r\n d=\"M5 16C3.3 16 2 14.7 2 13C2 11.3 3.3 10 5 10H5.1C5 9.7 5 9.3 5 9C5 6.2 7.2 4 10 4C11.9 4 13.5 5 14.3 6.5C14.8 6.2 15.4 6 16 6C17.7 6 19 7.3 19 9C19 9.4 18.9 9.7 18.8 10C18.9 10 18.9 10 19 10C20.7 10 22 11.3 22 13C22 14.7 20.7 16 19 16H5ZM8 13.6H16L12.7 10.3C12.3 9.89999 11.7 9.89999 11.3 10.3L8 13.6Z\"\r\n fill=\"currentColor\" style=\"fill: #a1a1a1;\"></path>\r\n <path d=\"M11 13.6V19C11 19.6 11.4 20 12 20C12.6 20 13 19.6 13 19V13.6H11Z\" fill=\"currentColor\"\r\n style=\"fill: #989898;\"></path>\r\n </svg>\r\n <!--Validation text-->\r\n <div class=\"bbsf-validation-msg\" *ngIf=\"validationMessage\" [innerHTML]=\"validationMessage\"></div>\r\n </div>\r\n </ngx-dropzone-label>\r\n <ngx-dropzone-image-preview class=\"dropzone-preview\" *ngFor=\"let f of files\" [file]=\"f\" [removable]=\"true\"\r\n (removed)=\"removeFromControlValue(f)\" ngProjectAs=\"ngx-dropzone-preview\">\r\n </ngx-dropzone-image-preview>\r\n </div>\r\n <!--Not allowed dropZone-->\r\n <div *ngIf=\"!options.allowDropZone&&!options.isReadonly\" style=\"width:fit-content\">\r\n <ngx-dropzone-label *ngIf=\"files.length==0\">\r\n <div #element (click)=\"showImageUploader(element)\">\r\n <img [src]=\"imageSource\" class=\"profile-upload-img\" />\r\n </div>\r\n </ngx-dropzone-label>\r\n <div class=\"d-none {{options.extraClasses}}\" ngx-dropzone [disabled]=\"options.isDisabled\" [accept]=\"acceptedType\"\r\n (change)=\"onFileChange($event)\" aria-describedby=\"email-error\" aria-invalid=\"true\" ngDefaultControl\r\n formControlName=\"{{options.name}}\" id=\"{{options.name}}\"\r\n [class.is-invalid]=\"profileImageUploadFormControl.invalid && profileImageUploadFormControl.touched\">\r\n </div>\r\n <ngx-dropzone-image-preview *ngFor=\"let f of files\" [file]=\"f\" [removable]=\"true\"\r\n (removed)=\"removeFromControlValue(f)\" ngProjectAs=\"ngx-dropzone-preview\">\r\n </ngx-dropzone-image-preview>\r\n <!--Validation text-->\r\n <div class=\"bbsf-validation-msg\" *ngIf=\"validationMessage\" [innerHTML]=\"validationMessage\"></div>\r\n </div>\r\n\r\n <ngx-dropzone-label *ngIf=\"files.length==0&&options.isReadonly\">\r\n <div #element>\r\n <img [src]=\"imageSource\" />\r\n </div>\r\n </ngx-dropzone-label>\r\n </div>\r\n <div class=\"subtext-container\" *ngIf=\"!options.isReadonly\">\r\n <!-- required text-->\r\n <div class=\"bbsf-validation\"\r\n *ngIf=\"(profileImageUploadFormControl.invalid && profileImageUploadFormControl.touched)\">\r\n {{getErrorValidation(profileImageUploadFormControl.errors|keyvalue)}}\r\n </div>\r\n\r\n <!-- LabelDescription-->\r\n <div class=\"bbsf-control-desc\" *ngIf=\"options.labelDescription!=null\">{{options.labelDescription}}</div>\r\n <div *ngIf=\"(group.valid&&group.dirty&&group.touched )||(group.untouched&&group.invalid&&group.dirty) \">\r\n {{resetError()}}</div>\r\n </div>\r\n <!-- image cropper modal-->\r\n <div id=\"mdlSample\" class=\"modal bbsf-cropper-modal\" role=\"dialog\"\r\n [ngStyle]=\"{'display': mdlSampleIsOpen ? 'block' : 'none', 'opacity': 1}\">\r\n <div class=\"modal-dialog modal-lg\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title\">\r\n {{utilityService.getResourceValue(\"CropImage\")}}\r\n </h4>\r\n <button type=\"button\" class=\"btn-close\" data-dismiss=\"modal\" (click)=\"openModal(false)\"></button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div *ngIf=\"imageUrl\">\r\n <angular-cropper #angularCropper [cropperOptions]=\"config\" [imageUrl]=\"imageUrl\">\r\n </angular-cropper>\r\n <img [src]=\"imgwUrl\" />\r\n </div>\r\n <div class=\"cropper-btns\">\r\n <div class=\"btn-group\">\r\n <button type=\"button\" (click)=\"zoomImage(0.1)\" class=\"btn btn-default\" ngbTooltip=\"Zoom in\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-search-plus\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"zoomImage(-0.1)\" class=\"btn btn-default\" ngbTooltip=\"Zoom out\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-search-minus\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"btn-group\">\r\n <button type=\"button\" (click)=\"moveImage(-10,0)\" class=\"btn btn-default\" ngbTooltip=\"Move left\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-arrow-left\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"moveImage(10,0)\" class=\"btn btn-default\" ngbTooltip=\"Move right\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-arrow-right\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"moveImage(0,-10)\" class=\"btn btn-default\" ngbTooltip=\"Move up\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-arrow-up\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"moveImage(0,10)\" class=\"btn btn-default\" ngbTooltip=\"Move down\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-arrow-down\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"btn-group\">\r\n <button type=\"button\" (click)=\"rotateImage(-45)\" class=\"btn btn-default\" ngbTooltip=\"Rotate left\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-undo-alt\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"rotateImage(45)\" class=\"btn btn-default\" ngbTooltip=\"Rotate right\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-redo-alt\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\" align=\"right\">\r\n <button type=\"button\" id=\"btnClose\" class=\"btn btn-sm btn-light\" (click)=\"openModal(false)\">\r\n {{utilityService.getResourceValue(\"CancelLabel\")}}\r\n </button>\r\n <button type=\"button\" (click)=\"cropImage()\" id=\"btnOK\" class=\"btn btn-sm btn-brand\">\r\n {{utilityService.getResourceValue(\"Crop\")}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "pipe", type: i5.KeyValuePipe, name: "keyvalue" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: FileUploadModule }, { kind: "ngmodule", type: NgxDropzoneModule }, { kind: "component", type: i7$4.NgxDropzoneComponent, selector: "ngx-dropzone, [ngx-dropzone]", inputs: ["accept", "disabled", "multiple", "maxFileSize", "expandable", "disableClick", "processDirectoryDrop", "id", "aria-label", "aria-labelledby", "aria-describedby"], outputs: ["change"] }, { kind: "directive", type: i7$4.NgxDropzoneLabelDirective, selector: "ngx-dropzone-label" }, { kind: "component", type: i7$4.NgxDropzoneImagePreviewComponent, selector: "ngx-dropzone-image-preview", inputs: ["file"] }, { kind: "ngmodule", type: AngularCropperjsModule }, { kind: "component", type: i8.CropperComponent, selector: "angular-cropper", inputs: ["imageUrl", "settings", "cropbox", "loadImageErrorText", "cropperOptions"], outputs: ["export", "ready"] }, { kind: "ngmodule", type: NgbModule }, { kind: "directive", type: i3$2.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }] }); }
|
|
8803
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.16", type: ProfileImageUploaderComponent, isStandalone: true, selector: "BBSF-ProfileImageUploader", inputs: { group: "group", options: "options" }, outputs: { onChange: "onChange" }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true }, { propertyName: "angularCropper", first: true, predicate: ["angularCropper"], descendants: true }], ngImport: i0, template: "<div class=\"form-group bbsf-control bbsf-profile-image-upload\" [formGroup]=\"group\">\r\n <div [ngClass]=\"(options.viewType==1)?'bbsf-vertical':'bbsf-horizontal'\">\r\n <!--label-->\r\n <label [hidden]=\"options.hideLabel\" class=\"bbsf-label {{options.labelExtraClasses}}\">\r\n {{options.labelValue}}\r\n <!--Asterisk-->\r\n <span *ngIf=\"((options.showAsterisk&&options.isRequired)||(options.isRequired))&&!options.isReadonly\"\r\n class=\"text-danger\">*</span>\r\n </label>\r\n <!--Allow dropZone-->\r\n <div *ngIf=\"options.allowDropZone&&!options.isReadonly\" class=\"bbsf-input-container {{options.extraClasses}}\"\r\n ngx-dropzone [disabled]=\"options.isDisabled\" [accept]=\"acceptedType\" (change)=\"onFileChange($event)\"\r\n aria-describedby=\"email-error\" aria-invalid=\"true\" ngDefaultControl formControlName=\"{{options.name}}\"\r\n id=\"{{options.name}}\"\r\n [class.is-invalid]=\"profileImageUploadFormControl.invalid && profileImageUploadFormControl.touched\">\r\n <ngx-dropzone-label class=\"dropzone-label\">\r\n <div class=\"svg-and-validation\">\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\r\n style=\"width: 50px; height: 50px;\">\r\n <path opacity=\"0.3\"\r\n d=\"M5 16C3.3 16 2 14.7 2 13C2 11.3 3.3 10 5 10H5.1C5 9.7 5 9.3 5 9C5 6.2 7.2 4 10 4C11.9 4 13.5 5 14.3 6.5C14.8 6.2 15.4 6 16 6C17.7 6 19 7.3 19 9C19 9.4 18.9 9.7 18.8 10C18.9 10 18.9 10 19 10C20.7 10 22 11.3 22 13C22 14.7 20.7 16 19 16H5ZM8 13.6H16L12.7 10.3C12.3 9.89999 11.7 9.89999 11.3 10.3L8 13.6Z\"\r\n fill=\"currentColor\" style=\"fill: #a1a1a1;\"></path>\r\n <path d=\"M11 13.6V19C11 19.6 11.4 20 12 20C12.6 20 13 19.6 13 19V13.6H11Z\" fill=\"currentColor\"\r\n style=\"fill: #989898;\"></path>\r\n </svg>\r\n <!--Validation text-->\r\n <div class=\"bbsf-validation-msg\" *ngIf=\"validationMessage\" [innerHTML]=\"validationMessage\"></div>\r\n </div>\r\n </ngx-dropzone-label>\r\n <ngx-dropzone-image-preview class=\"dropzone-preview\" *ngFor=\"let f of files\" [file]=\"f\" [removable]=\"true\"\r\n (removed)=\"removeFromControlValue(f)\" ngProjectAs=\"ngx-dropzone-preview\">\r\n </ngx-dropzone-image-preview>\r\n </div>\r\n <!--Not allowed dropZone-->\r\n <div *ngIf=\"!options.allowDropZone&&!options.isReadonly\" style=\"width:fit-content\">\r\n <ngx-dropzone-label *ngIf=\"files.length==0\">\r\n <div #element (click)=\"showImageUploader(element)\">\r\n <img [src]=\"imageSource\" class=\"profile-upload-img\" />\r\n </div>\r\n </ngx-dropzone-label>\r\n <div class=\"d-none {{options.extraClasses}}\" ngx-dropzone [disabled]=\"options.isDisabled\" [accept]=\"acceptedType\"\r\n (change)=\"onFileChange($event)\" aria-describedby=\"email-error\" aria-invalid=\"true\" ngDefaultControl\r\n formControlName=\"{{options.name}}\" id=\"{{options.name}}\"\r\n [class.is-invalid]=\"profileImageUploadFormControl.invalid && profileImageUploadFormControl.touched\">\r\n </div>\r\n <ngx-dropzone-image-preview *ngFor=\"let f of files\" [file]=\"f\" [removable]=\"true\"\r\n (removed)=\"removeFromControlValue(f)\" ngProjectAs=\"ngx-dropzone-preview\">\r\n </ngx-dropzone-image-preview>\r\n <!--Validation text-->\r\n <div class=\"bbsf-validation-msg\" *ngIf=\"validationMessage\" [innerHTML]=\"validationMessage\"></div>\r\n </div>\r\n\r\n <ngx-dropzone-label *ngIf=\"files.length==0&&options.isReadonly\">\r\n <div #element>\r\n <img [src]=\"imageSource\" />\r\n </div>\r\n </ngx-dropzone-label>\r\n </div>\r\n <div class=\"subtext-container\" *ngIf=\"!options.isReadonly\">\r\n <!-- required text-->\r\n <div class=\"bbsf-validation\"\r\n *ngIf=\"(profileImageUploadFormControl.invalid && profileImageUploadFormControl.touched)\">\r\n {{getErrorValidation(profileImageUploadFormControl.errors|keyvalue)}}\r\n </div>\r\n\r\n <!-- LabelDescription-->\r\n <div class=\"bbsf-control-desc\" *ngIf=\"options.labelDescription!=null\">{{options.labelDescription}}</div>\r\n <div *ngIf=\"(group.valid&&group.dirty&&group.touched )||(group.untouched&&group.invalid&&group.dirty) \">\r\n {{resetError()}}</div>\r\n </div>\r\n <!-- image cropper modal-->\r\n <div id=\"mdlSample\" class=\"modal bbsf-cropper-modal\" role=\"dialog\"\r\n [ngStyle]=\"{'display': mdlSampleIsOpen ? 'block' : 'none', 'opacity': 1}\">\r\n <div class=\"modal-dialog modal-lg\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title\">\r\n {{utilityService.getResourceValue(\"CropImage\")}}\r\n </h4>\r\n <button type=\"button\" class=\"btn-close\" data-dismiss=\"modal\" (click)=\"openModal(false)\"></button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div *ngIf=\"imageUrl\">\r\n <angular-cropper #angularCropper [cropperOptions]=\"config\" [imageUrl]=\"imageUrl\">\r\n </angular-cropper>\r\n <img [src]=\"imgwUrl\" />\r\n </div>\r\n <div class=\"cropper-btns\">\r\n <div class=\"btn-group\">\r\n <button type=\"button\" (click)=\"zoomImage(0.1)\" class=\"btn btn-default\" ngbTooltip=\"Zoom in\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-search-plus\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"zoomImage(-0.1)\" class=\"btn btn-default\" ngbTooltip=\"Zoom out\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-search-minus\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"btn-group\">\r\n <button type=\"button\" (click)=\"moveImage(-10,0)\" class=\"btn btn-default\" ngbTooltip=\"Move left\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-arrow-left\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"moveImage(10,0)\" class=\"btn btn-default\" ngbTooltip=\"Move right\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-arrow-right\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"moveImage(0,-10)\" class=\"btn btn-default\" ngbTooltip=\"Move up\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-arrow-up\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"moveImage(0,10)\" class=\"btn btn-default\" ngbTooltip=\"Move down\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-arrow-down\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"btn-group\">\r\n <button type=\"button\" (click)=\"rotateImage(-45)\" class=\"btn btn-default\" ngbTooltip=\"Rotate left\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-undo-alt\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"rotateImage(45)\" class=\"btn btn-default\" ngbTooltip=\"Rotate right\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-redo-alt\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\" align=\"right\">\r\n <button type=\"button\" id=\"btnClose\" class=\"btn btn-sm btn-light\" (click)=\"openModal(false)\">\r\n {{utilityService.getResourceValue(\"CancelLabel\")}}\r\n </button>\r\n <button type=\"button\" (click)=\"cropImage()\" id=\"btnOK\" class=\"btn btn-sm btn-brand\">\r\n {{utilityService.getResourceValue(\"Crop\")}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "pipe", type: i5.KeyValuePipe, name: "keyvalue" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: FileUploadModule }, { kind: "ngmodule", type: NgxDropzoneModule }, { kind: "component", type: i7$3.NgxDropzoneComponent, selector: "ngx-dropzone, [ngx-dropzone]", inputs: ["accept", "disabled", "multiple", "maxFileSize", "expandable", "disableClick", "processDirectoryDrop", "id", "aria-label", "aria-labelledby", "aria-describedby"], outputs: ["change"] }, { kind: "directive", type: i7$3.NgxDropzoneLabelDirective, selector: "ngx-dropzone-label" }, { kind: "component", type: i7$3.NgxDropzoneImagePreviewComponent, selector: "ngx-dropzone-image-preview", inputs: ["file"] }, { kind: "ngmodule", type: AngularCropperjsModule }, { kind: "component", type: i8.CropperComponent, selector: "angular-cropper", inputs: ["imageUrl", "settings", "cropbox", "loadImageErrorText", "cropperOptions"], outputs: ["export", "ready"] }, { kind: "ngmodule", type: NgbModule }, { kind: "directive", type: i3$2.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }] }); }
|
|
8641
8804
|
}
|
|
8642
8805
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.16", ngImport: i0, type: ProfileImageUploaderComponent, decorators: [{
|
|
8643
8806
|
type: Component,
|
|
@@ -8666,6 +8829,76 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.16", ngImpo
|
|
|
8666
8829
|
args: ['angularCropper', { static: false }]
|
|
8667
8830
|
}] } });
|
|
8668
8831
|
|
|
8832
|
+
class LogoCropperComponent {
|
|
8833
|
+
constructor(activeModal, utilityService) {
|
|
8834
|
+
this.activeModal = activeModal;
|
|
8835
|
+
this.utilityService = utilityService;
|
|
8836
|
+
this.isHorizontal = true;
|
|
8837
|
+
this.aspectRatio = 3 / 1;
|
|
8838
|
+
this.maintainAspectRatio = true;
|
|
8839
|
+
this.cropperStaticWidth = 0;
|
|
8840
|
+
this.cropperStaticHeight = 0;
|
|
8841
|
+
this.onlyScaleDown = true;
|
|
8842
|
+
this.transform = { scale: 1 };
|
|
8843
|
+
this.croppedBlob = null;
|
|
8844
|
+
this.minScale = 1;
|
|
8845
|
+
this.maxScale = 4;
|
|
8846
|
+
this.scaleStep = 0.1;
|
|
8847
|
+
}
|
|
8848
|
+
ngOnInit() { }
|
|
8849
|
+
translate(key) {
|
|
8850
|
+
return this.utilityService.getResourceValue(key);
|
|
8851
|
+
}
|
|
8852
|
+
imageCropped(event) {
|
|
8853
|
+
this.croppedBlob = event.blob ?? null;
|
|
8854
|
+
}
|
|
8855
|
+
zoomIn() {
|
|
8856
|
+
this.setScale((this.transform.scale ?? 1) + this.scaleStep);
|
|
8857
|
+
}
|
|
8858
|
+
zoomOut() {
|
|
8859
|
+
this.setScale((this.transform.scale ?? 1) - this.scaleStep);
|
|
8860
|
+
}
|
|
8861
|
+
resetZoom() {
|
|
8862
|
+
this.setScale(1);
|
|
8863
|
+
}
|
|
8864
|
+
confirm() {
|
|
8865
|
+
if (!this.croppedBlob)
|
|
8866
|
+
return;
|
|
8867
|
+
const croppedFile = new File([this.croppedBlob], this.imageFile?.name ?? 'logo.png', { type: 'image/png' });
|
|
8868
|
+
this.activeModal.close(croppedFile);
|
|
8869
|
+
}
|
|
8870
|
+
dismiss() {
|
|
8871
|
+
this.activeModal.dismiss();
|
|
8872
|
+
}
|
|
8873
|
+
setScale(scale) {
|
|
8874
|
+
const clamped = Math.min(this.maxScale, Math.max(this.minScale, scale));
|
|
8875
|
+
this.transform = { ...this.transform, scale: clamped };
|
|
8876
|
+
}
|
|
8877
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.16", ngImport: i0, type: LogoCropperComponent, deps: [{ token: i3$2.NgbActiveModal }, { token: i3.UtilityService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
8878
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.16", type: LogoCropperComponent, isStandalone: true, selector: "BBSF-LogoCropper", inputs: { imageFile: "imageFile", isHorizontal: "isHorizontal", aspectRatio: "aspectRatio", maintainAspectRatio: "maintainAspectRatio", cropperStaticWidth: "cropperStaticWidth", cropperStaticHeight: "cropperStaticHeight", onlyScaleDown: "onlyScaleDown" }, ngImport: i0, template: "<div class=\"bbsf-logo-cropper\">\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">{{ translate(\"CropImage\") }}</h5>\n <button type=\"button\" class=\"btn-close\" (click)=\"dismiss()\"></button>\n </div>\n\n <div class=\"modal-body d-flex flex-column justify-content-center align-items-center py-0\" style=\"min-height: 200px;\">\n <image-cropper [class.crop-horizontal]=\"isHorizontal\" [class.crop-vertical]=\"!isHorizontal\" [imageFile]=\"imageFile\"\n [maintainAspectRatio]=\"maintainAspectRatio\" [aspectRatio]=\"aspectRatio\"\n [cropperStaticWidth]=\"cropperStaticWidth\" [cropperStaticHeight]=\"cropperStaticHeight\"\n [onlyScaleDown]=\"onlyScaleDown\" [transform]=\"transform\" format=\"png\" (imageCropped)=\"imageCropped($event)\">\n </image-cropper>\n\n <div class=\"d-flex justify-content-center align-items-center gap-2 mt-3\">\n <button type=\"button\" class=\"btn btn-outline-secondary btn-sm\" (click)=\"zoomOut()\"\n [title]=\"translate('ZoomOut')\">\n <i class=\"fa fa-search-minus\"></i>\n </button>\n <button type=\"button\" class=\"btn btn-outline-secondary btn-sm\" (click)=\"resetZoom()\"\n [title]=\"translate('ResetZoom')\">\n <i class=\"fa fa-undo\"></i>\n </button>\n <button type=\"button\" class=\"btn btn-outline-secondary btn-sm\" (click)=\"zoomIn()\" [title]=\"translate('ZoomIn')\">\n <i class=\"fa fa-search-plus\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-sm btn-light\" (click)=\"dismiss()\"> Cancel </button>\n <button type=\"button\" class=\"btn btn-sm btn-brand\" [disabled]=\"!croppedBlob\" (click)=\"confirm()\">\n {{ translate(\"Crop\") }}\n </button>\n </div>\n</div>\n", styles: [".bbsf-logo-cropper image-cropper.crop-horizontal .ngx-ic-source-image{max-height:45px!important;max-width:none!important}.bbsf-logo-cropper image-cropper.crop-vertical .ngx-ic-source-image{max-width:200px!important;max-height:none!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: ImageCropperComponent, selector: "image-cropper", inputs: ["imageChangedEvent", "imageURL", "imageBase64", "imageFile", "imageAltText", "options", "cropperFrameAriaLabel", "output", "format", "autoCrop", "cropper", "transform", "maintainAspectRatio", "aspectRatio", "resetCropOnAspectRatioChange", "resizeToWidth", "resizeToHeight", "cropperMinWidth", "cropperMinHeight", "cropperMaxHeight", "cropperMaxWidth", "cropperStaticWidth", "cropperStaticHeight", "canvasRotation", "initialStepSize", "roundCropper", "onlyScaleDown", "imageQuality", "backgroundColor", "containWithinAspectRatio", "hideResizeSquares", "allowMoveImage", "checkImageType", "alignImage", "disabled", "hidden"], outputs: ["imageCropped", "startCropImage", "imageLoaded", "cropperReady", "loadImageFailed", "transformChange", "cropperChange"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
8879
|
+
}
|
|
8880
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.16", ngImport: i0, type: LogoCropperComponent, decorators: [{
|
|
8881
|
+
type: Component,
|
|
8882
|
+
args: [{ selector: 'BBSF-LogoCropper', encapsulation: ViewEncapsulation.None, standalone: true, imports: [
|
|
8883
|
+
CommonModule,
|
|
8884
|
+
ImageCropperComponent
|
|
8885
|
+
], template: "<div class=\"bbsf-logo-cropper\">\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">{{ translate(\"CropImage\") }}</h5>\n <button type=\"button\" class=\"btn-close\" (click)=\"dismiss()\"></button>\n </div>\n\n <div class=\"modal-body d-flex flex-column justify-content-center align-items-center py-0\" style=\"min-height: 200px;\">\n <image-cropper [class.crop-horizontal]=\"isHorizontal\" [class.crop-vertical]=\"!isHorizontal\" [imageFile]=\"imageFile\"\n [maintainAspectRatio]=\"maintainAspectRatio\" [aspectRatio]=\"aspectRatio\"\n [cropperStaticWidth]=\"cropperStaticWidth\" [cropperStaticHeight]=\"cropperStaticHeight\"\n [onlyScaleDown]=\"onlyScaleDown\" [transform]=\"transform\" format=\"png\" (imageCropped)=\"imageCropped($event)\">\n </image-cropper>\n\n <div class=\"d-flex justify-content-center align-items-center gap-2 mt-3\">\n <button type=\"button\" class=\"btn btn-outline-secondary btn-sm\" (click)=\"zoomOut()\"\n [title]=\"translate('ZoomOut')\">\n <i class=\"fa fa-search-minus\"></i>\n </button>\n <button type=\"button\" class=\"btn btn-outline-secondary btn-sm\" (click)=\"resetZoom()\"\n [title]=\"translate('ResetZoom')\">\n <i class=\"fa fa-undo\"></i>\n </button>\n <button type=\"button\" class=\"btn btn-outline-secondary btn-sm\" (click)=\"zoomIn()\" [title]=\"translate('ZoomIn')\">\n <i class=\"fa fa-search-plus\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-sm btn-light\" (click)=\"dismiss()\"> Cancel </button>\n <button type=\"button\" class=\"btn btn-sm btn-brand\" [disabled]=\"!croppedBlob\" (click)=\"confirm()\">\n {{ translate(\"Crop\") }}\n </button>\n </div>\n</div>\n", styles: [".bbsf-logo-cropper image-cropper.crop-horizontal .ngx-ic-source-image{max-height:45px!important;max-width:none!important}.bbsf-logo-cropper image-cropper.crop-vertical .ngx-ic-source-image{max-width:200px!important;max-height:none!important}\n"] }]
|
|
8886
|
+
}], ctorParameters: () => [{ type: i3$2.NgbActiveModal }, { type: i3.UtilityService }], propDecorators: { imageFile: [{
|
|
8887
|
+
type: Input
|
|
8888
|
+
}], isHorizontal: [{
|
|
8889
|
+
type: Input
|
|
8890
|
+
}], aspectRatio: [{
|
|
8891
|
+
type: Input
|
|
8892
|
+
}], maintainAspectRatio: [{
|
|
8893
|
+
type: Input
|
|
8894
|
+
}], cropperStaticWidth: [{
|
|
8895
|
+
type: Input
|
|
8896
|
+
}], cropperStaticHeight: [{
|
|
8897
|
+
type: Input
|
|
8898
|
+
}], onlyScaleDown: [{
|
|
8899
|
+
type: Input
|
|
8900
|
+
}] } });
|
|
8901
|
+
|
|
8669
8902
|
/**
|
|
8670
8903
|
* BBSF Uploads Module
|
|
8671
8904
|
*
|
|
@@ -8713,11 +8946,13 @@ class BBSFUploadsModule {
|
|
|
8713
8946
|
// Import standalone components
|
|
8714
8947
|
FileUploadComponent,
|
|
8715
8948
|
ImageUploaderComponent,
|
|
8716
|
-
ProfileImageUploaderComponent
|
|
8949
|
+
ProfileImageUploaderComponent,
|
|
8950
|
+
LogoCropperComponent], exports: [
|
|
8717
8951
|
// Re-export standalone components
|
|
8718
8952
|
FileUploadComponent,
|
|
8719
8953
|
ImageUploaderComponent,
|
|
8720
|
-
ProfileImageUploaderComponent
|
|
8954
|
+
ProfileImageUploaderComponent,
|
|
8955
|
+
LogoCropperComponent] }); }
|
|
8721
8956
|
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.2.16", ngImport: i0, type: BBSFUploadsModule, imports: [CommonModule,
|
|
8722
8957
|
FormsModule,
|
|
8723
8958
|
ReactiveFormsModule,
|
|
@@ -8729,7 +8964,8 @@ class BBSFUploadsModule {
|
|
|
8729
8964
|
// Import standalone components
|
|
8730
8965
|
FileUploadComponent,
|
|
8731
8966
|
ImageUploaderComponent,
|
|
8732
|
-
ProfileImageUploaderComponent
|
|
8967
|
+
ProfileImageUploaderComponent,
|
|
8968
|
+
LogoCropperComponent] }); }
|
|
8733
8969
|
}
|
|
8734
8970
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.16", ngImport: i0, type: BBSFUploadsModule, decorators: [{
|
|
8735
8971
|
type: NgModule,
|
|
@@ -8747,14 +8983,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.16", ngImpo
|
|
|
8747
8983
|
// Import standalone components
|
|
8748
8984
|
FileUploadComponent,
|
|
8749
8985
|
ImageUploaderComponent,
|
|
8750
|
-
ProfileImageUploaderComponent
|
|
8986
|
+
ProfileImageUploaderComponent,
|
|
8987
|
+
LogoCropperComponent
|
|
8751
8988
|
],
|
|
8752
8989
|
schemas: [CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA],
|
|
8753
8990
|
exports: [
|
|
8754
8991
|
// Re-export standalone components
|
|
8755
8992
|
FileUploadComponent,
|
|
8756
8993
|
ImageUploaderComponent,
|
|
8757
|
-
ProfileImageUploaderComponent
|
|
8994
|
+
ProfileImageUploaderComponent,
|
|
8995
|
+
LogoCropperComponent
|
|
8758
8996
|
]
|
|
8759
8997
|
}]
|
|
8760
8998
|
}] });
|
|
@@ -8897,7 +9135,7 @@ class CalendarComponent {
|
|
|
8897
9135
|
}
|
|
8898
9136
|
}
|
|
8899
9137
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.16", ngImport: i0, type: CalendarComponent, deps: [{ token: ErrorMassageValidation }, { token: ControlUtility }, { token: i2.ControlContainer, optional: true }, { token: i2.FormGroupDirective }, { token: i3.UtilityService }, { token: i4.BBSFTranslateService }, { token: i3.ControlValidationService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
8900
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.16", type: CalendarComponent, isStandalone: true, selector: "BBSF-Calendar", inputs: { group: "group", options: "options" }, viewQueries: [{ propertyName: "calendarComponent", first: true, predicate: ["calendar"], descendants: true }], ngImport: i0, template: "<div class=\"b-control b-calendar\">\r\n <div class=\"form-group validate is-invalid\" [formGroup]=\"group\">\r\n <!-- <full-calendar #calendar\r\n [defaultDate]=\"options.DefaultDate\"\r\n [defaultView]=\"DefaultView\"\r\n [header]=\"{\r\n left: 'prev,next today',\r\n center: 'title',\r\n right: CalendarViews\r\n }\"\r\n ngDefaultControl\r\n formControlName=\"{{options.Name}}\"\r\n [locales]=\"locales\"\r\n [plugins]=\"calendarPlugins\"\r\n [weekends]=\"calendarWeekends\"\r\n [events]=\"calendarEvents\"\r\n (dateClick)=\"OnDayClickFunction($event)\"\r\n (eventClick)=\"OnEventClickFunction($event)\"\r\n id=\"{{options.Name}}\"></full-calendar> -->\r\n\r\n\r\n <full-calendar *ngIf=\"options.calendarVisible\" [options]='calendarOptions' id=\"{{options.name}}\" ngDefaultControl\r\n formControlName=\"{{options.name}}\"></full-calendar>\r\n\r\n </div>\r\n</div>", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: FullCalendarModule }, { kind: "component", type: i7$
|
|
9138
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.16", type: CalendarComponent, isStandalone: true, selector: "BBSF-Calendar", inputs: { group: "group", options: "options" }, viewQueries: [{ propertyName: "calendarComponent", first: true, predicate: ["calendar"], descendants: true }], ngImport: i0, template: "<div class=\"b-control b-calendar\">\r\n <div class=\"form-group validate is-invalid\" [formGroup]=\"group\">\r\n <!-- <full-calendar #calendar\r\n [defaultDate]=\"options.DefaultDate\"\r\n [defaultView]=\"DefaultView\"\r\n [header]=\"{\r\n left: 'prev,next today',\r\n center: 'title',\r\n right: CalendarViews\r\n }\"\r\n ngDefaultControl\r\n formControlName=\"{{options.Name}}\"\r\n [locales]=\"locales\"\r\n [plugins]=\"calendarPlugins\"\r\n [weekends]=\"calendarWeekends\"\r\n [events]=\"calendarEvents\"\r\n (dateClick)=\"OnDayClickFunction($event)\"\r\n (eventClick)=\"OnEventClickFunction($event)\"\r\n id=\"{{options.Name}}\"></full-calendar> -->\r\n\r\n\r\n <full-calendar *ngIf=\"options.calendarVisible\" [options]='calendarOptions' id=\"{{options.name}}\" ngDefaultControl\r\n formControlName=\"{{options.name}}\"></full-calendar>\r\n\r\n </div>\r\n</div>", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: FullCalendarModule }, { kind: "component", type: i7$4.FullCalendarComponent, selector: "full-calendar", inputs: ["options", "deepChangeDetection", "events", "eventSources", "resources"] }] }); }
|
|
8901
9139
|
}
|
|
8902
9140
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.16", ngImport: i0, type: CalendarComponent, decorators: [{
|
|
8903
9141
|
type: Component,
|
|
@@ -9387,7 +9625,7 @@ class MapAutoCompleteComponent {
|
|
|
9387
9625
|
this.GermanAddressMapped(this.selectedPin);
|
|
9388
9626
|
this.closeMapModal();
|
|
9389
9627
|
}
|
|
9390
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.16", ngImport: i0, type: MapAutoCompleteComponent, deps: [{ token: i0.NgZone }, { token: ControlUtility }, { token: i2.ControlContainer, optional: true }, { token: i2.FormGroupDirective }, { token: i3.UtilityService }, { token: i4.BBSFTranslateService }, { token: i3.ControlValidationService }, { token: GlobalSettings }, { token:
|
|
9628
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.16", ngImport: i0, type: MapAutoCompleteComponent, deps: [{ token: i0.NgZone }, { token: ControlUtility }, { token: i2.ControlContainer, optional: true }, { token: i2.FormGroupDirective }, { token: i3.UtilityService }, { token: i4.BBSFTranslateService }, { token: i3.ControlValidationService }, { token: GlobalSettings }, { token: i6$3.ScriptService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
9391
9629
|
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.16", type: MapAutoCompleteComponent, isStandalone: true, selector: "BBSF-MapAutoComplete", inputs: { group: "group", options: "options" }, outputs: { OnChange: "OnChange" }, viewQueries: [{ propertyName: "searchElementRef", first: true, predicate: ["mapSearch"], descendants: true }, { propertyName: "advancedMapModal", first: true, predicate: ["advancedMapModal"], descendants: true }, { propertyName: "setLocationSearch", first: true, predicate: ["setLocationSearch"], descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"showMap\">\r\n <div class=\"form-group bbsf-control bbsf-maps\" [formGroup]=\"group\">\r\n <div [ngClass]=\"(options.viewType==1)?'bbsf-vertical':'bbsf-horizontal'\">\r\n <label *ngIf=\"!options.hideLabel\" class=\"bbsf-label {{options.labelExtraClasses}}\">\r\n {{options.labelValue}}\r\n <span *ngIf=\"((options.showAsterisk&&options.isRequired)||(options.isRequired))&&!options.isReadonly\"\r\n class=\"text-danger\">*</span>\r\n </label>\r\n\r\n <!--#region input-->\r\n <div class=\"input-group bbsf-input-container\" *ngIf=\"!options.isReadonly\">\r\n <input class=\"form-control input-icon-o {{options.extraClasses}}\" [value]=\"mapAutoCompleteModel.text\"\r\n [address]=\"mapAutoCompleteModel.text\" value=\"{{mapAutoCompleteModel.text}}\"\r\n aria-describedby=\"email-error\" aria-invalid=\"true\"\r\n [class.is-invalid]=\"mapAutoCompleteFormControl.invalid && mapAutoCompleteFormControl.touched\"\r\n [placeholder]=\"options.placeholder\" [id]=\"options.name\" (keyup)=\"GermanAddressMapped($event)\" #mapSearch />\r\n <button *ngIf=\"options.showAdvancedMap\" class=\"border-0 btn-secondary btn-icon-o\"\r\n ngbTooltip=\"{{translateValue('SetLocation')}}\" type=\"button\" (click)=\"openMapModal()\">\r\n\r\n <span class=\"svg-icon svg-icon-1\">\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M12 13C13.6569 13 15 11.6569 15 10C15 8.34315 13.6569 7 12 7C10.3431 7 9 8.34315 9 10C9 11.6569 10.3431 13 12 13Z\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M12 22C16 18 20 14.4183 20 10C20 5.58172 16.4183 2 12 2C7.58172 2 4 5.58172 4 10C4 14.4183 8 18 12 22Z\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n\r\n </button>\r\n </div>\r\n <!-- #endregion -->\r\n\r\n <!-- #region readonly -->\r\n <div *ngIf=\"options.isReadonly\">\r\n <a href=\"{{mapAutoCompleteModel.googleMapsURL}}\" target=\"_blank\">{{mapAutoCompleteModel.text}}</a>\r\n </div>\r\n <!-- #endregion -->\r\n\r\n </div>\r\n\r\n <div class=\"subtext-container\" *ngIf=\"!options.isReadonly\">\r\n <!-- LabelDescription-->\r\n <div class=\"bbsf-control-desc\" *ngIf=\"options.labelDescription!=null\">{{options.labelDescription}}</div>\r\n <!-- requiredText-->\r\n <div class=\"bbsf-validation\" *ngIf=\"(mapAutoCompleteFormControl.invalid && mapAutoCompleteFormControl.touched)\">\r\n {{getErrorValidation(mapAutoCompleteFormControl.errors|keyvalue)}}\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"(group.valid&&group.dirty&&group.touched )||(group.untouched&&group.invalid&&group.dirty)\">\r\n {{resetError()}} </div>\r\n\r\n </div>\r\n\r\n <div id=\"mdlSample\" class=\"modal bbsf-cropper-modal\" role=\"dialog\" [ngClass]=\"{'bbsf-blur': modalIsOpen}\"\r\n [ngStyle]=\"{'display': modalIsOpen ? 'block' : 'none', 'opacity': 1}\">\r\n <div class=\"modal-dialog modal-lg\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title\">\r\n {{translateValue('SetLocationOnMap')}}\r\n </h4>\r\n <button type=\"button\" class=\"btn-close\" data-dismiss=\"modal\" (click)=\"closeMapModal()\"></button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <input class=\"form-control mt-3 mb-3\" id=\"setLocationSearch\" #setLocationSearch type=\"text\"\r\n placeholder=\"{{translateValue('SetLocation')}}\">\r\n <div class=\"google-map-container\">\r\n <google-map [zoom]=\"zoomLevel\" [center]=\"mapCenter\" [width]=\"null\" [height]=\"null\" #googleMap (mapClick)=\"onMapClick($event)\">\r\n <map-marker [position]=\"markerPosition\" [options]=\"markerOptions\"></map-marker>\r\n </google-map>\r\n </div>\r\n <div class=\"text-danger\" *ngIf=\"(options.validateLocationWithinCity && options.city && invalidLocationWithinCity)\">\r\n {{translateValue('InvalidLocationWithinCity').replace('{0}', options.city)}}\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-sm btn-light\" (click)=\"closeMapModal()\">\r\n {{translateValue(\"Cancel\")}}\r\n </button>\r\n <button type=\"button\" class=\"btn btn-sm btn-brand\" (click)=\"submitSetLocation()\">\r\n {{translateValue('Confirm')}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n</ng-container>", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "pipe", type: i5.KeyValuePipe, name: "keyvalue" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: ScriptLoaderModule }, { kind: "ngmodule", type: GoogleMapsModule }, { kind: "component", type: i8$1.GoogleMap, selector: "google-map", inputs: ["height", "width", "mapId", "mapTypeId", "center", "zoom", "options"], outputs: ["mapInitialized", "authFailure", "boundsChanged", "centerChanged", "mapClick", "mapDblclick", "mapDrag", "mapDragend", "mapDragstart", "headingChanged", "idle", "maptypeidChanged", "mapMousemove", "mapMouseout", "mapMouseover", "projectionChanged", "mapRightclick", "tilesloaded", "tiltChanged", "zoomChanged"], exportAs: ["googleMap"] }, { kind: "directive", type: i8$1.MapMarker, selector: "map-marker", inputs: ["title", "position", "label", "clickable", "options", "icon", "visible"], outputs: ["animationChanged", "mapClick", "clickableChanged", "cursorChanged", "mapDblclick", "mapDrag", "mapDragend", "draggableChanged", "mapDragstart", "flatChanged", "iconChanged", "mapMousedown", "mapMouseout", "mapMouseover", "mapMouseup", "positionChanged", "mapRightclick", "shapeChanged", "titleChanged", "visibleChanged", "zindexChanged", "markerInitialized"], exportAs: ["mapMarker"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
9392
9630
|
}
|
|
9393
9631
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.16", ngImport: i0, type: MapAutoCompleteComponent, decorators: [{
|
|
@@ -9401,7 +9639,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.16", ngImpo
|
|
|
9401
9639
|
], schemas: [CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA], template: "<ng-container *ngIf=\"showMap\">\r\n <div class=\"form-group bbsf-control bbsf-maps\" [formGroup]=\"group\">\r\n <div [ngClass]=\"(options.viewType==1)?'bbsf-vertical':'bbsf-horizontal'\">\r\n <label *ngIf=\"!options.hideLabel\" class=\"bbsf-label {{options.labelExtraClasses}}\">\r\n {{options.labelValue}}\r\n <span *ngIf=\"((options.showAsterisk&&options.isRequired)||(options.isRequired))&&!options.isReadonly\"\r\n class=\"text-danger\">*</span>\r\n </label>\r\n\r\n <!--#region input-->\r\n <div class=\"input-group bbsf-input-container\" *ngIf=\"!options.isReadonly\">\r\n <input class=\"form-control input-icon-o {{options.extraClasses}}\" [value]=\"mapAutoCompleteModel.text\"\r\n [address]=\"mapAutoCompleteModel.text\" value=\"{{mapAutoCompleteModel.text}}\"\r\n aria-describedby=\"email-error\" aria-invalid=\"true\"\r\n [class.is-invalid]=\"mapAutoCompleteFormControl.invalid && mapAutoCompleteFormControl.touched\"\r\n [placeholder]=\"options.placeholder\" [id]=\"options.name\" (keyup)=\"GermanAddressMapped($event)\" #mapSearch />\r\n <button *ngIf=\"options.showAdvancedMap\" class=\"border-0 btn-secondary btn-icon-o\"\r\n ngbTooltip=\"{{translateValue('SetLocation')}}\" type=\"button\" (click)=\"openMapModal()\">\r\n\r\n <span class=\"svg-icon svg-icon-1\">\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M12 13C13.6569 13 15 11.6569 15 10C15 8.34315 13.6569 7 12 7C10.3431 7 9 8.34315 9 10C9 11.6569 10.3431 13 12 13Z\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M12 22C16 18 20 14.4183 20 10C20 5.58172 16.4183 2 12 2C7.58172 2 4 5.58172 4 10C4 14.4183 8 18 12 22Z\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n\r\n </button>\r\n </div>\r\n <!-- #endregion -->\r\n\r\n <!-- #region readonly -->\r\n <div *ngIf=\"options.isReadonly\">\r\n <a href=\"{{mapAutoCompleteModel.googleMapsURL}}\" target=\"_blank\">{{mapAutoCompleteModel.text}}</a>\r\n </div>\r\n <!-- #endregion -->\r\n\r\n </div>\r\n\r\n <div class=\"subtext-container\" *ngIf=\"!options.isReadonly\">\r\n <!-- LabelDescription-->\r\n <div class=\"bbsf-control-desc\" *ngIf=\"options.labelDescription!=null\">{{options.labelDescription}}</div>\r\n <!-- requiredText-->\r\n <div class=\"bbsf-validation\" *ngIf=\"(mapAutoCompleteFormControl.invalid && mapAutoCompleteFormControl.touched)\">\r\n {{getErrorValidation(mapAutoCompleteFormControl.errors|keyvalue)}}\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"(group.valid&&group.dirty&&group.touched )||(group.untouched&&group.invalid&&group.dirty)\">\r\n {{resetError()}} </div>\r\n\r\n </div>\r\n\r\n <div id=\"mdlSample\" class=\"modal bbsf-cropper-modal\" role=\"dialog\" [ngClass]=\"{'bbsf-blur': modalIsOpen}\"\r\n [ngStyle]=\"{'display': modalIsOpen ? 'block' : 'none', 'opacity': 1}\">\r\n <div class=\"modal-dialog modal-lg\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title\">\r\n {{translateValue('SetLocationOnMap')}}\r\n </h4>\r\n <button type=\"button\" class=\"btn-close\" data-dismiss=\"modal\" (click)=\"closeMapModal()\"></button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <input class=\"form-control mt-3 mb-3\" id=\"setLocationSearch\" #setLocationSearch type=\"text\"\r\n placeholder=\"{{translateValue('SetLocation')}}\">\r\n <div class=\"google-map-container\">\r\n <google-map [zoom]=\"zoomLevel\" [center]=\"mapCenter\" [width]=\"null\" [height]=\"null\" #googleMap (mapClick)=\"onMapClick($event)\">\r\n <map-marker [position]=\"markerPosition\" [options]=\"markerOptions\"></map-marker>\r\n </google-map>\r\n </div>\r\n <div class=\"text-danger\" *ngIf=\"(options.validateLocationWithinCity && options.city && invalidLocationWithinCity)\">\r\n {{translateValue('InvalidLocationWithinCity').replace('{0}', options.city)}}\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-sm btn-light\" (click)=\"closeMapModal()\">\r\n {{translateValue(\"Cancel\")}}\r\n </button>\r\n <button type=\"button\" class=\"btn btn-sm btn-brand\" (click)=\"submitSetLocation()\">\r\n {{translateValue('Confirm')}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n</ng-container>" }]
|
|
9402
9640
|
}], ctorParameters: () => [{ type: i0.NgZone }, { type: ControlUtility }, { type: i2.ControlContainer, decorators: [{
|
|
9403
9641
|
type: Optional
|
|
9404
|
-
}] }, { type: i2.FormGroupDirective }, { type: i3.UtilityService }, { type: i4.BBSFTranslateService }, { type: i3.ControlValidationService }, { type: GlobalSettings }, { type:
|
|
9642
|
+
}] }, { type: i2.FormGroupDirective }, { type: i3.UtilityService }, { type: i4.BBSFTranslateService }, { type: i3.ControlValidationService }, { type: GlobalSettings }, { type: i6$3.ScriptService }], propDecorators: { group: [{
|
|
9405
9643
|
type: Input
|
|
9406
9644
|
}], options: [{
|
|
9407
9645
|
type: Input
|
|
@@ -9570,7 +9808,7 @@ class AutocompleteTextBoxComponent {
|
|
|
9570
9808
|
};
|
|
9571
9809
|
this.suggestions$ = new Observable((observer) => {
|
|
9572
9810
|
observer.next(this.Search);
|
|
9573
|
-
}).pipe(switchMap
|
|
9811
|
+
}).pipe(switchMap((query) => {
|
|
9574
9812
|
if (query) {
|
|
9575
9813
|
let params = new HttpParams();
|
|
9576
9814
|
params = params.append(this.options.queryParam, query);
|
|
@@ -11838,6 +12076,26 @@ var FileType;
|
|
|
11838
12076
|
FileType["None"] = "";
|
|
11839
12077
|
})(FileType || (FileType = {}));
|
|
11840
12078
|
|
|
12079
|
+
var MarkdownMode;
|
|
12080
|
+
(function (MarkdownMode) {
|
|
12081
|
+
MarkdownMode["editor"] = "editor";
|
|
12082
|
+
MarkdownMode["preview"] = "preview";
|
|
12083
|
+
})(MarkdownMode || (MarkdownMode = {}));
|
|
12084
|
+
var MarkDownIcons;
|
|
12085
|
+
(function (MarkDownIcons) {
|
|
12086
|
+
MarkDownIcons["Bold"] = "Bold";
|
|
12087
|
+
MarkDownIcons["Italic"] = "Italic";
|
|
12088
|
+
MarkDownIcons["Heading"] = "Heading";
|
|
12089
|
+
MarkDownIcons["Reference"] = "Reference";
|
|
12090
|
+
MarkDownIcons["Link"] = "Link";
|
|
12091
|
+
MarkDownIcons["Image"] = "Image";
|
|
12092
|
+
MarkDownIcons["Ul"] = "Ul";
|
|
12093
|
+
MarkDownIcons["Ol"] = "Ol";
|
|
12094
|
+
MarkDownIcons["Code"] = "Code";
|
|
12095
|
+
MarkDownIcons["TogglePreview"] = "TogglePreview";
|
|
12096
|
+
MarkDownIcons["FullScreen"] = "FullScreen";
|
|
12097
|
+
})(MarkDownIcons || (MarkDownIcons = {}));
|
|
12098
|
+
|
|
11841
12099
|
var ToolbarButtons;
|
|
11842
12100
|
(function (ToolbarButtons) {
|
|
11843
12101
|
ToolbarButtons["undo"] = "undo";
|
|
@@ -11883,5 +12141,5 @@ var ToolbarButtons;
|
|
|
11883
12141
|
* Generated bundle index. Do not edit.
|
|
11884
12142
|
*/
|
|
11885
12143
|
|
|
11886
|
-
export { AddButton, AppBaseComponent, Attribute, AutocompleteDTO, AutocompleteOptions, AutocompleteTextBoxComponent, BBSFControlsModule, BBSFCoreModule, BBSFDatePipe, BBSFDateTimeModule, BBSFDateTimePipe, BBSFDropdownModule, BBSFEditorsModule, BBSFFormsBasicModule, BBSFMultilingualModule, BBSFPhoneModule, BBSFSpecializedModule, BBSFUploadsModule, BBSFUtilityModule, BBSF_DATE_TIME_FORMATS, BTagsInputComponent, BreadCrumb, BreadCrumbModel, CalendarComponent, CalendarEventDTO, CalendarOptions, CalendarView, CancelDTO, CheckBoxComponent, CheckBoxOptions, ConfirmationModalComponent, ConfirmationModalOptions, ControlFilterItem, ControlLayout, ControlOptionsBase, ControlUtility, Country, CustomValidation, CustomValidator, DataType, DateInputComponent, DatePickerOptions, DefaultIntl, DeleteButton, DropdownActionItem, DropdownActions, DropdownListComponent, DropdownListItem, DropdownOptions, EditButton, EditPersonalImage, EnglishArabicDTO, ErrorMassageValidation, ExportButton, FileDTO, FileType, FileUploadComponent, FileUploadModel, FileUploadOptions, FilterItem, FilterOptions, FilterType, FiltersButton, FontSize, ForceDirection, FormComponent, FormOptions, GlobalSettings, GridViewModel, HtmlEditorComponent, HtmlEditorOptions, IconPosition, ImageType, ImageUploadOptions, ImageUploaderComponent, InputType, Insert, JwPaginationComponent, LanguageMode, LanguageValidation, MapAutoCompleteComponent, MapAutoCompleteOptions, MapAutocompleteDTO, MapSearchTypes, MapZoomLevel, MarkDownIcons, MarkdownEditorComponent, MarkdownEditorOptions, MarkdownMode, MenuListType, Misc, MultiLingualHtmlEditorComponent, MultiLingualHtmlEditorOptions, MultiLingualTextAreaComponent, MultiLingualTextAreaOptions, MultiLingualTextBoxComponent, MultiLingualTextBoxOptions, MultilingualControlOptionsBase, MultipleFileUploadModel, NgTemplateNameDirective, OnPagingFiltersChangeService, PageHeaderComponentComponent, PageHeaderOptions, PagingActionMode, PagingComponent, PagingDTO, PagingOptions, Para, PermissionSets, PhoneComponent, PhoneOptions, PickerType, PreventDoubleClickDirective, ProfileImageUploadOptions, ProfileImageUploaderComponent, ProfilePictureDTO, RadioButtonComponent, RadioButtonItem, RadioButtonOptions, RangeNumber, RecaptchaComponent, RecaptchaModel, RecaptchaOptions, RenderComponentService, RepeaterComponent, RepeaterField, RepeaterFieldBuilderComponent, RepeaterItemFieldComponent, RepeaterOptions, RepeaterTableComponent, SaveDTO, SelectMode, StartView, Style, StyleConfirmationMode, TagInputView, TagsInputComponent, TagsInputDTO, TagsInputOptions, TextAreaComponent, TextAreaOptions, TextBoxModel, TextBoxOptions, TextboxComponent, ToggleSlideOptions, ToggleslideComponent, ToolbarButtons, UploadPersonalImage, environment, options };
|
|
12144
|
+
export { AddButton, AppBaseComponent, Attribute, AutocompleteDTO, AutocompleteOptions, AutocompleteTextBoxComponent, BBSFControlsModule, BBSFCoreModule, BBSFDatePipe, BBSFDateTimeModule, BBSFDateTimePipe, BBSFDropdownModule, BBSFEditorsModule, BBSFFormsBasicModule, BBSFMultilingualModule, BBSFPhoneModule, BBSFSpecializedModule, BBSFUploadsModule, BBSFUtilityModule, BBSF_DATE_TIME_FORMATS, BTagsInputComponent, BreadCrumb, BreadCrumbModel, CalendarComponent, CalendarEventDTO, CalendarOptions, CalendarView, CancelDTO, CheckBoxComponent, CheckBoxOptions, ConfirmationModalComponent, ConfirmationModalOptions, ControlFilterItem, ControlLayout, ControlOptionsBase, ControlUtility, Country, CustomValidation, CustomValidator, DataType, DateInputComponent, DatePickerOptions, DefaultIntl, DeleteButton, DropdownActionItem, DropdownActions, DropdownListComponent, DropdownListItem, DropdownOptions, EditButton, EditPersonalImage, EnglishArabicDTO, ErrorMassageValidation, ExportButton, FileDTO, FileType, FileUploadComponent, FileUploadModel, FileUploadOptions, FilterItem, FilterOptions, FilterType, FiltersButton, FontSize, ForceDirection, FormComponent, FormOptions, GlobalSettings, GridViewModel, HtmlEditorComponent, HtmlEditorOptions, IconPosition, ImageType, ImageUploadOptions, ImageUploaderComponent, InputType, Insert, JwPaginationComponent, LanguageMode, LanguageValidation, LogoCropperComponent, MapAutoCompleteComponent, MapAutoCompleteOptions, MapAutocompleteDTO, MapSearchTypes, MapZoomLevel, MarkDownIcons, MarkdownEditorComponent, MarkdownEditorOptions, MarkdownMode, MenuListType, Misc, MultiLingualHtmlEditorComponent, MultiLingualHtmlEditorOptions, MultiLingualTextAreaComponent, MultiLingualTextAreaOptions, MultiLingualTextBoxComponent, MultiLingualTextBoxOptions, MultilingualControlOptionsBase, MultipleFileUploadModel, NgTemplateNameDirective, OnPagingFiltersChangeService, PageHeaderComponentComponent, PageHeaderOptions, PagingActionMode, PagingComponent, PagingDTO, PagingOptions, Para, PermissionSets, PhoneComponent, PhoneOptions, PickerType, PreventDoubleClickDirective, ProfileImageUploadOptions, ProfileImageUploaderComponent, ProfilePictureDTO, RadioButtonComponent, RadioButtonItem, RadioButtonOptions, RangeNumber, RecaptchaComponent, RecaptchaModel, RecaptchaOptions, RenderComponentService, RepeaterComponent, RepeaterField, RepeaterFieldBuilderComponent, RepeaterItemFieldComponent, RepeaterOptions, RepeaterTableComponent, SaveDTO, SelectMode, StartView, Style, StyleConfirmationMode, TagInputView, TagsInputComponent, TagsInputDTO, TagsInputOptions, TextAreaComponent, TextAreaOptions, TextBoxModel, TextBoxOptions, TextboxComponent, ToggleSlideOptions, ToggleslideComponent, ToolbarButtons, UploadPersonalImage, environment, options };
|
|
11887
12145
|
//# sourceMappingURL=bnsights-bbsf-controls.mjs.map
|