Browse Source

change form for password repeat

master
HerrHase 3 years ago
parent
commit
e0110263bc
20 changed files with 2751 additions and 12492 deletions
  1. +1087
    -11773
      package-lock.json
  2. +1
    -6
      package.json
  3. +147
    -0
      public/css/index.css
  4. +400
    -166
      public/js/bucket-single.js
  5. +101
    -99
      public/js/create-bucket.js
  6. +8
    -5
      public/js/critical.js
  7. +389
    -156
      public/js/dashboard.js
  8. +525
    -238
      public/js/users.js
  9. +22
    -19
      resources/js/FormValidator.js
  10. +1
    -0
      resources/js/components/loading.riot
  11. +9
    -0
      resources/js/components/users.riot
  12. +28
    -20
      resources/js/components/users/form.riot
  13. +5
    -1
      resources/js/users.js
  14. +21
    -2
      src/http/api/users.ts
  15. +1
    -1
      src/middleware/bucket.ts
  16. +1
    -1
      src/middleware/users.ts
  17. +2
    -2
      src/repositories/bucket.ts
  18. +1
    -1
      src/repositories/note.ts
  19. +1
    -1
      src/rules/uniqueUser.ts
  20. +1
    -1
      src/serializers/uuid.ts

+ 1087
- 11773
package-lock.json
File diff suppressed because it is too large
View File


+ 1
- 6
package.json View File

@ -1,12 +1,7 @@
{ {
"private": true, "private": true,
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "me@herr-hase.wtf",
"license": "GPL",
"dependencies": { "dependencies": {
"@tentakelfabrik/plain-ui": "^0.2.0",
"@tentakelfabrik/plain-ui": "^0.3.0",
"@tentakelfabrik/tiny-validator": "^2.0.0", "@tentakelfabrik/tiny-validator": "^2.0.0",
"axios": "^0.21.1", "axios": "^0.21.1",
"lodash.remove": "^4.7.0", "lodash.remove": "^4.7.0",


+ 147
- 0
public/css/index.css View File

@ -2298,6 +2298,10 @@ input.field-text, textarea.field-text {
padding: 0.8em 1.1em; padding: 0.8em 1.1em;
} }
textarea.field-text {
height: 180px;
}
/** /**
* field-choice * field-choice
* *
@ -2750,6 +2754,7 @@ input[type=checkbox].field-choice:checked ~ .field-switch:after {
transition: transform 0.5s; transition: transform 0.5s;
transform: scale(0); transform: scale(0);
max-width: 600px; max-width: 600px;
width: 100%;
} }
.modal__title { .modal__title {
font-size: 2rem; font-size: 2rem;
@ -2922,6 +2927,103 @@ input[type=checkbox].field-choice:checked ~ .field-switch:after {
} }
} }
/**
* <div class="toast-wrapper">
* <div class="toast">
* <div class="toast__icon">
* <svg class="icon fill-text-contrast" aria-hidden="true">
* <use xlink:href="/symbol-defs.svg#icon-warning"></use>
* </svg>
* </div>
* <div class="toast__body">
*
* </div>
* <div class="toast__button">
* <svg class="icon fill-text-contrast" aria-hidden="true">
* <use xlink:href="/symbol-defs.svg#icon-close"></use>
* </svg>
* </div>
* </div>
* </div>
*
* @author Björn Hase, Tentakelfabrik
* @license http://opensource.org/licenses/MIT The MIT License
* @link https://gitea.com/tentakelfabrik/plain-ui
*
*/
.toast {
display: flex;
background: var(--background);
border: 1px solid var(--border);
max-width: 800px;
width: -webkit-max-content;
width: -moz-max-content;
width: max-content;
margin-top: 1.25rem;
position: relative;
left: calc(-100% - 2rem);
transition: left 0.1s;
}
.toast--animation {
left: 0;
}
.toast__body {
width: 100%;
padding: 1em 1.25em;
}
.toast__button {
border: 0;
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
background: var(--background);
}
.toast__button:hover {
cursor: pointer;
}
.toast__body, .toast__button {
color: var(--text-contrast);
}
.toast__icon, .toast__button {
display: flex;
align-self: stretch;
align-items: center;
padding: 0 1em;
}
.toast__icon svg, .toast__button svg {
font-size: 2rem;
}
.toast--danger {
background: var(--danger);
}
.toast--danger .toast__button {
background: var(--danger);
}
.toast--info {
background: var(--info);
}
.toast--info .toast__button {
background: var(--info);
}
.toast--success {
background: var(--success);
}
.toast--success .toast__button {
background: var(--success);
}
.toast--warning {
background: var(--warning);
}
.toast--warning .toast__button {
background: var(--warning);
}
.toast-wrapper {
position: fixed;
left: 0;
bottom: 0;
margin: 2rem;
}
/** /**
* masonry * masonry
* *
@ -15268,6 +15370,51 @@ input[type=checkbox].field-choice:checked ~ .field-switch:after {
visibility: collapse; visibility: collapse;
} }
/**
* Opacity
*
*
*/
.opacity-1 {
opacity: 0.1;
}
.opacity-2 {
opacity: 0.2;
}
.opacity-3 {
opacity: 0.3;
}
.opacity-4 {
opacity: 0.4;
}
.opacity-5 {
opacity: 0.5;
}
.opacity-6 {
opacity: 0.6;
}
.opacity-7 {
opacity: 0.7;
}
.opacity-8 {
opacity: 0.8;
}
.opacity-9 {
opacity: 0.9;
}
.opacity-10 {
opacity: 1;
}
/** /**
* *
* *


+ 400
- 166
public/js/bucket-single.js View File

@ -124,7 +124,7 @@ __webpack_require__.r(__webpack_exports__);
getComponent getComponent
) { ) {
return template( return template(
'<div expr2="expr2" class="field-error"></div>',
'<div expr0="expr0" class="field-error"></div>',
[ [
{ {
'type': bindingTypes.IF, 'type': bindingTypes.IF,
@ -135,11 +135,11 @@ __webpack_require__.r(__webpack_exports__);
return _scope.state.errors.length > 0; return _scope.state.errors.length > 0;
}, },
'redundantAttribute': 'expr2',
'selector': '[expr2]',
'redundantAttribute': 'expr0',
'selector': '[expr0]',
'template': template( 'template': template(
'<ul><li expr3="expr3"></li></ul>',
'<ul><li expr1="expr1"></li></ul>',
[ [
{ {
'type': bindingTypes.EACH, 'type': bindingTypes.EACH,
@ -170,8 +170,8 @@ __webpack_require__.r(__webpack_exports__);
] ]
), ),
'redundantAttribute': 'expr3',
'selector': '[expr3]',
'redundantAttribute': 'expr1',
'selector': '[expr1]',
'itemName': 'error', 'itemName': 'error',
'indexName': null, 'indexName': null,
@ -215,7 +215,7 @@ __webpack_require__.r(__webpack_exports__);
riot__WEBPACK_IMPORTED_MODULE_3__.register('field-error', _field_error_riot__WEBPACK_IMPORTED_MODULE_2__.default)
riot__WEBPACK_IMPORTED_MODULE_3__.register('field-error', _field_error_riot__WEBPACK_IMPORTED_MODULE_2__["default"])
riot__WEBPACK_IMPORTED_MODULE_3__.mount('field-error') riot__WEBPACK_IMPORTED_MODULE_3__.mount('field-error')
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({
@ -242,7 +242,7 @@ riot__WEBPACK_IMPORTED_MODULE_3__.mount('field-error')
onMounted(props, state) { onMounted(props, state) {
// create form validation // create form validation
const formValidation = new _FormValidator__WEBPACK_IMPORTED_MODULE_1__.default('form', {
const formValidation = new _FormValidator__WEBPACK_IMPORTED_MODULE_1__["default"]('form', {
'title': { 'title': {
'length': { 'length': {
'maximum': 255 'maximum': 255
@ -289,7 +289,7 @@ riot__WEBPACK_IMPORTED_MODULE_3__.mount('field-error')
getComponent getComponent
) { ) {
return template( return template(
'<div class="note-form"><div class="panel"><div class="panel__body"><form id="form" novalidate><input expr13="expr13" type="hidden" name="_id"/><div class="field-group"><label class="field-label">\n title\n <input type="text" class="field-text" name="title"/></label></div><div class="field-group"><label class="field-label">\n content\n <textarea name="content" class="field-text"></textarea></label></div><div class><div class="tabs"></div></div><div><button expr14="expr14" class="button"></button><button expr15="expr15" class="button" type="submit"></button></div></form></div></div></div>',
'<div class="note-form"><div class="panel"><div class="panel__body"><form id="form" novalidate><input expr20="expr20" type="hidden" name="_id"/><div class="field-group"><label class="field-label">\n title\n <input type="text" class="field-text" name="title"/></label></div><div class="field-group"><label class="field-label">\n content\n <textarea name="content" class="field-text"></textarea></label></div><div class><div class="tabs"></div></div><div><button expr21="expr21" class="button"></button><button expr22="expr22" class="button" type="submit"></button></div></form></div></div></div>',
[ [
{ {
'type': bindingTypes.IF, 'type': bindingTypes.IF,
@ -300,8 +300,8 @@ riot__WEBPACK_IMPORTED_MODULE_3__.mount('field-error')
return _scope.state.note && _scope.state.note._id; return _scope.state.note && _scope.state.note._id;
}, },
'redundantAttribute': 'expr13',
'selector': '[expr13]',
'redundantAttribute': 'expr20',
'selector': '[expr20]',
'template': template( 'template': template(
null, null,
@ -332,8 +332,8 @@ riot__WEBPACK_IMPORTED_MODULE_3__.mount('field-error')
return !_scope.state.note || (_scope.state.note && !_scope.state.note._id); return !_scope.state.note || (_scope.state.note && !_scope.state.note._id);
}, },
'redundantAttribute': 'expr14',
'selector': '[expr14]',
'redundantAttribute': 'expr21',
'selector': '[expr21]',
'template': template( 'template': template(
'\n Create\n ', '\n Create\n ',
@ -349,8 +349,8 @@ riot__WEBPACK_IMPORTED_MODULE_3__.mount('field-error')
return _scope.state.note && _scope.state.note._id; return _scope.state.note && _scope.state.note._id;
}, },
'redundantAttribute': 'expr15',
'selector': '[expr15]',
'redundantAttribute': 'expr22',
'selector': '[expr22]',
'template': template( 'template': template(
'\n Save\n ', '\n Save\n ',
@ -398,6 +398,7 @@ module.exports = function xhrAdapter(config) {
return new Promise(function dispatchXhrRequest(resolve, reject) { return new Promise(function dispatchXhrRequest(resolve, reject) {
var requestData = config.data; var requestData = config.data;
var requestHeaders = config.headers; var requestHeaders = config.headers;
var responseType = config.responseType;
if (utils.isFormData(requestData)) { if (utils.isFormData(requestData)) {
delete requestHeaders['Content-Type']; // Let the browser set it delete requestHeaders['Content-Type']; // Let the browser set it
@ -418,23 +419,14 @@ module.exports = function xhrAdapter(config) {
// Set the request timeout in MS // Set the request timeout in MS
request.timeout = config.timeout; request.timeout = config.timeout;
// Listen for ready state
request.onreadystatechange = function handleLoad() {
if (!request || request.readyState !== 4) {
return;
}
// The request errored out and we didn't get a response, this will be
// handled by onerror instead
// With one exception: request that using file: protocol, most browsers
// will return status as 0 even though it's a successful request
if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {
function onloadend() {
if (!request) {
return; return;
} }
// Prepare the response // Prepare the response
var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null; var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null;
var responseData = !config.responseType || config.responseType === 'text' ? request.responseText : request.response;
var responseData = !responseType || responseType === 'text' || responseType === 'json' ?
request.responseText : request.response;
var response = { var response = {
data: responseData, data: responseData,
status: request.status, status: request.status,
@ -448,7 +440,30 @@ module.exports = function xhrAdapter(config) {
// Clean up request // Clean up request
request = null; request = null;
};
}
if ('onloadend' in request) {
// Use onloadend if available
request.onloadend = onloadend;
} else {
// Listen for ready state to emulate onloadend
request.onreadystatechange = function handleLoad() {
if (!request || request.readyState !== 4) {
return;
}
// The request errored out and we didn't get a response, this will be
// handled by onerror instead
// With one exception: request that using file: protocol, most browsers
// will return status as 0 even though it's a successful request
if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {
return;
}
// readystate handler is calling before onerror or ontimeout handlers,
// so we should call onloadend on the next 'tick'
setTimeout(onloadend);
};
}
// Handle browser request cancellation (as opposed to a manual cancellation) // Handle browser request cancellation (as opposed to a manual cancellation)
request.onabort = function handleAbort() { request.onabort = function handleAbort() {
@ -478,7 +493,10 @@ module.exports = function xhrAdapter(config) {
if (config.timeoutErrorMessage) { if (config.timeoutErrorMessage) {
timeoutErrorMessage = config.timeoutErrorMessage; timeoutErrorMessage = config.timeoutErrorMessage;
} }
reject(createError(timeoutErrorMessage, config, 'ECONNABORTED',
reject(createError(
timeoutErrorMessage,
config,
config.transitional && config.transitional.clarifyTimeoutError ? 'ETIMEDOUT' : 'ECONNABORTED',
request)); request));
// Clean up request // Clean up request
@ -518,16 +536,8 @@ module.exports = function xhrAdapter(config) {
} }
// Add responseType to request if needed // Add responseType to request if needed
if (config.responseType) {
try {
request.responseType = config.responseType;
} catch (e) {
// Expected DOMException thrown by browsers not compatible XMLHttpRequest Level 2.
// But, this can be suppressed for 'json' type as it can be parsed by default 'transformResponse' function.
if (config.responseType !== 'json') {
throw e;
}
}
if (responseType && responseType !== 'json') {
request.responseType = config.responseType;
} }
// Handle progress if needed // Handle progress if needed
@ -628,7 +638,7 @@ axios.isAxiosError = __webpack_require__(/*! ./helpers/isAxiosError */ "./node_m
module.exports = axios; module.exports = axios;
// Allow use of default import syntax in TypeScript // Allow use of default import syntax in TypeScript
module.exports.default = axios;
module.exports["default"] = axios;
/***/ }), /***/ }),
@ -761,7 +771,9 @@ var buildURL = __webpack_require__(/*! ../helpers/buildURL */ "./node_modules/ax
var InterceptorManager = __webpack_require__(/*! ./InterceptorManager */ "./node_modules/axios/lib/core/InterceptorManager.js"); var InterceptorManager = __webpack_require__(/*! ./InterceptorManager */ "./node_modules/axios/lib/core/InterceptorManager.js");
var dispatchRequest = __webpack_require__(/*! ./dispatchRequest */ "./node_modules/axios/lib/core/dispatchRequest.js"); var dispatchRequest = __webpack_require__(/*! ./dispatchRequest */ "./node_modules/axios/lib/core/dispatchRequest.js");
var mergeConfig = __webpack_require__(/*! ./mergeConfig */ "./node_modules/axios/lib/core/mergeConfig.js"); var mergeConfig = __webpack_require__(/*! ./mergeConfig */ "./node_modules/axios/lib/core/mergeConfig.js");
var validator = __webpack_require__(/*! ../helpers/validator */ "./node_modules/axios/lib/helpers/validator.js");
var validators = validator.validators;
/** /**
* Create a new instance of Axios * Create a new instance of Axios
* *
@ -801,20 +813,71 @@ Axios.prototype.request = function request(config) {
config.method = 'get'; config.method = 'get';
} }
// Hook up interceptors middleware
var chain = [dispatchRequest, undefined];
var promise = Promise.resolve(config);
var transitional = config.transitional;
if (transitional !== undefined) {
validator.assertOptions(transitional, {
silentJSONParsing: validators.transitional(validators.boolean, '1.0.0'),
forcedJSONParsing: validators.transitional(validators.boolean, '1.0.0'),
clarifyTimeoutError: validators.transitional(validators.boolean, '1.0.0')
}, false);
}
// filter out skipped interceptors
var requestInterceptorChain = [];
var synchronousRequestInterceptors = true;
this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) { this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {
chain.unshift(interceptor.fulfilled, interceptor.rejected);
if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {
return;
}
synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;
requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);
}); });
var responseInterceptorChain = [];
this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) { this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {
chain.push(interceptor.fulfilled, interceptor.rejected);
responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);
}); });
while (chain.length) {
promise = promise.then(chain.shift(), chain.shift());
var promise;
if (!synchronousRequestInterceptors) {
var chain = [dispatchRequest, undefined];
Array.prototype.unshift.apply(chain, requestInterceptorChain);
chain = chain.concat(responseInterceptorChain);
promise = Promise.resolve(config);
while (chain.length) {
promise = promise.then(chain.shift(), chain.shift());
}
return promise;
}
var newConfig = config;
while (requestInterceptorChain.length) {
var onFulfilled = requestInterceptorChain.shift();
var onRejected = requestInterceptorChain.shift();
try {
newConfig = onFulfilled(newConfig);
} catch (error) {
onRejected(error);
break;
}
}
try {
promise = dispatchRequest(newConfig);
} catch (error) {
return Promise.reject(error);
}
while (responseInterceptorChain.length) {
promise = promise.then(responseInterceptorChain.shift(), responseInterceptorChain.shift());
} }
return promise; return promise;
@ -876,10 +939,12 @@ function InterceptorManager() {
* *
* @return {Number} An ID used to remove interceptor later * @return {Number} An ID used to remove interceptor later
*/ */
InterceptorManager.prototype.use = function use(fulfilled, rejected) {
InterceptorManager.prototype.use = function use(fulfilled, rejected, options) {
this.handlers.push({ this.handlers.push({
fulfilled: fulfilled, fulfilled: fulfilled,
rejected: rejected
rejected: rejected,
synchronous: options ? options.synchronous : false,
runWhen: options ? options.runWhen : null
}); });
return this.handlers.length - 1; return this.handlers.length - 1;
}; };
@ -1012,7 +1077,8 @@ module.exports = function dispatchRequest(config) {
config.headers = config.headers || {}; config.headers = config.headers || {};
// Transform request data // Transform request data
config.data = transformData(
config.data = transformData.call(
config,
config.data, config.data,
config.headers, config.headers,
config.transformRequest config.transformRequest
@ -1038,7 +1104,8 @@ module.exports = function dispatchRequest(config) {
throwIfCancellationRequested(config); throwIfCancellationRequested(config);
// Transform response data // Transform response data
response.data = transformData(
response.data = transformData.call(
config,
response.data, response.data,
response.headers, response.headers,
config.transformResponse config.transformResponse
@ -1051,7 +1118,8 @@ module.exports = function dispatchRequest(config) {
// Transform response data // Transform response data
if (reason && reason.response) { if (reason && reason.response) {
reason.response.data = transformData(
reason.response.data = transformData.call(
config,
reason.response.data, reason.response.data,
reason.response.headers, reason.response.headers,
config.transformResponse config.transformResponse
@ -1263,6 +1331,7 @@ module.exports = function settle(resolve, reject, response) {
var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js"); var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js");
var defaults = __webpack_require__(/*! ./../defaults */ "./node_modules/axios/lib/defaults.js");
/** /**
* Transform the data for a request or a response * Transform the data for a request or a response
@ -1273,9 +1342,10 @@ var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/util
* @returns {*} The resulting transformed data * @returns {*} The resulting transformed data
*/ */
module.exports = function transformData(data, headers, fns) { module.exports = function transformData(data, headers, fns) {
var context = this || defaults;
/*eslint no-param-reassign:0*/ /*eslint no-param-reassign:0*/
utils.forEach(fns, function transform(fn) { utils.forEach(fns, function transform(fn) {
data = fn(data, headers);
data = fn.call(context, data, headers);
}); });
return data; return data;
@ -1296,6 +1366,7 @@ module.exports = function transformData(data, headers, fns) {
var utils = __webpack_require__(/*! ./utils */ "./node_modules/axios/lib/utils.js"); var utils = __webpack_require__(/*! ./utils */ "./node_modules/axios/lib/utils.js");
var normalizeHeaderName = __webpack_require__(/*! ./helpers/normalizeHeaderName */ "./node_modules/axios/lib/helpers/normalizeHeaderName.js"); var normalizeHeaderName = __webpack_require__(/*! ./helpers/normalizeHeaderName */ "./node_modules/axios/lib/helpers/normalizeHeaderName.js");
var enhanceError = __webpack_require__(/*! ./core/enhanceError */ "./node_modules/axios/lib/core/enhanceError.js");
var DEFAULT_CONTENT_TYPE = { var DEFAULT_CONTENT_TYPE = {
'Content-Type': 'application/x-www-form-urlencoded' 'Content-Type': 'application/x-www-form-urlencoded'
@ -1319,12 +1390,35 @@ function getDefaultAdapter() {
return adapter; return adapter;
} }
function stringifySafely(rawValue, parser, encoder) {
if (utils.isString(rawValue)) {
try {
(parser || JSON.parse)(rawValue);
return utils.trim(rawValue);
} catch (e) {
if (e.name !== 'SyntaxError') {
throw e;
}
}
}
return (encoder || JSON.stringify)(rawValue);
}
var defaults = { var defaults = {
transitional: {
silentJSONParsing: true,
forcedJSONParsing: true,
clarifyTimeoutError: false
},
adapter: getDefaultAdapter(), adapter: getDefaultAdapter(),
transformRequest: [function transformRequest(data, headers) { transformRequest: [function transformRequest(data, headers) {
normalizeHeaderName(headers, 'Accept'); normalizeHeaderName(headers, 'Accept');
normalizeHeaderName(headers, 'Content-Type'); normalizeHeaderName(headers, 'Content-Type');
if (utils.isFormData(data) || if (utils.isFormData(data) ||
utils.isArrayBuffer(data) || utils.isArrayBuffer(data) ||
utils.isBuffer(data) || utils.isBuffer(data) ||
@ -1341,20 +1435,32 @@ var defaults = {
setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8'); setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8');
return data.toString(); return data.toString();
} }
if (utils.isObject(data)) {
setContentTypeIfUnset(headers, 'application/json;charset=utf-8');
return JSON.stringify(data);
if (utils.isObject(data) || (headers && headers['Content-Type'] === 'application/json')) {
setContentTypeIfUnset(headers, 'application/json');
return stringifySafely(data);
} }
return data; return data;
}], }],
transformResponse: [function transformResponse(data) { transformResponse: [function transformResponse(data) {
/*eslint no-param-reassign:0*/
if (typeof data === 'string') {
var transitional = this.transitional;
var silentJSONParsing = transitional && transitional.silentJSONParsing;
var forcedJSONParsing = transitional && transitional.forcedJSONParsing;
var strictJSONParsing = !silentJSONParsing && this.responseType === 'json';
if (strictJSONParsing || (forcedJSONParsing && utils.isString(data) && data.length)) {
try { try {
data = JSON.parse(data);
} catch (e) { /* Ignore */ }
return JSON.parse(data);
} catch (e) {
if (strictJSONParsing) {
if (e.name === 'SyntaxError') {
throw enhanceError(e, this, 'E_JSON_PARSE');
}
throw e;
}
}
} }
return data; return data;
}], }],
@ -1835,6 +1941,122 @@ module.exports = function spread(callback) {
}; };
/***/ }),
/***/ "./node_modules/axios/lib/helpers/validator.js":
/*!*****************************************************!*\
!*** ./node_modules/axios/lib/helpers/validator.js ***!
\*****************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
var pkg = __webpack_require__(/*! ./../../package.json */ "./node_modules/axios/package.json");
var validators = {};
// eslint-disable-next-line func-names
['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach(function(type, i) {
validators[type] = function validator(thing) {
return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;
};
});
var deprecatedWarnings = {};
var currentVerArr = pkg.version.split('.');
/**
* Compare package versions
* @param {string} version
* @param {string?} thanVersion
* @returns {boolean}
*/
function isOlderVersion(version, thanVersion) {
var pkgVersionArr = thanVersion ? thanVersion.split('.') : currentVerArr;
var destVer = version.split('.');
for (var i = 0; i < 3; i++) {
if (pkgVersionArr[i] > destVer[i]) {
return true;
} else if (pkgVersionArr[i] < destVer[i]) {
return false;
}
}
return false;
}
/**
* Transitional option validator
* @param {function|boolean?} validator
* @param {string?} version
* @param {string} message
* @returns {function}
*/
validators.transitional = function transitional(validator, version, message) {
var isDeprecated = version && isOlderVersion(version);
function formatMessage(opt, desc) {
return '[Axios v' + pkg.version + '] Transitional option \'' + opt + '\'' + desc + (message ? '. ' + message : '');
}
// eslint-disable-next-line func-names
return function(value, opt, opts) {
if (validator === false) {
throw new Error(formatMessage(opt, ' has been removed in ' + version));
}
if (isDeprecated && !deprecatedWarnings[opt]) {
deprecatedWarnings[opt] = true;
// eslint-disable-next-line no-console
console.warn(
formatMessage(
opt,
' has been deprecated since v' + version + ' and will be removed in the near future'
)
);
}
return validator ? validator(value, opt, opts) : true;
};
};
/**
* Assert object's properties type
* @param {object} options
* @param {object} schema
* @param {boolean?} allowUnknown
*/
function assertOptions(options, schema, allowUnknown) {
if (typeof options !== 'object') {
throw new TypeError('options must be an object');
}
var keys = Object.keys(options);
var i = keys.length;
while (i-- > 0) {
var opt = keys[i];
var validator = schema[opt];
if (validator) {
var value = options[opt];
var result = value === undefined || validator(value, opt, options);
if (result !== true) {
throw new TypeError('option ' + opt + ' must be ' + result);
}
continue;
}
if (allowUnknown !== true) {
throw Error('Unknown option ' + opt);
}
}
}
module.exports = {
isOlderVersion: isOlderVersion,
assertOptions: assertOptions,
validators: validators
};
/***/ }), /***/ }),
/***/ "./node_modules/axios/lib/utils.js": /***/ "./node_modules/axios/lib/utils.js":
@ -1848,8 +2070,6 @@ module.exports = function spread(callback) {
var bind = __webpack_require__(/*! ./helpers/bind */ "./node_modules/axios/lib/helpers/bind.js"); var bind = __webpack_require__(/*! ./helpers/bind */ "./node_modules/axios/lib/helpers/bind.js");
/*global toString:true*/
// utils is a library of generic helper functions non-specific to axios // utils is a library of generic helper functions non-specific to axios
var toString = Object.prototype.toString; var toString = Object.prototype.toString;
@ -2033,7 +2253,7 @@ function isURLSearchParams(val) {
* @returns {String} The String freed of excess whitespace * @returns {String} The String freed of excess whitespace
*/ */
function trim(str) { function trim(str) {
return str.replace(/^\s*/, '').replace(/\s*$/, '');
return str.trim ? str.trim() : str.replace(/^\s+|\s+$/g, '');
} }
/** /**
@ -2296,15 +2516,20 @@ var FormValidator = /*#__PURE__*/function () {
var _this2 = this; var _this2 = this;
event.preventDefault(); event.preventDefault();
var errors = validate_js__WEBPACK_IMPORTED_MODULE_0___default()(form_serialize__WEBPACK_IMPORTED_MODULE_1___default()(event.target, {
console.log(this.constraits, event.target, form_serialize__WEBPACK_IMPORTED_MODULE_1___default()(event.target, {
hash: true
}));
var errors = validate_js__WEBPACK_IMPORTED_MODULE_0___default().async(form_serialize__WEBPACK_IMPORTED_MODULE_1___default()(event.target, {
hash: true hash: true
}), this.constraits, { }), this.constraits, {
fullMessages: false fullMessages: false
});
if (errors) {
}).then(function () {
_this2.onSuccess(event, form_serialize__WEBPACK_IMPORTED_MODULE_1___default()(event.target, {
hash: true
}));
}, function (errors) {
// send each element a event // send each element a event
this.elements.forEach(function (element) {
_this2.elements.forEach(function (element) {
var elementErrors = false; // check for errors by name var elementErrors = false; // check for errors by name
if (errors[element.attributes.name.nodeValue]) { if (errors[element.attributes.name.nodeValue]) {
@ -2313,11 +2538,7 @@ var FormValidator = /*#__PURE__*/function () {
_this2.dispatchCustomEvent(elementErrors, element); _this2.dispatchCustomEvent(elementErrors, element);
}); });
} else {
this.onSuccess(event, form_serialize__WEBPACK_IMPORTED_MODULE_1___default()(event.target, {
hash: true
}));
}
});
} }
/** /**
* *
@ -2860,7 +3081,7 @@ __webpack_require__.r(__webpack_exports__);
/* harmony export */ "version": () => (/* binding */ version), /* harmony export */ "version": () => (/* binding */ version),
/* harmony export */ "withTypes": () => (/* binding */ withTypes) /* harmony export */ "withTypes": () => (/* binding */ withTypes)
/* harmony export */ }); /* harmony export */ });
/* Riot v6.0.1, @license MIT */
/* Riot v6.0.3, @license MIT */
/** /**
* Convert a string from camel case to dash-case * Convert a string from camel case to dash-case
* @param {string} string - probably a component tag name * @param {string} string - probably a component tag name
@ -3275,92 +3496,92 @@ var udomdiff = ((a, b, get, before) => {
while (bStart < bEnd) insertBefore(get(b[bStart++], 1), node); while (bStart < bEnd) insertBefore(get(b[bStart++], 1), node);
} // remove head or tail: fast path } // remove head or tail: fast path
else if (bEnd === bStart) { else if (bEnd === bStart) {
while (aStart < aEnd) {
// remove the node only if it's unknown or not live
if (!map || !map.has(a[aStart])) removeChild(get(a[aStart], -1));
aStart++;
}
} // same node: fast path
else if (a[aStart] === b[bStart]) {
aStart++;
bStart++;
} // same tail: fast path
else if (a[aEnd - 1] === b[bEnd - 1]) {
aEnd--;
bEnd--;
} // The once here single last swap "fast path" has been removed in v1.1.0
// https://github.com/WebReflection/udomdiff/blob/single-final-swap/esm/index.js#L69-L85
// reverse swap: also fast path
else if (a[aStart] === b[bEnd - 1] && b[bStart] === a[aEnd - 1]) {
// this is a "shrink" operation that could happen in these cases:
// [1, 2, 3, 4, 5]
// [1, 4, 3, 2, 5]
// or asymmetric too
// [1, 2, 3, 4, 5]
// [1, 2, 3, 5, 6, 4]
const node = get(a[--aEnd], -1).nextSibling;
insertBefore(get(b[bStart++], 1), get(a[aStart++], -1).nextSibling);
insertBefore(get(b[--bEnd], 1), node); // mark the future index as identical (yeah, it's dirty, but cheap 👍)
// The main reason to do this, is that when a[aEnd] will be reached,
// the loop will likely be on the fast path, as identical to b[bEnd].
// In the best case scenario, the next loop will skip the tail,
// but in the worst one, this node will be considered as already
// processed, bailing out pretty quickly from the map index check
a[aEnd] = b[bEnd];
} // map based fallback, "slow" path
else {
// the map requires an O(bEnd - bStart) operation once
// to store all future nodes indexes for later purposes.
// In the worst case scenario, this is a full O(N) cost,
// and such scenario happens at least when all nodes are different,
// but also if both first and last items of the lists are different
if (!map) {
map = new Map();
let i = bStart;
while (i < bEnd) map.set(b[i], i++);
} // if it's a future node, hence it needs some handling
if (map.has(a[aStart])) {
// grab the index of such node, 'cause it might have been processed
const index = map.get(a[aStart]); // if it's not already processed, look on demand for the next LCS
if (bStart < index && index < bEnd) {
let i = aStart; // counts the amount of nodes that are the same in the future
let sequence = 1;
while (++i < aEnd && i < bEnd && map.get(a[i]) === index + sequence) sequence++; // effort decision here: if the sequence is longer than replaces
// needed to reach such sequence, which would brings again this loop
// to the fast path, prepend the difference before a sequence,
// and move only the future list index forward, so that aStart
// and bStart will be aligned again, hence on the fast path.
// An example considering aStart and bStart are both 0:
// a: [1, 2, 3, 4]
// b: [7, 1, 2, 3, 6]
// this would place 7 before 1 and, from that time on, 1, 2, and 3
// will be processed at zero cost
if (sequence > index - bStart) {
const node = get(a[aStart], 0);
while (bStart < index) insertBefore(get(b[bStart++], 1), node);
} // if the effort wasn't good enough, fallback to a replace,
// moving both source and target indexes forward, hoping that some
// similar node will be found later on, to go back to the fast path
else {
replaceChild(get(b[bStart++], 1), get(a[aStart++], -1));
}
} // otherwise move the source forward, 'cause there's nothing to do
else aStart++;
} // this node has no meaning in the future list, so it's more than safe
// to remove it, and check the next live node out instead, meaning
// that only the live list index should be forwarded
else removeChild(get(a[aStart++], -1));
}
while (aStart < aEnd) {
// remove the node only if it's unknown or not live
if (!map || !map.has(a[aStart])) removeChild(get(a[aStart], -1));
aStart++;
}
} // same node: fast path
else if (a[aStart] === b[bStart]) {
aStart++;
bStart++;
} // same tail: fast path
else if (a[aEnd - 1] === b[bEnd - 1]) {
aEnd--;
bEnd--;
} // The once here single last swap "fast path" has been removed in v1.1.0
// https://github.com/WebReflection/udomdiff/blob/single-final-swap/esm/index.js#L69-L85
// reverse swap: also fast path
else if (a[aStart] === b[bEnd - 1] && b[bStart] === a[aEnd - 1]) {
// this is a "shrink" operation that could happen in these cases:
// [1, 2, 3, 4, 5]
// [1, 4, 3, 2, 5]
// or asymmetric too
// [1, 2, 3, 4, 5]
// [1, 2, 3, 5, 6, 4]
const node = get(a[--aEnd], -1).nextSibling;
insertBefore(get(b[bStart++], 1), get(a[aStart++], -1).nextSibling);
insertBefore(get(b[--bEnd], 1), node); // mark the future index as identical (yeah, it's dirty, but cheap 👍)
// The main reason to do this, is that when a[aEnd] will be reached,
// the loop will likely be on the fast path, as identical to b[bEnd].
// In the best case scenario, the next loop will skip the tail,
// but in the worst one, this node will be considered as already
// processed, bailing out pretty quickly from the map index check
a[aEnd] = b[bEnd];
} // map based fallback, "slow" path
else {
// the map requires an O(bEnd - bStart) operation once
// to store all future nodes indexes for later purposes.
// In the worst case scenario, this is a full O(N) cost,
// and such scenario happens at least when all nodes are different,
// but also if both first and last items of the lists are different
if (!map) {
map = new Map();
let i = bStart;
while (i < bEnd) map.set(b[i], i++);
} // if it's a future node, hence it needs some handling
if (map.has(a[aStart])) {
// grab the index of such node, 'cause it might have been processed
const index = map.get(a[aStart]); // if it's not already processed, look on demand for the next LCS
if (bStart < index && index < bEnd) {
let i = aStart; // counts the amount of nodes that are the same in the future
let sequence = 1;
while (++i < aEnd && i < bEnd && map.get(a[i]) === index + sequence) sequence++; // effort decision here: if the sequence is longer than replaces
// needed to reach such sequence, which would brings again this loop
// to the fast path, prepend the difference before a sequence,
// and move only the future list index forward, so that aStart
// and bStart will be aligned again, hence on the fast path.
// An example considering aStart and bStart are both 0:
// a: [1, 2, 3, 4]
// b: [7, 1, 2, 3, 6]
// this would place 7 before 1 and, from that time on, 1, 2, and 3
// will be processed at zero cost
if (sequence > index - bStart) {
const node = get(a[aStart], 0);
while (bStart < index) insertBefore(get(b[bStart++], 1), node);
} // if the effort wasn't good enough, fallback to a replace,
// moving both source and target indexes forward, hoping that some
// similar node will be found later on, to go back to the fast path
else {
replaceChild(get(b[bStart++], 1), get(a[aStart++], -1));
}
} // otherwise move the source forward, 'cause there's nothing to do
else aStart++;
} // this node has no meaning in the future list, so it's more than safe
// to remove it, and check the next live node out instead, meaning
// that only the live list index should be forwarded
else removeChild(get(a[aStart++], -1));
}
} }
return b; return b;
@ -4974,10 +5195,10 @@ function createPureComponent(pureFactoryFunction, _ref) {
// intercept the mount calls to bind the DOM node to the pure object created // intercept the mount calls to bind the DOM node to the pure object created
// see also https://github.com/riot/riot/issues/2806 // see also https://github.com/riot/riot/issues/2806
if (method === MOUNT_METHOD_KEY) { if (method === MOUNT_METHOD_KEY) {
const [el] = args; // mark this node as pure element
const [element] = args; // mark this node as pure element
el[IS_PURE_SYMBOL] = true;
bindDOMNodeToComponentObject(el, component);
defineProperty(element, IS_PURE_SYMBOL, true);
bindDOMNodeToComponentObject(element, component);
} }
component[method](...args); component[method](...args);
@ -5172,6 +5393,8 @@ function enhanceComponentAPI(component, _ref5) {
state = {}; state = {};
} }
// any element mounted passing through this function can't be a pure component
defineProperty(element, IS_PURE_SYMBOL, false);
this[PARENT_KEY_SYMBOL] = parentScope; this[PARENT_KEY_SYMBOL] = parentScope;
this[ATTRIBUTES_KEY_SYMBOL] = createAttributeBindings(element, attributes).mount(parentScope); this[ATTRIBUTES_KEY_SYMBOL] = createAttributeBindings(element, attributes).mount(parentScope);
defineProperty(this, PROPS_KEY, Object.freeze(Object.assign({}, evaluateInitialProps(element, props), evaluateAttributeExpressions(this[ATTRIBUTES_KEY_SYMBOL].expressions)))); defineProperty(this, PROPS_KEY, Object.freeze(Object.assign({}, evaluateInitialProps(element, props), evaluateAttributeExpressions(this[ATTRIBUTES_KEY_SYMBOL].expressions))));
@ -5407,7 +5630,7 @@ function pure(func) {
const withTypes = component => component; const withTypes = component => component;
/** @type {string} current riot version */ /** @type {string} current riot version */
const version = 'v6.0.1'; // expose some internal stuff that might be used from external tools
const version = 'v6.0.3'; // expose some internal stuff that might be used from external tools
const __ = { const __ = {
cssManager, cssManager,
@ -6684,6 +6907,17 @@ const __ = {
__webpack_require__.amdD); __webpack_require__.amdD);
/***/ }),
/***/ "./node_modules/axios/package.json":
/*!*****************************************!*\
!*** ./node_modules/axios/package.json ***!
\*****************************************/
/***/ ((module) => {
"use strict";
module.exports = JSON.parse('{"_from":"axios@^0.21.1","_id":"axios@0.21.4","_inBundle":false,"_integrity":"sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==","_location":"/axios","_phantomChildren":{},"_requested":{"type":"range","registry":true,"raw":"axios@^0.21.1","name":"axios","escapedName":"axios","rawSpec":"^0.21.1","saveSpec":null,"fetchSpec":"^0.21.1"},"_requiredBy":["/"],"_resolved":"https://registry.npmjs.org/axios/-/axios-0.21.4.tgz","_shasum":"c67b90dc0568e5c1cf2b0b858c43ba28e2eda575","_spec":"axios@^0.21.1","_where":"/home/herrhase/Workspace/herrhase/nano-buckets","author":{"name":"Matt Zabriskie"},"browser":{"./lib/adapters/http.js":"./lib/adapters/xhr.js"},"bugs":{"url":"https://github.com/axios/axios/issues"},"bundleDependencies":false,"bundlesize":[{"path":"./dist/axios.min.js","threshold":"5kB"}],"dependencies":{"follow-redirects":"^1.14.0"},"deprecated":false,"description":"Promise based HTTP client for the browser and node.js","devDependencies":{"coveralls":"^3.0.0","es6-promise":"^4.2.4","grunt":"^1.3.0","grunt-banner":"^0.6.0","grunt-cli":"^1.2.0","grunt-contrib-clean":"^1.1.0","grunt-contrib-watch":"^1.0.0","grunt-eslint":"^23.0.0","grunt-karma":"^4.0.0","grunt-mocha-test":"^0.13.3","grunt-ts":"^6.0.0-beta.19","grunt-webpack":"^4.0.2","istanbul-instrumenter-loader":"^1.0.0","jasmine-core":"^2.4.1","karma":"^6.3.2","karma-chrome-launcher":"^3.1.0","karma-firefox-launcher":"^2.1.0","karma-jasmine":"^1.1.1","karma-jasmine-ajax":"^0.1.13","karma-safari-launcher":"^1.0.0","karma-sauce-launcher":"^4.3.6","karma-sinon":"^1.0.5","karma-sourcemap-loader":"^0.3.8","karma-webpack":"^4.0.2","load-grunt-tasks":"^3.5.2","minimist":"^1.2.0","mocha":"^8.2.1","sinon":"^4.5.0","terser-webpack-plugin":"^4.2.3","typescript":"^4.0.5","url-search-params":"^0.10.0","webpack":"^4.44.2","webpack-dev-server":"^3.11.0"},"homepage":"https://axios-http.com","jsdelivr":"dist/axios.min.js","keywords":["xhr","http","ajax","promise","node"],"license":"MIT","main":"index.js","name":"axios","repository":{"type":"git","url":"git+https://github.com/axios/axios.git"},"scripts":{"build":"NODE_ENV=production grunt build","coveralls":"cat coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js","examples":"node ./examples/server.js","fix":"eslint --fix lib/**/*.js","postversion":"git push && git push --tags","preversion":"npm test","start":"node ./sandbox/server.js","test":"grunt test","version":"npm run build && grunt version && git add -A dist && git add CHANGELOG.md bower.json package.json"},"typings":"./index.d.ts","unpkg":"dist/axios.min.js","version":"0.21.4"}');
/***/ }) /***/ })
/******/ }); /******/ });
@ -6785,7 +7019,7 @@ __webpack_require__.r(__webpack_exports__);
/* harmony import */ var _components_note_form_riot__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./components/note-form.riot */ "./resources/js/components/note-form.riot"); /* harmony import */ var _components_note_form_riot__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./components/note-form.riot */ "./resources/js/components/note-form.riot");
riot__WEBPACK_IMPORTED_MODULE_1__.register('note-form', _components_note_form_riot__WEBPACK_IMPORTED_MODULE_0__.default);
riot__WEBPACK_IMPORTED_MODULE_1__.register('note-form', _components_note_form_riot__WEBPACK_IMPORTED_MODULE_0__["default"]);
riot__WEBPACK_IMPORTED_MODULE_1__.mount('note-form'); riot__WEBPACK_IMPORTED_MODULE_1__.mount('note-form');
})(); })();


+ 101
- 99
public/js/create-bucket.js View File

@ -124,7 +124,7 @@ __webpack_require__.r(__webpack_exports__);
getComponent getComponent
) { ) {
return template( return template(
'<div expr2="expr2" class="field-error"></div>',
'<div expr0="expr0" class="field-error"></div>',
[ [
{ {
'type': bindingTypes.IF, 'type': bindingTypes.IF,
@ -135,11 +135,11 @@ __webpack_require__.r(__webpack_exports__);
return _scope.state.errors.length > 0; return _scope.state.errors.length > 0;
}, },
'redundantAttribute': 'expr2',
'selector': '[expr2]',
'redundantAttribute': 'expr0',
'selector': '[expr0]',
'template': template( 'template': template(
'<ul><li expr3="expr3"></li></ul>',
'<ul><li expr1="expr1"></li></ul>',
[ [
{ {
'type': bindingTypes.EACH, 'type': bindingTypes.EACH,
@ -170,8 +170,8 @@ __webpack_require__.r(__webpack_exports__);
] ]
), ),
'redundantAttribute': 'expr3',
'selector': '[expr3]',
'redundantAttribute': 'expr1',
'selector': '[expr1]',
'itemName': 'error', 'itemName': 'error',
'indexName': null, 'indexName': null,
@ -619,7 +619,7 @@ __webpack_require__.r(__webpack_exports__);
/* harmony export */ "version": () => (/* binding */ version), /* harmony export */ "version": () => (/* binding */ version),
/* harmony export */ "withTypes": () => (/* binding */ withTypes) /* harmony export */ "withTypes": () => (/* binding */ withTypes)
/* harmony export */ }); /* harmony export */ });
/* Riot v6.0.1, @license MIT */
/* Riot v6.0.3, @license MIT */
/** /**
* Convert a string from camel case to dash-case * Convert a string from camel case to dash-case
* @param {string} string - probably a component tag name * @param {string} string - probably a component tag name
@ -1034,92 +1034,92 @@ var udomdiff = ((a, b, get, before) => {
while (bStart < bEnd) insertBefore(get(b[bStart++], 1), node); while (bStart < bEnd) insertBefore(get(b[bStart++], 1), node);
} // remove head or tail: fast path } // remove head or tail: fast path
else if (bEnd === bStart) { else if (bEnd === bStart) {
while (aStart < aEnd) {
// remove the node only if it's unknown or not live
if (!map || !map.has(a[aStart])) removeChild(get(a[aStart], -1));
aStart++;
}
} // same node: fast path
else if (a[aStart] === b[bStart]) {
aStart++;
bStart++;
} // same tail: fast path
else if (a[aEnd - 1] === b[bEnd - 1]) {
aEnd--;
bEnd--;
} // The once here single last swap "fast path" has been removed in v1.1.0
// https://github.com/WebReflection/udomdiff/blob/single-final-swap/esm/index.js#L69-L85
// reverse swap: also fast path
else if (a[aStart] === b[bEnd - 1] && b[bStart] === a[aEnd - 1]) {
// this is a "shrink" operation that could happen in these cases:
// [1, 2, 3, 4, 5]
// [1, 4, 3, 2, 5]
// or asymmetric too
// [1, 2, 3, 4, 5]
// [1, 2, 3, 5, 6, 4]
const node = get(a[--aEnd], -1).nextSibling;
insertBefore(get(b[bStart++], 1), get(a[aStart++], -1).nextSibling);
insertBefore(get(b[--bEnd], 1), node); // mark the future index as identical (yeah, it's dirty, but cheap 👍)
// The main reason to do this, is that when a[aEnd] will be reached,
// the loop will likely be on the fast path, as identical to b[bEnd].
// In the best case scenario, the next loop will skip the tail,
// but in the worst one, this node will be considered as already
// processed, bailing out pretty quickly from the map index check
a[aEnd] = b[bEnd];
} // map based fallback, "slow" path
else {
// the map requires an O(bEnd - bStart) operation once
// to store all future nodes indexes for later purposes.
// In the worst case scenario, this is a full O(N) cost,
// and such scenario happens at least when all nodes are different,
// but also if both first and last items of the lists are different
if (!map) {
map = new Map();
let i = bStart;
while (i < bEnd) map.set(b[i], i++);
} // if it's a future node, hence it needs some handling
if (map.has(a[aStart])) {
// grab the index of such node, 'cause it might have been processed
const index = map.get(a[aStart]); // if it's not already processed, look on demand for the next LCS
if (bStart < index && index < bEnd) {
let i = aStart; // counts the amount of nodes that are the same in the future
let sequence = 1;
while (++i < aEnd && i < bEnd && map.get(a[i]) === index + sequence) sequence++; // effort decision here: if the sequence is longer than replaces
// needed to reach such sequence, which would brings again this loop
// to the fast path, prepend the difference before a sequence,
// and move only the future list index forward, so that aStart
// and bStart will be aligned again, hence on the fast path.
// An example considering aStart and bStart are both 0:
// a: [1, 2, 3, 4]
// b: [7, 1, 2, 3, 6]
// this would place 7 before 1 and, from that time on, 1, 2, and 3
// will be processed at zero cost
if (sequence > index - bStart) {
const node = get(a[aStart], 0);
while (bStart < index) insertBefore(get(b[bStart++], 1), node);
} // if the effort wasn't good enough, fallback to a replace,
// moving both source and target indexes forward, hoping that some
// similar node will be found later on, to go back to the fast path
else {
replaceChild(get(b[bStart++], 1), get(a[aStart++], -1));
}
} // otherwise move the source forward, 'cause there's nothing to do
else aStart++;
} // this node has no meaning in the future list, so it's more than safe
// to remove it, and check the next live node out instead, meaning
// that only the live list index should be forwarded
else removeChild(get(a[aStart++], -1));
}
while (aStart < aEnd) {
// remove the node only if it's unknown or not live
if (!map || !map.has(a[aStart])) removeChild(get(a[aStart], -1));
aStart++;
}
} // same node: fast path
else if (a[aStart] === b[bStart]) {
aStart++;
bStart++;
} // same tail: fast path
else if (a[aEnd - 1] === b[bEnd - 1]) {
aEnd--;
bEnd--;
} // The once here single last swap "fast path" has been removed in v1.1.0
// https://github.com/WebReflection/udomdiff/blob/single-final-swap/esm/index.js#L69-L85
// reverse swap: also fast path
else if (a[aStart] === b[bEnd - 1] && b[bStart] === a[aEnd - 1]) {
// this is a "shrink" operation that could happen in these cases:
// [1, 2, 3, 4, 5]
// [1, 4, 3, 2, 5]
// or asymmetric too
// [1, 2, 3, 4, 5]
// [1, 2, 3, 5, 6, 4]
const node = get(a[--aEnd], -1).nextSibling;
insertBefore(get(b[bStart++], 1), get(a[aStart++], -1).nextSibling);
insertBefore(get(b[--bEnd], 1), node); // mark the future index as identical (yeah, it's dirty, but cheap 👍)
// The main reason to do this, is that when a[aEnd] will be reached,
// the loop will likely be on the fast path, as identical to b[bEnd].
// In the best case scenario, the next loop will skip the tail,
// but in the worst one, this node will be considered as already
// processed, bailing out pretty quickly from the map index check
a[aEnd] = b[bEnd];
} // map based fallback, "slow" path
else {
// the map requires an O(bEnd - bStart) operation once
// to store all future nodes indexes for later purposes.
// In the worst case scenario, this is a full O(N) cost,
// and such scenario happens at least when all nodes are different,
// but also if both first and last items of the lists are different
if (!map) {
map = new Map();
let i = bStart;
while (i < bEnd) map.set(b[i], i++);
} // if it's a future node, hence it needs some handling
if (map.has(a[aStart])) {
// grab the index of such node, 'cause it might have been processed
const index = map.get(a[aStart]); // if it's not already processed, look on demand for the next LCS
if (bStart < index && index < bEnd) {
let i = aStart; // counts the amount of nodes that are the same in the future
let sequence = 1;
while (++i < aEnd && i < bEnd && map.get(a[i]) === index + sequence) sequence++; // effort decision here: if the sequence is longer than replaces
// needed to reach such sequence, which would brings again this loop
// to the fast path, prepend the difference before a sequence,
// and move only the future list index forward, so that aStart
// and bStart will be aligned again, hence on the fast path.
// An example considering aStart and bStart are both 0:
// a: [1, 2, 3, 4]
// b: [7, 1, 2, 3, 6]
// this would place 7 before 1 and, from that time on, 1, 2, and 3
// will be processed at zero cost
if (sequence > index - bStart) {
const node = get(a[aStart], 0);
while (bStart < index) insertBefore(get(b[bStart++], 1), node);
} // if the effort wasn't good enough, fallback to a replace,
// moving both source and target indexes forward, hoping that some
// similar node will be found later on, to go back to the fast path
else {
replaceChild(get(b[bStart++], 1), get(a[aStart++], -1));
}
} // otherwise move the source forward, 'cause there's nothing to do
else aStart++;
} // this node has no meaning in the future list, so it's more than safe
// to remove it, and check the next live node out instead, meaning
// that only the live list index should be forwarded
else removeChild(get(a[aStart++], -1));
}
} }
return b; return b;
@ -2733,10 +2733,10 @@ function createPureComponent(pureFactoryFunction, _ref) {
// intercept the mount calls to bind the DOM node to the pure object created // intercept the mount calls to bind the DOM node to the pure object created
// see also https://github.com/riot/riot/issues/2806 // see also https://github.com/riot/riot/issues/2806
if (method === MOUNT_METHOD_KEY) { if (method === MOUNT_METHOD_KEY) {
const [el] = args; // mark this node as pure element
const [element] = args; // mark this node as pure element
el[IS_PURE_SYMBOL] = true;
bindDOMNodeToComponentObject(el, component);
defineProperty(element, IS_PURE_SYMBOL, true);
bindDOMNodeToComponentObject(element, component);
} }
component[method](...args); component[method](...args);
@ -2931,6 +2931,8 @@ function enhanceComponentAPI(component, _ref5) {
state = {}; state = {};
} }
// any element mounted passing through this function can't be a pure component
defineProperty(element, IS_PURE_SYMBOL, false);
this[PARENT_KEY_SYMBOL] = parentScope; this[PARENT_KEY_SYMBOL] = parentScope;
this[ATTRIBUTES_KEY_SYMBOL] = createAttributeBindings(element, attributes).mount(parentScope); this[ATTRIBUTES_KEY_SYMBOL] = createAttributeBindings(element, attributes).mount(parentScope);
defineProperty(this, PROPS_KEY, Object.freeze(Object.assign({}, evaluateInitialProps(element, props), evaluateAttributeExpressions(this[ATTRIBUTES_KEY_SYMBOL].expressions)))); defineProperty(this, PROPS_KEY, Object.freeze(Object.assign({}, evaluateInitialProps(element, props), evaluateAttributeExpressions(this[ATTRIBUTES_KEY_SYMBOL].expressions))));
@ -3166,7 +3168,7 @@ function pure(func) {
const withTypes = component => component; const withTypes = component => component;
/** @type {string} current riot version */ /** @type {string} current riot version */
const version = 'v6.0.1'; // expose some internal stuff that might be used from external tools
const version = 'v6.0.3'; // expose some internal stuff that might be used from external tools
const __ = { const __ = {
cssManager, cssManager,
@ -4546,9 +4548,9 @@ __webpack_require__.r(__webpack_exports__);
riot__WEBPACK_IMPORTED_MODULE_2__.register('field-error', _components_field_error_riot__WEBPACK_IMPORTED_MODULE_0__.default);
riot__WEBPACK_IMPORTED_MODULE_2__.register('field-error', _components_field_error_riot__WEBPACK_IMPORTED_MODULE_0__["default"]);
riot__WEBPACK_IMPORTED_MODULE_2__.mount('field-error'); riot__WEBPACK_IMPORTED_MODULE_2__.mount('field-error');
var formValidation = new _node_modules_tentakelfabrik_tiny_validator_src_FormValidator__WEBPACK_IMPORTED_MODULE_1__.default('form', {
var formValidation = new _node_modules_tentakelfabrik_tiny_validator_src_FormValidator__WEBPACK_IMPORTED_MODULE_1__["default"]('form', {
'title': { 'title': {
'presence': true, 'presence': true,
'length': { 'length': {


+ 8
- 5
public/js/critical.js View File

@ -107,7 +107,8 @@ Copyright © 2018 Basecamp, LLC
/******/ } /******/ }
/******/ if(fulfilled) { /******/ if(fulfilled) {
/******/ deferred.splice(i--, 1) /******/ deferred.splice(i--, 1)
/******/ result = fn();
/******/ var r = fn();
/******/ if (r !== undefined) result = r;
/******/ } /******/ }
/******/ } /******/ }
/******/ return result; /******/ return result;
@ -160,12 +161,14 @@ Copyright © 2018 Basecamp, LLC
/******/ // add "moreModules" to the modules object, /******/ // add "moreModules" to the modules object,
/******/ // then flag all "chunkIds" as loaded and fire callback /******/ // then flag all "chunkIds" as loaded and fire callback
/******/ var moduleId, chunkId, i = 0; /******/ var moduleId, chunkId, i = 0;
/******/ for(moduleId in moreModules) {
/******/ if(__webpack_require__.o(moreModules, moduleId)) {
/******/ __webpack_require__.m[moduleId] = moreModules[moduleId];
/******/ if(chunkIds.some((id) => (installedChunks[id] !== 0))) {
/******/ for(moduleId in moreModules) {
/******/ if(__webpack_require__.o(moreModules, moduleId)) {
/******/ __webpack_require__.m[moduleId] = moreModules[moduleId];
/******/ }
/******/ } /******/ }
/******/ if(runtime) var result = runtime(__webpack_require__);
/******/ } /******/ }
/******/ if(runtime) var result = runtime(__webpack_require__);
/******/ if(parentChunkLoadingFunction) parentChunkLoadingFunction(data); /******/ if(parentChunkLoadingFunction) parentChunkLoadingFunction(data);
/******/ for(;i < chunkIds.length; i++) { /******/ for(;i < chunkIds.length; i++) {
/******/ chunkId = chunkIds[i]; /******/ chunkId = chunkIds[i];


+ 389
- 156
public/js/dashboard.js View File

@ -38,7 +38,7 @@ __webpack_require__.r(__webpack_exports__);
handleDelete(event, bucket) { handleDelete(event, bucket) {
event.preventDefault() event.preventDefault()
axios__WEBPACK_IMPORTED_MODULE_0___default().delete('/api/bucket/' + bucket._id)
axios__WEBPACK_IMPORTED_MODULE_0___default()["delete"]('/api/bucket/' + bucket._id)
.then((response) => { .then((response) => {
// removing from buckets // removing from buckets
@ -74,7 +74,7 @@ __webpack_require__.r(__webpack_exports__);
getComponent getComponent
) { ) {
return template( return template(
'<div class="buckets"><div class="grid"><div expr16="expr16" class="col-12 col-md-4 col-xlg-3"></div></div><div class="grid"><div class="col-12"><div class="buckets__more"><button expr21="expr21" type="button" class="button">\n More\n <svg class="icon" aria-hidden="true"><use xlink:href="/symbol-defs.svg#icon-arrow-down"/></svg></button></div></div></div></div>',
'<div class="buckets"><div class="grid"><div expr14="expr14" class="col-12 col-md-4 col-xlg-3"></div></div><div class="grid"><div class="col-12"><div class="buckets__more"><button expr19="expr19" type="button" class="button">\n More\n <svg class="icon" aria-hidden="true"><use xlink:href="/symbol-defs.svg#icon-arrow-down"/></svg></button></div></div></div></div>',
[ [
{ {
'type': bindingTypes.EACH, 'type': bindingTypes.EACH,
@ -82,11 +82,11 @@ __webpack_require__.r(__webpack_exports__);
'condition': null, 'condition': null,
'template': template( 'template': template(
'<article class="panel buckets__item"><div class="bar"><div class="bar__end w-100"><button expr17="expr17" class="button button--transparent"><svg class="icon fill-text-contrast" aria-hidden="true"><use xlink:href="/symbol-defs.svg#icon-delete"/></svg></button></div></div><div class="panel__body"><a expr18="expr18"><h3 expr19="expr19" class="buckets__title"> </h3><div class="content"><p expr20="expr20"> </p></div></a></div></article>',
'<article class="panel buckets__item"><div class="bar"><div class="bar__end w-100"><button expr15="expr15" class="button button--transparent"><svg class="icon fill-text-contrast" aria-hidden="true"><use xlink:href="/symbol-defs.svg#icon-delete"/></svg></button></div></div><div class="panel__body"><a expr16="expr16"><h3 expr17="expr17" class="buckets__title"> </h3><div class="content"><p expr18="expr18"> </p></div></a></div></article>',
[ [
{ {
'redundantAttribute': 'expr17',
'selector': '[expr17]',
'redundantAttribute': 'expr15',
'selector': '[expr15]',
'expressions': [ 'expressions': [
{ {
@ -102,8 +102,8 @@ __webpack_require__.r(__webpack_exports__);
] ]
}, },
{ {
'redundantAttribute': 'expr18',
'selector': '[expr18]',
'redundantAttribute': 'expr16',
'selector': '[expr16]',
'expressions': [ 'expressions': [
{ {
@ -124,8 +124,8 @@ __webpack_require__.r(__webpack_exports__);
] ]
}, },
{ {
'redundantAttribute': 'expr19',
'selector': '[expr19]',
'redundantAttribute': 'expr17',
'selector': '[expr17]',
'expressions': [ 'expressions': [
{ {
@ -145,8 +145,8 @@ __webpack_require__.r(__webpack_exports__);
] ]
}, },
{ {
'redundantAttribute': 'expr20',
'selector': '[expr20]',
'redundantAttribute': 'expr18',
'selector': '[expr18]',
'expressions': [ 'expressions': [
{ {
@ -168,8 +168,8 @@ __webpack_require__.r(__webpack_exports__);
] ]
), ),
'redundantAttribute': 'expr16',
'selector': '[expr16]',
'redundantAttribute': 'expr14',
'selector': '[expr14]',
'itemName': 'bucket', 'itemName': 'bucket',
'indexName': null, 'indexName': null,
@ -180,8 +180,8 @@ __webpack_require__.r(__webpack_exports__);
} }
}, },
{ {
'redundantAttribute': 'expr21',
'selector': '[expr21]',
'redundantAttribute': 'expr19',
'selector': '[expr19]',
'expressions': [ 'expressions': [
{ {
@ -237,6 +237,7 @@ module.exports = function xhrAdapter(config) {
return new Promise(function dispatchXhrRequest(resolve, reject) { return new Promise(function dispatchXhrRequest(resolve, reject) {
var requestData = config.data; var requestData = config.data;
var requestHeaders = config.headers; var requestHeaders = config.headers;
var responseType = config.responseType;
if (utils.isFormData(requestData)) { if (utils.isFormData(requestData)) {
delete requestHeaders['Content-Type']; // Let the browser set it delete requestHeaders['Content-Type']; // Let the browser set it
@ -257,23 +258,14 @@ module.exports = function xhrAdapter(config) {
// Set the request timeout in MS // Set the request timeout in MS
request.timeout = config.timeout; request.timeout = config.timeout;
// Listen for ready state
request.onreadystatechange = function handleLoad() {
if (!request || request.readyState !== 4) {
return;
}
// The request errored out and we didn't get a response, this will be
// handled by onerror instead
// With one exception: request that using file: protocol, most browsers
// will return status as 0 even though it's a successful request
if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {
function onloadend() {
if (!request) {
return; return;
} }
// Prepare the response // Prepare the response
var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null; var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null;
var responseData = !config.responseType || config.responseType === 'text' ? request.responseText : request.response;
var responseData = !responseType || responseType === 'text' || responseType === 'json' ?
request.responseText : request.response;
var response = { var response = {
data: responseData, data: responseData,
status: request.status, status: request.status,
@ -287,7 +279,30 @@ module.exports = function xhrAdapter(config) {
// Clean up request // Clean up request
request = null; request = null;
};
}
if ('onloadend' in request) {
// Use onloadend if available
request.onloadend = onloadend;
} else {
// Listen for ready state to emulate onloadend
request.onreadystatechange = function handleLoad() {
if (!request || request.readyState !== 4) {
return;
}
// The request errored out and we didn't get a response, this will be
// handled by onerror instead
// With one exception: request that using file: protocol, most browsers
// will return status as 0 even though it's a successful request
if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {
return;
}
// readystate handler is calling before onerror or ontimeout handlers,
// so we should call onloadend on the next 'tick'
setTimeout(onloadend);
};
}
// Handle browser request cancellation (as opposed to a manual cancellation) // Handle browser request cancellation (as opposed to a manual cancellation)
request.onabort = function handleAbort() { request.onabort = function handleAbort() {
@ -317,7 +332,10 @@ module.exports = function xhrAdapter(config) {
if (config.timeoutErrorMessage) { if (config.timeoutErrorMessage) {
timeoutErrorMessage = config.timeoutErrorMessage; timeoutErrorMessage = config.timeoutErrorMessage;
} }
reject(createError(timeoutErrorMessage, config, 'ECONNABORTED',
reject(createError(
timeoutErrorMessage,
config,
config.transitional && config.transitional.clarifyTimeoutError ? 'ETIMEDOUT' : 'ECONNABORTED',
request)); request));
// Clean up request // Clean up request
@ -357,16 +375,8 @@ module.exports = function xhrAdapter(config) {
} }
// Add responseType to request if needed // Add responseType to request if needed
if (config.responseType) {
try {
request.responseType = config.responseType;
} catch (e) {
// Expected DOMException thrown by browsers not compatible XMLHttpRequest Level 2.
// But, this can be suppressed for 'json' type as it can be parsed by default 'transformResponse' function.
if (config.responseType !== 'json') {
throw e;
}
}
if (responseType && responseType !== 'json') {
request.responseType = config.responseType;
} }
// Handle progress if needed // Handle progress if needed
@ -467,7 +477,7 @@ axios.isAxiosError = __webpack_require__(/*! ./helpers/isAxiosError */ "./node_m
module.exports = axios; module.exports = axios;
// Allow use of default import syntax in TypeScript // Allow use of default import syntax in TypeScript
module.exports.default = axios;
module.exports["default"] = axios;
/***/ }), /***/ }),
@ -600,7 +610,9 @@ var buildURL = __webpack_require__(/*! ../helpers/buildURL */ "./node_modules/ax
var InterceptorManager = __webpack_require__(/*! ./InterceptorManager */ "./node_modules/axios/lib/core/InterceptorManager.js"); var InterceptorManager = __webpack_require__(/*! ./InterceptorManager */ "./node_modules/axios/lib/core/InterceptorManager.js");
var dispatchRequest = __webpack_require__(/*! ./dispatchRequest */ "./node_modules/axios/lib/core/dispatchRequest.js"); var dispatchRequest = __webpack_require__(/*! ./dispatchRequest */ "./node_modules/axios/lib/core/dispatchRequest.js");
var mergeConfig = __webpack_require__(/*! ./mergeConfig */ "./node_modules/axios/lib/core/mergeConfig.js"); var mergeConfig = __webpack_require__(/*! ./mergeConfig */ "./node_modules/axios/lib/core/mergeConfig.js");
var validator = __webpack_require__(/*! ../helpers/validator */ "./node_modules/axios/lib/helpers/validator.js");
var validators = validator.validators;
/** /**
* Create a new instance of Axios * Create a new instance of Axios
* *
@ -640,20 +652,71 @@ Axios.prototype.request = function request(config) {
config.method = 'get'; config.method = 'get';
} }
// Hook up interceptors middleware
var chain = [dispatchRequest, undefined];
var promise = Promise.resolve(config);
var transitional = config.transitional;
if (transitional !== undefined) {
validator.assertOptions(transitional, {
silentJSONParsing: validators.transitional(validators.boolean, '1.0.0'),
forcedJSONParsing: validators.transitional(validators.boolean, '1.0.0'),
clarifyTimeoutError: validators.transitional(validators.boolean, '1.0.0')
}, false);
}
// filter out skipped interceptors
var requestInterceptorChain = [];
var synchronousRequestInterceptors = true;
this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) { this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {
chain.unshift(interceptor.fulfilled, interceptor.rejected);
if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {
return;
}
synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;
requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);
}); });
var responseInterceptorChain = [];
this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) { this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {
chain.push(interceptor.fulfilled, interceptor.rejected);
responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);
}); });
while (chain.length) {
promise = promise.then(chain.shift(), chain.shift());
var promise;
if (!synchronousRequestInterceptors) {
var chain = [dispatchRequest, undefined];
Array.prototype.unshift.apply(chain, requestInterceptorChain);
chain = chain.concat(responseInterceptorChain);
promise = Promise.resolve(config);
while (chain.length) {
promise = promise.then(chain.shift(), chain.shift());
}
return promise;
}
var newConfig = config;
while (requestInterceptorChain.length) {
var onFulfilled = requestInterceptorChain.shift();
var onRejected = requestInterceptorChain.shift();
try {
newConfig = onFulfilled(newConfig);
} catch (error) {
onRejected(error);
break;
}
}
try {
promise = dispatchRequest(newConfig);
} catch (error) {
return Promise.reject(error);
}
while (responseInterceptorChain.length) {
promise = promise.then(responseInterceptorChain.shift(), responseInterceptorChain.shift());
} }
return promise; return promise;
@ -715,10 +778,12 @@ function InterceptorManager() {
* *
* @return {Number} An ID used to remove interceptor later * @return {Number} An ID used to remove interceptor later
*/ */
InterceptorManager.prototype.use = function use(fulfilled, rejected) {
InterceptorManager.prototype.use = function use(fulfilled, rejected, options) {
this.handlers.push({ this.handlers.push({
fulfilled: fulfilled, fulfilled: fulfilled,
rejected: rejected
rejected: rejected,
synchronous: options ? options.synchronous : false,
runWhen: options ? options.runWhen : null
}); });
return this.handlers.length - 1; return this.handlers.length - 1;
}; };
@ -851,7 +916,8 @@ module.exports = function dispatchRequest(config) {
config.headers = config.headers || {}; config.headers = config.headers || {};
// Transform request data // Transform request data
config.data = transformData(
config.data = transformData.call(
config,
config.data, config.data,
config.headers, config.headers,
config.transformRequest config.transformRequest
@ -877,7 +943,8 @@ module.exports = function dispatchRequest(config) {
throwIfCancellationRequested(config); throwIfCancellationRequested(config);
// Transform response data // Transform response data
response.data = transformData(
response.data = transformData.call(
config,
response.data, response.data,
response.headers, response.headers,
config.transformResponse config.transformResponse
@ -890,7 +957,8 @@ module.exports = function dispatchRequest(config) {
// Transform response data // Transform response data
if (reason && reason.response) { if (reason && reason.response) {
reason.response.data = transformData(
reason.response.data = transformData.call(
config,
reason.response.data, reason.response.data,
reason.response.headers, reason.response.headers,
config.transformResponse config.transformResponse
@ -1102,6 +1170,7 @@ module.exports = function settle(resolve, reject, response) {
var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js"); var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js");
var defaults = __webpack_require__(/*! ./../defaults */ "./node_modules/axios/lib/defaults.js");
/** /**
* Transform the data for a request or a response * Transform the data for a request or a response
@ -1112,9 +1181,10 @@ var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/util
* @returns {*} The resulting transformed data * @returns {*} The resulting transformed data
*/ */
module.exports = function transformData(data, headers, fns) { module.exports = function transformData(data, headers, fns) {
var context = this || defaults;
/*eslint no-param-reassign:0*/ /*eslint no-param-reassign:0*/
utils.forEach(fns, function transform(fn) { utils.forEach(fns, function transform(fn) {
data = fn(data, headers);
data = fn.call(context, data, headers);
}); });
return data; return data;
@ -1135,6 +1205,7 @@ module.exports = function transformData(data, headers, fns) {
var utils = __webpack_require__(/*! ./utils */ "./node_modules/axios/lib/utils.js"); var utils = __webpack_require__(/*! ./utils */ "./node_modules/axios/lib/utils.js");
var normalizeHeaderName = __webpack_require__(/*! ./helpers/normalizeHeaderName */ "./node_modules/axios/lib/helpers/normalizeHeaderName.js"); var normalizeHeaderName = __webpack_require__(/*! ./helpers/normalizeHeaderName */ "./node_modules/axios/lib/helpers/normalizeHeaderName.js");
var enhanceError = __webpack_require__(/*! ./core/enhanceError */ "./node_modules/axios/lib/core/enhanceError.js");
var DEFAULT_CONTENT_TYPE = { var DEFAULT_CONTENT_TYPE = {
'Content-Type': 'application/x-www-form-urlencoded' 'Content-Type': 'application/x-www-form-urlencoded'
@ -1158,12 +1229,35 @@ function getDefaultAdapter() {
return adapter; return adapter;
} }
function stringifySafely(rawValue, parser, encoder) {
if (utils.isString(rawValue)) {
try {
(parser || JSON.parse)(rawValue);
return utils.trim(rawValue);
} catch (e) {
if (e.name !== 'SyntaxError') {
throw e;
}
}
}
return (encoder || JSON.stringify)(rawValue);
}
var defaults = { var defaults = {
transitional: {
silentJSONParsing: true,
forcedJSONParsing: true,
clarifyTimeoutError: false
},
adapter: getDefaultAdapter(), adapter: getDefaultAdapter(),
transformRequest: [function transformRequest(data, headers) { transformRequest: [function transformRequest(data, headers) {
normalizeHeaderName(headers, 'Accept'); normalizeHeaderName(headers, 'Accept');
normalizeHeaderName(headers, 'Content-Type'); normalizeHeaderName(headers, 'Content-Type');
if (utils.isFormData(data) || if (utils.isFormData(data) ||
utils.isArrayBuffer(data) || utils.isArrayBuffer(data) ||
utils.isBuffer(data) || utils.isBuffer(data) ||
@ -1180,20 +1274,32 @@ var defaults = {
setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8'); setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8');
return data.toString(); return data.toString();
} }
if (utils.isObject(data)) {
setContentTypeIfUnset(headers, 'application/json;charset=utf-8');
return JSON.stringify(data);
if (utils.isObject(data) || (headers && headers['Content-Type'] === 'application/json')) {
setContentTypeIfUnset(headers, 'application/json');
return stringifySafely(data);
} }
return data; return data;
}], }],
transformResponse: [function transformResponse(data) { transformResponse: [function transformResponse(data) {
/*eslint no-param-reassign:0*/
if (typeof data === 'string') {
var transitional = this.transitional;
var silentJSONParsing = transitional && transitional.silentJSONParsing;
var forcedJSONParsing = transitional && transitional.forcedJSONParsing;
var strictJSONParsing = !silentJSONParsing && this.responseType === 'json';
if (strictJSONParsing || (forcedJSONParsing && utils.isString(data) && data.length)) {
try { try {
data = JSON.parse(data);
} catch (e) { /* Ignore */ }
return JSON.parse(data);
} catch (e) {
if (strictJSONParsing) {
if (e.name === 'SyntaxError') {
throw enhanceError(e, this, 'E_JSON_PARSE');
}
throw e;
}
}
} }
return data; return data;
}], }],
@ -1674,6 +1780,122 @@ module.exports = function spread(callback) {
}; };
/***/ }),
/***/ "./node_modules/axios/lib/helpers/validator.js":
/*!*****************************************************!*\
!*** ./node_modules/axios/lib/helpers/validator.js ***!
\*****************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
var pkg = __webpack_require__(/*! ./../../package.json */ "./node_modules/axios/package.json");
var validators = {};
// eslint-disable-next-line func-names
['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach(function(type, i) {
validators[type] = function validator(thing) {
return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;
};
});
var deprecatedWarnings = {};
var currentVerArr = pkg.version.split('.');
/**
* Compare package versions
* @param {string} version
* @param {string?} thanVersion
* @returns {boolean}
*/
function isOlderVersion(version, thanVersion) {
var pkgVersionArr = thanVersion ? thanVersion.split('.') : currentVerArr;
var destVer = version.split('.');
for (var i = 0; i < 3; i++) {
if (pkgVersionArr[i] > destVer[i]) {
return true;
} else if (pkgVersionArr[i] < destVer[i]) {
return false;
}
}
return false;
}
/**
* Transitional option validator
* @param {function|boolean?} validator
* @param {string?} version
* @param {string} message
* @returns {function}
*/
validators.transitional = function transitional(validator, version, message) {
var isDeprecated = version && isOlderVersion(version);
function formatMessage(opt, desc) {
return '[Axios v' + pkg.version + '] Transitional option \'' + opt + '\'' + desc + (message ? '. ' + message : '');
}
// eslint-disable-next-line func-names
return function(value, opt, opts) {
if (validator === false) {
throw new Error(formatMessage(opt, ' has been removed in ' + version));
}
if (isDeprecated && !deprecatedWarnings[opt]) {
deprecatedWarnings[opt] = true;
// eslint-disable-next-line no-console
console.warn(
formatMessage(
opt,
' has been deprecated since v' + version + ' and will be removed in the near future'
)
);
}
return validator ? validator(value, opt, opts) : true;
};
};
/**
* Assert object's properties type
* @param {object} options
* @param {object} schema
* @param {boolean?} allowUnknown
*/
function assertOptions(options, schema, allowUnknown) {
if (typeof options !== 'object') {
throw new TypeError('options must be an object');
}
var keys = Object.keys(options);
var i = keys.length;
while (i-- > 0) {
var opt = keys[i];
var validator = schema[opt];
if (validator) {
var value = options[opt];
var result = value === undefined || validator(value, opt, options);
if (result !== true) {
throw new TypeError('option ' + opt + ' must be ' + result);
}
continue;
}
if (allowUnknown !== true) {
throw Error('Unknown option ' + opt);
}
}
}
module.exports = {
isOlderVersion: isOlderVersion,
assertOptions: assertOptions,
validators: validators
};
/***/ }), /***/ }),
/***/ "./node_modules/axios/lib/utils.js": /***/ "./node_modules/axios/lib/utils.js":
@ -1687,8 +1909,6 @@ module.exports = function spread(callback) {
var bind = __webpack_require__(/*! ./helpers/bind */ "./node_modules/axios/lib/helpers/bind.js"); var bind = __webpack_require__(/*! ./helpers/bind */ "./node_modules/axios/lib/helpers/bind.js");
/*global toString:true*/
// utils is a library of generic helper functions non-specific to axios // utils is a library of generic helper functions non-specific to axios
var toString = Object.prototype.toString; var toString = Object.prototype.toString;
@ -1872,7 +2092,7 @@ function isURLSearchParams(val) {
* @returns {String} The String freed of excess whitespace * @returns {String} The String freed of excess whitespace
*/ */
function trim(str) { function trim(str) {
return str.replace(/^\s*/, '').replace(/\s*$/, '');
return str.trim ? str.trim() : str.replace(/^\s+|\s+$/g, '');
} }
/** /**
@ -4604,7 +4824,7 @@ __webpack_require__.r(__webpack_exports__);
/* harmony export */ "version": () => (/* binding */ version), /* harmony export */ "version": () => (/* binding */ version),
/* harmony export */ "withTypes": () => (/* binding */ withTypes) /* harmony export */ "withTypes": () => (/* binding */ withTypes)
/* harmony export */ }); /* harmony export */ });
/* Riot v6.0.1, @license MIT */
/* Riot v6.0.3, @license MIT */
/** /**
* Convert a string from camel case to dash-case * Convert a string from camel case to dash-case
* @param {string} string - probably a component tag name * @param {string} string - probably a component tag name
@ -5019,92 +5239,92 @@ var udomdiff = ((a, b, get, before) => {
while (bStart < bEnd) insertBefore(get(b[bStart++], 1), node); while (bStart < bEnd) insertBefore(get(b[bStart++], 1), node);
} // remove head or tail: fast path } // remove head or tail: fast path
else if (bEnd === bStart) { else if (bEnd === bStart) {
while (aStart < aEnd) {
// remove the node only if it's unknown or not live
if (!map || !map.has(a[aStart])) removeChild(get(a[aStart], -1));
aStart++;
}
} // same node: fast path
else if (a[aStart] === b[bStart]) {
aStart++;
bStart++;
} // same tail: fast path
else if (a[aEnd - 1] === b[bEnd - 1]) {
aEnd--;
bEnd--;
} // The once here single last swap "fast path" has been removed in v1.1.0
// https://github.com/WebReflection/udomdiff/blob/single-final-swap/esm/index.js#L69-L85
// reverse swap: also fast path
else if (a[aStart] === b[bEnd - 1] && b[bStart] === a[aEnd - 1]) {
// this is a "shrink" operation that could happen in these cases:
// [1, 2, 3, 4, 5]
// [1, 4, 3, 2, 5]
// or asymmetric too
// [1, 2, 3, 4, 5]
// [1, 2, 3, 5, 6, 4]
const node = get(a[--aEnd], -1).nextSibling;
insertBefore(get(b[bStart++], 1), get(a[aStart++], -1).nextSibling);
insertBefore(get(b[--bEnd], 1), node); // mark the future index as identical (yeah, it's dirty, but cheap 👍)
// The main reason to do this, is that when a[aEnd] will be reached,
// the loop will likely be on the fast path, as identical to b[bEnd].
// In the best case scenario, the next loop will skip the tail,
// but in the worst one, this node will be considered as already
// processed, bailing out pretty quickly from the map index check
a[aEnd] = b[bEnd];
} // map based fallback, "slow" path
else {
// the map requires an O(bEnd - bStart) operation once
// to store all future nodes indexes for later purposes.
// In the worst case scenario, this is a full O(N) cost,
// and such scenario happens at least when all nodes are different,
// but also if both first and last items of the lists are different
if (!map) {
map = new Map();
let i = bStart;
while (i < bEnd) map.set(b[i], i++);
} // if it's a future node, hence it needs some handling
if (map.has(a[aStart])) {
// grab the index of such node, 'cause it might have been processed
const index = map.get(a[aStart]); // if it's not already processed, look on demand for the next LCS
if (bStart < index && index < bEnd) {
let i = aStart; // counts the amount of nodes that are the same in the future
let sequence = 1;
while (++i < aEnd && i < bEnd && map.get(a[i]) === index + sequence) sequence++; // effort decision here: if the sequence is longer than replaces
// needed to reach such sequence, which would brings again this loop
// to the fast path, prepend the difference before a sequence,
// and move only the future list index forward, so that aStart
// and bStart will be aligned again, hence on the fast path.
// An example considering aStart and bStart are both 0:
// a: [1, 2, 3, 4]
// b: [7, 1, 2, 3, 6]
// this would place 7 before 1 and, from that time on, 1, 2, and 3
// will be processed at zero cost
if (sequence > index - bStart) {
const node = get(a[aStart], 0);
while (bStart < index) insertBefore(get(b[bStart++], 1), node);
} // if the effort wasn't good enough, fallback to a replace,
// moving both source and target indexes forward, hoping that some
// similar node will be found later on, to go back to the fast path
else {
replaceChild(get(b[bStart++], 1), get(a[aStart++], -1));
}
} // otherwise move the source forward, 'cause there's nothing to do
else aStart++;
} // this node has no meaning in the future list, so it's more than safe
// to remove it, and check the next live node out instead, meaning
// that only the live list index should be forwarded
else removeChild(get(a[aStart++], -1));
}
while (aStart < aEnd) {
// remove the node only if it's unknown or not live
if (!map || !map.has(a[aStart])) removeChild(get(a[aStart], -1));
aStart++;
}
} // same node: fast path
else if (a[aStart] === b[bStart]) {
aStart++;
bStart++;
} // same tail: fast path
else if (a[aEnd - 1] === b[bEnd - 1]) {
aEnd--;
bEnd--;
} // The once here single last swap "fast path" has been removed in v1.1.0
// https://github.com/WebReflection/udomdiff/blob/single-final-swap/esm/index.js#L69-L85
// reverse swap: also fast path
else if (a[aStart] === b[bEnd - 1] && b[bStart] === a[aEnd - 1]) {
// this is a "shrink" operation that could happen in these cases:
// [1, 2, 3, 4, 5]
// [1, 4, 3, 2, 5]
// or asymmetric too
// [1, 2, 3, 4, 5]
// [1, 2, 3, 5, 6, 4]
const node = get(a[--aEnd], -1).nextSibling;
insertBefore(get(b[bStart++], 1), get(a[aStart++], -1).nextSibling);
insertBefore(get(b[--bEnd], 1), node); // mark the future index as identical (yeah, it's dirty, but cheap 👍)
// The main reason to do this, is that when a[aEnd] will be reached,
// the loop will likely be on the fast path, as identical to b[bEnd].
// In the best case scenario, the next loop will skip the tail,
// but in the worst one, this node will be considered as already
// processed, bailing out pretty quickly from the map index check
a[aEnd] = b[bEnd];
} // map based fallback, "slow" path
else {
// the map requires an O(bEnd - bStart) operation once
// to store all future nodes indexes for later purposes.
// In the worst case scenario, this is a full O(N) cost,
// and such scenario happens at least when all nodes are different,
// but also if both first and last items of the lists are different
if (!map) {
map = new Map();
let i = bStart;
while (i < bEnd) map.set(b[i], i++);
} // if it's a future node, hence it needs some handling
if (map.has(a[aStart])) {
// grab the index of such node, 'cause it might have been processed
const index = map.get(a[aStart]); // if it's not already processed, look on demand for the next LCS
if (bStart < index && index < bEnd) {
let i = aStart; // counts the amount of nodes that are the same in the future
let sequence = 1;
while (++i < aEnd && i < bEnd && map.get(a[i]) === index + sequence) sequence++; // effort decision here: if the sequence is longer than replaces
// needed to reach such sequence, which would brings again this loop
// to the fast path, prepend the difference before a sequence,
// and move only the future list index forward, so that aStart
// and bStart will be aligned again, hence on the fast path.
// An example considering aStart and bStart are both 0:
// a: [1, 2, 3, 4]
// b: [7, 1, 2, 3, 6]
// this would place 7 before 1 and, from that time on, 1, 2, and 3
// will be processed at zero cost
if (sequence > index - bStart) {
const node = get(a[aStart], 0);
while (bStart < index) insertBefore(get(b[bStart++], 1), node);
} // if the effort wasn't good enough, fallback to a replace,
// moving both source and target indexes forward, hoping that some
// similar node will be found later on, to go back to the fast path
else {
replaceChild(get(b[bStart++], 1), get(a[aStart++], -1));
}
} // otherwise move the source forward, 'cause there's nothing to do
else aStart++;
} // this node has no meaning in the future list, so it's more than safe
// to remove it, and check the next live node out instead, meaning
// that only the live list index should be forwarded
else removeChild(get(a[aStart++], -1));
}
} }
return b; return b;
@ -6718,10 +6938,10 @@ function createPureComponent(pureFactoryFunction, _ref) {
// intercept the mount calls to bind the DOM node to the pure object created // intercept the mount calls to bind the DOM node to the pure object created
// see also https://github.com/riot/riot/issues/2806 // see also https://github.com/riot/riot/issues/2806
if (method === MOUNT_METHOD_KEY) { if (method === MOUNT_METHOD_KEY) {
const [el] = args; // mark this node as pure element
const [element] = args; // mark this node as pure element
el[IS_PURE_SYMBOL] = true;
bindDOMNodeToComponentObject(el, component);
defineProperty(element, IS_PURE_SYMBOL, true);
bindDOMNodeToComponentObject(element, component);
} }
component[method](...args); component[method](...args);
@ -6916,6 +7136,8 @@ function enhanceComponentAPI(component, _ref5) {
state = {}; state = {};
} }
// any element mounted passing through this function can't be a pure component
defineProperty(element, IS_PURE_SYMBOL, false);
this[PARENT_KEY_SYMBOL] = parentScope; this[PARENT_KEY_SYMBOL] = parentScope;
this[ATTRIBUTES_KEY_SYMBOL] = createAttributeBindings(element, attributes).mount(parentScope); this[ATTRIBUTES_KEY_SYMBOL] = createAttributeBindings(element, attributes).mount(parentScope);
defineProperty(this, PROPS_KEY, Object.freeze(Object.assign({}, evaluateInitialProps(element, props), evaluateAttributeExpressions(this[ATTRIBUTES_KEY_SYMBOL].expressions)))); defineProperty(this, PROPS_KEY, Object.freeze(Object.assign({}, evaluateInitialProps(element, props), evaluateAttributeExpressions(this[ATTRIBUTES_KEY_SYMBOL].expressions))));
@ -7151,7 +7373,7 @@ function pure(func) {
const withTypes = component => component; const withTypes = component => component;
/** @type {string} current riot version */ /** @type {string} current riot version */
const version = 'v6.0.1'; // expose some internal stuff that might be used from external tools
const version = 'v6.0.3'; // expose some internal stuff that might be used from external tools
const __ = { const __ = {
cssManager, cssManager,
@ -7164,6 +7386,17 @@ const __ = {
/***/ }),
/***/ "./node_modules/axios/package.json":
/*!*****************************************!*\
!*** ./node_modules/axios/package.json ***!
\*****************************************/
/***/ ((module) => {
"use strict";
module.exports = JSON.parse('{"_from":"axios@^0.21.1","_id":"axios@0.21.4","_inBundle":false,"_integrity":"sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==","_location":"/axios","_phantomChildren":{},"_requested":{"type":"range","registry":true,"raw":"axios@^0.21.1","name":"axios","escapedName":"axios","rawSpec":"^0.21.1","saveSpec":null,"fetchSpec":"^0.21.1"},"_requiredBy":["/"],"_resolved":"https://registry.npmjs.org/axios/-/axios-0.21.4.tgz","_shasum":"c67b90dc0568e5c1cf2b0b858c43ba28e2eda575","_spec":"axios@^0.21.1","_where":"/home/herrhase/Workspace/herrhase/nano-buckets","author":{"name":"Matt Zabriskie"},"browser":{"./lib/adapters/http.js":"./lib/adapters/xhr.js"},"bugs":{"url":"https://github.com/axios/axios/issues"},"bundleDependencies":false,"bundlesize":[{"path":"./dist/axios.min.js","threshold":"5kB"}],"dependencies":{"follow-redirects":"^1.14.0"},"deprecated":false,"description":"Promise based HTTP client for the browser and node.js","devDependencies":{"coveralls":"^3.0.0","es6-promise":"^4.2.4","grunt":"^1.3.0","grunt-banner":"^0.6.0","grunt-cli":"^1.2.0","grunt-contrib-clean":"^1.1.0","grunt-contrib-watch":"^1.0.0","grunt-eslint":"^23.0.0","grunt-karma":"^4.0.0","grunt-mocha-test":"^0.13.3","grunt-ts":"^6.0.0-beta.19","grunt-webpack":"^4.0.2","istanbul-instrumenter-loader":"^1.0.0","jasmine-core":"^2.4.1","karma":"^6.3.2","karma-chrome-launcher":"^3.1.0","karma-firefox-launcher":"^2.1.0","karma-jasmine":"^1.1.1","karma-jasmine-ajax":"^0.1.13","karma-safari-launcher":"^1.0.0","karma-sauce-launcher":"^4.3.6","karma-sinon":"^1.0.5","karma-sourcemap-loader":"^0.3.8","karma-webpack":"^4.0.2","load-grunt-tasks":"^3.5.2","minimist":"^1.2.0","mocha":"^8.2.1","sinon":"^4.5.0","terser-webpack-plugin":"^4.2.3","typescript":"^4.0.5","url-search-params":"^0.10.0","webpack":"^4.44.2","webpack-dev-server":"^3.11.0"},"homepage":"https://axios-http.com","jsdelivr":"dist/axios.min.js","keywords":["xhr","http","ajax","promise","node"],"license":"MIT","main":"index.js","name":"axios","repository":{"type":"git","url":"git+https://github.com/axios/axios.git"},"scripts":{"build":"NODE_ENV=production grunt build","coveralls":"cat coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js","examples":"node ./examples/server.js","fix":"eslint --fix lib/**/*.js","postversion":"git push && git push --tags","preversion":"npm test","start":"node ./sandbox/server.js","test":"grunt test","version":"npm run build && grunt version && git add -A dist && git add CHANGELOG.md bower.json package.json"},"typings":"./index.d.ts","unpkg":"dist/axios.min.js","version":"0.21.4"}');
/***/ }) /***/ })
/******/ }); /******/ });
@ -7271,7 +7504,7 @@ __webpack_require__.r(__webpack_exports__);
// register components for buckets // register components for buckets
riot__WEBPACK_IMPORTED_MODULE_1__.register('app-buckets', _components_buckets_riot__WEBPACK_IMPORTED_MODULE_0__.default);
riot__WEBPACK_IMPORTED_MODULE_1__.register('app-buckets', _components_buckets_riot__WEBPACK_IMPORTED_MODULE_0__["default"]);
riot__WEBPACK_IMPORTED_MODULE_1__.mount('app-buckets'); riot__WEBPACK_IMPORTED_MODULE_1__.mount('app-buckets');
})(); })();


+ 525
- 238
public/js/users.js
File diff suppressed because it is too large
View File


+ 22
- 19
resources/js/FormValidator.js View File

@ -72,30 +72,33 @@ class FormValidator
{ {
event.preventDefault() event.preventDefault()
let errors = validate(serialize(event.target, {
let errors = validate.async(serialize(event.target, {
hash: true hash: true
}), this.constraits, { }), this.constraits, {
fullMessages: false fullMessages: false
})
}).then(
() => {
this.onSuccess(event, serialize(event.target, {
hash: true
}))
},
if (errors) {
(errors) => {
// send each element a event
this.elements.forEach((element) => {
let elementErrors = false
// check for errors by name
if (errors[element.attributes.name.nodeValue]) {
elementErrors = errors[element.attributes.name.nodeValue]
}
this.dispatchCustomEvent(elementErrors, element)
})
} else {
this.onSuccess(event, serialize(event.target, {
hash: true
}))
}
// send each element a event
this.elements.forEach((element) => {
let elementErrors = false
// check for errors by name
if (errors[element.attributes.name.nodeValue]) {
elementErrors = errors[element.attributes.name.nodeValue]
}
this.dispatchCustomEvent(elementErrors, element)
})
}
)
} }
/** /**


+ 1
- 0
resources/js/components/loading.riot View File

@ -5,6 +5,7 @@
<span></span> <span></span>
<span></span> <span></span>
</div> </div>
<div class="loading-overlay"></div>
</div> </div>
<script> <script>


+ 9
- 0
resources/js/components/users.riot View File

@ -73,6 +73,8 @@
</div> </div>
</div> </div>
<app-loading loading={ state.loading }></app-loading>
</div> </div>
<script> <script>
@ -126,6 +128,9 @@
const customEvent = new CustomEvent('open', { const customEvent = new CustomEvent('open', {
'detail': { 'detail': {
'confirm': () => { 'confirm': () => {
this.state.loading = true
axios.delete('/api/users/v1/' + user._id) axios.delete('/api/users/v1/' + user._id)
.then((response) => { .then((response) => {
@ -134,6 +139,10 @@
return u._id === user._id return u._id === user._id
}) })
}).catch((error) => {
}).then(() => {
this.state.loading = false
this.update() this.update()
}) })
}, },


+ 28
- 20
resources/js/components/users/form.riot View File

@ -36,14 +36,8 @@
</label> </label>
<field-error name="display_name"></field-error> <field-error name="display_name"></field-error>
</div> </div>
<div class="field-group">
<label class="field-label">
Password
<input name="password" type="password" class="field-text" />
</label>
<field-error name="password"></field-error>
</div>
<div class="field-group">
<div class="field-group m-bottom-7">
<label class="field-label"> <label class="field-label">
<input name="roles[]" type="checkbox" class="field-choice" value="admin" /> <input name="roles[]" type="checkbox" class="field-choice" value="admin" />
<svg class="icon field-choice__unchecked" aria-hidden="true"> <svg class="icon field-choice__unchecked" aria-hidden="true">
@ -56,6 +50,21 @@
</label> </label>
<field-error name="roles"></field-error> <field-error name="roles"></field-error>
</div> </div>
<div class="field-group">
<label class="field-label">
Password
<input name="password" type="password" class="field-text" />
</label>
<field-error name="password"></field-error>
</div>
<div class="field-group">
<label class="field-label">
Password confirm
<input name="password_confirm" type="password" class="field-text" />
</label>
<field-error name="password_confirm"></field-error>
</div>
</form> </form>
</div> </div>
@ -85,14 +94,10 @@
import FormValidator from './../../FormValidator' import FormValidator from './../../FormValidator'
import FieldError from './../field-error.riot' import FieldError from './../field-error.riot'
import AppLoading from './../loading.riot'
riot.register('field-error', FieldError) riot.register('field-error', FieldError)
riot.mount('field-error') riot.mount('field-error')
riot.register('app-loading', AppLoading)
riot.mount('app-loading')
export default { export default {
state: { state: {
@ -142,6 +147,9 @@
'maximum': 64 'maximum': 64
}, },
'presence': true 'presence': true
},
'password_confirm': {
'equality': 'password'
} }
}, (event, data) => { }, (event, data) => {
this.handleSubmit(event, data) this.handleSubmit(event, data)
@ -168,8 +176,8 @@
* *
* *
*/ */
handleSubmit(event, data) {
handleSubmit(event, data)
{
let method = 'post' let method = 'post'
let url = '/api/users/v1' let url = '/api/users/v1'
@ -187,18 +195,18 @@
url: url, url: url,
data: data data: data
}).then((response) => { }).then((response) => {
this.state.loading = false
if (response.status === 201) {
this.state.user = response.data.data
}
this.state.user = response.data.data
// check if submit has close-attribute // check if submit has close-attribute
if (event.submitter.attributes.close) { if (event.submitter.attributes.close) {
this.$('#sidebar-user-form-close').click() this.$('#sidebar-user-form-close').click()
} }
}).catch((error) => {
if (error.response.status === 422) {
}
}).then(() => {
this.state.loading = false
this.update() this.update()
}) })
}, },


+ 5
- 1
resources/js/users.js View File

@ -3,6 +3,7 @@ import * as riot from 'riot'
import AppUsers from './components/users.riot' import AppUsers from './components/users.riot'
import AppUsersForm from './components/users/form.riot' import AppUsersForm from './components/users/form.riot'
import AppSidebarButton from './components/sidebar-button.riot' import AppSidebarButton from './components/sidebar-button.riot'
import AppLoading from './components/loading.riot'
// register components for buckets // register components for buckets
riot.register('app-users', AppUsers) riot.register('app-users', AppUsers)
@ -12,4 +13,7 @@ riot.register('app-users-form', AppUsersForm)
riot.mount('app-users-form') riot.mount('app-users-form')
riot.register('app-sidebar-button', AppSidebarButton) riot.register('app-sidebar-button', AppSidebarButton)
riot.mount('app-sidebar-button')
riot.mount('app-sidebar-button')
riot.register('app-loading', AppLoading)
riot.mount('app-loading')

+ 21
- 2
src/http/api/users.ts View File

@ -25,13 +25,32 @@ router.get('/', async function(request, response)
const userRepository = new UserRepository() const userRepository = new UserRepository()
const users = await userRepository.db.findMany() const users = await userRepository.db.findMany()
// @TODO check for permission of current user
response.json({ response.json({
data: users data: users
}) })
}) })
/**
* check if user email is unique
*
* @param request
* @param response
* @return
*
*/
router.get('/unique/:email', async function(request, response)
{
const [ valid, errors ] = await validate(request.params, {
email: [ uniqueUser('email') ]
})
if (!valid) {
response.send(422)
} else {
response.send(200)
}
})
/** /**
* get user * get user
* *


+ 1
- 1
src/middleware/bucket.ts View File

@ -3,7 +3,7 @@ import { validate, required } from 'https://deno.land/x/validasaur@v0.15.0/mod.t
import { uuid } from '../rules/uuid.ts' import { uuid } from '../rules/uuid.ts'
import BucketRepository from '../repositories/bucket.ts' import BucketRepository from '../repositories/bucket.ts'
import uuidSerialize from '../serializers/uuid.ts'
import { uuidSerialize } from '../serializers/uuid.ts'
const router = Router() const router = Router()


+ 1
- 1
src/middleware/users.ts View File

@ -3,7 +3,7 @@ import { validate, required } from 'https://deno.land/x/validasaur@v0.15.0/mod.t
import { uuid } from '../rules/uuid.ts' import { uuid } from '../rules/uuid.ts'
import UserRepository from '../repositories/user.ts' import UserRepository from '../repositories/user.ts'
import uuidSerialize from '../serializers/uuid.ts'
import { uuidSerialize } from '../serializers/uuid.ts'
const router = Router() const router = Router()


+ 2
- 2
src/repositories/bucket.ts View File

@ -1,6 +1,6 @@
import { v4 } from 'https://deno.land/std@0.99.0/uuid/mod.ts' import { v4 } from 'https://deno.land/std@0.99.0/uuid/mod.ts'
import { Database } from 'https://deno.land/x/aloedb@0.9.0/mod.ts' import { Database } from 'https://deno.land/x/aloedb@0.9.0/mod.ts'
import { BucketSchema } from '../stores/bucket.ts'
import { BucketSchema } from '../schemas/bucket.ts'
/** /**
* *
@ -13,7 +13,7 @@ class BucketRepository
/** /**
* *
*
*
*/ */
constructor() constructor()
{ {


+ 1
- 1
src/repositories/note.ts View File

@ -1,6 +1,6 @@
import { v4 } from 'https://deno.land/std@0.99.0/uuid/mod.ts' import { v4 } from 'https://deno.land/std@0.99.0/uuid/mod.ts'
import { Database } from 'https://deno.land/x/aloedb@0.9.0/mod.ts' import { Database } from 'https://deno.land/x/aloedb@0.9.0/mod.ts'
import { BucketSchema } from '../stores/bucket.ts'
import { BucketSchema } from '../schemas/bucket.ts'
/** /**
* *


+ 1
- 1
src/rules/uniqueUser.ts View File

@ -1,6 +1,6 @@
import { invalid, Validity, Rule } from "https://deno.land/x/validasaur/mod.ts"; import { invalid, Validity, Rule } from "https://deno.land/x/validasaur/mod.ts";
import { Database } from 'https://deno.land/x/aloedb@0.9.0/mod.ts' import { Database } from 'https://deno.land/x/aloedb@0.9.0/mod.ts'
import { UserSchema } from './../stores/user.ts'
import { UserSchema } from './../schemas/user.ts'
/** /**
* search for key * search for key


+ 1
- 1
src/serializers/uuid.ts View File

@ -4,7 +4,7 @@
* @return * @return
*/ */
function uuidSerialize(value: string)
export function uuidSerialize(value: string)
{ {
// max for id // max for id
value = value.slice(0, 128) value = value.slice(0, 128)


Loading…
Cancel
Save