{"version":3,"file":"ngx-material-change-sets.mjs","sources":["../../../projects/ngx-material-change-sets/src/models/change-set-type.enum.ts","../../../projects/ngx-material-change-sets/src/models/value-type.enum.ts","../../../projects/ngx-material-change-sets/src/pipes/change-value.pipe.ts","../../../projects/ngx-material-change-sets/src/services/change-set.service.ts","../../../projects/ngx-material-change-sets/src/components/confirm-dialog/confirm-dialog.component.ts","../../../projects/ngx-material-change-sets/src/components/confirm-dialog/confirm-dialog.component.html","../../../projects/ngx-material-change-sets/src/components/change-sets/change-sets.component.ts","../../../projects/ngx-material-change-sets/src/components/change-sets/change-sets.component.html","../../../projects/ngx-material-change-sets/src/public-api.ts","../../../projects/ngx-material-change-sets/src/ngx-material-change-sets.ts"],"sourcesContent":["/**\n * The type of the change set.\n * Can bei either CREATE, REPLACE, RESET, UPDATE, DELETE or RESTORE.\n */\nexport enum ChangeSetType {\n    CREATE = 'create',\n    REPLACE = 'replace',\n    RESET = 'reset',\n    UPDATE = 'update',\n    DELETE = 'delete',\n    RESTORE = 'restore'\n}","/**\n * Different Value Types used to determine how a change value should be pretty printed.\n */\nexport enum ValueType {\n    ARRAY = 'array',\n    OBJECT = 'object',\n    DATE = 'date',\n    OTHER = 'other'\n}","import { formatDate } from '@angular/common';\nimport { Inject, LOCALE_ID, Pipe, PipeTransform } from '@angular/core';\n\nimport { ValueType } from '../models';\n\n/**\n * A pipe that pretty prints any value. Should be used with a <pre> element.\n */\n@Pipe({\n    name: 'changeValue',\n    standalone: true\n})\nexport class ChangeValuePipe implements PipeTransform {\n\n    constructor(@Inject(LOCALE_ID) private readonly locale: string) {}\n\n    // eslint-disable-next-line jsdoc/require-jsdoc\n    transform(value: unknown, format: string): unknown {\n        if (value == undefined) {\n            return '-';\n        }\n        switch (this.typeOfChange(value)) {\n            case ValueType.OBJECT: {\n                return JSON.stringify(value, undefined, 1);\n            }\n            case ValueType.DATE: {\n                return formatDate(value as Date, format, this.locale);\n            }\n            case ValueType.ARRAY: {\n                return this.formatArray(value as unknown[]);\n            }\n            case ValueType.OTHER: {\n                return value;\n            }\n        }\n    }\n\n    private formatArray(value: unknown[]): string {\n        if (value.length && typeof value[0] == 'object') {\n            return JSON.stringify(value, undefined, 2);\n        }\n        let result: string = JSON.stringify(value, undefined, 1);\n        result = result.replaceAll(/^ +/gm, ' '); // remove all but the first space for each line\n        result = result.replaceAll('\\n', ''); // remove line-breaks\n        result = result.replaceAll('{ ', '{').replaceAll(' }', '}'); // remove spaces between object-braces and first/last props\n        result = result.replaceAll('[ ', '[').replaceAll(' ]', ']'); // remove spaces between array-brackets and first/last items\n        return result;\n    }\n\n    private typeOfChange(value: unknown): ValueType {\n        if (typeof value == 'string') {\n            try {\n                const date: Date = new Date(value);\n                if (date.toString() !== 'Invalid Date') {\n                    return ValueType.DATE;\n                }\n            }\n            catch {}\n            return ValueType.OTHER;\n        }\n        if (typeof value != 'object') {\n            return ValueType.OTHER;\n        }\n        if (Array.isArray(value)) {\n            return ValueType.ARRAY;\n        }\n        return ValueType.OBJECT;\n    }\n}","import { HttpClient } from '@angular/common/http';\nimport { InjectionToken } from '@angular/core';\nimport { firstValueFrom } from 'rxjs';\n\nimport { ChangeSetsConfig as ChangeSetsConfiguration, ConfirmDialogData } from '../components/change-sets/change-sets-config.model';\nimport { ChangeSet, ChangeSetEntity } from '../models';\n\n// eslint-disable-next-line jsdoc/require-jsdoc, typescript/typedef\nexport const NGX_CHANGE_SET_SERVICE = new InjectionToken<BaseChangeSetService>(\n    'Provide for the change set service used eg. to rollback changes or generate a link to the user that created a change.',\n    {\n        providedIn: 'root',\n        factory: (() => {\n            // eslint-disable-next-line no-console\n            console.error(\n                // eslint-disable-next-line stylistic/max-len\n                'No ChangeSetService has been provided for the token NGX_CHANGE_SET_SERVICE\\nAdd this to your app.module.ts provider array:\\n{\\n    provide: NGX_CHANGE_SET_SERVICE,\\n    useExisting: MyChangeSetService\\n}'\n            );\n        }) as () => BaseChangeSetService\n    }\n);\n\n/**\n * The body for the reset change set request.\n */\nexport interface ResetChangeSetBody {\n    /**\n     * The id of the change set to reset/rollback to.\n     */\n    changeSetId: string\n}\n\n/**\n * The body for the rollback change set request.\n */\nexport type RollbackChangeSetBody = ResetChangeSetBody;\n\n/**\n * The base change set service.\n * Needs to be overridden and provided for the NGX_CHANGE_SET_SERVICE for the ChangeSetsComponent to work.\n */\nexport abstract class BaseChangeSetService {\n    /**\n     * The label for the reset button.\n     * @default 'Reset'\n     */\n    protected readonly resetButtonLabel: string = 'Reset';\n    /**\n     * The label for the button that resets a single change set.\n     * @default 'This change set'\n     */\n    protected readonly resetSingleChangeSetLabel: string = 'This change set';\n    /**\n     * The label for the button that rolls back to the change set.\n     * @default 'Rollback all to this state'\n     */\n    protected readonly rollbackToChangeSetLabel: string = 'Rollback all to this state';\n\n    /**\n     * The format for the created at date.\n     * @default 'dd.MM.yyyy HH:mm'\n     */\n    protected readonly dateFormat: string = 'dd.MM.yyyy HH:mm';\n\n    /**\n     * The format to use for the created at timestamp when on mobile devices.\n     * @default 'dd.MM.yyyy'\n     */\n    protected readonly shortDateFormat: string = 'dd.MM.yyyy';\n\n    /**\n     * The value to use to format date values.\n     * @default 'dd.MM.yyyy HH:mm'\n     */\n    protected readonly valueDateFormat: string = 'dd.MM.yyyy HH:mm';\n\n    /**\n     * Whether or not the \"createdBy\" can be clicked to eg. Navigate to a user that created the change set.\n     * @default true\n     */\n    protected readonly canOpenCreatedBy: boolean | (() => boolean) = true;\n\n    /**\n     * Whether or not the user can reset or rollback changes.\n     * @default true*\n     */\n    protected readonly canResetAndRollback: boolean | (() => boolean) = true;\n\n    /**\n     * Whether or not a display value should be shown for an empty created by value.\n     * You could eg. Display something like \"System\".\n     * @default false\n     */\n    protected readonly displayValueForEmptyCreatedBy: boolean = false;\n\n    /**\n     * The label for the label under which all keys are listed that have been changed.\n     * @default 'Property'\n     */\n    protected readonly changeKeyLabel: string = 'Property';\n\n    /**\n     * The label for the previous value of a change.\n     * @default 'Previous Value'\n     */\n    protected readonly previousValueLabel: string = 'Previous Value';\n\n    /**\n     * The label for the new value of a change.\n     * @default 'New Value'\n     */\n    protected readonly newValueLabel: string = 'New Value';\n\n    /**\n     * The configuration of the confirm dialog for resetting a change set.\n     */\n    protected readonly resetConfirmDialogData: ConfirmDialogData = {\n        title: 'Confirmation',\n        paragraphs: ['Do you really want to reset this change set?', 'This will delete the change set and can\\'t be undone.'],\n        confirmButtonLabel: 'Reset',\n        cancelButtonLabel: 'Cancel'\n    };\n\n    /**\n     * The configuration of the confirm dialog for rolling back to a change set.\n     */\n    protected readonly rollbackConfirmDialogData: ConfirmDialogData = {\n        title: 'Confirmation',\n        paragraphs: [\n            'Do you really want to rollback the entity to the state before this change set?',\n            'This will delete the change set and all newer ones and can\\'t be undone.'\n        ],\n        confirmButtonLabel: 'Rollback',\n        cancelButtonLabel: 'Cancel'\n    };\n\n    // eslint-disable-next-line jsdoc/require-returns\n    /**\n     * The global default configuration for a change sets component.\n     * Can be changed by either overriding the properties on this class or by using the \"config\" @Input on the component level.\n     */\n    get configuration(): ChangeSetsConfiguration {\n        return {\n            dateFormat: this.dateFormat,\n            resetButtonLabel: this.resetButtonLabel,\n            resetSingleChangeSetLabel: this.resetSingleChangeSetLabel,\n            rollbackToChangeSetLabel: this.rollbackToChangeSetLabel,\n            canOpenCreatedBy: this.canOpenCreatedBy,\n            canResetAndRollback: this.canResetAndRollback,\n            displayValueForEmptyCreatedBy: this.displayValueForEmptyCreatedBy,\n            getDisplayValueForCreatedBy: async changeSet => await this.getDisplayValueForCreatedBy(changeSet),\n            rollbackToChangeSet: (changeSet, changeSetsApiBaseUrl) => this.rollbackToChangeSet(changeSet, changeSetsApiBaseUrl),\n            resetChangeSet: (changeSet, changeSetsApiBaseUrl) => this.resetChangeSet(changeSet, changeSetsApiBaseUrl),\n            openCreatedBy: changeSet => this.openCreatedBy(changeSet),\n            getOperationName: changeSet => this.getOperationName(changeSet),\n            changeKeyLabel: this.changeKeyLabel,\n            previousValueLabel: this.previousValueLabel,\n            newValueLabel: this.newValueLabel,\n            shortDateFormat: this.shortDateFormat,\n            valueDateFormat: this.valueDateFormat,\n            rollbackConfirmDialogData: this.rollbackConfirmDialogData,\n            resetConfirmDialogData: this.resetConfirmDialogData\n        };\n    }\n\n    constructor(protected readonly http: HttpClient) {}\n\n    /**\n     * Resets the given change set. All changes afterwards are kept.\n     * By default this sends a POST request to `${changeSetsApiBaseUrl}/${changeSet.changeSetEntityId}/reset`.\n     * The body contains the id of the change set to reset.\n     * It expects the request to return the updated entity including its change sets to update the ui.\n     * @param changeSet - The change set to reset.\n     * @param changeSetsApiBaseUrl - The api base url for the change sets.\n     * This is not set in the method because resetting a change set might be different for each entity.\n     * @returns The entity after the reset happened.\n     */\n    async resetChangeSet(changeSet: ChangeSet, changeSetsApiBaseUrl: string): Promise<ChangeSetEntity> {\n        const body: ResetChangeSetBody = { changeSetId: changeSet.id };\n        return await firstValueFrom(this.http.post<ChangeSetEntity>(`${changeSetsApiBaseUrl}/${changeSet.changeSetEntityId}/reset`, body));\n    }\n\n    /**\n     * Rolls back the entity to the state before the given change set.\n     * All change sets after after that state including this one are deleted.\n     * By default this sends a POST request to `${changeSetsApiBaseUrl}/${changeSet.id}/rollback`.\n     * It expects the request to return the updated entity including its change sets to update the ui.\n     * @param changeSet - The change set to rollback.\n     * @param changeSetsApiBaseUrl - The api base url for the change sets.\n     * This is not set in the method because rollbacks might be different for each entity.\n     * @returns The entity after the rollback happened.\n     */\n    async rollbackToChangeSet(changeSet: ChangeSet, changeSetsApiBaseUrl: string): Promise<ChangeSetEntity> {\n        const body: RollbackChangeSetBody = { changeSetId: changeSet.id };\n        return await firstValueFrom(\n            this.http.post<ChangeSetEntity>(`${changeSetsApiBaseUrl}/${changeSet.changeSetEntityId}/rollback`, body)\n        );\n    }\n\n    /**\n     * How to display the \"createdBy\" in the component.\n     * @param changeSet - The change set.\n     * @returns Simple the createdBy value by default.\n     */\n    getDisplayValueForCreatedBy(changeSet: ChangeSet): string | Promise<string> {\n        return changeSet.createdBy ?? 'System';\n    }\n\n    /**\n     * What to do when the user clicks on the createdBy link and canOpenCreatedBy is enabled.\n     * @param changeSet - The change set.\n     * @returns The type in uppercase by default.\n     */\n    getOperationName(changeSet: ChangeSet): string {\n        return `${changeSet.type}`.toUpperCase();\n    }\n\n    /**\n     * Opens the createdBy value.\n     * This is most likely used to display the user profile of the person that created the change.\n     * @param changeSet - The change set.\n     */\n    abstract openCreatedBy(changeSet: ChangeSet): Promise<void>;\n}","import { Component, Inject } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog';\n\nimport { ConfirmDialogData } from '../change-sets/change-sets-config.model';\n\n/**\n * A generic dialog to either confirm or cancel an action.\n *\n * Confirm closes the dialog with \"true\", cancel closes it with \"false\".\n */\n@Component({\n    // eslint-disable-next-line angular/component-selector\n    selector: 'app-confirm-dialog',\n    templateUrl: './confirm-dialog.component.html',\n    styleUrls: ['./confirm-dialog.component.scss'],\n    standalone: true,\n    imports: [MatDialogModule, MatButtonModule]\n})\nexport class ConfirmDialogComponent {\n\n    constructor(\n        @Inject(MAT_DIALOG_DATA)\n        readonly data: ConfirmDialogData,\n        private readonly dialogRef: MatDialogRef<ConfirmDialogComponent>\n    ) { }\n\n    /**\n     * Closes the dialog with \"true\".\n     */\n    confirm(): void {\n        this.dialogRef.close(true);\n    }\n\n    /**\n     * Closes the dialog with \"false\".\n     */\n    cancel(): void {\n        this.dialogRef.close(false);\n    }\n}","@if (data.title) {\n    <h2 mat-dialog-title>{{data.title}}</h2>\n}\n\n<mat-dialog-content>\n    @for (paragraph of data.paragraphs; track $index) {\n        <p>{{paragraph}}</p>\n    }\n</mat-dialog-content>\n\n<mat-dialog-actions>\n    <button type=\"button\" mat-raised-button class=\"confirm-button\" (click)=\"confirm()\">\n        {{data.confirmButtonLabel}}\n    </button>\n    <button type=\"button\" mat-raised-button class=\"cancel-button\" (click)=\"cancel()\">\n        {{data.cancelButtonLabel}}\n    </button>\n</mat-dialog-actions>","import { DatePipe, KeyValue } from '@angular/common';\nimport { Component, Inject, Input, OnInit, ViewChild } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatDialog, MatDialogModule, MatDialogRef } from '@angular/material/dialog';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatPaginator, MatPaginatorModule, PageEvent } from '@angular/material/paginator';\nimport { firstValueFrom } from 'rxjs';\n\nimport { ChangeSetsConfig } from './change-sets-config.model';\nimport { ChangeSet, ChangeSetEntity, ChangeSetType } from '../../models';\nimport { ChangeValuePipe } from '../../pipes';\nimport { BaseChangeSetService, NGX_CHANGE_SET_SERVICE } from '../../services/change-set.service';\nimport { ConfirmDialogComponent } from '../confirm-dialog/confirm-dialog.component';\n\nconst emptyEntity: ChangeSetEntity = {\n    id: '',\n    changeSets: []\n};\n\n/**\n * A component that displays all change sets for the given @Input \"entity\".\n */\n@Component({\n    // eslint-disable-next-line angular/component-selector\n    selector: 'ngx-mat-change-sets',\n    templateUrl: './change-sets.component.html',\n    styleUrls: ['./change-sets.component.scss'],\n    standalone: true,\n    imports: [\n        MatExpansionModule,\n        MatButtonModule,\n        DatePipe,\n        MatMenuModule,\n        MatDialogModule,\n        MatPaginatorModule,\n        ChangeValuePipe\n    ]\n})\nexport class ChangeSetsComponent<EntityType extends ChangeSetEntity, ChangeSetService extends BaseChangeSetService> implements OnInit {\n    // eslint-disable-next-line jsdoc/require-jsdoc\n    ChangeSetType: typeof ChangeSetType = ChangeSetType;\n\n    // eslint-disable-next-line jsdoc/require-jsdoc\n    @ViewChild(MatPaginator)\n    paginator!: MatPaginator;\n\n    /**\n     * The entity for which the change sets should be displayed.\n     */\n    @Input()\n    set entity(value: EntityType) {\n        if (value == undefined) {\n            throw new Error('No \"entity\" has been provided.');\n        }\n        void this.updateEntity(value);\n    }\n    // eslint-disable-next-line jsdoc/require-jsdoc\n    internalEntity: EntityType = emptyEntity as EntityType;\n\n    /**\n     * The api base url for the change sets.\n     * This is passed to the rollbacks and reset methods, to handle different entities.\n     *\n     * By default these methods send a request to\n     * `${changeSetsApiBaseUrl}/${changeSet.id}/rollback` or `${changeSetsApiBaseUrl}/${changeSet.id}/reset`.\n     */\n    @Input()\n    changeSetsApiBaseUrl?: string;\n    // eslint-disable-next-line jsdoc/require-jsdoc\n    internalChangeSetsApiBaseUrl!: string;\n\n    /**\n     * Configuration options for the component.\n     *\n     * These override the ones set by the ChangeSetService.\n     */\n    @Input()\n    config?: Partial<ChangeSetsConfig>;\n    // eslint-disable-next-line jsdoc/require-jsdoc\n    internalConfig: ChangeSetsConfig = { ...this.changeSetService.configuration, ...this.config };\n\n    /**\n     * The change sets that should actually be displayed on the current pagination index.\n     */\n    filteredChangeSets: ChangeSet[] = [];\n\n    private pageSize: number = 10;\n\n    private createdByDisplayValues: KeyValue<string, string>[] = [];\n\n    constructor(\n        @Inject(NGX_CHANGE_SET_SERVICE)\n        private readonly changeSetService: ChangeSetService,\n        private readonly dialog: MatDialog\n    ) {}\n\n    ngOnInit(): void {\n        if (!this.changeSetsApiBaseUrl) {\n            throw new Error('No \"changeSetsApiBaseUrl\" has been provided.');\n        }\n        this.internalChangeSetsApiBaseUrl = this.changeSetsApiBaseUrl;\n        this.internalConfig = { ...this.changeSetService.configuration, ...this.config };\n    }\n\n    /**\n     * Whether or not the content of the <pre> element should be wrapped instead of displaying a scrollbar.\n     * @param value - The value to check.\n     * @returns True for empty arrays or arrays that don't have objects as item type. False for everything else.\n     */\n    shouldWrapPreContent(value: unknown): value is unknown[] {\n        return Array.isArray(value) && (!value.length || typeof value[0] != 'object');\n    }\n\n    /**\n     * Stops opening the expansion panel and then calls the openCreatedBy method when \"canOpenCreatedBy\" is enabled.\n     * @param event - The MouseEvent. Is needed to disable opening/closing of the expansion panel.\n     * @param changeSet - The change set for which createdBy should be opened.\n     */\n    async openCreatedBy(event: MouseEvent, changeSet: ChangeSet): Promise<void> {\n        event.stopPropagation();\n        const canOpenCreatedBy: boolean = this.resolveCanOpenCreatedBy(this.internalConfig.canOpenCreatedBy);\n        if (!canOpenCreatedBy) {\n            return;\n        }\n        await this.internalConfig.openCreatedBy(changeSet);\n    }\n\n    private resolveCanOpenCreatedBy(value: (boolean | (() => boolean))): boolean {\n        if (typeof value === 'boolean') {\n            return value;\n        }\n        return value();\n    }\n\n    /**\n     * Whether the reset and rollback actions are enabled or not.\n     * @returns True when either the specific configuration or the default config resolves to true.\n     */\n    canResetAndRollback(): boolean {\n        if (typeof this.internalConfig.canResetAndRollback === 'boolean') {\n            return this.internalConfig.canResetAndRollback;\n        }\n        return this.internalConfig.canResetAndRollback();\n    }\n\n    /**\n     * Resets the given change set using the method of the configuration.\n     * The result is then used to update the entity.\n     * @param changeSet - The change set to reset.\n     */\n    async resetChangeSet(changeSet: ChangeSet): Promise<void> {\n        const dialogRef: MatDialogRef<ConfirmDialogComponent, boolean> = this.dialog.open(ConfirmDialogComponent, {\n            data: this.internalConfig.resetConfirmDialogData,\n            autoFocus: false,\n            restoreFocus: false\n        });\n        const confirmResult: boolean | undefined = await firstValueFrom(dialogRef.afterClosed());\n        if (confirmResult === true) {\n            const entity: EntityType = await this.internalConfig.resetChangeSet(changeSet, this.internalChangeSetsApiBaseUrl) as EntityType;\n            await this.updateEntity(entity);\n            this.paginator.pageIndex = 0;\n        }\n    }\n\n    /**\n     * Rolls back to the given change set using the method of the configuration.\n     * The result is then used to update the entity.\n     * @param changeSet - The change set to rollback to.\n     */\n    async rollbackToChangeSet(changeSet: ChangeSet): Promise<void> {\n        const dialogRef: MatDialogRef<ConfirmDialogComponent, boolean> = this.dialog.open(ConfirmDialogComponent, {\n            data: this.internalConfig.rollbackConfirmDialogData,\n            autoFocus: false,\n            restoreFocus: false\n        });\n        const confirmResult: boolean | undefined = await firstValueFrom(dialogRef.afterClosed());\n        if (confirmResult === true) {\n            const updatedEntity: EntityType = await this.internalConfig.rollbackToChangeSet(\n                changeSet,\n                this.internalChangeSetsApiBaseUrl\n            ) as EntityType;\n            await this.updateEntity(updatedEntity);\n            this.paginator.pageIndex = 0;\n        }\n    }\n\n    /**\n     * Updates the entity and sorts the changesets descending by their creation date.\n     * @param updatedEntity - The new entity value.\n     */\n    private async updateEntity(updatedEntity: EntityType): Promise<void> {\n        updatedEntity.changeSets.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());\n        this.internalEntity = updatedEntity;\n        this.filteredChangeSets = this.internalEntity.changeSets.slice(0, this.pageSize);\n        this.createdByDisplayValues = await Promise.all(this.internalEntity.changeSets.map(async c => {\n            return {\n                key: c.id,\n                value: await this.internalConfig.getDisplayValueForCreatedBy(c)\n            };\n        }));\n    }\n\n    /**\n     * Filters the entities change sets with the pagination event.\n     * @param event - The event from the paginator.\n     */\n    filterChangeSets(event: PageEvent): void {\n        this.pageSize = event.pageSize;\n        const from: number = event.pageIndex * event.pageSize;\n        const until: number = (event.pageIndex * event.pageSize) + event.pageSize;\n        this.filteredChangeSets = this.internalEntity.changeSets.slice(from, until);\n    }\n\n    /**\n     * Gets the string to display for the created by value.\n     * This encapsulates the functionality of the async configuration function.\n     * @param changeSet - The change set to get the display value for.\n     * @returns The found display value of the local array or '...',\n     * indicating that the display value is still loading.\n     */\n    getDisplayValueForCreatedBy(changeSet: ChangeSet): string {\n        return this.createdByDisplayValues.find(v => v.key === changeSet.id)?.value ?? '...';\n    }\n}","<!-- eslint-disable angular/no-call-expression -->\n@for (changeSet of filteredChangeSets; track changeSet.id) {\n    <mat-expansion-panel>\n        <mat-expansion-panel-header>\n            <mat-panel-title>\n                <span class=\"title-operation\">\n                    <i class=\"fas\"\n                        [class.fa-circle-up]=\"changeSet.type === ChangeSetType.UPDATE || changeSet.type === ChangeSetType.REPLACE\"\n                        [class.fa-circle-plus]=\"changeSet.type === ChangeSetType.CREATE\"\n                        [class.fa-circle-minus]=\"changeSet.type === ChangeSetType.DELETE\"\n                        [class.fa-clock-rotate-left]=\"changeSet.type === ChangeSetType.RESTORE\"\n                        [class.fa-circle-left]=\"changeSet.type === ChangeSetType.RESET\"\n                    >\n                    </i>\n                    <span>{{internalConfig.getOperationName(changeSet)}}</span>\n                </span>\n                \n                <span class=\"title-created-at\">\n                    <i class=\"far fa-clock\"></i>\n                    <span class=\"date\">{{changeSet.createdAt | date: internalConfig.dateFormat}}</span>\n                    <span class=\"short-date\">{{changeSet.createdAt | date: internalConfig.shortDateFormat}}</span>\n                </span>\n    \n                @if (changeSet.createdBy || internalConfig.displayValueForEmptyCreatedBy) {\n                    <span class=\"title-created-by\"\n                        [class.created-by-link]=\"internalConfig.canOpenCreatedBy\"\n                        (click)=\"openCreatedBy($event, changeSet)\"\n                    >\n                        <i class=\"fas fa-user\"></i>\n                        <span>{{getDisplayValueForCreatedBy(changeSet)}}</span>\n                    </span>\n                }\n            </mat-panel-title>\n        </mat-expansion-panel-header>\n    \n        <div class=\"change-set-details\">\n            <span>\n                <div>\n                    <i class=\"far fa-clock\"></i>\n                    <span>{{changeSet.createdAt | date: internalConfig.dateFormat}}</span>\n                </div>\n                @if (changeSet.createdBy || internalConfig.displayValueForEmptyCreatedBy) {\n                    <span [class.created-by-link]=\"internalConfig.canOpenCreatedBy\" (click)=\"openCreatedBy($event, changeSet)\">\n                        <i class=\"fas fa-user\"></i>\n                        <span>{{getDisplayValueForCreatedBy(changeSet)}}</span>\n                    </span>\n                }\n            </span>\n            <button type=\"button\" mat-raised-button [disabled]=\"!canResetAndRollback()\" [matMenuTriggerFor]=\"menu\" (click)=\"$event.stopPropagation()\">\n                {{internalConfig.resetButtonLabel}} <i class=\"fas fa-arrow-rotate-left\"></i>\n            </button>\n            <mat-menu #menu=\"matMenu\">\n                <button type=\"button\" mat-menu-item [disabled]=\"changeSet.type === ChangeSetType.CREATE\" (click)=\"resetChangeSet(changeSet)\">{{internalConfig.resetSingleChangeSetLabel}}</button>\n                <button type=\"button\" mat-menu-item (click)=\"rollbackToChangeSet(changeSet)\">{{internalConfig.rollbackToChangeSetLabel}}</button>\n            </mat-menu>\n        </div>\n    \n        @if (changeSet.changes.length) {\n            <table>\n                <tr>\n                    <th class=\"change-key-header\">{{internalConfig.changeKeyLabel}}</th>\n                    <th class=\"change-previous-value-header\">{{internalConfig.previousValueLabel}}</th>\n                    <th class=\"change-arrow-header\"></th>\n                    <th class=\"change-new-value-header\">{{internalConfig.newValueLabel}}</th>\n                </tr>\n                @for (change of changeSet.changes; track $index) {\n                    <tr>\n                        <td colspan=\"2\" class=\"change-key-header-mobile\">{{change.key}}</td>\n                    </tr>              \n                    <tr>\n                        <td class=\"change-key\">{{change.key}}</td>\n                        <td class=\"change-previous-value\">\n                            <div class=\"change-value-field\">\n                                <pre [class.wrap]=\"shouldWrapPreContent(change.previousValue)\" [class.no-wrap]=\"!shouldWrapPreContent(change.previousValue)\">{{change.previousValue | changeValue: internalConfig.valueDateFormat}}</pre>\n                            </div>\n                        </td>\n                        <td class=\"change-arrow\"><i class=\"fas fa-arrow-right-long\"></i></td>\n                        <td class=\"change-new-value\">\n                            <div class=\"change-value-field\">\n                                <pre [class.wrap]=\"shouldWrapPreContent(change.newValue)\" [class.no-wrap]=\"!shouldWrapPreContent(change.newValue)\">{{change.newValue | changeValue: internalConfig.valueDateFormat}}</pre>\n                            </div>\n                        </td>\n                    </tr>\n                }\n            </table>\n        }    \n    </mat-expansion-panel>\n}\n\n<mat-paginator [length]=\"internalEntity.changeSets.length\"\n    [pageSize]=\"10\"\n    [pageSizeOptions]=\"[5, 10, 25, 50, 100]\"\n    (page)=\"filterChangeSets($event)\"\n>\n</mat-paginator>","/*\n * Public API Surface of ngx-material-change-sets\n */\nexport * from './components';\nexport * from './models';\nexport * from './pipes';\nexport * from './services';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2","i3"],"mappings":"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"}