wikimedia/eventmetrics

View on GitHub
app/Resources/assets/js/eventedit.js

Summary

Maintainability
A
0 mins
Test Coverage
eventmetrics.eventedit = {};

$(function () {
    // Only run on event-new, edit and copy pages (all event pages except -show).
    if (!$('body').hasClass('event') || $('body').hasClass('event-show')) {
        return;
    }

    // Attempt to default the timezone to the user's timezone when creating a new event.
    if ($('body').hasClass('event-new')) {
        var timezone = 'UTC';
        try {
            timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
            if ($("#event_timezone option[value='" + timezone + "']").length) {
                $('#event_timezone').val(timezone);
            }
        } catch (_error) {
        }
    }

    eventmetrics.eventedit.setupWikiInputs();
    eventmetrics.eventedit.setupDateRangePicker();
});

/**
 * Set up wiki autocompletion and listeners for the special wiki links (e.g. "All Wikipedias").
 */
eventmetrics.eventedit.setupWikiInputs = function () {
    // Setup the add/remove wiki fields.
    eventmetrics.application.setupAddRemove('event', 'wiki');

    eventmetrics.application.populateValidWikis().then(function (validWikis) {
        $('.event__wikis').on('focus', '.event-wiki-input', function () {
            if ($(this).data().typeahead) {
                return;
            }

            $(this).typeahead({
                source: validWikis
            });
        });
    });

    /**
     * Listener for special wiki options.
     */
    $('.special-wiki').on('click', function (e) {
        e.preventDefault();

        var $lastWiki = $('.event__wikis').find('input').last();

        if ($lastWiki.val().trim() !== '') {
            $('.add-wiki').trigger('click');
            $lastWiki = $('.event__wikis').find('input').last();
        }

        $lastWiki.val($(e.target).data('value'));
    });
};

/**
 * Setup the date range picker on the event new/edit page. The user sees a single input field containing the date range.
 * Hidden start/end date inputs are updated when the date range is changed, as this is how the server wants it.
 */
eventmetrics.eventedit.setupDateRangePicker = function () {
    var startDate = moment($('#event_start').val()).utc(),
        endDate = moment($('#event_end').val()).utc();

    // Set defaults if invalid or blank -- next week.
    startDate = startDate.isValid() ? startDate : moment().add(7, 'days').startOf('week');
    endDate = endDate.isValid() ? endDate : moment().add(7, 'days').endOf('week');

    $('#event_time').daterangepicker({
        timePicker: true,
        timePicker24Hour: eventmetrics.dateLocales.is24HourFormat(),
        startDate: startDate,
        endDate: endDate,
        locale: {
            format: eventmetrics.dateLocales.getLocaleDatePattern() + ' ' + eventmetrics.dateLocales.getLocaleTimePattern(),
            applyLabel: $.i18n('apply'),
            cancelLabel: $.i18n('cancel'),
            customRangeLabel: $.i18n('custom-range'),
            daysOfWeek: eventmetrics.dateLocales.getWeekdayNames(),
            monthNames: eventmetrics.dateLocales.getMonthNames()
        }
    });

    // Populate hidden start/end datetime fields on form submission.
    $('#event_form').on('submit', function () {
        var rangeData = $('#event_time').data().daterangepicker;
        // These date formats match what's defined in EventType.php
        $('#event_start').val(rangeData.startDate.format('YYYY-MM-DD HH:mm:00-00:00'));
        $('#event_end').val(rangeData.endDate.format('YYYY-MM-DD HH:mm:00-00:00'));
    });
};