From f0c906f2898c0aa8d09dfae47688561b2d5b103f Mon Sep 17 00:00:00 2001 From: Rish Date: Thu, 10 Oct 2019 17:29:35 +0530 Subject: [PATCH] Enabled write operation for member name and note no issue - Allows editing member's name and note in admin --- app/components/gh-member-settings-form.js | 2 +- app/controllers/member.js | 23 ++++++++++++++++--- app/models/member.js | 1 + app/serializers/member.js | 15 ++++++++++++ .../components/gh-member-settings-form.hbs | 18 +++++++-------- app/templates/member.hbs | 3 +++ app/transforms/member-subscription.js | 8 +------ 7 files changed, 49 insertions(+), 21 deletions(-) create mode 100644 app/serializers/member.js diff --git a/app/components/gh-member-settings-form.js b/app/components/gh-member-settings-form.js index 84898c024..fb6e69dcc 100644 --- a/app/components/gh-member-settings-form.js +++ b/app/components/gh-member-settings-form.js @@ -10,7 +10,6 @@ export default Component.extend({ mediaQueries: service(), isViewingSubview: false, - scratchDescription: '', // Allowed actions setProperty: () => {}, @@ -18,6 +17,7 @@ export default Component.extend({ scratchName: boundOneWay('member.name'), scratchEmail: boundOneWay('member.email'), + scratchNote: boundOneWay('member.note'), subscriptions: computed('member.stripe', function () { let subscriptions = this.member.get('stripe'); if (subscriptions && subscriptions.length > 0) { diff --git a/app/controllers/member.js b/app/controllers/member.js index 405384b58..8348e9fc6 100644 --- a/app/controllers/member.js +++ b/app/controllers/member.js @@ -12,8 +12,9 @@ export default Controller.extend({ router: service(), - member: alias('model'), + notifications: service(), + member: alias('model'), subscribedAt: computed('member.createdAt', function () { let memberSince = moment(this.member.createdAt).from(moment()); let createdDate = moment(this.member.createdAt).format('MMM DD, YYYY'); @@ -21,8 +22,8 @@ export default Controller.extend({ }), actions: { - setProperty() { - return; + setProperty(propKey, value) { + this._saveMemberProperty(propKey, value); }, toggleDeleteTagModal() { this.toggleProperty('showDeleteMemberModal'); @@ -37,6 +38,22 @@ export default Controller.extend({ } }, + save: task(function* () { + let member = this.member; + try { + return yield member.save(); + } catch (error) { + if (error) { + this.notifications.showAPIError(error, {key: 'member.save'}); + } + } + }).drop(), + + _saveMemberProperty(propKey, newValue) { + let member = this.member; + member.set(propKey, newValue); + }, + fetchMember: task(function* (memberId) { this.set('isLoading', true); yield this.store.findRecord('member', memberId, { diff --git a/app/models/member.js b/app/models/member.js index 094d8564c..601793abb 100644 --- a/app/models/member.js +++ b/app/models/member.js @@ -4,6 +4,7 @@ import attr from 'ember-data/attr'; export default DS.Model.extend({ name: attr('string'), email: attr('string'), + note: attr('string'), createdAt: attr('moment-utc'), stripe: attr('member-subscription') }); diff --git a/app/serializers/member.js b/app/serializers/member.js new file mode 100644 index 000000000..76eff17cb --- /dev/null +++ b/app/serializers/member.js @@ -0,0 +1,15 @@ +/* eslint-disable camelcase */ +import ApplicationSerializer from 'ghost-admin/serializers/application'; + +export default ApplicationSerializer.extend({ + serialize(/*snapshot, options*/) { + let json = this._super(...arguments); + + // Properties that exist on the model but we don't want sent in the payload + delete json.stripe; + // Normalize properties + json.name = json.name || ''; + json.note = json.note || ''; + return json; + } +}); diff --git a/app/templates/components/gh-member-settings-form.hbs b/app/templates/components/gh-member-settings-form.hbs index 044487cf5..a5c546bcb 100644 --- a/app/templates/components/gh-member-settings-form.hbs +++ b/app/templates/components/gh-member-settings-form.hbs @@ -4,7 +4,6 @@ {{#gh-form-group errors=member.errors hasValidated=member.hasValidated property="name"}} {{gh-text-input - disabled=true id="member-name" name="name" value=(readonly scratchName) @@ -29,19 +28,18 @@
{{#gh-form-group errors=member.errors hasValidated=member.hasValidated property="note"}} - + {{gh-textarea - disabled=true - id="member-description" - name="description" + id="member-note" + name="note" class="gh-member-details-textarea" tabindex="3" - value=(readonly scratchDescription) - input=(action (mut scratchDescription) value="target.value") - focus-out=(action 'setProperty' 'description' scratchDescription) + value=(readonly scratchNote) + input=(action (mut scratchNote) value="target.value") + focus-out=(action 'setProperty' 'note' scratchNote) }} - {{gh-error-message errors=member.errors property="description"}} -

Maximum: 500 characters. You’ve used {{gh-count-down-characters scratchDescription 500}}

+ {{gh-error-message errors=member.errors property="note"}} +

Maximum: 500 characters. You’ve used {{gh-count-down-characters scratchNote 500}}

{{/gh-form-group}}
diff --git a/app/templates/member.hbs b/app/templates/member.hbs index 5dba29fb1..a8210781e 100644 --- a/app/templates/member.hbs +++ b/app/templates/member.hbs @@ -10,6 +10,9 @@ {{member.email}} {{/if}} +
+ {{gh-task-button task=save class="gh-btn gh-btn-blue gh-btn-icon" data-test-button="save"}} +
diff --git a/app/transforms/member-subscription.js b/app/transforms/member-subscription.js index ea68575b6..0320e5c99 100644 --- a/app/transforms/member-subscription.js +++ b/app/transforms/member-subscription.js @@ -18,13 +18,7 @@ export default Transform.extend({ if (isEmberArray(deserialized)) { subscriptionArray = deserialized.map((item) => { - let adapter = item.get('adapter').trim(); - let amount = item.get('amount'); - let plan = item.get('plan').trim(); - let status = item.get('status').trim(); - let validUntil = item.get('validUntil'); - - return {adapter, amount, plan, status, validUntil}; + return item; }).compact(); } else { subscriptionArray = [];