fix price seperation
This commit is contained in:
		
							parent
							
								
									b406f1d7c4
								
							
						
					
					
						commit
						65cc48769d
					
				
					 1 changed files with 144 additions and 0 deletions
				
			
		
							
								
								
									
										144
									
								
								static/assets/js/number-formatter.js
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										144
									
								
								static/assets/js/number-formatter.js
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,144 @@
 | 
			
		|||
/**
 | 
			
		||||
 * Number Formatter Utility
 | 
			
		||||
 * Formats numbers with comma separators for better readability
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
// Format number with comma separators (e.g., 1234567 -> 1,234,567)
 | 
			
		||||
function formatNumber(num) {
 | 
			
		||||
  if (!num) return '';
 | 
			
		||||
  return num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Remove comma separators from formatted number
 | 
			
		||||
function unformatNumber(str) {
 | 
			
		||||
  if (!str) return '';
 | 
			
		||||
  return str.replace(/,/g, '');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Extract only digits from any string
 | 
			
		||||
function extractDigits(str) {
 | 
			
		||||
  if (!str) return '';
 | 
			
		||||
  return str.replace(/\D/g, '');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Initialize number formatting for specified input selectors
 | 
			
		||||
function initNumberFormatting(selectors) {
 | 
			
		||||
  if (typeof $ === 'undefined') {
 | 
			
		||||
    console.warn('jQuery not found. Number formatting requires jQuery.');
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  $(document).ready(function() {
 | 
			
		||||
    selectors.forEach(function(selector) {
 | 
			
		||||
      // Store cursor position to maintain it after formatting
 | 
			
		||||
      function setCursorPosition(input, pos) {
 | 
			
		||||
        if (input.setSelectionRange) {
 | 
			
		||||
          input.setSelectionRange(pos, pos);
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      
 | 
			
		||||
      $(selector).on('input', function(e) {
 | 
			
		||||
        let input = $(this);
 | 
			
		||||
        let inputElement = this;
 | 
			
		||||
        let value = input.val();
 | 
			
		||||
        let cursorPos = inputElement.selectionStart;
 | 
			
		||||
        
 | 
			
		||||
        // Extract only digits
 | 
			
		||||
        let digitsOnly = extractDigits(value);
 | 
			
		||||
        
 | 
			
		||||
        // Store raw value
 | 
			
		||||
        input.attr('data-raw-value', digitsOnly);
 | 
			
		||||
        
 | 
			
		||||
        // Format and set the value
 | 
			
		||||
        let formattedValue = formatNumber(digitsOnly);
 | 
			
		||||
        input.val(formattedValue);
 | 
			
		||||
        
 | 
			
		||||
        // Adjust cursor position
 | 
			
		||||
        let oldLength = value.length;
 | 
			
		||||
        let newLength = formattedValue.length;
 | 
			
		||||
        let newCursorPos = cursorPos + (newLength - oldLength);
 | 
			
		||||
        
 | 
			
		||||
        // Make sure cursor position is valid
 | 
			
		||||
        if (newCursorPos < 0) newCursorPos = 0;
 | 
			
		||||
        if (newCursorPos > newLength) newCursorPos = newLength;
 | 
			
		||||
        
 | 
			
		||||
        // Set cursor position after a short delay
 | 
			
		||||
        setTimeout(function() {
 | 
			
		||||
          setCursorPosition(inputElement, newCursorPos);
 | 
			
		||||
        }, 1);
 | 
			
		||||
      });
 | 
			
		||||
      
 | 
			
		||||
      // Handle paste events
 | 
			
		||||
      $(selector).on('paste', function(e) {
 | 
			
		||||
        let input = $(this);
 | 
			
		||||
        setTimeout(function() {
 | 
			
		||||
          let value = input.val();
 | 
			
		||||
          let digitsOnly = extractDigits(value);
 | 
			
		||||
          input.attr('data-raw-value', digitsOnly);
 | 
			
		||||
          input.val(formatNumber(digitsOnly));
 | 
			
		||||
        }, 1);
 | 
			
		||||
      });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    // Before form submission, replace formatted values with raw values
 | 
			
		||||
    $('form').on('submit', function() {
 | 
			
		||||
      selectors.forEach(function(selector) {
 | 
			
		||||
        let input = $(selector);
 | 
			
		||||
        let rawValue = input.attr('data-raw-value');
 | 
			
		||||
        if (rawValue) {
 | 
			
		||||
          input.val(rawValue);
 | 
			
		||||
        }
 | 
			
		||||
      });
 | 
			
		||||
    });
 | 
			
		||||
  });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Helper function to get raw value from formatted input
 | 
			
		||||
function getRawValue(input) {
 | 
			
		||||
  return $(input).attr('data-raw-value') || unformatNumber($(input).val());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Helper function to set raw value before AJAX submission
 | 
			
		||||
function setRawValuesForSubmission(selectors) {
 | 
			
		||||
  selectors.forEach(function(selector) {
 | 
			
		||||
    let input = $(selector);
 | 
			
		||||
    let rawValue = input.attr('data-raw-value');
 | 
			
		||||
    if (rawValue) {
 | 
			
		||||
      input.val(rawValue);
 | 
			
		||||
    }
 | 
			
		||||
  });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Helper function to restore formatted values after AJAX submission
 | 
			
		||||
function restoreFormattedValues(selectors) {
 | 
			
		||||
  selectors.forEach(function(selector) {
 | 
			
		||||
    let input = $(selector);
 | 
			
		||||
    let rawValue = input.attr('data-raw-value');
 | 
			
		||||
    if (rawValue) {
 | 
			
		||||
      input.val(formatNumber(rawValue));
 | 
			
		||||
    }
 | 
			
		||||
  });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Auto-initialize for common amount input selectors
 | 
			
		||||
$(document).ready(function() {
 | 
			
		||||
  const commonSelectors = [
 | 
			
		||||
    '#id_amount',
 | 
			
		||||
    '#id_charge_amount',
 | 
			
		||||
    'input[name="amount"]',
 | 
			
		||||
    'input[name="unit_price"]',
 | 
			
		||||
    'input[name="price"]'
 | 
			
		||||
  ];
 | 
			
		||||
  
 | 
			
		||||
  initNumberFormatting(commonSelectors);
 | 
			
		||||
  
 | 
			
		||||
  // Make helper functions globally available for AJAX forms
 | 
			
		||||
  window.formatNumber = formatNumber;
 | 
			
		||||
  window.unformatNumber = unformatNumber;
 | 
			
		||||
  window.getRawValue = getRawValue;
 | 
			
		||||
  // Avoid name collision causing recursion by aliasing helpers
 | 
			
		||||
  const __nf_setRawValuesForSubmission = setRawValuesForSubmission;
 | 
			
		||||
  const __nf_restoreFormattedValues = restoreFormattedValues;
 | 
			
		||||
  window.setRawValuesForSubmission = function() { __nf_setRawValuesForSubmission(commonSelectors); };
 | 
			
		||||
  window.restoreFormattedValues = function() { __nf_restoreFormattedValues(commonSelectors); };
 | 
			
		||||
});
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue