@@ -7,15 +7,20 @@ import androidx.compose.foundation.layout.Column
77import androidx.compose.foundation.layout.Row
88import androidx.compose.foundation.layout.Spacer
99import androidx.compose.foundation.layout.fillMaxWidth
10+ import androidx.compose.foundation.layout.height
1011import androidx.compose.foundation.layout.padding
1112import androidx.compose.foundation.lazy.LazyColumn
1213import androidx.compose.material.Button
1314import androidx.compose.material.Divider
1415import androidx.compose.material.ExperimentalMaterialApi
1516import androidx.compose.material.Icon
1617import androidx.compose.material.IconButton
18+ import androidx.compose.material.OutlinedTextField
1719import androidx.compose.material.Text
20+ import androidx.compose.material.TextFieldDefaults
1821import androidx.compose.material.icons.Icons
22+ import androidx.compose.material.icons.filled.Clear
23+ import androidx.compose.material.icons.filled.Search
1924import androidx.compose.material.icons.outlined.Edit
2025import androidx.compose.material.icons.outlined.KeyboardArrowDown
2126import androidx.compose.material.icons.outlined.KeyboardArrowUp
@@ -24,6 +29,7 @@ import androidx.compose.runtime.collectAsState
2429import androidx.compose.runtime.getValue
2530import androidx.compose.ui.Alignment
2631import androidx.compose.ui.Modifier
32+ import androidx.compose.ui.graphics.Color
2733import androidx.compose.ui.res.colorResource
2834import androidx.compose.ui.res.stringResource
2935import androidx.compose.ui.unit.dp
@@ -55,15 +61,16 @@ internal fun KonfeatureScreen(
5561 onResetAllClick = viewModel::onResetAllClick,
5662 onCollapseAllClick = viewModel::onCollapseAllClick,
5763 onHeaderClick = viewModel::onConfigHeaderClick,
58- onEditClick = viewModel::onEditClick
64+ onEditClick = viewModel::onEditClick,
65+ onSearchQueryChange = viewModel::onSearchQueryChanged,
5966 )
6067
6168 state.editDialogState?.let { dialogState ->
6269 EditConfigValueDialog (
6370 state = dialogState,
6471 onValueChange = viewModel::onValueChanged,
6572 onValueReset = viewModel::onValueReset,
66- onDismissRequest = viewModel::onEditDialogCloseClik
73+ onDismissRequest = viewModel::onEditDialogCloseClicked
6774 )
6875 }
6976}
@@ -77,47 +84,121 @@ internal fun KonfeatureLayout(
7784 onCollapseAllClick : () -> Unit ,
7885 onResetAllClick : () -> Unit ,
7986 onHeaderClick : (String ) -> Unit ,
87+ onSearchQueryChange : (String ) -> Unit ,
8088) {
8189 LazyColumn {
8290 stickyHeader {
83- Row (
84- modifier = Modifier
85- .background(colorResource(id = CoreR .color.super_light_gray))
86- .padding(horizontal = 16 .dp, vertical = 4 .dp)
87- ) {
88- Button (onClick = onRefreshClick) {
89- Text (text = stringResource(id = R .string.konfeature_plugin_refresh))
90- }
91- Spacer (modifier = Modifier .weight(1f ))
92- Button (onClick = onCollapseAllClick) {
93- Text (text = stringResource(id = R .string.konfeature_plugin_collapse_all))
94- }
95- Spacer (modifier = Modifier .weight(1f ))
96- Button (onClick = onResetAllClick) {
97- Text (text = stringResource(id = R .string.konfeature_plugin_reset_all))
98- }
91+ KonfeatureHeader (
92+ searchQuery = state.searchQuery,
93+ onSearchQueryChange = onSearchQueryChange,
94+ onRefreshClick = onRefreshClick,
95+ onCollapseAllClick = onCollapseAllClick,
96+ onResetAllClick = onResetAllClick,
97+ )
98+ }
99+
100+ if (state.shouldShowEmptySearchItemsHint) {
101+ item {
102+ Text (
103+ text = stringResource(R .string.konfeature_plugin_search_empty),
104+ modifier = Modifier .padding(16 .dp)
105+ )
99106 }
100107 }
101108
102- state.items .forEach { item ->
109+ state.filteredItems .forEach { item ->
103110 if (item is KonfeatureItem .Config ) {
104111 item(item.name) {
105112 ConfigItem (
106113 item = item,
107- isCollapsed = item.name in state.collapsedConfigs,
114+ isCollapsed = ! state.isSearchActive && item.name in state.collapsedConfigs,
108115 onHeaderClick = onHeaderClick
109116 )
110117 }
111118 }
112119
113- if (item is KonfeatureItem .Value && item.configName !in state.collapsedConfigs) {
120+ val isExpanded = state.isSearchActive || item is KonfeatureItem .Value &&
121+ item.configName !in state.collapsedConfigs
122+ if (item is KonfeatureItem .Value && isExpanded) {
114123 item(item.key) { ValueItem (item = item, onEditClick) }
115124 item { Divider (modifier = Modifier .fillMaxWidth()) }
116125 }
117126 }
118127 }
119128}
120129
130+ @Composable
131+ private fun KonfeatureHeader (
132+ searchQuery : String ,
133+ onSearchQueryChange : (String ) -> Unit ,
134+ onRefreshClick : () -> Unit ,
135+ onCollapseAllClick : () -> Unit ,
136+ onResetAllClick : () -> Unit ,
137+ modifier : Modifier = Modifier ,
138+ ) {
139+ Column (
140+ modifier = modifier
141+ .background(colorResource(id = CoreR .color.super_light_gray))
142+ .padding(horizontal = 16 .dp)
143+ ) {
144+ Spacer (modifier = Modifier .height(8 .dp))
145+ KonfeatureSearchBar (
146+ query = searchQuery,
147+ onQueryChange = onSearchQueryChange,
148+ modifier = Modifier
149+ )
150+ Spacer (modifier = Modifier .height(8 .dp))
151+ Row {
152+ Button (onClick = onRefreshClick) {
153+ Text (text = stringResource(id = R .string.konfeature_plugin_refresh))
154+ }
155+ Spacer (modifier = Modifier .weight(1f ))
156+ Button (onClick = onCollapseAllClick) {
157+ Text (text = stringResource(id = R .string.konfeature_plugin_collapse_all))
158+ }
159+ Spacer (modifier = Modifier .weight(1f ))
160+ Button (onClick = onResetAllClick) {
161+ Text (text = stringResource(id = R .string.konfeature_plugin_reset_all))
162+ }
163+ }
164+ }
165+ }
166+
167+ @Composable
168+ private fun KonfeatureSearchBar (
169+ query : String ,
170+ onQueryChange : (String ) -> Unit ,
171+ modifier : Modifier = Modifier
172+ ) {
173+ OutlinedTextField (
174+ value = query,
175+ onValueChange = onQueryChange,
176+ modifier = modifier.fillMaxWidth(),
177+ placeholder = {
178+ Text (text = stringResource(R .string.konfeature_plugin_search_hint))
179+ },
180+ leadingIcon = {
181+ Icon (
182+ imageVector = Icons .Default .Search ,
183+ contentDescription = null
184+ )
185+ },
186+ trailingIcon = {
187+ if (query.isNotEmpty()) {
188+ IconButton (onClick = { onQueryChange(" " ) }) {
189+ Icon (
190+ imageVector = Icons .Default .Clear ,
191+ contentDescription = stringResource(R .string.konfeature_plugin_search_clear)
192+ )
193+ }
194+ }
195+ },
196+ singleLine = true ,
197+ colors = TextFieldDefaults .outlinedTextFieldColors(
198+ backgroundColor = Color .White
199+ )
200+ )
201+ }
121202
122203@Composable
123204private fun ConfigItem (
0 commit comments