Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
A
archery
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
3
Issues
3
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Taddeüs Kroes
archery
Commits
a8208d23
Commit
a8208d23
authored
Oct 10, 2014
by
Taddeüs Kroes
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Added profile and account pages
parent
e359370b
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
248 additions
and
29 deletions
+248
-29
coffee/forms.coffee
coffee/forms.coffee
+1
-1
locale/nl_NL/LC_MESSAGES/archery.po
locale/nl_NL/LC_MESSAGES/archery.po
+65
-16
routes/register.php
routes/register.php
+5
-1
routes/user.php
routes/user.php
+55
-9
sass/main.sass
sass/main.sass
+16
-2
templates/layout.latte
templates/layout.latte
+1
-0
templates/user/edit.latte
templates/user/edit.latte
+6
-0
templates/user/view.latte
templates/user/view.latte
+57
-0
util.php
util.php
+42
-0
No files found.
coffee/forms.coffee
View file @
a8208d23
...
...
@@ -7,7 +7,7 @@
# elem.checkValidity()
$
->
$
(
'form:not(.nofocus)
input:first'
,
document
.
forms
[
0
]).
focus
()
if
document
.
forms
.
length
$
(
'form:not(.nofocus)
:first input:first'
).
focus
()
create_addon
=
(
input
)
->
group
=
$
(
'<div class="input-group">'
).
insertBefore
(
input
)
...
...
locale/nl_NL/LC_MESSAGES/archery.po
View file @
a8208d23
...
...
@@ -7,11 +7,11 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: routes/common.php:15 routes/register.php:18
#: routes/common.php:15 routes/register.php:18
routes/register.php:20
msgid "Username"
msgstr "Gebruikersnaam"
#: routes/common.php:17 routes/register.php:24
#: routes/common.php:17 routes/register.php:24
routes/register.php:26
msgid "Password"
msgstr "Wachtwoord"
...
...
@@ -19,7 +19,7 @@ msgstr "Wachtwoord"
msgid "Login"
msgstr "Inloggen"
#: routes/match.php:34 util.php:59
#: routes/match.php:34 util.php:59
util.php:61
msgid "Match does not exist"
msgstr "Score bestaat niet"
...
...
@@ -29,12 +29,14 @@ msgstr "Onvoldoende permissies"
#: routes/match.php:77 routes/match.php:105 routes/match.php:64
#: routes/match.php:92 routes/match.php:32 routes/match.php:60
#: routes/user.php:60
#: routes/user.php:60 routes/user.php:109 routes/user.php:114
#: routes/user.php:106
msgid "Distance"
msgstr "Afstand"
#: routes/match.php:78 routes/match.php:65 routes/match.php:33
#: routes/user.php:61
#: routes/user.php:61 routes/user.php:110 routes/user.php:115
#: routes/user.php:107
msgid "Select a distance"
msgstr "Selecteer een afstand"
...
...
@@ -52,7 +54,8 @@ msgid "Name"
msgstr "Naam"
#: routes/match.php:82 routes/match.php:69 routes/user.php:52
#: routes/match.php:37 routes/user.php:65
#: routes/match.php:37 routes/user.php:65 routes/user.php:114
#: routes/user.php:119 routes/user.php:111
msgid "Filter"
msgstr "Filteren"
...
...
@@ -73,7 +76,8 @@ msgid "Distance in meters"
msgstr "Afstand in meters"
#: routes/match.php:109 routes/match.php:96 routes/match.php:64
#: routes/user.php:62
#: routes/user.php:62 routes/user.php:111 routes/user.php:116
#: routes/user.php:108
msgid "Discipline"
msgstr "Discipline"
...
...
@@ -93,23 +97,25 @@ msgstr "Opmerkingen"
msgid "Create"
msgstr "Opslaan"
#: routes/register.php:22
#: routes/register.php:22
routes/register.php:24
msgid "Username may not contain whitespace or special characters"
msgstr "Gebruikersnaam mag geen spaties of speciale tekens bevatten"
#: routes/register.php:23
#: routes/register.php:23
routes/register.php:25
msgid "This username has already been taken"
msgstr "Deze gebruikersnaam is al in gebruik"
#: routes/register.php:26
#: routes/register.php:26
routes/register.php:30
msgid "Confirm password"
msgstr "Bevestig wachtwoord"
#: routes/register.php:29
#: routes/register.php:29 routes/user.php:30 routes/register.php:33
#: routes/user.php:32
msgid "Passwords must match"
msgstr "Wachtwoorden moeten gelijk zijn"
#: routes/register.php:30 templates/layout.latte:4 templates/login.latte:13
#: routes/register.php:34
msgid "Register"
msgstr "Registreren"
...
...
@@ -130,6 +136,7 @@ msgid "Add new match"
msgstr "Nieuwe score"
#: templates/match/create.latte:9 routes/user.php:51 routes/user.php:59
#: routes/user.php:108 routes/user.php:113 routes/user.php:105
msgid "Tags"
msgstr "Tags"
...
...
@@ -176,27 +183,33 @@ msgstr "Verwijderen"
msgid "Scores"
msgstr "Punten"
#: routes/user.php:31 routes/user.php:33
msgid "Save"
msgstr "Opslaan"
#: util.php:53
#: util.php:53
util.php:55
msgid "No access to this user"
msgstr "Geen toegang tot deze gebruiker"
#: routes/user.php:47 routes/user.php:52
#: routes/user.php:47 routes/user.php:52 routes/user.php:101
#: routes/user.php:106 routes/user.php:98
msgid "From"
msgstr "Vanaf"
#: routes/user.php:49 routes/user.php:55
#: routes/user.php:49 routes/user.php:55 routes/user.php:104
#: routes/user.php:109 routes/user.php:101
msgid "Until"
msgstr "Tot"
#: routes/match.php:25 routes/user.php:45
#: routes/match.php:25 routes/user.php:45 routes/user.php:94
#: routes/user.php:99 routes/user.php:91
#, php-format
msgid "%d meters"
msgstr "%d meter"
#: routes/user.php:54 routes/user.php:57
#: routes/user.php:54 routes/user.php:57 routes/user.php:103
#: routes/user.php:106 routes/user.php:108 routes/user.php:111
#: routes/user.php:100
msgid "YYYY-MM-DD"
msgstr "JJJJ-MM-DD"
...
...
@@ -205,3 +218,39 @@ msgstr "Gemiddelde score over tijd"
msgid "Progress graph"
msgstr "Voortgangsgrafiek"
msgid "Profile"
msgstr "Profiel"
#: routes/user.php:23
msgid "Current password"
msgstr "Huidig wachtwoord"
#: routes/user.php:25
msgid "Password incorrect"
msgstr "Ongeldig wachtwoord"
#: routes/user.php:26
msgid "New password"
msgstr "Nieuw wachtwoord"
#: routes/user.php:27 routes/user.php:30
msgid "Confirm new password"
msgstr "Bevestig nieuw wachtwoord"
msgid "Edit account"
msgstr "Account bewerken"
msgid "Statistics"
msgstr "Statistieken"
msgid "Average match score"
msgstr "Gemiddelde wedstrijdscore"
msgid "Average arrow score"
msgstr "Gemiddelde pijlscore"
#: routes/register.php:28 routes/user.php:28
#, php-format
msgid "Password must be at least %d charachers"
msgstr "Uw wachtwoord moet minimaal %d karakters lang zijn"
routes/register.php
View file @
a8208d23
...
...
@@ -4,6 +4,8 @@ use Nette\Forms\Form;
use
Instante\Bootstrap3Renderer\BootstrapRenderer
;
use
Nette\Security\Passwords
;
define
(
'MIN_PASSWORD_CHARS'
,
6
);
function
validate_unique_user
(
$field
)
{
global
$db
;
$username
=
$field
->
getValue
();
...
...
@@ -22,7 +24,9 @@ function registration_form() {
->
addRule
(
Form
::
PATTERN
,
_
(
'Username may not contain whitespace or special characters'
),
'([a-zA-Z0-9-_])+'
)
->
addRule
(
'validate_unique_user'
,
_
(
'This username has already been taken'
));
$form
->
addPassword
(
'password'
,
_
(
'Password'
))
->
setRequired
();
->
setRequired
()
->
addRule
(
Form
::
MIN_LENGTH
,
sprintf
(
_
(
'Password must be at least %d charachers'
),
MIN_PASSWORD_CHARS
),
MIN_PASSWORD_CHARS
);
$form
->
addPassword
(
'password_repeat'
,
_
(
'Confirm password'
))
->
setRequired
()
->
addConditionOn
(
$form
[
'password'
],
Form
::
FILLED
)
...
...
routes/user.php
View file @
a8208d23
...
...
@@ -2,21 +2,67 @@
use
Nette\Forms\Form
;
use
Instante\Bootstrap3Renderer\BootstrapRenderer
;
use
Nette\Security\Passwords
;
$app
->
get
(
'/user'
,
function
()
{
echo
"create user form"
;
});
function
find_user
(
$id
)
{
global
$db
;
require_user_access
(
$id
);
return
$db
->
table
(
'user'
)
->
get
(
$id
);
}
function
edit_user_form
(
$dbuser
)
{
$form
=
new
Form
;
$form
->
setRenderer
(
new
BootstrapRenderer
);
$form
->
setAction
(
"user/
$dbuser->id
"
);
$form
->
addHidden
(
'_METHOD'
,
'PUT'
);
$check_current_password
=
function
(
$password
)
use
(
$dbuser
)
{
return
Passwords
::
verify
(
$password
->
getValue
(),
$dbuser
->
password
);
};
$form
->
addPassword
(
'current_password'
,
_
(
'Current password'
))
->
setRequired
()
->
addRule
(
$check_current_password
,
_
(
'Password incorrect'
));
$form
->
addPassword
(
'password'
,
_
(
'New password'
))
->
addCondition
(
Form
::
FILLED
)
->
addRule
(
Form
::
MIN_LENGTH
,
sprintf
(
_
(
'Password must be at least %d charachers'
),
MIN_PASSWORD_CHARS
),
MIN_PASSWORD_CHARS
);
$form
->
addPassword
(
'password_repeat'
,
_
(
'Confirm new password'
))
->
addConditionOn
(
$form
[
'password'
],
Form
::
FILLED
)
->
addRule
(
Form
::
EQUAL
,
_
(
'Passwords must match'
),
$form
[
'password'
]);
$form
->
addSubmit
(
'send'
,
_
(
'Save'
))
->
setAttribute
(
'class'
,
'btn-primary'
);
$app
->
post
(
'/user'
,
function
()
{
echo
"insert user"
;
return
$form
;
}
$app
->
get
(
'/user/:id'
,
function
(
$id
)
use
(
$app
,
$db
)
{
$app
->
render
(
'user/view'
,
array
(
'dbuser'
=>
find_user
(
$id
)));
});
$app
->
get
(
'/user/:id'
,
function
(
$id
)
{
echo
"view user
$id
"
;
$app
->
get
(
'/user/:id/edit'
,
function
(
$id
)
use
(
$app
)
{
$form
=
edit_user_form
(
find_user
(
$id
));
$app
->
render
(
'user/edit'
,
compact
(
'form'
));
});
$app
->
put
(
'/user/:id'
,
function
(
$id
)
use
(
$app
)
{
$dbuser
=
find_user
(
$id
);
$form
=
edit_user_form
(
$dbuser
);
$form
->
validate
();
if
(
!
$form
->
hasErrors
())
{
$values
=
$form
->
getValues
();
if
(
$values
->
password
)
{
$dbuser
->
update
(
array
(
'password'
=>
Passwords
::
hash
(
$values
->
password
)
));
//$user->logout();
//$user->login($dbuser->username, $values->password);
}
$app
->
redirect
(
ROOT_URL
.
"/user/
$id
"
);
}
$app
->
get
(
'/user/:id/edit'
,
function
(
$id
)
{
echo
"edit user
$id
form"
;
$app
->
render
(
'user/edit'
,
compact
(
'form'
));
});
$app
->
put
(
'/user/:id'
,
function
(
$id
)
{
...
...
sass/main.sass
View file @
a8208d23
$portrait-width
:
640px
$xs-width
:
768px
$sm-width
:
768px
$md-width
:
992px
$lg-width
:
1200px
.visible-xs-pt
display
:
none
...
...
@@ -73,7 +75,7 @@ $xs-width: 768px
.text
display
:
inline-block
@media
(
max-width
:
$
xs
-width
-
1
)
@media
(
max-width
:
$
sm
-width
-
1
)
.actions
float
:
right
.btn
...
...
@@ -98,3 +100,15 @@ a.tag
.jqplot-highlighter-tooltip
,
.jqplot-canvasOverlay-tooltip
,
.jqplot-axis
font-size
:
1em
!
important
td
&
.header
white-space
:
nowrap
&
.stretch
width
:
100%
@media
(
min-width
:
$sm-width
)
td
.sm-stretch
width
:
100%
templates/layout.latte
View file @
a8208d23
{var $menu = $user->isLoggedIn() ? [
['matches', _('Matches')],
["user/{$user->getId()}", _('Profile')],
["user/{$user->getId()}/plot", _('Progress graph')],
['logout', _('Logout')],
] : [
...
...
templates/user/edit.latte
0 → 100644
View file @
a8208d23
{extends '../layout.latte'}
{block content}
<h2 class="page-header">{_'Edit account'}</h2>
{$form}
{/block}
templates/user/view.latte
0 → 100644
View file @
a8208d23
{extends '../layout.latte'}
{var $helper = new UserHelper($dbuser)}
{block content}
<h2 class="page-header">
{_'Account'}
<a href="user/{$dbuser->id}/edit" class="btn btn-sm btn-default"
title="{_'Edit'}">
<span class="glyphicon glyphicon-pencil"></span>
</a>
</h2>
<table class="table">
<tbody>
<tr>
<th>{_'Username'}</th>
<td class="sm-stretch">{$dbuser->username}</td>
</tr>
<tr>
<th>{_'Password'}</th>
<td class="sm-stretch">
********
</td>
</tr>
</tbody>
</table>
<h2 class="page-header">{_'Statistics'}</h2>
<table class="table">
{foreach ['barebow', 'recurve', 'compound'] as $discipline}
{if $helper->numberOfMatches($discipline) > 0}
<thead>
<tr>
<th colspan="3">{$discipline|capitalize}</th>
</tr>
</thead>
<tbody>
<tr>
<td class="header">{_'Matches'}</td>
<td>:</td>
<td class="sm-stretch">{$helper->numberOfMatches($discipline)}</td>
</tr>
<tr>
<td class="header">{_'Average match score'}</td>
<td>:</td>
<td class="stretch">{$helper->averageMatchScore($discipline)}</td>
</tr>
<tr>
<td class="header">{_'Average arrow score'}</td>
<td>:</td>
<td class="stretch">{$helper->averageArrowScore($discipline)|number:4}</td>
</tr>
</tbody>
{/if}
{/foreach}
</table>
{/block}
util.php
View file @
a8208d23
<?php
use
Nette\Database\IRow
;
function
load_config
(
$filename
,
$optional
=
false
)
{
if
(
!
file_exists
(
__DIR__
.
'/'
.
$filename
))
{
if
(
$optional
)
...
...
@@ -92,3 +94,43 @@ function match_score($row) {
function
match_avg_score
(
$row
)
{
return
match_score
(
$row
)
/
(
$row
->
turns
*
$row
->
arrows
);
}
class
UserHelper
{
private
$user
;
public
function
__construct
(
IRow
$dbuser
)
{
global
$db
;
$this
->
db
=
$db
;
$this
->
user
=
$dbuser
;
}
public
function
numberOfMatches
(
$discipline
)
{
return
$this
->
user
->
related
(
'match'
)
->
where
(
'discipline'
,
$discipline
)
->
count
();
}
public
function
averageMatchScore
(
$discipline
)
{
$matches
=
$this
->
user
->
related
(
'match'
)
->
select
(
'scores'
)
->
where
(
'discipline'
,
$discipline
);
$score
=
0
;
foreach
(
$matches
as
$match
)
$score
+=
match_score
(
$match
);
return
$score
/
$matches
->
count
();
}
public
function
averageArrowScore
(
$discipline
)
{
$matches
=
$this
->
user
->
related
(
'match'
)
->
select
(
'arrows, turns, scores'
)
->
where
(
'discipline'
,
$discipline
);
$score
=
0
;
foreach
(
$matches
as
$match
)
$score
+=
match_avg_score
(
$match
);
return
$score
/
$matches
->
count
();
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment