diff --git a/module/user/config.php b/module/user/config.php index 7277325384..24065786c8 100644 --- a/module/user/config.php +++ b/module/user/config.php @@ -4,7 +4,7 @@ $config->user->create = new stdclass(); $config->user->edit = new stdclass(); $config->user->create->requiredFields = 'account,realname,visions,password,password1,password2'; -$config->user->edit->requiredFields = 'account,realname,visions'; +$config->user->edit->requiredFields = 'account,realname,visions,verifyPassword'; $config->user->availableBatchCreateFields = 'dept,email,gender,commiter,join,skype,qq,dingding,weixin,mobile,slack,whatsapp,phone,address,zipcode'; $config->user->availableBatchEditFields = 'dept,email,commiter,skype,qq,dingding,weixin,mobile,slack,whatsapp,phone,address,zipcode'; diff --git a/module/user/js/common.ui.js b/module/user/js/common.ui.js index c1e26662dd..fefec2daa8 100644 --- a/module/user/js/common.ui.js +++ b/module/user/js/common.ui.js @@ -67,3 +67,24 @@ $(document).ready(function() verifyEncrypted = true; }); }); + +/** + * Check password strength. + * + * @param event $event + * @access public + * @return void + */ +function checkPassword(event) +{ + let password = $(event.target).val(); + $('#passwordStrength').html(password == '' ? '' : passwordStrengthList[computePasswordStrength(password)]); + if(password == '') + { + $('#passwordStrength').addClass('hidden'); + } + else + { + $('#passwordStrength').removeClass('hidden'); + } +} diff --git a/module/user/js/edit.ui.js b/module/user/js/edit.ui.js new file mode 100644 index 0000000000..5b827175c5 --- /dev/null +++ b/module/user/js/edit.ui.js @@ -0,0 +1,112 @@ +$(function() +{ + password1Encrypted = false; + password2Encrypted = false; + changeType(); + updateGroup(); +}); + +/** + * When password1 change. + * + * @access public + * @return void + */ +function password1Change() +{ + password1Encrypted = false; +} + +/** + * When password2 change. + * + * @access public + * @return void + */ +function password2Change() +{ + password2Encrypted = false; +} + +function computePassword() +{ + if(!password1Encrypted || !password2Encrypted) + { + var password1 = $('#password1').val().trim(); + var password2 = $('#password2').val().trim(); + if(!password1Encrypted) + { + $("#passwordStrength").val(computePasswordStrength(password1)); + $("#passwordLength").val(password1.length); + } + + + var rand = $('input#verifyRand').val(); + if(password1 && !password1Encrypted) $('#password1').val(md5(password1) + rand); + if(password2 && !password2Encrypted) $('#password2').val(md5(password2) + rand); + password1Encrypted = true; + password2Encrypted = true; + } +} + +/** + * Show or hide companies based on user type. + * + * @param event $event + * @access public + * @return void + */ +function changeType(event) +{ + let $typeGroup = event != undefined ? $(event.target).closest('.form-group') : $('input[name="type"]').closest('.form-group'); + let type = $typeGroup.find('input[type="radio"]:checked').val(); + if(type == 'inside') + { + $('#company').closest('.form-group').addClass('hidden'); + $('#dept, #commiter').closest('.form-row').removeClass('hidden'); + } + else + { + $('#company').closest('.form-group').removeClass('hidden'); + $('#dept, #commiter').closest('.form-row').addClass('hidden'); + } +} + +/** + * Update groups when visions change. + * + * @param event $event + * @access public + * @return void + */ +function updateGroup(event) +{ + let visions = ''; + let group = $('#group').val(); + let $visionGroup = event != undefined ? $(event.target).closest('.form-group') : $('input[name="visions"]').closest('.form-group'); + $.each($visionGroup.find('input[type="checkbox"]:checked'), function(index) + { + if(index > 0) visions += ','; + visions += $(this).val(); + }); + $.post($.createLink('user', 'ajaxGetGroup', "visions=" + visions + '&i=' + 0 + '&selected=' + group), function(data) + { + $('#group').replaceWith(data); + }); +} + +function toggleNew(event) +{ + const $company = $('#company'); + const $newCompany = $('#newCompany'); + if($(event.target).prop('checked')) + { + $company.addClass('hidden'); + $newCompany.removeClass('hidden'); + } + else + { + $company.removeClass('hidden'); + $newCompany.addClass('hidden'); + } +} diff --git a/module/user/model.php b/module/user/model.php index dfd14f1dfb..b0d5113457 100644 --- a/module/user/model.php +++ b/module/user/model.php @@ -559,7 +559,7 @@ class userModel extends model ->setIF($this->post->password1 != false, 'password', substr($this->post->password1, 0, 32)) ->setIF($this->post->email != false, 'email', trim($this->post->email)) ->join('visions', ',') - ->remove('new, password1, password2, groups,verifyPassword, passwordStrength,passwordLength') + ->remove('new, password1, password2, group, verifyPassword, passwordStrength,passwordLength, verifyRand, newCompany') ->get(); if(empty($_POST['verifyPassword']) or $this->post->verifyPassword != md5($this->app->user->password . $this->session->rand)) @@ -570,14 +570,14 @@ class userModel extends model if(isset($_POST['new'])) { - if(empty($user->company)) + if(empty($_POST['newCompany'])) { - dao::$errors['company'][] = $this->lang->user->error->companyEmpty; + dao::$errors['newCompany'][] = $this->lang->user->error->companyEmpty; return false; } $company = new stdClass(); - $company->name = $user->company; + $company->name = $_POST['newCompany']; $this->dao->insert(TABLE_COMPANY)->data($company)->exec(); $user->company = $this->dao->lastInsertID(); @@ -616,7 +616,7 @@ class userModel extends model } $oldGroups = $this->dao->select('`group`')->from(TABLE_USERGROUP)->where('account')->eq($this->post->account)->fetchPairs('group', 'group'); - $newGroups = zget($_POST, 'groups', array()); + $newGroups = zget($_POST, 'group', array()); sort($oldGroups); sort($newGroups); @@ -627,9 +627,9 @@ class userModel extends model $this->dao->delete()->from(TABLE_USERGROUP)->where('account')->eq($this->post->account)->exec(); /* Set usergroup for account. */ - if(isset($_POST['groups'])) + if(isset($_POST['group'])) { - foreach($this->post->groups as $groupID) + foreach($this->post->group as $groupID) { $data = new stdclass(); $data->account = $this->post->account; diff --git a/module/user/ui/edit.html.php b/module/user/ui/edit.html.php new file mode 100644 index 0000000000..bf424a9376 --- /dev/null +++ b/module/user/ui/edit.html.php @@ -0,0 +1,310 @@ + + * @package user + * @link https://www.zentao.net + */ +namespace zin; + +jsVar('passwordStrengthList', $lang->user->passwordStrengthList); + +$contacts = array(); +if(!empty($config->user->contactField)) +{ + foreach(explode(',', $config->user->contactField) as $i => $field) + { + if($i % 2 == 0) $contactGroup = array(); + + $contactGroup[] = formGroup + ( + set::width('1/2'), + set::label($lang->user->{$field}), + set::name($field), + set::value($user->{$field}), + ); + + if($i % 2 == 1) $contacts[] = formRow($contactGroup); + } +} + +formPanel +( + import('/js/md5.js', 'js'), + to::heading + ( + div + ( + setClass('flex items-center gap-2'), + $lang->user->edit, + entityLabel + ( + set::level(1), + set::text($user->realname), + ), + ), + ), + set::formClass('border-0'), + on::click('button[type="submit"]', 'computePassword'), + formRow + ( + formGroup + ( + set::width('1/2'), + set::label($lang->user->realname), + set::name('realname'), + set::value($user->realname) + ), + formGroup + ( + set::width('1/2'), + set::label($lang->user->role), + set::control('select'), + set::name('role'), + set::items($lang->user->roleList), + set::value($user->role), + ) + ), + formRow + ( + formGroup + ( + set::width('1/2'), + set::label($lang->user->dept), + set::control('select'), + set::name('dept'), + set::items($depts), + set::value($user->dept) + ), + formGroup + ( + set::width('1/2'), + set::label($lang->user->join), + set::control('date'), + set::name('join'), + set::value($user->join) + ), + ), + formRow + ( + formGroup + ( + set::width('1/2'), + set::label($lang->user->group), + select + ( + set::name('group'), + set::items($groups), + set::value($userGroups), + set::multiple(true), + ), + ), + formGroup + ( + set::width('1/2'), + set::label($lang->user->company), + inputGroup + ( + select + ( + set::name('company'), + set::items($companies), + set::value($user->company) + ), + input + ( + set::name('newCompany'), + set::value(''), + setClass('hidden'), + ), + checkbox + ( + on::change('toggleNew'), + set::id('new'), + set::name('new'), + set::value(0), + set::text($lang->company->create), + set::rootClass('btn'), + width('96px'), + ), + ), + ), + ), + formRow + ( + formGroup + ( + set::width('1/2'), + set::label($lang->user->type), + radioList + ( + on::click('changeType'), + set::inline(true), + set::name('type'), + set::items($lang->user->typeList), + set::value($user->type) + ), + ), + formGroup + ( + set::width('1/2'), + set::label($lang->user->gender), + radioList + ( + set::inline(true), + set::name('gender'), + set::items($lang->user->genderList), + set::value($user->gender) + ), + ), + ), + formRow + ( + setClass('border-b border-b-1'), + div + ( + setClass('bg-lighter font-black px-3 py-1'), + $lang->user->accountInfo + ), + ), + formRow + ( + formGroup + ( + set::width('1/2'), + set::label($lang->user->account), + set::name('account'), + set::value($user->account) + ), + formGroup + ( + set::width('1/2'), + set::label($lang->user->email), + set::name('email'), + set::value($user->email), + ) + ), + formRow + ( + formGroup + ( + on::change('password1Change'), + set::width('1/2'), + set::label($lang->user->password), + inputGroup + ( + input + ( + on::keyup('checkPassword'), + set::id('password1'), + set::name('password1'), + set::value(''), + set::placeholder(zget($lang->user->placeholder->passwordStrength, $config->safe->mode, '')), + ), + span + ( + setClass('input-group-addon hidden'), + set::id('passwordStrength'), + ), + ), + ), + formGroup + ( + on::change('password2Change'), + set::width('1/2'), + set::label($lang->user->password2), + set::name('password2'), + set::value(''), + ) + ), + formRow + ( + formGroup + ( + set::width('1/2'), + set::label($lang->user->commiter), + set::name('commiter'), + set::value($user->commiter), + ), + formGroup + ( + set::width('1/2'), + set::label($lang->user->visions), + checkList + ( + on::click('updateGroup'), + set::name('visions'), + set::items($visionList), + set::value($user->visions), + set::inline(true), + ), + ) + ), + formRow + ( + setClass('border-b border-b-1'), + div + ( + setClass('bg-lighter font-black px-3 py-1'), + $lang->user->contactInfo + ), + ), + $contacts, + formRow + ( + formGroup + ( + set::width('1/2'), + set::label($lang->user->address), + set::name('address'), + set::value($user->address), + ), + formGroup + ( + set::width('1/2'), + set::label($lang->user->zipcode), + set::name('zipcode'), + set::value($user->zipcode), + ) + ), + formRow + ( + setClass('border-b border-b-1'), + div + ( + setClass('bg-lighter font-black px-3 py-1'), + $lang->user->verify + ), + ), + formRow + ( + formGroup + ( + set::width('1/2'), + set::label($lang->user->verifyPassword), + set::name('verifyPassword'), + set::value(''), + set::placeholder($lang->user->placeholder->verify), + ), + ), + formRow + ( + setClass('hidden'), + formGroup + ( + set::name('passwordLength'), + set::value(0), + ), + formGroup + ( + set::name('verifyRand'), + set::value($rand), + ), + ), +); + +render(); +