Add task template suggestions for quick task creation
- Add TaskTemplate model with category grouping support - Add TaskTemplateApi for fetching templates from backend - Add TaskSuggestionDropdown component for Android task form - Add TaskTemplatesBrowserSheet for browsing all templates - Add TaskSuggestionsView and TaskTemplatesBrowserView for iOS - Update DataManager to cache task templates - Update APILayer with template fetch and search methods - Update TaskFormView (iOS) with template suggestions - Update AddTaskDialog (Android) with template suggestions - Update onboarding task view to use templates 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -167,6 +167,14 @@ object DataManager {
|
||||
private val _contractorSpecialties = MutableStateFlow<List<ContractorSpecialty>>(emptyList())
|
||||
val contractorSpecialties: StateFlow<List<ContractorSpecialty>> = _contractorSpecialties.asStateFlow()
|
||||
|
||||
// ==================== TASK TEMPLATES ====================
|
||||
|
||||
private val _taskTemplates = MutableStateFlow<List<TaskTemplate>>(emptyList())
|
||||
val taskTemplates: StateFlow<List<TaskTemplate>> = _taskTemplates.asStateFlow()
|
||||
|
||||
private val _taskTemplatesGrouped = MutableStateFlow<TaskTemplatesGroupedResponse?>(null)
|
||||
val taskTemplatesGrouped: StateFlow<TaskTemplatesGroupedResponse?> = _taskTemplatesGrouped.asStateFlow()
|
||||
|
||||
// Map-based for O(1) ID resolution
|
||||
private val _residenceTypesMap = MutableStateFlow<Map<Int, ResidenceType>>(emptyMap())
|
||||
val residenceTypesMap: StateFlow<Map<Int, ResidenceType>> = _residenceTypesMap.asStateFlow()
|
||||
@@ -538,6 +546,34 @@ object DataManager {
|
||||
persistToDisk()
|
||||
}
|
||||
|
||||
// ==================== TASK TEMPLATE UPDATE METHODS ====================
|
||||
|
||||
fun setTaskTemplates(templates: List<TaskTemplate>) {
|
||||
_taskTemplates.value = templates
|
||||
// Don't persist - these are fetched fresh from API
|
||||
}
|
||||
|
||||
fun setTaskTemplatesGrouped(response: TaskTemplatesGroupedResponse) {
|
||||
_taskTemplatesGrouped.value = response
|
||||
// Also extract flat list from grouped response
|
||||
val flatList = response.categories.flatMap { it.templates }
|
||||
_taskTemplates.value = flatList
|
||||
// Don't persist - these are fetched fresh from API
|
||||
}
|
||||
|
||||
/**
|
||||
* Search task templates by query string (local search)
|
||||
*/
|
||||
fun searchTaskTemplates(query: String): List<TaskTemplate> {
|
||||
if (query.length < 2) return emptyList()
|
||||
val lowercaseQuery = query.lowercase()
|
||||
return _taskTemplates.value.filter { template ->
|
||||
template.title.lowercase().contains(lowercaseQuery) ||
|
||||
template.description.lowercase().contains(lowercaseQuery) ||
|
||||
template.tags.any { it.lowercase().contains(lowercaseQuery) }
|
||||
}.take(10)
|
||||
}
|
||||
|
||||
fun setAllLookups(staticData: StaticDataResponse) {
|
||||
setResidenceTypes(staticData.residenceTypes)
|
||||
setTaskFrequencies(staticData.taskFrequencies)
|
||||
@@ -593,6 +629,8 @@ object DataManager {
|
||||
_taskCategoriesMap.value = emptyMap()
|
||||
_contractorSpecialties.value = emptyList()
|
||||
_contractorSpecialtiesMap.value = emptyMap()
|
||||
_taskTemplates.value = emptyList()
|
||||
_taskTemplatesGrouped.value = null
|
||||
_lookupsInitialized.value = false
|
||||
|
||||
// Clear cache timestamps
|
||||
|
||||
Reference in New Issue
Block a user