summaryrefslogtreecommitdiff
path: root/src/SMAPI.Web/Views/JsonValidator/Index.cshtml
diff options
context:
space:
mode:
Diffstat (limited to 'src/SMAPI.Web/Views/JsonValidator/Index.cshtml')
-rw-r--r--src/SMAPI.Web/Views/JsonValidator/Index.cshtml151
1 files changed, 151 insertions, 0 deletions
diff --git a/src/SMAPI.Web/Views/JsonValidator/Index.cshtml b/src/SMAPI.Web/Views/JsonValidator/Index.cshtml
new file mode 100644
index 00000000..3143fad9
--- /dev/null
+++ b/src/SMAPI.Web/Views/JsonValidator/Index.cshtml
@@ -0,0 +1,151 @@
+@using StardewModdingAPI.Web.ViewModels.JsonValidator
+@model JsonValidatorModel
+
+@{
+ // get view data
+ 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;
+ string schemaDisplayName = null;
+ bool isValidSchema = Model.SchemaName != null && Model.SchemaFormats.TryGetValue(Model.SchemaName, out schemaDisplayName) && schemaDisplayName != "None";
+
+ // build title
+ ViewData["Title"] = "JSON validator";
+ @if (Model.PasteID != null)
+ {
+ ViewData["ViewTitle"] = ViewData["Title"];
+ ViewData["Title"] +=
+ " ("
+ + string.Join(", ", new[] { isValidSchema ? schemaDisplayName : null, Model.PasteID }.Where(p => p != null))
+ + ")";
+ }
+}
+
+@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>Content</h2>
+ <pre id="raw-content" class="sunlight-highlight-javascript">@Model.Content</pre>
+
+ @if (isValidSchema)
+ {
+ <p class="footer-tip">(Tip: you can <a href="https://github.com/Pathoschild/SMAPI/blob/develop/docs/technical/web.md#using-a-schema-file-directly">validate directly in your text editor</a> if it supports JSON Schema.)</p>
+ }
+ </div>
+}