Compare commits
3 Commits
50187f5a34
...
bf6ced948a
| Author | SHA1 | Date | |
|---|---|---|---|
| bf6ced948a | |||
| 442b145711 | |||
| 3290837555 |
@ -9,6 +9,7 @@
|
|||||||
- [Templating Examples](https://github.com/kataras/iris/tree/main/_examples/view)
|
- [Templating Examples](https://github.com/kataras/iris/tree/main/_examples/view)
|
||||||
- [Jet]
|
- [Jet]
|
||||||
- [Source](https://github.com/CloudyKit/jet)
|
- [Source](https://github.com/CloudyKit/jet)
|
||||||
|
- [Docs](https://github.com/CloudyKit/jet/wiki)
|
||||||
- [Syntax reference](https://github.com/CloudyKit/jet/blob/master/docs/syntax.md)
|
- [Syntax reference](https://github.com/CloudyKit/jet/blob/master/docs/syntax.md)
|
||||||
|
|
||||||
## Howto
|
## Howto
|
||||||
|
|||||||
@ -19,6 +19,7 @@ type configStruct struct {
|
|||||||
DisableSendMail bool `yaml:"disableSendMail"`
|
DisableSendMail bool `yaml:"disableSendMail"`
|
||||||
IsProduction bool `yaml:"isProduction"`
|
IsProduction bool `yaml:"isProduction"`
|
||||||
LoopDelay uint32 `yaml:"loopDelay"`
|
LoopDelay uint32 `yaml:"loopDelay"`
|
||||||
|
StaticDir string `yaml:"staticDir"`
|
||||||
} `yaml:"application"`
|
} `yaml:"application"`
|
||||||
Database struct {
|
Database struct {
|
||||||
Host string `yaml:"host"`
|
Host string `yaml:"host"`
|
||||||
|
|||||||
@ -91,6 +91,11 @@ func createApp() *iris.Application {
|
|||||||
app.UseRouter(accessLog.Handler)
|
app.UseRouter(accessLog.Handler)
|
||||||
app.RegisterView(iris.Jet("./app/templates", ".jet").Reload(true))
|
app.RegisterView(iris.Jet("./app/templates", ".jet").Reload(true))
|
||||||
views.CreateRouter(app)
|
views.CreateRouter(app)
|
||||||
|
|
||||||
|
if len(cfg.Config.Application.StaticDir) > 0 {
|
||||||
|
app.HandleDir("/static", iris.Dir(cfg.Config.Application.StaticDir))
|
||||||
|
}
|
||||||
|
|
||||||
return app
|
return app
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -2,32 +2,60 @@
|
|||||||
|
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
|
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<title>Document</title>
|
<title>Document</title>
|
||||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css">
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css">
|
||||||
|
<link rel="stylesheet" href="/static/styles.css">
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
<header class="navbar">
|
||||||
|
<div class="container">
|
||||||
|
<nav class="main navbar navbar-expand-lg">
|
||||||
|
<div class="container-fluid">
|
||||||
|
<a class="navbar-brand" href="/">
|
||||||
|
<img src="/static/example.png" alt="">
|
||||||
|
</a>
|
||||||
|
<button class="navbar-toggler" type="button" data-bs-toggle="collapse"
|
||||||
|
data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent"
|
||||||
|
aria-expanded="false" aria-label="Toggle navigation">
|
||||||
|
<span class="navbar-toggler-icon"></span>
|
||||||
|
</button>
|
||||||
|
<div class="collapse navbar-collapse" id="navbarSupportedContent">
|
||||||
|
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
|
||||||
|
<li class="nav-item">
|
||||||
|
<a href="/" class='nav-link {{ if .activePage == "index" }}active{{ end }}'>
|
||||||
|
Frontpage
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a href="/users" class='nav-link {{ if .activePage == "users" }}active{{ end }}'>
|
||||||
|
Users
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a href="/about" class='nav-link {{ if .activePage == "about" }}active{{ end }}'>
|
||||||
|
About
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
<div class="container mt-3">
|
<div class="container mt-3">
|
||||||
<h1>{{ title }}</h1>
|
|
||||||
|
|
||||||
<ul class="nav">
|
|
||||||
<li class="nav-item">
|
|
||||||
<a href="/" class="nav-link">Frontpage</a>
|
|
||||||
</li>
|
|
||||||
<li class="nav-item">
|
|
||||||
<a href="/users" class="nav-link">Users</a>
|
|
||||||
</li>
|
|
||||||
<li class="nav-item">
|
|
||||||
<a href="/about" class="nav-link">About</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<main>
|
<main>
|
||||||
{{ yield mainContent() }}
|
{{ yield mainContent() }}
|
||||||
</main>
|
</main>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{{ block jsBlock() }}{{ end }}
|
||||||
</body>
|
</body>
|
||||||
</html>
|
|
||||||
|
</html>
|
||||||
@ -2,14 +2,48 @@
|
|||||||
|
|
||||||
|
|
||||||
{{ block mainContent() }}
|
{{ block mainContent() }}
|
||||||
<p>Bacon ipsum dolor amet meatball ground round swine salami, drumstick alcatra ribeye pork loin corned beef tongue sausage tail jerky buffalo. Bacon capicola fatback turducken. Drumstick picanha jowl pork loin, meatball tri-tip doner pastrami beef ribs shankle chicken chuck turkey. Flank pig turducken hamburger shoulder, tongue alcatra prosciutto buffalo jowl. Frankfurter brisket ball tip, leberkas strip steak meatball burgdoggen jowl rump. Porchetta drumstick frankfurter pig cow spare ribs rump sausage chuck fatback andouille filet mignon jerky.</p>
|
|
||||||
<p>Chuck swine drumstick, fatback alcatra burgdoggen ball tip meatball andouille shoulder brisket turducken cupim spare ribs. Spare ribs strip steak alcatra tri-tip pork chop bresaola, t-bone cupim cow. Ball tip pork corned beef chislic buffalo. Cupim bacon doner turkey ball tip prosciutto andouille fatback corned beef. Meatball drumstick venison landjaeger filet mignon biltong, frankfurter chicken shank bacon flank strip steak ground round t-bone.</p>
|
<p>Bacon ipsum dolor amet meatball ground round swine salami, drumstick alcatra ribeye pork loin corned beef tongue
|
||||||
<p>Meatloaf tri-tip biltong porchetta corned beef alcatra. Capicola chicken pastrami swine tri-tip, flank corned beef landjaeger picanha spare ribs drumstick chislic pork chop sirloin. Capicola landjaeger kevin prosciutto boudin. Porchetta shoulder ball tip, strip steak drumstick ham hock tri-tip frankfurter landjaeger. Cupim biltong bacon meatloaf chicken, porchetta picanha brisket strip steak andouille hamburger cow jowl shank fatback.</p>
|
sausage tail jerky buffalo. Bacon capicola fatback turducken. Drumstick picanha jowl pork loin, meatball tri-tip
|
||||||
<p>Turducken bacon pork loin capicola hamburger jerky tri-tip pork belly. Pork loin chicken turkey, pork chop filet mignon tri-tip prosciutto tenderloin beef ham hock chuck bacon. Kevin venison frankfurter porchetta ribeye, landjaeger pork loin shank. Salami andouille landjaeger pork loin pork tail filet mignon venison cow bresaola jerky alcatra boudin t-bone. Beef fatback ribeye turkey ground round corned beef. Beef alcatra flank hamburger.</p>
|
doner pastrami beef ribs shankle chicken chuck turkey. Flank pig turducken hamburger shoulder, tongue alcatra
|
||||||
<p>Landjaeger shankle flank, cow hamburger biltong capicola pastrami drumstick. Boudin ball tip shank ground round, porchetta shankle spare ribs chuck chicken sirloin meatloaf. Pork loin pork frankfurter shank, capicola swine chicken strip steak prosciutto kevin burgdoggen beef pig. Sirloin leberkas andouille cow ham tongue drumstick jowl sausage t-bone pancetta turducken bacon. Jerky ham hock turducken pork belly, corned beef ribeye tri-tip andouille beef ribs pastrami filet mignon meatball shank rump salami. Spare ribs porchetta salami short ribs, ball tip cow pig ribeye corned beef venison tongue. Shoulder jowl capicola, strip steak prosciutto cow burgdoggen spare ribs.</p>
|
prosciutto buffalo jowl. Frankfurter brisket ball tip, leberkas strip steak meatball burgdoggen jowl rump. Porchetta
|
||||||
<p>Shoulder shankle t-bone, buffalo ribeye beef tail drumstick sausage pork belly pig landjaeger kevin. Ground round shoulder venison, chicken t-bone corned beef tongue flank filet mignon jowl drumstick tenderloin bresaola short loin pig. Swine flank beef corned beef ham hock boudin doner pig. Pork belly short ribs buffalo ham salami kielbasa.</p>
|
drumstick frankfurter pig cow spare ribs rump sausage chuck fatback andouille filet mignon jerky.</p>
|
||||||
<p>Burgdoggen ground round sausage andouille chicken strip steak porchetta picanha. Pork t-bone shank porchetta leberkas capicola corned beef bresaola. Swine tenderloin beef ribs sirloin. Burgdoggen buffalo frankfurter, salami turkey biltong chislic bacon bresaola. Ground round turkey tri-tip flank tail buffalo tenderloin. Picanha turkey shankle jerky. Brisket beef ribs corned beef kielbasa buffalo.</p>
|
<p>Chuck swine drumstick, fatback alcatra burgdoggen ball tip meatball andouille shoulder brisket turducken cupim spare
|
||||||
<p>Shoulder pastrami chislic picanha pork belly, tail pork venison pork loin jerky pig beef pancetta bacon. Venison beef t-bone, meatball strip steak cow ball tip short ribs flank. Burgdoggen capicola venison pork pancetta alcatra ham hock doner flank fatback cow. Strip steak hamburger landjaeger jowl burgdoggen. Pastrami strip steak jerky, flank tri-tip t-bone capicola ham brisket. Buffalo salami fatback, bresaola venison chuck turducken kielbasa tail kevin short loin. Drumstick bresaola shank fatback tri-tip burgdoggen, ball tip chislic ribeye.</p>
|
ribs. Spare ribs strip steak alcatra tri-tip pork chop bresaola, t-bone cupim cow. Ball tip pork corned beef chislic
|
||||||
<p>Tenderloin rump shank, boudin ribeye spare ribs drumstick. Frankfurter tri-tip ribeye ground round. T-bone chuck spare ribs shankle, short ribs biltong ham hock beef burgdoggen hamburger doner bresaola tongue. Salami doner strip steak, pig swine bacon chicken pastrami ground round pancetta sausage short ribs ball tip. Chislic rump prosciutto frankfurter beef ribs pork drumstick alcatra sirloin andouille brisket capicola.</p>
|
buffalo. Cupim bacon doner turkey ball tip prosciutto andouille fatback corned beef. Meatball drumstick venison
|
||||||
<p>Rump ground round porchetta chislic, burgdoggen jerky frankfurter flank strip steak bacon shankle tongue. Shoulder strip steak biltong tri-tip, beef ribs shankle shank venison landjaeger pork. Capicola short loin picanha flank bacon shank. Strip steak ribeye swine, salami kevin landjaeger brisket.</p>
|
landjaeger filet mignon biltong, frankfurter chicken shank bacon flank strip steak ground round t-bone.</p>
|
||||||
{{ end }}
|
<p>Meatloaf tri-tip biltong porchetta corned beef alcatra. Capicola chicken pastrami swine tri-tip, flank corned beef
|
||||||
|
landjaeger picanha spare ribs drumstick chislic pork chop sirloin. Capicola landjaeger kevin prosciutto boudin.
|
||||||
|
Porchetta shoulder ball tip, strip steak drumstick ham hock tri-tip frankfurter landjaeger. Cupim biltong bacon
|
||||||
|
meatloaf chicken, porchetta picanha brisket strip steak andouille hamburger cow jowl shank fatback.</p>
|
||||||
|
<p>Turducken bacon pork loin capicola hamburger jerky tri-tip pork belly. Pork loin chicken turkey, pork chop filet
|
||||||
|
mignon tri-tip prosciutto tenderloin beef ham hock chuck bacon. Kevin venison frankfurter porchetta ribeye,
|
||||||
|
landjaeger pork loin shank. Salami andouille landjaeger pork loin pork tail filet mignon venison cow bresaola jerky
|
||||||
|
alcatra boudin t-bone. Beef fatback ribeye turkey ground round corned beef. Beef alcatra flank hamburger.</p>
|
||||||
|
<p>Landjaeger shankle flank, cow hamburger biltong capicola pastrami drumstick. Boudin ball tip shank ground round,
|
||||||
|
porchetta shankle spare ribs chuck chicken sirloin meatloaf. Pork loin pork frankfurter shank, capicola swine
|
||||||
|
chicken strip steak prosciutto kevin burgdoggen beef pig. Sirloin leberkas andouille cow ham tongue drumstick jowl
|
||||||
|
sausage t-bone pancetta turducken bacon. Jerky ham hock turducken pork belly, corned beef ribeye tri-tip andouille
|
||||||
|
beef ribs pastrami filet mignon meatball shank rump salami. Spare ribs porchetta salami short ribs, ball tip cow pig
|
||||||
|
ribeye corned beef venison tongue. Shoulder jowl capicola, strip steak prosciutto cow burgdoggen spare ribs.</p>
|
||||||
|
<p>Shoulder shankle t-bone, buffalo ribeye beef tail drumstick sausage pork belly pig landjaeger kevin. Ground round
|
||||||
|
shoulder venison, chicken t-bone corned beef tongue flank filet mignon jowl drumstick tenderloin bresaola short loin
|
||||||
|
pig. Swine flank beef corned beef ham hock boudin doner pig. Pork belly short ribs buffalo ham salami kielbasa.</p>
|
||||||
|
<p>Burgdoggen ground round sausage andouille chicken strip steak porchetta picanha. Pork t-bone shank porchetta leberkas
|
||||||
|
capicola corned beef bresaola. Swine tenderloin beef ribs sirloin. Burgdoggen buffalo frankfurter, salami turkey
|
||||||
|
biltong chislic bacon bresaola. Ground round turkey tri-tip flank tail buffalo tenderloin. Picanha turkey shankle
|
||||||
|
jerky. Brisket beef ribs corned beef kielbasa buffalo.</p>
|
||||||
|
<p>Shoulder pastrami chislic picanha pork belly, tail pork venison pork loin jerky pig beef pancetta bacon. Venison beef
|
||||||
|
t-bone, meatball strip steak cow ball tip short ribs flank. Burgdoggen capicola venison pork pancetta alcatra ham
|
||||||
|
hock doner flank fatback cow. Strip steak hamburger landjaeger jowl burgdoggen. Pastrami strip steak jerky, flank
|
||||||
|
tri-tip t-bone capicola ham brisket. Buffalo salami fatback, bresaola venison chuck turducken kielbasa tail kevin
|
||||||
|
short loin. Drumstick bresaola shank fatback tri-tip burgdoggen, ball tip chislic ribeye.</p>
|
||||||
|
<p>Tenderloin rump shank, boudin ribeye spare ribs drumstick. Frankfurter tri-tip ribeye ground round. T-bone chuck
|
||||||
|
spare ribs shankle, short ribs biltong ham hock beef burgdoggen hamburger doner bresaola tongue. Salami doner strip
|
||||||
|
steak, pig swine bacon chicken pastrami ground round pancetta sausage short ribs ball tip. Chislic rump prosciutto
|
||||||
|
frankfurter beef ribs pork drumstick alcatra sirloin andouille brisket capicola.</p>
|
||||||
|
<p>Rump ground round porchetta chislic, burgdoggen jerky frankfurter flank strip steak bacon shankle tongue. Shoulder
|
||||||
|
strip steak biltong tri-tip, beef ribs shankle shank venison landjaeger pork. Capicola short loin picanha flank
|
||||||
|
bacon shank. Strip steak ribeye swine, salami kevin landjaeger brisket.</p>
|
||||||
|
|
||||||
|
{{ end }}
|
||||||
@ -4,26 +4,34 @@
|
|||||||
|
|
||||||
{{ block mainContent() }}
|
{{ block mainContent() }}
|
||||||
|
|
||||||
<div class="row">
|
<div class="row mt-5 mb-5">
|
||||||
<form class="mb-5 col-4 ms-auto me-auto" method="post" action="/">
|
<form class="col-6" method="post" action="/">
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<label class="form-label">Email address</label>
|
<label class="form-label">Email address</label>
|
||||||
<input type="email" name="email" class="form-control" value="edkirin@gmail.com">
|
<input type="email" name="email" class="form-control" value="edkirin@gmail.com">
|
||||||
</div>
|
</div>
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<label class="form-label">Password</label>
|
<label class="form-label">Password</label>
|
||||||
<input type="text" name="password" class="form-control" value="tralala">
|
<input type="text" name="password" class="form-control" value="tralala">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<button type="submit" class="btn btn-success">
|
<button type="submit" class="btn btn-success">
|
||||||
Submit
|
Submit
|
||||||
</button>
|
</button>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="lead">
|
|
||||||
<p>Bacon ipsum dolor amet leberkas kevin meatball pork loin beef ribs prosciutto, turducken bacon bresaola tri-tip. Strip steak flank shankle, sirloin short ribs shoulder meatball pork chop kevin ribeye jowl ham pork belly turducken jerky. Flank tongue short loin ham hock brisket turducken tail filet mignon cupim. Pork capicola buffalo kevin jowl chicken. Filet mignon brisket pig, landjaeger sausage cow fatback drumstick chicken buffalo tenderloin spare ribs.</p>
|
|
||||||
<p>Swine shankle porchetta pancetta. Buffalo chicken turducken ground round kevin shoulder, salami pig t-bone beef ribs tri-tip tongue pork belly doner. Landjaeger meatloaf short loin biltong. Alcatra tongue shankle, tri-tip pancetta porchetta tenderloin corned beef pastrami rump. Bresaola chislic beef kielbasa sausage, ball tip burgdoggen boudin capicola short loin tenderloin buffalo landjaeger.</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{{ end }}
|
<div class="lead">
|
||||||
|
<p>Bacon ipsum dolor amet leberkas kevin meatball pork loin beef ribs prosciutto, turducken bacon bresaola tri-tip.
|
||||||
|
Strip steak flank shankle, sirloin short ribs shoulder meatball pork chop kevin ribeye jowl ham pork belly
|
||||||
|
turducken jerky. Flank tongue short loin ham hock brisket turducken tail filet mignon cupim. Pork capicola
|
||||||
|
buffalo kevin jowl chicken. Filet mignon brisket pig, landjaeger sausage cow fatback drumstick chicken buffalo
|
||||||
|
tenderloin spare ribs.</p>
|
||||||
|
<p>Swine shankle porchetta pancetta. Buffalo chicken turducken ground round kevin shoulder, salami pig t-bone beef
|
||||||
|
ribs tri-tip tongue pork belly doner. Landjaeger meatloaf short loin biltong. Alcatra tongue shankle, tri-tip
|
||||||
|
pancetta porchetta tenderloin corned beef pastrami rump. Bresaola chislic beef kielbasa sausage, ball tip
|
||||||
|
burgdoggen boudin capicola short loin tenderloin buffalo landjaeger.</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{ end }}
|
||||||
@ -2,38 +2,93 @@
|
|||||||
{{ import "/components/table_component.jet" }}
|
{{ import "/components/table_component.jet" }}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{{ block mainContent() }}
|
{{ block mainContent() }}
|
||||||
<h3>Edit user</h3>
|
|
||||||
|
<h3>Edit user</h3>
|
||||||
|
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<form class="mb-5 col-4 ms-auto me-auto" method="post" action="{{ .currentPath }}">
|
<form class="mb-5 col-4 ms-auto me-auto user-edit" method="post" action="{{ .currentPath }}">
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<label class="form-label">First name</label>
|
<label class="form-label">First name</label>
|
||||||
<input type="text" name="first-name" class="form-control" value="{{ user.FirstName }}" required>
|
<input type="text" name="first-name" class="form-control" value="{{ .user.FirstName }}" required>
|
||||||
</div>
|
</div>
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<label class="form-label">Last name</label>
|
<label class="form-label">Last name</label>
|
||||||
<input type="text" name="last-name" class="form-control" value="{{ user.LastName }}" required>
|
<input type="text" name="last-name" class="form-control" value="{{ .user.LastName }}" required>
|
||||||
</div>
|
</div>
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<label class="form-label">Email</label>
|
<label class="form-label">Email</label>
|
||||||
<input type="email" name="email" class="form-control" value="{{ user.Email }}" required>
|
<input type="email" name="email" class="form-control" value="{{ .user.Email }}" required>
|
||||||
</div>
|
</div>
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<label class="form-label">Password</label>
|
<label class="form-label">Password</label>
|
||||||
<input type="text" name="password" class="form-control">
|
<input type="text" name="password" class="form-control">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="d-flex">
|
<div class="d-flex">
|
||||||
<a href="/users" class="btn btn-outline-secondary ms-auto me-2">
|
<a href="{{ .backlink }}" class="btn btn-outline-secondary ms-auto me-2">
|
||||||
Cancel
|
Cancel
|
||||||
</a>
|
</a>
|
||||||
<button type="submit" class="btn btn-success">
|
<button type="submit" class="btn btn-success">
|
||||||
Save
|
Save
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{{ end }}
|
{{ end }}
|
||||||
|
|
||||||
|
|
||||||
|
{{ block jsBlock() }}
|
||||||
|
|
||||||
|
<script>
|
||||||
|
document.querySelector("form.user-edit").addEventListener("submit", (e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
|
||||||
|
const form = e.currentTarget;
|
||||||
|
const formData = new FormData(form);
|
||||||
|
const postData = Object.fromEntries(formData.entries());
|
||||||
|
const url = "{{ .currentPath }}";
|
||||||
|
const backlink = "{{ .backlink }}";
|
||||||
|
|
||||||
|
console.log(postData)
|
||||||
|
|
||||||
|
fetch(url, {
|
||||||
|
method: "POST",
|
||||||
|
mode: "cors",
|
||||||
|
cache: "no-cache",
|
||||||
|
credentials: "same-origin",
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
},
|
||||||
|
redirect: "follow",
|
||||||
|
referrerPolicy: "no-referrer",
|
||||||
|
body: JSON.stringify(postData),
|
||||||
|
}).then(response => {
|
||||||
|
if (![200, 201, 400].includes(response.status)) {
|
||||||
|
throw new Error(response.statusText);
|
||||||
|
}
|
||||||
|
return response.json()
|
||||||
|
}).then(jsonData => {
|
||||||
|
console.log("response:", jsonData)
|
||||||
|
if (jsonData.success) {
|
||||||
|
window.location = backlink;
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
if (jsonData.validationErrors) {
|
||||||
|
displayValidationErrors(jsonData.validationErrors);
|
||||||
|
doSpinner(this.btnSave, false);
|
||||||
|
} else {
|
||||||
|
throw new Error(jsonData.error);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
}).catch(err => {
|
||||||
|
console.error(err);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
{{ end }}
|
||||||
@ -3,7 +3,9 @@
|
|||||||
|
|
||||||
|
|
||||||
{{ block mainContent() }}
|
{{ block mainContent() }}
|
||||||
<h3>Users</h3>
|
|
||||||
|
|
||||||
{{ yield usersTable(users=users) }}
|
<h3>Users</h3>
|
||||||
{{ end }}
|
|
||||||
|
{{ yield usersTable(users=.users) }}
|
||||||
|
|
||||||
|
{{ end }}
|
||||||
@ -3,7 +3,11 @@ package views
|
|||||||
import "github.com/kataras/iris/v12"
|
import "github.com/kataras/iris/v12"
|
||||||
|
|
||||||
func GetAboutPage(ctx iris.Context) {
|
func GetAboutPage(ctx iris.Context) {
|
||||||
if err := ctx.View("pages/about.jet"); err != nil {
|
vars := iris.Map{
|
||||||
|
"activePage": "about",
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := ctx.View("pages/about.jet", vars); err != nil {
|
||||||
showError(ctx, err)
|
showError(ctx, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@ -7,7 +7,11 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func GetIndexPage(ctx iris.Context) {
|
func GetIndexPage(ctx iris.Context) {
|
||||||
if err := ctx.View("pages/index.jet"); err != nil {
|
vars := iris.Map{
|
||||||
|
"activePage": "index",
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := ctx.View("pages/index.jet", vars); err != nil {
|
||||||
showError(ctx, err)
|
showError(ctx, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@ -8,7 +8,7 @@ func CreateRouter(app *iris.Application) {
|
|||||||
|
|
||||||
app.Get("/users", GetUsersPage)
|
app.Get("/users", GetUsersPage)
|
||||||
app.Get("/users/{userId:uuid}", EditUserPage)
|
app.Get("/users/{userId:uuid}", EditUserPage)
|
||||||
app.Post("/users/{userId:uuid}", SaveUserPage)
|
app.Post("/users/{userId:uuid}", SaveUser)
|
||||||
|
|
||||||
app.Get("/about", GetAboutPage)
|
app.Get("/about", GetAboutPage)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -8,11 +8,11 @@ import (
|
|||||||
"github.com/kataras/iris/v12"
|
"github.com/kataras/iris/v12"
|
||||||
)
|
)
|
||||||
|
|
||||||
type editUserForm struct {
|
type editUserJSON struct {
|
||||||
FirstName string `form:"first-name"`
|
FirstName string `json:"first-name"`
|
||||||
LastName string `form:"last-name"`
|
LastName string `json:"last-name"`
|
||||||
Email string `form:"email"`
|
Email string `json:"email"`
|
||||||
Password string `form:"password"`
|
Password string `json:"password"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetUsersPage(ctx iris.Context) {
|
func GetUsersPage(ctx iris.Context) {
|
||||||
@ -27,9 +27,12 @@ func GetUsersPage(ctx iris.Context) {
|
|||||||
isActive := true
|
isActive := true
|
||||||
users := userRepository.List(&repository.UserFilter{IsActive: &isActive}, &pagination, &ordering)
|
users := userRepository.List(&repository.UserFilter{IsActive: &isActive}, &pagination, &ordering)
|
||||||
|
|
||||||
ctx.ViewData("users", users)
|
vars := iris.Map{
|
||||||
|
"activePage": "users",
|
||||||
|
"users": users,
|
||||||
|
}
|
||||||
|
|
||||||
if err := ctx.View("pages/users.jet"); err != nil {
|
if err := ctx.View("pages/users.jet", vars); err != nil {
|
||||||
showError(ctx, err)
|
showError(ctx, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -42,18 +45,23 @@ func EditUserPage(ctx iris.Context) {
|
|||||||
filter := repository.UserFilter{Id: &userId}
|
filter := repository.UserFilter{Id: &userId}
|
||||||
user := userRepository.Get(&filter)
|
user := userRepository.Get(&filter)
|
||||||
|
|
||||||
ctx.ViewData("user", user)
|
vars := iris.Map{
|
||||||
ctx.ViewData("currentPath", ctx.Path())
|
"activePage": "users",
|
||||||
|
"user": user,
|
||||||
|
"currentPath": ctx.Path(),
|
||||||
|
"backlink": "/users",
|
||||||
|
}
|
||||||
|
|
||||||
if err := ctx.View("pages/user-edit.jet"); err != nil {
|
if err := ctx.View("pages/user-edit.jet", vars); err != nil {
|
||||||
showError(ctx, err)
|
showError(ctx, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func SaveUserPage(ctx iris.Context) {
|
func SaveUser(ctx iris.Context) {
|
||||||
var form editUserForm
|
var postData editUserJSON
|
||||||
err := ctx.ReadForm(&form)
|
err := ctx.ReadJSON(&postData)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.StopWithError(iris.StatusBadRequest, err)
|
ctx.StopWithError(iris.StatusBadRequest, err)
|
||||||
return
|
return
|
||||||
@ -65,18 +73,21 @@ func SaveUserPage(ctx iris.Context) {
|
|||||||
filter := repository.UserFilter{Id: &userId}
|
filter := repository.UserFilter{Id: &userId}
|
||||||
user := userRepository.Get(&filter)
|
user := userRepository.Get(&filter)
|
||||||
|
|
||||||
user.FirstName = form.FirstName
|
user.FirstName = postData.FirstName
|
||||||
user.LastName = form.LastName
|
user.LastName = postData.LastName
|
||||||
user.Email = form.Email
|
user.Email = postData.Email
|
||||||
|
|
||||||
if len(form.Password) > 0 {
|
if len(postData.Password) > 0 {
|
||||||
user.SetPassword(form.Password)
|
user.SetPassword(postData.Password)
|
||||||
fmt.Printf("Set password: %s\n", user.Password)
|
fmt.Printf("Set password: %s\n", user.Password)
|
||||||
fmt.Printf("IsPasswordGoodEnough: %v\n", auth.IsPasswordGoodEnough(form.Password))
|
fmt.Printf("IsPasswordGoodEnough: %v\n", auth.IsPasswordGoodEnough(postData.Password))
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
userRepository.Save(user)
|
userRepository.Save(user)
|
||||||
|
|
||||||
ctx.Redirect("/users")
|
response := iris.Map{
|
||||||
|
"success": true,
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx.JSON(response)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,6 +5,7 @@ application:
|
|||||||
debugSQL: true
|
debugSQL: true
|
||||||
isProduction: false
|
isProduction: false
|
||||||
loopDelay: 3000
|
loopDelay: 3000
|
||||||
|
staticDir: "./static"
|
||||||
|
|
||||||
database:
|
database:
|
||||||
host: "localhost"
|
host: "localhost"
|
||||||
|
|||||||
BIN
static/example.png
Normal file
BIN
static/example.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 11 KiB |
6
static/styles.css
Normal file
6
static/styles.css
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
header.navbar {
|
||||||
|
background-color: #e0e0e0;
|
||||||
|
}
|
||||||
|
header.navbar .navbar-brand img {
|
||||||
|
max-height: 80px;
|
||||||
|
}/*# sourceMappingURL=styles.css.map */
|
||||||
1
static/styles.css.map
Normal file
1
static/styles.css.map
Normal file
@ -0,0 +1 @@
|
|||||||
|
{"version":3,"sources":["styles.scss","styles.css"],"names":[],"mappings":"AAAA;EACI,yBAAA;ACCJ;ADAI;EACI,gBAAA;ACER","file":"styles.css"}
|
||||||
6
static/styles.scss
Normal file
6
static/styles.scss
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
header.navbar {
|
||||||
|
background-color: #e0e0e0;
|
||||||
|
.navbar-brand img {
|
||||||
|
max-height: 80px;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user