feat: eventbus

release/mobdr-v0.0.1
Frédérik Benoist 2023-04-30 00:07:28 +02:00
parent 210f50bb22
commit f940638264
24 changed files with 1124 additions and 650 deletions

BIN
assets/images/logo_mp4.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -32,6 +32,8 @@ PODS:
- Toast (4.0.0)
- wakelock (0.0.1):
- Flutter
- webview_flutter_wkwebview (0.0.1):
- Flutter
DEPENDENCIES:
- camera_avfoundation (from `.symlinks/plugins/camera_avfoundation/ios`)
@ -46,6 +48,7 @@ DEPENDENCIES:
- shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/ios`)
- sqflite (from `.symlinks/plugins/sqflite/ios`)
- wakelock (from `.symlinks/plugins/wakelock/ios`)
- webview_flutter_wkwebview (from `.symlinks/plugins/webview_flutter_wkwebview/ios`)
SPEC REPOS:
trunk:
@ -78,6 +81,8 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/sqflite/ios"
wakelock:
:path: ".symlinks/plugins/wakelock/ios"
webview_flutter_wkwebview:
:path: ".symlinks/plugins/webview_flutter_wkwebview/ios"
SPEC CHECKSUMS:
camera_avfoundation: 3125e8cd1a4387f6f31c6c63abb8a55892a9eeeb
@ -95,6 +100,7 @@ SPEC CHECKSUMS:
sqflite: 6d358c025f5b867b29ed92fc697fd34924e11904
Toast: 91b396c56ee72a5790816f40d3a94dd357abc196
wakelock: d0fc7c864128eac40eba1617cb5264d9c940b46f
webview_flutter_wkwebview: 2e2d318f21a5e036e2c3f26171342e95908bd60a
PODFILE CHECKSUM: b634fd49380cdd3837626153fb977533b1916433

View File

@ -8,6 +8,8 @@ import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
class GlobalStyle {
static const double cardHeightMultiplication = 1.70; // higher is more longer
// appBar
static const Color appBarIconThemeColor = Colors.black;
static const double appBarElevation = 0;
@ -171,4 +173,15 @@ class GlobalStyle {
static const TextStyle detailFoodSubOptions =
TextStyle(color: BLACK77, fontSize: 12);
static const TextStyle horizontalTitle =
TextStyle(fontSize: 18, fontWeight: FontWeight.bold);
static const TextStyle cardTitle =
TextStyle(fontSize: 14, color: Colors.black, fontWeight: FontWeight.bold);
static const TextStyle textPromo = TextStyle(
fontSize: 12,
color: BLACK77,
);
}

View File

@ -1,13 +1,12 @@
import 'package:objectbox/objectbox.dart';
import 'package:intl/intl.dart';
import 'package:mobdr/objectbox.g.dart';
import 'package:mobdr/service/shared_prefs.dart';
// ignore_for_file: public_member_api_docs
@Entity()
class Photo {
class VisitPhoto {
// specify the id
@Id()
int id = 0;
@ -22,7 +21,7 @@ class Photo {
String tags;
int uploaded;
Photo(
VisitPhoto(
{this.id = 0,
required this.id_visite,
required this.id_photo_typologie,
@ -46,7 +45,7 @@ class Photo {
String get dateFormat => DateFormat('dd.MM.yyyy hh:mm:ss').format(date_photo);
Photo copyWith({
VisitPhoto copyWith({
int? id,
int? id_visite,
int? id_photo_typologie,
@ -59,7 +58,7 @@ class Photo {
String? tags,
int? uploaded,
}) {
return Photo(
return VisitPhoto(
id: id ?? this.id,
id_visite: id_visite ?? this.id_visite,
id_photo_typologie: id_photo_typologie ?? this.id_photo_typologie,

View File

@ -4,7 +4,7 @@ import 'package:mobdr/objectbox.g.dart';
// ignore_for_file: public_member_api_docs
@Entity()
class Concurrent {
class EtabCompetitor {
// specify the id
@Id()
int id = 0;
@ -13,13 +13,13 @@ class Concurrent {
int id_etab;
String nom;
Concurrent(
EtabCompetitor(
{this.id = 0,
required this.id_concurrence_lien,
required this.id_etab,
required this.nom});
Concurrent.fromJson(Map<String, dynamic> json)
EtabCompetitor.fromJson(Map<String, dynamic> json)
: id_concurrence_lien = json['id_concurrence_lien'],
id_etab = json['id_etab'],
nom = json['nom'];

28
lib/events.dart Normal file
View File

@ -0,0 +1,28 @@
import 'package:event_bus_plus/event_bus_plus.dart';
class FollowAppEvent extends AppEvent {
FollowAppEvent(this.username, {String? id});
final String username;
@override
List<Object?> get props => [username];
}
class NewComment extends AppEvent {
NewComment(this.text, {String? id});
final String text;
@override
List<Object?> get props => [text];
}
class UrlEvent extends AppEvent {
UrlEvent(this.url);
final String url;
@override
List<Object?> get props => [url];
}

View File

@ -11,11 +11,14 @@ import 'package:flutter/services.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:path_provider/path_provider.dart';
import 'objectbox.dart';
import 'package:wakelock/wakelock.dart';
import 'package:event_bus_plus/event_bus_plus.dart';
import 'package:mobdr/config/constant.dart';
import 'package:mobdr/cubit/language/language_cubit.dart';
@ -29,6 +32,8 @@ late ObjectBox objectbox;
final DeviceInfoPlugin deviceInfoPlugin = DeviceInfoPlugin();
final EventBus eventBus = EventBus();
Future<void> main() async {
// This is required so ObjectBox can get the application directory
// to store the database in.
@ -47,6 +52,10 @@ Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
Wakelock.enable();
eventBus.on().listen((event) {
print('${DateTime.now()} Event: $event');
});
runApp(MyApp());
});
}
@ -68,6 +77,10 @@ class MyApp extends StatelessWidget {
initDirectories();
initPlatformState();
// url MP4
SharedPrefs().urlMP4 =
'https://mp4.ikksgroup.com/MobilePortal4/index.html#ajax/dashboard.html';
// Initialize all bloc provider used on this entire application here
return MultiBlocProvider(
providers: [

View File

@ -32,7 +32,7 @@ class VisiteModel {
id_distrib: visite.id_distrib_visite,
id: visite.id,
id_visite: visite.id_visite,
name: visite.title,
name: visite.id_etab.toString() + ' - ' + visite.title,
photoCount: objectbox.getVisitPhotoCount(visite.id_visite),
date: visite.date_visite.toString(),
image: visite.url_photo_principale,

View File

@ -12,8 +12,6 @@ import 'package:crypto/crypto.dart';
class ApiProvider {
Dio dio = Dio();
late Response response;
late Response response2;
String connErr = 'Please check your internet connection and try again';
Future<Response> getCrud(url, body) async {
@ -137,6 +135,7 @@ class ApiProvider {
"fingerprint":
"aa" // TODO: on peut mettre un fingerprint sur la version ou sur l'heure
};
Response response;
try {
response = await getCrud(
@ -204,6 +203,9 @@ class ApiProvider {
/// Synchronize "stores & competing stores"
Future<String> SyncEtablissements() async {
Response response;
Response response2;
try {
/// get "Etablissement" list
response = await getCrud(
@ -230,7 +232,7 @@ class ApiProvider {
if (response2.statusCode == STATUS_OK) {
/// fill box "concurrence"
objectbox.addConcurrents(response2.data['concurrents']);
objectbox.addPhotoCompetitors(response2.data['concurrents']);
}
/// all ok
@ -247,6 +249,9 @@ class ApiProvider {
/// Synchronize "visites"
Future<String> SyncVisites() async {
Response response;
Response response2;
try {
var body = null;
@ -275,7 +280,7 @@ class ApiProvider {
if (response2.statusCode == STATUS_OK) {
// remove all objects
objectbox.visiteTagBox.removeAll();
objectbox.visitTagBox.removeAll();
/// fill box "visiteTag"
objectbox.addVisiteTags(response2.data['tags']);
@ -295,6 +300,8 @@ class ApiProvider {
/// Synchronize "Photos"
Future<String> SyncPhotos() async {
Response response;
try {
/// get "Photo typologies"
response = await getCrud(
@ -306,7 +313,7 @@ class ApiProvider {
if (response.statusCode == STATUS_OK) {
// remove all objects
objectbox.photoTypologyBox.removeAll();
objectbox.PhotoTypologyBox.removeAll();
/// fill box "Photo typologies"
objectbox.addPhotoTypologies(response.data['typologies']);
@ -324,6 +331,8 @@ class ApiProvider {
}
Future<String> getExample(apiToken) async {
Response response;
response =
await getConnect(ApiConstants.baseUrl + '/example/getData', apiToken);
print('res : ' + response.toString());
@ -331,6 +340,8 @@ class ApiProvider {
}
Future<String> postExample(String id, apiToken) async {
Response response;
var postData = {'id': id};
response = await postConnect(
ApiConstants.baseUrl + '/example/postData', postData, apiToken);
@ -367,6 +378,8 @@ class ApiProvider {
'student_gender': studentGender,
'student_address': studentAddress,
};
Response response;
response = await postConnect(
ApiConstants.baseUrl + '/student/addStudent', postData, apiToken);
if (response.data['status'] == STATUS_OK) {
@ -395,6 +408,8 @@ class ApiProvider {
'student_gender': studentGender,
'student_address': studentAddress,
};
Response response;
response = await postConnect(
ApiConstants.baseUrl + '/student/editStudent', postData, apiToken);
if (response.data['status'] == STATUS_OK) {
@ -410,6 +425,7 @@ class ApiProvider {
'session_id': sessionId,
'student_id': studentId,
};
Response response;
response = await postConnect(
ApiConstants.baseUrl + '/student/deleteStudent', postData, apiToken);
if (response.data['status'] == STATUS_OK) {

View File

@ -164,35 +164,6 @@
],
"relations": []
},
{
"id": "6:1805690312272107423",
"lastPropertyId": "4:7447139022474751374",
"name": "Concurrent",
"properties": [
{
"id": "1:2904282721431628480",
"name": "id",
"type": 6,
"flags": 1
},
{
"id": "2:6658127353491083480",
"name": "id_concurrence_lien",
"type": 6
},
{
"id": "3:2563846535684494722",
"name": "id_etab",
"type": 6
},
{
"id": "4:7447139022474751374",
"name": "nom",
"type": 9
}
],
"relations": []
},
{
"id": "7:8290500625256822711",
"lastPropertyId": "14:5831680857919010234",
@ -291,65 +262,6 @@
],
"relations": []
},
{
"id": "9:6788844671665652158",
"lastPropertyId": "17:7248999677905103482",
"name": "Photo",
"properties": [
{
"id": "1:2982072387377736709",
"name": "id",
"type": 6,
"flags": 1
},
{
"id": "3:1374846727562410311",
"name": "id_visite",
"type": 6
},
{
"id": "4:374091471912277059",
"name": "id_photo_typologie",
"type": 6
},
{
"id": "6:234947897575384032",
"name": "date_photo",
"type": 10
},
{
"id": "7:3602779209059248697",
"name": "id_photo_mp4",
"type": 6
},
{
"id": "8:5116665990846416843",
"name": "photo_privee",
"type": 6
},
{
"id": "9:1716626028602523655",
"name": "photo_principale",
"type": 6
},
{
"id": "14:4568092734700892012",
"name": "uploaded",
"type": 6
},
{
"id": "16:539065583624712715",
"name": "image_name",
"type": 9
},
{
"id": "17:7248999677905103482",
"name": "tags",
"type": 9
}
],
"relations": []
},
{
"id": "10:2779194860339140505",
"lastPropertyId": "4:5588276375011055284",
@ -378,16 +290,107 @@
}
],
"relations": []
},
{
"id": "12:4500693035615595045",
"lastPropertyId": "4:5330383710454562585",
"name": "EtabCompetitor",
"properties": [
{
"id": "1:7961815144802826808",
"name": "id",
"type": 6,
"flags": 1
},
{
"id": "2:5210870817793324298",
"name": "id_concurrence_lien",
"type": 6
},
{
"id": "3:7222947234243150693",
"name": "id_etab",
"type": 6
},
{
"id": "4:5330383710454562585",
"name": "nom",
"type": 9
}
],
"relations": []
},
{
"id": "13:6298506278273268036",
"lastPropertyId": "10:427077651567855068",
"name": "VisitPhoto",
"properties": [
{
"id": "1:1717256666688760598",
"name": "id",
"type": 6,
"flags": 1
},
{
"id": "2:6583457577180129132",
"name": "id_visite",
"type": 6
},
{
"id": "3:614430257115472469",
"name": "id_photo_typologie",
"type": 6
},
{
"id": "4:4379833392180668916",
"name": "image_name",
"type": 9
},
{
"id": "5:5816417858904192200",
"name": "date_photo",
"type": 10
},
{
"id": "6:1774060819972417032",
"name": "id_photo_mp4",
"type": 6
},
{
"id": "7:1161534230522136468",
"name": "photo_privee",
"type": 6
},
{
"id": "8:8622794607160372440",
"name": "photo_principale",
"type": 6
},
{
"id": "9:2715965548965396457",
"name": "tags",
"type": 9
},
{
"id": "10:427077651567855068",
"name": "uploaded",
"type": 6
}
],
"relations": []
}
],
"lastEntityId": "10:2779194860339140505",
"lastEntityId": "13:6298506278273268036",
"lastIndexId": "1:7907819717055295102",
"lastRelationId": "0:0",
"lastSequenceId": "0:0",
"modelVersion": 5,
"modelVersionParserMinimum": 5,
"retiredEntityUids": [
7401686910042688313
7401686910042688313,
1805690312272107423,
6788844671665652158,
2910300629980903548
],
"retiredIndexUids": [
7907819717055295102
@ -405,7 +408,25 @@
2141346538986140281,
7877546811840884522,
3784190804330297742,
1865824860595482227
1865824860595482227,
2904282721431628480,
6658127353491083480,
2563846535684494722,
7447139022474751374,
2982072387377736709,
1374846727562410311,
374091471912277059,
234947897575384032,
3602779209059248697,
5116665990846416843,
1716626028602523655,
4568092734700892012,
539065583624712715,
7248999677905103482,
6313899520679425027,
4752064214129719799,
319372524127232986,
783761731187897018
],
"retiredRelationUids": [],
"version": 1

View File

@ -1,9 +1,9 @@
import 'package:mobdr/db/box_user.dart';
import 'package:mobdr/db/box_log.dart';
import 'package:mobdr/db/box_etab.dart';
import 'package:mobdr/db/box_concurrent.dart';
import 'package:mobdr/db/box_visite.dart';
import 'package:mobdr/db/box_visite_tag.dart';
import 'package:mobdr/db/box_photo_competitor.dart';
import 'package:mobdr/db/box_visit.dart';
import 'package:mobdr/db/box_visit_tag.dart';
import 'package:mobdr/db/box_photo.dart';
import 'package:mobdr/db/box_photo_typology.dart';
@ -20,26 +20,26 @@ class ObjectBox {
/// A Box of notes.
late final Box<Note> noteBox;
/// A Box of "user"
/// A Box of user
late final Box<User> userBox;
/// A Box of "Etablissement"
/// A Box of etablishment
late final Box<Etab> etabBox;
/// A Box of "Concurrent"
late final Box<Concurrent> concurrentBox;
/// A Box of etablishment competitor
late final Box<EtabCompetitor> etabCompetitorBox;
/// A Box of "Visite"
late final Box<Visite> visiteBox;
/// A Box of visit
late final Box<Visite> visitBox;
/// A Box of "Visite tag"
late final Box<VisiteTag> visiteTagBox;
/// A Box for all visit tag by distributor / language
late final Box<VisiteTag> visitTagBox;
/// A Box of "Photo"
late final Box<Photo> photoBox;
/// A Box of visit Photo
late final Box<VisitPhoto> visitPhotoBox;
/// A Box of "Photo typology"
late final Box<PhotoTypology> photoTypologyBox;
/// A Box of photo typology
late final Box<PhotoTypology> PhotoTypologyBox;
/// A Box of log.
late final Box<Log> logBox;
@ -48,11 +48,11 @@ class ObjectBox {
noteBox = Box<Note>(store);
userBox = Box<User>(store);
etabBox = Box<Etab>(store);
concurrentBox = Box<Concurrent>(store);
visiteBox = Box<Visite>(store);
visiteTagBox = Box<VisiteTag>(store);
photoBox = Box<Photo>(store);
photoTypologyBox = Box<PhotoTypology>(store);
etabCompetitorBox = Box<EtabCompetitor>(store);
visitBox = Box<Visite>(store);
visitTagBox = Box<VisiteTag>(store);
PhotoTypologyBox = Box<PhotoTypology>(store);
visitPhotoBox = Box<VisitPhoto>(store);
logBox = Box<Log>(store);
// Add some demo data if the box is empty.
@ -61,13 +61,13 @@ class ObjectBox {
}
userBox.removeAll();
etabBox.removeAll();
concurrentBox.removeAll();
//visiteBox.removeAll();
//visiteTagBox.removeAll();
//photoBox.removeAll();
//photoTypologyBox.removeAll();
//etabBox.removeAll();
//etabCompetitorBox.removeAll();
//visitBox.removeAll();
//visitTagBox.removeAll();
//visitPhotoBox.removeAll();
//PhotoTypologyBox.removeAll();
// Add some demo data if the box is empty.
if (userBox.isEmpty()) {
@ -200,39 +200,52 @@ class ObjectBox {
return etabBox.count();
}
/// CONCURRENT ---------------------------------------------------------------
/// PHOTO COMPETITOR ---------------------------------------------------------------
///
// A function that converts a response body list into a List<Concurrent>.
List<Concurrent> parseConcurrents(List responseDataList) {
// A function that converts a response body list into a List<Competitor>.
List<EtabCompetitor> parsePhotoCompetitor(List responseDataList) {
final parsed = responseDataList.cast<Map<String, dynamic>>();
return parsed.map<Concurrent>((json) => Concurrent.fromJson(json)).toList();
return parsed
.map<EtabCompetitor>((json) => EtabCompetitor.fromJson(json))
.toList();
}
Future<void> addConcurrents(List<dynamic> _listConcurrents) =>
store.runInTransactionAsync(TxMode.write, _addConcurrentsInTx,
parseConcurrents(_listConcurrents));
Future<void> addPhotoCompetitors(List<dynamic> _listPhotoCompetitors) =>
store.runInTransactionAsync(TxMode.write, _addPhotoCompetitorsInTx,
parsePhotoCompetitor(_listPhotoCompetitors));
static void _addConcurrentsInTx(Store store, _Concurrents) {
store.box<Concurrent>().putMany(_Concurrents);
static void _addPhotoCompetitorsInTx(Store store, _Competitors) {
store.box<EtabCompetitor>().putMany(_Competitors);
}
Future<void> addConcurrent(int _id_concurrence_lien, int _id_etab, _nom) =>
Future<void> addPhotoCompetitor(
int _id_concurrence_lien, int _id_etab, _nom) =>
store.runInTransactionAsync(
TxMode.write,
_addConcurrentInTx,
Concurrent(
_addPhotoCompetitorInTx,
EtabCompetitor(
id_concurrence_lien: _id_concurrence_lien,
id_etab: _id_etab,
nom: _nom,
));
static void _addConcurrentInTx(Store store, _Concurrent) {
store.box<Concurrent>().put(_Concurrent);
static void _addPhotoCompetitorInTx(Store store, _Competitor) {
store.box<EtabCompetitor>().put(_Competitor);
}
int getConcurrentCount() {
return concurrentBox.count();
List<EtabCompetitor> getPhotoCompetitorList() {
final query = etabCompetitorBox
.query(EtabCompetitor_.id_etab.equals(1417))
.order(EtabCompetitor_.nom)
.build();
final photoCompetitors = query.find();
return photoCompetitors.toList();
}
int getPhotoCompetitorsCount() {
return etabCompetitorBox.count();
}
/// VISITE ------------------------------------------------------------------
@ -242,7 +255,7 @@ class ObjectBox {
// Query for all visites, sorted by their date.
// https://docs.objectbox.io/queries
final builder =
visiteBox.query().order(Visite_.date_visite, flags: Order.descending);
visitBox.query().order(Visite_.date_visite, flags: Order.descending);
// Build and watch the query,
// set triggerImmediately to emit the query immediately on listen.
return builder
@ -253,7 +266,7 @@ class ObjectBox {
List<Visite> getAllVisites() {
// Query for all visites, sorted by their date.
final builder = visiteBox
final builder = visitBox
.query()
.order(Visite_.date_visite, flags: Order.descending)
.build();
@ -309,7 +322,7 @@ class ObjectBox {
}
int getVisiteCount() {
return visiteBox.count();
return visitBox.count();
}
//TODO changer en PHOTO TAG / mettre dans l'ordre CRUD
@ -352,7 +365,7 @@ class ObjectBox {
}
List<String> getVisiteTagsLabels(int distribId, String langage) {
final query = visiteTagBox
final query = visitTagBox
.query(VisiteTag_.id_distrib.equals(distribId) &
VisiteTag_.langage.equals(langage))
//.order(VisiteTag_.libelle)
@ -364,15 +377,15 @@ class ObjectBox {
}
int getVisiteTagCount() {
return visiteTagBox.count();
return visitTagBox.count();
}
/// PHOTO --------------------------------------------------------------------
///
///
Future<List<Photo>> addPhotos(List<Photo> photos) async {
final addedPhotos = await photoBox.putAndGetManyAsync(photos);
Future<List<VisitPhoto>> addPhotos(List<VisitPhoto> photos) async {
final addedPhotos = await visitPhotoBox.putAndGetManyAsync(photos);
return addedPhotos;
}
@ -381,7 +394,7 @@ class ObjectBox {
store.runInTransactionAsync(
TxMode.write,
_addPhotoInTx,
Photo(
VisitPhoto(
id_visite: id_visite,
id_photo_typologie: id_photo_typologie,
image_name: image_name));
@ -389,17 +402,17 @@ class ObjectBox {
static void _addPhotoInTx(Store store, _Photo) {
// Perform ObjectBox operations that take longer than a few milliseconds
// here. To keep it simple, this example just puts a single object.
store.box<Photo>().put(_Photo);
store.box<VisitPhoto>().put(_Photo);
}
List<Photo> getAllVisitTypologyPhotos(
List<VisitPhoto> getAllVisitTypologyPhotos(
int id_visite, int _id_photo_typologie) {
// Query for all photos, sorted by their date.
// https://docs.objectbox.io/queries
final query = photoBox
.query(Photo_.id_visite.equals(id_visite) &
Photo_.id_photo_typologie.equals(_id_photo_typologie))
.order(Photo_.date_photo, flags: Order.descending)
final query = visitPhotoBox
.query(VisitPhoto_.id_visite.equals(id_visite) &
VisitPhoto_.id_photo_typologie.equals(_id_photo_typologie))
.order(VisitPhoto_.date_photo, flags: Order.descending)
.build();
return query.find();
}
@ -411,16 +424,17 @@ class ObjectBox {
///
/// Returns:
/// A Photo object, or null if no object is found.
Photo? getPhotoById(int id_photo) {
final photo = photoBox.get(id_photo);
VisitPhoto? getPhotoById(int id_photo) {
final photo = visitPhotoBox.get(id_photo);
return photo;
}
Stream<List<Photo>> getPhotos() {
Stream<List<VisitPhoto>> getPhotos() {
// Query for all photos, sorted by their date.
// https://docs.objectbox.io/queries
final builder =
photoBox.query().order(Photo_.date_photo, flags: Order.descending);
final builder = visitPhotoBox
.query()
.order(VisitPhoto_.date_photo, flags: Order.descending);
// Build and watch the query,
// set triggerImmediately to emit the query immediately on listen.
return builder
@ -430,59 +444,61 @@ class ObjectBox {
}
void delPhoto(String _name) {
final query = photoBox.query(Photo_.image_name.equals(_name)).build();
final query =
visitPhotoBox.query(VisitPhoto_.image_name.equals(_name)).build();
final results = query.find();
if (results.isNotEmpty) {
final photoToDelete = results.first;
photoBox.removeAsync(photoToDelete.id);
visitPhotoBox.removeAsync(photoToDelete.id);
}
}
int getVisitPhotoCount(int _id_visite) {
final builder = photoBox.query(Photo_.id_visite.equals(_id_visite)).build();
final builder =
visitPhotoBox.query(VisitPhoto_.id_visite.equals(_id_visite)).build();
return builder.count();
}
int getVisitTypologiePhotoCount(int _id_visite, int _id_photo_typologie) {
final builder = photoBox
.query(Photo_.id_visite.equals(_id_visite) &
Photo_.id_photo_typologie.equals(_id_photo_typologie))
final builder = visitPhotoBox
.query(VisitPhoto_.id_visite.equals(_id_visite) &
VisitPhoto_.id_photo_typologie.equals(_id_photo_typologie))
.build();
return builder.count();
}
Future<void> putPhotoTypologie(int photoId, int typologieId) async {
final photo = photoBox.get(photoId);
final photo = visitPhotoBox.get(photoId);
if (photo != null) {
final updatedPhoto = photo.copyWith(id_photo_typologie: typologieId);
await photoBox.putAsync(updatedPhoto);
await visitPhotoBox.putAsync(updatedPhoto);
}
}
Future<void> putPhotoTags(int photoId, List<String> tags) async {
final photo = photoBox.get(photoId);
final photo = visitPhotoBox.get(photoId);
if (photo != null) {
final updatedPhoto = photo.copyWith(tags: tags.join(","));
await photoBox.putAsync(updatedPhoto);
await visitPhotoBox.putAsync(updatedPhoto);
}
}
Future<void> putPhotoVisibilities(
int photoId, List<String> visibilities) async {
final photo = photoBox.get(photoId);
final photo = visitPhotoBox.get(photoId);
if (photo != null) {
final updatedPhoto = photo.copyWith(
photo_principale: visibilities.contains('principal') ? 1 : 0,
photo_privee: visibilities.contains('private') ? 1 : 0);
await photoBox.putAsync(updatedPhoto);
await visitPhotoBox.putAsync(updatedPhoto);
}
}
/* remettre les principal à zero
final queryBuilder = box.query(Photo_.visite_id.equals(idVisite) & Photo_.photo_principale.equals(1));
final queryBuilder = box.query(VisitPhoto_.visite_id.equals(idVisite) & VisitPhoto_.photo_principale.equals(1));
final updatedPhotos = queryBuilder.build().find();
updatedPhotos.forEach((photo) {
photo.photo_principale = 0;
@ -525,7 +541,7 @@ class ObjectBox {
}
List<String> getPhotoTypologiesLabels() {
final query = photoTypologyBox.query().order(PhotoTypology_.ordre).build();
final query = PhotoTypologyBox.query().order(PhotoTypology_.ordre).build();
final photoTypologies = query.find();
return photoTypologies
.map((photoTypology) => photoTypology.libelle)
@ -533,7 +549,7 @@ class ObjectBox {
}
List<PhotoTypology> getPhotoTypologiesList() {
final query = photoTypologyBox.query().order(PhotoTypology_.ordre).build();
final query = PhotoTypologyBox.query().order(PhotoTypology_.ordre).build();
final photoTypologies = query.find();
return photoTypologies.toList();
@ -542,7 +558,7 @@ class ObjectBox {
Stream<List<PhotoTypology>> getPhotoTypologies() {
// Query for all Typologies, sorted by their order.
// https://docs.objectbox.io/queries
final builder = photoTypologyBox.query().order(PhotoTypology_.ordre);
final builder = PhotoTypologyBox.query().order(PhotoTypology_.ordre);
// Build and watch the query,
// set triggerImmediately to emit the query immediately on listen.
return builder

View File

@ -14,14 +14,14 @@ import 'package:objectbox/internal.dart'; // generated code can access "internal
import 'package:objectbox/objectbox.dart';
import 'package:objectbox_flutter_libs/objectbox_flutter_libs.dart';
import 'db/box_concurrent.dart';
import 'db/box_etab.dart';
import 'db/box_log.dart';
import 'db/box_photo.dart';
import 'db/box_photo_competitor.dart';
import 'db/box_photo_typology.dart';
import 'db/box_user.dart';
import 'db/box_visite.dart';
import 'db/box_visite_tag.dart';
import 'db/box_visit.dart';
import 'db/box_visit_tag.dart';
import 'model.dart';
export 'package:objectbox/objectbox.dart'; // so that callers only have to import this file
@ -188,35 +188,6 @@ final _entities = <ModelEntity>[
],
relations: <ModelRelation>[],
backlinks: <ModelBacklink>[]),
ModelEntity(
id: const IdUid(6, 1805690312272107423),
name: 'Concurrent',
lastPropertyId: const IdUid(4, 7447139022474751374),
flags: 0,
properties: <ModelProperty>[
ModelProperty(
id: const IdUid(1, 2904282721431628480),
name: 'id',
type: 6,
flags: 1),
ModelProperty(
id: const IdUid(2, 6658127353491083480),
name: 'id_concurrence_lien',
type: 6,
flags: 0),
ModelProperty(
id: const IdUid(3, 2563846535684494722),
name: 'id_etab',
type: 6,
flags: 0),
ModelProperty(
id: const IdUid(4, 7447139022474751374),
name: 'nom',
type: 9,
flags: 0)
],
relations: <ModelRelation>[],
backlinks: <ModelBacklink>[]),
ModelEntity(
id: const IdUid(7, 8290500625256822711),
name: 'Visite',
@ -315,65 +286,6 @@ final _entities = <ModelEntity>[
],
relations: <ModelRelation>[],
backlinks: <ModelBacklink>[]),
ModelEntity(
id: const IdUid(9, 6788844671665652158),
name: 'Photo',
lastPropertyId: const IdUid(17, 7248999677905103482),
flags: 0,
properties: <ModelProperty>[
ModelProperty(
id: const IdUid(1, 2982072387377736709),
name: 'id',
type: 6,
flags: 1),
ModelProperty(
id: const IdUid(3, 1374846727562410311),
name: 'id_visite',
type: 6,
flags: 0),
ModelProperty(
id: const IdUid(4, 374091471912277059),
name: 'id_photo_typologie',
type: 6,
flags: 0),
ModelProperty(
id: const IdUid(6, 234947897575384032),
name: 'date_photo',
type: 10,
flags: 0),
ModelProperty(
id: const IdUid(7, 3602779209059248697),
name: 'id_photo_mp4',
type: 6,
flags: 0),
ModelProperty(
id: const IdUid(8, 5116665990846416843),
name: 'photo_privee',
type: 6,
flags: 0),
ModelProperty(
id: const IdUid(9, 1716626028602523655),
name: 'photo_principale',
type: 6,
flags: 0),
ModelProperty(
id: const IdUid(14, 4568092734700892012),
name: 'uploaded',
type: 6,
flags: 0),
ModelProperty(
id: const IdUid(16, 539065583624712715),
name: 'image_name',
type: 9,
flags: 0),
ModelProperty(
id: const IdUid(17, 7248999677905103482),
name: 'tags',
type: 9,
flags: 0)
],
relations: <ModelRelation>[],
backlinks: <ModelBacklink>[]),
ModelEntity(
id: const IdUid(10, 2779194860339140505),
name: 'PhotoTypology',
@ -402,6 +314,94 @@ final _entities = <ModelEntity>[
flags: 0)
],
relations: <ModelRelation>[],
backlinks: <ModelBacklink>[]),
ModelEntity(
id: const IdUid(12, 4500693035615595045),
name: 'EtabCompetitor',
lastPropertyId: const IdUid(4, 5330383710454562585),
flags: 0,
properties: <ModelProperty>[
ModelProperty(
id: const IdUid(1, 7961815144802826808),
name: 'id',
type: 6,
flags: 1),
ModelProperty(
id: const IdUid(2, 5210870817793324298),
name: 'id_concurrence_lien',
type: 6,
flags: 0),
ModelProperty(
id: const IdUid(3, 7222947234243150693),
name: 'id_etab',
type: 6,
flags: 0),
ModelProperty(
id: const IdUid(4, 5330383710454562585),
name: 'nom',
type: 9,
flags: 0)
],
relations: <ModelRelation>[],
backlinks: <ModelBacklink>[]),
ModelEntity(
id: const IdUid(13, 6298506278273268036),
name: 'VisitPhoto',
lastPropertyId: const IdUid(10, 427077651567855068),
flags: 0,
properties: <ModelProperty>[
ModelProperty(
id: const IdUid(1, 1717256666688760598),
name: 'id',
type: 6,
flags: 1),
ModelProperty(
id: const IdUid(2, 6583457577180129132),
name: 'id_visite',
type: 6,
flags: 0),
ModelProperty(
id: const IdUid(3, 614430257115472469),
name: 'id_photo_typologie',
type: 6,
flags: 0),
ModelProperty(
id: const IdUid(4, 4379833392180668916),
name: 'image_name',
type: 9,
flags: 0),
ModelProperty(
id: const IdUid(5, 5816417858904192200),
name: 'date_photo',
type: 10,
flags: 0),
ModelProperty(
id: const IdUid(6, 1774060819972417032),
name: 'id_photo_mp4',
type: 6,
flags: 0),
ModelProperty(
id: const IdUid(7, 1161534230522136468),
name: 'photo_privee',
type: 6,
flags: 0),
ModelProperty(
id: const IdUid(8, 8622794607160372440),
name: 'photo_principale',
type: 6,
flags: 0),
ModelProperty(
id: const IdUid(9, 2715965548965396457),
name: 'tags',
type: 9,
flags: 0),
ModelProperty(
id: const IdUid(10, 427077651567855068),
name: 'uploaded',
type: 6,
flags: 0)
],
relations: <ModelRelation>[],
backlinks: <ModelBacklink>[])
];
@ -425,11 +425,16 @@ Future<Store> openStore(
ModelDefinition getObjectBoxModel() {
final model = ModelInfo(
entities: _entities,
lastEntityId: const IdUid(10, 2779194860339140505),
lastEntityId: const IdUid(13, 6298506278273268036),
lastIndexId: const IdUid(1, 7907819717055295102),
lastRelationId: const IdUid(0, 0),
lastSequenceId: const IdUid(0, 0),
retiredEntityUids: const [7401686910042688313],
retiredEntityUids: const [
7401686910042688313,
1805690312272107423,
6788844671665652158,
2910300629980903548
],
retiredIndexUids: const [7907819717055295102],
retiredPropertyUids: const [
402019719780433349,
@ -444,7 +449,25 @@ ModelDefinition getObjectBoxModel() {
2141346538986140281,
7877546811840884522,
3784190804330297742,
1865824860595482227
1865824860595482227,
2904282721431628480,
6658127353491083480,
2563846535684494722,
7447139022474751374,
2982072387377736709,
1374846727562410311,
374091471912277059,
234947897575384032,
3602779209059248697,
5116665990846416843,
1716626028602523655,
4568092734700892012,
539065583624712715,
7248999677905103482,
6313899520679425027,
4752064214129719799,
319372524127232986,
783761731187897018
],
retiredRelationUids: const [],
modelVersion: 5,
@ -622,43 +645,10 @@ ModelDefinition getObjectBoxModel() {
latitude: const fb.StringReader(asciiOptimization: true)
.vTableGet(buffer, rootOffset, 18, ''));
return object;
}),
Concurrent: EntityDefinition<Concurrent>(
model: _entities[4],
toOneRelations: (Concurrent object) => [],
toManyRelations: (Concurrent object) => {},
getId: (Concurrent object) => object.id,
setId: (Concurrent object, int id) {
object.id = id;
},
objectToFB: (Concurrent object, fb.Builder fbb) {
final nomOffset = fbb.writeString(object.nom);
fbb.startTable(5);
fbb.addInt64(0, object.id);
fbb.addInt64(1, object.id_concurrence_lien);
fbb.addInt64(2, object.id_etab);
fbb.addOffset(3, nomOffset);
fbb.finish(fbb.endTable());
return object.id;
},
objectFromFB: (Store store, ByteData fbData) {
final buffer = fb.BufferContext(fbData);
final rootOffset = buffer.derefObject(0);
final object = Concurrent(
id: const fb.Int64Reader().vTableGet(buffer, rootOffset, 4, 0),
id_concurrence_lien:
const fb.Int64Reader().vTableGet(buffer, rootOffset, 6, 0),
id_etab:
const fb.Int64Reader().vTableGet(buffer, rootOffset, 8, 0),
nom: const fb.StringReader(asciiOptimization: true)
.vTableGet(buffer, rootOffset, 10, ''));
return object;
}),
Visite: EntityDefinition<Visite>(
model: _entities[5],
model: _entities[4],
toOneRelations: (Visite object) => [],
toManyRelations: (Visite object) => {},
getId: (Visite object) => object.id,
@ -716,7 +706,7 @@ ModelDefinition getObjectBoxModel() {
return object;
}),
VisiteTag: EntityDefinition<VisiteTag>(
model: _entities[6],
model: _entities[5],
toOneRelations: (VisiteTag object) => [],
toManyRelations: (VisiteTag object) => {},
getId: (VisiteTag object) => object.id,
@ -750,62 +740,10 @@ ModelDefinition getObjectBoxModel() {
langage: const fb.StringReader(asciiOptimization: true)
.vTableGet(buffer, rootOffset, 12, ''));
return object;
}),
Photo: EntityDefinition<Photo>(
model: _entities[7],
toOneRelations: (Photo object) => [],
toManyRelations: (Photo object) => {},
getId: (Photo object) => object.id,
setId: (Photo object, int id) {
object.id = id;
},
objectToFB: (Photo object, fb.Builder fbb) {
final image_nameOffset = fbb.writeString(object.image_name);
final tagsOffset = fbb.writeString(object.tags);
fbb.startTable(18);
fbb.addInt64(0, object.id);
fbb.addInt64(2, object.id_visite);
fbb.addInt64(3, object.id_photo_typologie);
fbb.addInt64(5, object.date_photo.millisecondsSinceEpoch);
fbb.addInt64(6, object.id_photo_mp4);
fbb.addInt64(7, object.photo_privee);
fbb.addInt64(8, object.photo_principale);
fbb.addInt64(13, object.uploaded);
fbb.addOffset(15, image_nameOffset);
fbb.addOffset(16, tagsOffset);
fbb.finish(fbb.endTable());
return object.id;
},
objectFromFB: (Store store, ByteData fbData) {
final buffer = fb.BufferContext(fbData);
final rootOffset = buffer.derefObject(0);
final object = Photo(
id: const fb.Int64Reader().vTableGet(buffer, rootOffset, 4, 0),
id_visite:
const fb.Int64Reader().vTableGet(buffer, rootOffset, 8, 0),
id_photo_typologie:
const fb.Int64Reader().vTableGet(buffer, rootOffset, 10, 0),
image_name: const fb.StringReader(asciiOptimization: true)
.vTableGet(buffer, rootOffset, 34, ''),
id_photo_mp4:
const fb.Int64Reader().vTableGet(buffer, rootOffset, 16, 0),
photo_privee:
const fb.Int64Reader().vTableGet(buffer, rootOffset, 18, 0),
photo_principale:
const fb.Int64Reader().vTableGet(buffer, rootOffset, 20, 0),
tags: const fb.StringReader(asciiOptimization: true)
.vTableGet(buffer, rootOffset, 36, ''),
date_photo: DateTime.fromMillisecondsSinceEpoch(
const fb.Int64Reader().vTableGet(buffer, rootOffset, 14, 0)),
uploaded:
const fb.Int64Reader().vTableGet(buffer, rootOffset, 30, 0));
return object;
}),
PhotoTypology: EntityDefinition<PhotoTypology>(
model: _entities[8],
model: _entities[6],
toOneRelations: (PhotoTypology object) => [],
toManyRelations: (PhotoTypology object) => {},
getId: (PhotoTypology object) => object.id,
@ -835,6 +773,91 @@ ModelDefinition getObjectBoxModel() {
ordre:
const fb.Int64Reader().vTableGet(buffer, rootOffset, 10, 0));
return object;
}),
EtabCompetitor: EntityDefinition<EtabCompetitor>(
model: _entities[7],
toOneRelations: (EtabCompetitor object) => [],
toManyRelations: (EtabCompetitor object) => {},
getId: (EtabCompetitor object) => object.id,
setId: (EtabCompetitor object, int id) {
object.id = id;
},
objectToFB: (EtabCompetitor object, fb.Builder fbb) {
final nomOffset = fbb.writeString(object.nom);
fbb.startTable(5);
fbb.addInt64(0, object.id);
fbb.addInt64(1, object.id_concurrence_lien);
fbb.addInt64(2, object.id_etab);
fbb.addOffset(3, nomOffset);
fbb.finish(fbb.endTable());
return object.id;
},
objectFromFB: (Store store, ByteData fbData) {
final buffer = fb.BufferContext(fbData);
final rootOffset = buffer.derefObject(0);
final object = EtabCompetitor(
id: const fb.Int64Reader().vTableGet(buffer, rootOffset, 4, 0),
id_concurrence_lien:
const fb.Int64Reader().vTableGet(buffer, rootOffset, 6, 0),
id_etab:
const fb.Int64Reader().vTableGet(buffer, rootOffset, 8, 0),
nom: const fb.StringReader(asciiOptimization: true)
.vTableGet(buffer, rootOffset, 10, ''));
return object;
}),
VisitPhoto: EntityDefinition<VisitPhoto>(
model: _entities[8],
toOneRelations: (VisitPhoto object) => [],
toManyRelations: (VisitPhoto object) => {},
getId: (VisitPhoto object) => object.id,
setId: (VisitPhoto object, int id) {
object.id = id;
},
objectToFB: (VisitPhoto object, fb.Builder fbb) {
final image_nameOffset = fbb.writeString(object.image_name);
final tagsOffset = fbb.writeString(object.tags);
fbb.startTable(11);
fbb.addInt64(0, object.id);
fbb.addInt64(1, object.id_visite);
fbb.addInt64(2, object.id_photo_typologie);
fbb.addOffset(3, image_nameOffset);
fbb.addInt64(4, object.date_photo.millisecondsSinceEpoch);
fbb.addInt64(5, object.id_photo_mp4);
fbb.addInt64(6, object.photo_privee);
fbb.addInt64(7, object.photo_principale);
fbb.addOffset(8, tagsOffset);
fbb.addInt64(9, object.uploaded);
fbb.finish(fbb.endTable());
return object.id;
},
objectFromFB: (Store store, ByteData fbData) {
final buffer = fb.BufferContext(fbData);
final rootOffset = buffer.derefObject(0);
final object = VisitPhoto(
id: const fb.Int64Reader().vTableGet(buffer, rootOffset, 4, 0),
id_visite:
const fb.Int64Reader().vTableGet(buffer, rootOffset, 6, 0),
id_photo_typologie:
const fb.Int64Reader().vTableGet(buffer, rootOffset, 8, 0),
image_name: const fb.StringReader(asciiOptimization: true)
.vTableGet(buffer, rootOffset, 10, ''),
id_photo_mp4:
const fb.Int64Reader().vTableGet(buffer, rootOffset, 14, 0),
photo_privee:
const fb.Int64Reader().vTableGet(buffer, rootOffset, 16, 0),
photo_principale:
const fb.Int64Reader().vTableGet(buffer, rootOffset, 18, 0),
tags: const fb.StringReader(asciiOptimization: true)
.vTableGet(buffer, rootOffset, 20, ''),
date_photo: DateTime.fromMillisecondsSinceEpoch(
const fb.Int64Reader().vTableGet(buffer, rootOffset, 12, 0)),
uploaded:
const fb.Int64Reader().vTableGet(buffer, rootOffset, 22, 0));
return object;
})
};
@ -932,148 +955,150 @@ class Etab_ {
QueryStringProperty<Etab>(_entities[3].properties[7]);
}
/// [Concurrent] entity fields to define ObjectBox queries.
class Concurrent_ {
/// see [Concurrent.id]
static final id =
QueryIntegerProperty<Concurrent>(_entities[4].properties[0]);
/// see [Concurrent.id_concurrence_lien]
static final id_concurrence_lien =
QueryIntegerProperty<Concurrent>(_entities[4].properties[1]);
/// see [Concurrent.id_etab]
static final id_etab =
QueryIntegerProperty<Concurrent>(_entities[4].properties[2]);
/// see [Concurrent.nom]
static final nom =
QueryStringProperty<Concurrent>(_entities[4].properties[3]);
}
/// [Visite] entity fields to define ObjectBox queries.
class Visite_ {
/// see [Visite.id]
static final id = QueryIntegerProperty<Visite>(_entities[5].properties[0]);
static final id = QueryIntegerProperty<Visite>(_entities[4].properties[0]);
/// see [Visite.id_visite]
static final id_visite =
QueryIntegerProperty<Visite>(_entities[5].properties[1]);
QueryIntegerProperty<Visite>(_entities[4].properties[1]);
/// see [Visite.type_visite]
static final type_visite =
QueryStringProperty<Visite>(_entities[5].properties[2]);
QueryStringProperty<Visite>(_entities[4].properties[2]);
/// see [Visite.title]
static final title = QueryStringProperty<Visite>(_entities[5].properties[3]);
static final title = QueryStringProperty<Visite>(_entities[4].properties[3]);
/// see [Visite.allDay]
static final allDay =
QueryBooleanProperty<Visite>(_entities[5].properties[4]);
QueryBooleanProperty<Visite>(_entities[4].properties[4]);
/// see [Visite.id_distrib_visite]
static final id_distrib_visite =
QueryIntegerProperty<Visite>(_entities[5].properties[5]);
QueryIntegerProperty<Visite>(_entities[4].properties[5]);
/// see [Visite.id_etab]
static final id_etab =
QueryIntegerProperty<Visite>(_entities[5].properties[6]);
QueryIntegerProperty<Visite>(_entities[4].properties[6]);
/// see [Visite.abandon]
static final abandon =
QueryIntegerProperty<Visite>(_entities[5].properties[7]);
QueryIntegerProperty<Visite>(_entities[4].properties[7]);
/// see [Visite.date_visite]
static final date_visite =
QueryIntegerProperty<Visite>(_entities[5].properties[8]);
QueryIntegerProperty<Visite>(_entities[4].properties[8]);
/// see [Visite.url_photo_principale]
static final url_photo_principale =
QueryStringProperty<Visite>(_entities[5].properties[9]);
QueryStringProperty<Visite>(_entities[4].properties[9]);
/// see [Visite.langage]
static final langage =
QueryStringProperty<Visite>(_entities[5].properties[10]);
QueryStringProperty<Visite>(_entities[4].properties[10]);
}
/// [VisiteTag] entity fields to define ObjectBox queries.
class VisiteTag_ {
/// see [VisiteTag.id]
static final id = QueryIntegerProperty<VisiteTag>(_entities[6].properties[0]);
static final id = QueryIntegerProperty<VisiteTag>(_entities[5].properties[0]);
/// see [VisiteTag.id_visite_tag]
static final id_visite_tag =
QueryIntegerProperty<VisiteTag>(_entities[6].properties[1]);
QueryIntegerProperty<VisiteTag>(_entities[5].properties[1]);
/// see [VisiteTag.id_distrib]
static final id_distrib =
QueryIntegerProperty<VisiteTag>(_entities[6].properties[2]);
QueryIntegerProperty<VisiteTag>(_entities[5].properties[2]);
/// see [VisiteTag.libelle]
static final libelle =
QueryStringProperty<VisiteTag>(_entities[6].properties[3]);
QueryStringProperty<VisiteTag>(_entities[5].properties[3]);
/// see [VisiteTag.langage]
static final langage =
QueryStringProperty<VisiteTag>(_entities[6].properties[4]);
}
/// [Photo] entity fields to define ObjectBox queries.
class Photo_ {
/// see [Photo.id]
static final id = QueryIntegerProperty<Photo>(_entities[7].properties[0]);
/// see [Photo.id_visite]
static final id_visite =
QueryIntegerProperty<Photo>(_entities[7].properties[1]);
/// see [Photo.id_photo_typologie]
static final id_photo_typologie =
QueryIntegerProperty<Photo>(_entities[7].properties[2]);
/// see [Photo.date_photo]
static final date_photo =
QueryIntegerProperty<Photo>(_entities[7].properties[3]);
/// see [Photo.id_photo_mp4]
static final id_photo_mp4 =
QueryIntegerProperty<Photo>(_entities[7].properties[4]);
/// see [Photo.photo_privee]
static final photo_privee =
QueryIntegerProperty<Photo>(_entities[7].properties[5]);
/// see [Photo.photo_principale]
static final photo_principale =
QueryIntegerProperty<Photo>(_entities[7].properties[6]);
/// see [Photo.uploaded]
static final uploaded =
QueryIntegerProperty<Photo>(_entities[7].properties[7]);
/// see [Photo.image_name]
static final image_name =
QueryStringProperty<Photo>(_entities[7].properties[8]);
/// see [Photo.tags]
static final tags = QueryStringProperty<Photo>(_entities[7].properties[9]);
QueryStringProperty<VisiteTag>(_entities[5].properties[4]);
}
/// [PhotoTypology] entity fields to define ObjectBox queries.
class PhotoTypology_ {
/// see [PhotoTypology.id]
static final id =
QueryIntegerProperty<PhotoTypology>(_entities[8].properties[0]);
QueryIntegerProperty<PhotoTypology>(_entities[6].properties[0]);
/// see [PhotoTypology.id_photo_typologie]
static final id_photo_typologie =
QueryIntegerProperty<PhotoTypology>(_entities[8].properties[1]);
QueryIntegerProperty<PhotoTypology>(_entities[6].properties[1]);
/// see [PhotoTypology.libelle]
static final libelle =
QueryStringProperty<PhotoTypology>(_entities[8].properties[2]);
QueryStringProperty<PhotoTypology>(_entities[6].properties[2]);
/// see [PhotoTypology.ordre]
static final ordre =
QueryIntegerProperty<PhotoTypology>(_entities[8].properties[3]);
QueryIntegerProperty<PhotoTypology>(_entities[6].properties[3]);
}
/// [EtabCompetitor] entity fields to define ObjectBox queries.
class EtabCompetitor_ {
/// see [EtabCompetitor.id]
static final id =
QueryIntegerProperty<EtabCompetitor>(_entities[7].properties[0]);
/// see [EtabCompetitor.id_concurrence_lien]
static final id_concurrence_lien =
QueryIntegerProperty<EtabCompetitor>(_entities[7].properties[1]);
/// see [EtabCompetitor.id_etab]
static final id_etab =
QueryIntegerProperty<EtabCompetitor>(_entities[7].properties[2]);
/// see [EtabCompetitor.nom]
static final nom =
QueryStringProperty<EtabCompetitor>(_entities[7].properties[3]);
}
/// [VisitPhoto] entity fields to define ObjectBox queries.
class VisitPhoto_ {
/// see [VisitPhoto.id]
static final id =
QueryIntegerProperty<VisitPhoto>(_entities[8].properties[0]);
/// see [VisitPhoto.id_visite]
static final id_visite =
QueryIntegerProperty<VisitPhoto>(_entities[8].properties[1]);
/// see [VisitPhoto.id_photo_typologie]
static final id_photo_typologie =
QueryIntegerProperty<VisitPhoto>(_entities[8].properties[2]);
/// see [VisitPhoto.image_name]
static final image_name =
QueryStringProperty<VisitPhoto>(_entities[8].properties[3]);
/// see [VisitPhoto.date_photo]
static final date_photo =
QueryIntegerProperty<VisitPhoto>(_entities[8].properties[4]);
/// see [VisitPhoto.id_photo_mp4]
static final id_photo_mp4 =
QueryIntegerProperty<VisitPhoto>(_entities[8].properties[5]);
/// see [VisitPhoto.photo_privee]
static final photo_privee =
QueryIntegerProperty<VisitPhoto>(_entities[8].properties[6]);
/// see [VisitPhoto.photo_principale]
static final photo_principale =
QueryIntegerProperty<VisitPhoto>(_entities[8].properties[7]);
/// see [VisitPhoto.tags]
static final tags =
QueryStringProperty<VisitPhoto>(_entities[8].properties[8]);
/// see [VisitPhoto.uploaded]
static final uploaded =
QueryIntegerProperty<VisitPhoto>(_entities[8].properties[9]);
}

View File

@ -123,4 +123,11 @@ class SharedPrefs {
set photosDir(String value) {
_sharedPrefs.setString('photosDir', value);
}
/// get/set url MP4
String get urlMP4 => _sharedPrefs.getString('urlMP4') ?? "";
set urlMP4(String value) {
_sharedPrefs.setString('urlMP4', value);
}
}

View File

@ -1,9 +1,14 @@
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:mobdr/main.dart';
import 'package:mobdr/ui/account/tab_account.dart';
import 'package:mobdr/ui/home/tab_home.dart';
import 'package:mobdr/ui/shopping_cart/tab_shopping_cart.dart';
import 'package:mobdr/ui/mp4/tab_mp4.dart';
import 'package:mobdr/ui/sync/tab_sync.dart';
import 'package:flutter/material.dart';
import 'package:mobdr/config/constant.dart';
import 'package:mobdr/events.dart';
class HomePage extends StatefulWidget {
@override
@ -13,21 +18,34 @@ class HomePage extends StatefulWidget {
class _HomePageState extends State<HomePage>
with SingleTickerProviderStateMixin {
late PageController _pageController;
late StreamSubscription sub; // déclaration de la variable sub
int _currentIndex = 0;
// Pages if you click bottom navigation
final List<Widget> _contentPages = <Widget>[
TabHomePage(),
TabSyncPage(),
TabShoppingCartPage(),
TabAccountPage(),
];
List<Widget> _contentPages = [];
@override
void initState() {
_contentPages = <Widget>[
TabHomePage(),
TabSyncPage(),
TabMP4Page(),
TabAccountPage(),
];
// set initial pages for navigation to home page
_pageController = PageController(initialPage: 0);
_pageController.addListener(_handleTabSelection);
// Listen particular event
sub = eventBus.on<UrlEvent>().listen((e) {
setState(() {
_currentIndex = 2;
_pageController.jumpToPage(_currentIndex);
FocusScope.of(context).unfocus();
});
});
super.initState();
}
@ -37,6 +55,7 @@ class _HomePageState extends State<HomePage>
@override
void dispose() {
sub.cancel();
_pageController.dispose();
super.dispose();
}
@ -80,8 +99,8 @@ class _HomePageState extends State<HomePage>
icon: Icon(Icons.sync,
color: _currentIndex == 1 ? ASSENT_COLOR : CHARCOAL)),
BottomNavigationBarItem(
label: 'Cart',
icon: Icon(Icons.shopping_cart,
label: 'MP4',
icon: Icon(Icons.web,
color: _currentIndex == 2 ? PRIMARY_COLOR : CHARCOAL)),
BottomNavigationBarItem(
label: 'Account',

View File

@ -16,9 +16,7 @@ import 'package:mobdr/config/global_style.dart';
import 'package:mobdr/model/visite_model.dart';
import 'package:mobdr/ui/general/chat_us.dart';
import 'package:mobdr/ui/general/notification.dart';
import 'package:mobdr/ui/home/visit_photo_typology.dart';
import 'package:mobdr/ui/reusable/reusable_widget.dart';
import 'package:mobdr/ui/reusable/cache_image_network.dart';
class TabHomePage extends StatefulWidget {
@override
@ -44,7 +42,8 @@ class _TabHomePageState extends State<TabHomePage>
bool _isLoading = true;
String _errorMessage = '';
late List<VisiteModel> modelData = [];
late List<VisiteModel> todayVisitsData = [];
late List<VisiteModel> previousVisitsData = [];
@override
void initState() {
@ -88,179 +87,127 @@ class _TabHomePageState extends State<TabHomePage>
Widget build(BuildContext context) {
// if we used AutomaticKeepAliveClientMixin, we must call super.build(context);
super.build(context);
final double boxImageSize = (MediaQuery.of(context).size.width / 4);
final double boxImageSize = (MediaQuery.of(context).size.width / 3);
if (_isLoading) {
return Center(child: CircularProgressIndicator());
} else if (modelData.isEmpty) {
return Center(
child: Text('Aucune visite trouvée.'),
);
}
return Scaffold(
appBar: AppBar(
automaticallyImplyLeading: false,
elevation: GlobalStyle.appBarElevation,
title: Text(
AppLocalizations.of(context)!.translate('i18n_hello')! +
', ${SharedPrefs().prenom}',
style: GlobalStyle.appBarTitle,
),
backgroundColor: GlobalStyle.appBarBackgroundColor,
systemOverlayStyle: GlobalStyle.appBarSystemOverlayStyle,
actions: [
GestureDetector(
onTap: () {
Navigator.push(context,
MaterialPageRoute(builder: (context) => ChatUsPage()));
},
child: Icon(Icons.email, color: BLACK_GREY)),
IconButton(
icon: _reusableWidget.customNotifIcon(
count: 8, notifColor: BLACK_GREY),
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => NotificationPage()));
}),
],
),
body: AnimatedList(
key: _listKey,
initialItemCount: modelData.length,
physics: AlwaysScrollableScrollPhysics(),
itemBuilder: (context, index, animation) {
return _buildVisitelistCard(
modelData[index], boxImageSize, animation, index);
},
));
}
Widget _buildVisitelistCard(
VisiteModel visiteData, boxImageSize, animation, index) {
return SizeTransition(
sizeFactor: animation,
child: Container(
margin: EdgeInsets.fromLTRB(12, 6, 12, 0),
child: GestureDetector(
onTap: () {
Route route = MaterialPageRoute(
builder: (context) => VisitPhotoTypologyPage(
pp_id_distrib: visiteData.id_distrib,
pp_langage: visiteData.langage,
pp_id_visite: visiteData.id_visite,
pp_name: visiteData.name,
onRefreshVisit: (int photoCount) {
setState(() {
modelData[index].photoCount = photoCount;
});
},
));
Navigator.push(context, route);
},
child: Card(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10),
),
elevation: 2,
color: Colors.white,
child: Container(
margin: EdgeInsets.all(8),
child: Column(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
ClipRRect(
borderRadius: BorderRadius.all(Radius.circular(10)),
child: buildCacheNetworkImage(
width: boxImageSize,
height: boxImageSize,
url: visiteData.image,
),
),
SizedBox(
width: 10,
),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(height: 8),
Text(
visiteData.name,
style: GlobalStyle.productName.copyWith(
fontSize: 13,
),
maxLines: 3,
overflow: TextOverflow.ellipsis,
),
Container(
margin: EdgeInsets.only(top: 5),
child: Text(
visiteData.date,
style: GlobalStyle.productSale,
),
),
Container(height: 5),
Container(
margin: EdgeInsets.only(top: 5),
child: Text(
'${visiteData.photoCount} Photo(s)',
style: GlobalStyle.productPrice,
),
),
Container(height: 5),
Container(
margin: EdgeInsets.only(top: 5),
child: Row(
children: [
Icon(
Icons.store,
color: SOFT_GREY,
size: 20,
),
Text(
' ' + visiteData.type_visite,
style: GlobalStyle.productName.copyWith(
fontSize: 13,
),
maxLines: 1,
overflow: TextOverflow.ellipsis,
)
],
),
),
],
),
)
],
),
],
),
),
),
appBar: AppBar(
automaticallyImplyLeading: false,
elevation: GlobalStyle.appBarElevation,
title: Text(
AppLocalizations.of(context)!.translate('i18n_hello')! +
', ${SharedPrefs().prenom}',
style: GlobalStyle.appBarTitle,
),
backgroundColor: GlobalStyle.appBarBackgroundColor,
systemOverlayStyle: GlobalStyle.appBarSystemOverlayStyle,
actions: [
GestureDetector(
onTap: () {
Navigator.push(context,
MaterialPageRoute(builder: (context) => ChatUsPage()));
},
child: Icon(Icons.email, color: BLACK_GREY)),
IconButton(
icon: _reusableWidget.customNotifIcon(
count: 8, notifColor: BLACK_GREY),
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => NotificationPage()));
}),
],
),
body: ListView(
physics: AlwaysScrollableScrollPhysics(),
children: [
_buildTodayVisits(boxImageSize),
_builPreviousVisits(boxImageSize),
],
),
);
}
/// Called when a visit is refreshed with new photo count.
///
/// [index]: The index of the visit being refreshed.
/// [newPhotoCount]: The new photo count for the visit.
void onRefreshVisit(int index, int newPhotoCount) {
setState(() {
modelData[index].photoCount = newPhotoCount;
});
Widget _buildTodayVisits(boxImageSize) {
return Column(
children: [
Container(
padding: EdgeInsets.fromLTRB(16, 16, 16, 0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('Today Visits', style: GlobalStyle.horizontalTitle),
GestureDetector(
onTap: () {
//Navigator.push(context, MaterialPageRoute(builder: (context) => RestaurantListPage(title: 'Food Arround You')));
},
child: Text('View All',
style: GlobalStyle.viewAll, textAlign: TextAlign.end),
)
],
),
),
Container(
margin: EdgeInsets.only(top: 8),
height: boxImageSize * GlobalStyle.cardHeightMultiplication,
child: ListView.builder(
padding: EdgeInsets.symmetric(horizontal: 12),
scrollDirection: Axis.horizontal,
itemCount: todayVisitsData.length,
itemBuilder: (BuildContext context, int index) {
return _reusableWidget.buildHorizontalVisitListCard(
context,
todayVisitsData[index],
);
},
)),
],
);
}
Widget _builPreviousVisits(boxImageSize) {
return Column(
children: [
Container(
padding: EdgeInsets.fromLTRB(16, 16, 16, 0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('Previous Visits', style: GlobalStyle.horizontalTitle),
GestureDetector(
onTap: () {
//Navigator.push(context, MaterialPageRoute(builder: (context) => RestaurantListPage(title: 'Food Arround You')));
},
child: Text('View All',
style: GlobalStyle.viewAll, textAlign: TextAlign.end),
)
],
),
),
Container(
margin: EdgeInsets.only(top: 8),
height: boxImageSize * GlobalStyle.cardHeightMultiplication,
child: ListView.builder(
padding: EdgeInsets.symmetric(horizontal: 12),
scrollDirection: Axis.horizontal,
itemCount: previousVisitsData.length,
itemBuilder: (BuildContext context, int index) {
return _reusableWidget.buildHorizontalVisitListCard(
context, previousVisitsData[index]);
},
)),
],
);
}
/// Initializes data when the page loads.
Future<void> loadData() async {
try {
// visite model initialisation
modelData = await VisiteModel.getAllVisites();
todayVisitsData = await VisiteModel.getAllVisites();
previousVisitsData = await VisiteModel.getAllVisites();
} catch (e) {
// set errorMessage for debug
_errorMessage = 'Error loading visites : $e';

View File

@ -54,7 +54,7 @@ class _VisitPhotoTypologyListPageState
// initialize photos files list
final List<File> _visitPhotoFiles = [];
List<Photo> _visitPhotoData = [];
List<VisitPhoto> _visitPhotoData = [];
Color _color1 = Color(0xff777777);
Color _color2 = Color(0xFF515151);
@ -212,7 +212,8 @@ class _VisitPhotoTypologyListPageState
]));
}
Widget _buildPhotolistCard(Photo photoData, boxImageSize, animation, index) {
Widget _buildPhotolistCard(
VisitPhoto photoData, boxImageSize, animation, index) {
return SizeTransition(
sizeFactor: animation,
child: Container(
@ -460,14 +461,14 @@ class _VisitPhotoTypologyListPageState
///
void savePhotos() async {
if (_visitPhotoFiles.length > 0) {
final List<Photo> _listPhotos = [];
final List<VisitPhoto> _listPhotos = [];
for (var myTmpPhoto in _visitPhotoFiles) {
/// move jpg file to photo directory
final myPhoto = await moveFileFromTempToPhotosDir(myTmpPhoto);
/// to insert into database
_listPhotos.add(Photo(
_listPhotos.add(VisitPhoto(
id_visite: widget.pp_id_visite,
id_photo_typologie: widget.pp_id_typologie,
image_name: myPhoto.path.split('/').last));

View File

@ -13,8 +13,7 @@ import 'package:mobdr/ui/home/visit_photo_tag.dart';
import 'package:mobdr/db/box_photo.dart';
import 'package:mobdr/db/box_photo_typology.dart';
//TODO : faire concurrents ===
import 'package:mobdr/db/box_photo_competitor.dart';
class VisitPhotoTypologyDetailPage extends StatefulWidget {
// variables corresponding to the data parameters
@ -45,13 +44,17 @@ class _VisitPhotoTypologyDetailPageState
String _errorMessage = '';
// Typology list
late List<PhotoTypology> _typologyList = [];
late List<PhotoTypology> _typologiesList = [];
int _typologyIndex = 0;
List<String> _visibilities = [];
late List<String> tagList = [];
late Photo _photo;
late VisitPhoto _photo;
// competitors
List<EtabCompetitor> _competitorsList = [];
String _competitor = '';
@override
void initState() {
@ -106,7 +109,7 @@ class _VisitPhotoTypologyDetailPageState
// fred
Map<String, dynamic> result = {
'change_typologie': _typologyIndex !=
_typologyList.indexWhere((typology) =>
_typologiesList.indexWhere((typology) =>
typology.id_photo_typologie == widget.pp_id_typologie),
'tags': tagList.join(","),
'photo_principale': _visibilities.contains('principal') ? 1 : 0,
@ -127,6 +130,7 @@ class _VisitPhotoTypologyDetailPageState
_buildPhotoTypology(),
_buildPhotoVisibility(),
_buildPhotoTag(context),
_BuildPhotoCompetitor(),
SizedBox(height: 16)
],
),
@ -213,8 +217,8 @@ class _VisitPhotoTypologyDetailPageState
height: 16,
),
Wrap(
children: List.generate(_typologyList.length, (index) {
return radioSize(_typologyList[index].libelle, index);
children: List.generate(_typologiesList.length, (index) {
return radioSize(_typologiesList[index].libelle, index);
}),
),
],
@ -226,7 +230,7 @@ class _VisitPhotoTypologyDetailPageState
onTap: () async {
// save photo typology in the database
objectbox.putPhotoTypologie(
widget.pp_id, _typologyList[index].id_photo_typologie);
widget.pp_id, _typologiesList[index].id_photo_typologie);
setState(() {
_typologyIndex = index;
@ -379,15 +383,138 @@ class _VisitPhotoTypologyDetailPageState
);
}
Widget _BuildPhotoCompetitor() {
return Container(
margin: EdgeInsets.only(top: 12),
padding: EdgeInsets.all(16),
color: Colors.white,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('Competitor',
style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold)),
SizedBox(
height: 16,
),
GestureDetector(
behavior: HitTestBehavior.translucent,
onTap: () {
showModalBottomSheet<void>(
context: context,
builder: (BuildContext context) {
return _showCompetitionPopup();
},
);
},
child: Container(
alignment: Alignment.center,
padding: EdgeInsets.fromLTRB(12, 8, 12, 8),
margin: EdgeInsets.only(bottom: 16),
decoration: BoxDecoration(
color: Colors.white,
border: Border.all(width: 1, color: Colors.grey[300]!),
borderRadius: BorderRadius.all(
Radius.circular(10) // <--- border radius here
)),
child: _competitor == ''
? Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(
children: [
Icon(Icons.thumb_down, color: SOFT_BLUE),
SizedBox(width: 12),
Text('Choose Competitor',
style: TextStyle(
color: CHARCOAL,
fontWeight: FontWeight.bold)),
],
),
Icon(Icons.chevron_right, size: 20, color: SOFT_GREY),
],
)
: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(_competitor,
style: TextStyle(
color: CHARCOAL,
fontWeight: FontWeight.bold)),
],
),
Icon(Icons.chevron_right, size: 20, color: SOFT_GREY),
],
),
),
),
],
));
}
Widget _showCompetitionPopup() {
return StatefulBuilder(
builder: (BuildContext context, StateSetter mystate) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Center(
child: Container(
margin: EdgeInsets.only(top: 12, bottom: 12),
width: 40,
height: 4,
decoration: BoxDecoration(
color: Colors.grey[500],
borderRadius: BorderRadius.circular(10)),
),
),
Container(
margin: EdgeInsets.fromLTRB(16, 8, 16, 8),
child: Text('Choose Competitor', style: GlobalStyle.chooseCourier),
),
Flexible(
child: ListView.builder(
padding: EdgeInsets.all(16),
itemCount: _competitorsList.length,
itemBuilder: (BuildContext context, int index) {
EtabCompetitor competitor = _competitorsList[index];
return GestureDetector(
behavior: HitTestBehavior.translucent,
onTap: () {
setState(() {
_competitor = competitor.nom;
});
Navigator.pop(context);
},
child: Container(
margin: EdgeInsets.only(top: 16),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(competitor.nom, style: GlobalStyle.courierType),
],
),
),
);
},
),
),
],
);
});
}
/// Initializes data when the page loads.
Future<void> loadData(int photoId) async {
String tags = "";
try {
// photo typologies initialization
_typologyList = objectbox.getPhotoTypologiesList();
_typologiesList = objectbox.getPhotoTypologiesList();
_typologyIndex = _typologyList.indexWhere(
_typologyIndex = _typologiesList.indexWhere(
(typology) => typology.id_photo_typologie == widget.pp_id_typologie);
// get photo object
@ -400,6 +527,10 @@ class _VisitPhotoTypologyDetailPageState
// photo tag initialization
tags = _photo.tags;
tagList = tags.isEmpty ? [] : _photo.tags.split(",");
// competitor initialization
_competitorsList = objectbox.getPhotoCompetitorList();
_competitor = "";
} catch (e) {
// set errorMessage for debug
_errorMessage = 'Error loading photo: $e';

83
lib/ui/mp4/tab_mp4.dart Normal file
View File

@ -0,0 +1,83 @@
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';
import 'package:mobdr/service/shared_prefs.dart';
import 'package:mobdr/main.dart';
import 'package:mobdr/events.dart';
class TabMP4Page extends StatefulWidget {
@override
_TabMP4PageState createState() => _TabMP4PageState();
}
class _TabMP4PageState extends State<TabMP4Page>
with AutomaticKeepAliveClientMixin {
late final WebViewController controller;
late StreamSubscription sub;
int loadingPercentage = 0;
String url = SharedPrefs().urlMP4;
@override
void initState() {
super.initState();
controller = WebViewController()
..setNavigationDelegate(NavigationDelegate(
onPageStarted: (url) {
setState(() {
loadingPercentage = 0;
});
},
onProgress: (progress) {
setState(() {
loadingPercentage = progress;
});
},
onPageFinished: (url) {
setState(() {
loadingPercentage = 100;
});
},
))
..loadRequest(
Uri.parse(url),
);
sub = eventBus.on<UrlEvent>().listen((e) {
setState(() {
controller.loadRequest(
Uri.parse(e.url),
);
});
});
}
@override
void dispose() {
sub.cancel();
super.dispose();
}
@override
Widget build(BuildContext context) {
super.build(context);
return SafeArea(
child: Stack(
children: [
WebViewWidget(
controller: controller,
),
if (loadingPercentage < 100)
LinearProgressIndicator(
value: loadingPercentage / 100.0,
),
],
),
);
}
@override
bool get wantKeepAlive => true;
}

View File

@ -1,8 +1,15 @@
import 'dart:async';
import 'package:mobdr/config/constant.dart';
import 'package:flutter/material.dart';
import 'package:mobdr/main.dart';
import 'package:mobdr/events.dart';
import 'package:mobdr/config/global_style.dart';
import 'package:mobdr/config/constant.dart';
import 'package:mobdr/service/shared_prefs.dart';
import 'package:mobdr/ui/reusable/cache_image_network.dart';
//TODO Rechercher toutes les utilisations
class ReusableWidget {
PreferredSizeWidget bottomAppBar() {
return PreferredSize(
@ -224,4 +231,75 @@ class ReusableWidget {
),
);
}
Widget buildHorizontalVisitListCard(context, data) {
final double imageWidth = (MediaQuery.of(context).size.width / 2.3);
final double imageheight = (MediaQuery.of(context).size.width / 3.07);
return Container(
width: imageWidth,
child: Card(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(6),
),
elevation: 2,
color: Colors.white,
child: GestureDetector(
behavior: HitTestBehavior.translucent,
onTap: () {
//Navigator.push(context, MaterialPageRoute(builder: (context) => DetailRestaurantPage()));
},
child: Stack(
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
ClipRRect(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(10),
topRight: Radius.circular(6)),
child: buildCacheNetworkImage(
width: imageWidth,
height: imageheight,
url: data.image)),
Container(
margin: EdgeInsets.all(8),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
height: 36,
child: Text(data.name,
style: GlobalStyle.cardTitle,
maxLines: 2,
overflow: TextOverflow.ellipsis),
),
],
),
),
],
),
Positioned(
bottom: 4, //ajout de cette ligne pour placer l'icone en bas
right: 4, //ajout de cette ligne pour placer l'icone à droite
child: GestureDetector(
onTap: () {
// TODO si visite validée ce n'est pas la meme url (on il mettre date validation dans le json
SharedPrefs().urlMP4 =
'${ApiConstants.baseUrl}/MobilePortal4/index.html#ajax/visite_modification.html?visite=${data.id_visite}';
eventBus.fire(UrlEvent(SharedPrefs().urlMP4));
},
child: Image.asset(
"assets/images/logo_mp4.png",
width: 24,
height: 24,
),
),
),
],
),
),
),
);
}
}

View File

@ -1,14 +1,12 @@
/*
This is wishlist page
we used AutomaticKeepAliveClientMixin to keep the state when moving from 1 navbar to another navbar, so the page is not refresh overtime
*/
import 'package:flutter/material.dart';
import 'package:timelines/timelines.dart';
import 'dart:math';
import 'package:mobdr/config/global_style.dart';
import 'package:mobdr/ui/reusable/reusable_widget.dart';
import 'package:mobdr/network/api_provider.dart';
import 'package:flutter/material.dart';
import 'package:timelines/timelines.dart';
import 'dart:math';
import 'package:mobdr/main.dart';
import 'package:mobdr/ui/home/tab_home.dart';
const completeColor = Color(0xff5e6172);
const inProgressColor = Color(0xff5ec792);
@ -208,27 +206,37 @@ class _TabSyncPageState extends State<TabSyncPage>
floatingActionButton: FloatingActionButton(
child: Icon(Icons.chevron_right),
onPressed: () async {
///FRED
var apiResponseEtabs = await _apiProvider.SyncEtablissements();
var apiResponseVisites = await _apiProvider.SyncVisites();
var apiResponsePhotos = await _apiProvider.SyncPhotos();
var futures = [
_apiProvider.SyncEtablissements(),
_apiProvider.SyncVisites(),
_apiProvider.SyncPhotos(),
];
if (apiResponseEtabs == 'OK') {
objectbox.etabBox.removeAll();
objectbox.etabCompetitorBox.removeAll();
objectbox.visitBox.removeAll();
objectbox.visitTagBox.removeAll();
objectbox.visitPhotoBox.removeAll();
objectbox.PhotoTypologyBox.removeAll();
var results = await Future.wait(futures);
if (results[0] == 'OK') {
print("SyncEtablissements OK");
} else {
print("SyncEtablissements Error:" + apiResponseEtabs);
print("SyncEtablissements Error:" + results[0]);
}
if (apiResponseVisites == 'OK') {
if (results[1] == 'OK') {
print("SyncVisites OK");
} else {
print("SyncVisites Error:" + apiResponseVisites);
print("SyncVisites Error:" + results[1]);
}
if (apiResponsePhotos == 'OK') {
if (results[0] == 'OK') {
print("SyncPhotos OK");
} else {
print("SyncPhotos Error:" + apiResponsePhotos);
print("SyncPhotos Error:" + results[0]);
}
///

View File

@ -321,6 +321,22 @@ packages:
url: "https://pub.dev"
source: hosted
version: "5.1.1"
equatable:
dependency: transitive
description:
name: equatable
sha256: c2b87cb7756efdf69892005af546c56c0b5037f54d2a88269b4f347a505e3ca2
url: "https://pub.dev"
source: hosted
version: "2.0.5"
event_bus_plus:
dependency: "direct main"
description:
name: event_bus_plus
sha256: cbd27754d4c567f78fc88e7875e26c31d866d919f220523f34b29bf008f8fb1a
url: "https://pub.dev"
source: hosted
version: "0.6.1"
fake_async:
dependency: transitive
description:
@ -573,6 +589,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "4.8.0"
logger:
dependency: transitive
description:
name: logger
sha256: db2ff852ed77090ba9f62d3611e4208a3d11dfa35991a81ae724c113fcb3e3f7
url: "https://pub.dev"
source: hosted
version: "1.3.0"
logging:
dependency: transitive
description:
@ -1186,6 +1210,38 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.3.0"
webview_flutter:
dependency: "direct main"
description:
name: webview_flutter
sha256: "1a37bdbaaf5fbe09ad8579ab09ecfd473284ce482f900b5aea27cf834386a567"
url: "https://pub.dev"
source: hosted
version: "4.2.0"
webview_flutter_android:
dependency: transitive
description:
name: webview_flutter_android
sha256: d6cf18cd6c809c5a9294cd99707a21986aac4e08c87e1916ce2590315fb55d3a
url: "https://pub.dev"
source: hosted
version: "3.6.2"
webview_flutter_platform_interface:
dependency: transitive
description:
name: webview_flutter_platform_interface
sha256: "78715dc442b7849dbde74e92bb67de1cecf5addf95531c5fb474e72f5fe9a507"
url: "https://pub.dev"
source: hosted
version: "2.3.0"
webview_flutter_wkwebview:
dependency: transitive
description:
name: webview_flutter_wkwebview
sha256: c94d242d8cbe1012c06ba7ac790c46d6e6b68723b7d34f8c74ed19f68d166f49
url: "https://pub.dev"
source: hosted
version: "3.4.0"
win32:
dependency: transitive
description:

View File

@ -78,9 +78,15 @@ dependencies:
universal_io: 2.2.0
xml: ^6.2.2
# https://pub.dev/packages/device_info_plus/install
# https://pub.dev/packages/device_info_plus/
device_info_plus: ^8.2.0
# https://pub.dev/packages/webview_flutter/
webview_flutter: ^4.2.0
# https://pub.dev/packages/event_bus_plus/
event_bus_plus: ^0.6.1
dev_dependencies:
flutter_test:
sdk: flutter
@ -147,6 +153,7 @@ flutter:
- assets/images/mastercard.png
- assets/images/logo.png
- assets/images/logo_dark.png
- assets/images/logo_mp4.png
- assets/images/logo_horizontal.png
- assets/images/onboarding/search_product.gif
- assets/images/process_timeline/status1.png