feat: setting to default a new task's start to today (#31)
A new Settings → Task form toggle, off by default, pre-fills a fresh task's start with the current moment instead of leaving it blank. Closes #27 Co-authored-by: Jean-Luc Makiola <business@jeanlucmakiola.de> Reviewed-on: https://codeberg.org/jlmakiola/agendula/pulls/31
This commit is contained in:
@@ -95,6 +95,8 @@ data class Settings(
|
|||||||
val pushEnabled: Boolean = true,
|
val pushEnabled: Boolean = true,
|
||||||
/** Lists of the current store whose tasks the smart lists (and their counts) leave out. */
|
/** Lists of the current store whose tasks the smart lists (and their counts) leave out. */
|
||||||
val hiddenFromSmartLists: Set<Long> = emptySet(),
|
val hiddenFromSmartLists: Set<Long> = emptySet(),
|
||||||
|
/** Pre-fill a new task's start with today's date. */
|
||||||
|
val defaultStartToday: Boolean = false,
|
||||||
) {
|
) {
|
||||||
/** [tasks] as [filter] shows them: a smart list drops the lists kept out of it. */
|
/** [tasks] as [filter] shows them: a smart list drops the lists kept out of it. */
|
||||||
fun visibleIn(filter: TaskFilter, tasks: List<Task>): List<Task> =
|
fun visibleIn(filter: TaskFilter, tasks: List<Task>): List<Task> =
|
||||||
@@ -153,6 +155,7 @@ class SettingsPrefs @Inject constructor(
|
|||||||
.mapNotNull { entry -> entry.substringAfter("$mode:", "").toLongOrNull() }
|
.mapNotNull { entry -> entry.substringAfter("$mode:", "").toLongOrNull() }
|
||||||
.toSet()
|
.toSet()
|
||||||
},
|
},
|
||||||
|
defaultStartToday = p[DEFAULT_START_TODAY] ?: false,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -166,6 +169,8 @@ class SettingsPrefs @Inject constructor(
|
|||||||
|
|
||||||
suspend fun setAutofocusTitle(enabled: Boolean) = dataStore.edit { it[AUTOFOCUS_TITLE] = enabled }
|
suspend fun setAutofocusTitle(enabled: Boolean) = dataStore.edit { it[AUTOFOCUS_TITLE] = enabled }
|
||||||
|
|
||||||
|
suspend fun setDefaultStartToday(enabled: Boolean) = dataStore.edit { it[DEFAULT_START_TODAY] = enabled }
|
||||||
|
|
||||||
suspend fun setTimeFormat(pref: TimeFormatPref) = dataStore.edit { it[TIME_FORMAT] = pref.name }
|
suspend fun setTimeFormat(pref: TimeFormatPref) = dataStore.edit { it[TIME_FORMAT] = pref.name }
|
||||||
|
|
||||||
suspend fun setWeekStart(day: DayOfWeek?) = dataStore.edit {
|
suspend fun setWeekStart(day: DayOfWeek?) = dataStore.edit {
|
||||||
@@ -282,6 +287,7 @@ class SettingsPrefs @Inject constructor(
|
|||||||
val SYNC_INTERVAL = intPreferencesKey("sync_interval_minutes")
|
val SYNC_INTERVAL = intPreferencesKey("sync_interval_minutes")
|
||||||
val PUSH_ENABLED = booleanPreferencesKey("push_enabled")
|
val PUSH_ENABLED = booleanPreferencesKey("push_enabled")
|
||||||
val SMART_LIST_HIDDEN = stringSetPreferencesKey("smart_list_hidden")
|
val SMART_LIST_HIDDEN = stringSetPreferencesKey("smart_list_hidden")
|
||||||
|
val DEFAULT_START_TODAY = booleanPreferencesKey("default_start_today")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ import kotlinx.coroutines.flow.asStateFlow
|
|||||||
import kotlinx.coroutines.flow.first
|
import kotlinx.coroutines.flow.first
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
import kotlin.time.Clock
|
||||||
import kotlin.time.Instant
|
import kotlin.time.Instant
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -135,6 +136,7 @@ class TaskEditViewModel @Inject constructor(
|
|||||||
isNew = true,
|
isNew = true,
|
||||||
autofocusTitle = settings.autofocusTitle,
|
autofocusTitle = settings.autofocusTitle,
|
||||||
listId = defaultList,
|
listId = defaultList,
|
||||||
|
start = if (settings.defaultStartToday) Clock.System.now() else null,
|
||||||
parentId = parentId,
|
parentId = parentId,
|
||||||
lists = lists,
|
lists = lists,
|
||||||
parentCandidates = loadParents(defaultList, selfId = null),
|
parentCandidates = loadParents(defaultList, selfId = null),
|
||||||
|
|||||||
@@ -241,6 +241,7 @@ class SettingsViewModel @Inject constructor(
|
|||||||
fun setSnoozeMinutes(minutes: Int) = viewModelScope.launch { prefs.setSnoozeMinutes(minutes) }
|
fun setSnoozeMinutes(minutes: Int) = viewModelScope.launch { prefs.setSnoozeMinutes(minutes) }
|
||||||
fun setShowAddSubtaskRow(show: Boolean) = viewModelScope.launch { prefs.setShowAddSubtaskRow(show) }
|
fun setShowAddSubtaskRow(show: Boolean) = viewModelScope.launch { prefs.setShowAddSubtaskRow(show) }
|
||||||
fun setBottomAddBar(enabled: Boolean) = viewModelScope.launch { prefs.setBottomAddBar(enabled) }
|
fun setBottomAddBar(enabled: Boolean) = viewModelScope.launch { prefs.setBottomAddBar(enabled) }
|
||||||
|
fun setDefaultStartToday(enabled: Boolean) = viewModelScope.launch { prefs.setDefaultStartToday(enabled) }
|
||||||
|
|
||||||
/** Toggle whether [field] shows by default on a new task's edit form. */
|
/** Toggle whether [field] shows by default on a new task's edit form. */
|
||||||
fun setFormFieldDefault(field: TaskFormField, enabled: Boolean) = viewModelScope.launch {
|
fun setFormFieldDefault(field: TaskFormField, enabled: Boolean) = viewModelScope.launch {
|
||||||
|
|||||||
@@ -99,6 +99,18 @@ internal fun TaskFormScreen(
|
|||||||
},
|
},
|
||||||
onClick = { viewModel.setShowAddSubtaskRow(!state.settings.showAddSubtaskRow) },
|
onClick = { viewModel.setShowAddSubtaskRow(!state.settings.showAddSubtaskRow) },
|
||||||
)
|
)
|
||||||
|
GroupedRow(
|
||||||
|
title = stringResource(R.string.settings_default_start_today),
|
||||||
|
summary = stringResource(R.string.settings_default_start_today_hint),
|
||||||
|
position = Position.Middle,
|
||||||
|
trailing = {
|
||||||
|
Switch(
|
||||||
|
checked = state.settings.defaultStartToday,
|
||||||
|
onCheckedChange = viewModel::setDefaultStartToday,
|
||||||
|
)
|
||||||
|
},
|
||||||
|
onClick = { viewModel.setDefaultStartToday(!state.settings.defaultStartToday) },
|
||||||
|
)
|
||||||
GroupedRow(
|
GroupedRow(
|
||||||
title = stringResource(R.string.settings_bottom_add_bar),
|
title = stringResource(R.string.settings_bottom_add_bar),
|
||||||
summary = stringResource(R.string.settings_bottom_add_bar_hint),
|
summary = stringResource(R.string.settings_bottom_add_bar_hint),
|
||||||
|
|||||||
@@ -430,6 +430,8 @@
|
|||||||
<string name="settings_default_list_first">First available list</string>
|
<string name="settings_default_list_first">First available list</string>
|
||||||
<string name="settings_add_subtask_row">Show \"add a subtask\" row</string>
|
<string name="settings_add_subtask_row">Show \"add a subtask\" row</string>
|
||||||
<string name="settings_add_subtask_row_hint">An add field at the end of an expanded task\'s subtasks</string>
|
<string name="settings_add_subtask_row_hint">An add field at the end of an expanded task\'s subtasks</string>
|
||||||
|
<string name="settings_default_start_today">Default start to today</string>
|
||||||
|
<string name="settings_default_start_today_hint">Pre-fill a new task\'s start with today\'s date</string>
|
||||||
<string name="settings_bottom_add_bar">Bottom quick-add bar</string>
|
<string name="settings_bottom_add_bar">Bottom quick-add bar</string>
|
||||||
<string name="settings_bottom_add_bar_hint">Add tasks from a bar pinned to the bottom of a list, instead of the floating button</string>
|
<string name="settings_bottom_add_bar_hint">Add tasks from a bar pinned to the bottom of a list, instead of the floating button</string>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user