@theseam/ui-common 1.0.2-beta.58 → 1.0.2-beta.60
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/fesm2022/theseam-ui-common-signature-input.mjs +894 -0
- package/fesm2022/theseam-ui-common-signature-input.mjs.map +1 -0
- package/fesm2022/theseam-ui-common-story-helpers.mjs +118 -55
- package/fesm2022/theseam-ui-common-story-helpers.mjs.map +1 -1
- package/package.json +5 -1
- package/signature-input/index.d.ts +306 -0
- package/signature-input/package.json +3 -0
- package/story-helpers/index.d.ts +60 -23
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theseam-ui-common-signature-input.mjs","sources":["../../../projects/ui-common/signature-input/signature-input-container.token.ts","../../../projects/ui-common/signature-input/signature-input-img/signature-input-img.component.ts","../../../projects/ui-common/signature-input/signature-input-img/signature-input-img.component.html","../../../projects/ui-common/signature-input/signature-input-pen/signature-input-pen.component.ts","../../../projects/ui-common/signature-input/signature-input-pen/signature-input-pen.component.html","../../../projects/ui-common/signature-input/signature-input-text/signature-input-text.component.ts","../../../projects/ui-common/signature-input/signature-input-text/signature-input-text.component.html","../../../projects/ui-common/signature-input/signature-input-panel/signature-input-panel.component.ts","../../../projects/ui-common/signature-input/signature-input-panel/signature-input-panel.component.html","../../../projects/ui-common/signature-input/signature-input-button.directive.ts","../../../projects/ui-common/signature-input/testing/signature-input-img.harness.ts","../../../projects/ui-common/signature-input/testing/signature-input-pen.harness.ts","../../../projects/ui-common/signature-input/testing/signature-input-text.harness.ts","../../../projects/ui-common/signature-input/testing/signature-input-panel.harness.ts","../../../projects/ui-common/signature-input/testing/signature-input-button.harness.ts","../../../projects/ui-common/signature-input/theseam-ui-common-signature-input.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core'\n\nimport { SignatureInputContainer } from './signature-input-panel.models'\n\nexport const THESEAM_SIGNATURE_INPUT_CONTAINER =\n new InjectionToken<SignatureInputContainer>(\n 'THESEAM_SIGNATURE_INPUT_CONTAINER',\n )\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n inject,\n signal,\n} from '@angular/core'\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop'\nimport {\n AbstractControl,\n ControlValueAccessor,\n FormControl,\n NG_VALUE_ACCESSOR,\n ValidationErrors,\n ValidatorFn,\n} from '@angular/forms'\nimport { from, of } from 'rxjs'\nimport { switchMap } from 'rxjs/operators'\n\nimport {\n FileSystemFileEntry,\n NgxFileDropEntry,\n NgxFileDropModule,\n} from 'ngx-file-drop'\nimport { readFileAsDataUrlAsync } from '@theseam/ui-common/utils'\n\nimport { SignatureInputItem } from '../signature-input-panel.models'\nimport { THESEAM_SIGNATURE_INPUT_CONTAINER } from '../signature-input-container.token'\n\nconst MAX_FILE_SIZE_BYTES = 2 * 1024 * 1024\n\nconst maxFileSizeValidator: ValidatorFn = (\n control: AbstractControl,\n): ValidationErrors | null => {\n const value = control.value\n if (!(value instanceof File)) {\n return null\n }\n return value.size > MAX_FILE_SIZE_BYTES ? { maxFileSize: {} } : null\n}\n\n@Component({\n selector: 'seam-signature-input-img',\n templateUrl: './signature-input-img.component.html',\n styleUrls: ['./signature-input-img.component.scss'],\n imports: [NgxFileDropModule],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: TheSeamSignatureInputImgComponent,\n multi: true,\n },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TheSeamSignatureInputImgComponent\n implements ControlValueAccessor, SignatureInputItem\n{\n static readonly MAX_FILE_SIZE = MAX_FILE_SIZE_BYTES\n\n private readonly _container = inject(THESEAM_SIGNATURE_INPUT_CONTAINER, {\n optional: true,\n })\n private readonly _destroyRef = inject(DestroyRef)\n\n /**\n * The File is only needed for validation at selection time. Once it's been\n * converted to a data URL and stored in the form value, we don't need the\n * File again — so there's no point trying to round-trip it through\n * writeValue / form state. The preview renders off the current form value.\n */\n protected readonly _fileControl = new FormControl<File | null>(null, {\n validators: [maxFileSizeValidator],\n })\n\n private readonly _fileStatus = toSignal(this._fileControl.statusChanges, {\n initialValue: this._fileControl.status,\n })\n\n protected readonly _sizeError = computed<string | null>(() => {\n // Touch the status signal so this re-runs on validity changes.\n this._fileStatus()\n return this._fileControl.getError('maxFileSize')\n ? 'File size has exceeded 2MB.'\n : null\n })\n\n /**\n * Single source of truth for both the form value and the preview image.\n * External writes (writeValue) and successful uploads both funnel through\n * here, so switching tabs and coming back always shows the last committed\n * signature.\n */\n private readonly _value = signal<string | null>(null)\n protected readonly _previewDataUrl = computed(() => this._value())\n protected readonly _previewBackgroundImage = computed(() => {\n const url = this._value()\n return url ? `url(\"${url}\")` : null\n })\n\n private _onChange: (value: string | null) => void = () => undefined\n private _onTouched: () => void = () => undefined\n\n constructor() {\n if (this._container) {\n this._container.registerInputItem('img', this)\n this._destroyRef.onDestroy(() =>\n this._container?.unregisterInputItem('img', this),\n )\n }\n\n // Valid file uploads convert to a data URL and become both the preview\n // and the form value. Invalid (too large) files clear both.\n this._fileControl.valueChanges\n .pipe(\n switchMap(() => {\n const file = this._fileControl.value\n if (!file || this._fileControl.invalid) {\n return of<string | null>(null)\n }\n return from(readFileAsDataUrlAsync(file))\n }),\n takeUntilDestroyed(),\n )\n .subscribe((dataUrl) => this._setValue(dataUrl))\n }\n\n writeValue(value: string | null): void {\n this._value.set(value)\n }\n\n registerOnChange(fn: (value: string | null) => void): void {\n this._onChange = fn\n }\n\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn\n }\n\n setDisabledState(isDisabled: boolean): void {\n if (this._fileControl.disabled === isDisabled) return\n if (isDisabled) this._fileControl.disable()\n else this._fileControl.enable()\n }\n\n clear(): void {\n // valueChanges subscription propagates this to `_value` (null) and to the\n // form value.\n this._fileControl.setValue(null)\n }\n\n openFileBrowse(): void {\n const fileInput = document.createElement('input')\n fileInput.setAttribute('type', 'file')\n\n const cleanup = () => {\n // Give the 'change' event a moment to fire before assuming the user\n // canceled the dialog.\n setTimeout(() => {\n fileInput.removeEventListener('change', onFileChange)\n document.body.removeEventListener('focus', onFocusReturned)\n window.removeEventListener('focus', onFocusReturned)\n }, 1000)\n }\n\n const onFileChange = (event: Event) => {\n const input = event.target as HTMLInputElement\n if (input.files && input.files.length > 0) {\n this._fileControl.setValue(input.files[0])\n }\n cleanup()\n }\n fileInput.addEventListener('change', onFileChange)\n\n // Detect file browser canceled without making a selection.\n const onFocusReturned = () => cleanup()\n document.body.addEventListener('focus', onFocusReturned)\n window.addEventListener('focus', onFocusReturned)\n\n fileInput.click()\n }\n\n protected _onFileDropped(files: NgxFileDropEntry[]) {\n for (const droppedFile of files) {\n if (droppedFile.fileEntry.isFile) {\n const fileEntry = droppedFile.fileEntry as FileSystemFileEntry\n fileEntry.file((file) => this._fileControl.setValue(file))\n break\n }\n }\n }\n\n private _setValue(value: string | null): void {\n this._value.set(value)\n this._onChange(value)\n this._onTouched()\n }\n}\n","<div class=\"seam-signature-input-img\">\n <div class=\"seam-signature-input-img__upload-container\">\n <div class=\"seam-signature-input-img__header h-100\">\n <div\n class=\"seam-signature-input-img__upload-box h-100\"\n [class.has-preview]=\"!!_previewDataUrl()\"\n [style.background-image]=\"_previewBackgroundImage()\"\n tabindex=\"0\"\n (click)=\"openFileBrowse()\"\n (keydown.enter)=\"openFileBrowse()\"\n >\n <ngx-file-drop\n contentClassName=\"border-0\"\n dropZoneClassName=\"border-0\"\n (onFileDrop)=\"_onFileDropped($event)\"\n >\n <ng-template ngx-file-drop-content-tmp>\n @if (!_previewDataUrl()) {\n <div class=\"seam-signature-input-img__drop-prompt\">\n <strong>Choose a file</strong> or drag it here\n </div>\n }\n </ng-template>\n </ngx-file-drop>\n </div>\n\n @if (_sizeError(); as err) {\n <div class=\"seam-signature-input-img__size-error\">{{ err }}</div>\n }\n </div>\n </div>\n</div>\n","import {\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core'\nimport {\n AngularSignaturePadModule,\n SignaturePadComponent,\n} from '@almothafar/angular-signature-pad'\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'\n\nimport {\n SignatureInputItem,\n SignatureInputOptions,\n} from '../signature-input-panel.models'\nimport { THESEAM_SIGNATURE_INPUT_CONTAINER } from '../signature-input-container.token'\n\nconst DEFAULT_OPTIONS: SignatureInputOptions = {\n canvasWidth: 500,\n canvasHeight: 150,\n}\n\n@Component({\n selector: 'seam-signature-input-pen',\n templateUrl: './signature-input-pen.component.html',\n styleUrls: ['./signature-input-pen.component.scss'],\n imports: [AngularSignaturePadModule],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: TheSeamSignatureInputPenComponent,\n multi: true,\n },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TheSeamSignatureInputPenComponent\n implements ControlValueAccessor, SignatureInputItem\n{\n private readonly _container = inject(THESEAM_SIGNATURE_INPUT_CONTAINER, {\n optional: true,\n })\n private readonly _destroyRef = inject(DestroyRef)\n\n readonly options = input<SignatureInputOptions, SignatureInputOptions>(\n DEFAULT_OPTIONS,\n { transform: (value) => ({ ...DEFAULT_OPTIONS, ...value }) },\n )\n\n readonly beginDrawing = output<MouseEvent | Touch>()\n readonly endDrawing = output<MouseEvent | Touch>()\n\n // Optional (not required) because writeValue may be called before the view\n // is rendered — callers must null-check when reading.\n private readonly _signaturePad = viewChild<SignaturePadComponent>('sigPad')\n\n private readonly _value = signal<string | null>(null)\n private readonly _disabled = signal<boolean>(false)\n\n protected readonly _canvasWidth = computed(\n () => this.options().canvasWidth ?? DEFAULT_OPTIONS.canvasWidth,\n )\n protected readonly _canvasHeight = computed(\n () => this.options().canvasHeight ?? DEFAULT_OPTIONS.canvasHeight,\n )\n\n private _onChange: (value: string | null) => void = () => undefined\n private _onTouched: () => void = () => undefined\n\n constructor() {\n if (this._container) {\n this._container.registerInputItem('pen', this)\n this._destroyRef.onDestroy(() =>\n this._container?.unregisterInputItem('pen', this),\n )\n }\n\n // Restore any value written before the canvas was ready (the common case\n // when this component mounts via @switch with an existing form value).\n afterNextRender(() => this._applyValueToPad())\n }\n\n writeValue(value: string | null): void {\n this._value.set(value)\n this._applyValueToPad()\n }\n\n registerOnChange(fn: (value: string | null) => void): void {\n this._onChange = fn\n }\n\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn\n }\n\n setDisabledState(isDisabled: boolean): void {\n this._disabled.set(isDisabled)\n }\n\n clear(): void {\n this._signaturePad()?.clear()\n this._setValue(null)\n }\n\n protected _drawStart(event: MouseEvent | Touch) {\n this.beginDrawing.emit(event)\n }\n\n protected _drawComplete(event: MouseEvent | Touch) {\n this._setValue(this._getDataURL())\n this.endDrawing.emit(event)\n }\n\n private _getDataURL(): string | null {\n const pad = this._signaturePad()\n if (!pad || pad.isEmpty()) {\n return null\n }\n return pad.toDataURL()\n }\n\n private _applyValueToPad(): void {\n const pad = this._signaturePad()\n if (!pad) {\n return\n }\n try {\n const value = this._value()\n if (value) {\n // fromDataURL is async and rejects on malformed input. Swallow errors\n // so a corrupted stored value can't crash the component — the form\n // control still retains the raw string.\n pad.fromDataURL(value).catch(() => undefined)\n } else {\n pad.clear()\n }\n } catch {\n // The SignaturePadComponent instance is available as soon as the view\n // query resolves, but its internal signature_pad isn't constructed\n // until ngAfterContentInit. writeValue can be called before that\n // (during form-control wire-up). afterNextRender re-invokes this once\n // the canvas is fully initialized.\n }\n }\n\n private _setValue(value: string | null): void {\n this._value.set(value)\n this._onChange(value)\n this._onTouched()\n }\n}\n","<div\n class=\"seam-signature-input-pen__canvas-wrap\"\n [style.width.px]=\"_canvasWidth()\"\n [style.height.px]=\"_canvasHeight()\"\n>\n <signature-pad\n #sigPad\n [options]=\"options()\"\n (drawStart)=\"_drawStart($event)\"\n (drawEnd)=\"_drawComplete($event)\"\n ></signature-pad>\n</div>\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n effect,\n ElementRef,\n inject,\n signal,\n viewChild,\n} from '@angular/core'\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop'\nimport {\n ControlValueAccessor,\n FormControl,\n NG_VALUE_ACCESSOR,\n ReactiveFormsModule,\n} from '@angular/forms'\nimport { debounceTime } from 'rxjs/operators'\n\nimport { TheSeamFontLoaderService } from '@theseam/ui-common/services'\nimport { TheSeamFormFieldModule } from '@theseam/ui-common/form-field'\nimport {\n TheSeamAutoFocusDirective,\n TheSeamDisableControlDirective,\n} from '@theseam/ui-common/shared'\n\nimport { SignatureInputItem } from '../signature-input-panel.models'\nimport { THESEAM_SIGNATURE_INPUT_CONTAINER } from '../signature-input-container.token'\n\nexport type SignatureFontState = 'loading' | 'inactive' | 'active'\n\nconst SIGNATURE_FONT_FAMILY = 'Homemade Apple'\nconst CANVAS_WIDTH = 500\nconst CANVAS_HEIGHT = 127\n\n@Component({\n selector: 'seam-signature-input-text',\n templateUrl: './signature-input-text.component.html',\n styleUrls: ['./signature-input-text.component.scss'],\n imports: [\n ReactiveFormsModule,\n TheSeamFormFieldModule,\n TheSeamAutoFocusDirective,\n TheSeamDisableControlDirective,\n ],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: TheSeamSignatureInputTextComponent,\n multi: true,\n },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TheSeamSignatureInputTextComponent\n implements ControlValueAccessor, SignatureInputItem, AfterViewInit\n{\n private readonly _fontLoader = inject(TheSeamFontLoaderService)\n private readonly _container = inject(THESEAM_SIGNATURE_INPUT_CONTAINER, {\n optional: true,\n })\n private readonly _destroyRef = inject(DestroyRef)\n\n // Optional (not required) because writeValue may be called before the\n // canvas is in the DOM — callers must null-check when reading.\n private readonly _typeCanvas =\n viewChild<ElementRef<HTMLCanvasElement>>('typeCanvas')\n\n readonly _nameControl = new FormControl<string | null>(null)\n\n private readonly _fontState = signal<SignatureFontState>('loading')\n protected readonly _fontLoading = computed(\n () => this._fontState() === 'loading',\n )\n protected readonly _fontInactive = computed(\n () => this._fontState() === 'inactive',\n )\n protected readonly _fontNotActive = computed(\n () => this._fontState() !== 'active',\n )\n\n private readonly _disabled = signal<boolean>(false)\n protected readonly _disabledOrFontNotActive = computed(\n () => this._disabled() || this._fontNotActive(),\n )\n\n protected readonly _canvasWidth = CANVAS_WIDTH\n protected readonly _canvasHeight = CANVAS_HEIGHT\n\n /** Current form value (rendered bitmap data URL). */\n private _value: string | null = null\n /**\n * When the user last typed a name (if any) on this instance. `null` means\n * there is no user-typed signature on this instance — the canvas should\n * keep whatever image was restored from `_value`.\n */\n private _renderedText: string | null = null\n\n private _onChange: (value: string | null) => void = () => undefined\n private _onTouched: () => void = () => undefined\n\n constructor() {\n if (this._container) {\n this._container.registerInputItem('text', this)\n this._destroyRef.onDestroy(() =>\n this._container?.unregisterInputItem('text', this),\n )\n }\n\n this._fontLoader\n .load({ google: { families: [SIGNATURE_FONT_FAMILY] } })\n .pipe(takeUntilDestroyed())\n .subscribe((e) => {\n if (\n e.type === 'loading' ||\n e.type === 'inactive' ||\n e.type === 'active'\n ) {\n this._fontState.set(e.type)\n }\n })\n\n // Debounced redraw of the user-typed name.\n this._nameControl.valueChanges\n .pipe(debounceTime(100), takeUntilDestroyed())\n .subscribe(() => this._drawTextToCanvas())\n\n // When the font flips to active and a name has been typed on this\n // instance, redraw the text so the now-loaded font replaces the fallback.\n // We do NOT touch the canvas otherwise — if there's a restored image but\n // no typed name, this effect must leave the image alone.\n effect(() => {\n if (this._fontState() === 'active' && this._renderedText) {\n this._drawTextToCanvas()\n }\n })\n }\n\n ngAfterViewInit(): void {\n // Paint any previously-written form value onto the canvas now that the\n // view is in place. writeValue may have been invoked earlier as part of\n // form-control wire-up, before the canvas existed.\n if (this._value) {\n this._drawImageToCanvas(this._value)\n }\n }\n\n writeValue(value: string | null): void {\n this._value = value\n this._renderedText = null\n // emitEvent: false so the debounced valueChanges subscriber doesn't fire\n // and redraw as text (which would clobber the restored image).\n this._nameControl.setValue(null, { emitEvent: false })\n this._drawImageToCanvas(value)\n }\n\n registerOnChange(fn: (value: string | null) => void): void {\n this._onChange = fn\n }\n\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn\n }\n\n setDisabledState(isDisabled: boolean): void {\n this._disabled.set(isDisabled)\n }\n\n clear(): void {\n this._clearCanvas()\n this._renderedText = null\n this._nameControl.setValue(null, { emitEvent: false })\n this._setValue(null)\n }\n\n protected _onKeyDownEnter(): void {\n this._drawTextToCanvas()\n }\n\n protected _onNameInputBlur(): void {\n this._drawTextToCanvas()\n }\n\n /**\n * Paint the given data URL onto the canvas as an image. Used when the\n * component mounts with a pre-existing form value — the user's typed name\n * isn't recoverable from the rendered bitmap, only the bitmap itself.\n */\n private _drawImageToCanvas(dataUrl: string | null): void {\n const canvas = this._typeCanvas()?.nativeElement\n if (!canvas) {\n return\n }\n const context = canvas.getContext('2d')\n if (!context) {\n return\n }\n context.clearRect(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT)\n if (!dataUrl) {\n return\n }\n const img = new Image()\n img.onload = () => {\n context.clearRect(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT)\n context.drawImage(img, 0, 0)\n }\n img.src = dataUrl\n }\n\n /**\n * Render `_nameControl.value` as text onto the canvas and publish the\n * result as the form value. A null/empty name clears both.\n */\n private _drawTextToCanvas(): void {\n const canvas = this._typeCanvas()?.nativeElement\n if (!canvas) {\n return\n }\n const context = canvas.getContext('2d')\n if (!context) {\n return\n }\n\n const text = this._nameControl.value\n if (!text || text.trim().length === 0) {\n // Only clear if the user had previously rendered text on this instance.\n // Otherwise we'd wipe a restored image that writeValue just painted.\n if (this._renderedText !== null) {\n context.clearRect(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT)\n this._renderedText = null\n this._setValue(null)\n }\n return\n }\n\n context.clearRect(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT)\n context.fillStyle = 'black'\n context.textBaseline = 'bottom'\n context.textAlign = 'center'\n let fontsize = 60\n do {\n fontsize--\n context.font = `${fontsize}px ${SIGNATURE_FONT_FAMILY}, cursive`\n } while (context.measureText(text).width > CANVAS_WIDTH)\n context.fillText(text, CANVAS_WIDTH / 2, 100)\n\n this._renderedText = text\n this._setValue(canvas.toDataURL())\n }\n\n private _clearCanvas(): void {\n const context = this._typeCanvas()?.nativeElement.getContext('2d')\n context?.clearRect(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT)\n }\n\n private _setValue(value: string | null): void {\n if (this._value === value) {\n return\n }\n this._value = value\n this._onChange(value)\n this._onTouched()\n }\n}\n","<div class=\"seam-signature-input-text\">\n <div class=\"seam-signature-input-text__header d-flex flex-row\">\n <seam-form-field\n [inline]=\"true\"\n class=\"flex-grow-1 mr-2\"\n [numPaddingErrors]=\"0\"\n >\n <span *seamFormFieldLabelTpl class=\"text-nowrap mr-2\"\n >Enter Full Name:</span\n >\n <input\n seamInput\n [formControl]=\"_nameControl\"\n class=\"pl-1 flex-grow-1\"\n autocomplete=\"off\"\n (keydown.enter)=\"_onKeyDownEnter()\"\n (blur)=\"_onNameInputBlur()\"\n [seamDisableControl]=\"_disabledOrFontNotActive()\"\n seamAutoFocus\n />\n </seam-form-field>\n </div>\n\n <div\n class=\"seam-signature-input-text__canvas-wrap overflow-hidden position-relative\"\n [style.height.px]=\"_canvasHeight\"\n >\n @if (_fontLoading()) {\n <div class=\"seam-signature-input-text__status\">Font Loading</div>\n }\n\n @if (_fontInactive()) {\n <div class=\"seam-signature-input-text__status text-warning\">\n <div class=\"seam-signature-input-text__status-headline\">\n Font failed to load.\n </div>\n <div>\n To use the typed signature, try refreshing the page or using another\n web browser. If you still have issues please contact support and let\n us know.\n </div>\n </div>\n }\n\n <canvas\n #typeCanvas\n class=\"position-absolute\"\n [attr.width]=\"_canvasWidth\"\n [attr.height]=\"_canvasHeight\"\n [style.top.px]=\"0\"\n [style.left.px]=\"0\"\n ></canvas>\n </div>\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n inject,\n isDevMode,\n output,\n signal,\n} from '@angular/core'\nimport { A11yModule } from '@angular/cdk/a11y'\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop'\nimport { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'\nimport { combineLatest, map, switchMap } from 'rxjs'\n\nimport {\n faKeyboard,\n faSignature,\n faUpload,\n} from '@fortawesome/free-solid-svg-icons'\nimport { TheSeamButtonsModule } from '@theseam/ui-common/buttons'\nimport { TheSeamIconModule } from '@theseam/ui-common/icon'\nimport { TheSeamLayoutService } from '@theseam/ui-common/layout'\nimport { ModalRef } from '@theseam/ui-common/modal'\nimport { TheSeamAutoFocusDirective } from '@theseam/ui-common/shared'\nimport {\n observeControlValid,\n observeControlValue,\n} from '@theseam/ui-common/utils'\n\nimport {\n SignatureInputContainer,\n SignatureInputItem,\n SignatureInputPanelResult,\n SignatureInputResetType,\n SignatureInputType,\n} from '../signature-input-panel.models'\nimport { THESEAM_SIGNATURE_INPUT_CONTAINER } from '../signature-input-container.token'\nimport { TheSeamSignatureInputImgComponent } from '../signature-input-img/signature-input-img.component'\nimport { TheSeamSignatureInputPenComponent } from '../signature-input-pen/signature-input-pen.component'\nimport { TheSeamSignatureInputTextComponent } from '../signature-input-text/signature-input-text.component'\n\ninterface SignatureInputPanelForm {\n pen: FormControl<string | null>\n text: FormControl<string | null>\n img: FormControl<string | null>\n}\n\nconst isValueEmpty = (value: unknown): boolean =>\n typeof value !== 'string' || value.trim().length === 0\n\n@Component({\n selector: 'seam-signature-input-panel',\n templateUrl: './signature-input-panel.component.html',\n styleUrls: ['./signature-input-panel.component.scss'],\n imports: [\n A11yModule,\n ReactiveFormsModule,\n TheSeamButtonsModule,\n TheSeamIconModule,\n TheSeamAutoFocusDirective,\n TheSeamSignatureInputPenComponent,\n TheSeamSignatureInputTextComponent,\n TheSeamSignatureInputImgComponent,\n ],\n providers: [\n {\n provide: THESEAM_SIGNATURE_INPUT_CONTAINER,\n useExisting: TheSeamSignatureInputPanelComponent,\n },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n /**\n * Allow focusing the host element via `focus()` without it being part of the\n * tab order (the inner inputs handle keyboard navigation).\n */\n '[attr.tabIndex]': '-1',\n },\n})\nexport class TheSeamSignatureInputPanelComponent\n implements SignatureInputContainer\n{\n private readonly _layout = inject(TheSeamLayoutService)\n private readonly _modalRef = inject<ModalRef<SignatureInputPanelResult>>(\n ModalRef,\n { optional: true },\n )\n\n /** Emitted when the panel is submitted or canceled. */\n readonly result = output<SignatureInputPanelResult>()\n\n protected readonly _faSignature = faSignature\n protected readonly _faUpload = faUpload\n protected readonly _faKeyboard = faKeyboard\n\n protected readonly _activeType = signal<SignatureInputType>('pen')\n protected readonly _resetType = computed<SignatureInputResetType>(() =>\n this._activeType() === 'img' ? 'delete' : 'cancel',\n )\n\n readonly _form = new FormGroup<SignatureInputPanelForm>({\n pen: new FormControl<string | null>(null),\n text: new FormControl<string | null>(null),\n img: new FormControl<string | null>(null),\n })\n\n private readonly _registeredInputItems = new Map<string, SignatureInputItem>()\n\n // Observables are used here because the active control changes, which makes\n // a pure-signal approach awkward (signals don't naturally switch between\n // observable sources). We derive the active control, its value, and its\n // validity via rxjs, then expose the results as signals for the template.\n private readonly _activeControl$ = toObservable(this._activeType).pipe(\n map((type) => this._form.controls[type]),\n )\n\n private readonly _activeValue$ = this._activeControl$.pipe(\n switchMap((control) => observeControlValue<string | null>(control)),\n map((value) => (isValueEmpty(value) ? null : (value as string))),\n )\n\n private readonly _canSubmit$ = combineLatest([\n this._activeControl$.pipe(switchMap((c) => observeControlValid(c))),\n this._activeValue$,\n ]).pipe(map(([valid, value]) => valid && value !== null))\n\n protected readonly _value = toSignal(this._activeValue$, {\n initialValue: null,\n })\n protected readonly _valueEmpty = computed(() => this._value() === null)\n protected readonly _canSubmit = toSignal(this._canSubmit$, {\n initialValue: false,\n })\n\n protected readonly _isSm = toSignal(this._layout.observe('sm'), {\n initialValue: false,\n })\n\n showType(type: SignatureInputType) {\n this._activeType.set(type)\n }\n\n registerInputItem(type: string, item: SignatureInputItem): boolean {\n if (this._registeredInputItems.has(type)) {\n if (isDevMode()) {\n // eslint-disable-next-line no-console\n console.warn(\n `[TheSeamSignatureInputPanelComponent] Input item '${type}' is already registered.`,\n )\n }\n return false\n }\n this._registeredInputItems.set(type, item)\n return true\n }\n\n unregisterInputItem(type: string, item: SignatureInputItem): boolean {\n const registered = this._registeredInputItems.get(type)\n if (!registered) {\n if (isDevMode()) {\n // eslint-disable-next-line no-console\n console.warn(\n `[TheSeamSignatureInputPanelComponent] Input item '${type}' can't be unregistered.`,\n )\n }\n return false\n }\n if (isDevMode() && registered !== item) {\n // eslint-disable-next-line no-console\n console.warn(\n `[TheSeamSignatureInputPanelComponent] Registered item for type '${type}' doesn't match the item being unregistered.`,\n )\n }\n this._registeredInputItems.delete(type)\n return true\n }\n\n reset() {\n this._form.reset({ pen: null, text: null, img: null })\n }\n\n protected _onClearBtnClick(event: Event) {\n event.preventDefault()\n event.stopPropagation()\n this._registeredInputItems.get(this._activeType())?.clear()\n }\n\n protected _onCancelBtnClick(event: Event) {\n event.preventDefault()\n event.stopPropagation()\n this.reset()\n this._emit({ type: 'cancel' })\n }\n\n protected _onSubmitBtnClick(event: Event) {\n event.preventDefault()\n event.stopPropagation()\n if (!this._canSubmit()) {\n return\n }\n const value = this._value()\n if (value === null) {\n return\n }\n this._emit({ type: 'submit', value })\n }\n\n private _emit(result: SignatureInputPanelResult) {\n this.result.emit(result)\n this._modalRef?.close(result)\n }\n}\n","<div class=\"seam-signature-input-panel\">\n <div class=\"seam-signature-input-panel__content\" cdkTrapFocus>\n <div class=\"seam-signature-input-panel__options pb-2 mb-1\">\n <button\n seamButton\n theme=\"primary\"\n [class.btn-sm]=\"_isSm()\"\n class=\"text-nowrap mr-1\"\n [class.active]=\"_activeType() === 'pen'\"\n (click)=\"showType('pen')\"\n >\n <seam-icon [icon]=\"_faSignature\" size=\"sm\"></seam-icon> Draw\n </button>\n <button\n seamButton\n theme=\"primary\"\n [class.btn-sm]=\"_isSm()\"\n class=\"text-nowrap mx-1\"\n [class.active]=\"_activeType() === 'text'\"\n (click)=\"showType('text')\"\n >\n <seam-icon [icon]=\"_faKeyboard\" size=\"sm\"></seam-icon> Type\n </button>\n <button\n seamButton\n theme=\"primary\"\n [class.btn-sm]=\"_isSm()\"\n class=\"text-nowrap ml-1\"\n [class.active]=\"_activeType() === 'img'\"\n (click)=\"showType('img')\"\n >\n <seam-icon [icon]=\"_faUpload\" size=\"sm\"></seam-icon> Upload\n </button>\n </div>\n\n <form [formGroup]=\"_form\">\n @switch (_activeType()) {\n @case ('pen') {\n <seam-signature-input-pen\n formControlName=\"pen\"\n ></seam-signature-input-pen>\n }\n @case ('text') {\n <seam-signature-input-text\n formControlName=\"text\"\n ></seam-signature-input-text>\n }\n @case ('img') {\n <seam-signature-input-img\n formControlName=\"img\"\n ></seam-signature-input-img>\n }\n }\n </form>\n\n <div class=\"seam-signature-input-panel__footer mt-1\">\n <div>\n @if (_resetType() === 'delete') {\n <button\n seamButton\n theme=\"danger\"\n [class.btn-sm]=\"_isSm()\"\n [disabled]=\"_valueEmpty()\"\n (click)=\"_onClearBtnClick($event)\"\n >\n Delete\n </button>\n } @else {\n <button\n seamButton\n theme=\"lightgray\"\n [class.btn-sm]=\"_isSm()\"\n [disabled]=\"_valueEmpty()\"\n (click)=\"_onClearBtnClick($event)\"\n >\n Clear\n </button>\n }\n </div>\n <div>\n <button\n seamButton\n theme=\"lightgray\"\n [class.btn-sm]=\"_isSm()\"\n seamAutoFocus\n (click)=\"_onCancelBtnClick($event)\"\n >\n Cancel\n </button>\n <button\n seamButton\n theme=\"primary\"\n [class.btn-sm]=\"_isSm()\"\n [disabled]=\"!_canSubmit()\"\n (click)=\"_onSubmitBtnClick($event)\"\n >\n Apply Signature\n </button>\n </div>\n </div>\n </div>\n</div>\n","import {\n Directive,\n ElementRef,\n EventEmitter,\n HostListener,\n inject,\n Input,\n Output,\n} from '@angular/core'\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'\nimport { take } from 'rxjs/operators'\n\nimport {\n TheSeamAnchorButtonComponent,\n TheSeamButtonComponent,\n} from '@theseam/ui-common/buttons'\nimport { Modal, ModalConfig } from '@theseam/ui-common/modal'\n\nimport { SignatureInputPanelResult } from './signature-input-panel.models'\nimport { TheSeamSignatureInputPanelComponent } from './signature-input-panel/signature-input-panel.component'\n\n/**\n * Opens the signature input panel in a modal when the host button/anchor is\n * clicked, and writes the submitted data URL back through its bound form\n * control. Implements `ControlValueAccessor` so it works with any of the form\n * binding styles (`formControl`, `formControlName`, `ngModel`).\n *\n * Usage:\n *\n * ```html\n * <button seamButton theme=\"primary\" seamSignatureInput formControlName=\"signature\">\n * Sign\n * </button>\n * ```\n *\n * The selector-name input accepts a partial `ModalConfig` for cases that need\n * to tweak the modal (e.g. `disableClose`):\n *\n * ```html\n * <button\n * seamButton\n * [seamSignatureInput]=\"{ disableClose: true }\"\n * formControlName=\"signature\"\n * >Sign</button>\n * ```\n */\n@Directive({\n selector: 'button[seamSignatureInput], a[seamSignatureInput]',\n exportAs: 'seamSignatureInput',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: TheSeamSignatureInputButtonDirective,\n multi: true,\n },\n ],\n})\nexport class TheSeamSignatureInputButtonDirective\n implements ControlValueAccessor\n{\n private readonly _modal = inject(Modal)\n private readonly _elementRef = inject<ElementRef<HTMLElement>>(ElementRef)\n // When the same host element also carries `seamButton`/`a[seamButton]`,\n // delegate disabled state to its `disabled` input so its host binding remains\n // the single source of truth for the `disabled` attribute — avoids a\n // tug-of-war between this directive and the button directive's CD.\n private readonly _seamButton = inject(TheSeamButtonComponent, {\n optional: true,\n self: true,\n })\n private readonly _seamAnchor = inject(TheSeamAnchorButtonComponent, {\n optional: true,\n self: true,\n })\n\n /**\n * Partial `ModalConfig` passthrough. Most consumers leave this unset; the\n * signature panel's styles assume the default modal size.\n */\n\n @Input('seamSignatureInput') modalConfig: ModalConfig | null | undefined\n\n /** Emits the submitted data URL when the user applies a signature. */\n @Output() signed = new EventEmitter<string>()\n\n /** Emits when the user dismisses the panel without submitting. */\n @Output() canceled = new EventEmitter<void>()\n\n private _value: string | null = null\n private _disabled = false\n private _onChange: (value: string | null) => void = () => undefined\n private _onTouched: () => void = () => undefined\n\n writeValue(value: string | null): void {\n this._value = value\n }\n\n registerOnChange(fn: (value: string | null) => void): void {\n this._onChange = fn\n }\n\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn\n }\n\n setDisabledState(isDisabled: boolean): void {\n this._disabled = isDisabled\n if (this._seamButton) {\n this._seamButton.disabled = isDisabled\n } else if (this._seamAnchor) {\n this._seamAnchor.disabled = isDisabled\n } else {\n const el = this._elementRef.nativeElement\n if (isDisabled) {\n el.setAttribute('disabled', '')\n } else {\n el.removeAttribute('disabled')\n }\n }\n }\n\n /** @ignore */\n @HostListener('click')\n _onClick(): void {\n if (this._disabled) {\n return\n }\n const ref = this._modal.openFromComponent<\n TheSeamSignatureInputPanelComponent,\n SignatureInputPanelResult\n >(TheSeamSignatureInputPanelComponent, this.modalConfig ?? undefined)\n\n ref\n .afterClosed()\n .pipe(take(1))\n .subscribe((result) => {\n this._onTouched()\n if (result?.type === 'submit') {\n this._value = result.value\n this._onChange(result.value)\n this.signed.emit(result.value)\n } else {\n this.canceled.emit()\n }\n })\n }\n}\n","import { ComponentHarness } from '@angular/cdk/testing'\n\nexport class TheSeamSignatureInputImgHarness extends ComponentHarness {\n static hostSelector = 'seam-signature-input-img'\n\n private readonly _fileDrop = this.locatorFor('ngx-file-drop')\n private readonly _sizeError = this.locatorForOptional(\n '.seam-signature-input-img__size-error',\n )\n private readonly _preview = this.locatorForOptional(\n '.seam-signature-input-img__preview',\n )\n\n async getSizeError(): Promise<string | null> {\n const el = await this._sizeError()\n return el ? (await el.text()).trim() : null\n }\n\n async hasPreview(): Promise<boolean> {\n return (await this._preview()) !== null\n }\n\n async getPreviewSrc(): Promise<string | null> {\n const el = await this._preview()\n return el ? el.getAttribute('src') : null\n }\n\n async getFileDrop() {\n return this._fileDrop()\n }\n}\n","import { ComponentHarness } from '@angular/cdk/testing'\n\nexport class TheSeamSignatureInputPenHarness extends ComponentHarness {\n static hostSelector = 'seam-signature-input-pen'\n\n private readonly _canvas = this.locatorFor('canvas')\n\n async getCanvas() {\n return this._canvas()\n }\n\n async getCanvasWidth(): Promise<number | null> {\n const canvas = await this._canvas()\n const attr = await canvas.getAttribute('width')\n return attr ? Number(attr) : null\n }\n\n async getCanvasHeight(): Promise<number | null> {\n const canvas = await this._canvas()\n const attr = await canvas.getAttribute('height')\n return attr ? Number(attr) : null\n }\n}\n","import { ComponentHarness } from '@angular/cdk/testing'\n\nexport class TheSeamSignatureInputTextHarness extends ComponentHarness {\n static hostSelector = 'seam-signature-input-text'\n\n private readonly _input = this.locatorFor('input')\n private readonly _canvas = this.locatorFor('canvas')\n\n async getInput() {\n return this._input()\n }\n\n async enterName(text: string): Promise<void> {\n const input = await this._input()\n await input.clear()\n await input.sendKeys(text)\n }\n\n async getInputValue(): Promise<string> {\n const input = await this._input()\n return input.getProperty<string>('value')\n }\n\n async isInputDisabled(): Promise<boolean> {\n const input = await this._input()\n return (await input.getAttribute('disabled')) !== null\n }\n\n async getCanvas() {\n return this._canvas()\n }\n}\n","import { ComponentHarness, TestElement } from '@angular/cdk/testing'\n\nimport { SignatureInputType } from '../signature-input-panel.models'\nimport { TheSeamSignatureInputImgHarness } from './signature-input-img.harness'\nimport { TheSeamSignatureInputPenHarness } from './signature-input-pen.harness'\nimport { TheSeamSignatureInputTextHarness } from './signature-input-text.harness'\n\nexport class TheSeamSignatureInputPanelHarness extends ComponentHarness {\n static hostSelector = 'seam-signature-input-panel'\n\n private readonly _drawBtn = this.locatorFor('button:nth-of-type(1)')\n private readonly _typeBtn = this.locatorFor('button:nth-of-type(2)')\n private readonly _uploadBtn = this.locatorFor('button:nth-of-type(3)')\n\n private readonly _footerBtns = this.locatorForAll(\n '.seam-signature-input-panel__footer button',\n )\n\n private readonly _penHarness = this.locatorForOptional(\n TheSeamSignatureInputPenHarness,\n )\n private readonly _textHarness = this.locatorForOptional(\n TheSeamSignatureInputTextHarness,\n )\n private readonly _imgHarness = this.locatorForOptional(\n TheSeamSignatureInputImgHarness,\n )\n\n async showType(type: SignatureInputType): Promise<void> {\n const btn =\n type === 'pen'\n ? await this._drawBtn()\n : type === 'text'\n ? await this._typeBtn()\n : await this._uploadBtn()\n await btn.click()\n }\n\n async getActiveType(): Promise<SignatureInputType | null> {\n if (await this._penHarness()) return 'pen'\n if (await this._textHarness()) return 'text'\n if (await this._imgHarness()) return 'img'\n return null\n }\n\n async getPen(): Promise<TheSeamSignatureInputPenHarness | null> {\n return this._penHarness()\n }\n\n async getText(): Promise<TheSeamSignatureInputTextHarness | null> {\n return this._textHarness()\n }\n\n async getImg(): Promise<TheSeamSignatureInputImgHarness | null> {\n return this._imgHarness()\n }\n\n async getClearOrDeleteButton(): Promise<TestElement> {\n const [btn] = await this._footerBtns()\n return btn\n }\n\n async getCancelButton(): Promise<TestElement> {\n const buttons = await this._footerBtns()\n return buttons[buttons.length - 2]\n }\n\n async getSubmitButton(): Promise<TestElement> {\n const buttons = await this._footerBtns()\n return buttons[buttons.length - 1]\n }\n\n async isSubmitDisabled(): Promise<boolean> {\n const btn = await this.getSubmitButton()\n return (await btn.getAttribute('disabled')) !== null\n }\n\n async cancel(): Promise<void> {\n const btn = await this.getCancelButton()\n await btn.click()\n }\n\n async submit(): Promise<void> {\n const btn = await this.getSubmitButton()\n await btn.click()\n }\n}\n","import {\n BaseHarnessFilters,\n ComponentHarness,\n HarnessPredicate,\n} from '@angular/cdk/testing'\n\nexport interface SignatureInputButtonHarnessFilters extends BaseHarnessFilters {\n text?: string | RegExp\n}\n\nexport class TheSeamSignatureInputButtonHarness extends ComponentHarness {\n static hostSelector = 'button[seamSignatureInput], a[seamSignatureInput]'\n\n static with(\n options: SignatureInputButtonHarnessFilters = {},\n ): HarnessPredicate<TheSeamSignatureInputButtonHarness> {\n return new HarnessPredicate(\n TheSeamSignatureInputButtonHarness,\n options,\n ).addOption('text', options.text, (harness, text) =>\n HarnessPredicate.stringMatches(harness.getText(), text),\n )\n }\n\n async getText(): Promise<string> {\n return (await this.host()).text()\n }\n\n async isDisabled(): Promise<boolean> {\n return (await this.host()).getAttribute('disabled').then((v) => v !== null)\n }\n\n async click(): Promise<void> {\n await (await this.host()).click()\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","switchMap"],"mappings":"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"}
|
|
@@ -1,17 +1,16 @@
|
|
|
1
1
|
import { ThemeNames, OutlineThemeNames } from '@theseam/ui-common/models';
|
|
2
2
|
import { useStoryContext } from 'storybook/preview-api';
|
|
3
3
|
import * as i0 from '@angular/core';
|
|
4
|
-
import { Component, InjectionToken, Injectable, APP_INITIALIZER, NgModule, Injector, Input, ElementRef, APP_BOOTSTRAP_LISTENER } from '@angular/core';
|
|
4
|
+
import { Component, InjectionToken, Injectable, APP_INITIALIZER, NgModule, signal, computed, Injector, Input, ChangeDetectionStrategy, ElementRef, APP_BOOTSTRAP_LISTENER } from '@angular/core';
|
|
5
5
|
import * as i1 from '@angular/router';
|
|
6
6
|
import { Router, NavigationEnd, RouterModule } from '@angular/router';
|
|
7
|
-
import { filter, take
|
|
7
|
+
import { filter, take } from 'rxjs/operators';
|
|
8
8
|
import * as i1$1 from '@angular/common';
|
|
9
9
|
import { CommonModule } from '@angular/common';
|
|
10
|
-
import * as i2 from '@theseam/ui-common/scrollbar';
|
|
11
10
|
import { TheSeamOverlayScrollbarDirective } from '@theseam/ui-common/scrollbar';
|
|
12
|
-
import { of
|
|
11
|
+
import { of } from 'rxjs';
|
|
13
12
|
import { ModalRef, MODAL_DATA } from '@theseam/ui-common/modal';
|
|
14
|
-
import { applicationConfig } from '@storybook/angular';
|
|
13
|
+
import { componentWrapperDecorator, applicationConfig } from '@storybook/angular';
|
|
15
14
|
|
|
16
15
|
// import { ArgType } from '@storybook/addons'
|
|
17
16
|
const themeArgType = {
|
|
@@ -235,46 +234,61 @@ class FakeModalRef {
|
|
|
235
234
|
afterOpened() {
|
|
236
235
|
return of(undefined);
|
|
237
236
|
}
|
|
238
|
-
close(
|
|
237
|
+
close(_dialogResult) {
|
|
238
|
+
/* no-op in stories */
|
|
239
|
+
}
|
|
239
240
|
}
|
|
241
|
+
/**
|
|
242
|
+
* Renders its content (or an imperatively provided component/template) inside
|
|
243
|
+
* a stand-in modal frame so stories can preview components that are normally
|
|
244
|
+
* opened through the modal service.
|
|
245
|
+
*
|
|
246
|
+
* Three ways to provide content, checked in order:
|
|
247
|
+
* 1. `[component]` input — renders via `ngComponentOutlet`. Kept for
|
|
248
|
+
* compatibility with existing app stories.
|
|
249
|
+
* 2. `[template]` input — renders a `TemplateRef` via `ngTemplateOutlet`.
|
|
250
|
+
* 3. Projected content (`<ng-content>`) — the preferred form for new stories
|
|
251
|
+
* because Storybook's default template auto-binds inputs/outputs.
|
|
252
|
+
*/
|
|
240
253
|
class StoryModalContainerComponent {
|
|
241
254
|
_injector;
|
|
242
|
-
|
|
255
|
+
constructor(_injector) {
|
|
256
|
+
this._injector = _injector;
|
|
257
|
+
}
|
|
243
258
|
set component(c) {
|
|
244
|
-
this._component.
|
|
259
|
+
this._component.set(c ?? null);
|
|
245
260
|
}
|
|
246
261
|
set data(d) {
|
|
247
|
-
this._data.
|
|
262
|
+
this._data.set(d ?? null);
|
|
248
263
|
}
|
|
249
|
-
modalConfig
|
|
250
|
-
|
|
251
|
-
_data = new ReplaySubject(1);
|
|
252
|
-
_outletData$;
|
|
253
|
-
constructor(_injector) {
|
|
254
|
-
this._injector = _injector;
|
|
255
|
-
this._outletData$ = combineLatest([
|
|
256
|
-
this._component.asObservable(),
|
|
257
|
-
this._data.asObservable().pipe(startWith(undefined)),
|
|
258
|
-
]).pipe(auditTime(0), map(([component, data]) => ({
|
|
259
|
-
component,
|
|
260
|
-
injector: this._createInjector(data),
|
|
261
|
-
})), takeUntil(this._ngUnsubscribe));
|
|
264
|
+
set modalConfig(config) {
|
|
265
|
+
this._modalConfig.set(config ?? null);
|
|
262
266
|
}
|
|
263
|
-
|
|
264
|
-
this.
|
|
265
|
-
this._ngUnsubscribe.complete();
|
|
267
|
+
get modalConfig() {
|
|
268
|
+
return this._modalConfig();
|
|
266
269
|
}
|
|
270
|
+
template;
|
|
271
|
+
_component = signal(null, ...(ngDevMode ? [{ debugName: "_component" }] : []));
|
|
272
|
+
_data = signal(null, ...(ngDevMode ? [{ debugName: "_data" }] : []));
|
|
273
|
+
_modalConfig = signal(null, ...(ngDevMode ? [{ debugName: "_modalConfig" }] : []));
|
|
274
|
+
_componentInjector = computed(() => this._createInjector(this._data()), ...(ngDevMode ? [{ debugName: "_componentInjector" }] : []));
|
|
275
|
+
// No default size — stories opt into a Bootstrap modal size via
|
|
276
|
+
// `modalConfig.modalSize`, matching how the real ModalService is used.
|
|
277
|
+
_modalSizeClass = computed(() => {
|
|
278
|
+
const size = this._modalConfig()?.modalSize;
|
|
279
|
+
return size ? `modal-${size}` : '';
|
|
280
|
+
}, ...(ngDevMode ? [{ debugName: "_modalSizeClass" }] : []));
|
|
267
281
|
_createInjector(data) {
|
|
268
282
|
return Injector.create({
|
|
269
283
|
providers: [
|
|
270
284
|
{ provide: ModalRef, useClass: FakeModalRef, deps: [] },
|
|
271
|
-
{ provide: MODAL_DATA, useValue: data },
|
|
285
|
+
{ provide: MODAL_DATA, useValue: data ?? undefined },
|
|
272
286
|
],
|
|
273
287
|
parent: this._injector,
|
|
274
288
|
});
|
|
275
289
|
}
|
|
276
290
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: StoryModalContainerComponent, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component });
|
|
277
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "
|
|
291
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: StoryModalContainerComponent, isStandalone: true, selector: "story-modal-container-component", inputs: { component: "component", data: "data", modalConfig: "modalConfig", template: "template" }, ngImport: i0, template: `
|
|
278
292
|
<div class="cdk-overlay-container">
|
|
279
293
|
<div
|
|
280
294
|
class="cdk-overlay-backdrop cdk-overlay-dark-backdrop cdk-overlay-backdrop-showing"
|
|
@@ -287,31 +301,29 @@ class StoryModalContainerComponent {
|
|
|
287
301
|
>
|
|
288
302
|
<div
|
|
289
303
|
class="seam-modal-container modal-dialog modal-dialog-centered {{
|
|
290
|
-
|
|
291
|
-
? 'modal-' + modalConfig?.modalSize
|
|
292
|
-
: 'modal-lg'
|
|
304
|
+
_modalSizeClass()
|
|
293
305
|
}}"
|
|
294
306
|
tabindex="-1"
|
|
295
|
-
[class.modal-lg]="!modalConfig"
|
|
296
307
|
>
|
|
297
308
|
<div class="modal-content">
|
|
298
|
-
|
|
309
|
+
@if (_component(); as c) {
|
|
299
310
|
<ng-container
|
|
300
|
-
*ngComponentOutlet="
|
|
301
|
-
outletData.component;
|
|
302
|
-
injector: outletData.injector
|
|
303
|
-
"
|
|
311
|
+
*ngComponentOutlet="c; injector: _componentInjector()"
|
|
304
312
|
></ng-container>
|
|
305
|
-
|
|
313
|
+
} @else if (template) {
|
|
314
|
+
<ng-container *ngTemplateOutlet="template"></ng-container>
|
|
315
|
+
} @else {
|
|
316
|
+
<ng-content></ng-content>
|
|
317
|
+
}
|
|
306
318
|
</div>
|
|
307
319
|
</div>
|
|
308
320
|
</div>
|
|
309
321
|
</div>
|
|
310
|
-
`, isInline: true, styles: [".seam-modal-container[tabindex=\"-1\"]:focus{outline:0!important}\n"], dependencies: [{ kind: "directive", type: i1$1.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"], exportAs: ["ngComponentOutlet"] }, { kind: "directive", type: i1$1.
|
|
322
|
+
`, isInline: true, styles: [".seam-modal-container[tabindex=\"-1\"]:focus{outline:0!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"], exportAs: ["ngComponentOutlet"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: TheSeamOverlayScrollbarDirective, selector: "[seamOverlayScrollbar]", inputs: ["seamOverlayScrollbar", "overlayScrollbarEnabled"], exportAs: ["seamOverlayScrollbar"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
311
323
|
}
|
|
312
324
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: StoryModalContainerComponent, decorators: [{
|
|
313
325
|
type: Component,
|
|
314
|
-
args: [{ selector: 'story-modal-container-component', template: `
|
|
326
|
+
args: [{ selector: 'story-modal-container-component', imports: [CommonModule, TheSeamOverlayScrollbarDirective], template: `
|
|
315
327
|
<div class="cdk-overlay-container">
|
|
316
328
|
<div
|
|
317
329
|
class="cdk-overlay-backdrop cdk-overlay-dark-backdrop cdk-overlay-backdrop-showing"
|
|
@@ -324,49 +336,100 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
324
336
|
>
|
|
325
337
|
<div
|
|
326
338
|
class="seam-modal-container modal-dialog modal-dialog-centered {{
|
|
327
|
-
|
|
328
|
-
? 'modal-' + modalConfig?.modalSize
|
|
329
|
-
: 'modal-lg'
|
|
339
|
+
_modalSizeClass()
|
|
330
340
|
}}"
|
|
331
341
|
tabindex="-1"
|
|
332
|
-
[class.modal-lg]="!modalConfig"
|
|
333
342
|
>
|
|
334
343
|
<div class="modal-content">
|
|
335
|
-
|
|
344
|
+
@if (_component(); as c) {
|
|
336
345
|
<ng-container
|
|
337
|
-
*ngComponentOutlet="
|
|
338
|
-
outletData.component;
|
|
339
|
-
injector: outletData.injector
|
|
340
|
-
"
|
|
346
|
+
*ngComponentOutlet="c; injector: _componentInjector()"
|
|
341
347
|
></ng-container>
|
|
342
|
-
|
|
348
|
+
} @else if (template) {
|
|
349
|
+
<ng-container *ngTemplateOutlet="template"></ng-container>
|
|
350
|
+
} @else {
|
|
351
|
+
<ng-content></ng-content>
|
|
352
|
+
}
|
|
343
353
|
</div>
|
|
344
354
|
</div>
|
|
345
355
|
</div>
|
|
346
356
|
</div>
|
|
347
|
-
`,
|
|
357
|
+
`, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".seam-modal-container[tabindex=\"-1\"]:focus{outline:0!important}\n"] }]
|
|
348
358
|
}], ctorParameters: () => [{ type: i0.Injector }], propDecorators: { component: [{
|
|
349
359
|
type: Input
|
|
350
360
|
}], data: [{
|
|
351
361
|
type: Input
|
|
352
362
|
}], modalConfig: [{
|
|
353
363
|
type: Input
|
|
364
|
+
}], template: [{
|
|
365
|
+
type: Input
|
|
354
366
|
}] } });
|
|
355
367
|
|
|
356
368
|
class StoryHelperComponentsModule {
|
|
357
369
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: StoryHelperComponentsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
358
|
-
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.15", ngImport: i0, type: StoryHelperComponentsModule, declarations: [StoryEmptyWithRouteComponent
|
|
359
|
-
|
|
370
|
+
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.15", ngImport: i0, type: StoryHelperComponentsModule, declarations: [StoryEmptyWithRouteComponent], imports: [CommonModule,
|
|
371
|
+
RouterModule,
|
|
372
|
+
TheSeamOverlayScrollbarDirective,
|
|
373
|
+
StoryModalContainerComponent], exports: [StoryEmptyWithRouteComponent, StoryModalContainerComponent] });
|
|
374
|
+
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: StoryHelperComponentsModule, imports: [CommonModule,
|
|
375
|
+
RouterModule,
|
|
376
|
+
StoryModalContainerComponent] });
|
|
360
377
|
}
|
|
361
378
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: StoryHelperComponentsModule, decorators: [{
|
|
362
379
|
type: NgModule,
|
|
363
380
|
args: [{
|
|
364
|
-
declarations: [StoryEmptyWithRouteComponent
|
|
365
|
-
imports: [
|
|
381
|
+
declarations: [StoryEmptyWithRouteComponent],
|
|
382
|
+
imports: [
|
|
383
|
+
CommonModule,
|
|
384
|
+
RouterModule,
|
|
385
|
+
TheSeamOverlayScrollbarDirective,
|
|
386
|
+
StoryModalContainerComponent,
|
|
387
|
+
],
|
|
366
388
|
exports: [StoryEmptyWithRouteComponent, StoryModalContainerComponent],
|
|
367
389
|
}]
|
|
368
390
|
}] });
|
|
369
391
|
|
|
392
|
+
/**
|
|
393
|
+
* Wraps a story's rendered component in `<story-modal-container-component>`
|
|
394
|
+
* so it previews inside a stand-in modal frame. Storybook's default template
|
|
395
|
+
* binds the story's args to the wrapped component, so inputs/outputs (e.g.
|
|
396
|
+
* for the Actions addon) work without extra wiring.
|
|
397
|
+
*
|
|
398
|
+
* Use as an entry in a story's `decorators` array:
|
|
399
|
+
*
|
|
400
|
+
* ```ts
|
|
401
|
+
* const meta: Meta<MyModalComponent> = {
|
|
402
|
+
* title: 'Modal/My',
|
|
403
|
+
* component: MyModalComponent,
|
|
404
|
+
* decorators: [storyModalDecorator({ modalConfig: { modalSize: 'lg' } })],
|
|
405
|
+
* }
|
|
406
|
+
* ```
|
|
407
|
+
*/
|
|
408
|
+
function storyModalDecorator(options) {
|
|
409
|
+
return (storyFn, storyContext) => {
|
|
410
|
+
const result = componentWrapperDecorator((story) => `
|
|
411
|
+
<story-modal-container-component [modalConfig]="_storyModalConfig">
|
|
412
|
+
${story}
|
|
413
|
+
</story-modal-container-component>
|
|
414
|
+
`)(storyFn, storyContext);
|
|
415
|
+
return {
|
|
416
|
+
...result,
|
|
417
|
+
props: {
|
|
418
|
+
...(result.props ?? {}),
|
|
419
|
+
// Prefixed to avoid colliding with a story's own args.
|
|
420
|
+
_storyModalConfig: options?.modalConfig ?? null,
|
|
421
|
+
},
|
|
422
|
+
moduleMetadata: {
|
|
423
|
+
...(result.moduleMetadata ?? {}),
|
|
424
|
+
imports: [
|
|
425
|
+
...(result.moduleMetadata?.imports ?? []),
|
|
426
|
+
StoryModalContainerComponent,
|
|
427
|
+
],
|
|
428
|
+
},
|
|
429
|
+
};
|
|
430
|
+
};
|
|
431
|
+
}
|
|
432
|
+
|
|
370
433
|
/**
|
|
371
434
|
* Can be used to access a stories component after the story has been bootstrapped.
|
|
372
435
|
*
|
|
@@ -535,5 +598,5 @@ const getInjectorFromArgs = (args, argName = INJECTOR_TO_ARGS_PROPERTY_NAME) =>
|
|
|
535
598
|
* Generated bundle index. Do not edit.
|
|
536
599
|
*/
|
|
537
600
|
|
|
538
|
-
export { INJECTOR_TO_ARGS_PROPERTY_NAME, STORY_INITIAL_ROUTE_URL, StoryEmptyComponent, StoryEmptyWithRouteComponent, StoryHelperComponentsModule, StoryInitialRouteModule, StoryInitialRouteService, StoryModalContainerComponent, StoryPreferencesAccessorService, addInjectorGetterToArgs, argsToTpl, buttonTypeArgType, getInjectorFromArgs, onStoryBootstrappedTrigger, routeButton, routesArgType, sizeArgType, storyInitialRouteFactory, themeArgType, themeWithOutlineArgType };
|
|
601
|
+
export { INJECTOR_TO_ARGS_PROPERTY_NAME, STORY_INITIAL_ROUTE_URL, StoryEmptyComponent, StoryEmptyWithRouteComponent, StoryHelperComponentsModule, StoryInitialRouteModule, StoryInitialRouteService, StoryModalContainerComponent, StoryPreferencesAccessorService, addInjectorGetterToArgs, argsToTpl, buttonTypeArgType, getInjectorFromArgs, onStoryBootstrappedTrigger, routeButton, routesArgType, sizeArgType, storyInitialRouteFactory, storyModalDecorator, themeArgType, themeWithOutlineArgType };
|
|
539
602
|
//# sourceMappingURL=theseam-ui-common-story-helpers.mjs.map
|