mirror of
https://github.com/TryGhost/Ghost.git
synced 2025-02-24 23:48:13 -05:00
Added model and validator for product's benefit item
refs https://github.com/TryGhost/Team/issues/792 - updates product model to read product's list of benefits - adds transformer to return emberArray with list of product benefits - adds new model for each product benefit - adds validator for new product benefit
This commit is contained in:
parent
e5a24c8bb3
commit
dc6b2884f1
5 changed files with 82 additions and 1 deletions
|
@ -10,6 +10,7 @@ import Mixin from '@ember/object/mixin';
|
||||||
import Model from '@ember-data/model';
|
import Model from '@ember-data/model';
|
||||||
import NavItemValidator from 'ghost-admin/validators/nav-item';
|
import NavItemValidator from 'ghost-admin/validators/nav-item';
|
||||||
import PostValidator from 'ghost-admin/validators/post';
|
import PostValidator from 'ghost-admin/validators/post';
|
||||||
|
import ProductBenefitItemValidator from 'ghost-admin/validators/product-benefit-item';
|
||||||
import ProductValidator from 'ghost-admin/validators/product';
|
import ProductValidator from 'ghost-admin/validators/product';
|
||||||
import RSVP from 'rsvp';
|
import RSVP from 'rsvp';
|
||||||
import ResetValidator from 'ghost-admin/validators/reset';
|
import ResetValidator from 'ghost-admin/validators/reset';
|
||||||
|
@ -42,6 +43,7 @@ export default Mixin.create({
|
||||||
customView: CustomViewValidator,
|
customView: CustomViewValidator,
|
||||||
inviteUser: InviteUserValidator,
|
inviteUser: InviteUserValidator,
|
||||||
navItem: NavItemValidator,
|
navItem: NavItemValidator,
|
||||||
|
productBenefitItem: ProductBenefitItemValidator,
|
||||||
post: PostValidator,
|
post: PostValidator,
|
||||||
reset: ResetValidator,
|
reset: ResetValidator,
|
||||||
setting: SettingValidator,
|
setting: SettingValidator,
|
||||||
|
|
23
ghost/admin/app/models/product-benefit-item.js
Normal file
23
ghost/admin/app/models/product-benefit-item.js
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
import EmberObject from '@ember/object';
|
||||||
|
import ValidationEngine from 'ghost-admin/mixins/validation-engine';
|
||||||
|
import {computed} from '@ember/object';
|
||||||
|
import {isBlank} from '@ember/utils';
|
||||||
|
|
||||||
|
export default EmberObject.extend(ValidationEngine, {
|
||||||
|
label: '',
|
||||||
|
isNew: false,
|
||||||
|
|
||||||
|
validationType: 'productBenefitItem',
|
||||||
|
|
||||||
|
isComplete: computed('label', function () {
|
||||||
|
let {label} = this;
|
||||||
|
|
||||||
|
return !isBlank(label);
|
||||||
|
}),
|
||||||
|
|
||||||
|
isBlank: computed('label', function () {
|
||||||
|
let {label} = this;
|
||||||
|
|
||||||
|
return isBlank(label);
|
||||||
|
})
|
||||||
|
});
|
|
@ -8,5 +8,6 @@ export default Model.extend(ValidationEngine, {
|
||||||
description: attr('string'),
|
description: attr('string'),
|
||||||
slug: attr('string'),
|
slug: attr('string'),
|
||||||
monthlyPrice: attr('stripe-price'),
|
monthlyPrice: attr('stripe-price'),
|
||||||
yearlyPrice: attr('stripe-price')
|
yearlyPrice: attr('stripe-price'),
|
||||||
|
benefits: attr('product-benefits')
|
||||||
});
|
});
|
||||||
|
|
37
ghost/admin/app/transforms/product-benefits.js
Normal file
37
ghost/admin/app/transforms/product-benefits.js
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
import ProductBenefitItem from '../models/product-benefit-item';
|
||||||
|
import Transform from '@ember-data/serializer/transform';
|
||||||
|
import {A as emberA, isArray as isEmberArray} from '@ember/array';
|
||||||
|
|
||||||
|
export default Transform.extend({
|
||||||
|
deserialize(serialized, options) {
|
||||||
|
let benefitsItems, benefitsArray;
|
||||||
|
|
||||||
|
try {
|
||||||
|
benefitsArray = JSON.parse(serialized) || [];
|
||||||
|
} catch (e) {
|
||||||
|
benefitsArray = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
benefitsItems = benefitsArray.map((itemDetails) => {
|
||||||
|
itemDetails.isSecondary = options && options.isSecondary || false;
|
||||||
|
return ProductBenefitItem.create(itemDetails);
|
||||||
|
});
|
||||||
|
|
||||||
|
return emberA(benefitsItems);
|
||||||
|
},
|
||||||
|
|
||||||
|
serialize(deserialized) {
|
||||||
|
let benefitsArray;
|
||||||
|
|
||||||
|
if (isEmberArray(deserialized)) {
|
||||||
|
benefitsArray = deserialized.map((item) => {
|
||||||
|
let label = item.get('label').trim();
|
||||||
|
return {label};
|
||||||
|
}).compact();
|
||||||
|
} else {
|
||||||
|
benefitsArray = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
return JSON.stringify(benefitsArray);
|
||||||
|
}
|
||||||
|
});
|
18
ghost/admin/app/validators/product-benefit-item.js
Normal file
18
ghost/admin/app/validators/product-benefit-item.js
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
import BaseValidator from './base';
|
||||||
|
import {isBlank} from '@ember/utils';
|
||||||
|
|
||||||
|
export default BaseValidator.create({
|
||||||
|
properties: ['label'],
|
||||||
|
|
||||||
|
label(model) {
|
||||||
|
let label = model.get('label');
|
||||||
|
let hasValidated = model.get('hasValidated');
|
||||||
|
|
||||||
|
if (isBlank(label)) {
|
||||||
|
model.get('errors').add('label', 'You must specify a label');
|
||||||
|
this.invalidate();
|
||||||
|
}
|
||||||
|
|
||||||
|
hasValidated.addObject('label');
|
||||||
|
}
|
||||||
|
});
|
Loading…
Add table
Reference in a new issue