mirror of
https://onedev.site.tesses.net/crosslang/crosslangextras
synced 2026-02-09 01:25:46 +00:00
Get far on package manager
This commit is contained in:
27
Tesses.CrossLang.PackageServer/src/pages/check_email.tcross
Normal file
27
Tesses.CrossLang.PackageServer/src/pages/check_email.tcross
Normal 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);
|
||||
}
|
||||
38
Tesses.CrossLang.PackageServer/src/pages/index.tcross
Normal file
38
Tesses.CrossLang.PackageServer/src/pages/index.tcross
Normal 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);
|
||||
}
|
||||
36
Tesses.CrossLang.PackageServer/src/pages/login.tcross
Normal file
36
Tesses.CrossLang.PackageServer/src/pages/login.tcross
Normal 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);
|
||||
}
|
||||
157
Tesses.CrossLang.PackageServer/src/pages/package.tcross
Normal file
157
Tesses.CrossLang.PackageServer/src/pages/package.tcross
Normal 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>
|
||||
*/
|
||||
46
Tesses.CrossLang.PackageServer/src/pages/search.tcross
Normal file
46
Tesses.CrossLang.PackageServer/src/pages/search.tcross
Normal 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);
|
||||
}
|
||||
44
Tesses.CrossLang.PackageServer/src/pages/signup.tcross
Normal file
44
Tesses.CrossLang.PackageServer/src/pages/signup.tcross
Normal 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);
|
||||
}
|
||||
29
Tesses.CrossLang.PackageServer/src/pages/upload.tcross
Normal file
29
Tesses.CrossLang.PackageServer/src/pages/upload.tcross
Normal 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);
|
||||
}
|
||||
Reference in New Issue
Block a user