From b4194e0012719bfad1b24c74ba953785b0914f5a Mon Sep 17 00:00:00 2001 From: Petr Sloup Date: Tue, 24 May 2016 11:42:25 +0200 Subject: [PATCH 1/2] Client-side implementation of editable profile (close #9) --- app/jekylledit/controllers/site.py | 2 +- javascript/src/profile.js | 39 ++++++++++++++++++------------ 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/app/jekylledit/controllers/site.py b/app/jekylledit/controllers/site.py index e6cb1f0..9f8e66e 100644 --- a/app/jekylledit/controllers/site.py +++ b/app/jekylledit/controllers/site.py @@ -176,7 +176,7 @@ def user_profile(site_id, user_id): # Get current user # JE uses emails as identificators if user_id == 'current': - user_id = 'current_user.email' + user_id = current_user.email if request.method == 'GET': user = site.get_user(user_id) return jsonify(user) diff --git a/javascript/src/profile.js b/javascript/src/profile.js index ff89894..53874ee 100644 --- a/javascript/src/profile.js +++ b/javascript/src/profile.js @@ -63,23 +63,32 @@ klokantech.jekylledit.Profile.prototype.start = function() { /** @inheritDoc */ klokantech.jekylledit.Profile.prototype.loadClear = function(opt_callback) { - goog.dom.removeChildren(this.element_); + klokantech.jekylledit.utils.replaceWithSpinner(this.element_); - var fields = (this.config_['profile'] || {})['fields'] || {}; + this.auth_.sendRequest('site/' + this.repo_ + '/user/current/profile', + goog.bind(function(e) { + var xhr = e.target; + var data = xhr.getResponseJson(); - goog.object.forEach(fields, function(el, k) { - var label = klokantech.jekylledit.lang.getFrom( - el['label'], this.config_['languages']); - var labelEl = goog.dom.createDom(goog.dom.TagName.LABEL, undefined, - (label || k) + ':'); - goog.dom.appendChild(this.element_, labelEl); - el['_je_getval'] = klokantech.jekylledit.utils.createField( - el, '', this.element_); //TODO: value - }, this); + goog.dom.removeChildren(this.element_); + + var fields = (this.config_['profile'] || {})['fields'] || {}; - if (opt_callback) { - opt_callback(); - } + goog.object.forEach(fields, function(el, k) { + var label = klokantech.jekylledit.lang.getFrom( + el['label'], this.config_['languages']); + var labelEl = goog.dom.createDom(goog.dom.TagName.LABEL, undefined, + (label || k) + ':'); + goog.dom.appendChild(this.element_, labelEl); + var value = data[k]; + el['_je_getval'] = klokantech.jekylledit.utils.createField( + el, value, this.element_); + }, this); + + if (opt_callback) { + opt_callback(); + } + }, this)); }; @@ -98,7 +107,7 @@ klokantech.jekylledit.Profile.prototype.save = function(opt_callback) { } }, this); - this.auth_.sendRequest('site/' + this.repo_ + '/profile', + this.auth_.sendRequest('site/' + this.repo_ + '/user/current/profile', goog.bind(function(e) { if (e.target.isSuccess()) { alert(klokantech.jekylledit.lang.get('profile_saved')); From c228b76a86adbbc4a5ed01eb36fe19732524fa40 Mon Sep 17 00:00:00 2001 From: Petr Sloup Date: Tue, 24 May 2016 12:01:16 +0200 Subject: [PATCH 2/2] Required post fields (close #18) --- javascript/src/abstractpage.js | 2 +- javascript/src/dashboard.js | 6 +++++- javascript/src/editor.js | 25 ++++++++++++++++++++++++- javascript/src/lang.js | 3 +++ javascript/src/popup.js | 9 ++++++--- javascript/src/profile.js | 2 +- javascript/src/translations.js | 2 +- 7 files changed, 41 insertions(+), 8 deletions(-) diff --git a/javascript/src/abstractpage.js b/javascript/src/abstractpage.js index 902d934..50e132b 100644 --- a/javascript/src/abstractpage.js +++ b/javascript/src/abstractpage.js @@ -32,6 +32,6 @@ klokantech.jekylledit.AbstractPage.prototype.start = goog.abstractMethod; /** - * @param {Function=} opt_callback when done + * @param {function(boolean)=} opt_callback when done */ klokantech.jekylledit.AbstractPage.prototype.save = goog.abstractMethod; diff --git a/javascript/src/dashboard.js b/javascript/src/dashboard.js index f60bd40..80492fb 100644 --- a/javascript/src/dashboard.js +++ b/javascript/src/dashboard.js @@ -154,6 +154,10 @@ klokantech.jekylledit.Dashboard.prototype.loadClear = function(opt_callback) { /** @inheritDoc */ klokantech.jekylledit.Dashboard.prototype.save = function(opt_callback) { if (this.editor_) { - this.editor_.save(); + this.editor_.save(opt_callback); + } else { + if (opt_callback) { + opt_callback(false); + } } }; diff --git a/javascript/src/editor.js b/javascript/src/editor.js index 123a81c..c2225f5 100644 --- a/javascript/src/editor.js +++ b/javascript/src/editor.js @@ -502,6 +502,29 @@ klokantech.jekylledit.Editor.prototype.save = function(opt_callback) { postData[langId]['metadata']['published'] = this.publishCheckbox_.checked; }, this); + var missingRequiredFields = []; + goog.object.forEach(this.languages_, function(lang, langId) { + goog.object.forEach(lang.fields, function(el, k) { + if (el['required']) { + var value = postData[langId]['metadata'][k]; + if (!value || value.length == 0) { + missingRequiredFields[k] = true; + } + } + }, this); + }, this); + + if (goog.object.getKeys(missingRequiredFields).length > 0) { + alert(goog.string.format( + klokantech.jekylledit.lang.get('editor_required_missing'), + goog.object.getKeys(missingRequiredFields).join(', ')) + ); + if (opt_callback) { + opt_callback(false); + } + return; + } + if (this.editSource_) { var lang = this.languages_[klokantech.jekylledit.lang.getLanguage()]; if (lang) { @@ -527,7 +550,7 @@ klokantech.jekylledit.Editor.prototype.save = function(opt_callback) { alert(klokantech.jekylledit.lang.get('editor_save_error')); } if (opt_callback) { - opt_callback(); + opt_callback(e.target.isSuccess()); } }, this), this.path_ ? 'PUT' : 'POST', JSON.stringify(result), { 'content-type': 'application/json' diff --git a/javascript/src/lang.js b/javascript/src/lang.js index 42e201c..74af34c 100644 --- a/javascript/src/lang.js +++ b/javascript/src/lang.js @@ -129,6 +129,9 @@ klokantech.jekylledit.lang.data_ = { 'editor_create_lang_btn': { 'en': 'Create "%s" variant of this post' }, + 'editor_required_missing': { + 'en': 'These fields are required and need to be filled in all languages: %s' + }, 'editor_saved': { 'en': 'Changes saved!' }, diff --git a/javascript/src/popup.js b/javascript/src/popup.js index 63d2caa..37e7c43 100644 --- a/javascript/src/popup.js +++ b/javascript/src/popup.js @@ -62,9 +62,12 @@ klokantech.jekylledit.Popup = function(repo, path, editableContent) { if (goog.isDef(this.activePage_)) { var page = this.pages_[this.activePage_]; if (page) { - page.save(); - this.setVisible(false); - this.doesNeedClearLoad_ = true; + page.save(goog.bind(function(success) { + if (success) { + this.setVisible(false); + this.doesNeedClearLoad_ = true; + } + }, this)); } } }, false, this); diff --git a/javascript/src/profile.js b/javascript/src/profile.js index 53874ee..5f8f486 100644 --- a/javascript/src/profile.js +++ b/javascript/src/profile.js @@ -115,7 +115,7 @@ klokantech.jekylledit.Profile.prototype.save = function(opt_callback) { alert(klokantech.jekylledit.lang.get('profile_save_error')); } if (opt_callback) { - opt_callback(); + opt_callback(e.target.isSuccess()); } }, this), 'PUT', JSON.stringify(result), { 'content-type': 'application/json' diff --git a/javascript/src/translations.js b/javascript/src/translations.js index 7e9b33a..f06636b 100644 --- a/javascript/src/translations.js +++ b/javascript/src/translations.js @@ -141,7 +141,7 @@ klokantech.jekylledit.Translations.prototype.save = function(opt_callback) { alert(klokantech.jekylledit.lang.get('trans_save_error')); } if (opt_callback) { - opt_callback(); + opt_callback(e.target.isSuccess()); } }, this), 'PUT', JSON.stringify(result), { 'content-type': 'application/json'