mirror of
https://github.com/TryGhost/Ghost.git
synced 2024-12-01 05:50:35 +03:00
1461280167
closes https://github.com/TryGhost/Team/issues/1032 - fixes the selected default access value for specific tier not shown correctly on admin - the value was correctly saved and fetched, but the value shown got overridden by default product selection and only the first product was shown as selected value
127 lines
3.8 KiB
JavaScript
127 lines
3.8 KiB
JavaScript
import Component from '@glimmer/component';
|
|
import {action} from '@ember/object';
|
|
import {inject as service} from '@ember/service';
|
|
import {task} from 'ember-concurrency-decorators';
|
|
import {tracked} from '@glimmer/tracking';
|
|
|
|
export default class GhMembersSegmentSelect extends Component {
|
|
@service store;
|
|
@service feature;
|
|
|
|
@tracked _options = [];
|
|
|
|
get renderInPlace() {
|
|
return this.args.renderInPlace === undefined ? false : this.args.renderInPlace;
|
|
}
|
|
|
|
constructor() {
|
|
super(...arguments);
|
|
this.fetchOptionsTask.perform();
|
|
}
|
|
|
|
get options() {
|
|
if (this.args.hideOptionsWhenAllSelected) {
|
|
const selectedSegments = this.selectedOptions.mapBy('segment');
|
|
if (selectedSegments.includes('status:free') && selectedSegments.includes('status:-free')) {
|
|
return this._options.filter(option => !option.groupName);
|
|
}
|
|
}
|
|
|
|
return this._options;
|
|
}
|
|
|
|
get flatOptions() {
|
|
const options = [];
|
|
|
|
function getOptions(option) {
|
|
if (option.options) {
|
|
return option.options.forEach(getOptions);
|
|
}
|
|
|
|
options.push(option);
|
|
}
|
|
|
|
this._options.forEach(getOptions);
|
|
|
|
return options;
|
|
}
|
|
|
|
get selectedOptions() {
|
|
const segments = (this.args.segment || '').split(',');
|
|
return this.flatOptions.filter(option => segments.includes(option.segment));
|
|
}
|
|
|
|
@action
|
|
setSegment(options) {
|
|
const segment = options.mapBy('segment').join(',') || null;
|
|
this.args.onChange?.(segment);
|
|
}
|
|
|
|
@task
|
|
*fetchOptionsTask() {
|
|
const options = yield [];
|
|
|
|
if (!this.args.hideDefaultSegments) {
|
|
options.push({
|
|
name: 'Free members',
|
|
segment: 'status:free',
|
|
class: 'segment-status-free'
|
|
}, {
|
|
name: 'Paid members',
|
|
segment: 'status:-free', // paid & comped
|
|
class: 'segment-status-paid'
|
|
});
|
|
}
|
|
|
|
// fetch all labels w̶i̶t̶h̶ c̶o̶u̶n̶t̶s̶
|
|
// TODO: add `include: 'count.members` to query once API is fixed
|
|
const labels = yield this.store.query('label', {limit: 'all'});
|
|
|
|
if (labels.length > 0 && !this.args.hideLabels) {
|
|
const labelsGroup = {
|
|
groupName: 'Labels',
|
|
options: []
|
|
};
|
|
|
|
labels.forEach((label) => {
|
|
labelsGroup.options.push({
|
|
name: label.name,
|
|
segment: `label:${label.slug}`,
|
|
count: label.count?.members,
|
|
class: 'segment-label'
|
|
});
|
|
});
|
|
|
|
options.push(labelsGroup);
|
|
}
|
|
if (this.feature.get('multipleProducts')) {
|
|
// fetch all products w̶i̶t̶h̶ c̶o̶u̶n̶t̶s̶
|
|
// TODO: add `include: 'count.members` to query once API supports
|
|
const products = yield this.store.query('product', {limit: 'all'});
|
|
|
|
if (products.length > 0) {
|
|
const productsGroup = {
|
|
groupName: 'Tiers',
|
|
options: []
|
|
};
|
|
|
|
products.forEach((product) => {
|
|
productsGroup.options.push({
|
|
name: product.name,
|
|
segment: `product:${product.slug}`,
|
|
count: product.count?.members,
|
|
class: 'segment-product'
|
|
});
|
|
});
|
|
|
|
options.push(productsGroup);
|
|
if (this.args.selectDefaultProduct && !this.args.segment) {
|
|
this.args.onChange?.(productsGroup.options[0].segment);
|
|
}
|
|
}
|
|
}
|
|
|
|
this._options = options;
|
|
}
|
|
}
|