diff --git a/package-lock.json b/package-lock.json index d06cfe1..c3218b7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,9 @@ "@quasar/extras": "^1.0.0", "axios": "^0.21.1", "core-js": "^3.6.5", + "js-bbcode-parser": "^3.0.4", "quasar": "^2.0.0", + "remarkable": "^2.0.1", "vue-i18n": "^9.0.0-beta.0", "vuex": "^4.0.1" }, @@ -3024,7 +3026,6 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, "dependencies": { "sprintf-js": "~1.0.2" } @@ -3077,6 +3078,14 @@ "node": ">= 4.0.0" } }, + "node_modules/autolinker": { + "version": "3.14.3", + "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-3.14.3.tgz", + "integrity": "sha512-t81i2bCpS+s+5FIhatoww9DmpjhbdiimuU9ATEuLxtZMQ7jLv9fyFn7SWNG8IkEfD4AmYyirL1ss9k1aqVWRvg==", + "dependencies": { + "tslib": "^1.9.3" + } + }, "node_modules/autoprefixer": { "version": "10.2.6", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.2.6.tgz", @@ -7408,6 +7417,11 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/js-bbcode-parser": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/js-bbcode-parser/-/js-bbcode-parser-3.0.4.tgz", + "integrity": "sha512-rF7oR1LI0mCqqMXEYKKWp3ovllnutT/vu1N+YOmPqGGPlMd73PNpdIJrdN89cbaBF08YUygi2dZUgvjGNAh5Aw==" + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -10111,6 +10125,21 @@ "node": ">= 0.10" } }, + "node_modules/remarkable": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/remarkable/-/remarkable-2.0.1.tgz", + "integrity": "sha512-YJyMcOH5lrR+kZdmB0aJJ4+93bEojRZ1HGDn9Eagu6ibg7aVZhc3OWbbShRid+Q5eAfsEqWxpe+g5W5nYNfNiA==", + "dependencies": { + "argparse": "^1.0.10", + "autolinker": "^3.11.0" + }, + "bin": { + "remarkable": "bin/remarkable.js" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/renderkid": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", @@ -10972,8 +11001,7 @@ "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, "node_modules/stable": { "version": "0.1.8", @@ -11582,8 +11610,7 @@ "node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/tunnel": { "version": "0.0.6", @@ -15022,7 +15049,6 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, "requires": { "sprintf-js": "~1.0.2" } @@ -15063,6 +15089,14 @@ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", "dev": true }, + "autolinker": { + "version": "3.14.3", + "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-3.14.3.tgz", + "integrity": "sha512-t81i2bCpS+s+5FIhatoww9DmpjhbdiimuU9ATEuLxtZMQ7jLv9fyFn7SWNG8IkEfD4AmYyirL1ss9k1aqVWRvg==", + "requires": { + "tslib": "^1.9.3" + } + }, "autoprefixer": { "version": "10.2.6", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.2.6.tgz", @@ -18369,6 +18403,11 @@ } } }, + "js-bbcode-parser": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/js-bbcode-parser/-/js-bbcode-parser-3.0.4.tgz", + "integrity": "sha512-rF7oR1LI0mCqqMXEYKKWp3ovllnutT/vu1N+YOmPqGGPlMd73PNpdIJrdN89cbaBF08YUygi2dZUgvjGNAh5Aw==" + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -20378,6 +20417,15 @@ "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", "dev": true }, + "remarkable": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/remarkable/-/remarkable-2.0.1.tgz", + "integrity": "sha512-YJyMcOH5lrR+kZdmB0aJJ4+93bEojRZ1HGDn9Eagu6ibg7aVZhc3OWbbShRid+Q5eAfsEqWxpe+g5W5nYNfNiA==", + "requires": { + "argparse": "^1.0.10", + "autolinker": "^3.11.0" + } + }, "renderkid": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", @@ -21045,8 +21093,7 @@ "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, "stable": { "version": "0.1.8", @@ -21493,8 +21540,7 @@ "tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "tunnel": { "version": "0.0.6", diff --git a/package.json b/package.json index 56cbb04..214adb8 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,9 @@ "@quasar/extras": "^1.0.0", "axios": "^0.21.1", "core-js": "^3.6.5", + "js-bbcode-parser": "^3.0.4", "quasar": "^2.0.0", + "remarkable": "^2.0.1", "vue-i18n": "^9.0.0-beta.0", "vuex": "^4.0.1" }, diff --git a/quasar.conf.js b/quasar.conf.js index 1b5540d..76c9942 100644 --- a/quasar.conf.js +++ b/quasar.conf.js @@ -103,6 +103,7 @@ module.exports = configure(function (ctx) { // Quasar plugins plugins: [ + 'Dialog', 'Notify', 'LocalStorage', 'SessionStorage' diff --git a/src/assets/bg-md1.jpg b/src/assets/bg-md1.jpg new file mode 100644 index 0000000..622265f Binary files /dev/null and b/src/assets/bg-md1.jpg differ diff --git a/src/components/Avatar.vue b/src/components/Avatar.vue index ba0029f..493ad14 100644 --- a/src/components/Avatar.vue +++ b/src/components/Avatar.vue @@ -1,5 +1,5 @@ diff --git a/src/components/MarkdownDialog.vue b/src/components/MarkdownDialog.vue new file mode 100644 index 0000000..5a8cc39 --- /dev/null +++ b/src/components/MarkdownDialog.vue @@ -0,0 +1,124 @@ + + + + + diff --git a/src/components/PendingTasks.vue b/src/components/PendingTasks.vue index f17fd00..33da34b 100644 --- a/src/components/PendingTasks.vue +++ b/src/components/PendingTasks.vue @@ -6,7 +6,7 @@
- {{ $t('dashboard.headers.pendingTasks') }} + {{ $t('headers.pendingTasks') }}
diff --git a/src/css/quasar.variables.scss b/src/css/quasar.variables.scss index 5d3ada7..0f9f987 100644 --- a/src/css/quasar.variables.scss +++ b/src/css/quasar.variables.scss @@ -12,11 +12,13 @@ // to match your app's branding. // Tip: Use the "Theme Builder" on Quasar's documentation website. -$primary : #009fdd; -$secondary : #59b1d4; +//003b68 -> 003d6b +$primary : #002e5c; +$secondary : #009fdd; $accent : #9C27B0; -$dark : #2f373e; +//1e1e1e -> 181818 +$dark : #333333; $positive : #21BA45; $negative : #C10015; diff --git a/src/js/markupParser.js b/src/js/markupParser.js new file mode 100644 index 0000000..455f706 --- /dev/null +++ b/src/js/markupParser.js @@ -0,0 +1,32 @@ +import bbCodeParser from 'js-bbcode-parser'; +import { Remarkable } from 'remarkable'; + +export const bbCodeToHTML = function (strings) { + return bbCodeParser.parse(strings); +} + +export const markdownToHTML = function (strings) { + let md = new Remarkable('full', { + html: true, // Enable HTML tags in source + xhtmlOut: false, // Use '/' to close single tags (
) + breaks: false, // Convert '\n' in paragraphs into
+ langPrefix: 'language-', // CSS language prefix for fenced blocks + + // Enable some language-neutral replacement + quotes beautification + typographer: false, + + // Double + single quotes replacement pairs, when typographer enabled, + // and smartquotes on. Set doubles to '«»' for Russian, '„“' for German. + quotes: '“”‘’', + + // Highlighter function. Should return escaped HTML, + // or '' if the source string is not changed + highlight: function (/*str, lang*/) { return ''; } + }); + return md.render(strings); +} + +export default { + bbCodeToHTML, + markdownToHTML +} diff --git a/src/js/unmanicGlobals.js b/src/js/unmanicGlobals.js index 8eed6fa..d37ff2c 100644 --- a/src/js/unmanicGlobals.js +++ b/src/js/unmanicGlobals.js @@ -2,12 +2,21 @@ import axios from "axios"; let $unmanic = {}; -export const getUnmanicApiUrl = function (api_version, api_endpoint) { - if (typeof $unmanic.apiUrl === 'undefined') { +export const getUnmanicServerUrl = function () { + if (typeof $unmanic.serverUrl === 'undefined') { let parser = document.createElement('a'); parser.href = window.location.href; - $unmanic.apiUrl = parser.protocol + '//' + parser.host + '/api'; + $unmanic.serverUrl = parser.protocol + '//' + parser.host; + } + return $unmanic.serverUrl; +} + +export const getUnmanicApiUrl = function (api_version, api_endpoint) { + if (typeof $unmanic.apiUrl === 'undefined') { + let serverUrl = getUnmanicServerUrl(); + + $unmanic.apiUrl = serverUrl + '/api'; } return $unmanic.apiUrl + '/' + api_version + '/' + api_endpoint; } @@ -51,5 +60,23 @@ export default { resolve($unmanic.session); } }) + }, + getUnmanicPrivacyPolicy() { + return new Promise((resolve, reject) => { + $unmanic.docs = (typeof $unmanic.docs === 'undefined') ? {} : $unmanic.docs + if (typeof $unmanic.docs.privacypolicy === 'undefined') { + axios({ + method: 'get', + url: getUnmanicApiUrl('v2', 'docs/privacypolicy') + }).then((response) => { + $unmanic.docs.privacypolicy = response.data.content.join('') + resolve($unmanic.docs.privacypolicy) + }).catch(() => { + reject() + }) + } else { + resolve($unmanic.docs.privacypolicy); + } + }) } } diff --git a/src/language/en-NZ.json b/src/language/en-NZ.json index bef3900..ab9a542 100644 --- a/src/language/en-NZ.json +++ b/src/language/en-NZ.json @@ -28,12 +28,11 @@ "failedToFetchLoginUrl": "Failed to get login URL.", "failedToFetchLogoutUrl": "Failed to get logout URL." }, - "dashboard": { - "headers": { - "workers": "Workers", - "pendingTasks": "Pending Tasks", - "completedTasks": "Completed Tasks" - } + "headers": { + "workers": "Workers", + "pendingTasks": "Pending Tasks", + "completedTasks": "Completed Tasks", + "privacyPolicy": "Privacy Policy" }, "components": { "workers": { diff --git a/src/layouts/MainLayout.vue b/src/layouts/MainLayout.vue index cf186f7..de6a695 100644 --- a/src/layouts/MainLayout.vue +++ b/src/layouts/MainLayout.vue @@ -1,7 +1,7 @@