ts support, public api support
This commit is contained in:
7
.gitignore
vendored
7
.gitignore
vendored
@@ -7,6 +7,7 @@
|
|||||||
__notes__
|
__notes__
|
||||||
*.env
|
*.env
|
||||||
UnbinderSandbox
|
UnbinderSandbox
|
||||||
|
package-lock.json
|
||||||
|
|
||||||
# Files for/generated by Docker Compose
|
# Files for/generated by Docker Compose
|
||||||
secrets
|
secrets
|
||||||
@@ -44,8 +45,8 @@ bld/
|
|||||||
|
|
||||||
# Visual Studio 2015/2017 cache/options directory
|
# Visual Studio 2015/2017 cache/options directory
|
||||||
.vs/
|
.vs/
|
||||||
# Uncomment if you have tasks that create the project's static files in wwwroot
|
wwwroot/lib/
|
||||||
wwwroot/
|
wwwroot/js/
|
||||||
|
|
||||||
# Visual Studio 2017 auto generated files
|
# Visual Studio 2017 auto generated files
|
||||||
Generated\ Files/
|
Generated\ Files/
|
||||||
@@ -370,3 +371,5 @@ MigrationBackup/
|
|||||||
|
|
||||||
# Fody - auto-generated XML schema
|
# Fody - auto-generated XML schema
|
||||||
FodyWeavers.xsd
|
FodyWeavers.xsd
|
||||||
|
/Unbinder/wwwroot/lib
|
||||||
|
/Unbinder/wwwroot/js
|
||||||
|
|||||||
@@ -1 +1,3 @@
|
|||||||
__notes__
|
__notes__
|
||||||
|
db_data
|
||||||
|
.eslintrc.js
|
||||||
|
|||||||
5
Unbinder/.eslintrc.js
Normal file
5
Unbinder/.eslintrc.js
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
module.exports = {
|
||||||
|
extends: [
|
||||||
|
'semistandard'
|
||||||
|
]
|
||||||
|
};
|
||||||
19
Unbinder/Controllers/Api/IngredientApiController.cs
Normal file
19
Unbinder/Controllers/Api/IngredientApiController.cs
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using Unbinder.Repositories;
|
||||||
|
|
||||||
|
namespace Unbinder.Controllers.Api
|
||||||
|
{
|
||||||
|
[ApiController]
|
||||||
|
public class IngredientApiController(IIngredientRepository repository) : ControllerBase
|
||||||
|
{
|
||||||
|
private readonly IIngredientRepository _repository = repository;
|
||||||
|
|
||||||
|
[HttpGet]
|
||||||
|
[Route("/api/ingredients")]
|
||||||
|
public IActionResult GetAll()
|
||||||
|
{
|
||||||
|
var result = _repository.GetAll;
|
||||||
|
return result == null ? NotFound() : Ok(result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -32,6 +32,7 @@ builder.Services.AddDbContext<UnbinderDbContext>(options =>
|
|||||||
|
|
||||||
// configure MVC
|
// configure MVC
|
||||||
builder.Services.AddControllersWithViews();
|
builder.Services.AddControllersWithViews();
|
||||||
|
builder.Services.AddControllers(); // map additional controllers for exposed REST API routes
|
||||||
builder.Services.AddRazorPages();
|
builder.Services.AddRazorPages();
|
||||||
|
|
||||||
builder.Services.AddCors(options =>
|
builder.Services.AddCors(options =>
|
||||||
|
|||||||
@@ -21,12 +21,15 @@
|
|||||||
<PackageReference Include="Microsoft.Identity.Web" Version="2.15.3" />
|
<PackageReference Include="Microsoft.Identity.Web" Version="2.15.3" />
|
||||||
<PackageReference Include="Microsoft.Identity.Web.UI" Version="2.15.3" />
|
<PackageReference Include="Microsoft.Identity.Web.UI" Version="2.15.3" />
|
||||||
<PackageReference Include="Microsoft.SqlServer.Server" Version="1.0.0" />
|
<PackageReference Include="Microsoft.SqlServer.Server" Version="1.0.0" />
|
||||||
|
<PackageReference Include="Microsoft.TypeScript.MSBuild" Version="5.3.2">
|
||||||
|
<PrivateAssets>all</PrivateAssets>
|
||||||
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
|
</PackageReference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Folder Include="DB\SQL\" />
|
<Folder Include="DB\SQL\" />
|
||||||
<Folder Include="secrets\" />
|
<Folder Include="secrets\" />
|
||||||
<Folder Include="TagHelpers\" />
|
|
||||||
<Folder Include="__notes__\" />
|
<Folder Include="__notes__\" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
|||||||
@@ -28,6 +28,12 @@
|
|||||||
<textarea class="w-5/6 text-black" asp-for="RecipeText"></textarea>
|
<textarea class="w-5/6 text-black" asp-for="RecipeText"></textarea>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div id="ingredient-section">
|
||||||
|
<option id="ingredient-selector"></option>
|
||||||
|
</div>
|
||||||
|
|
||||||
<button type="submit">Publish Recipe</button>
|
<button type="submit">Publish Recipe</button>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
|
<script src="~/js/createRecipe.js"></script>
|
||||||
@@ -33,12 +33,12 @@
|
|||||||
message.innerHTML = query ? `Viewing ${@Model.ToArray().Length} results for: ${query}` : "Enter a new search term below:";
|
message.innerHTML = query ? `Viewing ${@Model.ToArray().Length} results for: ${query}` : "Enter a new search term below:";
|
||||||
|
|
||||||
// handle search updates on client side
|
// handle search updates on client side
|
||||||
searchButton.onclick = async () => {
|
searchButton.onclick = () => {
|
||||||
const newResult = await fetch(`/api/recipe/search?q=${textField.value}`);
|
// const newResult = await fetch(`/api/recipe/search?q=${textField.value}`);
|
||||||
|
|
||||||
console.log(newResult);
|
// console.log(newResult);
|
||||||
|
|
||||||
const newResultJson = await newResult.json();
|
// const newResultJson = await newResult.json();
|
||||||
window.location.search = `?q=${textField.value}`;
|
window.location.search = `?q=${textField.value}`;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -2,8 +2,10 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta name="viewport" content="width=device-width" />
|
<meta name="viewport" content="width=device-width" />
|
||||||
<title>@ViewBag.Title</title>
|
<title>@ViewBag.Title</title>
|
||||||
|
<script type="text/javascript">var exports = {};</script>
|
||||||
<script src="~/js/site.js"></script>
|
<script src="~/js/site.js"></script>
|
||||||
<script src="https://cdn.tailwindcss.com"></script>
|
<script src="https://cdn.tailwindcss.com"></script>
|
||||||
|
<script src="~/lib/pdf.js/pdf.min.mjs"></script>
|
||||||
<link href="~/css/site.css" rel="stylesheet" />
|
<link href="~/css/site.css" rel="stylesheet" />
|
||||||
<base href="/" />
|
<base href="/" />
|
||||||
</head>
|
</head>
|
||||||
|
|||||||
@@ -1,5 +1,10 @@
|
|||||||
{
|
{
|
||||||
"version": "1.0",
|
"version": "1.0",
|
||||||
"defaultProvider": "cdnjs",
|
"defaultProvider": "cdnjs",
|
||||||
"libraries": []
|
"libraries": [
|
||||||
|
{
|
||||||
|
"library": "pdf.js@4.0.269",
|
||||||
|
"destination": "wwwroot/lib/pdf.js/"
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
21
Unbinder/package.json
Normal file
21
Unbinder/package.json
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"name": "unbinder",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "",
|
||||||
|
"main": "wwwroot/js/index.js",
|
||||||
|
"scripts": {
|
||||||
|
"build": "tsc",
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"author": "Mikayla Dobson",
|
||||||
|
"license": "ISC",
|
||||||
|
"devDependencies": {
|
||||||
|
"eslint": "^8.55.0",
|
||||||
|
"eslint-config-semistandard": "^17.0.0",
|
||||||
|
"eslint-config-standard": "^17.1.0",
|
||||||
|
"eslint-plugin-import": "^2.29.0",
|
||||||
|
"eslint-plugin-n": "^15.7.0",
|
||||||
|
"eslint-plugin-promise": "^6.1.1",
|
||||||
|
"typescript": "^5.3.2"
|
||||||
|
}
|
||||||
|
}
|
||||||
21
Unbinder/tsconfig.json
Normal file
21
Unbinder/tsconfig.json
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"compileOnSave": true,
|
||||||
|
"compilerOptions": {
|
||||||
|
"noImplicitAny": false,
|
||||||
|
"noEmitOnError": true,
|
||||||
|
"removeComments": false,
|
||||||
|
"sourceMap": true,
|
||||||
|
"lib": ["ES2015", "DOM"],
|
||||||
|
"module": "CommonJS",
|
||||||
|
"target": "ES5",
|
||||||
|
"moduleResolution": "Node",
|
||||||
|
"outDir": "wwwroot/js"
|
||||||
|
},
|
||||||
|
"include": [
|
||||||
|
"wwwroot/ts/**/*"
|
||||||
|
],
|
||||||
|
"exclude": [
|
||||||
|
"node_modules",
|
||||||
|
"wwwroot/js"
|
||||||
|
]
|
||||||
|
}
|
||||||
18
Unbinder/wwwroot/css/site.css
Normal file
18
Unbinder/wwwroot/css/site.css
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
html {
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (min-width: 768px) {
|
||||||
|
html {
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
html {
|
||||||
|
position: relative;
|
||||||
|
min-height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
margin-bottom: 60px;
|
||||||
|
}
|
||||||
BIN
Unbinder/wwwroot/favicon.ico
Normal file
BIN
Unbinder/wwwroot/favicon.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 5.3 KiB |
18
Unbinder/wwwroot/ts/createRecipe.ts
Normal file
18
Unbinder/wwwroot/ts/createRecipe.ts
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
export async function getAllIngredients () {
|
||||||
|
const ingredients = await fetch('/api/ingredients');
|
||||||
|
return await ingredients.json();
|
||||||
|
}
|
||||||
|
|
||||||
|
document.addEventListener('DOMContentLoaded', async () => {
|
||||||
|
const ingredients = await getAllIngredients();
|
||||||
|
console.log({ ingredients });
|
||||||
|
|
||||||
|
const dropdown = document.getElementById('ingredient-selector');
|
||||||
|
|
||||||
|
ingredients.forEach(ingredient => {
|
||||||
|
const option = document.createElement('option');
|
||||||
|
option.value = ingredient.id;
|
||||||
|
option.innerText = ingredient.name;
|
||||||
|
dropdown.appendChild(option);
|
||||||
|
});
|
||||||
|
});
|
||||||
0
Unbinder/wwwroot/ts/index.ts
Normal file
0
Unbinder/wwwroot/ts/index.ts
Normal file
Reference in New Issue
Block a user