From 969504320658f7a63d479005db7383e084130bce Mon Sep 17 00:00:00 2001 From: biohzrddd <biohzrd@gmail.com> Date: Sun, 23 Apr 2023 20:43:34 +0100 Subject: [PATCH] Add setting to change first day of the week: Issue #844 (#910) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Thank you for submitting a pull request! Make sure to follow the instructions to write release notes for your PR — it should only take a minute or two: https://github.com/actualbudget/docs#writing-good-release-notes --> Resolves issue #844 . --------- Co-authored-by: biohzrddd <> --- .../src/components/select/DateSelect.js | 13 ++++++++- .../src/components/settings/Format.js | 28 +++++++++++++++++++ upcoming-release-notes/910.md | 6 ++++ 3 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 upcoming-release-notes/910.md diff --git a/packages/desktop-client/src/components/select/DateSelect.js b/packages/desktop-client/src/components/select/DateSelect.js index d857b8cf8..2d1e546bb 100644 --- a/packages/desktop-client/src/components/select/DateSelect.js +++ b/packages/desktop-client/src/components/select/DateSelect.js @@ -6,17 +6,20 @@ import React, { useImperativeHandle, useMemo, } from 'react'; +import { useSelector } from 'react-redux'; import * as d from 'date-fns'; import Pikaday from 'pikaday'; import 'pikaday/css/pikaday.css'; + import { getDayMonthFormat, getDayMonthRegex, getShortYearFormat, getShortYearRegex, } from 'loot-core/src/shared/months'; +import { stringToInteger } from 'loot-core/src/shared/util'; import { colors } from '../../style'; import { View, Input, Tooltip } from '../common'; @@ -66,7 +69,7 @@ let pickerStyles = { }; export let DatePicker = React.forwardRef( - ({ value, dateFormat, onUpdate, onSelect }, ref) => { + ({ value, firstDayOfWeekIdx, dateFormat, onUpdate, onSelect }, ref) => { let picker = useRef(null); let mountPoint = useRef(null); @@ -107,6 +110,7 @@ export let DatePicker = React.forwardRef( picker.current = new Pikaday({ theme: 'actual-date-picker', keyboardInput: false, + firstDay: stringToInteger(firstDayOfWeekIdx), defaultDate: value ? d.parse(value, dateFormat, new Date()) : new Date(), @@ -189,6 +193,12 @@ export default function DateSelect({ let [selectedValue, setSelectedValue] = useState(value); let userSelectedValue = useRef(selectedValue); + const firstDayOfWeekIdx = useSelector(state => + state.prefs.local?.firstDayOfWeekIdx + ? state.prefs.local.firstDayOfWeekIdx + : '0', + ); + useEffect(() => { userSelectedValue.current = value; }, [value]); @@ -334,6 +344,7 @@ export default function DateSelect({ <DatePicker ref={picker} value={selectedValue} + firstDayOfWeekIdx={firstDayOfWeekIdx} dateFormat={dateFormat} onUpdate={date => { setSelectedValue(d.format(date, dateFormat)); diff --git a/packages/desktop-client/src/components/settings/Format.js b/packages/desktop-client/src/components/settings/Format.js index ead45fa84..ce27e3d62 100644 --- a/packages/desktop-client/src/components/settings/Format.js +++ b/packages/desktop-client/src/components/settings/Format.js @@ -8,6 +8,18 @@ import { Checkbox } from '../forms'; import { Setting } from './UI'; +// Follows Pikaday 'firstDay' numbering +// https://github.com/Pikaday/Pikaday +let daysOfWeek = [ + { value: '0', label: 'Sunday' }, + { value: '1', label: 'Monday' }, + { value: '2', label: 'Tuesday' }, + { value: '3', label: 'Wednesday' }, + { value: '4', label: 'Thursday' }, + { value: '5', label: 'Friday' }, + { value: '6', label: 'Saturday' }, +]; + let dateFormats = [ { value: 'MM/dd/yyyy', label: 'MM/DD/YYYY' }, { value: 'dd/MM/yyyy', label: 'DD/MM/YYYY' }, @@ -35,6 +47,10 @@ function Column({ title, children }) { } export default function FormatSettings({ prefs, savePrefs }) { + function onFirstDayOfWeek(idx) { + savePrefs({ firstDayOfWeekIdx: idx }); + } + function onDateFormat(format) { savePrefs({ dateFormat: format }); } @@ -48,6 +64,7 @@ export default function FormatSettings({ prefs, savePrefs }) { savePrefs({ hideFraction }); } + let firstDayOfWeekIdx = prefs.firstDayOfWeekIdx || '0'; // Sunday let dateFormat = prefs.dateFormat || 'MM/dd/yyyy'; let numberFormat = prefs.numberFormat || 'comma-dot'; @@ -98,6 +115,17 @@ export default function FormatSettings({ prefs, savePrefs }) { /> </Button> </Column> + + <Column title="First day of the week"> + <Button bounce={false} style={{ padding: 0 }}> + <CustomSelect + value={firstDayOfWeekIdx} + onChange={onFirstDayOfWeek} + options={daysOfWeek.map(f => [f.value, f.label])} + style={{ padding: '5px 10px', fontSize: 15 }} + /> + </Button> + </Column> </View> } > diff --git a/upcoming-release-notes/910.md b/upcoming-release-notes/910.md new file mode 100644 index 000000000..170f39fb1 --- /dev/null +++ b/upcoming-release-notes/910.md @@ -0,0 +1,6 @@ +--- +category: Enhancements +authors: [biohzrddd] +--- + +Add setting to change first day of the week \ No newline at end of file -- GitLab