diff --git a/Admin/Install/Navigation.install.json b/Admin/Install/Navigation.install.json index 075f97e..72879f7 100644 --- a/Admin/Install/Navigation.install.json +++ b/Admin/Install/Navigation.install.json @@ -59,5 +59,50 @@ "children": [] } ] + }, + { + "id": 1000304001, + "pid": "/backend/admin/module/settings", + "type": 3, + "subtype": 1, + "name": "Overview", + "uri": "/{/lang}/backend/admin/module/settings?{?}", + "target": "self", + "icon": null, + "order": 1, + "from": "Profile", + "permission": { "type": null, "element": null }, + "parent": 1000300000, + "children": [] + }, + { + "id": 1000304002, + "pid": "/backend/admin/module/settings", + "type": 3, + "subtype": 1, + "name": "Settings", + "uri": "/{/lang}/backend/admin/module/settings/profile/settings?{?}", + "target": "self", + "icon": null, + "order": 1, + "from": "Profile", + "permission": { "type": null, "element": null }, + "parent": 1000300000, + "children": [] + }, + { + "id": 1000304003, + "pid": "/backend/admin/module/settings", + "type": 3, + "subtype": 1, + "name": "Create", + "uri": "/{/lang}/backend/admin/module/settings/profile/create?{?}", + "target": "self", + "icon": null, + "order": 2, + "from": "Profile", + "permission": { "type": null, "element": null }, + "parent": 1000300000, + "children": [] } ] diff --git a/Admin/Routes/Web/Api.php b/Admin/Routes/Web/Api.php new file mode 100644 index 0000000..d94acdb --- /dev/null +++ b/Admin/Routes/Web/Api.php @@ -0,0 +1,20 @@ + [ + [ + 'dest' => '\Modules\Profile\Controller:apiProfileCreate', + 'verb' => RouteVerb::PUT, + 'permission' => [ + 'module' => Controller::MODULE_NAME, + 'type' => PermissionType::CREATE, + 'state' => PermissionState::PROFILE, + ], + ], + ], +]; \ No newline at end of file diff --git a/Admin/Routes/Web/Backend.php b/Admin/Routes/Web/Backend.php index 6c851d6..e588c07 100644 --- a/Admin/Routes/Web/Backend.php +++ b/Admin/Routes/Web/Backend.php @@ -39,4 +39,26 @@ return [ ], ], ], + '^.*/backend/admin/module/settings/profile/settings.*$' => [ + [ + 'dest' => '\Modules\Profile\Controller:viewProfileAdminSettings', + 'verb' => RouteVerb::GET, + 'permission' => [ + 'module' => Controller::MODULE_NAME, + 'type' => PermissionType::READ, + 'state' => PermissionState::PROFILE, + ], + ], + ], + '^.*/backend/admin/module/settings/profile/create.*$' => [ + [ + 'dest' => '\Modules\Profile\Controller:viewProfileAdminCreate', + 'verb' => RouteVerb::GET, + 'permission' => [ + 'module' => Controller::MODULE_NAME, + 'type' => PermissionType::READ, + 'state' => PermissionState::PROFILE, + ], + ], + ], ]; diff --git a/Controller.php b/Controller.php index eb17503..8ee50e4 100644 --- a/Controller.php +++ b/Controller.php @@ -14,8 +14,11 @@ declare(strict_types=1); namespace Modules\Profile; +use Modules\Profile\Models\Profile; use Modules\Profile\Models\ProfileMapper; use Modules\Profile\Models\PermissionState; +use Modules\Admin\Models\AccountMapper; + use phpOMS\Account\PermissionType; use phpOMS\Message\RequestAbstract; use phpOMS\Message\ResponseAbstract; @@ -170,4 +173,99 @@ final class Controller extends ModuleAbstract implements WebInterface return $view; } + + /** + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return \Serializable + * + * @since 1.0.0 + * @codeCoverageIgnore + */ + public function viewProfileAdminSettings(RequestAbstract $request, ResponseAbstract $response, $data = null) : \Serializable + { + $view = new View($this->app, $request, $response); + $view->setTemplate('/Modules/Profile/Theme/Backend/modules-settings'); + $view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1000300000, $request, $response)); + + return $view; + } + + /** + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return \Serializable + * + * @since 1.0.0 + * @codeCoverageIgnore + */ + public function viewProfileAdminCreate(RequestAbstract $request, ResponseAbstract $response, $data = null) : \Serializable + { + $view = new View($this->app, $request, $response); + $view->setTemplate('/Modules/Profile/Theme/Backend/modules-create'); + $view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1000300000, $request, $response)); + + $accGrpSelector = new \Modules\Profile\Theme\Backend\Components\AccountGroupSelector\BaseView($this->app, $request, $response); + $view->addData('accGrpSelector', $accGrpSelector); + + return $view; + } + + /** + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return void + * + * @api + * + * @since 1.0.0 + */ + public function apiProfileCreate(RequestAbstract $request, ResponseAbstract $response, $data = null) : void + { + $profiles = $this->createProfilesFromRequest($request); + $created = []; + + foreach ($profiles as $profile) { + ProfileMapper::create($profile); + $created[] = $profile->jsonSerialize(); + } + + $response->set($request->getUri()->__toString(), $created); + } + + /** + * Method to create profile from request. + * + * @param RequestAbstract $request Request + * + * @return array + * + * @since 1.0.0 + */ + private function createProfilesFromRequest(RequestAbstract $request) : array + { + $profiles = []; + $accounts = \json_decode($request->getData('iaccount-idlist') ?? '[]', true); + + if ($accounts === false) { + return $profiles; + } + + if (\is_int($accounts)) { + $accounts = [$accounts]; + } + + foreach ($accounts as $account) { + $account = AccountMapper::get((int) $account); + $profiles[] = new Profile(AccountMapper::get((int) $account)); + } + + return $profiles; + } } diff --git a/Models/Profile.php b/Models/Profile.php index 2ee540f..e1ccac6 100644 --- a/Models/Profile.php +++ b/Models/Profile.php @@ -41,11 +41,11 @@ class Profile private $location = []; - public function __construct() + public function __construct(Account $account = null) { $this->image = new NullMedia(); $this->birthday = new \DateTime('now'); - $this->account = new Account(); + $this->account = $account ?? new Account(); } public function getId() : int @@ -92,4 +92,11 @@ class Profile { return $this->birthday; } + + public function jsonSerialize() + { + return [ + 'id' => $this->id + ]; + } } diff --git a/Theme/Backend/Components/AccountGroupSelector/base.tpl.php b/Theme/Backend/Components/AccountGroupSelector/base.tpl.php index 7c0f698..8571a87 100644 --- a/Theme/Backend/Components/AccountGroupSelector/base.tpl.php +++ b/Theme/Backend/Components/AccountGroupSelector/base.tpl.php @@ -36,7 +36,7 @@ isRequired() ? ' required' : ''; ?>> -
+
[ 'List' => 'List', + 'Overview' => 'Overview', 'Profile' => 'Profile', 'Profiles' => 'Profiles', + 'Settings' => 'Settings', ]]; diff --git a/Theme/Backend/Lang/en.lang.php b/Theme/Backend/Lang/en.lang.php index 8ef91a8..65d4efb 100644 --- a/Theme/Backend/Lang/en.lang.php +++ b/Theme/Backend/Lang/en.lang.php @@ -11,6 +11,7 @@ * @link http://website.orange-management.de */ return ['Profile' => [ + 'Account' => 'Account', 'Account/Group' => 'Account/Group', 'Activity' => 'Activity', 'Area' => 'Area', @@ -18,6 +19,7 @@ return ['Profile' => [ 'ContactInformation' => 'Contact Information', 'Community' => 'Community', 'Country' => 'Country', + 'CreateProfile' => 'Create Profile', 'Currency' => 'Currency', 'Customized' => 'Customized', 'DecimalPoint' => 'Decimal Point', diff --git a/Theme/Backend/modules-create.tpl.php b/Theme/Backend/modules-create.tpl.php new file mode 100644 index 0000000..38e0859 --- /dev/null +++ b/Theme/Backend/modules-create.tpl.php @@ -0,0 +1,23 @@ +getData('nav')->render(); +?> + +
+
+
+

getHtml('CreateProfile'); ?>

+ +
+
+ + +
+
getData('accGrpSelector')->render('iAccount', true); ?> +
+
+
+
+
+
+
\ No newline at end of file diff --git a/Theme/Backend/modules-settings.tpl.php b/Theme/Backend/modules-settings.tpl.php new file mode 100644 index 0000000..d0dd006 --- /dev/null +++ b/Theme/Backend/modules-settings.tpl.php @@ -0,0 +1,4 @@ +getData('nav')->render(); +?> \ No newline at end of file