Merge pull request #122 from yaso-meth/QOL--Home-Screen-Search

add dynamic search
This commit is contained in:
yaso-meth
2025-03-27 11:42:59 +02:00
committed by GitHub
2 changed files with 157 additions and 136 deletions

View File

@@ -33,28 +33,28 @@ class MihBusinessHome extends StatefulWidget {
} }
class _MihBusinessHomeState extends State<MihBusinessHome> { class _MihBusinessHomeState extends State<MihBusinessHome> {
final FocusNode _focusNode = FocusNode();
final TextEditingController searchController = TextEditingController(); final TextEditingController searchController = TextEditingController();
String packageSearch = ""; late List<Map<String, Widget>> businessPackagesMap;
late List<Widget> businessPackages; final ValueNotifier<List<Map<String, Widget>>> searchPackageName =
ValueNotifier([]);
double packageSize = 200; double packageSize = 200;
List<Widget> setBusinessPackages() { List<Map<String, Widget>> setBusinessPackages() {
List<Widget> temp = []; List<Map<String, Widget>> temp = [];
//=============== Biz Profile =============== //=============== Biz Profile ===============
temp.add( temp.add({
MzansiBusinessProfileTile( "Business Profile": MzansiBusinessProfileTile(
arguments: BusinessArguments( arguments: BusinessArguments(
widget.signedInUser, widget.signedInUser,
widget.businessUser, widget.businessUser,
widget.business, widget.business,
), ),
packageSize: packageSize, packageSize: packageSize,
), )
); });
//=============== Pat Manager =============== //=============== Pat Manager ===============
temp.add( temp.add({
PatManagerTile( "Patient Manager": PatManagerTile(
arguments: PatManagerArguments( arguments: PatManagerArguments(
widget.signedInUser, widget.signedInUser,
false, false,
@@ -62,11 +62,11 @@ class _MihBusinessHomeState extends State<MihBusinessHome> {
widget.businessUser, widget.businessUser,
), ),
packageSize: packageSize, packageSize: packageSize,
), )
); });
//=============== Calendar =============== //=============== Calendar ===============
temp.add( temp.add({
MzansiCalendarTile( "Calendar": MzansiCalendarTile(
arguments: CalendarArguments( arguments: CalendarArguments(
widget.signedInUser, widget.signedInUser,
false, false,
@@ -74,26 +74,24 @@ class _MihBusinessHomeState extends State<MihBusinessHome> {
widget.businessUser, widget.businessUser,
), ),
packageSize: packageSize, packageSize: packageSize,
), )
); });
//=============== Mzansi AI =============== //=============== Mzansi AI ===============
temp.add( temp.add({
MzansiAiTile( "Mzansi AI": MzansiAiTile(
signedInUser: widget.signedInUser, signedInUser: widget.signedInUser,
packageSize: packageSize, packageSize: packageSize,
), )
); });
//=============== Calculator =============== //=============== Calculator ===============
temp.add( temp.add({
MihCalculatorTile( "Calculator": MihCalculatorTile(
personalSelected: widget.personalSelected, personalSelected: widget.personalSelected,
packageSize: packageSize, packageSize: packageSize,
), )
); });
//=============== About MIH =============== //=============== About MIH ===============
temp.add( temp.add({"About MIH": AboutMihTile(packageSize: packageSize)});
AboutMihTile(packageSize: packageSize),
);
return temp; return temp;
} }
@@ -114,16 +112,33 @@ class _MihBusinessHomeState extends State<MihBusinessHome> {
} }
} }
void searchPackage() {
if (searchController.text.isEmpty) {
searchPackageName.value = businessPackagesMap;
} else {
List<Map<String, Widget>> temp = [];
for (var item in businessPackagesMap) {
if (item.keys.first.toLowerCase().contains(searchController.text)) {
temp.add(item);
}
}
searchPackageName.value = temp;
}
}
@override @override
void dispose() { void dispose() {
super.dispose(); super.dispose();
searchController.removeListener(searchPackage);
searchController.dispose(); searchController.dispose();
} }
@override @override
void initState() { void initState() {
super.initState(); super.initState();
businessPackages = setBusinessPackages(); searchController.addListener(searchPackage);
businessPackagesMap = setBusinessPackages();
searchPackage();
} }
@override @override
@@ -157,17 +172,6 @@ class _MihBusinessHomeState extends State<MihBusinessHome> {
children: [ children: [
Flexible( Flexible(
flex: 4, flex: 4,
child: KeyboardListener(
focusNode: _focusNode,
autofocus: true,
onKeyEvent: (event) async {
if (event is KeyDownEvent &&
event.logicalKey == LogicalKeyboardKey.enter) {
setState(() {
packageSearch = searchController.text;
});
}
},
child: SizedBox( child: SizedBox(
child: MIHSearchField( child: MIHSearchField(
controller: searchController, controller: searchController,
@@ -175,21 +179,17 @@ class _MihBusinessHomeState extends State<MihBusinessHome> {
required: false, required: false,
editable: true, editable: true,
onTap: () { onTap: () {
setState(() { setState(() {});
packageSearch = searchController.text;
});
}, },
), ),
), ),
), ),
),
Flexible( Flexible(
flex: 1, flex: 1,
child: IconButton( child: IconButton(
//padding: const EdgeInsets.all(0), //padding: const EdgeInsets.all(0),
onPressed: () { onPressed: () {
setState(() { setState(() {
packageSearch = "";
searchController.clear(); searchController.clear();
}); });
}, },
@@ -202,17 +202,28 @@ class _MihBusinessHomeState extends State<MihBusinessHome> {
], ],
), ),
const SizedBox(height: 10), const SizedBox(height: 10),
GridView.builder( ValueListenableBuilder(
valueListenable: searchPackageName,
builder: (context, value, child) {
List<Widget> filteredPackages = value
.where((package) => package.keys.first
.toLowerCase()
.contains(searchController.text.toLowerCase()))
.map((package) => package.values.first)
.toList();
return GridView.builder(
physics: const NeverScrollableScrollPhysics(), physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true, shrinkWrap: true,
padding: getPadding(width, height), padding: getPadding(width, height),
// shrinkWrap: true, // shrinkWrap: true,
itemCount: businessPackages.length, itemCount: filteredPackages.length,
gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent( gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(
maxCrossAxisExtent: packageSize, maxCrossAxisExtent: packageSize,
), ),
itemBuilder: (context, index) { itemBuilder: (context, index) {
return businessPackages[index]; return filteredPackages[index];
},
);
}, },
), ),
], ],

View File

@@ -38,32 +38,32 @@ class MihPersonalHome extends StatefulWidget {
} }
class _MihPersonalHomeState extends State<MihPersonalHome> { class _MihPersonalHomeState extends State<MihPersonalHome> {
final FocusNode _focusNode = FocusNode();
final TextEditingController searchController = TextEditingController(); final TextEditingController searchController = TextEditingController();
String packageSearch = ""; late List<Map<String, Widget>> personalPackagesMap;
late List<Widget> personalPackages; final ValueNotifier<List<Map<String, Widget>>> searchPackageName =
ValueNotifier([]);
double packageSize = 200; double packageSize = 200;
List<Widget> setPersonalPackages() { List<Map<String, Widget>> setPersonalPackagesMap() {
List<Widget> temp = []; List<Map<String, Widget>> temp = [];
//=============== Mzansi Profile =============== //=============== Mzansi Profile ===============
temp.add( temp.add({
MzansiProfileTile( "Mzansi Profile": MzansiProfileTile(
signedInUser: widget.signedInUser, signedInUser: widget.signedInUser,
propicFile: widget.propicFile, propicFile: widget.propicFile,
packageSize: packageSize, packageSize: packageSize,
), )
); });
//=============== Mzansi Wallet =============== //=============== Mzansi Wallet ===============
temp.add( temp.add({
MihWalletTile( "Mzansi Wallet": MihWalletTile(
signedInUser: widget.signedInUser, signedInUser: widget.signedInUser,
packageSize: packageSize, packageSize: packageSize,
), )
); });
//=============== Patient Profile =============== //=============== Patient Profile ===============
temp.add( temp.add({
PatientProfileTile( "Patient Profile": PatientProfileTile(
arguments: PatientViewArguments( arguments: PatientViewArguments(
widget.signedInUser, widget.signedInUser,
null, null,
@@ -72,18 +72,18 @@ class _MihPersonalHomeState extends State<MihPersonalHome> {
"personal", "personal",
), ),
packageSize: packageSize, packageSize: packageSize,
), )
); });
//=============== Mzansi AI =============== //=============== Mzansi AI ===============
temp.add( temp.add({
MzansiAiTile( "Mzansi AI": MzansiAiTile(
signedInUser: widget.signedInUser, signedInUser: widget.signedInUser,
packageSize: packageSize, packageSize: packageSize,
), )
); });
//=============== Calendar =============== //=============== Calendar ===============
temp.add( temp.add({
MzansiCalendarTile( "Calendar": MzansiCalendarTile(
arguments: CalendarArguments( arguments: CalendarArguments(
widget.signedInUser, widget.signedInUser,
true, true,
@@ -91,26 +91,24 @@ class _MihPersonalHomeState extends State<MihPersonalHome> {
widget.businessUser, widget.businessUser,
), ),
packageSize: packageSize, packageSize: packageSize,
), )
); });
//=============== Calculator =============== //=============== Calculator ===============
temp.add( temp.add({
MihCalculatorTile( "Calculator": MihCalculatorTile(
personalSelected: widget.personalSelected, personalSelected: widget.personalSelected,
packageSize: packageSize, packageSize: packageSize,
), )
); });
//=============== MIH Access =============== //=============== MIH Access ===============
temp.add( temp.add({
MihAccessTile( "MIH Access": MihAccessTile(
signedInUser: widget.signedInUser, signedInUser: widget.signedInUser,
packageSize: packageSize, packageSize: packageSize,
), )
); });
//=============== About MIH =============== //=============== About MIH ===============
temp.add( temp.add({"About MIH": AboutMihTile(packageSize: packageSize)});
AboutMihTile(packageSize: packageSize),
);
return temp; return temp;
} }
@@ -131,16 +129,33 @@ class _MihPersonalHomeState extends State<MihPersonalHome> {
} }
} }
void searchPackage() {
if (searchController.text.isEmpty) {
searchPackageName.value = personalPackagesMap;
} else {
List<Map<String, Widget>> temp = [];
for (var item in personalPackagesMap) {
if (item.keys.first.toLowerCase().contains(searchController.text)) {
temp.add(item);
}
}
searchPackageName.value = temp;
}
}
@override @override
void dispose() { void dispose() {
super.dispose(); super.dispose();
searchController.removeListener(searchPackage);
searchController.dispose(); searchController.dispose();
} }
@override @override
void initState() { void initState() {
super.initState(); super.initState();
personalPackages = setPersonalPackages(); searchController.addListener(searchPackage);
personalPackagesMap = setPersonalPackagesMap();
searchPackage();
} }
@override @override
@@ -175,29 +190,13 @@ class _MihPersonalHomeState extends State<MihPersonalHome> {
children: [ children: [
Flexible( Flexible(
flex: 4, flex: 4,
child: KeyboardListener(
focusNode: _focusNode,
autofocus: true,
onKeyEvent: (event) async {
if (event is KeyDownEvent &&
event.logicalKey == LogicalKeyboardKey.enter) {
setState(() {
packageSearch = searchController.text;
});
}
},
child: SizedBox( child: SizedBox(
child: MIHSearchField( child: MIHSearchField(
controller: searchController, controller: searchController,
hintText: "Search Mzansi Packages", hintText: "Search Mzansi Packages",
required: false, required: false,
editable: true, editable: true,
onTap: () { onTap: () {},
setState(() {
packageSearch = searchController.text;
});
},
),
), ),
), ),
), ),
@@ -207,7 +206,6 @@ class _MihPersonalHomeState extends State<MihPersonalHome> {
//padding: const EdgeInsets.all(0), //padding: const EdgeInsets.all(0),
onPressed: () { onPressed: () {
setState(() { setState(() {
packageSearch = "";
searchController.clear(); searchController.clear();
}); });
}, },
@@ -220,17 +218,29 @@ class _MihPersonalHomeState extends State<MihPersonalHome> {
], ],
), ),
const SizedBox(height: 10), const SizedBox(height: 10),
GridView.builder( ValueListenableBuilder(
valueListenable: searchPackageName,
builder: (context, value, child) {
List<Widget> filteredPackages = value
.where((package) => package.keys.first
.toLowerCase()
.contains(searchController.text.toLowerCase()))
.map((package) => package.values.first)
.toList();
return GridView.builder(
physics: const NeverScrollableScrollPhysics(), physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true, shrinkWrap: true,
padding: getPadding(width, height), padding: getPadding(width, height),
// shrinkWrap: true, // shrinkWrap: true,
itemCount: personalPackages.length, itemCount: filteredPackages.length,
gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent( gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(
maxCrossAxisExtent: packageSize, maxCrossAxisExtent: packageSize,
), ),
itemBuilder: (context, index) { itemBuilder: (context, index) {
return personalPackages[index]; return filteredPackages[index];
// return personalPackages[index];
},
);
}, },
), ),
], ],