init
This commit is contained in:
@ -1,13 +1,13 @@
|
||||
{{define "admin_menu"}}
|
||||
<aside class="asideAdmin mt-2">
|
||||
<h4>
|
||||
<aside class="md:lg:absolute m-6 mr-8">
|
||||
<h4 class="text-2xl font-bold">
|
||||
Administration
|
||||
</h4>
|
||||
<ul class="side-menu">
|
||||
<li><a href="/admin/settings" {{if eq . "config"}}class="is-active"{{end}}>Réglages</a></li>
|
||||
<li><a href="/admin/users" {{if eq . "users"}}class="is-active"{{end}}>Utilisateurs</a></li>
|
||||
<li><a href="/admin/apps" {{if eq . "apps"}}class="is-active"{{end}}>Applications</a></li>
|
||||
<li><a href="/admin/market" {{if eq . "market"}}class="is-active"{{end}}>Place de marché</a></li>
|
||||
<li><a class="admin-links" href="/admin/settings" {{if eq . "config"}}class="is-active"{{end}}><span>Réglages</span><img class="custom-icon" src="/icons/gear-solid.svg"/></a></li>
|
||||
<li><a class="admin-links" href="/admin/users" {{if eq . "users"}}class="is-active"{{end}}><span>Utilisateurs</span><img class="custom-icon" src="/icons/users-solid.svg"/></a></li>
|
||||
<li><a class="admin-links" href="/admin/apps" {{if eq . "apps"}}class="is-active"{{end}}><span>Applications</span><img class="custom-icon" src="/icons/cubes-stacked-solid.svg"/></a></li>
|
||||
<li><a class="admin-links" href="/admin/market" {{if eq . "market"}}class="is-active"{{end}}><span>Place de marché</span><img class="custom-icon" src="/icons/store-solid.svg"/></a></li>
|
||||
</ul>
|
||||
</aside>
|
||||
{{end}}
|
@ -1,53 +1,25 @@
|
||||
{{define "app_tile" }}
|
||||
<div class="tile is-parent is-4">
|
||||
<article class="app-tile tile is-child" data-controller="app-tile">
|
||||
<div class="front notification">
|
||||
<p class="title">{{ .Manifest.Title }}</p>
|
||||
<p class="subtitle">{{ index .Manifest.Tags 0 }}</p>
|
||||
<div class="level is-mobile">
|
||||
<div class="level-left">
|
||||
<div class="level-item">
|
||||
<div class="buttons">
|
||||
{{if .Manifest.Options.HighscoresEnabled}}
|
||||
<a class="button is-outlined is-link is-medium"
|
||||
href="highscores/{{ .Manifest.ID }}">
|
||||
<svg class="icon">
|
||||
<use xlink:href="#trophy"></use>
|
||||
</svg>
|
||||
</a>
|
||||
{{end}}
|
||||
{{ if .Manifest.Description }}
|
||||
<button data-action="click->app-tile#flip"
|
||||
class="button is-outlined is-info is-medium">
|
||||
<svg class="icon">
|
||||
<use xlink:href="#question"></use>
|
||||
</svg>
|
||||
</button>
|
||||
{{ end }}
|
||||
<div>
|
||||
<article data-controller="app-tile">
|
||||
<div class="m-4 sm:block md:lg:flex w-100">
|
||||
<div class="flex flex-col md:flex-row md:max-w-xl rounded-lg bg-white shadow-lg">
|
||||
<div class="p-6 flex flex-col justify-start">
|
||||
<h5 class="text-gray-900 text-xl font-medium mb-2"><code>{{ .Manifest.Title }}</code></h5>
|
||||
<div class="flex justify-between">
|
||||
<div>
|
||||
<p class="text-gray-600 text-xs">{{ index .Manifest.Tags 0 }}</p>
|
||||
</div>
|
||||
<div>
|
||||
<a class="flex"
|
||||
href="apps/{{ .Manifest.ID }}">
|
||||
<span>Ouvrir</span>
|
||||
<img class="custom-icon" width="50" height="50" src="/icons/chevron-right-solid.svg"/>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="level-right">
|
||||
<div class="level-item">
|
||||
<a class="button is-primary is-medium has-no-shadow"
|
||||
href="apps/{{ .Manifest.ID }}">
|
||||
<span>Ouvrir</span>
|
||||
<svg class="icon">
|
||||
<use xlink:href="#chevron-right"></use>
|
||||
</svg>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{ if .Manifest.Description }}
|
||||
<div class="back notification" data-action="click->app-tile#flip">
|
||||
<div class="content">
|
||||
{{ markdown .Manifest.Description }}
|
||||
</div>
|
||||
</div>
|
||||
{{ end }}
|
||||
</article>
|
||||
</div>
|
||||
{{end}}
|
||||
|
@ -6,14 +6,14 @@
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>{{block "title" . -}}{{- end}}</title>
|
||||
<link rel="stylesheet" href="/css/server.css">
|
||||
<link rel="stylesheet" href="/css/form.css">
|
||||
<link rel="stylesheet" href="/css/custom.css">
|
||||
{{- block "head_style" . -}}{{end}}
|
||||
{{- block "head_script" . -}}
|
||||
{{template "js_config" .}}
|
||||
<script defer src="/server.js"></script>
|
||||
<script defer src="/server.js"></script>
|
||||
<script src="/js/tailwind-3.0.24.js"></script>
|
||||
<script src="/js/font-awesome-5.3.1.js"></script>
|
||||
{{- block "head_style" . -}}{{end}}
|
||||
{{end}}
|
||||
</head>
|
||||
<body>
|
||||
|
@ -1,5 +1,5 @@
|
||||
{{define "flash"}}
|
||||
<div class="flash has-margin-top-small has-margin-bottom-small">
|
||||
<div class="mt-8">
|
||||
{{- range .Flashes -}}
|
||||
{{- if eq .Type "error" -}}
|
||||
{{template "flash_message" map "Title" "Erreur" "MessageClass" "is-danger" "Message" .Message }}
|
||||
@ -15,9 +15,7 @@
|
||||
{{end}}
|
||||
|
||||
{{define "flash_message" -}}
|
||||
<div class="message {{.MessageClass}}">
|
||||
<div class="message-body">
|
||||
<span class="has-text-weight-bold">{{.Title}}</span> {{.Message}}
|
||||
</div>
|
||||
<div class="p-2 bg-cadoles items-center {{.MessageClass}} text-indigo-100 leading-none lg:rounded-full flex lg:inline-flex" role="alert">
|
||||
<span class="font-semibold mr-2 text-left flex-auto">{{ .Message }}</span>
|
||||
</div>
|
||||
{{- end}}
|
@ -9,18 +9,13 @@
|
||||
<li class="flashlight"><a href="/"><img src="/assets/logo.svg"></a></li>
|
||||
{{if .IsAdmin}}
|
||||
<li>
|
||||
<a href="/admin/logout" class="button is-warning is-medium" style="font-size: 0.73em;">
|
||||
<svg class="icon" width="50" height="50">
|
||||
<use xlink:href="#sign-out-alt"></use>
|
||||
</svg>
|
||||
</a>
|
||||
<a href="/admin/logout" class="ligth">Logout</a>
|
||||
</li>
|
||||
{{end}}
|
||||
<li>
|
||||
<a id="flash" href="/profile">Profile</a>
|
||||
<a iclass="ligth" href="/profile">Profile</a>
|
||||
</li>
|
||||
<li><a class="ligth" href="/admin">Admin</a></li>
|
||||
<li><a href="#">Feedback</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</header>
|
||||
|
@ -1,108 +1,83 @@
|
||||
{{define "title"}}Modifier l'app - Administration - Arcad{{end}}
|
||||
{{define "body"}}
|
||||
{{template "header" .}}
|
||||
<section class="is-fullheight section">
|
||||
<div class="container">
|
||||
<div class="columns">
|
||||
<div class="column is-2">
|
||||
<section class="block">
|
||||
<div>
|
||||
<div>
|
||||
<div>
|
||||
{{template "admin_menu" ""}}
|
||||
</div>
|
||||
<div class="column is-10">
|
||||
<div>
|
||||
{{template "flash" .}}
|
||||
<div class="level">
|
||||
<div class="level-left">
|
||||
<div>
|
||||
<div>
|
||||
<a class="button level-item" href="/admin/apps">← Retour</a>
|
||||
</div>
|
||||
<div class="level-right"></div>
|
||||
</div>
|
||||
<form class="has-margin-top-small" action="/admin/apps/{{ .App.ID }}" method="post">
|
||||
<div class="columns">
|
||||
<div class="column is-12">
|
||||
<div class="level">
|
||||
<div class="level-left">
|
||||
<h5 class="is-size-5 level-item">Informations de l'app</h5>
|
||||
</div>
|
||||
<div class="level-right">
|
||||
<div class="field level-item">
|
||||
<input id="publishedSwitch" type="checkbox" name="published" class="switch" {{if .IsPublished}}checked="checked"{{end}} />
|
||||
<label for="publishedSwitch">Publiée ?</label>
|
||||
</div>
|
||||
<form action="/admin/apps/{{ .App.ID }}" method="post">
|
||||
<div>
|
||||
<div>
|
||||
<h5 class="text-center text-gray-900 mt-4 text-xl font-medium font-bold mb-2">Informations de l'app</h5>
|
||||
<div class="field level-item">
|
||||
<input id="publishedSwitch" type="checkbox" name="published" class="" {{if .IsPublished}}checked="checked"{{end}} />
|
||||
<label for="publishedSwitch">Publiée ?</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="field">
|
||||
<label class="label">Identifiant</label>
|
||||
<div class="control">
|
||||
<p class="input">{{ .App.ID }}</p>
|
||||
<p class="helper">Non modifiable</p>
|
||||
<label class="block text-gray-700 text-lg font-bold mb-2">Identifiant</label>
|
||||
<div>
|
||||
<p class="shadow appearance-none border focus:border-cyan-600 rounded w-full py-2 px-3 text-gray-700 mb-3 leading-tight focus:outline-none focus:shadow-outline">{{ .App.ID }}</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="field">
|
||||
<label class="label">Titre</label>
|
||||
<div class="control">
|
||||
<input class="input" type="text"
|
||||
<label class="block text-gray-700 text-lg font-bold mb-2">Titre</label>
|
||||
<div>
|
||||
<input class="shadow appearance-none border focus:border-cyan-600 rounded w-full py-2 px-3 text-gray-700 mb-3 leading-tight focus:outline-none focus:shadow-outline" type="text"
|
||||
name="title"
|
||||
value="{{if .Form}}{{ .Form.Get "title" }}{{else}}{{ .App.Manifest.Title }}{{end}}">
|
||||
<label className="checkbox is-right">
|
||||
<input type="checkbox" name="resetTitle" />
|
||||
Réinitialiser la valeur par défaut ?
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="field">
|
||||
<label class="label">Description</label>
|
||||
<div class="control">
|
||||
<textarea class="textarea"
|
||||
<label class="block text-gray-700 text-lg font-bold mb-2">Description</label>
|
||||
<div>
|
||||
<textarea class="h-64 focus:border-cyan-600 block w-full px-3 py-1.5 text-base font-normal text-gray-700 bg-white bg-clip-padding border border-solid border-gray-300 rounded transition ease-in-out m-0 focus:text-gray-700 focus:bg-white focus:outline-none"
|
||||
name="description">{{if .Form}}{{ .Form.Get "description" }}{{else}}{{ .App.Manifest.Description }}{{end}}</textarea>
|
||||
<label className="checkbox is-right">
|
||||
<input type="checkbox" name="resetDescription" />
|
||||
Réinitialiser la valeur par défaut ?
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="field">
|
||||
<label class="label">Ordre d'affichage</label>
|
||||
<div class="control">
|
||||
<input class="input" type="number"
|
||||
<label class="block text-gray-700 text-lg font-bold mb-2">Ordre d'affichage</label>
|
||||
<div>
|
||||
<input class="shadow appearance-none border focus:border-cyan-600 rounded w-full py-2 px-3 text-gray-700 mb-3 leading-tight focus:outline-none focus:shadow-outline" type="number"
|
||||
step="1"
|
||||
min="0"
|
||||
name="order"
|
||||
value="{{if .Form}}{{ .Form.Get "order" }}{{else}}{{ .App.Order }}{{end}}">
|
||||
<label className="checkbox is-right">
|
||||
<input type="checkbox" name="resetOrder" />
|
||||
Réinitialiser la valeur par défaut ?
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="field" data-controller="tags-editor">
|
||||
<label class="label">Tags</label>
|
||||
<div class="control">
|
||||
<label class="block text-gray-700 text-lg font-bold mb-2">Tags</label>
|
||||
<div>
|
||||
<div class="field has-addons">
|
||||
<div class="control">
|
||||
<input class="input is-small" type="text" placeholder="Nouveau tag" data-target="tags-editor.newTag">
|
||||
</div>
|
||||
<div class="control">
|
||||
<a class="button is-small is-info has-text-bold" data-action="click->tags-editor#onAddTag">
|
||||
<div class="flex">
|
||||
<input class="w-5/6 shadow appearance-none border focus:border-cyan-600 rounded-l w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline" type="text" placeholder="Nouveau tag" data-target="tags-editor.newTag">
|
||||
<a class="text-center w-1/6 text-white p-1 bg-cyan-600 text-bold rounded-r" data-action="click->tags-editor#onAddTag">
|
||||
+
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="tags" data-target="tags-editor.tagsContainer"></div>
|
||||
<input class="input is-hidden" type="text"
|
||||
<div class="hidden" data-target="tags-editor.tagsContainer"></div>
|
||||
<input class="mt-4 shadow appearance-none border focus:border-cyan-600 rounded w-full py-2 px-3 text-gray-700 mb-3 leading-tight focus:outline-none focus:shadow-outline" type="text"
|
||||
data-target="tags-editor.tagsSource"
|
||||
name="tags"
|
||||
value="{{if .Form}}{{ .Form.Get "tags" }}{{else}}{{range .App.Manifest.Tags}}{{.}},{{end}}{{end}}" />
|
||||
<label className="checkbox is-right">
|
||||
<input type="checkbox" name="resetOrder" />
|
||||
Réinitialiser la valeur par défaut ?
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
{{ .csrfField }}
|
||||
<div class="buttons" style="justify-content:flex-end">
|
||||
<button type="submit" class="button is-primary is-normal">Modifier</button>
|
||||
<button type="submit" class="block m-auto mt-8 bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded">Modifier</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -1,52 +1,74 @@
|
||||
{{define "title"}}Applications - Administration - Arcad{{end}}
|
||||
{{define "body"}}
|
||||
{{template "header" .}}
|
||||
<section class="home is-fullheight section">
|
||||
<div class="container">
|
||||
<div class="columns">
|
||||
<div class="column is-2">
|
||||
<section class="block">
|
||||
<div>
|
||||
<div>
|
||||
<div>
|
||||
{{template "admin_menu" "apps"}}
|
||||
</div>
|
||||
<div class="column is-10">
|
||||
<div>
|
||||
{{template "flash" .}}
|
||||
<h4 class="is-size-4">Liste des applications installées</h4>
|
||||
<div class="has-text-right">
|
||||
<h4 class="text-xl text-center font-bold mb-2">Liste des applications installées</h4>
|
||||
<div class="text-right mb-2">
|
||||
<b>Total</b> {{ .AppsCount }}
|
||||
</div>
|
||||
<div class="table-container">
|
||||
<table class="table is-fullwidth is-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>ID</th>
|
||||
<th>Titre</th>
|
||||
<th>Version</th>
|
||||
<th>Ordre d'affichage</th>
|
||||
<th>Publiée ?</th>
|
||||
<th>Tags</th>
|
||||
<th class="has-text-right">Actions</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<div class="relative overflow-x-auto shadow-md sm:rounded-lg">
|
||||
<table class="w-full text-sm text-left text-gray-500 dark:text-gray-400">
|
||||
<thead class="text-xs text-gray-700 uppercase bg-gray-50 dark:bg-gray-700 dark:text-gray-400">
|
||||
<tr>
|
||||
<th scope="col" class="px-6 py-3">
|
||||
ID
|
||||
</th>
|
||||
<th scope="col" class="px-6 py-3">
|
||||
Titre
|
||||
</th>
|
||||
<th scope="col" class="px-6 py-3">
|
||||
Version
|
||||
</th>
|
||||
<th scope="col" class="px-6 py-3">
|
||||
Ordre d'affichage
|
||||
</th>
|
||||
<th scope="col" class="px-6 py-3">
|
||||
Publiée ?
|
||||
</th>
|
||||
<th scope="col" class="px-6 py-3">
|
||||
Tags
|
||||
</th>
|
||||
<th scope="col" class="px-6 py-3">
|
||||
Actions
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{range .Apps}}
|
||||
<tr>
|
||||
<td><code>{{ .ID }}</code></td>
|
||||
<td>{{ .Manifest.Title }}</td>
|
||||
<td>{{ if eq .Manifest.Version "" }}--{{else}}{{ .Manifest.Version }}{{end}}</td>
|
||||
<td>{{ .Order }}</td>
|
||||
<td>{{ if .Published }}oui{{else}}non{{end}}</td>
|
||||
<td>
|
||||
{{range .Manifest.Tags}}
|
||||
<span class="tag is-info">{{ . }}</span>
|
||||
{{end}}
|
||||
</td>
|
||||
<td>
|
||||
<div class="buttons are-small is-right">
|
||||
<a class="button is-link" href="/admin/apps/{{ .ID }}">Modifier</a>
|
||||
</div>
|
||||
</td>
|
||||
<tr class="bg-white border-b dark:bg-gray-800 dark:border-gray-700">
|
||||
<th scope="row" class="px-6 py-4 font-medium text-gray-900 dark:text-white whitespace-nowrap">
|
||||
<code>{{ .ID }}</code>
|
||||
</th>
|
||||
<td class="px-6 py-4">
|
||||
{{ .Manifest.Title }}
|
||||
</td>
|
||||
<td class="px-6 py-4">
|
||||
{{ if eq .Manifest.Version "" }}--{{else}}{{ .Manifest.Version }}{{end}}
|
||||
</td>
|
||||
<td class="px-6 py-4">
|
||||
{{ .Order }}
|
||||
</td>
|
||||
<td class="px-6 py-4">
|
||||
{{ if .Published }}oui{{else}}non{{end}}
|
||||
</td>
|
||||
<td class="px-6 py-4">
|
||||
{{range .Manifest.Tags}}
|
||||
<span class="tag is-info">{{ . }}</span>
|
||||
{{end}}
|
||||
</td>
|
||||
<td class="px-6 py-4 text-right">
|
||||
<a class="font-medium block m-auto mt-8 bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded" href="/admin/apps/{{ .ID }}">Modifier</a>
|
||||
</td>
|
||||
</tr>
|
||||
{{else}}
|
||||
<tr class="has-text-centered is-italic">
|
||||
<tr class="bg-white border-b dark:bg-gray-800 dark:border-gray-700">
|
||||
<td colspan="7">
|
||||
Aucune application installée.
|
||||
</td>
|
||||
|
@ -1,21 +1,28 @@
|
||||
{{define "title"}}Login - Administration - Arcad{{end}}
|
||||
{{define "body"}}
|
||||
{{- block "head_style" . -}}
|
||||
<link rel="stylesheet" href="/css/login_form.css">
|
||||
{{end}}
|
||||
|
||||
{{template "header" .}}
|
||||
<section class="login is-fullheight section">
|
||||
<div class="container">
|
||||
{{template "flash" .}}
|
||||
<div class="loginForm">
|
||||
<h4>Administration</h4>
|
||||
<form method="POST">
|
||||
<input
|
||||
name="password" type="password"
|
||||
autocomplete="current-password"
|
||||
placeholder="Mot de passe">
|
||||
{{ .csrfField }}
|
||||
<button>S'identifier</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<section class="flex flex-col space-y-10" style="min-height:80vh">
|
||||
<div>
|
||||
{{template "flash" .}}
|
||||
<div style="margin-top:20vh;">
|
||||
<h4 class="text-4xl font-medium text-center" style="color: #078eb5;">Administration</h4>
|
||||
<form method="POST">
|
||||
<div class="w-3/4 transform border-b-2 bg-transparent text-lg duration-300 focus-within:border-sky-600">
|
||||
<input
|
||||
class="border-none bg-transparent outline-none placeholder:italic focus:outline-none"
|
||||
name="password" type="password"
|
||||
autocomplete="current-password"
|
||||
placeholder="Mot de passe">
|
||||
</div>
|
||||
{{ .csrfField }}
|
||||
<button class="p-20 transform rounded-sm color-white text-white py-2 font-bold duration-300 hover:bg-sky-600 shadow-lg shadow-blue-500/50" style="background-color: #078eb5;">S'identifier</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
{{end}}
|
||||
{{template "base" .}}
|
@ -1,27 +1,38 @@
|
||||
{{define "title"}}Installer une application - Administration - Arcad{{end}}
|
||||
{{define "body"}}
|
||||
{{template "header" .}}
|
||||
<section class="home is-fullheight section" data-controller="app-install">
|
||||
<section class="block" data-controller="app-install">
|
||||
<div class="container">
|
||||
<div class="columns">
|
||||
<div class="column is-2">
|
||||
<div class="">
|
||||
{{template "admin_menu" "market"}}
|
||||
</div>
|
||||
<div class="column is-10">
|
||||
<div class="">
|
||||
{{template "flash" .}}
|
||||
{{if .App}}
|
||||
<article class="message is-info">
|
||||
<div class="message-header">
|
||||
<p>Installation d'une application</p>
|
||||
<div class="w-full md:inset-0 md:h-full">
|
||||
<div class="relative p-4 w-full max-w-2xl h-full md:h-auto">
|
||||
<!-- Modal content -->
|
||||
<div class="relative bg-white rounded-lg shadow dark:bg-gray-700">
|
||||
<!-- Modal header -->
|
||||
<div class="flex justify-between items-start p-4 rounded-t border-b dark:border-gray-600">
|
||||
<h3 class="text-xl font-semibold text-gray-900 dark:text-white">
|
||||
Installation d'une application - <code>{{ .App.Name }}</code>
|
||||
</h3>
|
||||
</div>
|
||||
<!-- Modal body -->
|
||||
<div class="p-6 space-y-6">
|
||||
<p data-target="app-install.message" class="text-base leading-relaxed text-gray-500 dark:text-gray-400">
|
||||
Êtes vous sûr de vouloir installer l'application <code>{{ .App.Name }}</code> en version <code>{{ .App.LatestRelease.Version }}</code> développée par <b>{{ .App.Owner.Username }}</b> ?
|
||||
</p>
|
||||
</div>
|
||||
<!-- Modal footer -->
|
||||
<div class="flex items-center p-6 space-x-2 rounded-b border-t border-gray-200 dark:border-gray-600">
|
||||
<a data-target="app-install.cancelButton" href="/admin/market" class="text-gray-500 bg-white hover:bg-gray-100 focus:ring-4 focus:outline-none font-bold focus:ring-blue-300 rounded-lg border border-gray-200 text-sm font-medium px-5 py-2.5 hover:text-gray-900 focus:z-10 dark:bg-gray-700 dark:text-gray-300 dark:border-gray-500 dark:hover:text-white dark:hover:bg-gray-600 dark:focus:ring-gray-600">Annuler</a>
|
||||
<button data-target="app-install.installButton" data-action="click->app-install#onInstallClick" class="text-white bg-blue-500 hover:bg-blue-700 font-bold focus:ring-4 focus:outline-none focus:ring-blue-300 font-medium rounded-lg text-sm px-5 py-2.5 text-center">Confirmer</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="message-body">
|
||||
<p data-target="app-install.message">Êtes vous sûr de vouloir installer l'application <code>{{ .App.Name }}</code> en version <code>{{ .App.LatestRelease.Version }}</code> développée par <b>{{ .App.Owner.Username }}</b> ?</p>
|
||||
<div class="buttons is-right">
|
||||
<a data-target="app-install.cancelButton" href="/admin/market" class="button is-outlined is-link">Annuler</a>
|
||||
<button data-target="app-install.installButton" data-action="click->app-install#onInstallClick" class="button is-primary">Confirmer</a>
|
||||
</div>
|
||||
</div>
|
||||
</article>
|
||||
</div>
|
||||
</div>
|
||||
{{else}}
|
||||
<article class="message is-danger">
|
||||
<div class="message-body">
|
||||
@ -33,7 +44,6 @@
|
||||
</article>
|
||||
{{end}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
{{end}}
|
||||
|
@ -1,66 +1,51 @@
|
||||
{{define "title"}}Place de marché - Administration - Arcad{{end}}
|
||||
{{define "body"}}
|
||||
{{template "header" .}}
|
||||
<section class="home is-fullheight section">
|
||||
<section class="block">
|
||||
<div class="container">
|
||||
<div class="columns">
|
||||
<div class="column is-2">
|
||||
{{template "admin_menu" "market"}}
|
||||
<div>
|
||||
{{template "admin_menu" "market"}}
|
||||
</div>
|
||||
<div>
|
||||
{{template "flash" .}}
|
||||
<form class="mb-4 pl-2 w-full" action="/admin/market" methode="GET">
|
||||
<div class="flex">
|
||||
<div class="w-2/3">
|
||||
<input class="p-2 w-full border rounded-l" type="text" name="search" placeholder="Rechercher une application..." value="{{ .Search }}">
|
||||
</div>
|
||||
<div>
|
||||
<button class="transform sm:w-1/3 rounded-r bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 font-bold duration-300">Rechercher</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<div class="mr-4 text-right">
|
||||
<b>Total</b> {{ .ResultsCount }}
|
||||
</div>
|
||||
<div class="column is-10">
|
||||
{{template "flash" .}}
|
||||
<form action="/admin/market" methode="GET">
|
||||
<div class="field has-addons mt-5 mb-5">
|
||||
<div class="control is-expanded">
|
||||
<input class="input is-medium" type="text" name="search" placeholder="Rechercher une application..." value="{{ .Search }}">
|
||||
</div>
|
||||
<div class="control">
|
||||
<button type="submit" class="button is-medium">
|
||||
Rechercher
|
||||
</button>
|
||||
{{range .Results}}
|
||||
<div class="m-4 sm:block md:lg:flex w-100">
|
||||
<div class="flex flex-col md:flex-row md:max-w-xl rounded-lg bg-white shadow-lg">
|
||||
<div class="p-6 flex flex-col justify-start">
|
||||
<h5 class="text-gray-900 text-xl font-medium mb-2"><code>{{ .Name }}</code></h5>
|
||||
<p class="md:max-w-xl break-all text-gray-700 text-base mb-4 max-width">
|
||||
{{ .LatestRelease.Description }}
|
||||
</p>
|
||||
<div class="flex justify-between">
|
||||
<div>
|
||||
<p class="text-gray-600 text-xs">{{ localeTimeFormat .LatestRelease.CreatedAt.Time "02/01/2006 15:04" "fr_FR" }}</p>
|
||||
<p class="text-gray-600 text-xs">{{ .Owner.Username }} - V{{ .LatestRelease.Version }} </p>
|
||||
</div>
|
||||
<div>
|
||||
<a class="" href="/admin/market/{{ .ID }}/install"><img class="custom-icon" src="/icons/download-solid.svg"/></a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<div class="has-text-right">
|
||||
<b>Total</b> {{ .ResultsCount }}
|
||||
</div>
|
||||
<div class="table-container">
|
||||
<table class="table is-fullwidth is-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>ID</th>
|
||||
<th>Description</th>
|
||||
<th>Développeur</th>
|
||||
<th>Dernière version</th>
|
||||
<th>Dernière mise à jour</th>
|
||||
<th class="has-text-right">Actions</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{range .Results}}
|
||||
<tr>
|
||||
<td><code>{{ .Name }}</code></td>
|
||||
<td>{{ .LatestRelease.Description }}</td>
|
||||
<td>{{ .Owner.Username }}</td>
|
||||
<td>{{ .LatestRelease.Version }}</td>
|
||||
<td>{{ localeTimeFormat .LatestRelease.CreatedAt.Time "02/01/2006 15:04" "fr_FR" }}</td>
|
||||
<td>
|
||||
<div class="buttons are-small is-right">
|
||||
<a class="button is-link" href="/admin/market/{{ .ID }}/install">Installer</a>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
{{else}}
|
||||
<tr class="has-text-centered is-italic">
|
||||
<td colspan="6">
|
||||
Aucun résultat.
|
||||
</td>
|
||||
</tr>
|
||||
{{end}}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
{{else}}
|
||||
<div>
|
||||
Aucun résultat.
|
||||
</div>
|
||||
{{end}}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
@ -1,13 +1,13 @@
|
||||
{{define "title"}}Création du mot de passe - Administration - Arcad{{end}}
|
||||
{{define "body"}}
|
||||
{{template "header" .}}
|
||||
<section class="login is-fullheight section">
|
||||
<section class="block">
|
||||
<div class="container">
|
||||
<div class="columns">
|
||||
<div class="column is-offset-4 is-4">
|
||||
{{template "flash" .}}
|
||||
<div class="box">
|
||||
<h4 class="title is-size-4">Création du mot de passe de l'administrateur</h4>
|
||||
<h4 class="text-xl text-center font-bold mb-8">Création du mot de passe de l'administrateur</h4>
|
||||
<form method="POST">
|
||||
<div class="field">
|
||||
<div class="control">
|
||||
|
@ -1,34 +1,35 @@
|
||||
{{define "title"}}Configuration - Administration - Arcad{{end}}
|
||||
{{define "body"}}
|
||||
{{- block "head_style" . -}}
|
||||
<link rel="stylesheet" href="/css/admin_settings.css">
|
||||
{{end}}
|
||||
{{template "header" .}}
|
||||
<section class="home is-fullheight section" data-controller="clock-sync">
|
||||
<div class="container">
|
||||
<div class="columns">
|
||||
<div class="column is-2">
|
||||
{{template "admin_menu" "config"}}
|
||||
</div>
|
||||
<div class="mt-2">
|
||||
{{template "flash" .}}
|
||||
<h4 class="is-size-4">Réglages</h4>
|
||||
<form id="adminSettings" method="post">
|
||||
{{ .csrfField }}
|
||||
{{ $settings := .Settings }}
|
||||
{{range $id, $meta := .Metadatas}}
|
||||
{{ $se := $settings.Get $id }}
|
||||
{{ $data := createMap "ID" $id "Setting" $se "Meta" $meta }}
|
||||
{{if eq $meta.ValueType "password"}}
|
||||
{{template "password_setting" $data}}
|
||||
{{else if eq $meta.ValueType "markdown"}}
|
||||
{{template "markdown_setting" $data}}
|
||||
{{end}}
|
||||
{{end}}
|
||||
<div class="field is-grouped is-grouped-right">
|
||||
<p class="control">
|
||||
<input type="submit" class="button is-success" value="Enregistrer">
|
||||
</p>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<section class="block" data-controller="clock-sync">
|
||||
<div class="mt-6">
|
||||
{{template "admin_menu" "config"}}
|
||||
</div>
|
||||
<div class="content">
|
||||
{{template "flash" .}}
|
||||
<div class="mt-6">
|
||||
<h4 class="text-xl text-center font-bold mb-8">Réglages</h4>
|
||||
<form id="adminSettings" class="rounded-md shadow-xl shadow-cyan-800/50 p-8 block m-auto w-4/5" method="post">
|
||||
{{ .csrfField }}
|
||||
{{ $settings := .Settings }}
|
||||
{{range $id, $meta := .Metadatas}}
|
||||
{{ $se := $settings.Get $id }}
|
||||
{{ $data := createMap "ID" $id "Setting" $se "Meta" $meta }}
|
||||
{{if eq $meta.ValueType "password"}}
|
||||
{{template "password_setting" $data}}
|
||||
{{else if eq $meta.ValueType "markdown"}}
|
||||
{{template "markdown_setting" $data}}
|
||||
{{end}}
|
||||
{{end}}
|
||||
<div class="field is-grouped is-grouped-right">
|
||||
<p class="control">
|
||||
<input type="submit" class="block m-auto mt-8 bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded" value="Enregistrer">
|
||||
</p>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
@ -41,30 +42,32 @@
|
||||
{{template "base" .}}
|
||||
|
||||
{{define "password_setting"}}
|
||||
<div class="field">
|
||||
<label class="label">{{ .Meta.Label }}</label>
|
||||
<div>
|
||||
<label for="password" class="block text-gray-700 text-lg font-bold mb-2">{{ .Meta.Label }}</label>
|
||||
<div class="control">
|
||||
<input class="input" name="{{ .ID }}"
|
||||
<input class="shadow appearance-none border focus:border-cyan-600 rounded w-full py-2 px-3 text-gray-700 mb-3 leading-tight focus:outline-none focus:shadow-outline" name="{{ .ID }}"
|
||||
autocomplete="new-password"
|
||||
type="password">
|
||||
type="password"
|
||||
id="password">
|
||||
</div>
|
||||
</div>
|
||||
<div class="field">
|
||||
<label class="label">{{ .Meta.Label }} (confirmation)</label>
|
||||
<div>
|
||||
<label for="confirmPassword" class="block text-gray-700 text-lg font-bold mb-2">{{ .Meta.Label }} (confirmation)</label>
|
||||
<div class="control">
|
||||
<input class="input" name="{{ .ID }}-confirm"
|
||||
<input class="shadow appearance-none border focus:border-cyan-600 rounded w-full py-2 px-3 text-gray-700 mb-3 leading-tight focus:outline-none focus:shadow-outline" name="{{ .ID }}-confirm"
|
||||
autocomplete="new-password"
|
||||
type="password">
|
||||
type="password"
|
||||
id="confirmPassword">
|
||||
</div>
|
||||
</div>
|
||||
{{end}}
|
||||
|
||||
{{define "markdown_setting"}}
|
||||
<div class="field">
|
||||
<label class="label">{{ .Meta.Label }}</label>
|
||||
<div class="field">
|
||||
<div>
|
||||
<label for="homeMessage" class="block text-gray-700 text-lg font-bold mb-2">{{ .Meta.Label }}</label>
|
||||
<div>
|
||||
<div class="control">
|
||||
<textarea class="textarea" placeholder="{{ .Meta.DefaultValue }}" name="{{ .ID }}">{{- if .Setting}}{{ .Setting.Value }}{{end -}}</textarea>
|
||||
<textarea id="homeMessage" class="focus:border-cyan-600 block w-full px-3 py-1.5 text-base font-normal text-gray-700 bg-white bg-clip-padding border border-solid border-gray-300 rounded transition ease-in-out m-0 focus:text-gray-700 focus:bg-white focus:outline-none" placeholder="{{ .Meta.DefaultValue }}" name="{{ .ID }}">{{- if .Setting}}{{ .Setting.Value }}{{end -}}</textarea>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -1,7 +1,7 @@
|
||||
{{define "title"}}Informations de l'utilisateur - Administration - Arcad{{end}}
|
||||
{{define "body"}}
|
||||
{{template "header" .}}
|
||||
<section class="home is-fullheight section">
|
||||
<section class="block">
|
||||
<div class="container">
|
||||
<div class="columns">
|
||||
<div class="column is-2">
|
||||
|
@ -1,84 +1,84 @@
|
||||
{{define "title"}}Informations de l'utilisateur - Administration - Arcad{{end}}
|
||||
{{define "body"}}
|
||||
{{template "header" .}}
|
||||
<section class="home is-fullheight section">
|
||||
<div class="container">
|
||||
<div class="columns">
|
||||
<div class="column is-2">
|
||||
<section class="block">
|
||||
<div>
|
||||
<div>
|
||||
<div>
|
||||
{{template "admin_menu" ""}}
|
||||
</div>
|
||||
<div class="column is-10">
|
||||
<div>
|
||||
{{template "flash" .}}
|
||||
<div class="level">
|
||||
<div class="level-left">
|
||||
<a class="button level-item" href="/admin/users">← Retour</a>
|
||||
</div>
|
||||
<div class="level-right">
|
||||
<a class="button level-item is-danger" href="/admin/users/{{ .User.ID }}/delete">Supprimer</a>
|
||||
</div>
|
||||
</div>
|
||||
<form class="has-margin-top-small" action="/admin/users/{{ .User.ID }}" method="post">
|
||||
<div class="columns">
|
||||
<div class="column is-6">
|
||||
<h5 class="is-size-5">Informations de l'utilisateur</h5>
|
||||
<div class="field">
|
||||
<label class="label">Pseudonyme</label>
|
||||
<div class="control">
|
||||
<input class="input" type="text"
|
||||
<form action="/admin/users/{{ .User.ID }}" method="post">
|
||||
<div>
|
||||
<div>
|
||||
<h5 class="text-center text-gray-900 mt-4 text-xl font-medium font-bold mb-2">Informations de l'utilisateur</h5>
|
||||
<div class="w-5/6 block m-auto">
|
||||
<label class="block text-gray-700 text-lg font-bold mb-2">Pseudonyme</label>
|
||||
<div>
|
||||
<input class="shadow appearance-none border focus:border-cyan-600 rounded w-full py-2 px-3 text-gray-700 mb-3 leading-tight focus:outline-none focus:shadow-outline" type="text"
|
||||
name="nickname"
|
||||
value="{{if .Form}}{{ .Form.Get "nickname" }}{{else}}{{ .User.Nickname }}{{end}}">
|
||||
</div>
|
||||
</div>
|
||||
{{ .csrfField }}
|
||||
<div class="buttons" style="justify-content:flex-end">
|
||||
<button type="submit" class="button is-primary is-normal">Modifier</button>
|
||||
<button type="submit" class="block m-auto mt-2 mb-2 bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded">Modifier</button>
|
||||
</div>
|
||||
<div class="field">
|
||||
<label class="label">Date de création</label>
|
||||
<div class="control">
|
||||
<p class="input" readonly>
|
||||
<div class="w-5/6 block m-auto">
|
||||
<label class="block text-gray-700 text-lg font-bold mb-2">Date de création</label>
|
||||
<div>
|
||||
<p class="shadow appearance-none border focus:border-cyan-800 rounded w-full py-2 px-3 text-gray-700 mb-3 leading-tight focus:outline-none focus:shadow-outline" readonly>
|
||||
{{ localeTimeFormat .User.CreationTime "02/01/2006 15:04" "fr_FR" }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="field">
|
||||
<label class="label">Date de dernière connexion</label>
|
||||
<div class="control">
|
||||
<p class="input" readonly>
|
||||
<div class="w-5/6 block m-auto">
|
||||
<label class="block text-gray-700 text-lg font-bold mb-2">Date de dernière connexion</label>
|
||||
<div>
|
||||
<p class="shadow appearance-none border focus:border-cyan-800 rounded w-full py-2 px-3 text-gray-700 mb-3 leading-tight focus:outline-none focus:shadow-outline" readonly>
|
||||
{{ localeTimeFormat .User.LastSeenTime "02/01/2006 15:04" "fr_FR" }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
{{with .User.LastUserAgent}}
|
||||
<div class="field">
|
||||
<label class="label">Dernier système d'exploitation utilisé</label>
|
||||
<div class="control">
|
||||
<p class="input" readonly>
|
||||
{{ .OS.Name.StringTrimPrefix }} {{ .OS.Version.Major }}.{{ .OS.Version.Minor }}.{{ .OS.Version.Patch }}
|
||||
</p>
|
||||
<div class="w-5/6 block m-auto">
|
||||
<label class="block text-gray-700 text-lg font-bold mb-2">Dernier système d'exploitation utilisé</label>
|
||||
<div>
|
||||
<p class="shadow appearance-none border focus:border-cyan-800 rounded w-full py-2 px-3 text-gray-700 mb-3 leading-tight focus:outline-none focus:shadow-outline" readonly>
|
||||
{{ .OS.Name.StringTrimPrefix }} {{ .OS.Version.Major }}.{{ .OS.Version.Minor }}.{{ .OS.Version.Patch }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="field">
|
||||
<label class="label">Dernier navigateur utilisé</label>
|
||||
<div class="control">
|
||||
<p class="input" readonly>
|
||||
{{ .Browser.Name.StringTrimPrefix }} {{ .Browser.Version.Major }}.{{ .Browser.Version.Minor }}.{{ .Browser.Version.Patch }}
|
||||
</p>
|
||||
<div class="w-5/6 block m-auto">
|
||||
<label class="block text-gray-700 text-lg font-bold mb-2">Dernier navigateur utilisé</label>
|
||||
<div>
|
||||
<p class="shadow appearance-none border focus:border-cyan-800 rounded w-full py-2 px-3 text-gray-700 mb-3 leading-tight focus:outline-none focus:shadow-outline" readonly>
|
||||
{{ .Browser.Name.StringTrimPrefix }} {{ .Browser.Version.Major }}.{{ .Browser.Version.Minor }}.{{ .Browser.Version.Patch }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="field">
|
||||
<label class="label">Dernier type de terminal utilisé</label>
|
||||
<div class="control">
|
||||
<p class="input" readonly>
|
||||
{{ .DeviceType.StringTrimPrefix }}
|
||||
</p>
|
||||
<div class="w-5/6 block m-auto">
|
||||
<label class="block text-gray-700 text-lg font-bold mb-2">Dernier type de terminal utilisé</label>
|
||||
<div>
|
||||
<p class="shadow appearance-none border focus:border-cyan-800 rounded w-full py-2 px-3 text-gray-700 mb-3 leading-tight focus:outline-none focus:shadow-outline" readonly>
|
||||
{{ .DeviceType.StringTrimPrefix }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{end}}
|
||||
<div class="flex justify-around">
|
||||
<div>
|
||||
<a class="items-center py-2 px-4 text-sm font-medium text-center text-gray-900 bg-blue-500 rounded-lg border border-gray-300 hover:bg-gray-100 focus:ring-4 focus:outline-none focus:ring-gray-200 dark:bg-gray-800 dark:text-white dark:border-gray-600 dark:hover:bg-gray-700 dark:hover:border-gray-700 dark:focus:ring-gray-700" href="/admin/users">← Retour</a>
|
||||
</div>
|
||||
<div>
|
||||
<a class="items-center py-2 px-4 text-sm font-medium text-center text-gray-900 bg-red-500 rounded-lg border border-gray-300 hover:bg-gray-100 focus:ring-4 focus:outline-none focus:ring-gray-200 dark:bg-gray-800 dark:text-white dark:border-gray-600 dark:hover:bg-gray-700 dark:hover:border-gray-700 dark:focus:ring-gray-700" href="/admin/users/{{ .User.ID }}/delete">Supprimer</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="column is-6">
|
||||
<h5 class="is-size-5">Carte de membre</h5>
|
||||
<div class="box has-margin-top-small">
|
||||
<div>
|
||||
<h5 class="text-gray-900 text-xl font-medium mb-2">Carte de membre</h5>
|
||||
<div class="max-width-full">
|
||||
<figure class="image is-3by2">
|
||||
<a href="/admin/users/{{ .User.ID }}/card" rel="Member card" download="ArcadBox-Member-{{ .User.Nickname }}">
|
||||
<img src="/admin/users/{{ .User.ID }}/card" />
|
||||
|
@ -1,50 +1,36 @@
|
||||
{{define "title"}}Utilisateurs - Administration - Arcad{{end}}
|
||||
{{define "body"}}
|
||||
{{template "header" .}}
|
||||
<section class="home is-fullheight section">
|
||||
<div class="container">
|
||||
<div class="columns">
|
||||
<div class="column is-2">
|
||||
{{template "admin_menu" "users"}}
|
||||
<section class="block">
|
||||
<div class="mt-6">
|
||||
{{template "admin_menu" "config"}}
|
||||
</div>
|
||||
<div>
|
||||
{{template "flash" .}}
|
||||
<div class="mt-6">
|
||||
<h4 class="text-xl text-center font-bold mb-8">Liste des utilisateurs</h4>
|
||||
<div class="text-right mr-4">
|
||||
<b>Total</b> {{ .UsersCount }}
|
||||
</div>
|
||||
<div class="column is-10">
|
||||
{{template "flash" .}}
|
||||
<h4 class="is-size-4">Liste des utilisateurs</h4>
|
||||
<div class="has-text-right">
|
||||
<b>Total</b> {{ .UsersCount }}
|
||||
<div class="container ">
|
||||
{{range .Users}}
|
||||
<div class="mt-4 w-11/12 m-auto max-w-sm bg-white rounded-lg border border-gray-200 shadow-md dark:bg-gray-800 dark:border-gray-700">
|
||||
<div class="flex flex-col items-center pb-3">
|
||||
<img class="mb-3 mt-3 w-24 h-24 rounded-full shadow-lg" src="/assets/team-poney-alone.svg"/>
|
||||
<h5 class="mb-1 text-xl font-medium text-gray-900 dark:text-white">{{ .Nickname}}</h5>
|
||||
<span class="text-sm text-gray-500 dark:text-gray-400">{{ .Nickname }}</span>
|
||||
<div class="flex mt-4 space-x-3 lg:mt-6">
|
||||
<a href="/admin/users/{{ .ID }}" class="inline-flex items-center py-2 px-4 text-sm font-medium text-center text-white bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded">Voir</a>
|
||||
<a href="/admin/users/{{ .ID }}/delete" class="inline-flex items-center py-2 px-4 text-sm font-medium text-center text-gray-900 bg-white rounded-lg border border-gray-300 hover:bg-gray-100 focus:ring-4 focus:outline-none focus:ring-gray-200 dark:bg-gray-800 dark:text-white dark:border-gray-600 dark:hover:bg-gray-700 dark:hover:border-gray-700 dark:focus:ring-gray-700">Supprimer</a>
|
||||
</div>
|
||||
<div class="flex mt-4 space-x-3 lg:mt-6">
|
||||
<span>{{ localeTimeFormat .CreationTime "02/01/2006 15:04" "fr_FR" }}</span>
|
||||
<span>{{ localeTimeFormat .LastSeenTime "02/01/2006 15:04" "fr_FR" }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{end}}
|
||||
</div>
|
||||
<div class="table-container">
|
||||
<table class="table is-hovered is-fullwidth is-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Pseudonyme</th>
|
||||
<th>Date d'enregistrement</th>
|
||||
<th>Dernière connexion</th>
|
||||
<th>Actions</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{range .Users}}
|
||||
<tr>
|
||||
<td>{{ .Nickname }}</td>
|
||||
<td>{{ localeTimeFormat .CreationTime "02/01/2006 15:04" "fr_FR" }}</td>
|
||||
<td>{{ localeTimeFormat .LastSeenTime "02/01/2006 15:04" "fr_FR" }}</td>
|
||||
<td>
|
||||
<div class="field is-grouped">
|
||||
<div class="control">
|
||||
<a class="button is-danger is-small" href="/admin/users/{{ .ID }}/delete">Supprimer</a>
|
||||
</div>
|
||||
<div class="control">
|
||||
<a class="button is-info is-small" href="/admin/users/{{ .ID }}">Voir</a>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
{{end}}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
@ -1,22 +1,18 @@
|
||||
{{define "title"}}{{ .App.Manifest.Title }} - Arcad{{end}}
|
||||
{{define "body"}}
|
||||
<div class="app-wrapper" data-controller="app" data-app-frame-src="./{{ .App.Manifest.ID }}/">
|
||||
<div class="flex h-full w-full flex-col" data-controller="app" data-app-frame-src="./{{ .App.Manifest.ID }}/">
|
||||
<div class="app-header">
|
||||
<div class="level is-marginless is-mobile">
|
||||
<div class="flex justify-between">
|
||||
<div class="level-left">
|
||||
<a href="../" class="level-item button is-link is-small">
|
||||
<svg class="icon">
|
||||
<use xlink:href="#home"></use>
|
||||
</svg>
|
||||
<img class="custom-icon" width="50" height="50" src="/icons/house-solid.svg"/>
|
||||
</a>
|
||||
</div>
|
||||
<div class="level-right">
|
||||
{{if .App.Manifest.Options.HighscoresEnabled}}
|
||||
<a href="../highscores/{{ .App.Manifest.ID }}" class="level-item button is-link is-small">
|
||||
<span>Classement</span>
|
||||
<svg class="icon">
|
||||
<use xlink:href="#trophy"></use>
|
||||
</svg>
|
||||
<a class="flex" href="../highscores/{{ .App.Manifest.ID }}" class="level-item button is-link is-small">
|
||||
<span class="mr-1">Classement</span>
|
||||
<img class="custom-icon" width="50" height="50" src="/icons/trophy-solid.svg"/>
|
||||
</a>
|
||||
{{end}}
|
||||
</div>
|
||||
|
@ -1,6 +1,6 @@
|
||||
{{define "title"}}Borne non disponible - Arcad{{end}}
|
||||
{{define "body"}}
|
||||
<section class="is-fullheight section">
|
||||
<section class="block">
|
||||
<div class="is-flex is-justify-content-center is-align-content-center is-fullheight">
|
||||
<div class="message is-warning is-align-self-center">
|
||||
<div class="message-body">
|
||||
|
@ -5,7 +5,7 @@
|
||||
{{ if .IsAndroid }}
|
||||
{{ $redirectUrl := "intent://arcadbox.local/captive?escape=1#Intent;scheme=http;end" }}
|
||||
{{ end }}
|
||||
<section class="home is-fullheight section">
|
||||
<section class="block">
|
||||
<div class="container">
|
||||
<div class="message is-info">
|
||||
<div class="message-body">
|
||||
|
@ -1,27 +1,23 @@
|
||||
{{define "title"}}{{.App.Manifest.Title}} - Tableau des scores - Arcad{{end}}
|
||||
{{define "body"}}
|
||||
{{template "header" .}}
|
||||
<section class="home is-fullheight section">
|
||||
<div class="container">
|
||||
<div class="level">
|
||||
<div class="level-left">
|
||||
<h1 class="title level-item">{{.App.Manifest.Title}}</h1>
|
||||
<h2 class="subtitle level-item">Tableau des scores</h2>
|
||||
</div>
|
||||
<div class="level-right">
|
||||
<a class="level-item button is-primary is-large" href="/apps/{{ .App.ID }}">
|
||||
<section class="block">
|
||||
<div>
|
||||
<div class="flex">
|
||||
<h1 class="text-4xl mt-2 text-center">{{.App.Manifest.Title}}</h1>
|
||||
<a class="flex m-5"
|
||||
href="/apps/{{ .App.ID }}">
|
||||
<span>Ouvrir</span>
|
||||
<svg class="icon">
|
||||
<use xlink:href="#chevron-right"></use>
|
||||
</svg>
|
||||
<img class="custom-icon" width="50" height="50" src="/icons/chevron-right-solid.svg"/>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="columns">
|
||||
<div class="column">
|
||||
<div>
|
||||
<div>
|
||||
<h2 class="text-xl text-center">Podium</h2>
|
||||
{{template "podium" .}}
|
||||
</div>
|
||||
<div class="column">
|
||||
<div class="mb-4">
|
||||
<h2 class="text-xl">Tableau des scores</h2>
|
||||
{{template "highscores" .}}
|
||||
</div>
|
||||
</div>
|
||||
@ -67,7 +63,6 @@
|
||||
<span class="pod-position">1</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="pod third">
|
||||
{{ if gt (len .Highscores) 2 }}
|
||||
{{ $thirdPlayerHighscore := index .Highscores 2 }}
|
||||
@ -83,7 +78,6 @@
|
||||
<div class="pod-position">3</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
{{end}}
|
||||
@ -91,30 +85,46 @@
|
||||
|
||||
{{define "highscores"}}
|
||||
{{ $users := .Users }}
|
||||
<div class="table-container">
|
||||
<table class="table is-fullwidth is-hoverable is-striped">
|
||||
<thead>
|
||||
<th>Position</th>
|
||||
<th>Pseudonyme</th>
|
||||
<th>Score</th>
|
||||
<th>Date</th>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{range $i, $h := .Highscores}}
|
||||
{{ $user := (index $users $h.UserID) }}
|
||||
<table class="w-full text-sm text-left text-gray-500 dark:text-gray-400">
|
||||
<thead class="text-xs text-gray-700 uppercase bg-gray-50 dark:bg-gray-700 dark:text-gray-400">
|
||||
<tr>
|
||||
{{ $position := addInt $i 1 }}
|
||||
<td>{{ $position }}</td>
|
||||
<td>{{with $user}}{{ .Nickname }}{{else}}???{{end}}</td>
|
||||
<td>{{ $h.Score }}</td>
|
||||
<td>{{ localeTimeFormat $h.CreationTime "02/01/2006 15:04" "fr_FR" }}</td>
|
||||
<th scope="col" class="px-6 py-3">
|
||||
Position
|
||||
</th>
|
||||
<th scope="col" class="px-6 py-3">
|
||||
Pseudonyme
|
||||
</th>
|
||||
<th scope="col" class="px-6 py-3">
|
||||
Score
|
||||
</th>
|
||||
<th scope="col" class="px-6 py-3">
|
||||
Date
|
||||
</th>
|
||||
</tr>
|
||||
{{else}}
|
||||
<tr>
|
||||
<td colspan="4" class="has-text-centered is-italic">Aucun score pour l'instant.</td>
|
||||
</tr>
|
||||
{{end}}
|
||||
</thead>
|
||||
<tbody>
|
||||
{{range $i, $h := .Highscores}}
|
||||
{{ $user := (index $users $h.UserID) }}
|
||||
<tr class="bg-white border-b dark:bg-gray-800 dark:border-gray-700">
|
||||
{{ $position := addInt $i 1 }}
|
||||
<td scope="row" class="px-6 py-4 font-medium text-gray-900 dark:text-white whitespace-nowrap">
|
||||
{{ $position }}
|
||||
</td>
|
||||
<td class="px-6 py-4">
|
||||
{{with $user}}{{ .Nickname }}{{else}}???{{end}}
|
||||
</td>
|
||||
<td class="px-6 py-4">
|
||||
{{ $h.Score }}
|
||||
</td>
|
||||
<td class="px-6 py-4">
|
||||
{{ localeTimeFormat $h.CreationTime "02/01/2006 15:04" "fr_FR" }}
|
||||
</td>
|
||||
</tr>
|
||||
{{else}}
|
||||
<tr class="bg-white border-b dark:bg-gray-800 dark:border-gray-700">
|
||||
<td colspan="4" class="has-text-centered is-italic">Aucun score pour l'instant.</td>
|
||||
</tr>
|
||||
{{end}}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{{end}}
|
@ -1,24 +1,38 @@
|
||||
{{define "title"}}Accueil - Arcad{{end}}
|
||||
{{define "body"}}
|
||||
{{template "header" .}}
|
||||
<section class="home is-fullheight section">
|
||||
<section class="block">
|
||||
|
||||
<div id="main" class="container">
|
||||
<img src="/assets/arcad.svg">
|
||||
{{if and .WelcomeMessage .WelcomeMessage.Value}}
|
||||
<div class="message is-info is-small">
|
||||
<div class="message-body">
|
||||
<div class="content">
|
||||
<div class="mt-4">
|
||||
{{markdown .WelcomeMessage.Value}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{end}}
|
||||
<div class="tile is-ancestor is-wrap tile-container">
|
||||
{{range .Apps}}
|
||||
{{- template "app_tile" . -}}
|
||||
{{end}}
|
||||
<div class="arcadContent">
|
||||
<h1 class="font-bold text-3xl mt-4 mb-4">Qu'est ce que c'est ?</h1>
|
||||
<p>Arcad est une suite de logiciels libres, permettant de proposer des services numériques (applications web) de proximité i.e. hébergés sur des équipements réseaux du type borne WiFi (Linksys WRT1900AC par exemple) ou micro-serveur domestique (serveur NAS, Raspberry Pi).
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<section class="block">
|
||||
<h2 class="font-bold text-3xl mt-4 mb-4 text-center">Pourquoi ?</h2>
|
||||
<div class="arcadContent">
|
||||
<p>
|
||||
Un des objectifs du projet est d'offrir un système capable de fonctionner en autonomie: les terminaux numériques (ordinateur, smartphones, tablettes...) des utilisateurs ne doivent pas nécessiter de connexion Internet pour pouvoir accéder aux services.
|
||||
</p>
|
||||
<p>
|
||||
De manière optionnelle, les services intégrés sur une instance Arcad peuvent être exposés sur Internet via un serveur relais disposant d'une adresse publique.
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2 class="text-gray-900 text-3xl font-bold font-lg mb-2 mt-2 text-center">Applications</h2>
|
||||
{{range .Apps}}
|
||||
{{- template "app_tile" . -}}
|
||||
{{end}}
|
||||
</section>
|
||||
|
||||
{{end}}
|
||||
{{template "base" .}}
|
||||
|
@ -1,74 +1,59 @@
|
||||
{{define "title"}}Profil - Arcad{{end}}
|
||||
{{define "body"}}
|
||||
{{template "header" .}}
|
||||
<section>
|
||||
<section class="block">
|
||||
<div>
|
||||
{{template "flash" .}}
|
||||
<form action="/login" method="POST" enctype="multipart/form-data">
|
||||
<div class="field" style="margin-bottom:0">
|
||||
<div class="file is-medium is-success" id="memberCard">
|
||||
<label class="file-label">
|
||||
<input class="file-input" type="file" name="memberCard">
|
||||
<span class="file-cta">
|
||||
<span class="file-icon">
|
||||
<svg class="icon" width="50" height="50">
|
||||
<use xlink:href="#address-card"></use>
|
||||
</svg>
|
||||
</span>
|
||||
<span class="file-label">
|
||||
Se connecter
|
||||
</span>
|
||||
</span>
|
||||
</label>
|
||||
</div>
|
||||
<form action="/login" method="POST" enctype="multipart/form-data">
|
||||
<div class="flex justify-around mb-8">
|
||||
<div class="memberCard">
|
||||
<label
|
||||
class="m-auto h-44 flex flex-col items-center px-4 py-6 bg-white rounded-md shadow-md tracking-wide uppercase border border-blue cursor-pointer ease-linear transition-all duration-150">
|
||||
<img class="custom-icon profile-icon" src="/icons/cloud-arrow-up-solid.svg"/>
|
||||
<span class="mt-2 text-base leading-normal">Connexion</span>
|
||||
<input name="memberCard" type='file' class="hidden" />
|
||||
</label>
|
||||
</div>
|
||||
{{ .csrfField }}
|
||||
</form>
|
||||
</div>
|
||||
<div class="level-item">
|
||||
<a href="/logout" class="button is-warning is-medium">
|
||||
<svg class="icon" width="50" height="50">
|
||||
<use xlink:href="#sign-out-alt"></use>
|
||||
</svg>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="columns">
|
||||
<div class="column is-6">
|
||||
<h5 class="is-size-5">Vos informations</h5>
|
||||
<form class="has-margin-top-small" action="/profile" method="post">
|
||||
<div class="field">
|
||||
<label class="label">Pseudonyme</label>
|
||||
<div class="control">
|
||||
<input class="input is-medium" type="text"
|
||||
name="nickname"
|
||||
value="{{if .Form}}{{ .Form.Get "nickname" }}{{else}}{{ .User.Nickname }}{{end}}">
|
||||
<div class="memberCard">
|
||||
<a href="/logout" class="button is-warning is-medium">
|
||||
<label
|
||||
class="m-auto h-44 flex flex-col items-center px-4 py-6 bg-white rounded-md shadow-md tracking-wide uppercase border border-blue cursor-pointer ease-linear transition-all duration-150">
|
||||
<img class="custom-icon profile-icon" src="/icons/arrow-right-from-bracket-solid.svg"/>
|
||||
<span class="mt-2 text-base leading-normal">Deconnexion</span>
|
||||
</a>
|
||||
</label>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
{{ .csrfField }}
|
||||
</form>
|
||||
<h5 class="text-center text-gray-900 mt-4 text-xl font-medium font-bold mb-2">Vos informations</h5>
|
||||
<form action="/profile" method="post">
|
||||
<div>
|
||||
<label class="block text-gray-700 text-md font-bold mb-2">Pseudonyme</label>
|
||||
<div>
|
||||
<input class="shadow appearance-none border focus:border-cyan-600 rounded w-full py-2 px-3 text-gray-700 mb-3 leading-tight focus:outline-none focus:shadow-outline" type="text"
|
||||
name="nickname"
|
||||
value="{{if .Form}}{{ .Form.Get "nickname" }}{{else}}{{ .User.Nickname }}{{end}}">
|
||||
</div>
|
||||
</div>
|
||||
{{ .csrfField }}
|
||||
<div class="buttons" style="justify-content:flex-end">
|
||||
<button type="submit" class="button is-primary is-medium">
|
||||
<span>Modifier</span>
|
||||
<span class="icon">
|
||||
<svg class="icon" width="50" height="50">
|
||||
<use xlink:href="#edit"></use>
|
||||
</svg>
|
||||
</span>
|
||||
<button type="submit" class="block m-auto mt-8 bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded">
|
||||
<span>Modifier</span>
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div class="column is-6">
|
||||
<h5 class="is-size-5">Carte de membre</h5>
|
||||
<article class="message is-info">
|
||||
<div class="message-body">
|
||||
<div>
|
||||
<h5 class="text-center text-gray-900 mt-4 text-xl font-medium font-bold mb-2">Carte de membre</h5>
|
||||
<article>
|
||||
<div>
|
||||
Téléchargez et utilisez votre carte de membre afin de pouvoir vous authentifier la prochaine fois avec le même pseudonyme !
|
||||
</div>
|
||||
</article>
|
||||
<figure class="image is-3by2 has-margin-top-small">
|
||||
<figure class="max-width-full p-2 block m-auto">
|
||||
<a href="/profile/card" rel="Member card" download="ArcadBox-Member-{{ .User.Nickname }}">
|
||||
<img src="/profile/card" />
|
||||
<img class="" src="/profile/card" />
|
||||
</a>
|
||||
</figure>
|
||||
</div>
|
||||
|
Reference in New Issue
Block a user