From bdd5da4ec6239a70813a5f75f250b1ce79c0c445 Mon Sep 17 00:00:00 2001 From: DorofeevMark Date: Fri, 21 Dec 2018 08:49:35 +0300 Subject: [PATCH] Added ability to change uri manually --- public/dist/main.bundle.js | 2 +- public/dist/main.css | 2 +- src/controllers/aliases.js | 2 +- src/controllers/pages.js | 20 ++++++++++++-------- src/frontend/js/modules/writing.js | 5 ++++- src/frontend/styles/components/writing.pcss | 10 ++++++++++ src/frontend/styles/vars.pcss | 1 + src/models/alias.js | 6 +++++- src/models/page.js | 4 ++-- src/routes/aliases.js | 3 +-- src/routes/api/pages.js | 4 ++-- src/views/pages/form.twig | 9 +++++++-- 12 files changed, 47 insertions(+), 21 deletions(-) diff --git a/public/dist/main.bundle.js b/public/dist/main.bundle.js index a4d8e17..324e247 100644 --- a/public/dist/main.bundle.js +++ b/public/dist/main.bundle.js @@ -7,4 +7,4 @@ var Docs=function(t){function e(e){for(var n,r,i=e[0],a=e[1],u=0,c=[];u=0;o--)e.push.apply(e,r(this.extractModulesData(n[o])));return e}},{key:"extractModulesData",value:function(t){var e=this,n=[],r=t.dataset.module;return(r=r.replace(/\s+/," ")).split(" ").forEach(function(r,o){var i=new a({name:r,element:t,settings:e.getModuleSettings(t,o,r),moduleClass:e.Library[r]});n.push(i)}),n}},{key:"getModuleSettings",value:function(t,e,n){var r=t.querySelector("module-settings"),o=void 0;if(!r)return null;try{o=r.textContent.trim(),o=JSON.parse(o)}catch(t){return console.warn("Can not parse Module «"+n+"» settings bacause of: "+t),console.groupCollapsed(n+" settings"),console.log(o),console.groupEnd(),null}return Array.isArray(o)?o[e]?o[e]:null:0===e?o:(console.warn("Wrong settings format. For several Modules use an array instead of object."),null)}},{key:"initModules",value:function(){console.groupCollapsed("ModuleDispatcher"),this.modules.forEach(function(t){t.init()}),console.groupEnd()}}]),t}();e.default=u}])},function(t,e,n){var r=n(28),o=Math.min;t.exports=function(t){return t>0?o(r(t),9007199254740991):0}},function(t,e){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},function(t,e){var n=Math.ceil,r=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?r:n)(t)}},function(t,e,n){var r=n(6).f,o=n(15),i=n(1)("toStringTag");t.exports=function(t,e,n){t&&!o(t=n?t:t.prototype,i)&&r(t,i,{configurable:!0,value:e})}},function(t,e,n){var r=n(5),o=n(0),i=o["__core-js_shared__"]||(o["__core-js_shared__"]={});(t.exports=function(t,e){return i[t]||(i[t]=void 0!==e?e:{})})("versions",[]).push({version:r.version,mode:n(19)?"pure":"global",copyright:"© 2018 Denis Pushkarev (zloirock.ru)"})},function(t,e,n){var r=n(2);t.exports=function(t,e,n,o){try{return o?e(r(n)[0],n[1]):e(n)}catch(e){var i=t.return;throw void 0!==i&&r(i.call(t)),e}}},function(t,e,n){var r=n(13),o=n(1)("iterator"),i=Array.prototype;t.exports=function(t){return void 0!==t&&(r.Array===t||i[o]===t)}},function(t,e,n){var r=n(21),o=n(1)("iterator"),i=n(13);t.exports=n(5).getIteratorMethod=function(t){if(null!=t)return t[o]||t["@@iterator"]||i[r(t)]}},function(t,e,n){var r=n(0).document;t.exports=r&&r.documentElement},function(t,e,n){var r=n(1)("iterator"),o=!1;try{var i=[7][r]();i.return=function(){o=!0},Array.from(i,function(){throw 2})}catch(t){}t.exports=function(t,e){if(!e&&!o)return!1;var n=!1;try{var i=[7],a=i[r]();a.next=function(){return{done:n=!0}},i[r]=function(){return a},t(i)}catch(t){}return n}},function(t,e,n){t.exports=!n(4)&&!n(16)(function(){return 7!=Object.defineProperty(n(17)("div"),"a",{get:function(){return 7}}).a})},function(t,e,n){var r=n(3);t.exports=function(t,e){if(!r(t))return t;var n,o;if(e&&"function"==typeof(n=t.toString)&&!r(o=n.call(t)))return o;if("function"==typeof(n=t.valueOf)&&!r(o=n.call(t)))return o;if(!e&&"function"==typeof(n=t.toString)&&!r(o=n.call(t)))return o;throw TypeError("Can't convert object to primitive value")}},function(t,e,n){},function(t,e){t.exports=function(t,e,n,r){if(!(t instanceof e)||void 0!==r&&r in t)throw TypeError(n+": incorrect invocation!");return t}},function(t,e,n){var r=n(7),o=n(31),i=n(32),a=n(2),u=n(26),c=n(33),s={},f={};(e=t.exports=function(t,e,n,l,h){var p,d,v,y,m=h?function(){return t}:c(t),g=r(n,l,e?2:1),w=0;if("function"!=typeof m)throw TypeError(t+" is not iterable!");if(i(m)){for(p=u(t.length);p>w;w++)if((y=e?g(a(d=t[w])[0],d[1]):g(t[w]))===s||y===f)return y}else for(v=m.call(t);!(d=v.next()).done;)if((y=o(v,g,d.value,e))===s||y===f)return y}).BREAK=s,e.RETURN=f},function(t,e,n){var r=n(2),o=n(8),i=n(1)("species");t.exports=function(t,e){var n,a=r(t).constructor;return void 0===a||null==(n=r(a)[i])?e:o(n)}},function(t,e){t.exports=function(t,e,n){var r=void 0===n;switch(e.length){case 0:return r?t():t.call(n);case 1:return r?t(e[0]):t.call(n,e[0]);case 2:return r?t(e[0],e[1]):t.call(n,e[0],e[1]);case 3:return r?t(e[0],e[1],e[2]):t.call(n,e[0],e[1],e[2]);case 4:return r?t(e[0],e[1],e[2],e[3]):t.call(n,e[0],e[1],e[2],e[3])}return t.apply(n,e)}},function(t,e,n){var r=n(0),o=n(22).set,i=r.MutationObserver||r.WebKitMutationObserver,a=r.process,u=r.Promise,c="process"==n(10)(a);t.exports=function(){var t,e,n,s=function(){var r,o;for(c&&(r=a.domain)&&r.exit();t;){o=t.fn,t=t.next;try{o()}catch(r){throw t?n():e=void 0,r}}e=void 0,r&&r.enter()};if(c)n=function(){a.nextTick(s)};else if(!i||r.navigator&&r.navigator.standalone)if(u&&u.resolve){var f=u.resolve(void 0);n=function(){f.then(s)}}else n=function(){o.call(r,s)};else{var l=!0,h=document.createTextNode("");new i(s).observe(h,{characterData:!0}),n=function(){h.data=l=!l}}return function(r){var o={fn:r,next:void 0};e&&(e.next=o),t||(t=o,n()),e=o}}},function(t,e){t.exports=function(t){try{return{e:!1,v:t()}}catch(t){return{e:!0,v:t}}}},function(t,e,n){var r=n(0).navigator;t.exports=r&&r.userAgent||""},function(t,e,n){var r=n(2),o=n(3),i=n(23);t.exports=function(t,e){if(r(t),o(e)&&e.constructor===t)return e;var n=i.f(t);return(0,n.resolve)(e),n.promise}},function(t,e,n){var r=n(14);t.exports=function(t,e,n){for(var o in e)r(t,o,e[o],n);return t}},function(t,e,n){"use strict";var r=n(0),o=n(6),i=n(4),a=n(1)("species");t.exports=function(t){var e=r[t];i&&e&&!e[a]&&o.f(e,a,{configurable:!0,get:function(){return this}})}},function(t,e,n){"use strict";n.r(e);n(9),n(38);var r=n(25),o=n.n(r);n(20),n(24);function i(t,e,n,r,o,i,a){try{var u=t[i](a),c=u.value}catch(t){return void n(t)}u.done?e(c):Promise.resolve(c).then(r,o)}function a(t){return function(){var e=this,n=arguments;return new Promise(function(r,o){var a=t.apply(e,n);function u(t){i(a,r,o,u,c,"next",t)}function c(t){i(a,r,o,u,c,"throw",t)}u(void 0)})}}function u(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{},n=arguments.length>1?arguments[1]:void 0;this.nodes.editorWrapper=document.createElement("div"),this.nodes.editorWrapper.id="codex-editor",n.appendChild(this.nodes.editorWrapper),e.page&&(this.page=e.page),this.loadEditor().then(function(e){t.editor=e}),this.nodes.saveButton=n.querySelector('[name="js-submit"]'),this.nodes.saveButton.addEventListener("click",function(){t.saveButtonClicked()}),this.nodes.parentIdSelector=n.querySelector('[name="parent"]')}},{key:"loadEditor",value:function(){var t=a(regeneratorRuntime.mark(function t(){var e,r;return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,n.e(1).then(n.bind(null,88));case 2:return e=t.sent,r=e.default,t.abrupt("return",new r({initialData:this.page?this.page.body:null}));case 5:case"end":return t.stop()}},t,this)}));return function(){return t.apply(this,arguments)}}()},{key:"getData",value:function(){var t=a(regeneratorRuntime.mark(function t(){var e,n;return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,this.editor.save();case 2:if(e=t.sent,n=e.blocks.length?e.blocks[0]:null,n&&"header"===n.type?n.data.text:null){t.next=7;break}throw new Error("Entry should start with Header");case 7:return t.abrupt("return",{parent:this.nodes.parentIdSelector.value,body:e});case 8:case"end":return t.stop()}},t,this)}));return function(){return t.apply(this,arguments)}}()},{key:"saveButtonClicked",value:function(){var t=a(regeneratorRuntime.mark(function t(){var e,n,r;return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,this.getData();case 3:return e=t.sent,n=this.page?"/api/page/"+this.page._id:"/api/page",t.prev=5,t.next=8,fetch(n,{method:this.page?"POST":"PUT",headers:{"Content-Type":"application/json; charset=utf-8"},body:JSON.stringify(e)});case 8:return r=t.sent,t.next=11,r.json();case 11:(r=t.sent).success?window.location.pathname=r.result.uri:(alert(r.error),console.log("Validation failed:",r.error)),t.next=18;break;case 15:t.prev=15,t.t0=t.catch(5),console.log("Saving request failed:",t.t0);case 18:t.next=24;break;case 20:t.prev=20,t.t1=t.catch(0),alert(t.t1),console.log("Saving error: ",t.t1);case 24:case"end":return t.stop()}},t,this,[[0,20],[5,15]])}));return function(){return t.apply(this,arguments)}}()}])&&u(e.prototype,r),o&&u(e,o),t}();function s(t,e,n,r,o,i,a){try{var u=t[i](a),c=u.value}catch(t){return void n(t)}u.done?e(c):Promise.resolve(c).then(r,o)}function f(t,e){for(var n=0;n0&&void 0!==arguments[0]&&arguments[0],arguments.length>1&&arguments[1];this.codeStyler=this.createCodeStyling()}},{key:"createCodeStyling",value:function(){var t,e=(t=regeneratorRuntime.mark(function t(){var e,r;return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,n.e(0).then(n.bind(null,89));case 2:return e=t.sent,r=e.default,t.abrupt("return",new r({selector:".block-code"}));case 5:case"end":return t.stop()}},t,this)}),function(){var e=this,n=arguments;return new Promise(function(r,o){var i=t.apply(e,n);function a(t){s(i,r,o,a,u,"next",t)}function u(t){s(i,r,o,a,u,"throw",t)}a(void 0)})});return function(){return e.apply(this,arguments)}}()}])&&f(e.prototype,r),o&&f(e,o),t}();function h(t,e){for(var n=0;n=0;o--)e.push.apply(e,r(this.extractModulesData(n[o])));return e}},{key:"extractModulesData",value:function(t){var e=this,n=[],r=t.dataset.module;return(r=r.replace(/\s+/," ")).split(" ").forEach(function(r,o){var i=new a({name:r,element:t,settings:e.getModuleSettings(t,o,r),moduleClass:e.Library[r]});n.push(i)}),n}},{key:"getModuleSettings",value:function(t,e,n){var r=t.querySelector("module-settings"),o=void 0;if(!r)return null;try{o=r.textContent.trim(),o=JSON.parse(o)}catch(t){return console.warn("Can not parse Module «"+n+"» settings bacause of: "+t),console.groupCollapsed(n+" settings"),console.log(o),console.groupEnd(),null}return Array.isArray(o)?o[e]?o[e]:null:0===e?o:(console.warn("Wrong settings format. For several Modules use an array instead of object."),null)}},{key:"initModules",value:function(){console.groupCollapsed("ModuleDispatcher"),this.modules.forEach(function(t){t.init()}),console.groupEnd()}}]),t}();e.default=u}])},function(t,e,n){var r=n(28),o=Math.min;t.exports=function(t){return t>0?o(r(t),9007199254740991):0}},function(t,e){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},function(t,e){var n=Math.ceil,r=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?r:n)(t)}},function(t,e,n){var r=n(6).f,o=n(15),i=n(1)("toStringTag");t.exports=function(t,e,n){t&&!o(t=n?t:t.prototype,i)&&r(t,i,{configurable:!0,value:e})}},function(t,e,n){var r=n(5),o=n(0),i=o["__core-js_shared__"]||(o["__core-js_shared__"]={});(t.exports=function(t,e){return i[t]||(i[t]=void 0!==e?e:{})})("versions",[]).push({version:r.version,mode:n(19)?"pure":"global",copyright:"© 2018 Denis Pushkarev (zloirock.ru)"})},function(t,e,n){var r=n(2);t.exports=function(t,e,n,o){try{return o?e(r(n)[0],n[1]):e(n)}catch(e){var i=t.return;throw void 0!==i&&r(i.call(t)),e}}},function(t,e,n){var r=n(13),o=n(1)("iterator"),i=Array.prototype;t.exports=function(t){return void 0!==t&&(r.Array===t||i[o]===t)}},function(t,e,n){var r=n(21),o=n(1)("iterator"),i=n(13);t.exports=n(5).getIteratorMethod=function(t){if(null!=t)return t[o]||t["@@iterator"]||i[r(t)]}},function(t,e,n){var r=n(0).document;t.exports=r&&r.documentElement},function(t,e,n){var r=n(1)("iterator"),o=!1;try{var i=[7][r]();i.return=function(){o=!0},Array.from(i,function(){throw 2})}catch(t){}t.exports=function(t,e){if(!e&&!o)return!1;var n=!1;try{var i=[7],a=i[r]();a.next=function(){return{done:n=!0}},i[r]=function(){return a},t(i)}catch(t){}return n}},function(t,e,n){t.exports=!n(4)&&!n(16)(function(){return 7!=Object.defineProperty(n(17)("div"),"a",{get:function(){return 7}}).a})},function(t,e,n){var r=n(3);t.exports=function(t,e){if(!r(t))return t;var n,o;if(e&&"function"==typeof(n=t.toString)&&!r(o=n.call(t)))return o;if("function"==typeof(n=t.valueOf)&&!r(o=n.call(t)))return o;if(!e&&"function"==typeof(n=t.toString)&&!r(o=n.call(t)))return o;throw TypeError("Can't convert object to primitive value")}},function(t,e,n){},function(t,e){t.exports=function(t,e,n,r){if(!(t instanceof e)||void 0!==r&&r in t)throw TypeError(n+": incorrect invocation!");return t}},function(t,e,n){var r=n(7),o=n(31),i=n(32),a=n(2),u=n(26),c=n(33),s={},f={};(e=t.exports=function(t,e,n,l,h){var p,d,v,y,m=h?function(){return t}:c(t),g=r(n,l,e?2:1),w=0;if("function"!=typeof m)throw TypeError(t+" is not iterable!");if(i(m)){for(p=u(t.length);p>w;w++)if((y=e?g(a(d=t[w])[0],d[1]):g(t[w]))===s||y===f)return y}else for(v=m.call(t);!(d=v.next()).done;)if((y=o(v,g,d.value,e))===s||y===f)return y}).BREAK=s,e.RETURN=f},function(t,e,n){var r=n(2),o=n(8),i=n(1)("species");t.exports=function(t,e){var n,a=r(t).constructor;return void 0===a||null==(n=r(a)[i])?e:o(n)}},function(t,e){t.exports=function(t,e,n){var r=void 0===n;switch(e.length){case 0:return r?t():t.call(n);case 1:return r?t(e[0]):t.call(n,e[0]);case 2:return r?t(e[0],e[1]):t.call(n,e[0],e[1]);case 3:return r?t(e[0],e[1],e[2]):t.call(n,e[0],e[1],e[2]);case 4:return r?t(e[0],e[1],e[2],e[3]):t.call(n,e[0],e[1],e[2],e[3])}return t.apply(n,e)}},function(t,e,n){var r=n(0),o=n(22).set,i=r.MutationObserver||r.WebKitMutationObserver,a=r.process,u=r.Promise,c="process"==n(10)(a);t.exports=function(){var t,e,n,s=function(){var r,o;for(c&&(r=a.domain)&&r.exit();t;){o=t.fn,t=t.next;try{o()}catch(r){throw t?n():e=void 0,r}}e=void 0,r&&r.enter()};if(c)n=function(){a.nextTick(s)};else if(!i||r.navigator&&r.navigator.standalone)if(u&&u.resolve){var f=u.resolve(void 0);n=function(){f.then(s)}}else n=function(){o.call(r,s)};else{var l=!0,h=document.createTextNode("");new i(s).observe(h,{characterData:!0}),n=function(){h.data=l=!l}}return function(r){var o={fn:r,next:void 0};e&&(e.next=o),t||(t=o,n()),e=o}}},function(t,e){t.exports=function(t){try{return{e:!1,v:t()}}catch(t){return{e:!0,v:t}}}},function(t,e,n){var r=n(0).navigator;t.exports=r&&r.userAgent||""},function(t,e,n){var r=n(2),o=n(3),i=n(23);t.exports=function(t,e){if(r(t),o(e)&&e.constructor===t)return e;var n=i.f(t);return(0,n.resolve)(e),n.promise}},function(t,e,n){var r=n(14);t.exports=function(t,e,n){for(var o in e)r(t,o,e[o],n);return t}},function(t,e,n){"use strict";var r=n(0),o=n(6),i=n(4),a=n(1)("species");t.exports=function(t){var e=r[t];i&&e&&!e[a]&&o.f(e,a,{configurable:!0,get:function(){return this}})}},function(t,e,n){"use strict";n.r(e);n(9),n(38);var r=n(25),o=n.n(r);n(20),n(24);function i(t,e,n,r,o,i,a){try{var u=t[i](a),c=u.value}catch(t){return void n(t)}u.done?e(c):Promise.resolve(c).then(r,o)}function a(t){return function(){var e=this,n=arguments;return new Promise(function(r,o){var a=t.apply(e,n);function u(t){i(a,r,o,u,c,"next",t)}function c(t){i(a,r,o,u,c,"throw",t)}u(void 0)})}}function u(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{},n=arguments.length>1?arguments[1]:void 0;this.nodes.editorWrapper=document.createElement("div"),this.nodes.editorWrapper.id="codex-editor",n.appendChild(this.nodes.editorWrapper),e.page&&(this.page=e.page),this.loadEditor().then(function(e){t.editor=e}),this.nodes.saveButton=n.querySelector('[name="js-submit"]'),this.nodes.saveButton.addEventListener("click",function(){t.saveButtonClicked()}),this.nodes.parentIdSelector=n.querySelector('[name="parent"]'),this.nodes.uriInput=n.querySelector('[name="uri-input"]')}},{key:"loadEditor",value:function(){var t=a(regeneratorRuntime.mark(function t(){var e,r;return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,n.e(1).then(n.bind(null,88));case 2:return e=t.sent,r=e.default,t.abrupt("return",new r({initialData:this.page?this.page.body:null}));case 5:case"end":return t.stop()}},t,this)}));return function(){return t.apply(this,arguments)}}()},{key:"getData",value:function(){var t=a(regeneratorRuntime.mark(function t(){var e,n;return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,this.editor.save();case 2:if(e=t.sent,n=e.blocks.length?e.blocks[0]:null,n&&"header"===n.type?n.data.text:null){t.next=7;break}throw new Error("Entry should start with Header");case 7:return t.abrupt("return",{parent:this.nodes.parentIdSelector.value,uri:this.nodes.uriInput?this.nodes.uriInput.value:"",body:e});case 8:case"end":return t.stop()}},t,this)}));return function(){return t.apply(this,arguments)}}()},{key:"saveButtonClicked",value:function(){var t=a(regeneratorRuntime.mark(function t(){var e,n,r;return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,this.getData();case 3:return e=t.sent,n=this.page?"/api/page/"+this.page._id:"/api/page",t.prev=5,t.next=8,fetch(n,{method:this.page?"POST":"PUT",headers:{"Content-Type":"application/json; charset=utf-8"},body:JSON.stringify(e)});case 8:return r=t.sent,t.next=11,r.json();case 11:(r=t.sent).success?window.location.pathname=r.result.uri:(alert(r.error),console.log("Validation failed:",r.error)),t.next=18;break;case 15:t.prev=15,t.t0=t.catch(5),console.log("Saving request failed:",t.t0);case 18:t.next=24;break;case 20:t.prev=20,t.t1=t.catch(0),alert(t.t1),console.log("Saving error: ",t.t1);case 24:case"end":return t.stop()}},t,this,[[0,20],[5,15]])}));return function(){return t.apply(this,arguments)}}()}])&&u(e.prototype,r),o&&u(e,o),t}();function s(t,e,n,r,o,i,a){try{var u=t[i](a),c=u.value}catch(t){return void n(t)}u.done?e(c):Promise.resolve(c).then(r,o)}function f(t,e){for(var n=0;n0&&void 0!==arguments[0]&&arguments[0],arguments.length>1&&arguments[1];this.codeStyler=this.createCodeStyling()}},{key:"createCodeStyling",value:function(){var t,e=(t=regeneratorRuntime.mark(function t(){var e,r;return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,n.e(0).then(n.bind(null,89));case 2:return e=t.sent,r=e.default,t.abrupt("return",new r({selector:".block-code"}));case 5:case"end":return t.stop()}},t,this)}),function(){var e=this,n=arguments;return new Promise(function(r,o){var i=t.apply(e,n);function a(t){s(i,r,o,a,u,"next",t)}function u(t){s(i,r,o,a,u,"throw",t)}a(void 0)})});return function(){return e.apply(this,arguments)}}()}])&&f(e.prototype,r),o&&f(e,o),t}();function h(t,e){for(var n=0;n} */ static async get(aliasName) { - const alias = await Alias.get(aliasName.slice(1)); + const alias = await Alias.get(aliasName); if (!alias.id) { throw new Error('Entity with given alias does not exist'); diff --git a/src/controllers/pages.js b/src/controllers/pages.js index e9e2263..9e06e78 100644 --- a/src/controllers/pages.js +++ b/src/controllers/pages.js @@ -117,21 +117,25 @@ class Pages { if (!page._id) { throw new Error('Page with given id does not exist'); } - const oldAlias = page.uri; + const previousUri = page.uri; page.data = data; + const pagePromise = page.save(); const updatedPage = await pagePromise; - Alias.markAsDeprecated(oldAlias); + if (updatedPage.uri !== previousUri) { + Alias.markAsDeprecated(previousUri); - const alias = new Alias({ - id: updatedPage._id, - type: aliasTypes.PAGE, - hash: md5(updatedPage.uri) - }); + const alias = new Alias({ + id: updatedPage._id, + type: aliasTypes.PAGE, + hash: md5(updatedPage.uri) + }); + + alias.save(); + } - alias.save(); return pagePromise; } diff --git a/src/frontend/js/modules/writing.js b/src/frontend/js/modules/writing.js index e63e697..4bc9aee 100644 --- a/src/frontend/js/modules/writing.js +++ b/src/frontend/js/modules/writing.js @@ -27,7 +27,8 @@ export default class Writing { this.nodes = { editorWrapper: null, saveButton: null, - parentIdSelector: null + parentIdSelector: null, + uriInput: null }; } @@ -61,6 +62,7 @@ export default class Writing { this.saveButtonClicked(); }); this.nodes.parentIdSelector = moduleEl.querySelector('[name="parent"]'); + this.nodes.uriInput = moduleEl.querySelector('[name="uri-input"]'); }; /** @@ -91,6 +93,7 @@ export default class Writing { return { parent: this.nodes.parentIdSelector.value, + uri: this.nodes.uriInput ? this.nodes.uriInput.value : '', body: editorData }; } diff --git a/src/frontend/styles/components/writing.pcss b/src/frontend/styles/components/writing.pcss index a557019..472ce76 100644 --- a/src/frontend/styles/components/writing.pcss +++ b/src/frontend/styles/components/writing.pcss @@ -18,3 +18,13 @@ color: var(--color-text-second); } } + +.uri-input { + border: 1px solid rgba(201, 201, 204, 0.48); + box-shadow: inset 0 1px 2px 0 rgba(35, 44, 72, 0.06); + border-radius: 3px; + padding: 10px 12px; + outline: none; + width: 100%; + box-sizing: border-box; +} diff --git a/src/frontend/styles/vars.pcss b/src/frontend/styles/vars.pcss index 59aaa4a..9fd27f0 100644 --- a/src/frontend/styles/vars.pcss +++ b/src/frontend/styles/vars.pcss @@ -3,6 +3,7 @@ --color-text-second: #7B7E89; --color-line-gray: #E8E8EB; --color-link-active: #388AE5; + --color-gray-border: rgba(201, 201, 204, 0.48); /** * Site layout sizes diff --git a/src/models/alias.js b/src/models/alias.js index 9bfc34e..07381cb 100644 --- a/src/models/alias.js +++ b/src/models/alias.js @@ -26,7 +26,11 @@ class Alias { */ static async get(aliasName) { const hash = md5(aliasName); - const data = await aliasesDb.findOne({hash}); + let data = await aliasesDb.findOne({hash: hash, deprecated: false}); + + if (!data) { + data = await aliasesDb.findOne({hash: hash}); + } return new Alias(data); } diff --git a/src/models/page.js b/src/models/page.js index 4430af7..33a3fb9 100644 --- a/src/models/page.js +++ b/src/models/page.js @@ -148,11 +148,11 @@ class Page { * @returns {Promise} */ async save() { - let newUri = translateString(this.title.toLowerCase()).split(' ').join('-'); + let newUri = this.uri; let pageWithSameUri = await Page.getByUri(newUri); let pageWithSameUriCount = 0; - while (pageWithSameUri._id) { + while (pageWithSameUri._id && pageWithSameUri._id !== this._id) { pageWithSameUriCount++; pageWithSameUri = await Page.getByUri(newUri + `-${pageWithSameUriCount}`); } diff --git a/src/routes/aliases.js b/src/routes/aliases.js index 5d141fd..482282d 100644 --- a/src/routes/aliases.js +++ b/src/routes/aliases.js @@ -11,8 +11,7 @@ const aliasTypes = require('../constants/aliasTypes'); */ router.get('*', async (req, res) => { try { - console.log('url ', req.originalUrl); - const alias = await Aliases.get(req.originalUrl); + const alias = await Aliases.get(req.originalUrl.slice(1)); switch (alias.type) { case aliasTypes.PAGE: { diff --git a/src/routes/api/pages.js b/src/routes/api/pages.js index cf315b5..b67bf20 100644 --- a/src/routes/api/pages.js +++ b/src/routes/api/pages.js @@ -76,8 +76,8 @@ router.post('/page/:id', multer.any(), async (req, res) => { const {id} = req.params; try { - const {title, body, parent} = req.body; - const page = await Pages.update(id, {title, body, parent}); + const {title, body, parent, uri} = req.body; + const page = await Pages.update(id, {title, body, parent, uri}); res.json({ success: true, diff --git a/src/views/pages/form.twig b/src/views/pages/form.twig index 204e50e..6e1a5c8 100644 --- a/src/views/pages/form.twig +++ b/src/views/pages/form.twig @@ -9,7 +9,7 @@
@@ -23,7 +23,7 @@ {% for _page in pagesAvailable %} {% if _page._id != currentPageId %} - {% endif %} @@ -34,5 +34,10 @@ Save
+ {% if page is not empty %} +
+ +
+ {% endif %}
{% endblock %}