mirror of
				https://codeberg.org/forgejo/forgejo.git
				synced 2025-11-04 00:11:04 +00:00 
			
		
		
		
	Fixes: https://github.com/go-gitea/gitea/issues/28371 Fixed by using a JS solution that formats according to `lang`, but alters the 24h format setting as per user's locale. This will work for all tooltips: <img width="243" alt="Screenshot 2024-03-07 at 23 03 35" src="https://github.com/go-gitea/gitea/assets/115237/6d16c71c-6786-4eda-8cdc-50ec68ba62c6"> <img width="250" alt="Screenshot 2024-03-07 at 23 03 17" src="https://github.com/go-gitea/gitea/assets/115237/4e26bbb7-12df-4b81-bd37-14705e87e8f7"> <img width="310" alt="Screenshot 2024-03-07 at 23 14 34" src="https://github.com/go-gitea/gitea/assets/115237/1ef599f0-6401-4e19-b1da-59cdfc09b0f6"> I think there is only one other place in the UI where we render such absolute dates, which is in the actions view and which I've also fixed: <img width="275" alt="Screenshot 2024-03-07 at 23 04 00" src="https://github.com/go-gitea/gitea/assets/115237/df0fbe1f-96ee-4338-ab5e-2b10e215005d"> (cherry picked from commit f86e9a03673b70d660a4b7a1e53748757d7a45fa)
		
			
				
	
	
		
			67 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			67 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
import dayjs from 'dayjs';
 | 
						|
import {getCurrentLocale} from '../utils.js';
 | 
						|
 | 
						|
// Returns an array of millisecond-timestamps of start-of-week days (Sundays)
 | 
						|
export function startDaysBetween(startDate, endDate) {
 | 
						|
  // Ensure the start date is a Sunday
 | 
						|
  while (startDate.getDay() !== 0) {
 | 
						|
    startDate.setDate(startDate.getDate() + 1);
 | 
						|
  }
 | 
						|
 | 
						|
  const start = dayjs(startDate);
 | 
						|
  const end = dayjs(endDate);
 | 
						|
  const startDays = [];
 | 
						|
 | 
						|
  let current = start;
 | 
						|
  while (current.isBefore(end)) {
 | 
						|
    startDays.push(current.valueOf());
 | 
						|
    // we are adding 7 * 24 hours instead of 1 week because we don't want
 | 
						|
    // date library to use local time zone to calculate 1 week from now.
 | 
						|
    // local time zone is problematic because of daylight saving time (dst)
 | 
						|
    // used on some countries
 | 
						|
    current = current.add(7 * 24, 'hour');
 | 
						|
  }
 | 
						|
 | 
						|
  return startDays;
 | 
						|
}
 | 
						|
 | 
						|
export function firstStartDateAfterDate(inputDate) {
 | 
						|
  if (!(inputDate instanceof Date)) {
 | 
						|
    throw new Error('Invalid date');
 | 
						|
  }
 | 
						|
  const dayOfWeek = inputDate.getDay();
 | 
						|
  const daysUntilSunday = 7 - dayOfWeek;
 | 
						|
  const resultDate = new Date(inputDate.getTime());
 | 
						|
  resultDate.setDate(resultDate.getDate() + daysUntilSunday);
 | 
						|
  return resultDate.valueOf();
 | 
						|
}
 | 
						|
 | 
						|
export function fillEmptyStartDaysWithZeroes(startDays, data) {
 | 
						|
  const result = {};
 | 
						|
 | 
						|
  for (const startDay of startDays) {
 | 
						|
    result[startDay] = data[startDay] || {'week': startDay, 'additions': 0, 'deletions': 0, 'commits': 0};
 | 
						|
  }
 | 
						|
 | 
						|
  return Object.values(result);
 | 
						|
}
 | 
						|
 | 
						|
let dateFormat;
 | 
						|
 | 
						|
// format a Date object to document's locale, but with 24h format from user's current locale because this
 | 
						|
// option is a personal preference of the user, not something that the document's locale should dictate.
 | 
						|
export function formatDatetime(date) {
 | 
						|
  if (!dateFormat) {
 | 
						|
    // TODO: replace `hour12` with `Intl.Locale.prototype.getHourCycles` once there is broad browser support
 | 
						|
    dateFormat = new Intl.DateTimeFormat(getCurrentLocale(), {
 | 
						|
      day: 'numeric',
 | 
						|
      month: 'short',
 | 
						|
      year: 'numeric',
 | 
						|
      hour: 'numeric',
 | 
						|
      hour12: !Number.isInteger(Number(new Intl.DateTimeFormat([], {hour: 'numeric'}).format())),
 | 
						|
      minute: '2-digit',
 | 
						|
      timeZoneName: 'short',
 | 
						|
    });
 | 
						|
  }
 | 
						|
  return dateFormat.format(date);
 | 
						|
}
 |