Skip to content

Commit b87a00e

Browse files
e-zzhaydenull
andauthored
feat: support set start of the week (#296)
* feat: start of week * fix: set Monday as default starting day in a week * fix: Update dayjs configuration after modifying the start day of the week. --------- Co-authored-by: e-zz <> Co-authored-by: Hayden Chen <hayden.chen.dev@gmail.com>
1 parent 7bbb40a commit b87a00e

File tree

6 files changed

+44
-16
lines changed

6 files changed

+44
-16
lines changed

src/Agenda3/components/calendar/Calendar.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ const Calendar = ({ onCalendarTitleChange }: CalendarProps, ref) => {
4242
const { updateEntity } = useAgendaEntities()
4343
const tasksWithStart = useAtomValue(tasksWithStartAtom)
4444
const settings = useAtomValue(settingsAtom)
45+
const startingDay = settings.general?.startOfWeek
4546
const groupType = settings.selectedFilters?.length ? 'filter' : 'page'
4647
const showTasks = tasksWithStart?.filter((task) =>
4748
settings.viewOptions?.hideCompleted ? task.status === 'todo' : true,
@@ -185,7 +186,7 @@ const Calendar = ({ onCalendarTitleChange }: CalendarProps, ref) => {
185186
weekNumbers
186187
weekNumberContent={({ num, date }) => <WeekNumber weekNumber={num} date={date} />}
187188
defaultTimedEventDuration="00:30"
188-
firstDay={1}
189+
firstDay={Number(startingDay)}
189190
fixedWeekCount={false}
190191
ref={calendarRef}
191192
height="100%"

src/Agenda3/components/modals/SettingsModal/GeneralSettingsForm.tsx

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ const GeneralSettingsForm = () => {
88
const { t, i18n } = useTranslation()
99
const { settings, setSettings } = useSettings()
1010

11-
const onChange = (key: string, value: string | boolean | undefined | Filter[] | string[]) => {
11+
const onChange = (key: string, value: number | string | boolean | undefined | Filter[] | string[]) => {
1212
setSettings(key, value)
1313
}
1414
// 当切换语言时,更新 i18n 的语言
@@ -44,6 +44,24 @@ const GeneralSettingsForm = () => {
4444
]}
4545
/>
4646
</div>
47+
<div className="mt-4">
48+
<div className="text-gray-500">Start of Week</div>
49+
<Select
50+
placeholder="Select Start of Week"
51+
className="w-[300px]"
52+
value={settings.general?.startOfWeek}
53+
onChange={(e) => onChange('general.startOfWeek', e)}
54+
options={[
55+
{ label: 'Sun', value: 0 },
56+
{ label: 'Mon', value: 1 },
57+
{ label: 'Tue', value: 2 },
58+
{ label: 'Wed', value: 3 },
59+
{ label: 'Thu', value: 4 },
60+
{ label: 'Fri', value: 5 },
61+
{ label: 'Sat', value: 6 },
62+
]}
63+
/>
64+
</div>
4765
</div>
4866
</>
4967
)

src/Agenda3/hooks/useSettings.ts

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,19 @@
11
import { useLocalStorageValue } from '@react-hookz/web'
22
import { useAtom } from 'jotai'
3-
import { clone, set } from 'lodash-es'
3+
import { clone, set, merge } from 'lodash-es'
44

5-
import { type Settings, settingsAtom, type Filter } from '@/Agenda3/models/settings'
5+
import { type Settings, settingsAtom, type Filter, DEFAULT_SETTINGS } from '@/Agenda3/models/settings'
6+
import initializeDayjs from '@/register/dayjs'
67

78
const isPlugin = import.meta.env.VITE_MODE === 'plugin'
89
const useSettings = () => {
910
const [settings, setAtomSettings] = useAtom(settingsAtom)
1011
const { set: setLocalStorage, value: valueLocalStorage } = useLocalStorageValue<Settings>('settings')
1112

12-
const setSettings = (key: string, value: string | boolean | undefined | Filter[] | string[]) => {
13+
const setSettings = (key: string, value: number | string | boolean | undefined | Filter[] | string[]) => {
14+
if (key === 'general.startOfWeek') {
15+
initializeDayjs(Number(value))
16+
}
1317
setAtomSettings((oldSettings) => {
1418
const newSettings = set(clone(oldSettings), key, value)
1519
if (isPlugin) {
@@ -27,13 +31,12 @@ const useSettings = () => {
2731
}
2832
// initialize settings
2933
const initializeSettings = () => {
30-
const base: Settings = { isInitialized: true }
31-
if (isPlugin) {
32-
const _settings = (logseq.settings as unknown as Settings) ?? {}
33-
setAtomSettings(_settings ? { ..._settings, isInitialized: true } : base)
34-
} else {
35-
setAtomSettings(valueLocalStorage ? { ...valueLocalStorage, isInitialized: true } : base)
34+
const getNewSettings = (userSettings?: Settings) => {
35+
return merge({}, DEFAULT_SETTINGS, userSettings, { isInitialized: true })
3636
}
37+
const userSettings = isPlugin ? (logseq.settings as unknown as Settings) : valueLocalStorage
38+
initializeDayjs(userSettings?.general?.startOfWeek ?? DEFAULT_SETTINGS.general.startOfWeek)
39+
setAtomSettings(getNewSettings(userSettings))
3740
}
3841
return {
3942
settings,

src/Agenda3/index.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import useAgendaEntities from '@/Agenda3/hooks/useAgendaEntities'
77
import usePages from '@/Agenda3/hooks/usePages'
88
import { appAtom } from '@/Agenda3/models/app'
99
import { logseqAtom } from '@/Agenda3/models/logseq'
10-
import initializeDayjs from '@/register/dayjs'
1110
import { cn } from '@/util/util'
1211

1312
import MultipleView from './components/MainArea'
@@ -30,7 +29,6 @@ const Dashboard = () => {
3029
const [connectionErrorModal, setConnectionErrorModal] = useState(false)
3130

3231
const loadData = useCallback(() => {
33-
initializeDayjs(1)
3432
refreshEntities().catch((error) => {
3533
console.error('retrieve tasks failed', error)
3634
if (import.meta.env.VITE_MODE === 'web') {
@@ -72,7 +70,9 @@ const Dashboard = () => {
7270
return (
7371
<div
7472
className={cn(
75-
"flex h-screen w-screen bg-gray-100 before:pointer-events-none before:absolute before:h-[180px] before:w-[240px] before:bg-gradient-conic before:from-sky-200 before:via-blue-200 before:blur-2xl before:transition-all before:content-[''] dark:bg-zinc-800 before:dark:from-sky-900 before:dark:via-[#0141ff] before:dark:opacity-40",
73+
`flex h-screen w-screen bg-gray-100 before:pointer-events-none before:absolute before:h-[180px] before:w-[240px]
74+
before:bg-gradient-conic before:from-sky-200 before:via-blue-200 before:blur-2xl before:transition-all
75+
before:content-[''] before:dark:from-sky-900 before:dark:via-[#0141ff] before:dark:opacity-40`,
7676
{
7777
'pt-[30px]': import.meta.env.VITE_MODE === 'plugin',
7878
},

src/Agenda3/models/settings.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ export type Settings = {
66
general?: {
77
useJournalDayAsSchedule?: boolean
88
language?: Language
9+
startOfWeek?: number
910
}
1011
ics?: {
1112
repo?: string
@@ -22,7 +23,12 @@ export type Settings = {
2223
objective?: boolean
2324
}
2425
}
25-
export const settingsAtom = atom<Settings>({ isInitialized: false, viewOptions: { showTimeLog: false } })
26+
export const DEFAULT_SETTINGS = {
27+
isInitialized: false,
28+
general: { language: 'en', startOfWeek: 1 },
29+
viewOptions: { showTimeLog: false },
30+
} satisfies Settings
31+
export const settingsAtom = atom<Settings>(DEFAULT_SETTINGS)
2632

2733
export type Filter = {
2834
id: string

src/register/dayjs.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ dayjs.extend(quarterOfYear)
2222
dayjs.extend(isoWeek)
2323
dayjs.extend(weekOfYear) // Use plugin
2424

25-
const initializeDayjs = (weekStartDay: 0 | 1) => {
25+
const initializeDayjs = (weekStartDay: number) => {
2626
// dayjs.locale('zh-cn')
2727
dayjs.updateLocale('en', {
2828
weekStart: weekStartDay,

0 commit comments

Comments
 (0)