2019-10-24 01:06:54 +08:00
|
|
|
import Controller from "@ember/controller";
|
2020-01-17 01:56:53 +08:00
|
|
|
import computed, { observes } from "discourse-common/utils/decorators";
|
2019-11-12 04:48:33 +08:00
|
|
|
import EmberObject from "@ember/object";
|
2016-06-13 18:21:14 +08:00
|
|
|
|
2019-11-26 01:51:01 +08:00
|
|
|
export const BAR_CHART_TYPE = "bar";
|
|
|
|
export const PIE_CHART_TYPE = "pie";
|
|
|
|
|
2019-10-24 01:06:54 +08:00
|
|
|
export default Controller.extend({
|
2018-06-16 00:42:20 +08:00
|
|
|
regularPollType: "regular",
|
|
|
|
numberPollType: "number",
|
|
|
|
multiplePollType: "multiple",
|
2016-06-13 18:21:14 +08:00
|
|
|
|
2018-11-19 21:50:00 +08:00
|
|
|
alwaysPollResult: "always",
|
|
|
|
votePollResult: "on_vote",
|
|
|
|
closedPollResult: "on_close",
|
2019-08-16 02:27:18 +08:00
|
|
|
staffPollResult: "staff_only",
|
2019-11-26 01:51:01 +08:00
|
|
|
pollChartTypes: [
|
|
|
|
{ name: BAR_CHART_TYPE.capitalize(), value: BAR_CHART_TYPE },
|
|
|
|
{ name: PIE_CHART_TYPE.capitalize(), value: PIE_CHART_TYPE }
|
|
|
|
],
|
2018-11-19 21:50:00 +08:00
|
|
|
|
2016-06-13 18:21:14 +08:00
|
|
|
init() {
|
2019-01-19 17:05:51 +08:00
|
|
|
this._super(...arguments);
|
2016-06-13 18:21:14 +08:00
|
|
|
this._setupPoll();
|
|
|
|
},
|
|
|
|
|
2017-04-05 11:15:39 +08:00
|
|
|
@computed("regularPollType", "numberPollType", "multiplePollType")
|
|
|
|
pollTypes(regularPollType, numberPollType, multiplePollType) {
|
2018-05-03 08:12:19 +08:00
|
|
|
return [
|
2018-06-16 00:42:20 +08:00
|
|
|
{
|
|
|
|
name: I18n.t("poll.ui_builder.poll_type.regular"),
|
|
|
|
value: regularPollType
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: I18n.t("poll.ui_builder.poll_type.number"),
|
|
|
|
value: numberPollType
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: I18n.t("poll.ui_builder.poll_type.multiple"),
|
|
|
|
value: multiplePollType
|
|
|
|
}
|
2018-05-03 08:12:19 +08:00
|
|
|
];
|
2016-06-13 18:21:14 +08:00
|
|
|
},
|
|
|
|
|
2019-11-26 01:51:01 +08:00
|
|
|
@computed("chartType", "pollType", "numberPollType")
|
|
|
|
isPie(chartType, pollType, numberPollType) {
|
|
|
|
return pollType !== numberPollType && chartType === PIE_CHART_TYPE;
|
|
|
|
},
|
|
|
|
|
2019-08-16 11:06:51 +08:00
|
|
|
@computed(
|
|
|
|
"alwaysPollResult",
|
|
|
|
"votePollResult",
|
|
|
|
"closedPollResult",
|
|
|
|
"staffPollResult"
|
|
|
|
)
|
|
|
|
pollResults(
|
|
|
|
alwaysPollResult,
|
|
|
|
votePollResult,
|
|
|
|
closedPollResult,
|
|
|
|
staffPollResult
|
|
|
|
) {
|
2019-12-18 05:43:15 +08:00
|
|
|
let options = [
|
2018-11-19 21:50:00 +08:00
|
|
|
{
|
|
|
|
name: I18n.t("poll.ui_builder.poll_result.always"),
|
|
|
|
value: alwaysPollResult
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: I18n.t("poll.ui_builder.poll_result.vote"),
|
|
|
|
value: votePollResult
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: I18n.t("poll.ui_builder.poll_result.closed"),
|
|
|
|
value: closedPollResult
|
|
|
|
}
|
|
|
|
];
|
2019-12-18 05:43:15 +08:00
|
|
|
if (this.currentUser.staff) {
|
|
|
|
options.push({
|
|
|
|
name: I18n.t("poll.ui_builder.poll_result.staff"),
|
|
|
|
value: staffPollResult
|
|
|
|
});
|
|
|
|
}
|
|
|
|
return options;
|
2018-11-19 21:50:00 +08:00
|
|
|
},
|
|
|
|
|
2020-01-28 20:30:04 +08:00
|
|
|
@computed("site.groups")
|
|
|
|
siteGroups(groups) {
|
|
|
|
const values = [{ name: "", value: null }];
|
|
|
|
groups.forEach(g => values.push({ name: g.name, value: g.name }));
|
|
|
|
return values;
|
|
|
|
},
|
|
|
|
|
2017-04-05 11:15:39 +08:00
|
|
|
@computed("pollType", "regularPollType")
|
|
|
|
isRegular(pollType, regularPollType) {
|
|
|
|
return pollType === regularPollType;
|
|
|
|
},
|
|
|
|
|
2016-06-20 12:40:24 +08:00
|
|
|
@computed("pollType", "pollOptionsCount", "multiplePollType")
|
|
|
|
isMultiple(pollType, count, multiplePollType) {
|
2018-06-16 00:42:20 +08:00
|
|
|
return pollType === multiplePollType && count > 0;
|
2016-06-13 18:21:14 +08:00
|
|
|
},
|
|
|
|
|
2016-06-20 12:40:24 +08:00
|
|
|
@computed("pollType", "numberPollType")
|
|
|
|
isNumber(pollType, numberPollType) {
|
|
|
|
return pollType === numberPollType;
|
2016-06-13 18:21:14 +08:00
|
|
|
},
|
|
|
|
|
2017-04-05 11:15:39 +08:00
|
|
|
@computed("isRegular")
|
|
|
|
showMinMax(isRegular) {
|
|
|
|
return !isRegular;
|
2016-06-13 18:21:14 +08: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() {
|
2019-05-27 16:15:39 +08:00
|
|
|
const isMultiple = this.isMultiple;
|
|
|
|
const isNumber = this.isNumber;
|
2016-06-13 18:21:14 +08:00
|
|
|
if (!isMultiple && !isNumber) return;
|
|
|
|
|
|
|
|
if (isMultiple) {
|
2019-05-27 16:15:39 +08:00
|
|
|
this.set("pollMax", this.pollOptionsCount);
|
2016-06-13 18:21:14 +08:00
|
|
|
} else if (isNumber) {
|
|
|
|
this.set("pollMax", this.siteSettings.poll_maximum_options);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
2017-04-05 11:15:39 +08:00
|
|
|
@computed("isRegular", "isMultiple", "isNumber", "pollOptionsCount")
|
|
|
|
pollMinOptions(isRegular, isMultiple, isNumber, count) {
|
|
|
|
if (isRegular) return;
|
2016-06-13 18:21:14 +08:00
|
|
|
|
|
|
|
if (isMultiple) {
|
|
|
|
return this._comboboxOptions(1, count + 1);
|
|
|
|
} else if (isNumber) {
|
2018-06-16 00:42:20 +08:00
|
|
|
return this._comboboxOptions(
|
|
|
|
1,
|
|
|
|
this.siteSettings.poll_maximum_options + 1
|
|
|
|
);
|
2016-06-13 18:21:14 +08:00
|
|
|
}
|
|
|
|
},
|
|
|
|
|
2018-06-16 00:42:20 +08:00
|
|
|
@computed(
|
|
|
|
"isRegular",
|
|
|
|
"isMultiple",
|
|
|
|
"isNumber",
|
|
|
|
"pollOptionsCount",
|
|
|
|
"pollMin",
|
|
|
|
"pollStep"
|
|
|
|
)
|
2017-04-05 11:15:39 +08:00
|
|
|
pollMaxOptions(isRegular, isMultiple, isNumber, count, pollMin, pollStep) {
|
|
|
|
if (isRegular) return;
|
2019-11-12 17:47:42 +08:00
|
|
|
const pollMinInt = parseInt(pollMin, 10) || 1;
|
2016-06-13 18:21:14 +08:00
|
|
|
|
|
|
|
if (isMultiple) {
|
|
|
|
return this._comboboxOptions(pollMinInt + 1, count + 1);
|
|
|
|
} else if (isNumber) {
|
2017-12-01 00:04:41 +08:00
|
|
|
let pollStepInt = parseInt(pollStep, 10);
|
|
|
|
if (pollStepInt < 1) {
|
|
|
|
pollStepInt = 1;
|
|
|
|
}
|
2018-06-16 00:42:20 +08:00
|
|
|
return this._comboboxOptions(
|
|
|
|
pollMinInt + 1,
|
|
|
|
pollMinInt + this.siteSettings.poll_maximum_options * pollStepInt
|
|
|
|
);
|
2016-06-13 18:21:14 +08:00
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
@computed("isNumber", "pollMax")
|
|
|
|
pollStepOptions(isNumber, pollMax) {
|
|
|
|
if (!isNumber) return;
|
2019-11-12 17:47:42 +08:00
|
|
|
return this._comboboxOptions(1, (parseInt(pollMax, 10) || 1) + 1);
|
2016-06-13 18:21:14 +08:00
|
|
|
},
|
|
|
|
|
2018-06-16 00:42:20 +08:00
|
|
|
@computed(
|
|
|
|
"isNumber",
|
|
|
|
"showMinMax",
|
|
|
|
"pollType",
|
2018-11-19 21:50:00 +08:00
|
|
|
"pollResult",
|
2018-06-16 00:42:20 +08:00
|
|
|
"publicPoll",
|
|
|
|
"pollOptions",
|
|
|
|
"pollMin",
|
|
|
|
"pollMax",
|
|
|
|
"pollStep",
|
2020-01-28 20:30:04 +08:00
|
|
|
"pollGroups",
|
2018-06-16 00:42:20 +08:00
|
|
|
"autoClose",
|
2019-11-26 01:51:01 +08:00
|
|
|
"chartType",
|
2018-06-16 00:42:20 +08:00
|
|
|
"date",
|
|
|
|
"time"
|
|
|
|
)
|
|
|
|
pollOutput(
|
|
|
|
isNumber,
|
|
|
|
showMinMax,
|
|
|
|
pollType,
|
2018-11-19 21:50:00 +08:00
|
|
|
pollResult,
|
2018-06-16 00:42:20 +08:00
|
|
|
publicPoll,
|
|
|
|
pollOptions,
|
|
|
|
pollMin,
|
|
|
|
pollMax,
|
|
|
|
pollStep,
|
2020-01-28 20:30:04 +08:00
|
|
|
pollGroups,
|
2018-06-16 00:42:20 +08:00
|
|
|
autoClose,
|
2019-11-26 01:51:01 +08:00
|
|
|
chartType,
|
2018-06-16 00:42:20 +08:00
|
|
|
date,
|
|
|
|
time
|
|
|
|
) {
|
|
|
|
let pollHeader = "[poll";
|
|
|
|
let output = "";
|
|
|
|
|
2019-05-27 16:15:39 +08:00
|
|
|
const match = this.toolbarEvent
|
2018-06-16 00:42:20 +08:00
|
|
|
.getText()
|
|
|
|
.match(/\[poll(\s+name=[^\s\]]+)*.*\]/gim);
|
2016-07-05 22:14:59 +08:00
|
|
|
|
|
|
|
if (match) {
|
|
|
|
pollHeader += ` name=poll${match.length + 1}`;
|
2018-06-16 00:42:20 +08:00
|
|
|
}
|
2016-07-05 22:14:59 +08:00
|
|
|
|
2017-12-01 00:04:41 +08:00
|
|
|
let step = pollStep;
|
2018-06-16 00:42:20 +08:00
|
|
|
if (step < 1) {
|
|
|
|
step = 1;
|
|
|
|
}
|
2017-12-01 00:04:41 +08:00
|
|
|
|
2016-06-13 18:21:14 +08:00
|
|
|
if (pollType) pollHeader += ` type=${pollType}`;
|
2018-11-19 21:50:00 +08:00
|
|
|
if (pollResult) pollHeader += ` results=${pollResult}`;
|
2016-06-13 18:21:14 +08:00
|
|
|
if (pollMin && showMinMax) pollHeader += ` min=${pollMin}`;
|
|
|
|
if (pollMax) pollHeader += ` max=${pollMax}`;
|
2017-12-01 00:04:41 +08:00
|
|
|
if (isNumber) pollHeader += ` step=${step}`;
|
2018-05-03 08:12:19 +08:00
|
|
|
if (publicPoll) pollHeader += ` public=true`;
|
2019-11-26 01:51:01 +08:00
|
|
|
if (chartType && pollType !== "number")
|
|
|
|
pollHeader += ` chartType=${chartType}`;
|
2020-01-28 20:30:04 +08:00
|
|
|
if (pollGroups) pollHeader += ` groups=${pollGroups}`;
|
2018-06-12 21:31:09 +08:00
|
|
|
if (autoClose) {
|
2018-06-16 00:42:20 +08:00
|
|
|
let closeDate = moment(
|
|
|
|
date + " " + time,
|
|
|
|
"YYYY-MM-DD HH:mm"
|
|
|
|
).toISOString();
|
2018-06-12 21:31:09 +08:00
|
|
|
if (closeDate) pollHeader += ` close=${closeDate}`;
|
|
|
|
}
|
2018-05-03 08:12:19 +08:00
|
|
|
|
2018-06-16 00:42:20 +08:00
|
|
|
pollHeader += "]";
|
2016-06-13 18:21:14 +08:00
|
|
|
output += `${pollHeader}\n`;
|
|
|
|
|
|
|
|
if (pollOptions.length > 0 && !isNumber) {
|
2016-07-14 15:10:31 +08:00
|
|
|
pollOptions.split("\n").forEach(option => {
|
|
|
|
if (option.length !== 0) output += `* ${option}\n`;
|
|
|
|
});
|
2016-06-13 18:21:14 +08:00
|
|
|
}
|
|
|
|
|
2019-10-17 09:40:42 +08:00
|
|
|
output += "[/poll]\n";
|
2016-06-13 18:21:14 +08:00
|
|
|
return output;
|
|
|
|
},
|
|
|
|
|
2018-06-16 00:42:20 +08:00
|
|
|
@computed(
|
|
|
|
"pollOptionsCount",
|
|
|
|
"isRegular",
|
|
|
|
"isMultiple",
|
|
|
|
"isNumber",
|
|
|
|
"pollMin",
|
|
|
|
"pollMax"
|
|
|
|
)
|
2017-04-05 11:15:39 +08:00
|
|
|
disableInsert(count, isRegular, isMultiple, isNumber, pollMin, pollMax) {
|
2018-06-16 00:42:20 +08:00
|
|
|
return (
|
|
|
|
(isRegular && count < 2) ||
|
|
|
|
(isMultiple && count < pollMin && pollMin >= pollMax) ||
|
|
|
|
(isNumber ? false : count < 2)
|
|
|
|
);
|
2017-03-15 00:34:30 +08:00
|
|
|
},
|
|
|
|
|
|
|
|
@computed("pollMin", "pollMax")
|
|
|
|
minMaxValueValidation(pollMin, pollMax) {
|
|
|
|
let options = { ok: true };
|
|
|
|
|
|
|
|
if (pollMin >= pollMax) {
|
2018-06-16 00:42:20 +08:00
|
|
|
options = {
|
|
|
|
failed: true,
|
|
|
|
reason: I18n.t("poll.ui_builder.help.invalid_values")
|
|
|
|
};
|
2017-03-15 00:34:30 +08:00
|
|
|
}
|
|
|
|
|
2019-11-12 04:48:33 +08:00
|
|
|
return EmberObject.create(options);
|
2016-06-13 18:21:14 +08:00
|
|
|
},
|
|
|
|
|
2017-12-01 00:04:41 +08:00
|
|
|
@computed("pollStep")
|
|
|
|
minStepValueValidation(pollStep) {
|
|
|
|
let options = { ok: true };
|
|
|
|
|
|
|
|
if (pollStep < 1) {
|
2018-06-16 00:42:20 +08:00
|
|
|
options = {
|
|
|
|
failed: true,
|
|
|
|
reason: I18n.t("poll.ui_builder.help.min_step_value")
|
|
|
|
};
|
2017-12-01 00:04:41 +08:00
|
|
|
}
|
|
|
|
|
2019-11-12 04:48:33 +08:00
|
|
|
return EmberObject.create(options);
|
2017-12-01 00:04:41 +08:00
|
|
|
},
|
|
|
|
|
2016-06-13 18:21:14 +08:00
|
|
|
@computed("disableInsert")
|
|
|
|
minNumOfOptionsValidation(disableInsert) {
|
|
|
|
let options = { ok: true };
|
|
|
|
|
|
|
|
if (disableInsert) {
|
2018-06-16 00:42:20 +08:00
|
|
|
options = {
|
|
|
|
failed: true,
|
|
|
|
reason: I18n.t("poll.ui_builder.help.options_count")
|
|
|
|
};
|
2016-06-13 18:21:14 +08:00
|
|
|
}
|
|
|
|
|
2019-11-12 04:48:33 +08:00
|
|
|
return EmberObject.create(options);
|
2016-06-13 18:21:14 +08:00
|
|
|
},
|
|
|
|
|
|
|
|
_comboboxOptions(start_index, end_index) {
|
|
|
|
return _.range(start_index, end_index).map(number => {
|
2016-06-14 16:11:45 +08:00
|
|
|
return { value: number, name: number };
|
|
|
|
});
|
2016-06-13 18:21:14 +08:00
|
|
|
},
|
|
|
|
|
|
|
|
_setupPoll() {
|
|
|
|
this.setProperties({
|
|
|
|
pollType: null,
|
|
|
|
publicPoll: false,
|
2018-06-16 00:42:20 +08:00
|
|
|
pollOptions: "",
|
2016-06-13 18:21:14 +08:00
|
|
|
pollMin: 1,
|
|
|
|
pollMax: null,
|
2018-05-03 08:12:19 +08:00
|
|
|
pollStep: 1,
|
|
|
|
autoClose: false,
|
2019-11-26 01:51:01 +08:00
|
|
|
chartType: BAR_CHART_TYPE,
|
2020-01-28 20:30:04 +08:00
|
|
|
pollGroups: null,
|
2018-06-16 00:42:20 +08:00
|
|
|
date: moment()
|
|
|
|
.add(1, "day")
|
|
|
|
.format("YYYY-MM-DD"),
|
|
|
|
time: moment()
|
|
|
|
.add(1, "hour")
|
|
|
|
.format("HH:mm")
|
2016-06-13 18:21:14 +08:00
|
|
|
});
|
|
|
|
},
|
|
|
|
|
|
|
|
actions: {
|
|
|
|
insertPoll() {
|
2019-05-27 16:15:39 +08:00
|
|
|
this.toolbarEvent.addText(this.pollOutput);
|
2016-06-13 18:21:14 +08:00
|
|
|
this.send("closeModal");
|
2016-06-20 18:13:18 +08:00
|
|
|
this._setupPoll();
|
2016-06-13 18:21:14 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|