mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 16:40:24 +08:00 
			
		
		
		
	Vendor jquery.are-you-sure with strict mode fixes (#26901)
				
					
				
			Extract from https://github.com/go-gitea/gitea/pull/25940 and because https://github.com/go-gitea/gitea/pull/26743 does seem to need more work. This will be required if we are to run our JS in [strict mode](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode). Previously, the two variables `$fields` and `$dirtyForms` polluted `window`: <img width="1145" alt="image" src="https://github.com/go-gitea/gitea/assets/115237/e0270a0e-b881-4ed7-9cc4-e9ab25c0a2bc">
This commit is contained in:
		
							
								
								
									
										12
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										12
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							@@ -27,7 +27,6 @@
 | 
				
			|||||||
        "escape-goat": "4.0.0",
 | 
					        "escape-goat": "4.0.0",
 | 
				
			||||||
        "fast-glob": "3.3.1",
 | 
					        "fast-glob": "3.3.1",
 | 
				
			||||||
        "jquery": "3.7.1",
 | 
					        "jquery": "3.7.1",
 | 
				
			||||||
        "jquery.are-you-sure": "1.9.0",
 | 
					 | 
				
			||||||
        "katex": "0.16.8",
 | 
					        "katex": "0.16.8",
 | 
				
			||||||
        "license-checker-webpack-plugin": "0.2.1",
 | 
					        "license-checker-webpack-plugin": "0.2.1",
 | 
				
			||||||
        "lightningcss-loader": "2.1.0",
 | 
					        "lightningcss-loader": "2.1.0",
 | 
				
			||||||
@@ -6466,17 +6465,6 @@
 | 
				
			|||||||
      "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz",
 | 
				
			||||||
      "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg=="
 | 
					      "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg=="
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/jquery.are-you-sure": {
 | 
					 | 
				
			||||||
      "version": "1.9.0",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/jquery.are-you-sure/-/jquery.are-you-sure-1.9.0.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-2r0uFx8CyAopjeHGOdvvwpFP921TnW1+v1uJXcAWQYHYGB1tryTDhQY+5u6HsVeMwbWiRTKVZFWnLaFpDvIqZQ==",
 | 
					 | 
				
			||||||
      "dependencies": {
 | 
					 | 
				
			||||||
        "jquery": ">=1.4.2"
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">=0.8.0"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/js-levenshtein-esm": {
 | 
					    "node_modules/js-levenshtein-esm": {
 | 
				
			||||||
      "version": "1.2.0",
 | 
					      "version": "1.2.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/js-levenshtein-esm/-/js-levenshtein-esm-1.2.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/js-levenshtein-esm/-/js-levenshtein-esm-1.2.0.tgz",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,7 +26,6 @@
 | 
				
			|||||||
    "escape-goat": "4.0.0",
 | 
					    "escape-goat": "4.0.0",
 | 
				
			||||||
    "fast-glob": "3.3.1",
 | 
					    "fast-glob": "3.3.1",
 | 
				
			||||||
    "jquery": "3.7.1",
 | 
					    "jquery": "3.7.1",
 | 
				
			||||||
    "jquery.are-you-sure": "1.9.0",
 | 
					 | 
				
			||||||
    "katex": "0.16.8",
 | 
					    "katex": "0.16.8",
 | 
				
			||||||
    "license-checker-webpack-plugin": "0.2.1",
 | 
					    "license-checker-webpack-plugin": "0.2.1",
 | 
				
			||||||
    "lightningcss-loader": "2.1.0",
 | 
					    "lightningcss-loader": "2.1.0",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
import $ from 'jquery';
 | 
					import $ from 'jquery';
 | 
				
			||||||
import 'jquery.are-you-sure';
 | 
					import '../vendor/jquery.are-you-sure.js';
 | 
				
			||||||
import {clippie} from 'clippie';
 | 
					import {clippie} from 'clippie';
 | 
				
			||||||
import {createDropzone} from './dropzone.js';
 | 
					import {createDropzone} from './dropzone.js';
 | 
				
			||||||
import {initCompColorPicker} from './comp/ColorPicker.js';
 | 
					import {initCompColorPicker} from './comp/ColorPicker.js';
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										195
									
								
								web_src/js/vendor/jquery.are-you-sure.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										195
									
								
								web_src/js/vendor/jquery.are-you-sure.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,195 @@
 | 
				
			|||||||
 | 
					// Fork of the upstream module. The only changes are the addition of `const` on
 | 
				
			||||||
 | 
					// lines 93 and 161 to make it strict mode compatible.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * jQuery Plugin: Are-You-Sure (Dirty Form Detection)
 | 
				
			||||||
 | 
					 * https://github.com/codedance/jquery.AreYouSure/
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Copyright (c) 2012-2014, Chris Dance and PaperCut Software http://www.papercut.com/
 | 
				
			||||||
 | 
					 * Dual licensed under the MIT or GPL Version 2 licenses.
 | 
				
			||||||
 | 
					 * http://jquery.org/license
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Author:  chris.dance@papercut.com
 | 
				
			||||||
 | 
					 * Version: 1.9.0
 | 
				
			||||||
 | 
					 * Date:    13th August 2014
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					(function($) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  $.fn.areYouSure = function(options) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    var settings = $.extend(
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        'message' : 'You have unsaved changes!',
 | 
				
			||||||
 | 
					        'dirtyClass' : 'dirty',
 | 
				
			||||||
 | 
					        'change' : null,
 | 
				
			||||||
 | 
					        'silent' : false,
 | 
				
			||||||
 | 
					        'addRemoveFieldsMarksDirty' : false,
 | 
				
			||||||
 | 
					        'fieldEvents' : 'change keyup propertychange input',
 | 
				
			||||||
 | 
					        'fieldSelector': ":input:not(input[type=submit]):not(input[type=button])"
 | 
				
			||||||
 | 
					      }, options);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    var getValue = function($field) {
 | 
				
			||||||
 | 
					      if ($field.hasClass('ays-ignore')
 | 
				
			||||||
 | 
					          || $field.hasClass('aysIgnore')
 | 
				
			||||||
 | 
					          || $field.attr('data-ays-ignore')
 | 
				
			||||||
 | 
					          || $field.attr('name') === undefined) {
 | 
				
			||||||
 | 
					        return null;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if ($field.is(':disabled')) {
 | 
				
			||||||
 | 
					        return 'ays-disabled';
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      var val;
 | 
				
			||||||
 | 
					      var type = $field.attr('type');
 | 
				
			||||||
 | 
					      if ($field.is('select')) {
 | 
				
			||||||
 | 
					        type = 'select';
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      switch (type) {
 | 
				
			||||||
 | 
					        case 'checkbox':
 | 
				
			||||||
 | 
					        case 'radio':
 | 
				
			||||||
 | 
					          val = $field.is(':checked');
 | 
				
			||||||
 | 
					          break;
 | 
				
			||||||
 | 
					        case 'select':
 | 
				
			||||||
 | 
					          val = '';
 | 
				
			||||||
 | 
					          $field.find('option').each(function(o) {
 | 
				
			||||||
 | 
					            var $option = $(this);
 | 
				
			||||||
 | 
					            if ($option.is(':selected')) {
 | 
				
			||||||
 | 
					              val += $option.val();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					          });
 | 
				
			||||||
 | 
					          break;
 | 
				
			||||||
 | 
					        default:
 | 
				
			||||||
 | 
					          val = $field.val();
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      return val;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    var storeOrigValue = function($field) {
 | 
				
			||||||
 | 
					      $field.data('ays-orig', getValue($field));
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    var checkForm = function(evt) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      var isFieldDirty = function($field) {
 | 
				
			||||||
 | 
					        var origValue = $field.data('ays-orig');
 | 
				
			||||||
 | 
					        if (undefined === origValue) {
 | 
				
			||||||
 | 
					          return false;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return (getValue($field) != origValue);
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      var $form = ($(this).is('form'))
 | 
				
			||||||
 | 
					                    ? $(this)
 | 
				
			||||||
 | 
					                    : $(this).parents('form');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // Test on the target first as it's the most likely to be dirty
 | 
				
			||||||
 | 
					      if (isFieldDirty($(evt.target))) {
 | 
				
			||||||
 | 
					        setDirtyStatus($form, true);
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      const $fields = $form.find(settings.fieldSelector);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (settings.addRemoveFieldsMarksDirty) {
 | 
				
			||||||
 | 
					        // Check if field count has changed
 | 
				
			||||||
 | 
					        var origCount = $form.data("ays-orig-field-count");
 | 
				
			||||||
 | 
					        if (origCount != $fields.length) {
 | 
				
			||||||
 | 
					          setDirtyStatus($form, true);
 | 
				
			||||||
 | 
					          return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // Brute force - check each field
 | 
				
			||||||
 | 
					      var isDirty = false;
 | 
				
			||||||
 | 
					      $fields.each(function() {
 | 
				
			||||||
 | 
					        var $field = $(this);
 | 
				
			||||||
 | 
					        if (isFieldDirty($field)) {
 | 
				
			||||||
 | 
					          isDirty = true;
 | 
				
			||||||
 | 
					          return false; // break
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      setDirtyStatus($form, isDirty);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    var initForm = function($form) {
 | 
				
			||||||
 | 
					      var fields = $form.find(settings.fieldSelector);
 | 
				
			||||||
 | 
					      $(fields).each(function() { storeOrigValue($(this)); });
 | 
				
			||||||
 | 
					      $(fields).unbind(settings.fieldEvents, checkForm);
 | 
				
			||||||
 | 
					      $(fields).bind(settings.fieldEvents, checkForm);
 | 
				
			||||||
 | 
					      $form.data("ays-orig-field-count", $(fields).length);
 | 
				
			||||||
 | 
					      setDirtyStatus($form, false);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    var setDirtyStatus = function($form, isDirty) {
 | 
				
			||||||
 | 
					      var changed = isDirty != $form.hasClass(settings.dirtyClass);
 | 
				
			||||||
 | 
					      $form.toggleClass(settings.dirtyClass, isDirty);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // Fire change event if required
 | 
				
			||||||
 | 
					      if (changed) {
 | 
				
			||||||
 | 
					        if (settings.change) settings.change.call($form, $form);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (isDirty) $form.trigger('dirty.areYouSure', [$form]);
 | 
				
			||||||
 | 
					        if (!isDirty) $form.trigger('clean.areYouSure', [$form]);
 | 
				
			||||||
 | 
					        $form.trigger('change.areYouSure', [$form]);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    var rescan = function() {
 | 
				
			||||||
 | 
					      var $form = $(this);
 | 
				
			||||||
 | 
					      var fields = $form.find(settings.fieldSelector);
 | 
				
			||||||
 | 
					      $(fields).each(function() {
 | 
				
			||||||
 | 
					        var $field = $(this);
 | 
				
			||||||
 | 
					        if (!$field.data('ays-orig')) {
 | 
				
			||||||
 | 
					          storeOrigValue($field);
 | 
				
			||||||
 | 
					          $field.bind(settings.fieldEvents, checkForm);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					      // Check for changes while we're here
 | 
				
			||||||
 | 
					      $form.trigger('checkform.areYouSure');
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    var reinitialize = function() {
 | 
				
			||||||
 | 
					      initForm($(this));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!settings.silent && !window.aysUnloadSet) {
 | 
				
			||||||
 | 
					      window.aysUnloadSet = true;
 | 
				
			||||||
 | 
					      $(window).bind('beforeunload', function() {
 | 
				
			||||||
 | 
					        const $dirtyForms = $("form").filter('.' + settings.dirtyClass);
 | 
				
			||||||
 | 
					        if ($dirtyForms.length == 0) {
 | 
				
			||||||
 | 
					          return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        // Prevent multiple prompts - seen on Chrome and IE
 | 
				
			||||||
 | 
					        if (navigator.userAgent.toLowerCase().match(/msie|chrome/)) {
 | 
				
			||||||
 | 
					          if (window.aysHasPrompted) {
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					          window.aysHasPrompted = true;
 | 
				
			||||||
 | 
					          window.setTimeout(function() {window.aysHasPrompted = false;}, 900);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return settings.message;
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return this.each(function(elem) {
 | 
				
			||||||
 | 
					      if (!$(this).is('form')) {
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      var $form = $(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      $form.submit(function() {
 | 
				
			||||||
 | 
					        $form.removeClass(settings.dirtyClass);
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					      $form.bind('reset', function() { setDirtyStatus($form, false); });
 | 
				
			||||||
 | 
					      // Add a custom events
 | 
				
			||||||
 | 
					      $form.bind('rescan.areYouSure', rescan);
 | 
				
			||||||
 | 
					      $form.bind('reinitialize.areYouSure', reinitialize);
 | 
				
			||||||
 | 
					      $form.bind('checkform.areYouSure', checkForm);
 | 
				
			||||||
 | 
					      initForm($form);
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					})(jQuery);
 | 
				
			||||||
@@ -206,7 +206,6 @@ export default {
 | 
				
			|||||||
        }).join('\n');
 | 
					        }).join('\n');
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      override: {
 | 
					      override: {
 | 
				
			||||||
        'jquery.are-you-sure@*': {licenseName: 'MIT'}, // https://github.com/codedance/jquery.AreYouSure/pull/147
 | 
					 | 
				
			||||||
        'khroma@*': {licenseName: 'MIT'}, // https://github.com/fabiospampinato/khroma/pull/33
 | 
					        'khroma@*': {licenseName: 'MIT'}, // https://github.com/fabiospampinato/khroma/pull/33
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      emitError: true,
 | 
					      emitError: true,
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user