VulpesOS/gaia/apps/calendar/js/templates/alarm.js
OverSu b38dea0597 Publish Vulpes Preview 15 sources for desktop, Android and Tundra
Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
2026-09-30 23:13:03 +02:00

178 lines
3.9 KiB
JavaScript
Executable file

/* global mozIntl */
define(function(require, exports, module) {
'use strict';
var create = require('template').create;
var MINUTE = 60;
var HOUR = 3600;
var DAY = 86400;
var WEEK = 604800;
var MORNING = HOUR * 9;
var layouts = {
standard: [
'none',
0,
0 - MINUTE * 5,
0 - MINUTE * 15,
0 - MINUTE * 30,
0 - HOUR,
0 - HOUR * 2,
0 - DAY
],
allday: [
'none',
0 + MORNING,
0 - DAY + MORNING,
0 - DAY * 2 + MORNING,
0 - WEEK + MORNING,
0 - WEEK * 2 + MORNING
]
};
var Alarm = create({
reminder: function() {
var alarmContent = '';
var alarms = this.arg('alarms');
var isAllDay = this.arg('isAllDay');
var i = 0;
var alarm;
while ((alarm = alarms[i])) {
i++;
alarmContent += Alarm.description.render({
trigger: alarm.trigger,
layout: isAllDay ? 'allday' : 'standard'
});
}
return alarmContent;
},
description: function() {
var {id, data} = getL10n(this.arg('trigger'), this.arg('layout'));
var args = JSON.stringify(data);
var description = navigator.mozL10n.get(id, data);
return `<div role="listitem" data-l10n-id="${id}"
data-l10n-args=\'${args}\'>
${description}
</div>`;
},
// builds a list of <option>
options: function() {
var content = '';
var selected;
var foundSelected = false;
var trigger = this.arg('trigger');
var layout = this.arg('layout') || 'standard';
var options = layouts[layout];
var i = 0;
var iLen = options.length;
for (; i < iLen; i++) {
selected = false;
// trigger option 'selected' by normalizing imported dates
if (layout === 'allday') {
if (options[i] === (trigger + MORNING)) {
trigger += MORNING;
}
}
if (!selected && trigger && options[i] === trigger) {
selected = true;
foundSelected = true;
}
content += Alarm.option.render({
selected: selected,
layout: layout,
value: options[i]
});
}
// foundSelected is used in cases where user is editing an event that has
// a custom reminder value (X minutes/hours/days before event) and that
// is an option that we don't support internally on the calendar app.
// we always add a new <option> using the custom value and mark it as
// selected.
if (!foundSelected && /^-?\d+$/.test(trigger)) {
content += Alarm.option.render({
selected: true,
layout: layout,
value: trigger
});
}
return content;
},
option: function() {
var _ = navigator.mozL10n.get;
var layout = this.arg('layout');
var value = this.arg('value');
var selected = this.arg('selected');
var l10n = getL10n(value, layout);
var content = [
'<option',
'value="' + value + '"',
(selected ? 'selected' : ''),
'data-l10n-id="' + l10n.id + '"',
'data-l10n-args=\'' + JSON.stringify(l10n.data) + '\'>',
_(l10n.id, l10n.data) + '</option>'
].join(' ');
return content;
},
picker: function() {
return '<span class="button icon icon-dialog">' +
'<select name="alarm[]">' +
Alarm.options.render(this.data) +
'</select>' +
'</span>';
}
});
function getL10n(trigger, layout) {
if (trigger === 'none') {
return {
id: trigger,
data: {}
};
}
// Format the display text based on a zero-offset trigger
if (layout === 'allday') {
var options = layouts.allday;
if (options.indexOf(trigger) !== -1) {
trigger -= MORNING;
}
}
if (trigger === 0) {
return {
id: 'alarm-at-event-' + layout,
data: {}
};
}
var affix = trigger > 0 ? 'after' : 'before';
var part = mozIntl._gaia.relativePart(trigger * 1000);
return {
id: part.unit + '-' + affix,
data: {
value: part.value
}
};
}
module.exports = Alarm;
});