Skip to content

Commit b0e535f

Browse files
authored
Merge pull request #132 from Ente/projects-update
Projects update
2 parents 40f2cdb + a7bd088 commit b0e535f

File tree

23 files changed

+899
-55
lines changed

23 files changed

+899
-55
lines changed

CHANGELOG.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,18 @@
11
# CHANGELOG
22

3+
## v8.5
4+
* Fixed an issue with IDs not generated correctly for project items.
5+
* Added functionality to delete and edit project items.
6+
* Adding users to a project has been made easier.
7+
* Internal changes
8+
* Added additional plugin permission level
9+
* Added 2 new themes
10+
11+
## v8.4.3
12+
13+
* Now displaying the instance uuid within the settings page.
14+
* Added ability to reset the instance uuid via the settings page.
15+
316
## v8.4.2
417

518
* Added user based permissions for plugin views.

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
8.4.2
1+
8.5

api/v1/class/arbeitszeit.inc.php

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,36 @@ public function end_easymode_pause_worktime($username, $id)
223223
}
224224
}
225225

226+
public function renderUserWorktimeSelect(
227+
string $name,
228+
int $userId,
229+
?int $selectedWorktime = null,
230+
string $placeholder = "",
231+
string $class = ""
232+
): void
233+
{
234+
$userId = $this->benutzer()->get_user_from_id($userId)["username"];
235+
$sql = "SELECT * FROM arbeitszeiten WHERE username = ?";
236+
$stmt = $this->db->sendQuery($sql);
237+
$stmt->execute([$userId]);
238+
$times = $stmt->fetchAll(\PDO::FETCH_ASSOC);
239+
240+
echo '<select name="' . htmlspecialchars($name) . '" class="' . htmlspecialchars($class) . '">';
241+
echo '<option value="">' . htmlspecialchars($placeholder) . '</option>';
242+
243+
foreach ($times as $wt) {
244+
$label = $wt["schicht_tag"] . "" . $wt["id"];
245+
$sel = ($selectedWorktime !== null && $wt["id"] == $selectedWorktime) ? " selected" : "";
246+
247+
echo '<option value="' . $wt["id"] . '"' . $sel . '>'
248+
. htmlspecialchars($label)
249+
. '</option>';
250+
}
251+
252+
echo '</select>';
253+
}
254+
255+
226256
public function toggle_easymode($username)
227257
{
228258
if (!$this->nodes()->checkNode("arbeitszeit.inc", "toggle_easymode")) {

api/v1/class/benutzer/benutzer.arbeit.inc.php

Lines changed: 55 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public function __construct()
2525
*/
2626
public function create_user($username, $name, $email, $password, $isAdmin = 0)
2727
{
28-
if($this->nodes()->checkNode("benutzer.inc", "create_user") == false){
28+
if ($this->nodes()->checkNode("benutzer.inc", "create_user") == false) {
2929
return false;
3030
}
3131
Exceptions::error_rep("Creating user '$username'...");
@@ -47,20 +47,44 @@ public function create_user($username, $name, $email, $password, $isAdmin = 0)
4747
}
4848
}
4949

50-
public function user_active($username){
50+
public function renderUserSelect(string $name, ?int $selectedUser = null, string $noAssigneeText = ""): void
51+
{
52+
$users = $this->get_all_users();
53+
54+
echo '<select name="' . htmlspecialchars($name) . '">';
55+
56+
// First “no assignee” option
57+
echo '<option value="">' . htmlspecialchars($noAssigneeText) . '</option>';
58+
59+
// Users
60+
foreach ($users as $u) {
61+
$sel = ($selectedUser !== null && $u["id"] == $selectedUser) ? ' selected' : '';
62+
echo '<option value="' . $u["id"] . '"' . $sel . '>'
63+
. htmlspecialchars($u["name"])
64+
. '</option>';
65+
}
66+
67+
echo '</select>';
68+
}
69+
70+
71+
public function user_active($username)
72+
{
5173
$user = $this->get_user($username);
52-
if($user["active"] == true || $user["active"] == 1){
74+
if ($user["active"] == true || $user["active"] == 1) {
5375
return true;
5476
} else {
5577
return false;
5678
}
5779
}
5880

59-
public function activate_user($username){
81+
public function activate_user($username)
82+
{
6083
return $this->editUserProperties($username, "active", 1);
6184
}
6285

63-
public function deactivate_user($username){
86+
public function deactivate_user($username)
87+
{
6488
return $this->editUserProperties($username, "active", 0);
6589
}
6690

@@ -74,10 +98,10 @@ public function deactivate_user($username){
7498
*/
7599
public function delete_user($id)
76100
{
77-
if($this->nodes()->checkNode("benutzer.inc", "delete_user") == false){
101+
if ($this->nodes()->checkNode("benutzer.inc", "delete_user") == false) {
78102
return false;
79103
}
80-
$user = $this->get_user_from_id($id);
104+
$user = $this->get_user_from_id($id);
81105
$username = $user["username"];
82106
$email = $user["email"];
83107
Exceptions::error_rep("Deleting user with id '$id'...");
@@ -217,7 +241,7 @@ public function get_all_users()
217241
*/
218242
public function get_all_users_html()
219243
{
220-
if($this->nodes()->checkNode("benutzer.inc", "get_all_users_html") == false){
244+
if ($this->nodes()->checkNode("benutzer.inc", "get_all_users_html") == false) {
221245
return false;
222246
}
223247
Exceptions::error_rep("Getting all users...");
@@ -264,7 +288,7 @@ public function get_all_users_html()
264288
*/
265289
public function get_user_html($username)
266290
{
267-
if($this->nodes()->checkNode("benutzer.inc", "get_user_html") == false){
291+
if ($this->nodes()->checkNode("benutzer.inc", "get_user_html") == false) {
268292
return false;
269293
}
270294
Exceptions::error_rep("Getting user '$username'...");
@@ -314,25 +338,28 @@ public static function is_admin($user)
314338
}
315339
}
316340

317-
public static function current_user_is_admin(){
318-
if(self::get_current_user()["isAdmin"] == true){
341+
public static function current_user_is_admin()
342+
{
343+
if (self::get_current_user()["isAdmin"] == true) {
319344
return true;
320345
} else {
321346
return false;
322347
}
323348
}
324349

325-
public static function get_current_user(){
350+
public static function get_current_user()
351+
{
326352
return self::get_user($_SESSION["username"]);
327353
}
328354

329-
public static function get_name_from_id($id){
355+
public static function get_name_from_id($id)
356+
{
330357
return self::get_user_from_id($id)["name"];
331358
}
332359

333360
public function editUserProperties(mixed $username_or_id, string $name, mixed $value): bool
334361
{
335-
if($this->nodes()->checkNode("benutzer.inc", "editUserProperties") == false){
362+
if ($this->nodes()->checkNode("benutzer.inc", "editUserProperties") == false) {
336363
return false;
337364
}
338365
if (
@@ -378,28 +405,30 @@ public function editUserProperties(mixed $username_or_id, string $name, mixed $v
378405
}
379406
}
380407

381-
public function loadUserTheme(){
408+
public function loadUserTheme()
409+
{
382410

383411
$themes = scandir($_SERVER["DOCUMENT_ROOT"] . "/assets/css");
384412
$themes = array_diff($themes, [".", ".."]);
385413
$check = in_array($_COOKIE["theme"], $themes);
386-
if($this->get_app_ini()["general"]["force_theme"] == "true"){
414+
if ($this->get_app_ini()["general"]["force_theme"] == "true") {
387415
return $this->get_app_ini()["general"]["theme_file"];
388416
}
389417

390-
if(!isset($_COOKIE["theme"]) || !$check){
418+
if (!isset($_COOKIE["theme"]) || !$check) {
391419
return "/assets/css/v8.css";
392420
} else {
393421
return "/assets/css/" . $_COOKIE["theme"];
394422
}
395423
}
396424

397-
public function computeUserThemes(){
425+
public function computeUserThemes()
426+
{
398427
$themes = scandir($_SERVER["DOCUMENT_ROOT"] . "/assets/css");
399428
$themes = array_diff($themes, [".", ".."]);
400429
$currentTheme = basename($this->loadUserTheme());
401-
foreach($themes as $theme){
402-
if($currentTheme == $theme){
430+
foreach ($themes as $theme) {
431+
if ($currentTheme == $theme) {
403432
echo "<option name='{$theme}' selected>{$theme}</option>";
404433
} else {
405434
echo "<option name='{$theme}'>{$theme}</option>";
@@ -409,13 +438,15 @@ public function computeUserThemes(){
409438
return true;
410439
}
411440

412-
public function setUserTheme($theme){
413-
setcookie("theme", $theme, time()+60*60*24*30, "/");
441+
public function setUserTheme($theme)
442+
{
443+
setcookie("theme", $theme, time() + 60 * 60 * 24 * 30, "/");
414444
return true;
415445
}
416446

417-
public function checkThemeForce(){
418-
if($this->get_app_ini()["general"]["force_theme"] == "true" || $this->get_app_ini()["general"]["force_theme"] == true){
447+
public function checkThemeForce()
448+
{
449+
if ($this->get_app_ini()["general"]["force_theme"] == "true" || $this->get_app_ini()["general"]["force_theme"] == true) {
419450
return true;
420451
} else {
421452
return false;

api/v1/class/i18n/admin/projects/admin/snippets_DE.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
"label_description": "Beschreibung",
1515
"label_deadline": "Deadline",
1616
"label_owner": "Besitzer",
17+
"label_assoc": "Kurzname",
1718
"btn_add": "Projekt hinzufügen",
1819
"delete_confirm": "Bist du sicher, dass du das Projekt löschen möchtest?"
1920
}

api/v1/class/i18n/suite/projects/item/snippets_EN.json

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,10 @@
1111
"no_worktimes": "No worktimes...",
1212
"btn_edit": "Edit",
1313
"btn_delete": "Delete",
14-
"id": "ID"
14+
"id": "ID",
15+
"edit_title": "Edit Item",
16+
"title_label": "Title",
17+
"description_label": "Description",
18+
"no_assignee": "No assignee",
19+
"btn_save": "Save Changes"
1520
}

api/v1/class/i18n/suite/status/snippets_DE.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,5 +51,6 @@
5151
"userinactive": "Fehler: Dein Konto wurde deaktiviert. Bitte wende dich an deinen Administrator!",
5252
"plugins_disabled": "Fehler: Das Plugin-System ist deaktiviert. Bitte wende dich an deinen Administrator!",
5353
"telemetry_sent": "Hinweis: Telemetriedaten wurden erfolgreich gesendet!",
54-
"telemetry_disabled": "Hinweis: Telemetriedaten wurden nicht gesendet!"
54+
"telemetry_disabled": "Hinweis: Telemetriedaten wurden nicht gesendet!",
55+
"success": "Hinweis: Die Aktion wurde erfolgreich ausgeführt!"
5556
}

api/v1/class/i18n/suite/status/snippets_EN.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,5 +51,6 @@
5151
"userinactive": "Error: Your account has been disabled. Please contact your administrator!",
5252
"plugins_disabled": "Error: The plugin system is disabled. Please contact your administrator!",
5353
"telemetry_sent": "Note: Telemetry data sent successfully!",
54-
"telemetry_disabled": "Note: Telemetry data not sent!"
54+
"telemetry_disabled": "Note: Telemetry data not sent!",
55+
"success": "Note: The action was completed successfully!"
5556
}

api/v1/class/i18n/suite/status/snippets_NL.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,5 +51,6 @@
5151
"userinactive": "Fout: Je account is uitgeschakeld. Neem contact op met je beheerder!",
5252
"plugins_disabled": "Fout: Het plugin-systeem is uitgeschakeld. Neem contact op met je beheerder!",
5353
"telemetry_sent": "Opmerking: Telemetriegegevens succesvol verzonden!",
54-
"telemetry_disabled": "Opmerking: Telemetriegegevens niet verzonden!"
54+
"telemetry_disabled": "Opmerking: Telemetriegegevens niet verzonden!",
55+
"success": "Opmerking: De actie is succesvol uitgevoerd!"
5556
}

api/v1/class/plugins/PluginBuilder.plugins.arbeit.inc.php

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -253,8 +253,12 @@ final public function checkPluginPermissions($pluginName, $view, $user): bool
253253
}
254254

255255
if (isset($permissions['nav_permissions'][$viewName])) {
256-
$requiredPermission = $permissions['nav_permissions'][$viewName]; # either 0 or 1
256+
$requiredPermission = $permissions['nav_permissions'][$viewName];
257257
$this->logger("{$la} Required permission for view '{$viewName}': '{$requiredPermission}'");
258+
if ($requiredPermission === 5 && $userPermissions === $adminLevel) {
259+
$this->logger("{$la} View '{$viewName}' is marked as internal placeholder. Skipping.");
260+
return true;
261+
}
258262

259263
if ($requiredPermission === $adminLevel && $userPermissions === $adminLevel) {
260264
$this->logger("{$la} User '{$user}' has admin permissions for view '{$viewName}'. Access granted.");
@@ -268,6 +272,8 @@ final public function checkPluginPermissions($pluginName, $view, $user): bool
268272
}
269273

270274

275+
276+
271277
} else {
272278
$this->logger("{$la} No specific permissions set for view '{$view}', allowing access by default.");
273279
return false; # no default access

0 commit comments

Comments
 (0)