summaryrefslogtreecommitdiffstats
path: root/public/javascripts/application.js
diff options
context:
space:
mode:
authorMarius Balteanu <marius.balteanu@zitec.com>2024-02-07 20:44:44 +0000
committerMarius Balteanu <marius.balteanu@zitec.com>2024-02-07 20:44:44 +0000
commit9b540ae8af48a645548a12f77630e07aae8330ba (patch)
treeeb9d742e31b28575ebcd0656a73b00607fc7440b /public/javascripts/application.js
parente46cf51650a7e83effaa44cc045c0af409ea9ce9 (diff)
downloadredmine-9b540ae8af48a645548a12f77630e07aae8330ba.tar.gz
redmine-9b540ae8af48a645548a12f77630e07aae8330ba.zip
Move public assets (images, javascripts, stylesheets, themes) to app/assets (#39111).
git-svn-id: https://svn.redmine.org/redmine/trunk@22694 e93f8b46-1217-0410-a6f0-8f06a7374b81
Diffstat (limited to 'public/javascripts/application.js')
-rw-r--r--public/javascripts/application.js1244
1 files changed, 0 insertions, 1244 deletions
diff --git a/public/javascripts/application.js b/public/javascripts/application.js
deleted file mode 100644
index 007fa6a41..000000000
--- a/public/javascripts/application.js
+++ /dev/null
@@ -1,1244 +0,0 @@
-/**
- * Redmine - project management software
- * Copyright (C) 2006-2023 Jean-Philippe Lang
- * This code is released under the GNU General Public License.
- */
-
-function sanitizeHTML(string) {
- var temp = document.createElement('span');
- temp.textContent = string;
- return temp.innerHTML;
-}
-
-function checkAll(id, checked) {
- $('#'+id).find('input[type=checkbox]:enabled').prop('checked', checked);
-}
-
-function toggleCheckboxesBySelector(selector) {
- var all_checked = true;
- $(selector).each(function(index) {
- if (!$(this).is(':checked')) { all_checked = false; }
- });
- $(selector).prop('checked', !all_checked).trigger('change');
-}
-
-function showAndScrollTo(id, focus) {
- $('#'+id).show();
- if (focus !== null) {
- $('#'+focus).focus();
- }
- $('html, body').animate({scrollTop: $('#'+id).offset().top}, 100);
-}
-
-function toggleRowGroup(el) {
- var tr = $(el).parents('tr').first();
- var n = tr.next();
- tr.toggleClass('open');
- $(el).toggleClass('icon-expanded icon-collapsed');
- while (n.length && !n.hasClass('group')) {
- n.toggle();
- n = n.next('tr');
- }
-}
-
-function collapseAllRowGroups(el) {
- var tbody = $(el).parents('tbody').first();
- tbody.children('tr').each(function(index) {
- if ($(this).hasClass('group')) {
- $(this).removeClass('open');
- $(this).find('.expander').switchClass('icon-expanded', 'icon-collapsed');
- } else {
- $(this).hide();
- }
- });
-}
-
-function expandAllRowGroups(el) {
- var tbody = $(el).parents('tbody').first();
- tbody.children('tr').each(function(index) {
- if ($(this).hasClass('group')) {
- $(this).addClass('open');
- $(this).find('.expander').switchClass('icon-collapsed', 'icon-expanded');
- } else {
- $(this).show();
- }
- });
-}
-
-function toggleAllRowGroups(el) {
- var tr = $(el).parents('tr').first();
- if (tr.hasClass('open')) {
- collapseAllRowGroups(el);
- } else {
- expandAllRowGroups(el);
- }
-}
-
-function toggleFieldset(el) {
- var fieldset = $(el).parents('fieldset').first();
- fieldset.toggleClass('collapsed');
- fieldset.children('legend').toggleClass('icon-expanded icon-collapsed');
- fieldset.children('div').toggle();
-}
-
-function hideFieldset(el) {
- var fieldset = $(el).parents('fieldset').first();
- fieldset.toggleClass('collapsed');
- fieldset.children('div').hide();
-}
-
-// columns selection
-function moveOptions(theSelFrom, theSelTo) {
- $(theSelFrom).find('option:selected').detach().prop("selected", false).appendTo($(theSelTo));
-}
-
-function moveOptionUp(theSel) {
- $(theSel).find('option:selected').each(function(){
- $(this).prev(':not(:selected)').detach().insertAfter($(this));
- });
-}
-
-function moveOptionTop(theSel) {
- $(theSel).find('option:selected').detach().prependTo($(theSel));
-}
-
-function moveOptionDown(theSel) {
- $($(theSel).find('option:selected').get().reverse()).each(function(){
- $(this).next(':not(:selected)').detach().insertBefore($(this));
- });
-}
-
-function moveOptionBottom(theSel) {
- $(theSel).find('option:selected').detach().appendTo($(theSel));
-}
-
-function initFilters() {
- $('#add_filter_select').change(function() {
- addFilter($(this).val(), '', []);
- });
- $('#filters-table .field input[type=checkbox]').each(function() {
- toggleFilter($(this).val());
- });
- $('#filters-table').on('click', '.field input[type=checkbox]', function() {
- toggleFilter($(this).val());
- });
- $('#filters-table').on('keypress', 'input[type=text]', function(e) {
- if (e.keyCode == 13) $(this).closest('form').submit();
- });
-}
-
-function addFilter(field, operator, values) {
- var fieldId = field.replace('.', '_');
- var tr = $('#tr_'+fieldId);
-
- var filterOptions = availableFilters[field];
- if (!filterOptions) return;
-
- if (filterOptions['remote'] && filterOptions['values'] == null) {
- $.getJSON(filtersUrl, {'name': field}).done(function(data) {
- filterOptions['values'] = data;
- addFilter(field, operator, values) ;
- });
- return;
- }
-
- if (tr.length > 0) {
- tr.show();
- } else {
- buildFilterRow(field, operator, values);
- }
- $('#cb_'+fieldId).prop('checked', true);
- toggleFilter(field);
- toggleMultiSelectIconInit();
- $('#add_filter_select').val('').find('option').each(function() {
- if ($(this).attr('value') == field) {
- $(this).attr('disabled', true);
- }
- });
-}
-
-function buildFilterRow(field, operator, values) {
- var fieldId = field.replace('.', '_');
- var filterTable = $("#filters-table");
- var filterOptions = availableFilters[field];
- if (!filterOptions) return;
- var operators = operatorByType[filterOptions['type']];
- var filterValues = filterOptions['values'];
- var i, select;
-
- var tr = $('<div class="filter">').attr('id', 'tr_'+fieldId).html(
- '<div class="field"><input checked="checked" id="cb_'+fieldId+'" name="f[]" value="'+field+'" type="checkbox"><label for="cb_'+fieldId+'"> '+filterOptions['name']+'</label></div>' +
- '<div class="operator"><select id="operators_'+fieldId+'" name="op['+field+']"></select></div>' +
- '<div class="values"></div>'
- );
- filterTable.append(tr);
-
- select = tr.find('.operator select');
- for (i = 0; i < operators.length; i++) {
- var option = $('<option>').val(operators[i]).text(operatorLabels[operators[i]]);
- if (operators[i] == operator) { option.prop('selected', true); }
- select.append(option);
- }
- select.change(function(){ toggleOperator(field); });
-
- switch (filterOptions['type']) {
- case "list":
- case "list_with_history":
- case "list_optional":
- case "list_optional_with_history":
- case "list_status":
- case "list_subprojects":
- tr.find('.values').append(
- '<span style="display:none;"><select class="value" id="values_'+fieldId+'_1" name="v['+field+'][]"></select>' +
- ' <span class="toggle-multiselect icon-only '+(values.length > 1 ? 'icon-toggle-minus' : 'icon-toggle-plus')+'">&nbsp;</span></span>'
- );
- select = tr.find('.values select');
- if (values.length > 1) { select.attr('multiple', true); }
- for (i = 0; i < filterValues.length; i++) {
- var filterValue = filterValues[i];
- var option = $('<option>');
- if ($.isArray(filterValue)) {
- option.val(filterValue[1]).text(filterValue[0]);
- if ($.inArray(filterValue[1], values) > -1) {option.prop('selected', true);}
- if (filterValue.length == 3) {
- var optgroup = select.find('optgroup').filter(function(){return $(this).attr('label') == filterValue[2]});
- if (!optgroup.length) {optgroup = $('<optgroup>').attr('label', filterValue[2]);}
- option = optgroup.append(option);
- }
- } else {
- option.val(filterValue).text(filterValue);
- if ($.inArray(filterValue, values) > -1) {option.prop('selected', true);}
- }
- select.append(option);
- }
- break;
- case "date":
- case "date_past":
- tr.find('.values').append(
- '<span style="display:none;"><input type="date" name="v['+field+'][]" id="values_'+fieldId+'_1" size="10" class="value date_value" /></span>' +
- ' <span style="display:none;"><input type="date" name="v['+field+'][]" id="values_'+fieldId+'_2" size="10" class="value date_value" /></span>' +
- ' <span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'" size="3" class="value" /> '+labelDayPlural+'</span>'
- );
- $('#values_'+fieldId+'_1').val(values[0]).datepickerFallback(datepickerOptions);
- $('#values_'+fieldId+'_2').val(values[1]).datepickerFallback(datepickerOptions);
- $('#values_'+fieldId).val(values[0]);
- break;
- case "string":
- case "text":
- case "search":
- tr.find('.values').append(
- '<span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'" size="30" class="value" /></span>'
- );
- $('#values_'+fieldId).val(values[0]);
- break;
- case "relation":
- tr.find('.values').append(
- '<span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'" size="6" class="value" /></span>' +
- '<span style="display:none;"><select class="value" name="v['+field+'][]" id="values_'+fieldId+'_1"></select></span>'
- );
- $('#values_'+fieldId).val(values[0]);
- select = tr.find('.values select');
- for (i = 0; i < filterValues.length; i++) {
- var filterValue = filterValues[i];
- var option = $('<option>');
- option.val(filterValue[1]).text(filterValue[0]);
- if (values[0] == filterValue[1]) { option.prop('selected', true); }
- select.append(option);
- }
- break;
- case "integer":
- case "float":
- case "tree":
- tr.find('.values').append(
- '<span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'_1" size="14" class="value" /></span>' +
- ' <span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'_2" size="14" class="value" /></span>'
- );
- $('#values_'+fieldId+'_1').val(values[0]);
- $('#values_'+fieldId+'_2').val(values[1]);
- break;
- }
-}
-
-function toggleFilter(field) {
- var fieldId = field.replace('.', '_');
- if ($('#cb_' + fieldId).is(':checked')) {
- $("#operators_" + fieldId).show().removeAttr('disabled');
- toggleOperator(field);
- } else {
- $("#operators_" + fieldId).hide().attr('disabled', true);
- enableValues(field, []);
- }
-}
-
-function enableValues(field, indexes) {
- var fieldId = field.replace('.', '_');
- $('#tr_'+fieldId+' .values .value').each(function(index) {
- if ($.inArray(index, indexes) >= 0) {
- $(this).removeAttr('disabled');
- $(this).parents('span').first().show();
- } else {
- $(this).val('');
- $(this).attr('disabled', true);
- $(this).parents('span').first().hide();
- }
-
- if ($(this).hasClass('group')) {
- $(this).addClass('open');
- } else {
- $(this).show();
- }
- });
-}
-
-function toggleOperator(field) {
- var fieldId = field.replace('.', '_');
- var operator = $("#operators_" + fieldId);
- switch (operator.val()) {
- case "!*":
- case "*":
- case "nd":
- case "t":
- case "ld":
- case "nw":
- case "w":
- case "lw":
- case "l2w":
- case "nm":
- case "m":
- case "lm":
- case "y":
- case "o":
- case "c":
- case "*o":
- case "!o":
- enableValues(field, []);
- break;
- case "><":
- enableValues(field, [0,1]);
- break;
- case "<t+":
- case ">t+":
- case "><t+":
- case "t+":
- case ">t-":
- case "<t-":
- case "><t-":
- case "t-":
- enableValues(field, [2]);
- break;
- case "=p":
- case "=!p":
- case "!p":
- enableValues(field, [1]);
- break;
- default:
- enableValues(field, [0]);
- break;
- }
-}
-
-function toggleMultiSelect(el) {
- var isWorkflow = el.closest('.controller-workflows');
- if (el.attr('multiple')) {
- el.removeAttr('multiple');
- if (isWorkflow) { el.find("option[value=all]").show(); }
- el.attr('size', 1);
- } else {
- el.attr('multiple', true);
- if (isWorkflow) { el.find("option[value=all]").attr("selected", false).hide(); }
- if (el.children().length > 10)
- el.attr('size', 10);
- else
- el.attr('size', 4);
- }
-}
-
-function showTab(name, url) {
- $('#tab-content-' + name).parent().find('.tab-content').hide();
- $('#tab-content-' + name).show();
- $('#tab-' + name).closest('.tabs').find('a').removeClass('selected');
- $('#tab-' + name).addClass('selected');
-
- replaceInHistory(url)
-
- return false;
-}
-
-function showIssueHistory(journal, url) {
- tab_content = $('#tab-content-history');
- tab_content.parent().find('.tab-content').hide();
- tab_content.show();
- tab_content.parent().children('div.tabs').find('a').removeClass('selected');
-
- $('#tab-' + journal).addClass('selected');
-
- replaceInHistory(url)
-
- switch(journal) {
- case 'notes':
- tab_content.find('.journal').show();
- tab_content.find('.journal:not(.has-notes)').hide();
- tab_content.find('.journal .wiki').show();
- tab_content.find('.journal .contextual .journal-actions').show();
-
- // always show thumbnails in notes tab
- var thumbnails = tab_content.find('.journal .thumbnails');
- thumbnails.show();
- // show journals without notes, but with thumbnails
- thumbnails.parents('.journal').show();
- break;
- case 'properties':
- tab_content.find('.journal').show();
- tab_content.find('.journal:not(.has-details)').hide();
- tab_content.find('.journal .wiki').hide();
- tab_content.find('.journal .thumbnails').hide();
- tab_content.find('.journal .contextual .journal-actions').hide();
- break;
- default:
- tab_content.find('.journal').show();
- tab_content.find('.journal .wiki').show();
- tab_content.find('.journal .thumbnails').show();
- tab_content.find('.journal .contextual .journal-actions').show();
- }
-
- return false;
-}
-
-function getRemoteTab(name, remote_url, url, load_always) {
- load_always = load_always || false;
- var tab_content = $('#tab-content-' + name);
-
- tab_content.parent().find('.tab-content').hide();
- tab_content.parent().children('div.tabs').find('a').removeClass('selected');
- $('#tab-' + name).addClass('selected');
-
- replaceInHistory(url);
-
- if (tab_content.children().length == 0 && load_always == false) {
- $.ajax({
- url: remote_url,
- type: 'get',
- success: function(data){
- tab_content.html(data)
- }
- });
- }
-
- tab_content.show();
- return false;
-}
-
-//replaces current URL with the "href" attribute of the current link
-//(only triggered if supported by browser)
-function replaceInHistory(url) {
- if ("replaceState" in window.history && url !== undefined) {
- window.history.replaceState(null, document.title, url);
- }
-}
-
-function moveTabRight(el) {
- var lis = $(el).parents('div.tabs').first().find('ul').children();
- var bw = $(el).parents('div.tabs-buttons').outerWidth(true);
- var tabsWidth = 0;
- var i = 0;
- lis.each(function() {
- if ($(this).is(':visible')) {
- tabsWidth += $(this).outerWidth(true);
- }
- });
- if (tabsWidth < $(el).parents('div.tabs').first().width() - bw) { return; }
- $(el).siblings('.tab-left').removeClass('disabled');
- while (i<lis.length && !lis.eq(i).is(':visible')) { i++; }
- var w = lis.eq(i).width();
- lis.eq(i).hide();
- if (tabsWidth - w < $(el).parents('div.tabs').first().width() - bw) {
- $(el).addClass('disabled');
- }
-}
-
-function moveTabLeft(el) {
- var lis = $(el).parents('div.tabs').first().find('ul').children();
- var i = 0;
- while (i < lis.length && !lis.eq(i).is(':visible')) { i++; }
- if (i > 0) {
- lis.eq(i-1).show();
- $(el).siblings('.tab-right').removeClass('disabled');
- }
- if (i <= 1) {
- $(el).addClass('disabled');
- }
-}
-
-function displayTabsButtons() {
- var lis;
- var tabsWidth;
- var el;
- var numHidden;
- $('div.tabs').each(function() {
- el = $(this);
- lis = el.find('ul').children();
- tabsWidth = 0;
- numHidden = 0;
- lis.each(function(){
- if ($(this).is(':visible')) {
- tabsWidth += $(this).outerWidth(true);
- } else {
- numHidden++;
- }
- });
- var bw = $(el).find('div.tabs-buttons').outerWidth(true);
- if ((tabsWidth < el.width() - bw) && (lis.length === 0 || lis.first().is(':visible'))) {
- el.find('div.tabs-buttons').hide();
- } else {
- el.find('div.tabs-buttons').show().children('button.tab-left').toggleClass('disabled', numHidden == 0);
- }
- });
-}
-
-function setPredecessorFieldsVisibility() {
- var relationType = $('#relation_relation_type');
- if (relationType.val() == "precedes" || relationType.val() == "follows") {
- $('#predecessor_fields').show();
- } else {
- $('#predecessor_fields').hide();
- }
-}
-
-function showModal(id, width, title) {
- var el = $('#'+id).first();
- if (el.length === 0 || el.is(':visible')) {return;}
- if (!title) title = el.find('h3.title').text();
- // moves existing modals behind the transparent background
- $(".modal").css('zIndex',99);
- el.dialog({
- width: width,
- modal: true,
- resizable: false,
- dialogClass: 'modal',
- title: title
- }).on('dialogclose', function(){
- $(".modal").css('zIndex',101);
- });
- el.find("input[type=text], input[type=submit]").first().focus();
-}
-
-function hideModal(el) {
- var modal;
- if (el) {
- modal = $(el).parents('.ui-dialog-content');
- } else {
- modal = $('#ajax-modal');
- }
- modal.dialog("close");
-}
-
-function collapseScmEntry(id) {
- $('.'+id).each(function() {
- if ($(this).hasClass('open')) {
- collapseScmEntry($(this).attr('id'));
- }
- $(this).hide();
- });
- $('#'+id).removeClass('open');
-}
-
-function expandScmEntry(id) {
- $('.'+id).each(function() {
- $(this).show();
- if ($(this).hasClass('loaded') && !$(this).hasClass('collapsed')) {
- expandScmEntry($(this).attr('id'));
- }
- });
- $('#'+id).addClass('open');
-}
-
-function scmEntryClick(id, url) {
- var el = $('#'+id);
- if (el.hasClass('open')) {
- collapseScmEntry(id);
- el.find('.expander').switchClass('icon-expanded', 'icon-collapsed');
- el.addClass('collapsed');
- return false;
- } else if (el.hasClass('loaded')) {
- expandScmEntry(id);
- el.find('.expander').switchClass('icon-collapsed', 'icon-expanded');
- el.removeClass('collapsed');
- return false;
- }
- if (el.hasClass('loading')) {
- return false;
- }
- el.addClass('loading');
- $.ajax({
- url: url,
- success: function(data) {
- el.after(data);
- el.addClass('open').addClass('loaded').removeClass('loading');
- el.find('.expander').switchClass('icon-collapsed', 'icon-expanded');
- }
- });
- return true;
-}
-
-function randomKey(size) {
- var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
- var key = '';
- for (var i = 0; i < size; i++) {
- key += chars.charAt(Math.floor(Math.random() * chars.length));
- }
- return key;
-}
-
-function copyTextToClipboard(target) {
- if (target) {
- var temp = document.createElement('textarea');
- temp.value = target.getAttribute('data-clipboard-text');
- document.body.appendChild(temp);
- temp.select();
- document.execCommand('copy');
- if (temp.parentNode) {
- temp.parentNode.removeChild(temp);
- }
- if ($(target).closest('.drdn.expanded').length) {
- $(target).closest('.drdn.expanded').removeClass("expanded");
- }
- }
- return false;
-}
-
-function updateIssueFrom(url, el) {
- $('#all_attributes input, #all_attributes textarea, #all_attributes select').each(function(){
- $(this).data('valuebeforeupdate', $(this).val());
- });
- if (el) {
- $("#form_update_triggered_by").val($(el).attr('id'));
- }
- return $.ajax({
- url: url,
- type: 'post',
- data: $('#issue-form').serialize()
- });
-}
-
-function replaceIssueFormWith(html){
- var replacement = $(html);
- $('#all_attributes input, #all_attributes textarea, #all_attributes select').each(function(){
- var object_id = $(this).attr('id');
- if (object_id && $(this).data('valuebeforeupdate')!=$(this).val()) {
- replacement.find('#'+object_id).val($(this).val());
- }
- });
- $('#all_attributes').empty();
- $('#all_attributes').prepend(replacement);
-}
-
-function updateBulkEditFrom(url) {
- $.ajax({
- url: url,
- type: 'post',
- data: $('#bulk_edit_form').serialize()
- });
-}
-
-function observeAutocompleteField(fieldId, url, options) {
- $(document).ready(function() {
- $('#'+fieldId).autocomplete($.extend({
- source: url,
- minLength: 2,
- position: {collision: "flipfit"},
- search: function(){$('#'+fieldId).addClass('ajax-loading');},
- response: function(){$('#'+fieldId).removeClass('ajax-loading');}
- }, options));
- $('#'+fieldId).addClass('autocomplete');
- });
-}
-
-function multipleAutocompleteField(fieldId, url, options) {
- function split(val) {
- return val.split(/,\s*/);
- }
-
- function extractLast(term) {
- return split(term).pop();
- }
-
- $(document).ready(function () {
- $('#' + fieldId).autocomplete($.extend({
- source: function (request, response) {
- $.getJSON(url, {
- term: extractLast(request.term)
- }, response);
- },
- minLength: 2,
- position: {collision: "flipfit"},
- search: function () {
- $('#' + fieldId).addClass('ajax-loading');
- },
- response: function () {
- $('#' + fieldId).removeClass('ajax-loading');
- },
- select: function (event, ui) {
- var terms = split(this.value);
- // remove the current input
- terms.pop();
- // add the selected item
- terms.push(ui.item.value);
- // add placeholder to get the comma-and-space at the end
- terms.push("");
- this.value = terms.join(", ");
- return false;
- }
- }, options));
- $('#' + fieldId).addClass('autocomplete');
- });
-}
-
-function observeSearchfield(fieldId, targetId, url) {
- $('#'+fieldId).each(function() {
- var $this = $(this);
- $this.addClass('autocomplete');
- $this.attr('data-value-was', $this.val());
- var check = function() {
- var val = $this.val();
- if ($this.attr('data-value-was') != val){
- $this.attr('data-value-was', val);
- $.ajax({
- url: url,
- type: 'get',
- data: {q: $this.val()},
- success: function(data){ if(targetId) $('#'+targetId).html(data); },
- beforeSend: function(){ $this.addClass('ajax-loading'); },
- complete: function(){ $this.removeClass('ajax-loading'); }
- });
- }
- };
- var reset = function() {
- if (timer) {
- clearInterval(timer);
- timer = setInterval(check, 300);
- }
- };
- var timer = setInterval(check, 300);
- $this.bind('keyup click mousemove', reset);
- });
-}
-
-$(document).ready(function(){
- $(".drdn .autocomplete").val('');
-
- // This variable is used to focus selected project
- var selected;
- $(document).on('click', '.drdn-trigger', function(e){
- var drdn = $(this).closest(".drdn");
- if (drdn.hasClass("expanded")) {
- drdn.removeClass("expanded");
- } else {
- $(".drdn").removeClass("expanded");
- drdn.addClass("expanded");
- selected = $('.drdn-items a.selected'); // Store selected project
- selected.focus(); // Calling focus to scroll to selected project
- if (!isMobile()) {
- drdn.find(".autocomplete").focus();
- }
- e.stopPropagation();
- }
- });
- $(document).click(function(e){
- if ($(e.target).closest(".drdn").length < 1) {
- $(".drdn.expanded").removeClass("expanded");
- }
- });
-
- observeSearchfield('projects-quick-search', null, $('#projects-quick-search').data('automcomplete-url'));
-
- $(".drdn-content").keydown(function(event){
- var items = $(this).find(".drdn-items");
-
- // If a project is selected set focused to selected only once
- if (selected && selected.length > 0) {
- var focused = selected;
- selected = undefined;
- }
- else {
- var focused = items.find("a:focus");
- }
- switch (event.which) {
- case 40: //down
- if (focused.length > 0) {
- focused.nextAll("a").first().focus();;
- } else {
- items.find("a").first().focus();;
- }
- event.preventDefault();
- break;
- case 38: //up
- if (focused.length > 0) {
- var prev = focused.prevAll("a");
- if (prev.length > 0) {
- prev.first().focus();
- } else {
- $(this).find(".autocomplete").focus();
- }
- event.preventDefault();
- }
- break;
- case 35: //end
- if (focused.length > 0) {
- focused.nextAll("a").last().focus();
- event.preventDefault();
- }
- break;
- case 36: //home
- if (focused.length > 0) {
- focused.prevAll("a").last().focus();
- event.preventDefault();
- }
- break;
- }
- });
-});
-
-function beforeShowDatePicker(input, inst) {
- var default_date = null;
- switch ($(input).attr("id")) {
- case "issue_start_date" :
- if ($("#issue_due_date").length > 0) {
- default_date = $("#issue_due_date").val();
- }
- break;
- case "issue_due_date" :
- if ($("#issue_start_date").length > 0) {
- var start_date = $("#issue_start_date").val();
- if (start_date != "") {
- start_date = new Date(Date.parse(start_date));
- if (start_date > new Date()) {
- default_date = $("#issue_start_date").val();
- }
- }
- }
- break;
- }
- $(input).datepickerFallback("option", "defaultDate", default_date);
-}
-
-(function($){
- $.fn.positionedItems = function(sortableOptions, options){
- var settings = $.extend({
- firstPosition: 1
- }, options );
-
- return this.sortable($.extend({
- axis: 'y',
- handle: ".sort-handle",
- helper: function(event, ui){
- ui.children('td').each(function(){
- $(this).width($(this).width());
- });
- return ui;
- },
- update: function(event, ui) {
- var sortable = $(this);
- var handle = ui.item.find(".sort-handle").addClass("ajax-loading");
- var url = handle.data("reorder-url");
- var param = handle.data("reorder-param");
- var data = {};
- data[param] = {position: ui.item.index() + settings['firstPosition']};
- $.ajax({
- url: url,
- type: 'put',
- dataType: 'script',
- data: data,
- error: function(jqXHR, textStatus, errorThrown){
- alert(jqXHR.status);
- sortable.sortable("cancel");
- },
- complete: function(jqXHR, textStatus, errorThrown){
- handle.removeClass("ajax-loading");
- }
- });
- },
- }, sortableOptions));
- }
-}( jQuery ));
-
-var warnLeavingUnsavedMessage;
-function warnLeavingUnsaved(message) {
- warnLeavingUnsavedMessage = message;
- $(document).on('submit', 'form', function(){
- $('textarea').removeData('changed');
- });
- $(document).on('change', 'textarea', function(){
- $(this).data('changed', 'changed');
- });
- window.onbeforeunload = function(){
- var warn = false;
- $('textarea').blur().each(function(){
- if ($(this).data('changed')) {
- warn = true;
- }
- });
- if (warn) {return warnLeavingUnsavedMessage;}
- };
-}
-
-function setupAjaxIndicator() {
- $(document).bind('ajaxSend', function(event, xhr, settings) {
- if ($('.ajax-loading').length === 0 && settings.contentType != 'application/octet-stream') {
- $('#ajax-indicator').show();
- }
- });
- $(document).bind('ajaxStop', function() {
- $('#ajax-indicator').hide();
- });
-}
-
-function setupTabs() {
- if($('.tabs').length > 0) {
- displayTabsButtons();
- $(window).resize(displayTabsButtons);
- }
-}
-
-function setupFilePreviewNavigation() {
- // only bind arrow keys when preview navigation is present
- const element = $('.pagination.filepreview').first();
- if (element) {
-
- const handleArrowKey = function(selector, e){
- const href = $(element).find(selector).attr('href');
- if (href) {
- window.location = href;
- e.preventDefault();
- }
- };
-
- $(document).keydown(function(e) {
- if(e.shiftKey || e.metaKey || e.ctrlKey || e.altKey) return;
- switch(e.key) {
- case 'ArrowLeft':
- handleArrowKey('.previous a', e);
- break;
-
- case 'ArrowRight':
- handleArrowKey('.next a', e);
- break;
- }
- });
- }
-}
-
-$(document).on('keydown', 'form textarea', function(e) {
- // Submit the form with Ctrl + Enter or Command + Return
- var targetForm = $(e.target).closest('form');
- if(e.keyCode == 13 && ((e.ctrlKey && !e.metaKey) || (!e.ctrlKey && e.metaKey) && targetForm.length)) {
- // For ajax, use click() instead of submit() to prevent "Invalid form authenticity token" error
- if (targetForm.attr('data-remote') == 'true') {
- if (targetForm.find('input[type=submit]').length === 0) { return false; }
- targetForm.find('textarea').blur().removeData('changed');
- targetForm.find('input[type=submit]').first().click();
- } else {
- targetForm.find('textarea').blur().removeData('changed');
- targetForm.submit();
- }
- }
-});
-
-
-function hideOnLoad() {
- $('.hol').hide();
-}
-
-function addFormObserversForDoubleSubmit() {
- $('form[method=post]').each(function() {
- if (!$(this).hasClass('multiple-submit')) {
- $(this).submit(function(form_submission) {
- if ($(form_submission.target).attr('data-submitted')) {
- form_submission.preventDefault();
- } else {
- $(form_submission.target).attr('data-submitted', true);
- }
- });
- }
- });
-}
-
-function defaultFocus(){
- if (($('#content :focus').length == 0) && (window.location.hash == '')) {
- $('#content input[type=text]:visible, #content textarea:visible').first().focus();
- }
-}
-
-function blockEventPropagation(event) {
- event.stopPropagation();
- event.preventDefault();
-}
-
-function toggleDisabledOnChange() {
- var checked = $(this).is(':checked');
- $($(this).data('disables')).attr('disabled', checked);
- $($(this).data('enables')).attr('disabled', !checked);
- $($(this).data('shows')).toggle(checked);
-}
-function toggleDisabledInit() {
- $('input[data-disables], input[data-enables], input[data-shows]').each(toggleDisabledOnChange);
-}
-function toggleMultiSelectIconInit() {
- $('.toggle-multiselect:not(.icon-toggle-minus), .toggle-multiselect:not(.icon-toggle-plus)').each(function(){
- if ($(this).siblings('select').find('option:selected').length > 1){
- $(this).addClass('icon-toggle-minus');
- } else {
- $(this).addClass('icon-toggle-plus');
- }
- });
-}
-
-function toggleNewObjectDropdown() {
- var dropdown = $('#new-object + ul.menu-children');
- if(dropdown.hasClass('visible')){
- dropdown.removeClass('visible');
- }else{
- dropdown.addClass('visible');
- }
-}
-
-(function ( $ ) {
-
- // detect if native date input is supported
- var nativeDateInputSupported = true;
-
- var input = document.createElement('input');
- input.setAttribute('type','date');
- if (input.type === 'text') {
- nativeDateInputSupported = false;
- }
-
- var notADateValue = 'not-a-date';
- input.setAttribute('value', notADateValue);
- if (input.value === notADateValue) {
- nativeDateInputSupported = false;
- }
-
- $.fn.datepickerFallback = function( options ) {
- if (nativeDateInputSupported) {
- return this;
- } else {
- return this.datepicker( options );
- }
- };
-}( jQuery ));
-
-$(document).ready(function(){
- $('#content').on('change', 'input[data-disables], input[data-enables], input[data-shows]', toggleDisabledOnChange);
- toggleDisabledInit();
-
- $('#content').on('click', '.toggle-multiselect', function() {
- toggleMultiSelect($(this).siblings('select'));
- $(this).toggleClass('icon-toggle-plus icon-toggle-minus');
- });
- toggleMultiSelectIconInit();
-
- $('#history .tabs').on('click', 'a', function(e){
- var tab = $(e.target).attr('id').replace('tab-','');
- document.cookie = 'history_last_tab=' + tab + '; SameSite=Lax'
- });
-});
-
-$(document).ready(function(){
- $('#content').on('click', 'div.jstTabs a.tab-preview', function(event){
- var tab = $(event.target);
-
- var url = tab.data('url');
- var form = tab.parents('form');
- var jstBlock = tab.parents('.jstBlock');
-
- var element = encodeURIComponent(jstBlock.find('.wiki-edit').val());
- var attachments = form.find('.attachments_fields input').serialize();
-
- $.ajax({
- url: url,
- type: 'post',
- data: "text=" + element + '&' + attachments,
- success: function(data){
- jstBlock.find('.wiki-preview').html(data);
- setupWikiTableSortableHeader();
- }
- });
- });
-});
-
-function keepAnchorOnSignIn(form){
- var hash = decodeURIComponent(self.document.location.hash);
- if (hash) {
- if (hash.indexOf("#") === -1) {
- hash = "#" + hash;
- }
- form.action = form.action + hash;
- }
- return true;
-}
-
-$(function ($) {
- $('#auth_source_ldap_mode').change(function () {
- $('.ldaps_warning').toggle($(this).val() != 'ldaps_verify_peer');
- }).change();
-});
-
-function setFilecontentContainerHeight() {
- var $filecontainer = $('.filecontent-container');
- var fileTypeSelectors = ['.image', 'video'];
-
- if($filecontainer.length > 0 && $filecontainer.find(fileTypeSelectors.join(',')).length === 1) {
- var containerOffsetTop = $filecontainer.offset().top;
- var containerMarginBottom = parseInt($filecontainer.css('marginBottom'));
- var paginationHeight = $filecontainer.next('.pagination').height();
- var diff = containerOffsetTop + containerMarginBottom + paginationHeight;
-
- $filecontainer.css('height', 'calc(100vh - ' + diff + 'px)')
- }
-}
-
-function setupAttachmentDetail() {
- setFilecontentContainerHeight();
- $(window).resize(setFilecontentContainerHeight);
-}
-
-function setupWikiTableSortableHeader() {
- $('div.wiki table').each(function(i, table){
- if (table.rows.length < 3) return true;
- var tr = $(table.rows).first();
- if (tr.find("TH").length > 0) {
- tr.attr('data-sort-method', 'none');
- tr.find("TD").attr('data-sort-method', 'none');
- new Tablesort(table);
- }
- });
-}
-
-$(function () {
- $("[title]:not(.no-tooltip)").tooltip({
- show: {
- delay: 400
- },
- position: {
- my: "center bottom-5",
- at: "center top"
- }
- });
-});
-
-function inlineAutoComplete(element) {
- 'use strict';
-
- // do not attach if Tribute is already initialized
- if (element.dataset.tribute === 'true') {return};
-
- const getDataSource = function(entity) {
- const dataSources = rm.AutoComplete.dataSources;
-
- if (dataSources[entity]) {
- return dataSources[entity];
- } else {
- return false;
- }
- }
-
- const remoteSearch = function(url, cb) {
- const xhr = new XMLHttpRequest();
- xhr.onreadystatechange = function ()
- {
- if (xhr.readyState === 4) {
- if (xhr.status === 200) {
- var data = JSON.parse(xhr.responseText);
- cb(data);
- } else if (xhr.status === 403) {
- cb([]);
- }
- }
- };
- xhr.open("GET", url, true);
- xhr.send();
- };
-
- const tribute = new Tribute({
- collection: [
- {
- trigger: '#',
- values: function (text, cb) {
- if (event.target.type === 'text' && $(element).attr('autocomplete') != 'off') {
- $(element).attr('autocomplete', 'off');
- }
- remoteSearch(getDataSource('issues') + text, function (issues) {
- return cb(issues);
- });
- },
- lookup: 'label',
- fillAttr: 'label',
- requireLeadingSpace: true,
- selectTemplate: function (issue) {
- let leadingHash = "#"
- // keep ## syntax which is a valid issue syntax to show issue with title.
- if (this.currentMentionTextSnapshot.charAt(0) === "#") {
- leadingHash = "##"
- }
- return leadingHash + issue.original.id;
- },
- menuItemTemplate: function (issue) {
- return sanitizeHTML(issue.original.label);
- }
- },
- {
- trigger: '[[',
- values: function (text, cb) {
- remoteSearch(getDataSource('wiki_pages') + text, function (wikiPages) {
- return cb(wikiPages);
- });
- },
- lookup: 'label',
- fillAttr: 'label',
- requireLeadingSpace: true,
- selectTemplate: function (wikiPage) {
- return '[[' + wikiPage.original.value + ']]';
- },
- menuItemTemplate: function (wikiPage) {
- return sanitizeHTML(wikiPage.original.label);
- }
- },
- {
- trigger: '@',
- lookup: function (user, mentionText) {
- return user.name + user.firstname + user.lastname + user.login;
- },
- values: function (text, cb) {
- const url = getDataSource('users');
- if (url) {
- remoteSearch(url + text, function (users) {
- return cb(users);
- });
- }
- },
- menuItemTemplate: function (user) {
- return user.original.name;
- },
- selectTemplate: function (user) {
- return '@' + user.original.login;
- }
- }
- ],
- noMatchTemplate: ""
- });
-
- tribute.attach(element);
-}
-
-
-$(document).ready(setupAjaxIndicator);
-$(document).ready(hideOnLoad);
-$(document).ready(addFormObserversForDoubleSubmit);
-$(document).ready(defaultFocus);
-$(document).ready(setupAttachmentDetail);
-$(document).ready(setupTabs);
-$(document).ready(setupFilePreviewNavigation);
-$(document).ready(setupWikiTableSortableHeader);
-$(document).on('focus', '[data-auto-complete=true]', function(event) {
- inlineAutoComplete(event.target);
-});