Felix-CodingClimber / DotNetElements

Opinionated framework to build .NET applications fast while focusing more on the final product and less on writing low level code.
MIT License
2 stars 1 forks source link

Finished minimal implementation for DiffViewer #13

Closed FelixCCWork closed 5 months ago

FelixCCWork commented 5 months ago
@using DotNetElements.Core.StringDiff

@if (Diff?.OldText.HasDifferences is true || Diff?.NewText.HasDifferences is true)
{
    <table cellpadding="0" cellspacing="0">

        @foreach ((DiffPiece oldPiece, DiffPiece newPiece) in Diff.OldText.Lines.Zip(Diff.NewText.Lines))
        {
            <tr style="@(oldPiece.Type is ChangeType.Unchanged ? "" : "background-color: #FDF2D0;")">
                <td>
                    @(oldPiece.Position?.ToString() ?? newPiece.Position?.ToString() ?? "");
                </td>
                <td style="padding-left: 16px;">
                    @if (oldPiece.Type is ChangeType.Unchanged)
                    {
                        <span style="@GetDiffStyle(oldPiece)">
                            @oldPiece.Text
                        </span>
                    }
                    else
                    {
                        @if (oldPiece.SubPieces.Count > 0)
                        {
                            @foreach (DiffPiece oldSubPiece in oldPiece.SubPieces)
                            {
                                <span style="@GetDiffStyle(oldSubPiece)">
                                    @oldSubPiece.Text
                                </span>
                            }
                        }
                        else
                        {
                            <span style="@GetDiffStyle(oldPiece)">
                                @oldPiece.Text
                            </span>
                        }
                    }
                </td>
            </tr>

            @if (newPiece.Type is not ChangeType.Unchanged)
            {
                <tr style="background-color: #DDEEDD">
                    <td>
                        @(newPiece.Position?.ToString() ?? "");
                    </td>
                    <td style="padding-left: 16px;">
                        @if (newPiece.SubPieces.Count > 0)
                        {
                            @foreach (DiffPiece newSubPiece in newPiece.SubPieces)
                            {
                                <span style="@GetDiffStyle(newSubPiece)">
                                    @newSubPiece.Text
                                </span>
                            }
                        }
                        else
                        {
                            <span style="@GetDiffStyle(newPiece)">
                                @newPiece.Text
                            </span>
                        }
                    </td>
                </tr>
            }
        }
    </table>
}
else
{
    <span>No differences found</span>
}

@code
{
    [Parameter, EditorRequired]
    public SideBySideDiffModel Diff { get; set; } = default!;

    // todo tmp
    private string GetDiffStyle(DiffPiece diffLine)
    {
        return diffLine.Type switch
        {
            ChangeType.Unchanged => "",
            ChangeType.Deleted => "background-color: #FFB6BA; border-radius: 10%; line-height: 1.5rem; padding: 1px 2px;",
            ChangeType.Inserted => "background-color: #97F295; border-radius: 10%; line-height: 1.5rem; padding: 1px 2px;",
            ChangeType.Imaginary => "background-color: #F8FAFD; border-radius: 10%; line-height: 1.5rem; padding: 1px 2px;",
            ChangeType.Modified => "background-color: #FFB6BA; border-radius: 10%; line-height: 1.5rem; padding: 1px 2px;",
            _ => throw new NotImplementedException(nameof(diffLine.Type)),
        };
    }
}
Felix-CodingClimber commented 5 months ago

Implemented