fix: editor - show save button as saved when no modif

This commit is contained in:
NGPixel 2020-02-23 12:49:34 -05:00
parent 2d06a1d9df
commit c5a22f6d13
5 changed files with 704 additions and 1173 deletions

View File

@ -199,7 +199,7 @@ export default {
} }
} }
.dashboard-icon { .v-icon.dashboard-icon {
position: absolute; position: absolute;
right: 0; right: 0;
top: 12px; top: 12px;

View File

@ -12,9 +12,11 @@
@click='save' @click='save'
@click.ctrl.exact='saveAndClose' @click.ctrl.exact='saveAndClose'
:class='{ "is-icon": $vuetify.breakpoint.mdAndDown }' :class='{ "is-icon": $vuetify.breakpoint.mdAndDown }'
:disabled='!isDirty'
) )
v-icon(color='green', :left='$vuetify.breakpoint.lgAndUp') mdi-check v-icon(color='green', :left='$vuetify.breakpoint.lgAndUp') mdi-check
span.white--text(v-if='$vuetify.breakpoint.lgAndUp') {{ mode === 'create' ? $t('common:actions.create') : $t('common:actions.save') }} span(v-if='$vuetify.breakpoint.lgAndUp && mode !== `create` && !isDirty') {{ $t('editor:save.saved') }}
span.white--text(v-else-if='$vuetify.breakpoint.lgAndUp') {{ mode === 'create' ? $t('common:actions.create') : $t('common:actions.save') }}
v-btn.animated.fadeInDown.wait-p1s( v-btn.animated.fadeInDown.wait-p1s(
text text
color='blue' color='blue'
@ -131,7 +133,18 @@ export default {
activeModal: sync('editor/activeModal'), activeModal: sync('editor/activeModal'),
mode: get('editor/mode'), mode: get('editor/mode'),
welcomeMode() { return this.mode === `create` && this.path === `home` }, welcomeMode() { return this.mode === `create` && this.path === `home` },
currentPageTitle: get('page/title') currentPageTitle: get('page/title'),
isDirty () {
return _.some([
this.initContentParsed !== this.$store.get('editor/content'),
this.locale !== this.$store.get('page/locale'),
this.path !== this.$store.get('page/path'),
this.title !== this.$store.get('page/title'),
this.description !== this.$store.get('page/description'),
this.tags !== this.$store.get('page/tags'),
this.isPublished !== this.$store.get('page/isPublished')
], Boolean)
}
}, },
watch: { watch: {
currentEditor(newValue, oldValue) { currentEditor(newValue, oldValue) {
@ -284,7 +297,7 @@ export default {
} }
}, },
async exit() { async exit() {
if (this.initContentParsed !== this.$store.get('editor/content')) { if (this.isDirty) {
this.dialogUnsaved = true this.dialogUnsaved = true
} else { } else {
this.exitGo() this.exitGo()

View File

@ -36,19 +36,19 @@
}, },
"dependencies": { "dependencies": {
"@aoberoi/passport-slack": "1.0.5", "@aoberoi/passport-slack": "1.0.5",
"@azure/storage-blob": "12.0.2", "@azure/storage-blob": "12.1.0",
"@bugsnag/js": "6.5.0", "@bugsnag/js": "6.5.2",
"@exlinc/keycloak-passport": "1.0.2", "@exlinc/keycloak-passport": "1.0.2",
"@root/csr": "0.8.1", "@root/csr": "0.8.1",
"@root/keypairs": "0.9.0", "@root/keypairs": "0.9.0",
"@root/pem": "1.0.4", "@root/pem": "1.0.4",
"acme": "3.0.3", "acme": "3.0.3",
"algoliasearch": "3.35.1", "algoliasearch": "4.0.3",
"apollo-fetch": "0.7.0", "apollo-fetch": "0.7.0",
"apollo-server": "2.9.16", "apollo-server": "2.10.1",
"apollo-server-express": "2.9.16", "apollo-server-express": "2.10.1",
"auto-load": "3.0.4", "auto-load": "3.0.4",
"aws-sdk": "2.610.0", "aws-sdk": "2.624.0",
"azure-search-client": "3.1.5", "azure-search-client": "3.1.5",
"bcryptjs-then": "1.0.1", "bcryptjs-then": "1.0.1",
"bluebird": "3.7.2", "bluebird": "3.7.2",
@ -57,15 +57,15 @@
"chalk": "3.0.0", "chalk": "3.0.0",
"cheerio": "1.0.0-rc.3", "cheerio": "1.0.0-rc.3",
"chokidar": "3.3.1", "chokidar": "3.3.1",
"clean-css": "4.2.2", "clean-css": "4.2.3",
"compression": "1.7.4", "compression": "1.7.4",
"connect-session-knex": "1.5.0", "connect-session-knex": "1.5.0",
"cookie-parser": "1.4.4", "cookie-parser": "1.4.4",
"cors": "2.8.5", "cors": "2.8.5",
"custom-error-instance": "2.1.1", "custom-error-instance": "2.1.1",
"dependency-graph": "0.8.1", "dependency-graph": "0.9.0",
"diff": "4.0.2", "diff": "4.0.2",
"diff2html": "3.0.0-master.128204d", "diff2html": "3.1.2",
"dotize": "0.3.0", "dotize": "0.3.0",
"elasticsearch6": "npm:@elastic/elasticsearch@6", "elasticsearch6": "npm:@elastic/elasticsearch@6",
"elasticsearch7": "npm:@elastic/elasticsearch@7", "elasticsearch7": "npm:@elastic/elasticsearch@7",
@ -73,32 +73,32 @@
"express": "4.17.1", "express": "4.17.1",
"express-brute": "1.0.1", "express-brute": "1.0.1",
"express-session": "1.17.0", "express-session": "1.17.0",
"file-type": "13.1.2", "file-type": "14.1.2",
"filesize": "6.0.1", "filesize": "6.1.0",
"fs-extra": "8.1.0", "fs-extra": "8.1.0",
"getos": "3.1.4", "getos": "3.1.4",
"graphql": "14.6.0", "graphql": "14.6.0",
"graphql-list-fields": "2.0.2", "graphql-list-fields": "2.0.2",
"graphql-rate-limit-directive": "1.2.0", "graphql-rate-limit-directive": "1.2.1",
"graphql-subscriptions": "1.1.0", "graphql-subscriptions": "1.1.0",
"graphql-tools": "4.0.6", "graphql-tools": "4.0.7",
"he": "1.2.0", "he": "1.2.0",
"highlight.js": "9.18.0", "highlight.js": "9.18.1",
"i18next": "19.0.3", "i18next": "19.3.1",
"i18next-express-middleware": "1.9.1", "i18next-express-middleware": "1.9.1",
"i18next-node-fs-backend": "2.1.3", "i18next-node-fs-backend": "2.1.3",
"image-size": "0.8.3", "image-size": "0.8.3",
"js-base64": "2.5.1", "js-base64": "2.5.2",
"js-binary": "1.2.0", "js-binary": "1.2.0",
"js-yaml": "3.13.1", "js-yaml": "3.13.1",
"jsonwebtoken": "8.5.1", "jsonwebtoken": "8.5.1",
"katex": "0.11.1", "katex": "0.11.1",
"klaw": "3.0.0", "klaw": "3.0.0",
"knex": "0.20.8", "knex": "0.20.10",
"lodash": "4.17.15", "lodash": "4.17.15",
"markdown-it": "10.0.0", "markdown-it": "10.0.0",
"markdown-it-abbr": "1.0.4", "markdown-it-abbr": "1.0.4",
"markdown-it-attrs": "3.0.1", "markdown-it-attrs": "3.0.2",
"markdown-it-emoji": "1.4.0", "markdown-it-emoji": "1.4.0",
"markdown-it-expand-tabs": "1.0.13", "markdown-it-expand-tabs": "1.0.13",
"markdown-it-external-links": "0.0.6", "markdown-it-external-links": "0.0.6",
@ -112,19 +112,19 @@
"mathjax-node": "2.1.1", "mathjax-node": "2.1.1",
"mime-types": "2.1.26", "mime-types": "2.1.26",
"moment": "2.24.0", "moment": "2.24.0",
"moment-timezone": "0.5.27", "moment-timezone": "0.5.28",
"mongodb": "3.5.2", "mongodb": "3.5.3",
"ms": "2.1.2", "ms": "2.1.2",
"mssql": "6.0.1", "mssql": "6.1.0",
"multer": "1.4.2", "multer": "1.4.2",
"mysql2": "2.1.0", "mysql2": "2.1.0",
"nanoid": "2.1.10", "nanoid": "2.1.11",
"node-2fa": "1.1.2", "node-2fa": "1.1.2",
"node-cache": "5.1.0", "node-cache": "5.1.0",
"nodemailer": "6.4.2", "nodemailer": "6.4.3",
"objection": "2.1.2", "objection": "2.1.3",
"passport": "0.4.1", "passport": "0.4.1",
"passport-auth0": "1.3.1", "passport-auth0": "1.3.2",
"passport-azure-ad": "4.2.1", "passport-azure-ad": "4.2.1",
"passport-cas": "0.1.1", "passport-cas": "0.1.1",
"passport-discord": "0.1.3", "passport-discord": "0.1.3",
@ -140,24 +140,24 @@
"passport-oauth2": "1.5.0", "passport-oauth2": "1.5.0",
"passport-okta-oauth": "0.0.1", "passport-okta-oauth": "0.0.1",
"passport-openidconnect": "0.0.2", "passport-openidconnect": "0.0.2",
"passport-saml": "1.2.0", "passport-saml": "1.3.3",
"passport-twitch": "1.0.3", "passport-twitch": "1.0.3",
"pem-jwk": "2.0.0", "pem-jwk": "2.0.0",
"pg": "7.17.1", "pg": "7.18.2",
"pg-hstore": "2.3.3", "pg-hstore": "2.3.3",
"pg-query-stream": "3.0.0", "pg-query-stream": "3.0.3",
"pg-tsquery": "8.1.0", "pg-tsquery": "8.1.0",
"pug": "2.0.4", "pug": "2.0.4",
"punycode": "2.1.1", "punycode": "2.1.1",
"qr-image": "3.2.0", "qr-image": "3.2.0",
"raven": "2.6.4", "raven": "2.6.4",
"remove-markdown": "0.3.0", "remove-markdown": "0.3.0",
"request": "2.88.0", "request": "2.88.2",
"request-promise": "4.2.5", "request-promise": "4.2.5",
"safe-regex": "2.1.1", "safe-regex": "2.1.1",
"sanitize-filename": "1.6.3", "sanitize-filename": "1.6.3",
"scim-query-filter-parser": "2.0.4", "scim-query-filter-parser": "2.0.4",
"semver": "7.1.1", "semver": "7.1.3",
"serve-favicon": "2.5.0", "serve-favicon": "2.5.0",
"simple-git": "1.131.0", "simple-git": "1.131.0",
"solr-node": "1.2.1", "solr-node": "1.2.1",
@ -167,7 +167,7 @@
"striptags": "3.1.1", "striptags": "3.1.1",
"subscriptions-transport-ws": "0.9.16", "subscriptions-transport-ws": "0.9.16",
"tar-fs": "2.0.0", "tar-fs": "2.0.0",
"twemoji": "12.1.4", "twemoji": "12.1.5",
"uslug": "1.0.4", "uslug": "1.0.4",
"uuid": "3.4.0", "uuid": "3.4.0",
"validate.js": "0.13.1", "validate.js": "0.13.1",
@ -176,8 +176,8 @@
"yargs": "15.1.0" "yargs": "15.1.0"
}, },
"devDependencies": { "devDependencies": {
"@babel/cli": "^7.8.3", "@babel/cli": "^7.8.4",
"@babel/core": "^7.8.3", "@babel/core": "^7.8.4",
"@babel/plugin-proposal-class-properties": "^7.8.3", "@babel/plugin-proposal-class-properties": "^7.8.3",
"@babel/plugin-proposal-decorators": "^7.8.3", "@babel/plugin-proposal-decorators": "^7.8.3",
"@babel/plugin-proposal-export-namespace-from": "^7.8.3", "@babel/plugin-proposal-export-namespace-from": "^7.8.3",
@ -188,11 +188,11 @@
"@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-dynamic-import": "^7.8.3",
"@babel/plugin-syntax-import-meta": "^7.8.3", "@babel/plugin-syntax-import-meta": "^7.8.3",
"@babel/polyfill": "^7.8.3", "@babel/polyfill": "^7.8.3",
"@babel/preset-env": "^7.8.3", "@babel/preset-env": "^7.8.4",
"@mdi/font": "4.8.95", "@mdi/font": "4.9.95",
"@panter/vue-i18next": "0.15.1", "@panter/vue-i18next": "0.15.2",
"@requarks/ckeditor5": "12.4.0-wiki.14", "@requarks/ckeditor5": "12.4.0-wiki.14",
"@vue/babel-preset-app": "4.1.2", "@vue/babel-preset-app": "4.2.2",
"animate-sass": "0.8.2", "animate-sass": "0.8.2",
"animated-number-vue": "1.0.0", "animated-number-vue": "1.0.0",
"apollo-cache-inmemory": "1.6.5", "apollo-cache-inmemory": "1.6.5",
@ -216,7 +216,7 @@
"chart.js": "2.9.3", "chart.js": "2.9.3",
"clean-webpack-plugin": "3.0.0", "clean-webpack-plugin": "3.0.0",
"clipboard": "2.0.4", "clipboard": "2.0.4",
"codemirror": "5.51.0", "codemirror": "5.52.0",
"copy-webpack-plugin": "5.1.1", "copy-webpack-plugin": "5.1.1",
"core-js": "3.6.4", "core-js": "3.6.4",
"css-loader": "3.4.2", "css-loader": "3.4.2",
@ -227,23 +227,23 @@
"eslint": "6.8.0", "eslint": "6.8.0",
"eslint-config-requarks": "1.0.7", "eslint-config-requarks": "1.0.7",
"eslint-config-standard": "14.1.0", "eslint-config-standard": "14.1.0",
"eslint-plugin-import": "2.20.0", "eslint-plugin-import": "2.20.1",
"eslint-plugin-node": "11.0.0", "eslint-plugin-node": "11.0.0",
"eslint-plugin-promise": "4.2.1", "eslint-plugin-promise": "4.2.1",
"eslint-plugin-standard": "4.0.1", "eslint-plugin-standard": "4.0.1",
"eslint-plugin-vue": "6.1.2", "eslint-plugin-vue": "6.2.1",
"fibers": "4.0.2", "fibers": "4.0.2",
"file-loader": "5.0.2", "file-loader": "5.1.0",
"filepond": "4.9.5", "filepond": "4.11.0",
"filepond-plugin-file-validate-type": "1.2.4", "filepond-plugin-file-validate-type": "1.2.4",
"filesize.js": "2.0.0", "filesize.js": "2.0.0",
"graphql-persisted-document-loader": "2.0.0", "graphql-persisted-document-loader": "2.0.0",
"graphql-tag": "^2.10.1", "graphql-tag": "^2.10.3",
"hammerjs": "2.0.8", "hammerjs": "2.0.8",
"html-webpack-plugin": "4.0.0-beta.8", "html-webpack-plugin": "4.0.0-beta.8",
"html-webpack-pug-plugin": "2.0.0", "html-webpack-pug-plugin": "2.0.0",
"i18next-chained-backend": "2.0.1", "i18next-chained-backend": "2.0.1",
"i18next-localstorage-backend": "3.0.0", "i18next-localstorage-backend": "3.1.1",
"i18next-xhr-backend": "3.2.2", "i18next-xhr-backend": "3.2.2",
"ignore-loader": "0.1.2", "ignore-loader": "0.1.2",
"jest": "25.1.0", "jest": "25.1.0",
@ -253,7 +253,7 @@
"offline-plugin": "5.0.7", "offline-plugin": "5.0.7",
"optimize-css-assets-webpack-plugin": "5.0.3", "optimize-css-assets-webpack-plugin": "5.0.3",
"postcss-cssnext": "3.1.0", "postcss-cssnext": "3.1.0",
"postcss-flexbugs-fixes": "4.1.0", "postcss-flexbugs-fixes": "4.2.0",
"postcss-flexibility": "2.0.0", "postcss-flexibility": "2.0.0",
"postcss-import": "12.0.1", "postcss-import": "12.0.1",
"postcss-loader": "3.0.0", "postcss-loader": "3.0.0",
@ -282,7 +282,7 @@
"vue-clipboards": "1.3.0", "vue-clipboards": "1.3.0",
"vue-filepond": "6.0.2", "vue-filepond": "6.0.2",
"vue-hot-reload-api": "2.3.4", "vue-hot-reload-api": "2.3.4",
"vue-loader": "15.8.3", "vue-loader": "15.9.0",
"vue-moment": "4.1.0", "vue-moment": "4.1.0",
"vue-router": "3.1.5", "vue-router": "3.1.5",
"vue-status-indicator": "1.2.1", "vue-status-indicator": "1.2.1",
@ -290,14 +290,14 @@
"vue2-animate": "2.1.3", "vue2-animate": "2.1.3",
"vuedraggable": "2.23.2", "vuedraggable": "2.23.2",
"vuescroll": "4.14.4", "vuescroll": "4.14.4",
"vuetify": "2.2.6", "vuetify": "2.2.14",
"vuetify-loader": "1.4.3", "vuetify-loader": "1.4.3",
"vuex": "3.1.2", "vuex": "3.1.2",
"vuex-pathify": "1.4.1", "vuex-pathify": "1.4.1",
"vuex-persistedstate": "2.7.0", "vuex-persistedstate": "2.7.1",
"webpack": "4.41.5", "webpack": "4.41.6",
"webpack-bundle-analyzer": "3.6.0", "webpack-bundle-analyzer": "3.6.0",
"webpack-cli": "3.3.10", "webpack-cli": "3.3.11",
"webpack-dev-middleware": "3.7.2", "webpack-dev-middleware": "3.7.2",
"webpack-hot-middleware": "2.25.0", "webpack-hot-middleware": "2.25.0",
"webpack-merge": "4.2.2", "webpack-merge": "4.2.2",
@ -305,7 +305,7 @@
"webpackbar": "4.0.0", "webpackbar": "4.0.0",
"whatwg-fetch": "3.0.0", "whatwg-fetch": "3.0.0",
"write-file-webpack-plugin": "4.5.1", "write-file-webpack-plugin": "4.5.1",
"xterm": "4.3.0", "xterm": "4.4.0",
"zxcvbn": "4.4.2" "zxcvbn": "4.4.2"
}, },
"browserslist": [ "browserslist": [

View File

@ -47,8 +47,7 @@ module.exports = {
*/ */
async query(q, opts) { async query(q, opts) {
try { try {
const results = await this.index.search({ const results = await this.index.search(q, {
query: q,
hitsPerPage: 50 hitsPerPage: 50
}) })
return { return {
@ -73,7 +72,7 @@ module.exports = {
* @param {Object} page Page to create * @param {Object} page Page to create
*/ */
async created(page) { async created(page) {
await this.index.addObject({ await this.index.saveObject({
objectID: page.hash, objectID: page.hash,
locale: page.localeCode, locale: page.localeCode,
path: page.path, path: page.path,
@ -110,7 +109,7 @@ module.exports = {
*/ */
async renamed(page) { async renamed(page) {
await this.index.deleteObject(page.hash) await this.index.deleteObject(page.hash)
await this.index.addObject({ await this.index.saveObject({
objectID: page.destinationHash, objectID: page.destinationHash,
locale: page.destinationLocaleCode, locale: page.destinationLocaleCode,
path: page.destinationPath, path: page.destinationPath,
@ -124,7 +123,7 @@ module.exports = {
*/ */
async rebuild() { async rebuild() {
WIKI.logger.info(`(SEARCH/ALGOLIA) Rebuilding Index...`) WIKI.logger.info(`(SEARCH/ALGOLIA) Rebuilding Index...`)
await this.index.clearIndex() await this.index.clearObjects()
const MAX_DOCUMENT_BYTES = 10 * Math.pow(2, 10) // 10 KB const MAX_DOCUMENT_BYTES = 10 * Math.pow(2, 10) // 10 KB
const MAX_INDEXING_BYTES = 10 * Math.pow(2, 20) - Buffer.from('[').byteLength - Buffer.from(']').byteLength // 10 MB const MAX_INDEXING_BYTES = 10 * Math.pow(2, 20) - Buffer.from('[').byteLength - Buffer.from(']').byteLength // 10 MB
@ -171,7 +170,7 @@ module.exports = {
const flushBuffer = async () => { const flushBuffer = async () => {
WIKI.logger.info(`(SEARCH/ALGOLIA) Sending batch of ${chunks.length}...`) WIKI.logger.info(`(SEARCH/ALGOLIA) Sending batch of ${chunks.length}...`)
try { try {
await this.index.addObjects( await this.index.saveObjects(
_.map(chunks, doc => ({ _.map(chunks, doc => ({
objectID: doc.id, objectID: doc.id,
locale: doc.locale, locale: doc.locale,

1743
yarn.lock

File diff suppressed because it is too large Load Diff