Merge pull request #122 from yaso-meth/QOL--Home-Screen-Search
add dynamic search
This commit is contained in:
@@ -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,29 +172,15 @@ class _MihBusinessHomeState extends State<MihBusinessHome> {
|
|||||||
children: [
|
children: [
|
||||||
Flexible(
|
Flexible(
|
||||||
flex: 4,
|
flex: 4,
|
||||||
child: KeyboardListener(
|
child: SizedBox(
|
||||||
focusNode: _focusNode,
|
child: MIHSearchField(
|
||||||
autofocus: true,
|
controller: searchController,
|
||||||
onKeyEvent: (event) async {
|
hintText: "Search Mzansi Packages",
|
||||||
if (event is KeyDownEvent &&
|
required: false,
|
||||||
event.logicalKey == LogicalKeyboardKey.enter) {
|
editable: true,
|
||||||
setState(() {
|
onTap: () {
|
||||||
packageSearch = searchController.text;
|
setState(() {});
|
||||||
});
|
},
|
||||||
}
|
|
||||||
},
|
|
||||||
child: SizedBox(
|
|
||||||
child: MIHSearchField(
|
|
||||||
controller: searchController,
|
|
||||||
hintText: "Search Mzansi Packages",
|
|
||||||
required: false,
|
|
||||||
editable: true,
|
|
||||||
onTap: () {
|
|
||||||
setState(() {
|
|
||||||
packageSearch = searchController.text;
|
|
||||||
});
|
|
||||||
},
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@@ -189,7 +190,6 @@ class _MihBusinessHomeState extends State<MihBusinessHome> {
|
|||||||
//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(
|
||||||
physics: const NeverScrollableScrollPhysics(),
|
valueListenable: searchPackageName,
|
||||||
shrinkWrap: true,
|
builder: (context, value, child) {
|
||||||
padding: getPadding(width, height),
|
List<Widget> filteredPackages = value
|
||||||
// shrinkWrap: true,
|
.where((package) => package.keys.first
|
||||||
itemCount: businessPackages.length,
|
.toLowerCase()
|
||||||
gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(
|
.contains(searchController.text.toLowerCase()))
|
||||||
maxCrossAxisExtent: packageSize,
|
.map((package) => package.values.first)
|
||||||
),
|
.toList();
|
||||||
itemBuilder: (context, index) {
|
return GridView.builder(
|
||||||
return businessPackages[index];
|
physics: const NeverScrollableScrollPhysics(),
|
||||||
|
shrinkWrap: true,
|
||||||
|
padding: getPadding(width, height),
|
||||||
|
// shrinkWrap: true,
|
||||||
|
itemCount: filteredPackages.length,
|
||||||
|
gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(
|
||||||
|
maxCrossAxisExtent: packageSize,
|
||||||
|
),
|
||||||
|
itemBuilder: (context, index) {
|
||||||
|
return filteredPackages[index];
|
||||||
|
},
|
||||||
|
);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -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(
|
child: SizedBox(
|
||||||
focusNode: _focusNode,
|
child: MIHSearchField(
|
||||||
autofocus: true,
|
controller: searchController,
|
||||||
onKeyEvent: (event) async {
|
hintText: "Search Mzansi Packages",
|
||||||
if (event is KeyDownEvent &&
|
required: false,
|
||||||
event.logicalKey == LogicalKeyboardKey.enter) {
|
editable: true,
|
||||||
setState(() {
|
onTap: () {},
|
||||||
packageSearch = searchController.text;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
child: SizedBox(
|
|
||||||
child: MIHSearchField(
|
|
||||||
controller: searchController,
|
|
||||||
hintText: "Search Mzansi Packages",
|
|
||||||
required: false,
|
|
||||||
editable: true,
|
|
||||||
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(
|
||||||
physics: const NeverScrollableScrollPhysics(),
|
valueListenable: searchPackageName,
|
||||||
shrinkWrap: true,
|
builder: (context, value, child) {
|
||||||
padding: getPadding(width, height),
|
List<Widget> filteredPackages = value
|
||||||
// shrinkWrap: true,
|
.where((package) => package.keys.first
|
||||||
itemCount: personalPackages.length,
|
.toLowerCase()
|
||||||
gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(
|
.contains(searchController.text.toLowerCase()))
|
||||||
maxCrossAxisExtent: packageSize,
|
.map((package) => package.values.first)
|
||||||
),
|
.toList();
|
||||||
itemBuilder: (context, index) {
|
return GridView.builder(
|
||||||
return personalPackages[index];
|
physics: const NeverScrollableScrollPhysics(),
|
||||||
|
shrinkWrap: true,
|
||||||
|
padding: getPadding(width, height),
|
||||||
|
// shrinkWrap: true,
|
||||||
|
itemCount: filteredPackages.length,
|
||||||
|
gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(
|
||||||
|
maxCrossAxisExtent: packageSize,
|
||||||
|
),
|
||||||
|
itemBuilder: (context, index) {
|
||||||
|
return filteredPackages[index];
|
||||||
|
// return personalPackages[index];
|
||||||
|
},
|
||||||
|
);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|||||||
Reference in New Issue
Block a user