allow users to change the localization

This commit is contained in:
Dennis Eichhorn 2020-03-22 17:02:37 +01:00
parent d732982fb5
commit e35e530f7f
7 changed files with 198 additions and 30 deletions

View File

@ -6,7 +6,7 @@ use phpOMS\Account\PermissionType;
use phpOMS\Router\RouteVerb;
return [
'^.*/admin/settings.*$' => [
'^.*/admin/settings(\?.*|$)' => [
[
'dest' => '\Modules\Admin\Controller\ApiController:apiSettingsSet',
'verb' => RouteVerb::SET,
@ -66,7 +66,7 @@ return [
],
],
'^.*/admin/find/account.*$' => [
'^.*/admin/find/account(\?.*|$)' => [
[
'dest' => '\Modules\Admin\Controller\ApiController:apiAccountFind',
'verb' => RouteVerb::GET,
@ -100,7 +100,7 @@ return [
],
],
'^.*/admin/account$' => [
'^.*/admin/account(\?.*|$)' => [
[
'dest' => '\Modules\Admin\Controller\ApiController:apiAccountCreate',
'verb' => RouteVerb::PUT,

View File

@ -24,6 +24,7 @@ use Modules\Admin\Models\Group;
use Modules\Admin\Models\GroupMapper;
use Modules\Admin\Models\GroupPermission;
use Modules\Admin\Models\GroupPermissionMapper;
use Modules\Admin\Models\LocalizationMapper;
use Modules\Admin\Models\ModuleStatusUpdateType;
use Modules\Admin\Models\NullAccount;
@ -49,6 +50,8 @@ use phpOMS\Uri\HttpUri;
use phpOMS\Utils\Parser\Markdown\Markdown;
use phpOMS\Validation\Network\Email;
use phpOMS\Version\Version;
use phpOMS\Account\PermissionType;
use Modules\Admin\Models\PermissionState;
/**
* Admin controller class.
@ -131,13 +134,145 @@ final class ApiController extends Controller
$this->app->appSettings->get($id, $name, $module, $group, $account),
$data,
function() use($id, $name, $content, $module, $group, $account) : void {
$this->app->appSettings->set([['id' => $id, 'name' => $name, 'content' => $content, 'module' => $module, 'group' => $group, 'account' => $account]], true);
$this->app->appSettings->set([
[
'id' => $id,
'name' => $name,
'content' => $content,
'module' => $module,
'group' => $group,
'account' => $account
]
], true);
},
'settings'
);
}
$this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Settigns', 'Settings successfully modified', $dataSettings);
$this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Settings', 'Settings successfully modified', $dataSettings);
}
/**
* Api method for modifying account localization
*
* @param RequestAbstract $request Request
* @param ResponseAbstract $response Response
* @param mixed $data Generic data
*
* @return void
*
* @api
*
* @since 1.0.0
*/
public function apiSettingsAccountLocalizationSet(RequestAbstract $request, ResponseAbstract $response, $data = null) : void
{
$requestAccount = $request->getHeader()->getAccount();
$accountId = (int) $request->getData('account_id');
if ($requestAccount !== $accountId
&& !$this->app->accountManager->get($accountId)->hasPermission(
PermissionType::MODIFY, $this->app->orgId, $this->app->appName, self::MODULE_NAME, PermissionState::ACCOUNT_SETTINGS, $accountId)
) {
$this->fillJsonResponse($request, $response, NotificationLevel::HIDDEN, '', '', []);
return;
}
/** @var Localization #l11n */
$l11n = AccountMapper::get($accountId)->getL11n();
if ((bool) ($request->getData('load') ?? false)) {
$locale = \explode('_', $request->getData('localization_load'));
$l11n->loadFromLanguage($locale[0], $locale[1]);
LocalizationMapper::update($l11n);
$this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Localization', 'Localization successfully modified', $l11n);
return;
}
$dataSettings = $request->getLike('settings_(.*)');
$l11n->setCountry($dataSettings['settings_country']);
$l11n->setLanguage($dataSettings['settings_language']);
$l11n->setTemperature($dataSettings['settings_temperature']);
$l11n->setTimezone($dataSettings['settings_timezone']);
$l11n->setDatetime(
[
'very_short' => $dataSettings['settings_timeformat_vs'],
'short' => $dataSettings['settings_timeformat_s'],
'medium' => $dataSettings['settings_timeformat_m'],
'long' => $dataSettings['settings_timeformat_l'],
'very_long' => $dataSettings['settings_timeformat_vl'],
]
);
$l11n->setCurrency($dataSettings['settings_currency']);
$l11n->setCurrencyFormat($dataSettings['settings_currencyformat']);
$l11n->setDecimal($dataSettings['settings_decimal']);
$l11n->setThousands($dataSettings['settings_thousands']);
$l11n->setWeight(
[
'very_light' => $dataSettings['settings_weight_vl'],
'light' => $dataSettings['settings_weight_l'],
'medium' => $dataSettings['settings_weight_m'],
'heavy' => $dataSettings['settings_weight_h'],
'very_heavy' => $dataSettings['settings_weight_vh'],
]
);
$l11n->setSpeed(
[
'very_slow' => $dataSettings['settings_speed_vs'],
'slow' => $dataSettings['settings_speed_s'],
'medium' => $dataSettings['settings_speed_m'],
'fast' => $dataSettings['settings_speed_f'],
'very_fast' => $dataSettings['settings_speed_vf'],
'sea' => $dataSettings['settings_speed_sea'],
]
);
$l11n->setLength(
[
'very_short' => $dataSettings['settings_length_vs'],
'short' => $dataSettings['settings_length_s'],
'medium' => $dataSettings['settings_length_m'],
'long' => $dataSettings['settings_length_l'],
'very_long' => $dataSettings['settings_length_vl'],
'sea' => $dataSettings['settings_length_sea'],
]
);
$l11n->setArea(
[
'very_small' => $dataSettings['settings_area_vs'],
'small' => $dataSettings['settings_area_s'],
'medium' => $dataSettings['settings_area_m'],
'large' => $dataSettings['settings_area_l'],
'very_large' => $dataSettings['settings_area_vl'],
]
);
$l11n->setVolume(
[
'very_small' => $dataSettings['settings_volume_vs'],
'small' => $dataSettings['settings_volume_s'],
'medium' => $dataSettings['settings_volume_m'],
'large' => $dataSettings['settings_volume_l'],
'very_large' => $dataSettings['settings_volume_vl'],
'tablespoon' => $dataSettings['settings_volume_tablespoon'],
'teaspoon' => $dataSettings['settings_volume_teaspoon'],
'glass' => $dataSettings['settings_volume_glass'],
]
);
LocalizationMapper::update($l11n);
$this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Localization', 'Localization successfully modified', $l11n);
}
/**

View File

@ -114,8 +114,12 @@ final class BackendController extends Controller
$view = new View($this->app->l11nManager, $request, $response);
$view->setTemplate('/Modules/Admin/Theme/Backend/accounts-list');
$view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1000104001, $request, $response));
$view->setData('list:elements', AccountMapper::getNewest(50, null, RelationType::NONE));
$view->setData('list:count', 1);
if ($request->getData('ptype') === '-') {
$view->setData('accounts', AccountMapper::getBeforePivot((int) ($request->getData('id') ?? 0), null, 25));
} else {
$view->setData('accounts', AccountMapper::getAfterPivot((int) ($request->getData('id') ?? 0), null, 25));
}
return $view;
}

View File

@ -14,6 +14,7 @@ declare(strict_types=1);
namespace Modules\Admin\Models;
use phpOMS\Account\AccountStatus;
use phpOMS\Auth\LoginReturnType;
use phpOMS\DataStorage\Database\DataMapperAbstract;
use phpOMS\DataStorage\Database\Query\Builder;
@ -115,7 +116,12 @@ final class AccountMapper extends DataMapperAbstract
public static function getWithPermissions(int $id) : Account
{
$account = self::get($id);
$groupPermissions = GroupPermissionMapper::getFor(\array_keys($account->getGroups()), 'group', RelationType::ALL, 2);
$groupPermissions = GroupPermissionMapper::getFor(
\array_keys($account->getGroups()),
'group',
RelationType::ALL,
2
);
if (\is_array($groupPermissions)) {
foreach ($groupPermissions as $permission) {
@ -158,10 +164,11 @@ final class AccountMapper extends DataMapperAbstract
$result = null;
$query = new Builder(self::$db);
$result = $query->select('account_id', 'account_login', 'account_password', 'account_password_temp', 'account_tries')
$result = $query->select('account_id', 'account_login', 'account_password', 'account_password_temp', 'account_tries', 'account_status')
->from('account')
->where('account_login', '=', $login)
->execute()->fetchAll();
->execute()
->fetchAll();
if (!isset($result[0])) {
return LoginReturnType::WRONG_USERNAME;
@ -174,16 +181,33 @@ final class AccountMapper extends DataMapperAbstract
return LoginReturnType::WRONG_INPUT_EXCEEDED;
}
if ($result['account_status'] !== AccountStatus::ACTIVE) {
return LoginReturnType::INACTIVE;
}
if (empty($result['account_password'])) {
return LoginReturnType::EMPTY_PASSWORD;
}
if (\password_verify($password, $result['account_password'] ?? '')) {
$query->update('account')
->set(['account_lactive' => new \DateTime('now')])
->where('account_login', '=', $login)
->execute();
return $result['account_id'];
}
if (!empty($result['account_password_temp']) && \password_verify($password, $result['account_password_temp'] ?? '')) {
$query->update('account')->set(['account_password_temp' => ''])->where('account_login', '=', $login)->execute();
if (!empty($result['account_password_temp'])
&& \password_verify($password, $result['account_password_temp'] ?? '')
) {
$query->update('account')
->set([
'account_password_temp' => '',
'account_lactive' => new \DateTime('now'),
])
->where('account_login', '=', $login)
->execute();
return $result['account_id'];
}

View File

@ -26,11 +26,12 @@ use phpOMS\Stdlib\Base\Enum;
*/
abstract class PermissionState extends Enum
{
public const SETTINGS = 1;
public const ACCOUNT = 2;
public const GROUP = 3;
public const MODULE = 4;
public const LOG = 5;
public const ROUTE = 6;
public const APP = 7;
public const SETTINGS = 1;
public const ACCOUNT = 2;
public const GROUP = 3;
public const MODULE = 4;
public const LOG = 5;
public const ROUTE = 6;
public const APP = 7;
public const ACCOUNT_SETTINGS = 8;
}

View File

@ -12,12 +12,18 @@
*/
declare(strict_types=1);
use \phpOMS\Account\AccountStatus;
use phpOMS\Uri\UriFactory;
use \phpOMS\Account\AccountStatus;
/**
* @var \phpOMS\Views\View $this
/**
* @var \phpOMS\Views\View $this
* @var \Modules\Admin\Models\Account[] $accounts
*/
$accounts = $this->getData('accounts') ?? [];
$previous = empty($accounts) ? '{/prefix}admin/account/list' : '{/prefix}admin/account/list?{?}&id=' . \reset($accounts)->getId() . '&ptype=-';
$next = empty($accounts) ? '{/prefix}admin/account/list' : '{/prefix}admin/account/list?{?}&id=' . \end($accounts)->getId() . '&ptype=+';
echo $this->getData('nav')->render(); ?>
<div class="row">
@ -32,10 +38,8 @@ echo $this->getData('nav')->render(); ?>
<td class="wf-100"><?= $this->getHtml('Name') ?><i class="sort-asc fa fa-chevron-up"></i><i class="sort-desc fa fa-chevron-down"></i>
<td><?= $this->getHtml('Activity') ?><i class="sort-asc fa fa-chevron-up"></i><i class="sort-desc fa fa-chevron-down"></i>
<td><?= $this->getHtml('Created') ?><i class="sort-asc fa fa-chevron-up"></i><i class="sort-desc fa fa-chevron-down"></i>
<tfoot>
<tr><td colspan="5">
<tbody>
<?php $c = 0; foreach ($this->getData('list:elements') as $key => $value) : ++$c;
<?php $c = 0; foreach ($accounts as $key => $value) : ++$c;
$url = \phpOMS\Uri\UriFactory::build('{/prefix}admin/account/settings?{?}&id=' . $value->getId());
$color = 'darkred';
if ($value->getStatus() === AccountStatus::ACTIVE) { $color = 'green'; }
@ -55,7 +59,10 @@ echo $this->getData('nav')->render(); ?>
<tr><td colspan="5" class="empty"><?= $this->getHtml('Empty', '0', '0'); ?>
<?php endif; ?>
</table>
<div class="portlet-foot"></div>
<div class="portlet-foot">
<a class="button" href="<?= UriFactory::build($previous); ?>">Previous</a>
<a class="button" href="<?= UriFactory::build($next); ?>">Next</a>
</div>
</div>
</div>
</div>

View File

@ -34,9 +34,6 @@ $isntalled = $this->getData('isntalled') ?? [];
<td class="wf-100"><?= $this->getHtml('Name') ?><i class="sort-asc fa fa-chevron-up"></i><i class="sort-desc fa fa-chevron-down"></i>
<td><?= $this->getHtml('Version') ?>
<td><?= $this->getHtml('Status') ?><i class="sort-asc fa fa-chevron-up"></i><i class="sort-desc fa fa-chevron-down"></i>
<tfoot>
<tr>
<td colspan="4">
<tbody>
<?php $count = 0; foreach ($modules as $key => $module) : ++$count;
$url = \phpOMS\Uri\UriFactory::build('{/prefix}admin/module/settings?{?}&id=' . $module['name']['internal']);