2016-06-13 06:21:14 -04:00
|
|
|
import { default as computed, observes } from 'ember-addons/ember-computed-decorators';
|
2016-06-30 12:26:49 -04:00
|
|
|
import InputValidation from 'discourse/models/input-validation';
|
2016-06-13 06:21:14 -04:00
|
|
|
|
|
|
|
export default Ember.Controller.extend({
|
2017-04-04 23:15:39 -04:00
|
|
|
regularPollType: 'regular',
|
2016-06-20 00:40:24 -04:00
|
|
|
numberPollType: 'number',
|
|
|
|
multiplePollType: 'multiple',
|
2016-06-13 06:21:14 -04:00
|
|
|
|
|
|
|
init() {
|
|
|
|
this._super();
|
|
|
|
this._setupPoll();
|
|
|
|
},
|
|
|
|
|
2017-04-04 23:15:39 -04:00
|
|
|
@computed("regularPollType", "numberPollType", "multiplePollType")
|
|
|
|
pollTypes(regularPollType, numberPollType, multiplePollType) {
|
2016-06-20 00:40:24 -04:00
|
|
|
let types = [];
|
|
|
|
|
2017-04-04 23:15:39 -04:00
|
|
|
types.push({ name: I18n.t("poll.ui_builder.poll_type.regular"), value: regularPollType });
|
2016-06-20 00:40:24 -04:00
|
|
|
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;
|
2016-06-13 06:21:14 -04:00
|
|
|
},
|
|
|
|
|
2017-04-04 23:15:39 -04:00
|
|
|
@computed("pollType", "regularPollType")
|
|
|
|
isRegular(pollType, regularPollType) {
|
|
|
|
return pollType === regularPollType;
|
|
|
|
},
|
|
|
|
|
2016-06-20 00:40:24 -04:00
|
|
|
@computed("pollType", "pollOptionsCount", "multiplePollType")
|
|
|
|
isMultiple(pollType, count, multiplePollType) {
|
|
|
|
return (pollType === multiplePollType) && count > 0;
|
2016-06-13 06:21:14 -04:00
|
|
|
},
|
|
|
|
|
2016-06-20 00:40:24 -04:00
|
|
|
@computed("pollType", "numberPollType")
|
|
|
|
isNumber(pollType, numberPollType) {
|
|
|
|
return pollType === numberPollType;
|
2016-06-13 06:21:14 -04:00
|
|
|
},
|
|
|
|
|
2017-04-04 23:15:39 -04:00
|
|
|
@computed("isRegular")
|
|
|
|
showMinMax(isRegular) {
|
|
|
|
return !isRegular;
|
2016-06-13 06:21:14 -04:00
|
|
|
},
|
|
|
|
|
|
|
|
@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);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
2017-04-04 23:15:39 -04:00
|
|
|
@computed("isRegular", "isMultiple", "isNumber", "pollOptionsCount")
|
|
|
|
pollMinOptions(isRegular, isMultiple, isNumber, count) {
|
|
|
|
if (isRegular) return;
|
2016-06-13 06:21:14 -04:00
|
|
|
|
|
|
|
if (isMultiple) {
|
|
|
|
return this._comboboxOptions(1, count + 1);
|
|
|
|
} else if (isNumber) {
|
|
|
|
return this._comboboxOptions(1, this.siteSettings.poll_maximum_options + 1);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
2017-04-04 23:15:39 -04:00
|
|
|
@computed("isRegular", "isMultiple", "isNumber", "pollOptionsCount", "pollMin", "pollStep")
|
|
|
|
pollMaxOptions(isRegular, isMultiple, isNumber, count, pollMin, pollStep) {
|
|
|
|
if (isRegular) return;
|
2016-06-15 00:54:52 -04:00
|
|
|
const pollMinInt = parseInt(pollMin) || 1;
|
2016-06-13 06:21:14 -04:00
|
|
|
|
|
|
|
if (isMultiple) {
|
|
|
|
return this._comboboxOptions(pollMinInt + 1, count + 1);
|
|
|
|
} else if (isNumber) {
|
2017-11-30 11:04:41 -05:00
|
|
|
let pollStepInt = parseInt(pollStep, 10);
|
|
|
|
if (pollStepInt < 1) {
|
|
|
|
pollStepInt = 1;
|
|
|
|
}
|
2016-06-13 06:21:14 -04:00
|
|
|
return this._comboboxOptions(pollMinInt + 1, pollMinInt + (this.siteSettings.poll_maximum_options * pollStepInt));
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
@computed("isNumber", "pollMax")
|
|
|
|
pollStepOptions(isNumber, pollMax) {
|
|
|
|
if (!isNumber) return;
|
2016-06-15 00:54:52 -04:00
|
|
|
return this._comboboxOptions(1, (parseInt(pollMax) || 1) + 1);
|
2016-06-13 06:21:14 -04:00
|
|
|
},
|
|
|
|
|
2016-07-05 10:14:59 -04:00
|
|
|
@computed("isNumber", "showMinMax", "pollType", "publicPoll", "pollOptions", "pollMin", "pollMax", "pollStep")
|
|
|
|
pollOutput(isNumber, showMinMax, pollType, publicPoll, pollOptions, pollMin, pollMax, pollStep) {
|
2016-06-13 06:21:14 -04:00
|
|
|
let pollHeader = '[poll';
|
|
|
|
let output = '';
|
|
|
|
|
2016-07-05 10:14:59 -04:00
|
|
|
const match = this.get("toolbarEvent").getText().match(/\[poll(\s+name=[^\s\]]+)*.*\]/igm);
|
|
|
|
|
|
|
|
if (match) {
|
|
|
|
pollHeader += ` name=poll${match.length + 1}`;
|
|
|
|
};
|
|
|
|
|
2017-11-30 11:04:41 -05:00
|
|
|
let step = pollStep;
|
|
|
|
if (step < 1) {
|
|
|
|
step = 1;
|
|
|
|
}
|
|
|
|
|
2016-06-13 06:21:14 -04:00
|
|
|
if (pollType) pollHeader += ` type=${pollType}`;
|
|
|
|
if (pollMin && showMinMax) pollHeader += ` min=${pollMin}`;
|
|
|
|
if (pollMax) pollHeader += ` max=${pollMax}`;
|
2017-11-30 11:04:41 -05:00
|
|
|
if (isNumber) pollHeader += ` step=${step}`;
|
2016-06-13 06:21:14 -04:00
|
|
|
if (publicPoll) pollHeader += ' public=true';
|
2016-06-14 04:11:45 -04:00
|
|
|
pollHeader += ']';
|
2016-06-13 06:21:14 -04:00
|
|
|
output += `${pollHeader}\n`;
|
|
|
|
|
|
|
|
if (pollOptions.length > 0 && !isNumber) {
|
2016-07-14 03:10:31 -04:00
|
|
|
pollOptions.split("\n").forEach(option => {
|
|
|
|
if (option.length !== 0) output += `* ${option}\n`;
|
|
|
|
});
|
2016-06-13 06:21:14 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
output += '[/poll]';
|
|
|
|
return output;
|
|
|
|
},
|
|
|
|
|
2017-04-04 23:15:39 -04:00
|
|
|
@computed("pollOptionsCount", "isRegular", "isMultiple", "isNumber", "pollMin", "pollMax")
|
|
|
|
disableInsert(count, isRegular, isMultiple, isNumber, pollMin, pollMax) {
|
|
|
|
return (isRegular && count < 2) || (isMultiple && count < pollMin && pollMin >= pollMax) || (isNumber ? false : (count < 2));
|
2017-03-14 12:34:30 -04:00
|
|
|
},
|
|
|
|
|
|
|
|
@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);
|
2016-06-13 06:21:14 -04:00
|
|
|
},
|
|
|
|
|
2017-11-30 11:04:41 -05:00
|
|
|
@computed("pollStep")
|
|
|
|
minStepValueValidation(pollStep) {
|
|
|
|
let options = { ok: true };
|
|
|
|
|
|
|
|
if (pollStep < 1) {
|
|
|
|
options = { failed: true, reason: I18n.t("poll.ui_builder.help.min_step_value") };
|
|
|
|
}
|
|
|
|
|
|
|
|
return InputValidation.create(options);
|
|
|
|
},
|
|
|
|
|
2016-06-13 06:21:14 -04:00
|
|
|
@computed("disableInsert")
|
|
|
|
minNumOfOptionsValidation(disableInsert) {
|
|
|
|
let options = { ok: true };
|
|
|
|
|
|
|
|
if (disableInsert) {
|
|
|
|
options = { failed: true, reason: I18n.t("poll.ui_builder.help.options_count") };
|
|
|
|
}
|
|
|
|
|
2016-06-30 12:26:49 -04:00
|
|
|
return InputValidation.create(options);
|
2016-06-13 06:21:14 -04:00
|
|
|
},
|
|
|
|
|
|
|
|
_comboboxOptions(start_index, end_index) {
|
|
|
|
return _.range(start_index, end_index).map(number => {
|
2016-06-14 04:11:45 -04:00
|
|
|
return { value: number, name: number };
|
|
|
|
});
|
2016-06-13 06:21:14 -04:00
|
|
|
},
|
|
|
|
|
|
|
|
_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");
|
2016-06-20 06:13:18 -04:00
|
|
|
this._setupPoll();
|
2016-06-13 06:21:14 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|