Add search number box + update image layout in section list + update download section order logic

This commit is contained in:
Fransolet Thomas 2022-09-10 19:12:45 +02:00
parent 140dcad823
commit ec4f9160ce
6 changed files with 123 additions and 37 deletions

View File

@ -1 +1 @@
{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"qr_code_scanner","path":"C:\\\\Users\\\\thoma\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\qr_code_scanner-1.0.0\\\\","native_build":true,"dependencies":[]},{"name":"sqflite","path":"C:\\\\Users\\\\thoma\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\sqflite-2.0.3+1\\\\","native_build":true,"dependencies":[]}],"android":[{"name":"qr_code_scanner","path":"C:\\\\Users\\\\thoma\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\qr_code_scanner-1.0.0\\\\","native_build":true,"dependencies":[]},{"name":"sqflite","path":"C:\\\\Users\\\\thoma\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\sqflite-2.0.3+1\\\\","native_build":true,"dependencies":[]}],"macos":[{"name":"sqflite","path":"C:\\\\Users\\\\thoma\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\sqflite-2.0.3+1\\\\","native_build":true,"dependencies":[]}],"linux":[],"windows":[],"web":[]},"dependencyGraph":[{"name":"qr_code_scanner","dependencies":[]},{"name":"sqflite","dependencies":[]}],"date_created":"2022-09-09 17:59:27.780324","version":"3.0.3"} {"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"qr_code_scanner","path":"C:\\\\Users\\\\thoma\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\qr_code_scanner-1.0.0\\\\","native_build":true,"dependencies":[]},{"name":"sqflite","path":"C:\\\\Users\\\\thoma\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\sqflite-2.0.3+1\\\\","native_build":true,"dependencies":[]}],"android":[{"name":"qr_code_scanner","path":"C:\\\\Users\\\\thoma\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\qr_code_scanner-1.0.0\\\\","native_build":true,"dependencies":[]},{"name":"sqflite","path":"C:\\\\Users\\\\thoma\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\sqflite-2.0.3+1\\\\","native_build":true,"dependencies":[]}],"macos":[{"name":"sqflite","path":"C:\\\\Users\\\\thoma\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\sqflite-2.0.3+1\\\\","native_build":true,"dependencies":[]}],"linux":[],"windows":[],"web":[]},"dependencyGraph":[{"name":"qr_code_scanner","dependencies":[]},{"name":"sqflite","dependencies":[]}],"date_created":"2022-09-10 18:06:46.514323","version":"3.0.3"}

View File

@ -18,7 +18,9 @@ class _SearchBoxState extends State<SearchBox> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
Size size = MediaQuery.of(context).size;
return Container( return Container(
width: size.width*0.65,
margin: const EdgeInsets.all(kDefaultPadding), margin: const EdgeInsets.all(kDefaultPadding),
padding: const EdgeInsets.symmetric( padding: const EdgeInsets.symmetric(
horizontal: kDefaultPadding, horizontal: kDefaultPadding,

View File

@ -0,0 +1,49 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import '../constants.dart';
class SearchNumberBox extends StatefulWidget {
const SearchNumberBox({
Key? key,
this.onChanged,
}) : super(key: key);
final ValueChanged? onChanged;
@override
State<SearchNumberBox> createState() => _SearchNumberBoxState();
}
class _SearchNumberBoxState extends State<SearchNumberBox> {
final TextEditingController _controller = TextEditingController();
@override
Widget build(BuildContext context) {
return Container(
margin: const EdgeInsets.only(right: kDefaultPadding),
padding: const EdgeInsets.symmetric(
horizontal: kDefaultPadding,
vertical: kDefaultPadding / 4, // 5 top and bottom
),
decoration: BoxDecoration(
color: Colors.white.withOpacity(0.4),
borderRadius: BorderRadius.circular(12),
),
child: TextFormField(
controller: _controller,
onChanged: widget.onChanged,
keyboardType: TextInputType.number,
inputFormatters: <TextInputFormatter>[
FilteringTextInputFormatter.digitsOnly
],
style: const TextStyle(color: Colors.white),
decoration: const InputDecoration(
enabledBorder: InputBorder.none,
focusedBorder: InputBorder.none,
hintText: '#',
hintStyle: TextStyle(color: Colors.white),
),
),
);
}
}

View File

@ -227,10 +227,12 @@ class _HomePageState extends State<HomePage> {
List<SectionDTO>? sections = await getAllSections(appContext.clientAPI, configuration.id!); List<SectionDTO>? sections = await getAllSections(appContext.clientAPI, configuration.id!);
if(sections!.isNotEmpty) { if(sections!.isNotEmpty) {
List<SectionDTO> sectionsToKeep = sections.where((s) => s.type == SectionType.Article).toList(); // TODO handle other type of section
sectionsToKeep.sort((a,b) => a.order!.compareTo(b.order!));
int newOrder = 0;
// Update local DB - Sections // Update local DB - Sections
for(var section in sections) { for(var section in sectionsToKeep) {
// TODO handle other type of section section.order = newOrder;
if(section.type == SectionType.Article) {
await DatabaseHelper.instance.insert(DatabaseTableType.sections, sectionToMap(section)); await DatabaseHelper.instance.insert(DatabaseTableType.sections, sectionToMap(section));
// Download all images.. // Download all images..
@ -241,8 +243,7 @@ class _HomePageState extends State<HomePage> {
await getAndDownloadImage(appContext.clientAPI, image); await getAndDownloadImage(appContext.clientAPI, image);
} }
} }
} newOrder = newOrder + 1;
} }
} }

View File

@ -2,11 +2,10 @@ import 'package:flutter/material.dart';
import 'package:manager_api/api.dart'; import 'package:manager_api/api.dart';
import 'package:mymuseum_visitapp/Components/Loading.dart'; import 'package:mymuseum_visitapp/Components/Loading.dart';
import 'package:mymuseum_visitapp/Components/SearchBox.dart'; import 'package:mymuseum_visitapp/Components/SearchBox.dart';
import 'package:mymuseum_visitapp/Components/SearchNumberBox.dart';
import 'package:mymuseum_visitapp/Helpers/DatabaseHelper.dart'; import 'package:mymuseum_visitapp/Helpers/DatabaseHelper.dart';
import 'package:mymuseum_visitapp/Helpers/translationHelper.dart'; import 'package:mymuseum_visitapp/Helpers/translationHelper.dart';
import 'package:mymuseum_visitapp/Screens/Article/article.dart'; import 'package:mymuseum_visitapp/Screens/Article/article.dart';
import 'package:mymuseum_visitapp/Screens/Visit/details/details_screen.dart';
import 'package:mymuseum_visitapp/Screens/Visit/product.dart';
import 'package:mymuseum_visitapp/app_context.dart'; import 'package:mymuseum_visitapp/app_context.dart';
import 'package:mymuseum_visitapp/constants.dart'; import 'package:mymuseum_visitapp/constants.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
@ -26,6 +25,7 @@ class _BodyState extends State<Body> {
List<SectionDTO> sections = []; List<SectionDTO> sections = [];
List<SectionDTO> sectionsToDisplay = []; List<SectionDTO> sectionsToDisplay = [];
String? searchValue; String? searchValue;
int? searchNumberValue;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -36,11 +36,31 @@ class _BodyState extends State<Body> {
bottom: false, bottom: false,
child: Column( child: Column(
children: <Widget>[ children: <Widget>[
Row(
children: [
SearchBox(onChanged: (value) { SearchBox(onChanged: (value) {
setState(() { setState(() {
if(value != null && value != "") {
searchValue = value; searchValue = value;
} else {
searchValue = null;
}
}); });
}), }),
Expanded(
child: SearchNumberBox(onChanged: (value) {
setState(() {
if(value != null && value != "") {
searchNumberValue = int.parse(value);
} else {
searchNumberValue = null;
FocusScope.of(context).unfocus();
}
});
}),
),
],
),
//const SizedBox(height: kDefaultPadding / 2), //const SizedBox(height: kDefaultPadding / 2),
Expanded( Expanded(
child: Stack( child: Stack(
@ -108,8 +128,12 @@ class _BodyState extends State<Body> {
if(searchValue != '' && searchValue != null) { if(searchValue != '' && searchValue != null) {
sectionsToDisplay = sections.where((s) => TranslationHelper.get(s!.title, appContext).toLowerCase().contains(searchValue.toString().toLowerCase())).toList(); sectionsToDisplay = sections.where((s) => TranslationHelper.get(s!.title, appContext).toLowerCase().contains(searchValue.toString().toLowerCase())).toList();
} else {
if(searchNumberValue != null) {
sectionsToDisplay = sections.where((s) => s!.order!+1 == searchNumberValue).toList();
} else { } else {
sectionsToDisplay = sections; sectionsToDisplay = sections;
} }
} }
} }
}

View File

@ -38,7 +38,7 @@ class SectionCard extends StatelessWidget {
return Container( return Container(
margin: const EdgeInsets.symmetric( margin: const EdgeInsets.symmetric(
horizontal: kDefaultPadding, horizontal: kDefaultPadding,
vertical: kDefaultPadding / 2, vertical: 0,
), ),
// color: Colors.blueAccent, // color: Colors.blueAccent,
height: 160, height: 160,
@ -53,34 +53,44 @@ class SectionCard extends StatelessWidget {
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(22), borderRadius: BorderRadius.circular(22),
color: itemIndex.isEven ? kBlue0 : kBlue1, color: itemIndex.isEven ? kBlue0 : kBlue1,
boxShadow: const [kDefaultShadow], //boxShadow: const [kDefaultShadow],
), ),
child: Container( child: Container(
margin: const EdgeInsets.only(right: 10), margin: const EdgeInsets.only(right: 10),
decoration: BoxDecoration( decoration: BoxDecoration(
color: Colors.white, color: Colors.white,
border: Border.all(
color: kBlue2,
width: 0.2,
),
borderRadius: BorderRadius.circular(22), borderRadius: BorderRadius.circular(22),
), ),
), ),
), ),
// our product image // section main image
Positioned( Positioned(
top: 0, top: kDefaultPadding +4.0,
right: 0, right: -10,
child: Hero( child: /*Hero(
tag: '${sectionDTO.id}', tag: '${sectionDTO.id}',
child: Container( child:*/ Container(
padding: EdgeInsets.symmetric(horizontal: kDefaultPadding), padding: const EdgeInsets.symmetric(horizontal: kDefaultPadding),
height: 160, height: 136,
// image is square but we add extra 20 + 20 padding thats why width is 200 // image is square but we add extra 20 + 20 padding thats why width is 200
width: 200, width: size.width*0.5,
child: FutureBuilder( child: FutureBuilder(
future: getResource(sectionDTO.imageId), future: getResource(sectionDTO.imageId),
builder: (context, AsyncSnapshot<dynamic> snapshot) { builder: (context, AsyncSnapshot<dynamic> snapshot) {
if (snapshot.connectionState == ConnectionState.done) { if (snapshot.connectionState == ConnectionState.done) {
return resourceModel != null ? Image.memory( return resourceModel != null ? Container(
child: ClipRRect(
borderRadius: const BorderRadius.only(topRight: Radius.circular(20), bottomRight: Radius.circular(20)),
child: Image.memory(
base64Decode(resourceModel!.data!), base64Decode(resourceModel!.data!),
fit: BoxFit.cover fit: BoxFit.cover
),
),
) : const Text(""); ) : const Text("");
} else if (snapshot.connectionState == ConnectionState.none) { } else if (snapshot.connectionState == ConnectionState.none) {
return const Text("No data"); return const Text("No data");
@ -98,9 +108,9 @@ class SectionCard extends StatelessWidget {
fit: BoxFit.cover, fit: BoxFit.cover,
),*/ ),*/
), ),
//),
), ),
), // Section title and order
// Product title and price
Positioned( Positioned(
bottom: 0, bottom: 0,
left: 0, left: 0,
@ -134,9 +144,9 @@ class SectionCard extends StatelessWidget {
), ),
), ),
child: Text( child: Text(
"${itemIndex+1}", "${sectionDTO.order!+1}",
//style: Theme.of(context).textTheme.button, //style: Theme.of(context).textTheme.button,
style: TextStyle(color: Colors.white) style: const TextStyle(color: Colors.white)
), ),
), ),
], ],