175 lines
4.9 KiB
JavaScript
175 lines
4.9 KiB
JavaScript
import { default as computed, observes } from 'ember-addons/ember-computed-decorators';
|
|
import InputValidation from 'discourse/models/input-validation';
|
|
|
|
export default Ember.Controller.extend({
|
|
numberPollType: 'number',
|
|
multiplePollType: 'multiple',
|
|
|
|
init() {
|
|
this._super();
|
|
this._setupPoll();
|
|
},
|
|
|
|
@computed("numberPollType", "multiplePollType")
|
|
pollTypes(numberPollType, multiplePollType) {
|
|
let types = [];
|
|
|
|
types.push({ name: I18n.t("poll.ui_builder.poll_type.number"), value: numberPollType });
|
|
types.push({ name: I18n.t("poll.ui_builder.poll_type.multiple"), value: multiplePollType });
|
|
|
|
return types;
|
|
},
|
|
|
|
@computed("pollType", "pollOptionsCount", "multiplePollType")
|
|
isMultiple(pollType, count, multiplePollType) {
|
|
return (pollType === multiplePollType) && count > 0;
|
|
},
|
|
|
|
@computed("pollType", "numberPollType")
|
|
isNumber(pollType, numberPollType) {
|
|
return pollType === numberPollType;
|
|
},
|
|
|
|
@computed("isNumber", "isMultiple")
|
|
showMinMax(isNumber, isMultiple) {
|
|
return isNumber || isMultiple;
|
|
},
|
|
|
|
@computed("pollOptions")
|
|
pollOptionsCount(pollOptions) {
|
|
if (pollOptions.length === 0) return 0;
|
|
|
|
let length = 0;
|
|
|
|
pollOptions.split("\n").forEach(option => {
|
|
if (option.length !== 0) length += 1;
|
|
});
|
|
|
|
return length;
|
|
},
|
|
|
|
@observes("isMultiple", "isNumber", "pollOptionsCount")
|
|
_setPollMax() {
|
|
const isMultiple = this.get("isMultiple");
|
|
const isNumber = this.get("isNumber");
|
|
if (!isMultiple && !isNumber) return;
|
|
|
|
if (isMultiple) {
|
|
this.set("pollMax", this.get("pollOptionsCount"));
|
|
} else if (isNumber) {
|
|
this.set("pollMax", this.siteSettings.poll_maximum_options);
|
|
}
|
|
},
|
|
|
|
@computed("isMultiple", "isNumber", "pollOptionsCount")
|
|
pollMinOptions(isMultiple, isNumber, count) {
|
|
if (!isMultiple && !isNumber) return;
|
|
|
|
if (isMultiple) {
|
|
return this._comboboxOptions(1, count + 1);
|
|
} else if (isNumber) {
|
|
return this._comboboxOptions(1, this.siteSettings.poll_maximum_options + 1);
|
|
}
|
|
},
|
|
|
|
@computed("isMultiple", "isNumber", "pollOptionsCount", "pollMin", "pollStep")
|
|
pollMaxOptions(isMultiple, isNumber, count, pollMin, pollStep) {
|
|
if (!isMultiple && !isNumber) return;
|
|
const pollMinInt = parseInt(pollMin) || 1;
|
|
|
|
if (isMultiple) {
|
|
return this._comboboxOptions(pollMinInt + 1, count + 1);
|
|
} else if (isNumber) {
|
|
const pollStepInt = parseInt(pollStep) || 1;
|
|
return this._comboboxOptions(pollMinInt + 1, pollMinInt + (this.siteSettings.poll_maximum_options * pollStepInt));
|
|
}
|
|
},
|
|
|
|
@computed("isNumber", "pollMax")
|
|
pollStepOptions(isNumber, pollMax) {
|
|
if (!isNumber) return;
|
|
return this._comboboxOptions(1, (parseInt(pollMax) || 1) + 1);
|
|
},
|
|
|
|
@computed("isNumber", "showMinMax", "pollType", "publicPoll", "pollOptions", "pollMin", "pollMax", "pollStep")
|
|
pollOutput(isNumber, showMinMax, pollType, publicPoll, pollOptions, pollMin, pollMax, pollStep) {
|
|
let pollHeader = '[poll';
|
|
let output = '';
|
|
|
|
const match = this.get("toolbarEvent").getText().match(/\[poll(\s+name=[^\s\]]+)*.*\]/igm);
|
|
|
|
if (match) {
|
|
pollHeader += ` name=poll${match.length + 1}`;
|
|
};
|
|
|
|
if (pollType) pollHeader += ` type=${pollType}`;
|
|
if (pollMin && showMinMax) pollHeader += ` min=${pollMin}`;
|
|
if (pollMax) pollHeader += ` max=${pollMax}`;
|
|
if (isNumber) pollHeader += ` step=${pollStep}`;
|
|
if (publicPoll) pollHeader += ' public=true';
|
|
pollHeader += ']';
|
|
output += `${pollHeader}\n`;
|
|
|
|
if (pollOptions.length > 0 && !isNumber) {
|
|
pollOptions.split("\n").forEach(option => {
|
|
if (option.length !== 0) output += `* ${option}\n`;
|
|
});
|
|
}
|
|
|
|
output += '[/poll]';
|
|
return output;
|
|
},
|
|
|
|
@computed("pollOptionsCount", "isNumber", "pollMin", "pollMax")
|
|
disableInsert(count, isNumber, pollMin, pollMax) {
|
|
return (pollMin >= pollMax) || (isNumber ? false : (count < 2));
|
|
},
|
|
|
|
@computed("pollMin", "pollMax")
|
|
minMaxValueValidation(pollMin, pollMax) {
|
|
let options = { ok: true };
|
|
|
|
if (pollMin >= pollMax) {
|
|
options = { failed: true, reason: I18n.t("poll.ui_builder.help.invalid_values") };
|
|
}
|
|
|
|
return InputValidation.create(options);
|
|
},
|
|
|
|
@computed("disableInsert")
|
|
minNumOfOptionsValidation(disableInsert) {
|
|
let options = { ok: true };
|
|
|
|
if (disableInsert) {
|
|
options = { failed: true, reason: I18n.t("poll.ui_builder.help.options_count") };
|
|
}
|
|
|
|
return InputValidation.create(options);
|
|
},
|
|
|
|
_comboboxOptions(start_index, end_index) {
|
|
return _.range(start_index, end_index).map(number => {
|
|
return { value: number, name: number };
|
|
});
|
|
},
|
|
|
|
_setupPoll() {
|
|
this.setProperties({
|
|
pollType: null,
|
|
publicPoll: false,
|
|
pollOptions: '',
|
|
pollMin: 1,
|
|
pollMax: null,
|
|
pollStep: 1
|
|
});
|
|
},
|
|
|
|
actions: {
|
|
insertPoll() {
|
|
this.get("toolbarEvent").addText(this.get("pollOutput"));
|
|
this.send("closeModal");
|
|
this._setupPoll();
|
|
}
|
|
}
|
|
});
|