@using Humanizer @using StardewModdingAPI.Web.Framework @using StardewModdingAPI.Web.ViewModels.JsonValidator @model JsonValidatorModel @{ // get view data string curPageUrl = this.Url.PlainAction("Index", "JsonValidator", new { schemaName = Model!.SchemaName, id = Model.PasteID }, absoluteUrl: true)!; string newUploadUrl = this.Url.PlainAction("Index", "JsonValidator", new { schemaName = Model.SchemaName })!; string? schemaDisplayName = null; bool isValidSchema = Model.SchemaName != null && Model.SchemaFormats.TryGetValue(Model.SchemaName, out schemaDisplayName) && schemaDisplayName.ToLower() != "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/file-upload.css?r=202002" /> <link rel="stylesheet" href="~/Content/css/json-validator.css?r=202002" /> <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.5.1" 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/file-upload.js?r=202002"></script> <script src="~/Content/js/json-validator.js?r=202002"></script> <script> $(function() { smapi.jsonValidator(@this.ForJson(this.Url.PlainAction("Index", "JsonValidator", new { schemaName = "$schemaName", id = "$id" })), @this.ForJson(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.IsEditView && 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> } @* save warnings *@ @if (Model.UploadWarning != null || Model.Expiry != null) { <div class="save-metadata" v-pre> @if (Model.Expiry != null) { <text>This JSON file will expire in @((DateTime.UtcNow - Model.Expiry.Value).Humanize()) (<a href="@(this.Url.PlainAction("Index", "JsonValidator", new { schemaName = this.Model.SchemaName, id = this.Model.PasteID, operation = "renew" }))">renew</a>).</text> } <!--@Model.UploadWarning--> </div> } @* upload new file *@ @if (Model.IsEditView) { <h2>Upload a JSON file</h2> <form action="@this.Url.PlainAction("PostAsync", "JsonValidator")" method="post"> <input id="inputFile" type="file" /> <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 <small>(or <a href="#" id="choose-file-link">choose a file</a>)</small>:<br /> <textarea id="input" name="Content" placeholder="paste file here">@Model.Content</textarea> </li> <li> Click this button:<br /> <input type="submit" id="submit" value="save & validate file" /> </li> </ol> </form> } @* validation results *@ @if (!Model.IsEditView) { <div id="output"> @if (Model.UploadError == null) { <h2>Validation</h2> <p> @(Model.Errors.Any() ? "Oops, found some issues with your JSON." : "No errors found!") @if (!isValidSchema) { <text>(You have no schema selected, so only the basic JSON syntax was checked.)</text> } else if (Model.FormatUrl != null) { <text>See <a href="@Model.FormatUrl">format documentation</a> for more info.</text> } </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> } } <h2>Content</h2> <div> You can 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>) or <a href="@(this.Url.PlainAction("Index", "JsonValidator", new { id = this.Model.PasteID, schemaName = this.Model.SchemaName, operation = "edit" }))">edit this file</a>. </div> <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> }