122 lines
3.4 KiB
JavaScript
122 lines
3.4 KiB
JavaScript
const calendarRule = {
|
|
tag: "calendar",
|
|
|
|
before: function (state, info) {
|
|
let wrapperDivToken = state.push("div_calendar_wrap", "div", 1);
|
|
wrapperDivToken.attrs = [["class", "discourse-calendar-wrap"]];
|
|
|
|
let headerDivToken = state.push("div_calendar_header", "div", 1);
|
|
headerDivToken.attrs = [["class", "discourse-calendar-header"]];
|
|
|
|
let titleH2Token = state.push("h2_open", "h2", 1);
|
|
titleH2Token.attrs = [["class", "discourse-calendar-title"]];
|
|
state.push("h2_close", "h2", -1);
|
|
|
|
let timezoneWrapToken = state.push("span_open", "span", 1);
|
|
timezoneWrapToken.attrs = [["class", "discourse-calendar-timezone-wrap"]];
|
|
if (info.attrs.tzPicker === "true") {
|
|
_renderTimezonePicker(state);
|
|
}
|
|
state.push("span_close", "span", -1);
|
|
|
|
state.push("div_calendar_header", "div", -1);
|
|
|
|
let mainCalendarDivToken = state.push("div_calendar", "div", 1);
|
|
mainCalendarDivToken.attrs = [
|
|
["class", "calendar"],
|
|
["data-calendar-type", info.attrs.type || "dynamic"],
|
|
["data-calendar-default-timezone", info.attrs.defaultTimezone],
|
|
];
|
|
|
|
if (info.attrs.defaultView) {
|
|
mainCalendarDivToken.attrs.push([
|
|
"data-calendar-default-view",
|
|
info.attrs.defaultView,
|
|
]);
|
|
}
|
|
|
|
if (info.attrs.weekends) {
|
|
mainCalendarDivToken.attrs.push(["data-weekends", info.attrs.weekends]);
|
|
}
|
|
|
|
if (info.attrs.showAddToCalendar) {
|
|
mainCalendarDivToken.attrs.push([
|
|
"data-calendar-show-add-to-calendar",
|
|
info.attrs.showAddToCalendar === "true",
|
|
]);
|
|
}
|
|
|
|
if (info.attrs.hiddenDays) {
|
|
mainCalendarDivToken.attrs.push([
|
|
"data-hidden-days",
|
|
info.attrs.hiddenDays,
|
|
]);
|
|
}
|
|
},
|
|
|
|
after: function (state) {
|
|
state.push("div_calendar", "div", -1);
|
|
state.push("div_calendar_wrap", "div", -1);
|
|
},
|
|
};
|
|
|
|
const groupTimezoneRule = {
|
|
tag: "timezones",
|
|
|
|
before: function (state, info) {
|
|
const wrapperDivToken = state.push("div_group_timezones", "div", 1);
|
|
wrapperDivToken.attrs = [
|
|
["class", "group-timezones"],
|
|
["data-group", info.attrs.group],
|
|
["data-size", info.attrs.size || "medium"],
|
|
];
|
|
},
|
|
|
|
after: function (state) {
|
|
state.push("div_group_timezones", "div", -1);
|
|
},
|
|
};
|
|
|
|
function _renderTimezonePicker(state) {
|
|
const timezoneSelectToken = state.push("select_open", "select", 1);
|
|
timezoneSelectToken.attrs = [["class", "discourse-calendar-timezone-picker"]];
|
|
|
|
state.push("select_close", "select", -1);
|
|
}
|
|
|
|
export function setup(helper) {
|
|
helper.whiteList([
|
|
"div.calendar",
|
|
"div.discourse-calendar-header",
|
|
"div.discourse-calendar-wrap",
|
|
"select.discourse-calendar-timezone-picker",
|
|
"span.discourse-calendar-timezone-wrap",
|
|
"h2.discourse-calendar-title",
|
|
"div[data-calendar-type]",
|
|
"div[data-calendar-default-view]",
|
|
"div[data-calendar-default-timezone]",
|
|
"div[data-weekends]",
|
|
"div[data-hidden-days]",
|
|
"div.group-timezones",
|
|
"div[data-group]",
|
|
"div[data-size]",
|
|
]);
|
|
|
|
helper.registerOptions((opts, siteSettings) => {
|
|
opts.features[
|
|
"discourse-calendar-enabled"
|
|
] = !!siteSettings.calendar_enabled;
|
|
});
|
|
|
|
helper.registerPlugin((md) => {
|
|
const features = md.options.discourse.features;
|
|
if (features["discourse-calendar-enabled"]) {
|
|
md.block.bbcode.ruler.push("discourse-calendar", calendarRule);
|
|
md.block.bbcode.ruler.push(
|
|
"discourse-group-timezones",
|
|
groupTimezoneRule
|
|
);
|
|
}
|
|
});
|
|
}
|