android_generate_material_form
Generate Android Jetpack Compose form patterns with Material Design for DHIS2 health information systems. Create customizable forms with validation, date pickers, multi-select options, and accessibility features.
Instructions
Generate Android Jetpack Compose form patterns (Material Design)
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| screenName | No | Composable name | |
| includeValidation | No | ||
| includeDatePicker | No | ||
| includeMultiSelect | No | ||
| dynamicColor | No | Use Material 3 dynamic color | |
| lightDark | No | Include light/dark theme setup | |
| rtl | No | Add RTL considerations | |
| snackbar | No | Include snackbar feedback example |
Implementation Reference
- src/index.ts:1107-1111 (handler)MCP server tool handler for 'android_generate_material_form'. Receives arguments, calls generateAndroidMaterialForm generator, and formats response as text content.case 'android_generate_material_form': const aFormArgs = args as any; const aForm = generateAndroidMaterialForm(aFormArgs); return { content: [{ type: 'text', text: aForm }] };
- src/webapp-generators.ts:1670-1763 (helper)Core generator function that produces Kotlin Jetpack Compose code for Android Material Design forms based on input parameters like screenName, validation, date picker, multi-select.export function generateAndroidMaterialForm(args: any): string { const { screenName = 'RegistrationForm', includeValidation = true, includeDatePicker = true, includeMultiSelect = true } = args; return `# Android Material Form (Jetpack Compose): ${screenName} ## Implementation \`\`\`kotlin @Composable fun ${screenName}( onSubmit: (name: String, description: String, date: String, options: List<String>) -> Unit ) { var name by remember { mutableStateOf("") } var description by remember { mutableStateOf("") } var date by remember { mutableStateOf("") } var showDatePicker by remember { mutableStateOf(false) } val selectedOptions = remember { mutableStateListOf<String>() } ${includeValidation ? 'var nameError by remember { mutableStateOf<String?>(null) }' : ''} Column(modifier = Modifier.padding(16.dp).fillMaxSize(), verticalArrangement = Arrangement.spacedBy(12.dp)) { OutlinedTextField( value = name, onValueChange = { value -> name = value ${includeValidation ? 'nameError = if (value.isBlank()) "Name is required" else null' : ''} }, label = { Text("Name") }, isError = ${includeValidation ? 'nameError != null' : 'false'}, supportingText = { ${includeValidation ? 'nameError?.let { Text(it)' : 'null'} ${includeValidation ? '}' : ''} } ) OutlinedTextField( value = description, onValueChange = { description = it }, label = { Text("Description") }, minLines = 3 ) ${includeDatePicker ? ` OutlinedTextField( value = date, onValueChange = {}, label = { Text("Date") }, readOnly = true, trailingIcon = { Icon(Icons.Default.DateRange, contentDescription = null) }, modifier = Modifier.clickable { showDatePicker = true } ) if (showDatePicker) { DatePickerDialog( onDismissRequest = { showDatePicker = false }, onDateChange = { y, m, d -> date = "%04d-%02d-%02d".format(y, m + 1, d) showDatePicker = false } ) } ` : ''} ${includeMultiSelect ? ` Text("Categories") FlowRow(horizontalArrangement = Arrangement.spacedBy(8.dp)) { listOf("male", "female", "other").forEach { option -> FilterChip( selected = selectedOptions.contains(option), onClick = { if (selectedOptions.contains(option)) selectedOptions.remove(option) else selectedOptions.add(option) }, label = { Text(option) } ) } } ` : ''} Button(onClick = { ${includeValidation ? 'if (nameError != null) return@Button' : ''} onSubmit(name, description, date, selectedOptions.toList()) }) { Text("Save") } } } \`\`\` ## Notes - Replace \`DatePickerDialog\` with your preferred implementation if needed. - Use validation for required fields. `; }
- src/permission-system.ts:173-178 (registration)Tool permission registration in TOOL_PERMISSIONS Map, associating 'android_generate_material_form' with 'canUseMobileFeatures' permission.['dhis2_generate_design_system', 'canUseUITools'], ['android_generate_material_form', 'canUseMobileFeatures'], ['android_generate_list_adapter', 'canUseMobileFeatures'], ['android_generate_navigation_drawer', 'canUseMobileFeatures'], ['android_generate_bottom_sheet', 'canUseMobileFeatures'], ]);