summaryrefslogtreecommitdiff
path: root/src/SMAPI.Web/Views/JsonValidator/Index.cshtml
blob: 34c1c1f3c6ff41b722d4d68abe92e28baab7e6c1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
@using StardewModdingAPI.Web.ViewModels.JsonValidator
@model JsonValidatorModel

@{
    ViewData["Title"] = "JSON validator";

    string curPageUrl = new Uri(new Uri(Model.SectionUrl), $"{Model.SchemaName}/{Model.PasteID}").ToString();
    string newUploadUrl = Model.SchemaName != null
        ? new Uri(new Uri(Model.SectionUrl), Model.SchemaName).ToString()
        : Model.SectionUrl;
}

@section Head {
    @if (Model.PasteID != null)
    {
        <meta name="robots" content="noindex" />
    }
    <link rel="stylesheet" href="~/Content/css/json-validator.css" />
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/tmont/sunlight@1.22.0/src/themes/sunlight.default.min.css" />

    <script src="https://cdn.jsdelivr.net/npm/jquery@3.3.1/dist/jquery.min.js" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/gh/tmont/sunlight@1.22.0/src/sunlight.min.js" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/gh/tmont/sunlight@1.22.0/src/plugins/sunlight-plugin.linenumbers.min.js" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/gh/tmont/sunlight@1.22.0/src/lang/sunlight.javascript.min.js" crossorigin="anonymous"></script>
    <script src="~/Content/js/json-validator.js"></script>
    <script>
        $(function () {
            smapi.jsonValidator(@Json.Serialize(Model.SectionUrl), @Json.Serialize(Model.PasteID));
        });
    </script>
}

@* upload result banner *@
@if (Model.UploadError != null)
{
    <div class="banner error">
        <strong>Oops, the server ran into trouble saving that file.</strong><br />
        <small>Error details: @Model.UploadError</small>
    </div>
}
else if (Model.ParseError != null)
{
    <div class="banner error">
        <strong>Oops, couldn't parse that JSON.</strong><br />
        Share this link to let someone see this page: <code>@curPageUrl</code><br />
        (Or <a href="@newUploadUrl">validate a new file</a>.)<br />
        <br />
        <small v-pre>Error details: @Model.ParseError</small>
    </div>
}
else if (Model.PasteID != null)
{
    <div class="banner success">
        <strong>Share this link to let someone else see this page:</strong> <code>@curPageUrl</code><br />
        (Or <a href="@newUploadUrl">validate a new file</a>.)
    </div>
}

@* upload new file *@
@if (Model.Content == null)
{
    <h2>Upload a JSON file</h2>
    <form action="@Model.SectionUrl" method="post">
        <ol>
            <li>
                Choose the JSON format:<br />
                <select id="format" name="SchemaName">
                    @foreach (var pair in Model.SchemaFormats)
                    {
                        <option value="@pair.Key" selected="@(Model.SchemaName == pair.Key)">@pair.Value</option>
                    }
                </select>
            </li>
            <li>
                Drag the file onto this textbox (or paste the text in):<br />
                <textarea id="input" name="Content" placeholder="paste file here"></textarea>
            </li>
            <li>
                Click this button:<br />
                <input type="submit" id="submit" value="save & validate file" />
            </li>
        </ol>
    </form>
}

@* validation results *@
@if (Model.Content != null)
{
    <div id="output">
        @if (Model.UploadError == null)
        {
            <div>
                Change JSON format:
                <select id="format" name="format">
                    @foreach (var pair in Model.SchemaFormats)
                    {
                        <option value="@pair.Key" selected="@(Model.SchemaName == pair.Key)">@pair.Value</option>
                    }
                </select>
            </div>

            <h2>Validation errors</h2>
            @if (Model.FormatUrl != null)
            {
                <p>See <a href="@Model.FormatUrl">format documentation</a>.</p>
            }

            @if (Model.Errors.Any())
            {
                <table id="metadata" class="table">
                    <tr>
                        <th>Line</th>
                        <th>Field</th>
                        <th>Error</th>
                    </tr>

                    @foreach (JsonValidatorErrorModel error in Model.Errors)
                    {
                        <tr data-schema-error="@error.SchemaErrorType">
                            <td><a href="#L@(error.Line)">@error.Line</a></td>
                            <td>@error.Path</td>
                            <td>@error.Message</td>
                        </tr>
                    }
                </table>
            }
            else
            {
                <p>No errors found.</p>
            }
        }

        <h2>Raw content</h2>
        <pre id="raw-content" class="sunlight-highlight-javascript">@Model.Content</pre>
    </div>
}