@masterteam/components 0.0.129 → 0.0.131
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/masterteam-components-tooltip.mjs.map +1 -1
- package/package.json +1 -1
- package/fesm2022/masterteam-components-business-fields.mjs +0 -597
- package/fesm2022/masterteam-components-business-fields.mjs.map +0 -1
- package/fesm2022/masterteam-components-button-group.mjs +0 -20
- package/fesm2022/masterteam-components-button-group.mjs.map +0 -1
- package/fesm2022/masterteam-components-chip.mjs +0 -35
- package/fesm2022/masterteam-components-chip.mjs.map +0 -1
- package/fesm2022/masterteam-components-client-page-menu.mjs +0 -92
- package/fesm2022/masterteam-components-client-page-menu.mjs.map +0 -1
- package/fesm2022/masterteam-components-client-page.mjs +0 -160
- package/fesm2022/masterteam-components-client-page.mjs.map +0 -1
- package/fesm2022/masterteam-components-color-picker-field.mjs +0 -94
- package/fesm2022/masterteam-components-color-picker-field.mjs.map +0 -1
- package/fesm2022/masterteam-components-date-field.mjs +0 -93
- package/fesm2022/masterteam-components-date-field.mjs.map +0 -1
- package/fesm2022/masterteam-components-drawer.mjs +0 -69
- package/fesm2022/masterteam-components-drawer.mjs.map +0 -1
- package/fesm2022/masterteam-components-editor-field.mjs +0 -96
- package/fesm2022/masterteam-components-editor-field.mjs.map +0 -1
- package/fesm2022/masterteam-components-entities.mjs +0 -864
- package/fesm2022/masterteam-components-entities.mjs.map +0 -1
- package/fesm2022/masterteam-components-formula.mjs +0 -3116
- package/fesm2022/masterteam-components-formula.mjs.map +0 -1
- package/fesm2022/masterteam-components-list.mjs +0 -31
- package/fesm2022/masterteam-components-list.mjs.map +0 -1
- package/fesm2022/masterteam-components-progress.mjs +0 -49
- package/fesm2022/masterteam-components-progress.mjs.map +0 -1
- package/fesm2022/masterteam-components-table.mjs +0 -1153
- package/fesm2022/masterteam-components-table.mjs.map +0 -1
- package/fesm2022/masterteam-components-upload-field.mjs +0 -554
- package/fesm2022/masterteam-components-upload-field.mjs.map +0 -1
- package/fesm2022/masterteam-components-user-search-field.mjs +0 -153
- package/fesm2022/masterteam-components-user-search-field.mjs.map +0 -1
- package/types/masterteam-components-business-fields.d.ts +0 -213
- package/types/masterteam-components-button-group.d.ts +0 -8
- package/types/masterteam-components-chip.d.ts +0 -19
- package/types/masterteam-components-client-page-menu.d.ts +0 -35
- package/types/masterteam-components-client-page.d.ts +0 -56
- package/types/masterteam-components-color-picker-field.d.ts +0 -35
- package/types/masterteam-components-date-field.d.ts +0 -41
- package/types/masterteam-components-drawer.d.ts +0 -30
- package/types/masterteam-components-editor-field.d.ts +0 -34
- package/types/masterteam-components-entities.d.ts +0 -367
- package/types/masterteam-components-formula.d.ts +0 -654
- package/types/masterteam-components-list.d.ts +0 -18
- package/types/masterteam-components-progress.d.ts +0 -22
- package/types/masterteam-components-table.d.ts +0 -255
- package/types/masterteam-components-upload-field.d.ts +0 -77
- package/types/masterteam-components-user-search-field.d.ts +0 -61
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"masterteam-components-upload-field.mjs","sources":["../../../../packages/masterteam/components/upload-field/secure-image.pipe.ts","../../../../packages/masterteam/components/upload-field/upload-file-preview/upload-file-preview.ts","../../../../packages/masterteam/components/upload-field/upload-file-preview/upload-file-preview.html","../../../../packages/masterteam/components/upload-field/upload-user-preview/upload-user-preview.ts","../../../../packages/masterteam/components/upload-field/upload-user-preview/upload-user-preview.html","../../../../packages/masterteam/components/upload-field/upload-field.ts","../../../../packages/masterteam/components/upload-field/upload-field.html","../../../../packages/masterteam/components/upload-field/masterteam-components-upload-field.ts"],"sourcesContent":["import {\r\n filter,\r\n switchMap,\r\n map,\r\n catchError,\r\n tap,\r\n distinctUntilChanged,\r\n finalize,\r\n shareReplay,\r\n} from 'rxjs/operators';\r\nimport { DomSanitizer, SafeUrl } from '@angular/platform-browser';\r\nimport { Subscription, BehaviorSubject, Observable, of } from 'rxjs';\r\nimport {\r\n Pipe,\r\n PipeTransform,\r\n OnDestroy,\r\n ChangeDetectorRef,\r\n inject,\r\n} from '@angular/core';\r\nimport { HttpClient, HttpContext, HttpResponse } from '@angular/common/http';\r\n\r\ntype SecureImageTransformRequest = {\r\n fullPath: string;\r\n cacheKey: string;\r\n context?: HttpContext;\r\n wrapUrl: boolean;\r\n useEndpoint: boolean;\r\n sanitize: boolean;\r\n};\r\n\r\n@Pipe({\r\n name: 'secureImage',\r\n pure: false,\r\n standalone: true,\r\n})\r\nexport class SecureImagePipe implements PipeTransform, OnDestroy {\r\n private static readonly cachedBlobUrls = new Map<string, string>();\r\n private static readonly pendingRequests = new Map<\r\n string,\r\n Observable<string>\r\n >();\r\n\r\n httpClient = inject(HttpClient);\r\n domSanitizer = inject(DomSanitizer);\r\n cdr = inject(ChangeDetectorRef);\r\n constructor() {\r\n this.setUpSubscription();\r\n }\r\n ngOnDestroy(): void {\r\n this.subscription.unsubscribe();\r\n }\r\n private subscription = new Subscription();\r\n private latestValue: string | SafeUrl = '';\r\n private transformValue =\r\n new BehaviorSubject<SecureImageTransformRequest | null>(null);\r\n private loading = false;\r\n\r\n transform(\r\n imagePath: string,\r\n wrapUrlOrContext?: boolean | HttpContext,\r\n contextOrEndpoint?: HttpContext | string,\r\n endPoint: string = 'uploader/',\r\n ): string | SafeUrl {\r\n const hasExtraArgs = arguments.length > 1;\r\n const isWrapFlag = typeof wrapUrlOrContext === 'boolean';\r\n\r\n let context: HttpContext | undefined;\r\n let wrapUrl = true;\r\n let useEndpoint = false;\r\n let endpoint = '';\r\n let sanitize = true;\r\n\r\n if (!hasExtraArgs || isWrapFlag) {\r\n // Backward compatible mode: (imagePath, wrapUrl?, context?, endPoint?)\r\n wrapUrl = isWrapFlag ? wrapUrlOrContext : false;\r\n useEndpoint = true;\r\n endpoint = endPoint;\r\n if (contextOrEndpoint instanceof HttpContext) {\r\n context = contextOrEndpoint;\r\n } else if (typeof contextOrEndpoint === 'string') {\r\n endpoint = contextOrEndpoint;\r\n }\r\n sanitize = false;\r\n } else {\r\n // Components mode: (imagePath, context)\r\n context = wrapUrlOrContext as HttpContext | undefined;\r\n wrapUrl = true;\r\n useEndpoint = false;\r\n endpoint = '';\r\n sanitize = true;\r\n }\r\n\r\n const fullPath = useEndpoint\r\n ? imagePath\r\n ? endpoint + imagePath\r\n : ''\r\n : imagePath;\r\n if (!fullPath || fullPath.includes('null')) {\r\n this.latestValue = '';\r\n this.loading = false;\r\n this.transformValue.next(null);\r\n return '';\r\n }\r\n\r\n this.transformValue.next({\r\n fullPath,\r\n cacheKey: SecureImagePipe.createCacheKey(fullPath, context),\r\n context,\r\n wrapUrl,\r\n useEndpoint,\r\n sanitize,\r\n });\r\n\r\n if (this.loading || !this.latestValue) {\r\n return '';\r\n }\r\n\r\n if (!useEndpoint || wrapUrl) {\r\n return this.latestValue;\r\n }\r\n\r\n return `url('${this.latestValue}')`;\r\n }\r\n\r\n private static createCacheKey(\r\n fullPath: string,\r\n context?: HttpContext,\r\n ): string {\r\n if (!context) {\r\n return `default:${fullPath}`;\r\n }\r\n\r\n const contextSnapshot = Array.from(context.keys())\r\n .map((token) => SecureImagePipe.serializeContextValue(context.get(token)))\r\n .sort()\r\n .join('|');\r\n\r\n return `${contextSnapshot}:${fullPath}`;\r\n }\r\n\r\n private static serializeContextValue(value: unknown): string {\r\n if (value === null) {\r\n return 'null';\r\n }\r\n\r\n if (value === undefined) {\r\n return 'undefined';\r\n }\r\n\r\n if (typeof value !== 'object') {\r\n return String(value);\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n return `[${value\r\n .map((item) => SecureImagePipe.serializeContextValue(item))\r\n .join(',')}]`;\r\n }\r\n\r\n const normalizedEntries = Object.entries(value as Record<string, unknown>)\r\n .sort(([leftKey], [rightKey]) => leftKey.localeCompare(rightKey))\r\n .map(\r\n ([key, entryValue]) =>\r\n `${key}:${SecureImagePipe.serializeContextValue(entryValue)}`,\r\n );\r\n\r\n return `{${normalizedEntries.join(',')}}`;\r\n }\r\n\r\n private getOrLoadBlobUrl(\r\n request: SecureImageTransformRequest,\r\n ): Observable<string> {\r\n const cachedBlobUrl = SecureImagePipe.cachedBlobUrls.get(request.cacheKey);\r\n if (cachedBlobUrl) {\r\n return of(cachedBlobUrl);\r\n }\r\n\r\n const pendingRequest = SecureImagePipe.pendingRequests.get(\r\n request.cacheKey,\r\n );\r\n if (pendingRequest) {\r\n return pendingRequest;\r\n }\r\n\r\n const request$ = this.httpClient\r\n .get(request.fullPath, {\r\n observe: 'response',\r\n responseType: 'blob',\r\n context: request.context,\r\n })\r\n .pipe(\r\n map((response: HttpResponse<Blob>) =>\r\n response.body ? URL.createObjectURL(response.body) : '',\r\n ),\r\n tap((blobUrl: string) => {\r\n if (blobUrl) {\r\n SecureImagePipe.cachedBlobUrls.set(request.cacheKey, blobUrl);\r\n }\r\n }),\r\n finalize(() => {\r\n SecureImagePipe.pendingRequests.delete(request.cacheKey);\r\n }),\r\n shareReplay(1),\r\n );\r\n\r\n SecureImagePipe.pendingRequests.set(request.cacheKey, request$);\r\n\r\n return request$;\r\n }\r\n\r\n private setUpSubscription(): void {\r\n const transformSubscription = this.transformValue\r\n .asObservable()\r\n .pipe(\r\n distinctUntilChanged((previous, current) => {\r\n if (previous === current) {\r\n return true;\r\n }\r\n\r\n if (!previous || !current) {\r\n return previous === current;\r\n }\r\n\r\n return (\r\n previous.cacheKey === current.cacheKey &&\r\n previous.wrapUrl === current.wrapUrl &&\r\n previous.useEndpoint === current.useEndpoint &&\r\n previous.sanitize === current.sanitize\r\n );\r\n }),\r\n switchMap((request: SecureImageTransformRequest | null) => {\r\n if (!request) {\r\n this.loading = false;\r\n return of('');\r\n }\r\n\r\n this.latestValue = '';\r\n this.loading = true;\r\n return this.getOrLoadBlobUrl(request).pipe(\r\n filter((blobUrl) => !!blobUrl),\r\n map((unsafeBlobUrl: string) =>\r\n request.sanitize\r\n ? this.domSanitizer.bypassSecurityTrustUrl(unsafeBlobUrl)\r\n : unsafeBlobUrl,\r\n ),\r\n catchError(() => of('')),\r\n finalize(() => (this.loading = false)),\r\n );\r\n }),\r\n tap((imagePath: string | SafeUrl) => {\r\n this.latestValue = imagePath;\r\n this.cdr.markForCheck();\r\n }),\r\n )\r\n .subscribe();\r\n this.subscription.add(transformSubscription);\r\n }\r\n}\r\n","import {\r\n Component,\r\n computed,\r\n input,\r\n model,\r\n OnInit,\r\n output,\r\n} from '@angular/core';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { SecureImagePipe } from '../secure-image.pipe';\r\nimport { Avatar } from '@masterteam/components/avatar';\r\nimport { HttpContext } from '@angular/common/http';\r\nimport { TranslocoModule } from '@jsverse/transloco';\r\nimport { Tooltip } from '@masterteam/components/tooltip';\r\n\r\n@Component({\r\n selector: 'mt-upload-file-preview',\r\n standalone: true,\r\n imports: [SecureImagePipe, Button, Avatar, TranslocoModule, Tooltip],\r\n templateUrl: './upload-file-preview.html',\r\n styleUrl: './upload-file-preview.scss',\r\n})\r\nexport class UploadFilePreview implements OnInit {\r\n value = input<any | null>(null);\r\n imgPath = input<any | undefined>();\r\n readonly context = input<HttpContext | undefined>(undefined);\r\n loading = input<boolean>(false);\r\n uploadProgress = input<number>(0);\r\n onUploadInputClicked = output<any>();\r\n ondDownloadFile = output<any>();\r\n onDeleteFile = output<any>();\r\n readonly disabled = model<boolean>(false);\r\n readonly readonly = input<boolean>(false);\r\n readonly size = input<'normal' | 'large' | 'xlarge' | undefined>();\r\n isImag = computed(() => {\r\n return this.value()?.contentType?.startsWith('image/');\r\n });\r\n ngOnInit(): void {\r\n if (this.readonly()) {\r\n this.disabled.set(true);\r\n }\r\n }\r\n defaultIcon = computed(() => {\r\n switch (this.value()?.extension) {\r\n case '.pdf':\r\n return 'file.file-06';\r\n case '.docx':\r\n case '.doc':\r\n return 'file.file-06';\r\n case '.xlsx':\r\n case '.xls':\r\n return 'file.file-06';\r\n default:\r\n return 'image.image-03';\r\n }\r\n });\r\n}\r\n","<div class=\"flex items-center justify-between gap-2 w-full p-2 overflow-hidden\">\r\n <div class=\"flex gap-2 items-center flex-1 min-w-0 overflow-hidden\">\r\n <mt-avatar\r\n [size]=\"size()\"\r\n [shape]=\"'square'\"\r\n [image]=\"\r\n isImag() && imgPath() ? (imgPath() | secureImage: context()) : ''\r\n \"\r\n [icon]=\"defaultIcon()\"\r\n styleClass=\"text-2xl!\"\r\n >\r\n </mt-avatar>\r\n\r\n <span class=\"truncate\" [mtTooltip]=\"value().name\" tooltipPosition=\"top\">\r\n {{ value().name }}\r\n </span>\r\n </div>\r\n <div class=\"flex items-center justify-center shrink-0\">\r\n @if (!!value() && !loading() && (!disabled() || readonly())) {\r\n <mt-button\r\n variant=\"text\"\r\n icon=\"general.download-01\"\r\n [tooltip]=\"'components.upload.download' | transloco\"\r\n (onClick)=\"ondDownloadFile.emit(value())\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n </mt-button>\r\n }\r\n @if (!disabled() && !readonly() && !!value() && !loading()) {\r\n <mt-button\r\n variant=\"text\"\r\n icon=\"general.trash-01\"\r\n [tooltip]=\"'components.upload.delete' | transloco\"\r\n severity=\"danger\"\r\n (onClick)=\"onDeleteFile.emit(true)\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n </mt-button>\r\n }\r\n </div>\r\n</div>\r\n","import { SecureImagePipe } from '../secure-image.pipe';\r\nimport { Icon } from '@masterteam/icons';\r\nimport { Component, input, model, OnInit, output, signal } from '@angular/core';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { Avatar } from '@masterteam/components/avatar';\r\nimport { HttpContext } from '@angular/common/http';\r\nimport { TranslocoModule } from '@jsverse/transloco';\r\n\r\n@Component({\r\n selector: 'mt-upload-user-preview',\r\n standalone: true,\r\n imports: [Icon, SecureImagePipe, Button, Icon, Avatar, TranslocoModule],\r\n templateUrl: './upload-user-preview.html',\r\n styleUrl: './upload-user-preview.css',\r\n})\r\nexport class UploadUserPreview implements OnInit {\r\n value = input<any | null>(null);\r\n imgPath = input<any | undefined>();\r\n readonly context = input<HttpContext | undefined>(undefined);\r\n loading = input<boolean>(false);\r\n uploadProgress = input<number>(0);\r\n isDragging = input<boolean>(false);\r\n defaultIcon = signal<string>('image.image-03');\r\n onUploadInputClicked = output<any>();\r\n ondDownloadFile = output<any>();\r\n onDeleteFile = output<any>();\r\n onDragOver = output<any>();\r\n onDragLeave = output<any>();\r\n onDrop = output<any>();\r\n readonly disabled = model<boolean>(false);\r\n readonly readonly = input<boolean>(false);\r\n readonly size = input<'normal' | 'large' | 'xlarge' | undefined>();\r\n readonly userImgClass = input<string>('');\r\n OnUploadInputClicked(): void {\r\n if (!this.imgPath() && !this.loading() && !this.disabled()) {\r\n this.onUploadInputClicked.emit(true);\r\n }\r\n }\r\n ngOnInit(): void {\r\n if (this.readonly()) {\r\n this.disabled.set(true);\r\n }\r\n }\r\n OnDragOver(event: DragEvent): void {\r\n this.onDragOver.emit(event);\r\n }\r\n OnDragLeave(event: DragEvent): void {\r\n this.onDragLeave.emit(event);\r\n }\r\n\r\n OnDrop(event: DragEvent): void {\r\n this.onDrop.emit(event);\r\n }\r\n}\r\n","<div\r\n class=\"rounded-full p-1 w-fit\"\r\n [style.background]=\"\r\n 'conic-gradient(var(--p-primary-300) ' +\r\n uploadProgress() +\r\n '%, transparent ' +\r\n uploadProgress() +\r\n '%)'\r\n \"\r\n>\r\n <div\r\n class=\"relative rounded-full w-fit border-2 border-dashed border-gray-300 bg-white\"\r\n [class.opacity-50]=\"isDragging()\"\r\n >\r\n <mt-avatar\r\n [size]=\"size()\"\r\n [image]=\"imgPath() ? (imgPath() | secureImage: context()) : ''\"\r\n [icon]=\"defaultIcon()\"\r\n [styleClass]=\"userImgClass()\"\r\n >\r\n </mt-avatar>\r\n\r\n @if (!loading()) {\r\n <div\r\n class=\"absolute inset-0 flex items-center justify-center rounded-full bg-surface-400/50 opacity-0 hover:opacity-100 transition-opacity\"\r\n [class]=\"!imgPath() && !disabled() ? 'cursor-pointer' : ''\"\r\n (click)=\"OnUploadInputClicked()\"\r\n (dragover)=\"OnDragOver($event)\"\r\n (dragleave)=\"OnDragLeave($event)\"\r\n (drop)=\"OnDrop($event)\"\r\n >\r\n @if (!disabled() && !!imgPath()) {\r\n <mt-button\r\n variant=\"text\"\r\n icon=\"general.download-01\"\r\n [tooltip]=\"'components.upload.download' | transloco\"\r\n (onClick)=\"ondDownloadFile.emit(value())\"\r\n >\r\n </mt-button>\r\n <mt-button\r\n variant=\"text\"\r\n icon=\"general.trash-01\"\r\n [tooltip]=\"'components.upload.delete' | transloco\"\r\n severity=\"danger\"\r\n (onClick)=\"onDeleteFile.emit(true)\"\r\n >\r\n </mt-button>\r\n }\r\n @if (!imgPath() && !disabled()) {\r\n <mt-icon\r\n icon=\"general.upload-01\"\r\n class=\"text-primary-400 text-xl\"\r\n ></mt-icon>\r\n }\r\n </div>\r\n } @else if (loading()) {\r\n <div\r\n class=\"absolute inset-0 flex items-center justify-center rounded-full bg-surface-400/50\"\r\n >\r\n @if (uploadProgress() === 100) {\r\n <mt-icon\r\n icon=\"general.check\"\r\n class=\"text-primary-400 text-2xl\"\r\n ></mt-icon>\r\n } @else {\r\n <small class=\"text-primary-300 font-bold text-lg\">{{\r\n uploadProgress() + \"%\"\r\n }}</small>\r\n }\r\n </div>\r\n }\r\n </div>\r\n</div>\r\n","import { UploadFilePreview } from './upload-file-preview/upload-file-preview';\r\nimport { UploadUserPreview } from './upload-user-preview/upload-user-preview';\r\nimport {\r\n Component,\r\n computed,\r\n inject,\r\n input,\r\n model,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NgControl, Validators } from '@angular/forms';\r\nimport { HttpClient, HttpContext } from '@angular/common/http';\r\nimport { Icon } from '@masterteam/icons';\r\nimport {\r\n catchError,\r\n finalize,\r\n forkJoin,\r\n map,\r\n of,\r\n take,\r\n throwError,\r\n} from 'rxjs';\r\nimport { FieldValidation } from '@masterteam/components/field-validation';\r\nimport { Card } from '@masterteam/components/card';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { TranslocoModule } from '@jsverse/transloco';\r\n\r\ninterface FileMetadata {\r\n id: string;\r\n name: string;\r\n contentType: string;\r\n extension: string;\r\n fileName: string;\r\n size?: number;\r\n}\r\n\r\ninterface MetadataResponse {\r\n data: FileMetadata;\r\n}\r\n\r\n@Component({\r\n selector: 'mt-upload-field',\r\n standalone: true,\r\n imports: [\r\n Icon,\r\n UploadUserPreview,\r\n UploadFilePreview,\r\n FieldValidation,\r\n Card,\r\n Button,\r\n TranslocoModule,\r\n ],\r\n templateUrl: './upload-field.html',\r\n})\r\nexport class UploadField implements ControlValueAccessor {\r\n readonly label = input<string>();\r\n readonly title = input<string>('Upload File');\r\n readonly description = input<string>('Click or drop a file to upload');\r\n readonly endPoint = input<string>('uploader');\r\n readonly size = input<'normal' | 'large' | 'xlarge' | undefined>();\r\n readonly userImgClass = input<string | undefined>(\r\n 'w-25! h-25! text-4xl! text-gray-400!',\r\n );\r\n readonly shape = input<'circle' | 'field' | 'card'>('field');\r\n readonly multiple = input<boolean>(false);\r\n readonly accept = input<string | undefined>('.pdf,.doc,.docx,.xlsx,image/*');\r\n readonly isDragging = model<boolean>(false);\r\n readonly fileSizeLimit = input<number | undefined>();\r\n readonly = input<boolean>(false);\r\n readonly context = input<HttpContext | undefined>(undefined);\r\n\r\n readonly onChange = output<any>();\r\n readonly requiredValidator = Validators.required;\r\n readonly value = signal<any | any[] | null>(null);\r\n readonly files = computed<any[]>(() => {\r\n const value = this.value();\r\n if (Array.isArray(value)) {\r\n return value.filter((item) => item != null);\r\n }\r\n\r\n return value ? [value] : [];\r\n });\r\n readonly primaryFile = computed(() => this.files()[0] ?? null);\r\n readonly imgPath = computed(() => this.resolveImgPath(this.primaryFile()));\r\n readonly disabled = signal<boolean>(false);\r\n readonly uploadProgress = signal<number>(0);\r\n readonly loading = signal<boolean>(false);\r\n\r\n private readonly httpClient = inject(HttpClient);\r\n private readonly pendingUploads = signal(0);\r\n\r\n onTouched: () => void = () => {};\r\n onModelChange: (value: any) => void = () => {};\r\n readonly ngControl = inject(NgControl, { self: true });\r\n\r\n constructor() {\r\n if (this.ngControl) {\r\n this.ngControl.valueAccessor = this;\r\n }\r\n }\r\n\r\n writeValue(value: any): void {\r\n if (Array.isArray(value)) {\r\n const normalized = value.filter((item) => item != null);\r\n const fileIds = normalized.filter(\r\n (item): item is string =>\r\n typeof item === 'string' && item.trim().length > 0,\r\n );\r\n const files = normalized.filter(\r\n (item) => !!item && typeof item === 'object',\r\n );\r\n\r\n if (fileIds.length) {\r\n this.fetchMetadata(fileIds, files, true);\r\n return;\r\n }\r\n\r\n this.value.set(normalized);\r\n return;\r\n }\r\n\r\n if (typeof value === 'string' && value.trim().length > 0) {\r\n this.fetchMetadata([value], [], false);\r\n return;\r\n }\r\n\r\n this.value.set(value ?? null);\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.onModelChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(disabled: boolean): void {\r\n this.disabled.set(disabled);\r\n }\r\n\r\n onAdd(item: any): void {\r\n if (this.disabled()) {\r\n return;\r\n }\r\n\r\n const nextValue = this.multiple() ? [...this.files(), item] : item;\r\n this.value.set(nextValue);\r\n this.onModelChange(nextValue);\r\n this.onChange.emit(nextValue);\r\n }\r\n\r\n onDelete(item?: any): void {\r\n if (this.disabled()) {\r\n return;\r\n }\r\n\r\n if (!this.multiple()) {\r\n this.value.set(null);\r\n this.onModelChange(null);\r\n this.onChange.emit(null);\r\n return;\r\n }\r\n\r\n const nextValue = this.files().filter((file) => !isSameFile(file, item));\r\n const resolvedValue = nextValue.length ? nextValue : null;\r\n\r\n this.value.set(resolvedValue);\r\n this.onModelChange(resolvedValue);\r\n this.onChange.emit(resolvedValue);\r\n }\r\n\r\n onFileSelect(event: Event): void {\r\n const input = event.target as HTMLInputElement | null;\r\n const selectedFiles = Array.from(input?.files ?? []);\r\n\r\n if (!selectedFiles.length) {\r\n return;\r\n }\r\n\r\n if (!this.multiple()) {\r\n this.value.set(null);\r\n }\r\n\r\n this.prepareFiles(selectedFiles);\r\n\r\n if (input) {\r\n input.value = '';\r\n }\r\n }\r\n\r\n prepareFiles(files: File[]): void {\r\n this.ngControl.control?.setErrors({ uploading: true });\r\n\r\n if (\r\n this.shape() === 'circle' &&\r\n files.some((file) => !file?.type.startsWith('image/'))\r\n ) {\r\n this.ngControl.control?.setErrors({ invalidFileType: true });\r\n return;\r\n }\r\n\r\n const filesToUpload = this.multiple() ? files : [files[0]];\r\n filesToUpload.forEach((file) => this.uploadFile(file));\r\n }\r\n\r\n uploadFile(file: File): void {\r\n this.pendingUploads.update((count) => count + 1);\r\n this.loading.set(true);\r\n this.uploadProgress.set(10);\r\n\r\n const formData = new FormData();\r\n formData.append('file', file);\r\n\r\n this.httpClient\r\n .post<any>(this.endPoint(), formData, {\r\n reportProgress: true,\r\n observe: 'events',\r\n context: this.context(),\r\n })\r\n .pipe(\r\n finalize(() => {\r\n const pending = Math.max(this.pendingUploads() - 1, 0);\r\n this.pendingUploads.set(pending);\r\n\r\n if (!pending) {\r\n setTimeout(() => {\r\n this.uploadProgress.set(0);\r\n this.loading.set(false);\r\n }, 700);\r\n }\r\n }),\r\n catchError(() => {\r\n this.uploadProgress.set(0);\r\n return throwError(() => new Error('Upload failed'));\r\n }),\r\n )\r\n .subscribe((event: any) => {\r\n if (!event?.body) {\r\n if (event.total) {\r\n this.uploadProgress.set(\r\n Math.round((100 * event.loaded) / event.total),\r\n );\r\n }\r\n return;\r\n }\r\n\r\n this.uploadProgress.set(100);\r\n this.handleUploadDone({ ...event.body?.data, size: file.size });\r\n });\r\n }\r\n\r\n handleUploadDone(file: any): void {\r\n if (!file) {\r\n return;\r\n }\r\n\r\n this.onAdd(file);\r\n\r\n if (this.fileSizeLimit() && file.size > this.fileSizeLimit()!) {\r\n this.ngControl.control?.setErrors({ fileSizeLimited: true });\r\n return;\r\n }\r\n\r\n if (this.pendingUploads() <= 1) {\r\n this.ngControl.control?.setErrors(null);\r\n }\r\n }\r\n\r\n downloadFile(value: any): void {\r\n const downloadUrl = this.resolveImgPath(value);\r\n const downloadFileName = value?.name;\r\n const mimeType = value?.contentType;\r\n\r\n if (!downloadUrl || !mimeType || !downloadFileName) {\r\n console.error('File metadata is incomplete. Cannot download.');\r\n return;\r\n }\r\n\r\n this.httpClient\r\n .get(downloadUrl, {\r\n responseType: 'blob',\r\n context: this.context(),\r\n })\r\n .pipe(take(1))\r\n .subscribe((res: Blob) => {\r\n const blob = new Blob([res], { type: mimeType });\r\n const data = window.URL.createObjectURL(blob);\r\n const link = document.createElement('a');\r\n\r\n link.href = data;\r\n link.download = downloadFileName;\r\n link.click();\r\n\r\n window.URL.revokeObjectURL(data);\r\n });\r\n }\r\n\r\n onDragOver(event: DragEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n if (!this.disabled()) {\r\n this.isDragging.set(true);\r\n }\r\n }\r\n\r\n onDragLeave(event: DragEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.isDragging.set(false);\r\n }\r\n\r\n onDrop(event: DragEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.isDragging.set(false);\r\n\r\n if (this.disabled()) {\r\n return;\r\n }\r\n\r\n const files = Array.from(event.dataTransfer?.files ?? []);\r\n if (!files.length) {\r\n return;\r\n }\r\n\r\n if (!this.multiple()) {\r\n this.value.set(null);\r\n }\r\n\r\n this.prepareFiles(files);\r\n }\r\n\r\n protected resolveImgPath(value: any): string | undefined {\r\n return value?.fileName ? `${this.endPoint()}/${value.fileName}` : undefined;\r\n }\r\n\r\n private fetchMetadata(\r\n fileIds: string[],\r\n existingFiles: any[] = [],\r\n forceArray = false,\r\n ): void {\r\n const normalizedIds = fileIds\r\n .map((fileId) => fileId.trim())\r\n .filter((fileId) => fileId.length > 0);\r\n\r\n if (!normalizedIds.length) {\r\n this.value.set(forceArray ? existingFiles : (existingFiles[0] ?? null));\r\n return;\r\n }\r\n\r\n this.loading.set(true);\r\n\r\n forkJoin(\r\n normalizedIds.map((fileId) =>\r\n this.httpClient\r\n .get<MetadataResponse>(`${this.endPoint()}/${fileId}/metaData`, {\r\n context: this.context(),\r\n })\r\n .pipe(\r\n take(1),\r\n map((response) => response.data),\r\n catchError((error) => {\r\n console.error('Failed to fetch file metadata:', error);\r\n return of({\r\n id: fileId,\r\n name: fileId,\r\n fileName: fileId,\r\n contentType: '',\r\n extension: '',\r\n } as FileMetadata);\r\n }),\r\n ),\r\n ),\r\n )\r\n .pipe(finalize(() => this.loading.set(false)))\r\n .subscribe((files) => {\r\n const resolvedFiles = [...existingFiles, ...files];\r\n const resolvedValue =\r\n forceArray || this.multiple() || resolvedFiles.length > 1\r\n ? resolvedFiles\r\n : (resolvedFiles[0] ?? null);\r\n\r\n this.value.set(resolvedValue);\r\n });\r\n }\r\n}\r\n\r\nfunction isSameFile(source: any, target: any): boolean {\r\n if (!source || !target) {\r\n return source === target;\r\n }\r\n\r\n return (\r\n source === target ||\r\n (source.id && target.id && source.id === target.id) ||\r\n (source.fileName && target.fileName && source.fileName === target.fileName)\r\n );\r\n}\r\n","<input\r\n #uploadInput\r\n type=\"file\"\r\n name=\"file[]\"\r\n (change)=\"onFileSelect($event)\"\r\n style=\"display: none\"\r\n [multiple]=\"multiple()\"\r\n [accept]=\"shape() === 'circle' ? 'image/*' : accept()\"\r\n/>\r\n\r\n@if (shape() === \"circle\") {\r\n <div class=\"flex flex-col items-center gap-2 w-full\">\r\n <div class=\"flex\">\r\n <div class=\"flex flex-col items-center\">\r\n <mt-upload-user-preview\r\n [value]=\"primaryFile()\"\r\n [imgPath]=\"imgPath()\"\r\n [disabled]=\"disabled()\"\r\n [readonly]=\"readonly()\"\r\n [loading]=\"loading()\"\r\n [size]=\"size()\"\r\n [context]=\"context()\"\r\n [userImgClass]=\"userImgClass()\"\r\n [isDragging]=\"isDragging()\"\r\n [uploadProgress]=\"uploadProgress()\"\r\n (onUploadInputClicked)=\"uploadInput.click()\"\r\n (ondDownloadFile)=\"downloadFile($event)\"\r\n (onDeleteFile)=\"onDelete(primaryFile())\"\r\n (onDragOver)=\"onDragOver($event)\"\r\n (onDragLeave)=\"onDragLeave($event)\"\r\n (onDrop)=\"onDrop($event)\"\r\n ></mt-upload-user-preview>\r\n @if (label()) {\r\n <label\r\n [class.required]=\"\r\n ngControl?.control?.hasValidator(requiredValidator)\r\n \"\r\n [for]=\"ngControl?.name || label()\"\r\n >{{ label() }}</label\r\n >\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n} @else if (shape() === \"card\") {\r\n <mt-card\r\n headless\r\n class=\"border-2 border-dashed border-gray-300 rounded-lg cursor-pointer hover:bg-gray-50\"\r\n >\r\n <div class=\"content flex flex-col gap-5 items-center text-center\">\r\n @if (!files().length && !loading()) {\r\n <div class=\"flex flex-col gap-1\">\r\n @if (title()) {\r\n <div class=\"title text-lg font-semibold\">\r\n {{ title() }}\r\n </div>\r\n }\r\n @if (description()) {\r\n <div\r\n class=\"description text-sm text-muted-foreground secondary text-surface-500\"\r\n >\r\n {{ description() }}\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n @if (files().length) {\r\n <div class=\"flex w-full flex-col gap-2\">\r\n @for (file of files(); track $index) {\r\n <mt-upload-file-preview\r\n style=\"width: 100%\"\r\n [value]=\"file\"\r\n [imgPath]=\"resolveImgPath(file)\"\r\n [disabled]=\"disabled()\"\r\n [readonly]=\"readonly()\"\r\n [loading]=\"loading()\"\r\n [context]=\"context()\"\r\n [uploadProgress]=\"uploadProgress()\"\r\n (onUploadInputClicked)=\"uploadInput.click()\"\r\n (ondDownloadFile)=\"downloadFile(file)\"\r\n (onDeleteFile)=\"onDelete(file)\"\r\n />\r\n }\r\n </div>\r\n } @else if (loading()) {\r\n <div class=\"w-full flex gap-3 items-center justify-center p-3\">\r\n <p class=\"text-lg text-gray-500\">\r\n {{\r\n (\"components.upload.uploading\" | transloco) +\r\n uploadProgress() +\r\n \"%\"\r\n }}\r\n </p>\r\n </div>\r\n } @else {\r\n <mt-button\r\n [size]=\"'small'\"\r\n [label]=\"'components.upload.upload' | transloco\"\r\n [icon]=\"'general.upload-01'\"\r\n (onClick)=\"\r\n !loading() && !disabled() && !readonly() ? uploadInput.click() : ''\r\n \"\r\n [disabled]=\"disabled() || loading() || readonly()\"\r\n />\r\n }\r\n </div>\r\n </mt-card>\r\n} @else {\r\n <div class=\"flex flex-col items-start gap-2 w-full\">\r\n @if (label()) {\r\n <label\r\n [class.required]=\"ngControl?.control?.hasValidator(requiredValidator)\"\r\n [for]=\"ngControl?.name || label()\"\r\n >{{ label() }}</label\r\n >\r\n }\r\n\r\n <div\r\n class=\"w-full flex gap-3 items-center justify-center border-2 border-dashed border-gray-300 rounded-lg cursor-pointer hover:bg-gray-50\"\r\n [class]=\"disabled() ? 'bg-gray-50' : ''\"\r\n (click)=\"\r\n !loading() && !disabled() && !readonly() ? uploadInput.click() : ''\r\n \"\r\n [class.border-blue-500]=\"isDragging()\"\r\n [class.bg-blue-50]=\"isDragging()\"\r\n (dragover)=\"onDragOver($event)\"\r\n (dragleave)=\"onDragLeave($event)\"\r\n (drop)=\"onDrop($event)\"\r\n >\r\n @if (files().length) {\r\n <div class=\"flex w-full flex-col gap-2 p-2\">\r\n @for (file of files(); track $index) {\r\n <mt-upload-file-preview\r\n style=\"width: 100%\"\r\n [value]=\"file\"\r\n [imgPath]=\"resolveImgPath(file)\"\r\n [disabled]=\"disabled()\"\r\n [readonly]=\"readonly()\"\r\n [loading]=\"loading()\"\r\n [context]=\"context()\"\r\n [uploadProgress]=\"uploadProgress()\"\r\n (onUploadInputClicked)=\"uploadInput.click()\"\r\n (ondDownloadFile)=\"downloadFile(file)\"\r\n (onDeleteFile)=\"onDelete(file)\"\r\n />\r\n }\r\n </div>\r\n } @else if (loading()) {\r\n <div class=\"w-full flex gap-3 items-center justify-center p-3\">\r\n <p class=\"text-lg text-gray-500\">\r\n {{\r\n (\"components.upload.uploading\" | transloco) +\r\n uploadProgress() +\r\n \"%\"\r\n }}\r\n </p>\r\n </div>\r\n } @else {\r\n <div class=\"w-full flex gap-3 items-center justify-center p-3\">\r\n <mt-icon icon=\"general.upload-01\" />\r\n <p class=\"text-lg text-gray-500\">\r\n {{ \"components.upload.clickOrDrop\" | transloco }}\r\n </p>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n}\r\n<mt-field-validation [control]=\"ngControl?.control\"></mt-field-validation>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["finalize","catchError","map"],"mappings":"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"}
|
|
@@ -1,153 +0,0 @@
|
|
|
1
|
-
import * as i0 from '@angular/core';
|
|
2
|
-
import { input, signal, viewChild, inject, effect, HostBinding, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
|
-
import * as i1 from '@angular/forms';
|
|
4
|
-
import { Validators, NgControl, FormsModule } from '@angular/forms';
|
|
5
|
-
import * as i2 from 'primeng/autocomplete';
|
|
6
|
-
import { AutoCompleteModule } from 'primeng/autocomplete';
|
|
7
|
-
import * as i4 from 'primeng/inputgroup';
|
|
8
|
-
import { InputGroupModule } from 'primeng/inputgroup';
|
|
9
|
-
import * as i5 from 'primeng/inputgroupaddon';
|
|
10
|
-
import { InputGroupAddonModule } from 'primeng/inputgroupaddon';
|
|
11
|
-
import { Tooltip } from '@masterteam/components/tooltip';
|
|
12
|
-
import { FieldValidation } from '@masterteam/components/field-validation';
|
|
13
|
-
import { isInvalid } from '@masterteam/components';
|
|
14
|
-
import { Icon } from '@masterteam/icons';
|
|
15
|
-
import { Subject, distinctUntilChanged, tap, switchMap, of, finalize, catchError } from 'rxjs';
|
|
16
|
-
import { HttpClient, HttpParams } from '@angular/common/http';
|
|
17
|
-
import { Avatar } from '@masterteam/components/avatar';
|
|
18
|
-
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
19
|
-
import * as i3 from 'primeng/api';
|
|
20
|
-
|
|
21
|
-
class UserSearchField {
|
|
22
|
-
hint = input(...(ngDevMode ? [undefined, { debugName: "hint" }] : []));
|
|
23
|
-
label = input(...(ngDevMode ? [undefined, { debugName: "label" }] : []));
|
|
24
|
-
placeholder = input(...(ngDevMode ? [undefined, { debugName: "placeholder" }] : []));
|
|
25
|
-
class = input('', ...(ngDevMode ? [{ debugName: "class" }] : []));
|
|
26
|
-
readonly = input(false, ...(ngDevMode ? [{ debugName: "readonly" }] : []));
|
|
27
|
-
required = input(false, ...(ngDevMode ? [{ debugName: "required" }] : []));
|
|
28
|
-
apiUrl = input.required(...(ngDevMode ? [{ debugName: "apiUrl" }] : []));
|
|
29
|
-
dataKey = input('data', ...(ngDevMode ? [{ debugName: "dataKey" }] : []));
|
|
30
|
-
paramName = input('query', ...(ngDevMode ? [{ debugName: "paramName" }] : []));
|
|
31
|
-
context = input(undefined, ...(ngDevMode ? [{ debugName: "context" }] : []));
|
|
32
|
-
styleClass;
|
|
33
|
-
requiredValidator = Validators.required;
|
|
34
|
-
value = signal(null, ...(ngDevMode ? [{ debugName: "value" }] : []));
|
|
35
|
-
disabled = signal(false, ...(ngDevMode ? [{ debugName: "disabled" }] : []));
|
|
36
|
-
loading = signal(false, ...(ngDevMode ? [{ debugName: "loading" }] : []));
|
|
37
|
-
size = input(...(ngDevMode ? [undefined, { debugName: "size" }] : []));
|
|
38
|
-
filteredUsers = signal([], ...(ngDevMode ? [{ debugName: "filteredUsers" }] : []));
|
|
39
|
-
searchTerms = new Subject();
|
|
40
|
-
autocomplete = viewChild('autocomplete', ...(ngDevMode ? [{ debugName: "autocomplete" }] : []));
|
|
41
|
-
onTouched = () => { };
|
|
42
|
-
onModelChange = () => { };
|
|
43
|
-
ngControl = null;
|
|
44
|
-
http = inject(HttpClient);
|
|
45
|
-
isInvalid = isInvalid;
|
|
46
|
-
constructor() {
|
|
47
|
-
this.ngControl = inject(NgControl, { self: true, optional: true });
|
|
48
|
-
if (this.ngControl) {
|
|
49
|
-
this.ngControl.valueAccessor = this;
|
|
50
|
-
}
|
|
51
|
-
effect(() => {
|
|
52
|
-
if (this.ngControl?.control && this.required()) {
|
|
53
|
-
this.ngControl.control.addValidators(Validators.required);
|
|
54
|
-
this.ngControl.control.updateValueAndValidity();
|
|
55
|
-
}
|
|
56
|
-
});
|
|
57
|
-
this.getUsers();
|
|
58
|
-
}
|
|
59
|
-
ngOnInit() {
|
|
60
|
-
this.styleClass = this.class();
|
|
61
|
-
}
|
|
62
|
-
search(event) {
|
|
63
|
-
this.loading.set(true);
|
|
64
|
-
this.searchTerms.next(event.query);
|
|
65
|
-
}
|
|
66
|
-
onFocus() {
|
|
67
|
-
if (this.filteredUsers().length > 0 && this.autocomplete()) {
|
|
68
|
-
this.autocomplete()?.show();
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
onSelect(event) {
|
|
72
|
-
const selectedUser = event.value;
|
|
73
|
-
this.value.set(selectedUser);
|
|
74
|
-
this.onModelChange(selectedUser);
|
|
75
|
-
this.onTouched();
|
|
76
|
-
this.loading.set(false);
|
|
77
|
-
this.filteredUsers.set([]);
|
|
78
|
-
if (this.autocomplete()) {
|
|
79
|
-
this.autocomplete()?.hide();
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
onClear() {
|
|
83
|
-
this.value.set(null);
|
|
84
|
-
this.onModelChange(null);
|
|
85
|
-
this.filteredUsers.set([]);
|
|
86
|
-
this.loading.set(false);
|
|
87
|
-
}
|
|
88
|
-
writeValue(value) {
|
|
89
|
-
this.value.set(value);
|
|
90
|
-
}
|
|
91
|
-
registerOnChange(fn) {
|
|
92
|
-
this.onModelChange = fn;
|
|
93
|
-
}
|
|
94
|
-
registerOnTouched(fn) {
|
|
95
|
-
this.onTouched = fn;
|
|
96
|
-
}
|
|
97
|
-
setDisabledState(disabled) {
|
|
98
|
-
this.disabled.set(disabled);
|
|
99
|
-
}
|
|
100
|
-
getUsers() {
|
|
101
|
-
this.searchTerms
|
|
102
|
-
.pipe(takeUntilDestroyed(), distinctUntilChanged(), tap(() => this.loading.set(true)), switchMap((term) => {
|
|
103
|
-
if (!term) {
|
|
104
|
-
this.filteredUsers.set([]);
|
|
105
|
-
this.loading.set(false);
|
|
106
|
-
return of([]);
|
|
107
|
-
}
|
|
108
|
-
const params = new HttpParams().set(this.paramName(), term);
|
|
109
|
-
return this.http
|
|
110
|
-
.get(this.apiUrl(), {
|
|
111
|
-
params,
|
|
112
|
-
context: this.context(),
|
|
113
|
-
})
|
|
114
|
-
.pipe(finalize(() => this.loading.set(false)), catchError((err) => {
|
|
115
|
-
console.error('API search failed:', err);
|
|
116
|
-
this.filteredUsers.set([]);
|
|
117
|
-
return of({ [this.dataKey()]: [] });
|
|
118
|
-
}));
|
|
119
|
-
}))
|
|
120
|
-
.subscribe({
|
|
121
|
-
next: (users) => {
|
|
122
|
-
this.filteredUsers.set((users[this.dataKey()] ?? []));
|
|
123
|
-
},
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: UserSearchField, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
127
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: UserSearchField, isStandalone: true, selector: "mt-user-search-field", inputs: { hint: { classPropertyName: "hint", publicName: "hint", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, apiUrl: { classPropertyName: "apiUrl", publicName: "apiUrl", isSignal: true, isRequired: true, transformFunction: null }, dataKey: { classPropertyName: "dataKey", publicName: "dataKey", isSignal: true, isRequired: false, transformFunction: null }, paramName: { classPropertyName: "paramName", publicName: "paramName", isSignal: true, isRequired: false, transformFunction: null }, context: { classPropertyName: "context", publicName: "context", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "this.styleClass" }, classAttribute: "grid gap-1" }, viewQueries: [{ propertyName: "autocomplete", first: true, predicate: ["autocomplete"], descendants: true, isSignal: true }], ngImport: i0, template: "@if (label()) {\r\n <label\r\n [class.required]=\"ngControl?.control?.hasValidator(requiredValidator)\"\r\n [for]=\"ngControl?.name || label()\"\r\n >\r\n {{ label() }}\r\n </label>\r\n}\r\n<div class=\"relative\">\r\n <p-inputgroup>\r\n <p-autoComplete\r\n #autocomplete=\"\"\r\n [suggestions]=\"filteredUsers()\"\r\n (completeMethod)=\"search($event)\"\r\n (onSelect)=\"onSelect($event)\"\r\n (onClear)=\"onClear()\"\r\n (onFocus)=\"onFocus()\"\r\n (onBlur)=\"onTouched()\"\r\n [ngModel]=\"value()?.displayName\"\r\n [disabled]=\"disabled() || readonly()\"\r\n [id]=\"ngControl?.name || label()\"\r\n [invalid]=\"isInvalid(ngControl?.control)\"\r\n [placeholder]=\"placeholder()\"\r\n class=\"w-full\"\r\n appendTo=\"body\"\r\n styleClass=\"w-full\"\r\n [dropdown]=\"false\"\r\n [size]=\"size()\"\r\n >\r\n <ng-template let-user pTemplate=\"item\">\r\n <div class=\"flex items-center gap-2\">\r\n <mt-avatar size=\"small\" icon=\"user.user-01\" />\r\n <div class=\"flex align-items-center gap-3\">\r\n <span class=\"font-medium\">{{ user.displayName }}</span>\r\n <medium class=\"text-gray-500\">{{ \"@\" + user.userName }}</medium>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <!-- <ng-template let-user #pTemplate=\"selecteditem\">\r\n <div class=\"flex items-center gap-2\">\r\n <mt-avatar size=\"small\" icon=\"user.user-01\" />\r\n <div class=\"flex align-items-center gap-3\">\r\n <span class=\"font-medium\">{{ user.displayName }}</span>\r\n <medium class=\"text-gray-500\">{{ \"@\" + user.userName }}</medium>\r\n </div>\r\n </div>\r\n </ng-template> -->\r\n </p-autoComplete>\r\n @if (hint()) {\r\n <p-inputgroup-addon [mtTooltip]=\"hint()\" tooltipPosition=\"top\">\r\n <mt-icon icon=\"general.help-circle\" />\r\n </p-inputgroup-addon>\r\n } @else {\r\n <p-inputgroup-addon tooltipPosition=\"top\">\r\n <mt-icon icon=\"user.user-03\" />\r\n </p-inputgroup-addon>\r\n }\r\n </p-inputgroup>\r\n\r\n @if (loading()) {\r\n <mt-icon\r\n icon=\"general.loading-01\"\r\n class=\"animate-spin absolute right-3 bg-white top-1/2 -translate-y-1/2\"\r\n />\r\n }\r\n</div>\r\n<mt-field-validation [control]=\"ngControl?.control\"></mt-field-validation>\r\n", styles: [""], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AutoCompleteModule }, { kind: "component", type: i2.AutoComplete, selector: "p-autoComplete, p-autocomplete, p-auto-complete", inputs: ["minLength", "minQueryLength", "delay", "panelStyle", "styleClass", "panelStyleClass", "inputStyle", "inputId", "inputStyleClass", "placeholder", "readonly", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "autoHighlight", "forceSelection", "type", "autoZIndex", "baseZIndex", "ariaLabel", "dropdownAriaLabel", "ariaLabelledBy", "dropdownIcon", "unique", "group", "completeOnFocus", "showClear", "dropdown", "showEmptyMessage", "dropdownMode", "multiple", "addOnTab", "tabindex", "dataKey", "emptyMessage", "showTransitionOptions", "hideTransitionOptions", "autofocus", "autocomplete", "optionGroupChildren", "optionGroupLabel", "overlayOptions", "suggestions", "optionLabel", "optionValue", "id", "searchMessage", "emptySelectionMessage", "selectionMessage", "autoOptionFocus", "selectOnFocus", "searchLocale", "optionDisabled", "focusOnHover", "typeahead", "addOnBlur", "separator", "appendTo", "motionOptions"], outputs: ["completeMethod", "onSelect", "onUnselect", "onAdd", "onFocus", "onBlur", "onDropdownClick", "onClear", "onInputKeydown", "onKeyUp", "onShow", "onHide", "onLazyLoad"] }, { kind: "directive", type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: Tooltip, selector: "[mtTooltip]" }, { kind: "ngmodule", type: InputGroupModule }, { kind: "component", type: i4.InputGroup, selector: "p-inputgroup, p-inputGroup, p-input-group", inputs: ["styleClass"] }, { kind: "ngmodule", type: InputGroupAddonModule }, { kind: "component", type: i5.InputGroupAddon, selector: "p-inputgroup-addon, p-inputGroupAddon", inputs: ["style", "styleClass"] }, { kind: "component", type: FieldValidation, selector: "mt-field-validation", inputs: ["control", "touched"] }, { kind: "component", type: Icon, selector: "mt-icon", inputs: ["icon"] }, { kind: "component", type: Avatar, selector: "mt-avatar", inputs: ["label", "icon", "image", "styleClass", "size", "shape", "badge", "badgeSize", "badgeSeverity"], outputs: ["onImageError"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
128
|
-
}
|
|
129
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: UserSearchField, decorators: [{
|
|
130
|
-
type: Component,
|
|
131
|
-
args: [{ selector: 'mt-user-search-field', standalone: true, imports: [
|
|
132
|
-
FormsModule,
|
|
133
|
-
AutoCompleteModule,
|
|
134
|
-
Tooltip,
|
|
135
|
-
InputGroupModule,
|
|
136
|
-
InputGroupAddonModule,
|
|
137
|
-
FieldValidation,
|
|
138
|
-
Icon,
|
|
139
|
-
Avatar,
|
|
140
|
-
], changeDetection: ChangeDetectionStrategy.OnPush, host: {
|
|
141
|
-
class: 'grid gap-1',
|
|
142
|
-
}, template: "@if (label()) {\r\n <label\r\n [class.required]=\"ngControl?.control?.hasValidator(requiredValidator)\"\r\n [for]=\"ngControl?.name || label()\"\r\n >\r\n {{ label() }}\r\n </label>\r\n}\r\n<div class=\"relative\">\r\n <p-inputgroup>\r\n <p-autoComplete\r\n #autocomplete=\"\"\r\n [suggestions]=\"filteredUsers()\"\r\n (completeMethod)=\"search($event)\"\r\n (onSelect)=\"onSelect($event)\"\r\n (onClear)=\"onClear()\"\r\n (onFocus)=\"onFocus()\"\r\n (onBlur)=\"onTouched()\"\r\n [ngModel]=\"value()?.displayName\"\r\n [disabled]=\"disabled() || readonly()\"\r\n [id]=\"ngControl?.name || label()\"\r\n [invalid]=\"isInvalid(ngControl?.control)\"\r\n [placeholder]=\"placeholder()\"\r\n class=\"w-full\"\r\n appendTo=\"body\"\r\n styleClass=\"w-full\"\r\n [dropdown]=\"false\"\r\n [size]=\"size()\"\r\n >\r\n <ng-template let-user pTemplate=\"item\">\r\n <div class=\"flex items-center gap-2\">\r\n <mt-avatar size=\"small\" icon=\"user.user-01\" />\r\n <div class=\"flex align-items-center gap-3\">\r\n <span class=\"font-medium\">{{ user.displayName }}</span>\r\n <medium class=\"text-gray-500\">{{ \"@\" + user.userName }}</medium>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <!-- <ng-template let-user #pTemplate=\"selecteditem\">\r\n <div class=\"flex items-center gap-2\">\r\n <mt-avatar size=\"small\" icon=\"user.user-01\" />\r\n <div class=\"flex align-items-center gap-3\">\r\n <span class=\"font-medium\">{{ user.displayName }}</span>\r\n <medium class=\"text-gray-500\">{{ \"@\" + user.userName }}</medium>\r\n </div>\r\n </div>\r\n </ng-template> -->\r\n </p-autoComplete>\r\n @if (hint()) {\r\n <p-inputgroup-addon [mtTooltip]=\"hint()\" tooltipPosition=\"top\">\r\n <mt-icon icon=\"general.help-circle\" />\r\n </p-inputgroup-addon>\r\n } @else {\r\n <p-inputgroup-addon tooltipPosition=\"top\">\r\n <mt-icon icon=\"user.user-03\" />\r\n </p-inputgroup-addon>\r\n }\r\n </p-inputgroup>\r\n\r\n @if (loading()) {\r\n <mt-icon\r\n icon=\"general.loading-01\"\r\n class=\"animate-spin absolute right-3 bg-white top-1/2 -translate-y-1/2\"\r\n />\r\n }\r\n</div>\r\n<mt-field-validation [control]=\"ngControl?.control\"></mt-field-validation>\r\n" }]
|
|
143
|
-
}], ctorParameters: () => [], propDecorators: { hint: [{ type: i0.Input, args: [{ isSignal: true, alias: "hint", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], class: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], apiUrl: [{ type: i0.Input, args: [{ isSignal: true, alias: "apiUrl", required: true }] }], dataKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataKey", required: false }] }], paramName: [{ type: i0.Input, args: [{ isSignal: true, alias: "paramName", required: false }] }], context: [{ type: i0.Input, args: [{ isSignal: true, alias: "context", required: false }] }], styleClass: [{
|
|
144
|
-
type: HostBinding,
|
|
145
|
-
args: ['class']
|
|
146
|
-
}], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], autocomplete: [{ type: i0.ViewChild, args: ['autocomplete', { isSignal: true }] }] } });
|
|
147
|
-
|
|
148
|
-
/**
|
|
149
|
-
* Generated bundle index. Do not edit.
|
|
150
|
-
*/
|
|
151
|
-
|
|
152
|
-
export { UserSearchField };
|
|
153
|
-
//# sourceMappingURL=masterteam-components-user-search-field.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"masterteam-components-user-search-field.mjs","sources":["../../../../packages/masterteam/components/user-search-field/user-search-field.ts","../../../../packages/masterteam/components/user-search-field/user-search-field.html","../../../../packages/masterteam/components/user-search-field/masterteam-components-user-search-field.ts"],"sourcesContent":["import {\r\n Component,\r\n HostBinding,\r\n signal,\r\n input,\r\n OnInit,\r\n inject,\r\n ChangeDetectionStrategy,\r\n effect,\r\n viewChild,\r\n} from '@angular/core';\r\nimport {\r\n ControlValueAccessor,\r\n FormsModule,\r\n NgControl,\r\n Validators,\r\n} from '@angular/forms';\r\nimport { AutoComplete, AutoCompleteModule } from 'primeng/autocomplete';\r\nimport { InputGroupModule } from 'primeng/inputgroup';\r\nimport { InputGroupAddonModule } from 'primeng/inputgroupaddon';\r\nimport { Tooltip } from '@masterteam/components/tooltip';\r\nimport { FieldValidation } from '@masterteam/components/field-validation';\r\nimport { isInvalid } from '@masterteam/components';\r\nimport { Icon } from '@masterteam/icons';\r\nimport {\r\n Subject,\r\n distinctUntilChanged,\r\n switchMap,\r\n tap,\r\n of,\r\n finalize,\r\n catchError,\r\n} from 'rxjs';\r\nimport { HttpClient, HttpContext, HttpParams } from '@angular/common/http';\r\nimport { Avatar } from '@masterteam/components/avatar';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\n\r\nexport interface User {\r\n isExternal: boolean;\r\n id: string;\r\n displayName: string;\r\n userName: string;\r\n photo: string;\r\n}\r\n\r\n@Component({\r\n selector: 'mt-user-search-field',\r\n standalone: true,\r\n imports: [\r\n FormsModule,\r\n AutoCompleteModule,\r\n Tooltip,\r\n InputGroupModule,\r\n InputGroupAddonModule,\r\n FieldValidation,\r\n Icon,\r\n Avatar,\r\n ],\r\n templateUrl: './user-search-field.html',\r\n styleUrls: ['./user-search-field.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n class: 'grid gap-1',\r\n },\r\n})\r\nexport class UserSearchField implements ControlValueAccessor, OnInit {\r\n readonly hint = input<string>();\r\n readonly label = input<string>();\r\n readonly placeholder = input<string>();\r\n readonly class = input<string>('');\r\n readonly readonly = input<boolean>(false);\r\n readonly required = input<boolean>(false);\r\n readonly apiUrl = input.required<string>();\r\n readonly dataKey = input<string>('data');\r\n readonly paramName = input<string>('query');\r\n readonly context = input<HttpContext | undefined>(undefined);\r\n\r\n @HostBinding('class') styleClass: string;\r\n\r\n requiredValidator = Validators.required;\r\n value = signal<User | null>(null);\r\n disabled = signal<boolean>(false);\r\n loading = signal<boolean>(false);\r\n\r\n readonly size = input<'small' | 'large' | undefined>();\r\n\r\n filteredUsers = signal<User[]>([]);\r\n private searchTerms = new Subject<string>();\r\n\r\n readonly autocomplete = viewChild<AutoComplete>('autocomplete');\r\n\r\n onTouched: () => void = () => {};\r\n onModelChange: (value: any) => void = () => {};\r\n\r\n public ngControl: NgControl | null = null;\r\n private http = inject(HttpClient);\r\n\r\n isInvalid = isInvalid;\r\n\r\n constructor() {\r\n this.ngControl = inject(NgControl, { self: true, optional: true });\r\n if (this.ngControl) {\r\n this.ngControl.valueAccessor = this;\r\n }\r\n effect(() => {\r\n if (this.ngControl?.control && this.required()) {\r\n this.ngControl.control.addValidators(Validators.required);\r\n this.ngControl.control.updateValueAndValidity();\r\n }\r\n });\r\n this.getUsers();\r\n }\r\n\r\n ngOnInit() {\r\n this.styleClass = this.class();\r\n }\r\n\r\n search(event: { query: string }) {\r\n this.loading.set(true);\r\n this.searchTerms.next(event.query);\r\n }\r\n\r\n onFocus() {\r\n if (this.filteredUsers().length > 0 && this.autocomplete()) {\r\n this.autocomplete()?.show();\r\n }\r\n }\r\n\r\n onSelect(event: { originalEvent: Event; value: User }) {\r\n const selectedUser = event.value;\r\n this.value.set(selectedUser);\r\n this.onModelChange(selectedUser);\r\n this.onTouched();\r\n this.loading.set(false);\r\n this.filteredUsers.set([]);\r\n if (this.autocomplete()) {\r\n this.autocomplete()?.hide();\r\n }\r\n }\r\n\r\n onClear() {\r\n this.value.set(null);\r\n this.onModelChange(null);\r\n this.filteredUsers.set([]);\r\n this.loading.set(false);\r\n }\r\n\r\n writeValue(value: User | null): void {\r\n this.value.set(value);\r\n }\r\n\r\n registerOnChange(fn: (value: User | null) => void) {\r\n this.onModelChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any) {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(disabled: boolean) {\r\n this.disabled.set(disabled);\r\n }\r\n\r\n getUsers() {\r\n this.searchTerms\r\n .pipe(\r\n takeUntilDestroyed(),\r\n distinctUntilChanged(),\r\n tap(() => this.loading.set(true)),\r\n switchMap((term: string) => {\r\n if (!term) {\r\n this.filteredUsers.set([]);\r\n this.loading.set(false);\r\n return of([]);\r\n }\r\n const params = new HttpParams().set(this.paramName(), term);\r\n return this.http\r\n .get<any>(this.apiUrl(), {\r\n params,\r\n context: this.context(),\r\n })\r\n .pipe(\r\n finalize(() => this.loading.set(false)),\r\n catchError((err) => {\r\n console.error('API search failed:', err);\r\n this.filteredUsers.set([]);\r\n return of({ [this.dataKey()]: [] });\r\n }),\r\n );\r\n }),\r\n )\r\n .subscribe({\r\n next: (users) => {\r\n this.filteredUsers.set((users[this.dataKey()] ?? []) as User[]);\r\n },\r\n });\r\n }\r\n}\r\n","@if (label()) {\r\n <label\r\n [class.required]=\"ngControl?.control?.hasValidator(requiredValidator)\"\r\n [for]=\"ngControl?.name || label()\"\r\n >\r\n {{ label() }}\r\n </label>\r\n}\r\n<div class=\"relative\">\r\n <p-inputgroup>\r\n <p-autoComplete\r\n #autocomplete=\"\"\r\n [suggestions]=\"filteredUsers()\"\r\n (completeMethod)=\"search($event)\"\r\n (onSelect)=\"onSelect($event)\"\r\n (onClear)=\"onClear()\"\r\n (onFocus)=\"onFocus()\"\r\n (onBlur)=\"onTouched()\"\r\n [ngModel]=\"value()?.displayName\"\r\n [disabled]=\"disabled() || readonly()\"\r\n [id]=\"ngControl?.name || label()\"\r\n [invalid]=\"isInvalid(ngControl?.control)\"\r\n [placeholder]=\"placeholder()\"\r\n class=\"w-full\"\r\n appendTo=\"body\"\r\n styleClass=\"w-full\"\r\n [dropdown]=\"false\"\r\n [size]=\"size()\"\r\n >\r\n <ng-template let-user pTemplate=\"item\">\r\n <div class=\"flex items-center gap-2\">\r\n <mt-avatar size=\"small\" icon=\"user.user-01\" />\r\n <div class=\"flex align-items-center gap-3\">\r\n <span class=\"font-medium\">{{ user.displayName }}</span>\r\n <medium class=\"text-gray-500\">{{ \"@\" + user.userName }}</medium>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <!-- <ng-template let-user #pTemplate=\"selecteditem\">\r\n <div class=\"flex items-center gap-2\">\r\n <mt-avatar size=\"small\" icon=\"user.user-01\" />\r\n <div class=\"flex align-items-center gap-3\">\r\n <span class=\"font-medium\">{{ user.displayName }}</span>\r\n <medium class=\"text-gray-500\">{{ \"@\" + user.userName }}</medium>\r\n </div>\r\n </div>\r\n </ng-template> -->\r\n </p-autoComplete>\r\n @if (hint()) {\r\n <p-inputgroup-addon [mtTooltip]=\"hint()\" tooltipPosition=\"top\">\r\n <mt-icon icon=\"general.help-circle\" />\r\n </p-inputgroup-addon>\r\n } @else {\r\n <p-inputgroup-addon tooltipPosition=\"top\">\r\n <mt-icon icon=\"user.user-03\" />\r\n </p-inputgroup-addon>\r\n }\r\n </p-inputgroup>\r\n\r\n @if (loading()) {\r\n <mt-icon\r\n icon=\"general.loading-01\"\r\n class=\"animate-spin absolute right-3 bg-white top-1/2 -translate-y-1/2\"\r\n />\r\n }\r\n</div>\r\n<mt-field-validation [control]=\"ngControl?.control\"></mt-field-validation>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;MAiEa,eAAe,CAAA;IACjB,IAAI,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;IACtB,KAAK,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;IACvB,WAAW,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;AAC7B,IAAA,KAAK,GAAG,KAAK,CAAS,EAAE,iDAAC;AACzB,IAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,oDAAC;AAChC,IAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,oDAAC;AAChC,IAAA,MAAM,GAAG,KAAK,CAAC,QAAQ,iDAAU;AACjC,IAAA,OAAO,GAAG,KAAK,CAAS,MAAM,mDAAC;AAC/B,IAAA,SAAS,GAAG,KAAK,CAAS,OAAO,qDAAC;AAClC,IAAA,OAAO,GAAG,KAAK,CAA0B,SAAS,mDAAC;AAEtC,IAAA,UAAU;AAEhC,IAAA,iBAAiB,GAAG,UAAU,CAAC,QAAQ;AACvC,IAAA,KAAK,GAAG,MAAM,CAAc,IAAI,iDAAC;AACjC,IAAA,QAAQ,GAAG,MAAM,CAAU,KAAK,oDAAC;AACjC,IAAA,OAAO,GAAG,MAAM,CAAU,KAAK,mDAAC;IAEvB,IAAI,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAiC;AAEtD,IAAA,aAAa,GAAG,MAAM,CAAS,EAAE,yDAAC;AAC1B,IAAA,WAAW,GAAG,IAAI,OAAO,EAAU;AAElC,IAAA,YAAY,GAAG,SAAS,CAAe,cAAc,wDAAC;AAE/D,IAAA,SAAS,GAAe,MAAK,EAAE,CAAC;AAChC,IAAA,aAAa,GAAyB,MAAK,EAAE,CAAC;IAEvC,SAAS,GAAqB,IAAI;AACjC,IAAA,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC;IAEjC,SAAS,GAAG,SAAS;AAErB,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAClE,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,YAAA,IAAI,CAAC,SAAS,CAAC,aAAa,GAAG,IAAI;QACrC;QACA,MAAM,CAAC,MAAK;YACV,IAAI,IAAI,CAAC,SAAS,EAAE,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;gBAC9C,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,QAAQ,CAAC;AACzD,gBAAA,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,sBAAsB,EAAE;YACjD;AACF,QAAA,CAAC,CAAC;QACF,IAAI,CAAC,QAAQ,EAAE;IACjB;IAEA,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,EAAE;IAChC;AAEA,IAAA,MAAM,CAAC,KAAwB,EAAA;AAC7B,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;IACpC;IAEA,OAAO,GAAA;AACL,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,YAAY,EAAE,EAAE;AAC1D,YAAA,IAAI,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE;QAC7B;IACF;AAEA,IAAA,QAAQ,CAAC,KAA4C,EAAA;AACnD,QAAA,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK;AAChC,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC;AAC5B,QAAA,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC;QAChC,IAAI,CAAC,SAAS,EAAE;AAChB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AACvB,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;AAC1B,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE,EAAE;AACvB,YAAA,IAAI,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE;QAC7B;IACF;IAEA,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;AACpB,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;AACxB,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;AAC1B,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;IACzB;AAEA,IAAA,UAAU,CAAC,KAAkB,EAAA;AAC3B,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;IACvB;AAEA,IAAA,gBAAgB,CAAC,EAAgC,EAAA;AAC/C,QAAA,IAAI,CAAC,aAAa,GAAG,EAAE;IACzB;AAEA,IAAA,iBAAiB,CAAC,EAAO,EAAA;AACvB,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AAEA,IAAA,gBAAgB,CAAC,QAAiB,EAAA;AAChC,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC;IAC7B;IAEA,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC;aACF,IAAI,CACH,kBAAkB,EAAE,EACpB,oBAAoB,EAAE,EACtB,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EACjC,SAAS,CAAC,CAAC,IAAY,KAAI;YACzB,IAAI,CAAC,IAAI,EAAE;AACT,gBAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;AAC1B,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AACvB,gBAAA,OAAO,EAAE,CAAC,EAAE,CAAC;YACf;AACA,YAAA,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,CAAC;YAC3D,OAAO,IAAI,CAAC;AACT,iBAAA,GAAG,CAAM,IAAI,CAAC,MAAM,EAAE,EAAE;gBACvB,MAAM;AACN,gBAAA,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;aACxB;iBACA,IAAI,CACH,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EACvC,UAAU,CAAC,CAAC,GAAG,KAAI;AACjB,gBAAA,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,GAAG,CAAC;AACxC,gBAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;AAC1B,gBAAA,OAAO,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC;YACrC,CAAC,CAAC,CACH;AACL,QAAA,CAAC,CAAC;AAEH,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,KAAK,KAAI;AACd,gBAAA,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAY;YACjE,CAAC;AACF,SAAA,CAAC;IACN;uGAnIW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAf,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,eAAe,8oDCjE5B,86EAoEA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDnBI,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,iDAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,gBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,cAAA,EAAA,MAAA,EAAA,eAAA,EAAA,uBAAA,EAAA,sBAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,YAAA,EAAA,YAAA,EAAA,WAAA,EAAA,mBAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,QAAA,EAAA,OAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,SAAA,EAAA,cAAA,EAAA,uBAAA,EAAA,uBAAA,EAAA,WAAA,EAAA,cAAA,EAAA,qBAAA,EAAA,kBAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,aAAA,EAAA,aAAA,EAAA,IAAA,EAAA,eAAA,EAAA,uBAAA,EAAA,kBAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,UAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,EAAA,UAAA,EAAA,YAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,SAAA,EAAA,QAAA,EAAA,QAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,OAAO,EAAA,QAAA,EAAA,aAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACP,gBAAgB,yJAChB,qBAAqB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,uCAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACrB,eAAe,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACf,IAAI,sEACJ,MAAM,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,YAAA,EAAA,MAAA,EAAA,OAAA,EAAA,OAAA,EAAA,WAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FASG,eAAe,EAAA,UAAA,EAAA,CAAA;kBApB3B,SAAS;+BACE,sBAAsB,EAAA,UAAA,EACpB,IAAI,EAAA,OAAA,EACP;wBACP,WAAW;wBACX,kBAAkB;wBAClB,OAAO;wBACP,gBAAgB;wBAChB,qBAAqB;wBACrB,eAAe;wBACf,IAAI;wBACJ,MAAM;qBACP,EAAA,eAAA,EAGgB,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACJ,wBAAA,KAAK,EAAE,YAAY;AACpB,qBAAA,EAAA,QAAA,EAAA,86EAAA,EAAA;;sBAcA,WAAW;uBAAC,OAAO;oJAY4B,cAAc,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AEzFhE;;AAEG;;;;"}
|
|
@@ -1,213 +0,0 @@
|
|
|
1
|
-
import * as _angular_core from '@angular/core';
|
|
2
|
-
import { LookupMatrixFieldConfig, LookupOptionItemConfig, LookupMatrixCellConfig, SchedulePredecessorFieldRuntimeContext } from '@masterteam/components';
|
|
3
|
-
import { ControlValueAccessor, Validators, NgControl } from '@angular/forms';
|
|
4
|
-
import { HttpContext } from '@angular/common/http';
|
|
5
|
-
import { ColumnDef, TableAction } from '@masterteam/components/table';
|
|
6
|
-
|
|
7
|
-
declare class LookupMatrixField {
|
|
8
|
-
readonly config: _angular_core.InputSignal<LookupMatrixFieldConfig>;
|
|
9
|
-
private readonly controlContainer;
|
|
10
|
-
private readonly destroyRef;
|
|
11
|
-
private readonly valueVersion;
|
|
12
|
-
readonly xOptions: _angular_core.Signal<LookupOptionItemConfig[]>;
|
|
13
|
-
readonly yOptions: _angular_core.Signal<LookupOptionItemConfig[]>;
|
|
14
|
-
readonly hasMatrix: _angular_core.Signal<boolean>;
|
|
15
|
-
readonly cellMap: _angular_core.Signal<Map<string, LookupMatrixCellConfig>>;
|
|
16
|
-
readonly selectedXOption: _angular_core.Signal<LookupOptionItemConfig | null>;
|
|
17
|
-
readonly selectedYOption: _angular_core.Signal<LookupOptionItemConfig | null>;
|
|
18
|
-
readonly activeCell: _angular_core.Signal<LookupMatrixCellConfig | null>;
|
|
19
|
-
readonly selectionSummary: _angular_core.Signal<string>;
|
|
20
|
-
readonly pendingMessage: _angular_core.Signal<string>;
|
|
21
|
-
readonly missingResultMessage: _angular_core.Signal<string>;
|
|
22
|
-
constructor();
|
|
23
|
-
getCell(xLookupItemId: number | string, yLookupItemId: number | string): LookupMatrixCellConfig | null;
|
|
24
|
-
getSwatchStyle(color?: string | null): Record<string, string>;
|
|
25
|
-
private getControlValue;
|
|
26
|
-
private resolveSelectedOption;
|
|
27
|
-
private optionMatchesValue;
|
|
28
|
-
private cellKey;
|
|
29
|
-
private resolveColor;
|
|
30
|
-
static ɵfac: _angular_core.ɵɵFactoryDeclaration<LookupMatrixField, never>;
|
|
31
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<LookupMatrixField, "mt-lookup-matrix-field", never, { "config": { "alias": "config"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* One source level inside connection configuration.
|
|
36
|
-
* Comes from `field.propertyMetadata.configuration.sourceLevels[]`
|
|
37
|
-
*/
|
|
38
|
-
interface ConnectionSourceLevel {
|
|
39
|
-
levelId: number;
|
|
40
|
-
levelKey: string;
|
|
41
|
-
name: {
|
|
42
|
-
en?: string;
|
|
43
|
-
ar?: string;
|
|
44
|
-
[k: string]: string | undefined;
|
|
45
|
-
};
|
|
46
|
-
connectionId: number;
|
|
47
|
-
isOptional: boolean;
|
|
48
|
-
allowManyToMany: boolean;
|
|
49
|
-
supportWeights: boolean;
|
|
50
|
-
optionsQuery: {
|
|
51
|
-
path: string;
|
|
52
|
-
method?: string;
|
|
53
|
-
query?: Record<string, unknown>;
|
|
54
|
-
};
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* Full connection configuration from `field.propertyMetadata.configuration`.
|
|
58
|
-
* This is passed as a single input to the component.
|
|
59
|
-
*/
|
|
60
|
-
interface SchemaConnectionConfig {
|
|
61
|
-
targetLevelId: number;
|
|
62
|
-
sourceLevelId?: number;
|
|
63
|
-
propertyKey?: string;
|
|
64
|
-
valueMode?: string;
|
|
65
|
-
sourceLevels: ConnectionSourceLevel[];
|
|
66
|
-
payloadTemplate?: {
|
|
67
|
-
levelId: number;
|
|
68
|
-
sources: any[];
|
|
69
|
-
};
|
|
70
|
-
sourceItemShape?: Record<string, string>;
|
|
71
|
-
}
|
|
72
|
-
/** One selected source in the connection payload */
|
|
73
|
-
interface ConnectionSource {
|
|
74
|
-
sourceLevelId: number;
|
|
75
|
-
sourceLevelDataId: number;
|
|
76
|
-
}
|
|
77
|
-
/** The value shape for a connection field */
|
|
78
|
-
interface ConnectionPayload {
|
|
79
|
-
levelId: number;
|
|
80
|
-
sources: ConnectionSource[];
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* Internal state tracked per source level dropdown.
|
|
84
|
-
*/
|
|
85
|
-
interface SourceLevelState {
|
|
86
|
-
source: ConnectionSourceLevel;
|
|
87
|
-
options: any[];
|
|
88
|
-
loading: boolean;
|
|
89
|
-
}
|
|
90
|
-
declare class SchemaConnectionField implements ControlValueAccessor {
|
|
91
|
-
readonly label: _angular_core.InputSignal<string>;
|
|
92
|
-
readonly placeholder: _angular_core.InputSignal<string>;
|
|
93
|
-
readonly readonly: _angular_core.InputSignal<boolean>;
|
|
94
|
-
readonly required: _angular_core.InputSignal<boolean>;
|
|
95
|
-
readonly filter: _angular_core.InputSignal<boolean>;
|
|
96
|
-
/**
|
|
97
|
-
* Full connection configuration object from the API.
|
|
98
|
-
* Includes `targetLevelId`, `sourceLevels[]`, `payloadTemplate`, etc.
|
|
99
|
-
*/
|
|
100
|
-
readonly configuration: _angular_core.InputSignal<SchemaConnectionConfig>;
|
|
101
|
-
/**
|
|
102
|
-
* Optional HttpContext for API requests (e.g. to set base URL behavior).
|
|
103
|
-
*/
|
|
104
|
-
readonly context: _angular_core.InputSignal<HttpContext | undefined>;
|
|
105
|
-
/** The full ConnectionPayload value */
|
|
106
|
-
value: _angular_core.WritableSignal<ConnectionPayload | null>;
|
|
107
|
-
disabled: _angular_core.WritableSignal<boolean>;
|
|
108
|
-
/** Per-source-level state: options + loading */
|
|
109
|
-
sourceLevelStates: _angular_core.WritableSignal<SourceLevelState[]>;
|
|
110
|
-
/** Mutable selections per source level: sourceLevelId -> selected value */
|
|
111
|
-
selections: Record<number, any>;
|
|
112
|
-
requiredValidator: typeof Validators.required;
|
|
113
|
-
onTouched: () => void;
|
|
114
|
-
onModelChange: (value: ConnectionPayload | null) => void;
|
|
115
|
-
ngControl: NgControl | null;
|
|
116
|
-
private http;
|
|
117
|
-
private destroyRef;
|
|
118
|
-
/**
|
|
119
|
-
* Source levels from configuration.
|
|
120
|
-
*/
|
|
121
|
-
readonly sourceLevels: _angular_core.Signal<ConnectionSourceLevel[]>;
|
|
122
|
-
/**
|
|
123
|
-
* Percentage width for each dropdown, evenly divided.
|
|
124
|
-
*/
|
|
125
|
-
readonly dropdownWidth: _angular_core.Signal<string>;
|
|
126
|
-
constructor();
|
|
127
|
-
private loadOptions;
|
|
128
|
-
private updateSourceState;
|
|
129
|
-
/**
|
|
130
|
-
* Single handler — no params. Reads all selections, builds the combined payload.
|
|
131
|
-
*/
|
|
132
|
-
syncValue(): void;
|
|
133
|
-
private distributeToSelections;
|
|
134
|
-
writeValue(value: ConnectionPayload | string | null): void;
|
|
135
|
-
registerOnChange(fn: (value: ConnectionPayload | null) => void): void;
|
|
136
|
-
registerOnTouched(fn: any): void;
|
|
137
|
-
setDisabledState(disabled: boolean): void;
|
|
138
|
-
static ɵfac: _angular_core.ɵɵFactoryDeclaration<SchemaConnectionField, never>;
|
|
139
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<SchemaConnectionField, "mt-schema-connection-field", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "filter": { "alias": "filter"; "required": false; "isSignal": true; }; "configuration": { "alias": "configuration"; "required": true; "isSignal": true; }; "context": { "alias": "context"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
type PredecessorType = 0 | 1 | 2 | 3;
|
|
143
|
-
interface SchedulePredecessorValue {
|
|
144
|
-
predecessorId: number | string;
|
|
145
|
-
type: PredecessorType;
|
|
146
|
-
lagDays: number;
|
|
147
|
-
}
|
|
148
|
-
interface SchedulePredecessorRow extends SchedulePredecessorValue {
|
|
149
|
-
key: string;
|
|
150
|
-
}
|
|
151
|
-
interface SelectOption {
|
|
152
|
-
label: string;
|
|
153
|
-
value: number | string;
|
|
154
|
-
}
|
|
155
|
-
declare class SchedulePredecessorField implements ControlValueAccessor {
|
|
156
|
-
private readonly predecessorCellTpl;
|
|
157
|
-
private readonly typeCellTpl;
|
|
158
|
-
private readonly lagCellTpl;
|
|
159
|
-
readonly label: _angular_core.InputSignal<string>;
|
|
160
|
-
readonly placeholder: _angular_core.InputSignal<string>;
|
|
161
|
-
readonly readonly: _angular_core.InputSignal<boolean>;
|
|
162
|
-
readonly required: _angular_core.InputSignal<boolean>;
|
|
163
|
-
readonly configuration: _angular_core.InputSignal<unknown>;
|
|
164
|
-
readonly runtimeContext: _angular_core.InputSignal<SchedulePredecessorFieldRuntimeContext | null>;
|
|
165
|
-
readonly loading: _angular_core.WritableSignal<boolean>;
|
|
166
|
-
readonly taskOptions: _angular_core.WritableSignal<SelectOption[]>;
|
|
167
|
-
readonly rows: _angular_core.WritableSignal<SchedulePredecessorRow[]>;
|
|
168
|
-
readonly disabled: _angular_core.WritableSignal<boolean>;
|
|
169
|
-
readonly typeOptions: _angular_core.Signal<SelectOption[]>;
|
|
170
|
-
readonly availableTaskOptions: _angular_core.Signal<SelectOption[]>;
|
|
171
|
-
readonly canAddRow: _angular_core.Signal<boolean>;
|
|
172
|
-
readonly addTooltip: _angular_core.Signal<string | undefined>;
|
|
173
|
-
readonly pageSize: _angular_core.Signal<number>;
|
|
174
|
-
readonly columns: _angular_core.WritableSignal<ColumnDef[]>;
|
|
175
|
-
readonly rowActions: _angular_core.Signal<TableAction[]>;
|
|
176
|
-
requiredValidator: typeof Validators.required;
|
|
177
|
-
onTouched: () => void;
|
|
178
|
-
onModelChange: (value: string | null) => void;
|
|
179
|
-
ngControl: NgControl | null;
|
|
180
|
-
private readonly http;
|
|
181
|
-
private readonly transloco;
|
|
182
|
-
private readonly destroyRef;
|
|
183
|
-
private readonly activeLang;
|
|
184
|
-
private rowKey;
|
|
185
|
-
readonly texts: _angular_core.Signal<{
|
|
186
|
-
noAvailable: string;
|
|
187
|
-
predecessor: string;
|
|
188
|
-
type: string;
|
|
189
|
-
lagDays: string;
|
|
190
|
-
delete: string;
|
|
191
|
-
}>;
|
|
192
|
-
constructor();
|
|
193
|
-
addRow(): void;
|
|
194
|
-
removeRow(key: string): void;
|
|
195
|
-
updateRow(key: string, patch: Partial<SchedulePredecessorRow>): void;
|
|
196
|
-
writeValue(value: unknown): void;
|
|
197
|
-
registerOnChange(fn: (value: string | null) => void): void;
|
|
198
|
-
registerOnTouched(fn: () => void): void;
|
|
199
|
-
setDisabledState(disabled: boolean): void;
|
|
200
|
-
private syncRows;
|
|
201
|
-
private loadTaskOptions;
|
|
202
|
-
private mapTaskOptions;
|
|
203
|
-
private resolveRootRecords;
|
|
204
|
-
private flattenRecords;
|
|
205
|
-
private nextRowKey;
|
|
206
|
-
private parseCompactValue;
|
|
207
|
-
private formatCompactValue;
|
|
208
|
-
static ɵfac: _angular_core.ɵɵFactoryDeclaration<SchedulePredecessorField, never>;
|
|
209
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<SchedulePredecessorField, "mt-schedule-predecessor-field", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "configuration": { "alias": "configuration"; "required": false; "isSignal": true; }; "runtimeContext": { "alias": "runtimeContext"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
export { LookupMatrixField, SchedulePredecessorField, SchemaConnectionField };
|
|
213
|
-
export type { ConnectionPayload, ConnectionSource, ConnectionSourceLevel, SchemaConnectionConfig, SourceLevelState };
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import * as i0 from '@angular/core';
|
|
2
|
-
|
|
3
|
-
declare class ButtonGroup {
|
|
4
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<ButtonGroup, never>;
|
|
5
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<ButtonGroup, "mt-buttonGroup, mt-buttongroup, mt-button-group", never, {}, {}, never, ["*"], true, never>;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
export { ButtonGroup };
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import * as _angular_core from '@angular/core';
|
|
2
|
-
import { MTIcon } from '@masterteam/icons';
|
|
3
|
-
|
|
4
|
-
declare class Chip {
|
|
5
|
-
readonly label: _angular_core.InputSignal<string>;
|
|
6
|
-
readonly icon: _angular_core.InputSignal<MTIcon | undefined>;
|
|
7
|
-
readonly image: _angular_core.InputSignal<string>;
|
|
8
|
-
readonly removable: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
9
|
-
readonly removeIcon: _angular_core.InputSignal<MTIcon>;
|
|
10
|
-
readonly styleClass: _angular_core.InputSignal<string>;
|
|
11
|
-
onRemove: _angular_core.OutputEmitterRef<MouseEvent>;
|
|
12
|
-
onImageError: _angular_core.OutputEmitterRef<Event>;
|
|
13
|
-
onChipRemove(event: MouseEvent): void;
|
|
14
|
-
onChipImageError(event: Event): void;
|
|
15
|
-
static ɵfac: _angular_core.ɵɵFactoryDeclaration<Chip, never>;
|
|
16
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<Chip, "mt-chip", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "image": { "alias": "image"; "required": false; "isSignal": true; }; "removable": { "alias": "removable"; "required": false; "isSignal": true; }; "removeIcon": { "alias": "removeIcon"; "required": false; "isSignal": true; }; "styleClass": { "alias": "styleClass"; "required": false; "isSignal": true; }; }, { "onRemove": "onRemove"; "onImageError": "onImageError"; }, never, never, true, never>;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export { Chip };
|