mirror of
https://github.com/TryGhost/Ghost.git
synced 2024-11-28 14:03:48 +03:00
bc79293594
no issue The data generator created an offer for the free product. This caused an error in admin UI because it couldn't find the tier for the offer. This fixes the issue in both the data generator and the admin UI.
94 lines
2.6 KiB
JavaScript
94 lines
2.6 KiB
JavaScript
import Controller from '@ember/controller';
|
|
import LinkOfferModal from '../components/modals/offers/link';
|
|
import {action} from '@ember/object';
|
|
import {inject as service} from '@ember/service';
|
|
import {task} from 'ember-concurrency';
|
|
import {tracked} from '@glimmer/tracking';
|
|
|
|
const TYPES = [{
|
|
name: 'Active',
|
|
value: 'active'
|
|
},{
|
|
name: 'Archived',
|
|
value: 'archived'
|
|
}];
|
|
|
|
export default class MembersController extends Controller {
|
|
@service modals;
|
|
@service router;
|
|
@service membersUtils;
|
|
|
|
@tracked offers = [];
|
|
@tracked tiers = [];
|
|
@tracked type = 'active';
|
|
|
|
queryParams = [
|
|
'type'
|
|
];
|
|
|
|
constructor() {
|
|
super(...arguments);
|
|
this.availableTypes = TYPES;
|
|
}
|
|
|
|
get filteredOffers() {
|
|
return this.offers.filter((offer) => {
|
|
const tier = this.tiers.find((p) => {
|
|
return p.id === offer.tier.id;
|
|
});
|
|
if (!tier) {
|
|
return false;
|
|
}
|
|
const price = offer.cadence === 'month' ? tier.monthlyPrice : tier.yearlyPrice;
|
|
return !!tier && tier.active && offer.status === this.type && !!price;
|
|
}).map((offer) => {
|
|
const tier = this.tiers.find((p) => {
|
|
return p.id === offer.tier.id;
|
|
});
|
|
if (!tier) {
|
|
return offer;
|
|
}
|
|
const price = offer.cadence === 'month' ? tier.monthlyPrice : tier.yearlyPrice;
|
|
offer.finalCurrency = offer.currency || tier.currency;
|
|
offer.originalPrice = price;
|
|
if (offer.type !== 'trial') {
|
|
offer.updatedPrice = offer.type === 'fixed' ? (price - offer.amount) : (price - ((price * offer.amount) / 100));
|
|
} else {
|
|
offer.updatedPrice = offer.originalPrice;
|
|
}
|
|
return offer;
|
|
});
|
|
}
|
|
|
|
get offersExist() {
|
|
return this.offers.length > 0;
|
|
}
|
|
|
|
get selectedType() {
|
|
return this.type ? TYPES.find((d) => {
|
|
return this.type === d.value;
|
|
}) : TYPES[0];
|
|
}
|
|
|
|
@action
|
|
onTypeChange(type) {
|
|
this.type = type.value;
|
|
}
|
|
|
|
@action
|
|
openLinkDialog(offer) {
|
|
this.advancedModal = this.modals.open(LinkOfferModal, {
|
|
offer: offer
|
|
});
|
|
}
|
|
|
|
@task({restartable: true})
|
|
*fetchOffersTask() {
|
|
this.tiers = yield this.store.query('tier', {
|
|
filter: 'type:paid', include: 'monthly_price,yearly_price'
|
|
});
|
|
this.offers = yield this.store.query('offer', {limit: 'all'});
|
|
return this.offers;
|
|
}
|
|
}
|