/* # Mantis - a php based bugtracking system # Copyright 2000 - 2002 Kenzaburo Ito - kenito@300baud.org # Copyright 2002 MantisBT Team - mantisbt-dev@lists.sourceforge.net # Mantis is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # Mantis is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Mantis. If not, see . */ /* * Collapsible element functions */ var g_collapse_clear = 1; // global code to determine how to set visibility var a = navigator.userAgent.indexOf("MSIE"); var style_display; if (a!= -1) { style_display = 'block'; } else { style_display = 'table-row'; } style_display = 'block'; $(document).ready( function() { $('.collapse-open').show(); $('.collapse-closed').hide(); $('.collapse-link').click( function(event) { event.preventDefault(); var id = $(this).attr('id'); var t_pos = id.indexOf('_closed_link' ); if( t_pos == -1 ) { t_pos = id.indexOf('_open_link' ); } var t_div = id.substring(0, t_pos ); ToggleDiv( t_div ); }); var options = { valueNames: [ 'project-link' ] }; var list = new List('projects-list', options); if(list.items.length <= 10) { $('#projects-list .searchbox').hide(); } $('.widget-box').on('shown.ace.widget' , function(event) { var t_id = $(this).attr('id'); var t_cookie = GetCookie( "collapse_settings" ); if ( 1 == g_collapse_clear ) { t_cookie = ""; g_collapse_clear = 0; } t_cookie = t_cookie.replace("|" + t_id + ":1", '' ); t_cookie = t_cookie + "|" + t_id + ":0"; SetCookie( "collapse_settings", t_cookie ); }); $('.widget-box').on('hidden.ace.widget' , function(event) { var t_id = $(this).attr('id'); var t_cookie = GetCookie( "collapse_settings" ); if ( 1 == g_collapse_clear ) { t_cookie = ""; g_collapse_clear = 0; } t_cookie = t_cookie.replace( "|" + t_id + ":0", '' ); t_cookie = t_cookie + "|" + t_id + ":1"; SetCookie( "collapse_settings", t_cookie ); }); $('#sidebar-btn.sidebar-toggle').on('click', function (event) { var t_cookie; var t_sidebar = $(this).closest('.sidebar'); var t_id = t_sidebar.attr('id'); if (1 == g_collapse_clear) { t_cookie = ""; g_collapse_clear = 0; } else { // Get collapse state and remove the old value t_cookie = GetCookie("collapse_settings"); t_cookie = t_cookie.replace(new RegExp('\\|' + t_id + ':.'), ''); } // Save the new collapse state var t_value = !t_sidebar.hasClass("menu-min") | 0; t_cookie += '|' + t_id + ':' + t_value; SetCookie("collapse_settings", t_cookie); }); $('input[type=text].typeahead').each(function() { var $this = $(this); $(this).typeahead({ minLength: 1, highlight: true }, { source: function (query, undefined, callback) { var params = {}; params['field'] = $this[0].id; params['prefix'] = query; $.getJSON('api/rest/internal/autocomplete', params, function (data) { var results = []; $.each(data, function (i, value) { results.push(value); }); callback(results); }); } }); }); $('a.dynamic-filter-expander').click(function(event) { event.preventDefault(); var fieldID = $(this).attr('id'); var filter_id = $(this).data('filter_id'); var filter_tmp_id = $(this).data('filter'); var targetID = fieldID + '_target'; var viewType = $('#filters_form_open input[name=view_type]').val(); $('#' + targetID).html('' + translations['loading'] + ""); var params = 'view_type=' + viewType + '&filter_target=' + fieldID; if( undefined !== filter_id ) { params += '&filter_id=' + filter_id; } if( undefined !== filter_tmp_id ) { params += '&filter=' + filter_tmp_id; } $.ajax({ url: 'return_dynamic_filters.php', data: params, cache: false, context: $('#' + targetID), success: function(html) { $(this).html(html); }, error: function(obj,status,error) { $(this).html('' + status + ': ' + error + ''); } }); }); $('input.autofocus:first, select.autofocus:first, textarea.autofocus:first').focus(); var checkAllSelectors = ''; $(':checkbox.check_all').each(function() { var baseFieldName = $(this).attr('name').replace(/_all$/, ''); if (checkAllSelectors.length > 0) { checkAllSelectors += ', '; } checkAllSelectors += ':checkbox[name="' + baseFieldName + '[]"]'; }); if (checkAllSelectors.length > 0) { $(checkAllSelectors).click(function() { var fieldName = $(this).attr('name').replace(/\[\]/g, ''); var checkedCount = $(this).closest('form').find(':checkbox[name="' + fieldName + '[]"]:checked').length; var totalCount = $(this).closest('form').find(':checkbox[name="' + fieldName + '[]"]').length; var allSelected = checkedCount == totalCount; $(this).closest('form').find(':checkbox[name=' + fieldName + '_all]').prop('checked', allSelected); }); $(':checkbox.check_all').click(function() { var baseFieldName = $(this).attr('name').replace(/_all$/, ''); $(this).closest('form').find(':checkbox[name="' + baseFieldName + '[]"]').prop('checked', $(this).is(':checked')); }); } var stopwatch = { timerID: 0, startTime: null, zeroTime: moment('0', 's'), tick: function() { var elapsedDiff = moment().diff(this.startTime), elapsedTime = this.zeroTime.clone().add(elapsedDiff); $('input[type=text].stopwatch_time').val(elapsedTime.format('HH:mm:ss')); }, reset: function() { this.stop(); $('input[type=text].stopwatch_time').val(''); }, start: function() { var self = this, timeFormat = '', stoppedTime = $('input[type=text].stopwatch_time').val(); this.stop(); if (stoppedTime) { switch (stoppedTime.split(':').length) { case 1: timeFormat = 'ss'; break; case 2: timeFormat = 'mm:ss'; break; default: timeFormat = 'HH:mm:ss'; } this.startTime = moment().add(this.zeroTime.clone().diff(moment(stoppedTime, timeFormat))); } else { this.startTime = moment(); } this.timerID = window.setInterval(function() { self.tick(); }, 1000); $('input[type=button].stopwatch_toggle').val(translations['time_tracking_stopwatch_stop']); }, stop: function() { if (this.timerID) { window.clearInterval(this.timerID); this.timerID = 0; } $('input[type=button].stopwatch_toggle').val(translations['time_tracking_stopwatch_start']); } }; $('input[type=button].stopwatch_toggle').click(function() { if (!stopwatch.timerID) { stopwatch.start(); } else { stopwatch.stop(); } }); $('input[type=button].stopwatch_reset').click(function() { stopwatch.reset(); }); $('input[type=text].datetimepicker').each(function(index, element) { $(this).datetimepicker({ locale: $(this).data('picker-locale'), format: $(this).data('picker-format'), useCurrent: false, icons: { time: 'fa fa-clock-o', date: 'fa fa-calendar', up: 'fa fa-chevron-up', down: 'fa fa-chevron-down', previous: 'fa fa-chevron-left', next: 'fa fa-chevron-right', today: 'fa fa-arrows ', clear: 'fa fa-trash', close: 'fa fa-times' } }).next().on(ace.click_event, function() { $(this).prev().focus(); }); }); $( 'form .dropzone' ).each(function(){ var classPrefix = 'dropzone'; var autoUpload = $(this).hasClass('auto-dropzone'); enableDropzone( classPrefix, autoUpload ); }); $('.bug-jump').find('[name=bug_id]').focus( function() { var bug_label = $('.bug-jump-form').find('[name=bug_label]').val(); if( $(this).val() == bug_label ) { $(this).val(''); $(this).removeClass('field-default'); } }); $('.bug-jump').find('[name=bug_id]').blur( function() { var bug_label = $('.bug-jump-form').find('[name=bug_label]').val(); if( $(this).val() == '' ) { $(this).val(bug_label); $(this).addClass('field-default'); } }); $('[name=source_query_id]').change( function() { $(this).parent().submit(); }); /* Project selector: auto-switch on select */ $('#form-set-project-id').change( function() { $('#form-set-project').submit(); }); $('#project-selector').children('.button').hide(); setBugLabel(); /* Handle standard filter date fields */ $(document).on('change', '.js_switch_date_inputs_trigger', function() { $(this).closest('table') .find('select') .prop('disabled', !$(this).prop('checked')); }); /* Handle custom field of date type */ $(document).on('change', 'select[name^=custom_field_][name$=_control]', function() { var table = $(this).closest('table'); switch(this.value) { case '2': // between $(table).find("select[name*=_start_year]").prop('disabled', false); $(table).find("select[name*=_start_month]").prop('disabled', false); $(table).find("select[name*=_start_day]").prop('disabled', false); $(table).find("select[name*=_end_year]").prop('disabled', false); $(table).find("select[name*=_end_month]").prop('disabled', false); $(table).find("select[name*=_end_day]").prop('disabled', false); break; case '3': // on or before case '4': // before case '5': // on case '6': // after case '7': // on or after $(table).find("select[name*=_start_year]").prop('disabled', false); $(table).find("select[name*=_start_month]").prop('disabled', false); $(table).find("select[name*=_start_day]").prop('disabled', false); $(table).find("select[name*=_end_year]").prop('disabled', true); $(table).find("select[name*=_end_month]").prop('disabled', true); $(table).find("select[name*=_end_day]").prop('disabled', true); break; case '0': // any case '1': // none default: $(table).find("select[name*=_start_year]").prop('disabled', true); $(table).find("select[name*=_start_month]").prop('disabled', true); $(table).find("select[name*=_start_day]").prop('disabled', true); $(table).find("select[name*=_end_year]").prop('disabled', true); $(table).find("select[name*=_end_month]").prop('disabled', true); $(table).find("select[name*=_end_day]").prop('disabled', true); break; } }); /* For Period.php bundled with the core MantisGraph plugin */ $('#dates > input[type=image].datetime').hide(); $('#period_menu > select#interval').change(function() { if ($(this).val() == 10) { $('#dates > input[type=text].datetime').prop('disabled', false); $('#dates > input[type=image].datetime').show(); } else { $('#dates > input[type=text].datetime').prop('disabled', true); $('#dates > input[type=image].datetime').hide(); } }); $(document).on('change', '#tag_select', function() { var tagSeparator = $('#tag_separator').val(); var currentTagString = $('#tag_string').val(); var newTagOptionID = $(this).val(); var newTag = $('#tag_select option[value=' + newTagOptionID + ']').text(); var tagArray = currentTagString.split(tagSeparator); if (tagArray.indexOf(newTag) == -1) { if (currentTagString.length > 0) { $('#tag_string').val(currentTagString + tagSeparator + newTag); } else { $('#tag_string').val(newTag); } } $(this).val(0); }); $('a.click-url').bind("click", function() { $(this).attr("href", $(this).attr("url")); }); $('input[name=private].ace').bind("click", function() { if ($(this).is(":checked")){ $('textarea[name=bugnote_text]').addClass("bugnote-private"); $('tr[id=bugnote-attach-files]').hide(); } else { $('textarea[name=bugnote_text]').removeClass("bugnote-private"); $('tr[id=bugnote-attach-files]').show(); } }); $(document).on('shown.bs.dropdown', '#dropdown_projects_menu', function() { $(this).find(".dropdown-menu li.active a").focus(); }); /** * Manage visiblity on hover trigger objects */ if( $('.visible-on-hover-toggle').length ) { $('.visible-on-hover-toggle').hover( function(e){ // handlerIn $(e.currentTarget).find('.visible-on-hover').removeClass('invisible'); }, function(e){ // handlerOut $(e.currentTarget).find('.visible-on-hover').addClass('invisible'); } ); $('.visible-on-hover').addClass('invisible'); } }); function setBugLabel() { var bug_label = $('.bug-jump-form').find('[name=bug_label]').val(); var field = $('.bug-jump').find('[name=bug_id]'); if( field.val() == '' ) { field.val(bug_label); field.addClass('field-default'); } } /* * String manipulation */ function Trim( p_string ) { if (typeof p_string != "string") { return p_string; } var t_string = p_string; var t_ch = ''; // Trim beginning spaces t_ch = t_string.substring( 0, 1 ); while ( t_ch == " " ) { t_string = t_string.substring( 1, t_string.length ); t_ch = t_string.substring( 0, 1 ); } // Trim trailing spaces t_ch = t_string.substring( t_string.length-1, t_string.length ); while ( t_ch == " " ) { t_string = t_string.substring( 0, t_string.length-1 ); t_ch = t_string.substring( t_string.length-1, t_string.length ); } return t_string; } /* * Cookie functions */ function GetCookie( p_cookie ) { var t_cookie_name = "MANTIS_" + p_cookie; var t_cookies = document.cookie; t_cookies = t_cookies.split( ";" ); var i = 0; while( i < t_cookies.length ) { var t_cookie = t_cookies[ i ]; t_cookie = t_cookie.split( "=" ); if ( Trim( t_cookie[ 0 ] ) == t_cookie_name ) { return( t_cookie[ 1 ] ); } i++; } return -1; } function SetCookie( p_cookie, p_value ) { var t_cookie_name = "MANTIS_" + p_cookie; var t_expires = new Date(); t_expires.setTime( t_expires.getTime() + (365 * 24 * 60 * 60 * 1000)); document.cookie = t_cookie_name + "=" + p_value + "; expires=" + t_expires.toUTCString() + ";"; } function ToggleDiv( p_div ) { var t_open_div = '#' + p_div + "_open"; var t_closed_div = '#' + p_div + "_closed"; var t_cookie = GetCookie( "collapse_settings" ); if ( 1 == g_collapse_clear ) { t_cookie = ""; g_collapse_clear = 0; } var t_open_display = $(t_open_div).css('display'); $(t_open_div).toggle(); if( $(t_closed_div).length ) { $(t_closed_div).toggle(); } if ( t_open_display == "none" ) { t_cookie = t_cookie.replace( "|" + p_div + ":0", '' ); t_cookie = t_cookie + "|" + p_div + ":1"; } else { t_cookie = t_cookie.replace( "|" + p_div + ":1", '' ); t_cookie = t_cookie + "|" + p_div + ":0"; } SetCookie( "collapse_settings", t_cookie ); } function setDisplay(idTag, state) { if(!document.getElementById(idTag)) alert('SetDisplay(): id '+idTag+' is empty'); // change display visibility if ( state != 0 ) { document.getElementById(idTag).style.display = style_display; } else { document.getElementById(idTag).style.display = 'none'; } } function toggleDisplay(idTag) { setDisplay( idTag, (document.getElementById(idTag).style.display == 'none')?1:0 ); } // Dropzone handler Dropzone.autoDiscover = false; function enableDropzone( classPrefix, autoUpload ) { var zone_class = '.' + classPrefix; var zone = $( zone_class ); var form = zone.closest('form'); try { var zone_object = new Dropzone( form[0], { forceFallback: zone.data('force-fallback'), paramName: "ufile", autoProcessQueue: autoUpload, clickable: zone_class, previewsContainer: '#' + classPrefix + '-previews-box', uploadMultiple: true, parallelUploads: 100, maxFilesize: zone.data('max-filesize'), addRemoveLinks: !autoUpload, acceptedFiles: zone.data('accepted-files'), previewTemplate: "
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
", dictDefaultMessage: zone.data('default-message'), dictFallbackMessage: zone.data('fallback-message'), dictFallbackText: zone.data('fallback-text'), dictFileTooBig: zone.data('file-too-big'), dictInvalidFileType: zone.data('invalid-file-type'), dictResponseError: zone.data('response-error'), dictCancelUpload: zone.data('cancel-upload'), dictCancelUploadConfirmation: zone.data('cancel-upload-confirmation'), dictRemoveFile: zone.data('remove-file'), dictRemoveFileConfirmation: zone.data('remove-file-confirmation'), dictMaxFilesExceeded: zone.data('max-files-exceeded'), init: function () { var dropzone = this; var form = $( this.options.clickable ).closest('form'); form.on('submit', function (e) { if( dropzone.getQueuedFiles().length ) { e.preventDefault(); e.stopPropagation(); dropzone.processQueue(); } }); this.on( "successmultiple", function( files, response ) { document.open(); document.write( response ); document.close(); }); }, fallback: function() { if( $( "." + classPrefix ).length ) { $( "." + classPrefix ).hide(); } } }); } catch (e) { alert( zone.data('dropzone-not-supported') ); } }