Get far on package manager

This commit is contained in:
2025-04-29 05:05:34 -05:00
parent 53c027ef63
commit 4c32bd9b99
21 changed files with 1176 additions and 0 deletions

View File

@@ -0,0 +1,27 @@
func Pages.CheckEmail()
{
var pages = [
{
active = false,
route = "/packages",
text = "Packages"
},
{
active = false,
route = "/upload",
text = "Upload"
},
{
active = false,
route = "/login",
text = "Login"
}
];
var html = <div class={"container"}>
<h1>Please check your email.</h1>
<p>
The email may or may not be in your spam.
</p>
</div>;
return Shell("Check your email",pages,html);
}

View File

@@ -0,0 +1,38 @@
func Pages.Index()
{
var pages = [
{
active = false,
route = "/packages",
text = "Packages"
},
{
active = false,
route = "/upload",
text = "Upload"
},
{
active = false,
route = "/login",
text = "Login"
}
];
var html = <article><h1 class={"display-5"} style={"text-align: center;"}>Make crosslang development faster and more convenient with CPKG</h1><form action={"./packages"} method={"get"}><div class={"container text-center"}><div class={"row"}><div class={"col"}>
</div>
<div class={"col-6"}>
<div class={"input-group mb-3"}>
<input type={"search"} name={"q"} class={"form-control"} placeholder={"Search for packages..."} aria-label={"Search for packages..."} aria-describedby={"button-search"}>
<button class={"btn btn-outline-secondary"} type={"submit"} id={"button-search"}>Search</button>
</div>
</div>
<div class={"col"}>
</div>
</div>
</div>
</form>
</article>;
return Shell("Main Page",pages,html);
}

View File

@@ -0,0 +1,36 @@
func Pages.Login()
{
var pages = [
{
active = false,
route = "/packages",
text = "Packages"
},
{
active = false,
route = "/upload",
text = "Upload"
},
{
active = true,
route = "/login",
text = "Login"
}
];
var html = <div class={"container min-vh-100 d-flex justify-content-center align-items-center"}>
<form action={"./login"} method={"post"} enctype={"application/x-www-form-urlencoded"}>
<div class={"mb-3"}>
<label for={"email"} class={"form-label"}>Email address</label>
<input type={"email"} class={"form-control"} id={"email"} name={"email"} aria-describedby={"emailHelp"}>
<div id={"emailHelp"} class={"form-text"}>{"We'll"} never share your email with anyone else.</div>
</div>
<div class={"mb-3"}>
<label for={"password"} class={"form-label"}>Password</label>
<input type={"password"} class={"form-control"} name={"password"} id={"password"}>
</div>
<a href={"./signup"}>Sign up</a>
<button type={"submit"} class={"btn btn-primary"}>Login</button>
</form>
</div>;
return Shell("Login",pages,html);
}

View File

@@ -0,0 +1,157 @@
func Pages.Package(name)
{
var package = DB.GetPackageVersions(name);
var pages = [
{
active = false,
route = "/packages",
text = "Packages"
},
{
active = false,
route = "/upload",
text = "Upload"
},
{
active = false,
route = "/login",
text = "Login"
}
];
var html = <if(package.Length > 0)><section class={"container"}>
<br>
<img width={"64"} height={"64"} src={$"./api/v1/package_icon.png?name={Net.Http.UrlEncode(name)}&version={Net.Http.UrlEncode(package[0].version)}"} alt={"icon"}>
<h1>{name}</h1>
</section>
<section class={"container"}>
<h2>To install</h2>
<ul class={"nav nav-tabs"} id={"myTab"} role={"tablist"}>
<li class={"nav-item"} role={"presentation"}>
<button class={"nav-link active"} id={"home-tab"} data-bs-toggle={"tab"} data-bs-target={"#home-tab-pane"} type={"button"} role={"tab"} aria-controls={"home-tab-pane"} aria-selected={"true"}>CLI</button>
</li>
<li class={"nav-item"} role={"presentation"}>
<button class={"nav-link"} id={"profile-tab"} data-bs-toggle={"tab"} data-bs-target={"#profile-tab-pane"} type={"button"} role={"tab"} aria-controls={"profile-tab-pane"} aria-selected={"false"}>cross.json</button>
</li>
</ul>
<div class={"tab-content"} id={"myTabContent"}>
<div class={"tab-pane fade show active"} id={"home-tab-pane"} role={"tabpanel"} aria-labelledby={"home-tab"} tabindex={"0"}><div class={"card"}>
<div class={"card-body"}>
<if(package[0].type == "lib" || package[0].type == "compile_tool")>
crosslang add-dependency {name}
</if>
</div>
</div>
</div>
<div class={"tab-pane fade"} id={"profile-tab-pane"} role={"tabpanel"} aria-labelledby={"profile-tab"} tabindex={"0"}><div class={"card"}>
<div class={"card-body"}>
{Json.Encode({name=name,version = package[0].version })}
</div>
</div>
</div>
</div>
<br>
<h3>More options and info</h3>
<ul>
<li>Account: <a href={$"./account?name={Net.Http.UrlEncode(package[0].accountName)}"}>{package[0].accountName}</a></li>
<if(package[0].maintainer.Length > 0)>
<li>Maintainer: {package[0].maintainer}</li>
</if>
<if(package[0].license.Length > 0)>
<li>License: {package[0].license}</li>
</if>
<if(package[0].homepage.Length > 0)>
<li>Homepage: <a href={package[0].homepage}>{package[0].homepage}</a></li>
</if>
<if(package[0].repo.Length > 0)>
<li>Repo: <a href={package[0].repo}>{package[0].repo}</a></li>
</if>
<li>Last updated: {package[0].uploadDate}</li>
<li>Latest version: {package[0].version}</li>
<li>Type: {package[0].type}</li>
<li><a href={package[0].download}>Download</a></li>
</ul>
<if(package.Length > 1)>
<br>
<h3>Older versions</h3>
<div class={"accordion accordion-flush"} id={"accordionFlushExample"}>
<for(var i=1; i<package.Length; i++)>
<div class={"accordion-item"}>
<h2 class={"accordion-header"}>
<button class={"accordion-button collapsed"} type={"button"} data-bs-toggle={"collapse"} data-bs-target={$"#collapse-{Net.Http.HtmlEncode(package[i].version)}"} aria-expanded={"false"} aria-controls={"flush-collapseOne"}>
{package[i].version}
</button>
</h2>
<div id={$"collapse-{Net.Http.HtmlEncode(package[i].version)}"} class={"accordion-collapse collapse"} data-bs-parent={"#accordionFlushExample"}>
<div class={"accordion-body"}>
<ul>
<if(package[i].maintainer.Length > 0)>
<li>Maintainer: {package[i].maintainer}</li>
</if>
<if(package[i].license.Length > 0)>
<li>License: {package[i].license}</li>
</if>
<if(package[i].homepage.Length > 0)>
<li>Homepage: <a href={package[i].homepage}>{package[i].homepage}</a></li>
</if>
<if(package[i].repo.Length > 0)>
<li>Repo: <a href={package[i].repo}>{package[i].repo}</a></li>
</if>
<li>Uploaded: {package[i].uploadDate}</li>
<li>Type: {package[i].type}</li>
<li><a href={package[i].download}>Download</a></li>
</ul>
</div>
</div>
</div>
</for>
</div>
</if>
</section>
</if>;
return Shell($"Package {name}", pages,html);
}
/*
<section class="container">
<br>
<img width="64" height="64" src="https://api.nuget.org/v3-flatcontainer/newtonsoft.json/13.0.3/icon" alt="icon">
<h1>Package</h1>
</section>
<section class="container">
<h2>To install:</h2>
<ul class="nav nav-tabs" id="myTab" role="tablist">
<li class="nav-item" role="presentation">
<button class="nav-link active" id="home-tab" data-bs-toggle="tab" data-bs-target="#home-tab-pane" type="button" role="tab" aria-controls="home-tab-pane" aria-selected="true">CLI</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" id="profile-tab" data-bs-toggle="tab" data-bs-target="#profile-tab-pane" type="button" role="tab" aria-controls="profile-tab-pane" aria-selected="false">cross.json</button>
</li>
</ul>
<div class="tab-content" id="myTabContent">
<div class="tab-pane fade show active" id="home-tab-pane" role="tabpanel" aria-labelledby="home-tab" tabindex="0"><div class="card">
<div class="card-body">
crosslang add Package
</div>
</div>
</div>
<div class="tab-pane fade" id="profile-tab-pane" role="tabpanel" aria-labelledby="profile-tab" tabindex="0"><div class="card">
<div class="card-body">
{"name": "Package","Version": "1.0.0.0-prod"}
</div>
</div>
</div>
</div>
</section>
*/

View File

@@ -0,0 +1,46 @@
func Pages.Packages(ctx)
{
var q = ctx.QueryParams.TryGetFirst("q");
if(TypeOf(q) != "String") q = "";
var pages = [
{
active = true,
route = "/packages",
text = "Packages"
},
{
active = false,
route = "/upload",
text = "Upload"
},
{
active = false,
route = "/login",
text = "Login"
}
];
var html = <article><form action={"./packages"} method={"get"}><div class={"container text-center"}><div class={"row"}><div class={"col"}>
</div>
<div class={"col-6"}>
<div class={"input-group mb-3"}>
<input type={"search"} name={"q"} class={"form-control"} placeholder={"Search for packages..."} aria-label={"Search for packages..."} aria-describedby={"button-search"} value={q}>
<button class={"btn btn-outline-secondary"} type={"submit"} id={"button-search"}>Search</button>
</div>
</div>
<div class={"col"}>
</div>
</div>
</div>
</form>
</article>
+
<ul>
<each(var item : DB.QueryPackages(q,0,20))>
<raw(Components.Package(item.packageName,item.version,item.accountName,item.uploadDate,item.description))>
</each>
</ul>;
return Shell("Packages",pages,html);
}

View File

@@ -0,0 +1,44 @@
func Pages.Signup()
{
var pages = [
{
active = false,
route = "/packages",
text = "Packages"
},
{
active = false,
route = "/upload",
text = "Upload"
},
{
active = false,
route = "/login",
text = "Login"
}
];
var html = <div class={"container min-vh-100 d-flex justify-content-center align-items-center"}>
<form action={"./signup"} method={"post"} enctype={"application/x-www-form-urlencoded"}>
<div class={"mb-3"}>
<label for={"email"} class={"form-label"}>Email address</label>
<input type={"email"} class={"form-control"} id={"email"} aria-describedby={"emailHelp"} name={"email"}>
<div id={"emailHelp"} class={"form-text"}>{"We'll"} never share your email with anyone else.</div>
</div>
<div class={"mb-3"}>
<label for={"displayName"} class={"form-label"}>Display Name</label>
<input type={"text"} class={"form-control"} id={"displayName"} name={"displayName"}>
</div>
<div class={"mb-3"}>
<label for={"password"} class={"form-label"}>Password</label>
<input type={"password"} class={"form-control"} id={"password"} name={"password"}>
</div>
<div class={"mb-3"}>
<label for={"passwordconfirm"} class={"form-label"}>Confirm Password</label>
<input type={"password"} class={"form-control"} id={"passwordconfirm"} name={"passwordconfirm"}>
</div>
<a href={"./login"}>Login</a>
<button type={"submit"} class={"btn btn-primary"}>Sign Up</button>
</form>
</div>;
return Shell("Signup", pages, html);
}

View File

@@ -0,0 +1,29 @@
func Pages.Upload(ctx)
{
var pages = [
{
active = false,
route = "/packages",
text = "Packages"
},
{
active = true,
route = "/upload",
text = "Upload"
},
{
active = false,
route = "/login",
text = "Login"
}
];
var html = <div class={"container min-vh-100 d-flex justify-content-center align-items-center"}>
<form action={"./upload"} method={"post"} enctype={"multipart/form-data"}>
<h1>Upload Package</h1>
<input type={"file"} class={"form-control"} name={"package"} accept={".crvm"}>
<button type={"submit"} class={"btn btn-primary"}>Upload</button>
<input type={"hidden"} name={"csrf"} value={DB.CreateCSRF(ctx)}>
</form>
</div>;
return Shell("Upload Package",pages,html);
}