Merge pull request #286 from nextcloud/improve-registration-submission-form

Improve registration submission form
This commit is contained in:
Joas Schilling 2021-04-07 09:30:39 +02:00 committed by GitHub
commit 9dd50b4d45
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
17 changed files with 67 additions and 38 deletions

View File

@ -1,5 +1,8 @@
module.exports = { module.exports = {
extends: [ extends: [
'@nextcloud' '@nextcloud'
] ],
globals: {
'$': true
}
}; };

4
.gitattributes vendored
View File

@ -1,2 +1,2 @@
/js/registration-settings.js binary /js/*.js binary
/js/registration-settings.js.map binary /js/*.js.map binary

View File

@ -1,3 +1,2 @@
# compiled vue templates # compiled vue templates
js/registration-settings.js js/
js/registration-settings.js.map

View File

@ -1,14 +0,0 @@
// var instead of let/const for better older browsers compatibility
var passwordTextField;
function togglePasswordTextFieldVisibility() {
if (passwordTextField.attr('type') == "password") {
passwordTextField.attr('type', 'text');
} else {
passwordTextField.attr('type', 'password');
}
}
$(document).ready(function() {
passwordTextField = $("#password");
$("#showadminpass").click(togglePasswordTextFieldVisibility);
});

2
js/registration-form.js Normal file
View File

@ -0,0 +1,2 @@
!function(){"use strict";document.addEventListener("DOMContentLoaded",(function(){var i=this;$("#showadminpass").click((function(){var t=$("#password");"password"===t.attr("type")?t.attr("type","text"):t.attr("type","password")})),$("form").submit((function(){$(i).find(":submit").attr("disabled","disabled"),$(i).find(":submit")[0].value=t("registration","Loading …")}))}))}();
//# sourceMappingURL=registration-form.js.map?v=9934ad4775c110e9376d

View File

@ -0,0 +1 @@
{"version":3,"sources":["webpack://registration/./src/form.js"],"names":["document","addEventListener","$","click","passwordTextField","attr","submit","find","value","t"],"mappings":"yBAAAA,SAASC,iBAAiB,oBAAoB,WAAW,WAExDC,EAAE,kBAAkBC,OAAM,WACzB,IAAMC,EAAoBF,EAAE,aACW,aAAnCE,EAAkBC,KAAK,QAC1BD,EAAkBC,KAAK,OAAQ,QAE/BD,EAAkBC,KAAK,OAAQ,eAKjCH,EAAE,QAAQI,QAAO,WAEhBJ,EAAE,GAAMK,KAAK,WAAWF,KAAK,WAAY,YACzCH,EAAE,GAAMK,KAAK,WAAW,GAAGC,MAAQC,EAAE,eAAgB,mB","file":"registration-form.js?v=9934ad4775c110e9376d","sourcesContent":["document.addEventListener('DOMContentLoaded', function() {\n\t// Password toggle\n\t$('#showadminpass').click(() => {\n\t\tconst passwordTextField = $('#password')\n\t\tif (passwordTextField.attr('type') === 'password') {\n\t\t\tpasswordTextField.attr('type', 'text')\n\t\t} else {\n\t\t\tpasswordTextField.attr('type', 'password')\n\t\t}\n\t})\n\n\t// Disable submit after first click\n\t$('form').submit(() => {\n\t\t// prevent duplicate form submissions\n\t\t$(this).find(':submit').attr('disabled', 'disabled')\n\t\t$(this).find(':submit')[0].value = t('registration', 'Loading …')\n\t})\n})\n"],"sourceRoot":""}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -236,8 +236,10 @@ class RegisterController extends Controller {
'loginname' => $loginname, 'loginname' => $loginname,
'fullname' => $fullname, 'fullname' => $fullname,
'show_fullname' => $this->config->getAppValue('registration', 'show_fullname', 'no') === 'yes', 'show_fullname' => $this->config->getAppValue('registration', 'show_fullname', 'no') === 'yes',
'enforce_fullname' => $this->config->getAppValue('registration', 'enforce_fullname', 'no') === 'yes',
'phone' => $phone, 'phone' => $phone,
'show_phone' => $this->config->getAppValue('registration', 'show_phone', 'no') === 'yes', 'show_phone' => $this->config->getAppValue('registration', 'show_phone', 'no') === 'yes',
'enforce_phone' => $this->config->getAppValue('registration', 'enforce_phone', 'no') === 'yes',
'message' => $message, 'message' => $message,
'password' => $password, 'password' => $password,
'additional_hint' => $additional_hint, 'additional_hint' => $additional_hint,

6
package-lock.json generated
View File

@ -1084,6 +1084,12 @@
} }
} }
}, },
"@nextcloud/browserslist-config": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@nextcloud/browserslist-config/-/browserslist-config-1.0.0.tgz",
"integrity": "sha512-f+sKpdLZXkODV+OY39K1M+Spmd4RgxmtEXmNn4Bviv4R7uBFHXuw+JX9ZdfDeOryfHjJ/TRQxQEp0GMpBwZFUw==",
"dev": true
},
"@nextcloud/capabilities": { "@nextcloud/capabilities": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/@nextcloud/capabilities/-/capabilities-1.0.2.tgz", "resolved": "https://registry.npmjs.org/@nextcloud/capabilities/-/capabilities-1.0.2.tgz",

View File

@ -3,7 +3,6 @@
"version": "1.0.0", "version": "1.0.0",
"description": "", "description": "",
"license": "AGPL-3.0-or-later", "license": "AGPL-3.0-or-later",
"main": "main.js",
"scripts": { "scripts": {
"build": "NODE_ENV=production webpack --progress --config webpack.js", "build": "NODE_ENV=production webpack --progress --config webpack.js",
"dev": "NODE_ENV=development webpack --progress --config webpack.js", "dev": "NODE_ENV=development webpack --progress --config webpack.js",
@ -25,6 +24,7 @@
"devDependencies": { "devDependencies": {
"@babel/eslint-parser": "^7.13.14", "@babel/eslint-parser": "^7.13.14",
"@nextcloud/babel-config": "^1.0.0-beta.0", "@nextcloud/babel-config": "^1.0.0-beta.0",
"@nextcloud/browserslist-config": "^1.0.0",
"@nextcloud/eslint-config": "^5.0.0", "@nextcloud/eslint-config": "^5.0.0",
"@nextcloud/eslint-plugin": "^2.0.0", "@nextcloud/eslint-plugin": "^2.0.0",
"@nextcloud/webpack-vue-config": "^4.0.1", "@nextcloud/webpack-vue-config": "^4.0.1",
@ -51,5 +51,8 @@
"vue-template-compiler": "^2.6.12", "vue-template-compiler": "^2.6.12",
"webpack": "^5.28.0", "webpack": "^5.28.0",
"webpack-cli": "^4.6.0" "webpack-cli": "^4.6.0"
} },
"browserslist": [
"extends @nextcloud/browserslist-config"
]
} }

18
src/form.js Normal file
View File

@ -0,0 +1,18 @@
document.addEventListener('DOMContentLoaded', function() {
// Password toggle
$('#showadminpass').click(() => {
const passwordTextField = $('#password')
if (passwordTextField.attr('type') === 'password') {
passwordTextField.attr('type', 'text')
} else {
passwordTextField.attr('type', 'password')
}
})
// Disable submit after first click
$('form').submit(() => {
// prevent duplicate form submissions
$(this).find(':submit').attr('disabled', 'disabled')
$(this).find(':submit')[0].value = t('registration', 'Loading …')
})
})

View File

@ -2,6 +2,7 @@
/** @var array $_ */ /** @var array $_ */
/** @var \OCP\IL10N $l */ /** @var \OCP\IL10N $l */
style('registration', 'style'); style('registration', 'style');
script('registration', 'registration-form');
?> ?>
<form action="" method="post"> <form action="" method="post">
<fieldset> <fieldset>

View File

@ -2,7 +2,7 @@
/** @var array $_ */ /** @var array $_ */
/** @var \OCP\IL10N $l */ /** @var \OCP\IL10N $l */
style('registration', 'style'); style('registration', 'style');
script('registration', 'form'); script('registration', 'registration-form');
?><form action="" method="post"> ?><form action="" method="post">
<input type="hidden" name="requesttoken" value="<?php p($_['requesttoken']) ?>" /> <input type="hidden" name="requesttoken" value="<?php p($_['requesttoken']) ?>" />
<fieldset> <fieldset>
@ -33,7 +33,7 @@ script('registration', 'form');
<p class="groupmiddle"> <p class="groupmiddle">
<input type="text" name="loginname" id="loginname" value="<?php if (!empty($_['loginname'])) { <input type="text" name="loginname" id="loginname" value="<?php if (!empty($_['loginname'])) {
p($_['loginname']); p($_['loginname']);
} ?>" placeholder="<?php p($l->t('Login name')); ?>" /> } ?>" placeholder="<?php p($l->t('Login name')); ?>" required />
<label for="loginname" class="infield"><?php p($l->t('Login name')); ?></label> <label for="loginname" class="infield"><?php p($l->t('Login name')); ?></label>
<img id="loginname-icon" class="svg" src="<?php print_unescaped(image_path('', 'categories/auth.svg')); ?>" alt=""/> <img id="loginname-icon" class="svg" src="<?php print_unescaped(image_path('', 'categories/auth.svg')); ?>" alt=""/>
</p> </p>
@ -45,7 +45,9 @@ script('registration', 'form');
<p class="groupmiddle"> <p class="groupmiddle">
<input type="text" name="fullname" id="fullname" value="<?php if (!empty($_['fullname'])) { <input type="text" name="fullname" id="fullname" value="<?php if (!empty($_['fullname'])) {
p($_['fullname']); p($_['fullname']);
} ?>" placeholder="<?php p($l->t('Full name')); ?>" /> } ?>" placeholder="<?php p($l->t('Full name')); ?>" <?php if ($_['enforce_fullname']) {
p('required');
} ?> />
<label for="fullname" class="infield"><?php p($l->t('Full name')); ?></label> <label for="fullname" class="infield"><?php p($l->t('Full name')); ?></label>
<img id="fullname-icon" class="svg" src="<?php print_unescaped(image_path('', 'actions/user.svg')); ?>" alt=""/> <img id="fullname-icon" class="svg" src="<?php print_unescaped(image_path('', 'actions/user.svg')); ?>" alt=""/>
</p> </p>
@ -57,7 +59,9 @@ script('registration', 'form');
<p class="groupmiddle"> <p class="groupmiddle">
<input type="text" name="phone" id="phone" value="<?php if (!empty($_['phone'])) { <input type="text" name="phone" id="phone" value="<?php if (!empty($_['phone'])) {
p($_['phone']); p($_['phone']);
} ?>" placeholder="<?php p($l->t('Phone number')); ?>" /> } ?>" placeholder="<?php p($l->t('Phone number')); ?>" <?php if ($_['enforce_phone']) {
p('required');
} ?> />
<label for="phone" class="infield"><?php p($l->t('Phone number')); ?></label> <label for="phone" class="infield"><?php p($l->t('Phone number')); ?></label>
<img id="phone-icon" class="svg" src="<?php print_unescaped(image_path('', 'clients/phone.svg')); ?>" alt=""/> <img id="phone-icon" class="svg" src="<?php print_unescaped(image_path('', 'clients/phone.svg')); ?>" alt=""/>
</p> </p>
@ -68,7 +72,7 @@ script('registration', 'form');
<p class="groupbottom"> <p class="groupbottom">
<input type="password" name="password" id="password" value="<?php if (!empty($_['password'])) { <input type="password" name="password" id="password" value="<?php if (!empty($_['password'])) {
p($_['password']); p($_['password']);
} ?>" placeholder="<?php p($l->t('Password')); ?>"/> } ?>" placeholder="<?php p($l->t('Password')); ?>" required />
<label for="password" class="infield"><?php p($l->t('Password')); ?></label> <label for="password" class="infield"><?php p($l->t('Password')); ?></label>
<img id="password-icon" class="svg" src="<?php print_unescaped(image_path('', 'actions/password.svg')); ?>" alt=""/> <img id="password-icon" class="svg" src="<?php print_unescaped(image_path('', 'actions/password.svg')); ?>" alt=""/>
<a id="showadminpass" href="#" class="toggle-password"> <a id="showadminpass" href="#" class="toggle-password">

View File

@ -2,6 +2,7 @@
/** @var array $_ */ /** @var array $_ */
/** @var \OCP\IL10N $l */ /** @var \OCP\IL10N $l */
style('registration', 'style'); style('registration', 'style');
script('registration', 'registration-form');
?> ?>
<form action="" method="post"> <form action="" method="post">
<fieldset> <fieldset>

View File

@ -471,8 +471,10 @@ class RegisterControllerTest extends TestCase {
'loginname' => $username, 'loginname' => $username,
'fullname' => $fullname, 'fullname' => $fullname,
'show_fullname' => true, 'show_fullname' => true,
'enforce_fullname' => false,
'phone' => $phone, 'phone' => $phone,
'show_phone' => true, 'show_phone' => true,
'enforce_phone' => false,
'message' => $message, 'message' => $message,
'password' => $password, 'password' => $password,
'additional_hint' => null, 'additional_hint' => null,

View File

@ -3,6 +3,7 @@ const webpackConfig = require('@nextcloud/webpack-vue-config')
webpackConfig.entry = { webpackConfig.entry = {
settings: path.join(__dirname, 'src', 'settings'), settings: path.join(__dirname, 'src', 'settings'),
form: path.join(__dirname, 'src', 'form'),
} }
module.exports = webpackConfig module.exports = webpackConfig