From 92b7dd3335a6572debeacfb5faa82c63a5e67888 Mon Sep 17 00:00:00 2001 From: Marvin Borner Date: Fri, 8 Jun 2018 20:03:25 +0200 Subject: Some minor fixes --- main/app/sprinkles/admin/asset-bundles.json | 338 +-- .../assets/userfrosting/js/pages/activities.js | 32 +- .../assets/userfrosting/js/pages/dashboard.js | 98 +- .../admin/assets/userfrosting/js/pages/group.js | 48 +- .../admin/assets/userfrosting/js/pages/groups.js | 48 +- .../assets/userfrosting/js/pages/permission.js | 40 +- .../assets/userfrosting/js/pages/permissions.js | 32 +- .../admin/assets/userfrosting/js/pages/role.js | 46 +- .../admin/assets/userfrosting/js/pages/roles.js | 48 +- .../admin/assets/userfrosting/js/pages/user.js | 50 +- .../admin/assets/userfrosting/js/pages/users.js | 48 +- .../admin/assets/userfrosting/js/widgets/groups.js | 222 +- .../admin/assets/userfrosting/js/widgets/roles.js | 294 +- main/app/sprinkles/admin/composer.json | 52 +- main/app/sprinkles/admin/locale/ar/messages.php | 270 +- main/app/sprinkles/admin/locale/de_DE/messages.php | 322 +-- main/app/sprinkles/admin/locale/en_US/messages.php | 320 +-- main/app/sprinkles/admin/locale/es_ES/messages.php | 328 +-- main/app/sprinkles/admin/locale/fa/messages.php | 316 +- main/app/sprinkles/admin/locale/fr_FR/messages.php | 292 +- main/app/sprinkles/admin/locale/it_IT/messages.php | 320 +-- main/app/sprinkles/admin/locale/pt_PT/messages.php | 278 +- main/app/sprinkles/admin/locale/ru_RU/messages.php | 320 +-- main/app/sprinkles/admin/locale/th_TH/messages.php | 266 +- main/app/sprinkles/admin/locale/tr/messages.php | 320 +-- main/app/sprinkles/admin/locale/zh_CN/messages.php | 322 +-- main/app/sprinkles/admin/routes/admin.php | 46 +- main/app/sprinkles/admin/routes/posts.php | 34 +- main/app/sprinkles/admin/routes/search.php | 16 +- main/app/sprinkles/admin/routes/wormhole.php | 18 +- .../admin/schema/requests/user/get-by-userid.yaml | 12 +- main/app/sprinkles/admin/src/Admin.php | 42 +- .../admin/src/Controller/ActivityController.php | 168 +- .../admin/src/Controller/AdminController.php | 296 +- .../admin/src/Controller/GroupController.php | 1426 ++++----- .../admin/src/Controller/PermissionController.php | 404 +-- .../admin/src/Controller/PostController.php | 382 +-- .../admin/src/Controller/RoleController.php | 1830 ++++++------ .../admin/src/Controller/SearchController.php | 112 +- .../admin/src/Controller/UserController.php | 3032 ++++++++++---------- .../admin/src/Controller/WormholeController.php | 292 +- .../src/ServicesProvider/ServicesProvider.php | 168 +- .../admin/src/Sprunje/ActivitySprunje.php | 156 +- .../sprinkles/admin/src/Sprunje/GroupSprunje.php | 84 +- .../admin/src/Sprunje/PermissionSprunje.php | 180 +- .../admin/src/Sprunje/PermissionUserSprunje.php | 96 +- .../sprinkles/admin/src/Sprunje/RoleSprunje.php | 132 +- .../admin/src/Sprunje/UserPermissionSprunje.php | 96 +- .../sprinkles/admin/src/Sprunje/UserSprunje.php | 356 +-- .../admin/templates/forms/group.html.twig | 160 +- .../sprinkles/admin/templates/forms/role.html.twig | 130 +- .../sprinkles/admin/templates/forms/user.html.twig | 284 +- .../admin/templates/mail/password-create.html.twig | 44 +- .../templates/modals/confirm-clear-cache.html.twig | 42 +- .../modals/confirm-delete-group.html.twig | 40 +- .../templates/modals/confirm-delete-role.html.twig | 40 +- .../templates/modals/confirm-delete-user.html.twig | 40 +- .../admin/templates/modals/group.html.twig | 14 +- .../modals/role-manage-permissions.html.twig | 192 +- .../admin/templates/modals/role.html.twig | 14 +- .../templates/modals/user-manage-roles.html.twig | 156 +- .../templates/modals/user-set-password.html.twig | 134 +- .../admin/templates/modals/user.html.twig | 14 +- .../templates/navigation/sidebar-menu.html.twig | 104 +- .../templates/navigation/sidebar-user.html.twig | 18 +- .../admin/templates/navigation/sidebar.html.twig | 18 +- .../admin/templates/navigation/user-card.html.twig | 16 +- .../templates/pages/abstract/dashboard.html.twig | 178 +- .../admin/templates/pages/activities.html.twig | 90 +- .../admin/templates/pages/dashboard.html.twig | 566 ++-- .../admin/templates/pages/group.html.twig | 214 +- .../admin/templates/pages/groups.html.twig | 102 +- .../admin/templates/pages/permission.html.twig | 182 +- .../admin/templates/pages/permissions.html.twig | 90 +- .../sprinkles/admin/templates/pages/role.html.twig | 258 +- .../admin/templates/pages/roles.html.twig | 98 +- .../sprinkles/admin/templates/pages/user.html.twig | 416 +-- .../admin/templates/pages/users.html.twig | 104 +- .../admin/templates/tables/activities.html.twig | 160 +- .../admin/templates/tables/groups.html.twig | 148 +- .../admin/templates/tables/permissions.html.twig | 142 +- .../admin/templates/tables/roles.html.twig | 158 +- .../admin/templates/tables/users.html.twig | 314 +- .../admin/tests/Integration/SprunjeTests.php | 218 +- 84 files changed, 9673 insertions(+), 9673 deletions(-) (limited to 'main/app/sprinkles/admin') diff --git a/main/app/sprinkles/admin/asset-bundles.json b/main/app/sprinkles/admin/asset-bundles.json index e5c4ca8..2b27c97 100644 --- a/main/app/sprinkles/admin/asset-bundles.json +++ b/main/app/sprinkles/admin/asset-bundles.json @@ -1,170 +1,170 @@ -{ - "bundle": { - "js/admin": { - "scripts": [ - "vendor/moment/moment.js", - "userfrosting/js/handlebars-helpers.js", - "vendor/tablesorter/dist/js/jquery.tablesorter.js", - "vendor/tablesorter/dist/js/jquery.tablesorter.widgets.js", - "userfrosting/js/tablesorter/widget-sort2Hash.js", - "vendor/tablesorter/dist/js/widgets/widget-columnSelector.min.js", - "vendor/tablesorter/dist/js/widgets/widget-reflow.min.js", - "vendor/tablesorter/dist/js/widgets/widget-pager.min.js", - "userfrosting/js/query-string.js", - "userfrosting/js/uf-table.js" - ], - "options": { - "result": { - "type": { - "scripts": "plain" - } - } - } - }, - "js/pages/activities": { - "scripts": [ - "userfrosting/js/pages/activities.js" - ], - "options": { - "result": { - "type": { - "scripts": "plain" - } - } - } - }, - "js/pages/dashboard": { - "scripts": [ - "userfrosting/js/widgets/users.js", - "userfrosting/js/pages/dashboard.js" - ], - "options": { - "result": { - "type": { - "scripts": "plain" - } - } - } - }, - "js/pages/group": { - "scripts": [ - "userfrosting/js/widgets/users.js", - "userfrosting/js/widgets/groups.js", - "userfrosting/js/pages/group.js" - ], - "options": { - "result": { - "type": { - "scripts": "plain" - } - } - } - }, - "js/pages/permission": { - "scripts": [ - "userfrosting/js/widgets/users.js", - "userfrosting/js/pages/permission.js" - ], - "options": { - "result": { - "type": { - "scripts": "plain" - } - } - } - }, - "js/pages/role": { - "scripts": [ - "userfrosting/js/widgets/roles.js", - "userfrosting/js/pages/role.js" - ], - "options": { - "result": { - "type": { - "scripts": "plain" - } - } - } - }, - "js/pages/user": { - "scripts": [ - "userfrosting/js/widgets/users.js", - "userfrosting/js/pages/user.js" - ], - "options": { - "result": { - "type": { - "scripts": "plain" - } - } - } - }, - "js/pages/users": { - "scripts": [ - "userfrosting/js/widgets/users.js", - "userfrosting/js/pages/users.js" - ], - "options": { - "result": { - "type": { - "scripts": "plain" - } - } - } - }, - "js/pages/groups": { - "scripts": [ - "userfrosting/js/widgets/groups.js", - "userfrosting/js/pages/groups.js" - ], - "options": { - "result": { - "type": { - "scripts": "plain" - } - } - } - }, - "js/pages/permissions": { - "scripts": [ - "userfrosting/js/pages/permissions.js" - ], - "options": { - "result": { - "type": { - "scripts": "plain" - } - } - } - }, - "js/pages/roles": { - "scripts": [ - "userfrosting/js/widgets/roles.js", - "userfrosting/js/pages/roles.js" - ], - "options": { - "result": { - "type": { - "scripts": "plain" - } - } - } - }, - "css/admin": { - "styles": [ - "font-starcraft/css/font-starcraft.css", - "vendor/tablesorter/dist/css/theme.bootstrap.min.css", - "vendor/tablesorter/dist/css/jquery.tablesorter.pager.min.css", - "userfrosting/css/tablesorter-reflow.css", - "userfrosting/css/tablesorter-custom.css" - ], - "options": { - "result": { - "type": { - "styles": "plain" - } - } - } - } - } +{ + "bundle": { + "js/admin": { + "scripts": [ + "vendor/moment/moment.js", + "userfrosting/js/handlebars-helpers.js", + "vendor/tablesorter/dist/js/jquery.tablesorter.js", + "vendor/tablesorter/dist/js/jquery.tablesorter.widgets.js", + "userfrosting/js/tablesorter/widget-sort2Hash.js", + "vendor/tablesorter/dist/js/widgets/widget-columnSelector.min.js", + "vendor/tablesorter/dist/js/widgets/widget-reflow.min.js", + "vendor/tablesorter/dist/js/widgets/widget-pager.min.js", + "userfrosting/js/query-string.js", + "userfrosting/js/uf-table.js" + ], + "options": { + "result": { + "type": { + "scripts": "plain" + } + } + } + }, + "js/pages/activities": { + "scripts": [ + "userfrosting/js/pages/activities.js" + ], + "options": { + "result": { + "type": { + "scripts": "plain" + } + } + } + }, + "js/pages/dashboard": { + "scripts": [ + "userfrosting/js/widgets/users.js", + "userfrosting/js/pages/dashboard.js" + ], + "options": { + "result": { + "type": { + "scripts": "plain" + } + } + } + }, + "js/pages/group": { + "scripts": [ + "userfrosting/js/widgets/users.js", + "userfrosting/js/widgets/groups.js", + "userfrosting/js/pages/group.js" + ], + "options": { + "result": { + "type": { + "scripts": "plain" + } + } + } + }, + "js/pages/permission": { + "scripts": [ + "userfrosting/js/widgets/users.js", + "userfrosting/js/pages/permission.js" + ], + "options": { + "result": { + "type": { + "scripts": "plain" + } + } + } + }, + "js/pages/role": { + "scripts": [ + "userfrosting/js/widgets/roles.js", + "userfrosting/js/pages/role.js" + ], + "options": { + "result": { + "type": { + "scripts": "plain" + } + } + } + }, + "js/pages/user": { + "scripts": [ + "userfrosting/js/widgets/users.js", + "userfrosting/js/pages/user.js" + ], + "options": { + "result": { + "type": { + "scripts": "plain" + } + } + } + }, + "js/pages/users": { + "scripts": [ + "userfrosting/js/widgets/users.js", + "userfrosting/js/pages/users.js" + ], + "options": { + "result": { + "type": { + "scripts": "plain" + } + } + } + }, + "js/pages/groups": { + "scripts": [ + "userfrosting/js/widgets/groups.js", + "userfrosting/js/pages/groups.js" + ], + "options": { + "result": { + "type": { + "scripts": "plain" + } + } + } + }, + "js/pages/permissions": { + "scripts": [ + "userfrosting/js/pages/permissions.js" + ], + "options": { + "result": { + "type": { + "scripts": "plain" + } + } + } + }, + "js/pages/roles": { + "scripts": [ + "userfrosting/js/widgets/roles.js", + "userfrosting/js/pages/roles.js" + ], + "options": { + "result": { + "type": { + "scripts": "plain" + } + } + } + }, + "css/admin": { + "styles": [ + "font-starcraft/css/font-starcraft.css", + "vendor/tablesorter/dist/css/theme.bootstrap.min.css", + "vendor/tablesorter/dist/css/jquery.tablesorter.pager.min.css", + "userfrosting/css/tablesorter-reflow.css", + "userfrosting/css/tablesorter-custom.css" + ], + "options": { + "result": { + "type": { + "styles": "plain" + } + } + } + } + } } \ No newline at end of file diff --git a/main/app/sprinkles/admin/assets/userfrosting/js/pages/activities.js b/main/app/sprinkles/admin/assets/userfrosting/js/pages/activities.js index 4968ffd..2dc31e1 100644 --- a/main/app/sprinkles/admin/assets/userfrosting/js/pages/activities.js +++ b/main/app/sprinkles/admin/assets/userfrosting/js/pages/activities.js @@ -1,16 +1,16 @@ -/** - * Page-specific Javascript file. Should generally be included as a separate asset bundle in your page template. - * example: {{ assets.js('js/pages/sign-in-or-register') | raw }} - * - * This script depends on uf-table.js, moment.js, handlebars-helpers.js - * - * Target page: /activities - */ - -$(document).ready(function () { - // Set up table of activities - $("#widget-activities").ufTable({ - dataUrl: site.uri.public + "/api/activities", - useLoadingTransition: site.uf_table.use_loading_transition - }); -}); +/** + * Page-specific Javascript file. Should generally be included as a separate asset bundle in your page template. + * example: {{ assets.js('js/pages/sign-in-or-register') | raw }} + * + * This script depends on uf-table.js, moment.js, handlebars-helpers.js + * + * Target page: /activities + */ + +$(document).ready(function () { + // Set up table of activities + $("#widget-activities").ufTable({ + dataUrl: site.uri.public + "/api/activities", + useLoadingTransition: site.uf_table.use_loading_transition + }); +}); diff --git a/main/app/sprinkles/admin/assets/userfrosting/js/pages/dashboard.js b/main/app/sprinkles/admin/assets/userfrosting/js/pages/dashboard.js index d78d611..3ff241d 100644 --- a/main/app/sprinkles/admin/assets/userfrosting/js/pages/dashboard.js +++ b/main/app/sprinkles/admin/assets/userfrosting/js/pages/dashboard.js @@ -1,49 +1,49 @@ -/** - * Page-specific Javascript file. Should generally be included as a separate asset bundle in your page template. - * example: {{ assets.js('js/pages/sign-in-or-register') | raw }} - * - * Target page: /dashboard - */ - -$(document).ready(function () { - $('.js-clear-cache').click(function () { - $("body").ufModal({ - sourceUrl: site.uri.public + "/modals/dashboard/clear-cache", - ajaxParams: { - slug: $(this).data('slug') - }, - msgTarget: $("#alerts-page") - }); - - $("body").on('renderSuccess.ufModal', function (data) { - var modal = $(this).ufModal('getModal'); - var form = modal.find('.js-form'); - - form.ufForm() - .on("submitSuccess.ufForm", function () { - // Reload page on success - window.location.reload(); - }); - }); - }); - - // Table of site activities - $("#widget-activities").ufTable({ - dataUrl: site.uri.public + "/api/activities", - useLoadingTransition: site.uf_table.use_loading_transition - }); - - // Table of users in current user's group - $("#widget-group-users").ufTable({ - dataUrl: site.uri.public + "/api/groups/g/" + page.group_slug + "/users", - useLoadingTransition: site.uf_table.use_loading_transition - }); - - // Bind user creation button - bindUserCreationButton($("#widget-group-users")); - - // Bind user table buttons - $("#widget-group-users").on("pagerComplete.ufTable", function () { - bindUserButtons($(this)); - }); -}); +/** + * Page-specific Javascript file. Should generally be included as a separate asset bundle in your page template. + * example: {{ assets.js('js/pages/sign-in-or-register') | raw }} + * + * Target page: /dashboard + */ + +$(document).ready(function () { + $('.js-clear-cache').click(function () { + $("body").ufModal({ + sourceUrl: site.uri.public + "/modals/dashboard/clear-cache", + ajaxParams: { + slug: $(this).data('slug') + }, + msgTarget: $("#alerts-page") + }); + + $("body").on('renderSuccess.ufModal', function (data) { + var modal = $(this).ufModal('getModal'); + var form = modal.find('.js-form'); + + form.ufForm() + .on("submitSuccess.ufForm", function () { + // Reload page on success + window.location.reload(); + }); + }); + }); + + // Table of site activities + $("#widget-activities").ufTable({ + dataUrl: site.uri.public + "/api/activities", + useLoadingTransition: site.uf_table.use_loading_transition + }); + + // Table of users in current user's group + $("#widget-group-users").ufTable({ + dataUrl: site.uri.public + "/api/groups/g/" + page.group_slug + "/users", + useLoadingTransition: site.uf_table.use_loading_transition + }); + + // Bind user creation button + bindUserCreationButton($("#widget-group-users")); + + // Bind user table buttons + $("#widget-group-users").on("pagerComplete.ufTable", function () { + bindUserButtons($(this)); + }); +}); diff --git a/main/app/sprinkles/admin/assets/userfrosting/js/pages/group.js b/main/app/sprinkles/admin/assets/userfrosting/js/pages/group.js index e54b897..57cd98d 100644 --- a/main/app/sprinkles/admin/assets/userfrosting/js/pages/group.js +++ b/main/app/sprinkles/admin/assets/userfrosting/js/pages/group.js @@ -1,24 +1,24 @@ -/** - * Page-specific Javascript file. Should generally be included as a separate asset bundle in your page template. - * example: {{ assets.js('js/pages/sign-in-or-register') | raw }} - * - * This script depends on uf-table.js, moment.js, handlebars-helpers.js - * - * Target page: /groups/g/{slug} - */ - -$(document).ready(function () { - // Control buttons - bindGroupButtons($("#view-group")); - - // Table of users in this group - $("#widget-group-users").ufTable({ - dataUrl: site.uri.public + '/api/groups/g/' + page.group_slug + '/users', - useLoadingTransition: site.uf_table.use_loading_transition - }); - - // Bind user table buttons - $("#widget-group-users").on("pagerComplete.ufTable", function () { - bindUserButtons($(this)); - }); -}); +/** + * Page-specific Javascript file. Should generally be included as a separate asset bundle in your page template. + * example: {{ assets.js('js/pages/sign-in-or-register') | raw }} + * + * This script depends on uf-table.js, moment.js, handlebars-helpers.js + * + * Target page: /groups/g/{slug} + */ + +$(document).ready(function () { + // Control buttons + bindGroupButtons($("#view-group")); + + // Table of users in this group + $("#widget-group-users").ufTable({ + dataUrl: site.uri.public + '/api/groups/g/' + page.group_slug + '/users', + useLoadingTransition: site.uf_table.use_loading_transition + }); + + // Bind user table buttons + $("#widget-group-users").on("pagerComplete.ufTable", function () { + bindUserButtons($(this)); + }); +}); diff --git a/main/app/sprinkles/admin/assets/userfrosting/js/pages/groups.js b/main/app/sprinkles/admin/assets/userfrosting/js/pages/groups.js index 42a1f05..f06eda8 100644 --- a/main/app/sprinkles/admin/assets/userfrosting/js/pages/groups.js +++ b/main/app/sprinkles/admin/assets/userfrosting/js/pages/groups.js @@ -1,24 +1,24 @@ -/** - * Page-specific Javascript file. Should generally be included as a separate asset bundle in your page template. - * example: {{ assets.js('js/pages/sign-in-or-register') | raw }} - * - * This script depends on widgets/groups.js, uf-table.js, moment.js, handlebars-helpers.js - * - * Target page: /groups - */ - -$(document).ready(function () { - - $("#widget-groups").ufTable({ - dataUrl: site.uri.public + "/api/groups", - useLoadingTransition: site.uf_table.use_loading_transition - }); - - // Bind creation button - bindGroupCreationButton($("#widget-groups")); - - // Bind table buttons - $("#widget-groups").on("pagerComplete.ufTable", function () { - bindGroupButtons($(this)); - }); -}); +/** + * Page-specific Javascript file. Should generally be included as a separate asset bundle in your page template. + * example: {{ assets.js('js/pages/sign-in-or-register') | raw }} + * + * This script depends on widgets/groups.js, uf-table.js, moment.js, handlebars-helpers.js + * + * Target page: /groups + */ + +$(document).ready(function () { + + $("#widget-groups").ufTable({ + dataUrl: site.uri.public + "/api/groups", + useLoadingTransition: site.uf_table.use_loading_transition + }); + + // Bind creation button + bindGroupCreationButton($("#widget-groups")); + + // Bind table buttons + $("#widget-groups").on("pagerComplete.ufTable", function () { + bindGroupButtons($(this)); + }); +}); diff --git a/main/app/sprinkles/admin/assets/userfrosting/js/pages/permission.js b/main/app/sprinkles/admin/assets/userfrosting/js/pages/permission.js index 61eefb6..ccb6bde 100644 --- a/main/app/sprinkles/admin/assets/userfrosting/js/pages/permission.js +++ b/main/app/sprinkles/admin/assets/userfrosting/js/pages/permission.js @@ -1,20 +1,20 @@ -/** - * Page-specific Javascript file. Should generally be included as a separate asset bundle in your page template. - * example: {{ assets.js('js/pages/sign-in-or-register') | raw }} - * - * This script depends on uf-table.js, moment.js, handlebars-helpers.js - * - * Target page: /permissions/p/{id} - */ - -$(document).ready(function () { - $("#widget-permission-users").ufTable({ - dataUrl: site.uri.public + '/api/permissions/p/' + page.permission_id + '/users', - useLoadingTransition: site.uf_table.use_loading_transition - }); - - // Bind table buttons - $("#widget-permission-users").on("pagerComplete.ufTable", function () { - bindUserButtons($(this)); - }); -}); +/** + * Page-specific Javascript file. Should generally be included as a separate asset bundle in your page template. + * example: {{ assets.js('js/pages/sign-in-or-register') | raw }} + * + * This script depends on uf-table.js, moment.js, handlebars-helpers.js + * + * Target page: /permissions/p/{id} + */ + +$(document).ready(function () { + $("#widget-permission-users").ufTable({ + dataUrl: site.uri.public + '/api/permissions/p/' + page.permission_id + '/users', + useLoadingTransition: site.uf_table.use_loading_transition + }); + + // Bind table buttons + $("#widget-permission-users").on("pagerComplete.ufTable", function () { + bindUserButtons($(this)); + }); +}); diff --git a/main/app/sprinkles/admin/assets/userfrosting/js/pages/permissions.js b/main/app/sprinkles/admin/assets/userfrosting/js/pages/permissions.js index 4881d25..46dfd3a 100644 --- a/main/app/sprinkles/admin/assets/userfrosting/js/pages/permissions.js +++ b/main/app/sprinkles/admin/assets/userfrosting/js/pages/permissions.js @@ -1,16 +1,16 @@ -/** - * Page-specific Javascript file. Should generally be included as a separate asset bundle in your page template. - * example: {{ assets.js('js/pages/sign-in-or-register') | raw }} - * - * This script depends on widgets/permissions.js, uf-table.js, moment.js, handlebars-helpers.js - * - * Target page: /permissions - */ - -$(document).ready(function () { - // Set up table of permissions - $("#widget-permissions").ufTable({ - dataUrl: site.uri.public + "/api/permissions", - useLoadingTransition: site.uf_table.use_loading_transition - }); -}); +/** + * Page-specific Javascript file. Should generally be included as a separate asset bundle in your page template. + * example: {{ assets.js('js/pages/sign-in-or-register') | raw }} + * + * This script depends on widgets/permissions.js, uf-table.js, moment.js, handlebars-helpers.js + * + * Target page: /permissions + */ + +$(document).ready(function () { + // Set up table of permissions + $("#widget-permissions").ufTable({ + dataUrl: site.uri.public + "/api/permissions", + useLoadingTransition: site.uf_table.use_loading_transition + }); +}); diff --git a/main/app/sprinkles/admin/assets/userfrosting/js/pages/role.js b/main/app/sprinkles/admin/assets/userfrosting/js/pages/role.js index 3bfcef7..f8f75b2 100644 --- a/main/app/sprinkles/admin/assets/userfrosting/js/pages/role.js +++ b/main/app/sprinkles/admin/assets/userfrosting/js/pages/role.js @@ -1,23 +1,23 @@ -/** - * Page-specific Javascript file. Should generally be included as a separate asset bundle in your page template. - * example: {{ assets.js('js/pages/sign-in-or-register') | raw }} - * - * This script depends on uf-table.js, moment.js, handlebars-helpers.js - * - * Target page: /roles/r/{slug} - */ - -$(document).ready(function () { - // Control buttons - bindRoleButtons($("#view-role")); - - $("#widget-role-permissions").ufTable({ - dataUrl: site.uri.public + '/api/roles/r/' + page.role_slug + '/permissions', - useLoadingTransition: site.uf_table.use_loading_transition - }); - - $("#widget-role-users").ufTable({ - dataUrl: site.uri.public + '/api/roles/r/' + page.role_slug + '/users', - useLoadingTransition: site.uf_table.use_loading_transition - }); -}); +/** + * Page-specific Javascript file. Should generally be included as a separate asset bundle in your page template. + * example: {{ assets.js('js/pages/sign-in-or-register') | raw }} + * + * This script depends on uf-table.js, moment.js, handlebars-helpers.js + * + * Target page: /roles/r/{slug} + */ + +$(document).ready(function () { + // Control buttons + bindRoleButtons($("#view-role")); + + $("#widget-role-permissions").ufTable({ + dataUrl: site.uri.public + '/api/roles/r/' + page.role_slug + '/permissions', + useLoadingTransition: site.uf_table.use_loading_transition + }); + + $("#widget-role-users").ufTable({ + dataUrl: site.uri.public + '/api/roles/r/' + page.role_slug + '/users', + useLoadingTransition: site.uf_table.use_loading_transition + }); +}); diff --git a/main/app/sprinkles/admin/assets/userfrosting/js/pages/roles.js b/main/app/sprinkles/admin/assets/userfrosting/js/pages/roles.js index 0643305..8818cb5 100644 --- a/main/app/sprinkles/admin/assets/userfrosting/js/pages/roles.js +++ b/main/app/sprinkles/admin/assets/userfrosting/js/pages/roles.js @@ -1,24 +1,24 @@ -/** - * Page-specific Javascript file. Should generally be included as a separate asset bundle in your page template. - * example: {{ assets.js('js/pages/sign-in-or-register') | raw }} - * - * This script depends on widgets/roles.js, uf-table.js, moment.js, handlebars-helpers.js - * - * Target page: /roles - */ - -$(document).ready(function () { - // Set up table of roles - $("#widget-roles").ufTable({ - dataUrl: site.uri.public + "/api/roles", - useLoadingTransition: site.uf_table.use_loading_transition - }); - - // Bind creation button - bindRoleCreationButton($("#widget-roles")); - - // Bind table buttons - $("#widget-roles").on("pagerComplete.ufTable", function () { - bindRoleButtons($(this)); - }); -}); +/** + * Page-specific Javascript file. Should generally be included as a separate asset bundle in your page template. + * example: {{ assets.js('js/pages/sign-in-or-register') | raw }} + * + * This script depends on widgets/roles.js, uf-table.js, moment.js, handlebars-helpers.js + * + * Target page: /roles + */ + +$(document).ready(function () { + // Set up table of roles + $("#widget-roles").ufTable({ + dataUrl: site.uri.public + "/api/roles", + useLoadingTransition: site.uf_table.use_loading_transition + }); + + // Bind creation button + bindRoleCreationButton($("#widget-roles")); + + // Bind table buttons + $("#widget-roles").on("pagerComplete.ufTable", function () { + bindRoleButtons($(this)); + }); +}); diff --git a/main/app/sprinkles/admin/assets/userfrosting/js/pages/user.js b/main/app/sprinkles/admin/assets/userfrosting/js/pages/user.js index 79d0301..ce75bd5 100644 --- a/main/app/sprinkles/admin/assets/userfrosting/js/pages/user.js +++ b/main/app/sprinkles/admin/assets/userfrosting/js/pages/user.js @@ -1,25 +1,25 @@ -/** - * Page-specific Javascript file. Should generally be included as a separate asset bundle in your page template. - * example: {{ assets.js('js/pages/sign-in-or-register') | raw }} - * - * This script depends on uf-table.js, moment.js, handlebars-helpers.js - * - * Target page: /users/u/{user_name} - */ - -$(document).ready(function () { - // Control buttons - bindUserButtons($("#view-user")); - - // Table of activities - $("#widget-user-activities").ufTable({ - dataUrl: site.uri.public + '/api/users/u/' + page.user_name + '/activities', - useLoadingTransition: site.uf_table.use_loading_transition - }); - - // Table of permissions - $("#widget-permissions").ufTable({ - dataUrl: site.uri.public + '/api/users/u/' + page.user_name + '/permissions', - useLoadingTransition: site.uf_table.use_loading_transition - }); -}); +/** + * Page-specific Javascript file. Should generally be included as a separate asset bundle in your page template. + * example: {{ assets.js('js/pages/sign-in-or-register') | raw }} + * + * This script depends on uf-table.js, moment.js, handlebars-helpers.js + * + * Target page: /users/u/{user_name} + */ + +$(document).ready(function () { + // Control buttons + bindUserButtons($("#view-user")); + + // Table of activities + $("#widget-user-activities").ufTable({ + dataUrl: site.uri.public + '/api/users/u/' + page.user_name + '/activities', + useLoadingTransition: site.uf_table.use_loading_transition + }); + + // Table of permissions + $("#widget-permissions").ufTable({ + dataUrl: site.uri.public + '/api/users/u/' + page.user_name + '/permissions', + useLoadingTransition: site.uf_table.use_loading_transition + }); +}); diff --git a/main/app/sprinkles/admin/assets/userfrosting/js/pages/users.js b/main/app/sprinkles/admin/assets/userfrosting/js/pages/users.js index 2e8685c..2051012 100644 --- a/main/app/sprinkles/admin/assets/userfrosting/js/pages/users.js +++ b/main/app/sprinkles/admin/assets/userfrosting/js/pages/users.js @@ -1,24 +1,24 @@ -/** - * Page-specific Javascript file. Should generally be included as a separate asset bundle in your page template. - * example: {{ assets.js('js/pages/sign-in-or-register') | raw }} - * - * This script depends on widgets/users.js, uf-table.js, moment.js, handlebars-helpers.js - * - * Target page: /users - */ - -$(document).ready(function () { - // Set up table of users - $("#widget-users").ufTable({ - dataUrl: site.uri.public + "/api/users", - useLoadingTransition: site.uf_table.use_loading_transition - }); - - // Bind creation button - bindUserCreationButton($("#widget-users")); - - // Bind table buttons - $("#widget-users").on("pagerComplete.ufTable", function () { - bindUserButtons($(this)); - }); -}); +/** + * Page-specific Javascript file. Should generally be included as a separate asset bundle in your page template. + * example: {{ assets.js('js/pages/sign-in-or-register') | raw }} + * + * This script depends on widgets/users.js, uf-table.js, moment.js, handlebars-helpers.js + * + * Target page: /users + */ + +$(document).ready(function () { + // Set up table of users + $("#widget-users").ufTable({ + dataUrl: site.uri.public + "/api/users", + useLoadingTransition: site.uf_table.use_loading_transition + }); + + // Bind creation button + bindUserCreationButton($("#widget-users")); + + // Bind table buttons + $("#widget-users").on("pagerComplete.ufTable", function () { + bindUserButtons($(this)); + }); +}); diff --git a/main/app/sprinkles/admin/assets/userfrosting/js/widgets/groups.js b/main/app/sprinkles/admin/assets/userfrosting/js/widgets/groups.js index cae3514..c25c702 100644 --- a/main/app/sprinkles/admin/assets/userfrosting/js/widgets/groups.js +++ b/main/app/sprinkles/admin/assets/userfrosting/js/widgets/groups.js @@ -1,111 +1,111 @@ -/** - * Groups widget. Sets up dropdowns, modals, etc for a table of groups. - */ - -/** - * Set up the form in a modal after being successfully attached to the body. - */ -function attachGroupForm() { - $("body").on('renderSuccess.ufModal', function (data) { - var modal = $(this).ufModal('getModal'); - var form = modal.find('.js-form'); - - /** - * Set up modal widgets - */ - // Set up any widgets inside the modal - form.find(".js-select2").select2({ - width: '100%' - }); - - // Auto-generate slug - form.find('input[name=name]').on('input change', function () { - var manualSlug = form.find('#form-group-slug-override').prop('checked'); - if (!manualSlug) { - var slug = getSlug($(this).val()); - form.find('input[name=slug]').val(slug); - } - }); - - form.find('#form-group-slug-override').on('change', function () { - if ($(this).prop('checked')) { - form.find('input[name=slug]').prop('readonly', false); - } else { - form.find('input[name=slug]').prop('readonly', true); - form.find('input[name=name]').trigger('change'); - } - }); - - // Set icon when changed - form.find('input[name=icon]').on('input change', function () { - $(this).prev(".icon-preview").find("i").removeClass().addClass($(this).val()); - }); - - // Set up the form for submission - form.ufForm({ - validators: page.validators - }).on("submitSuccess.ufForm", function () { - // Reload page on success - window.location.reload(); - }); - }); -} - -/** - * Link group action buttons, for example in a table or on a specific group's page. - */ -function bindGroupButtons(el) { - /** - * Link row buttons after table is loaded. - */ - - /** - * Buttons that launch a modal dialog - */ - // Edit group details button - el.find('.js-group-edit').click(function () { - $("body").ufModal({ - sourceUrl: site.uri.public + "/modals/groups/edit", - ajaxParams: { - slug: $(this).data('slug') - }, - msgTarget: $("#alerts-page") - }); - - attachGroupForm(); - }); - - // Delete group button - el.find('.js-group-delete').click(function () { - $("body").ufModal({ - sourceUrl: site.uri.public + "/modals/groups/confirm-delete", - ajaxParams: { - slug: $(this).data('slug') - }, - msgTarget: $("#alerts-page") - }); - - $("body").on('renderSuccess.ufModal', function (data) { - var modal = $(this).ufModal('getModal'); - var form = modal.find('.js-form'); - - form.ufForm() - .on("submitSuccess.ufForm", function () { - // Reload page on success - window.location.reload(); - }); - }); - }); -} - -function bindGroupCreationButton(el) { - // Link create button - el.find('.js-group-create').click(function () { - $("body").ufModal({ - sourceUrl: site.uri.public + "/modals/groups/create", - msgTarget: $("#alerts-page") - }); - - attachGroupForm(); - }); -}; +/** + * Groups widget. Sets up dropdowns, modals, etc for a table of groups. + */ + +/** + * Set up the form in a modal after being successfully attached to the body. + */ +function attachGroupForm() { + $("body").on('renderSuccess.ufModal', function (data) { + var modal = $(this).ufModal('getModal'); + var form = modal.find('.js-form'); + + /** + * Set up modal widgets + */ + // Set up any widgets inside the modal + form.find(".js-select2").select2({ + width: '100%' + }); + + // Auto-generate slug + form.find('input[name=name]').on('input change', function () { + var manualSlug = form.find('#form-group-slug-override').prop('checked'); + if (!manualSlug) { + var slug = getSlug($(this).val()); + form.find('input[name=slug]').val(slug); + } + }); + + form.find('#form-group-slug-override').on('change', function () { + if ($(this).prop('checked')) { + form.find('input[name=slug]').prop('readonly', false); + } else { + form.find('input[name=slug]').prop('readonly', true); + form.find('input[name=name]').trigger('change'); + } + }); + + // Set icon when changed + form.find('input[name=icon]').on('input change', function () { + $(this).prev(".icon-preview").find("i").removeClass().addClass($(this).val()); + }); + + // Set up the form for submission + form.ufForm({ + validators: page.validators + }).on("submitSuccess.ufForm", function () { + // Reload page on success + window.location.reload(); + }); + }); +} + +/** + * Link group action buttons, for example in a table or on a specific group's page. + */ +function bindGroupButtons(el) { + /** + * Link row buttons after table is loaded. + */ + + /** + * Buttons that launch a modal dialog + */ + // Edit group details button + el.find('.js-group-edit').click(function () { + $("body").ufModal({ + sourceUrl: site.uri.public + "/modals/groups/edit", + ajaxParams: { + slug: $(this).data('slug') + }, + msgTarget: $("#alerts-page") + }); + + attachGroupForm(); + }); + + // Delete group button + el.find('.js-group-delete').click(function () { + $("body").ufModal({ + sourceUrl: site.uri.public + "/modals/groups/confirm-delete", + ajaxParams: { + slug: $(this).data('slug') + }, + msgTarget: $("#alerts-page") + }); + + $("body").on('renderSuccess.ufModal', function (data) { + var modal = $(this).ufModal('getModal'); + var form = modal.find('.js-form'); + + form.ufForm() + .on("submitSuccess.ufForm", function () { + // Reload page on success + window.location.reload(); + }); + }); + }); +} + +function bindGroupCreationButton(el) { + // Link create button + el.find('.js-group-create').click(function () { + $("body").ufModal({ + sourceUrl: site.uri.public + "/modals/groups/create", + msgTarget: $("#alerts-page") + }); + + attachGroupForm(); + }); +}; diff --git a/main/app/sprinkles/admin/assets/userfrosting/js/widgets/roles.js b/main/app/sprinkles/admin/assets/userfrosting/js/widgets/roles.js index 42b58ed..236fc53 100644 --- a/main/app/sprinkles/admin/assets/userfrosting/js/widgets/roles.js +++ b/main/app/sprinkles/admin/assets/userfrosting/js/widgets/roles.js @@ -1,147 +1,147 @@ -/** - * Roles widget. Sets up dropdowns, modals, etc for a table of roles. - */ - -/** - * Set up the form in a modal after being successfully attached to the body. - */ -function attachRoleForm() { - $("body").on('renderSuccess.ufModal', function (data) { - var modal = $(this).ufModal('getModal'); - var form = modal.find('.js-form'); - - /** - * Set up modal widgets - */ - - // Auto-generate slug - form.find('input[name=name]').on('input change', function () { - var manualSlug = form.find('#form-role-slug-override').prop('checked'); - if (!manualSlug) { - var slug = getSlug($(this).val()); - form.find('input[name=slug]').val(slug); - } - }); - - form.find('#form-role-slug-override').on('change', function () { - if ($(this).prop('checked')) { - form.find('input[name=slug]').prop('readonly', false); - } else { - form.find('input[name=slug]').prop('readonly', true); - form.find('input[name=name]').trigger('change'); - } - }); - - // Set up the form for submission - form.ufForm({ - validators: page.validators - }).on("submitSuccess.ufForm", function () { - // Reload page on success - window.location.reload(); - }); - }); -} - -/** - * Link role action buttons, for example in a table or on a specific role's page. - */ -function bindRoleButtons(el) { - /** - * Link row buttons after table is loaded. - */ - - // Manage permissions button - el.find('.js-role-permissions').click(function () { - var slug = $(this).data('slug'); - $("body").ufModal({ - sourceUrl: site.uri.public + "/modals/roles/permissions", - ajaxParams: { - slug: slug - }, - msgTarget: $("#alerts-page") - }); - - $("body").on('renderSuccess.ufModal', function (data) { - var modal = $(this).ufModal('getModal'); - var form = modal.find('.js-form'); - - // Set up collection widget - var permissionWidget = modal.find('.js-form-permissions'); - permissionWidget.ufCollection({ - dropdown: { - ajax: { - url: site.uri.public + '/api/permissions' - }, - placeholder: "Select a permission" - }, - dropdownTemplate: modal.find('#role-permissions-select-option').html(), - rowTemplate: modal.find('#role-permissions-row').html() - }); - - // Get current roles and add to widget - $.getJSON(site.uri.public + '/api/roles/r/' + slug + '/permissions') - .done(function (data) { - $.each(data.rows, function (idx, permission) { - permission.text = permission.name; - permissionWidget.ufCollection('addRow', permission); - }); - }); - - // Set up form for submission - form.ufForm({}).on("submitSuccess.ufForm", function () { - // Reload page on success - window.location.reload(); - }); - }); - }); - - /** - * Buttons that launch a modal dialog - */ - // Edit role details button - el.find('.js-role-edit').click(function () { - $("body").ufModal({ - sourceUrl: site.uri.public + "/modals/roles/edit", - ajaxParams: { - slug: $(this).data('slug') - }, - msgTarget: $("#alerts-page") - }); - - attachRoleForm(); - }); - - // Delete role button - el.find('.js-role-delete').click(function () { - $("body").ufModal({ - sourceUrl: site.uri.public + "/modals/roles/confirm-delete", - ajaxParams: { - slug: $(this).data('slug') - }, - msgTarget: $("#alerts-page") - }); - - $("body").on('renderSuccess.ufModal', function (data) { - var modal = $(this).ufModal('getModal'); - var form = modal.find('.js-form'); - - form.ufForm() - .on("submitSuccess.ufForm", function () { - // Reload page on success - window.location.reload(); - }); - }); - }); -} - -function bindRoleCreationButton(el) { - // Link create button - el.find('.js-role-create').click(function () { - $("body").ufModal({ - sourceUrl: site.uri.public + "/modals/roles/create", - msgTarget: $("#alerts-page") - }); - - attachRoleForm(); - }); -}; +/** + * Roles widget. Sets up dropdowns, modals, etc for a table of roles. + */ + +/** + * Set up the form in a modal after being successfully attached to the body. + */ +function attachRoleForm() { + $("body").on('renderSuccess.ufModal', function (data) { + var modal = $(this).ufModal('getModal'); + var form = modal.find('.js-form'); + + /** + * Set up modal widgets + */ + + // Auto-generate slug + form.find('input[name=name]').on('input change', function () { + var manualSlug = form.find('#form-role-slug-override').prop('checked'); + if (!manualSlug) { + var slug = getSlug($(this).val()); + form.find('input[name=slug]').val(slug); + } + }); + + form.find('#form-role-slug-override').on('change', function () { + if ($(this).prop('checked')) { + form.find('input[name=slug]').prop('readonly', false); + } else { + form.find('input[name=slug]').prop('readonly', true); + form.find('input[name=name]').trigger('change'); + } + }); + + // Set up the form for submission + form.ufForm({ + validators: page.validators + }).on("submitSuccess.ufForm", function () { + // Reload page on success + window.location.reload(); + }); + }); +} + +/** + * Link role action buttons, for example in a table or on a specific role's page. + */ +function bindRoleButtons(el) { + /** + * Link row buttons after table is loaded. + */ + + // Manage permissions button + el.find('.js-role-permissions').click(function () { + var slug = $(this).data('slug'); + $("body").ufModal({ + sourceUrl: site.uri.public + "/modals/roles/permissions", + ajaxParams: { + slug: slug + }, + msgTarget: $("#alerts-page") + }); + + $("body").on('renderSuccess.ufModal', function (data) { + var modal = $(this).ufModal('getModal'); + var form = modal.find('.js-form'); + + // Set up collection widget + var permissionWidget = modal.find('.js-form-permissions'); + permissionWidget.ufCollection({ + dropdown: { + ajax: { + url: site.uri.public + '/api/permissions' + }, + placeholder: "Select a permission" + }, + dropdownTemplate: modal.find('#role-permissions-select-option').html(), + rowTemplate: modal.find('#role-permissions-row').html() + }); + + // Get current roles and add to widget + $.getJSON(site.uri.public + '/api/roles/r/' + slug + '/permissions') + .done(function (data) { + $.each(data.rows, function (idx, permission) { + permission.text = permission.name; + permissionWidget.ufCollection('addRow', permission); + }); + }); + + // Set up form for submission + form.ufForm({}).on("submitSuccess.ufForm", function () { + // Reload page on success + window.location.reload(); + }); + }); + }); + + /** + * Buttons that launch a modal dialog + */ + // Edit role details button + el.find('.js-role-edit').click(function () { + $("body").ufModal({ + sourceUrl: site.uri.public + "/modals/roles/edit", + ajaxParams: { + slug: $(this).data('slug') + }, + msgTarget: $("#alerts-page") + }); + + attachRoleForm(); + }); + + // Delete role button + el.find('.js-role-delete').click(function () { + $("body").ufModal({ + sourceUrl: site.uri.public + "/modals/roles/confirm-delete", + ajaxParams: { + slug: $(this).data('slug') + }, + msgTarget: $("#alerts-page") + }); + + $("body").on('renderSuccess.ufModal', function (data) { + var modal = $(this).ufModal('getModal'); + var form = modal.find('.js-form'); + + form.ufForm() + .on("submitSuccess.ufForm", function () { + // Reload page on success + window.location.reload(); + }); + }); + }); +} + +function bindRoleCreationButton(el) { + // Link create button + el.find('.js-role-create').click(function () { + $("body").ufModal({ + sourceUrl: site.uri.public + "/modals/roles/create", + msgTarget: $("#alerts-page") + }); + + attachRoleForm(); + }); +}; diff --git a/main/app/sprinkles/admin/composer.json b/main/app/sprinkles/admin/composer.json index 850543d..e2f7836 100644 --- a/main/app/sprinkles/admin/composer.json +++ b/main/app/sprinkles/admin/composer.json @@ -1,26 +1,26 @@ -{ - "name": "userfrosting/sprinkle-admin", - "type": "userfrosting-sprinkle", - "description": "Administrative management module for UserFrosting.", - "keywords": [ - "php user management", - "usercake", - "bootstrap" - ], - "homepage": "https://github.com/userfrosting/UserFrosting", - "license": "MIT", - "authors": [ - { - "name": "Alexander Weissman", - "homepage": "https://alexanderweissman.com" - } - ], - "require": { - "php": ">=5.6" - }, - "autoload": { - "psr-4": { - "UserFrosting\\Sprinkle\\Admin\\": "src/" - } - } -} +{ + "name": "userfrosting/sprinkle-admin", + "type": "userfrosting-sprinkle", + "description": "Administrative management module for UserFrosting.", + "keywords": [ + "php user management", + "usercake", + "bootstrap" + ], + "homepage": "https://github.com/userfrosting/UserFrosting", + "license": "MIT", + "authors": [ + { + "name": "Alexander Weissman", + "homepage": "https://alexanderweissman.com" + } + ], + "require": { + "php": ">=5.6" + }, + "autoload": { + "psr-4": { + "UserFrosting\\Sprinkle\\Admin\\": "src/" + } + } +} diff --git a/main/app/sprinkles/admin/locale/ar/messages.php b/main/app/sprinkles/admin/locale/ar/messages.php index 4cbe3bd..0291143 100644 --- a/main/app/sprinkles/admin/locale/ar/messages.php +++ b/main/app/sprinkles/admin/locale/ar/messages.php @@ -1,135 +1,135 @@ - [ - 1 => "نشاط", - 2 => "أنشطة", - - "LAST" => "النشاط الاخير", - "PAGE" => "قائمة من أنشطة المستخدم", - "TIME" => "وقت نشاط" - ], - - "CACHE" => [ - "CLEAR" => "مسح ذاكرة التخزين", - "CLEAR_CONFIRM" => "هل أنت متأكد أنك تريد مسح ذاكرة التخزين بالموقع؟", - "CLEAR_CONFIRM_YES" => "نعم، إمسح ذاكرة التخزين", - "CLEARED" => "تم مسح ذاكرة التخزين بنجاح" - ], - - "DASHBOARD" => "لوحة القيادة", - "NO_FEATURES_YET" => "لا يبدو أن أي ميزات تم إعدادها لهذا الحساب حتى الآن. ربما لم يتم تنفيذها بعد، أو ربما شخص نسي أن يعطيك الوصول. في كلتا الحالتين، نحن سعداء أن يكون لك على متن!", - "DELETE_MASTER" => "لا يمكنك حذف الحساب الرئيسي", - "DELETION_SUCCESSFUL" => "المستعمل {{user_name}} حذف بنجاح", - "DETAILS_UPDATED" => "جدد تفاصيل الحساب للمستخدم {{user_name}}", - "DISABLE_MASTER" => "لا يمكنك تعطيل الحساب الرئيسي", - "DISABLE_SUCCESSFUL" => "حساب المستخدم {{user_name}} عطيل بنجاح", - - "ENABLE_SUCCESSFUL" => "حساب المستخدم {{user_name}} مكين بنجاح", - - "GROUP" => [ - 1 => "مجموعة", - 2 => "مجموعات", - - "CREATE" => "إنشاء مجموعة", - "DELETE" => "حذف مجموعة", - "DELETE_CONFIRM" => "هل أنت متأكد أنك تريد حذف مجموعة {{name}}?", - "DELETE_YES" => "نعم، إحذف مجموعة", - "EDIT" => "تعديل مجموعة", - "ICON" => "رمز المجموعة", - "ICON_EXPLAIN" => "رمز المستخدمين في المجموعه", - "INFO_PAGE" => "صفحة معلومات المجموعة ل {{name}}", - //"MANAGE" => "Manage group", - "NAME" => "أسم المجموعة", - "NAME_EXPLAIN" => "ادخال اسم للمجموعة", - "PAGE_DESCRIPTION" => "قائمة المجموعات لموقعك يوفر أدوات لإدارة التحرير وحذف مجموعات" - ], - - "MANUALLY_ACTIVATED" => "تم تفعيل حساب{{user_name}}", - "MASTER_ACCOUNT_EXISTS" => "الحساب الرئيسي موجود بالفعل", - "MIGRATION" => [ - "REQUIRED" => "تحديث قاعدة البيانات مطلوب" - ], - - "PERMISSION" => [ - 1 => "الإذن", - 2 => "مأذونيات", - - "ASSIGN_NEW" => "تعيين إذن جديد", - "HOOK_CONDITION" => "الظروف", - "MANAGE" => "إدارة المأذونات", - "PAGE_DESCRIPTION" => "قائمة المأذونات لموقعك", - "UPDATE" => "تحديث المأذونات" - ], - - "ROLE" => [ - 1 => "وظيفة", - 2 => "وظائف", - - "ASSIGN_NEW" => "تعيين دور جديد", - "CREATE" => "إنشاء دور", - "DELETE" => "حذف دور", - "DELETE_CONFIRM" => "هل أنت متأكد أنك تريد حذف الدور {{name}}?", - "DELETE_YES" => "نعم، حذف دور", - "EDIT" => "إدارة دور", - "INFO_PAGE" => "صفحة معلومات دور {{name}}", - "MANAGE" => "إدارة الوظائف", - "NAME" => "اسم", - "NAME_EXPLAIN" => "أدخل اسما للدور", - "PAGE_DESCRIPTION" => "قائمة الوظائف لموقعك", - "UPDATED" => "تحديث الوظائف" - ], - - "SYSTEM_INFO" => [ - "@TRANSLATION" => "معلومات الجهاز", - - "DB_NAME" => "اسم قاعدة البيانات", - "DB_VERSION" => "إصدار قاعدة البيانات", - "DIRECTORY" => "دليل المشروع", - "PHP_VERSION" => "الإصدار PHP", - "SERVER" => "برنامج الخادم", - "SPRINKLES" => "sprinkles المحمل", - "UF_VERSION" => "إصدار UserFrosting", - "URL" => "رابط قاعدة الموقع" - ], - - "USER" => [ - 1 => "مستخدم", - 2 => "المستخدمين", - - "ADMIN" => [ - "CHANGE_PASSWORD" => "تغيير كلمة المرور للمستخدم", - "SEND_PASSWORD_LINK" => "إرسال المستخدم وصلة من شأنها أن تسمح لهم لاختيار كلمة المرور الخاصة بهم", - "SET_PASSWORD" => "تعيين كلمة المرور الخاصة بالمستخدم" - ], - - "ACTIVATE" => "تفعيل المستخدم", - "CREATE" => "إنشاء مستخدم", - "DELETE" => "مسح المستخدم", - "DELETE_CONFIRM" => "هل أنت متأكد أنك تريد حذف المستخدم {{name}}?", - "DELETE_YES" => "نعم، حذف المستخدم", - "DISABLE" => "تعطيل المستخدم ", - "EDIT" => "إدارة المستخدم", - "ENABLE" => "تمكين المستخدم", - "INFO_PAGE" => "صفحة معلومات المستخدم {{name}}", - "PAGE_DESCRIPTION" => "قائمة المستخدمين لموقعك", - "LATEST" => "أحدث المستخدمين", - "VIEW_ALL" => "عرض جميع المستخدمين" - ], - "X_USER" => [ - 0 => "لا يوجد اي مستخدمين", - 1 => "{{plural}} مستخدم", - 2 => "{{plural}} المستخدمين" - ] -]; + [ + 1 => "نشاط", + 2 => "أنشطة", + + "LAST" => "النشاط الاخير", + "PAGE" => "قائمة من أنشطة المستخدم", + "TIME" => "وقت نشاط" + ], + + "CACHE" => [ + "CLEAR" => "مسح ذاكرة التخزين", + "CLEAR_CONFIRM" => "هل أنت متأكد أنك تريد مسح ذاكرة التخزين بالموقع؟", + "CLEAR_CONFIRM_YES" => "نعم، إمسح ذاكرة التخزين", + "CLEARED" => "تم مسح ذاكرة التخزين بنجاح" + ], + + "DASHBOARD" => "لوحة القيادة", + "NO_FEATURES_YET" => "لا يبدو أن أي ميزات تم إعدادها لهذا الحساب حتى الآن. ربما لم يتم تنفيذها بعد، أو ربما شخص نسي أن يعطيك الوصول. في كلتا الحالتين، نحن سعداء أن يكون لك على متن!", + "DELETE_MASTER" => "لا يمكنك حذف الحساب الرئيسي", + "DELETION_SUCCESSFUL" => "المستعمل {{user_name}} حذف بنجاح", + "DETAILS_UPDATED" => "جدد تفاصيل الحساب للمستخدم {{user_name}}", + "DISABLE_MASTER" => "لا يمكنك تعطيل الحساب الرئيسي", + "DISABLE_SUCCESSFUL" => "حساب المستخدم {{user_name}} عطيل بنجاح", + + "ENABLE_SUCCESSFUL" => "حساب المستخدم {{user_name}} مكين بنجاح", + + "GROUP" => [ + 1 => "مجموعة", + 2 => "مجموعات", + + "CREATE" => "إنشاء مجموعة", + "DELETE" => "حذف مجموعة", + "DELETE_CONFIRM" => "هل أنت متأكد أنك تريد حذف مجموعة {{name}}?", + "DELETE_YES" => "نعم، إحذف مجموعة", + "EDIT" => "تعديل مجموعة", + "ICON" => "رمز المجموعة", + "ICON_EXPLAIN" => "رمز المستخدمين في المجموعه", + "INFO_PAGE" => "صفحة معلومات المجموعة ل {{name}}", + //"MANAGE" => "Manage group", + "NAME" => "أسم المجموعة", + "NAME_EXPLAIN" => "ادخال اسم للمجموعة", + "PAGE_DESCRIPTION" => "قائمة المجموعات لموقعك يوفر أدوات لإدارة التحرير وحذف مجموعات" + ], + + "MANUALLY_ACTIVATED" => "تم تفعيل حساب{{user_name}}", + "MASTER_ACCOUNT_EXISTS" => "الحساب الرئيسي موجود بالفعل", + "MIGRATION" => [ + "REQUIRED" => "تحديث قاعدة البيانات مطلوب" + ], + + "PERMISSION" => [ + 1 => "الإذن", + 2 => "مأذونيات", + + "ASSIGN_NEW" => "تعيين إذن جديد", + "HOOK_CONDITION" => "الظروف", + "MANAGE" => "إدارة المأذونات", + "PAGE_DESCRIPTION" => "قائمة المأذونات لموقعك", + "UPDATE" => "تحديث المأذونات" + ], + + "ROLE" => [ + 1 => "وظيفة", + 2 => "وظائف", + + "ASSIGN_NEW" => "تعيين دور جديد", + "CREATE" => "إنشاء دور", + "DELETE" => "حذف دور", + "DELETE_CONFIRM" => "هل أنت متأكد أنك تريد حذف الدور {{name}}?", + "DELETE_YES" => "نعم، حذف دور", + "EDIT" => "إدارة دور", + "INFO_PAGE" => "صفحة معلومات دور {{name}}", + "MANAGE" => "إدارة الوظائف", + "NAME" => "اسم", + "NAME_EXPLAIN" => "أدخل اسما للدور", + "PAGE_DESCRIPTION" => "قائمة الوظائف لموقعك", + "UPDATED" => "تحديث الوظائف" + ], + + "SYSTEM_INFO" => [ + "@TRANSLATION" => "معلومات الجهاز", + + "DB_NAME" => "اسم قاعدة البيانات", + "DB_VERSION" => "إصدار قاعدة البيانات", + "DIRECTORY" => "دليل المشروع", + "PHP_VERSION" => "الإصدار PHP", + "SERVER" => "برنامج الخادم", + "SPRINKLES" => "sprinkles المحمل", + "UF_VERSION" => "إصدار UserFrosting", + "URL" => "رابط قاعدة الموقع" + ], + + "USER" => [ + 1 => "مستخدم", + 2 => "المستخدمين", + + "ADMIN" => [ + "CHANGE_PASSWORD" => "تغيير كلمة المرور للمستخدم", + "SEND_PASSWORD_LINK" => "إرسال المستخدم وصلة من شأنها أن تسمح لهم لاختيار كلمة المرور الخاصة بهم", + "SET_PASSWORD" => "تعيين كلمة المرور الخاصة بالمستخدم" + ], + + "ACTIVATE" => "تفعيل المستخدم", + "CREATE" => "إنشاء مستخدم", + "DELETE" => "مسح المستخدم", + "DELETE_CONFIRM" => "هل أنت متأكد أنك تريد حذف المستخدم {{name}}?", + "DELETE_YES" => "نعم، حذف المستخدم", + "DISABLE" => "تعطيل المستخدم ", + "EDIT" => "إدارة المستخدم", + "ENABLE" => "تمكين المستخدم", + "INFO_PAGE" => "صفحة معلومات المستخدم {{name}}", + "PAGE_DESCRIPTION" => "قائمة المستخدمين لموقعك", + "LATEST" => "أحدث المستخدمين", + "VIEW_ALL" => "عرض جميع المستخدمين" + ], + "X_USER" => [ + 0 => "لا يوجد اي مستخدمين", + 1 => "{{plural}} مستخدم", + 2 => "{{plural}} المستخدمين" + ] +]; diff --git a/main/app/sprinkles/admin/locale/de_DE/messages.php b/main/app/sprinkles/admin/locale/de_DE/messages.php index fa6883a..ec3448d 100644 --- a/main/app/sprinkles/admin/locale/de_DE/messages.php +++ b/main/app/sprinkles/admin/locale/de_DE/messages.php @@ -1,161 +1,161 @@ - [ - 1 => "Aktivität", - 2 => "Aktivitäten", - - "LAST" => "Letzte Aktivität", - "PAGE" => "Eine Auflistung der Benutzeraktivitäten", - "TIME" => "Aktivitätszeit" - ], - - "CACHE" => [ - "CLEAR" => "Cache löschen", - "CLEAR_CONFIRM" => "Sind Sie sicher, dass Sie den Seiten-Cache löschen möchten?", - "CLEAR_CONFIRM_YES" => "Ja, Cache löschen", - "CLEARED" => "Cache wurde erfolgreich gelöscht!" - ], - - "DASHBOARD" => "Übersicht", - "NO_FEATURES_YET" => "Es sieht aus, als wären für Ihren Account noch keine Funktionen aktiviert... bisher. Entweder sie wurden bisher noch nicht implementiert, oder Ihnen fehlen noch die Berechtigungen. Trotzdem ist es schön, dass Sie auf unsere Seite gekommen sind!", - "DELETE_MASTER" => "Sie können das Root-Konto nicht löschen!", - "DELETION_SUCCESSFUL" => "Benutzer {{user_name}} wurde erfolgreich gelöscht.", - "DETAILS_UPDATED" => "Konto-Daten für {{user_name}} aktualisiert.", - "DISABLE_MASTER" => "Sie können das Root-Konto nicht deaktivieren!", - "DISABLE_SELF" => "Sie können Ihr eigenes Konto nicht deaktivieren!", - "DISABLE_SUCCESSFUL" => "Konto von {{user_name}} wurde erfolgreich deaktiviert.", - - "ENABLE_SUCCESSFUL" => "Konto von {{user_name}} wurde erfolgreich aktiviert.", - - "GROUP" => [ - 1 => "Gruppe", - 2 => "Gruppen", - - "CREATE" => "Gruppe erstellen", - "CREATION_SUCCESSFUL" => "Die Gruppe {{name}} wurde erfolgreich erstellt", - "DELETE" => "Gruppe löschen", - "DELETE_CONFIRM" => "Möchten Sie die Gruppe {{name}} wirklich löschen?", - "DELETE_DEFAULT" => "Sie können die Gruppe {{name}} nicht löschen, da es die Standardgruppe für neu registrierte Benutzer ist.", - "DELETE_YES" => "Ja, Gruppe löschen", - "DELETION_SUCCESSFUL" => "Die Gruppe {{name}} wurde erfolgreich gelöscht", - "EDIT" => "Gruppe bearbeiten", - "ICON" => "Gruppensymbol", - "ICON_EXPLAIN" => "Symbol für Gruppenmitglieder", - "INFO_PAGE" => "Gruppeninformationsseite für {{name}}", - "MANAGE" => "Gruppe verwalten", - "NAME" => "Gruppenname", - "NAME_EXPLAIN" => "Geben Sie einen Namen für die Gruppe ein", - "NOT_EMPTY" => "Sie können das nicht tun, denn es sind noch Benutzer mit der Gruppe {{name}} verbunden.", - "PAGE_DESCRIPTION" => "Eine Liste der Gruppen für Ihre Website. Bietet Verwaltungstools für das Bearbeiten und Löschen von Gruppen.", - "SUMMARY" => "Gruppen Zusammenfassung", - "UPDATE" => "Details für die Gruppe {{name}} aktualisiert" - ], - - "MANUALLY_ACTIVATED" => "{{user_name}}'s Konto wurde manuell aktiviert.", - "MASTER_ACCOUNT_EXISTS" => "Das Root-Konto existiert bereits!", - "MIGRATION" => [ - "REQUIRED" => "Datenbankaktualisierung erforderlich" - ], - - "PERMISSION" => [ - 1 => "Berechtigung", - 2 => "Berechtigungen", - - "ASSIGN_NEW" => "Neue Berechtigung zuweisen", - "HOOK_CONDITION" => "Haken/Bedingungen", - "ID" => "Berechtigungs-ID", - "INFO_PAGE" => "Berechtigungs Informationen für '{{name}}'", - "MANAGE" => "Berechtigungen verwalten", - "NOTE_READ_ONLY" => "Bitte beachten Sie: Berechtigungen werden als \"Teil des Quelltexts\" gesehen und können hier nicht bearbeitet werden. Um Berechtigungen hinzuzufügen, zu bearbeiten, oder zu löschen, benutzen Sie bitte folgende Dokumentation zur Datenbank Migration.", - "PAGE_DESCRIPTION" => "Eine Liste der Berechtigungen für Ihre Website. Bietet Verwaltungstools zum Bearbeiten und Löschen von Berechtigungen.", - "SUMMARY" => "Berechtigungs Zusammenfassung", - "UPDATE" => "Berechtigungen aktualisieren", - "VIA_ROLES" => "Besitzt die Berechtigung durch die Rolle" - ], - - "ROLE" => [ - 1 => "Rolle", - 2 => "Rollen", - - "ASSIGN_NEW" => "Neue Rolle zuweisen", - "CREATE" => "Rolle erstellen", - "CREATION_SUCCESSFUL" => "Die Rolle {{name}} wurde erfolgreich erstellt", - "DELETE" => "Rolle löschen", - "DELETE_CONFIRM" => "Sind Sie sicher, dass Sie die Rolle {{name}} löschen möchten?", - "DELETE_DEFAULT" => "Sie können die Rolle {{name}} nicht löschen, da es eine Standardrolle für neu registrierte Benutzer ist.", - "DELETE_YES" => "Ja, Rolle löschen", - "DELETION_SUCCESSFUL" => "Die Rolle {{name}} wurde erfolgreich gelöscht", - "EDIT" => "Rolle bearbeiten", - "HAS_USERS" => "Sie können das nicht machen weil es noch Benutzer gibt, die die Rolle {{name}} haben.", - "INFO_PAGE" => "Rolleninformationsseite für {{name}}", - "MANAGE" => "Rollen verwalten", - "NAME" => "Name", - "NAME_EXPLAIN" => "Geben Sie einen Namen für die Rolle ein", - "NAME_IN_USE" => "Eine Rolle mit dem Namen {{name}} existiert bereits", - "PAGE_DESCRIPTION" => "Eine Liste der Rollen für Ihre Website. Bietet Verwaltungstools zum Bearbeiten und Löschen von Rollen.", - "PERMISSIONS_UPDATED" => "Berechtigungen für die Rolle {{name}} aktualisiert", - "SUMMARY" => "Rollen Zusammenfassung", - "UPDATED" => "Rollen aktualisieren" - ], - - "SYSTEM_INFO" => [ - "@TRANSLATION" => "System Information", - - "DB_NAME" => "Name der Datenbank", - "DB_VERSION" => "Datenbankversion", - "DIRECTORY" => "Projektverzeichnis", - "PHP_VERSION" => "PHP-Version", - "SERVER" => "Web-Server-Software", - "SPRINKLES" => "Geladene Sprinkles", - "UF_VERSION" => "UserFrosting Version", - "URL" => "Website-Stamm-Url" - ], - - "TOGGLE_COLUMNS" => "Spalten anpassen", - - "USER" => [ - 1 => "Benutzer", - 2 => "Benutzer", - - "ADMIN" => [ - "CHANGE_PASSWORD" => "Benutzerpasswort ändern", - "SEND_PASSWORD_LINK" => "Senden Sie dem Benutzer einen Link, der ihnen erlaubt, ihr eigenes Passwort zu wählen", - "SET_PASSWORD" => "Setzen Sie das Passwort des Benutzers als" - ], - - "ACTIVATE" => "Benutzer aktivieren", - "CREATE" => "Benutzer erstellen", - "CREATED" => "Benutzer {{user_name}} wurde erfolgreich erstellt", - "DELETE" => "Benutzer löschen", - "DELETE_CONFIRM" => "Sind Sie sicher, dass Sie den Benutzer {{name}} löschen möchten?", - "DELETE_YES" => "Ja, Benutzer löschen", - "DISABLE" => "Benutzer deaktivieren", - "EDIT" => "Benutzer bearbeiten", - "ENABLE" => "Benutzer aktivieren", - "INFO_PAGE" => "Benutzerinformationsseite für {{name}}", - "LATEST" => "Neueste Benutzer", - "PAGE_DESCRIPTION" => "Eine Liste der Benutzer für Ihre Website. Bietet Management-Tools, einschließlich der Möglichkeit, Benutzerdaten bearbeiten, manuell aktivieren, Benutzer aktivieren/deaktivieren, und vieles mehr.", - "SUMMARY" => "Benutzer Zusammenfassung", - "VIEW_ALL" => "Alle Benutzer anzeigen", - "WITH_PERMISSION" => "Benutzer mit dieser Berechtigung" - ], - "X_USER" => [ - 0 => "Keine Benutzer", - 1 => "{{plural}} Benutzer", - 2 => "{{plural}} Benutzer" - ] -]; + [ + 1 => "Aktivität", + 2 => "Aktivitäten", + + "LAST" => "Letzte Aktivität", + "PAGE" => "Eine Auflistung der Benutzeraktivitäten", + "TIME" => "Aktivitätszeit" + ], + + "CACHE" => [ + "CLEAR" => "Cache löschen", + "CLEAR_CONFIRM" => "Sind Sie sicher, dass Sie den Seiten-Cache löschen möchten?", + "CLEAR_CONFIRM_YES" => "Ja, Cache löschen", + "CLEARED" => "Cache wurde erfolgreich gelöscht!" + ], + + "DASHBOARD" => "Übersicht", + "NO_FEATURES_YET" => "Es sieht aus, als wären für Ihren Account noch keine Funktionen aktiviert... bisher. Entweder sie wurden bisher noch nicht implementiert, oder Ihnen fehlen noch die Berechtigungen. Trotzdem ist es schön, dass Sie auf unsere Seite gekommen sind!", + "DELETE_MASTER" => "Sie können das Root-Konto nicht löschen!", + "DELETION_SUCCESSFUL" => "Benutzer {{user_name}} wurde erfolgreich gelöscht.", + "DETAILS_UPDATED" => "Konto-Daten für {{user_name}} aktualisiert.", + "DISABLE_MASTER" => "Sie können das Root-Konto nicht deaktivieren!", + "DISABLE_SELF" => "Sie können Ihr eigenes Konto nicht deaktivieren!", + "DISABLE_SUCCESSFUL" => "Konto von {{user_name}} wurde erfolgreich deaktiviert.", + + "ENABLE_SUCCESSFUL" => "Konto von {{user_name}} wurde erfolgreich aktiviert.", + + "GROUP" => [ + 1 => "Gruppe", + 2 => "Gruppen", + + "CREATE" => "Gruppe erstellen", + "CREATION_SUCCESSFUL" => "Die Gruppe {{name}} wurde erfolgreich erstellt", + "DELETE" => "Gruppe löschen", + "DELETE_CONFIRM" => "Möchten Sie die Gruppe {{name}} wirklich löschen?", + "DELETE_DEFAULT" => "Sie können die Gruppe {{name}} nicht löschen, da es die Standardgruppe für neu registrierte Benutzer ist.", + "DELETE_YES" => "Ja, Gruppe löschen", + "DELETION_SUCCESSFUL" => "Die Gruppe {{name}} wurde erfolgreich gelöscht", + "EDIT" => "Gruppe bearbeiten", + "ICON" => "Gruppensymbol", + "ICON_EXPLAIN" => "Symbol für Gruppenmitglieder", + "INFO_PAGE" => "Gruppeninformationsseite für {{name}}", + "MANAGE" => "Gruppe verwalten", + "NAME" => "Gruppenname", + "NAME_EXPLAIN" => "Geben Sie einen Namen für die Gruppe ein", + "NOT_EMPTY" => "Sie können das nicht tun, denn es sind noch Benutzer mit der Gruppe {{name}} verbunden.", + "PAGE_DESCRIPTION" => "Eine Liste der Gruppen für Ihre Website. Bietet Verwaltungstools für das Bearbeiten und Löschen von Gruppen.", + "SUMMARY" => "Gruppen Zusammenfassung", + "UPDATE" => "Details für die Gruppe {{name}} aktualisiert" + ], + + "MANUALLY_ACTIVATED" => "{{user_name}}'s Konto wurde manuell aktiviert.", + "MASTER_ACCOUNT_EXISTS" => "Das Root-Konto existiert bereits!", + "MIGRATION" => [ + "REQUIRED" => "Datenbankaktualisierung erforderlich" + ], + + "PERMISSION" => [ + 1 => "Berechtigung", + 2 => "Berechtigungen", + + "ASSIGN_NEW" => "Neue Berechtigung zuweisen", + "HOOK_CONDITION" => "Haken/Bedingungen", + "ID" => "Berechtigungs-ID", + "INFO_PAGE" => "Berechtigungs Informationen für '{{name}}'", + "MANAGE" => "Berechtigungen verwalten", + "NOTE_READ_ONLY" => "Bitte beachten Sie: Berechtigungen werden als \"Teil des Quelltexts\" gesehen und können hier nicht bearbeitet werden. Um Berechtigungen hinzuzufügen, zu bearbeiten, oder zu löschen, benutzen Sie bitte folgende Dokumentation zur Datenbank Migration.", + "PAGE_DESCRIPTION" => "Eine Liste der Berechtigungen für Ihre Website. Bietet Verwaltungstools zum Bearbeiten und Löschen von Berechtigungen.", + "SUMMARY" => "Berechtigungs Zusammenfassung", + "UPDATE" => "Berechtigungen aktualisieren", + "VIA_ROLES" => "Besitzt die Berechtigung durch die Rolle" + ], + + "ROLE" => [ + 1 => "Rolle", + 2 => "Rollen", + + "ASSIGN_NEW" => "Neue Rolle zuweisen", + "CREATE" => "Rolle erstellen", + "CREATION_SUCCESSFUL" => "Die Rolle {{name}} wurde erfolgreich erstellt", + "DELETE" => "Rolle löschen", + "DELETE_CONFIRM" => "Sind Sie sicher, dass Sie die Rolle {{name}} löschen möchten?", + "DELETE_DEFAULT" => "Sie können die Rolle {{name}} nicht löschen, da es eine Standardrolle für neu registrierte Benutzer ist.", + "DELETE_YES" => "Ja, Rolle löschen", + "DELETION_SUCCESSFUL" => "Die Rolle {{name}} wurde erfolgreich gelöscht", + "EDIT" => "Rolle bearbeiten", + "HAS_USERS" => "Sie können das nicht machen weil es noch Benutzer gibt, die die Rolle {{name}} haben.", + "INFO_PAGE" => "Rolleninformationsseite für {{name}}", + "MANAGE" => "Rollen verwalten", + "NAME" => "Name", + "NAME_EXPLAIN" => "Geben Sie einen Namen für die Rolle ein", + "NAME_IN_USE" => "Eine Rolle mit dem Namen {{name}} existiert bereits", + "PAGE_DESCRIPTION" => "Eine Liste der Rollen für Ihre Website. Bietet Verwaltungstools zum Bearbeiten und Löschen von Rollen.", + "PERMISSIONS_UPDATED" => "Berechtigungen für die Rolle {{name}} aktualisiert", + "SUMMARY" => "Rollen Zusammenfassung", + "UPDATED" => "Rollen aktualisieren" + ], + + "SYSTEM_INFO" => [ + "@TRANSLATION" => "System Information", + + "DB_NAME" => "Name der Datenbank", + "DB_VERSION" => "Datenbankversion", + "DIRECTORY" => "Projektverzeichnis", + "PHP_VERSION" => "PHP-Version", + "SERVER" => "Web-Server-Software", + "SPRINKLES" => "Geladene Sprinkles", + "UF_VERSION" => "UserFrosting Version", + "URL" => "Website-Stamm-Url" + ], + + "TOGGLE_COLUMNS" => "Spalten anpassen", + + "USER" => [ + 1 => "Benutzer", + 2 => "Benutzer", + + "ADMIN" => [ + "CHANGE_PASSWORD" => "Benutzerpasswort ändern", + "SEND_PASSWORD_LINK" => "Senden Sie dem Benutzer einen Link, der ihnen erlaubt, ihr eigenes Passwort zu wählen", + "SET_PASSWORD" => "Setzen Sie das Passwort des Benutzers als" + ], + + "ACTIVATE" => "Benutzer aktivieren", + "CREATE" => "Benutzer erstellen", + "CREATED" => "Benutzer {{user_name}} wurde erfolgreich erstellt", + "DELETE" => "Benutzer löschen", + "DELETE_CONFIRM" => "Sind Sie sicher, dass Sie den Benutzer {{name}} löschen möchten?", + "DELETE_YES" => "Ja, Benutzer löschen", + "DISABLE" => "Benutzer deaktivieren", + "EDIT" => "Benutzer bearbeiten", + "ENABLE" => "Benutzer aktivieren", + "INFO_PAGE" => "Benutzerinformationsseite für {{name}}", + "LATEST" => "Neueste Benutzer", + "PAGE_DESCRIPTION" => "Eine Liste der Benutzer für Ihre Website. Bietet Management-Tools, einschließlich der Möglichkeit, Benutzerdaten bearbeiten, manuell aktivieren, Benutzer aktivieren/deaktivieren, und vieles mehr.", + "SUMMARY" => "Benutzer Zusammenfassung", + "VIEW_ALL" => "Alle Benutzer anzeigen", + "WITH_PERMISSION" => "Benutzer mit dieser Berechtigung" + ], + "X_USER" => [ + 0 => "Keine Benutzer", + 1 => "{{plural}} Benutzer", + 2 => "{{plural}} Benutzer" + ] +]; diff --git a/main/app/sprinkles/admin/locale/en_US/messages.php b/main/app/sprinkles/admin/locale/en_US/messages.php index 225e524..53fd6a9 100644 --- a/main/app/sprinkles/admin/locale/en_US/messages.php +++ b/main/app/sprinkles/admin/locale/en_US/messages.php @@ -1,160 +1,160 @@ - [ - 1 => "Activity", - 2 => "Activities", - - "LAST" => "Last Activity", - "PAGE" => "A listing of user activities", - "TIME" => "Activity Time" - ], - - "CACHE" => [ - "CLEAR" => "Clear cache", - "CLEAR_CONFIRM" => "Are you sure you want to clear the site cache?", - "CLEAR_CONFIRM_YES" => "Yes, clear cache", - "CLEARED" => "Cache cleared successfully !" - ], - - "DASHBOARD" => "Dashboard", - "NO_FEATURES_YET" => "It doesn't look like any features have been set up for this account...yet. Maybe they haven't been implemented yet, or maybe someone forgot to give you access. Either way, we're glad to have you aboard!", - "DELETE_MASTER" => "You cannot delete the master account!", - "DELETION_SUCCESSFUL" => "User {{user_name}} has been successfully deleted.", - "DETAILS_UPDATED" => "Account details updated for user {{user_name}}", - "DISABLE_MASTER" => "You cannot disable the master account!", - "DISABLE_SELF" => "You cannot disable your own account!", - "DISABLE_SUCCESSFUL" => "Account for user {{user_name}} has been successfully disabled.", - - "ENABLE_SUCCESSFUL" => "Account for user {{user_name}} has been successfully enabled.", - - "GROUP" => [ - 1 => "Group", - 2 => "Groups", - - "CREATE" => "Create group", - "CREATION_SUCCESSFUL" => "Successfully created group {{name}}", - "DELETE" => "Delete group", - "DELETE_CONFIRM" => "Are you sure you want to delete the group {{name}}?", - "DELETE_DEFAULT" => "You can't delete the group {{name}} because it is the default group for newly registered users.", - "DELETE_YES" => "Yes, delete group", - "DELETION_SUCCESSFUL" => "Successfully deleted group {{name}}", - "EDIT" => "Edit group", - "ICON" => "Group icon", - "ICON_EXPLAIN" => "Icon for group members", - "INFO_PAGE" => "Group information page for {{name}}", - "MANAGE" => "Manage group", - "NAME" => "Group name", - "NAME_EXPLAIN" => "Please enter a name for the group", - "NOT_EMPTY" => "You can't do that because there are still users associated with the group {{name}}.", - "PAGE_DESCRIPTION" => "A listing of the groups for your site. Provides management tools for editing and deleting groups.", - "SUMMARY" => "Group Summary", - "UPDATE" => "Details updated for group {{name}}" - ], - - "MANUALLY_ACTIVATED" => "{{user_name}}'s account has been manually activated", - "MASTER_ACCOUNT_EXISTS" => "The master account already exists!", - "MIGRATION" => [ - "REQUIRED" => "Database update required" - ], - - "PERMISSION" => [ - 1 => "Permission", - 2 => "Permissions", - - "ASSIGN_NEW" => "Assign new permission", - "HOOK_CONDITION" => "Hook/Conditions", - "ID" => "Permission ID", - "INFO_PAGE" => "Permission information page for '{{name}}'", - "MANAGE" => "Manage permissions", - "NOTE_READ_ONLY" => "Please note: permissions are considered \"part of the code\" and cannot be modified through the interface. To add, remove, or modify permissions, the site maintainers will need to use a database migration.", - "PAGE_DESCRIPTION" => "A listing of the permissions for your site. Provides management tools for editing and deleting permissions.", - "SUMMARY" => "Permission Summary", - "UPDATE" => "Update permissions", - "VIA_ROLES" => "Has permission via roles" - ], - - "ROLE" => [ - 1 => "Role", - 2 => "Roles", - - "ASSIGN_NEW" => "Assign new role", - "CREATE" => "Create role", - "CREATION_SUCCESSFUL" => "Successfully created role {{name}}", - "DELETE" => "Delete role", - "DELETE_CONFIRM" => "Are you sure you want to delete the role {{name}}?", - "DELETE_DEFAULT" => "You can't delete the role {{name}} because it is a default role for newly registered users.", - "DELETE_YES" => "Yes, delete role", - "DELETION_SUCCESSFUL" => "Successfully deleted role {{name}}", - "EDIT" => "Edit role", - "HAS_USERS" => "You can't do that because there are still users who have the role {{name}}.", - "INFO_PAGE" => "Role information page for {{name}}", - "MANAGE" => "Manage Roles", - "NAME" => "Name", - "NAME_EXPLAIN" => "Please enter a name for the role", - "NAME_IN_USE" => "A role named {{name}} already exist", - "PAGE_DESCRIPTION" => "A listing of the roles for your site. Provides management tools for editing and deleting roles.", - "PERMISSIONS_UPDATED" => "Permissions updated for role {{name}}", - "SUMMARY" => "Role Summary", - "UPDATED" => "Details updated for role {{name}}" - ], - - "SYSTEM_INFO" => [ - "@TRANSLATION" => "System information", - - "DB_NAME" => "Database name", - "DB_VERSION" => "Database version", - "DIRECTORY" => "Project directory", - "PHP_VERSION" => "PHP version", - "SERVER" => "Webserver software", - "SPRINKLES" => "Loaded sprinkles", - "UF_VERSION" => "UserFrosting version", - "URL" => "Site root url" - ], - - "TOGGLE_COLUMNS" => "Toggle columns", - - "USER" => [ - 1 => "User", - 2 => "Users", - - "ADMIN" => [ - "CHANGE_PASSWORD" => "Change User Password", - "SEND_PASSWORD_LINK" => "Send the user a link that will allow them to choose their own password", - "SET_PASSWORD" => "Set the user's password as" - ], - - "ACTIVATE" => "Activate user", - "CREATE" => "Create user", - "CREATED" => "User {{user_name}} has been successfully created", - "DELETE" => "Delete user", - "DELETE_CONFIRM" => "Are you sure you want to delete the user {{name}}?", - "DELETE_YES" => "Yes, delete user", - "DELETED" => "User deleted", - "DISABLE" => "Disable user", - "EDIT" => "Edit user", - "ENABLE" => "Enable user", - "INFO_PAGE" => "User information page for {{name}}", - "LATEST" => "Latest Users", - "PAGE_DESCRIPTION" => "A listing of the users for your site. Provides management tools including the ability to edit user details, manually activate users, enable/disable users, and more.", - "SUMMARY" => "Account Summary", - "VIEW_ALL" => "View all users", - "WITH_PERMISSION" => "Users with this permission" - ], - "X_USER" => [ - 0 => "No users", - 1 => "{{plural}} user", - 2 => "{{plural}} users" - ] -]; + [ + 1 => "Activity", + 2 => "Activities", + + "LAST" => "Last Activity", + "PAGE" => "A listing of user activities", + "TIME" => "Activity Time" + ], + + "CACHE" => [ + "CLEAR" => "Clear cache", + "CLEAR_CONFIRM" => "Are you sure you want to clear the site cache?", + "CLEAR_CONFIRM_YES" => "Yes, clear cache", + "CLEARED" => "Cache cleared successfully !" + ], + + "DASHBOARD" => "Dashboard", + "NO_FEATURES_YET" => "It doesn't look like any features have been set up for this account...yet. Maybe they haven't been implemented yet, or maybe someone forgot to give you access. Either way, we're glad to have you aboard!", + "DELETE_MASTER" => "You cannot delete the master account!", + "DELETION_SUCCESSFUL" => "User {{user_name}} has been successfully deleted.", + "DETAILS_UPDATED" => "Account details updated for user {{user_name}}", + "DISABLE_MASTER" => "You cannot disable the master account!", + "DISABLE_SELF" => "You cannot disable your own account!", + "DISABLE_SUCCESSFUL" => "Account for user {{user_name}} has been successfully disabled.", + + "ENABLE_SUCCESSFUL" => "Account for user {{user_name}} has been successfully enabled.", + + "GROUP" => [ + 1 => "Group", + 2 => "Groups", + + "CREATE" => "Create group", + "CREATION_SUCCESSFUL" => "Successfully created group {{name}}", + "DELETE" => "Delete group", + "DELETE_CONFIRM" => "Are you sure you want to delete the group {{name}}?", + "DELETE_DEFAULT" => "You can't delete the group {{name}} because it is the default group for newly registered users.", + "DELETE_YES" => "Yes, delete group", + "DELETION_SUCCESSFUL" => "Successfully deleted group {{name}}", + "EDIT" => "Edit group", + "ICON" => "Group icon", + "ICON_EXPLAIN" => "Icon for group members", + "INFO_PAGE" => "Group information page for {{name}}", + "MANAGE" => "Manage group", + "NAME" => "Group name", + "NAME_EXPLAIN" => "Please enter a name for the group", + "NOT_EMPTY" => "You can't do that because there are still users associated with the group {{name}}.", + "PAGE_DESCRIPTION" => "A listing of the groups for your site. Provides management tools for editing and deleting groups.", + "SUMMARY" => "Group Summary", + "UPDATE" => "Details updated for group {{name}}" + ], + + "MANUALLY_ACTIVATED" => "{{user_name}}'s account has been manually activated", + "MASTER_ACCOUNT_EXISTS" => "The master account already exists!", + "MIGRATION" => [ + "REQUIRED" => "Database update required" + ], + + "PERMISSION" => [ + 1 => "Permission", + 2 => "Permissions", + + "ASSIGN_NEW" => "Assign new permission", + "HOOK_CONDITION" => "Hook/Conditions", + "ID" => "Permission ID", + "INFO_PAGE" => "Permission information page for '{{name}}'", + "MANAGE" => "Manage permissions", + "NOTE_READ_ONLY" => "Please note: permissions are considered \"part of the code\" and cannot be modified through the interface. To add, remove, or modify permissions, the site maintainers will need to use a database migration.", + "PAGE_DESCRIPTION" => "A listing of the permissions for your site. Provides management tools for editing and deleting permissions.", + "SUMMARY" => "Permission Summary", + "UPDATE" => "Update permissions", + "VIA_ROLES" => "Has permission via roles" + ], + + "ROLE" => [ + 1 => "Role", + 2 => "Roles", + + "ASSIGN_NEW" => "Assign new role", + "CREATE" => "Create role", + "CREATION_SUCCESSFUL" => "Successfully created role {{name}}", + "DELETE" => "Delete role", + "DELETE_CONFIRM" => "Are you sure you want to delete the role {{name}}?", + "DELETE_DEFAULT" => "You can't delete the role {{name}} because it is a default role for newly registered users.", + "DELETE_YES" => "Yes, delete role", + "DELETION_SUCCESSFUL" => "Successfully deleted role {{name}}", + "EDIT" => "Edit role", + "HAS_USERS" => "You can't do that because there are still users who have the role {{name}}.", + "INFO_PAGE" => "Role information page for {{name}}", + "MANAGE" => "Manage Roles", + "NAME" => "Name", + "NAME_EXPLAIN" => "Please enter a name for the role", + "NAME_IN_USE" => "A role named {{name}} already exist", + "PAGE_DESCRIPTION" => "A listing of the roles for your site. Provides management tools for editing and deleting roles.", + "PERMISSIONS_UPDATED" => "Permissions updated for role {{name}}", + "SUMMARY" => "Role Summary", + "UPDATED" => "Details updated for role {{name}}" + ], + + "SYSTEM_INFO" => [ + "@TRANSLATION" => "System information", + + "DB_NAME" => "Database name", + "DB_VERSION" => "Database version", + "DIRECTORY" => "Project directory", + "PHP_VERSION" => "PHP version", + "SERVER" => "Webserver software", + "SPRINKLES" => "Loaded sprinkles", + "UF_VERSION" => "UserFrosting version", + "URL" => "Site root url" + ], + + "TOGGLE_COLUMNS" => "Toggle columns", + + "USER" => [ + 1 => "User", + 2 => "Users", + + "ADMIN" => [ + "CHANGE_PASSWORD" => "Change User Password", + "SEND_PASSWORD_LINK" => "Send the user a link that will allow them to choose their own password", + "SET_PASSWORD" => "Set the user's password as" + ], + + "ACTIVATE" => "Activate user", + "CREATE" => "Create user", + "CREATED" => "User {{user_name}} has been successfully created", + "DELETE" => "Delete user", + "DELETE_CONFIRM" => "Are you sure you want to delete the user {{name}}?", + "DELETE_YES" => "Yes, delete user", + "DELETED" => "User deleted", + "DISABLE" => "Disable user", + "EDIT" => "Edit user", + "ENABLE" => "Enable user", + "INFO_PAGE" => "User information page for {{name}}", + "LATEST" => "Latest Users", + "PAGE_DESCRIPTION" => "A listing of the users for your site. Provides management tools including the ability to edit user details, manually activate users, enable/disable users, and more.", + "SUMMARY" => "Account Summary", + "VIEW_ALL" => "View all users", + "WITH_PERMISSION" => "Users with this permission" + ], + "X_USER" => [ + 0 => "No users", + 1 => "{{plural}} user", + 2 => "{{plural}} users" + ] +]; diff --git a/main/app/sprinkles/admin/locale/es_ES/messages.php b/main/app/sprinkles/admin/locale/es_ES/messages.php index 2f6012f..9beedc7 100644 --- a/main/app/sprinkles/admin/locale/es_ES/messages.php +++ b/main/app/sprinkles/admin/locale/es_ES/messages.php @@ -1,164 +1,164 @@ - [ - 1 => "Actividad", - 2 => "Actividades", - - "LAST" => "Última actividad", - "PAGE" => "Una lista de las actividades del usuario", - "TIME" => "Tiempo de Actividad" - ], - - "ADMIN" => [ - "PANEL" => "Panel de administración" - ], - - "CACHE" => [ - "CLEAR" => "Limpiar cache", - "CLEAR_CONFIRM" => "¿Está seguro de que desea borrar la caché del sitio?", - "CLEAR_CONFIRM_YES" => "Sí, borrar caché", - "CLEARED" => "¡Cache borrado correctamente!" - ], - - "DASHBOARD" => "Tablero", - "NO_FEATURES_YET" => "No parece que se hayan configurado funciones para esta cuenta ... todavía. Tal vez no se han implementado todavía, o tal vez alguien se olvidó de darle acceso. De cualquier manera, ¡estamos encantados de tenerte a bordo!", - "DELETE_MASTER" => "¡No puede eliminar la cuenta principal!", - "DELETION_SUCCESSFUL" => "El usuario {{user_name}} se ha eliminado correctamente.", - "DETAILS_UPDATED" => "Detalles de la cuenta actualizados para el usuario {{user_name}} ", - "DISABLE_MASTER" => "¡No puedes deshabilitar la cuenta principal!", - "DISABLE_SELF" => "¡No puedes inhabilitar tu propia cuenta!", - "DISABLE_SUCCESSFUL" => "La cuenta para el usuario {{user_name}} se ha desactivado correctamente.", - - "ENABLE_SUCCESSFUL" => "La cuenta para el usuario {{user_name}} se ha habilitado correctamente.", - - "GROUP" => [ - 1 => "Grupo", - 2 => "Grupos", - - "CREATE" => "Crea un grupo", - "CREATION_SUCCESSFUL" => "Grupo creado correctamente {{name}} ", - "DELETE" => "Delete group", - "DELETE_CONFIRM" => "¿Seguro que quieres eliminar el grupo {{name}} ?", - "DELETE_DEFAULT" => "No puedes eliminar el grupo {{name}} porque es el grupo predeterminado para los usuarios recién registrados.", - "DELETE_YES" => "Sí, eliminar grupo", - "DELETION_SUCCESSFUL" => "Grupo eliminado correctamente {{name}} ", - "EDIT" => "Editar grupo", - "ICON" => "Icono de grupo", - "ICON_EXPLAIN" => "Icono para los miembros del grupo", - "INFO_PAGE" => "Página de información de grupo para {{name}}", - "MANAGE" => "Administrar grupo", - "NAME" => "Nombre del grupo", - "NAME_EXPLAIN" => "Introduzca un nombre para el grupo", - "NOT_EMPTY" => "No puedes hacerlo porque todavía hay usuarios asociados con el grupo {{name}} .", - "PAGE_DESCRIPTION" => "Un listado de los grupos para su sitio. Proporciona herramientas de administración para editar y eliminar grupos.", - "SUMMARY" => "Resumen del grupo", - "UPDATE" => "Detalles actualizados para el grupo {{name}} " - ], - - "MANUALLY_ACTIVATED" => "La cuenta de {{user_name}} se ha activado manualmente", - "MASTER_ACCOUNT_EXISTS" => "¡La cuenta maestra ya existe!", - "MIGRATION" => [ - "REQUIRED" => "Se requiere actualizar la base de datos" - ], - - "PERMISSION" => [ - 1 => "Permiso", - 2 => "Permisos", - - "ASSIGN_NEW" => "Asignar nuevo permiso", - "HOOK_CONDITION" => "Hook/Condiciones", - "ID" => "ID de permiso", - "INFO_PAGE" => "Página de autor del permiso de '{{name}}'", - "MANAGE" => "Administrar permisos", - "NOTE_READ_ONLY" => " Tenga en cuenta: los permisos se consideran \"parte del código\" y no se pueden modificar a través de la interfaz. Para agregar, eliminar o modificar permisos, los mantenedores del sitio necesitarán usar una migración de la base de datos . ", - "PAGE_DESCRIPTION" => "Una lista de los permisos para su sitio. Proporciona herramientas de administración para editar y eliminar permisos.", - "SUMMARY" => "Resumen del permiso", - "UPDATE" => "Actualizar permisos", - "VIA_ROLES" => "Tiene permiso para los roles" - ], - - "ROLE" => [ - 1 => "Rol(funcion)", - 2 => "Roles(funciones)", - - "ASSIGN_NEW" => "Asignar nueva rol", - "CREATE" => "Crear un rol", - "CREATION_SUCCESSFUL" => "Función creada correctamente {{name}} ", - "DELETE" => "Eliminar rol", - "DELETE_CONFIRM" => "¿Seguro que quieres eliminar la función {{name}} ?", - "DELETE_DEFAULT" => "No puedes eliminar el rol {{name}} porque es un rol predeterminado para los usuarios recién registrados.", - "DELETE_YES" => "Sí, borrar función", - "DELETION_SUCCESSFUL" => "Se ha eliminado la función {{nombre}} ", - "EDIT" => "Editar función", - "HAS_USERS" => "No puedes hacerlo porque todavía hay usuarios que tienen el rol {{name}} .", - "INFO_PAGE" => "Página de información de funciones de {{name}}", - "MANAGE" => "Administrar roles", - "NAME" => "Nombre", - "NAME_EXPLAIN" => "Ingrese un nombre para el rol", - "NAME_IN_USE" => "Ya existe un rol denominado {{name}} ", - "PAGE_DESCRIPTION" => "Una lista de las funciones de su sitio. Proporciona herramientas de administración para editar y eliminar roles.", - "PERMISSIONS_UPDATED" => "Permisos actualizados para el rol {{name}} ", - "SUMMARY" => "Resumen del rol", - "UPDATED" => "Detalles actualizados para el rol {{name}} " - ], - - "SYSTEM_INFO" => [ - "@TRANSLATION" => "Información del sistema", - - "DB_NAME" => "Nombre de la base de datos", - "DB_VERSION" => "Versión de base de datos", - "DIRECTORY" => "Directorio del proyecto", - "PHP_VERSION" => "Versión de PHP", - "SERVER" => "Software de servidor Web", - "SPRINKLES" => "Sprinkles cargados", - "UF_VERSION" => "UserFrosting versión", - "URL" => "URL root del sitio" - ], - - "TOGGLE_COLUMNS" => "Alternar columnas", - "NO_DATA" => "No puede quedar vacio.", - - "USER" => [ - 1 => "Usuario", - 2 => "Usuarios", - - "ADMIN" => [ - "CHANGE_PASSWORD" => "Cambiar contraseña de usuario", - "SEND_PASSWORD_LINK" => "Enviar al usuario un enlace que les permita elegir su propia contraseña", - "SET_PASSWORD" => "Establezca la contraseña del usuario como" - ], - - "ACTIVATE" => "Activar usuario", - "CREATE" => "Crear usuario", - "CREATED" => "Se ha creado correctamente el usuario {{user_name}} ", - "DELETE" => "Borrar usuario", - "DELETE_CONFIRM" => "¿Seguro que desea eliminar el usuario {{name}} ?", - "DELETE_YES" => "Sí, eliminar usuario", - "DISABLE" => "Deshabilitar usuario", - "EDIT" => "Editar usuario", - "ENABLE" => "Habilitar usuario", - "INFO_PAGE" => "Página de información de usuario de {{name}}", - "LATEST" => "Usuarios más recientes", - "PAGE_DESCRIPTION" => "Una lista de los usuarios para su sitio. Proporciona herramientas de administración que incluyen la capacidad de editar detalles de usuario, activar manualmente usuarios, habilitar / deshabilitar usuarios y más.", - "SUMMARY" => "Resumen de la cuenta", - "VIEW_ALL" => "Ver todos los usuarios", - "WITH_PERMISSION" => "Usuarios con este permiso" - ], - "X_USER" => [ - 0 => "No hay usuarios", - 1 => "{{plural}} usuario", - 2 => "{{plural}} usuarios" - ] -]; + [ + 1 => "Actividad", + 2 => "Actividades", + + "LAST" => "Última actividad", + "PAGE" => "Una lista de las actividades del usuario", + "TIME" => "Tiempo de Actividad" + ], + + "ADMIN" => [ + "PANEL" => "Panel de administración" + ], + + "CACHE" => [ + "CLEAR" => "Limpiar cache", + "CLEAR_CONFIRM" => "¿Está seguro de que desea borrar la caché del sitio?", + "CLEAR_CONFIRM_YES" => "Sí, borrar caché", + "CLEARED" => "¡Cache borrado correctamente!" + ], + + "DASHBOARD" => "Tablero", + "NO_FEATURES_YET" => "No parece que se hayan configurado funciones para esta cuenta ... todavía. Tal vez no se han implementado todavía, o tal vez alguien se olvidó de darle acceso. De cualquier manera, ¡estamos encantados de tenerte a bordo!", + "DELETE_MASTER" => "¡No puede eliminar la cuenta principal!", + "DELETION_SUCCESSFUL" => "El usuario {{user_name}} se ha eliminado correctamente.", + "DETAILS_UPDATED" => "Detalles de la cuenta actualizados para el usuario {{user_name}} ", + "DISABLE_MASTER" => "¡No puedes deshabilitar la cuenta principal!", + "DISABLE_SELF" => "¡No puedes inhabilitar tu propia cuenta!", + "DISABLE_SUCCESSFUL" => "La cuenta para el usuario {{user_name}} se ha desactivado correctamente.", + + "ENABLE_SUCCESSFUL" => "La cuenta para el usuario {{user_name}} se ha habilitado correctamente.", + + "GROUP" => [ + 1 => "Grupo", + 2 => "Grupos", + + "CREATE" => "Crea un grupo", + "CREATION_SUCCESSFUL" => "Grupo creado correctamente {{name}} ", + "DELETE" => "Delete group", + "DELETE_CONFIRM" => "¿Seguro que quieres eliminar el grupo {{name}} ?", + "DELETE_DEFAULT" => "No puedes eliminar el grupo {{name}} porque es el grupo predeterminado para los usuarios recién registrados.", + "DELETE_YES" => "Sí, eliminar grupo", + "DELETION_SUCCESSFUL" => "Grupo eliminado correctamente {{name}} ", + "EDIT" => "Editar grupo", + "ICON" => "Icono de grupo", + "ICON_EXPLAIN" => "Icono para los miembros del grupo", + "INFO_PAGE" => "Página de información de grupo para {{name}}", + "MANAGE" => "Administrar grupo", + "NAME" => "Nombre del grupo", + "NAME_EXPLAIN" => "Introduzca un nombre para el grupo", + "NOT_EMPTY" => "No puedes hacerlo porque todavía hay usuarios asociados con el grupo {{name}} .", + "PAGE_DESCRIPTION" => "Un listado de los grupos para su sitio. Proporciona herramientas de administración para editar y eliminar grupos.", + "SUMMARY" => "Resumen del grupo", + "UPDATE" => "Detalles actualizados para el grupo {{name}} " + ], + + "MANUALLY_ACTIVATED" => "La cuenta de {{user_name}} se ha activado manualmente", + "MASTER_ACCOUNT_EXISTS" => "¡La cuenta maestra ya existe!", + "MIGRATION" => [ + "REQUIRED" => "Se requiere actualizar la base de datos" + ], + + "PERMISSION" => [ + 1 => "Permiso", + 2 => "Permisos", + + "ASSIGN_NEW" => "Asignar nuevo permiso", + "HOOK_CONDITION" => "Hook/Condiciones", + "ID" => "ID de permiso", + "INFO_PAGE" => "Página de autor del permiso de '{{name}}'", + "MANAGE" => "Administrar permisos", + "NOTE_READ_ONLY" => " Tenga en cuenta: los permisos se consideran \"parte del código\" y no se pueden modificar a través de la interfaz. Para agregar, eliminar o modificar permisos, los mantenedores del sitio necesitarán usar una migración de la base de datos . ", + "PAGE_DESCRIPTION" => "Una lista de los permisos para su sitio. Proporciona herramientas de administración para editar y eliminar permisos.", + "SUMMARY" => "Resumen del permiso", + "UPDATE" => "Actualizar permisos", + "VIA_ROLES" => "Tiene permiso para los roles" + ], + + "ROLE" => [ + 1 => "Rol(funcion)", + 2 => "Roles(funciones)", + + "ASSIGN_NEW" => "Asignar nueva rol", + "CREATE" => "Crear un rol", + "CREATION_SUCCESSFUL" => "Función creada correctamente {{name}} ", + "DELETE" => "Eliminar rol", + "DELETE_CONFIRM" => "¿Seguro que quieres eliminar la función {{name}} ?", + "DELETE_DEFAULT" => "No puedes eliminar el rol {{name}} porque es un rol predeterminado para los usuarios recién registrados.", + "DELETE_YES" => "Sí, borrar función", + "DELETION_SUCCESSFUL" => "Se ha eliminado la función {{nombre}} ", + "EDIT" => "Editar función", + "HAS_USERS" => "No puedes hacerlo porque todavía hay usuarios que tienen el rol {{name}} .", + "INFO_PAGE" => "Página de información de funciones de {{name}}", + "MANAGE" => "Administrar roles", + "NAME" => "Nombre", + "NAME_EXPLAIN" => "Ingrese un nombre para el rol", + "NAME_IN_USE" => "Ya existe un rol denominado {{name}} ", + "PAGE_DESCRIPTION" => "Una lista de las funciones de su sitio. Proporciona herramientas de administración para editar y eliminar roles.", + "PERMISSIONS_UPDATED" => "Permisos actualizados para el rol {{name}} ", + "SUMMARY" => "Resumen del rol", + "UPDATED" => "Detalles actualizados para el rol {{name}} " + ], + + "SYSTEM_INFO" => [ + "@TRANSLATION" => "Información del sistema", + + "DB_NAME" => "Nombre de la base de datos", + "DB_VERSION" => "Versión de base de datos", + "DIRECTORY" => "Directorio del proyecto", + "PHP_VERSION" => "Versión de PHP", + "SERVER" => "Software de servidor Web", + "SPRINKLES" => "Sprinkles cargados", + "UF_VERSION" => "UserFrosting versión", + "URL" => "URL root del sitio" + ], + + "TOGGLE_COLUMNS" => "Alternar columnas", + "NO_DATA" => "No puede quedar vacio.", + + "USER" => [ + 1 => "Usuario", + 2 => "Usuarios", + + "ADMIN" => [ + "CHANGE_PASSWORD" => "Cambiar contraseña de usuario", + "SEND_PASSWORD_LINK" => "Enviar al usuario un enlace que les permita elegir su propia contraseña", + "SET_PASSWORD" => "Establezca la contraseña del usuario como" + ], + + "ACTIVATE" => "Activar usuario", + "CREATE" => "Crear usuario", + "CREATED" => "Se ha creado correctamente el usuario {{user_name}} ", + "DELETE" => "Borrar usuario", + "DELETE_CONFIRM" => "¿Seguro que desea eliminar el usuario {{name}} ?", + "DELETE_YES" => "Sí, eliminar usuario", + "DISABLE" => "Deshabilitar usuario", + "EDIT" => "Editar usuario", + "ENABLE" => "Habilitar usuario", + "INFO_PAGE" => "Página de información de usuario de {{name}}", + "LATEST" => "Usuarios más recientes", + "PAGE_DESCRIPTION" => "Una lista de los usuarios para su sitio. Proporciona herramientas de administración que incluyen la capacidad de editar detalles de usuario, activar manualmente usuarios, habilitar / deshabilitar usuarios y más.", + "SUMMARY" => "Resumen de la cuenta", + "VIEW_ALL" => "Ver todos los usuarios", + "WITH_PERMISSION" => "Usuarios con este permiso" + ], + "X_USER" => [ + 0 => "No hay usuarios", + 1 => "{{plural}} usuario", + 2 => "{{plural}} usuarios" + ] +]; diff --git a/main/app/sprinkles/admin/locale/fa/messages.php b/main/app/sprinkles/admin/locale/fa/messages.php index e3d3b2a..52f504d 100644 --- a/main/app/sprinkles/admin/locale/fa/messages.php +++ b/main/app/sprinkles/admin/locale/fa/messages.php @@ -1,158 +1,158 @@ - [ - 1 => "فعالیت", - 2 => "فعالیت ها", - - "LAST" => "آخرین فعالیت", - "PAGE" => "لیستی از فعالیت های کاربر", - "TIME" => "زمان فعالیت" - ], - - "CACHE" => [ - "CLEAR" => "پاک سازی کش", - "CLEAR_CONFIRM" => "آیا مطمئن هستید که میخواهید کش سایت را پاک سازی کنید؟", - "CLEAR_CONFIRM_YES" => "بله، کش پاک سازی شود", - "CLEARED" => "کش با موفقیت پاک سازی شد" - ], - - "DASHBOARD" => "کارتابل", - "DELETE_MASTER" => "شما نمیتوانید کاربر اصلی را حذف کنید", - "DELETION_SUCCESSFUL" => "{{user_name}} با موفقیت حذف شد.", - "DETAILS_UPDATED" => "جزئیات {{user_name}} با موفقیت ذخیره شد.", - "DISABLE_MASTER" => "شما نمیتوانید کاربر اصلی را غیر فعال کنید.", - "DISABLE_SUCCESSFUL" => "حساب کاربری {{user_name}} با موفقیت غیر فعال شد.", - - "ENABLE_SUCCESSFUL" => "حساب کاربری {{user_name}} با موفقیت فعال شد.", - - "GROUP" => [ - 1 => "گروه", - 2 => "گروه ها", - - "CREATE" => "اضافه کردن گروه", - "CREATION_SUCCESSFUL" => "گروه {{name}} با موفقیت اضافه شد", - "DELETE" => "حذف گروه", - "DELETE_CONFIRM" => "آیا مطمئن هستید که میخواهید گروه {{name}} را حذف کنید؟", - "DELETE_DEFAULT" => "شما نمیتوانید گروه {{name}} را حذف کنید چون به عنوان گروه پیش فرض برای کاربران جدید انتخاب شده است.", - "DELETE_YES" => "بله، گروه حذف شود", - "DELETION_SUCCESSFUL" => "گروه {{name}} با موفقیت حذف شد.", - "EDIT" => "ویرایش گروه", - "ICON" => "آیکن گروه", - "ICON_EXPLAIN" => "آیکن برای اعضای گروه", - "INFO_PAGE" => "صفحه توضیحات گروه برای {{name}}", - "MANAGE" => "مدیریت گروه", - "NAME" => "نام گروه", - "NAME_EXPLAIN" => "لطفا نام گروه را وارد کنید", - "NOT_EMPTY" => "نمیتوان این کار را کرد چون هنوز کاربرانی عضو گروه {{name}} هستند.", - "PAGE_DESCRIPTION" => "لیست گروه های وب سایت شما. امکان مدیریت این گروه ها در این صفحه وجود دارد.", - "SUMMARY" => "توضیحات گروه", - "UPDATE" => "اطلاعات گروه {{name}} به روز رسانی شد." - ], - - "MANUALLY_ACTIVATED" => "حساب کاربری {{user_name}} بصورت دستی فعال شد.", - "MASTER_ACCOUNT_EXISTS" => "حساب کاربری اصلی وجود دارد!", - "MIGRATION" => [ - "REQUIRED" => "به روز رسانی پایگاه داده ها باید انجام شود" - ], - - "PERMISSION" => [ - 1 => "دسترسی", - 2 => "دسترسی ها", - - "ASSIGN_NEW" => "دادن دسترسی", - "HOOK_CONDITION" => "قلاب/شرط", - "ID" => "آی دی دسترسی", - "INFO_PAGE" => "توضیحات دسترسی {{name}}", - "MANAGE" => "مدیریت دسترسی ها", - "NOTE_READ_ONLY" => "توجه بفرماییددسترسی ها بخشی از کد میباشند و آن ها را نمیتوان از اینترفیس تغییر داد. برای این تغییرات، مبایستی که مدیر، از دیتابیس مایگریشن استفاده کند. ", - "PAGE_DESCRIPTION" => "لیست دسترسی های وب سایت شما. امکان مدیریت این دسترسی ها در این صفحه وجود دارد.", - "SUMMARY" => "توضیحات دسترسی ها", - "UPDATE" => "به روز رسانی دسترسی ها", - "VIA_ROLES" => "از طریق وظیفه ها دسترسی دارد" - ], - - "ROLE" => [ - 1 => "وظیفه", - 2 => "وظیفه ها", - - "ASSIGN_NEW" => "دادن وظیفه", - "CREATE" => "ساخت وظیفه", - "CREATION_SUCCESSFUL" => "وظیفه {{name}} با موفقیت ساخته شد", - "DELETE" => "حذف وظیفه", - "DELETE_CONFIRM" => "اطمینان دارید که میخواهید وظیفه {{name}} را حذف کنید؟", - "DELETE_DEFAULT" => "شما نمیتوانید وظیفه {{name}} را حذف کنید زیرا کاربرانی که تازه ثبت نام کنند، این وظیفه را دریافت خواهند کرد.", - "DELETE_YES" => "بله، وظیفه حذف شود", - "DELETION_SUCCESSFUL" => "وظیفه {{name}} با موفقیت حذف شد", - "EDIT" => "ویرایش وظیفه", - "HAS_USERS" => "نمیتوانید این کار را انجام دهید زیرا کاربرانی وظیفه {{name}} را هنوز دارند.", - "INFO_PAGE" => "صفحه توضیحات وظیفه {{name}}", - "MANAGE" => "مدیریت وظیفه ها", - "NAME" => "نام", - "NAME_EXPLAIN" => "لطفا برای وظیفه نامی انتخاب کنید", - "NAME_IN_USE" => "وظیفه ای با نام {{name}} موجود است", - "PAGE_DESCRIPTION" => "لیست وظیفه های وب سایت شما. امکان مدیریت این وظیفه ها در این صفحه وجود دارد.", - "PERMISSIONS_UPDATED" => "دسترسی ها برای وظیفه {{name}} به روز رسانی شد", - "SUMMARY" => "خلاصه وظیفه", - "UPDATED" => "اطلاعات وظیفه {{name}} به روز رسانی شد" - ], - - "SYSTEM_INFO" => [ - "@TRANSLATION" => "توضیحات سیستم", - - "DB_NAME" => "نام پایگاه داده", - "DB_VERSION" => "نسخه پایگاه داده", - "DIRECTORY" => "دایرکتوری پروژه", - "PHP_VERSION" => "نسخه پی اچ پی", - "SERVER" => "نرمافزار وب سرور", - "SPRINKLES" => "اسپرینکل های بارگذاری شده", - "UF_VERSION" => "نسخه یوزرفروستینگ", - "URL" => "آدرس رووت وب سایت" - ], - - "TOGGLE_COLUMNS" => "تغییر ستون", - - "USER" => [ - 1 => "کاربر", - 2 => "کاربران", - - "ADMIN" => [ - "CHANGE_PASSWORD" => "تغییر گذرواژه کاربر", - "SEND_PASSWORD_LINK" => "برای کاربر ایمیلی ارسال شود تا گذرواژه خود را تغییر دهد", - "SET_PASSWORD" => "گذرواژه کاربر را انتخاب کنید" - ], - - "ACTIVATE" => "کاربر فعال", - "CREATE" => "اضافه کردن کاربر", - "CREATED" => "کاربر {{user_name}} با موفقیت اضافه شد", - "DELETE" => "حذف کاربر", - "DELETE_CONFIRM" => "آیا اطمینان دارید که میخواهید کاربر {{name}} را حذف کنید؟", - "DELETE_YES" => "بله، کاربر حذف شود", - "DISABLE" => "غیر فعال سازی کاربر", - "EDIT" => "ویرایش کاربر", - "ENABLE" => "فعال سازی کاربر", - "INFO_PAGE" => "صفحه توضیحات کاربر {{name}}", - "LATEST" => "آخرین کاربران", - "PAGE_DESCRIPTION" => "لیستی از کاربران سایت. این صفحه به شما امکان ویرایش، فعال سازی و غیر فعال سازی کاربران را می دهد.", - "SUMMARY" => "خلاصه حساب", - "VIEW_ALL" => "تماشای همه ی کاربران", - "WITH_PERMISSION" => "کاربرانی که این دسترسی را دارند" - ], - "X_USER" => [ - 0 => "هیچ کاربری", - 1 => "{{plural}} کاربر", - 2 => "{{plural}} کاربر" - ] -]; + [ + 1 => "فعالیت", + 2 => "فعالیت ها", + + "LAST" => "آخرین فعالیت", + "PAGE" => "لیستی از فعالیت های کاربر", + "TIME" => "زمان فعالیت" + ], + + "CACHE" => [ + "CLEAR" => "پاک سازی کش", + "CLEAR_CONFIRM" => "آیا مطمئن هستید که میخواهید کش سایت را پاک سازی کنید؟", + "CLEAR_CONFIRM_YES" => "بله، کش پاک سازی شود", + "CLEARED" => "کش با موفقیت پاک سازی شد" + ], + + "DASHBOARD" => "کارتابل", + "DELETE_MASTER" => "شما نمیتوانید کاربر اصلی را حذف کنید", + "DELETION_SUCCESSFUL" => "{{user_name}} با موفقیت حذف شد.", + "DETAILS_UPDATED" => "جزئیات {{user_name}} با موفقیت ذخیره شد.", + "DISABLE_MASTER" => "شما نمیتوانید کاربر اصلی را غیر فعال کنید.", + "DISABLE_SUCCESSFUL" => "حساب کاربری {{user_name}} با موفقیت غیر فعال شد.", + + "ENABLE_SUCCESSFUL" => "حساب کاربری {{user_name}} با موفقیت فعال شد.", + + "GROUP" => [ + 1 => "گروه", + 2 => "گروه ها", + + "CREATE" => "اضافه کردن گروه", + "CREATION_SUCCESSFUL" => "گروه {{name}} با موفقیت اضافه شد", + "DELETE" => "حذف گروه", + "DELETE_CONFIRM" => "آیا مطمئن هستید که میخواهید گروه {{name}} را حذف کنید؟", + "DELETE_DEFAULT" => "شما نمیتوانید گروه {{name}} را حذف کنید چون به عنوان گروه پیش فرض برای کاربران جدید انتخاب شده است.", + "DELETE_YES" => "بله، گروه حذف شود", + "DELETION_SUCCESSFUL" => "گروه {{name}} با موفقیت حذف شد.", + "EDIT" => "ویرایش گروه", + "ICON" => "آیکن گروه", + "ICON_EXPLAIN" => "آیکن برای اعضای گروه", + "INFO_PAGE" => "صفحه توضیحات گروه برای {{name}}", + "MANAGE" => "مدیریت گروه", + "NAME" => "نام گروه", + "NAME_EXPLAIN" => "لطفا نام گروه را وارد کنید", + "NOT_EMPTY" => "نمیتوان این کار را کرد چون هنوز کاربرانی عضو گروه {{name}} هستند.", + "PAGE_DESCRIPTION" => "لیست گروه های وب سایت شما. امکان مدیریت این گروه ها در این صفحه وجود دارد.", + "SUMMARY" => "توضیحات گروه", + "UPDATE" => "اطلاعات گروه {{name}} به روز رسانی شد." + ], + + "MANUALLY_ACTIVATED" => "حساب کاربری {{user_name}} بصورت دستی فعال شد.", + "MASTER_ACCOUNT_EXISTS" => "حساب کاربری اصلی وجود دارد!", + "MIGRATION" => [ + "REQUIRED" => "به روز رسانی پایگاه داده ها باید انجام شود" + ], + + "PERMISSION" => [ + 1 => "دسترسی", + 2 => "دسترسی ها", + + "ASSIGN_NEW" => "دادن دسترسی", + "HOOK_CONDITION" => "قلاب/شرط", + "ID" => "آی دی دسترسی", + "INFO_PAGE" => "توضیحات دسترسی {{name}}", + "MANAGE" => "مدیریت دسترسی ها", + "NOTE_READ_ONLY" => "توجه بفرماییددسترسی ها بخشی از کد میباشند و آن ها را نمیتوان از اینترفیس تغییر داد. برای این تغییرات، مبایستی که مدیر، از دیتابیس مایگریشن استفاده کند. ", + "PAGE_DESCRIPTION" => "لیست دسترسی های وب سایت شما. امکان مدیریت این دسترسی ها در این صفحه وجود دارد.", + "SUMMARY" => "توضیحات دسترسی ها", + "UPDATE" => "به روز رسانی دسترسی ها", + "VIA_ROLES" => "از طریق وظیفه ها دسترسی دارد" + ], + + "ROLE" => [ + 1 => "وظیفه", + 2 => "وظیفه ها", + + "ASSIGN_NEW" => "دادن وظیفه", + "CREATE" => "ساخت وظیفه", + "CREATION_SUCCESSFUL" => "وظیفه {{name}} با موفقیت ساخته شد", + "DELETE" => "حذف وظیفه", + "DELETE_CONFIRM" => "اطمینان دارید که میخواهید وظیفه {{name}} را حذف کنید؟", + "DELETE_DEFAULT" => "شما نمیتوانید وظیفه {{name}} را حذف کنید زیرا کاربرانی که تازه ثبت نام کنند، این وظیفه را دریافت خواهند کرد.", + "DELETE_YES" => "بله، وظیفه حذف شود", + "DELETION_SUCCESSFUL" => "وظیفه {{name}} با موفقیت حذف شد", + "EDIT" => "ویرایش وظیفه", + "HAS_USERS" => "نمیتوانید این کار را انجام دهید زیرا کاربرانی وظیفه {{name}} را هنوز دارند.", + "INFO_PAGE" => "صفحه توضیحات وظیفه {{name}}", + "MANAGE" => "مدیریت وظیفه ها", + "NAME" => "نام", + "NAME_EXPLAIN" => "لطفا برای وظیفه نامی انتخاب کنید", + "NAME_IN_USE" => "وظیفه ای با نام {{name}} موجود است", + "PAGE_DESCRIPTION" => "لیست وظیفه های وب سایت شما. امکان مدیریت این وظیفه ها در این صفحه وجود دارد.", + "PERMISSIONS_UPDATED" => "دسترسی ها برای وظیفه {{name}} به روز رسانی شد", + "SUMMARY" => "خلاصه وظیفه", + "UPDATED" => "اطلاعات وظیفه {{name}} به روز رسانی شد" + ], + + "SYSTEM_INFO" => [ + "@TRANSLATION" => "توضیحات سیستم", + + "DB_NAME" => "نام پایگاه داده", + "DB_VERSION" => "نسخه پایگاه داده", + "DIRECTORY" => "دایرکتوری پروژه", + "PHP_VERSION" => "نسخه پی اچ پی", + "SERVER" => "نرمافزار وب سرور", + "SPRINKLES" => "اسپرینکل های بارگذاری شده", + "UF_VERSION" => "نسخه یوزرفروستینگ", + "URL" => "آدرس رووت وب سایت" + ], + + "TOGGLE_COLUMNS" => "تغییر ستون", + + "USER" => [ + 1 => "کاربر", + 2 => "کاربران", + + "ADMIN" => [ + "CHANGE_PASSWORD" => "تغییر گذرواژه کاربر", + "SEND_PASSWORD_LINK" => "برای کاربر ایمیلی ارسال شود تا گذرواژه خود را تغییر دهد", + "SET_PASSWORD" => "گذرواژه کاربر را انتخاب کنید" + ], + + "ACTIVATE" => "کاربر فعال", + "CREATE" => "اضافه کردن کاربر", + "CREATED" => "کاربر {{user_name}} با موفقیت اضافه شد", + "DELETE" => "حذف کاربر", + "DELETE_CONFIRM" => "آیا اطمینان دارید که میخواهید کاربر {{name}} را حذف کنید؟", + "DELETE_YES" => "بله، کاربر حذف شود", + "DISABLE" => "غیر فعال سازی کاربر", + "EDIT" => "ویرایش کاربر", + "ENABLE" => "فعال سازی کاربر", + "INFO_PAGE" => "صفحه توضیحات کاربر {{name}}", + "LATEST" => "آخرین کاربران", + "PAGE_DESCRIPTION" => "لیستی از کاربران سایت. این صفحه به شما امکان ویرایش، فعال سازی و غیر فعال سازی کاربران را می دهد.", + "SUMMARY" => "خلاصه حساب", + "VIEW_ALL" => "تماشای همه ی کاربران", + "WITH_PERMISSION" => "کاربرانی که این دسترسی را دارند" + ], + "X_USER" => [ + 0 => "هیچ کاربری", + 1 => "{{plural}} کاربر", + 2 => "{{plural}} کاربر" + ] +]; diff --git a/main/app/sprinkles/admin/locale/fr_FR/messages.php b/main/app/sprinkles/admin/locale/fr_FR/messages.php index 773c856..3727a0e 100644 --- a/main/app/sprinkles/admin/locale/fr_FR/messages.php +++ b/main/app/sprinkles/admin/locale/fr_FR/messages.php @@ -1,147 +1,147 @@ - [ - 1 => "Activité", - 2 => "Activités", - - "LAST" => "Dernière activité", - "PAGE" => "Une liste des activités des utilisateurs", - "TIME" => "Date de l'activité" - ], - - "CACHE" => [ - "CLEAR" => "Vider le cache", - "CLEAR_CONFIRM" => "Voulez-vous vraiment supprimer le cache du site?", - "CLEAR_CONFIRM_YES" => "Oui, vider le cache", - "CLEARED" => "Cache effacé avec succès !" - ], - - "DASHBOARD" => "Tableau de bord", - "DELETE_MASTER" => "Vous ne pouvez pas supprimer le compte principal !", - "DELETION_SUCCESSFUL" => "L'utilisateur {{user_name}} a été supprimé avec succès.", - "DETAILS_UPDATED" => "Les détails du compte de {{user_name}} ont été mis à jour", - "DISABLE_MASTER" => "Vous ne pouvez pas désactiver le compte principal !", - "DISABLE_SELF" => "Vous ne pouvez pas désactiver votre propre compte !", - "DISABLE_SUCCESSFUL" => "Le compte de l'utilisateur {{user_name}} a été désactivé avec succès.", - - "ENABLE_SUCCESSFUL" => "Le compte de l'utilisateur {{user_name}} a été activé avec succès.", - - "GROUP" => [ - 1 => "Groupe", - 2 => "Groupes", - - "CREATE" => "Créer un groupe", - "CREATION_SUCCESSFUL" => "Successfully created group {{name}}", - "DELETE" => "Supprimer le groupe", - "DELETE_CONFIRM" => "Êtes-vous certain de vouloir supprimer le groupe {{name}}?", - "DELETE_DEFAULT" => "Vous ne pouvez pas supprimer le groupe {{name}} parce que c'est le groupe par défaut pour les utilisateurs nouvellement enregistrés.", - "DELETE_YES" => "Oui, supprimer le groupe", - "DELETION_SUCCESSFUL" => "Groupe {{name}} supprimé avec succès", - "EDIT" => "Modifier le groupe", - "ICON" => "Icône", - "ICON_EXPLAIN" => "Icône des membres du groupe", - "INFO_PAGE" => "Informations sur le groupe {{name}}", - "MANAGE" => "Gérer le groupe", - "NAME" => "Nom du groupe", - "NAME_EXPLAIN" => "Spécifiez le nom du groupe", - "NOT_EMPTY" => "Vous ne pouvez pas le faire car il y a encore des utilisateurs associés au groupe {{name}}.", - "PAGE_DESCRIPTION" => "Une liste des groupes pour votre site. Fournit des outils de gestion pour éditer et supprimer des groupes.", - "UPDATE" => "Les détails du groupe {{name}} ont été enregistrés" - ], - - "MANUALLY_ACTIVATED" => "Le compte de {{user_name}} a été activé manuellement", - "MASTER_ACCOUNT_EXISTS" => "Le compte principal existe déjà !", - "MIGRATION" => [ - "REQUIRED" => "Mise à jour de la base de données requise" - ], - - "PERMISSION" => [ - 1 => "Autorisation", - 2 => "Autorisations", - - "ASSIGN_NEW" => "Assigner une nouvelle autorisation", - "HOOK_CONDITION" => "Hook/Conditions", - "MANAGE" => "Gestion des autorisations", - "PAGE_DESCRIPTION" => "Une liste des autorisations pour votre site. Fournit des outils de gestion pour modifier et supprimer des autorisations.", - "UPDATE" => "Mettre à jour les autorisations" - ], - - "ROLE" => [ - 1 => "Rôle", - 2 => "Rôles", - - "ASSIGN_NEW" => "Assigner un nouveau rôle", - "CREATE" => "Créer un rôle", - "CREATION_SUCCESSFUL" => "Rôle {{name}} créé avec succès", - "DELETE" => "Supprimer le rôle", - "DELETE_CONFIRM" => "Êtes-vous certain de vouloir supprimer le rôle {{name}}?", - "DELETE_DEFAULT" => "Vous ne pouvez pas supprimer le rôle {{name}} parce que c'est un rôle par défaut pour les utilisateurs nouvellement enregistrés.", - "DELETE_YES" => "Oui, supprimer le rôle", - "DELETION_SUCCESSFUL" => "Rôle {{name}} supprimé avec succès", - "EDIT" => "Modifier le rôle", - "HAS_USERS" => "Vous ne pouvez pas le faire parce qu'il y a encore des utilisateurs qui ont le rôle {{name}}.", - "INFO_PAGE" => "Page d'information pour le rôle {{name}}", - "MANAGE" => "Gérer les rôles", - "NAME" => "Nom du rôle", - "NAME_EXPLAIN" => "Spécifiez le nom du rôle", - "NAME_IN_USE" => "Un rôle nommé {{name}} existe déjà", - "PAGE_DESCRIPTION" => "Une liste des rôles de votre site. Fournit des outils de gestion pour modifier et supprimer des rôles.", - "PERMISSIONS_UPDATED" => "Autorisations mises à jour pour le rôle {{name}}", - "UPDATED" => "Détails mis à jour pour le rôle {{name}}" - ], - - "SYSTEM_INFO" => [ - "@TRANSLATION" => "Informations sur le système", - - "DB_NAME" => "Base de donnée", - "DB_VERSION" => "Version DB", - "DIRECTORY" => "Répertoire du projet", - "PHP_VERSION" => "Version de PHP", - "SERVER" => "Logiciel server", - "SPRINKLES" => "Sprinkles chargés", - "UF_VERSION" => "Version de UserFrosting", - "URL" => "Url racine" - ], - - "USER" => [ - 1 => "Utilisateur", - 2 => "Utilisateurs", - - "ADMIN" => [ - "CHANGE_PASSWORD" => "Changer le mot de passe", - "SEND_PASSWORD_LINK" => "Envoyer à l'utilisateur un lien qui lui permettra de choisir son propre mot de passe", - "SET_PASSWORD" => "Définissez le mot de passe de l'utilisateur comme" - ], - - "ACTIVATE" => "Autoriser l'utilisateur", - "CREATE" => "Créer un utilisateur", - "CREATED" => "L'utilisateur {{user_name}} a été créé avec succès", - "DELETE" => "Supprimer l'utilisateur", - "DELETE_CONFIRM" => "Êtes-vous certain de vouloir supprimer l'utilisateur {{name}}?", - "DELETE_YES" => "Oui, supprimer l'utilisateur", - "DISABLE" => "Désactiver l'utilisateur", - "EDIT" => "Modifier l'utilisateur", - "ENABLE" => "Activer l'utilisateur", - "INFO_PAGE" => "Page d'information de l'utilisateur pour {{name}}", - "PAGE_DESCRIPTION" => "Une liste des utilisateurs de votre site. Fournit des outils de gestion incluant la possibilité de modifier les détails de l'utilisateur, d'activer manuellement les utilisateurs, d'activer / désactiver les utilisateurs et plus.", - "LATEST" => "Derniers utilisateurs", - "VIEW_ALL" => "Voir tous les utilisateurs" - ], - "X_USER" => [ - 0 => "Aucun utilisateur", - 1 => "{{plural}} utilisateur", - 2 => "{{plural}} utilisateurs" - ] + [ + 1 => "Activité", + 2 => "Activités", + + "LAST" => "Dernière activité", + "PAGE" => "Une liste des activités des utilisateurs", + "TIME" => "Date de l'activité" + ], + + "CACHE" => [ + "CLEAR" => "Vider le cache", + "CLEAR_CONFIRM" => "Voulez-vous vraiment supprimer le cache du site?", + "CLEAR_CONFIRM_YES" => "Oui, vider le cache", + "CLEARED" => "Cache effacé avec succès !" + ], + + "DASHBOARD" => "Tableau de bord", + "DELETE_MASTER" => "Vous ne pouvez pas supprimer le compte principal !", + "DELETION_SUCCESSFUL" => "L'utilisateur {{user_name}} a été supprimé avec succès.", + "DETAILS_UPDATED" => "Les détails du compte de {{user_name}} ont été mis à jour", + "DISABLE_MASTER" => "Vous ne pouvez pas désactiver le compte principal !", + "DISABLE_SELF" => "Vous ne pouvez pas désactiver votre propre compte !", + "DISABLE_SUCCESSFUL" => "Le compte de l'utilisateur {{user_name}} a été désactivé avec succès.", + + "ENABLE_SUCCESSFUL" => "Le compte de l'utilisateur {{user_name}} a été activé avec succès.", + + "GROUP" => [ + 1 => "Groupe", + 2 => "Groupes", + + "CREATE" => "Créer un groupe", + "CREATION_SUCCESSFUL" => "Successfully created group {{name}}", + "DELETE" => "Supprimer le groupe", + "DELETE_CONFIRM" => "Êtes-vous certain de vouloir supprimer le groupe {{name}}?", + "DELETE_DEFAULT" => "Vous ne pouvez pas supprimer le groupe {{name}} parce que c'est le groupe par défaut pour les utilisateurs nouvellement enregistrés.", + "DELETE_YES" => "Oui, supprimer le groupe", + "DELETION_SUCCESSFUL" => "Groupe {{name}} supprimé avec succès", + "EDIT" => "Modifier le groupe", + "ICON" => "Icône", + "ICON_EXPLAIN" => "Icône des membres du groupe", + "INFO_PAGE" => "Informations sur le groupe {{name}}", + "MANAGE" => "Gérer le groupe", + "NAME" => "Nom du groupe", + "NAME_EXPLAIN" => "Spécifiez le nom du groupe", + "NOT_EMPTY" => "Vous ne pouvez pas le faire car il y a encore des utilisateurs associés au groupe {{name}}.", + "PAGE_DESCRIPTION" => "Une liste des groupes pour votre site. Fournit des outils de gestion pour éditer et supprimer des groupes.", + "UPDATE" => "Les détails du groupe {{name}} ont été enregistrés" + ], + + "MANUALLY_ACTIVATED" => "Le compte de {{user_name}} a été activé manuellement", + "MASTER_ACCOUNT_EXISTS" => "Le compte principal existe déjà !", + "MIGRATION" => [ + "REQUIRED" => "Mise à jour de la base de données requise" + ], + + "PERMISSION" => [ + 1 => "Autorisation", + 2 => "Autorisations", + + "ASSIGN_NEW" => "Assigner une nouvelle autorisation", + "HOOK_CONDITION" => "Hook/Conditions", + "MANAGE" => "Gestion des autorisations", + "PAGE_DESCRIPTION" => "Une liste des autorisations pour votre site. Fournit des outils de gestion pour modifier et supprimer des autorisations.", + "UPDATE" => "Mettre à jour les autorisations" + ], + + "ROLE" => [ + 1 => "Rôle", + 2 => "Rôles", + + "ASSIGN_NEW" => "Assigner un nouveau rôle", + "CREATE" => "Créer un rôle", + "CREATION_SUCCESSFUL" => "Rôle {{name}} créé avec succès", + "DELETE" => "Supprimer le rôle", + "DELETE_CONFIRM" => "Êtes-vous certain de vouloir supprimer le rôle {{name}}?", + "DELETE_DEFAULT" => "Vous ne pouvez pas supprimer le rôle {{name}} parce que c'est un rôle par défaut pour les utilisateurs nouvellement enregistrés.", + "DELETE_YES" => "Oui, supprimer le rôle", + "DELETION_SUCCESSFUL" => "Rôle {{name}} supprimé avec succès", + "EDIT" => "Modifier le rôle", + "HAS_USERS" => "Vous ne pouvez pas le faire parce qu'il y a encore des utilisateurs qui ont le rôle {{name}}.", + "INFO_PAGE" => "Page d'information pour le rôle {{name}}", + "MANAGE" => "Gérer les rôles", + "NAME" => "Nom du rôle", + "NAME_EXPLAIN" => "Spécifiez le nom du rôle", + "NAME_IN_USE" => "Un rôle nommé {{name}} existe déjà", + "PAGE_DESCRIPTION" => "Une liste des rôles de votre site. Fournit des outils de gestion pour modifier et supprimer des rôles.", + "PERMISSIONS_UPDATED" => "Autorisations mises à jour pour le rôle {{name}}", + "UPDATED" => "Détails mis à jour pour le rôle {{name}}" + ], + + "SYSTEM_INFO" => [ + "@TRANSLATION" => "Informations sur le système", + + "DB_NAME" => "Base de donnée", + "DB_VERSION" => "Version DB", + "DIRECTORY" => "Répertoire du projet", + "PHP_VERSION" => "Version de PHP", + "SERVER" => "Logiciel server", + "SPRINKLES" => "Sprinkles chargés", + "UF_VERSION" => "Version de UserFrosting", + "URL" => "Url racine" + ], + + "USER" => [ + 1 => "Utilisateur", + 2 => "Utilisateurs", + + "ADMIN" => [ + "CHANGE_PASSWORD" => "Changer le mot de passe", + "SEND_PASSWORD_LINK" => "Envoyer à l'utilisateur un lien qui lui permettra de choisir son propre mot de passe", + "SET_PASSWORD" => "Définissez le mot de passe de l'utilisateur comme" + ], + + "ACTIVATE" => "Autoriser l'utilisateur", + "CREATE" => "Créer un utilisateur", + "CREATED" => "L'utilisateur {{user_name}} a été créé avec succès", + "DELETE" => "Supprimer l'utilisateur", + "DELETE_CONFIRM" => "Êtes-vous certain de vouloir supprimer l'utilisateur {{name}}?", + "DELETE_YES" => "Oui, supprimer l'utilisateur", + "DISABLE" => "Désactiver l'utilisateur", + "EDIT" => "Modifier l'utilisateur", + "ENABLE" => "Activer l'utilisateur", + "INFO_PAGE" => "Page d'information de l'utilisateur pour {{name}}", + "PAGE_DESCRIPTION" => "Une liste des utilisateurs de votre site. Fournit des outils de gestion incluant la possibilité de modifier les détails de l'utilisateur, d'activer manuellement les utilisateurs, d'activer / désactiver les utilisateurs et plus.", + "LATEST" => "Derniers utilisateurs", + "VIEW_ALL" => "Voir tous les utilisateurs" + ], + "X_USER" => [ + 0 => "Aucun utilisateur", + 1 => "{{plural}} utilisateur", + 2 => "{{plural}} utilisateurs" + ] ]; \ No newline at end of file diff --git a/main/app/sprinkles/admin/locale/it_IT/messages.php b/main/app/sprinkles/admin/locale/it_IT/messages.php index 0bb737a..322556a 100644 --- a/main/app/sprinkles/admin/locale/it_IT/messages.php +++ b/main/app/sprinkles/admin/locale/it_IT/messages.php @@ -1,160 +1,160 @@ - [ - 1 => "Attività", - 2 => "Attività", - - "LAST" => "Ultima attività", - "PAGE" => "Un elenco delle attività degli utenti", - "TIME" => "Tempo di attività" - ], - - "CACHE" => [ - "CLEAR" => "Cancellare la cache", - "CLEAR_CONFIRM" => "Sei sicuro di voler cancellare la cache del sito?", - "CLEAR_CONFIRM_YES" => "Sì, cancellare la cache", - "CLEARED" => "La cache è stata eliminata correttamente!" - ], - - "DASHBOARD" => "Pannello di Controllo", - "NO_FEATURES_YET" => "Non sembra che alcune funzioni siano state create per questo account ... ancora. Forse non sono ancora state implementate, o forse qualcuno ha dimenticato di dare accesso. In entrambi i casi, siamo contenti di averti qui!", - "DELETE_MASTER" => "Non puoi eliminare l'account principale!", - "DELETION_SUCCESSFUL" => "Hai eliminato utente {{user_name}}.", - "DETAILS_UPDATED" => "Dettagli degli account aggiornati per l'utente {{user_name}}", - "DISABLE_MASTER" => "Non puoi disattivare l'account principale!", - "DISABLE_SELF" => "Non puoi disattivare il tuo account!", - "DISABLE_SUCCESSFUL" => "Account per l'utente {{user_name}} disattivato con successo!", - "ENABLE_SUCCESSFUL" => "Account per l'utente {{user_name}} attivato con successo.", - - "GROUP" => [ - 1 => "Gruppo", - 2 => "Gruppi", - - "CREATE" => "Creare un gruppo", - "CREATION_SUCCESSFUL" => "Ha creato con successo il gruppo {{name}}", - "DELETE" => "Elimina gruppo", - "DELETE_CONFIRM" => "Sei sicuro di voler eliminare il gruppo {{name}}?", - "DELETE_DEFAULT" => "Non puoi eliminare il gruppo {{name}} perché è il gruppo predefinito per gli utenti appena registrati.", - "DELETE_YES" => "Sì, elimini il gruppo", - "DELETION_SUCCESSFUL" => "Eliminato il gruppo {{name}} con successo", - "EDIT" => "Modifica gruppo", - "ICON" => "Icona del gruppo", - "ICON_EXPLAIN" => "Icona per i membri del gruppo", - "INFO_PAGE" => "Pagina informazioni di gruppo per {{name}}", - "MANAGE" => "Gestisci gruppo", - "NAME" => "Nome del gruppo", - "NAME_EXPLAIN" => "Inserisci un nome per il gruppo", - "NOT_EMPTY" => "Non puoi farlo perché ci sono ancora utenti associati al gruppo {{name}}.", - "PAGE_DESCRIPTION" => "Un elenco dei gruppi per il tuo sito. Fornisce strumenti di gestione per la modifica e l'eliminazione di gruppi.", - "SUMMARY" => "Riepilogo del gruppo", - "UPDATE" => "Dettagli aggiornati per il gruppo {{name}}." - ], - - "MANUALLY_ACTIVATED" => "{{user_name}} è stato attivato manualmente", - "MASTER_ACCOUNT_EXISTS" => "L'account primario esiste già!", - "MIGRATION" => [ - "REQUIRED" => "È necessario aggiornare il database" - ], - - "PERMISSION" => [ - 1 => "Autorizzazione", - 2 => "Autorizzazioni", - - "ASSIGN_NEW" => "Assegna nuova autorizzazione", - "HOOK_CONDITION" => "Hook/Condizioni", - "ID" => "ID di autorizzazione", - "INFO_PAGE" => "Pagina di informazioni sulle autorizzazioni per {{name}}", - "MANAGE" => "Gestione delle autorizzazioni", - "NOTE_READ_ONLY" => "Si prega di notare: le autorizzazioni sono considerate \"parte del codice\" e non possono essere modificate tramite l'interfaccia. Per aggiungere, rimuovere o modificare le autorizzazioni, i gestori del sito devono utilizzare migrazione del database.", - "PAGE_DESCRIPTION" => "Un elenco delle autorizzazioni per il tuo sito. Fornisce strumenti di gestione per la modifica e l'eliminazione delle autorizzazioni.", - "SUMMARY" => "Sommario delle Autorizzazioni", - "UPDATE" => "Aggiorna le autorizzazioni", - "VIA_ROLES" => "Ha autorizzazione tramite ruoli" - ], - - "ROLE" => [ - 1 => "Ruolo", - 2 => "Ruoli", - - "ASSIGN_NEW" => "Assegna un nuovo ruolo", - "CREATE" => "Crea ruolo", - "CREATION_SUCCESSFUL" => "Creato con successo il ruolo {{name}}", - "DELETE" => "Elimina il ruolo", - "DELETE_CONFIRM" => "Sei sicuro di voler eliminare il ruolo {{name}}?", - "DELETE_DEFAULT" => "Non puoi eliminare il ruolo {{name}} perché è un ruolo predefinito per gli utenti appena registrati.", - "DELETE_YES" => "Sì, elimini il ruolo", - "DELETION_SUCCESSFUL" => "Eliminato il ruolo {{name}}", - "EDIT" => "Modifica ruolo", - "HAS_USERS" => "Non puoi farlo perché ci sono ancora utenti che hanno il ruolo {{name}}.", - "INFO_PAGE" => "Pagina di informazioni sui ruoli per {{name}}", - "MANAGE" => "Gestisci Ruoli", - "NAME" => "Nome", - "NAME_EXPLAIN" => "Inserisci un nome per il ruolo", - "NAME_IN_USE" => "Esiste già un ruolo denominato {{name}}", - "PAGE_DESCRIPTION" => "Un elenco dei ruoli per il tuo sito. Fornisce strumenti di gestione per la modifica e l'eliminazione di ruoli.", - "PERMISSIONS_UPDATED" => "Autorizzazioni aggiornate per ruolo {{name}}", - "SUMMARY" => "Riepilogo dei Ruoli", - "UPDATED" => "Dettagli aggiornati per ruolo {{name}}" - ], - - "SYSTEM_INFO" => [ - "@TRANSLATION" => "Informazioni sul sistema", - - "DB_NAME" => "Nome del database", - "DB_VERSION" => "Versione del database", - "DIRECTORY" => "Directory del progetto", - "PHP_VERSION" => "Versione PHP", - "SERVER" => "Software del webserver", - "SPRINKLES" => "Sprinkles caricati", - "UF_VERSION" => "Versione UserFrosting", - "URL" => "Url della radice del sito" - ], - - "TOGGLE_COLUMNS" => "Scambia le colonne", - - "USER" => [ - 1 => "Utente", - 2 => "Utenti", - - "ADMIN" => [ - "CHANGE_PASSWORD" => "Cambia Password Utente", - "SEND_PASSWORD_LINK" => "Inviare all'utente un collegamento che permetterà loro di scegliere la propria password", - "SET_PASSWORD" => "Impostare la password dell'utente come" - ], - - "ACTIVATE" => "Attiva l'utente", - "CREATE" => "Creare un utente", - "CREATED" => "Account per l'utente {{user_name}} è stato creato.", - "DELETE" => "Elimina utente", - "DELETE_CONFIRM" => "Sei sicuro di voler eliminare l'utente {{name}}?", - "DELETE_YES" => "Sì, elimina l'utente", - "DISABLE" => "Disabilita l'utente", - "EDIT" => "Modifica utente", - "ENABLE" => "Abilita l'utente", - "INFO_PAGE" => "Pagina informazioni utente per {{name}}", - "LATEST" => "Ultimi Utenti", - "PAGE_DESCRIPTION" => "Un elenco degli utenti del tuo sito. Fornisce strumenti di gestione, tra cui la possibilità di modificare i dettagli utente, attivare manualmente gli utenti, abilitare / disabilitare gli utenti e altro ancora.", - "SUMMARY" => "Riepilogo account", - "VIEW_ALL" => "Visualizza tutti gli utenti", - "WITH_PERMISSION" => "Utenti con questa autorizzazione" - ], - "X_USER" => [ - 0 => "Nessun utente", - 1 => "{{plural}} utente", - 2 => "{{plural}} utenti" - ] -]; + [ + 1 => "Attività", + 2 => "Attività", + + "LAST" => "Ultima attività", + "PAGE" => "Un elenco delle attività degli utenti", + "TIME" => "Tempo di attività" + ], + + "CACHE" => [ + "CLEAR" => "Cancellare la cache", + "CLEAR_CONFIRM" => "Sei sicuro di voler cancellare la cache del sito?", + "CLEAR_CONFIRM_YES" => "Sì, cancellare la cache", + "CLEARED" => "La cache è stata eliminata correttamente!" + ], + + "DASHBOARD" => "Pannello di Controllo", + "NO_FEATURES_YET" => "Non sembra che alcune funzioni siano state create per questo account ... ancora. Forse non sono ancora state implementate, o forse qualcuno ha dimenticato di dare accesso. In entrambi i casi, siamo contenti di averti qui!", + "DELETE_MASTER" => "Non puoi eliminare l'account principale!", + "DELETION_SUCCESSFUL" => "Hai eliminato utente {{user_name}}.", + "DETAILS_UPDATED" => "Dettagli degli account aggiornati per l'utente {{user_name}}", + "DISABLE_MASTER" => "Non puoi disattivare l'account principale!", + "DISABLE_SELF" => "Non puoi disattivare il tuo account!", + "DISABLE_SUCCESSFUL" => "Account per l'utente {{user_name}} disattivato con successo!", + "ENABLE_SUCCESSFUL" => "Account per l'utente {{user_name}} attivato con successo.", + + "GROUP" => [ + 1 => "Gruppo", + 2 => "Gruppi", + + "CREATE" => "Creare un gruppo", + "CREATION_SUCCESSFUL" => "Ha creato con successo il gruppo {{name}}", + "DELETE" => "Elimina gruppo", + "DELETE_CONFIRM" => "Sei sicuro di voler eliminare il gruppo {{name}}?", + "DELETE_DEFAULT" => "Non puoi eliminare il gruppo {{name}} perché è il gruppo predefinito per gli utenti appena registrati.", + "DELETE_YES" => "Sì, elimini il gruppo", + "DELETION_SUCCESSFUL" => "Eliminato il gruppo {{name}} con successo", + "EDIT" => "Modifica gruppo", + "ICON" => "Icona del gruppo", + "ICON_EXPLAIN" => "Icona per i membri del gruppo", + "INFO_PAGE" => "Pagina informazioni di gruppo per {{name}}", + "MANAGE" => "Gestisci gruppo", + "NAME" => "Nome del gruppo", + "NAME_EXPLAIN" => "Inserisci un nome per il gruppo", + "NOT_EMPTY" => "Non puoi farlo perché ci sono ancora utenti associati al gruppo {{name}}.", + "PAGE_DESCRIPTION" => "Un elenco dei gruppi per il tuo sito. Fornisce strumenti di gestione per la modifica e l'eliminazione di gruppi.", + "SUMMARY" => "Riepilogo del gruppo", + "UPDATE" => "Dettagli aggiornati per il gruppo {{name}}." + ], + + "MANUALLY_ACTIVATED" => "{{user_name}} è stato attivato manualmente", + "MASTER_ACCOUNT_EXISTS" => "L'account primario esiste già!", + "MIGRATION" => [ + "REQUIRED" => "È necessario aggiornare il database" + ], + + "PERMISSION" => [ + 1 => "Autorizzazione", + 2 => "Autorizzazioni", + + "ASSIGN_NEW" => "Assegna nuova autorizzazione", + "HOOK_CONDITION" => "Hook/Condizioni", + "ID" => "ID di autorizzazione", + "INFO_PAGE" => "Pagina di informazioni sulle autorizzazioni per {{name}}", + "MANAGE" => "Gestione delle autorizzazioni", + "NOTE_READ_ONLY" => "Si prega di notare: le autorizzazioni sono considerate \"parte del codice\" e non possono essere modificate tramite l'interfaccia. Per aggiungere, rimuovere o modificare le autorizzazioni, i gestori del sito devono utilizzare migrazione del database.", + "PAGE_DESCRIPTION" => "Un elenco delle autorizzazioni per il tuo sito. Fornisce strumenti di gestione per la modifica e l'eliminazione delle autorizzazioni.", + "SUMMARY" => "Sommario delle Autorizzazioni", + "UPDATE" => "Aggiorna le autorizzazioni", + "VIA_ROLES" => "Ha autorizzazione tramite ruoli" + ], + + "ROLE" => [ + 1 => "Ruolo", + 2 => "Ruoli", + + "ASSIGN_NEW" => "Assegna un nuovo ruolo", + "CREATE" => "Crea ruolo", + "CREATION_SUCCESSFUL" => "Creato con successo il ruolo {{name}}", + "DELETE" => "Elimina il ruolo", + "DELETE_CONFIRM" => "Sei sicuro di voler eliminare il ruolo {{name}}?", + "DELETE_DEFAULT" => "Non puoi eliminare il ruolo {{name}} perché è un ruolo predefinito per gli utenti appena registrati.", + "DELETE_YES" => "Sì, elimini il ruolo", + "DELETION_SUCCESSFUL" => "Eliminato il ruolo {{name}}", + "EDIT" => "Modifica ruolo", + "HAS_USERS" => "Non puoi farlo perché ci sono ancora utenti che hanno il ruolo {{name}}.", + "INFO_PAGE" => "Pagina di informazioni sui ruoli per {{name}}", + "MANAGE" => "Gestisci Ruoli", + "NAME" => "Nome", + "NAME_EXPLAIN" => "Inserisci un nome per il ruolo", + "NAME_IN_USE" => "Esiste già un ruolo denominato {{name}}", + "PAGE_DESCRIPTION" => "Un elenco dei ruoli per il tuo sito. Fornisce strumenti di gestione per la modifica e l'eliminazione di ruoli.", + "PERMISSIONS_UPDATED" => "Autorizzazioni aggiornate per ruolo {{name}}", + "SUMMARY" => "Riepilogo dei Ruoli", + "UPDATED" => "Dettagli aggiornati per ruolo {{name}}" + ], + + "SYSTEM_INFO" => [ + "@TRANSLATION" => "Informazioni sul sistema", + + "DB_NAME" => "Nome del database", + "DB_VERSION" => "Versione del database", + "DIRECTORY" => "Directory del progetto", + "PHP_VERSION" => "Versione PHP", + "SERVER" => "Software del webserver", + "SPRINKLES" => "Sprinkles caricati", + "UF_VERSION" => "Versione UserFrosting", + "URL" => "Url della radice del sito" + ], + + "TOGGLE_COLUMNS" => "Scambia le colonne", + + "USER" => [ + 1 => "Utente", + 2 => "Utenti", + + "ADMIN" => [ + "CHANGE_PASSWORD" => "Cambia Password Utente", + "SEND_PASSWORD_LINK" => "Inviare all'utente un collegamento che permetterà loro di scegliere la propria password", + "SET_PASSWORD" => "Impostare la password dell'utente come" + ], + + "ACTIVATE" => "Attiva l'utente", + "CREATE" => "Creare un utente", + "CREATED" => "Account per l'utente {{user_name}} è stato creato.", + "DELETE" => "Elimina utente", + "DELETE_CONFIRM" => "Sei sicuro di voler eliminare l'utente {{name}}?", + "DELETE_YES" => "Sì, elimina l'utente", + "DISABLE" => "Disabilita l'utente", + "EDIT" => "Modifica utente", + "ENABLE" => "Abilita l'utente", + "INFO_PAGE" => "Pagina informazioni utente per {{name}}", + "LATEST" => "Ultimi Utenti", + "PAGE_DESCRIPTION" => "Un elenco degli utenti del tuo sito. Fornisce strumenti di gestione, tra cui la possibilità di modificare i dettagli utente, attivare manualmente gli utenti, abilitare / disabilitare gli utenti e altro ancora.", + "SUMMARY" => "Riepilogo account", + "VIEW_ALL" => "Visualizza tutti gli utenti", + "WITH_PERMISSION" => "Utenti con questa autorizzazione" + ], + "X_USER" => [ + 0 => "Nessun utente", + 1 => "{{plural}} utente", + 2 => "{{plural}} utenti" + ] +]; diff --git a/main/app/sprinkles/admin/locale/pt_PT/messages.php b/main/app/sprinkles/admin/locale/pt_PT/messages.php index 440e674..6852545 100644 --- a/main/app/sprinkles/admin/locale/pt_PT/messages.php +++ b/main/app/sprinkles/admin/locale/pt_PT/messages.php @@ -1,139 +1,139 @@ - [ - 1 => "Atividade", - 2 => "Atividades", - - "LAST" => "Última atividade", - "PAGE" => "Lista de atividade dos utilizadores", - "TIME" => "Tempo da Atividade" - ], - - "CACHE" => [ - "CLEAR" => "Limpar cache", - "CLEAR_CONFIRM" => "Tem a certeza que pretende limpar a cache do site?", - "CLEAR_CONFIRM_YES" => "Sim, limpar cache", - "CLEARED" => "Cache limpa com sucesso!" - ], - - "DASHBOARD" => "Painel de Controlo", - "DELETE_MASTER" => "Não pode apagar a conta principal!", - "DELETION_SUCCESSFUL" => "Utilizador {{user_name}} foi removido com sucesso.", - "DETAILS_UPDATED" => "Detalhes de conta atualizados para o utilizador {{user_name}}", - "DISABLE_MASTER" => "Não pode desativar a conta principal!", - "DISABLE_SUCCESSFUL" => "Conta do utilizador {{user_name}} foi desativada com sucesso.", - - "ENABLE_SUCCESSFUL" => "Conta do utilizador {{user_name}} foi ativada com sucesso.", - - "GROUP" => [ - 1 => "Grupo", - 2 => "Grupos", - - "CREATE" => "Criar grupo", - "CREATION_SUCCESSFUL" => "Grupo criado com sucesso", - "DELETE" => "Remover grupo", - "DELETION_SUCCESSFUL" => "Grupo removido com sucesso", - "DELETE_CONFIRM" => "Tem a certeza que pretende remover o grupo {{name}}?", - "DELETE_YES" => "Sim, remover grupo", - "EDIT" => "Editar grupo", - "ICON" => "Icon do grupo", - "ICON_EXPLAIN" => "Icon para membros do grupo", - "INFO_PAGE" => "Página informativa do grupo {{name}}", - //"MANAGE" => "Manage group", - "NAME" => "Nome do grupo", - "NAME_EXPLAIN" => "Por favor introduza um nome para o grupo", - "PAGE_DESCRIPTION" => "Lista de grupos do site. Contém opções para editar e remover grupos." - ], - - "MANUALLY_ACTIVATED" => "A conta de {{user_name}} foi ativada manualmente.", - "MASTER_ACCOUNT_EXISTS" => "A contra principal já existe!", - "MIGRATION" => [ - "REQUIRED" => "É necessário uma atualização da base de dados." - ], - - "PERMISSION" => [ - 1 => "Permissão", - 2 => "Permissões", - - "ASSIGN_NEW" => "Atribuir nova permissão", - "HOOK_CONDITION" => "Hook/Condições", - "MANAGE" => "Gerir permissões", - "PAGE_DESCRIPTION" => "Lista de permissões do site. Contém opções para editar e remover permissões.", - "UPDATE" => "Atualizar permissões" - ], - - "ROLE" => [ - 1 => "Cargo", - 2 => "Cargos", - - "ASSIGN_NEW" => "Atribuir novo cargo", - "CREATE" => "Criar cargo", - "CREATION_SUCCESSFUL" => "Cargo criado com sucesso", - "DELETE" => "Remover cargo", - "DELETION_SUCCESSFUL" => "Cargo removido com sucesso", - "DELETE_CONFIRM" => "Tem a certeza que pretende remover o cargo {{name}}?", - "DELETE_YES" => "Sim, remover cargo", - "EDIT" => "Editar cargo", - "INFO_PAGE" => "Página informativa do cargo {{name}}", - "MANAGE" => "Gerir cargos", - "NAME" => "Nome", - "NAME_EXPLAIN" => "Por favor introduza um nome para o cargo", - "PAGE_DESCRIPTION" => "Lista de cargos do site. Contém opções para editar e remover cargos.", - "UPDATE" => "Atualizar cargos", - "UPDATED" => "Cargo {{name}} atualizado" - ], - - "SYSTEM_INFO" => [ - "@TRANSLATION" => "Informação do sistema", - - "DB_NAME" => "Nome da base de dados", - "DB_VERSION" => "Versão da base de dados", - "DIRECTORY" => "Diretório do projeto", - "PHP_VERSION" => "Versão PHP", - "SERVER" => "Software do servidor web", - "SPRINKLES" => "Sprinkles carregados", - "UF_VERSION" => "Versão do UserFrosting", - "URL" => "Raiz (url) do site" - ], - - "USER" => [ - 1 => "Utilizador", - 2 => "Utilizadores", - - "ADMIN" => [ - "CHANGE_PASSWORD" => "Alterar password", - "SEND_PASSWORD_LINK" => "Enviar um link ao utilizador que lhe permita escolher a sua password", - "SET_PASSWORD" => "Definir a password do utilizador como" - ], - - "ACTIVATE" => "Ativar utilizador", - "CREATE" => "Criar utilizador", - "DELETE" => "Remover utilizador", - "DELETE_CONFIRM" => "Tem a certeza que pretende remover o utilizador {{name}}?", - "DELETE_YES" => "Sim, remover utilizador", - "DISABLE" => "Desativar utilizador", - "EDIT" => "Editar utilizador", - "ENABLE" => "Ativar utilizador", - "INFO_PAGE" => "Página informativa do utilizador {{name}}", - "PAGE_DESCRIPTION" => "Lista de utilizadores do site. Contém opções para editar detalhes, ativar/desativar utilizadores e outras.", - "LATEST" => "Últimos Utilizadores", - "VIEW_ALL" => "Ver todos os utilizadores" - ], - "X_USER" => [ - 0 => "Nenhum utilizador", - 1 => "{{plural}} utilizador", - 2 => "{{plural}} utilizadores" - ] -]; + [ + 1 => "Atividade", + 2 => "Atividades", + + "LAST" => "Última atividade", + "PAGE" => "Lista de atividade dos utilizadores", + "TIME" => "Tempo da Atividade" + ], + + "CACHE" => [ + "CLEAR" => "Limpar cache", + "CLEAR_CONFIRM" => "Tem a certeza que pretende limpar a cache do site?", + "CLEAR_CONFIRM_YES" => "Sim, limpar cache", + "CLEARED" => "Cache limpa com sucesso!" + ], + + "DASHBOARD" => "Painel de Controlo", + "DELETE_MASTER" => "Não pode apagar a conta principal!", + "DELETION_SUCCESSFUL" => "Utilizador {{user_name}} foi removido com sucesso.", + "DETAILS_UPDATED" => "Detalhes de conta atualizados para o utilizador {{user_name}}", + "DISABLE_MASTER" => "Não pode desativar a conta principal!", + "DISABLE_SUCCESSFUL" => "Conta do utilizador {{user_name}} foi desativada com sucesso.", + + "ENABLE_SUCCESSFUL" => "Conta do utilizador {{user_name}} foi ativada com sucesso.", + + "GROUP" => [ + 1 => "Grupo", + 2 => "Grupos", + + "CREATE" => "Criar grupo", + "CREATION_SUCCESSFUL" => "Grupo criado com sucesso", + "DELETE" => "Remover grupo", + "DELETION_SUCCESSFUL" => "Grupo removido com sucesso", + "DELETE_CONFIRM" => "Tem a certeza que pretende remover o grupo {{name}}?", + "DELETE_YES" => "Sim, remover grupo", + "EDIT" => "Editar grupo", + "ICON" => "Icon do grupo", + "ICON_EXPLAIN" => "Icon para membros do grupo", + "INFO_PAGE" => "Página informativa do grupo {{name}}", + //"MANAGE" => "Manage group", + "NAME" => "Nome do grupo", + "NAME_EXPLAIN" => "Por favor introduza um nome para o grupo", + "PAGE_DESCRIPTION" => "Lista de grupos do site. Contém opções para editar e remover grupos." + ], + + "MANUALLY_ACTIVATED" => "A conta de {{user_name}} foi ativada manualmente.", + "MASTER_ACCOUNT_EXISTS" => "A contra principal já existe!", + "MIGRATION" => [ + "REQUIRED" => "É necessário uma atualização da base de dados." + ], + + "PERMISSION" => [ + 1 => "Permissão", + 2 => "Permissões", + + "ASSIGN_NEW" => "Atribuir nova permissão", + "HOOK_CONDITION" => "Hook/Condições", + "MANAGE" => "Gerir permissões", + "PAGE_DESCRIPTION" => "Lista de permissões do site. Contém opções para editar e remover permissões.", + "UPDATE" => "Atualizar permissões" + ], + + "ROLE" => [ + 1 => "Cargo", + 2 => "Cargos", + + "ASSIGN_NEW" => "Atribuir novo cargo", + "CREATE" => "Criar cargo", + "CREATION_SUCCESSFUL" => "Cargo criado com sucesso", + "DELETE" => "Remover cargo", + "DELETION_SUCCESSFUL" => "Cargo removido com sucesso", + "DELETE_CONFIRM" => "Tem a certeza que pretende remover o cargo {{name}}?", + "DELETE_YES" => "Sim, remover cargo", + "EDIT" => "Editar cargo", + "INFO_PAGE" => "Página informativa do cargo {{name}}", + "MANAGE" => "Gerir cargos", + "NAME" => "Nome", + "NAME_EXPLAIN" => "Por favor introduza um nome para o cargo", + "PAGE_DESCRIPTION" => "Lista de cargos do site. Contém opções para editar e remover cargos.", + "UPDATE" => "Atualizar cargos", + "UPDATED" => "Cargo {{name}} atualizado" + ], + + "SYSTEM_INFO" => [ + "@TRANSLATION" => "Informação do sistema", + + "DB_NAME" => "Nome da base de dados", + "DB_VERSION" => "Versão da base de dados", + "DIRECTORY" => "Diretório do projeto", + "PHP_VERSION" => "Versão PHP", + "SERVER" => "Software do servidor web", + "SPRINKLES" => "Sprinkles carregados", + "UF_VERSION" => "Versão do UserFrosting", + "URL" => "Raiz (url) do site" + ], + + "USER" => [ + 1 => "Utilizador", + 2 => "Utilizadores", + + "ADMIN" => [ + "CHANGE_PASSWORD" => "Alterar password", + "SEND_PASSWORD_LINK" => "Enviar um link ao utilizador que lhe permita escolher a sua password", + "SET_PASSWORD" => "Definir a password do utilizador como" + ], + + "ACTIVATE" => "Ativar utilizador", + "CREATE" => "Criar utilizador", + "DELETE" => "Remover utilizador", + "DELETE_CONFIRM" => "Tem a certeza que pretende remover o utilizador {{name}}?", + "DELETE_YES" => "Sim, remover utilizador", + "DISABLE" => "Desativar utilizador", + "EDIT" => "Editar utilizador", + "ENABLE" => "Ativar utilizador", + "INFO_PAGE" => "Página informativa do utilizador {{name}}", + "PAGE_DESCRIPTION" => "Lista de utilizadores do site. Contém opções para editar detalhes, ativar/desativar utilizadores e outras.", + "LATEST" => "Últimos Utilizadores", + "VIEW_ALL" => "Ver todos os utilizadores" + ], + "X_USER" => [ + 0 => "Nenhum utilizador", + 1 => "{{plural}} utilizador", + 2 => "{{plural}} utilizadores" + ] +]; diff --git a/main/app/sprinkles/admin/locale/ru_RU/messages.php b/main/app/sprinkles/admin/locale/ru_RU/messages.php index c0e018d..63a4a7f 100644 --- a/main/app/sprinkles/admin/locale/ru_RU/messages.php +++ b/main/app/sprinkles/admin/locale/ru_RU/messages.php @@ -1,160 +1,160 @@ - [ - 1 => "Активность", - 2 => "Активность", - - "LAST" => "Последняя активность", - "PAGE" => "Список действий пользователя", - "TIME" => "Время действия" - ], - - "CACHE" => [ - "CLEAR" => "Очистить кэш", - "CLEAR_CONFIRM" => "Уверены, что хотите очистить кэш сайта?", - "CLEAR_CONFIRM_YES" => "Да, очистить кэш", - "CLEARED" => "Кэш успешно очищен !" - ], - - "DASHBOARD" => "Панель управления", - "NO_FEATURES_YET" => "Похоже, некоторые функции не были настроены для этого аккаунта... пока. Возможно, они еще не реализованы, или, может быть, кто-то забыл дать вам доступ. В любом случае, мы рады вас видеть здесь!", - "DELETE_MASTER" => "Нельзя удалить главный аккаунт!", - "DELETION_SUCCESSFUL" => "Пользователь {{user_name}} был успешно удален.", - "DETAILS_UPDATED" => "Данные для аккаунта {{user_name}} обновлены", - "DISABLE_MASTER" => "Нельзя отключить главный аккаунт!", - "DISABLE_SELF" => "Вы не можете отключить собственный аккаунт!", - "DISABLE_SUCCESSFUL" => "Пользователь {{user_name}} был успешно отключен.", - - "ENABLE_SUCCESSFUL" => "Пользователь {{user_name}} был успешно включен.", - - "GROUP" => [ - 1 => "Группа", - 2 => "Группы", - - "CREATE" => "Создать группу", - "CREATION_SUCCESSFUL" => "Успешно создана группа {{name}}", - "DELETE" => "Удалить группу", - "DELETE_CONFIRM" => "Вы уверены, что вы хотите удалить группу {{name}}?", - "DELETE_DEFAULT" => "Нельзя удалить группу {{name}}, потому что это группа по умолчанию для новых пользователей.", - "DELETE_YES" => "Да, удалить группу", - "DELETION_SUCCESSFUL" => "Успешно удалена группа {{name}}", - "EDIT" => "Редактор группы", - "ICON" => "Значок группы", - "ICON_EXPLAIN" => "Значок для членов группы", - "INFO_PAGE" => "Описание группы {{name}}", - "MANAGE" => "Управление группой", - "NAME" => "Имя группы", - "NAME_EXPLAIN" => "Пожалуйста, введите имя группы", - "NOT_EMPTY" => "Вы не можете сделать это, потому что до сих пор есть пользователи, связанные с группой {{name}}.", - "PAGE_DESCRIPTION" => "Список групп для вашего сайта. Предоставляет инструменты управления для редактирования и удаления групп.", - "SUMMARY" => "Резюме группы", - "UPDATE" => "Информация обновлена для группы {{name}}" - ], - - "MANUALLY_ACTIVATED" => "{{user_name}} аккаунт был активирован вручную", - "MASTER_ACCOUNT_EXISTS" => "Мастер-аккаунт уже существует!", - "MIGRATION" => [ - "REQUIRED" => "Необходимо обновление базы данных" - ], - - "PERMISSION" => [ - 1 => "Доступ", - 2 => "Права доступа", - - "ASSIGN_NEW" => "Назначить новые права", - "HOOK_CONDITION" => "Привязки/Условия", - "ID" => "ID доступа", - "INFO_PAGE" => "Информация о доступах для '{{name}}'", - "MANAGE" => "Управление правами", - "NOTE_READ_ONLY" => "Пожалуйста, обратите внимание: права и доступы считаются \"частью кода\" и не могут быть изменены через интерфейс. Чтобы добавить, удалить или изменить доступы, нужно будет использовать сайт базы данных миграции.", - "PAGE_DESCRIPTION" => "Список прав доступа для вашего сайта. Предоставляет инструменты управления для редактирования и удаления прав.", - "SUMMARY" => "Сводка доступов", - "UPDATE" => "Обновление прав", - "VIA_ROLES" => "Имеет права через роли" - ], - - "ROLE" => [ - 1 => "Роль", - 2 => "Роли", - - "ASSIGN_NEW" => "Назначение новой роли", - "CREATE" => "Создать роль", - "CREATION_SUCCESSFUL" => "Успешно создана роль {{name}}", - "DELETE" => "Удалить роль", - "DELETE_CONFIRM" => "Вы уверены, что вы хотите удалить роль {{name}}?", - "DELETE_DEFAULT" => "Невозможно удалить роль {{name}}, потому что это роль по умолчанию для новых пользователей.", - "DELETE_YES" => "Да, удалить роль", - "DELETION_SUCCESSFUL" => "Успешно удалена роль {{name}}", - "EDIT" => "Изменить роль", - "HAS_USERS" => "Вы не можете сделать это, потому что до сих пор есть пользователи, имеющие роль {{name}}.", - "INFO_PAGE" => "Информации роли для {{name}}", - "MANAGE" => "Управление ролями", - "NAME" => "Имя", - "NAME_EXPLAIN" => "Пожалуйста, укажите имя для роли", - "NAME_IN_USE" => "Роль с именем {{name}} уже существует", - "PAGE_DESCRIPTION" => "Список ролей для вашего сайта. Предоставляет инструменты управления для редактирования и удаления ролей.", - "PERMISSIONS_UPDATED" => "Права обновлены для роли {{name}}", - "SUMMARY" => "Основная информация", - "UPDATED" => "Информация для роли {{name}}" - ], - - "SYSTEM_INFO" => [ - "@TRANSLATION" => "Системная информация", - - "DB_NAME" => "Имя базы данных", - "DB_VERSION" => "Версия базы данных", - "DIRECTORY" => "Каталог проекта", - "PHP_VERSION" => "Версия PHP", - "SERVER" => "ПО Сервера", - "SPRINKLES" => "Загружены модули", - "UF_VERSION" => "Версия UserFrosting", - "URL" => "URL-адрес сайта" - ], - - "TOGGLE_COLUMNS" => "Переключатель столбцов", - - "USER" => [ - 1 => "Пользователь", - 2 => "Пользователи", - - "ADMIN" => [ - "CHANGE_PASSWORD" => "Сменить пароль пользователя", - "SEND_PASSWORD_LINK" => "Отправить пользователю ссылку, которая позволит выбрать свой собственный пароль", - "SET_PASSWORD" => "Установите пароль пользователя как" - ], - - "ACTIVATE" => "Активировать пользователя", - "CREATE" => "Создать пользователя", - "CREATED" => "Пользователь {{user_name}} был успешно создан", - "DELETE" => "Удалить пользователя", - "DELETE_CONFIRM" => "Вы уверены, что вы хотите удалить пользователя {{name}}?", - "DELETE_YES" => "Да, удалить пользователя", - "DELETED" => "Пользователь удален", - "DISABLE" => "Отключить пользователя", - "EDIT" => "Изменить пользователя", - "ENABLE" => "Включить пользователя", - "INFO_PAGE" => "Информация о пользователе для {{name}}", - "LATEST" => "Последние пользователи", - "PAGE_DESCRIPTION" => "Список пользователей для вашего сайта. Предоставляет средства управления, включая возможность редактирования сведений о пользователях, ручной активации пользователей, включения/отключения пользователей и многое другое.", - "SUMMARY" => "Сводка аккаунта", - "VIEW_ALL" => "Все пользователи", - "WITH_PERMISSION" => "Пользователи с этим доступом" - ], - "X_USER" => [ - 0 => "Нет пользователей", - 1 => "{{plural}} пользователя", - 2 => "{{plural}} пользователей" - ] -]; + [ + 1 => "Активность", + 2 => "Активность", + + "LAST" => "Последняя активность", + "PAGE" => "Список действий пользователя", + "TIME" => "Время действия" + ], + + "CACHE" => [ + "CLEAR" => "Очистить кэш", + "CLEAR_CONFIRM" => "Уверены, что хотите очистить кэш сайта?", + "CLEAR_CONFIRM_YES" => "Да, очистить кэш", + "CLEARED" => "Кэш успешно очищен !" + ], + + "DASHBOARD" => "Панель управления", + "NO_FEATURES_YET" => "Похоже, некоторые функции не были настроены для этого аккаунта... пока. Возможно, они еще не реализованы, или, может быть, кто-то забыл дать вам доступ. В любом случае, мы рады вас видеть здесь!", + "DELETE_MASTER" => "Нельзя удалить главный аккаунт!", + "DELETION_SUCCESSFUL" => "Пользователь {{user_name}} был успешно удален.", + "DETAILS_UPDATED" => "Данные для аккаунта {{user_name}} обновлены", + "DISABLE_MASTER" => "Нельзя отключить главный аккаунт!", + "DISABLE_SELF" => "Вы не можете отключить собственный аккаунт!", + "DISABLE_SUCCESSFUL" => "Пользователь {{user_name}} был успешно отключен.", + + "ENABLE_SUCCESSFUL" => "Пользователь {{user_name}} был успешно включен.", + + "GROUP" => [ + 1 => "Группа", + 2 => "Группы", + + "CREATE" => "Создать группу", + "CREATION_SUCCESSFUL" => "Успешно создана группа {{name}}", + "DELETE" => "Удалить группу", + "DELETE_CONFIRM" => "Вы уверены, что вы хотите удалить группу {{name}}?", + "DELETE_DEFAULT" => "Нельзя удалить группу {{name}}, потому что это группа по умолчанию для новых пользователей.", + "DELETE_YES" => "Да, удалить группу", + "DELETION_SUCCESSFUL" => "Успешно удалена группа {{name}}", + "EDIT" => "Редактор группы", + "ICON" => "Значок группы", + "ICON_EXPLAIN" => "Значок для членов группы", + "INFO_PAGE" => "Описание группы {{name}}", + "MANAGE" => "Управление группой", + "NAME" => "Имя группы", + "NAME_EXPLAIN" => "Пожалуйста, введите имя группы", + "NOT_EMPTY" => "Вы не можете сделать это, потому что до сих пор есть пользователи, связанные с группой {{name}}.", + "PAGE_DESCRIPTION" => "Список групп для вашего сайта. Предоставляет инструменты управления для редактирования и удаления групп.", + "SUMMARY" => "Резюме группы", + "UPDATE" => "Информация обновлена для группы {{name}}" + ], + + "MANUALLY_ACTIVATED" => "{{user_name}} аккаунт был активирован вручную", + "MASTER_ACCOUNT_EXISTS" => "Мастер-аккаунт уже существует!", + "MIGRATION" => [ + "REQUIRED" => "Необходимо обновление базы данных" + ], + + "PERMISSION" => [ + 1 => "Доступ", + 2 => "Права доступа", + + "ASSIGN_NEW" => "Назначить новые права", + "HOOK_CONDITION" => "Привязки/Условия", + "ID" => "ID доступа", + "INFO_PAGE" => "Информация о доступах для '{{name}}'", + "MANAGE" => "Управление правами", + "NOTE_READ_ONLY" => "Пожалуйста, обратите внимание: права и доступы считаются \"частью кода\" и не могут быть изменены через интерфейс. Чтобы добавить, удалить или изменить доступы, нужно будет использовать сайт базы данных миграции.", + "PAGE_DESCRIPTION" => "Список прав доступа для вашего сайта. Предоставляет инструменты управления для редактирования и удаления прав.", + "SUMMARY" => "Сводка доступов", + "UPDATE" => "Обновление прав", + "VIA_ROLES" => "Имеет права через роли" + ], + + "ROLE" => [ + 1 => "Роль", + 2 => "Роли", + + "ASSIGN_NEW" => "Назначение новой роли", + "CREATE" => "Создать роль", + "CREATION_SUCCESSFUL" => "Успешно создана роль {{name}}", + "DELETE" => "Удалить роль", + "DELETE_CONFIRM" => "Вы уверены, что вы хотите удалить роль {{name}}?", + "DELETE_DEFAULT" => "Невозможно удалить роль {{name}}, потому что это роль по умолчанию для новых пользователей.", + "DELETE_YES" => "Да, удалить роль", + "DELETION_SUCCESSFUL" => "Успешно удалена роль {{name}}", + "EDIT" => "Изменить роль", + "HAS_USERS" => "Вы не можете сделать это, потому что до сих пор есть пользователи, имеющие роль {{name}}.", + "INFO_PAGE" => "Информации роли для {{name}}", + "MANAGE" => "Управление ролями", + "NAME" => "Имя", + "NAME_EXPLAIN" => "Пожалуйста, укажите имя для роли", + "NAME_IN_USE" => "Роль с именем {{name}} уже существует", + "PAGE_DESCRIPTION" => "Список ролей для вашего сайта. Предоставляет инструменты управления для редактирования и удаления ролей.", + "PERMISSIONS_UPDATED" => "Права обновлены для роли {{name}}", + "SUMMARY" => "Основная информация", + "UPDATED" => "Информация для роли {{name}}" + ], + + "SYSTEM_INFO" => [ + "@TRANSLATION" => "Системная информация", + + "DB_NAME" => "Имя базы данных", + "DB_VERSION" => "Версия базы данных", + "DIRECTORY" => "Каталог проекта", + "PHP_VERSION" => "Версия PHP", + "SERVER" => "ПО Сервера", + "SPRINKLES" => "Загружены модули", + "UF_VERSION" => "Версия UserFrosting", + "URL" => "URL-адрес сайта" + ], + + "TOGGLE_COLUMNS" => "Переключатель столбцов", + + "USER" => [ + 1 => "Пользователь", + 2 => "Пользователи", + + "ADMIN" => [ + "CHANGE_PASSWORD" => "Сменить пароль пользователя", + "SEND_PASSWORD_LINK" => "Отправить пользователю ссылку, которая позволит выбрать свой собственный пароль", + "SET_PASSWORD" => "Установите пароль пользователя как" + ], + + "ACTIVATE" => "Активировать пользователя", + "CREATE" => "Создать пользователя", + "CREATED" => "Пользователь {{user_name}} был успешно создан", + "DELETE" => "Удалить пользователя", + "DELETE_CONFIRM" => "Вы уверены, что вы хотите удалить пользователя {{name}}?", + "DELETE_YES" => "Да, удалить пользователя", + "DELETED" => "Пользователь удален", + "DISABLE" => "Отключить пользователя", + "EDIT" => "Изменить пользователя", + "ENABLE" => "Включить пользователя", + "INFO_PAGE" => "Информация о пользователе для {{name}}", + "LATEST" => "Последние пользователи", + "PAGE_DESCRIPTION" => "Список пользователей для вашего сайта. Предоставляет средства управления, включая возможность редактирования сведений о пользователях, ручной активации пользователей, включения/отключения пользователей и многое другое.", + "SUMMARY" => "Сводка аккаунта", + "VIEW_ALL" => "Все пользователи", + "WITH_PERMISSION" => "Пользователи с этим доступом" + ], + "X_USER" => [ + 0 => "Нет пользователей", + 1 => "{{plural}} пользователя", + 2 => "{{plural}} пользователей" + ] +]; diff --git a/main/app/sprinkles/admin/locale/th_TH/messages.php b/main/app/sprinkles/admin/locale/th_TH/messages.php index 51de7c9..c07907d 100644 --- a/main/app/sprinkles/admin/locale/th_TH/messages.php +++ b/main/app/sprinkles/admin/locale/th_TH/messages.php @@ -1,134 +1,134 @@ - [ - 1 => "กิจกรรม", - 2 => "กิจกรรม", - - "LAST" => "กิจกรรมล่าสุด", - "PAGE" => "รายการกิจกรรมของผู้ใช้", - "TIME" => "เวลาที่ทำกิจกรรม" - ], - - "CACHE" => [ - "CLEAR" => "ล้างแคช", - "CLEAR_CONFIRM" => "คุณแน่ใจหรือที่จะล้างแคชของเว็บ?", - "CLEAR_CONFIRM_YES" => "ใช่ ล้างแคชเลย", - "CLEARED" => "ล้างแคชเรียบร้อยแล้ว!" - ], - - "DASHBOARD" => "แผงควบคุม", - "DELETE_MASTER" => "คุณไม่สามารถลบบัญชีหลักได้!", - "DELETION_SUCCESSFUL" => "ลบผู้ใช้ {{user_name}} เรียบร้อยแล้ว", - "DETAILS_UPDATED" => "ปรับปรุงรายระเอียดบัญชีให้กับ {{user_name}} แล้ว", - "DISABLE_MASTER" => "คุณไม่สามารถปิดการใช้งานบัญชีหลัก!", - "DISABLE_SUCCESSFUL" => "ปิดการใช้งานบัญชีของผู้ใช้ {{user_name}} เรียบร้อยแล้ว", - - "ENABLE_SUCCESSFUL" => "เปิดการใช้งานบัญชีของผู้ใช้ {{user_name}} เรียบร้อยแล้ว", - - "GROUP" => [ - 1 => "กลุ่ม", - 2 => "กลุ่ม", - - "CREATE" => "สร้างกลุ่ม", - "DELETE" => "ลบกลุ่ม", - "DELETE_CONFIRM" => "คุณแน่ใจหรือที่จะลบกลุ่ม {{name}}?", - "DELETE_YES" => "ใช่ ลบกลุ่มนี้เลย", - "EDIT" => "แก้ไขกลุ่ม", - "ICON" => "ไอคอนกลุ่ม", - "ICON_EXPLAIN" => "ไอคอนสำหรับสมาชิกกลุ่ม", - "INFO_PAGE" => "หน้าข้อมูลกลุ่มสำหรับ {{name}}", - //"MANAGE" => "Manage group", - "NAME" => "ชื่อกลุ่ม", - "NAME_EXPLAIN" => "กรุณาตั้งชื่อสำหรับกลุ่มนี้", - "PAGE_DESCRIPTION" => "รายชื่อกลุ่มในเว็บของคุณ ประกอบไปด้วยเครื่องมือในการจัดการสำหรับการแก้ไขและลบกลุ่ม" - ], - - "MANUALLY_ACTIVATED" => "บัญชีของ {{user_name}} ได้เปิดใช้งานเองแล้ว", - "MASTER_ACCOUNT_EXISTS" => "มีบัญชีหลักอยู่แล้ว!", - "MIGRATION" => [ - "REQUIRED" => "ต้องการการปรับปรุงฐานข้อมูล" - ], - - "PERMISSION" => [ - 1 => "สิทธิการเข้าถึง", - 2 => "สิทธิการเข้าถึง", - - "ASSIGN_NEW" => "กำหนดสิทธิการเข้าถึงใหม่", - "HOOK_CONDITION" => "ข้อกำหนด/เงื่อนไข", - "MANAGE" => "จัดการสิทธิการเข้าถึง", - "PAGE_DESCRIPTION" => "รายการสิทธิการเข้าถึงในเว็บของคุณ ประกอบไปด้วยเครื่องมือในการจัดการสำหรับการแก้ไขและลบสิทธิการเข้าถึง", - "UPDATE" => "ปรับปรุงสิทธิการเข้าถึง" - ], - - "ROLE" => [ - 1 => "ตำแหน่ง", - 2 => "ตำแหน่ง", - - "ASSIGN_NEW" => "กำหนดตำแหน่งใหม่", - "CREATE" => "สร้างตำแหน่ง", - "DELETE" => "ลบตำแหน่ง", - "DELETE_CONFIRM" => "คุณแน่ใจหรือที่จะลบตำแหน่ง {{name}}?", - "DELETE_YES" => "ใช่ ลบตำแหน่งนี้เลย", - "EDIT" => "แก้ไขตำแหน่ง", - "INFO_PAGE" => "หน้าข้อมูลตำแหน่งสำหรับ {{name}}", - "MANAGE" => "จัดการตำแหน่ง", - "NAME" => "ชื่อ", - "NAME_EXPLAIN" => "กรุณาตั้งชื่อสำหรับตำแหน่งนี้", - "PAGE_DESCRIPTION" => "รายชื่อตำแหน่งในเว็บของคุณ ประกอบไปด้วยเครื่องมือในการจัดการสำหรับแก้ไขและลบตำแหน่ง", - "UPDATED" => "ปรับปรุงตำแหน่ง" - ], - - "SYSTEM_INFO" => [ - "@TRANSLATION" => "ข้อมูลระบบ", - - "DB_NAME" => "ชื่อฐานข้อมูล", - "DB_VERSION" => "เวอร์ชั่นฐานข้อมูล", - "DIRECTORY" => "ไดเรกทอรีของโปรเจค", - "PHP_VERSION" => "เวอร์ชั่น PHP", - "SERVER" => "ซอฟต์แวร์เว็บเซิร์ฟเวอร์", - "SPRINKLES" => "Sprinkles ที่ถูกโหลด", - "UF_VERSION" => "เวอร์ชั่น UserFrosting", - "URL" => "URL ของรากเว็บไซต์" - ], - - "USER" => [ - 1 => "ผู้ใช้", - 2 => "ผู้ใช้", - - "ADMIN" => [ - "CHANGE_PASSWORD" => "เปลี่ยนรหัสผ่านผู้ใช้", - "SEND_PASSWORD_LINK" => "ส่งลิงก์ที่จะอนุญาตให้ผู้ใช้เลือกรหัสผ่านเองให้กับผู้ใช้", - "SET_PASSWORD" => "ตั้งรหัสผ่านของผู้ใช้เป็น" - ], - - "ACTIVATE" => "เปิดใช้งานผู้ใช้", - "CREATE" => "สร้างผู้ใช้", - "DELETE" => "ลบผู้ใช้", - "DELETE_CONFIRM" => "คุณแน่ใจหรือที่จะลบผู้ใช้ {{name}}?", - "DELETE_YES" => "ใช่ ลบผู้ใช้นี้เลย", - "DISABLE" => "ปิดการใช้งานผู้ใช้", - "EDIT" => "แก้ไขผู้ใช้", - "ENABLE" => "เปิดการใช้งานผู้ใช้", - "INFO_PAGE" => "หน้าข้อมูลของผู้ใช้ {{name}}", - "PAGE_DESCRIPTION" => "รายชื่อผู้ใช้ในเว็บของคุณ ประกอบไปด้วยเครื่องมือสำหรับการจัดการ รวมทั้งความสามารถในการแก้ไขรายละเอียดผู้ใช้ การเปิดใช้งานผู้ใช้ การเปิด/ปิดบัญชีผู้ใช้และอื่น ๆ", - "LATEST" => "ผู้ใช้ล่าสุด", - "VIEW_ALL" => "ดูผู้ใช้ทั้งหมด" - ], - "X_USER" => [ - 0 => "ไม่มีผู้ใช้", - 1 => "{{plural}} ผู้ใช้", - 2 => "{{plural}} ผู้ใช้" - ] + [ + 1 => "กิจกรรม", + 2 => "กิจกรรม", + + "LAST" => "กิจกรรมล่าสุด", + "PAGE" => "รายการกิจกรรมของผู้ใช้", + "TIME" => "เวลาที่ทำกิจกรรม" + ], + + "CACHE" => [ + "CLEAR" => "ล้างแคช", + "CLEAR_CONFIRM" => "คุณแน่ใจหรือที่จะล้างแคชของเว็บ?", + "CLEAR_CONFIRM_YES" => "ใช่ ล้างแคชเลย", + "CLEARED" => "ล้างแคชเรียบร้อยแล้ว!" + ], + + "DASHBOARD" => "แผงควบคุม", + "DELETE_MASTER" => "คุณไม่สามารถลบบัญชีหลักได้!", + "DELETION_SUCCESSFUL" => "ลบผู้ใช้ {{user_name}} เรียบร้อยแล้ว", + "DETAILS_UPDATED" => "ปรับปรุงรายระเอียดบัญชีให้กับ {{user_name}} แล้ว", + "DISABLE_MASTER" => "คุณไม่สามารถปิดการใช้งานบัญชีหลัก!", + "DISABLE_SUCCESSFUL" => "ปิดการใช้งานบัญชีของผู้ใช้ {{user_name}} เรียบร้อยแล้ว", + + "ENABLE_SUCCESSFUL" => "เปิดการใช้งานบัญชีของผู้ใช้ {{user_name}} เรียบร้อยแล้ว", + + "GROUP" => [ + 1 => "กลุ่ม", + 2 => "กลุ่ม", + + "CREATE" => "สร้างกลุ่ม", + "DELETE" => "ลบกลุ่ม", + "DELETE_CONFIRM" => "คุณแน่ใจหรือที่จะลบกลุ่ม {{name}}?", + "DELETE_YES" => "ใช่ ลบกลุ่มนี้เลย", + "EDIT" => "แก้ไขกลุ่ม", + "ICON" => "ไอคอนกลุ่ม", + "ICON_EXPLAIN" => "ไอคอนสำหรับสมาชิกกลุ่ม", + "INFO_PAGE" => "หน้าข้อมูลกลุ่มสำหรับ {{name}}", + //"MANAGE" => "Manage group", + "NAME" => "ชื่อกลุ่ม", + "NAME_EXPLAIN" => "กรุณาตั้งชื่อสำหรับกลุ่มนี้", + "PAGE_DESCRIPTION" => "รายชื่อกลุ่มในเว็บของคุณ ประกอบไปด้วยเครื่องมือในการจัดการสำหรับการแก้ไขและลบกลุ่ม" + ], + + "MANUALLY_ACTIVATED" => "บัญชีของ {{user_name}} ได้เปิดใช้งานเองแล้ว", + "MASTER_ACCOUNT_EXISTS" => "มีบัญชีหลักอยู่แล้ว!", + "MIGRATION" => [ + "REQUIRED" => "ต้องการการปรับปรุงฐานข้อมูล" + ], + + "PERMISSION" => [ + 1 => "สิทธิการเข้าถึง", + 2 => "สิทธิการเข้าถึง", + + "ASSIGN_NEW" => "กำหนดสิทธิการเข้าถึงใหม่", + "HOOK_CONDITION" => "ข้อกำหนด/เงื่อนไข", + "MANAGE" => "จัดการสิทธิการเข้าถึง", + "PAGE_DESCRIPTION" => "รายการสิทธิการเข้าถึงในเว็บของคุณ ประกอบไปด้วยเครื่องมือในการจัดการสำหรับการแก้ไขและลบสิทธิการเข้าถึง", + "UPDATE" => "ปรับปรุงสิทธิการเข้าถึง" + ], + + "ROLE" => [ + 1 => "ตำแหน่ง", + 2 => "ตำแหน่ง", + + "ASSIGN_NEW" => "กำหนดตำแหน่งใหม่", + "CREATE" => "สร้างตำแหน่ง", + "DELETE" => "ลบตำแหน่ง", + "DELETE_CONFIRM" => "คุณแน่ใจหรือที่จะลบตำแหน่ง {{name}}?", + "DELETE_YES" => "ใช่ ลบตำแหน่งนี้เลย", + "EDIT" => "แก้ไขตำแหน่ง", + "INFO_PAGE" => "หน้าข้อมูลตำแหน่งสำหรับ {{name}}", + "MANAGE" => "จัดการตำแหน่ง", + "NAME" => "ชื่อ", + "NAME_EXPLAIN" => "กรุณาตั้งชื่อสำหรับตำแหน่งนี้", + "PAGE_DESCRIPTION" => "รายชื่อตำแหน่งในเว็บของคุณ ประกอบไปด้วยเครื่องมือในการจัดการสำหรับแก้ไขและลบตำแหน่ง", + "UPDATED" => "ปรับปรุงตำแหน่ง" + ], + + "SYSTEM_INFO" => [ + "@TRANSLATION" => "ข้อมูลระบบ", + + "DB_NAME" => "ชื่อฐานข้อมูล", + "DB_VERSION" => "เวอร์ชั่นฐานข้อมูล", + "DIRECTORY" => "ไดเรกทอรีของโปรเจค", + "PHP_VERSION" => "เวอร์ชั่น PHP", + "SERVER" => "ซอฟต์แวร์เว็บเซิร์ฟเวอร์", + "SPRINKLES" => "Sprinkles ที่ถูกโหลด", + "UF_VERSION" => "เวอร์ชั่น UserFrosting", + "URL" => "URL ของรากเว็บไซต์" + ], + + "USER" => [ + 1 => "ผู้ใช้", + 2 => "ผู้ใช้", + + "ADMIN" => [ + "CHANGE_PASSWORD" => "เปลี่ยนรหัสผ่านผู้ใช้", + "SEND_PASSWORD_LINK" => "ส่งลิงก์ที่จะอนุญาตให้ผู้ใช้เลือกรหัสผ่านเองให้กับผู้ใช้", + "SET_PASSWORD" => "ตั้งรหัสผ่านของผู้ใช้เป็น" + ], + + "ACTIVATE" => "เปิดใช้งานผู้ใช้", + "CREATE" => "สร้างผู้ใช้", + "DELETE" => "ลบผู้ใช้", + "DELETE_CONFIRM" => "คุณแน่ใจหรือที่จะลบผู้ใช้ {{name}}?", + "DELETE_YES" => "ใช่ ลบผู้ใช้นี้เลย", + "DISABLE" => "ปิดการใช้งานผู้ใช้", + "EDIT" => "แก้ไขผู้ใช้", + "ENABLE" => "เปิดการใช้งานผู้ใช้", + "INFO_PAGE" => "หน้าข้อมูลของผู้ใช้ {{name}}", + "PAGE_DESCRIPTION" => "รายชื่อผู้ใช้ในเว็บของคุณ ประกอบไปด้วยเครื่องมือสำหรับการจัดการ รวมทั้งความสามารถในการแก้ไขรายละเอียดผู้ใช้ การเปิดใช้งานผู้ใช้ การเปิด/ปิดบัญชีผู้ใช้และอื่น ๆ", + "LATEST" => "ผู้ใช้ล่าสุด", + "VIEW_ALL" => "ดูผู้ใช้ทั้งหมด" + ], + "X_USER" => [ + 0 => "ไม่มีผู้ใช้", + 1 => "{{plural}} ผู้ใช้", + 2 => "{{plural}} ผู้ใช้" + ] ]; \ No newline at end of file diff --git a/main/app/sprinkles/admin/locale/tr/messages.php b/main/app/sprinkles/admin/locale/tr/messages.php index de9f7e3..d8d90b0 100644 --- a/main/app/sprinkles/admin/locale/tr/messages.php +++ b/main/app/sprinkles/admin/locale/tr/messages.php @@ -1,160 +1,160 @@ - [ - 1 => "Etkinlik", - 2 => "Etkinlikler", - - "LAST" => "Son Etkinlik", - "PAGE" => "Kullanıcı etkinliklerinin listesi", - "TIME" => "Aktivite zamanı" - ], - - "CACHE" => [ - "CLEAR" => "Önbelleği temizle", - "CLEAR_CONFIRM" => "Site önbelleğini temizlemek istediğine emin misin?", - "CLEAR_CONFIRM_YES" => "Evet, önbelleği temizle", - "CLEARED" => "Önbellek temizlenmesi başarıyla tamamlandı!" - ], - - "DASHBOARD" => "Pano", - "NO_FEATURES_YET" => "Bu hesap için herhangi bir özellik ayarlanmış gibi görünmüyor... Henüz. Belki de henüz uygulanmadı, veya belki birisi size erişim vermeyi unutttu. Her iki durumda da sizi aramızda gördüğümüze sevindik!", - "DELETE_MASTER" => "Ana hesabı silemezsiniz!", - "DELETION_SUCCESSFUL" => "Kullanıcı{{user_name}} silme işlemi başarıyla tamamlandı.", - "DETAILS_UPDATED" => "Kullanıcı{{user_name}} için güncel hesap detayları", - "DISABLE_MASTER" => "Ana hesabı devre dışı bırakamazsınız!", - "DISABLE_SELF" => "Kendi hesabınızın etkinliğini sonlandıramazsınız!", - "DISABLE_SUCCESSFUL" => "Kullanıcı hesabın {{user_name}}başarıyla devre dışı bırakıldı.", - - "ENABLE_SUCCESSFUL" => "Kullanıcı hesabın{{user_name}}başarıyla etkinleştirildi.", - - "GROUP" => [ - 1 => "Grup", - 2 => "Grıplar", - - "CREATE" => "Grup oluşturmak", - "CREATION_SUCCESSFUL" => "Grup oluşturma başarılı{{name}}", - "DELETE" => "Grubu sil", - "DELETE_CONFIRM" => "Grubu silmek istediğine emin misin{{name}}?", - "DELETE_DEFAULT" => "Grubu silemezsin{{name}} çünkü o yeni kayıtlanan kullanıcılar için varsayılan grup.", - "DELETE_YES" => "Evet, grubu sil", - "DELETION_SUCCESSFUL" => "Grup silme başarılı{{name}}", - "EDIT" => "Grubu düzenle", - "ICON" => "Grup ikonu", - "ICON_EXPLAIN" => "Grup iyileri için ikon", - "INFO_PAGE" => "Grup bilgisi sayfası {{name}} için", - "MANAGE" => "Grubu yönet", - "NAME" => "Grup adı", - "NAME_EXPLAIN" => "Lütfen grup için bir isim giriniz", - "NOT_EMPTY" => "Bunu yapamazsınız çünkü hala grupla ilişkili kullanıcılar var{{name}}.", - "PAGE_DESCRIPTION" => "Siten için grupların bir listesi. Grupları silmek ve düzenlemek için yönetim araçları sağlar.", - "SUMMARY" => "Grup özeti", - "UPDATE" => "Grup için detaylar güncellendi{{name}}" - ], - - "MANUALLY_ACTIVATED" => "{{user_name}}'ın hesabı el ile aktifleştirildi", - "MASTER_ACCOUNT_EXISTS" => "Ana hesap zaten mevcut!", - "MIGRATION" => [ - "REQUIRED" => "Veritabanını güncellemek gerek" - ], - - "PERMISSION" => [ - 1 => "İzin", - 2 => "İzinler", - - "ASSIGN_NEW" => "Yeni izin ata", - "HOOK_CONDITION" => "Kanca/Koşullar", - "ID" => "İzin Kimliği", - "INFO_PAGE" => "{{name}} için izin bilgi sayfası", - "MANAGE" => "İzinleri yönet", - "NOTE_READ_ONLY" => "Lütfen Dikkat izinler ''bir kodun parçası'' olarak kabul edilir ve arayüz aracılığıyla değiştirilemez. İzln eklemek, kaldırmak ya da değiştirmek için site bakımcıları bir veritabanı geçişi kullanmalıdır", - "PAGE_DESCRIPTION" => "Siteniz için izinlerin bir listesi. Düzenleme yapmak ve izinleri kaldırmak yönetim araçları temin eder.", - "SUMMARY" => "İzin Özeti", - "UPDATE" => "İzinlerin Güncellenmesi", - "VIA_ROLES" => "Roller ile izin alımı" - ], - - "ROLE" => [ - 1 => "Rol", - 2 => "Roller", - - "ASSIGN_NEW" => "Yeni rol ata", - "CREATE" => "Rol oluştur", - "CREATION_SUCCESSFUL" => "Rol oluşturma başarılı {{name}}", - "DELETE" => "Rolü sil", - "DELETE_CONFIRM" => "Rolü silmek istediğine emin misin {{name}}?", - "DELETE_DEFAULT" => "Rolü silemezsin {{name}} çünkü o kaydolmuş kullanıcılar için varsayılan bir rol.", - "DELETE_YES" => "Evet, rolü sil", - "DELETION_SUCCESSFUL" => "Rol başarıyla silindi{{name}}", - "EDIT" => "Rolü düzenle", - "HAS_USERS" => "Bunu yapamazsın çünkü hala bu rol ile bağlantılı kullanıcılar var{{name}}.", - "INFO_PAGE" => "{{name}} için rol bilgi sayfası", - "MANAGE" => "Rolleri yönet", - "NAME" => "Ad", - "NAME_EXPLAIN" => "Lütfen rol için bir ad giriniz", - "NAME_IN_USE" => "{{name}} adında bir rol zaten mevcut", - "PAGE_DESCRIPTION" => "Siteniz için rollerin bir listesi. Düzenlemek ve rolleri silmek için yönetim araçları sağlar.", - "PERMISSIONS_UPDATED" => "Rol için izinler güncellendi{{name}}", - "SUMMARY" => "Rol özeti", - "UPDATED" => "Rol için detaylar güncellendi{{name}}" - ], - - "SYSTEM_INFO" => [ - "@TRANSLATION" => "Sistem bilgisi", - - "DB_NAME" => "Veritabanı adı", - "DB_VERSION" => "Veritabanı sürümü", - "DIRECTORY" => "Proje dizini", - "PHP_VERSION" => "PHP sürümü", - "SERVER" => "Web sunucu yazılımı", - "SPRINKLES" => "Yüklü serpintiler", - "UF_VERSION" => "UserFrosting sürümü", - "URL" => "Site kök url" - ], - - "TOGGLE_COLUMNS" => "Sütünları değiştirme", - - "USER" => [ - 1 => "Kullanıcı", - 2 => "Kullanıcılar", - - "ADMIN" => [ - "CHANGE_PASSWORD" => "Kullanıcı şifresini değiştir", - "SEND_PASSWORD_LINK" => "Kullanıcıya kendi şifresini seçebileceği bir bağlantı gönder", - "SET_PASSWORD" => "Kullanıcının şifresi olarak ayarla" - ], - - "ACTIVATE" => "Aktif Kullanıcı", - "CREATE" => "Kullanıcı oluştur", - "CREATED" => "Kullanıcı {{user_name}} başarıyla oluşturuldu", - "DELETE" => "Kullanıcıyı sil", - "DELETE_CONFIRM" => "Kullanıcıyı silmek istediğinden emin misin?{{name}}?", - "DELETE_YES" => "Evet, kullanıcıyı sil", - "DELETED" => "Kullanıcı silindi", - "DISABLE" => "Kullanıcı devre dışı", - "EDIT" => "Kullanıcıyı düzenle", - "ENABLE" => "Kullanıcı etkin", - "INFO_PAGE" => "{{name}} için kullanıcı bilgisi", - "LATEST" => "Son Kullanıcılar", - "PAGE_DESCRIPTION" => "Siten için kullanıcıların listesi. Kullanıcı detaylarını düzenlemek, elle kullanıcıları aktifleştirmek, kullanıcıları etkinleştirme/devre dışı bırakma, ve daha fazlası için yönetimsel araçlar sağlar.", - "SUMMARY" => "Hesap özeti", - "VIEW_ALL" => "Tüm kullanıcıları göster", - "WITH_PERMISSION" => "Bu izni olan kullanıcılar" - ], - "X_USER" => [ - 0 => "Kullanıcı yok", - 1 => "{{plural}} kullanıcı", - 2 => "{{plural}} kullanıcılar" - ] -]; + [ + 1 => "Etkinlik", + 2 => "Etkinlikler", + + "LAST" => "Son Etkinlik", + "PAGE" => "Kullanıcı etkinliklerinin listesi", + "TIME" => "Aktivite zamanı" + ], + + "CACHE" => [ + "CLEAR" => "Önbelleği temizle", + "CLEAR_CONFIRM" => "Site önbelleğini temizlemek istediğine emin misin?", + "CLEAR_CONFIRM_YES" => "Evet, önbelleği temizle", + "CLEARED" => "Önbellek temizlenmesi başarıyla tamamlandı!" + ], + + "DASHBOARD" => "Pano", + "NO_FEATURES_YET" => "Bu hesap için herhangi bir özellik ayarlanmış gibi görünmüyor... Henüz. Belki de henüz uygulanmadı, veya belki birisi size erişim vermeyi unutttu. Her iki durumda da sizi aramızda gördüğümüze sevindik!", + "DELETE_MASTER" => "Ana hesabı silemezsiniz!", + "DELETION_SUCCESSFUL" => "Kullanıcı{{user_name}} silme işlemi başarıyla tamamlandı.", + "DETAILS_UPDATED" => "Kullanıcı{{user_name}} için güncel hesap detayları", + "DISABLE_MASTER" => "Ana hesabı devre dışı bırakamazsınız!", + "DISABLE_SELF" => "Kendi hesabınızın etkinliğini sonlandıramazsınız!", + "DISABLE_SUCCESSFUL" => "Kullanıcı hesabın {{user_name}}başarıyla devre dışı bırakıldı.", + + "ENABLE_SUCCESSFUL" => "Kullanıcı hesabın{{user_name}}başarıyla etkinleştirildi.", + + "GROUP" => [ + 1 => "Grup", + 2 => "Grıplar", + + "CREATE" => "Grup oluşturmak", + "CREATION_SUCCESSFUL" => "Grup oluşturma başarılı{{name}}", + "DELETE" => "Grubu sil", + "DELETE_CONFIRM" => "Grubu silmek istediğine emin misin{{name}}?", + "DELETE_DEFAULT" => "Grubu silemezsin{{name}} çünkü o yeni kayıtlanan kullanıcılar için varsayılan grup.", + "DELETE_YES" => "Evet, grubu sil", + "DELETION_SUCCESSFUL" => "Grup silme başarılı{{name}}", + "EDIT" => "Grubu düzenle", + "ICON" => "Grup ikonu", + "ICON_EXPLAIN" => "Grup iyileri için ikon", + "INFO_PAGE" => "Grup bilgisi sayfası {{name}} için", + "MANAGE" => "Grubu yönet", + "NAME" => "Grup adı", + "NAME_EXPLAIN" => "Lütfen grup için bir isim giriniz", + "NOT_EMPTY" => "Bunu yapamazsınız çünkü hala grupla ilişkili kullanıcılar var{{name}}.", + "PAGE_DESCRIPTION" => "Siten için grupların bir listesi. Grupları silmek ve düzenlemek için yönetim araçları sağlar.", + "SUMMARY" => "Grup özeti", + "UPDATE" => "Grup için detaylar güncellendi{{name}}" + ], + + "MANUALLY_ACTIVATED" => "{{user_name}}'ın hesabı el ile aktifleştirildi", + "MASTER_ACCOUNT_EXISTS" => "Ana hesap zaten mevcut!", + "MIGRATION" => [ + "REQUIRED" => "Veritabanını güncellemek gerek" + ], + + "PERMISSION" => [ + 1 => "İzin", + 2 => "İzinler", + + "ASSIGN_NEW" => "Yeni izin ata", + "HOOK_CONDITION" => "Kanca/Koşullar", + "ID" => "İzin Kimliği", + "INFO_PAGE" => "{{name}} için izin bilgi sayfası", + "MANAGE" => "İzinleri yönet", + "NOTE_READ_ONLY" => "Lütfen Dikkat izinler ''bir kodun parçası'' olarak kabul edilir ve arayüz aracılığıyla değiştirilemez. İzln eklemek, kaldırmak ya da değiştirmek için site bakımcıları bir veritabanı geçişi kullanmalıdır", + "PAGE_DESCRIPTION" => "Siteniz için izinlerin bir listesi. Düzenleme yapmak ve izinleri kaldırmak yönetim araçları temin eder.", + "SUMMARY" => "İzin Özeti", + "UPDATE" => "İzinlerin Güncellenmesi", + "VIA_ROLES" => "Roller ile izin alımı" + ], + + "ROLE" => [ + 1 => "Rol", + 2 => "Roller", + + "ASSIGN_NEW" => "Yeni rol ata", + "CREATE" => "Rol oluştur", + "CREATION_SUCCESSFUL" => "Rol oluşturma başarılı {{name}}", + "DELETE" => "Rolü sil", + "DELETE_CONFIRM" => "Rolü silmek istediğine emin misin {{name}}?", + "DELETE_DEFAULT" => "Rolü silemezsin {{name}} çünkü o kaydolmuş kullanıcılar için varsayılan bir rol.", + "DELETE_YES" => "Evet, rolü sil", + "DELETION_SUCCESSFUL" => "Rol başarıyla silindi{{name}}", + "EDIT" => "Rolü düzenle", + "HAS_USERS" => "Bunu yapamazsın çünkü hala bu rol ile bağlantılı kullanıcılar var{{name}}.", + "INFO_PAGE" => "{{name}} için rol bilgi sayfası", + "MANAGE" => "Rolleri yönet", + "NAME" => "Ad", + "NAME_EXPLAIN" => "Lütfen rol için bir ad giriniz", + "NAME_IN_USE" => "{{name}} adında bir rol zaten mevcut", + "PAGE_DESCRIPTION" => "Siteniz için rollerin bir listesi. Düzenlemek ve rolleri silmek için yönetim araçları sağlar.", + "PERMISSIONS_UPDATED" => "Rol için izinler güncellendi{{name}}", + "SUMMARY" => "Rol özeti", + "UPDATED" => "Rol için detaylar güncellendi{{name}}" + ], + + "SYSTEM_INFO" => [ + "@TRANSLATION" => "Sistem bilgisi", + + "DB_NAME" => "Veritabanı adı", + "DB_VERSION" => "Veritabanı sürümü", + "DIRECTORY" => "Proje dizini", + "PHP_VERSION" => "PHP sürümü", + "SERVER" => "Web sunucu yazılımı", + "SPRINKLES" => "Yüklü serpintiler", + "UF_VERSION" => "UserFrosting sürümü", + "URL" => "Site kök url" + ], + + "TOGGLE_COLUMNS" => "Sütünları değiştirme", + + "USER" => [ + 1 => "Kullanıcı", + 2 => "Kullanıcılar", + + "ADMIN" => [ + "CHANGE_PASSWORD" => "Kullanıcı şifresini değiştir", + "SEND_PASSWORD_LINK" => "Kullanıcıya kendi şifresini seçebileceği bir bağlantı gönder", + "SET_PASSWORD" => "Kullanıcının şifresi olarak ayarla" + ], + + "ACTIVATE" => "Aktif Kullanıcı", + "CREATE" => "Kullanıcı oluştur", + "CREATED" => "Kullanıcı {{user_name}} başarıyla oluşturuldu", + "DELETE" => "Kullanıcıyı sil", + "DELETE_CONFIRM" => "Kullanıcıyı silmek istediğinden emin misin?{{name}}?", + "DELETE_YES" => "Evet, kullanıcıyı sil", + "DELETED" => "Kullanıcı silindi", + "DISABLE" => "Kullanıcı devre dışı", + "EDIT" => "Kullanıcıyı düzenle", + "ENABLE" => "Kullanıcı etkin", + "INFO_PAGE" => "{{name}} için kullanıcı bilgisi", + "LATEST" => "Son Kullanıcılar", + "PAGE_DESCRIPTION" => "Siten için kullanıcıların listesi. Kullanıcı detaylarını düzenlemek, elle kullanıcıları aktifleştirmek, kullanıcıları etkinleştirme/devre dışı bırakma, ve daha fazlası için yönetimsel araçlar sağlar.", + "SUMMARY" => "Hesap özeti", + "VIEW_ALL" => "Tüm kullanıcıları göster", + "WITH_PERMISSION" => "Bu izni olan kullanıcılar" + ], + "X_USER" => [ + 0 => "Kullanıcı yok", + 1 => "{{plural}} kullanıcı", + 2 => "{{plural}} kullanıcılar" + ] +]; diff --git a/main/app/sprinkles/admin/locale/zh_CN/messages.php b/main/app/sprinkles/admin/locale/zh_CN/messages.php index e84ef6d..4d9fa3f 100644 --- a/main/app/sprinkles/admin/locale/zh_CN/messages.php +++ b/main/app/sprinkles/admin/locale/zh_CN/messages.php @@ -1,161 +1,161 @@ - [ - 1 => "活动", - 2 => "活动", - - "LAST" => "最后活动", - "PAGE" => "用户活动列表", - "TIME" => "活动时间" - ], - - "ADMIN" => [ - "PANEL" => "控制台" - ], - - "CACHE" => [ - "CLEAR" => "清除缓存", - "CLEAR_CONFIRM" => "你确定要清除此网站的缓存?", - "CLEAR_CONFIRM_YES" => "是的, 清除缓存", - "CLEARED" => "缓存成功清除 !" - ], - - "DASHBOARD" => "仪表盘", - "DELETE_MASTER" => "你不能删除超级账户!", - "DELETION_SUCCESSFUL" => "用户 {{user_name}} 删除成功.", - "DETAILS_UPDATED" => "用户 {{user_name}} 更新成功", - "DISABLE_MASTER" => "你不能禁用超级用户!", - "DISABLE_SELF" => "不能禁用你自己的账户!", - "DISABLE_SUCCESSFUL" => "用户名{{user_name}} 成功禁用.", - - "ENABLE_SUCCESSFUL" => "用户名 {{user_name}} 启用成功.", - - "GROUP" => [ - 1 => "组", - 2 => "组", - - "CREATE" => "新建组", - "CREATION_SUCCESSFUL" => "成功创建组 {{name}}", - "DELETE" => "删除组", - "DELETE_CONFIRM" => "确定要删除组 {{name}}?", - "DELETE_DEFAULT" => "你无法删除组 {{name}} 因为这是新注册用户的默认组.", - "DELETE_YES" => "是, 删除组", - "DELETION_SUCCESSFUL" => "成功删除组{{name}}", - "EDIT" => "编辑组", - "ICON" => "组图标", - "ICON_EXPLAIN" => "组成员图标", - "INFO_PAGE" => "{{name}} 组的信息页", - "NAME" => "组名", - "NAME_EXPLAIN" => "请为组取一个名字", - "NOT_EMPTY" => "你不能这样做,因为还有用户在组 {{name}}.", - "PAGE_DESCRIPTION" => "网站组列表. 请管理编辑和删除组的工具.", - "SUMMARY" => "组简介", - "UPDATE" => "组{{name}}的信息已经更新" - ], - - "MANUALLY_ACTIVATED" => "{{user_name}} 账户已手动激活", - "MASTER_ACCOUNT_EXISTS" => "超级账户已存在!", - "MIGRATION" => [ - "REQUIRED" => "数据库需要更新" - ], - - "PERMISSION" => [ - 1 => "权限", - 2 => "权限", - - "ASSIGN_NEW" => "分配新权限", - "HOOK_CONDITION" => "Hook/条件", - "ID" => "权限ID", - "INFO_PAGE" => "用户 '{{name}}' 的权限页", - "MANAGE" => "管理权限", - "NOTE_READ_ONLY" => "请注意: 权限是 \"part of the code\" 不能通过界面修改. 如果要添加、删除、编辑权限, 网站维护者需要 进行数据库迁移.", - "PAGE_DESCRIPTION" => "网站的权限列表. 提供编辑和删除权限的工具.", - "SUMMARY" => "权限概要", - "UPDATE" => "更新权限", - "VIA_ROLES" => "权限通过用户了" - ], - - "ROLE" => [ - 1 => "角色", - 2 => "角色", - - "ASSIGN_NEW" => "分配角色", - "CREATE" => "创建角色", - "CREATION_SUCCESSFUL" => "成功创建角色 {{name}}", - "DELETE" => "删除角色", - "DELETE_CONFIRM" => "你确定要删除角色 {{name}}?", - "DELETE_DEFAULT" => "你无法删除角色{{name}} 因为这是新注册用户的默认角色.", - "DELETE_YES" => "是, 删除角色", - "DELETION_SUCCESSFUL" => "成功删除角色 {{name}}", - "EDIT" => "编辑角色", - "HAS_USERS" => "你不能这样做,因为还有用户拥有角色 {{name}}.", - "INFO_PAGE" => "{{name}}角色的权限页", - "MANAGE" => "管理角色", - "NAME" => "名字", - "NAME_EXPLAIN" => "请为角色输入名字", - "NAME_IN_USE" => "角色名 {{name}} 以存在", - "PAGE_DESCRIPTION" => "网站的角色列表. 请管理编辑和删除角色的工具.", - "PERMISSIONS_UPDATED" => "角色 {{name}} 的权限更新成功", - "SUMMARY" => "角色概要", - "UPDATED" => "角色 {{name}} 更新成功" - ], - - "SYSTEM_INFO" => [ - "@TRANSLATION" => "系统信息", - - "DB_NAME" => "数据库", - "DB_VERSION" => "数据库版本", - "DIRECTORY" => "工程目录", - "PHP_VERSION" => "PHP 版本", - "SERVER" => "网站服务器", - "SPRINKLES" => "加载的 sprinkles", - "UF_VERSION" => "UserFrosting 版本", - "URL" => "网站根目录" - ], - - "TOGGLE_COLUMNS" => "加载列", - - "USER" => [ - 1 => "用户", - 2 => "用户", - - "ADMIN" => [ - "CHANGE_PASSWORD" => "修改用户密码", - "SEND_PASSWORD_LINK" => "发送允许该用户修改密码的链接", - "SET_PASSWORD" => "设置用户的密码为" - ], - - "ACTIVATE" => "激活用户", - "CREATE" => "新建用户", - "CREATED" => "用户 {{user_name}} 新建成功", - "DELETE" => "删除用户", - "DELETE_CONFIRM" => "确定要删除用户 {{name}}?", - "DELETE_YES" => "是, 删除用户", - "DISABLE" => "禁用用户", - "EDIT" => "编辑用户", - "ENABLE" => "启用用户", - "INFO_PAGE" => "用户 {{name}} 的信息页", - "LATEST" => "最新用户", - "PAGE_DESCRIPTION" => "网站用户列表. 提供编辑用户信息, 手动激活用户, 启用/禁用 用户等工具.", - "SUMMARY" => "账户概要", - "VIEW_ALL" => "浏览所有用户", - "WITH_PERMISSION" => "有此权限的用户" - ], - "X_USER" => [ - 0 => "没有用户", - 1 => "{{plural}} 用户", - 2 => "{{plural}} 用户" - ] -]; + [ + 1 => "活动", + 2 => "活动", + + "LAST" => "最后活动", + "PAGE" => "用户活动列表", + "TIME" => "活动时间" + ], + + "ADMIN" => [ + "PANEL" => "控制台" + ], + + "CACHE" => [ + "CLEAR" => "清除缓存", + "CLEAR_CONFIRM" => "你确定要清除此网站的缓存?", + "CLEAR_CONFIRM_YES" => "是的, 清除缓存", + "CLEARED" => "缓存成功清除 !" + ], + + "DASHBOARD" => "仪表盘", + "DELETE_MASTER" => "你不能删除超级账户!", + "DELETION_SUCCESSFUL" => "用户 {{user_name}} 删除成功.", + "DETAILS_UPDATED" => "用户 {{user_name}} 更新成功", + "DISABLE_MASTER" => "你不能禁用超级用户!", + "DISABLE_SELF" => "不能禁用你自己的账户!", + "DISABLE_SUCCESSFUL" => "用户名{{user_name}} 成功禁用.", + + "ENABLE_SUCCESSFUL" => "用户名 {{user_name}} 启用成功.", + + "GROUP" => [ + 1 => "组", + 2 => "组", + + "CREATE" => "新建组", + "CREATION_SUCCESSFUL" => "成功创建组 {{name}}", + "DELETE" => "删除组", + "DELETE_CONFIRM" => "确定要删除组 {{name}}?", + "DELETE_DEFAULT" => "你无法删除组 {{name}} 因为这是新注册用户的默认组.", + "DELETE_YES" => "是, 删除组", + "DELETION_SUCCESSFUL" => "成功删除组{{name}}", + "EDIT" => "编辑组", + "ICON" => "组图标", + "ICON_EXPLAIN" => "组成员图标", + "INFO_PAGE" => "{{name}} 组的信息页", + "NAME" => "组名", + "NAME_EXPLAIN" => "请为组取一个名字", + "NOT_EMPTY" => "你不能这样做,因为还有用户在组 {{name}}.", + "PAGE_DESCRIPTION" => "网站组列表. 请管理编辑和删除组的工具.", + "SUMMARY" => "组简介", + "UPDATE" => "组{{name}}的信息已经更新" + ], + + "MANUALLY_ACTIVATED" => "{{user_name}} 账户已手动激活", + "MASTER_ACCOUNT_EXISTS" => "超级账户已存在!", + "MIGRATION" => [ + "REQUIRED" => "数据库需要更新" + ], + + "PERMISSION" => [ + 1 => "权限", + 2 => "权限", + + "ASSIGN_NEW" => "分配新权限", + "HOOK_CONDITION" => "Hook/条件", + "ID" => "权限ID", + "INFO_PAGE" => "用户 '{{name}}' 的权限页", + "MANAGE" => "管理权限", + "NOTE_READ_ONLY" => "请注意: 权限是 \"part of the code\" 不能通过界面修改. 如果要添加、删除、编辑权限, 网站维护者需要 进行数据库迁移.", + "PAGE_DESCRIPTION" => "网站的权限列表. 提供编辑和删除权限的工具.", + "SUMMARY" => "权限概要", + "UPDATE" => "更新权限", + "VIA_ROLES" => "权限通过用户了" + ], + + "ROLE" => [ + 1 => "角色", + 2 => "角色", + + "ASSIGN_NEW" => "分配角色", + "CREATE" => "创建角色", + "CREATION_SUCCESSFUL" => "成功创建角色 {{name}}", + "DELETE" => "删除角色", + "DELETE_CONFIRM" => "你确定要删除角色 {{name}}?", + "DELETE_DEFAULT" => "你无法删除角色{{name}} 因为这是新注册用户的默认角色.", + "DELETE_YES" => "是, 删除角色", + "DELETION_SUCCESSFUL" => "成功删除角色 {{name}}", + "EDIT" => "编辑角色", + "HAS_USERS" => "你不能这样做,因为还有用户拥有角色 {{name}}.", + "INFO_PAGE" => "{{name}}角色的权限页", + "MANAGE" => "管理角色", + "NAME" => "名字", + "NAME_EXPLAIN" => "请为角色输入名字", + "NAME_IN_USE" => "角色名 {{name}} 以存在", + "PAGE_DESCRIPTION" => "网站的角色列表. 请管理编辑和删除角色的工具.", + "PERMISSIONS_UPDATED" => "角色 {{name}} 的权限更新成功", + "SUMMARY" => "角色概要", + "UPDATED" => "角色 {{name}} 更新成功" + ], + + "SYSTEM_INFO" => [ + "@TRANSLATION" => "系统信息", + + "DB_NAME" => "数据库", + "DB_VERSION" => "数据库版本", + "DIRECTORY" => "工程目录", + "PHP_VERSION" => "PHP 版本", + "SERVER" => "网站服务器", + "SPRINKLES" => "加载的 sprinkles", + "UF_VERSION" => "UserFrosting 版本", + "URL" => "网站根目录" + ], + + "TOGGLE_COLUMNS" => "加载列", + + "USER" => [ + 1 => "用户", + 2 => "用户", + + "ADMIN" => [ + "CHANGE_PASSWORD" => "修改用户密码", + "SEND_PASSWORD_LINK" => "发送允许该用户修改密码的链接", + "SET_PASSWORD" => "设置用户的密码为" + ], + + "ACTIVATE" => "激活用户", + "CREATE" => "新建用户", + "CREATED" => "用户 {{user_name}} 新建成功", + "DELETE" => "删除用户", + "DELETE_CONFIRM" => "确定要删除用户 {{name}}?", + "DELETE_YES" => "是, 删除用户", + "DISABLE" => "禁用用户", + "EDIT" => "编辑用户", + "ENABLE" => "启用用户", + "INFO_PAGE" => "用户 {{name}} 的信息页", + "LATEST" => "最新用户", + "PAGE_DESCRIPTION" => "网站用户列表. 提供编辑用户信息, 手动激活用户, 启用/禁用 用户等工具.", + "SUMMARY" => "账户概要", + "VIEW_ALL" => "浏览所有用户", + "WITH_PERMISSION" => "有此权限的用户" + ], + "X_USER" => [ + 0 => "没有用户", + 1 => "{{plural}} 用户", + 2 => "{{plural}} 用户" + ] +]; diff --git a/main/app/sprinkles/admin/routes/admin.php b/main/app/sprinkles/admin/routes/admin.php index e469e4a..2669097 100644 --- a/main/app/sprinkles/admin/routes/admin.php +++ b/main/app/sprinkles/admin/routes/admin.php @@ -1,23 +1,23 @@ -group('/dashboard', function () { - $this->get('', 'UserFrosting\Sprinkle\Admin\Controller\AdminController:pageDashboard') - ->setName('dashboard'); -})->add('authGuard'); - -$app->group('/api/dashboard', function () { - $this->post('/clear-cache', 'UserFrosting\Sprinkle\Admin\Controller\AdminController:clearCache'); -})->add('authGuard'); - -$app->group('/modals/dashboard', function () { - $this->get('/clear-cache', 'UserFrosting\Sprinkle\Admin\Controller\AdminController:getModalConfirmClearCache'); -})->add('authGuard'); +group('/dashboard', function () { + $this->get('', 'UserFrosting\Sprinkle\Admin\Controller\AdminController:pageDashboard') + ->setName('dashboard'); +})->add('authGuard'); + +$app->group('/api/dashboard', function () { + $this->post('/clear-cache', 'UserFrosting\Sprinkle\Admin\Controller\AdminController:clearCache'); +})->add('authGuard'); + +$app->group('/modals/dashboard', function () { + $this->get('/clear-cache', 'UserFrosting\Sprinkle\Admin\Controller\AdminController:getModalConfirmClearCache'); +})->add('authGuard'); diff --git a/main/app/sprinkles/admin/routes/posts.php b/main/app/sprinkles/admin/routes/posts.php index 9ae7d70..79db113 100644 --- a/main/app/sprinkles/admin/routes/posts.php +++ b/main/app/sprinkles/admin/routes/posts.php @@ -1,18 +1,18 @@ -get('/image/{post_id}', 'UserFrosting\Sprinkle\Admin\Controller\PostController:showImage')->add('authGuard'); - -$app->get('/api/feed/{user_name}', 'UserFrosting\Sprinkle\Admin\Controller\PostController:getFeed')->add('authGuard'); - -$app->group('/api/posts', function () { - $this->post('/image', 'UserFrosting\Sprinkle\Admin\Controller\PostController:postImage'); +get('/image/{post_id}', 'UserFrosting\Sprinkle\Admin\Controller\PostController:showImage')->add('authGuard'); + +$app->get('/api/feed/{user_name}', 'UserFrosting\Sprinkle\Admin\Controller\PostController:getFeed')->add('authGuard'); + +$app->group('/api/posts', function () { + $this->post('/image', 'UserFrosting\Sprinkle\Admin\Controller\PostController:postImage'); })->add('authGuard'); \ No newline at end of file diff --git a/main/app/sprinkles/admin/routes/search.php b/main/app/sprinkles/admin/routes/search.php index 05793c1..fb0b19e 100644 --- a/main/app/sprinkles/admin/routes/search.php +++ b/main/app/sprinkles/admin/routes/search.php @@ -1,8 +1,8 @@ -group('/api/search', function () { - $this->get('/user/{search_term}', 'UserFrosting\Sprinkle\Admin\Controller\SearchController:ByUsername'); -})->add('authGuard'); +group('/api/search', function () { + $this->get('/user/{search_term}', 'UserFrosting\Sprinkle\Admin\Controller\SearchController:ByUsername'); +})->add('authGuard'); diff --git a/main/app/sprinkles/admin/routes/wormhole.php b/main/app/sprinkles/admin/routes/wormhole.php index 0883dba..36c6d17 100644 --- a/main/app/sprinkles/admin/routes/wormhole.php +++ b/main/app/sprinkles/admin/routes/wormhole.php @@ -1,9 +1,9 @@ -group('/wormhole/{access_token}', function () { - $this->get('/verify/{user_id}/{session_id}', 'UserFrosting\Sprinkle\Admin\Controller\WormholeController:verify'); - $this->post('/new/message/{sender_id}/{receiver_id}/', 'UserFrosting\Sprinkle\Admin\Controller\WormholeController:newMessage'); - $this->get('/user/{user_id}', 'UserFrosting\Sprinkle\Admin\Controller\WormholeController:getInfo'); -}); +group('/wormhole/{access_token}', function () { + $this->get('/verify/{user_id}/{session_id}', 'UserFrosting\Sprinkle\Admin\Controller\WormholeController:verify'); + $this->post('/new/message/{sender_id}/{receiver_id}/', 'UserFrosting\Sprinkle\Admin\Controller\WormholeController:newMessage'); + $this->get('/user/{user_id}', 'UserFrosting\Sprinkle\Admin\Controller\WormholeController:getInfo'); +}); diff --git a/main/app/sprinkles/admin/schema/requests/user/get-by-userid.yaml b/main/app/sprinkles/admin/schema/requests/user/get-by-userid.yaml index 0b0b71d..314a78d 100644 --- a/main/app/sprinkles/admin/schema/requests/user/get-by-userid.yaml +++ b/main/app/sprinkles/admin/schema/requests/user/get-by-userid.yaml @@ -1,6 +1,6 @@ ---- -user_id: - validators: - required: - label: "&USERID" - message: VALIDATE.REQUIRED +--- +user_id: + validators: + required: + label: "&USERID" + message: VALIDATE.REQUIRED diff --git a/main/app/sprinkles/admin/src/Admin.php b/main/app/sprinkles/admin/src/Admin.php index 3aa21f6..efe9816 100644 --- a/main/app/sprinkles/admin/src/Admin.php +++ b/main/app/sprinkles/admin/src/Admin.php @@ -1,21 +1,21 @@ -getQueryParams(); - - /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager */ - $authorizer = $this->ci->authorizer; - - /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ - $currentUser = $this->ci->currentUser; - - // Access-controlled page - if (!$authorizer->checkAccess($currentUser, 'uri_activities')) { - throw new ForbiddenException(); - } - - /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ - $classMapper = $this->ci->classMapper; - - $sprunje = $classMapper->createInstance('activity_sprunje', $classMapper, $params); - $sprunje->extendQuery(function ($query) { - return $query->with('user'); - }); - - // Be careful how you consume this data - it has not been escaped and contains untrusted user-supplied content. - // For example, if you plan to insert it into an HTML DOM, you must escape it on the client side (or use client-side templating). - return $sprunje->toResponse($response); - } - - /** - * Renders the activity listing page. - * - * This page renders a table of user activities. - * This page requires authentication. - * Request type: GET - */ - public function pageList($request, $response, $args) { - /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager */ - $authorizer = $this->ci->authorizer; - - /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ - $currentUser = $this->ci->currentUser; - - // Access-controlled page - if (!$authorizer->checkAccess($currentUser, 'uri_activities')) { - throw new ForbiddenException(); - } - - return $this->ci->view->render($response, 'pages/activities.html.twig'); - } -} +getQueryParams(); + + /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager */ + $authorizer = $this->ci->authorizer; + + /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ + $currentUser = $this->ci->currentUser; + + // Access-controlled page + if (!$authorizer->checkAccess($currentUser, 'uri_activities')) { + throw new ForbiddenException(); + } + + /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ + $classMapper = $this->ci->classMapper; + + $sprunje = $classMapper->createInstance('activity_sprunje', $classMapper, $params); + $sprunje->extendQuery(function ($query) { + return $query->with('user'); + }); + + // Be careful how you consume this data - it has not been escaped and contains untrusted user-supplied content. + // For example, if you plan to insert it into an HTML DOM, you must escape it on the client side (or use client-side templating). + return $sprunje->toResponse($response); + } + + /** + * Renders the activity listing page. + * + * This page renders a table of user activities. + * This page requires authentication. + * Request type: GET + */ + public function pageList($request, $response, $args) { + /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager */ + $authorizer = $this->ci->authorizer; + + /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ + $currentUser = $this->ci->currentUser; + + // Access-controlled page + if (!$authorizer->checkAccess($currentUser, 'uri_activities')) { + throw new ForbiddenException(); + } + + return $this->ci->view->render($response, 'pages/activities.html.twig'); + } +} diff --git a/main/app/sprinkles/admin/src/Controller/AdminController.php b/main/app/sprinkles/admin/src/Controller/AdminController.php index 91342de..7e4e2f0 100644 --- a/main/app/sprinkles/admin/src/Controller/AdminController.php +++ b/main/app/sprinkles/admin/src/Controller/AdminController.php @@ -1,148 +1,148 @@ -ci->authorizer; - - /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ - $currentUser = $this->ci->currentUser; - - // Access-controlled page - if (!$authorizer->checkAccess($currentUser, 'uri_dashboard')) { - throw new ForbiddenException(); - } - - /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ - $classMapper = $this->ci->classMapper; - - // Probably a better way to do this - $users = $classMapper->staticMethod('user', 'orderBy', 'created_at', 'desc') - ->take(8) - ->get(); - - // Transform the `create_at` date in "x days ago" type of string - $users->transform(function ($item, $key) { - $item->registered = Carbon::parse($item->created_at)->diffForHumans(); - return $item; - }); - - /** @var Config $config */ - $config = $this->ci->config; - - /** @var Config $config */ - $cache = $this->ci->cache; - - // Get each sprinkle db version - $sprinkles = $this->ci->sprinkleManager->getSprinkleNames(); - - return $this->ci->view->render($response, 'pages/dashboard.html.twig', [ - 'counter' => [ - 'users' => $classMapper->staticMethod('user', 'count'), - 'roles' => $classMapper->staticMethod('role', 'count'), - 'groups' => $classMapper->staticMethod('group', 'count') - ], - 'info' => [ - 'version' => [ - 'UF' => \UserFrosting\VERSION, - 'php' => phpversion(), - 'database' => EnvironmentInfo::database() - ], - 'database' => [ - 'name' => $config['db.default.database'] - ], - 'environment' => $this->ci->environment, - 'path' => [ - 'project' => \UserFrosting\ROOT_DIR - ] - ], - 'sprinkles' => $sprinkles, - 'users' => $users - ]); - } - - /** - * Clear the site cache. - * - * This route requires authentication. - * Request type: POST - */ - public function clearCache($request, $response, $args) { - /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager */ - $authorizer = $this->ci->authorizer; - - /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ - $currentUser = $this->ci->currentUser; - - // Access-controlled page - if (!$authorizer->checkAccess($currentUser, 'clear_cache')) { - throw new ForbiddenException(); - } - - // Flush cache - $this->ci->cache->flush(); - - /** @var MessageStream $ms */ - $ms = $this->ci->alerts; - - $ms->addMessageTranslated('success', 'CACHE.CLEARED'); - - return $response->withStatus(200); - } - - /** - * Renders the modal form to confirm cache deletion. - * - * This does NOT render a complete page. Instead, it renders the HTML for the modal, which can be embedded in other pages. - * This page requires authentication. - * Request type: GET - */ - public function getModalConfirmClearCache($request, $response, $args) { - /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager */ - $authorizer = $this->ci->authorizer; - - /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ - $currentUser = $this->ci->currentUser; - - // Access-controlled page - if (!$authorizer->checkAccess($currentUser, 'clear_cache')) { - throw new ForbiddenException(); - } - - return $this->ci->view->render($response, 'modals/confirm-clear-cache.html.twig', [ - 'form' => [ - 'action' => 'api/dashboard/clear-cache', - ] - ]); - } -} +ci->authorizer; + + /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ + $currentUser = $this->ci->currentUser; + + // Access-controlled page + if (!$authorizer->checkAccess($currentUser, 'uri_dashboard')) { + throw new ForbiddenException(); + } + + /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ + $classMapper = $this->ci->classMapper; + + // Probably a better way to do this + $users = $classMapper->staticMethod('user', 'orderBy', 'created_at', 'desc') + ->take(8) + ->get(); + + // Transform the `create_at` date in "x days ago" type of string + $users->transform(function ($item, $key) { + $item->registered = Carbon::parse($item->created_at)->diffForHumans(); + return $item; + }); + + /** @var Config $config */ + $config = $this->ci->config; + + /** @var Config $config */ + $cache = $this->ci->cache; + + // Get each sprinkle db version + $sprinkles = $this->ci->sprinkleManager->getSprinkleNames(); + + return $this->ci->view->render($response, 'pages/dashboard.html.twig', [ + 'counter' => [ + 'users' => $classMapper->staticMethod('user', 'count'), + 'roles' => $classMapper->staticMethod('role', 'count'), + 'groups' => $classMapper->staticMethod('group', 'count') + ], + 'info' => [ + 'version' => [ + 'UF' => \UserFrosting\VERSION, + 'php' => phpversion(), + 'database' => EnvironmentInfo::database() + ], + 'database' => [ + 'name' => $config['db.default.database'] + ], + 'environment' => $this->ci->environment, + 'path' => [ + 'project' => \UserFrosting\ROOT_DIR + ] + ], + 'sprinkles' => $sprinkles, + 'users' => $users + ]); + } + + /** + * Clear the site cache. + * + * This route requires authentication. + * Request type: POST + */ + public function clearCache($request, $response, $args) { + /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager */ + $authorizer = $this->ci->authorizer; + + /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ + $currentUser = $this->ci->currentUser; + + // Access-controlled page + if (!$authorizer->checkAccess($currentUser, 'clear_cache')) { + throw new ForbiddenException(); + } + + // Flush cache + $this->ci->cache->flush(); + + /** @var MessageStream $ms */ + $ms = $this->ci->alerts; + + $ms->addMessageTranslated('success', 'CACHE.CLEARED'); + + return $response->withStatus(200); + } + + /** + * Renders the modal form to confirm cache deletion. + * + * This does NOT render a complete page. Instead, it renders the HTML for the modal, which can be embedded in other pages. + * This page requires authentication. + * Request type: GET + */ + public function getModalConfirmClearCache($request, $response, $args) { + /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager */ + $authorizer = $this->ci->authorizer; + + /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ + $currentUser = $this->ci->currentUser; + + // Access-controlled page + if (!$authorizer->checkAccess($currentUser, 'clear_cache')) { + throw new ForbiddenException(); + } + + return $this->ci->view->render($response, 'modals/confirm-clear-cache.html.twig', [ + 'form' => [ + 'action' => 'api/dashboard/clear-cache', + ] + ]); + } +} diff --git a/main/app/sprinkles/admin/src/Controller/GroupController.php b/main/app/sprinkles/admin/src/Controller/GroupController.php index 720f12d..17659ec 100644 --- a/main/app/sprinkles/admin/src/Controller/GroupController.php +++ b/main/app/sprinkles/admin/src/Controller/GroupController.php @@ -1,713 +1,713 @@ -getParsedBody(); - - /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ - $authorizer = $this->ci->authorizer; - - /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ - $currentUser = $this->ci->currentUser; - - // Access-controlled page - if (!$authorizer->checkAccess($currentUser, 'create_group')) { - throw new ForbiddenException(); - } - - /** @var UserFrosting\Sprinkle\Core\MessageStream $ms */ - $ms = $this->ci->alerts; - - // Load the request schema - $schema = new RequestSchema('schema://requests/group/create.yaml'); - - // Whitelist and set parameter defaults - $transformer = new RequestDataTransformer($schema); - $data = $transformer->transform($params); - - $error = FALSE; - - // Validate request data - $validator = new ServerSideValidator($schema, $this->ci->translator); - if (!$validator->validate($data)) { - $ms->addValidationErrors($validator); - $error = TRUE; - } - - /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ - $classMapper = $this->ci->classMapper; - - // Check if name or slug already exists - if ($classMapper->staticMethod('group', 'where', 'name', $data['name'])->first()) { - $ms->addMessageTranslated('danger', 'GROUP.NAME.IN_USE', $data); - $error = TRUE; - } - - if ($classMapper->staticMethod('group', 'where', 'slug', $data['slug'])->first()) { - $ms->addMessageTranslated('danger', 'GROUP.SLUG.IN_USE', $data); - $error = TRUE; - } - - if ($error) { - return $response->withStatus(400); - } - - /** @var UserFrosting\Config\Config $config */ - $config = $this->ci->config; - - // All checks passed! log events/activities and create group - // Begin transaction - DB will be rolled back if an exception occurs - Capsule::transaction(function () use ($classMapper, $data, $ms, $config, $currentUser) { - // Create the group - $group = $classMapper->createInstance('group', $data); - - // Store new group to database - $group->save(); - - // Create activity record - $this->ci->userActivityLogger->info("User {$currentUser->user_name} created group {$group->name}.", [ - 'type' => 'group_create', - 'user_id' => $currentUser->id - ]); - - $ms->addMessageTranslated('success', 'GROUP.CREATION_SUCCESSFUL', $data); - }); - - return $response->withStatus(200); - } - - /** - * Processes the request to delete an existing group. - * - * Deletes the specified group. - * Before doing so, checks that: - * 1. The user has permission to delete this group; - * 2. The group is not currently set as the default for new users; - * 3. The group is empty (does not have any users); - * 4. The submitted data is valid. - * This route requires authentication (and should generally be limited to admins or the root user). - * Request type: DELETE - */ - public function delete($request, $response, $args) { - $group = $this->getGroupFromParams($args); - - // If the group doesn't exist, return 404 - if (!$group) { - throw new NotFoundException($request, $response); - } - - /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ - $authorizer = $this->ci->authorizer; - - /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ - $currentUser = $this->ci->currentUser; - - // Access-controlled page - if (!$authorizer->checkAccess($currentUser, 'delete_group', [ - 'group' => $group - ])) { - throw new ForbiddenException(); - } - - /** @var UserFrosting\Config\Config $config */ - $config = $this->ci->config; - - // Check that we are not deleting the default group - // Need to use loose comparison for now, because some DBs return `id` as a string - if ($group->slug == $config['site.registration.user_defaults.group']) { - $e = new BadRequestException(); - $e->addUserMessage('GROUP.DELETE_DEFAULT', $group->toArray()); - throw $e; - } - - /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ - $classMapper = $this->ci->classMapper; - - // Check if there are any users in this group - $countGroupUsers = $classMapper->staticMethod('user', 'where', 'group_id', $group->id)->count(); - if ($countGroupUsers > 0) { - $e = new BadRequestException(); - $e->addUserMessage('GROUP.NOT_EMPTY', $group->toArray()); - throw $e; - } - - $groupName = $group->name; - - // Begin transaction - DB will be rolled back if an exception occurs - Capsule::transaction(function () use ($group, $groupName, $currentUser) { - $group->delete(); - unset($group); - - // Create activity record - $this->ci->userActivityLogger->info("User {$currentUser->user_name} deleted group {$groupName}.", [ - 'type' => 'group_delete', - 'user_id' => $currentUser->id - ]); - }); - - /** @var UserFrosting\Sprinkle\Core\MessageStream $ms */ - $ms = $this->ci->alerts; - - $ms->addMessageTranslated('success', 'GROUP.DELETION_SUCCESSFUL', [ - 'name' => $groupName - ]); - - return $response->withStatus(200); - } - - /** - * Returns info for a single group. - * - * This page requires authentication. - * Request type: GET - */ - public function getInfo($request, $response, $args) { - /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager */ - $authorizer = $this->ci->authorizer; - - /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ - $currentUser = $this->ci->currentUser; - - // Access-controlled page - if (!$authorizer->checkAccess($currentUser, 'uri_groups')) { - throw new ForbiddenException(); - } - - $slug = $args['slug']; - - /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ - $classMapper = $this->ci->classMapper; - - $group = $classMapper->staticMethod('group', 'where', 'slug', $slug)->first(); - - // If the group doesn't exist, return 404 - if (!$group) { - throw new NotFoundException($request, $response); - } - - // Get group - $result = $group->toArray(); - - // Be careful how you consume this data - it has not been escaped and contains untrusted user-supplied content. - // For example, if you plan to insert it into an HTML DOM, you must escape it on the client side (or use client-side templating). - return $response->withJson($result, 200, JSON_PRETTY_PRINT); - } - - /** - * Returns a list of Groups - * - * Generates a list of groups, optionally paginated, sorted and/or filtered. - * This page requires authentication. - * Request type: GET - */ - public function getList($request, $response, $args) { - // GET parameters - $params = $request->getQueryParams(); - - /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ - $authorizer = $this->ci->authorizer; - - /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ - $currentUser = $this->ci->currentUser; - - // Access-controlled page - if (!$authorizer->checkAccess($currentUser, 'uri_groups')) { - throw new ForbiddenException(); - } - - /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ - $classMapper = $this->ci->classMapper; - - $sprunje = $classMapper->createInstance('group_sprunje', $classMapper, $params); - - // Be careful how you consume this data - it has not been escaped and contains untrusted user-supplied content. - // For example, if you plan to insert it into an HTML DOM, you must escape it on the client side (or use client-side templating). - return $sprunje->toResponse($response); - } - - public function getModalConfirmDelete($request, $response, $args) { - // GET parameters - $params = $request->getQueryParams(); - - $group = $this->getGroupFromParams($params); - - // If the group no longer exists, forward to main group listing page - if (!$group) { - throw new NotFoundException($request, $response); - } - - /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ - $authorizer = $this->ci->authorizer; - - /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ - $currentUser = $this->ci->currentUser; - - // Access-controlled page - if (!$authorizer->checkAccess($currentUser, 'delete_group', [ - 'group' => $group - ])) { - throw new ForbiddenException(); - } - - /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ - $classMapper = $this->ci->classMapper; - - // Check if there are any users in this group - $countGroupUsers = $classMapper->staticMethod('user', 'where', 'group_id', $group->id)->count(); - if ($countGroupUsers > 0) { - $e = new BadRequestException(); - $e->addUserMessage('GROUP.NOT_EMPTY', $group->toArray()); - throw $e; - } - - return $this->ci->view->render($response, 'modals/confirm-delete-group.html.twig', [ - 'group' => $group, - 'form' => [ - 'action' => "api/groups/g/{$group->slug}", - ] - ]); - } - - /** - * Renders the modal form for creating a new group. - * - * This does NOT render a complete page. Instead, it renders the HTML for the modal, which can be embedded in other pages. - * This page requires authentication. - * Request type: GET - */ - public function getModalCreate($request, $response, $args) { - // GET parameters - $params = $request->getQueryParams(); - - /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ - $authorizer = $this->ci->authorizer; - - /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ - $currentUser = $this->ci->currentUser; - - /** @var UserFrosting\I18n\MessageTranslator $translator */ - $translator = $this->ci->translator; - - // Access-controlled page - if (!$authorizer->checkAccess($currentUser, 'create_group')) { - throw new ForbiddenException(); - } - - /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ - $classMapper = $this->ci->classMapper; - - // Create a dummy group to prepopulate fields - $group = $classMapper->createInstance('group', []); - - $group->icon = 'fa fa-user'; - - $fieldNames = ['name', 'slug', 'icon', 'description']; - $fields = [ - 'hidden' => [], - 'disabled' => [] - ]; - - // Load validation rules - $schema = new RequestSchema('schema://requests/group/create.yaml'); - $validator = new JqueryValidationAdapter($schema, $this->ci->translator); - - return $this->ci->view->render($response, 'modals/group.html.twig', [ - 'group' => $group, - 'form' => [ - 'action' => 'api/groups', - 'method' => 'POST', - 'fields' => $fields, - 'submit_text' => $translator->translate('CREATE') - ], - 'page' => [ - 'validators' => $validator->rules('json', FALSE) - ] - ]); - } - - /** - * Renders the modal form for editing an existing group. - * - * This does NOT render a complete page. Instead, it renders the HTML for the modal, which can be embedded in other pages. - * This page requires authentication. - * Request type: GET - */ - public function getModalEdit($request, $response, $args) { - // GET parameters - $params = $request->getQueryParams(); - - $group = $this->getGroupFromParams($params); - - // If the group doesn't exist, return 404 - if (!$group) { - throw new NotFoundException($request, $response); - } - - /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ - $classMapper = $this->ci->classMapper; - - /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ - $authorizer = $this->ci->authorizer; - - /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ - $currentUser = $this->ci->currentUser; - - /** @var UserFrosting\I18n\MessageTranslator $translator */ - $translator = $this->ci->translator; - - // Access-controlled resource - check that currentUser has permission to edit basic fields "name", "slug", "icon", "description" for this group - $fieldNames = ['name', 'slug', 'icon', 'description']; - if (!$authorizer->checkAccess($currentUser, 'update_group_field', [ - 'group' => $group, - 'fields' => $fieldNames - ])) { - throw new ForbiddenException(); - } - - // Generate form - $fields = [ - 'hidden' => [], - 'disabled' => [] - ]; - - // Load validation rules - $schema = new RequestSchema('schema://requests/group/edit-info.yaml'); - $validator = new JqueryValidationAdapter($schema, $translator); - - return $this->ci->view->render($response, 'modals/group.html.twig', [ - 'group' => $group, - 'form' => [ - 'action' => "api/groups/g/{$group->slug}", - 'method' => 'PUT', - 'fields' => $fields, - 'submit_text' => $translator->translate('UPDATE') - ], - 'page' => [ - 'validators' => $validator->rules('json', FALSE) - ] - ]); - } - - public function getUsers($request, $response, $args) { - $group = $this->getGroupFromParams($args); - - // If the group no longer exists, forward to main group listing page - if (!$group) { - throw new NotFoundException($request, $response); - } - - // GET parameters - $params = $request->getQueryParams(); - - /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ - $authorizer = $this->ci->authorizer; - - /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ - $currentUser = $this->ci->currentUser; - - // Access-controlled page - if (!$authorizer->checkAccess($currentUser, 'view_group_field', [ - 'group' => $group, - 'property' => 'users' - ])) { - throw new ForbiddenException(); - } - - /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ - $classMapper = $this->ci->classMapper; - - $sprunje = $classMapper->createInstance('user_sprunje', $classMapper, $params); - $sprunje->extendQuery(function ($query) use ($group) { - return $query->where('group_id', $group->id); - }); - - // Be careful how you consume this data - it has not been escaped and contains untrusted user-supplied content. - // For example, if you plan to insert it into an HTML DOM, you must escape it on the client side (or use client-side templating). - return $sprunje->toResponse($response); - } - - /** - * Renders a page displaying a group's information, in read-only mode. - * - * This checks that the currently logged-in user has permission to view the requested group's info. - * It checks each field individually, showing only those that you have permission to view. - * This will also try to show buttons for deleting, and editing the group. - * This page requires authentication. - * Request type: GET - */ - public function pageInfo($request, $response, $args) { - $group = $this->getGroupFromParams($args); - - // If the group no longer exists, forward to main group listing page - if (!$group) { - $redirectPage = $this->ci->router->pathFor('uri_groups'); - return $response->withRedirect($redirectPage, 404); - } - - /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ - $authorizer = $this->ci->authorizer; - - /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ - $currentUser = $this->ci->currentUser; - - // Access-controlled page - if (!$authorizer->checkAccess($currentUser, 'uri_group', [ - 'group' => $group - ])) { - throw new ForbiddenException(); - } - - // Determine fields that currentUser is authorized to view - $fieldNames = ['name', 'slug', 'icon', 'description']; - - // Generate form - $fields = [ - 'hidden' => [] - ]; - - foreach ($fieldNames as $field) { - if (!$authorizer->checkAccess($currentUser, 'view_group_field', [ - 'group' => $group, - 'property' => $field - ])) { - $fields['hidden'][] = $field; - } - } - - // Determine buttons to display - $editButtons = [ - 'hidden' => [] - ]; - - if (!$authorizer->checkAccess($currentUser, 'update_group_field', [ - 'group' => $group, - 'fields' => ['name', 'slug', 'icon', 'description'] - ])) { - $editButtons['hidden'][] = 'edit'; - } - - if (!$authorizer->checkAccess($currentUser, 'delete_group', [ - 'group' => $group - ])) { - $editButtons['hidden'][] = 'delete'; - } - - return $this->ci->view->render($response, 'pages/group.html.twig', [ - 'group' => $group, - 'fields' => $fields, - 'tools' => $editButtons - ]); - } - - /** - * Renders the group listing page. - * - * This page renders a table of groups, with dropdown menus for admin actions for each group. - * Actions typically include: edit group, delete group. - * This page requires authentication. - * Request type: GET - */ - public function pageList($request, $response, $args) { - /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ - $authorizer = $this->ci->authorizer; - - /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ - $currentUser = $this->ci->currentUser; - - // Access-controlled page - if (!$authorizer->checkAccess($currentUser, 'uri_groups')) { - throw new ForbiddenException(); - } - - return $this->ci->view->render($response, 'pages/groups.html.twig'); - } - - /** - * Processes the request to update an existing group's details. - * - * Processes the request from the group update form, checking that: - * 1. The group name/slug are not already in use; - * 2. The user has the necessary permissions to update the posted field(s); - * 3. The submitted data is valid. - * This route requires authentication (and should generally be limited to admins or the root user). - * Request type: PUT - * @see getModalGroupEdit - */ - public function updateInfo($request, $response, $args) { - // Get the group based on slug in URL - $group = $this->getGroupFromParams($args); - - if (!$group) { - throw new NotFoundException($request, $response); - } - - /** @var UserFrosting\Config\Config $config */ - $config = $this->ci->config; - - // Get PUT parameters: (name, slug, icon, description) - $params = $request->getParsedBody(); - - /** @var UserFrosting\Sprinkle\Core\MessageStream $ms */ - $ms = $this->ci->alerts; - - // Load the request schema - $schema = new RequestSchema('schema://requests/group/edit-info.yaml'); - - // Whitelist and set parameter defaults - $transformer = new RequestDataTransformer($schema); - $data = $transformer->transform($params); - - $error = FALSE; - - // Validate request data - $validator = new ServerSideValidator($schema, $this->ci->translator); - if (!$validator->validate($data)) { - $ms->addValidationErrors($validator); - $error = TRUE; - } - - // Determine targeted fields - $fieldNames = []; - foreach ($data as $name => $value) { - $fieldNames[] = $name; - } - - /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ - $authorizer = $this->ci->authorizer; - - /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ - $currentUser = $this->ci->currentUser; - - // Access-controlled resource - check that currentUser has permission to edit submitted fields for this group - if (!$authorizer->checkAccess($currentUser, 'update_group_field', [ - 'group' => $group, - 'fields' => array_values(array_unique($fieldNames)) - ])) { - throw new ForbiddenException(); - } - - /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ - $classMapper = $this->ci->classMapper; - - // Check if name or slug already exists - if ( - isset($data['name']) && - $data['name'] != $group->name && - $classMapper->staticMethod('group', 'where', 'name', $data['name'])->first() - ) { - $ms->addMessageTranslated('danger', 'GROUP.NAME.IN_USE', $data); - $error = TRUE; - } - - if ( - isset($data['slug']) && - $data['slug'] != $group->slug && - $classMapper->staticMethod('group', 'where', 'slug', $data['slug'])->first() - ) { - $ms->addMessageTranslated('danger', 'GROUP.SLUG.IN_USE', $data); - $error = TRUE; - } - - if ($error) { - return $response->withStatus(400); - } - - // Begin transaction - DB will be rolled back if an exception occurs - Capsule::transaction(function () use ($data, $group, $currentUser) { - // Update the group and generate success messages - foreach ($data as $name => $value) { - if ($value != $group->$name) { - $group->$name = $value; - } - } - - $group->save(); - - // Create activity record - $this->ci->userActivityLogger->info("User {$currentUser->user_name} updated details for group {$group->name}.", [ - 'type' => 'group_update_info', - 'user_id' => $currentUser->id - ]); - }); - - $ms->addMessageTranslated('success', 'GROUP.UPDATE', [ - 'name' => $group->name - ]); - - return $response->withStatus(200); - } - - protected function getGroupFromParams($params) { - // Load the request schema - $schema = new RequestSchema('schema://requests/group/get-by-slug.yaml'); - - // Whitelist and set parameter defaults - $transformer = new RequestDataTransformer($schema); - $data = $transformer->transform($params); - - // Validate, and throw exception on validation errors. - $validator = new ServerSideValidator($schema, $this->ci->translator); - if (!$validator->validate($data)) { - $e = new BadRequestException(); - foreach ($validator->errors() as $idx => $field) { - foreach ($field as $eidx => $error) { - $e->addUserMessage($error); - } - } - throw $e; - } - - /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ - $classMapper = $this->ci->classMapper; - - // Get the group - $group = $classMapper->staticMethod('group', 'where', 'slug', $data['slug']) - ->first(); - - return $group; - } -} +getParsedBody(); + + /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ + $authorizer = $this->ci->authorizer; + + /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ + $currentUser = $this->ci->currentUser; + + // Access-controlled page + if (!$authorizer->checkAccess($currentUser, 'create_group')) { + throw new ForbiddenException(); + } + + /** @var UserFrosting\Sprinkle\Core\MessageStream $ms */ + $ms = $this->ci->alerts; + + // Load the request schema + $schema = new RequestSchema('schema://requests/group/create.yaml'); + + // Whitelist and set parameter defaults + $transformer = new RequestDataTransformer($schema); + $data = $transformer->transform($params); + + $error = FALSE; + + // Validate request data + $validator = new ServerSideValidator($schema, $this->ci->translator); + if (!$validator->validate($data)) { + $ms->addValidationErrors($validator); + $error = TRUE; + } + + /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ + $classMapper = $this->ci->classMapper; + + // Check if name or slug already exists + if ($classMapper->staticMethod('group', 'where', 'name', $data['name'])->first()) { + $ms->addMessageTranslated('danger', 'GROUP.NAME.IN_USE', $data); + $error = TRUE; + } + + if ($classMapper->staticMethod('group', 'where', 'slug', $data['slug'])->first()) { + $ms->addMessageTranslated('danger', 'GROUP.SLUG.IN_USE', $data); + $error = TRUE; + } + + if ($error) { + return $response->withStatus(400); + } + + /** @var UserFrosting\Config\Config $config */ + $config = $this->ci->config; + + // All checks passed! log events/activities and create group + // Begin transaction - DB will be rolled back if an exception occurs + Capsule::transaction(function () use ($classMapper, $data, $ms, $config, $currentUser) { + // Create the group + $group = $classMapper->createInstance('group', $data); + + // Store new group to database + $group->save(); + + // Create activity record + $this->ci->userActivityLogger->info("User {$currentUser->user_name} created group {$group->name}.", [ + 'type' => 'group_create', + 'user_id' => $currentUser->id + ]); + + $ms->addMessageTranslated('success', 'GROUP.CREATION_SUCCESSFUL', $data); + }); + + return $response->withStatus(200); + } + + /** + * Processes the request to delete an existing group. + * + * Deletes the specified group. + * Before doing so, checks that: + * 1. The user has permission to delete this group; + * 2. The group is not currently set as the default for new users; + * 3. The group is empty (does not have any users); + * 4. The submitted data is valid. + * This route requires authentication (and should generally be limited to admins or the root user). + * Request type: DELETE + */ + public function delete($request, $response, $args) { + $group = $this->getGroupFromParams($args); + + // If the group doesn't exist, return 404 + if (!$group) { + throw new NotFoundException($request, $response); + } + + /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ + $authorizer = $this->ci->authorizer; + + /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ + $currentUser = $this->ci->currentUser; + + // Access-controlled page + if (!$authorizer->checkAccess($currentUser, 'delete_group', [ + 'group' => $group + ])) { + throw new ForbiddenException(); + } + + /** @var UserFrosting\Config\Config $config */ + $config = $this->ci->config; + + // Check that we are not deleting the default group + // Need to use loose comparison for now, because some DBs return `id` as a string + if ($group->slug == $config['site.registration.user_defaults.group']) { + $e = new BadRequestException(); + $e->addUserMessage('GROUP.DELETE_DEFAULT', $group->toArray()); + throw $e; + } + + /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ + $classMapper = $this->ci->classMapper; + + // Check if there are any users in this group + $countGroupUsers = $classMapper->staticMethod('user', 'where', 'group_id', $group->id)->count(); + if ($countGroupUsers > 0) { + $e = new BadRequestException(); + $e->addUserMessage('GROUP.NOT_EMPTY', $group->toArray()); + throw $e; + } + + $groupName = $group->name; + + // Begin transaction - DB will be rolled back if an exception occurs + Capsule::transaction(function () use ($group, $groupName, $currentUser) { + $group->delete(); + unset($group); + + // Create activity record + $this->ci->userActivityLogger->info("User {$currentUser->user_name} deleted group {$groupName}.", [ + 'type' => 'group_delete', + 'user_id' => $currentUser->id + ]); + }); + + /** @var UserFrosting\Sprinkle\Core\MessageStream $ms */ + $ms = $this->ci->alerts; + + $ms->addMessageTranslated('success', 'GROUP.DELETION_SUCCESSFUL', [ + 'name' => $groupName + ]); + + return $response->withStatus(200); + } + + /** + * Returns info for a single group. + * + * This page requires authentication. + * Request type: GET + */ + public function getInfo($request, $response, $args) { + /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager */ + $authorizer = $this->ci->authorizer; + + /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ + $currentUser = $this->ci->currentUser; + + // Access-controlled page + if (!$authorizer->checkAccess($currentUser, 'uri_groups')) { + throw new ForbiddenException(); + } + + $slug = $args['slug']; + + /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ + $classMapper = $this->ci->classMapper; + + $group = $classMapper->staticMethod('group', 'where', 'slug', $slug)->first(); + + // If the group doesn't exist, return 404 + if (!$group) { + throw new NotFoundException($request, $response); + } + + // Get group + $result = $group->toArray(); + + // Be careful how you consume this data - it has not been escaped and contains untrusted user-supplied content. + // For example, if you plan to insert it into an HTML DOM, you must escape it on the client side (or use client-side templating). + return $response->withJson($result, 200, JSON_PRETTY_PRINT); + } + + /** + * Returns a list of Groups + * + * Generates a list of groups, optionally paginated, sorted and/or filtered. + * This page requires authentication. + * Request type: GET + */ + public function getList($request, $response, $args) { + // GET parameters + $params = $request->getQueryParams(); + + /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ + $authorizer = $this->ci->authorizer; + + /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ + $currentUser = $this->ci->currentUser; + + // Access-controlled page + if (!$authorizer->checkAccess($currentUser, 'uri_groups')) { + throw new ForbiddenException(); + } + + /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ + $classMapper = $this->ci->classMapper; + + $sprunje = $classMapper->createInstance('group_sprunje', $classMapper, $params); + + // Be careful how you consume this data - it has not been escaped and contains untrusted user-supplied content. + // For example, if you plan to insert it into an HTML DOM, you must escape it on the client side (or use client-side templating). + return $sprunje->toResponse($response); + } + + public function getModalConfirmDelete($request, $response, $args) { + // GET parameters + $params = $request->getQueryParams(); + + $group = $this->getGroupFromParams($params); + + // If the group no longer exists, forward to main group listing page + if (!$group) { + throw new NotFoundException($request, $response); + } + + /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ + $authorizer = $this->ci->authorizer; + + /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ + $currentUser = $this->ci->currentUser; + + // Access-controlled page + if (!$authorizer->checkAccess($currentUser, 'delete_group', [ + 'group' => $group + ])) { + throw new ForbiddenException(); + } + + /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ + $classMapper = $this->ci->classMapper; + + // Check if there are any users in this group + $countGroupUsers = $classMapper->staticMethod('user', 'where', 'group_id', $group->id)->count(); + if ($countGroupUsers > 0) { + $e = new BadRequestException(); + $e->addUserMessage('GROUP.NOT_EMPTY', $group->toArray()); + throw $e; + } + + return $this->ci->view->render($response, 'modals/confirm-delete-group.html.twig', [ + 'group' => $group, + 'form' => [ + 'action' => "api/groups/g/{$group->slug}", + ] + ]); + } + + /** + * Renders the modal form for creating a new group. + * + * This does NOT render a complete page. Instead, it renders the HTML for the modal, which can be embedded in other pages. + * This page requires authentication. + * Request type: GET + */ + public function getModalCreate($request, $response, $args) { + // GET parameters + $params = $request->getQueryParams(); + + /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ + $authorizer = $this->ci->authorizer; + + /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ + $currentUser = $this->ci->currentUser; + + /** @var UserFrosting\I18n\MessageTranslator $translator */ + $translator = $this->ci->translator; + + // Access-controlled page + if (!$authorizer->checkAccess($currentUser, 'create_group')) { + throw new ForbiddenException(); + } + + /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ + $classMapper = $this->ci->classMapper; + + // Create a dummy group to prepopulate fields + $group = $classMapper->createInstance('group', []); + + $group->icon = 'fa fa-user'; + + $fieldNames = ['name', 'slug', 'icon', 'description']; + $fields = [ + 'hidden' => [], + 'disabled' => [] + ]; + + // Load validation rules + $schema = new RequestSchema('schema://requests/group/create.yaml'); + $validator = new JqueryValidationAdapter($schema, $this->ci->translator); + + return $this->ci->view->render($response, 'modals/group.html.twig', [ + 'group' => $group, + 'form' => [ + 'action' => 'api/groups', + 'method' => 'POST', + 'fields' => $fields, + 'submit_text' => $translator->translate('CREATE') + ], + 'page' => [ + 'validators' => $validator->rules('json', FALSE) + ] + ]); + } + + /** + * Renders the modal form for editing an existing group. + * + * This does NOT render a complete page. Instead, it renders the HTML for the modal, which can be embedded in other pages. + * This page requires authentication. + * Request type: GET + */ + public function getModalEdit($request, $response, $args) { + // GET parameters + $params = $request->getQueryParams(); + + $group = $this->getGroupFromParams($params); + + // If the group doesn't exist, return 404 + if (!$group) { + throw new NotFoundException($request, $response); + } + + /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ + $classMapper = $this->ci->classMapper; + + /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ + $authorizer = $this->ci->authorizer; + + /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ + $currentUser = $this->ci->currentUser; + + /** @var UserFrosting\I18n\MessageTranslator $translator */ + $translator = $this->ci->translator; + + // Access-controlled resource - check that currentUser has permission to edit basic fields "name", "slug", "icon", "description" for this group + $fieldNames = ['name', 'slug', 'icon', 'description']; + if (!$authorizer->checkAccess($currentUser, 'update_group_field', [ + 'group' => $group, + 'fields' => $fieldNames + ])) { + throw new ForbiddenException(); + } + + // Generate form + $fields = [ + 'hidden' => [], + 'disabled' => [] + ]; + + // Load validation rules + $schema = new RequestSchema('schema://requests/group/edit-info.yaml'); + $validator = new JqueryValidationAdapter($schema, $translator); + + return $this->ci->view->render($response, 'modals/group.html.twig', [ + 'group' => $group, + 'form' => [ + 'action' => "api/groups/g/{$group->slug}", + 'method' => 'PUT', + 'fields' => $fields, + 'submit_text' => $translator->translate('UPDATE') + ], + 'page' => [ + 'validators' => $validator->rules('json', FALSE) + ] + ]); + } + + public function getUsers($request, $response, $args) { + $group = $this->getGroupFromParams($args); + + // If the group no longer exists, forward to main group listing page + if (!$group) { + throw new NotFoundException($request, $response); + } + + // GET parameters + $params = $request->getQueryParams(); + + /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ + $authorizer = $this->ci->authorizer; + + /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ + $currentUser = $this->ci->currentUser; + + // Access-controlled page + if (!$authorizer->checkAccess($currentUser, 'view_group_field', [ + 'group' => $group, + 'property' => 'users' + ])) { + throw new ForbiddenException(); + } + + /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ + $classMapper = $this->ci->classMapper; + + $sprunje = $classMapper->createInstance('user_sprunje', $classMapper, $params); + $sprunje->extendQuery(function ($query) use ($group) { + return $query->where('group_id', $group->id); + }); + + // Be careful how you consume this data - it has not been escaped and contains untrusted user-supplied content. + // For example, if you plan to insert it into an HTML DOM, you must escape it on the client side (or use client-side templating). + return $sprunje->toResponse($response); + } + + /** + * Renders a page displaying a group's information, in read-only mode. + * + * This checks that the currently logged-in user has permission to view the requested group's info. + * It checks each field individually, showing only those that you have permission to view. + * This will also try to show buttons for deleting, and editing the group. + * This page requires authentication. + * Request type: GET + */ + public function pageInfo($request, $response, $args) { + $group = $this->getGroupFromParams($args); + + // If the group no longer exists, forward to main group listing page + if (!$group) { + $redirectPage = $this->ci->router->pathFor('uri_groups'); + return $response->withRedirect($redirectPage, 404); + } + + /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ + $authorizer = $this->ci->authorizer; + + /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ + $currentUser = $this->ci->currentUser; + + // Access-controlled page + if (!$authorizer->checkAccess($currentUser, 'uri_group', [ + 'group' => $group + ])) { + throw new ForbiddenException(); + } + + // Determine fields that currentUser is authorized to view + $fieldNames = ['name', 'slug', 'icon', 'description']; + + // Generate form + $fields = [ + 'hidden' => [] + ]; + + foreach ($fieldNames as $field) { + if (!$authorizer->checkAccess($currentUser, 'view_group_field', [ + 'group' => $group, + 'property' => $field + ])) { + $fields['hidden'][] = $field; + } + } + + // Determine buttons to display + $editButtons = [ + 'hidden' => [] + ]; + + if (!$authorizer->checkAccess($currentUser, 'update_group_field', [ + 'group' => $group, + 'fields' => ['name', 'slug', 'icon', 'description'] + ])) { + $editButtons['hidden'][] = 'edit'; + } + + if (!$authorizer->checkAccess($currentUser, 'delete_group', [ + 'group' => $group + ])) { + $editButtons['hidden'][] = 'delete'; + } + + return $this->ci->view->render($response, 'pages/group.html.twig', [ + 'group' => $group, + 'fields' => $fields, + 'tools' => $editButtons + ]); + } + + /** + * Renders the group listing page. + * + * This page renders a table of groups, with dropdown menus for admin actions for each group. + * Actions typically include: edit group, delete group. + * This page requires authentication. + * Request type: GET + */ + public function pageList($request, $response, $args) { + /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ + $authorizer = $this->ci->authorizer; + + /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ + $currentUser = $this->ci->currentUser; + + // Access-controlled page + if (!$authorizer->checkAccess($currentUser, 'uri_groups')) { + throw new ForbiddenException(); + } + + return $this->ci->view->render($response, 'pages/groups.html.twig'); + } + + /** + * Processes the request to update an existing group's details. + * + * Processes the request from the group update form, checking that: + * 1. The group name/slug are not already in use; + * 2. The user has the necessary permissions to update the posted field(s); + * 3. The submitted data is valid. + * This route requires authentication (and should generally be limited to admins or the root user). + * Request type: PUT + * @see getModalGroupEdit + */ + public function updateInfo($request, $response, $args) { + // Get the group based on slug in URL + $group = $this->getGroupFromParams($args); + + if (!$group) { + throw new NotFoundException($request, $response); + } + + /** @var UserFrosting\Config\Config $config */ + $config = $this->ci->config; + + // Get PUT parameters: (name, slug, icon, description) + $params = $request->getParsedBody(); + + /** @var UserFrosting\Sprinkle\Core\MessageStream $ms */ + $ms = $this->ci->alerts; + + // Load the request schema + $schema = new RequestSchema('schema://requests/group/edit-info.yaml'); + + // Whitelist and set parameter defaults + $transformer = new RequestDataTransformer($schema); + $data = $transformer->transform($params); + + $error = FALSE; + + // Validate request data + $validator = new ServerSideValidator($schema, $this->ci->translator); + if (!$validator->validate($data)) { + $ms->addValidationErrors($validator); + $error = TRUE; + } + + // Determine targeted fields + $fieldNames = []; + foreach ($data as $name => $value) { + $fieldNames[] = $name; + } + + /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ + $authorizer = $this->ci->authorizer; + + /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ + $currentUser = $this->ci->currentUser; + + // Access-controlled resource - check that currentUser has permission to edit submitted fields for this group + if (!$authorizer->checkAccess($currentUser, 'update_group_field', [ + 'group' => $group, + 'fields' => array_values(array_unique($fieldNames)) + ])) { + throw new ForbiddenException(); + } + + /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ + $classMapper = $this->ci->classMapper; + + // Check if name or slug already exists + if ( + isset($data['name']) && + $data['name'] != $group->name && + $classMapper->staticMethod('group', 'where', 'name', $data['name'])->first() + ) { + $ms->addMessageTranslated('danger', 'GROUP.NAME.IN_USE', $data); + $error = TRUE; + } + + if ( + isset($data['slug']) && + $data['slug'] != $group->slug && + $classMapper->staticMethod('group', 'where', 'slug', $data['slug'])->first() + ) { + $ms->addMessageTranslated('danger', 'GROUP.SLUG.IN_USE', $data); + $error = TRUE; + } + + if ($error) { + return $response->withStatus(400); + } + + // Begin transaction - DB will be rolled back if an exception occurs + Capsule::transaction(function () use ($data, $group, $currentUser) { + // Update the group and generate success messages + foreach ($data as $name => $value) { + if ($value != $group->$name) { + $group->$name = $value; + } + } + + $group->save(); + + // Create activity record + $this->ci->userActivityLogger->info("User {$currentUser->user_name} updated details for group {$group->name}.", [ + 'type' => 'group_update_info', + 'user_id' => $currentUser->id + ]); + }); + + $ms->addMessageTranslated('success', 'GROUP.UPDATE', [ + 'name' => $group->name + ]); + + return $response->withStatus(200); + } + + protected function getGroupFromParams($params) { + // Load the request schema + $schema = new RequestSchema('schema://requests/group/get-by-slug.yaml'); + + // Whitelist and set parameter defaults + $transformer = new RequestDataTransformer($schema); + $data = $transformer->transform($params); + + // Validate, and throw exception on validation errors. + $validator = new ServerSideValidator($schema, $this->ci->translator); + if (!$validator->validate($data)) { + $e = new BadRequestException(); + foreach ($validator->errors() as $idx => $field) { + foreach ($field as $eidx => $error) { + $e->addUserMessage($error); + } + } + throw $e; + } + + /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ + $classMapper = $this->ci->classMapper; + + // Get the group + $group = $classMapper->staticMethod('group', 'where', 'slug', $data['slug']) + ->first(); + + return $group; + } +} diff --git a/main/app/sprinkles/admin/src/Controller/PermissionController.php b/main/app/sprinkles/admin/src/Controller/PermissionController.php index e8e542f..133cfe3 100644 --- a/main/app/sprinkles/admin/src/Controller/PermissionController.php +++ b/main/app/sprinkles/admin/src/Controller/PermissionController.php @@ -1,202 +1,202 @@ -ci->authorizer; - - /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ - $currentUser = $this->ci->currentUser; - - // Access-controlled page - if (!$authorizer->checkAccess($currentUser, 'uri_permissions')) { - throw new ForbiddenException(); - } - - $permissionId = $args['id']; - - /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ - $classMapper = $this->ci->classMapper; - - $permission = $classMapper->staticMethod('permission', 'find', $permissionId); - - // If the permission doesn't exist, return 404 - if (!$permission) { - throw new NotFoundException($request, $response); - } - - // Get permission - $result = $permission->load('users')->toArray(); - - // Be careful how you consume this data - it has not been escaped and contains untrusted user-supplied content. - // For example, if you plan to insert it into an HTML DOM, you must escape it on the client side (or use client-side templating). - return $response->withJson($result, 200, JSON_PRETTY_PRINT); - } - - /** - * Returns a list of Permissions - * - * Generates a list of permissions, optionally paginated, sorted and/or filtered. - * This page requires authentication. - * Request type: GET - */ - public function getList($request, $response, $args) { - // GET parameters - $params = $request->getQueryParams(); - - /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager */ - $authorizer = $this->ci->authorizer; - - /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ - $currentUser = $this->ci->currentUser; - - // Access-controlled page - if (!$authorizer->checkAccess($currentUser, 'uri_permissions')) { - throw new ForbiddenException(); - } - - /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ - $classMapper = $this->ci->classMapper; - - $sprunje = $classMapper->createInstance('permission_sprunje', $classMapper, $params); - - // Be careful how you consume this data - it has not been escaped and contains untrusted user-supplied content. - // For example, if you plan to insert it into an HTML DOM, you must escape it on the client side (or use client-side templating). - return $sprunje->toResponse($response); - } - - /** - * Returns a list of Users for a specified Permission. - * - * Generates a list of users, optionally paginated, sorted and/or filtered. - * This page requires authentication. - * Request type: GET - */ - public function getUsers($request, $response, $args) { - // GET parameters - $params = $request->getQueryParams(); - - /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager */ - $authorizer = $this->ci->authorizer; - - /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ - $currentUser = $this->ci->currentUser; - - // Access-controlled page - if (!$authorizer->checkAccess($currentUser, 'uri_permissions')) { - throw new ForbiddenException(); - } - - /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ - $classMapper = $this->ci->classMapper; - - $params['permission_id'] = $args['id']; - - $sprunje = $classMapper->createInstance('permission_user_sprunje', $classMapper, $params); - - $response = $sprunje->toResponse($response); - - // Be careful how you consume this data - it has not been escaped and contains untrusted user-supplied content. - // For example, if you plan to insert it into an HTML DOM, you must escape it on the client side (or use client-side templating). - return $response; - } - - /** - * Renders a page displaying a permission's information, in read-only mode. - * - * This checks that the currently logged-in user has permission to view permissions. - * Note that permissions cannot be modified through the interface. This is because - * permissions are highly coupled to the code and should only be modified by developers. - * This page requires authentication. - * Request type: GET - */ - public function pageInfo($request, $response, $args) { - /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager */ - $authorizer = $this->ci->authorizer; - - /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ - $currentUser = $this->ci->currentUser; - - // Access-controlled page - if (!$authorizer->checkAccess($currentUser, 'uri_permissions')) { - throw new ForbiddenException(); - } - - $permissionId = $args['id']; - - /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ - $classMapper = $this->ci->classMapper; - - $permission = $classMapper->staticMethod('permission', 'find', $permissionId); - - // If the permission doesn't exist, return 404 - if (!$permission) { - throw new NotFoundException($request, $response); - } - - return $this->ci->view->render($response, 'pages/permission.html.twig', [ - 'permission' => $permission - ]); - } - - /** - * Renders the permission listing page. - * - * This page renders a table of permissions, with dropdown menus for admin actions for each permission. - * Actions typically include: edit permission, delete permission. - * This page requires authentication. - * Request type: GET - */ - public function pageList($request, $response, $args) { - /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager */ - $authorizer = $this->ci->authorizer; - - /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ - $currentUser = $this->ci->currentUser; - - // Access-controlled page - if (!$authorizer->checkAccess($currentUser, 'uri_permissions')) { - throw new ForbiddenException(); - } - - return $this->ci->view->render($response, 'pages/permissions.html.twig'); - } -} +ci->authorizer; + + /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ + $currentUser = $this->ci->currentUser; + + // Access-controlled page + if (!$authorizer->checkAccess($currentUser, 'uri_permissions')) { + throw new ForbiddenException(); + } + + $permissionId = $args['id']; + + /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ + $classMapper = $this->ci->classMapper; + + $permission = $classMapper->staticMethod('permission', 'find', $permissionId); + + // If the permission doesn't exist, return 404 + if (!$permission) { + throw new NotFoundException($request, $response); + } + + // Get permission + $result = $permission->load('users')->toArray(); + + // Be careful how you consume this data - it has not been escaped and contains untrusted user-supplied content. + // For example, if you plan to insert it into an HTML DOM, you must escape it on the client side (or use client-side templating). + return $response->withJson($result, 200, JSON_PRETTY_PRINT); + } + + /** + * Returns a list of Permissions + * + * Generates a list of permissions, optionally paginated, sorted and/or filtered. + * This page requires authentication. + * Request type: GET + */ + public function getList($request, $response, $args) { + // GET parameters + $params = $request->getQueryParams(); + + /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager */ + $authorizer = $this->ci->authorizer; + + /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ + $currentUser = $this->ci->currentUser; + + // Access-controlled page + if (!$authorizer->checkAccess($currentUser, 'uri_permissions')) { + throw new ForbiddenException(); + } + + /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ + $classMapper = $this->ci->classMapper; + + $sprunje = $classMapper->createInstance('permission_sprunje', $classMapper, $params); + + // Be careful how you consume this data - it has not been escaped and contains untrusted user-supplied content. + // For example, if you plan to insert it into an HTML DOM, you must escape it on the client side (or use client-side templating). + return $sprunje->toResponse($response); + } + + /** + * Returns a list of Users for a specified Permission. + * + * Generates a list of users, optionally paginated, sorted and/or filtered. + * This page requires authentication. + * Request type: GET + */ + public function getUsers($request, $response, $args) { + // GET parameters + $params = $request->getQueryParams(); + + /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager */ + $authorizer = $this->ci->authorizer; + + /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ + $currentUser = $this->ci->currentUser; + + // Access-controlled page + if (!$authorizer->checkAccess($currentUser, 'uri_permissions')) { + throw new ForbiddenException(); + } + + /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ + $classMapper = $this->ci->classMapper; + + $params['permission_id'] = $args['id']; + + $sprunje = $classMapper->createInstance('permission_user_sprunje', $classMapper, $params); + + $response = $sprunje->toResponse($response); + + // Be careful how you consume this data - it has not been escaped and contains untrusted user-supplied content. + // For example, if you plan to insert it into an HTML DOM, you must escape it on the client side (or use client-side templating). + return $response; + } + + /** + * Renders a page displaying a permission's information, in read-only mode. + * + * This checks that the currently logged-in user has permission to view permissions. + * Note that permissions cannot be modified through the interface. This is because + * permissions are highly coupled to the code and should only be modified by developers. + * This page requires authentication. + * Request type: GET + */ + public function pageInfo($request, $response, $args) { + /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager */ + $authorizer = $this->ci->authorizer; + + /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ + $currentUser = $this->ci->currentUser; + + // Access-controlled page + if (!$authorizer->checkAccess($currentUser, 'uri_permissions')) { + throw new ForbiddenException(); + } + + $permissionId = $args['id']; + + /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ + $classMapper = $this->ci->classMapper; + + $permission = $classMapper->staticMethod('permission', 'find', $permissionId); + + // If the permission doesn't exist, return 404 + if (!$permission) { + throw new NotFoundException($request, $response); + } + + return $this->ci->view->render($response, 'pages/permission.html.twig', [ + 'permission' => $permission + ]); + } + + /** + * Renders the permission listing page. + * + * This page renders a table of permissions, with dropdown menus for admin actions for each permission. + * Actions typically include: edit permission, delete permission. + * This page requires authentication. + * Request type: GET + */ + public function pageList($request, $response, $args) { + /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager */ + $authorizer = $this->ci->authorizer; + + /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ + $currentUser = $this->ci->currentUser; + + // Access-controlled page + if (!$authorizer->checkAccess($currentUser, 'uri_permissions')) { + throw new ForbiddenException(); + } + + return $this->ci->view->render($response, 'pages/permissions.html.twig'); + } +} diff --git a/main/app/sprinkles/admin/src/Controller/PostController.php b/main/app/sprinkles/admin/src/Controller/PostController.php index a310237..cab87cd 100644 --- a/main/app/sprinkles/admin/src/Controller/PostController.php +++ b/main/app/sprinkles/admin/src/Controller/PostController.php @@ -1,191 +1,191 @@ -getUserFromParams($args); - - // If the user doesn't exist, return 404 - if (!$user) { - throw new NotFoundException(); - } - - // Get friends first // TODO: Make friend select query more efficient - $UsersFriends = DB::select("SELECT id FROM (SELECT user_id AS id FROM user_follow WHERE followed_by_id = $user->id UNION ALL SELECT followed_by_id FROM user_follow WHERE user_id = $user->id) t GROUP BY id HAVING COUNT(id) > 1"); - - /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ - $classMapper = $this->ci->classMapper; - $ImagesFromFriends = ""; - $config = $this->ci->config; - foreach ($UsersFriends as $UsersFriendId) { // NOT THAT EFFICIENT... (get images from all friends in an array) - $UsersFriendInformation = $classMapper->createInstance('user')// raw select doesnt work with instance - ->where('id', $UsersFriendId->id) - ->get(); - - $ImagesFromFriends = DB::table('image_posts') - ->where('UserID', '=', $UsersFriendInformation[0]->id) // IMAGES FROM FRIENDS - ->orWhere('UserId', '=', $user->id) // IMAGES FROM THE USER HIMSELF - ->select('PostID as image_id', 'UserID as user_id') - ->get(); - - foreach ($ImagesFromFriends as $ImageFromFriend) { - $ImageFromFriend->image_url = $config["site.uri.public"] . "/image/" . $ImageFromFriend->image_id; - if ($ImageFromFriend->user_id == $user->id) { // UPLOADED FROM HIMSELF - $ImageFromFriend->full_name = $user->full_name; // ADD USERNAME TO IMAGE ID - $ImageFromFriend->avatar = $user->avatar; - } else { // UPLOADED FROM ANOTHER USER - $ImageFromFriend->full_name = $UsersFriendInformation[0]->full_name; // ADD USERNAME TO IMAGE ID - $ImageFromFriend->avatar = $UsersFriendInformation[0]->avatar; - } - } - } - - return $response->withJson($ImagesFromFriends, 200, JSON_PRETTY_PRINT); - } - - /** - * Shows the requested image - * - * @param Request $request - * @param Response $response - * @param $args - * @return Response - * @throws ForbiddenException - * @throws NotFoundException - */ - public function showImage(Request $request, Response $response, $args) { - // check if user is authorized - $authorizer = $this->ci->authorizer; - $currentUser = $this->ci->currentUser; - if (!$authorizer->checkAccess($currentUser, 'view_image')) { - throw new ForbiddenException(); - } - $postID = $args['post_id']; - - // get filename from database - $FileRequestedImage = DB::table('image_posts') - ->where('PostID', '=', $postID) - ->value('File'); - - if ($FileRequestedImage) { - $FileType = pathinfo($FileRequestedImage, PATHINFO_EXTENSION); - - // echo image - $response->write(file_get_contents(__DIR__ . '/../../../../../uploads/' . $FileRequestedImage)); - return $response->withHeader('Content-type', 'image/' . $FileType); - } else { - throw new NotFoundException(); - } - } - - /** - * posts a image - * - * @param Request $request - * @param Response $response - * @return Response - * @throws ForbiddenException - */ - public function postImage(Request $request, Response $response) { - // check if user is authorized - $authorizer = $this->ci->authorizer; - $currentUser = $this->ci->currentUser; - if (!$authorizer->checkAccess($currentUser, 'post_image')) { - throw new ForbiddenException(); - } - - $uploadedFiles = $request->getUploadedFiles(); - $uploadedFile = $uploadedFiles['image']; - - if (!strpos($uploadedFile->getClientMediaType(), "mage")) { - return $response->withStatus(415); - } else if ($uploadedFile->getError() === 1) { - return $response->withStatus(406); - } else if ($uploadedFile->getSize() > 10485760) { - return $response->withStatus(413); - } else { // Upload is accepted - // Move file to upload directory - $extension = pathinfo($uploadedFile->getClientFilename(), PATHINFO_EXTENSION); - $basename = bin2hex(random_bytes(8)); - $filename = sprintf('%s.%0.8s', $basename, $extension); - $uploadedFile->moveTo(__DIR__ . '/../../../../../uploads' . DIRECTORY_SEPARATOR . $filename); - - // Store in Database - DB::table('image_posts') - ->insert(['UserID' => $currentUser->id, 'File' => $filename]); - - return $response->write('Uploaded successfully!
'); - } - } - - /** - * @param $params - * @return mixed - * @throws BadRequestException - */ - protected function getUserFromParams($params) { - // Load the request schema - $schema = new RequestSchema('schema://requests/user/get-by-username.yaml'); - - // Whitelist and set parameter defaults - $transformer = new RequestDataTransformer($schema); - $data = $transformer->transform($params); - - // Validate, and throw exception on validation errors. - $validator = new ServerSideValidator($schema, $this->ci->translator); - if (!$validator->validate($data)) { - $e = new BadRequestException(); - foreach ($validator->errors() as $idx => $field) { - foreach ($field as $eidx => $error) { - $e->addUserMessage($error); - } - } - throw $e; - } - - /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ - $classMapper = $this->ci->classMapper; - - // Get the user to delete - $user = $classMapper->staticMethod('user', 'where', 'user_name', $data['user_name']) - ->first(); - - return $user; - } -} +getUserFromParams($args); + + // If the user doesn't exist, return 404 + if (!$user) { + throw new NotFoundException(); + } + + // Get friends first // TODO: Make friend select query more efficient + $UsersFriends = DB::select("SELECT id FROM (SELECT user_id AS id FROM user_follow WHERE followed_by_id = $user->id UNION ALL SELECT followed_by_id FROM user_follow WHERE user_id = $user->id) t GROUP BY id HAVING COUNT(id) > 1"); + + /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ + $classMapper = $this->ci->classMapper; + $ImagesFromFriends = ""; + $config = $this->ci->config; + foreach ($UsersFriends as $UsersFriendId) { // NOT THAT EFFICIENT... (get images from all friends in an array) + $UsersFriendInformation = $classMapper->createInstance('user')// raw select doesnt work with instance + ->where('id', $UsersFriendId->id) + ->get(); + + $ImagesFromFriends = DB::table('image_posts') + ->where('UserID', '=', $UsersFriendInformation[0]->id) // IMAGES FROM FRIENDS + ->orWhere('UserId', '=', $user->id) // IMAGES FROM THE USER HIMSELF + ->select('PostID as image_id', 'UserID as user_id') + ->get(); + + foreach ($ImagesFromFriends as $ImageFromFriend) { + $ImageFromFriend->image_url = $config["site.uri.public"] . "/image/" . $ImageFromFriend->image_id; + if ($ImageFromFriend->user_id == $user->id) { // UPLOADED FROM HIMSELF + $ImageFromFriend->full_name = $user->full_name; // ADD USERNAME TO IMAGE ID + $ImageFromFriend->avatar = $user->avatar; + } else { // UPLOADED FROM ANOTHER USER + $ImageFromFriend->full_name = $UsersFriendInformation[0]->full_name; // ADD USERNAME TO IMAGE ID + $ImageFromFriend->avatar = $UsersFriendInformation[0]->avatar; + } + } + } + + return $response->withJson($ImagesFromFriends, 200, JSON_PRETTY_PRINT); + } + + /** + * Shows the requested image + * + * @param Request $request + * @param Response $response + * @param $args + * @return Response + * @throws ForbiddenException + * @throws NotFoundException + */ + public function showImage(Request $request, Response $response, $args) { + // check if user is authorized + $authorizer = $this->ci->authorizer; + $currentUser = $this->ci->currentUser; + if (!$authorizer->checkAccess($currentUser, 'view_image')) { + throw new ForbiddenException(); + } + $postID = $args['post_id']; + + // get filename from database + $FileRequestedImage = DB::table('image_posts') + ->where('PostID', '=', $postID) + ->value('File'); + + if ($FileRequestedImage) { + $FileType = pathinfo($FileRequestedImage, PATHINFO_EXTENSION); + + // echo image + $response->write(file_get_contents(__DIR__ . '/../../../../../uploads/' . $FileRequestedImage)); + return $response->withHeader('Content-type', 'image/' . $FileType); + } else { + throw new NotFoundException(); + } + } + + /** + * posts a image + * + * @param Request $request + * @param Response $response + * @return Response + * @throws ForbiddenException + */ + public function postImage(Request $request, Response $response) { + // check if user is authorized + $authorizer = $this->ci->authorizer; + $currentUser = $this->ci->currentUser; + if (!$authorizer->checkAccess($currentUser, 'post_image')) { + throw new ForbiddenException(); + } + + $uploadedFiles = $request->getUploadedFiles(); + $uploadedFile = $uploadedFiles['image']; + + if (!strpos($uploadedFile->getClientMediaType(), "mage")) { + return $response->withStatus(415); + } else if ($uploadedFile->getError() === 1) { + return $response->withStatus(406); + } else if ($uploadedFile->getSize() > 10485760) { + return $response->withStatus(413); + } else { // Upload is accepted + // Move file to upload directory + $extension = pathinfo($uploadedFile->getClientFilename(), PATHINFO_EXTENSION); + $basename = bin2hex(random_bytes(8)); + $filename = sprintf('%s.%0.8s', $basename, $extension); + $uploadedFile->moveTo(__DIR__ . '/../../../../../uploads' . DIRECTORY_SEPARATOR . $filename); + + // Store in Database + DB::table('image_posts') + ->insert(['UserID' => $currentUser->id, 'File' => $filename]); + + return $response->write('Uploaded successfully!
'); + } + } + + /** + * @param $params + * @return mixed + * @throws BadRequestException + */ + protected function getUserFromParams($params) { + // Load the request schema + $schema = new RequestSchema('schema://requests/user/get-by-username.yaml'); + + // Whitelist and set parameter defaults + $transformer = new RequestDataTransformer($schema); + $data = $transformer->transform($params); + + // Validate, and throw exception on validation errors. + $validator = new ServerSideValidator($schema, $this->ci->translator); + if (!$validator->validate($data)) { + $e = new BadRequestException(); + foreach ($validator->errors() as $idx => $field) { + foreach ($field as $eidx => $error) { + $e->addUserMessage($error); + } + } + throw $e; + } + + /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ + $classMapper = $this->ci->classMapper; + + // Get the user to delete + $user = $classMapper->staticMethod('user', 'where', 'user_name', $data['user_name']) + ->first(); + + return $user; + } +} diff --git a/main/app/sprinkles/admin/src/Controller/RoleController.php b/main/app/sprinkles/admin/src/Controller/RoleController.php index 80ac6a0..af1d53c 100644 --- a/main/app/sprinkles/admin/src/Controller/RoleController.php +++ b/main/app/sprinkles/admin/src/Controller/RoleController.php @@ -1,915 +1,915 @@ -getParsedBody(); - - /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ - $authorizer = $this->ci->authorizer; - - /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ - $currentUser = $this->ci->currentUser; - - // Access-controlled page - if (!$authorizer->checkAccess($currentUser, 'create_role')) { - throw new ForbiddenException(); - } - - /** @var UserFrosting\Sprinkle\Core\MessageStream $ms */ - $ms = $this->ci->alerts; - - // Load the request schema - $schema = new RequestSchema('schema://requests/role/create.yaml'); - - // Whitelist and set parameter defaults - $transformer = new RequestDataTransformer($schema); - $data = $transformer->transform($params); - - $error = FALSE; - - // Validate request data - $validator = new ServerSideValidator($schema, $this->ci->translator); - if (!$validator->validate($data)) { - $ms->addValidationErrors($validator); - $error = TRUE; - } - - /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ - $classMapper = $this->ci->classMapper; - - // Check if name or slug already exists - if ($classMapper->staticMethod('role', 'where', 'name', $data['name'])->first()) { - $ms->addMessageTranslated('danger', 'ROLE.NAME_IN_USE', $data); - $error = TRUE; - } - - if ($classMapper->staticMethod('role', 'where', 'slug', $data['slug'])->first()) { - $ms->addMessageTranslated('danger', 'SLUG_IN_USE', $data); - $error = TRUE; - } - - if ($error) { - return $response->withStatus(400); - } - - /** @var UserFrosting\Config\Config $config */ - $config = $this->ci->config; - - // All checks passed! log events/activities and create role - // Begin transaction - DB will be rolled back if an exception occurs - Capsule::transaction(function () use ($classMapper, $data, $ms, $config, $currentUser) { - // Create the role - $role = $classMapper->createInstance('role', $data); - - // Store new role to database - $role->save(); - - // Create activity record - $this->ci->userActivityLogger->info("User {$currentUser->user_name} created role {$role->name}.", [ - 'type' => 'role_create', - 'user_id' => $currentUser->id - ]); - - $ms->addMessageTranslated('success', 'ROLE.CREATION_SUCCESSFUL', $data); - }); - - return $response->withStatus(200); - } - - /** - * Processes the request to delete an existing role. - * - * Deletes the specified role. - * Before doing so, checks that: - * 1. The user has permission to delete this role; - * 2. The role is not a default for new users; - * 3. The role does not have any associated users; - * 4. The submitted data is valid. - * This route requires authentication (and should generally be limited to admins or the root user). - * Request type: DELETE - */ - public function delete($request, $response, $args) { - $role = $this->getRoleFromParams($args); - - // If the role doesn't exist, return 404 - if (!$role) { - throw new NotFoundException($request, $response); - } - - /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ - $authorizer = $this->ci->authorizer; - - /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ - $currentUser = $this->ci->currentUser; - - // Access-controlled page - if (!$authorizer->checkAccess($currentUser, 'delete_role', [ - 'role' => $role - ])) { - throw new ForbiddenException(); - } - - /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ - $classMapper = $this->ci->classMapper; - - // Check that we are not deleting a default role - $defaultRoleSlugs = $classMapper->staticMethod('role', 'getDefaultSlugs'); - - // Need to use loose comparison for now, because some DBs return `id` as a string - if (in_array($role->slug, $defaultRoleSlugs)) { - $e = new BadRequestException(); - $e->addUserMessage('ROLE.DELETE_DEFAULT'); - throw $e; - } - - // Check if there are any users associated with this role - $countUsers = $role->users()->count(); - if ($countUsers > 0) { - $e = new BadRequestException(); - $e->addUserMessage('ROLE.HAS_USERS'); - throw $e; - } - - $roleName = $role->name; - - // Begin transaction - DB will be rolled back if an exception occurs - Capsule::transaction(function () use ($role, $roleName, $currentUser) { - $role->delete(); - unset($role); - - // Create activity record - $this->ci->userActivityLogger->info("User {$currentUser->user_name} deleted role {$roleName}.", [ - 'type' => 'role_delete', - 'user_id' => $currentUser->id - ]); - }); - - /** @var UserFrosting\Sprinkle\Core\MessageStream $ms */ - $ms = $this->ci->alerts; - - $ms->addMessageTranslated('success', 'ROLE.DELETION_SUCCESSFUL', [ - 'name' => $roleName - ]); - - return $response->withStatus(200); - } - - /** - * Returns info for a single role, along with associated permissions. - * - * This page requires authentication. - * Request type: GET - */ - public function getInfo($request, $response, $args) { - /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager */ - $authorizer = $this->ci->authorizer; - - /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ - $currentUser = $this->ci->currentUser; - - // Access-controlled page - if (!$authorizer->checkAccess($currentUser, 'uri_roles')) { - throw new ForbiddenException(); - } - - $slug = $args['slug']; - - /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ - $classMapper = $this->ci->classMapper; - - $role = $classMapper->staticMethod('role', 'where', 'slug', $slug)->first(); - - // If the role doesn't exist, return 404 - if (!$role) { - throw new NotFoundException($request, $response); - } - - // Get role - $result = $role->load('permissions')->toArray(); - - // Be careful how you consume this data - it has not been escaped and contains untrusted user-supplied content. - // For example, if you plan to insert it into an HTML DOM, you must escape it on the client side (or use client-side templating). - return $response->withJson($result, 200, JSON_PRETTY_PRINT); - } - - /** - * Returns a list of Roles - * - * Generates a list of roles, optionally paginated, sorted and/or filtered. - * This page requires authentication. - * Request type: GET - */ - public function getList($request, $response, $args) { - // GET parameters - $params = $request->getQueryParams(); - - /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ - $authorizer = $this->ci->authorizer; - - /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ - $currentUser = $this->ci->currentUser; - - // Access-controlled page - if (!$authorizer->checkAccess($currentUser, 'uri_roles')) { - throw new ForbiddenException(); - } - - /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ - $classMapper = $this->ci->classMapper; - - $sprunje = $classMapper->createInstance('role_sprunje', $classMapper, $params); - - // Be careful how you consume this data - it has not been escaped and contains untrusted user-supplied content. - // For example, if you plan to insert it into an HTML DOM, you must escape it on the client side (or use client-side templating). - return $sprunje->toResponse($response); - } - - public function getModalConfirmDelete($request, $response, $args) { - // GET parameters - $params = $request->getQueryParams(); - - $role = $this->getRoleFromParams($params); - - // If the role no longer exists, forward to main role listing page - if (!$role) { - throw new NotFoundException($request, $response); - } - - /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ - $authorizer = $this->ci->authorizer; - - /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ - $currentUser = $this->ci->currentUser; - - // Access-controlled page - if (!$authorizer->checkAccess($currentUser, 'delete_role', [ - 'role' => $role - ])) { - throw new ForbiddenException(); - } - - /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ - $classMapper = $this->ci->classMapper; - - // Check that we are not deleting a default role - $defaultRoleSlugs = $classMapper->staticMethod('role', 'getDefaultSlugs'); - - // Need to use loose comparison for now, because some DBs return `id` as a string - if (in_array($role->slug, $defaultRoleSlugs)) { - $e = new BadRequestException(); - $e->addUserMessage('ROLE.DELETE_DEFAULT', $role->toArray()); - throw $e; - } - - // Check if there are any users associated with this role - $countUsers = $role->users()->count(); - if ($countUsers > 0) { - $e = new BadRequestException(); - $e->addUserMessage('ROLE.HAS_USERS', $role->toArray()); - throw $e; - } - - return $this->ci->view->render($response, 'modals/confirm-delete-role.html.twig', [ - 'role' => $role, - 'form' => [ - 'action' => "api/roles/r/{$role->slug}", - ] - ]); - } - - /** - * Renders the modal form for creating a new role. - * - * This does NOT render a complete page. Instead, it renders the HTML for the modal, which can be embedded in other pages. - * This page requires authentication. - * Request type: GET - */ - public function getModalCreate($request, $response, $args) { - // GET parameters - $params = $request->getQueryParams(); - - /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ - $authorizer = $this->ci->authorizer; - - /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ - $currentUser = $this->ci->currentUser; - - /** @var UserFrosting\I18n\MessageTranslator $translator */ - $translator = $this->ci->translator; - - // Access-controlled page - if (!$authorizer->checkAccess($currentUser, 'create_role')) { - throw new ForbiddenException(); - } - - /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ - $classMapper = $this->ci->classMapper; - - // Create a dummy role to prepopulate fields - $role = $classMapper->createInstance('role', []); - - $fieldNames = ['name', 'slug', 'description']; - $fields = [ - 'hidden' => [], - 'disabled' => [] - ]; - - // Load validation rules - $schema = new RequestSchema('schema://requests/role/create.yaml'); - $validator = new JqueryValidationAdapter($schema, $this->ci->translator); - - return $this->ci->view->render($response, 'modals/role.html.twig', [ - 'role' => $role, - 'form' => [ - 'action' => 'api/roles', - 'method' => 'POST', - 'fields' => $fields, - 'submit_text' => $translator->translate('CREATE') - ], - 'page' => [ - 'validators' => $validator->rules('json', FALSE) - ] - ]); - } - - /** - * Renders the modal form for editing an existing role. - * - * This does NOT render a complete page. Instead, it renders the HTML for the modal, which can be embedded in other pages. - * This page requires authentication. - * Request type: GET - */ - public function getModalEdit($request, $response, $args) { - // GET parameters - $params = $request->getQueryParams(); - - $role = $this->getRoleFromParams($params); - - // If the role doesn't exist, return 404 - if (!$role) { - throw new NotFoundException($request, $response); - } - - /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ - $classMapper = $this->ci->classMapper; - - /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ - $authorizer = $this->ci->authorizer; - - /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ - $currentUser = $this->ci->currentUser; - - /** @var UserFrosting\I18n\MessageTranslator $translator */ - $translator = $this->ci->translator; - - // Access-controlled resource - check that currentUser has permission to edit basic fields "name", "slug", "description" for this role - $fieldNames = ['name', 'slug', 'description']; - if (!$authorizer->checkAccess($currentUser, 'update_role_field', [ - 'role' => $role, - 'fields' => $fieldNames - ])) { - throw new ForbiddenException(); - } - - // Generate form - $fields = [ - 'hidden' => [], - 'disabled' => [] - ]; - - // Load validation rules - $schema = new RequestSchema('schema://requests/role/edit-info.yaml'); - $validator = new JqueryValidationAdapter($schema, $translator); - - return $this->ci->view->render($response, 'modals/role.html.twig', [ - 'role' => $role, - 'form' => [ - 'action' => "api/roles/r/{$role->slug}", - 'method' => 'PUT', - 'fields' => $fields, - 'submit_text' => $translator->translate('UPDATE') - ], - 'page' => [ - 'validators' => $validator->rules('json', FALSE) - ] - ]); - } - - /** - * Renders the modal form for editing a role's permissions. - * - * This does NOT render a complete page. Instead, it renders the HTML for the form, which can be embedded in other pages. - * This page requires authentication. - * Request type: GET - */ - public function getModalEditPermissions($request, $response, $args) { - // GET parameters - $params = $request->getQueryParams(); - - $role = $this->getRoleFromParams($params); - - // If the role doesn't exist, return 404 - if (!$role) { - throw new NotFoundException($request, $response); - } - - /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ - $authorizer = $this->ci->authorizer; - - /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ - $currentUser = $this->ci->currentUser; - - // Access-controlled resource - check that currentUser has permission to edit "permissions" field for this role - if (!$authorizer->checkAccess($currentUser, 'update_role_field', [ - 'role' => $role, - 'fields' => ['permissions'] - ])) { - throw new ForbiddenException(); - } - - return $this->ci->view->render($response, 'modals/role-manage-permissions.html.twig', [ - 'role' => $role - ]); - } - - /** - * Returns a list of Permissions for a specified Role. - * - * Generates a list of permissions, optionally paginated, sorted and/or filtered. - * This page requires authentication. - * Request type: GET - */ - public function getPermissions($request, $response, $args) { - $role = $this->getRoleFromParams($args); - - // If the role no longer exists, forward to main role listing page - if (!$role) { - throw new NotFoundException($request, $response); - } - - // GET parameters - $params = $request->getQueryParams(); - - /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ - $authorizer = $this->ci->authorizer; - - /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ - $currentUser = $this->ci->currentUser; - - // Access-controlled page - if (!$authorizer->checkAccess($currentUser, 'view_role_field', [ - 'role' => $role, - 'property' => 'permissions' - ])) { - throw new ForbiddenException(); - } - - /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ - $classMapper = $this->ci->classMapper; - - $sprunje = $classMapper->createInstance('permission_sprunje', $classMapper, $params); - $sprunje->extendQuery(function ($query) use ($role) { - return $query->forRole($role->id); - }); - - // Be careful how you consume this data - it has not been escaped and contains untrusted user-supplied content. - // For example, if you plan to insert it into an HTML DOM, you must escape it on the client side (or use client-side templating). - return $sprunje->toResponse($response); - } - - /** - * Returns users associated with a single role. - * - * This page requires authentication. - * Request type: GET - */ - public function getUsers($request, $response, $args) { - $role = $this->getRoleFromParams($args); - - // If the role doesn't exist, return 404 - if (!$role) { - throw new NotFoundException($request, $response); - } - - /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ - $classMapper = $this->ci->classMapper; - - // GET parameters - $params = $request->getQueryParams(); - - /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ - $authorizer = $this->ci->authorizer; - - /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ - $currentUser = $this->ci->currentUser; - - // Access-controlled page - if (!$authorizer->checkAccess($currentUser, 'view_role_field', [ - 'role' => $role, - 'property' => 'users' - ])) { - throw new ForbiddenException(); - } - - $sprunje = $classMapper->createInstance('user_sprunje', $classMapper, $params); - $sprunje->extendQuery(function ($query) use ($role) { - return $query->forRole($role->id); - }); - - // Be careful how you consume this data - it has not been escaped and contains untrusted user-supplied content. - // For example, if you plan to insert it into an HTML DOM, you must escape it on the client side (or use client-side templating). - return $sprunje->toResponse($response); - } - - /** - * Renders a page displaying a role's information, in read-only mode. - * - * This checks that the currently logged-in user has permission to view the requested role's info. - * It checks each field individually, showing only those that you have permission to view. - * This will also try to show buttons for deleting and editing the role. - * This page requires authentication. - * Request type: GET - */ - public function pageInfo($request, $response, $args) { - $role = $this->getRoleFromParams($args); - - // If the role no longer exists, forward to main role listing page - if (!$role) { - $redirectPage = $this->ci->router->pathFor('uri_roles'); - return $response->withRedirect($redirectPage, 404); - } - - /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ - $authorizer = $this->ci->authorizer; - - /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ - $currentUser = $this->ci->currentUser; - - // Access-controlled page - if (!$authorizer->checkAccess($currentUser, 'uri_role', [ - 'role' => $role - ])) { - throw new ForbiddenException(); - } - - // Determine fields that currentUser is authorized to view - $fieldNames = ['name', 'slug', 'description']; - - // Generate form - $fields = [ - 'hidden' => [] - ]; - - foreach ($fieldNames as $field) { - if (!$authorizer->checkAccess($currentUser, 'view_role_field', [ - 'role' => $role, - 'property' => $field - ])) { - $fields['hidden'][] = $field; - } - } - - // Determine buttons to display - $editButtons = [ - 'hidden' => [] - ]; - - if (!$authorizer->checkAccess($currentUser, 'update_role_field', [ - 'role' => $role, - 'fields' => ['name', 'slug', 'description'] - ])) { - $editButtons['hidden'][] = 'edit'; - } - - if (!$authorizer->checkAccess($currentUser, 'delete_role', [ - 'role' => $role - ])) { - $editButtons['hidden'][] = 'delete'; - } - - return $this->ci->view->render($response, 'pages/role.html.twig', [ - 'role' => $role, - 'fields' => $fields, - 'tools' => $editButtons - ]); - } - - /** - * Renders the role listing page. - * - * This page renders a table of roles, with dropdown menus for admin actions for each role. - * Actions typically include: edit role, delete role. - * This page requires authentication. - * Request type: GET - */ - public function pageList($request, $response, $args) { - /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ - $authorizer = $this->ci->authorizer; - - /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ - $currentUser = $this->ci->currentUser; - - // Access-controlled page - if (!$authorizer->checkAccess($currentUser, 'uri_roles')) { - throw new ForbiddenException(); - } - - return $this->ci->view->render($response, 'pages/roles.html.twig'); - } - - /** - * Processes the request to update an existing role's details. - * - * Processes the request from the role update form, checking that: - * 1. The role name/slug are not already in use; - * 2. The user has the necessary permissions to update the posted field(s); - * 3. The submitted data is valid. - * This route requires authentication (and should generally be limited to admins or the root user). - * Request type: PUT - * @see getModalRoleEdit - */ - public function updateInfo($request, $response, $args) { - // Get the role based on slug in the URL - $role = $this->getRoleFromParams($args); - - if (!$role) { - throw new NotFoundException($request, $response); - } - - /** @var UserFrosting\Config\Config $config */ - $config = $this->ci->config; - - // Get PUT parameters: (name, slug, description) - $params = $request->getParsedBody(); - - /** @var UserFrosting\I18n\MessageTranslator $translator */ - $ms = $this->ci->alerts; - - // Load the request schema - $schema = new RequestSchema('schema://requests/role/edit-info.yaml'); - - // Whitelist and set parameter defaults - $transformer = new RequestDataTransformer($schema); - $data = $transformer->transform($params); - - $error = FALSE; - - // Validate request data - $validator = new ServerSideValidator($schema, $this->ci->translator); - if (!$validator->validate($data)) { - $ms->addValidationErrors($validator); - $error = TRUE; - } - - // Determine targeted fields - $fieldNames = []; - foreach ($data as $name => $value) { - $fieldNames[] = $name; - } - - /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ - $authorizer = $this->ci->authorizer; - - /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ - $currentUser = $this->ci->currentUser; - - // Access-controlled resource - check that currentUser has permission to edit submitted fields for this role - if (!$authorizer->checkAccess($currentUser, 'update_role_field', [ - 'role' => $role, - 'fields' => array_values(array_unique($fieldNames)) - ])) { - throw new ForbiddenException(); - } - - /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ - $classMapper = $this->ci->classMapper; - - // Check if name or slug already exists - if ( - isset($data['name']) && - $data['name'] != $role->name && - $classMapper->staticMethod('role', 'where', 'name', $data['name'])->first() - ) { - $ms->addMessageTranslated('danger', 'ROLE.NAME_IN_USE', $data); - $error = TRUE; - } - - if ( - isset($data['slug']) && - $data['slug'] != $role->slug && - $classMapper->staticMethod('role', 'where', 'slug', $data['slug'])->first() - ) { - $ms->addMessageTranslated('danger', 'SLUG_IN_USE', $data); - $error = TRUE; - } - - if ($error) { - return $response->withStatus(400); - } - - // Begin transaction - DB will be rolled back if an exception occurs - Capsule::transaction(function () use ($data, $role, $currentUser) { - // Update the role and generate success messages - foreach ($data as $name => $value) { - if ($value != $role->$name) { - $role->$name = $value; - } - } - - $role->save(); - - // Create activity record - $this->ci->userActivityLogger->info("User {$currentUser->user_name} updated details for role {$role->name}.", [ - 'type' => 'role_update_info', - 'user_id' => $currentUser->id - ]); - }); - - $ms->addMessageTranslated('success', 'ROLE.UPDATED', [ - 'name' => $role->name - ]); - - return $response->withStatus(200); - } - - /** - * Processes the request to update a specific field for an existing role, including permissions. - * - * Processes the request from the role update form, checking that: - * 1. The logged-in user has the necessary permissions to update the putted field(s); - * 2. The submitted data is valid. - * This route requires authentication. - * Request type: PUT - */ - public function updateField($request, $response, $args) { - // Get the username from the URL - $role = $this->getRoleFromParams($args); - - if (!$role) { - throw new NotFoundException($request, $response); - } - - // Get key->value pair from URL and request body - $fieldName = $args['field']; - - /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ - $authorizer = $this->ci->authorizer; - - /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ - $currentUser = $this->ci->currentUser; - - // Access-controlled resource - check that currentUser has permission to edit the specified field for this user - if (!$authorizer->checkAccess($currentUser, 'update_role_field', [ - 'role' => $role, - 'fields' => [$fieldName] - ])) { - throw new ForbiddenException(); - } - - /** @var UserFrosting\Config\Config $config */ - $config = $this->ci->config; - - // Get PUT parameters: value - $put = $request->getParsedBody(); - - if (!isset($put['value'])) { - throw new BadRequestException(); - } - - $params = [ - $fieldName => $put['value'] - ]; - - // Validate key -> value pair - - // Load the request schema - $schema = new RequestSchema('schema://requests/role/edit-field.yaml'); - - // Whitelist and set parameter defaults - $transformer = new RequestDataTransformer($schema); - $data = $transformer->transform($params); - - // Validate, and throw exception on validation errors. - $validator = new ServerSideValidator($schema, $this->ci->translator); - if (!$validator->validate($data)) { - $e = new BadRequestException(); - foreach ($validator->errors() as $idx => $field) { - foreach ($field as $eidx => $error) { - $e->addUserMessage($error); - } - } - throw $e; - } - - // Get validated and transformed value - $fieldValue = $data[$fieldName]; - - /** @var UserFrosting\I18n\MessageTranslator $translator */ - $ms = $this->ci->alerts; - - // Begin transaction - DB will be rolled back if an exception occurs - Capsule::transaction(function () use ($fieldName, $fieldValue, $role, $currentUser) { - if ($fieldName == 'permissions') { - $newPermissions = collect($fieldValue)->pluck('permission_id')->all(); - $role->permissions()->sync($newPermissions); - } else { - $role->$fieldName = $fieldValue; - $role->save(); - } - - // Create activity record - $this->ci->userActivityLogger->info("User {$currentUser->user_name} updated property '$fieldName' for role {$role->name}.", [ - 'type' => 'role_update_field', - 'user_id' => $currentUser->id - ]); - }); - - // Add success messages - if ($fieldName == 'permissions') { - $ms->addMessageTranslated('success', 'ROLE.PERMISSIONS_UPDATED', [ - 'name' => $role->name - ]); - } else { - $ms->addMessageTranslated('success', 'ROLE.UPDATED', [ - 'name' => $role->name - ]); - } - - return $response->withStatus(200); - } - - protected function getRoleFromParams($params) { - // Load the request schema - $schema = new RequestSchema('schema://requests/role/get-by-slug.yaml'); - - // Whitelist and set parameter defaults - $transformer = new RequestDataTransformer($schema); - $data = $transformer->transform($params); - - // Validate, and throw exception on validation errors. - $validator = new ServerSideValidator($schema, $this->ci->translator); - if (!$validator->validate($data)) { - // encapsulate the communication of error messages from ServerSideValidator to the BadRequestException - $e = new BadRequestException(); - foreach ($validator->errors() as $idx => $field) { - foreach ($field as $eidx => $error) { - $e->addUserMessage($error); - } - } - throw $e; - } - - /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ - $classMapper = $this->ci->classMapper; - - // Get the role - $role = $classMapper->staticMethod('role', 'where', 'slug', $data['slug']) - ->first(); - - return $role; - } -} +getParsedBody(); + + /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ + $authorizer = $this->ci->authorizer; + + /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ + $currentUser = $this->ci->currentUser; + + // Access-controlled page + if (!$authorizer->checkAccess($currentUser, 'create_role')) { + throw new ForbiddenException(); + } + + /** @var UserFrosting\Sprinkle\Core\MessageStream $ms */ + $ms = $this->ci->alerts; + + // Load the request schema + $schema = new RequestSchema('schema://requests/role/create.yaml'); + + // Whitelist and set parameter defaults + $transformer = new RequestDataTransformer($schema); + $data = $transformer->transform($params); + + $error = FALSE; + + // Validate request data + $validator = new ServerSideValidator($schema, $this->ci->translator); + if (!$validator->validate($data)) { + $ms->addValidationErrors($validator); + $error = TRUE; + } + + /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ + $classMapper = $this->ci->classMapper; + + // Check if name or slug already exists + if ($classMapper->staticMethod('role', 'where', 'name', $data['name'])->first()) { + $ms->addMessageTranslated('danger', 'ROLE.NAME_IN_USE', $data); + $error = TRUE; + } + + if ($classMapper->staticMethod('role', 'where', 'slug', $data['slug'])->first()) { + $ms->addMessageTranslated('danger', 'SLUG_IN_USE', $data); + $error = TRUE; + } + + if ($error) { + return $response->withStatus(400); + } + + /** @var UserFrosting\Config\Config $config */ + $config = $this->ci->config; + + // All checks passed! log events/activities and create role + // Begin transaction - DB will be rolled back if an exception occurs + Capsule::transaction(function () use ($classMapper, $data, $ms, $config, $currentUser) { + // Create the role + $role = $classMapper->createInstance('role', $data); + + // Store new role to database + $role->save(); + + // Create activity record + $this->ci->userActivityLogger->info("User {$currentUser->user_name} created role {$role->name}.", [ + 'type' => 'role_create', + 'user_id' => $currentUser->id + ]); + + $ms->addMessageTranslated('success', 'ROLE.CREATION_SUCCESSFUL', $data); + }); + + return $response->withStatus(200); + } + + /** + * Processes the request to delete an existing role. + * + * Deletes the specified role. + * Before doing so, checks that: + * 1. The user has permission to delete this role; + * 2. The role is not a default for new users; + * 3. The role does not have any associated users; + * 4. The submitted data is valid. + * This route requires authentication (and should generally be limited to admins or the root user). + * Request type: DELETE + */ + public function delete($request, $response, $args) { + $role = $this->getRoleFromParams($args); + + // If the role doesn't exist, return 404 + if (!$role) { + throw new NotFoundException($request, $response); + } + + /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ + $authorizer = $this->ci->authorizer; + + /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ + $currentUser = $this->ci->currentUser; + + // Access-controlled page + if (!$authorizer->checkAccess($currentUser, 'delete_role', [ + 'role' => $role + ])) { + throw new ForbiddenException(); + } + + /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ + $classMapper = $this->ci->classMapper; + + // Check that we are not deleting a default role + $defaultRoleSlugs = $classMapper->staticMethod('role', 'getDefaultSlugs'); + + // Need to use loose comparison for now, because some DBs return `id` as a string + if (in_array($role->slug, $defaultRoleSlugs)) { + $e = new BadRequestException(); + $e->addUserMessage('ROLE.DELETE_DEFAULT'); + throw $e; + } + + // Check if there are any users associated with this role + $countUsers = $role->users()->count(); + if ($countUsers > 0) { + $e = new BadRequestException(); + $e->addUserMessage('ROLE.HAS_USERS'); + throw $e; + } + + $roleName = $role->name; + + // Begin transaction - DB will be rolled back if an exception occurs + Capsule::transaction(function () use ($role, $roleName, $currentUser) { + $role->delete(); + unset($role); + + // Create activity record + $this->ci->userActivityLogger->info("User {$currentUser->user_name} deleted role {$roleName}.", [ + 'type' => 'role_delete', + 'user_id' => $currentUser->id + ]); + }); + + /** @var UserFrosting\Sprinkle\Core\MessageStream $ms */ + $ms = $this->ci->alerts; + + $ms->addMessageTranslated('success', 'ROLE.DELETION_SUCCESSFUL', [ + 'name' => $roleName + ]); + + return $response->withStatus(200); + } + + /** + * Returns info for a single role, along with associated permissions. + * + * This page requires authentication. + * Request type: GET + */ + public function getInfo($request, $response, $args) { + /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager */ + $authorizer = $this->ci->authorizer; + + /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ + $currentUser = $this->ci->currentUser; + + // Access-controlled page + if (!$authorizer->checkAccess($currentUser, 'uri_roles')) { + throw new ForbiddenException(); + } + + $slug = $args['slug']; + + /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ + $classMapper = $this->ci->classMapper; + + $role = $classMapper->staticMethod('role', 'where', 'slug', $slug)->first(); + + // If the role doesn't exist, return 404 + if (!$role) { + throw new NotFoundException($request, $response); + } + + // Get role + $result = $role->load('permissions')->toArray(); + + // Be careful how you consume this data - it has not been escaped and contains untrusted user-supplied content. + // For example, if you plan to insert it into an HTML DOM, you must escape it on the client side (or use client-side templating). + return $response->withJson($result, 200, JSON_PRETTY_PRINT); + } + + /** + * Returns a list of Roles + * + * Generates a list of roles, optionally paginated, sorted and/or filtered. + * This page requires authentication. + * Request type: GET + */ + public function getList($request, $response, $args) { + // GET parameters + $params = $request->getQueryParams(); + + /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ + $authorizer = $this->ci->authorizer; + + /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ + $currentUser = $this->ci->currentUser; + + // Access-controlled page + if (!$authorizer->checkAccess($currentUser, 'uri_roles')) { + throw new ForbiddenException(); + } + + /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ + $classMapper = $this->ci->classMapper; + + $sprunje = $classMapper->createInstance('role_sprunje', $classMapper, $params); + + // Be careful how you consume this data - it has not been escaped and contains untrusted user-supplied content. + // For example, if you plan to insert it into an HTML DOM, you must escape it on the client side (or use client-side templating). + return $sprunje->toResponse($response); + } + + public function getModalConfirmDelete($request, $response, $args) { + // GET parameters + $params = $request->getQueryParams(); + + $role = $this->getRoleFromParams($params); + + // If the role no longer exists, forward to main role listing page + if (!$role) { + throw new NotFoundException($request, $response); + } + + /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ + $authorizer = $this->ci->authorizer; + + /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ + $currentUser = $this->ci->currentUser; + + // Access-controlled page + if (!$authorizer->checkAccess($currentUser, 'delete_role', [ + 'role' => $role + ])) { + throw new ForbiddenException(); + } + + /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ + $classMapper = $this->ci->classMapper; + + // Check that we are not deleting a default role + $defaultRoleSlugs = $classMapper->staticMethod('role', 'getDefaultSlugs'); + + // Need to use loose comparison for now, because some DBs return `id` as a string + if (in_array($role->slug, $defaultRoleSlugs)) { + $e = new BadRequestException(); + $e->addUserMessage('ROLE.DELETE_DEFAULT', $role->toArray()); + throw $e; + } + + // Check if there are any users associated with this role + $countUsers = $role->users()->count(); + if ($countUsers > 0) { + $e = new BadRequestException(); + $e->addUserMessage('ROLE.HAS_USERS', $role->toArray()); + throw $e; + } + + return $this->ci->view->render($response, 'modals/confirm-delete-role.html.twig', [ + 'role' => $role, + 'form' => [ + 'action' => "api/roles/r/{$role->slug}", + ] + ]); + } + + /** + * Renders the modal form for creating a new role. + * + * This does NOT render a complete page. Instead, it renders the HTML for the modal, which can be embedded in other pages. + * This page requires authentication. + * Request type: GET + */ + public function getModalCreate($request, $response, $args) { + // GET parameters + $params = $request->getQueryParams(); + + /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ + $authorizer = $this->ci->authorizer; + + /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ + $currentUser = $this->ci->currentUser; + + /** @var UserFrosting\I18n\MessageTranslator $translator */ + $translator = $this->ci->translator; + + // Access-controlled page + if (!$authorizer->checkAccess($currentUser, 'create_role')) { + throw new ForbiddenException(); + } + + /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ + $classMapper = $this->ci->classMapper; + + // Create a dummy role to prepopulate fields + $role = $classMapper->createInstance('role', []); + + $fieldNames = ['name', 'slug', 'description']; + $fields = [ + 'hidden' => [], + 'disabled' => [] + ]; + + // Load validation rules + $schema = new RequestSchema('schema://requests/role/create.yaml'); + $validator = new JqueryValidationAdapter($schema, $this->ci->translator); + + return $this->ci->view->render($response, 'modals/role.html.twig', [ + 'role' => $role, + 'form' => [ + 'action' => 'api/roles', + 'method' => 'POST', + 'fields' => $fields, + 'submit_text' => $translator->translate('CREATE') + ], + 'page' => [ + 'validators' => $validator->rules('json', FALSE) + ] + ]); + } + + /** + * Renders the modal form for editing an existing role. + * + * This does NOT render a complete page. Instead, it renders the HTML for the modal, which can be embedded in other pages. + * This page requires authentication. + * Request type: GET + */ + public function getModalEdit($request, $response, $args) { + // GET parameters + $params = $request->getQueryParams(); + + $role = $this->getRoleFromParams($params); + + // If the role doesn't exist, return 404 + if (!$role) { + throw new NotFoundException($request, $response); + } + + /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ + $classMapper = $this->ci->classMapper; + + /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ + $authorizer = $this->ci->authorizer; + + /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ + $currentUser = $this->ci->currentUser; + + /** @var UserFrosting\I18n\MessageTranslator $translator */ + $translator = $this->ci->translator; + + // Access-controlled resource - check that currentUser has permission to edit basic fields "name", "slug", "description" for this role + $fieldNames = ['name', 'slug', 'description']; + if (!$authorizer->checkAccess($currentUser, 'update_role_field', [ + 'role' => $role, + 'fields' => $fieldNames + ])) { + throw new ForbiddenException(); + } + + // Generate form + $fields = [ + 'hidden' => [], + 'disabled' => [] + ]; + + // Load validation rules + $schema = new RequestSchema('schema://requests/role/edit-info.yaml'); + $validator = new JqueryValidationAdapter($schema, $translator); + + return $this->ci->view->render($response, 'modals/role.html.twig', [ + 'role' => $role, + 'form' => [ + 'action' => "api/roles/r/{$role->slug}", + 'method' => 'PUT', + 'fields' => $fields, + 'submit_text' => $translator->translate('UPDATE') + ], + 'page' => [ + 'validators' => $validator->rules('json', FALSE) + ] + ]); + } + + /** + * Renders the modal form for editing a role's permissions. + * + * This does NOT render a complete page. Instead, it renders the HTML for the form, which can be embedded in other pages. + * This page requires authentication. + * Request type: GET + */ + public function getModalEditPermissions($request, $response, $args) { + // GET parameters + $params = $request->getQueryParams(); + + $role = $this->getRoleFromParams($params); + + // If the role doesn't exist, return 404 + if (!$role) { + throw new NotFoundException($request, $response); + } + + /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ + $authorizer = $this->ci->authorizer; + + /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ + $currentUser = $this->ci->currentUser; + + // Access-controlled resource - check that currentUser has permission to edit "permissions" field for this role + if (!$authorizer->checkAccess($currentUser, 'update_role_field', [ + 'role' => $role, + 'fields' => ['permissions'] + ])) { + throw new ForbiddenException(); + } + + return $this->ci->view->render($response, 'modals/role-manage-permissions.html.twig', [ + 'role' => $role + ]); + } + + /** + * Returns a list of Permissions for a specified Role. + * + * Generates a list of permissions, optionally paginated, sorted and/or filtered. + * This page requires authentication. + * Request type: GET + */ + public function getPermissions($request, $response, $args) { + $role = $this->getRoleFromParams($args); + + // If the role no longer exists, forward to main role listing page + if (!$role) { + throw new NotFoundException($request, $response); + } + + // GET parameters + $params = $request->getQueryParams(); + + /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ + $authorizer = $this->ci->authorizer; + + /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ + $currentUser = $this->ci->currentUser; + + // Access-controlled page + if (!$authorizer->checkAccess($currentUser, 'view_role_field', [ + 'role' => $role, + 'property' => 'permissions' + ])) { + throw new ForbiddenException(); + } + + /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ + $classMapper = $this->ci->classMapper; + + $sprunje = $classMapper->createInstance('permission_sprunje', $classMapper, $params); + $sprunje->extendQuery(function ($query) use ($role) { + return $query->forRole($role->id); + }); + + // Be careful how you consume this data - it has not been escaped and contains untrusted user-supplied content. + // For example, if you plan to insert it into an HTML DOM, you must escape it on the client side (or use client-side templating). + return $sprunje->toResponse($response); + } + + /** + * Returns users associated with a single role. + * + * This page requires authentication. + * Request type: GET + */ + public function getUsers($request, $response, $args) { + $role = $this->getRoleFromParams($args); + + // If the role doesn't exist, return 404 + if (!$role) { + throw new NotFoundException($request, $response); + } + + /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ + $classMapper = $this->ci->classMapper; + + // GET parameters + $params = $request->getQueryParams(); + + /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ + $authorizer = $this->ci->authorizer; + + /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ + $currentUser = $this->ci->currentUser; + + // Access-controlled page + if (!$authorizer->checkAccess($currentUser, 'view_role_field', [ + 'role' => $role, + 'property' => 'users' + ])) { + throw new ForbiddenException(); + } + + $sprunje = $classMapper->createInstance('user_sprunje', $classMapper, $params); + $sprunje->extendQuery(function ($query) use ($role) { + return $query->forRole($role->id); + }); + + // Be careful how you consume this data - it has not been escaped and contains untrusted user-supplied content. + // For example, if you plan to insert it into an HTML DOM, you must escape it on the client side (or use client-side templating). + return $sprunje->toResponse($response); + } + + /** + * Renders a page displaying a role's information, in read-only mode. + * + * This checks that the currently logged-in user has permission to view the requested role's info. + * It checks each field individually, showing only those that you have permission to view. + * This will also try to show buttons for deleting and editing the role. + * This page requires authentication. + * Request type: GET + */ + public function pageInfo($request, $response, $args) { + $role = $this->getRoleFromParams($args); + + // If the role no longer exists, forward to main role listing page + if (!$role) { + $redirectPage = $this->ci->router->pathFor('uri_roles'); + return $response->withRedirect($redirectPage, 404); + } + + /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ + $authorizer = $this->ci->authorizer; + + /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ + $currentUser = $this->ci->currentUser; + + // Access-controlled page + if (!$authorizer->checkAccess($currentUser, 'uri_role', [ + 'role' => $role + ])) { + throw new ForbiddenException(); + } + + // Determine fields that currentUser is authorized to view + $fieldNames = ['name', 'slug', 'description']; + + // Generate form + $fields = [ + 'hidden' => [] + ]; + + foreach ($fieldNames as $field) { + if (!$authorizer->checkAccess($currentUser, 'view_role_field', [ + 'role' => $role, + 'property' => $field + ])) { + $fields['hidden'][] = $field; + } + } + + // Determine buttons to display + $editButtons = [ + 'hidden' => [] + ]; + + if (!$authorizer->checkAccess($currentUser, 'update_role_field', [ + 'role' => $role, + 'fields' => ['name', 'slug', 'description'] + ])) { + $editButtons['hidden'][] = 'edit'; + } + + if (!$authorizer->checkAccess($currentUser, 'delete_role', [ + 'role' => $role + ])) { + $editButtons['hidden'][] = 'delete'; + } + + return $this->ci->view->render($response, 'pages/role.html.twig', [ + 'role' => $role, + 'fields' => $fields, + 'tools' => $editButtons + ]); + } + + /** + * Renders the role listing page. + * + * This page renders a table of roles, with dropdown menus for admin actions for each role. + * Actions typically include: edit role, delete role. + * This page requires authentication. + * Request type: GET + */ + public function pageList($request, $response, $args) { + /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ + $authorizer = $this->ci->authorizer; + + /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ + $currentUser = $this->ci->currentUser; + + // Access-controlled page + if (!$authorizer->checkAccess($currentUser, 'uri_roles')) { + throw new ForbiddenException(); + } + + return $this->ci->view->render($response, 'pages/roles.html.twig'); + } + + /** + * Processes the request to update an existing role's details. + * + * Processes the request from the role update form, checking that: + * 1. The role name/slug are not already in use; + * 2. The user has the necessary permissions to update the posted field(s); + * 3. The submitted data is valid. + * This route requires authentication (and should generally be limited to admins or the root user). + * Request type: PUT + * @see getModalRoleEdit + */ + public function updateInfo($request, $response, $args) { + // Get the role based on slug in the URL + $role = $this->getRoleFromParams($args); + + if (!$role) { + throw new NotFoundException($request, $response); + } + + /** @var UserFrosting\Config\Config $config */ + $config = $this->ci->config; + + // Get PUT parameters: (name, slug, description) + $params = $request->getParsedBody(); + + /** @var UserFrosting\I18n\MessageTranslator $translator */ + $ms = $this->ci->alerts; + + // Load the request schema + $schema = new RequestSchema('schema://requests/role/edit-info.yaml'); + + // Whitelist and set parameter defaults + $transformer = new RequestDataTransformer($schema); + $data = $transformer->transform($params); + + $error = FALSE; + + // Validate request data + $validator = new ServerSideValidator($schema, $this->ci->translator); + if (!$validator->validate($data)) { + $ms->addValidationErrors($validator); + $error = TRUE; + } + + // Determine targeted fields + $fieldNames = []; + foreach ($data as $name => $value) { + $fieldNames[] = $name; + } + + /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ + $authorizer = $this->ci->authorizer; + + /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ + $currentUser = $this->ci->currentUser; + + // Access-controlled resource - check that currentUser has permission to edit submitted fields for this role + if (!$authorizer->checkAccess($currentUser, 'update_role_field', [ + 'role' => $role, + 'fields' => array_values(array_unique($fieldNames)) + ])) { + throw new ForbiddenException(); + } + + /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ + $classMapper = $this->ci->classMapper; + + // Check if name or slug already exists + if ( + isset($data['name']) && + $data['name'] != $role->name && + $classMapper->staticMethod('role', 'where', 'name', $data['name'])->first() + ) { + $ms->addMessageTranslated('danger', 'ROLE.NAME_IN_USE', $data); + $error = TRUE; + } + + if ( + isset($data['slug']) && + $data['slug'] != $role->slug && + $classMapper->staticMethod('role', 'where', 'slug', $data['slug'])->first() + ) { + $ms->addMessageTranslated('danger', 'SLUG_IN_USE', $data); + $error = TRUE; + } + + if ($error) { + return $response->withStatus(400); + } + + // Begin transaction - DB will be rolled back if an exception occurs + Capsule::transaction(function () use ($data, $role, $currentUser) { + // Update the role and generate success messages + foreach ($data as $name => $value) { + if ($value != $role->$name) { + $role->$name = $value; + } + } + + $role->save(); + + // Create activity record + $this->ci->userActivityLogger->info("User {$currentUser->user_name} updated details for role {$role->name}.", [ + 'type' => 'role_update_info', + 'user_id' => $currentUser->id + ]); + }); + + $ms->addMessageTranslated('success', 'ROLE.UPDATED', [ + 'name' => $role->name + ]); + + return $response->withStatus(200); + } + + /** + * Processes the request to update a specific field for an existing role, including permissions. + * + * Processes the request from the role update form, checking that: + * 1. The logged-in user has the necessary permissions to update the putted field(s); + * 2. The submitted data is valid. + * This route requires authentication. + * Request type: PUT + */ + public function updateField($request, $response, $args) { + // Get the username from the URL + $role = $this->getRoleFromParams($args); + + if (!$role) { + throw new NotFoundException($request, $response); + } + + // Get key->value pair from URL and request body + $fieldName = $args['field']; + + /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ + $authorizer = $this->ci->authorizer; + + /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ + $currentUser = $this->ci->currentUser; + + // Access-controlled resource - check that currentUser has permission to edit the specified field for this user + if (!$authorizer->checkAccess($currentUser, 'update_role_field', [ + 'role' => $role, + 'fields' => [$fieldName] + ])) { + throw new ForbiddenException(); + } + + /** @var UserFrosting\Config\Config $config */ + $config = $this->ci->config; + + // Get PUT parameters: value + $put = $request->getParsedBody(); + + if (!isset($put['value'])) { + throw new BadRequestException(); + } + + $params = [ + $fieldName => $put['value'] + ]; + + // Validate key -> value pair + + // Load the request schema + $schema = new RequestSchema('schema://requests/role/edit-field.yaml'); + + // Whitelist and set parameter defaults + $transformer = new RequestDataTransformer($schema); + $data = $transformer->transform($params); + + // Validate, and throw exception on validation errors. + $validator = new ServerSideValidator($schema, $this->ci->translator); + if (!$validator->validate($data)) { + $e = new BadRequestException(); + foreach ($validator->errors() as $idx => $field) { + foreach ($field as $eidx => $error) { + $e->addUserMessage($error); + } + } + throw $e; + } + + // Get validated and transformed value + $fieldValue = $data[$fieldName]; + + /** @var UserFrosting\I18n\MessageTranslator $translator */ + $ms = $this->ci->alerts; + + // Begin transaction - DB will be rolled back if an exception occurs + Capsule::transaction(function () use ($fieldName, $fieldValue, $role, $currentUser) { + if ($fieldName == 'permissions') { + $newPermissions = collect($fieldValue)->pluck('permission_id')->all(); + $role->permissions()->sync($newPermissions); + } else { + $role->$fieldName = $fieldValue; + $role->save(); + } + + // Create activity record + $this->ci->userActivityLogger->info("User {$currentUser->user_name} updated property '$fieldName' for role {$role->name}.", [ + 'type' => 'role_update_field', + 'user_id' => $currentUser->id + ]); + }); + + // Add success messages + if ($fieldName == 'permissions') { + $ms->addMessageTranslated('success', 'ROLE.PERMISSIONS_UPDATED', [ + 'name' => $role->name + ]); + } else { + $ms->addMessageTranslated('success', 'ROLE.UPDATED', [ + 'name' => $role->name + ]); + } + + return $response->withStatus(200); + } + + protected function getRoleFromParams($params) { + // Load the request schema + $schema = new RequestSchema('schema://requests/role/get-by-slug.yaml'); + + // Whitelist and set parameter defaults + $transformer = new RequestDataTransformer($schema); + $data = $transformer->transform($params); + + // Validate, and throw exception on validation errors. + $validator = new ServerSideValidator($schema, $this->ci->translator); + if (!$validator->validate($data)) { + // encapsulate the communication of error messages from ServerSideValidator to the BadRequestException + $e = new BadRequestException(); + foreach ($validator->errors() as $idx => $field) { + foreach ($field as $eidx => $error) { + $e->addUserMessage($error); + } + } + throw $e; + } + + /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ + $classMapper = $this->ci->classMapper; + + // Get the role + $role = $classMapper->staticMethod('role', 'where', 'slug', $data['slug']) + ->first(); + + return $role; + } +} diff --git a/main/app/sprinkles/admin/src/Controller/SearchController.php b/main/app/sprinkles/admin/src/Controller/SearchController.php index 2398a56..612b886 100644 --- a/main/app/sprinkles/admin/src/Controller/SearchController.php +++ b/main/app/sprinkles/admin/src/Controller/SearchController.php @@ -1,56 +1,56 @@ -ci->classMapper; - $users = $classMapper->createInstance('user') - ->where("first_name", "like", "%" . $args["search_term"] . "%") - ->orWhere("last_name", "like", "%" . $args["search_term"] . "%") - ->orWhere(DB::raw("CONCAT(`first_name`, ' ', `last_name`)"), 'LIKE', "%" . $args["search_term"] . "%") - ->orWhere("user_name", "like", "%" . $args["search_term"] . "%") - ->get(); - - foreach ($users as $number => $user) { - $users[$number]["avatar"] = $user->avatar; - } - - if (count($users) === 0) throw new NotFoundException(); - return $response->withJson($users, 200, JSON_PRETTY_PRINT); - } -} +ci->classMapper; + $users = $classMapper->createInstance('user') + ->where("first_name", "like", "%" . $args["search_term"] . "%") + ->orWhere("last_name", "like", "%" . $args["search_term"] . "%") + ->orWhere(DB::raw("CONCAT(`first_name`, ' ', `last_name`)"), 'LIKE', "%" . $args["search_term"] . "%") + ->orWhere("user_name", "like", "%" . $args["search_term"] . "%") + ->get(); + + foreach ($users as $number => $user) { + $users[$number]["avatar"] = $user->avatar; + } + + if (count($users) === 0) throw new NotFoundException(); + return $response->withJson($users, 200, JSON_PRETTY_PRINT); + } +} diff --git a/main/app/sprinkles/admin/src/Controller/UserController.php b/main/app/sprinkles/admin/src/Controller/UserController.php index 45f9919..d66f2f1 100644 --- a/main/app/sprinkles/admin/src/Controller/UserController.php +++ b/main/app/sprinkles/admin/src/Controller/UserController.php @@ -1,1516 +1,1516 @@ -getParsedBody(); - - /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ - $authorizer = $this->ci->authorizer; - - /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ - $currentUser = $this->ci->currentUser; - - // Access-controlled page - if (!$authorizer->checkAccess($currentUser, 'create_user')) { - throw new ForbiddenException(); - } - - /** @var UserFrosting\Sprinkle\Core\MessageStream $ms */ - $ms = $this->ci->alerts; - - // Load the request schema - $schema = new RequestSchema('schema://requests/user/create.yaml'); - - // Whitelist and set parameter defaults - $transformer = new RequestDataTransformer($schema); - $data = $transformer->transform($params); - - $error = FALSE; - - // Validate request data - $validator = new ServerSideValidator($schema, $this->ci->translator); - if (!$validator->validate($data)) { - $ms->addValidationErrors($validator); - $error = TRUE; - } - - /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ - $classMapper = $this->ci->classMapper; - - // Check if username or email already exists - if ($classMapper->staticMethod('user', 'findUnique', $data['user_name'], 'user_name')) { - $ms->addMessageTranslated('danger', 'USERNAME.IN_USE', $data); - $error = TRUE; - } - - if ($classMapper->staticMethod('user', 'findUnique', $data['email'], 'email')) { - $ms->addMessageTranslated('danger', 'EMAIL.IN_USE', $data); - $error = TRUE; - } - - if ($error) { - return $response->withStatus(400); - } - - /** @var UserFrosting\Config\Config $config */ - $config = $this->ci->config; - - // If currentUser does not have permission to set the group, but they try to set it to something other than their own group, - // throw an exception. - if (!$authorizer->checkAccess($currentUser, 'create_user_field', [ - 'fields' => ['group'] - ])) { - if (isset($data['group_id']) && $data['group_id'] != $currentUser->group_id) { - throw new ForbiddenException(); - } - } - - // In any case, set the group id if not otherwise set - if (!isset($data['group_id'])) { - $data['group_id'] = $currentUser->group_id; - } - - $data['flag_verified'] = 1; - // Set password as empty on initial creation. We will then send email so new user can set it themselves via a verification token - $data['password'] = ''; - - // All checks passed! log events/activities, create user, and send verification email (if required) - // Begin transaction - DB will be rolled back if an exception occurs - Capsule::transaction(function () use ($classMapper, $data, $ms, $config, $currentUser) { - // Create the user - $user = $classMapper->createInstance('user', $data); - - // Store new user to database - $user->save(); - - // Create activity record - $this->ci->userActivityLogger->info("User {$currentUser->user_name} created a new account for {$user->user_name}.", [ - 'type' => 'account_create', - 'user_id' => $currentUser->id - ]); - - // Load default roles - $defaultRoleSlugs = $classMapper->staticMethod('role', 'getDefaultSlugs'); - $defaultRoles = $classMapper->staticMethod('role', 'whereIn', 'slug', $defaultRoleSlugs)->get(); - $defaultRoleIds = $defaultRoles->pluck('id')->all(); - - // Attach default roles - $user->roles()->attach($defaultRoleIds); - - // Try to generate a new password request - $passwordRequest = $this->ci->repoPasswordReset->create($user, $config['password_reset.timeouts.create']); - - // Create and send welcome email with password set link - $message = new TwigMailMessage($this->ci->view, 'mail/password-create.html.twig'); - - $message->from($config['address_book.admin']) - ->addEmailRecipient(new EmailRecipient($user->email, $user->full_name)) - ->addParams([ - 'user' => $user, - 'create_password_expiration' => $config['password_reset.timeouts.create'] / 3600 . ' hours', - 'token' => $passwordRequest->getToken() - ]); - - $this->ci->mailer->send($message); - - $ms->addMessageTranslated('success', 'USER.CREATED', $data); - }); - - return $response->withStatus(200); - } - - /** - * Processes the request to send a user a password reset email. - * - * Processes the request from the user update form, checking that: - * 1. The target user's new email address, if specified, is not already in use; - * 2. The logged-in user has the necessary permissions to update the posted field(s); - * 3. We're not trying to disable the master account; - * 4. The submitted data is valid. - * This route requires authentication. - * Request type: POST - * @throws ForbiddenException - * @throws NotFoundException - * @throws BadRequestException - */ - public function createPasswordReset($request, $response, $args) { - // Get the username from the URL - $user = $this->getUserFromParams($args); - - if (!$user) { - throw new NotFoundException($request, $response); - } - - /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ - $authorizer = $this->ci->authorizer; - - /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ - $currentUser = $this->ci->currentUser; - - // Access-controlled resource - check that currentUser has permission to edit "password" for this user - if (!$authorizer->checkAccess($currentUser, 'update_user_field', [ - 'user' => $user, - 'fields' => ['password'] - ])) { - throw new ForbiddenException(); - } - - /** @var UserFrosting\Config\Config $config */ - $config = $this->ci->config; - - /** @var UserFrosting\Sprinkle\Core\MessageStream $ms */ - $ms = $this->ci->alerts; - - // Begin transaction - DB will be rolled back if an exception occurs - Capsule::transaction(function () use ($user, $config) { - - // Create a password reset and shoot off an email - $passwordReset = $this->ci->repoPasswordReset->create($user, $config['password_reset.timeouts.reset']); - - // Create and send welcome email with password set link - $message = new TwigMailMessage($this->ci->view, 'mail/password-reset.html.twig'); - - $message->from($config['address_book.admin']) - ->addEmailRecipient(new EmailRecipient($user->email, $user->full_name)) - ->addParams([ - 'user' => $user, - 'token' => $passwordReset->getToken(), - 'request_date' => Carbon::now()->format('Y-m-d H:i:s') - ]); - - $this->ci->mailer->send($message); - }); - - $ms->addMessageTranslated('success', 'PASSWORD.FORGET.REQUEST_SENT', [ - 'email' => $user->email - ]); - return $response->withStatus(200); - } - - - /** - * Sets the users public key - * Request type: POST - * @throws NotFoundException - * @throws BadRequestException - * @throws ForbiddenException - */ - public function setPublicKey($request, $response, $args) { - $requestedUser = $this->getUserFromParams($args); - - if (!$requestedUser) { - throw new NotFoundException($request, $response); - } - - $PublicKey = $request->getParsedBody()["PublicKey"]; - - if ($this->ci->currentUser->id === $requestedUser->id && (Capsule::table('public_keys') - ->where('user_id', "=", $requestedUser->id) - ->exists()) === FALSE) { - Capsule::table('public_keys') - ->insert(['user_id' => $requestedUser->id, 'key' => substr(substr($PublicKey, 100), 0, -40)]); - return $response->withStatus(200); - } else if ($this->ci->currentUser->id === $requestedUser->id) { - Capsule::table('public_keys') - ->where('user_id', $requestedUser->id) - ->update(['key' => substr(substr($PublicKey, 100), 0, -40)]); - return $response->withStatus(200); - } else { - throw new ForbiddenException(); - } - } - - /** - * Processes the request to delete an existing user. - * - * Deletes the specified user, removing any existing associations. - * Before doing so, checks that: - * 1. You are not trying to delete the master account; - * 2. You have permission to delete the target user's account. - * This route requires authentication (and should generally be limited to admins or the root user). - * Request type: DELETE - * @throws BadRequestException - * @throws ForbiddenException - * @throws NotFoundException - * @throws BadRequestException - */ - public function delete($request, $response, $args) { - $user = $this->getUserFromParams($args); - - // If the user doesn't exist, return 404 - if (!$user) { - throw new NotFoundException($request, $response); - } - - /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ - $authorizer = $this->ci->authorizer; - - /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ - $currentUser = $this->ci->currentUser; - - // Access-controlled page - if (!$authorizer->checkAccess($currentUser, 'delete_user', [ - 'user' => $user - ])) { - throw new ForbiddenException(); - } - - /** @var UserFrosting\Config\Config $config */ - $config = $this->ci->config; - - // Check that we are not deleting the master account - // Need to use loose comparison for now, because some DBs return `id` as a string - if ($user->id == $config['reserved_user_ids.master']) { - $e = new BadRequestException(); - $e->addUserMessage('DELETE_MASTER'); - throw $e; - } - - $userName = $user->user_name; - - // Begin transaction - DB will be rolled back if an exception occurs - Capsule::transaction(function () use ($user, $userName, $currentUser) { - $user->delete(); - unset($user); - - // Create activity record - $this->ci->userActivityLogger->info("User {$currentUser->user_name} deleted the account for {$userName}.", [ - 'type' => 'account_delete', - 'user_id' => $currentUser->id - ]); - }); - - /** @var UserFrosting\Sprinkle\Core\MessageStream $ms */ - $ms = $this->ci->alerts; - - $ms->addMessageTranslated('success', 'DELETION_SUCCESSFUL', [ - 'user_name' => $userName - ]); - - return $response->withStatus(200); - } - - /** - * Returns activity history for a single user. - * - * This page requires authentication. - * Request type: GET - * @throws ForbiddenException - * @throws NotFoundException - * @throws BadRequestException - */ - public function getActivities($request, $response, $args) { - $user = $this->getUserFromParams($args); - - // If the user doesn't exist, return 404 - if (!$user) { - throw new NotFoundException($request, $response); - } - - /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ - $classMapper = $this->ci->classMapper; - - // GET parameters - $params = $request->getQueryParams(); - - /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ - $authorizer = $this->ci->authorizer; - - /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ - $currentUser = $this->ci->currentUser; - - // Access-controlled page - if (!$authorizer->checkAccess($currentUser, 'view_user_field', [ - 'user' => $user, - 'property' => 'activities' - ])) { - throw new ForbiddenException(); - } - - $sprunje = $classMapper->createInstance('activity_sprunje', $classMapper, $params); - - $sprunje->extendQuery(function ($query) use ($user) { - return $query->where('user_id', $user->id); - }); - - // Be careful how you consume this data - it has not been escaped and contains untrusted user-supplied content. - // For example, if you plan to insert it into an HTML DOM, you must escape it on the client side (or use client-side templating). - return $sprunje->toResponse($response); - } - - /** - * Returns info for a single user. - * - * This page requires authentication. - * Request type: GET - * @throws ForbiddenException - * @throws NotFoundException - * @throws BadRequestException - */ - public function getInfo($request, $response, $args) { - $user = $this->getUserFromParams($args); - - // If the user doesn't exist, return 404 - if (!$user) { - throw new NotFoundException($request, $response); - } - - /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ - $classMapper = $this->ci->classMapper; - - // Join user's most recent activity - $user = $classMapper->createInstance('user') - ->where('user_name', $user->user_name) - ->joinLastActivity() - ->with('lastActivity', 'group') - ->first(); - - /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ - $authorizer = $this->ci->authorizer; - - /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ - $currentUser = $this->ci->currentUser; - - // Access-controlled page - if (!$authorizer->checkAccess($currentUser, 'uri_user', [ - 'user' => $user - ])) { - throw new ForbiddenException(); - } - - $result = $user->toArray(); - $result["avatar"] = $user->avatar; - - // Be careful how you consume this data - it has not been escaped and contains untrusted user-supplied content. - // For example, if you plan to insert it into an HTML DOM, you must escape it on the client side (or use client-side templating). - return $response->withJson($result, 200, JSON_PRETTY_PRINT); - } - - /** - * Returns a list of Users - * - * Generates a list of users, optionally paginated, sorted and/or filtered. - * This page requires authentication. - * Request type: GET - * @throws ForbiddenException - */ - public function getList($request, $response, $args) { - // GET parameters - $params = $request->getQueryParams(); - - /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ - $authorizer = $this->ci->authorizer; - - /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ - $currentUser = $this->ci->currentUser; - - // Access-controlled page - if (!$authorizer->checkAccess($currentUser, 'uri_users')) { - throw new ForbiddenException(); - } - - /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ - $classMapper = $this->ci->classMapper; - - $sprunje = $classMapper->createInstance('user_sprunje', $classMapper, $params); - - // Be careful how you consume this data - it has not been escaped and contains untrusted user-supplied content. - // For example, if you plan to insert it into an HTML DOM, you must escape it on the client side (or use client-side templating). - return $sprunje->toResponse($response); - } - - /** - * Renders the modal form to confirm user deletion. - * - * This does NOT render a complete page. Instead, it renders the HTML for the modal, which can be embedded in other pages. - * This page requires authentication. - * Request type: GET - * @throws BadRequestException - * @throws ForbiddenException - * @throws NotFoundException - * @throws BadRequestException - */ - public function getModalConfirmDelete($request, $response, $args) { - // GET parameters - $params = $request->getQueryParams(); - - $user = $this->getUserFromParams($params); - - // If the user doesn't exist, return 404 - if (!$user) { - throw new NotFoundException($request, $response); - } - - /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ - $authorizer = $this->ci->authorizer; - - /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ - $currentUser = $this->ci->currentUser; - - // Access-controlled page - if (!$authorizer->checkAccess($currentUser, 'delete_user', [ - 'user' => $user - ])) { - throw new ForbiddenException(); - } - - /** @var UserFrosting\Config\Config $config */ - $config = $this->ci->config; - - // Check that we are not deleting the master account - // Need to use loose comparison for now, because some DBs return `id` as a string - if ($user->id == $config['reserved_user_ids.master']) { - $e = new BadRequestException(); - $e->addUserMessage('DELETE_MASTER'); - throw $e; - } - - return $this->ci->view->render($response, 'modals/confirm-delete-user.html.twig', [ - 'user' => $user, - 'form' => [ - 'action' => "api/users/u/{$user->user_name}", - ] - ]); - } - - /** - * Renders the modal form for creating a new user. - * - * This does NOT render a complete page. Instead, it renders the HTML for the modal, which can be embedded in other pages. - * If the currently logged-in user has permission to modify user group membership, then the group toggle will be displayed. - * Otherwise, the user will be added to the default group and receive the default roles automatically. - * This page requires authentication. - * Request type: GET - * @throws ForbiddenException - */ - public function getModalCreate($request, $response, $args) { - // GET parameters - $params = $request->getQueryParams(); - - /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ - $authorizer = $this->ci->authorizer; - - /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ - $currentUser = $this->ci->currentUser; - - /** @var UserFrosting\I18n\MessageTranslator $translator */ - $translator = $this->ci->translator; - - // Access-controlled page - if (!$authorizer->checkAccess($currentUser, 'create_user')) { - throw new ForbiddenException(); - } - - /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ - $classMapper = $this->ci->classMapper; - - /** @var UserFrosting\Config\Config $config */ - $config = $this->ci->config; - - // Determine form fields to hide/disable - $fields = [ - 'hidden' => ['theme'], - 'disabled' => [] - ]; - - // Get a list of all locales - $locales = $config->getDefined('site.locales.available'); - - // Determine if currentUser has permission to modify the group. If so, show the 'group' dropdown. - // Otherwise, set to the currentUser's group and disable the dropdown. - if ($authorizer->checkAccess($currentUser, 'create_user_field', [ - 'fields' => ['group'] - ])) { - // Get a list of all groups - $groups = $classMapper->staticMethod('group', 'all'); - } else { - // Get the current user's group - $groups = $currentUser->group()->get(); - $fields['disabled'][] = 'group'; - } - - // Create a dummy user to prepopulate fields - $data = [ - 'group_id' => $currentUser->group_id, - 'locale' => $config['site.registration.user_defaults.locale'], - 'theme' => '' - ]; - - $user = $classMapper->createInstance('user', $data); - - // Load validation rules - $schema = new RequestSchema('schema://requests/user/create.yaml'); - $validator = new JqueryValidationAdapter($schema, $this->ci->translator); - - return $this->ci->view->render($response, 'modals/user.html.twig', [ - 'user' => $user, - 'groups' => $groups, - 'locales' => $locales, - 'form' => [ - 'action' => 'api/users', - 'method' => 'POST', - 'fields' => $fields, - 'submit_text' => $translator->translate('CREATE') - ], - 'page' => [ - 'validators' => $validator->rules('json', FALSE) - ] - ]); - } - - /** - * Renders the modal form for editing an existing user. - * - * This does NOT render a complete page. Instead, it renders the HTML for the modal, which can be embedded in other pages. - * This page requires authentication. - * Request type: GET - * @throws ForbiddenException - * @throws NotFoundException - * @throws BadRequestException - */ - public function getModalEdit($request, $response, $args) { - // GET parameters - $params = $request->getQueryParams(); - - $user = $this->getUserFromParams($params); - - // If the user doesn't exist, return 404 - if (!$user) { - throw new NotFoundException($request, $response); - } - - /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ - $classMapper = $this->ci->classMapper; - - // Get the user to edit - $user = $classMapper->staticMethod('user', 'where', 'user_name', $user->user_name) - ->with('group') - ->first(); - - /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ - $authorizer = $this->ci->authorizer; - - /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ - $currentUser = $this->ci->currentUser; - - // Access-controlled resource - check that currentUser has permission to edit basic fields "name", "email", "locale" for this user - $fieldNames = ['name', 'email', 'locale']; - if (!$authorizer->checkAccess($currentUser, 'update_user_field', [ - 'user' => $user, - 'fields' => $fieldNames - ])) { - throw new ForbiddenException(); - } - - // Get a list of all groups - $groups = $classMapper->staticMethod('group', 'all'); - - /** @var UserFrosting\Config\Config $config */ - $config = $this->ci->config; - - // Get a list of all locales - $locales = $config->getDefined('site.locales.available'); - - // Generate form - $fields = [ - 'hidden' => ['theme'], - 'disabled' => ['user_name'] - ]; - - // Disable group field if currentUser doesn't have permission to modify group - if (!$authorizer->checkAccess($currentUser, 'update_user_field', [ - 'user' => $user, - 'fields' => ['group'] - ])) { - $fields['disabled'][] = 'group'; - } - - // Load validation rules - $schema = new RequestSchema('schema://requests/user/edit-info.yaml'); - $validator = new JqueryValidationAdapter($schema, $this->ci->translator); - - $translator = $this->ci->translator; - - return $this->ci->view->render($response, 'modals/user.html.twig', [ - 'user' => $user, - 'groups' => $groups, - 'locales' => $locales, - 'form' => [ - 'action' => "api/users/u/{$user->user_name}", - 'method' => 'PUT', - 'fields' => $fields, - 'submit_text' => $translator->translate('UPDATE') - ], - 'page' => [ - 'validators' => $validator->rules('json', FALSE) - ] - ]); - } - - /** - * Renders the modal form for editing a user's password. - * - * This does NOT render a complete page. Instead, it renders the HTML for the form, which can be embedded in other pages. - * This page requires authentication. - * Request type: GET - * @throws ForbiddenException - * @throws NotFoundException - * @throws BadRequestException - */ - public function getModalEditPassword($request, $response, $args) { - // GET parameters - $params = $request->getQueryParams(); - - $user = $this->getUserFromParams($params); - - // If the user doesn't exist, return 404 - if (!$user) { - throw new NotFoundException($request, $response); - } - - /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ - $authorizer = $this->ci->authorizer; - - /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ - $currentUser = $this->ci->currentUser; - - // Access-controlled resource - check that currentUser has permission to edit "password" field for this user - if (!$authorizer->checkAccess($currentUser, 'update_user_field', [ - 'user' => $user, - 'fields' => ['password'] - ])) { - throw new ForbiddenException(); - } - - // Load validation rules - $schema = new RequestSchema('schema://requests/user/edit-password.yaml'); - $validator = new JqueryValidationAdapter($schema, $this->ci->translator); - - return $this->ci->view->render($response, 'modals/user-set-password.html.twig', [ - 'user' => $user, - 'page' => [ - 'validators' => $validator->rules('json', FALSE) - ] - ]); - } - - /** - * Renders the modal form for editing a user's roles. - * - * This does NOT render a complete page. Instead, it renders the HTML for the form, which can be embedded in other pages. - * This page requires authentication. - * Request type: GET - * @throws ForbiddenException - * @throws NotFoundException - * @throws BadRequestException - */ - public function getModalEditRoles($request, $response, $args) { - // GET parameters - $params = $request->getQueryParams(); - - $user = $this->getUserFromParams($params); - - // If the user doesn't exist, return 404 - if (!$user) { - throw new NotFoundException($request, $response); - } - - /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ - $authorizer = $this->ci->authorizer; - - /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ - $currentUser = $this->ci->currentUser; - - // Access-controlled resource - check that currentUser has permission to edit "roles" field for this user - if (!$authorizer->checkAccess($currentUser, 'update_user_field', [ - 'user' => $user, - 'fields' => ['roles'] - ])) { - throw new ForbiddenException(); - } - - return $this->ci->view->render($response, 'modals/user-manage-roles.html.twig', [ - 'user' => $user - ]); - } - - /** - * Returns a list of effective Permissions for a specified User. - * - * Generates a list of permissions, optionally paginated, sorted and/or filtered. - * This page requires authentication. - * Request type: GET - * @throws ForbiddenException - * @throws NotFoundException - * @throws BadRequestException - */ - public function getPermissions($request, $response, $args) { - $user = $this->getUserFromParams($args); - - // If the user doesn't exist, return 404 - if (!$user) { - throw new NotFoundException($request, $response); - } - - // GET parameters - $params = $request->getQueryParams(); - - /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager */ - $authorizer = $this->ci->authorizer; - - /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ - $currentUser = $this->ci->currentUser; - - // Access-controlled page - if (!$authorizer->checkAccess($currentUser, 'view_user_field', [ - 'user' => $user, - 'property' => 'permissions' - ])) { - throw new ForbiddenException(); - } - - /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ - $classMapper = $this->ci->classMapper; - - $params['user_id'] = $user->id; - $sprunje = $classMapper->createInstance('user_permission_sprunje', $classMapper, $params); - - $response = $sprunje->toResponse($response); - - // Be careful how you consume this data - it has not been escaped and contains untrusted user-supplied content. - // For example, if you plan to insert it into an HTML DOM, you must escape it on the client side (or use client-side templating). - return $response; - } - - /** - * Returns roles associated with a single user. - * - * This page requires authentication. - * Request type: GET - * @throws ForbiddenException - * @throws NotFoundException - * @throws BadRequestException - */ - public function getRoles($request, $response, $args) { - $user = $this->getUserFromParams($args); - - // If the user doesn't exist, return 404 - if (!$user) { - throw new NotFoundException($request, $response); - } - - /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ - $classMapper = $this->ci->classMapper; - - // GET parameters - $params = $request->getQueryParams(); - - /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ - $authorizer = $this->ci->authorizer; - - /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ - $currentUser = $this->ci->currentUser; - - // Access-controlled page - if (!$authorizer->checkAccess($currentUser, 'view_user_field', [ - 'user' => $user, - 'property' => 'roles' - ])) { - throw new ForbiddenException(); - } - - $sprunje = $classMapper->createInstance('role_sprunje', $classMapper, $params); - $sprunje->extendQuery(function ($query) use ($user) { - return $query->forUser($user->id); - }); - - // Be careful how you consume this data - it has not been escaped and contains untrusted user-supplied content. - // For example, if you plan to insert it into an HTML DOM, you must escape it on the client side (or use client-side templating). - return $sprunje->toResponse($response); - } - - /** - * Renders a page displaying a user's information, in read-only mode. - * - * This checks that the currently logged-in user has permission to view the requested user's info. - * It checks each field individually, showing only those that you have permission to view. - * This will also try to show buttons for activating, disabling/enabling, deleting, and editing the user. - * This page requires authentication. - * Request type: GET - * @throws ForbiddenException - * @throws BadRequestException - */ - public function pageInfo($request, $response, $args) { - $user = $this->getUserFromParams($args); - - // If the user no longer exists, forward to main user listing page - if (!$user) { - $usersPage = $this->ci->router->pathFor('uri_users'); - return $response->withRedirect($usersPage, 404); - } - - /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ - $authorizer = $this->ci->authorizer; - - /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ - $currentUser = $this->ci->currentUser; - - // Access-controlled page - if (!$authorizer->checkAccess($currentUser, 'uri_user', [ - 'user' => $user - ])) { - throw new ForbiddenException(); - } - - /** @var UserFrosting\Config\Config $config */ - $config = $this->ci->config; - - // Get a list of all locales - $locales = $config->getDefined('site.locales.available'); - - // Determine fields that currentUser is authorized to view - $fieldNames = ['user_name', 'name', 'email', 'locale', 'group', 'roles']; - - // Generate form - $fields = [ - // Always hide these - 'hidden' => ['theme'] - ]; - - // Determine which fields should be hidden - foreach ($fieldNames as $field) { - if (!$authorizer->checkAccess($currentUser, 'view_user_field', [ - 'user' => $user, - 'property' => $field - ])) { - $fields['hidden'][] = $field; - } - } - - // Determine buttons to display - $editButtons = [ - 'hidden' => [] - ]; - - if (!$authorizer->checkAccess($currentUser, 'update_user_field', [ - 'user' => $user, - 'fields' => ['name', 'email', 'locale'] - ])) { - $editButtons['hidden'][] = 'edit'; - } - - if (!$authorizer->checkAccess($currentUser, 'update_user_field', [ - 'user' => $user, - 'fields' => ['flag_enabled'] - ])) { - $editButtons['hidden'][] = 'enable'; - } - - if (!$authorizer->checkAccess($currentUser, 'update_user_field', [ - 'user' => $user, - 'fields' => ['flag_verified'] - ])) { - $editButtons['hidden'][] = 'activate'; - } - - if (!$authorizer->checkAccess($currentUser, 'update_user_field', [ - 'user' => $user, - 'fields' => ['password'] - ])) { - $editButtons['hidden'][] = 'password'; - } - - if (!$authorizer->checkAccess($currentUser, 'update_user_field', [ - 'user' => $user, - 'fields' => ['roles'] - ])) { - $editButtons['hidden'][] = 'roles'; - } - - if (!$authorizer->checkAccess($currentUser, 'delete_user', [ - 'user' => $user - ])) { - $editButtons['hidden'][] = 'delete'; - } - - // Determine widgets to display - $widgets = [ - 'hidden' => [] - ]; - - if (!$authorizer->checkAccess($currentUser, 'view_user_field', [ - 'user' => $user, - 'property' => 'permissions' - ])) { - $widgets['hidden'][] = 'permissions'; - } - - if (!$authorizer->checkAccess($currentUser, 'view_user_field', [ - 'user' => $user, - 'property' => 'activities' - ])) { - $widgets['hidden'][] = 'activities'; - } - - return $this->ci->view->render($response, 'pages/user.html.twig', [ - 'user' => $user, - 'locales' => $locales, - 'fields' => $fields, - 'tools' => $editButtons, - 'widgets' => $widgets - ]); - } - - /** - * Renders the user listing page. - * - * This page renders a table of users, with dropdown menus for admin actions for each user. - * Actions typically include: edit user details, activate user, enable/disable user, delete user. - * This page requires authentication. - * Request type: GET - * @throws ForbiddenException - */ - public function pageList($request, $response, $args) { - /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */ - $authorizer = $this->ci->authorizer; - - /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */ - $currentUser = $this->ci->currentUser; - - // Access-controlled page - if (!$authorizer->checkAccess($currentUser, 'uri_users')) { - throw new ForbiddenException(); - } - - return $this->ci->view->render($response, 'pages/users.html.twig'); - } - - /** - * Gets the users public key - * Request type: GET - * @throws NotFoundException - * @throws BadRequestException - */ - public function getPublicKey($request, $response, $args) { - $requestedUser = $this->getUserFromParams($args); - - if (!$requestedUser) { - throw new NotFoundException($request, $response); - } - - if ((Capsule::table('public_keys') - ->where('user_id', "=", $requestedUser->id) - ->exists())) { - - $RawPublicKey = Capsule::table('public_keys') - ->where('user_id', "=", $requestedUser->id) - ->value('key'); - $PublicKey = "-----BEGIN PGP PUBLIC KEY BLOCK-----\nVersion: OpenPGP.js v3.0.9\nComment: https://openpgpjs.org\n\n" . $RawPublicKey . "\n-----END PGP PUBLIC KEY BLOCK-----"; - - $ContentType = explode(',', $request->getHeaderLine('Accept'))[0]; - switch ($ContentType) { - case 'application/json': - $response->write(json_encode(array('user_id' => $requestedUser->id, 'PublicKey' => $PublicKey))); - break; - case 'text/html': - $response->write("
" . $PublicKey);
-                    break;
-                default:
-                    $response->write($PublicKey);
-            }
-            return $response->withStatus(200);
-        } else {
-            throw new NotFoundException($request, $response);
-        }
-    }
-
-    /**
-     * Gets the users which are following the requested user
-     * Request type: GET
-     * @throws ForbiddenException
-     * @throws NotFoundException
-     * @throws BadRequestException
-     */
-    public function getFollowers($request, $response, $args) {
-        $user = $this->getUserFromParams($args);
-
-        // If the user doesn't exist, return 404
-        if (!$user) {
-            throw new NotFoundException($request, $response);
-        }
-
-        /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */
-        $authorizer = $this->ci->authorizer;
-
-        /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */
-        $currentUser = $this->ci->currentUser;
-
-        // Access-controlled page
-        if (!$authorizer->checkAccess($currentUser, 'uri_user', [
-            'user' => $user
-        ])) {
-            throw new ForbiddenException();
-        }
-
-        $UsersFollowers = Capsule::table('user_follow')
-            ->where('user_id', "=", $user->id)
-            ->join("users", "users.id", "=", "user_follow.followed_by_id")
-            ->select("user_follow.followed_by_id as id", "users.user_name as username")
-            ->get();
-
-        $result = $UsersFollowers->toArray();
-
-        return $response->withJson($result, 200, JSON_PRETTY_PRINT);
-    }
-
-    /**
-     * Get users which the user follows
-     * Request type: GET
-     * @throws ForbiddenException
-     * @throws NotFoundException
-     * @throws BadRequestException
-     */
-    public function getFollows($request, $response, $args) {
-        $user = $this->getUserFromParams($args);
-
-        // If the user doesn't exist, return 404
-        if (!$user) {
-            throw new NotFoundException($request, $response);
-        }
-
-        /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */
-        $authorizer = $this->ci->authorizer;
-
-        /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */
-        $currentUser = $this->ci->currentUser;
-
-        // Access-controlled page
-        if (($user->id == $currentUser->id) || (!$authorizer->checkAccess($currentUser, 'uri_user', [
-                'user' => $user
-            ]))) {
-            throw new ForbiddenException();
-        }
-
-        $UsersFollows = Capsule::table('user_follow')
-            ->where('followed_by_id', "=", $user->id)
-            ->join("users", "users.id", "=", "user_follow.user_id")
-            ->select("user_follow.user_id as id", "users.user_name as username")
-            ->get();
-
-        $result = $UsersFollows->toArray();
-
-        return $response->withJson($result, 200, JSON_PRETTY_PRINT);
-    }
-
-    /**
-     * Get users which the user follows and which are following the user
-     * Request type: GET
-     * @throws NotFoundException
-     * @throws ForbiddenException
-     * @throws BadRequestException
-     */
-    public function getFriends($request, $response, $args) {
-        $user = $this->getUserFromParams($args);
-
-        // If the user doesn't exist, return 404
-        if (!$user) {
-            throw new NotFoundException($request, $response);
-        }
-
-        /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */
-        $authorizer = $this->ci->authorizer;
-
-        /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */
-        $currentUser = $this->ci->currentUser;
-
-        // Access-controlled page
-        if (!$authorizer->checkAccess($currentUser, 'uri_user', [
-            'user' => $user
-        ])) {
-            throw new ForbiddenException();
-        }
-
-        $UsersFriends = Capsule::select("SELECT id FROM (SELECT user_id AS id FROM user_follow WHERE followed_by_id = $user->id UNION ALL SELECT followed_by_id FROM user_follow WHERE user_id = $user->id) t GROUP BY id HAVING COUNT(id) > 1");
-
-        /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */
-        $classMapper = $this->ci->classMapper;
-
-        foreach ($UsersFriends as $Key => $UsersFriendId) { // NOT THAT EFFICIENT...
-            $UsersFriendInformation = $classMapper->createInstance('user')// raw select doesnt work with instance
-            ->where('id', $UsersFriendId->id)
-                ->get();
-
-            $UsersFriends[$Key]->id = $UsersFriendInformation[0]->id;
-            $UsersFriends[$Key]->username = $UsersFriendInformation[0]->user_name;
-            $UsersFriends[$Key]->avatar = $UsersFriendInformation[0]->avatar;
-            $UsersFriends[$Key]->full_name = $UsersFriendInformation[0]->full_name;
-        }
-
-        $result = $UsersFriends;
-
-        if (sizeof($result) > 0) { // USER HAS FRIENDS
-            return $response->withJson($result, 200, JSON_PRETTY_PRINT);
-        } else {
-            throw new NotFoundException($request, $response);
-        }
-    }
-
-
-    /**
-     * Processes the request to update an existing user's basic details (first_name, last_name, email, locale, group_id)
-     *
-     * Processes the request from the user update form, checking that:
-     * 1. The target user's new email address, if specified, is not already in use;
-     * 2. The logged-in user has the necessary permissions to update the putted field(s);
-     * 3. The submitted data is valid.
-     * This route requires authentication.
-     * Request type: PUT
-     * @throws NotFoundException
-     * @throws ForbiddenException
-     * @throws BadRequestException
-     * @throws BadRequestException
-     */
-    public function updateInfo($request, $response, $args) {
-        // Get the username from the URL
-        $user = $this->getUserFromParams($args);
-
-        if (!$user) {
-            throw new NotFoundException($request, $response);
-        }
-
-        /** @var UserFrosting\Config\Config $config */
-        $config = $this->ci->config;
-
-        // Get PUT parameters
-        $params = $request->getParsedBody();
-
-        /** @var UserFrosting\Sprinkle\Core\MessageStream $ms */
-        $ms = $this->ci->alerts;
-
-        // Load the request schema
-        $schema = new RequestSchema('schema://requests/user/edit-info.yaml');
-
-        // Whitelist and set parameter defaults
-        $transformer = new RequestDataTransformer($schema);
-        $data = $transformer->transform($params);
-
-        $error = FALSE;
-
-        // Validate request data
-        $validator = new ServerSideValidator($schema, $this->ci->translator);
-        if (!$validator->validate($data)) {
-            $ms->addValidationErrors($validator);
-            $error = TRUE;
-        }
-
-        // Determine targeted fields
-        $fieldNames = [];
-        foreach ($data as $name => $value) {
-            if ($name == 'first_name' || $name == 'last_name') {
-                $fieldNames[] = 'name';
-            } else if ($name == 'group_id') {
-                $fieldNames[] = 'group';
-            } else {
-                $fieldNames[] = $name;
-            }
-        }
-
-        /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */
-        $authorizer = $this->ci->authorizer;
-
-        /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */
-        $currentUser = $this->ci->currentUser;
-
-        // Access-controlled resource - check that currentUser has permission to edit submitted fields for this user
-        if (!$authorizer->checkAccess($currentUser, 'update_user_field', [
-            'user' => $user,
-            'fields' => array_values(array_unique($fieldNames))
-        ])) {
-            throw new ForbiddenException();
-        }
-
-        // Only the master account can edit the master account!
-        if (
-            ($user->id == $config['reserved_user_ids.master']) &&
-            ($currentUser->id != $config['reserved_user_ids.master'])
-        ) {
-            throw new ForbiddenException();
-        }
-
-        /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */
-        $classMapper = $this->ci->classMapper;
-
-        // Check if email already exists
-        if (
-            isset($data['email']) &&
-            $data['email'] != $user->email &&
-            $classMapper->staticMethod('user', 'findUnique', $data['email'], 'email')
-        ) {
-            $ms->addMessageTranslated('danger', 'EMAIL.IN_USE', $data);
-            $error = TRUE;
-        }
-
-        if ($error) {
-            return $response->withStatus(400);
-        }
-
-        // Begin transaction - DB will be rolled back if an exception occurs
-        Capsule::transaction(function () use ($data, $user, $currentUser) {
-            // Update the user and generate success messages
-            foreach ($data as $name => $value) {
-                if ($value != $user->$name) {
-                    $user->$name = $value;
-                }
-            }
-
-            $user->save();
-
-            // Create activity record
-            $this->ci->userActivityLogger->info("User {$currentUser->user_name} updated basic account info for user {$user->user_name}.", [
-                'type' => 'account_update_info',
-                'user_id' => $currentUser->id
-            ]);
-        });
-
-        $ms->addMessageTranslated('success', 'DETAILS_UPDATED', [
-            'user_name' => $user->user_name
-        ]);
-        return $response->withStatus(200);
-    }
-
-    /**
-     * Processes the request to update a specific field for an existing user.
-     *
-     * Supports editing all user fields, including password, enabled/disabled status and verification status.
-     * Processes the request from the user update form, checking that:
-     * 1. The logged-in user has the necessary permissions to update the putted field(s);
-     * 2. We're not trying to disable the master account;
-     * 3. The submitted data is valid.
-     * This route requires authentication.
-     * Request type: PUT
-     * @throws ForbiddenException
-     * @throws BadRequestException
-     * @throws BadRequestException
-     * @throws BadRequestException
-     * @throws BadRequestException
-     * @throws BadRequestException
-     * @throws NotFoundException
-     * @throws BadRequestException
-     */
-    public function updateField($request, $response, $args) {
-        // Get the username from the URL
-        $user = $this->getUserFromParams($args);
-
-        if (!$user) {
-            throw new NotFoundException($request, $response);
-        }
-
-        // Get key->value pair from URL and request body
-        $fieldName = $args['field'];
-
-        /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */
-        $authorizer = $this->ci->authorizer;
-
-        /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */
-        $currentUser = $this->ci->currentUser;
-
-        // Access-controlled resource - check that currentUser has permission to edit the specified field for this user
-        if (!$authorizer->checkAccess($currentUser, 'update_user_field', [
-            'user' => $user,
-            'fields' => [$fieldName]
-        ])) {
-            throw new ForbiddenException();
-        }
-
-        /** @var UserFrosting\Config\Config $config */
-        $config = $this->ci->config;
-
-        // Only the master account can edit the master account!
-        if (
-            ($user->id == $config['reserved_user_ids.master']) &&
-            ($currentUser->id != $config['reserved_user_ids.master'])
-        ) {
-            throw new ForbiddenException();
-        }
-
-        // Get PUT parameters: value
-        $put = $request->getParsedBody();
-
-        if (!isset($put['value'])) {
-            throw new BadRequestException();
-        }
-
-        // Create and validate key -> value pair
-        $params = [
-            $fieldName => $put['value']
-        ];
-
-        // Load the request schema
-        $schema = new RequestSchema('schema://requests/user/edit-field.yaml');
-
-        // Whitelist and set parameter defaults
-        $transformer = new RequestDataTransformer($schema);
-        $data = $transformer->transform($params);
-
-        // Validate, and throw exception on validation errors.
-        $validator = new ServerSideValidator($schema, $this->ci->translator);
-        if (!$validator->validate($data)) {
-            // encapsulate the communication of error messages from ServerSideValidator to the BadRequestException
-            $e = new BadRequestException();
-            foreach ($validator->errors() as $idx => $field) {
-                foreach ($field as $eidx => $error) {
-                    $e->addUserMessage($error);
-                }
-            }
-            throw $e;
-        }
-
-        // Get validated and transformed value
-        $fieldValue = $data[$fieldName];
-
-        /** @var UserFrosting\Sprinkle\Core\MessageStream $ms */
-        $ms = $this->ci->alerts;
-
-        // Special checks and transformations for certain fields
-        if ($fieldName == 'flag_enabled') {
-            // Check that we are not disabling the master account
-            if (
-                ($user->id == $config['reserved_user_ids.master']) &&
-                ($fieldValue == '0')
-            ) {
-                $e = new BadRequestException();
-                $e->addUserMessage('DISABLE_MASTER');
-                throw $e;
-            } else if (
-                ($user->id == $currentUser->id) &&
-                ($fieldValue == '0')
-            ) {
-                $e = new BadRequestException();
-                $e->addUserMessage('DISABLE_SELF');
-                throw $e;
-            }
-        } else if ($fieldName == 'password') {
-            $fieldValue = Password::hash($fieldValue);
-        }
-
-        // Begin transaction - DB will be rolled back if an exception occurs
-        Capsule::transaction(function () use ($fieldName, $fieldValue, $user, $currentUser) {
-            if ($fieldName == 'roles') {
-                $newRoles = collect($fieldValue)->pluck('role_id')->all();
-                $user->roles()->sync($newRoles);
-            } else {
-                $user->$fieldName = $fieldValue;
-                $user->save();
-            }
-
-            // Create activity record
-            $this->ci->userActivityLogger->info("User {$currentUser->user_name} updated property '$fieldName' for user {$user->user_name}.", [
-                'type' => 'account_update_field',
-                'user_id' => $currentUser->id
-            ]);
-        });
-
-        // Add success messages
-        if ($fieldName == 'flag_enabled') {
-            if ($fieldValue == '1') {
-                $ms->addMessageTranslated('success', 'ENABLE_SUCCESSFUL', [
-                    'user_name' => $user->user_name
-                ]);
-            } else {
-                $ms->addMessageTranslated('success', 'DISABLE_SUCCESSFUL', [
-                    'user_name' => $user->user_name
-                ]);
-            }
-        } else if ($fieldName == 'flag_verified') {
-            $ms->addMessageTranslated('success', 'MANUALLY_ACTIVATED', [
-                'user_name' => $user->user_name
-            ]);
-        } else {
-            $ms->addMessageTranslated('success', 'DETAILS_UPDATED', [
-                'user_name' => $user->user_name
-            ]);
-        }
-
-        return $response->withStatus(200);
-    }
-
-    protected function getUserFromParams($params) {
-        // Load the request schema
-        $schema = new RequestSchema('schema://requests/user/get-by-username.yaml');
-
-        // Whitelist and set parameter defaults
-        $transformer = new RequestDataTransformer($schema);
-        $data = $transformer->transform($params);
-
-        // Validate, and throw exception on validation errors.
-        $validator = new ServerSideValidator($schema, $this->ci->translator);
-        if (!$validator->validate($data)) {
-            $e = new BadRequestException();
-            foreach ($validator->errors() as $idx => $field) {
-                foreach ($field as $eidx => $error) {
-                    $e->addUserMessage($error);
-                }
-            }
-            throw $e;
-        }
-
-        /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */
-        $classMapper = $this->ci->classMapper;
-
-        // Get the user to delete
-        $user = $classMapper->staticMethod('user', 'where', 'user_name', $data['user_name'])
-            ->first();
-
-        return $user;
-    }
-}
+getParsedBody();
+
+        /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */
+        $authorizer = $this->ci->authorizer;
+
+        /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */
+        $currentUser = $this->ci->currentUser;
+
+        // Access-controlled page
+        if (!$authorizer->checkAccess($currentUser, 'create_user')) {
+            throw new ForbiddenException();
+        }
+
+        /** @var UserFrosting\Sprinkle\Core\MessageStream $ms */
+        $ms = $this->ci->alerts;
+
+        // Load the request schema
+        $schema = new RequestSchema('schema://requests/user/create.yaml');
+
+        // Whitelist and set parameter defaults
+        $transformer = new RequestDataTransformer($schema);
+        $data = $transformer->transform($params);
+
+        $error = FALSE;
+
+        // Validate request data
+        $validator = new ServerSideValidator($schema, $this->ci->translator);
+        if (!$validator->validate($data)) {
+            $ms->addValidationErrors($validator);
+            $error = TRUE;
+        }
+
+        /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */
+        $classMapper = $this->ci->classMapper;
+
+        // Check if username or email already exists
+        if ($classMapper->staticMethod('user', 'findUnique', $data['user_name'], 'user_name')) {
+            $ms->addMessageTranslated('danger', 'USERNAME.IN_USE', $data);
+            $error = TRUE;
+        }
+
+        if ($classMapper->staticMethod('user', 'findUnique', $data['email'], 'email')) {
+            $ms->addMessageTranslated('danger', 'EMAIL.IN_USE', $data);
+            $error = TRUE;
+        }
+
+        if ($error) {
+            return $response->withStatus(400);
+        }
+
+        /** @var UserFrosting\Config\Config $config */
+        $config = $this->ci->config;
+
+        // If currentUser does not have permission to set the group, but they try to set it to something other than their own group,
+        // throw an exception.
+        if (!$authorizer->checkAccess($currentUser, 'create_user_field', [
+            'fields' => ['group']
+        ])) {
+            if (isset($data['group_id']) && $data['group_id'] != $currentUser->group_id) {
+                throw new ForbiddenException();
+            }
+        }
+
+        // In any case, set the group id if not otherwise set
+        if (!isset($data['group_id'])) {
+            $data['group_id'] = $currentUser->group_id;
+        }
+
+        $data['flag_verified'] = 1;
+        // Set password as empty on initial creation.  We will then send email so new user can set it themselves via a verification token
+        $data['password'] = '';
+
+        // All checks passed!  log events/activities, create user, and send verification email (if required)
+        // Begin transaction - DB will be rolled back if an exception occurs
+        Capsule::transaction(function () use ($classMapper, $data, $ms, $config, $currentUser) {
+            // Create the user
+            $user = $classMapper->createInstance('user', $data);
+
+            // Store new user to database
+            $user->save();
+
+            // Create activity record
+            $this->ci->userActivityLogger->info("User {$currentUser->user_name} created a new account for {$user->user_name}.", [
+                'type' => 'account_create',
+                'user_id' => $currentUser->id
+            ]);
+
+            // Load default roles
+            $defaultRoleSlugs = $classMapper->staticMethod('role', 'getDefaultSlugs');
+            $defaultRoles = $classMapper->staticMethod('role', 'whereIn', 'slug', $defaultRoleSlugs)->get();
+            $defaultRoleIds = $defaultRoles->pluck('id')->all();
+
+            // Attach default roles
+            $user->roles()->attach($defaultRoleIds);
+
+            // Try to generate a new password request
+            $passwordRequest = $this->ci->repoPasswordReset->create($user, $config['password_reset.timeouts.create']);
+
+            // Create and send welcome email with password set link
+            $message = new TwigMailMessage($this->ci->view, 'mail/password-create.html.twig');
+
+            $message->from($config['address_book.admin'])
+                ->addEmailRecipient(new EmailRecipient($user->email, $user->full_name))
+                ->addParams([
+                    'user' => $user,
+                    'create_password_expiration' => $config['password_reset.timeouts.create'] / 3600 . ' hours',
+                    'token' => $passwordRequest->getToken()
+                ]);
+
+            $this->ci->mailer->send($message);
+
+            $ms->addMessageTranslated('success', 'USER.CREATED', $data);
+        });
+
+        return $response->withStatus(200);
+    }
+
+    /**
+     * Processes the request to send a user a password reset email.
+     *
+     * Processes the request from the user update form, checking that:
+     * 1. The target user's new email address, if specified, is not already in use;
+     * 2. The logged-in user has the necessary permissions to update the posted field(s);
+     * 3. We're not trying to disable the master account;
+     * 4. The submitted data is valid.
+     * This route requires authentication.
+     * Request type: POST
+     * @throws ForbiddenException
+     * @throws NotFoundException
+     * @throws BadRequestException
+     */
+    public function createPasswordReset($request, $response, $args) {
+        // Get the username from the URL
+        $user = $this->getUserFromParams($args);
+
+        if (!$user) {
+            throw new NotFoundException($request, $response);
+        }
+
+        /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */
+        $authorizer = $this->ci->authorizer;
+
+        /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */
+        $currentUser = $this->ci->currentUser;
+
+        // Access-controlled resource - check that currentUser has permission to edit "password" for this user
+        if (!$authorizer->checkAccess($currentUser, 'update_user_field', [
+            'user' => $user,
+            'fields' => ['password']
+        ])) {
+            throw new ForbiddenException();
+        }
+
+        /** @var UserFrosting\Config\Config $config */
+        $config = $this->ci->config;
+
+        /** @var UserFrosting\Sprinkle\Core\MessageStream $ms */
+        $ms = $this->ci->alerts;
+
+        // Begin transaction - DB will be rolled back if an exception occurs
+        Capsule::transaction(function () use ($user, $config) {
+
+            // Create a password reset and shoot off an email
+            $passwordReset = $this->ci->repoPasswordReset->create($user, $config['password_reset.timeouts.reset']);
+
+            // Create and send welcome email with password set link
+            $message = new TwigMailMessage($this->ci->view, 'mail/password-reset.html.twig');
+
+            $message->from($config['address_book.admin'])
+                ->addEmailRecipient(new EmailRecipient($user->email, $user->full_name))
+                ->addParams([
+                    'user' => $user,
+                    'token' => $passwordReset->getToken(),
+                    'request_date' => Carbon::now()->format('Y-m-d H:i:s')
+                ]);
+
+            $this->ci->mailer->send($message);
+        });
+
+        $ms->addMessageTranslated('success', 'PASSWORD.FORGET.REQUEST_SENT', [
+            'email' => $user->email
+        ]);
+        return $response->withStatus(200);
+    }
+
+
+    /**
+     * Sets the users public key
+     * Request type: POST
+     * @throws NotFoundException
+     * @throws BadRequestException
+     * @throws ForbiddenException
+     */
+    public function setPublicKey($request, $response, $args) {
+        $requestedUser = $this->getUserFromParams($args);
+
+        if (!$requestedUser) {
+            throw new NotFoundException($request, $response);
+        }
+
+        $PublicKey = $request->getParsedBody()["PublicKey"];
+
+        if ($this->ci->currentUser->id === $requestedUser->id && (Capsule::table('public_keys')
+                ->where('user_id', "=", $requestedUser->id)
+                ->exists()) === FALSE) {
+            Capsule::table('public_keys')
+                ->insert(['user_id' => $requestedUser->id, 'key' => substr(substr($PublicKey, 100), 0, -40)]);
+            return $response->withStatus(200);
+        } else if ($this->ci->currentUser->id === $requestedUser->id) {
+            Capsule::table('public_keys')
+                ->where('user_id', $requestedUser->id)
+                ->update(['key' => substr(substr($PublicKey, 100), 0, -40)]);
+            return $response->withStatus(200);
+        } else {
+            throw new ForbiddenException();
+        }
+    }
+
+    /**
+     * Processes the request to delete an existing user.
+     *
+     * Deletes the specified user, removing any existing associations.
+     * Before doing so, checks that:
+     * 1. You are not trying to delete the master account;
+     * 2. You have permission to delete the target user's account.
+     * This route requires authentication (and should generally be limited to admins or the root user).
+     * Request type: DELETE
+     * @throws BadRequestException
+     * @throws ForbiddenException
+     * @throws NotFoundException
+     * @throws BadRequestException
+     */
+    public function delete($request, $response, $args) {
+        $user = $this->getUserFromParams($args);
+
+        // If the user doesn't exist, return 404
+        if (!$user) {
+            throw new NotFoundException($request, $response);
+        }
+
+        /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */
+        $authorizer = $this->ci->authorizer;
+
+        /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */
+        $currentUser = $this->ci->currentUser;
+
+        // Access-controlled page
+        if (!$authorizer->checkAccess($currentUser, 'delete_user', [
+            'user' => $user
+        ])) {
+            throw new ForbiddenException();
+        }
+
+        /** @var UserFrosting\Config\Config $config */
+        $config = $this->ci->config;
+
+        // Check that we are not deleting the master account
+        // Need to use loose comparison for now, because some DBs return `id` as a string
+        if ($user->id == $config['reserved_user_ids.master']) {
+            $e = new BadRequestException();
+            $e->addUserMessage('DELETE_MASTER');
+            throw $e;
+        }
+
+        $userName = $user->user_name;
+
+        // Begin transaction - DB will be rolled back if an exception occurs
+        Capsule::transaction(function () use ($user, $userName, $currentUser) {
+            $user->delete();
+            unset($user);
+
+            // Create activity record
+            $this->ci->userActivityLogger->info("User {$currentUser->user_name} deleted the account for {$userName}.", [
+                'type' => 'account_delete',
+                'user_id' => $currentUser->id
+            ]);
+        });
+
+        /** @var UserFrosting\Sprinkle\Core\MessageStream $ms */
+        $ms = $this->ci->alerts;
+
+        $ms->addMessageTranslated('success', 'DELETION_SUCCESSFUL', [
+            'user_name' => $userName
+        ]);
+
+        return $response->withStatus(200);
+    }
+
+    /**
+     * Returns activity history for a single user.
+     *
+     * This page requires authentication.
+     * Request type: GET
+     * @throws ForbiddenException
+     * @throws NotFoundException
+     * @throws BadRequestException
+     */
+    public function getActivities($request, $response, $args) {
+        $user = $this->getUserFromParams($args);
+
+        // If the user doesn't exist, return 404
+        if (!$user) {
+            throw new NotFoundException($request, $response);
+        }
+
+        /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */
+        $classMapper = $this->ci->classMapper;
+
+        // GET parameters
+        $params = $request->getQueryParams();
+
+        /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */
+        $authorizer = $this->ci->authorizer;
+
+        /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */
+        $currentUser = $this->ci->currentUser;
+
+        // Access-controlled page
+        if (!$authorizer->checkAccess($currentUser, 'view_user_field', [
+            'user' => $user,
+            'property' => 'activities'
+        ])) {
+            throw new ForbiddenException();
+        }
+
+        $sprunje = $classMapper->createInstance('activity_sprunje', $classMapper, $params);
+
+        $sprunje->extendQuery(function ($query) use ($user) {
+            return $query->where('user_id', $user->id);
+        });
+
+        // Be careful how you consume this data - it has not been escaped and contains untrusted user-supplied content.
+        // For example, if you plan to insert it into an HTML DOM, you must escape it on the client side (or use client-side templating).
+        return $sprunje->toResponse($response);
+    }
+
+    /**
+     * Returns info for a single user.
+     *
+     * This page requires authentication.
+     * Request type: GET
+     * @throws ForbiddenException
+     * @throws NotFoundException
+     * @throws BadRequestException
+     */
+    public function getInfo($request, $response, $args) {
+        $user = $this->getUserFromParams($args);
+
+        // If the user doesn't exist, return 404
+        if (!$user) {
+            throw new NotFoundException($request, $response);
+        }
+
+        /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */
+        $classMapper = $this->ci->classMapper;
+
+        // Join user's most recent activity
+        $user = $classMapper->createInstance('user')
+            ->where('user_name', $user->user_name)
+            ->joinLastActivity()
+            ->with('lastActivity', 'group')
+            ->first();
+
+        /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */
+        $authorizer = $this->ci->authorizer;
+
+        /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */
+        $currentUser = $this->ci->currentUser;
+
+        // Access-controlled page
+        if (!$authorizer->checkAccess($currentUser, 'uri_user', [
+            'user' => $user
+        ])) {
+            throw new ForbiddenException();
+        }
+
+        $result = $user->toArray();
+        $result["avatar"] = $user->avatar;
+
+        // Be careful how you consume this data - it has not been escaped and contains untrusted user-supplied content.
+        // For example, if you plan to insert it into an HTML DOM, you must escape it on the client side (or use client-side templating).
+        return $response->withJson($result, 200, JSON_PRETTY_PRINT);
+    }
+
+    /**
+     * Returns a list of Users
+     *
+     * Generates a list of users, optionally paginated, sorted and/or filtered.
+     * This page requires authentication.
+     * Request type: GET
+     * @throws ForbiddenException
+     */
+    public function getList($request, $response, $args) {
+        // GET parameters
+        $params = $request->getQueryParams();
+
+        /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */
+        $authorizer = $this->ci->authorizer;
+
+        /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */
+        $currentUser = $this->ci->currentUser;
+
+        // Access-controlled page
+        if (!$authorizer->checkAccess($currentUser, 'uri_users')) {
+            throw new ForbiddenException();
+        }
+
+        /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */
+        $classMapper = $this->ci->classMapper;
+
+        $sprunje = $classMapper->createInstance('user_sprunje', $classMapper, $params);
+
+        // Be careful how you consume this data - it has not been escaped and contains untrusted user-supplied content.
+        // For example, if you plan to insert it into an HTML DOM, you must escape it on the client side (or use client-side templating).
+        return $sprunje->toResponse($response);
+    }
+
+    /**
+     * Renders the modal form to confirm user deletion.
+     *
+     * This does NOT render a complete page.  Instead, it renders the HTML for the modal, which can be embedded in other pages.
+     * This page requires authentication.
+     * Request type: GET
+     * @throws BadRequestException
+     * @throws ForbiddenException
+     * @throws NotFoundException
+     * @throws BadRequestException
+     */
+    public function getModalConfirmDelete($request, $response, $args) {
+        // GET parameters
+        $params = $request->getQueryParams();
+
+        $user = $this->getUserFromParams($params);
+
+        // If the user doesn't exist, return 404
+        if (!$user) {
+            throw new NotFoundException($request, $response);
+        }
+
+        /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */
+        $authorizer = $this->ci->authorizer;
+
+        /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */
+        $currentUser = $this->ci->currentUser;
+
+        // Access-controlled page
+        if (!$authorizer->checkAccess($currentUser, 'delete_user', [
+            'user' => $user
+        ])) {
+            throw new ForbiddenException();
+        }
+
+        /** @var UserFrosting\Config\Config $config */
+        $config = $this->ci->config;
+
+        // Check that we are not deleting the master account
+        // Need to use loose comparison for now, because some DBs return `id` as a string
+        if ($user->id == $config['reserved_user_ids.master']) {
+            $e = new BadRequestException();
+            $e->addUserMessage('DELETE_MASTER');
+            throw $e;
+        }
+
+        return $this->ci->view->render($response, 'modals/confirm-delete-user.html.twig', [
+            'user' => $user,
+            'form' => [
+                'action' => "api/users/u/{$user->user_name}",
+            ]
+        ]);
+    }
+
+    /**
+     * Renders the modal form for creating a new user.
+     *
+     * This does NOT render a complete page.  Instead, it renders the HTML for the modal, which can be embedded in other pages.
+     * If the currently logged-in user has permission to modify user group membership, then the group toggle will be displayed.
+     * Otherwise, the user will be added to the default group and receive the default roles automatically.
+     * This page requires authentication.
+     * Request type: GET
+     * @throws ForbiddenException
+     */
+    public function getModalCreate($request, $response, $args) {
+        // GET parameters
+        $params = $request->getQueryParams();
+
+        /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */
+        $authorizer = $this->ci->authorizer;
+
+        /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */
+        $currentUser = $this->ci->currentUser;
+
+        /** @var UserFrosting\I18n\MessageTranslator $translator */
+        $translator = $this->ci->translator;
+
+        // Access-controlled page
+        if (!$authorizer->checkAccess($currentUser, 'create_user')) {
+            throw new ForbiddenException();
+        }
+
+        /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */
+        $classMapper = $this->ci->classMapper;
+
+        /** @var UserFrosting\Config\Config $config */
+        $config = $this->ci->config;
+
+        // Determine form fields to hide/disable
+        $fields = [
+            'hidden' => ['theme'],
+            'disabled' => []
+        ];
+
+        // Get a list of all locales
+        $locales = $config->getDefined('site.locales.available');
+
+        // Determine if currentUser has permission to modify the group.  If so, show the 'group' dropdown.
+        // Otherwise, set to the currentUser's group and disable the dropdown.
+        if ($authorizer->checkAccess($currentUser, 'create_user_field', [
+            'fields' => ['group']
+        ])) {
+            // Get a list of all groups
+            $groups = $classMapper->staticMethod('group', 'all');
+        } else {
+            // Get the current user's group
+            $groups = $currentUser->group()->get();
+            $fields['disabled'][] = 'group';
+        }
+
+        // Create a dummy user to prepopulate fields
+        $data = [
+            'group_id' => $currentUser->group_id,
+            'locale' => $config['site.registration.user_defaults.locale'],
+            'theme' => ''
+        ];
+
+        $user = $classMapper->createInstance('user', $data);
+
+        // Load validation rules
+        $schema = new RequestSchema('schema://requests/user/create.yaml');
+        $validator = new JqueryValidationAdapter($schema, $this->ci->translator);
+
+        return $this->ci->view->render($response, 'modals/user.html.twig', [
+            'user' => $user,
+            'groups' => $groups,
+            'locales' => $locales,
+            'form' => [
+                'action' => 'api/users',
+                'method' => 'POST',
+                'fields' => $fields,
+                'submit_text' => $translator->translate('CREATE')
+            ],
+            'page' => [
+                'validators' => $validator->rules('json', FALSE)
+            ]
+        ]);
+    }
+
+    /**
+     * Renders the modal form for editing an existing user.
+     *
+     * This does NOT render a complete page.  Instead, it renders the HTML for the modal, which can be embedded in other pages.
+     * This page requires authentication.
+     * Request type: GET
+     * @throws ForbiddenException
+     * @throws NotFoundException
+     * @throws BadRequestException
+     */
+    public function getModalEdit($request, $response, $args) {
+        // GET parameters
+        $params = $request->getQueryParams();
+
+        $user = $this->getUserFromParams($params);
+
+        // If the user doesn't exist, return 404
+        if (!$user) {
+            throw new NotFoundException($request, $response);
+        }
+
+        /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */
+        $classMapper = $this->ci->classMapper;
+
+        // Get the user to edit
+        $user = $classMapper->staticMethod('user', 'where', 'user_name', $user->user_name)
+            ->with('group')
+            ->first();
+
+        /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */
+        $authorizer = $this->ci->authorizer;
+
+        /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */
+        $currentUser = $this->ci->currentUser;
+
+        // Access-controlled resource - check that currentUser has permission to edit basic fields "name", "email", "locale" for this user
+        $fieldNames = ['name', 'email', 'locale'];
+        if (!$authorizer->checkAccess($currentUser, 'update_user_field', [
+            'user' => $user,
+            'fields' => $fieldNames
+        ])) {
+            throw new ForbiddenException();
+        }
+
+        // Get a list of all groups
+        $groups = $classMapper->staticMethod('group', 'all');
+
+        /** @var UserFrosting\Config\Config $config */
+        $config = $this->ci->config;
+
+        // Get a list of all locales
+        $locales = $config->getDefined('site.locales.available');
+
+        // Generate form
+        $fields = [
+            'hidden' => ['theme'],
+            'disabled' => ['user_name']
+        ];
+
+        // Disable group field if currentUser doesn't have permission to modify group
+        if (!$authorizer->checkAccess($currentUser, 'update_user_field', [
+            'user' => $user,
+            'fields' => ['group']
+        ])) {
+            $fields['disabled'][] = 'group';
+        }
+
+        // Load validation rules
+        $schema = new RequestSchema('schema://requests/user/edit-info.yaml');
+        $validator = new JqueryValidationAdapter($schema, $this->ci->translator);
+
+        $translator = $this->ci->translator;
+
+        return $this->ci->view->render($response, 'modals/user.html.twig', [
+            'user' => $user,
+            'groups' => $groups,
+            'locales' => $locales,
+            'form' => [
+                'action' => "api/users/u/{$user->user_name}",
+                'method' => 'PUT',
+                'fields' => $fields,
+                'submit_text' => $translator->translate('UPDATE')
+            ],
+            'page' => [
+                'validators' => $validator->rules('json', FALSE)
+            ]
+        ]);
+    }
+
+    /**
+     * Renders the modal form for editing a user's password.
+     *
+     * This does NOT render a complete page.  Instead, it renders the HTML for the form, which can be embedded in other pages.
+     * This page requires authentication.
+     * Request type: GET
+     * @throws ForbiddenException
+     * @throws NotFoundException
+     * @throws BadRequestException
+     */
+    public function getModalEditPassword($request, $response, $args) {
+        // GET parameters
+        $params = $request->getQueryParams();
+
+        $user = $this->getUserFromParams($params);
+
+        // If the user doesn't exist, return 404
+        if (!$user) {
+            throw new NotFoundException($request, $response);
+        }
+
+        /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */
+        $authorizer = $this->ci->authorizer;
+
+        /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */
+        $currentUser = $this->ci->currentUser;
+
+        // Access-controlled resource - check that currentUser has permission to edit "password" field for this user
+        if (!$authorizer->checkAccess($currentUser, 'update_user_field', [
+            'user' => $user,
+            'fields' => ['password']
+        ])) {
+            throw new ForbiddenException();
+        }
+
+        // Load validation rules
+        $schema = new RequestSchema('schema://requests/user/edit-password.yaml');
+        $validator = new JqueryValidationAdapter($schema, $this->ci->translator);
+
+        return $this->ci->view->render($response, 'modals/user-set-password.html.twig', [
+            'user' => $user,
+            'page' => [
+                'validators' => $validator->rules('json', FALSE)
+            ]
+        ]);
+    }
+
+    /**
+     * Renders the modal form for editing a user's roles.
+     *
+     * This does NOT render a complete page.  Instead, it renders the HTML for the form, which can be embedded in other pages.
+     * This page requires authentication.
+     * Request type: GET
+     * @throws ForbiddenException
+     * @throws NotFoundException
+     * @throws BadRequestException
+     */
+    public function getModalEditRoles($request, $response, $args) {
+        // GET parameters
+        $params = $request->getQueryParams();
+
+        $user = $this->getUserFromParams($params);
+
+        // If the user doesn't exist, return 404
+        if (!$user) {
+            throw new NotFoundException($request, $response);
+        }
+
+        /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */
+        $authorizer = $this->ci->authorizer;
+
+        /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */
+        $currentUser = $this->ci->currentUser;
+
+        // Access-controlled resource - check that currentUser has permission to edit "roles" field for this user
+        if (!$authorizer->checkAccess($currentUser, 'update_user_field', [
+            'user' => $user,
+            'fields' => ['roles']
+        ])) {
+            throw new ForbiddenException();
+        }
+
+        return $this->ci->view->render($response, 'modals/user-manage-roles.html.twig', [
+            'user' => $user
+        ]);
+    }
+
+    /**
+     * Returns a list of effective Permissions for a specified User.
+     *
+     * Generates a list of permissions, optionally paginated, sorted and/or filtered.
+     * This page requires authentication.
+     * Request type: GET
+     * @throws ForbiddenException
+     * @throws NotFoundException
+     * @throws BadRequestException
+     */
+    public function getPermissions($request, $response, $args) {
+        $user = $this->getUserFromParams($args);
+
+        // If the user doesn't exist, return 404
+        if (!$user) {
+            throw new NotFoundException($request, $response);
+        }
+
+        // GET parameters
+        $params = $request->getQueryParams();
+
+        /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager */
+        $authorizer = $this->ci->authorizer;
+
+        /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */
+        $currentUser = $this->ci->currentUser;
+
+        // Access-controlled page
+        if (!$authorizer->checkAccess($currentUser, 'view_user_field', [
+            'user' => $user,
+            'property' => 'permissions'
+        ])) {
+            throw new ForbiddenException();
+        }
+
+        /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */
+        $classMapper = $this->ci->classMapper;
+
+        $params['user_id'] = $user->id;
+        $sprunje = $classMapper->createInstance('user_permission_sprunje', $classMapper, $params);
+
+        $response = $sprunje->toResponse($response);
+
+        // Be careful how you consume this data - it has not been escaped and contains untrusted user-supplied content.
+        // For example, if you plan to insert it into an HTML DOM, you must escape it on the client side (or use client-side templating).
+        return $response;
+    }
+
+    /**
+     * Returns roles associated with a single user.
+     *
+     * This page requires authentication.
+     * Request type: GET
+     * @throws ForbiddenException
+     * @throws NotFoundException
+     * @throws BadRequestException
+     */
+    public function getRoles($request, $response, $args) {
+        $user = $this->getUserFromParams($args);
+
+        // If the user doesn't exist, return 404
+        if (!$user) {
+            throw new NotFoundException($request, $response);
+        }
+
+        /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */
+        $classMapper = $this->ci->classMapper;
+
+        // GET parameters
+        $params = $request->getQueryParams();
+
+        /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */
+        $authorizer = $this->ci->authorizer;
+
+        /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */
+        $currentUser = $this->ci->currentUser;
+
+        // Access-controlled page
+        if (!$authorizer->checkAccess($currentUser, 'view_user_field', [
+            'user' => $user,
+            'property' => 'roles'
+        ])) {
+            throw new ForbiddenException();
+        }
+
+        $sprunje = $classMapper->createInstance('role_sprunje', $classMapper, $params);
+        $sprunje->extendQuery(function ($query) use ($user) {
+            return $query->forUser($user->id);
+        });
+
+        // Be careful how you consume this data - it has not been escaped and contains untrusted user-supplied content.
+        // For example, if you plan to insert it into an HTML DOM, you must escape it on the client side (or use client-side templating).
+        return $sprunje->toResponse($response);
+    }
+
+    /**
+     * Renders a page displaying a user's information, in read-only mode.
+     *
+     * This checks that the currently logged-in user has permission to view the requested user's info.
+     * It checks each field individually, showing only those that you have permission to view.
+     * This will also try to show buttons for activating, disabling/enabling, deleting, and editing the user.
+     * This page requires authentication.
+     * Request type: GET
+     * @throws ForbiddenException
+     * @throws BadRequestException
+     */
+    public function pageInfo($request, $response, $args) {
+        $user = $this->getUserFromParams($args);
+
+        // If the user no longer exists, forward to main user listing page
+        if (!$user) {
+            $usersPage = $this->ci->router->pathFor('uri_users');
+            return $response->withRedirect($usersPage, 404);
+        }
+
+        /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */
+        $authorizer = $this->ci->authorizer;
+
+        /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */
+        $currentUser = $this->ci->currentUser;
+
+        // Access-controlled page
+        if (!$authorizer->checkAccess($currentUser, 'uri_user', [
+            'user' => $user
+        ])) {
+            throw new ForbiddenException();
+        }
+
+        /** @var UserFrosting\Config\Config $config */
+        $config = $this->ci->config;
+
+        // Get a list of all locales
+        $locales = $config->getDefined('site.locales.available');
+
+        // Determine fields that currentUser is authorized to view
+        $fieldNames = ['user_name', 'name', 'email', 'locale', 'group', 'roles'];
+
+        // Generate form
+        $fields = [
+            // Always hide these
+            'hidden' => ['theme']
+        ];
+
+        // Determine which fields should be hidden
+        foreach ($fieldNames as $field) {
+            if (!$authorizer->checkAccess($currentUser, 'view_user_field', [
+                'user' => $user,
+                'property' => $field
+            ])) {
+                $fields['hidden'][] = $field;
+            }
+        }
+
+        // Determine buttons to display
+        $editButtons = [
+            'hidden' => []
+        ];
+
+        if (!$authorizer->checkAccess($currentUser, 'update_user_field', [
+            'user' => $user,
+            'fields' => ['name', 'email', 'locale']
+        ])) {
+            $editButtons['hidden'][] = 'edit';
+        }
+
+        if (!$authorizer->checkAccess($currentUser, 'update_user_field', [
+            'user' => $user,
+            'fields' => ['flag_enabled']
+        ])) {
+            $editButtons['hidden'][] = 'enable';
+        }
+
+        if (!$authorizer->checkAccess($currentUser, 'update_user_field', [
+            'user' => $user,
+            'fields' => ['flag_verified']
+        ])) {
+            $editButtons['hidden'][] = 'activate';
+        }
+
+        if (!$authorizer->checkAccess($currentUser, 'update_user_field', [
+            'user' => $user,
+            'fields' => ['password']
+        ])) {
+            $editButtons['hidden'][] = 'password';
+        }
+
+        if (!$authorizer->checkAccess($currentUser, 'update_user_field', [
+            'user' => $user,
+            'fields' => ['roles']
+        ])) {
+            $editButtons['hidden'][] = 'roles';
+        }
+
+        if (!$authorizer->checkAccess($currentUser, 'delete_user', [
+            'user' => $user
+        ])) {
+            $editButtons['hidden'][] = 'delete';
+        }
+
+        // Determine widgets to display
+        $widgets = [
+            'hidden' => []
+        ];
+
+        if (!$authorizer->checkAccess($currentUser, 'view_user_field', [
+            'user' => $user,
+            'property' => 'permissions'
+        ])) {
+            $widgets['hidden'][] = 'permissions';
+        }
+
+        if (!$authorizer->checkAccess($currentUser, 'view_user_field', [
+            'user' => $user,
+            'property' => 'activities'
+        ])) {
+            $widgets['hidden'][] = 'activities';
+        }
+
+        return $this->ci->view->render($response, 'pages/user.html.twig', [
+            'user' => $user,
+            'locales' => $locales,
+            'fields' => $fields,
+            'tools' => $editButtons,
+            'widgets' => $widgets
+        ]);
+    }
+
+    /**
+     * Renders the user listing page.
+     *
+     * This page renders a table of users, with dropdown menus for admin actions for each user.
+     * Actions typically include: edit user details, activate user, enable/disable user, delete user.
+     * This page requires authentication.
+     * Request type: GET
+     * @throws ForbiddenException
+     */
+    public function pageList($request, $response, $args) {
+        /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */
+        $authorizer = $this->ci->authorizer;
+
+        /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */
+        $currentUser = $this->ci->currentUser;
+
+        // Access-controlled page
+        if (!$authorizer->checkAccess($currentUser, 'uri_users')) {
+            throw new ForbiddenException();
+        }
+
+        return $this->ci->view->render($response, 'pages/users.html.twig');
+    }
+
+    /**
+     * Gets the users public key
+     * Request type: GET
+     * @throws NotFoundException
+     * @throws BadRequestException
+     */
+    public function getPublicKey($request, $response, $args) {
+        $requestedUser = $this->getUserFromParams($args);
+
+        if (!$requestedUser) {
+            throw new NotFoundException($request, $response);
+        }
+
+        if ((Capsule::table('public_keys')
+            ->where('user_id', "=", $requestedUser->id)
+            ->exists())) {
+
+            $RawPublicKey = Capsule::table('public_keys')
+                ->where('user_id', "=", $requestedUser->id)
+                ->value('key');
+            $PublicKey = "-----BEGIN PGP PUBLIC KEY BLOCK-----\nVersion: OpenPGP.js v3.0.9\nComment: https://openpgpjs.org\n\n" . $RawPublicKey . "\n-----END PGP PUBLIC KEY BLOCK-----";
+
+            $ContentType = explode(',', $request->getHeaderLine('Accept'))[0];
+            switch ($ContentType) {
+                case 'application/json':
+                    $response->write(json_encode(array('user_id' => $requestedUser->id, 'PublicKey' => $PublicKey)));
+                    break;
+                case 'text/html':
+                    $response->write("
" . $PublicKey);
+                    break;
+                default:
+                    $response->write($PublicKey);
+            }
+            return $response->withStatus(200);
+        } else {
+            throw new NotFoundException($request, $response);
+        }
+    }
+
+    /**
+     * Gets the users which are following the requested user
+     * Request type: GET
+     * @throws ForbiddenException
+     * @throws NotFoundException
+     * @throws BadRequestException
+     */
+    public function getFollowers($request, $response, $args) {
+        $user = $this->getUserFromParams($args);
+
+        // If the user doesn't exist, return 404
+        if (!$user) {
+            throw new NotFoundException($request, $response);
+        }
+
+        /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */
+        $authorizer = $this->ci->authorizer;
+
+        /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */
+        $currentUser = $this->ci->currentUser;
+
+        // Access-controlled page
+        if (!$authorizer->checkAccess($currentUser, 'uri_user', [
+            'user' => $user
+        ])) {
+            throw new ForbiddenException();
+        }
+
+        $UsersFollowers = Capsule::table('user_follow')
+            ->where('user_id', "=", $user->id)
+            ->join("users", "users.id", "=", "user_follow.followed_by_id")
+            ->select("user_follow.followed_by_id as id", "users.user_name as username")
+            ->get();
+
+        $result = $UsersFollowers->toArray();
+
+        return $response->withJson($result, 200, JSON_PRETTY_PRINT);
+    }
+
+    /**
+     * Get users which the user follows
+     * Request type: GET
+     * @throws ForbiddenException
+     * @throws NotFoundException
+     * @throws BadRequestException
+     */
+    public function getFollows($request, $response, $args) {
+        $user = $this->getUserFromParams($args);
+
+        // If the user doesn't exist, return 404
+        if (!$user) {
+            throw new NotFoundException($request, $response);
+        }
+
+        /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */
+        $authorizer = $this->ci->authorizer;
+
+        /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */
+        $currentUser = $this->ci->currentUser;
+
+        // Access-controlled page
+        if (($user->id == $currentUser->id) || (!$authorizer->checkAccess($currentUser, 'uri_user', [
+                'user' => $user
+            ]))) {
+            throw new ForbiddenException();
+        }
+
+        $UsersFollows = Capsule::table('user_follow')
+            ->where('followed_by_id', "=", $user->id)
+            ->join("users", "users.id", "=", "user_follow.user_id")
+            ->select("user_follow.user_id as id", "users.user_name as username")
+            ->get();
+
+        $result = $UsersFollows->toArray();
+
+        return $response->withJson($result, 200, JSON_PRETTY_PRINT);
+    }
+
+    /**
+     * Get users which the user follows and which are following the user
+     * Request type: GET
+     * @throws NotFoundException
+     * @throws ForbiddenException
+     * @throws BadRequestException
+     */
+    public function getFriends($request, $response, $args) {
+        $user = $this->getUserFromParams($args);
+
+        // If the user doesn't exist, return 404
+        if (!$user) {
+            throw new NotFoundException($request, $response);
+        }
+
+        /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */
+        $authorizer = $this->ci->authorizer;
+
+        /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */
+        $currentUser = $this->ci->currentUser;
+
+        // Access-controlled page
+        if (!$authorizer->checkAccess($currentUser, 'uri_user', [
+            'user' => $user
+        ])) {
+            throw new ForbiddenException();
+        }
+
+        $UsersFriends = Capsule::select("SELECT id FROM (SELECT user_id AS id FROM user_follow WHERE followed_by_id = $user->id UNION ALL SELECT followed_by_id FROM user_follow WHERE user_id = $user->id) t GROUP BY id HAVING COUNT(id) > 1");
+
+        /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */
+        $classMapper = $this->ci->classMapper;
+
+        foreach ($UsersFriends as $Key => $UsersFriendId) { // NOT THAT EFFICIENT...
+            $UsersFriendInformation = $classMapper->createInstance('user')// raw select doesnt work with instance
+            ->where('id', $UsersFriendId->id)
+                ->get();
+
+            $UsersFriends[$Key]->id = $UsersFriendInformation[0]->id;
+            $UsersFriends[$Key]->username = $UsersFriendInformation[0]->user_name;
+            $UsersFriends[$Key]->avatar = $UsersFriendInformation[0]->avatar;
+            $UsersFriends[$Key]->full_name = $UsersFriendInformation[0]->full_name;
+        }
+
+        $result = $UsersFriends;
+
+        if (sizeof($result) > 0) { // USER HAS FRIENDS
+            return $response->withJson($result, 200, JSON_PRETTY_PRINT);
+        } else {
+            throw new NotFoundException($request, $response);
+        }
+    }
+
+
+    /**
+     * Processes the request to update an existing user's basic details (first_name, last_name, email, locale, group_id)
+     *
+     * Processes the request from the user update form, checking that:
+     * 1. The target user's new email address, if specified, is not already in use;
+     * 2. The logged-in user has the necessary permissions to update the putted field(s);
+     * 3. The submitted data is valid.
+     * This route requires authentication.
+     * Request type: PUT
+     * @throws NotFoundException
+     * @throws ForbiddenException
+     * @throws BadRequestException
+     * @throws BadRequestException
+     */
+    public function updateInfo($request, $response, $args) {
+        // Get the username from the URL
+        $user = $this->getUserFromParams($args);
+
+        if (!$user) {
+            throw new NotFoundException($request, $response);
+        }
+
+        /** @var UserFrosting\Config\Config $config */
+        $config = $this->ci->config;
+
+        // Get PUT parameters
+        $params = $request->getParsedBody();
+
+        /** @var UserFrosting\Sprinkle\Core\MessageStream $ms */
+        $ms = $this->ci->alerts;
+
+        // Load the request schema
+        $schema = new RequestSchema('schema://requests/user/edit-info.yaml');
+
+        // Whitelist and set parameter defaults
+        $transformer = new RequestDataTransformer($schema);
+        $data = $transformer->transform($params);
+
+        $error = FALSE;
+
+        // Validate request data
+        $validator = new ServerSideValidator($schema, $this->ci->translator);
+        if (!$validator->validate($data)) {
+            $ms->addValidationErrors($validator);
+            $error = TRUE;
+        }
+
+        // Determine targeted fields
+        $fieldNames = [];
+        foreach ($data as $name => $value) {
+            if ($name == 'first_name' || $name == 'last_name') {
+                $fieldNames[] = 'name';
+            } else if ($name == 'group_id') {
+                $fieldNames[] = 'group';
+            } else {
+                $fieldNames[] = $name;
+            }
+        }
+
+        /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */
+        $authorizer = $this->ci->authorizer;
+
+        /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */
+        $currentUser = $this->ci->currentUser;
+
+        // Access-controlled resource - check that currentUser has permission to edit submitted fields for this user
+        if (!$authorizer->checkAccess($currentUser, 'update_user_field', [
+            'user' => $user,
+            'fields' => array_values(array_unique($fieldNames))
+        ])) {
+            throw new ForbiddenException();
+        }
+
+        // Only the master account can edit the master account!
+        if (
+            ($user->id == $config['reserved_user_ids.master']) &&
+            ($currentUser->id != $config['reserved_user_ids.master'])
+        ) {
+            throw new ForbiddenException();
+        }
+
+        /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */
+        $classMapper = $this->ci->classMapper;
+
+        // Check if email already exists
+        if (
+            isset($data['email']) &&
+            $data['email'] != $user->email &&
+            $classMapper->staticMethod('user', 'findUnique', $data['email'], 'email')
+        ) {
+            $ms->addMessageTranslated('danger', 'EMAIL.IN_USE', $data);
+            $error = TRUE;
+        }
+
+        if ($error) {
+            return $response->withStatus(400);
+        }
+
+        // Begin transaction - DB will be rolled back if an exception occurs
+        Capsule::transaction(function () use ($data, $user, $currentUser) {
+            // Update the user and generate success messages
+            foreach ($data as $name => $value) {
+                if ($value != $user->$name) {
+                    $user->$name = $value;
+                }
+            }
+
+            $user->save();
+
+            // Create activity record
+            $this->ci->userActivityLogger->info("User {$currentUser->user_name} updated basic account info for user {$user->user_name}.", [
+                'type' => 'account_update_info',
+                'user_id' => $currentUser->id
+            ]);
+        });
+
+        $ms->addMessageTranslated('success', 'DETAILS_UPDATED', [
+            'user_name' => $user->user_name
+        ]);
+        return $response->withStatus(200);
+    }
+
+    /**
+     * Processes the request to update a specific field for an existing user.
+     *
+     * Supports editing all user fields, including password, enabled/disabled status and verification status.
+     * Processes the request from the user update form, checking that:
+     * 1. The logged-in user has the necessary permissions to update the putted field(s);
+     * 2. We're not trying to disable the master account;
+     * 3. The submitted data is valid.
+     * This route requires authentication.
+     * Request type: PUT
+     * @throws ForbiddenException
+     * @throws BadRequestException
+     * @throws BadRequestException
+     * @throws BadRequestException
+     * @throws BadRequestException
+     * @throws BadRequestException
+     * @throws NotFoundException
+     * @throws BadRequestException
+     */
+    public function updateField($request, $response, $args) {
+        // Get the username from the URL
+        $user = $this->getUserFromParams($args);
+
+        if (!$user) {
+            throw new NotFoundException($request, $response);
+        }
+
+        // Get key->value pair from URL and request body
+        $fieldName = $args['field'];
+
+        /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager $authorizer */
+        $authorizer = $this->ci->authorizer;
+
+        /** @var UserFrosting\Sprinkle\Account\Database\Models\User $currentUser */
+        $currentUser = $this->ci->currentUser;
+
+        // Access-controlled resource - check that currentUser has permission to edit the specified field for this user
+        if (!$authorizer->checkAccess($currentUser, 'update_user_field', [
+            'user' => $user,
+            'fields' => [$fieldName]
+        ])) {
+            throw new ForbiddenException();
+        }
+
+        /** @var UserFrosting\Config\Config $config */
+        $config = $this->ci->config;
+
+        // Only the master account can edit the master account!
+        if (
+            ($user->id == $config['reserved_user_ids.master']) &&
+            ($currentUser->id != $config['reserved_user_ids.master'])
+        ) {
+            throw new ForbiddenException();
+        }
+
+        // Get PUT parameters: value
+        $put = $request->getParsedBody();
+
+        if (!isset($put['value'])) {
+            throw new BadRequestException();
+        }
+
+        // Create and validate key -> value pair
+        $params = [
+            $fieldName => $put['value']
+        ];
+
+        // Load the request schema
+        $schema = new RequestSchema('schema://requests/user/edit-field.yaml');
+
+        // Whitelist and set parameter defaults
+        $transformer = new RequestDataTransformer($schema);
+        $data = $transformer->transform($params);
+
+        // Validate, and throw exception on validation errors.
+        $validator = new ServerSideValidator($schema, $this->ci->translator);
+        if (!$validator->validate($data)) {
+            // encapsulate the communication of error messages from ServerSideValidator to the BadRequestException
+            $e = new BadRequestException();
+            foreach ($validator->errors() as $idx => $field) {
+                foreach ($field as $eidx => $error) {
+                    $e->addUserMessage($error);
+                }
+            }
+            throw $e;
+        }
+
+        // Get validated and transformed value
+        $fieldValue = $data[$fieldName];
+
+        /** @var UserFrosting\Sprinkle\Core\MessageStream $ms */
+        $ms = $this->ci->alerts;
+
+        // Special checks and transformations for certain fields
+        if ($fieldName == 'flag_enabled') {
+            // Check that we are not disabling the master account
+            if (
+                ($user->id == $config['reserved_user_ids.master']) &&
+                ($fieldValue == '0')
+            ) {
+                $e = new BadRequestException();
+                $e->addUserMessage('DISABLE_MASTER');
+                throw $e;
+            } else if (
+                ($user->id == $currentUser->id) &&
+                ($fieldValue == '0')
+            ) {
+                $e = new BadRequestException();
+                $e->addUserMessage('DISABLE_SELF');
+                throw $e;
+            }
+        } else if ($fieldName == 'password') {
+            $fieldValue = Password::hash($fieldValue);
+        }
+
+        // Begin transaction - DB will be rolled back if an exception occurs
+        Capsule::transaction(function () use ($fieldName, $fieldValue, $user, $currentUser) {
+            if ($fieldName == 'roles') {
+                $newRoles = collect($fieldValue)->pluck('role_id')->all();
+                $user->roles()->sync($newRoles);
+            } else {
+                $user->$fieldName = $fieldValue;
+                $user->save();
+            }
+
+            // Create activity record
+            $this->ci->userActivityLogger->info("User {$currentUser->user_name} updated property '$fieldName' for user {$user->user_name}.", [
+                'type' => 'account_update_field',
+                'user_id' => $currentUser->id
+            ]);
+        });
+
+        // Add success messages
+        if ($fieldName == 'flag_enabled') {
+            if ($fieldValue == '1') {
+                $ms->addMessageTranslated('success', 'ENABLE_SUCCESSFUL', [
+                    'user_name' => $user->user_name
+                ]);
+            } else {
+                $ms->addMessageTranslated('success', 'DISABLE_SUCCESSFUL', [
+                    'user_name' => $user->user_name
+                ]);
+            }
+        } else if ($fieldName == 'flag_verified') {
+            $ms->addMessageTranslated('success', 'MANUALLY_ACTIVATED', [
+                'user_name' => $user->user_name
+            ]);
+        } else {
+            $ms->addMessageTranslated('success', 'DETAILS_UPDATED', [
+                'user_name' => $user->user_name
+            ]);
+        }
+
+        return $response->withStatus(200);
+    }
+
+    protected function getUserFromParams($params) {
+        // Load the request schema
+        $schema = new RequestSchema('schema://requests/user/get-by-username.yaml');
+
+        // Whitelist and set parameter defaults
+        $transformer = new RequestDataTransformer($schema);
+        $data = $transformer->transform($params);
+
+        // Validate, and throw exception on validation errors.
+        $validator = new ServerSideValidator($schema, $this->ci->translator);
+        if (!$validator->validate($data)) {
+            $e = new BadRequestException();
+            foreach ($validator->errors() as $idx => $field) {
+                foreach ($field as $eidx => $error) {
+                    $e->addUserMessage($error);
+                }
+            }
+            throw $e;
+        }
+
+        /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */
+        $classMapper = $this->ci->classMapper;
+
+        // Get the user to delete
+        $user = $classMapper->staticMethod('user', 'where', 'user_name', $data['user_name'])
+            ->first();
+
+        return $user;
+    }
+}
diff --git a/main/app/sprinkles/admin/src/Controller/WormholeController.php b/main/app/sprinkles/admin/src/Controller/WormholeController.php
index ec33f3e..e25f890 100644
--- a/main/app/sprinkles/admin/src/Controller/WormholeController.php
+++ b/main/app/sprinkles/admin/src/Controller/WormholeController.php
@@ -1,147 +1,147 @@
-verifyAccessToken($args)) {
-            $user_id = $args['user_id'];
-            $session_id = $args['session_id'];
-            $session_file = file_get_contents("../app/sessions/" . $session_id);
-            $session_user_id = unserialize(substr($session_file, strpos($session_file, "account|") + 8))["current_user_id"];
-            if ($session_user_id == $user_id) {
-                return $response->withStatus(200);
-            } else {
-                throw new NotFoundException();
-            }
-        }
-    }
-
-    /**
-     * @param $request
-     * @param Response $response
-     * @param $args
-     * @return Response
-     * @throws BadRequestException
-     * @throws NotFoundException
-     */
-    public function newMessage($request, Response $response, $args) {
-        if ($this->verifyAccessToken($args)) {
-            $sender_id = $args['sender_id'];
-            $receiver_id = $args['receiver_id'];
-            $message = $request->getParsedBody()["message"];
-            if (($sender_id != $receiver_id) && $message) {
-                $MessageId = DB::table('chat_messages')
-                    ->insertGetId(['sender_id' => $sender_id, 'receiver_id' => $receiver_id, 'message' => $message], 'message_id');
-                $response->write($MessageId);
-                return $response->withStatus(200);
-            } else {
-                throw new BadRequestException();
-            }
-        }
-    }
-
-    /**
-     * @param Request $request
-     * @param Response $response
-     * @param $args
-     * @return Response
-     * @throws NotFoundException
-     */
-    public function getInfo(Request $request, Response $response, $args) {
-        /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */
-        $classMapper = $this->ci->classMapper;
-
-        if ($this->verifyAccessToken($args)) {
-            $user = $classMapper->staticMethod('user', 'where', 'id', $args['user_id'])
-                ->first();
-            if (!$user) {
-                throw new NotFoundException($request, $response);
-            }
-
-            $UsersFollower = DB::table('user_follow')
-                ->where('user_id', $user->id)
-                ->join("users", "users.id", "=", "user_follow.followed_by_id")
-                ->select("user_follow.followed_by_id as id", "users.user_name as username")
-                ->get();
-
-            $UsersFollows = DB::table('user_follow')
-                ->where('followed_by_id', $user->id)
-                ->join("users", "users.id", "=", "user_follow.user_id")
-                ->select("user_follow.user_id as id", "users.user_name as username")
-                ->get();
-
-            $UsersFriends = DB::select("SELECT id FROM (SELECT user_id AS id FROM user_follow WHERE followed_by_id = $user->id UNION ALL SELECT followed_by_id FROM user_follow WHERE user_id = $user->id) t GROUP BY id HAVING COUNT(id) > 1");
-            /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */
-            $classMapper = $this->ci->classMapper;
-            foreach ($UsersFriends as $Key => $UsersFriendId) { // NOT THAT EFFICIENT...
-                $UsersFriendInformation = $classMapper->createInstance('user')// select doesnt work with instance
-                    ->where('id', $UsersFriendId->id)
-                    ->get();
-                $UsersFriends[$Key]->id = $UsersFriendInformation[0]->id;
-                $UsersFriends[$Key]->username = $UsersFriendInformation[0]->user_name;
-                $UsersFriends[$Key]->avatar = $UsersFriendInformation[0]->avatar;
-                $UsersFriends[$Key]->full_name = $UsersFriendInformation[0]->full_name;
-            }
-
-            $result = $user->toArray();
-            $result["avatar"] = $user->avatar;
-            $result["followers"] = $UsersFollower;
-            $result["follows"] = $UsersFollows;
-            $result["friends"] = $UsersFriends;
-            return $response->withJson($result, 200, JSON_PRETTY_PRINT);
-        }
-    }
-
-    /**
-     * @param $args
-     * @return bool
-     * @throws NotFoundException
-     */
-    private function verifyAccessToken($args) {
-        $currentUser = $this->ci->currentUser; // FOR DATABASE QUERY
-        $access_token = $args['access_token'];
-        if (DB::table('access_token')
-            ->where('id', 1)
-            ->where('token', '=', $access_token)
-            ->exists()) {
-            return TRUE;
-        } else {
-            throw new NotFoundException(); // IT'S A FORBIDDEN
-        }
-    }
+verifyAccessToken($args)) {
+            $user_id = $args['user_id'];
+            $session_id = $args['session_id'];
+            $session_file = file_get_contents("../app/sessions/" . $session_id);
+            $session_user_id = unserialize(substr($session_file, strpos($session_file, "account|") + 8))["current_user_id"];
+            if ($session_user_id == $user_id) {
+                return $response->withStatus(200);
+            } else {
+                throw new NotFoundException();
+            }
+        }
+    }
+
+    /**
+     * @param $request
+     * @param Response $response
+     * @param $args
+     * @return Response
+     * @throws BadRequestException
+     * @throws NotFoundException
+     */
+    public function newMessage($request, Response $response, $args) {
+        if ($this->verifyAccessToken($args)) {
+            $sender_id = $args['sender_id'];
+            $receiver_id = $args['receiver_id'];
+            $message = $request->getParsedBody()["message"];
+            if (($sender_id != $receiver_id) && $message) {
+                $MessageId = DB::table('chat_messages')
+                    ->insertGetId(['sender_id' => $sender_id, 'receiver_id' => $receiver_id, 'message' => $message], 'message_id');
+                $response->write($MessageId);
+                return $response->withStatus(200);
+            } else {
+                throw new BadRequestException();
+            }
+        }
+    }
+
+    /**
+     * @param Request $request
+     * @param Response $response
+     * @param $args
+     * @return Response
+     * @throws NotFoundException
+     */
+    public function getInfo(Request $request, Response $response, $args) {
+        /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */
+        $classMapper = $this->ci->classMapper;
+
+        if ($this->verifyAccessToken($args)) {
+            $user = $classMapper->staticMethod('user', 'where', 'id', $args['user_id'])
+                ->first();
+            if (!$user) {
+                throw new NotFoundException($request, $response);
+            }
+
+            $UsersFollower = DB::table('user_follow')
+                ->where('user_id', $user->id)
+                ->join("users", "users.id", "=", "user_follow.followed_by_id")
+                ->select("user_follow.followed_by_id as id", "users.user_name as username")
+                ->get();
+
+            $UsersFollows = DB::table('user_follow')
+                ->where('followed_by_id', $user->id)
+                ->join("users", "users.id", "=", "user_follow.user_id")
+                ->select("user_follow.user_id as id", "users.user_name as username")
+                ->get();
+
+            $UsersFriends = DB::select("SELECT id FROM (SELECT user_id AS id FROM user_follow WHERE followed_by_id = $user->id UNION ALL SELECT followed_by_id FROM user_follow WHERE user_id = $user->id) t GROUP BY id HAVING COUNT(id) > 1");
+            /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */
+            $classMapper = $this->ci->classMapper;
+            foreach ($UsersFriends as $Key => $UsersFriendId) { // NOT THAT EFFICIENT...
+                $UsersFriendInformation = $classMapper->createInstance('user')// select doesnt work with instance
+                    ->where('id', $UsersFriendId->id)
+                    ->get();
+                $UsersFriends[$Key]->id = $UsersFriendInformation[0]->id;
+                $UsersFriends[$Key]->username = $UsersFriendInformation[0]->user_name;
+                $UsersFriends[$Key]->avatar = $UsersFriendInformation[0]->avatar;
+                $UsersFriends[$Key]->full_name = $UsersFriendInformation[0]->full_name;
+            }
+
+            $result = $user->toArray();
+            $result["avatar"] = $user->avatar;
+            $result["followers"] = $UsersFollower;
+            $result["follows"] = $UsersFollows;
+            $result["friends"] = $UsersFriends;
+            return $response->withJson($result, 200, JSON_PRETTY_PRINT);
+        }
+    }
+
+    /**
+     * @param $args
+     * @return bool
+     * @throws NotFoundException
+     */
+    private function verifyAccessToken($args) {
+        $currentUser = $this->ci->currentUser; // FOR DATABASE QUERY
+        $access_token = $args['access_token'];
+        if (DB::table('access_token')
+            ->where('id', 1)
+            ->where('token', '=', $access_token)
+            ->exists()) {
+            return TRUE;
+        } else {
+            throw new NotFoundException(); // IT'S A FORBIDDEN
+        }
+    }
 }
\ No newline at end of file
diff --git a/main/app/sprinkles/admin/src/ServicesProvider/ServicesProvider.php b/main/app/sprinkles/admin/src/ServicesProvider/ServicesProvider.php
index cb4530e..395f1f6 100644
--- a/main/app/sprinkles/admin/src/ServicesProvider/ServicesProvider.php
+++ b/main/app/sprinkles/admin/src/ServicesProvider/ServicesProvider.php
@@ -1,84 +1,84 @@
-extend('classMapper', function ($classMapper, $c) {
-            $classMapper->setClassMapping('activity_sprunje', 'UserFrosting\Sprinkle\Admin\Sprunje\ActivitySprunje');
-            $classMapper->setClassMapping('group_sprunje', 'UserFrosting\Sprinkle\Admin\Sprunje\GroupSprunje');
-            $classMapper->setClassMapping('permission_sprunje', 'UserFrosting\Sprinkle\Admin\Sprunje\PermissionSprunje');
-            $classMapper->setClassMapping('permission_user_sprunje', 'UserFrosting\Sprinkle\Admin\Sprunje\PermissionUserSprunje');
-            $classMapper->setClassMapping('role_sprunje', 'UserFrosting\Sprinkle\Admin\Sprunje\RoleSprunje');
-            $classMapper->setClassMapping('user_sprunje', 'UserFrosting\Sprinkle\Admin\Sprunje\UserSprunje');
-            $classMapper->setClassMapping('user_permission_sprunje', 'UserFrosting\Sprinkle\Admin\Sprunje\UserPermissionSprunje');
-            return $classMapper;
-        });
-
-        /**
-         * Returns a callback that handles setting the `UF-Redirect` header after a successful login.
-         *
-         * Overrides the service definition in the account Sprinkle.
-         */
-        $container['redirect.onLogin'] = function ($c) {
-            /**
-             * This method is invoked when a user completes the login process.
-             *
-             * Returns a callback that handles setting the `UF-Redirect` header after a successful login.
-             * @param \Psr\Http\Message\ServerRequestInterface $request
-             * @param \Psr\Http\Message\ResponseInterface $response
-             * @param array $args
-             * @return \Psr\Http\Message\ResponseInterface
-             */
-            return function (Request $request, Response $response, array $args) use ($c) {
-                // Backwards compatibility for the deprecated determineRedirectOnLogin service
-                if ($c->has('determineRedirectOnLogin')) {
-                    $determineRedirectOnLogin = $c->determineRedirectOnLogin;
-
-                    return $determineRedirectOnLogin($response)->withStatus(200);
-                }
-
-                /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager */
-                $authorizer = $c->authorizer;
-
-                $currentUser = $c->authenticator->user();
-
-                if ($authorizer->checkAccess($currentUser, 'uri_dashboard')) {
-                    return $response->withHeader('UF-Redirect', $c->router->pathFor('dashboard'));
-                } else if ($authorizer->checkAccess($currentUser, 'uri_account_settings')) {
-                    return $response->withHeader('UF-Redirect', $c->router->pathFor('settings'));
-                } else {
-                    return $response->withHeader('UF-Redirect', $c->router->pathFor('index'));
-                }
-            };
-        };
-    }
-}
+extend('classMapper', function ($classMapper, $c) {
+            $classMapper->setClassMapping('activity_sprunje', 'UserFrosting\Sprinkle\Admin\Sprunje\ActivitySprunje');
+            $classMapper->setClassMapping('group_sprunje', 'UserFrosting\Sprinkle\Admin\Sprunje\GroupSprunje');
+            $classMapper->setClassMapping('permission_sprunje', 'UserFrosting\Sprinkle\Admin\Sprunje\PermissionSprunje');
+            $classMapper->setClassMapping('permission_user_sprunje', 'UserFrosting\Sprinkle\Admin\Sprunje\PermissionUserSprunje');
+            $classMapper->setClassMapping('role_sprunje', 'UserFrosting\Sprinkle\Admin\Sprunje\RoleSprunje');
+            $classMapper->setClassMapping('user_sprunje', 'UserFrosting\Sprinkle\Admin\Sprunje\UserSprunje');
+            $classMapper->setClassMapping('user_permission_sprunje', 'UserFrosting\Sprinkle\Admin\Sprunje\UserPermissionSprunje');
+            return $classMapper;
+        });
+
+        /**
+         * Returns a callback that handles setting the `UF-Redirect` header after a successful login.
+         *
+         * Overrides the service definition in the account Sprinkle.
+         */
+        $container['redirect.onLogin'] = function ($c) {
+            /**
+             * This method is invoked when a user completes the login process.
+             *
+             * Returns a callback that handles setting the `UF-Redirect` header after a successful login.
+             * @param \Psr\Http\Message\ServerRequestInterface $request
+             * @param \Psr\Http\Message\ResponseInterface $response
+             * @param array $args
+             * @return \Psr\Http\Message\ResponseInterface
+             */
+            return function (Request $request, Response $response, array $args) use ($c) {
+                // Backwards compatibility for the deprecated determineRedirectOnLogin service
+                if ($c->has('determineRedirectOnLogin')) {
+                    $determineRedirectOnLogin = $c->determineRedirectOnLogin;
+
+                    return $determineRedirectOnLogin($response)->withStatus(200);
+                }
+
+                /** @var UserFrosting\Sprinkle\Account\Authorize\AuthorizationManager */
+                $authorizer = $c->authorizer;
+
+                $currentUser = $c->authenticator->user();
+
+                if ($authorizer->checkAccess($currentUser, 'uri_dashboard')) {
+                    return $response->withHeader('UF-Redirect', $c->router->pathFor('dashboard'));
+                } else if ($authorizer->checkAccess($currentUser, 'uri_account_settings')) {
+                    return $response->withHeader('UF-Redirect', $c->router->pathFor('settings'));
+                } else {
+                    return $response->withHeader('UF-Redirect', $c->router->pathFor('index'));
+                }
+            };
+        };
+    }
+}
diff --git a/main/app/sprinkles/admin/src/Sprunje/ActivitySprunje.php b/main/app/sprinkles/admin/src/Sprunje/ActivitySprunje.php
index 3af04f0..70a3562 100644
--- a/main/app/sprinkles/admin/src/Sprunje/ActivitySprunje.php
+++ b/main/app/sprinkles/admin/src/Sprunje/ActivitySprunje.php
@@ -1,78 +1,78 @@
-classMapper->createInstance('activity');
-
-        return $query->joinUser();
-    }
-
-    /**
-     * Filter LIKE the user info.
-     *
-     * @param Builder $query
-     * @param mixed $value
-     * @return $this
-     */
-    protected function filterUser($query, $value) {
-        // Split value on separator for OR queries
-        $values = explode($this->orSeparator, $value);
-        $query->where(function ($query) use ($values) {
-            foreach ($values as $value) {
-                $query->orLike('users.first_name', $value)
-                    ->orLike('users.last_name', $value)
-                    ->orLike('users.email', $value);
-            }
-        });
-        return $this;
-    }
-
-    /**
-     * Sort based on user last name.
-     *
-     * @param Builder $query
-     * @param string $direction
-     * @return $this
-     */
-    protected function sortUser($query, $direction) {
-        $query->orderBy('users.last_name', $direction);
-        return $this;
-    }
-}
+classMapper->createInstance('activity');
+
+        return $query->joinUser();
+    }
+
+    /**
+     * Filter LIKE the user info.
+     *
+     * @param Builder $query
+     * @param mixed $value
+     * @return $this
+     */
+    protected function filterUser($query, $value) {
+        // Split value on separator for OR queries
+        $values = explode($this->orSeparator, $value);
+        $query->where(function ($query) use ($values) {
+            foreach ($values as $value) {
+                $query->orLike('users.first_name', $value)
+                    ->orLike('users.last_name', $value)
+                    ->orLike('users.email', $value);
+            }
+        });
+        return $this;
+    }
+
+    /**
+     * Sort based on user last name.
+     *
+     * @param Builder $query
+     * @param string $direction
+     * @return $this
+     */
+    protected function sortUser($query, $direction) {
+        $query->orderBy('users.last_name', $direction);
+        return $this;
+    }
+}
diff --git a/main/app/sprinkles/admin/src/Sprunje/GroupSprunje.php b/main/app/sprinkles/admin/src/Sprunje/GroupSprunje.php
index 849673b..514c6bb 100644
--- a/main/app/sprinkles/admin/src/Sprunje/GroupSprunje.php
+++ b/main/app/sprinkles/admin/src/Sprunje/GroupSprunje.php
@@ -1,42 +1,42 @@
-classMapper->createInstance('group')->newQuery();
-    }
-}
+classMapper->createInstance('group')->newQuery();
+    }
+}
diff --git a/main/app/sprinkles/admin/src/Sprunje/PermissionSprunje.php b/main/app/sprinkles/admin/src/Sprunje/PermissionSprunje.php
index 0a38ee9..1df288e 100644
--- a/main/app/sprinkles/admin/src/Sprunje/PermissionSprunje.php
+++ b/main/app/sprinkles/admin/src/Sprunje/PermissionSprunje.php
@@ -1,90 +1,90 @@
-classMapper->createInstance('permission')->newQuery();
-    }
-
-    /**
-     * Filter LIKE the slug, conditions, or description.
-     *
-     * @param Builder $query
-     * @param mixed $value
-     * @return $this
-     */
-    protected function filterInfo($query, $value) {
-        return $this->filterProperties($query, $value);
-    }
-
-    /**
-     * Filter LIKE the slug, conditions, or description.
-     *
-     * @param Builder $query
-     * @param mixed $value
-     * @return $this
-     */
-    protected function filterProperties($query, $value) {
-        // Split value on separator for OR queries
-        $values = explode($this->orSeparator, $value);
-        $query->where(function ($query) use ($values) {
-            foreach ($values as $value) {
-                $query->orLike('slug', $value)
-                    ->orLike('conditions', $value)
-                    ->orLike('description', $value);
-            }
-        });
-        return $this;
-    }
-
-    /**
-     * Sort based on slug.
-     *
-     * @param Builder $query
-     * @param string $direction
-     * @return $this
-     */
-    protected function sortProperties($query, $direction) {
-        $query->orderBy('slug', $direction);
-        return $this;
-    }
-}
+classMapper->createInstance('permission')->newQuery();
+    }
+
+    /**
+     * Filter LIKE the slug, conditions, or description.
+     *
+     * @param Builder $query
+     * @param mixed $value
+     * @return $this
+     */
+    protected function filterInfo($query, $value) {
+        return $this->filterProperties($query, $value);
+    }
+
+    /**
+     * Filter LIKE the slug, conditions, or description.
+     *
+     * @param Builder $query
+     * @param mixed $value
+     * @return $this
+     */
+    protected function filterProperties($query, $value) {
+        // Split value on separator for OR queries
+        $values = explode($this->orSeparator, $value);
+        $query->where(function ($query) use ($values) {
+            foreach ($values as $value) {
+                $query->orLike('slug', $value)
+                    ->orLike('conditions', $value)
+                    ->orLike('description', $value);
+            }
+        });
+        return $this;
+    }
+
+    /**
+     * Sort based on slug.
+     *
+     * @param Builder $query
+     * @param string $direction
+     * @return $this
+     */
+    protected function sortProperties($query, $direction) {
+        $query->orderBy('slug', $direction);
+        return $this;
+    }
+}
diff --git a/main/app/sprinkles/admin/src/Sprunje/PermissionUserSprunje.php b/main/app/sprinkles/admin/src/Sprunje/PermissionUserSprunje.php
index 3c7b4ea..eba23c3 100644
--- a/main/app/sprinkles/admin/src/Sprunje/PermissionUserSprunje.php
+++ b/main/app/sprinkles/admin/src/Sprunje/PermissionUserSprunje.php
@@ -1,48 +1,48 @@
-options['permission_id'])) {
-            throw new BadRequestException();
-        }
-
-        $permission = $this->classMapper->staticMethod('permission', 'find', $this->options['permission_id']);
-
-        // If the permission doesn't exist, return 404
-        if (!$permission) {
-            throw new NotFoundException;
-        }
-
-        // Get permission users
-        $query = $permission->users()->withVia('roles_via');
-
-        return $query;
-    }
-}
+options['permission_id'])) {
+            throw new BadRequestException();
+        }
+
+        $permission = $this->classMapper->staticMethod('permission', 'find', $this->options['permission_id']);
+
+        // If the permission doesn't exist, return 404
+        if (!$permission) {
+            throw new NotFoundException;
+        }
+
+        // Get permission users
+        $query = $permission->users()->withVia('roles_via');
+
+        return $query;
+    }
+}
diff --git a/main/app/sprinkles/admin/src/Sprunje/RoleSprunje.php b/main/app/sprinkles/admin/src/Sprunje/RoleSprunje.php
index 624a1ba..59c5240 100644
--- a/main/app/sprinkles/admin/src/Sprunje/RoleSprunje.php
+++ b/main/app/sprinkles/admin/src/Sprunje/RoleSprunje.php
@@ -1,66 +1,66 @@
-classMapper->createInstance('role')->newQuery();
-    }
-
-    /**
-     * Filter LIKE name OR description.
-     *
-     * @param Builder $query
-     * @param mixed $value
-     * @return $this
-     */
-    protected function filterInfo($query, $value) {
-        // Split value on separator for OR queries
-        $values = explode($this->orSeparator, $value);
-        $query->where(function ($query) use ($values) {
-            foreach ($values as $value) {
-                $query->orLike('name', $value)
-                    ->orLike('description', $value);
-            }
-        });
-        return $this;
-    }
-}
+classMapper->createInstance('role')->newQuery();
+    }
+
+    /**
+     * Filter LIKE name OR description.
+     *
+     * @param Builder $query
+     * @param mixed $value
+     * @return $this
+     */
+    protected function filterInfo($query, $value) {
+        // Split value on separator for OR queries
+        $values = explode($this->orSeparator, $value);
+        $query->where(function ($query) use ($values) {
+            foreach ($values as $value) {
+                $query->orLike('name', $value)
+                    ->orLike('description', $value);
+            }
+        });
+        return $this;
+    }
+}
diff --git a/main/app/sprinkles/admin/src/Sprunje/UserPermissionSprunje.php b/main/app/sprinkles/admin/src/Sprunje/UserPermissionSprunje.php
index f3c1734..3f4b58f 100644
--- a/main/app/sprinkles/admin/src/Sprunje/UserPermissionSprunje.php
+++ b/main/app/sprinkles/admin/src/Sprunje/UserPermissionSprunje.php
@@ -1,48 +1,48 @@
-options['user_id'])) {
-            throw new BadRequestException();
-        }
-
-        $user = $this->classMapper->staticMethod('user', 'find', $this->options['user_id']);
-
-        // If the user doesn't exist, return 404
-        if (!$user) {
-            throw new NotFoundException;
-        }
-
-        // Get user permissions
-        $query = $user->permissions()->withVia('roles_via');
-
-        return $query;
-    }
-}
+options['user_id'])) {
+            throw new BadRequestException();
+        }
+
+        $user = $this->classMapper->staticMethod('user', 'find', $this->options['user_id']);
+
+        // If the user doesn't exist, return 404
+        if (!$user) {
+            throw new NotFoundException;
+        }
+
+        // Get user permissions
+        $query = $user->permissions()->withVia('roles_via');
+
+        return $query;
+    }
+}
diff --git a/main/app/sprinkles/admin/src/Sprunje/UserSprunje.php b/main/app/sprinkles/admin/src/Sprunje/UserSprunje.php
index 0837912..a90eca3 100644
--- a/main/app/sprinkles/admin/src/Sprunje/UserSprunje.php
+++ b/main/app/sprinkles/admin/src/Sprunje/UserSprunje.php
@@ -1,178 +1,178 @@
-classMapper->createInstance('user');
-
-        // Join user's most recent activity
-        return $query->joinLastActivity()->with('lastActivity');
-    }
-
-    /**
-     * Filter LIKE the last activity description.
-     *
-     * @param Builder $query
-     * @param mixed $value
-     * @return $this
-     */
-    protected function filterLastActivity($query, $value) {
-        // Split value on separator for OR queries
-        $values = explode($this->orSeparator, $value);
-        $query->where(function ($query) use ($values) {
-            foreach ($values as $value) {
-                $query->orLike('activities.description', $value);
-            }
-        });
-        return $this;
-    }
-
-    /**
-     * Filter LIKE the first name, last name, or email.
-     *
-     * @param Builder $query
-     * @param mixed $value
-     * @return $this
-     */
-    protected function filterName($query, $value) {
-        // Split value on separator for OR queries
-        $values = explode($this->orSeparator, $value);
-        $query->where(function ($query) use ($values) {
-            foreach ($values as $value) {
-                $query->orLike('first_name', $value)
-                    ->orLike('last_name', $value)
-                    ->orLike('email', $value);
-            }
-        });
-        return $this;
-    }
-
-    /**
-     * Filter by status (active, disabled, unactivated)
-     *
-     * @param Builder $query
-     * @param mixed $value
-     * @return $this
-     */
-    protected function filterStatus($query, $value) {
-        // Split value on separator for OR queries
-        $values = explode($this->orSeparator, $value);
-        $query->where(function ($query) use ($values) {
-            foreach ($values as $value) {
-                if ($value == 'disabled') {
-                    $query->orWhere('flag_enabled', 0);
-                } else if ($value == 'unactivated') {
-                    $query->orWhere('flag_verified', 0);
-                } else if ($value == 'active') {
-                    $query->orWhere(function ($query) {
-                        $query->where('flag_enabled', 1)->where('flag_verified', 1);
-                    });
-                }
-            }
-        });
-        return $this;
-    }
-
-    /**
-     * Return a list of possible user statuses.
-     *
-     * @return array
-     */
-    protected function listStatus() {
-        return [
-            [
-                'value' => 'active',
-                'text' => Translator::translate('ACTIVE')
-            ],
-            [
-                'value' => 'unactivated',
-                'text' => Translator::translate('UNACTIVATED')
-            ],
-            [
-                'value' => 'disabled',
-                'text' => Translator::translate('DISABLED')
-            ]
-        ];
-    }
-
-    /**
-     * Sort based on last activity time.
-     *
-     * @param Builder $query
-     * @param string $direction
-     * @return $this
-     */
-    protected function sortLastActivity($query, $direction) {
-        $query->orderBy('activities.occurred_at', $direction);
-        return $this;
-    }
-
-    /**
-     * Sort based on last name.
-     *
-     * @param Builder $query
-     * @param string $direction
-     * @return $this
-     */
-    protected function sortName($query, $direction) {
-        $query->orderBy('last_name', $direction);
-        return $this;
-    }
-
-    /**
-     * Sort active, unactivated, disabled
-     *
-     * @param Builder $query
-     * @param string $direction
-     * @return $this
-     */
-    protected function sortStatus($query, $direction) {
-        $query->orderBy('flag_enabled', $direction)->orderBy('flag_verified', $direction);
-        return $this;
-    }
-}
+classMapper->createInstance('user');
+
+        // Join user's most recent activity
+        return $query->joinLastActivity()->with('lastActivity');
+    }
+
+    /**
+     * Filter LIKE the last activity description.
+     *
+     * @param Builder $query
+     * @param mixed $value
+     * @return $this
+     */
+    protected function filterLastActivity($query, $value) {
+        // Split value on separator for OR queries
+        $values = explode($this->orSeparator, $value);
+        $query->where(function ($query) use ($values) {
+            foreach ($values as $value) {
+                $query->orLike('activities.description', $value);
+            }
+        });
+        return $this;
+    }
+
+    /**
+     * Filter LIKE the first name, last name, or email.
+     *
+     * @param Builder $query
+     * @param mixed $value
+     * @return $this
+     */
+    protected function filterName($query, $value) {
+        // Split value on separator for OR queries
+        $values = explode($this->orSeparator, $value);
+        $query->where(function ($query) use ($values) {
+            foreach ($values as $value) {
+                $query->orLike('first_name', $value)
+                    ->orLike('last_name', $value)
+                    ->orLike('email', $value);
+            }
+        });
+        return $this;
+    }
+
+    /**
+     * Filter by status (active, disabled, unactivated)
+     *
+     * @param Builder $query
+     * @param mixed $value
+     * @return $this
+     */
+    protected function filterStatus($query, $value) {
+        // Split value on separator for OR queries
+        $values = explode($this->orSeparator, $value);
+        $query->where(function ($query) use ($values) {
+            foreach ($values as $value) {
+                if ($value == 'disabled') {
+                    $query->orWhere('flag_enabled', 0);
+                } else if ($value == 'unactivated') {
+                    $query->orWhere('flag_verified', 0);
+                } else if ($value == 'active') {
+                    $query->orWhere(function ($query) {
+                        $query->where('flag_enabled', 1)->where('flag_verified', 1);
+                    });
+                }
+            }
+        });
+        return $this;
+    }
+
+    /**
+     * Return a list of possible user statuses.
+     *
+     * @return array
+     */
+    protected function listStatus() {
+        return [
+            [
+                'value' => 'active',
+                'text' => Translator::translate('ACTIVE')
+            ],
+            [
+                'value' => 'unactivated',
+                'text' => Translator::translate('UNACTIVATED')
+            ],
+            [
+                'value' => 'disabled',
+                'text' => Translator::translate('DISABLED')
+            ]
+        ];
+    }
+
+    /**
+     * Sort based on last activity time.
+     *
+     * @param Builder $query
+     * @param string $direction
+     * @return $this
+     */
+    protected function sortLastActivity($query, $direction) {
+        $query->orderBy('activities.occurred_at', $direction);
+        return $this;
+    }
+
+    /**
+     * Sort based on last name.
+     *
+     * @param Builder $query
+     * @param string $direction
+     * @return $this
+     */
+    protected function sortName($query, $direction) {
+        $query->orderBy('last_name', $direction);
+        return $this;
+    }
+
+    /**
+     * Sort active, unactivated, disabled
+     *
+     * @param Builder $query
+     * @param string $direction
+     * @return $this
+     */
+    protected function sortStatus($query, $direction) {
+        $query->orderBy('flag_enabled', $direction)->orderBy('flag_verified', $direction);
+        return $this;
+    }
+}
diff --git a/main/app/sprinkles/admin/templates/forms/group.html.twig b/main/app/sprinkles/admin/templates/forms/group.html.twig
index fade5ab..18d0bb5 100644
--- a/main/app/sprinkles/admin/templates/forms/group.html.twig
+++ b/main/app/sprinkles/admin/templates/forms/group.html.twig
@@ -1,80 +1,80 @@
-
- {% include "forms/csrf.html.twig" %} -
-
-
- {% block group_form %} - {% if 'name' not in form.fields.hidden %} -
-
- -
- - -
-
-
- {% endif %} - {% if 'slug' not in form.fields.hidden %} -
-
- -
- - - {% if 'slug' not in form.fields.disabled %} - - - - {% endif %} -
-
-
- {% endif %} - {% if 'icon' not in fields.hidden %} -
-
- -
- - -
-
-
- {% endif %} - {% if 'description' not in fields.hidden %} -
-
- - -
-
- {% endif %} - {% endblock %} -
-
-
-
- -
-
- -
-
-
- - +
+ {% include "forms/csrf.html.twig" %} +
+
+
+ {% block group_form %} + {% if 'name' not in form.fields.hidden %} +
+
+ +
+ + +
+
+
+ {% endif %} + {% if 'slug' not in form.fields.hidden %} +
+
+ +
+ + + {% if 'slug' not in form.fields.disabled %} + + + + {% endif %} +
+
+
+ {% endif %} + {% if 'icon' not in fields.hidden %} +
+
+ +
+ + +
+
+
+ {% endif %} + {% if 'description' not in fields.hidden %} +
+
+ + +
+
+ {% endif %} + {% endblock %} +
+
+
+
+ +
+
+ +
+
+
+ + diff --git a/main/app/sprinkles/admin/templates/forms/role.html.twig b/main/app/sprinkles/admin/templates/forms/role.html.twig index 7759783..f68dcd8 100644 --- a/main/app/sprinkles/admin/templates/forms/role.html.twig +++ b/main/app/sprinkles/admin/templates/forms/role.html.twig @@ -1,65 +1,65 @@ -
- {% include "forms/csrf.html.twig" %} -
-
-
- {% if 'name' not in form.fields.hidden %} -
-
- -
- - -
-
-
- {% endif %} - {% if 'slug' not in form.fields.hidden %} -
-
- -
- - - {% if 'slug' not in form.fields.disabled %} - - - - {% endif %} -
-
-
- {% endif %} - {% if 'description' not in fields.hidden %} -
-
- - -
-
- {% endif %} -
-
-
-
- -
-
- -
-
-
- - +
+ {% include "forms/csrf.html.twig" %} +
+
+
+ {% if 'name' not in form.fields.hidden %} +
+
+ +
+ + +
+
+
+ {% endif %} + {% if 'slug' not in form.fields.hidden %} +
+
+ +
+ + + {% if 'slug' not in form.fields.disabled %} + + + + {% endif %} +
+
+
+ {% endif %} + {% if 'description' not in fields.hidden %} +
+
+ + +
+
+ {% endif %} +
+
+
+
+ +
+
+ +
+
+
+ + diff --git a/main/app/sprinkles/admin/templates/forms/user.html.twig b/main/app/sprinkles/admin/templates/forms/user.html.twig index e42cc6d..32228f0 100644 --- a/main/app/sprinkles/admin/templates/forms/user.html.twig +++ b/main/app/sprinkles/admin/templates/forms/user.html.twig @@ -1,142 +1,142 @@ -
- {% include "forms/csrf.html.twig" %} -
-
-
- {% block user_form %} - {% if 'user_name' not in form.fields.hidden %} -
-
- -
- - -
-
-
- {% endif %} - {% if 'group' not in form.fields.hidden %} -
-
- -
- - {% if 'group' in form.fields.disabled %} - - {% else %} - - {% endif %} -
-
-
- {% endif %} - {% if 'name' not in form.fields.hidden %} -
-
- -
- - -
-
-
-
-
- -
- - -
-
-
- {% endif %} - {% if 'email' not in form.fields.hidden %} -
-
- -
- - - {% if 'email' in form.fields.disabled %} - - - - {% endif %} -
-
-
- {% endif %} - {% if 'theme' not in form.fields.hidden %} -
-
- -
- - {% if 'theme' in form.fields.disabled %} - - {% else %} - - {% endif %} -
-
-
- {% endif %} - {% if 'locale' not in form.fields.hidden %} -
-
- -
- - {% if 'locale' in form.fields.disabled %} - - {% else %} - - {% endif %} -
-
-
- {% endif %} - {% endblock %} -
-
-
-
- -
-
- -
-
-
- - +
+ {% include "forms/csrf.html.twig" %} +
+
+
+ {% block user_form %} + {% if 'user_name' not in form.fields.hidden %} +
+
+ +
+ + +
+
+
+ {% endif %} + {% if 'group' not in form.fields.hidden %} +
+
+ +
+ + {% if 'group' in form.fields.disabled %} + + {% else %} + + {% endif %} +
+
+
+ {% endif %} + {% if 'name' not in form.fields.hidden %} +
+
+ +
+ + +
+
+
+
+
+ +
+ + +
+
+
+ {% endif %} + {% if 'email' not in form.fields.hidden %} +
+
+ +
+ + + {% if 'email' in form.fields.disabled %} + + + + {% endif %} +
+
+
+ {% endif %} + {% if 'theme' not in form.fields.hidden %} +
+
+ +
+ + {% if 'theme' in form.fields.disabled %} + + {% else %} + + {% endif %} +
+
+
+ {% endif %} + {% if 'locale' not in form.fields.hidden %} +
+
+ +
+ + {% if 'locale' in form.fields.disabled %} + + {% else %} + + {% endif %} +
+
+
+ {% endif %} + {% endblock %} +
+
+
+
+ +
+
+ +
+
+
+ + diff --git a/main/app/sprinkles/admin/templates/mail/password-create.html.twig b/main/app/sprinkles/admin/templates/mail/password-create.html.twig index f3a36d8..3a25c4f 100644 --- a/main/app/sprinkles/admin/templates/mail/password-create.html.twig +++ b/main/app/sprinkles/admin/templates/mail/password-create.html.twig @@ -1,23 +1,23 @@ -{% block subject %} - {{ site.title }} - please set a password for your new account -{% endblock %} - -{% block body %} -

- Dear {{ user.first_name }}, -

-

- Someone has created an account for you with {{ site.title }} ({{ site.uri.public }}). Your username is - {{ user.user_name }}. -

-

- To access your account, you must first create a password by visiting: {{ site.uri.public }} - /account/set-password/confirm?token={{ token }}. This link has been generated especially for you, and - will expire in {{ create_password_expiration }}. Do not share it with anyone! -

-

- With regards,
- The {{ site.title }} Team -

+{% block subject %} + {{ site.title }} - please set a password for your new account +{% endblock %} + +{% block body %} +

+ Dear {{ user.first_name }}, +

+

+ Someone has created an account for you with {{ site.title }} ({{ site.uri.public }}). Your username is + {{ user.user_name }}. +

+

+ To access your account, you must first create a password by visiting: {{ site.uri.public }} + /account/set-password/confirm?token={{ token }}. This link has been generated especially for you, and + will expire in {{ create_password_expiration }}. Do not share it with anyone! +

+

+ With regards,
+ The {{ site.title }} Team +

{% endblock %} \ No newline at end of file diff --git a/main/app/sprinkles/admin/templates/modals/confirm-clear-cache.html.twig b/main/app/sprinkles/admin/templates/modals/confirm-clear-cache.html.twig index bf3ccca..4da4508 100644 --- a/main/app/sprinkles/admin/templates/modals/confirm-clear-cache.html.twig +++ b/main/app/sprinkles/admin/templates/modals/confirm-clear-cache.html.twig @@ -1,21 +1,21 @@ -{% extends "modals/modal.html.twig" %} - -{% block modal_title %}{{ translate("CACHE.CLEAR") }}{% endblock %} - -{% block modal_body %} -
- {% include "forms/csrf.html.twig" %} -
-
-

{{ translate("CACHE.CLEAR_CONFIRM") }}
- {{ translate("DELETE_CANNOT_UNDONE") }} -

-
-
- - -
-
-{% endblock %} +{% extends "modals/modal.html.twig" %} + +{% block modal_title %}{{ translate("CACHE.CLEAR") }}{% endblock %} + +{% block modal_body %} +
+ {% include "forms/csrf.html.twig" %} +
+
+

{{ translate("CACHE.CLEAR_CONFIRM") }}
+ {{ translate("DELETE_CANNOT_UNDONE") }} +

+
+
+ + +
+
+{% endblock %} diff --git a/main/app/sprinkles/admin/templates/modals/confirm-delete-group.html.twig b/main/app/sprinkles/admin/templates/modals/confirm-delete-group.html.twig index e53bf6e..6be951c 100644 --- a/main/app/sprinkles/admin/templates/modals/confirm-delete-group.html.twig +++ b/main/app/sprinkles/admin/templates/modals/confirm-delete-group.html.twig @@ -1,20 +1,20 @@ -{% extends "modals/modal.html.twig" %} - -{% block modal_title %}{{ translate("GROUP.DELETE") }}{% endblock %} - -{% block modal_body %} -
- {% include "forms/csrf.html.twig" %} -
-
-

{{ translate("GROUP.DELETE_CONFIRM", {name: group.name}) }}
- {{ translate("DELETE_CANNOT_UNDONE") }} -

-
-
- - -
-
-{% endblock %} +{% extends "modals/modal.html.twig" %} + +{% block modal_title %}{{ translate("GROUP.DELETE") }}{% endblock %} + +{% block modal_body %} +
+ {% include "forms/csrf.html.twig" %} +
+
+

{{ translate("GROUP.DELETE_CONFIRM", {name: group.name}) }}
+ {{ translate("DELETE_CANNOT_UNDONE") }} +

+
+
+ + +
+
+{% endblock %} diff --git a/main/app/sprinkles/admin/templates/modals/confirm-delete-role.html.twig b/main/app/sprinkles/admin/templates/modals/confirm-delete-role.html.twig index ae528f9..0da0910 100644 --- a/main/app/sprinkles/admin/templates/modals/confirm-delete-role.html.twig +++ b/main/app/sprinkles/admin/templates/modals/confirm-delete-role.html.twig @@ -1,20 +1,20 @@ -{% extends "modals/modal.html.twig" %} - -{% block modal_title %}{{ translate("ROLE.DELETE") }}{% endblock %} - -{% block modal_body %} -
- {% include "forms/csrf.html.twig" %} -
-
-

{{ translate("ROLE.DELETE_CONFIRM", {name: role.name}) }}
- {{ translate("DELETE_CANNOT_UNDONE") }} -

-
-
- - -
-
-{% endblock %} +{% extends "modals/modal.html.twig" %} + +{% block modal_title %}{{ translate("ROLE.DELETE") }}{% endblock %} + +{% block modal_body %} +
+ {% include "forms/csrf.html.twig" %} +
+
+

{{ translate("ROLE.DELETE_CONFIRM", {name: role.name}) }}
+ {{ translate("DELETE_CANNOT_UNDONE") }} +

+
+
+ + +
+
+{% endblock %} diff --git a/main/app/sprinkles/admin/templates/modals/confirm-delete-user.html.twig b/main/app/sprinkles/admin/templates/modals/confirm-delete-user.html.twig index 17fe859..7dd18ad 100644 --- a/main/app/sprinkles/admin/templates/modals/confirm-delete-user.html.twig +++ b/main/app/sprinkles/admin/templates/modals/confirm-delete-user.html.twig @@ -1,20 +1,20 @@ -{% extends "modals/modal.html.twig" %} - -{% block modal_title %}{{ translate("USER.DELETE") }}{% endblock %} - -{% block modal_body %} -
- {% include "forms/csrf.html.twig" %} -
-
-

{{ translate("USER.DELETE_CONFIRM", {name: user.user_name}) }}
- {{ translate("DELETE_CANNOT_UNDONE") }} -

-
-
- - -
-
-{% endblock %} +{% extends "modals/modal.html.twig" %} + +{% block modal_title %}{{ translate("USER.DELETE") }}{% endblock %} + +{% block modal_body %} +
+ {% include "forms/csrf.html.twig" %} +
+
+

{{ translate("USER.DELETE_CONFIRM", {name: user.user_name}) }}
+ {{ translate("DELETE_CANNOT_UNDONE") }} +

+
+
+ + +
+
+{% endblock %} diff --git a/main/app/sprinkles/admin/templates/modals/group.html.twig b/main/app/sprinkles/admin/templates/modals/group.html.twig index a716b4f..0c55bc3 100644 --- a/main/app/sprinkles/admin/templates/modals/group.html.twig +++ b/main/app/sprinkles/admin/templates/modals/group.html.twig @@ -1,7 +1,7 @@ -{% extends "modals/modal.html.twig" %} - -{% block modal_title %}{{ translate('GROUP') }}{% endblock %} - -{% block modal_body %} - {% include "forms/group.html.twig" %} -{% endblock %} +{% extends "modals/modal.html.twig" %} + +{% block modal_title %}{{ translate('GROUP') }}{% endblock %} + +{% block modal_body %} + {% include "forms/group.html.twig" %} +{% endblock %} diff --git a/main/app/sprinkles/admin/templates/modals/role-manage-permissions.html.twig b/main/app/sprinkles/admin/templates/modals/role-manage-permissions.html.twig index f8b7ef5..8189aaa 100644 --- a/main/app/sprinkles/admin/templates/modals/role-manage-permissions.html.twig +++ b/main/app/sprinkles/admin/templates/modals/role-manage-permissions.html.twig @@ -1,96 +1,96 @@ -{% extends "modals/modal.html.twig" %} - -{% block modal_title %}{{ translate("PERMISSION.MANAGE") }}{% endblock %} - -{% block modal_size %}modal-lg{% endblock %} - -{% block modal_body %} -
- {% include "forms/csrf.html.twig" %} -
-
-
- - - - - - - - - - - -
{{ translate("NAME") }}{{ translate("DESCRIPTION") }}{{ translate("PERMISSION.HOOK_CONDITION") }}{{ translate("REMOVE") }}
-
- - -
-
-
-
-
- -
-
- -
-
-
- - {# This contains a series of - - -{% endverbatim %} - - - -{% endblock %} +{% extends "modals/modal.html.twig" %} + +{% block modal_title %}{{ translate("PERMISSION.MANAGE") }}{% endblock %} + +{% block modal_size %}modal-lg{% endblock %} + +{% block modal_body %} +
+ {% include "forms/csrf.html.twig" %} +
+
+
+ + + + + + + + + + + +
{{ translate("NAME") }}{{ translate("DESCRIPTION") }}{{ translate("PERMISSION.HOOK_CONDITION") }}{{ translate("REMOVE") }}
+
+ + +
+
+
+
+
+ +
+
+ +
+
+
+ + {# This contains a series of + + +{% endverbatim %} + + + +{% endblock %} diff --git a/main/app/sprinkles/admin/templates/modals/role.html.twig b/main/app/sprinkles/admin/templates/modals/role.html.twig index 6ae924e..b0c6c93 100644 --- a/main/app/sprinkles/admin/templates/modals/role.html.twig +++ b/main/app/sprinkles/admin/templates/modals/role.html.twig @@ -1,7 +1,7 @@ -{% extends "modals/modal.html.twig" %} - -{% block modal_title %}{{ translate('ROLE') }}{% endblock %} - -{% block modal_body %} - {% include "forms/role.html.twig" %} -{% endblock %} +{% extends "modals/modal.html.twig" %} + +{% block modal_title %}{{ translate('ROLE') }}{% endblock %} + +{% block modal_body %} + {% include "forms/role.html.twig" %} +{% endblock %} diff --git a/main/app/sprinkles/admin/templates/modals/user-manage-roles.html.twig b/main/app/sprinkles/admin/templates/modals/user-manage-roles.html.twig index 3c0fe18..e3c4811 100644 --- a/main/app/sprinkles/admin/templates/modals/user-manage-roles.html.twig +++ b/main/app/sprinkles/admin/templates/modals/user-manage-roles.html.twig @@ -1,78 +1,78 @@ -{% extends "modals/modal.html.twig" %} - -{% block modal_title %}{{ translate("ROLE.MANAGE") }}{% endblock %} - -{% block modal_body %} -
- {% include "forms/csrf.html.twig" %} -
-
-
- - - - - - - - - - -
{{ translate("NAME") }}{{ translate("DESCRIPTION") }}{{ translate("REMOVE") }}
-
- - -
-
-
-
-
- -
-
- -
-
-
- - {# This contains a series of - - -{% endverbatim %} - - - -{% endblock %} +{% extends "modals/modal.html.twig" %} + +{% block modal_title %}{{ translate("ROLE.MANAGE") }}{% endblock %} + +{% block modal_body %} +
+ {% include "forms/csrf.html.twig" %} +
+
+
+ + + + + + + + + + +
{{ translate("NAME") }}{{ translate("DESCRIPTION") }}{{ translate("REMOVE") }}
+
+ + +
+
+
+
+
+ +
+
+ +
+
+
+ + {# This contains a series of + + +{% endverbatim %} + + + +{% endblock %} diff --git a/main/app/sprinkles/admin/templates/modals/user-set-password.html.twig b/main/app/sprinkles/admin/templates/modals/user-set-password.html.twig index 9b2c017..efd2d6b 100644 --- a/main/app/sprinkles/admin/templates/modals/user-set-password.html.twig +++ b/main/app/sprinkles/admin/templates/modals/user-set-password.html.twig @@ -1,67 +1,67 @@ -{% extends "modals/modal.html.twig" %} - -{% block modal_title %}{{ translate("USER.ADMIN.CHANGE_PASSWORD") }}{% endblock %} - -{% block modal_body %} -
- {% include "forms/csrf.html.twig" %} - - - -
-
-
-
-
- -
-
-
-
- -
-
-
-
- -
- - -
-
-
- -
- - -
-
-
-
-
-
-
-
-
- -
-
- -
-
-
- - -{% endblock %} +{% extends "modals/modal.html.twig" %} + +{% block modal_title %}{{ translate("USER.ADMIN.CHANGE_PASSWORD") }}{% endblock %} + +{% block modal_body %} +
+ {% include "forms/csrf.html.twig" %} + + + +
+
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+
+
+
+
+
+
+ +
+
+ +
+
+
+ + +{% endblock %} diff --git a/main/app/sprinkles/admin/templates/modals/user.html.twig b/main/app/sprinkles/admin/templates/modals/user.html.twig index 850844d..b1bf6fc 100644 --- a/main/app/sprinkles/admin/templates/modals/user.html.twig +++ b/main/app/sprinkles/admin/templates/modals/user.html.twig @@ -1,7 +1,7 @@ -{% extends "modals/modal.html.twig" %} - -{% block modal_title %}{{ translate('USER') }}{% endblock %} - -{% block modal_body %} - {% include "forms/user.html.twig" %} -{% endblock %} +{% extends "modals/modal.html.twig" %} + +{% block modal_title %}{{ translate('USER') }}{% endblock %} + +{% block modal_body %} + {% include "forms/user.html.twig" %} +{% endblock %} diff --git a/main/app/sprinkles/admin/templates/navigation/sidebar-menu.html.twig b/main/app/sprinkles/admin/templates/navigation/sidebar-menu.html.twig index 446f260..b2965e0 100644 --- a/main/app/sprinkles/admin/templates/navigation/sidebar-menu.html.twig +++ b/main/app/sprinkles/admin/templates/navigation/sidebar-menu.html.twig @@ -1,53 +1,53 @@ -{% block navigation %} - {% if checkAccess('uri_dashboard') %} -
  • - - {{ translate("DASHBOARD") }} - -
  • - {% endif %} - {% if checkAccess('uri_users') %} -
  • - - {{ translate("USER", 2) }} - -
  • - {% elseif checkAccess('uri_group', { - 'group': current_user.group - }) %} -
  • - - {{ translate("GROUP.MANAGE") }} - -
  • - {% endif %} - {% if checkAccess('uri_activities') %} -
  • - - {{ translate("ACTIVITY", 2) }} - -
  • - {% endif %} - {% if checkAccess('uri_roles') %} -
  • - - {{ translate("ROLE", 2) }} - -
  • - {% endif %} - {% if checkAccess('uri_permissions') %} -
  • - - {{ translate("PERMISSION", 2) }} - -
  • - {% endif %} - {% if checkAccess('uri_groups') %} -
  • - - {{ translate("GROUP", 2) }} - -
  • - {% endif %} +{% block navigation %} + {% if checkAccess('uri_dashboard') %} +
  • + + {{ translate("DASHBOARD") }} + +
  • + {% endif %} + {% if checkAccess('uri_users') %} +
  • + + {{ translate("USER", 2) }} + +
  • + {% elseif checkAccess('uri_group', { + 'group': current_user.group + }) %} +
  • + + {{ translate("GROUP.MANAGE") }} + +
  • + {% endif %} + {% if checkAccess('uri_activities') %} +
  • + + {{ translate("ACTIVITY", 2) }} + +
  • + {% endif %} + {% if checkAccess('uri_roles') %} +
  • + + {{ translate("ROLE", 2) }} + +
  • + {% endif %} + {% if checkAccess('uri_permissions') %} +
  • + + {{ translate("PERMISSION", 2) }} + +
  • + {% endif %} + {% if checkAccess('uri_groups') %} +
  • + + {{ translate("GROUP", 2) }} + +
  • + {% endif %} {% endblock %} \ No newline at end of file diff --git a/main/app/sprinkles/admin/templates/navigation/sidebar-user.html.twig b/main/app/sprinkles/admin/templates/navigation/sidebar-user.html.twig index 4b1881c..541fe99 100644 --- a/main/app/sprinkles/admin/templates/navigation/sidebar-user.html.twig +++ b/main/app/sprinkles/admin/templates/navigation/sidebar-user.html.twig @@ -1,10 +1,10 @@ - -
    -
    - User Image -
    -
    -

    {{ current_user.first_name }} {{ current_user.last_name }}

    - {{ current_user.group.name }} -
    + +
    +
    + User Image +
    +
    +

    {{ current_user.first_name }} {{ current_user.last_name }}

    + {{ current_user.group.name }} +
    \ No newline at end of file diff --git a/main/app/sprinkles/admin/templates/navigation/sidebar.html.twig b/main/app/sprinkles/admin/templates/navigation/sidebar.html.twig index 59f87b0..f5465a0 100644 --- a/main/app/sprinkles/admin/templates/navigation/sidebar.html.twig +++ b/main/app/sprinkles/admin/templates/navigation/sidebar.html.twig @@ -1,10 +1,10 @@ -{% block sidebar_user %} - {% include 'navigation/sidebar-user.html.twig' %} -{% endblock %} - -{% block sidebar_menu %} - +{% block sidebar_user %} + {% include 'navigation/sidebar-user.html.twig' %} +{% endblock %} + +{% block sidebar_menu %} + {% endblock %} \ No newline at end of file diff --git a/main/app/sprinkles/admin/templates/navigation/user-card.html.twig b/main/app/sprinkles/admin/templates/navigation/user-card.html.twig index 8b40cd3..a844ce1 100644 --- a/main/app/sprinkles/admin/templates/navigation/user-card.html.twig +++ b/main/app/sprinkles/admin/templates/navigation/user-card.html.twig @@ -1,9 +1,9 @@ -{% extends "@account/navigation/user-card.html.twig" %} - -{% block userCard_menu %} - {% if checkAccess('uri_dashboard') %} - {{ translate("DASHBOARD") }} - {% endif %} - {{ parent() }} +{% extends "@account/navigation/user-card.html.twig" %} + +{% block userCard_menu %} + {% if checkAccess('uri_dashboard') %} + {{ translate("DASHBOARD") }} + {% endif %} + {{ parent() }} {% endblock %} \ No newline at end of file diff --git a/main/app/sprinkles/admin/templates/pages/abstract/dashboard.html.twig b/main/app/sprinkles/admin/templates/pages/abstract/dashboard.html.twig index 0d2e0ef..b24c621 100644 --- a/main/app/sprinkles/admin/templates/pages/abstract/dashboard.html.twig +++ b/main/app/sprinkles/admin/templates/pages/abstract/dashboard.html.twig @@ -1,90 +1,90 @@ -{% extends "pages/abstract/base.html.twig" %} - -{% block stylesheets_page_group %} - - {{ assets.css('css/admin') | raw }} -{% endblock %} - -{% block body_attributes %} - {% if current_user.isMaster() %} - class="hold-transition skin-red sidebar-mini" - {% else %} - class="hold-transition skin-{{ site.AdminLTE.skin }} sidebar-mini" - {% endif %} -{% endblock %} - -{% block content %} - {# This needs to be here (early in the body) to make sure the animation doesn't fire #} - - -
    - -
    - - {% block navbar_logo %} - - {% endblock %} - - -
    - - - - -
    - - {% block content_header %} -
    -

    {% block header_title %}{{ block('page_title') }}{% endblock %}

    - {% if block('page_description') is not empty %} -

    - {% block header_description %}{{ block('page_description') }}{% endblock %} -

    {% endif %} - {% block breadcrumb %} - {% include 'navigation/breadcrumb.html.twig' with {page_title: block('page_title')} %} - {% endblock %} -
    -
    - {% endblock %} -
    - {% block body_matter %}{% endblock %} -
    -
    - - - - {% block footer %} - {% include "pages/partials/footer.html.twig" %} - {% endblock %} - -
    - - -{% endblock %} - -{% block scripts_page_group %} - {{ assets.js('js/admin') | raw }} +{% extends "pages/abstract/base.html.twig" %} + +{% block stylesheets_page_group %} + + {{ assets.css('css/admin') | raw }} +{% endblock %} + +{% block body_attributes %} + {% if current_user.isMaster() %} + class="hold-transition skin-red sidebar-mini" + {% else %} + class="hold-transition skin-{{ site.AdminLTE.skin }} sidebar-mini" + {% endif %} +{% endblock %} + +{% block content %} + {# This needs to be here (early in the body) to make sure the animation doesn't fire #} + + +
    + +
    + + {% block navbar_logo %} + + {% endblock %} + + +
    + + + + +
    + + {% block content_header %} +
    +

    {% block header_title %}{{ block('page_title') }}{% endblock %}

    + {% if block('page_description') is not empty %} +

    + {% block header_description %}{{ block('page_description') }}{% endblock %} +

    {% endif %} + {% block breadcrumb %} + {% include 'navigation/breadcrumb.html.twig' with {page_title: block('page_title')} %} + {% endblock %} +
    +
    + {% endblock %} +
    + {% block body_matter %}{% endblock %} +
    +
    + + + + {% block footer %} + {% include "pages/partials/footer.html.twig" %} + {% endblock %} + +
    + + +{% endblock %} + +{% block scripts_page_group %} + {{ assets.js('js/admin') | raw }} {% endblock %} \ No newline at end of file diff --git a/main/app/sprinkles/admin/templates/pages/activities.html.twig b/main/app/sprinkles/admin/templates/pages/activities.html.twig index 7927601..c6bd007 100644 --- a/main/app/sprinkles/admin/templates/pages/activities.html.twig +++ b/main/app/sprinkles/admin/templates/pages/activities.html.twig @@ -1,45 +1,45 @@ -{% extends "pages/abstract/dashboard.html.twig" %} - -{% block stylesheets_page %} - - {{ assets.css('css/form-widgets') | raw }} -{% endblock %} - -{# Overrides blocks in head of base template #} -{% block page_title %}{{ translate("ACTIVITY", 2) }}{% endblock %} - -{% block page_description %}{{ translate("ACTIVITY.PAGE") }}.{% endblock %} - -{% block body_matter %} -
    -
    -
    -
    -

    {{ translate('ACTIVITY', 2) }}

    - {% include "tables/table-tool-menu.html.twig" %} -
    -
    - {% include "tables/activities.html.twig" with { - "table" : { - "id" : "table-activities", - "columns" : ["user"] - } - } %} -
    -
    -
    -
    -{% endblock %} -{% block scripts_page %} - - - - - {{ assets.js('js/form-widgets') | raw }} - - - {{ assets.js('js/pages/activities') | raw }} - -{% endblock %} +{% extends "pages/abstract/dashboard.html.twig" %} + +{% block stylesheets_page %} + + {{ assets.css('css/form-widgets') | raw }} +{% endblock %} + +{# Overrides blocks in head of base template #} +{% block page_title %}{{ translate("ACTIVITY", 2) }}{% endblock %} + +{% block page_description %}{{ translate("ACTIVITY.PAGE") }}.{% endblock %} + +{% block body_matter %} +
    +
    +
    +
    +

    {{ translate('ACTIVITY', 2) }}

    + {% include "tables/table-tool-menu.html.twig" %} +
    +
    + {% include "tables/activities.html.twig" with { + "table" : { + "id" : "table-activities", + "columns" : ["user"] + } + } %} +
    +
    +
    +
    +{% endblock %} +{% block scripts_page %} + + + + + {{ assets.js('js/form-widgets') | raw }} + + + {{ assets.js('js/pages/activities') | raw }} + +{% endblock %} diff --git a/main/app/sprinkles/admin/templates/pages/dashboard.html.twig b/main/app/sprinkles/admin/templates/pages/dashboard.html.twig index 461e13d..30ef280 100644 --- a/main/app/sprinkles/admin/templates/pages/dashboard.html.twig +++ b/main/app/sprinkles/admin/templates/pages/dashboard.html.twig @@ -1,284 +1,284 @@ -{% extends "pages/abstract/dashboard.html.twig" %} - -{# Overrides blocks in head of base template #} -{% block page_title %}{{ translate("DASHBOARD") }}{% endblock %} -{% block page_description %}{% endblock %} - -{% block body_matter %} - - {% if checkAccess('uri_users') %} - - - - {% elseif checkAccess('uri_group', { - 'group': current_user.group - }) %} -
    -
    -
    - -
    -

    {{ current_user.group.name }}

    -
    - -
    - -
    - -
    -
    - -
    - {{ translate("USER", 2) }} - {{ current_user.group.users.count }} -
    - -
    - -
    - -
    - - {% endif %} - - -
    - {% if checkAccess('uri_users') or checkAccess('view_system_info') %} -
    - {% if checkAccess('uri_users') %} -
    -
    - -
    -
    -

    {{ translate("USER.LATEST") }}

    -
    - -
    - - -
    - - - -
    - -
    - -
    - - {% endif %} - - {% if checkAccess('view_system_info') %} -
    -
    -
    -
    -

    {{ translate("SYSTEM_INFO") }}

    -
    - -
    -
    -
    {{ translate("SYSTEM_INFO.UF_VERSION") }}
    -
    {{ info.version.UF }}
    - -
    {{ translate("SYSTEM_INFO.PHP_VERSION") }}
    -
    {{ info.version.php }}
    - -
    {{ translate("SYSTEM_INFO.SERVER") }}
    -
    {{ info.environment.SERVER_SOFTWARE }}
    - -
    {{ translate("SYSTEM_INFO.DB_VERSION") }}
    -
    {{ info.version.database.type }} {{ info.version.database.version }}
    - -
    {{ translate("SYSTEM_INFO.DB_NAME") }}
    -
    {{ info.database.name }}
    - -
    {{ translate("SYSTEM_INFO.DIRECTORY") }}
    -
    {{ info.path.project }}
    - -
    {{ translate("SYSTEM_INFO.URL") }}
    -
    {{ site.uri.public }}
    - -
    {{ translate("SYSTEM_INFO.SPRINKLES") }}
    -
    -
      - {% for sprinkle in sprinkles %} -
    • - {{ sprinkle }} -
    • - {% endfor %} -
    -
    -
    -
    - - - -
    - -
    - -
    - - {% endif %} -
    - - {% endif %} - - {% if checkAccess('uri_activities') %} -
    -
    -
    -

    {{ translate('ACTIVITY', 2) }}

    - {% include "tables/table-tool-menu.html.twig" %} -
    -
    - {% include "tables/activities.html.twig" with { - "table" : { - "id" : "table-activities", - "columns" : ["user"] - } - } %} -
    -
    -
    - {% elseif checkAccess('view_group_field', { - 'group': current_user.group, - 'property': 'users' - }) %} -
    -
    -
    -

    {{ translate('USER', 2) }}

    - {% include "tables/table-tool-menu.html.twig" %} -
    -
    - {% include "tables/users.html.twig" with { - "table" : { - "id" : "table-group-users" - } - } %} -
    - -
    -
    - {% else %} -
    -
    - -
    -

    - {{ translate("WELCOME", { - 'first_name': current_user.first_name - }) }} -

    -
    -
    - User Avatar -
    - -
    - - - -
    - - {% endif %} -
    - -{% endblock %} - -{% block scripts_page %} - - - - - {{ assets.js('js/pages/dashboard') | raw }} - +{% extends "pages/abstract/dashboard.html.twig" %} + +{# Overrides blocks in head of base template #} +{% block page_title %}{{ translate("DASHBOARD") }}{% endblock %} +{% block page_description %}{% endblock %} + +{% block body_matter %} + + {% if checkAccess('uri_users') %} + + + + {% elseif checkAccess('uri_group', { + 'group': current_user.group + }) %} +
    +
    +
    + +
    +

    {{ current_user.group.name }}

    +
    + +
    + +
    + +
    +
    + +
    + {{ translate("USER", 2) }} + {{ current_user.group.users.count }} +
    + +
    + +
    + +
    + + {% endif %} + + +
    + {% if checkAccess('uri_users') or checkAccess('view_system_info') %} +
    + {% if checkAccess('uri_users') %} +
    +
    + +
    +
    +

    {{ translate("USER.LATEST") }}

    +
    + +
    + + +
    + + + +
    + +
    + +
    + + {% endif %} + + {% if checkAccess('view_system_info') %} +
    +
    +
    +
    +

    {{ translate("SYSTEM_INFO") }}

    +
    + +
    +
    +
    {{ translate("SYSTEM_INFO.UF_VERSION") }}
    +
    {{ info.version.UF }}
    + +
    {{ translate("SYSTEM_INFO.PHP_VERSION") }}
    +
    {{ info.version.php }}
    + +
    {{ translate("SYSTEM_INFO.SERVER") }}
    +
    {{ info.environment.SERVER_SOFTWARE }}
    + +
    {{ translate("SYSTEM_INFO.DB_VERSION") }}
    +
    {{ info.version.database.type }} {{ info.version.database.version }}
    + +
    {{ translate("SYSTEM_INFO.DB_NAME") }}
    +
    {{ info.database.name }}
    + +
    {{ translate("SYSTEM_INFO.DIRECTORY") }}
    +
    {{ info.path.project }}
    + +
    {{ translate("SYSTEM_INFO.URL") }}
    +
    {{ site.uri.public }}
    + +
    {{ translate("SYSTEM_INFO.SPRINKLES") }}
    +
    +
      + {% for sprinkle in sprinkles %} +
    • + {{ sprinkle }} +
    • + {% endfor %} +
    +
    +
    +
    + + + +
    + +
    + +
    + + {% endif %} +
    + + {% endif %} + + {% if checkAccess('uri_activities') %} +
    +
    +
    +

    {{ translate('ACTIVITY', 2) }}

    + {% include "tables/table-tool-menu.html.twig" %} +
    +
    + {% include "tables/activities.html.twig" with { + "table" : { + "id" : "table-activities", + "columns" : ["user"] + } + } %} +
    +
    +
    + {% elseif checkAccess('view_group_field', { + 'group': current_user.group, + 'property': 'users' + }) %} +
    +
    +
    +

    {{ translate('USER', 2) }}

    + {% include "tables/table-tool-menu.html.twig" %} +
    +
    + {% include "tables/users.html.twig" with { + "table" : { + "id" : "table-group-users" + } + } %} +
    + +
    +
    + {% else %} +
    +
    + +
    +

    + {{ translate("WELCOME", { + 'first_name': current_user.first_name + }) }} +

    +
    +
    + User Avatar +
    + +
    + + + +
    + + {% endif %} +
    + +{% endblock %} + +{% block scripts_page %} + + + + + {{ assets.js('js/pages/dashboard') | raw }} + {% endblock %} \ No newline at end of file diff --git a/main/app/sprinkles/admin/templates/pages/group.html.twig b/main/app/sprinkles/admin/templates/pages/group.html.twig index bab5b13..204f66e 100644 --- a/main/app/sprinkles/admin/templates/pages/group.html.twig +++ b/main/app/sprinkles/admin/templates/pages/group.html.twig @@ -1,107 +1,107 @@ -{% extends "pages/abstract/dashboard.html.twig" %} - -{% block stylesheets_page %} - - {{ assets.css('css/form-widgets') | raw }} -{% endblock %} - -{# Overrides blocks in head of base template #} -{% block page_title %}{{ translate("GROUP", 2) }} | {{ group.name }}{% endblock %} - -{% block page_description %}{{ translate("GROUP.INFO_PAGE", {name: group.name}) }}{% endblock %} - -{% block body_matter %} -
    -
    -
    -
    -

    {{ translate('GROUP.SUMMARY') }}

    - {% if 'tools' not in tools.hidden %} -
    -
    - - -
    -
    - {% endif %} -
    -
    -
    - -
    - -

    {{ group.name }}

    - - {% if 'description' not in fields.hidden %} -

    - {{ group.description }} -

    - {% endif %} - {% if 'users' not in fields.hidden %} -
    - {{ translate('USER', 2) }} -

    - {{ group.users.count }} -

    - {% endif %} - {% block group_profile %}{% endblock %} -
    -
    -
    -
    -
    -
    -

    {{ translate('USER', 2) }}

    - {% include "tables/table-tool-menu.html.twig" %} -
    -
    - {% include "tables/users.html.twig" with { - "table" : { - "id" : "table-group-users" - } - } %} -
    -
    -
    -
    -{% endblock %} -{% block scripts_page %} - - - - - {{ assets.js('js/form-widgets') | raw }} - - - {{ assets.js('js/pages/group') | raw }} -{% endblock %} +{% extends "pages/abstract/dashboard.html.twig" %} + +{% block stylesheets_page %} + + {{ assets.css('css/form-widgets') | raw }} +{% endblock %} + +{# Overrides blocks in head of base template #} +{% block page_title %}{{ translate("GROUP", 2) }} | {{ group.name }}{% endblock %} + +{% block page_description %}{{ translate("GROUP.INFO_PAGE", {name: group.name}) }}{% endblock %} + +{% block body_matter %} +
    +
    +
    +
    +

    {{ translate('GROUP.SUMMARY') }}

    + {% if 'tools' not in tools.hidden %} +
    +
    + + +
    +
    + {% endif %} +
    +
    +
    + +
    + +

    {{ group.name }}

    + + {% if 'description' not in fields.hidden %} +

    + {{ group.description }} +

    + {% endif %} + {% if 'users' not in fields.hidden %} +
    + {{ translate('USER', 2) }} +

    + {{ group.users.count }} +

    + {% endif %} + {% block group_profile %}{% endblock %} +
    +
    +
    +
    +
    +
    +

    {{ translate('USER', 2) }}

    + {% include "tables/table-tool-menu.html.twig" %} +
    +
    + {% include "tables/users.html.twig" with { + "table" : { + "id" : "table-group-users" + } + } %} +
    +
    +
    +
    +{% endblock %} +{% block scripts_page %} + + + + + {{ assets.js('js/form-widgets') | raw }} + + + {{ assets.js('js/pages/group') | raw }} +{% endblock %} diff --git a/main/app/sprinkles/admin/templates/pages/groups.html.twig b/main/app/sprinkles/admin/templates/pages/groups.html.twig index 43b0618..014c678 100644 --- a/main/app/sprinkles/admin/templates/pages/groups.html.twig +++ b/main/app/sprinkles/admin/templates/pages/groups.html.twig @@ -1,51 +1,51 @@ -{% extends "pages/abstract/dashboard.html.twig" %} - -{% block stylesheets_page %} - - {{ assets.css('css/form-widgets') | raw }} -{% endblock %} - -{# Overrides blocks in head of base template #} -{% block page_title %}{{ translate("GROUP", 2) }}{% endblock %} - -{% block page_description %}{{ translate("GROUP.PAGE_DESCRIPTION") }}{% endblock %} - -{% block body_matter %} -
    -
    -
    -
    -

    {{ translate('GROUP', 2) }}

    - {% include "tables/table-tool-menu.html.twig" %} -
    -
    - {% include "tables/groups.html.twig" with { - "table" : { - "id" : "table-groups" - } - } %} -
    - {% if checkAccess('create_group') %} - - {% endif %} -
    -
    -
    -{% endblock %} -{% block scripts_page %} - - - - - {{ assets.js('js/form-widgets') | raw }} - - - {{ assets.js('js/pages/groups') | raw }} - -{% endblock %} +{% extends "pages/abstract/dashboard.html.twig" %} + +{% block stylesheets_page %} + + {{ assets.css('css/form-widgets') | raw }} +{% endblock %} + +{# Overrides blocks in head of base template #} +{% block page_title %}{{ translate("GROUP", 2) }}{% endblock %} + +{% block page_description %}{{ translate("GROUP.PAGE_DESCRIPTION") }}{% endblock %} + +{% block body_matter %} +
    +
    +
    +
    +

    {{ translate('GROUP', 2) }}

    + {% include "tables/table-tool-menu.html.twig" %} +
    +
    + {% include "tables/groups.html.twig" with { + "table" : { + "id" : "table-groups" + } + } %} +
    + {% if checkAccess('create_group') %} + + {% endif %} +
    +
    +
    +{% endblock %} +{% block scripts_page %} + + + + + {{ assets.js('js/form-widgets') | raw }} + + + {{ assets.js('js/pages/groups') | raw }} + +{% endblock %} diff --git a/main/app/sprinkles/admin/templates/pages/permission.html.twig b/main/app/sprinkles/admin/templates/pages/permission.html.twig index 004131e..2b1ae3e 100644 --- a/main/app/sprinkles/admin/templates/pages/permission.html.twig +++ b/main/app/sprinkles/admin/templates/pages/permission.html.twig @@ -1,91 +1,91 @@ -{% extends "pages/abstract/dashboard.html.twig" %} - -{% block stylesheets_page %} - - {{ assets.css('css/form-widgets') | raw }} -{% endblock %} - -{# Overrides blocks in head of base template #} -{% block page_title %}{{ translate("PERMISSION", 2) }} | {{ permission.name }}{% endblock %} - -{% block page_description %}{{ translate("PERMISSION.INFO_PAGE", {name: permission.name}) }}{% endblock %} - -{% block body_matter %} -
    -
    -
    -
    -

    {{ translate("PERMISSION.SUMMARY") }}

    -
    -
    -
    - -
    - -

    {{ permission.name }}

    - -

    - {{ permission.description }} -

    -
    - {{ translate("PERMISSION.ID") }}: - - {{ permission.id }} - - -
    - {{ translate("SLUG_CONDITION") }} -
    -
    -

    - {{ permission.slug }} -

    -

    - ↳ - {{ permission.conditions }} -

    -
    - -
    -
    -
    -
    -
    -

    {{ translate("USER.WITH_PERMISSION") }}

    - {% include "tables/table-tool-menu.html.twig" %} -
    -
    - {% include "tables/users.html.twig" with { - "table" : { - "id" : "table-permission-users", - "columns" : ["via_roles"] - } - } %} -
    -
    -
    -
    -{% endblock %} -{% block scripts_page %} - - - - - {{ assets.js('js/form-widgets') | raw }} - - - {{ assets.js('js/pages/permission') | raw }} -{% endblock %} +{% extends "pages/abstract/dashboard.html.twig" %} + +{% block stylesheets_page %} + + {{ assets.css('css/form-widgets') | raw }} +{% endblock %} + +{# Overrides blocks in head of base template #} +{% block page_title %}{{ translate("PERMISSION", 2) }} | {{ permission.name }}{% endblock %} + +{% block page_description %}{{ translate("PERMISSION.INFO_PAGE", {name: permission.name}) }}{% endblock %} + +{% block body_matter %} +
    +
    +
    +
    +

    {{ translate("PERMISSION.SUMMARY") }}

    +
    +
    +
    + +
    + +

    {{ permission.name }}

    + +

    + {{ permission.description }} +

    +
    + {{ translate("PERMISSION.ID") }}: + + {{ permission.id }} + + +
    + {{ translate("SLUG_CONDITION") }} +
    +
    +

    + {{ permission.slug }} +

    +

    + ↳ + {{ permission.conditions }} +

    +
    + +
    +
    +
    +
    +
    +

    {{ translate("USER.WITH_PERMISSION") }}

    + {% include "tables/table-tool-menu.html.twig" %} +
    +
    + {% include "tables/users.html.twig" with { + "table" : { + "id" : "table-permission-users", + "columns" : ["via_roles"] + } + } %} +
    +
    +
    +
    +{% endblock %} +{% block scripts_page %} + + + + + {{ assets.js('js/form-widgets') | raw }} + + + {{ assets.js('js/pages/permission') | raw }} +{% endblock %} diff --git a/main/app/sprinkles/admin/templates/pages/permissions.html.twig b/main/app/sprinkles/admin/templates/pages/permissions.html.twig index 5cf95da..099aa39 100644 --- a/main/app/sprinkles/admin/templates/pages/permissions.html.twig +++ b/main/app/sprinkles/admin/templates/pages/permissions.html.twig @@ -1,45 +1,45 @@ -{% extends "pages/abstract/dashboard.html.twig" %} - -{% block stylesheets_page %} - - {{ assets.css('css/form-widgets') | raw }} -{% endblock %} - -{# Overrides blocks in head of base template #} -{% block page_title %}{{ translate("PERMISSION", 2) }}{% endblock %} - -{% block page_description %}{{ translate("PERMISSION.PAGE_DESCRIPTION") }}{% endblock %} - -{% block body_matter %} -
    -
    -
    -
    -

    {{ translate('PERMISSION', 2) }} -

    - {% include "tables/table-tool-menu.html.twig" %} -
    -
    - {% include "tables/permissions.html.twig" with { - "table" : { - "id" : "table-permissions" - } - } %} -
    -
    -
    -
    -{% endblock %} -{% block scripts_page %} - - - - - {{ assets.js('js/form-widgets') | raw }} - - - {{ assets.js('js/pages/permissions') | raw }} - -{% endblock %} +{% extends "pages/abstract/dashboard.html.twig" %} + +{% block stylesheets_page %} + + {{ assets.css('css/form-widgets') | raw }} +{% endblock %} + +{# Overrides blocks in head of base template #} +{% block page_title %}{{ translate("PERMISSION", 2) }}{% endblock %} + +{% block page_description %}{{ translate("PERMISSION.PAGE_DESCRIPTION") }}{% endblock %} + +{% block body_matter %} +
    +
    +
    +
    +

    {{ translate('PERMISSION', 2) }} +

    + {% include "tables/table-tool-menu.html.twig" %} +
    +
    + {% include "tables/permissions.html.twig" with { + "table" : { + "id" : "table-permissions" + } + } %} +
    +
    +
    +
    +{% endblock %} +{% block scripts_page %} + + + + + {{ assets.js('js/form-widgets') | raw }} + + + {{ assets.js('js/pages/permissions') | raw }} + +{% endblock %} diff --git a/main/app/sprinkles/admin/templates/pages/role.html.twig b/main/app/sprinkles/admin/templates/pages/role.html.twig index 1892d32..31a9f8a 100644 --- a/main/app/sprinkles/admin/templates/pages/role.html.twig +++ b/main/app/sprinkles/admin/templates/pages/role.html.twig @@ -1,129 +1,129 @@ -{% extends "pages/abstract/dashboard.html.twig" %} - -{% block stylesheets_page %} - - {{ assets.css('css/form-widgets') | raw }} -{% endblock %} - -{# Overrides blocks in head of base template #} -{% block page_title %}{{ translate("ROLE", 2) }} | {{ role.name }}{% endblock %} - -{% block page_description %}{{ translate("ROLE.INFO_PAGE", {name: role.name}) }}{% endblock %} - -{% block body_matter %} -
    -
    -
    -
    -

    {{ translate('ROLE.SUMMARY') }}

    - {% if 'tools' not in tools.hidden %} -
    -
    - - -
    -
    - {% endif %} -
    -
    -
    - -
    - -

    {{ role.name }}

    - - {% if 'description' not in fields.hidden %} -

    - {{ role.description }} -

    - {% endif %} - {% if 'users' not in fields.hidden %} -
    - {{ translate('USER', 2) }} -

    - {{ role.users.count }} -

    - {% endif %} -
    -
    -
    -
    -
    -
    -

    {{ translate('PERMISSION', 2) }}

    - {% include "tables/table-tool-menu.html.twig" %} -
    -
    - {% include "tables/permissions.html.twig" with { - "table" : { - "id" : "table-role-permissions" - } - } %} -
    -
    -
    -
    -
    -
    -

    {{ translate('USER', 2) }}

    - {% include "tables/table-tool-menu.html.twig" %} -
    -
    - {% include "tables/users.html.twig" with { - "table" : { - "id" : "table-role-users", - "columns" : ["last_activity"] - } - } %} -
    -
    -
    -
    -{% endblock %} -{% block scripts_page %} - - - - - {{ assets.js('js/form-widgets') | raw }} - - - {{ assets.js('js/pages/role') | raw }} -{% endblock %} +{% extends "pages/abstract/dashboard.html.twig" %} + +{% block stylesheets_page %} + + {{ assets.css('css/form-widgets') | raw }} +{% endblock %} + +{# Overrides blocks in head of base template #} +{% block page_title %}{{ translate("ROLE", 2) }} | {{ role.name }}{% endblock %} + +{% block page_description %}{{ translate("ROLE.INFO_PAGE", {name: role.name}) }}{% endblock %} + +{% block body_matter %} +
    +
    +
    +
    +

    {{ translate('ROLE.SUMMARY') }}

    + {% if 'tools' not in tools.hidden %} +
    +
    + + +
    +
    + {% endif %} +
    +
    +
    + +
    + +

    {{ role.name }}

    + + {% if 'description' not in fields.hidden %} +

    + {{ role.description }} +

    + {% endif %} + {% if 'users' not in fields.hidden %} +
    + {{ translate('USER', 2) }} +

    + {{ role.users.count }} +

    + {% endif %} +
    +
    +
    +
    +
    +
    +

    {{ translate('PERMISSION', 2) }}

    + {% include "tables/table-tool-menu.html.twig" %} +
    +
    + {% include "tables/permissions.html.twig" with { + "table" : { + "id" : "table-role-permissions" + } + } %} +
    +
    +
    +
    +
    +
    +

    {{ translate('USER', 2) }}

    + {% include "tables/table-tool-menu.html.twig" %} +
    +
    + {% include "tables/users.html.twig" with { + "table" : { + "id" : "table-role-users", + "columns" : ["last_activity"] + } + } %} +
    +
    +
    +
    +{% endblock %} +{% block scripts_page %} + + + + + {{ assets.js('js/form-widgets') | raw }} + + + {{ assets.js('js/pages/role') | raw }} +{% endblock %} diff --git a/main/app/sprinkles/admin/templates/pages/roles.html.twig b/main/app/sprinkles/admin/templates/pages/roles.html.twig index 2677f87..a535a11 100644 --- a/main/app/sprinkles/admin/templates/pages/roles.html.twig +++ b/main/app/sprinkles/admin/templates/pages/roles.html.twig @@ -1,49 +1,49 @@ -{% extends "pages/abstract/dashboard.html.twig" %} - -{% block stylesheets_page %} - - {{ assets.css('css/form-widgets') | raw }} -{% endblock %} - -{# Overrides blocks in head of base template #} -{% block page_title %}{{ translate("ROLE", 2) }}{% endblock %} - -{% block page_description %}{{ translate("ROLE.PAGE_DESCRIPTION") }}{% endblock %} - -{% block body_matter %} -
    -
    -
    -
    -

    {{ translate('ROLE', 2) }}

    - {% include "tables/table-tool-menu.html.twig" %} -
    -
    - {% include "tables/roles.html.twig" with { - "table" : { - "id" : "table-roles" - } - } %} -
    - -
    -
    -
    -{% endblock %} -{% block scripts_page %} - - - - - {{ assets.js('js/form-widgets') | raw }} - - - {{ assets.js('js/pages/roles') | raw }} - -{% endblock %} +{% extends "pages/abstract/dashboard.html.twig" %} + +{% block stylesheets_page %} + + {{ assets.css('css/form-widgets') | raw }} +{% endblock %} + +{# Overrides blocks in head of base template #} +{% block page_title %}{{ translate("ROLE", 2) }}{% endblock %} + +{% block page_description %}{{ translate("ROLE.PAGE_DESCRIPTION") }}{% endblock %} + +{% block body_matter %} +
    +
    +
    +
    +

    {{ translate('ROLE', 2) }}

    + {% include "tables/table-tool-menu.html.twig" %} +
    +
    + {% include "tables/roles.html.twig" with { + "table" : { + "id" : "table-roles" + } + } %} +
    + +
    +
    +
    +{% endblock %} +{% block scripts_page %} + + + + + {{ assets.js('js/form-widgets') | raw }} + + + {{ assets.js('js/pages/roles') | raw }} + +{% endblock %} diff --git a/main/app/sprinkles/admin/templates/pages/user.html.twig b/main/app/sprinkles/admin/templates/pages/user.html.twig index 47228fd..37675d7 100644 --- a/main/app/sprinkles/admin/templates/pages/user.html.twig +++ b/main/app/sprinkles/admin/templates/pages/user.html.twig @@ -1,208 +1,208 @@ -{% extends "pages/abstract/dashboard.html.twig" %} - -{% block stylesheets_page %} - - {{ assets.css('css/form-widgets') | raw }} -{% endblock %} - -{# Overrides blocks in head of base template #} -{% block page_title %}{{ translate("USER", 2) }} | {{ user.full_name }}{% endblock %} - -{% block page_description %}{{ translate("USER.INFO_PAGE", {name: user.user_name}) }}{% endblock %} - -{% block body_matter %} - {% block group_box %} - {% endblock %} -
    -
    -
    - {% block user_box %} -
    -
    -

    {{ translate('USER.SUMMARY') }}

    - {% if 'tools' not in tools.hidden %} -
    -
    - - -
    -
    - {% endif %} -
    -
    - {{ user.user_name }} - -

    {{ user.full_name }}

    -
    - {% if user.flag_enabled == 0 %} - - {% endif %} - {% if user.flag_verified == 0 %} - - {% endif %} -
    -

    {{ user.user_name }}{% if 'group' not in fields.hidden %} • {{ user.group.name }}{% endif %}

    - - {% if 'email' not in fields.hidden %} -
    - {{ translate("EMAIL") }} -

    - - {{ user.email }} -

    - {% endif %} - - {% if 'locale' not in fields.hidden %} -
    - {{ translate("LOCALE") }} -

    - {{ locales[user.locale] }} -

    - {% endif %} - - {% block user_profile %}{% endblock %} - - {% if 'roles' not in fields.hidden %} -
    - {{ translate("ROLE", 2) }} - -

    - {% for role in user.roles %} - {{ role.name }} - {% endfor %} -

    - {% endif %} -
    -
    - {% endblock %} -
    -
    - {% if 'activities' not in widgets.hidden %} -
    - {% block activity_box %} -
    -
    -

    {{ translate('ACTIVITY', 2) }}

    - {% include "tables/table-tool-menu.html.twig" %} -
    -
    - {% include "tables/activities.html.twig" with { - "table" : { - "id" : "table-user-activities" - } - } %} -
    -
    - {% endblock %} -
    - {% endif %} -
    - {% if 'permissions' not in widgets.hidden %} -
    -
    -
    -
    -

    {{ translate('PERMISSION', 2) }} -

    - {% include "tables/table-tool-menu.html.twig" %} -
    -
    - {% include "tables/permissions.html.twig" with { - "table" : { - "id" : "table-permissions", - "columns" : ["via_roles"] - } - } %} -
    -
    -
    -
    - {% endif %} -{% endblock %} -{% block scripts_page %} - - - - - {{ assets.js('js/form-widgets') | raw }} - - - {{ assets.js('js/pages/user') | raw }} -{% endblock %} +{% extends "pages/abstract/dashboard.html.twig" %} + +{% block stylesheets_page %} + + {{ assets.css('css/form-widgets') | raw }} +{% endblock %} + +{# Overrides blocks in head of base template #} +{% block page_title %}{{ translate("USER", 2) }} | {{ user.full_name }}{% endblock %} + +{% block page_description %}{{ translate("USER.INFO_PAGE", {name: user.user_name}) }}{% endblock %} + +{% block body_matter %} + {% block group_box %} + {% endblock %} +
    +
    +
    + {% block user_box %} +
    +
    +

    {{ translate('USER.SUMMARY') }}

    + {% if 'tools' not in tools.hidden %} +
    +
    + + +
    +
    + {% endif %} +
    +
    + {{ user.user_name }} + +

    {{ user.full_name }}

    +
    + {% if user.flag_enabled == 0 %} + + {% endif %} + {% if user.flag_verified == 0 %} + + {% endif %} +
    +

    {{ user.user_name }}{% if 'group' not in fields.hidden %} • {{ user.group.name }}{% endif %}

    + + {% if 'email' not in fields.hidden %} +
    + {{ translate("EMAIL") }} +

    + + {{ user.email }} +

    + {% endif %} + + {% if 'locale' not in fields.hidden %} +
    + {{ translate("LOCALE") }} +

    + {{ locales[user.locale] }} +

    + {% endif %} + + {% block user_profile %}{% endblock %} + + {% if 'roles' not in fields.hidden %} +
    + {{ translate("ROLE", 2) }} + +

    + {% for role in user.roles %} + {{ role.name }} + {% endfor %} +

    + {% endif %} +
    +
    + {% endblock %} +
    +
    + {% if 'activities' not in widgets.hidden %} +
    + {% block activity_box %} +
    +
    +

    {{ translate('ACTIVITY', 2) }}

    + {% include "tables/table-tool-menu.html.twig" %} +
    +
    + {% include "tables/activities.html.twig" with { + "table" : { + "id" : "table-user-activities" + } + } %} +
    +
    + {% endblock %} +
    + {% endif %} +
    + {% if 'permissions' not in widgets.hidden %} +
    +
    +
    +
    +

    {{ translate('PERMISSION', 2) }} +

    + {% include "tables/table-tool-menu.html.twig" %} +
    +
    + {% include "tables/permissions.html.twig" with { + "table" : { + "id" : "table-permissions", + "columns" : ["via_roles"] + } + } %} +
    +
    +
    +
    + {% endif %} +{% endblock %} +{% block scripts_page %} + + + + + {{ assets.js('js/form-widgets') | raw }} + + + {{ assets.js('js/pages/user') | raw }} +{% endblock %} diff --git a/main/app/sprinkles/admin/templates/pages/users.html.twig b/main/app/sprinkles/admin/templates/pages/users.html.twig index cbd86f4..5aacfc2 100644 --- a/main/app/sprinkles/admin/templates/pages/users.html.twig +++ b/main/app/sprinkles/admin/templates/pages/users.html.twig @@ -1,52 +1,52 @@ -{% extends "pages/abstract/dashboard.html.twig" %} - -{% block stylesheets_page %} - - {{ assets.css('css/form-widgets') | raw }} -{% endblock %} - -{# Overrides blocks in head of base template #} -{% block page_title %}{{ translate("USER", 2) }}{% endblock %} - -{% block page_description %}{{ translate("USER.PAGE_DESCRIPTION") }}{% endblock %} - -{% block body_matter %} -
    -
    -
    -
    -

    {{ translate('USER', 2) }}

    - {% include "tables/table-tool-menu.html.twig" %} -
    -
    - {% include "tables/users.html.twig" with { - "table" : { - "id" : "table-users", - "columns" : ["last_activity"] - } - } %} -
    - {% if checkAccess('create_user') %} - - {% endif %} -
    -
    -
    -{% endblock %} -{% block scripts_page %} - - - - - {{ assets.js('js/form-widgets') | raw }} - - - {{ assets.js('js/pages/users') | raw }} - -{% endblock %} +{% extends "pages/abstract/dashboard.html.twig" %} + +{% block stylesheets_page %} + + {{ assets.css('css/form-widgets') | raw }} +{% endblock %} + +{# Overrides blocks in head of base template #} +{% block page_title %}{{ translate("USER", 2) }}{% endblock %} + +{% block page_description %}{{ translate("USER.PAGE_DESCRIPTION") }}{% endblock %} + +{% block body_matter %} +
    +
    +
    +
    +

    {{ translate('USER', 2) }}

    + {% include "tables/table-tool-menu.html.twig" %} +
    +
    + {% include "tables/users.html.twig" with { + "table" : { + "id" : "table-users", + "columns" : ["last_activity"] + } + } %} +
    + {% if checkAccess('create_user') %} + + {% endif %} +
    +
    +
    +{% endblock %} +{% block scripts_page %} + + + + + {{ assets.js('js/form-widgets') | raw }} + + + {{ assets.js('js/pages/users') | raw }} + +{% endblock %} diff --git a/main/app/sprinkles/admin/templates/tables/activities.html.twig b/main/app/sprinkles/admin/templates/tables/activities.html.twig index dce1d99..0da5601 100644 --- a/main/app/sprinkles/admin/templates/tables/activities.html.twig +++ b/main/app/sprinkles/admin/templates/tables/activities.html.twig @@ -1,80 +1,80 @@ -{# This partial template renders a table of user activities, to be populated with rows via an AJAX request. - # This extends a generic template for paginated tables. - # - # Note that this template contains a "skeleton" table with an empty table body, and then a block of Handlebars templates which are used - # to render the table cells with the data from the AJAX request. -#} - -{% extends "tables/table-paginated.html.twig" %} - -{% block table %} - - - - - {% if 'user' in table.columns %} - - {% endif %} - - - - - -
    {{ translate('ACTIVITY.TIME') }} {{ translate('USER') }} {{ translate("DESCRIPTION") }}
    -{% endblock %} - -{% block table_cell_templates %} - {# This contains a series of - - - - - {% endverbatim %} -{% endblock %} +{# This partial template renders a table of user activities, to be populated with rows via an AJAX request. + # This extends a generic template for paginated tables. + # + # Note that this template contains a "skeleton" table with an empty table body, and then a block of Handlebars templates which are used + # to render the table cells with the data from the AJAX request. +#} + +{% extends "tables/table-paginated.html.twig" %} + +{% block table %} + + + + + {% if 'user' in table.columns %} + + {% endif %} + + + + + +
    {{ translate('ACTIVITY.TIME') }} {{ translate('USER') }} {{ translate("DESCRIPTION") }}
    +{% endblock %} + +{% block table_cell_templates %} + {# This contains a series of + + + + + {% endverbatim %} +{% endblock %} diff --git a/main/app/sprinkles/admin/templates/tables/groups.html.twig b/main/app/sprinkles/admin/templates/tables/groups.html.twig index 8d14e98..e25d4c2 100644 --- a/main/app/sprinkles/admin/templates/tables/groups.html.twig +++ b/main/app/sprinkles/admin/templates/tables/groups.html.twig @@ -1,74 +1,74 @@ -{# This partial template renders a table of groups, to be populated with rows via an AJAX request. - # This extends a generic template for paginated tables. - # - # Note that this template contains a "skeleton" table with an empty table body, and then a block of Handlebars templates which are used - # to render the table cells with the data from the AJAX request. -#} - -{% extends "tables/table-paginated.html.twig" %} - -{% block table %} - - - - - - - - - - -
    {{ translate('GROUP') }} {{ translate("DESCRIPTION") }} {{ translate("ACTIONS") }}
    -{% endblock %} - -{% block table_cell_templates %} - {# This contains a series of - - - - - {% endverbatim %} -{% endblock %} +{# This partial template renders a table of groups, to be populated with rows via an AJAX request. + # This extends a generic template for paginated tables. + # + # Note that this template contains a "skeleton" table with an empty table body, and then a block of Handlebars templates which are used + # to render the table cells with the data from the AJAX request. +#} + +{% extends "tables/table-paginated.html.twig" %} + +{% block table %} + + + + + + + + + + +
    {{ translate('GROUP') }} {{ translate("DESCRIPTION") }} {{ translate("ACTIONS") }}
    +{% endblock %} + +{% block table_cell_templates %} + {# This contains a series of + + + + + {% endverbatim %} +{% endblock %} diff --git a/main/app/sprinkles/admin/templates/tables/permissions.html.twig b/main/app/sprinkles/admin/templates/tables/permissions.html.twig index 6ff13c6..48f3afa 100644 --- a/main/app/sprinkles/admin/templates/tables/permissions.html.twig +++ b/main/app/sprinkles/admin/templates/tables/permissions.html.twig @@ -1,71 +1,71 @@ -{# This partial template renders a table of permissions, to be populated with rows via an AJAX request. - # This extends a generic template for paginated tables. - # - # Note that this template contains a "skeleton" table with an empty table body, and then a block of Handlebars templates which are used - # to render the table cells with the data from the AJAX request. -#} - -{% extends "tables/table-paginated.html.twig" %} - -{% block table %} - - - - - - {% if 'via_roles' in table.columns %} - - {% endif %} - - - - -
    {{ translate('PERMISSION') }} {{ translate('SLUG_CONDITION') }} {{ translate('PERMISSION.VIA_ROLES') }}
    -{% endblock %} - -{% block table_cell_templates %} - {# This contains a series of - - - - - {% endverbatim %} -{% endblock %} +{# This partial template renders a table of permissions, to be populated with rows via an AJAX request. + # This extends a generic template for paginated tables. + # + # Note that this template contains a "skeleton" table with an empty table body, and then a block of Handlebars templates which are used + # to render the table cells with the data from the AJAX request. +#} + +{% extends "tables/table-paginated.html.twig" %} + +{% block table %} + + + + + + {% if 'via_roles' in table.columns %} + + {% endif %} + + + + +
    {{ translate('PERMISSION') }} {{ translate('SLUG_CONDITION') }} {{ translate('PERMISSION.VIA_ROLES') }}
    +{% endblock %} + +{% block table_cell_templates %} + {# This contains a series of + + + + + {% endverbatim %} +{% endblock %} diff --git a/main/app/sprinkles/admin/templates/tables/roles.html.twig b/main/app/sprinkles/admin/templates/tables/roles.html.twig index f8e136b..088052e 100644 --- a/main/app/sprinkles/admin/templates/tables/roles.html.twig +++ b/main/app/sprinkles/admin/templates/tables/roles.html.twig @@ -1,79 +1,79 @@ -{# This partial template renders a table of roles, to be populated with rows via an AJAX request. - # This extends a generic template for paginated tables. - # - # Note that this template contains a "skeleton" table with an empty table body, and then a block of Handlebars templates which are used - # to render the table cells with the data from the AJAX request. -#} - -{% extends "tables/table-paginated.html.twig" %} - -{% block table %} - - - - - - - - - - -
    {{ translate('ROLE') }} {{ translate('DESCRIPTION') }} {{ translate('ACTIONS') }}
    -{% endblock %} - -{% block table_cell_templates %} - {# This contains a series of - - - - - {% endverbatim %} -{% endblock %} +{# This partial template renders a table of roles, to be populated with rows via an AJAX request. + # This extends a generic template for paginated tables. + # + # Note that this template contains a "skeleton" table with an empty table body, and then a block of Handlebars templates which are used + # to render the table cells with the data from the AJAX request. +#} + +{% extends "tables/table-paginated.html.twig" %} + +{% block table %} + + + + + + + + + + +
    {{ translate('ROLE') }} {{ translate('DESCRIPTION') }} {{ translate('ACTIONS') }}
    +{% endblock %} + +{% block table_cell_templates %} + {# This contains a series of + + + + + {% endverbatim %} +{% endblock %} diff --git a/main/app/sprinkles/admin/templates/tables/users.html.twig b/main/app/sprinkles/admin/templates/tables/users.html.twig index bd9fffe..aae91d0 100644 --- a/main/app/sprinkles/admin/templates/tables/users.html.twig +++ b/main/app/sprinkles/admin/templates/tables/users.html.twig @@ -1,157 +1,157 @@ -{# This partial template renders a table of users, to be populated with rows via an AJAX request. - # This extends a generic template for paginated tables. - # - # Note that this template contains a "skeleton" table with an empty table body, and then a block of Handlebars templates which are used - # to render the table cells with the data from the AJAX request. -#} - -{% extends "tables/table-paginated.html.twig" %} - -{% block table %} - - - - - {% if 'last_activity' in table.columns %} - - {% endif %} - {% if 'via_roles' in table.columns %} - - {% endif %} - - - - - - -
    {{ translate('USER') }} {{ translate("ACTIVITY.LAST") }} {{ translate('PERMISSION.VIA_ROLES') }}{{ translate("STATUS") }} {{ translate("ACTIONS") }}
    -{% endblock %} - -{% block table_cell_templates %} - {# This contains a series of - - - - - - - - {% endverbatim %} -{% endblock %} +{# This partial template renders a table of users, to be populated with rows via an AJAX request. + # This extends a generic template for paginated tables. + # + # Note that this template contains a "skeleton" table with an empty table body, and then a block of Handlebars templates which are used + # to render the table cells with the data from the AJAX request. +#} + +{% extends "tables/table-paginated.html.twig" %} + +{% block table %} + + + + + {% if 'last_activity' in table.columns %} + + {% endif %} + {% if 'via_roles' in table.columns %} + + {% endif %} + + + + + + +
    {{ translate('USER') }} {{ translate("ACTIVITY.LAST") }} {{ translate('PERMISSION.VIA_ROLES') }}{{ translate("STATUS") }} {{ translate("ACTIONS") }}
    +{% endblock %} + +{% block table_cell_templates %} + {# This contains a series of + + + + + + + + {% endverbatim %} +{% endblock %} diff --git a/main/app/sprinkles/admin/tests/Integration/SprunjeTests.php b/main/app/sprinkles/admin/tests/Integration/SprunjeTests.php index 47106e0..54a373d 100644 --- a/main/app/sprinkles/admin/tests/Integration/SprunjeTests.php +++ b/main/app/sprinkles/admin/tests/Integration/SprunjeTests.php @@ -1,109 +1,109 @@ -classMapper = new ClassMapper(); - } - - /** - * Tests... - */ - public function testUserPermissionSprunje() { - $fm = $this->ci->factory; - - // Generate some test models - $users = $fm->seed(3, 'UserFrosting\Sprinkle\Account\Database\Models\User'); - $roles = $fm->seed(3, 'UserFrosting\Sprinkle\Account\Database\Models\Role'); - $permissions = $fm->seed(3, 'UserFrosting\Sprinkle\Account\Database\Models\Permission'); - - // Create some relationships - $roles[0]->permissions()->attach($permissions[1]); - $roles[0]->permissions()->attach($permissions[2]); - $roles[1]->permissions()->attach($permissions[2]); - $roles[2]->permissions()->attach($permissions[0]); - $roles[2]->permissions()->attach($permissions[1]); - - $users[0]->roles()->attach($roles[1]); - $users[0]->roles()->attach($roles[2]); - $users[1]->roles()->attach($roles[0]); - $users[1]->roles()->attach($roles[1]); - $users[2]->roles()->attach($roles[1]); - - $this->classMapper->setClassMapping('user', 'UserFrosting\Sprinkle\Account\Database\Models\User'); - - // Test user 0 - $sprunje = new UserPermissionSprunje($this->classMapper, [ - 'user_id' => $users[0]->id - ]); - - list($count, $countFiltered, $models) = $sprunje->getModels(); - - // Check that counts are correct - $this->assertEquals(count($models), $count); - $this->assertEquals(count($models), $countFiltered); - - // Ignore pivot and roles_via. These are covered by the tests for the relationships themselves. - static::ignoreRelations($models); - $this->assertCollectionsSame(collect($permissions), $models); - - // Test user 1 - $sprunje = new UserPermissionSprunje($this->classMapper, [ - 'user_id' => $users[1]->id - ]); - - list($count, $countFiltered, $models) = $sprunje->getModels(); - - // Check that counts are correct - $this->assertEquals(count($models), $count); - $this->assertEquals(count($models), $countFiltered); - - // Ignore pivot and roles_via. These are covered by the tests for the relationships themselves. - static::ignoreRelations($models); - $this->assertCollectionsSame(collect([ - $permissions[1], - $permissions[2] - ]), $models); - - // Test user 2 - $sprunje = new UserPermissionSprunje($this->classMapper, [ - 'user_id' => $users[2]->id - ]); - - list($count, $countFiltered, $models) = $sprunje->getModels(); - - // Check that counts are correct - $this->assertEquals(count($models), $count); - $this->assertEquals(count($models), $countFiltered); - - // Ignore pivot and roles_via. These are covered by the tests for the relationships themselves. - static::ignoreRelations($models); - $this->assertCollectionsSame(collect([ - $permissions[2] - ]), $models); - } -} +classMapper = new ClassMapper(); + } + + /** + * Tests... + */ + public function testUserPermissionSprunje() { + $fm = $this->ci->factory; + + // Generate some test models + $users = $fm->seed(3, 'UserFrosting\Sprinkle\Account\Database\Models\User'); + $roles = $fm->seed(3, 'UserFrosting\Sprinkle\Account\Database\Models\Role'); + $permissions = $fm->seed(3, 'UserFrosting\Sprinkle\Account\Database\Models\Permission'); + + // Create some relationships + $roles[0]->permissions()->attach($permissions[1]); + $roles[0]->permissions()->attach($permissions[2]); + $roles[1]->permissions()->attach($permissions[2]); + $roles[2]->permissions()->attach($permissions[0]); + $roles[2]->permissions()->attach($permissions[1]); + + $users[0]->roles()->attach($roles[1]); + $users[0]->roles()->attach($roles[2]); + $users[1]->roles()->attach($roles[0]); + $users[1]->roles()->attach($roles[1]); + $users[2]->roles()->attach($roles[1]); + + $this->classMapper->setClassMapping('user', 'UserFrosting\Sprinkle\Account\Database\Models\User'); + + // Test user 0 + $sprunje = new UserPermissionSprunje($this->classMapper, [ + 'user_id' => $users[0]->id + ]); + + list($count, $countFiltered, $models) = $sprunje->getModels(); + + // Check that counts are correct + $this->assertEquals(count($models), $count); + $this->assertEquals(count($models), $countFiltered); + + // Ignore pivot and roles_via. These are covered by the tests for the relationships themselves. + static::ignoreRelations($models); + $this->assertCollectionsSame(collect($permissions), $models); + + // Test user 1 + $sprunje = new UserPermissionSprunje($this->classMapper, [ + 'user_id' => $users[1]->id + ]); + + list($count, $countFiltered, $models) = $sprunje->getModels(); + + // Check that counts are correct + $this->assertEquals(count($models), $count); + $this->assertEquals(count($models), $countFiltered); + + // Ignore pivot and roles_via. These are covered by the tests for the relationships themselves. + static::ignoreRelations($models); + $this->assertCollectionsSame(collect([ + $permissions[1], + $permissions[2] + ]), $models); + + // Test user 2 + $sprunje = new UserPermissionSprunje($this->classMapper, [ + 'user_id' => $users[2]->id + ]); + + list($count, $countFiltered, $models) = $sprunje->getModels(); + + // Check that counts are correct + $this->assertEquals(count($models), $count); + $this->assertEquals(count($models), $countFiltered); + + // Ignore pivot and roles_via. These are covered by the tests for the relationships themselves. + static::ignoreRelations($models); + $this->assertCollectionsSame(collect([ + $permissions[2] + ]), $models); + } +} -- cgit v1.2.3