From d3bc440c8370b43e52f9be1631dd96d6e1a3a338 Mon Sep 17 00:00:00 2001 From: vabene1111 Date: Mon, 14 Dec 2020 17:37:51 +0100 Subject: [PATCH] meal plan quality of life stuff --- cookbook/static/js/vue-cookies.js | 146 ++++++++++++++++++++++++++++++ cookbook/templates/meal_plan.html | 49 ++++++++-- 2 files changed, 186 insertions(+), 9 deletions(-) create mode 100644 cookbook/static/js/vue-cookies.js diff --git a/cookbook/static/js/vue-cookies.js b/cookbook/static/js/vue-cookies.js new file mode 100644 index 000000000..b013475fe --- /dev/null +++ b/cookbook/static/js/vue-cookies.js @@ -0,0 +1,146 @@ +/** + * Vue Cookies v1.7.4 + * https://github.com/cmp-cc/vue-cookies + * + * Copyright 2016, cmp-cc + * Released under the MIT license + */ + +(function () { + + var defaultConfig = { + expires: '1d', + path: '; path=/', + domain: '', + secure: '', + sameSite: '; SameSite=Lax' + }; + + var VueCookies = { + // install of Vue + install: function (Vue) { + Vue.prototype.$cookies = this; + Vue.$cookies = this; + }, + config: function (expireTimes, path, domain, secure, sameSite) { + defaultConfig.expires = expireTimes ? expireTimes : '1d'; + defaultConfig.path = path ? '; path=' + path : '; path=/'; + defaultConfig.domain = domain ? '; domain=' + domain : ''; + defaultConfig.secure = secure ? '; Secure' : ''; + defaultConfig.sameSite = sameSite ? '; SameSite=' + sameSite : '; SameSite=Lax'; + }, + get: function (key) { + var value = decodeURIComponent(document.cookie.replace(new RegExp('(?:(?:^|.*;)\\s*' + encodeURIComponent(key).replace(/[\-\.\+\*]/g, '\\$&') + '\\s*\\=\\s*([^;]*).*$)|^.*$'), '$1')) || null; + + if (value && value.substring(0, 1) === '{' && value.substring(value.length - 1, value.length) === '}') { + try { + value = JSON.parse(value); + } catch (e) { + return value; + } + } + return value; + }, + set: function (key, value, expireTimes, path, domain, secure, sameSite) { + if (!key) { + throw new Error('Cookie name is not find in first argument.'); + } else if (/^(?:expires|max\-age|path|domain|secure|SameSite)$/i.test(key)) { + throw new Error('Cookie key name illegality, Cannot be set to ["expires","max-age","path","domain","secure","SameSite"]\t current key name: ' + key); + } + // support json object + if (value && value.constructor === Object) { + value = JSON.stringify(value); + } + var _expires = ''; + expireTimes = expireTimes == undefined ? defaultConfig.expires : expireTimes; + if (expireTimes && expireTimes != 0) { + switch (expireTimes.constructor) { + case Number: + if (expireTimes === Infinity || expireTimes === -1) _expires = '; expires=Fri, 31 Dec 9999 23:59:59 GMT'; + else _expires = '; max-age=' + expireTimes; + break; + case String: + if (/^(?:\d+(y|m|d|h|min|s))$/i.test(expireTimes)) { + // get capture number group + var _expireTime = expireTimes.replace(/^(\d+)(?:y|m|d|h|min|s)$/i, '$1'); + // get capture type group , to lower case + switch (expireTimes.replace(/^(?:\d+)(y|m|d|h|min|s)$/i, '$1').toLowerCase()) { + // Frequency sorting + case 'm': + _expires = '; max-age=' + +_expireTime * 2592000; + break; // 60 * 60 * 24 * 30 + case 'd': + _expires = '; max-age=' + +_expireTime * 86400; + break; // 60 * 60 * 24 + case 'h': + _expires = '; max-age=' + +_expireTime * 3600; + break; // 60 * 60 + case 'min': + _expires = '; max-age=' + +_expireTime * 60; + break; // 60 + case 's': + _expires = '; max-age=' + _expireTime; + break; + case 'y': + _expires = '; max-age=' + +_expireTime * 31104000; + break; // 60 * 60 * 24 * 30 * 12 + default: + new Error('unknown exception of "set operation"'); + } + } else { + _expires = '; expires=' + expireTimes; + } + break; + case Date: + _expires = '; expires=' + expireTimes.toUTCString(); + break; + } + } + document.cookie = + encodeURIComponent(key) + '=' + encodeURIComponent(value) + + _expires + + (domain ? '; domain=' + domain : defaultConfig.domain) + + (path ? '; path=' + path : defaultConfig.path) + + (secure == undefined ? defaultConfig.secure : secure ? '; Secure' : '') + + (sameSite == undefined ? defaultConfig.sameSite : (sameSite ? '; SameSite=' + sameSite : '')); + return this; + }, + remove: function (key, path, domain) { + if (!key || !this.isKey(key)) { + return false; + } + document.cookie = encodeURIComponent(key) + + '=; expires=Thu, 01 Jan 1970 00:00:00 GMT' + + (domain ? '; domain=' + domain : defaultConfig.domain) + + (path ? '; path=' + path : defaultConfig.path) + + '; SameSite=Lax'; + return this; + }, + isKey: function (key) { + return (new RegExp('(?:^|;\\s*)' + encodeURIComponent(key).replace(/[\-\.\+\*]/g, '\\$&') + '\\s*\\=')).test(document.cookie); + }, + keys: function () { + if (!document.cookie) return []; + var _keys = document.cookie.replace(/((?:^|\s*;)[^\=]+)(?=;|$)|^\s*|\s*(?:\=[^;]*)?(?:\1|$)/g, '').split(/\s*(?:\=[^;]*)?;\s*/); + for (var _index = 0; _index < _keys.length; _index++) { + _keys[_index] = decodeURIComponent(_keys[_index]); + } + return _keys; + } + }; + + if (typeof exports == 'object') { + module.exports = VueCookies; + } else if (typeof define == 'function' && define.amd) { + define([], function () { + return VueCookies; + }); + } else if (window.Vue) { + Vue.use(VueCookies); + } + // vue-cookies can exist independently,no dependencies library + if (typeof window !== 'undefined') { + window.$cookies = VueCookies; + } + +})(); diff --git a/cookbook/templates/meal_plan.html b/cookbook/templates/meal_plan.html index 8ec4e64b4..abd49eccd 100644 --- a/cookbook/templates/meal_plan.html +++ b/cookbook/templates/meal_plan.html @@ -12,6 +12,7 @@ + @@ -24,14 +25,15 @@
-
-
@@ -41,7 +43,7 @@
- +
-
[[formatDateDayname(d)]]
[[formatDateDay(d)]]. @@ -52,7 +54,7 @@
+ [[ meal_plan[t.name].name]]