Updates
This commit is contained in:
parent
752b2a291e
commit
d24c304c97
@ -387,4 +387,52 @@ class AjaxController extends AbstractController
|
|||||||
|
|
||||||
return $res;
|
return $res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[Route('/save-settings', name: 'app_save_settings', methods: ['POST'])]
|
||||||
|
public function saveSettings(Request $req, EntityManagerInterface $emi): Response
|
||||||
|
{
|
||||||
|
$data = json_decode($req->getContent());
|
||||||
|
/** @var User $user */
|
||||||
|
$user = $this->getUser();
|
||||||
|
|
||||||
|
if (!$user) {
|
||||||
|
return new Response(json_encode([
|
||||||
|
'msg' => 'No User'
|
||||||
|
]));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$data->saveInterval) {
|
||||||
|
$data->saveInterval = 15;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$data->saveReferences) {
|
||||||
|
$data->saveReferences = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$data->noteTextSize) {
|
||||||
|
$data->noteTextSize = 12;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$data->trackSaveSize) {
|
||||||
|
$data->trackSaveSize = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$meta = $user->getMetaData();
|
||||||
|
$meta['saveInterval'] = $data->saveInterval;
|
||||||
|
$meta['saveReferences'] = $data->saveReferences;
|
||||||
|
$meta['noteTextSize'] = $data->noteTextSize;
|
||||||
|
$meta['trackSaveSize'] = $data->trackSaveSize;
|
||||||
|
$meta['saveTimeout'] = $data->saveTimeout;
|
||||||
|
$meta['save-failure-count'] = $data->saveFailureCount;
|
||||||
|
$user->setMetaData($meta);
|
||||||
|
$emi->persist($user);
|
||||||
|
$emi->flush();
|
||||||
|
|
||||||
|
$res = new Response();
|
||||||
|
$res->setContent(json_encode([
|
||||||
|
'msg' => 'Settings Saved'
|
||||||
|
]));
|
||||||
|
|
||||||
|
return $res;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,6 @@
|
|||||||
namespace App\Controller;
|
namespace App\Controller;
|
||||||
|
|
||||||
use App\Entity\Note;
|
use App\Entity\Note;
|
||||||
use App\Entity\Reference;
|
|
||||||
use App\Entity\User;
|
use App\Entity\User;
|
||||||
use Doctrine\ORM\EntityManagerInterface;
|
use Doctrine\ORM\EntityManagerInterface;
|
||||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||||
@ -11,7 +10,6 @@ use Symfony\Component\HttpFoundation\Request;
|
|||||||
use Symfony\Component\HttpFoundation\Response;
|
use Symfony\Component\HttpFoundation\Response;
|
||||||
use Symfony\Component\Routing\Attribute\Route;
|
use Symfony\Component\Routing\Attribute\Route;
|
||||||
use Symfony\Component\Security\Http\Attribute\CurrentUser;
|
use Symfony\Component\Security\Http\Attribute\CurrentUser;
|
||||||
use Symfony\Component\Uid\Uuid;
|
|
||||||
|
|
||||||
class DefaultController extends AbstractController
|
class DefaultController extends AbstractController
|
||||||
{
|
{
|
||||||
@ -30,11 +28,13 @@ class DefaultController extends AbstractController
|
|||||||
$this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
|
$this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
|
||||||
$last4Notes = $emi->getRepository(Note::class)->getLast4Notes($user);
|
$last4Notes = $emi->getRepository(Note::class)->getLast4Notes($user);
|
||||||
$openNotes = $emi->getRepository(Note::class)->reverseNoteSort($user);
|
$openNotes = $emi->getRepository(Note::class)->reverseNoteSort($user);
|
||||||
|
$meta = $user->getMetaData();
|
||||||
|
|
||||||
return $this->render('default/home.html.twig', [
|
return $this->render('default/home.html.twig', [
|
||||||
'last4Notes' => $last4Notes,
|
'last4Notes' => $last4Notes,
|
||||||
'reverseNoteSort' => $openNotes,
|
'reverseNoteSort' => $openNotes,
|
||||||
'isAdmin' => $this->isGranted('ROLE_ADMIN'),
|
'isAdmin' => $this->isGranted('ROLE_ADMIN'),
|
||||||
|
'meta' => $meta,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -44,6 +44,31 @@ class DefaultController extends AbstractController
|
|||||||
return $this->render('default/cheat-sheet.html.twig');
|
return $this->render('default/cheat-sheet.html.twig');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[Route('/profile', name: 'app_profile')]
|
||||||
|
public function profile(): Response
|
||||||
|
{
|
||||||
|
/** @var User $user */
|
||||||
|
$user = $this->getUser();
|
||||||
|
$meta = $user->getMetaData();
|
||||||
|
if (!$meta) {
|
||||||
|
$meta = [
|
||||||
|
'saveInterval' => 15,
|
||||||
|
'saveReferences' => 'checked',
|
||||||
|
'noteTextSize' => 12,
|
||||||
|
'trackSaveSize' => null,
|
||||||
|
'saveFailureCount' => 3,
|
||||||
|
'saveTimeout' => 5,
|
||||||
|
];
|
||||||
|
} else {
|
||||||
|
$meta['saveReferences'] = $meta['saveReferences'] ? 'checked' : null;
|
||||||
|
$meta['trackSaveSize'] = $meta['trackSaveSize'] ? 'checked' : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->render('default/profile.html.twig', [
|
||||||
|
'meta' => $meta,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
#[Route('/reference-editor', name: 'app_reference_editor')]
|
#[Route('/reference-editor', name: 'app_reference_editor')]
|
||||||
public function referenceEditor(EntityManagerInterface $emi): Response
|
public function referenceEditor(EntityManagerInterface $emi): Response
|
||||||
{
|
{
|
||||||
|
@ -68,12 +68,22 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface, JsonSer
|
|||||||
#[ORM\OneToMany(targetEntity: Note::class, mappedBy: 'user')]
|
#[ORM\OneToMany(targetEntity: Note::class, mappedBy: 'user')]
|
||||||
private Collection $notes;
|
private Collection $notes;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var Collection<int, NoteShares>
|
||||||
|
*/
|
||||||
|
#[ORM\OneToMany(targetEntity: NoteShares::class, mappedBy: 'ownerId', orphanRemoval: true)]
|
||||||
|
private Collection $noteShares;
|
||||||
|
|
||||||
|
#[ORM\Column(nullable: true)]
|
||||||
|
private ?array $metaData = null;
|
||||||
|
|
||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
$this->series = new ArrayCollection();
|
$this->series = new ArrayCollection();
|
||||||
$this->speakers = new ArrayCollection();
|
$this->speakers = new ArrayCollection();
|
||||||
$this->templates = new ArrayCollection();
|
$this->templates = new ArrayCollection();
|
||||||
$this->notes = new ArrayCollection();
|
$this->notes = new ArrayCollection();
|
||||||
|
$this->noteShares = new ArrayCollection();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getId(): ?Uuid
|
public function getId(): ?Uuid
|
||||||
@ -81,6 +91,11 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface, JsonSer
|
|||||||
return $this->id;
|
return $this->id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getHexId(): string
|
||||||
|
{
|
||||||
|
return $this->id->toHex();
|
||||||
|
}
|
||||||
|
|
||||||
public function setId(?Uuid $id): static
|
public function setId(?Uuid $id): static
|
||||||
{
|
{
|
||||||
$this->id = $id;
|
$this->id = $id;
|
||||||
@ -303,4 +318,46 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface, JsonSer
|
|||||||
'name' => $this->name,
|
'name' => $this->name,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Collection<int, NoteShares>
|
||||||
|
*/
|
||||||
|
public function getNoteShares(): Collection
|
||||||
|
{
|
||||||
|
return $this->noteShares;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function addNoteShare(NoteShares $noteShare): static
|
||||||
|
{
|
||||||
|
if (!$this->noteShares->contains($noteShare)) {
|
||||||
|
$this->noteShares->add($noteShare);
|
||||||
|
$noteShare->setOwner($this);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function removeNoteShare(NoteShares $noteShare): static
|
||||||
|
{
|
||||||
|
if ($this->noteShares->removeElement($noteShare)) {
|
||||||
|
// set the owning side to null (unless already changed)
|
||||||
|
if ($noteShare->getOwner() === $this) {
|
||||||
|
$noteShare->setOwner(null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getMetaData(): ?array
|
||||||
|
{
|
||||||
|
return $this->metaData;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setMetaData(?array $metaData): static
|
||||||
|
{
|
||||||
|
$this->metaData = $metaData;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,12 @@
|
|||||||
<link href='/theme/assets/css/jquery-ui.structure.css' rel='stylesheet' />
|
<link href='/theme/assets/css/jquery-ui.structure.css' rel='stylesheet' />
|
||||||
<link href='/css/style.css' rel='stylesheet' />
|
<link href='/css/style.css' rel='stylesheet' />
|
||||||
<link href='//cdn.datatables.net/2.0.8/css/dataTables.dataTables.min.css' rel='stylesheet' />
|
<link href='//cdn.datatables.net/2.0.8/css/dataTables.dataTables.min.css' rel='stylesheet' />
|
||||||
|
<style>
|
||||||
|
#notes,
|
||||||
|
#notePreview {
|
||||||
|
font-size: {{ meta.noteTextSize }}pt;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block javascripts %}
|
{% block javascripts %}
|
||||||
@ -20,6 +26,12 @@
|
|||||||
<script src='//momentjs.com/downloads/moment-with-locales.js'></script>
|
<script src='//momentjs.com/downloads/moment-with-locales.js'></script>
|
||||||
<script src="//cdnjs.cloudflare.com/ajax/libs/markdown-it/13.0.2/markdown-it.min.js" integrity="sha512-ohlWmsCxOu0bph1om5eDL0jm/83eH09fvqLDhiEdiqfDeJbEvz4FSbeY0gLJSVJwQAp0laRhTXbUQG+ZUuifUQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
|
<script src="//cdnjs.cloudflare.com/ajax/libs/markdown-it/13.0.2/markdown-it.min.js" integrity="sha512-ohlWmsCxOu0bph1om5eDL0jm/83eH09fvqLDhiEdiqfDeJbEvz4FSbeY0gLJSVJwQAp0laRhTXbUQG+ZUuifUQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
|
||||||
<script src='//cdn.datatables.net/2.0.8/js/dataTables.min.js'></script>
|
<script src='//cdn.datatables.net/2.0.8/js/dataTables.min.js'></script>
|
||||||
|
<script>
|
||||||
|
let saveInterval = ({{ meta.saveInterval }} * 1000);
|
||||||
|
let saveTimeout = ({{ meta.saveTimeout }} * 1000);
|
||||||
|
const SAVE_FAILURE_LIMIT = {{ meta.saveFailureCount }};
|
||||||
|
let saveFailureCount = {{ meta.saveFailureCount }};
|
||||||
|
</script>
|
||||||
<script src='/js/script.js'></script>
|
<script src='/js/script.js'></script>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
@ -50,11 +62,6 @@
|
|||||||
<th>Date</th>
|
<th>Date</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
{#<tbody>
|
|
||||||
{% for n in reverseNoteSort %}
|
|
||||||
{{ n.toTableRow()|raw }}
|
|
||||||
{% endfor %}
|
|
||||||
</tbody>#}
|
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
@ -62,10 +69,10 @@
|
|||||||
<section class="notes">
|
<section class="notes">
|
||||||
<div id='note-header-left'>
|
<div id='note-header-left'>
|
||||||
<h2>Notes</h2>
|
<h2>Notes</h2>
|
||||||
<i id='save-check' class='fa fa-check'></i>
|
<i id='save-check' class='fa fa-save'></i>
|
||||||
</div>
|
</div>
|
||||||
<div id='note-header-right'>
|
<div id='note-header-right'>
|
||||||
<select id='template' onchange="retrieveTemplate('template','notes')">
|
<select id='template' onchange="retrieveTemplate('template','notes')" style='width:200px;'>
|
||||||
<option value=0>-- Template --</option>
|
<option value=0>-- Template --</option>
|
||||||
{% for t in app.user.templates %}
|
{% for t in app.user.templates %}
|
||||||
<option value="{{ t.id }}">{{ t.name }}</option>
|
<option value="{{ t.id }}">{{ t.name }}</option>
|
||||||
|
156
templates/default/profile.html.twig
Normal file
156
templates/default/profile.html.twig
Normal file
@ -0,0 +1,156 @@
|
|||||||
|
{% extends 'base.html.twig' %}
|
||||||
|
|
||||||
|
{% block title %}Profile | Sermon Notes{% endblock %}
|
||||||
|
|
||||||
|
{% block stylesheets %}
|
||||||
|
<link href="/theme/assets/css/main.css" rel="stylesheet" />
|
||||||
|
<link href='/theme/assets/css/jquery-ui.theme.css' rel='stylesheet' />
|
||||||
|
<link href='/theme/assets/css/jquery-ui.structure.css' rel='stylesheet' />
|
||||||
|
<link href='/css/style.css' rel='stylesheet' />
|
||||||
|
<link href='//cdn.datatables.net/2.0.8/css/dataTables.dataTables.min.css' rel='stylesheet' />
|
||||||
|
<style>
|
||||||
|
.flex-container {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
flex-wrap: nowrap;
|
||||||
|
justify-content: normal;
|
||||||
|
align-items: normal;
|
||||||
|
align-content: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
.user-flex {
|
||||||
|
display: block;
|
||||||
|
flex-grow: 1;
|
||||||
|
flex-shrink: 1;
|
||||||
|
flex-basis: auto;
|
||||||
|
align-self: auto;
|
||||||
|
order: 0;
|
||||||
|
border: solid 1px black;
|
||||||
|
}
|
||||||
|
|
||||||
|
.settings-flex {
|
||||||
|
display: block;
|
||||||
|
flex-grow: 1;
|
||||||
|
flex-shrink: 0;
|
||||||
|
flex-basis: auto;
|
||||||
|
align-self: auto;
|
||||||
|
order: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.notes-flex {
|
||||||
|
display: block;
|
||||||
|
flex-grow: 0;
|
||||||
|
flex-shrink: 1;
|
||||||
|
flex-basis: auto;
|
||||||
|
align-self: auto;
|
||||||
|
order: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
label,
|
||||||
|
input[type="number"],
|
||||||
|
input[type="email"],
|
||||||
|
input[type="text"] {
|
||||||
|
display: inline !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type="checkbox"] {
|
||||||
|
appearance: auto;
|
||||||
|
opacity: 1;
|
||||||
|
margin: 0;
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block javascripts %}
|
||||||
|
<script src="/theme/assets/js/jquery.min.js"></script>
|
||||||
|
<script src='/theme/assets/js/jquery-ui.js'></script>
|
||||||
|
<script src="/theme/assets/js/browser.min.js"></script>
|
||||||
|
<script src="/theme/assets/js/breakpoints.min.js"></script>
|
||||||
|
<script src="/theme/assets/js/util.js"></script>
|
||||||
|
<script src="/theme/assets/js/main.js"></script>
|
||||||
|
<script src='//momentjs.com/downloads/moment-with-locales.js'></script>
|
||||||
|
<script src='//cdn.datatables.net/2.0.8/js/dataTables.min.js'></script>
|
||||||
|
<script type='text/javascript'>
|
||||||
|
$(function() {
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
function saveSettings() {
|
||||||
|
var saveInterval = $('#save-interval');
|
||||||
|
var saveReferences = $('#save-references');
|
||||||
|
var noteTextSize = $('#note-text-size');
|
||||||
|
var trackSaveSize = $('#track-save-size');
|
||||||
|
var saveTimeout = $('#save-timeout');
|
||||||
|
var saveFailureCount = $('#save-failure-count');
|
||||||
|
|
||||||
|
fetch('/index.php/save-settings', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json'
|
||||||
|
},
|
||||||
|
body: JSON.stringify({
|
||||||
|
'saveInterval': saveInterval.val(),
|
||||||
|
'saveReferences': saveReferences.is(':checked'),
|
||||||
|
'noteTextSize': noteTextSize.val(),
|
||||||
|
'trackSaveSize': trackSaveSize.is(':checked'),
|
||||||
|
'saveTimeout': saveTimeout.val(),
|
||||||
|
'saveFailureCount': saveFailureCount.val()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.then(response => response.json())
|
||||||
|
.then(results => {
|
||||||
|
alert(results.msg);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block body %}
|
||||||
|
<div class="flex-container">
|
||||||
|
<div class="user-flex">
|
||||||
|
<label for='name'>Name: </label>
|
||||||
|
<input type='text' id='name' name='name' value='{{ app.user.name }}' /><br />
|
||||||
|
|
||||||
|
<label for='email'>Email: </label>
|
||||||
|
<input type='email' id='email' name='email' value='{{ app.user.email }}' /><br />
|
||||||
|
|
||||||
|
<label for='password'>Password: </label>
|
||||||
|
<input type='password' id='password' name='password' /><br/>
|
||||||
|
|
||||||
|
<label for='new-password'>New Password: </label>
|
||||||
|
<input type='password' id='new-password' name='new-password' /><br />
|
||||||
|
|
||||||
|
<label for='conf-password'>Confirm Password: </label>
|
||||||
|
<input type='password' id='conf-password' name='conf-password' /><br />
|
||||||
|
</div>
|
||||||
|
<div class="settings-flex">
|
||||||
|
<label for='save-interval'>Save Interval (seconds)?</label>
|
||||||
|
<input type='number' id='save-interval' value='{{ meta.saveInterval }}' title='What is the interval to trigger an autosave, in seconds?' /><br/>
|
||||||
|
|
||||||
|
<label for='save-references'>Save References?</label>
|
||||||
|
<input type='checkbox' id='save-references' {{ meta.saveReferences }} title='Do you want to also save reference content' /><br />
|
||||||
|
|
||||||
|
<label for='note-text-size'>Note Text Size? (points)</label>
|
||||||
|
<input type='number' id='note-text-size' value='{{ meta.noteTextSize }}' title='Font size of the note preview, in points' /><br />
|
||||||
|
|
||||||
|
<label for='track-save-size'>Track Save Size?</label>
|
||||||
|
<input type='checkbox' id='track-save-size' {{ meta.noteTextSize }} title='Do you want to track the size of saves, useful if teathering to mobile device?' /><br />
|
||||||
|
|
||||||
|
<label for='save-timeout'>Save Timeout? (seconds)</label>
|
||||||
|
<input type='number' id='save-timeout' value='{{ meta.saveTimeout }}' title='How long does it wait to before cancelling the save and trying again later?' /><br />
|
||||||
|
|
||||||
|
<label for='save-failure-count'>Save Failure Count? </label>
|
||||||
|
<input type='number' id='save-failure-count' value='{{ meta.saveFailureCount }}' title='How many times do you want to attempt to auto save before it stops and waits for a manual attempt' /><br />
|
||||||
|
|
||||||
|
<button id='save-settings' onclick='saveSettings()'>Save Settings</button>
|
||||||
|
<button id='back' onclick='history.go(-1)'>Back</button>
|
||||||
|
</div>
|
||||||
|
<div class="notes-fles">
|
||||||
|
<table id='notes'>
|
||||||
|
<thead>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
@ -13,7 +13,7 @@
|
|||||||
<nav id="menu">
|
<nav id="menu">
|
||||||
<header class="major">
|
<header class="major">
|
||||||
{% if app.user %}
|
{% if app.user %}
|
||||||
<h3>Welcome {{ app.user.name }}</h3>
|
<h3>Welcome <a href='/index.php/profile' style='text-decoration:underline;'>{{ app.user.name }}</a></h3>
|
||||||
<a href='/index.php/logout'>Logout</a>
|
<a href='/index.php/logout'>Logout</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</header>
|
</header>
|
||||||
|
Loading…
Reference in New Issue
Block a user