User Registration Frontend
This commit is contained in:
1 parent
23be9fb6d0
commit
86f9e12b87
10 files changed
+198
-166
No files matched your search
+21
-22
@@ -34,7 +34,7 @@ namespace Api {
|
||||
$row = $res[0];
|
||||
if (strcasecmp($username, $row['name']) === 0) {
|
||||
return $this->createError("This username is already taken.");
|
||||
} else if (strcasecmp($username, $row['email']) === 0) {
|
||||
} else if (strcasecmp($email, $row['email']) === 0) {
|
||||
return $this->createError("This email address is already in use.");
|
||||
}
|
||||
}
|
||||
@@ -670,13 +670,14 @@ namespace Api\User {
|
||||
}
|
||||
|
||||
parent::__construct($user, $externalCall, $parameters);
|
||||
$this->csrfTokenRequired = false;
|
||||
}
|
||||
|
||||
private function insertToken() {
|
||||
$validUntil = (new DateTime())->modify("+48 hour");
|
||||
$sql = $this->user->getSQL();
|
||||
$res = $sql->insert("UserToken", array("user_id", "token", "token_type", "valid_until"))
|
||||
->addRow($this->userId, $this->token, "confirmation", $validUntil)
|
||||
->addRow($this->userId, $this->token, "email_confirm", $validUntil)
|
||||
->execute();
|
||||
|
||||
$this->success = ($res !== FALSE);
|
||||
@@ -732,33 +733,31 @@ namespace Api\User {
|
||||
$this->userId = $id;
|
||||
$this->token = generateRandomString(36);
|
||||
if ($this->insertToken()) {
|
||||
return false;
|
||||
}
|
||||
$settings = $this->user->getConfiguration()->getSettings();
|
||||
$baseUrl = htmlspecialchars($settings->getBaseUrl());
|
||||
$siteName = htmlspecialchars($settings->getSiteName());
|
||||
|
||||
$settings = $this->user->getConfiguration()->getSettings();
|
||||
$baseUrl = htmlspecialchars($settings->getBaseUrl());
|
||||
$siteName = htmlspecialchars($settings->getSiteName());
|
||||
if ($this->success) {
|
||||
|
||||
if ($this->success) {
|
||||
$replacements = array(
|
||||
"link" => "$baseUrl/confirmEmail?token=$this->token",
|
||||
"site_name" => $siteName,
|
||||
"base_url" => $baseUrl,
|
||||
"username" => htmlspecialchars($username)
|
||||
);
|
||||
|
||||
$replacements = array(
|
||||
"link" => "$baseUrl/confirmEmail?token=$this->token",
|
||||
"site_name" => $siteName,
|
||||
"base_url" => $baseUrl,
|
||||
"username" => htmlspecialchars($username)
|
||||
);
|
||||
foreach($replacements as $key => $value) {
|
||||
$messageBody = str_replace("{{{$key}}}", $value, $messageBody);
|
||||
}
|
||||
|
||||
foreach($replacements as $key => $value) {
|
||||
$messageBody = str_replace("{{{$key}}}", $value, $messageBody);
|
||||
}
|
||||
|
||||
$request = new \Api\Mail\Send($this->user);
|
||||
$this->success = $request->execute(array(
|
||||
$request = new \Api\Mail\Send($this->user);
|
||||
$this->success = $request->execute(array(
|
||||
"to" => $email,
|
||||
"subject" => "[$siteName] E-Mail Confirmation",
|
||||
"body" => $messageBody
|
||||
));
|
||||
$this->lastError = $request->getLastError();
|
||||
));
|
||||
$this->lastError = $request->getLastError();
|
||||
}
|
||||
}
|
||||
|
||||
if (!$this->success) {
|
||||
|
||||
@@ -192,7 +192,7 @@ class CreateDatabase {
|
||||
->addRow("User/edit", array(USER_GROUP_ADMIN), "Allows users to edit details and group memberships of any user")
|
||||
->addRow("User/delete", array(USER_GROUP_ADMIN), "Allows users to delete any other user")
|
||||
->addRow("Permission/fetch", array(USER_GROUP_ADMIN), "Allows users to list all API permissions")
|
||||
->addRow("Visitors/stats", array(USER_GROUP_ADMIN, USER_GROUP_SUPPORT), "Allowes users to see visitor statistics");
|
||||
->addRow("Visitors/stats", array(USER_GROUP_ADMIN, USER_GROUP_SUPPORT), "Allows users to see visitor statistics");
|
||||
|
||||
return $queries;
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@ namespace Documents {
|
||||
namespace Documents\Account {
|
||||
|
||||
use Elements\Head;
|
||||
use Elements\Script;
|
||||
use Elements\SimpleBody;
|
||||
|
||||
class AccountHead extends Head {
|
||||
@@ -26,11 +27,21 @@ namespace Documents\Account {
|
||||
}
|
||||
|
||||
protected function initSources() {
|
||||
|
||||
$this->loadJQuery();
|
||||
$this->addJS(Script::CORE);
|
||||
$this->addJS(Script::ACCOUNT);
|
||||
$this->loadBootstrap();
|
||||
$this->loadFontawesome();
|
||||
}
|
||||
|
||||
protected function initMetas() {
|
||||
return array();
|
||||
return array(
|
||||
array('name' => 'viewport', 'content' => 'width=device-width, initial-scale=1.0'),
|
||||
array('name' => 'format-detection', 'content' => 'telephone=yes'),
|
||||
array('charset' => 'utf-8'),
|
||||
array("http-equiv" => 'expires', 'content' => '0'),
|
||||
array("name" => 'robots', 'content' => 'noarchive'),
|
||||
);
|
||||
}
|
||||
|
||||
protected function initRawFields() {
|
||||
@@ -49,6 +60,7 @@ namespace Documents\Account {
|
||||
}
|
||||
|
||||
protected function getContent() {
|
||||
|
||||
$view = $this->getDocument()->getView();
|
||||
if ($view === null) {
|
||||
return "The page you does not exist or is no longer valid. <a href='/'>Return to start page</a>";
|
||||
|
||||
@@ -11,6 +11,7 @@ class Script extends StaticView {
|
||||
const JQUERY = "/js/jquery.min.js";
|
||||
const INSTALL = "/js/install.js";
|
||||
const BOOTSTRAP = "/js/bootstrap.bundle.min.js";
|
||||
const ACCOUNT = "/js/account.js";
|
||||
|
||||
private string $type;
|
||||
private string $content;
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
<?php
|
||||
|
||||
namespace Views\Account;
|
||||
|
||||
use Elements\Document;
|
||||
use Elements\View;
|
||||
|
||||
abstract class AccountView extends View {
|
||||
|
||||
protected string $description;
|
||||
|
||||
public function __construct(Document $document, $loadView = true) {
|
||||
parent::__construct($document, $loadView);
|
||||
$this->description = "";
|
||||
}
|
||||
|
||||
public function getCode() {
|
||||
$html = parent::getCode();
|
||||
|
||||
$content = $this->getAccountContent();
|
||||
$icon = $this->createIcon("user-plus", "fas", "fa-3x");
|
||||
|
||||
$html .= "<div class=\"container mt-5\">
|
||||
<div class=\"row\">
|
||||
<div class=\"col-md-4 py-5 bg-primary text-white text-center\" style='border-top-left-radius:.4em;border-bottom-left-radius:.4em'>
|
||||
<div class=\"card-body\">
|
||||
$icon
|
||||
<h2 class=\"py-3\">$this->title</h2>
|
||||
<p>$this->description</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class=\"col-md-8 pt-5 pb-2 border border-info\" style='border-top-right-radius:.4em;border-bottom-right-radius:.4em'>
|
||||
$content
|
||||
<div class='alert mt-2' style='display:none' id='alertMessage'></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>";
|
||||
|
||||
return $html;
|
||||
}
|
||||
|
||||
protected abstract function getAccountContent();
|
||||
}
|
||||
@@ -7,15 +7,51 @@ namespace Views\Account;
|
||||
use Elements\Document;
|
||||
use Elements\View;
|
||||
|
||||
class Register extends View {
|
||||
class Register extends AccountView {
|
||||
|
||||
public function __construct(Document $document, $loadView = true) {
|
||||
parent::__construct($document, $loadView);
|
||||
$this->title = "Registration";
|
||||
$this->description = "Create a new account";
|
||||
}
|
||||
|
||||
public function getCode() {
|
||||
$html = parent::getCode();
|
||||
public function loadView() {
|
||||
parent::loadView();
|
||||
|
||||
return $html;
|
||||
$document = $this->getDocument();
|
||||
$settings = $document->getUser()->getConfiguration()->getSettings();
|
||||
if ($settings->isRecaptchaEnabled()) {
|
||||
$document->getHead()->loadGoogleRecaptcha($settings->getRecaptchaSiteKey());
|
||||
}
|
||||
}
|
||||
|
||||
public function getAccountContent() {
|
||||
|
||||
$settings = $this->getDocument()->getUser()->getConfiguration()->getSettings();
|
||||
if (!$settings->isRegistrationAllowed()) {
|
||||
return $this->createErrorText(
|
||||
"Registration is not enabled on this website. If you are an administrator,
|
||||
goto <a href=\"/admin/settings\">/admin/settings</a>, to enable the user registration"
|
||||
);
|
||||
}
|
||||
|
||||
return "<h4 class=\"pb-4\">Please fill with your details</h4>
|
||||
<form>
|
||||
<div class=\"form-group\">
|
||||
<input id=\"username\" name=\"username\" placeholder=\"Username\" class=\"form-control\" type=\"text\" maxlength=\"32\">
|
||||
</div>
|
||||
<div class=\"form-group\">
|
||||
<input type=\"email\" name='email' id='email' class=\"form-control\" placeholder=\"Email\" maxlength=\"64\">
|
||||
</div>
|
||||
<div class=\"form-group\">
|
||||
<input type=\"password\" name='password' id='password' class=\"form-control\" placeholder=\"Password\">
|
||||
</div>
|
||||
<div class=\"form-group\">
|
||||
<input type=\"password\" name='confirmPassword' id='confirmPassword' class=\"form-control\" placeholder=\"Confirm Password\">
|
||||
</div>
|
||||
<div class=\"form-group\">
|
||||
<button type=\"button\" class=\"btn btn-success\" id='btnRegister'>Submit</button>
|
||||
</div>
|
||||
</form>";
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
|
||||
namespace Views\Account;
|
||||
|
||||
|
||||
use Elements\Document;
|
||||
use Elements\View;
|
||||
|
||||
class ResetPassword extends View {
|
||||
|
||||
public function __construct(Document $document, $loadView = true) {
|
||||
parent::__construct($document, $loadView);
|
||||
}
|
||||
|
||||
public function getCode() {
|
||||
$html = parent::getCode();
|
||||
|
||||
return $html;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
$(document).ready(function () {
|
||||
|
||||
function showAlert(type, msg) {
|
||||
let alert = $("#alertMessage");
|
||||
alert.text(msg);
|
||||
alert.attr("class", "mt-2 alert alert-" + type);
|
||||
alert.show();
|
||||
}
|
||||
|
||||
function hideAlert() {
|
||||
$("#alertMessage").hide();
|
||||
}
|
||||
|
||||
$("#btnRegister").click(function (e) {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
|
||||
let btn = $(this);
|
||||
let username = $("#username").val().trim();
|
||||
let email = $("#email").val().trim();
|
||||
let password = $("#password").val();
|
||||
let confirmPassword = $("#confirmPassword").val();
|
||||
|
||||
if (username === '' || email === '' || password === '' || confirmPassword === '') {
|
||||
showAlert("danger", "Please fill out every field.");
|
||||
} else if(password !== confirmPassword) {
|
||||
showAlert("danger", "Your passwords did not match.");
|
||||
} else {
|
||||
let textBefore = btn.text();
|
||||
let params = { username: username, email: email, password: password, confirmPassword: confirmPassword };
|
||||
|
||||
btn.prop("disabled", true);
|
||||
btn.html("Submitting… <i class='fas fa-spin fa-spinner'></i>")
|
||||
jsCore.apiCall("user/register", params, (res) => {
|
||||
btn.prop("disabled", false);
|
||||
btn.text(textBefore);
|
||||
if (!res.success) {
|
||||
showAlert("danger", res.msg);
|
||||
} else {
|
||||
showAlert("success", "Account successfully created, check your emails.");
|
||||
$("input").val("");
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
Vendored
+2
-2
@@ -1,2 +1,2 @@
|
||||
/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */
|
||||
!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}k.fn=k.prototype={jquery:f,constructor:k,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=k.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return k.each(this,e)},map:function(n){return this.pushStack(k.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},k.extend=k.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(k.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||k.isPlainObject(n)?n:{},i=!1,a[t]=k.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},k.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t){b(e,{nonce:t&&t.nonce})},each:function(e,t){var n,r=0;if(d(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},trim:function(e){return null==e?"":(e+"").replace(p,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(d(Object(e))?k.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(d(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g.apply([],a)},guid:1,support:y}),"function"==typeof Symbol&&(k.fn[Symbol.iterator]=t[Symbol.iterator]),k.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var h=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,k="sizzle"+1*new Date,m=n.document,S=0,r=0,p=ue(),x=ue(),N=ue(),A=ue(),D=function(e,t){return e===t&&(l=!0),0},j={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",$=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",F=new RegExp(M+"+","g"),B=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+Line truncated
|
||||
/*! jQuery v3.5.1 | (c) JS Foundation and other contributors | jquery.org/license */
|
||||
!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.5.1",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),"function"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S="sizzle"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),D=function(e,t){return e===t&&(l=!0),0},j={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",F=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",B=new RegExp(M+"+","g"),$=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-lLine truncated
|
||||
+9
-135
@@ -3,32 +3,20 @@ let Core = function () {
|
||||
this.__construct = function () {
|
||||
this.url = document.location.href;
|
||||
this.parseParameters();
|
||||
this.langEntries = {};
|
||||
};
|
||||
|
||||
this.apiCall = function (func, aParams, callback, onerror) {
|
||||
aParams = typeof aParams !== 'undefined' ? aParams : {};
|
||||
this.apiCall = function (func, params, callback) {
|
||||
params = typeof params !== 'undefined' ? params : {};
|
||||
callback = typeof callback !== 'undefined' ? callback : function (data) {};
|
||||
|
||||
onerror = typeof onerror !== 'undefined' ? onerror : function (msg) {
|
||||
bootbox.alert("An error occurred: " + msg);
|
||||
};
|
||||
|
||||
const path = '/api' + (func.startsWith('/') ? '' : '/') + func;
|
||||
$.post(path, aParams, function (data) {
|
||||
const path = '/api/' + (func.startsWith('/') ? '' : '/') + func;
|
||||
$.post(path, params, function (data) {
|
||||
console.log(func + "(): success=" + data.success + " msg=" + data.msg);
|
||||
if (data.hasOwnProperty('logoutIn') && $("#logoutTimer").length > 0) {
|
||||
$("#logoutTimer").attr("data-time", data.logoutIn);
|
||||
}
|
||||
|
||||
if (!data.success) {
|
||||
onerror.call(this, data.msg);
|
||||
} else {
|
||||
callback.call(this, data);
|
||||
}
|
||||
callback.call(this, data);
|
||||
}, "json").fail(function (jqXHR, textStatus, errorThrown) {
|
||||
console.log("API-Function Error: " + func + " Status: " + textStatus + " error thrown: " + errorThrown);
|
||||
onerror.call(this, "An error occurred. API-Function: " + func + " Status: " + textStatus + " - " + errorThrown);
|
||||
let msg = func + " Status: " + textStatus + " error thrown: " + errorThrown;
|
||||
console.log("API-Function Error: " + msg);
|
||||
callback.call(this, {success: false, msg: "An error occurred. API-Function: " + msg });
|
||||
});
|
||||
};
|
||||
|
||||
@@ -48,18 +36,6 @@ let Core = function () {
|
||||
return "";
|
||||
};
|
||||
|
||||
this.addLangEntry = function (key, val) {
|
||||
this.langEntries[key] = val;
|
||||
};
|
||||
|
||||
this.getLangEntry = function (key) {
|
||||
if (typeof this.langEntries[key] !== 'undefined' && this.langEntries.hasOwnProperty(key)) {
|
||||
return this.langEntries[key];
|
||||
}
|
||||
|
||||
return key;
|
||||
};
|
||||
|
||||
this.getUrl = function () {
|
||||
return this.url;
|
||||
};
|
||||
@@ -155,10 +131,6 @@ let Core = function () {
|
||||
this.url = this.url.substring(0, this.url.indexOf('?'));
|
||||
};
|
||||
|
||||
this.logout = function () {
|
||||
this.apiCall('user/logout');
|
||||
};
|
||||
|
||||
this.getJsonDateTime = function (date) {
|
||||
return date.getFullYear() + "-" +
|
||||
((date.getMonth() + 1 < 10) ? "0" : "") + (date.getMonth() + 1) + "-" +
|
||||
@@ -176,105 +148,7 @@ let Core = function () {
|
||||
return this.getJsonDateTime(date).split(' ')[1];
|
||||
};
|
||||
|
||||
this.showInputDialog = function (title, aInputs, callback, element, onCreated) {
|
||||
title = typeof title !== "undefined" ? title : "";
|
||||
aInputs = typeof aInputs !== "undefined" ? aInputs : {};
|
||||
callback = typeof callback !== "undefined" ? callback : function (aResult, element) {
|
||||
};
|
||||
onCreated = typeof onCreated !== "undefined" ? onCreated : function () {
|
||||
};
|
||||
|
||||
var html = '<div class="modal-header"><h4 class="modal-title">' + title + '</h4></div>' +
|
||||
'<form class="bootbox-form">';
|
||||
|
||||
for (var i in aInputs) {
|
||||
var input = aInputs[i];
|
||||
|
||||
if (input.type !== "hidden" && input.type !== "checkbox")
|
||||
html += '<label for="' + input.name + '">' + input.name + ':</label>';
|
||||
|
||||
if (input.type === "select") {
|
||||
html += '<select id="' + input.id + '" class="bootbox-input bootbox-input-select form-control">';
|
||||
|
||||
var aValues = (input.hasOwnProperty("aValues") && typeof input.aValues !== "undefined") ? input.aValues : {};
|
||||
for (var value in aValues) {
|
||||
var name = aValues[value];
|
||||
var selected = (input.value === value) ? " selected" : "";
|
||||
html += '<option value="' + value + '"' + selected + '>' + name + '</option>';
|
||||
}
|
||||
|
||||
html += '</select>';
|
||||
input.type = "select";
|
||||
} else if (input.type === "checkbox") {
|
||||
html += '<div class="checkbox">' +
|
||||
'<label><table><tr>' +
|
||||
'<td style="vertical-align:top;padding-top:3px;">' +
|
||||
'<input class="bootbox-input bootbox-input-checkbox" id="' + input.id + '" value="1" type="checkbox"' + (input.value ? " checked" : "") + '>' +
|
||||
'</td>' +
|
||||
'<td style="padding-left: 5px;">' + input.text + '</td>' +
|
||||
'</tr></table></label>' +
|
||||
'</div>';
|
||||
} else if (input.type === "date") {
|
||||
html += '<input class="bootbox-input form-control customDatePicker" autocomplete="off" ' +
|
||||
'type="text" ' +
|
||||
'name="' + input.name + '" ' +
|
||||
'id="' + input.id + '" ' +
|
||||
'value="' + (input.value ? input.value : "") + '"' + (input.readonly ? " readonly" : "") +
|
||||
(input.maxlength ? ' maxlength="' + input.maxlength + '"' : '') + '>';
|
||||
} else if (input.type === "time") {
|
||||
html += '<div class="input-group">' +
|
||||
'<input class="bootbox-input" autocomplete="off" value="0" pattern="[0-9][0-9]" type="number" name="' + input.name + '" id="' + input.id + 'Hour" style="width:60px;text-align: center">' +
|
||||
'<span>:</span>' +
|
||||
'<input class="bootbox-input" autocomplete="off" type="number" name="' + input.name + '" id="' + input.id + 'Minute" value="00" style="width:60px;text-align: center">' +
|
||||
'</div>';
|
||||
} else {
|
||||
html += '<input class="bootbox-input form-control" autocomplete="off" ' +
|
||||
'type="' + input.type + '" ' +
|
||||
'name="' + input.name + '" ' +
|
||||
'id="' + input.id + '" ' +
|
||||
'value="' + (input.value ? input.value : "") + '"' + (input.readonly ? " readonly" : "") +
|
||||
(input.maxlength ? ' maxlength="' + input.maxlength + '"' : '') + '>';
|
||||
}
|
||||
}
|
||||
|
||||
html += '</form>';
|
||||
var dialog = bootbox.confirm(html, function (result) {
|
||||
if (result) {
|
||||
var aResult = [];
|
||||
for (var i in aInputs) {
|
||||
var input = aInputs[i];
|
||||
var value = $("#" + input.id).val();
|
||||
|
||||
if (input.type === "select")
|
||||
value = $("#" + input.id).find(":selected").val();
|
||||
else if (input.type === "checkbox")
|
||||
value = $("#" + input.id).prop("checked");
|
||||
|
||||
aResult[input.id] = value;
|
||||
}
|
||||
callback.call(this, aResult, element);
|
||||
}
|
||||
});
|
||||
|
||||
dialog.init(function () {
|
||||
$(".modal-body").on("keypress", "input", function (e) {
|
||||
if (e.keyCode === 13) {
|
||||
e.preventDefault();
|
||||
$(".modal-footer .btn-primary").click();
|
||||
}
|
||||
});
|
||||
onCreated.call(this);
|
||||
});
|
||||
};
|
||||
|
||||
this.__construct();
|
||||
};
|
||||
|
||||
let jsCore = new Core();
|
||||
$(document).ready(function() {
|
||||
|
||||
});
|
||||
|
||||
function createLoadingIcon() {
|
||||
return '<i class="fas fa-spin fa-spinner"></i>';
|
||||
}
|
||||
let jsCore = new Core();
|
||||
Reference in new issue
Block a user