feat: eventbus
parent
210f50bb22
commit
f940638264
Binary file not shown.
|
After Width: | Height: | Size: 1.1 KiB |
|
|
@ -32,6 +32,8 @@ PODS:
|
||||||
- Toast (4.0.0)
|
- Toast (4.0.0)
|
||||||
- wakelock (0.0.1):
|
- wakelock (0.0.1):
|
||||||
- Flutter
|
- Flutter
|
||||||
|
- webview_flutter_wkwebview (0.0.1):
|
||||||
|
- Flutter
|
||||||
|
|
||||||
DEPENDENCIES:
|
DEPENDENCIES:
|
||||||
- camera_avfoundation (from `.symlinks/plugins/camera_avfoundation/ios`)
|
- camera_avfoundation (from `.symlinks/plugins/camera_avfoundation/ios`)
|
||||||
|
|
@ -46,6 +48,7 @@ DEPENDENCIES:
|
||||||
- shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/ios`)
|
- shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/ios`)
|
||||||
- sqflite (from `.symlinks/plugins/sqflite/ios`)
|
- sqflite (from `.symlinks/plugins/sqflite/ios`)
|
||||||
- wakelock (from `.symlinks/plugins/wakelock/ios`)
|
- wakelock (from `.symlinks/plugins/wakelock/ios`)
|
||||||
|
- webview_flutter_wkwebview (from `.symlinks/plugins/webview_flutter_wkwebview/ios`)
|
||||||
|
|
||||||
SPEC REPOS:
|
SPEC REPOS:
|
||||||
trunk:
|
trunk:
|
||||||
|
|
@ -78,6 +81,8 @@ EXTERNAL SOURCES:
|
||||||
:path: ".symlinks/plugins/sqflite/ios"
|
:path: ".symlinks/plugins/sqflite/ios"
|
||||||
wakelock:
|
wakelock:
|
||||||
:path: ".symlinks/plugins/wakelock/ios"
|
:path: ".symlinks/plugins/wakelock/ios"
|
||||||
|
webview_flutter_wkwebview:
|
||||||
|
:path: ".symlinks/plugins/webview_flutter_wkwebview/ios"
|
||||||
|
|
||||||
SPEC CHECKSUMS:
|
SPEC CHECKSUMS:
|
||||||
camera_avfoundation: 3125e8cd1a4387f6f31c6c63abb8a55892a9eeeb
|
camera_avfoundation: 3125e8cd1a4387f6f31c6c63abb8a55892a9eeeb
|
||||||
|
|
@ -95,6 +100,7 @@ SPEC CHECKSUMS:
|
||||||
sqflite: 6d358c025f5b867b29ed92fc697fd34924e11904
|
sqflite: 6d358c025f5b867b29ed92fc697fd34924e11904
|
||||||
Toast: 91b396c56ee72a5790816f40d3a94dd357abc196
|
Toast: 91b396c56ee72a5790816f40d3a94dd357abc196
|
||||||
wakelock: d0fc7c864128eac40eba1617cb5264d9c940b46f
|
wakelock: d0fc7c864128eac40eba1617cb5264d9c940b46f
|
||||||
|
webview_flutter_wkwebview: 2e2d318f21a5e036e2c3f26171342e95908bd60a
|
||||||
|
|
||||||
PODFILE CHECKSUM: b634fd49380cdd3837626153fb977533b1916433
|
PODFILE CHECKSUM: b634fd49380cdd3837626153fb977533b1916433
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,8 @@ import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
|
|
||||||
class GlobalStyle {
|
class GlobalStyle {
|
||||||
|
static const double cardHeightMultiplication = 1.70; // higher is more longer
|
||||||
|
|
||||||
// appBar
|
// appBar
|
||||||
static const Color appBarIconThemeColor = Colors.black;
|
static const Color appBarIconThemeColor = Colors.black;
|
||||||
static const double appBarElevation = 0;
|
static const double appBarElevation = 0;
|
||||||
|
|
@ -171,4 +173,15 @@ class GlobalStyle {
|
||||||
|
|
||||||
static const TextStyle detailFoodSubOptions =
|
static const TextStyle detailFoodSubOptions =
|
||||||
TextStyle(color: BLACK77, fontSize: 12);
|
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,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,12 @@
|
||||||
import 'package:objectbox/objectbox.dart';
|
import 'package:objectbox/objectbox.dart';
|
||||||
import 'package:intl/intl.dart';
|
import 'package:intl/intl.dart';
|
||||||
|
|
||||||
import 'package:mobdr/objectbox.g.dart';
|
|
||||||
import 'package:mobdr/service/shared_prefs.dart';
|
import 'package:mobdr/service/shared_prefs.dart';
|
||||||
|
|
||||||
// ignore_for_file: public_member_api_docs
|
// ignore_for_file: public_member_api_docs
|
||||||
|
|
||||||
@Entity()
|
@Entity()
|
||||||
class Photo {
|
class VisitPhoto {
|
||||||
// specify the id
|
// specify the id
|
||||||
@Id()
|
@Id()
|
||||||
int id = 0;
|
int id = 0;
|
||||||
|
|
@ -22,7 +21,7 @@ class Photo {
|
||||||
String tags;
|
String tags;
|
||||||
int uploaded;
|
int uploaded;
|
||||||
|
|
||||||
Photo(
|
VisitPhoto(
|
||||||
{this.id = 0,
|
{this.id = 0,
|
||||||
required this.id_visite,
|
required this.id_visite,
|
||||||
required this.id_photo_typologie,
|
required this.id_photo_typologie,
|
||||||
|
|
@ -46,7 +45,7 @@ class Photo {
|
||||||
|
|
||||||
String get dateFormat => DateFormat('dd.MM.yyyy hh:mm:ss').format(date_photo);
|
String get dateFormat => DateFormat('dd.MM.yyyy hh:mm:ss').format(date_photo);
|
||||||
|
|
||||||
Photo copyWith({
|
VisitPhoto copyWith({
|
||||||
int? id,
|
int? id,
|
||||||
int? id_visite,
|
int? id_visite,
|
||||||
int? id_photo_typologie,
|
int? id_photo_typologie,
|
||||||
|
|
@ -59,7 +58,7 @@ class Photo {
|
||||||
String? tags,
|
String? tags,
|
||||||
int? uploaded,
|
int? uploaded,
|
||||||
}) {
|
}) {
|
||||||
return Photo(
|
return VisitPhoto(
|
||||||
id: id ?? this.id,
|
id: id ?? this.id,
|
||||||
id_visite: id_visite ?? this.id_visite,
|
id_visite: id_visite ?? this.id_visite,
|
||||||
id_photo_typologie: id_photo_typologie ?? this.id_photo_typologie,
|
id_photo_typologie: id_photo_typologie ?? this.id_photo_typologie,
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ import 'package:mobdr/objectbox.g.dart';
|
||||||
// ignore_for_file: public_member_api_docs
|
// ignore_for_file: public_member_api_docs
|
||||||
|
|
||||||
@Entity()
|
@Entity()
|
||||||
class Concurrent {
|
class EtabCompetitor {
|
||||||
// specify the id
|
// specify the id
|
||||||
@Id()
|
@Id()
|
||||||
int id = 0;
|
int id = 0;
|
||||||
|
|
@ -13,13 +13,13 @@ class Concurrent {
|
||||||
int id_etab;
|
int id_etab;
|
||||||
String nom;
|
String nom;
|
||||||
|
|
||||||
Concurrent(
|
EtabCompetitor(
|
||||||
{this.id = 0,
|
{this.id = 0,
|
||||||
required this.id_concurrence_lien,
|
required this.id_concurrence_lien,
|
||||||
required this.id_etab,
|
required this.id_etab,
|
||||||
required this.nom});
|
required this.nom});
|
||||||
|
|
||||||
Concurrent.fromJson(Map<String, dynamic> json)
|
EtabCompetitor.fromJson(Map<String, dynamic> json)
|
||||||
: id_concurrence_lien = json['id_concurrence_lien'],
|
: id_concurrence_lien = json['id_concurrence_lien'],
|
||||||
id_etab = json['id_etab'],
|
id_etab = json['id_etab'],
|
||||||
nom = json['nom'];
|
nom = json['nom'];
|
||||||
|
|
@ -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];
|
||||||
|
}
|
||||||
|
|
@ -11,11 +11,14 @@ import 'package:flutter/services.dart';
|
||||||
|
|
||||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
import 'package:flutter_localizations/flutter_localizations.dart';
|
import 'package:flutter_localizations/flutter_localizations.dart';
|
||||||
|
|
||||||
import 'package:path_provider/path_provider.dart';
|
import 'package:path_provider/path_provider.dart';
|
||||||
|
|
||||||
import 'objectbox.dart';
|
import 'objectbox.dart';
|
||||||
import 'package:wakelock/wakelock.dart';
|
import 'package:wakelock/wakelock.dart';
|
||||||
|
|
||||||
|
import 'package:event_bus_plus/event_bus_plus.dart';
|
||||||
|
|
||||||
import 'package:mobdr/config/constant.dart';
|
import 'package:mobdr/config/constant.dart';
|
||||||
|
|
||||||
import 'package:mobdr/cubit/language/language_cubit.dart';
|
import 'package:mobdr/cubit/language/language_cubit.dart';
|
||||||
|
|
@ -29,6 +32,8 @@ late ObjectBox objectbox;
|
||||||
|
|
||||||
final DeviceInfoPlugin deviceInfoPlugin = DeviceInfoPlugin();
|
final DeviceInfoPlugin deviceInfoPlugin = DeviceInfoPlugin();
|
||||||
|
|
||||||
|
final EventBus eventBus = EventBus();
|
||||||
|
|
||||||
Future<void> main() async {
|
Future<void> main() async {
|
||||||
// This is required so ObjectBox can get the application directory
|
// This is required so ObjectBox can get the application directory
|
||||||
// to store the database in.
|
// to store the database in.
|
||||||
|
|
@ -47,6 +52,10 @@ Future<void> main() async {
|
||||||
WidgetsFlutterBinding.ensureInitialized();
|
WidgetsFlutterBinding.ensureInitialized();
|
||||||
Wakelock.enable();
|
Wakelock.enable();
|
||||||
|
|
||||||
|
eventBus.on().listen((event) {
|
||||||
|
print('${DateTime.now()} Event: $event');
|
||||||
|
});
|
||||||
|
|
||||||
runApp(MyApp());
|
runApp(MyApp());
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
@ -68,6 +77,10 @@ class MyApp extends StatelessWidget {
|
||||||
initDirectories();
|
initDirectories();
|
||||||
initPlatformState();
|
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
|
// Initialize all bloc provider used on this entire application here
|
||||||
return MultiBlocProvider(
|
return MultiBlocProvider(
|
||||||
providers: [
|
providers: [
|
||||||
|
|
|
||||||
|
|
@ -32,7 +32,7 @@ class VisiteModel {
|
||||||
id_distrib: visite.id_distrib_visite,
|
id_distrib: visite.id_distrib_visite,
|
||||||
id: visite.id,
|
id: visite.id,
|
||||||
id_visite: visite.id_visite,
|
id_visite: visite.id_visite,
|
||||||
name: visite.title,
|
name: visite.id_etab.toString() + ' - ' + visite.title,
|
||||||
photoCount: objectbox.getVisitPhotoCount(visite.id_visite),
|
photoCount: objectbox.getVisitPhotoCount(visite.id_visite),
|
||||||
date: visite.date_visite.toString(),
|
date: visite.date_visite.toString(),
|
||||||
image: visite.url_photo_principale,
|
image: visite.url_photo_principale,
|
||||||
|
|
|
||||||
|
|
@ -12,8 +12,6 @@ import 'package:crypto/crypto.dart';
|
||||||
|
|
||||||
class ApiProvider {
|
class ApiProvider {
|
||||||
Dio dio = Dio();
|
Dio dio = Dio();
|
||||||
late Response response;
|
|
||||||
late Response response2;
|
|
||||||
String connErr = 'Please check your internet connection and try again';
|
String connErr = 'Please check your internet connection and try again';
|
||||||
|
|
||||||
Future<Response> getCrud(url, body) async {
|
Future<Response> getCrud(url, body) async {
|
||||||
|
|
@ -137,6 +135,7 @@ class ApiProvider {
|
||||||
"fingerprint":
|
"fingerprint":
|
||||||
"aa" // TODO: on peut mettre un fingerprint sur la version ou sur l'heure
|
"aa" // TODO: on peut mettre un fingerprint sur la version ou sur l'heure
|
||||||
};
|
};
|
||||||
|
Response response;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
response = await getCrud(
|
response = await getCrud(
|
||||||
|
|
@ -204,6 +203,9 @@ class ApiProvider {
|
||||||
|
|
||||||
/// Synchronize "stores & competing stores"
|
/// Synchronize "stores & competing stores"
|
||||||
Future<String> SyncEtablissements() async {
|
Future<String> SyncEtablissements() async {
|
||||||
|
Response response;
|
||||||
|
Response response2;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
/// get "Etablissement" list
|
/// get "Etablissement" list
|
||||||
response = await getCrud(
|
response = await getCrud(
|
||||||
|
|
@ -230,7 +232,7 @@ class ApiProvider {
|
||||||
|
|
||||||
if (response2.statusCode == STATUS_OK) {
|
if (response2.statusCode == STATUS_OK) {
|
||||||
/// fill box "concurrence"
|
/// fill box "concurrence"
|
||||||
objectbox.addConcurrents(response2.data['concurrents']);
|
objectbox.addPhotoCompetitors(response2.data['concurrents']);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// all ok
|
/// all ok
|
||||||
|
|
@ -247,6 +249,9 @@ class ApiProvider {
|
||||||
|
|
||||||
/// Synchronize "visites"
|
/// Synchronize "visites"
|
||||||
Future<String> SyncVisites() async {
|
Future<String> SyncVisites() async {
|
||||||
|
Response response;
|
||||||
|
Response response2;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
var body = null;
|
var body = null;
|
||||||
|
|
||||||
|
|
@ -275,7 +280,7 @@ class ApiProvider {
|
||||||
|
|
||||||
if (response2.statusCode == STATUS_OK) {
|
if (response2.statusCode == STATUS_OK) {
|
||||||
// remove all objects
|
// remove all objects
|
||||||
objectbox.visiteTagBox.removeAll();
|
objectbox.visitTagBox.removeAll();
|
||||||
|
|
||||||
/// fill box "visiteTag"
|
/// fill box "visiteTag"
|
||||||
objectbox.addVisiteTags(response2.data['tags']);
|
objectbox.addVisiteTags(response2.data['tags']);
|
||||||
|
|
@ -295,6 +300,8 @@ class ApiProvider {
|
||||||
|
|
||||||
/// Synchronize "Photos"
|
/// Synchronize "Photos"
|
||||||
Future<String> SyncPhotos() async {
|
Future<String> SyncPhotos() async {
|
||||||
|
Response response;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
/// get "Photo typologies"
|
/// get "Photo typologies"
|
||||||
response = await getCrud(
|
response = await getCrud(
|
||||||
|
|
@ -306,7 +313,7 @@ class ApiProvider {
|
||||||
|
|
||||||
if (response.statusCode == STATUS_OK) {
|
if (response.statusCode == STATUS_OK) {
|
||||||
// remove all objects
|
// remove all objects
|
||||||
objectbox.photoTypologyBox.removeAll();
|
objectbox.PhotoTypologyBox.removeAll();
|
||||||
|
|
||||||
/// fill box "Photo typologies"
|
/// fill box "Photo typologies"
|
||||||
objectbox.addPhotoTypologies(response.data['typologies']);
|
objectbox.addPhotoTypologies(response.data['typologies']);
|
||||||
|
|
@ -324,6 +331,8 @@ class ApiProvider {
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<String> getExample(apiToken) async {
|
Future<String> getExample(apiToken) async {
|
||||||
|
Response response;
|
||||||
|
|
||||||
response =
|
response =
|
||||||
await getConnect(ApiConstants.baseUrl + '/example/getData', apiToken);
|
await getConnect(ApiConstants.baseUrl + '/example/getData', apiToken);
|
||||||
print('res : ' + response.toString());
|
print('res : ' + response.toString());
|
||||||
|
|
@ -331,6 +340,8 @@ class ApiProvider {
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<String> postExample(String id, apiToken) async {
|
Future<String> postExample(String id, apiToken) async {
|
||||||
|
Response response;
|
||||||
|
|
||||||
var postData = {'id': id};
|
var postData = {'id': id};
|
||||||
response = await postConnect(
|
response = await postConnect(
|
||||||
ApiConstants.baseUrl + '/example/postData', postData, apiToken);
|
ApiConstants.baseUrl + '/example/postData', postData, apiToken);
|
||||||
|
|
@ -367,6 +378,8 @@ class ApiProvider {
|
||||||
'student_gender': studentGender,
|
'student_gender': studentGender,
|
||||||
'student_address': studentAddress,
|
'student_address': studentAddress,
|
||||||
};
|
};
|
||||||
|
Response response;
|
||||||
|
|
||||||
response = await postConnect(
|
response = await postConnect(
|
||||||
ApiConstants.baseUrl + '/student/addStudent', postData, apiToken);
|
ApiConstants.baseUrl + '/student/addStudent', postData, apiToken);
|
||||||
if (response.data['status'] == STATUS_OK) {
|
if (response.data['status'] == STATUS_OK) {
|
||||||
|
|
@ -395,6 +408,8 @@ class ApiProvider {
|
||||||
'student_gender': studentGender,
|
'student_gender': studentGender,
|
||||||
'student_address': studentAddress,
|
'student_address': studentAddress,
|
||||||
};
|
};
|
||||||
|
Response response;
|
||||||
|
|
||||||
response = await postConnect(
|
response = await postConnect(
|
||||||
ApiConstants.baseUrl + '/student/editStudent', postData, apiToken);
|
ApiConstants.baseUrl + '/student/editStudent', postData, apiToken);
|
||||||
if (response.data['status'] == STATUS_OK) {
|
if (response.data['status'] == STATUS_OK) {
|
||||||
|
|
@ -410,6 +425,7 @@ class ApiProvider {
|
||||||
'session_id': sessionId,
|
'session_id': sessionId,
|
||||||
'student_id': studentId,
|
'student_id': studentId,
|
||||||
};
|
};
|
||||||
|
Response response;
|
||||||
response = await postConnect(
|
response = await postConnect(
|
||||||
ApiConstants.baseUrl + '/student/deleteStudent', postData, apiToken);
|
ApiConstants.baseUrl + '/student/deleteStudent', postData, apiToken);
|
||||||
if (response.data['status'] == STATUS_OK) {
|
if (response.data['status'] == STATUS_OK) {
|
||||||
|
|
|
||||||
|
|
@ -164,35 +164,6 @@
|
||||||
],
|
],
|
||||||
"relations": []
|
"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",
|
"id": "7:8290500625256822711",
|
||||||
"lastPropertyId": "14:5831680857919010234",
|
"lastPropertyId": "14:5831680857919010234",
|
||||||
|
|
@ -291,65 +262,6 @@
|
||||||
],
|
],
|
||||||
"relations": []
|
"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",
|
"id": "10:2779194860339140505",
|
||||||
"lastPropertyId": "4:5588276375011055284",
|
"lastPropertyId": "4:5588276375011055284",
|
||||||
|
|
@ -378,16 +290,107 @@
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"relations": []
|
"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",
|
"lastIndexId": "1:7907819717055295102",
|
||||||
"lastRelationId": "0:0",
|
"lastRelationId": "0:0",
|
||||||
"lastSequenceId": "0:0",
|
"lastSequenceId": "0:0",
|
||||||
"modelVersion": 5,
|
"modelVersion": 5,
|
||||||
"modelVersionParserMinimum": 5,
|
"modelVersionParserMinimum": 5,
|
||||||
"retiredEntityUids": [
|
"retiredEntityUids": [
|
||||||
7401686910042688313
|
7401686910042688313,
|
||||||
|
1805690312272107423,
|
||||||
|
6788844671665652158,
|
||||||
|
2910300629980903548
|
||||||
],
|
],
|
||||||
"retiredIndexUids": [
|
"retiredIndexUids": [
|
||||||
7907819717055295102
|
7907819717055295102
|
||||||
|
|
@ -405,7 +408,25 @@
|
||||||
2141346538986140281,
|
2141346538986140281,
|
||||||
7877546811840884522,
|
7877546811840884522,
|
||||||
3784190804330297742,
|
3784190804330297742,
|
||||||
1865824860595482227
|
1865824860595482227,
|
||||||
|
2904282721431628480,
|
||||||
|
6658127353491083480,
|
||||||
|
2563846535684494722,
|
||||||
|
7447139022474751374,
|
||||||
|
2982072387377736709,
|
||||||
|
1374846727562410311,
|
||||||
|
374091471912277059,
|
||||||
|
234947897575384032,
|
||||||
|
3602779209059248697,
|
||||||
|
5116665990846416843,
|
||||||
|
1716626028602523655,
|
||||||
|
4568092734700892012,
|
||||||
|
539065583624712715,
|
||||||
|
7248999677905103482,
|
||||||
|
6313899520679425027,
|
||||||
|
4752064214129719799,
|
||||||
|
319372524127232986,
|
||||||
|
783761731187897018
|
||||||
],
|
],
|
||||||
"retiredRelationUids": [],
|
"retiredRelationUids": [],
|
||||||
"version": 1
|
"version": 1
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
import 'package:mobdr/db/box_user.dart';
|
import 'package:mobdr/db/box_user.dart';
|
||||||
import 'package:mobdr/db/box_log.dart';
|
import 'package:mobdr/db/box_log.dart';
|
||||||
import 'package:mobdr/db/box_etab.dart';
|
import 'package:mobdr/db/box_etab.dart';
|
||||||
import 'package:mobdr/db/box_concurrent.dart';
|
import 'package:mobdr/db/box_photo_competitor.dart';
|
||||||
import 'package:mobdr/db/box_visite.dart';
|
import 'package:mobdr/db/box_visit.dart';
|
||||||
import 'package:mobdr/db/box_visite_tag.dart';
|
import 'package:mobdr/db/box_visit_tag.dart';
|
||||||
import 'package:mobdr/db/box_photo.dart';
|
import 'package:mobdr/db/box_photo.dart';
|
||||||
import 'package:mobdr/db/box_photo_typology.dart';
|
import 'package:mobdr/db/box_photo_typology.dart';
|
||||||
|
|
||||||
|
|
@ -20,26 +20,26 @@ class ObjectBox {
|
||||||
/// A Box of notes.
|
/// A Box of notes.
|
||||||
late final Box<Note> noteBox;
|
late final Box<Note> noteBox;
|
||||||
|
|
||||||
/// A Box of "user"
|
/// A Box of user
|
||||||
late final Box<User> userBox;
|
late final Box<User> userBox;
|
||||||
|
|
||||||
/// A Box of "Etablissement"
|
/// A Box of etablishment
|
||||||
late final Box<Etab> etabBox;
|
late final Box<Etab> etabBox;
|
||||||
|
|
||||||
/// A Box of "Concurrent"
|
/// A Box of etablishment competitor
|
||||||
late final Box<Concurrent> concurrentBox;
|
late final Box<EtabCompetitor> etabCompetitorBox;
|
||||||
|
|
||||||
/// A Box of "Visite"
|
/// A Box of visit
|
||||||
late final Box<Visite> visiteBox;
|
late final Box<Visite> visitBox;
|
||||||
|
|
||||||
/// A Box of "Visite tag"
|
/// A Box for all visit tag by distributor / language
|
||||||
late final Box<VisiteTag> visiteTagBox;
|
late final Box<VisiteTag> visitTagBox;
|
||||||
|
|
||||||
/// A Box of "Photo"
|
/// A Box of visit Photo
|
||||||
late final Box<Photo> photoBox;
|
late final Box<VisitPhoto> visitPhotoBox;
|
||||||
|
|
||||||
/// A Box of "Photo typology"
|
/// A Box of photo typology
|
||||||
late final Box<PhotoTypology> photoTypologyBox;
|
late final Box<PhotoTypology> PhotoTypologyBox;
|
||||||
|
|
||||||
/// A Box of log.
|
/// A Box of log.
|
||||||
late final Box<Log> logBox;
|
late final Box<Log> logBox;
|
||||||
|
|
@ -48,11 +48,11 @@ class ObjectBox {
|
||||||
noteBox = Box<Note>(store);
|
noteBox = Box<Note>(store);
|
||||||
userBox = Box<User>(store);
|
userBox = Box<User>(store);
|
||||||
etabBox = Box<Etab>(store);
|
etabBox = Box<Etab>(store);
|
||||||
concurrentBox = Box<Concurrent>(store);
|
etabCompetitorBox = Box<EtabCompetitor>(store);
|
||||||
visiteBox = Box<Visite>(store);
|
visitBox = Box<Visite>(store);
|
||||||
visiteTagBox = Box<VisiteTag>(store);
|
visitTagBox = Box<VisiteTag>(store);
|
||||||
photoBox = Box<Photo>(store);
|
PhotoTypologyBox = Box<PhotoTypology>(store);
|
||||||
photoTypologyBox = Box<PhotoTypology>(store);
|
visitPhotoBox = Box<VisitPhoto>(store);
|
||||||
logBox = Box<Log>(store);
|
logBox = Box<Log>(store);
|
||||||
|
|
||||||
// Add some demo data if the box is empty.
|
// Add some demo data if the box is empty.
|
||||||
|
|
@ -61,13 +61,13 @@ class ObjectBox {
|
||||||
}
|
}
|
||||||
|
|
||||||
userBox.removeAll();
|
userBox.removeAll();
|
||||||
etabBox.removeAll();
|
|
||||||
concurrentBox.removeAll();
|
|
||||||
|
|
||||||
//visiteBox.removeAll();
|
//etabBox.removeAll();
|
||||||
//visiteTagBox.removeAll();
|
//etabCompetitorBox.removeAll();
|
||||||
//photoBox.removeAll();
|
//visitBox.removeAll();
|
||||||
//photoTypologyBox.removeAll();
|
//visitTagBox.removeAll();
|
||||||
|
//visitPhotoBox.removeAll();
|
||||||
|
//PhotoTypologyBox.removeAll();
|
||||||
|
|
||||||
// Add some demo data if the box is empty.
|
// Add some demo data if the box is empty.
|
||||||
if (userBox.isEmpty()) {
|
if (userBox.isEmpty()) {
|
||||||
|
|
@ -200,39 +200,52 @@ class ObjectBox {
|
||||||
return etabBox.count();
|
return etabBox.count();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// CONCURRENT ---------------------------------------------------------------
|
/// PHOTO COMPETITOR ---------------------------------------------------------------
|
||||||
///
|
///
|
||||||
|
|
||||||
// A function that converts a response body list into a List<Concurrent>.
|
// A function that converts a response body list into a List<Competitor>.
|
||||||
List<Concurrent> parseConcurrents(List responseDataList) {
|
List<EtabCompetitor> parsePhotoCompetitor(List responseDataList) {
|
||||||
final parsed = responseDataList.cast<Map<String, dynamic>>();
|
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) =>
|
Future<void> addPhotoCompetitors(List<dynamic> _listPhotoCompetitors) =>
|
||||||
store.runInTransactionAsync(TxMode.write, _addConcurrentsInTx,
|
store.runInTransactionAsync(TxMode.write, _addPhotoCompetitorsInTx,
|
||||||
parseConcurrents(_listConcurrents));
|
parsePhotoCompetitor(_listPhotoCompetitors));
|
||||||
|
|
||||||
static void _addConcurrentsInTx(Store store, _Concurrents) {
|
static void _addPhotoCompetitorsInTx(Store store, _Competitors) {
|
||||||
store.box<Concurrent>().putMany(_Concurrents);
|
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(
|
store.runInTransactionAsync(
|
||||||
TxMode.write,
|
TxMode.write,
|
||||||
_addConcurrentInTx,
|
_addPhotoCompetitorInTx,
|
||||||
Concurrent(
|
EtabCompetitor(
|
||||||
id_concurrence_lien: _id_concurrence_lien,
|
id_concurrence_lien: _id_concurrence_lien,
|
||||||
id_etab: _id_etab,
|
id_etab: _id_etab,
|
||||||
nom: _nom,
|
nom: _nom,
|
||||||
));
|
));
|
||||||
|
|
||||||
static void _addConcurrentInTx(Store store, _Concurrent) {
|
static void _addPhotoCompetitorInTx(Store store, _Competitor) {
|
||||||
store.box<Concurrent>().put(_Concurrent);
|
store.box<EtabCompetitor>().put(_Competitor);
|
||||||
}
|
}
|
||||||
|
|
||||||
int getConcurrentCount() {
|
List<EtabCompetitor> getPhotoCompetitorList() {
|
||||||
return concurrentBox.count();
|
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 ------------------------------------------------------------------
|
/// VISITE ------------------------------------------------------------------
|
||||||
|
|
@ -242,7 +255,7 @@ class ObjectBox {
|
||||||
// Query for all visites, sorted by their date.
|
// Query for all visites, sorted by their date.
|
||||||
// https://docs.objectbox.io/queries
|
// https://docs.objectbox.io/queries
|
||||||
final builder =
|
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,
|
// Build and watch the query,
|
||||||
// set triggerImmediately to emit the query immediately on listen.
|
// set triggerImmediately to emit the query immediately on listen.
|
||||||
return builder
|
return builder
|
||||||
|
|
@ -253,7 +266,7 @@ class ObjectBox {
|
||||||
|
|
||||||
List<Visite> getAllVisites() {
|
List<Visite> getAllVisites() {
|
||||||
// Query for all visites, sorted by their date.
|
// Query for all visites, sorted by their date.
|
||||||
final builder = visiteBox
|
final builder = visitBox
|
||||||
.query()
|
.query()
|
||||||
.order(Visite_.date_visite, flags: Order.descending)
|
.order(Visite_.date_visite, flags: Order.descending)
|
||||||
.build();
|
.build();
|
||||||
|
|
@ -309,7 +322,7 @@ class ObjectBox {
|
||||||
}
|
}
|
||||||
|
|
||||||
int getVisiteCount() {
|
int getVisiteCount() {
|
||||||
return visiteBox.count();
|
return visitBox.count();
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO changer en PHOTO TAG / mettre dans l'ordre CRUD
|
//TODO changer en PHOTO TAG / mettre dans l'ordre CRUD
|
||||||
|
|
@ -352,7 +365,7 @@ class ObjectBox {
|
||||||
}
|
}
|
||||||
|
|
||||||
List<String> getVisiteTagsLabels(int distribId, String langage) {
|
List<String> getVisiteTagsLabels(int distribId, String langage) {
|
||||||
final query = visiteTagBox
|
final query = visitTagBox
|
||||||
.query(VisiteTag_.id_distrib.equals(distribId) &
|
.query(VisiteTag_.id_distrib.equals(distribId) &
|
||||||
VisiteTag_.langage.equals(langage))
|
VisiteTag_.langage.equals(langage))
|
||||||
//.order(VisiteTag_.libelle)
|
//.order(VisiteTag_.libelle)
|
||||||
|
|
@ -364,15 +377,15 @@ class ObjectBox {
|
||||||
}
|
}
|
||||||
|
|
||||||
int getVisiteTagCount() {
|
int getVisiteTagCount() {
|
||||||
return visiteTagBox.count();
|
return visitTagBox.count();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// PHOTO --------------------------------------------------------------------
|
/// PHOTO --------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
///
|
///
|
||||||
|
|
||||||
Future<List<Photo>> addPhotos(List<Photo> photos) async {
|
Future<List<VisitPhoto>> addPhotos(List<VisitPhoto> photos) async {
|
||||||
final addedPhotos = await photoBox.putAndGetManyAsync(photos);
|
final addedPhotos = await visitPhotoBox.putAndGetManyAsync(photos);
|
||||||
return addedPhotos;
|
return addedPhotos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -381,7 +394,7 @@ class ObjectBox {
|
||||||
store.runInTransactionAsync(
|
store.runInTransactionAsync(
|
||||||
TxMode.write,
|
TxMode.write,
|
||||||
_addPhotoInTx,
|
_addPhotoInTx,
|
||||||
Photo(
|
VisitPhoto(
|
||||||
id_visite: id_visite,
|
id_visite: id_visite,
|
||||||
id_photo_typologie: id_photo_typologie,
|
id_photo_typologie: id_photo_typologie,
|
||||||
image_name: image_name));
|
image_name: image_name));
|
||||||
|
|
@ -389,17 +402,17 @@ class ObjectBox {
|
||||||
static void _addPhotoInTx(Store store, _Photo) {
|
static void _addPhotoInTx(Store store, _Photo) {
|
||||||
// Perform ObjectBox operations that take longer than a few milliseconds
|
// Perform ObjectBox operations that take longer than a few milliseconds
|
||||||
// here. To keep it simple, this example just puts a single object.
|
// 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) {
|
int id_visite, int _id_photo_typologie) {
|
||||||
// Query for all photos, sorted by their date.
|
// Query for all photos, sorted by their date.
|
||||||
// https://docs.objectbox.io/queries
|
// https://docs.objectbox.io/queries
|
||||||
final query = photoBox
|
final query = visitPhotoBox
|
||||||
.query(Photo_.id_visite.equals(id_visite) &
|
.query(VisitPhoto_.id_visite.equals(id_visite) &
|
||||||
Photo_.id_photo_typologie.equals(_id_photo_typologie))
|
VisitPhoto_.id_photo_typologie.equals(_id_photo_typologie))
|
||||||
.order(Photo_.date_photo, flags: Order.descending)
|
.order(VisitPhoto_.date_photo, flags: Order.descending)
|
||||||
.build();
|
.build();
|
||||||
return query.find();
|
return query.find();
|
||||||
}
|
}
|
||||||
|
|
@ -411,16 +424,17 @@ class ObjectBox {
|
||||||
///
|
///
|
||||||
/// Returns:
|
/// Returns:
|
||||||
/// A Photo object, or null if no object is found.
|
/// A Photo object, or null if no object is found.
|
||||||
Photo? getPhotoById(int id_photo) {
|
VisitPhoto? getPhotoById(int id_photo) {
|
||||||
final photo = photoBox.get(id_photo);
|
final photo = visitPhotoBox.get(id_photo);
|
||||||
return photo;
|
return photo;
|
||||||
}
|
}
|
||||||
|
|
||||||
Stream<List<Photo>> getPhotos() {
|
Stream<List<VisitPhoto>> getPhotos() {
|
||||||
// Query for all photos, sorted by their date.
|
// Query for all photos, sorted by their date.
|
||||||
// https://docs.objectbox.io/queries
|
// https://docs.objectbox.io/queries
|
||||||
final builder =
|
final builder = visitPhotoBox
|
||||||
photoBox.query().order(Photo_.date_photo, flags: Order.descending);
|
.query()
|
||||||
|
.order(VisitPhoto_.date_photo, flags: Order.descending);
|
||||||
// Build and watch the query,
|
// Build and watch the query,
|
||||||
// set triggerImmediately to emit the query immediately on listen.
|
// set triggerImmediately to emit the query immediately on listen.
|
||||||
return builder
|
return builder
|
||||||
|
|
@ -430,59 +444,61 @@ class ObjectBox {
|
||||||
}
|
}
|
||||||
|
|
||||||
void delPhoto(String _name) {
|
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();
|
final results = query.find();
|
||||||
if (results.isNotEmpty) {
|
if (results.isNotEmpty) {
|
||||||
final photoToDelete = results.first;
|
final photoToDelete = results.first;
|
||||||
photoBox.removeAsync(photoToDelete.id);
|
visitPhotoBox.removeAsync(photoToDelete.id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int getVisitPhotoCount(int _id_visite) {
|
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();
|
return builder.count();
|
||||||
}
|
}
|
||||||
|
|
||||||
int getVisitTypologiePhotoCount(int _id_visite, int _id_photo_typologie) {
|
int getVisitTypologiePhotoCount(int _id_visite, int _id_photo_typologie) {
|
||||||
final builder = photoBox
|
final builder = visitPhotoBox
|
||||||
.query(Photo_.id_visite.equals(_id_visite) &
|
.query(VisitPhoto_.id_visite.equals(_id_visite) &
|
||||||
Photo_.id_photo_typologie.equals(_id_photo_typologie))
|
VisitPhoto_.id_photo_typologie.equals(_id_photo_typologie))
|
||||||
.build();
|
.build();
|
||||||
return builder.count();
|
return builder.count();
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> putPhotoTypologie(int photoId, int typologieId) async {
|
Future<void> putPhotoTypologie(int photoId, int typologieId) async {
|
||||||
final photo = photoBox.get(photoId);
|
final photo = visitPhotoBox.get(photoId);
|
||||||
|
|
||||||
if (photo != null) {
|
if (photo != null) {
|
||||||
final updatedPhoto = photo.copyWith(id_photo_typologie: typologieId);
|
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 {
|
Future<void> putPhotoTags(int photoId, List<String> tags) async {
|
||||||
final photo = photoBox.get(photoId);
|
final photo = visitPhotoBox.get(photoId);
|
||||||
|
|
||||||
if (photo != null) {
|
if (photo != null) {
|
||||||
final updatedPhoto = photo.copyWith(tags: tags.join(","));
|
final updatedPhoto = photo.copyWith(tags: tags.join(","));
|
||||||
await photoBox.putAsync(updatedPhoto);
|
await visitPhotoBox.putAsync(updatedPhoto);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> putPhotoVisibilities(
|
Future<void> putPhotoVisibilities(
|
||||||
int photoId, List<String> visibilities) async {
|
int photoId, List<String> visibilities) async {
|
||||||
final photo = photoBox.get(photoId);
|
final photo = visitPhotoBox.get(photoId);
|
||||||
|
|
||||||
if (photo != null) {
|
if (photo != null) {
|
||||||
final updatedPhoto = photo.copyWith(
|
final updatedPhoto = photo.copyWith(
|
||||||
photo_principale: visibilities.contains('principal') ? 1 : 0,
|
photo_principale: visibilities.contains('principal') ? 1 : 0,
|
||||||
photo_privee: visibilities.contains('private') ? 1 : 0);
|
photo_privee: visibilities.contains('private') ? 1 : 0);
|
||||||
await photoBox.putAsync(updatedPhoto);
|
await visitPhotoBox.putAsync(updatedPhoto);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* remettre les principal à zero
|
/* 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();
|
final updatedPhotos = queryBuilder.build().find();
|
||||||
updatedPhotos.forEach((photo) {
|
updatedPhotos.forEach((photo) {
|
||||||
photo.photo_principale = 0;
|
photo.photo_principale = 0;
|
||||||
|
|
@ -525,7 +541,7 @@ class ObjectBox {
|
||||||
}
|
}
|
||||||
|
|
||||||
List<String> getPhotoTypologiesLabels() {
|
List<String> getPhotoTypologiesLabels() {
|
||||||
final query = photoTypologyBox.query().order(PhotoTypology_.ordre).build();
|
final query = PhotoTypologyBox.query().order(PhotoTypology_.ordre).build();
|
||||||
final photoTypologies = query.find();
|
final photoTypologies = query.find();
|
||||||
return photoTypologies
|
return photoTypologies
|
||||||
.map((photoTypology) => photoTypology.libelle)
|
.map((photoTypology) => photoTypology.libelle)
|
||||||
|
|
@ -533,7 +549,7 @@ class ObjectBox {
|
||||||
}
|
}
|
||||||
|
|
||||||
List<PhotoTypology> getPhotoTypologiesList() {
|
List<PhotoTypology> getPhotoTypologiesList() {
|
||||||
final query = photoTypologyBox.query().order(PhotoTypology_.ordre).build();
|
final query = PhotoTypologyBox.query().order(PhotoTypology_.ordre).build();
|
||||||
final photoTypologies = query.find();
|
final photoTypologies = query.find();
|
||||||
|
|
||||||
return photoTypologies.toList();
|
return photoTypologies.toList();
|
||||||
|
|
@ -542,7 +558,7 @@ class ObjectBox {
|
||||||
Stream<List<PhotoTypology>> getPhotoTypologies() {
|
Stream<List<PhotoTypology>> getPhotoTypologies() {
|
||||||
// Query for all Typologies, sorted by their order.
|
// Query for all Typologies, sorted by their order.
|
||||||
// https://docs.objectbox.io/queries
|
// https://docs.objectbox.io/queries
|
||||||
final builder = photoTypologyBox.query().order(PhotoTypology_.ordre);
|
final builder = PhotoTypologyBox.query().order(PhotoTypology_.ordre);
|
||||||
// Build and watch the query,
|
// Build and watch the query,
|
||||||
// set triggerImmediately to emit the query immediately on listen.
|
// set triggerImmediately to emit the query immediately on listen.
|
||||||
return builder
|
return builder
|
||||||
|
|
|
||||||
|
|
@ -14,14 +14,14 @@ import 'package:objectbox/internal.dart'; // generated code can access "internal
|
||||||
import 'package:objectbox/objectbox.dart';
|
import 'package:objectbox/objectbox.dart';
|
||||||
import 'package:objectbox_flutter_libs/objectbox_flutter_libs.dart';
|
import 'package:objectbox_flutter_libs/objectbox_flutter_libs.dart';
|
||||||
|
|
||||||
import 'db/box_concurrent.dart';
|
|
||||||
import 'db/box_etab.dart';
|
import 'db/box_etab.dart';
|
||||||
import 'db/box_log.dart';
|
import 'db/box_log.dart';
|
||||||
import 'db/box_photo.dart';
|
import 'db/box_photo.dart';
|
||||||
|
import 'db/box_photo_competitor.dart';
|
||||||
import 'db/box_photo_typology.dart';
|
import 'db/box_photo_typology.dart';
|
||||||
import 'db/box_user.dart';
|
import 'db/box_user.dart';
|
||||||
import 'db/box_visite.dart';
|
import 'db/box_visit.dart';
|
||||||
import 'db/box_visite_tag.dart';
|
import 'db/box_visit_tag.dart';
|
||||||
import 'model.dart';
|
import 'model.dart';
|
||||||
|
|
||||||
export 'package:objectbox/objectbox.dart'; // so that callers only have to import this file
|
export 'package:objectbox/objectbox.dart'; // so that callers only have to import this file
|
||||||
|
|
@ -188,35 +188,6 @@ final _entities = <ModelEntity>[
|
||||||
],
|
],
|
||||||
relations: <ModelRelation>[],
|
relations: <ModelRelation>[],
|
||||||
backlinks: <ModelBacklink>[]),
|
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(
|
ModelEntity(
|
||||||
id: const IdUid(7, 8290500625256822711),
|
id: const IdUid(7, 8290500625256822711),
|
||||||
name: 'Visite',
|
name: 'Visite',
|
||||||
|
|
@ -315,65 +286,6 @@ final _entities = <ModelEntity>[
|
||||||
],
|
],
|
||||||
relations: <ModelRelation>[],
|
relations: <ModelRelation>[],
|
||||||
backlinks: <ModelBacklink>[]),
|
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(
|
ModelEntity(
|
||||||
id: const IdUid(10, 2779194860339140505),
|
id: const IdUid(10, 2779194860339140505),
|
||||||
name: 'PhotoTypology',
|
name: 'PhotoTypology',
|
||||||
|
|
@ -402,6 +314,94 @@ final _entities = <ModelEntity>[
|
||||||
flags: 0)
|
flags: 0)
|
||||||
],
|
],
|
||||||
relations: <ModelRelation>[],
|
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>[])
|
backlinks: <ModelBacklink>[])
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
@ -425,11 +425,16 @@ Future<Store> openStore(
|
||||||
ModelDefinition getObjectBoxModel() {
|
ModelDefinition getObjectBoxModel() {
|
||||||
final model = ModelInfo(
|
final model = ModelInfo(
|
||||||
entities: _entities,
|
entities: _entities,
|
||||||
lastEntityId: const IdUid(10, 2779194860339140505),
|
lastEntityId: const IdUid(13, 6298506278273268036),
|
||||||
lastIndexId: const IdUid(1, 7907819717055295102),
|
lastIndexId: const IdUid(1, 7907819717055295102),
|
||||||
lastRelationId: const IdUid(0, 0),
|
lastRelationId: const IdUid(0, 0),
|
||||||
lastSequenceId: const IdUid(0, 0),
|
lastSequenceId: const IdUid(0, 0),
|
||||||
retiredEntityUids: const [7401686910042688313],
|
retiredEntityUids: const [
|
||||||
|
7401686910042688313,
|
||||||
|
1805690312272107423,
|
||||||
|
6788844671665652158,
|
||||||
|
2910300629980903548
|
||||||
|
],
|
||||||
retiredIndexUids: const [7907819717055295102],
|
retiredIndexUids: const [7907819717055295102],
|
||||||
retiredPropertyUids: const [
|
retiredPropertyUids: const [
|
||||||
402019719780433349,
|
402019719780433349,
|
||||||
|
|
@ -444,7 +449,25 @@ ModelDefinition getObjectBoxModel() {
|
||||||
2141346538986140281,
|
2141346538986140281,
|
||||||
7877546811840884522,
|
7877546811840884522,
|
||||||
3784190804330297742,
|
3784190804330297742,
|
||||||
1865824860595482227
|
1865824860595482227,
|
||||||
|
2904282721431628480,
|
||||||
|
6658127353491083480,
|
||||||
|
2563846535684494722,
|
||||||
|
7447139022474751374,
|
||||||
|
2982072387377736709,
|
||||||
|
1374846727562410311,
|
||||||
|
374091471912277059,
|
||||||
|
234947897575384032,
|
||||||
|
3602779209059248697,
|
||||||
|
5116665990846416843,
|
||||||
|
1716626028602523655,
|
||||||
|
4568092734700892012,
|
||||||
|
539065583624712715,
|
||||||
|
7248999677905103482,
|
||||||
|
6313899520679425027,
|
||||||
|
4752064214129719799,
|
||||||
|
319372524127232986,
|
||||||
|
783761731187897018
|
||||||
],
|
],
|
||||||
retiredRelationUids: const [],
|
retiredRelationUids: const [],
|
||||||
modelVersion: 5,
|
modelVersion: 5,
|
||||||
|
|
@ -622,43 +645,10 @@ ModelDefinition getObjectBoxModel() {
|
||||||
latitude: const fb.StringReader(asciiOptimization: true)
|
latitude: const fb.StringReader(asciiOptimization: true)
|
||||||
.vTableGet(buffer, rootOffset, 18, ''));
|
.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;
|
return object;
|
||||||
}),
|
}),
|
||||||
Visite: EntityDefinition<Visite>(
|
Visite: EntityDefinition<Visite>(
|
||||||
model: _entities[5],
|
model: _entities[4],
|
||||||
toOneRelations: (Visite object) => [],
|
toOneRelations: (Visite object) => [],
|
||||||
toManyRelations: (Visite object) => {},
|
toManyRelations: (Visite object) => {},
|
||||||
getId: (Visite object) => object.id,
|
getId: (Visite object) => object.id,
|
||||||
|
|
@ -716,7 +706,7 @@ ModelDefinition getObjectBoxModel() {
|
||||||
return object;
|
return object;
|
||||||
}),
|
}),
|
||||||
VisiteTag: EntityDefinition<VisiteTag>(
|
VisiteTag: EntityDefinition<VisiteTag>(
|
||||||
model: _entities[6],
|
model: _entities[5],
|
||||||
toOneRelations: (VisiteTag object) => [],
|
toOneRelations: (VisiteTag object) => [],
|
||||||
toManyRelations: (VisiteTag object) => {},
|
toManyRelations: (VisiteTag object) => {},
|
||||||
getId: (VisiteTag object) => object.id,
|
getId: (VisiteTag object) => object.id,
|
||||||
|
|
@ -750,62 +740,10 @@ ModelDefinition getObjectBoxModel() {
|
||||||
langage: const fb.StringReader(asciiOptimization: true)
|
langage: const fb.StringReader(asciiOptimization: true)
|
||||||
.vTableGet(buffer, rootOffset, 12, ''));
|
.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;
|
return object;
|
||||||
}),
|
}),
|
||||||
PhotoTypology: EntityDefinition<PhotoTypology>(
|
PhotoTypology: EntityDefinition<PhotoTypology>(
|
||||||
model: _entities[8],
|
model: _entities[6],
|
||||||
toOneRelations: (PhotoTypology object) => [],
|
toOneRelations: (PhotoTypology object) => [],
|
||||||
toManyRelations: (PhotoTypology object) => {},
|
toManyRelations: (PhotoTypology object) => {},
|
||||||
getId: (PhotoTypology object) => object.id,
|
getId: (PhotoTypology object) => object.id,
|
||||||
|
|
@ -835,6 +773,91 @@ ModelDefinition getObjectBoxModel() {
|
||||||
ordre:
|
ordre:
|
||||||
const fb.Int64Reader().vTableGet(buffer, rootOffset, 10, 0));
|
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;
|
return object;
|
||||||
})
|
})
|
||||||
};
|
};
|
||||||
|
|
@ -932,148 +955,150 @@ class Etab_ {
|
||||||
QueryStringProperty<Etab>(_entities[3].properties[7]);
|
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.
|
/// [Visite] entity fields to define ObjectBox queries.
|
||||||
class Visite_ {
|
class Visite_ {
|
||||||
/// see [Visite.id]
|
/// 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]
|
/// see [Visite.id_visite]
|
||||||
static final id_visite =
|
static final id_visite =
|
||||||
QueryIntegerProperty<Visite>(_entities[5].properties[1]);
|
QueryIntegerProperty<Visite>(_entities[4].properties[1]);
|
||||||
|
|
||||||
/// see [Visite.type_visite]
|
/// see [Visite.type_visite]
|
||||||
static final type_visite =
|
static final type_visite =
|
||||||
QueryStringProperty<Visite>(_entities[5].properties[2]);
|
QueryStringProperty<Visite>(_entities[4].properties[2]);
|
||||||
|
|
||||||
/// see [Visite.title]
|
/// see [Visite.title]
|
||||||
static final title = QueryStringProperty<Visite>(_entities[5].properties[3]);
|
static final title = QueryStringProperty<Visite>(_entities[4].properties[3]);
|
||||||
|
|
||||||
/// see [Visite.allDay]
|
/// see [Visite.allDay]
|
||||||
static final allDay =
|
static final allDay =
|
||||||
QueryBooleanProperty<Visite>(_entities[5].properties[4]);
|
QueryBooleanProperty<Visite>(_entities[4].properties[4]);
|
||||||
|
|
||||||
/// see [Visite.id_distrib_visite]
|
/// see [Visite.id_distrib_visite]
|
||||||
static final id_distrib_visite =
|
static final id_distrib_visite =
|
||||||
QueryIntegerProperty<Visite>(_entities[5].properties[5]);
|
QueryIntegerProperty<Visite>(_entities[4].properties[5]);
|
||||||
|
|
||||||
/// see [Visite.id_etab]
|
/// see [Visite.id_etab]
|
||||||
static final id_etab =
|
static final id_etab =
|
||||||
QueryIntegerProperty<Visite>(_entities[5].properties[6]);
|
QueryIntegerProperty<Visite>(_entities[4].properties[6]);
|
||||||
|
|
||||||
/// see [Visite.abandon]
|
/// see [Visite.abandon]
|
||||||
static final abandon =
|
static final abandon =
|
||||||
QueryIntegerProperty<Visite>(_entities[5].properties[7]);
|
QueryIntegerProperty<Visite>(_entities[4].properties[7]);
|
||||||
|
|
||||||
/// see [Visite.date_visite]
|
/// see [Visite.date_visite]
|
||||||
static final date_visite =
|
static final date_visite =
|
||||||
QueryIntegerProperty<Visite>(_entities[5].properties[8]);
|
QueryIntegerProperty<Visite>(_entities[4].properties[8]);
|
||||||
|
|
||||||
/// see [Visite.url_photo_principale]
|
/// see [Visite.url_photo_principale]
|
||||||
static final url_photo_principale =
|
static final url_photo_principale =
|
||||||
QueryStringProperty<Visite>(_entities[5].properties[9]);
|
QueryStringProperty<Visite>(_entities[4].properties[9]);
|
||||||
|
|
||||||
/// see [Visite.langage]
|
/// see [Visite.langage]
|
||||||
static final langage =
|
static final langage =
|
||||||
QueryStringProperty<Visite>(_entities[5].properties[10]);
|
QueryStringProperty<Visite>(_entities[4].properties[10]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// [VisiteTag] entity fields to define ObjectBox queries.
|
/// [VisiteTag] entity fields to define ObjectBox queries.
|
||||||
class VisiteTag_ {
|
class VisiteTag_ {
|
||||||
/// see [VisiteTag.id]
|
/// 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]
|
/// see [VisiteTag.id_visite_tag]
|
||||||
static final id_visite_tag =
|
static final id_visite_tag =
|
||||||
QueryIntegerProperty<VisiteTag>(_entities[6].properties[1]);
|
QueryIntegerProperty<VisiteTag>(_entities[5].properties[1]);
|
||||||
|
|
||||||
/// see [VisiteTag.id_distrib]
|
/// see [VisiteTag.id_distrib]
|
||||||
static final id_distrib =
|
static final id_distrib =
|
||||||
QueryIntegerProperty<VisiteTag>(_entities[6].properties[2]);
|
QueryIntegerProperty<VisiteTag>(_entities[5].properties[2]);
|
||||||
|
|
||||||
/// see [VisiteTag.libelle]
|
/// see [VisiteTag.libelle]
|
||||||
static final libelle =
|
static final libelle =
|
||||||
QueryStringProperty<VisiteTag>(_entities[6].properties[3]);
|
QueryStringProperty<VisiteTag>(_entities[5].properties[3]);
|
||||||
|
|
||||||
/// see [VisiteTag.langage]
|
/// see [VisiteTag.langage]
|
||||||
static final langage =
|
static final langage =
|
||||||
QueryStringProperty<VisiteTag>(_entities[6].properties[4]);
|
QueryStringProperty<VisiteTag>(_entities[5].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]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// [PhotoTypology] entity fields to define ObjectBox queries.
|
/// [PhotoTypology] entity fields to define ObjectBox queries.
|
||||||
class PhotoTypology_ {
|
class PhotoTypology_ {
|
||||||
/// see [PhotoTypology.id]
|
/// see [PhotoTypology.id]
|
||||||
static final id =
|
static final id =
|
||||||
QueryIntegerProperty<PhotoTypology>(_entities[8].properties[0]);
|
QueryIntegerProperty<PhotoTypology>(_entities[6].properties[0]);
|
||||||
|
|
||||||
/// see [PhotoTypology.id_photo_typologie]
|
/// see [PhotoTypology.id_photo_typologie]
|
||||||
static final id_photo_typologie =
|
static final id_photo_typologie =
|
||||||
QueryIntegerProperty<PhotoTypology>(_entities[8].properties[1]);
|
QueryIntegerProperty<PhotoTypology>(_entities[6].properties[1]);
|
||||||
|
|
||||||
/// see [PhotoTypology.libelle]
|
/// see [PhotoTypology.libelle]
|
||||||
static final libelle =
|
static final libelle =
|
||||||
QueryStringProperty<PhotoTypology>(_entities[8].properties[2]);
|
QueryStringProperty<PhotoTypology>(_entities[6].properties[2]);
|
||||||
|
|
||||||
/// see [PhotoTypology.ordre]
|
/// see [PhotoTypology.ordre]
|
||||||
static final 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]);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -123,4 +123,11 @@ class SharedPrefs {
|
||||||
set photosDir(String value) {
|
set photosDir(String value) {
|
||||||
_sharedPrefs.setString('photosDir', value);
|
_sharedPrefs.setString('photosDir', value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// get/set url MP4
|
||||||
|
String get urlMP4 => _sharedPrefs.getString('urlMP4') ?? "";
|
||||||
|
|
||||||
|
set urlMP4(String value) {
|
||||||
|
_sharedPrefs.setString('urlMP4', value);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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/account/tab_account.dart';
|
||||||
import 'package:mobdr/ui/home/tab_home.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:mobdr/ui/sync/tab_sync.dart';
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:mobdr/config/constant.dart';
|
import 'package:mobdr/config/constant.dart';
|
||||||
|
import 'package:mobdr/events.dart';
|
||||||
|
|
||||||
class HomePage extends StatefulWidget {
|
class HomePage extends StatefulWidget {
|
||||||
@override
|
@override
|
||||||
|
|
@ -13,21 +18,34 @@ class HomePage extends StatefulWidget {
|
||||||
class _HomePageState extends State<HomePage>
|
class _HomePageState extends State<HomePage>
|
||||||
with SingleTickerProviderStateMixin {
|
with SingleTickerProviderStateMixin {
|
||||||
late PageController _pageController;
|
late PageController _pageController;
|
||||||
|
late StreamSubscription sub; // déclaration de la variable sub
|
||||||
|
|
||||||
int _currentIndex = 0;
|
int _currentIndex = 0;
|
||||||
|
|
||||||
// Pages if you click bottom navigation
|
List<Widget> _contentPages = [];
|
||||||
final List<Widget> _contentPages = <Widget>[
|
|
||||||
TabHomePage(),
|
|
||||||
TabSyncPage(),
|
|
||||||
TabShoppingCartPage(),
|
|
||||||
TabAccountPage(),
|
|
||||||
];
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
|
_contentPages = <Widget>[
|
||||||
|
TabHomePage(),
|
||||||
|
TabSyncPage(),
|
||||||
|
TabMP4Page(),
|
||||||
|
TabAccountPage(),
|
||||||
|
];
|
||||||
|
|
||||||
// set initial pages for navigation to home page
|
// set initial pages for navigation to home page
|
||||||
_pageController = PageController(initialPage: 0);
|
_pageController = PageController(initialPage: 0);
|
||||||
_pageController.addListener(_handleTabSelection);
|
_pageController.addListener(_handleTabSelection);
|
||||||
|
|
||||||
|
// Listen particular event
|
||||||
|
sub = eventBus.on<UrlEvent>().listen((e) {
|
||||||
|
setState(() {
|
||||||
|
_currentIndex = 2;
|
||||||
|
_pageController.jumpToPage(_currentIndex);
|
||||||
|
FocusScope.of(context).unfocus();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
super.initState();
|
super.initState();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -37,6 +55,7 @@ class _HomePageState extends State<HomePage>
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void dispose() {
|
void dispose() {
|
||||||
|
sub.cancel();
|
||||||
_pageController.dispose();
|
_pageController.dispose();
|
||||||
super.dispose();
|
super.dispose();
|
||||||
}
|
}
|
||||||
|
|
@ -80,8 +99,8 @@ class _HomePageState extends State<HomePage>
|
||||||
icon: Icon(Icons.sync,
|
icon: Icon(Icons.sync,
|
||||||
color: _currentIndex == 1 ? ASSENT_COLOR : CHARCOAL)),
|
color: _currentIndex == 1 ? ASSENT_COLOR : CHARCOAL)),
|
||||||
BottomNavigationBarItem(
|
BottomNavigationBarItem(
|
||||||
label: 'Cart',
|
label: 'MP4',
|
||||||
icon: Icon(Icons.shopping_cart,
|
icon: Icon(Icons.web,
|
||||||
color: _currentIndex == 2 ? PRIMARY_COLOR : CHARCOAL)),
|
color: _currentIndex == 2 ? PRIMARY_COLOR : CHARCOAL)),
|
||||||
BottomNavigationBarItem(
|
BottomNavigationBarItem(
|
||||||
label: 'Account',
|
label: 'Account',
|
||||||
|
|
|
||||||
|
|
@ -16,9 +16,7 @@ import 'package:mobdr/config/global_style.dart';
|
||||||
import 'package:mobdr/model/visite_model.dart';
|
import 'package:mobdr/model/visite_model.dart';
|
||||||
import 'package:mobdr/ui/general/chat_us.dart';
|
import 'package:mobdr/ui/general/chat_us.dart';
|
||||||
import 'package:mobdr/ui/general/notification.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/reusable_widget.dart';
|
||||||
import 'package:mobdr/ui/reusable/cache_image_network.dart';
|
|
||||||
|
|
||||||
class TabHomePage extends StatefulWidget {
|
class TabHomePage extends StatefulWidget {
|
||||||
@override
|
@override
|
||||||
|
|
@ -44,7 +42,8 @@ class _TabHomePageState extends State<TabHomePage>
|
||||||
bool _isLoading = true;
|
bool _isLoading = true;
|
||||||
String _errorMessage = '';
|
String _errorMessage = '';
|
||||||
|
|
||||||
late List<VisiteModel> modelData = [];
|
late List<VisiteModel> todayVisitsData = [];
|
||||||
|
late List<VisiteModel> previousVisitsData = [];
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
|
|
@ -88,179 +87,127 @@ class _TabHomePageState extends State<TabHomePage>
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
// if we used AutomaticKeepAliveClientMixin, we must call super.build(context);
|
// if we used AutomaticKeepAliveClientMixin, we must call super.build(context);
|
||||||
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) {
|
if (_isLoading) {
|
||||||
return Center(child: CircularProgressIndicator());
|
return Center(child: CircularProgressIndicator());
|
||||||
} else if (modelData.isEmpty) {
|
|
||||||
return Center(
|
|
||||||
child: Text('Aucune visite trouvée.'),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
automaticallyImplyLeading: false,
|
automaticallyImplyLeading: false,
|
||||||
elevation: GlobalStyle.appBarElevation,
|
elevation: GlobalStyle.appBarElevation,
|
||||||
title: Text(
|
title: Text(
|
||||||
AppLocalizations.of(context)!.translate('i18n_hello')! +
|
AppLocalizations.of(context)!.translate('i18n_hello')! +
|
||||||
', ${SharedPrefs().prenom}',
|
', ${SharedPrefs().prenom}',
|
||||||
style: GlobalStyle.appBarTitle,
|
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,
|
|
||||||
)
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
)
|
|
||||||
],
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
|
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.
|
Widget _buildTodayVisits(boxImageSize) {
|
||||||
///
|
return Column(
|
||||||
/// [index]: The index of the visit being refreshed.
|
children: [
|
||||||
/// [newPhotoCount]: The new photo count for the visit.
|
Container(
|
||||||
void onRefreshVisit(int index, int newPhotoCount) {
|
padding: EdgeInsets.fromLTRB(16, 16, 16, 0),
|
||||||
setState(() {
|
child: Row(
|
||||||
modelData[index].photoCount = newPhotoCount;
|
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.
|
/// Initializes data when the page loads.
|
||||||
Future<void> loadData() async {
|
Future<void> loadData() async {
|
||||||
try {
|
try {
|
||||||
// visite model initialisation
|
// visite model initialisation
|
||||||
modelData = await VisiteModel.getAllVisites();
|
todayVisitsData = await VisiteModel.getAllVisites();
|
||||||
|
previousVisitsData = await VisiteModel.getAllVisites();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
// set errorMessage for debug
|
// set errorMessage for debug
|
||||||
_errorMessage = 'Error loading visites : $e';
|
_errorMessage = 'Error loading visites : $e';
|
||||||
|
|
|
||||||
|
|
@ -54,7 +54,7 @@ class _VisitPhotoTypologyListPageState
|
||||||
|
|
||||||
// initialize photos files list
|
// initialize photos files list
|
||||||
final List<File> _visitPhotoFiles = [];
|
final List<File> _visitPhotoFiles = [];
|
||||||
List<Photo> _visitPhotoData = [];
|
List<VisitPhoto> _visitPhotoData = [];
|
||||||
|
|
||||||
Color _color1 = Color(0xff777777);
|
Color _color1 = Color(0xff777777);
|
||||||
Color _color2 = Color(0xFF515151);
|
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(
|
return SizeTransition(
|
||||||
sizeFactor: animation,
|
sizeFactor: animation,
|
||||||
child: Container(
|
child: Container(
|
||||||
|
|
@ -460,14 +461,14 @@ class _VisitPhotoTypologyListPageState
|
||||||
///
|
///
|
||||||
void savePhotos() async {
|
void savePhotos() async {
|
||||||
if (_visitPhotoFiles.length > 0) {
|
if (_visitPhotoFiles.length > 0) {
|
||||||
final List<Photo> _listPhotos = [];
|
final List<VisitPhoto> _listPhotos = [];
|
||||||
|
|
||||||
for (var myTmpPhoto in _visitPhotoFiles) {
|
for (var myTmpPhoto in _visitPhotoFiles) {
|
||||||
/// move jpg file to photo directory
|
/// move jpg file to photo directory
|
||||||
final myPhoto = await moveFileFromTempToPhotosDir(myTmpPhoto);
|
final myPhoto = await moveFileFromTempToPhotosDir(myTmpPhoto);
|
||||||
|
|
||||||
/// to insert into database
|
/// to insert into database
|
||||||
_listPhotos.add(Photo(
|
_listPhotos.add(VisitPhoto(
|
||||||
id_visite: widget.pp_id_visite,
|
id_visite: widget.pp_id_visite,
|
||||||
id_photo_typologie: widget.pp_id_typologie,
|
id_photo_typologie: widget.pp_id_typologie,
|
||||||
image_name: myPhoto.path.split('/').last));
|
image_name: myPhoto.path.split('/').last));
|
||||||
|
|
|
||||||
|
|
@ -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.dart';
|
||||||
import 'package:mobdr/db/box_photo_typology.dart';
|
import 'package:mobdr/db/box_photo_typology.dart';
|
||||||
|
import 'package:mobdr/db/box_photo_competitor.dart';
|
||||||
//TODO : faire concurrents ===
|
|
||||||
|
|
||||||
class VisitPhotoTypologyDetailPage extends StatefulWidget {
|
class VisitPhotoTypologyDetailPage extends StatefulWidget {
|
||||||
// variables corresponding to the data parameters
|
// variables corresponding to the data parameters
|
||||||
|
|
@ -45,13 +44,17 @@ class _VisitPhotoTypologyDetailPageState
|
||||||
String _errorMessage = '';
|
String _errorMessage = '';
|
||||||
|
|
||||||
// Typology list
|
// Typology list
|
||||||
late List<PhotoTypology> _typologyList = [];
|
late List<PhotoTypology> _typologiesList = [];
|
||||||
int _typologyIndex = 0;
|
int _typologyIndex = 0;
|
||||||
|
|
||||||
List<String> _visibilities = [];
|
List<String> _visibilities = [];
|
||||||
|
|
||||||
late List<String> tagList = [];
|
late List<String> tagList = [];
|
||||||
late Photo _photo;
|
late VisitPhoto _photo;
|
||||||
|
|
||||||
|
// competitors
|
||||||
|
List<EtabCompetitor> _competitorsList = [];
|
||||||
|
String _competitor = '';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
|
|
@ -106,7 +109,7 @@ class _VisitPhotoTypologyDetailPageState
|
||||||
// fred
|
// fred
|
||||||
Map<String, dynamic> result = {
|
Map<String, dynamic> result = {
|
||||||
'change_typologie': _typologyIndex !=
|
'change_typologie': _typologyIndex !=
|
||||||
_typologyList.indexWhere((typology) =>
|
_typologiesList.indexWhere((typology) =>
|
||||||
typology.id_photo_typologie == widget.pp_id_typologie),
|
typology.id_photo_typologie == widget.pp_id_typologie),
|
||||||
'tags': tagList.join(","),
|
'tags': tagList.join(","),
|
||||||
'photo_principale': _visibilities.contains('principal') ? 1 : 0,
|
'photo_principale': _visibilities.contains('principal') ? 1 : 0,
|
||||||
|
|
@ -127,6 +130,7 @@ class _VisitPhotoTypologyDetailPageState
|
||||||
_buildPhotoTypology(),
|
_buildPhotoTypology(),
|
||||||
_buildPhotoVisibility(),
|
_buildPhotoVisibility(),
|
||||||
_buildPhotoTag(context),
|
_buildPhotoTag(context),
|
||||||
|
_BuildPhotoCompetitor(),
|
||||||
SizedBox(height: 16)
|
SizedBox(height: 16)
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|
@ -213,8 +217,8 @@ class _VisitPhotoTypologyDetailPageState
|
||||||
height: 16,
|
height: 16,
|
||||||
),
|
),
|
||||||
Wrap(
|
Wrap(
|
||||||
children: List.generate(_typologyList.length, (index) {
|
children: List.generate(_typologiesList.length, (index) {
|
||||||
return radioSize(_typologyList[index].libelle, index);
|
return radioSize(_typologiesList[index].libelle, index);
|
||||||
}),
|
}),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|
@ -226,7 +230,7 @@ class _VisitPhotoTypologyDetailPageState
|
||||||
onTap: () async {
|
onTap: () async {
|
||||||
// save photo typology in the database
|
// save photo typology in the database
|
||||||
objectbox.putPhotoTypologie(
|
objectbox.putPhotoTypologie(
|
||||||
widget.pp_id, _typologyList[index].id_photo_typologie);
|
widget.pp_id, _typologiesList[index].id_photo_typologie);
|
||||||
|
|
||||||
setState(() {
|
setState(() {
|
||||||
_typologyIndex = index;
|
_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.
|
/// Initializes data when the page loads.
|
||||||
Future<void> loadData(int photoId) async {
|
Future<void> loadData(int photoId) async {
|
||||||
String tags = "";
|
String tags = "";
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// photo typologies initialization
|
// photo typologies initialization
|
||||||
_typologyList = objectbox.getPhotoTypologiesList();
|
_typologiesList = objectbox.getPhotoTypologiesList();
|
||||||
|
|
||||||
_typologyIndex = _typologyList.indexWhere(
|
_typologyIndex = _typologiesList.indexWhere(
|
||||||
(typology) => typology.id_photo_typologie == widget.pp_id_typologie);
|
(typology) => typology.id_photo_typologie == widget.pp_id_typologie);
|
||||||
|
|
||||||
// get photo object
|
// get photo object
|
||||||
|
|
@ -400,6 +527,10 @@ class _VisitPhotoTypologyDetailPageState
|
||||||
// photo tag initialization
|
// photo tag initialization
|
||||||
tags = _photo.tags;
|
tags = _photo.tags;
|
||||||
tagList = tags.isEmpty ? [] : _photo.tags.split(",");
|
tagList = tags.isEmpty ? [] : _photo.tags.split(",");
|
||||||
|
|
||||||
|
// competitor initialization
|
||||||
|
_competitorsList = objectbox.getPhotoCompetitorList();
|
||||||
|
_competitor = "";
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
// set errorMessage for debug
|
// set errorMessage for debug
|
||||||
_errorMessage = 'Error loading photo: $e';
|
_errorMessage = 'Error loading photo: $e';
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
@ -1,8 +1,15 @@
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
|
||||||
import 'package:mobdr/config/constant.dart';
|
|
||||||
import 'package:flutter/material.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 {
|
class ReusableWidget {
|
||||||
PreferredSizeWidget bottomAppBar() {
|
PreferredSizeWidget bottomAppBar() {
|
||||||
return PreferredSize(
|
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,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,12 @@
|
||||||
/*
|
import 'package:flutter/material.dart';
|
||||||
This is wishlist page
|
import 'package:timelines/timelines.dart';
|
||||||
we used AutomaticKeepAliveClientMixin to keep the state when moving from 1 navbar to another navbar, so the page is not refresh overtime
|
import 'dart:math';
|
||||||
*/
|
|
||||||
|
|
||||||
import 'package:mobdr/config/global_style.dart';
|
import 'package:mobdr/config/global_style.dart';
|
||||||
import 'package:mobdr/ui/reusable/reusable_widget.dart';
|
import 'package:mobdr/ui/reusable/reusable_widget.dart';
|
||||||
import 'package:mobdr/network/api_provider.dart';
|
import 'package:mobdr/network/api_provider.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:mobdr/main.dart';
|
||||||
import 'package:timelines/timelines.dart';
|
import 'package:mobdr/ui/home/tab_home.dart';
|
||||||
import 'dart:math';
|
|
||||||
|
|
||||||
const completeColor = Color(0xff5e6172);
|
const completeColor = Color(0xff5e6172);
|
||||||
const inProgressColor = Color(0xff5ec792);
|
const inProgressColor = Color(0xff5ec792);
|
||||||
|
|
@ -208,27 +206,37 @@ class _TabSyncPageState extends State<TabSyncPage>
|
||||||
floatingActionButton: FloatingActionButton(
|
floatingActionButton: FloatingActionButton(
|
||||||
child: Icon(Icons.chevron_right),
|
child: Icon(Icons.chevron_right),
|
||||||
onPressed: () async {
|
onPressed: () async {
|
||||||
///FRED
|
var futures = [
|
||||||
var apiResponseEtabs = await _apiProvider.SyncEtablissements();
|
_apiProvider.SyncEtablissements(),
|
||||||
var apiResponseVisites = await _apiProvider.SyncVisites();
|
_apiProvider.SyncVisites(),
|
||||||
var apiResponsePhotos = await _apiProvider.SyncPhotos();
|
_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");
|
print("SyncEtablissements OK");
|
||||||
} else {
|
} else {
|
||||||
print("SyncEtablissements Error:" + apiResponseEtabs);
|
print("SyncEtablissements Error:" + results[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (apiResponseVisites == 'OK') {
|
if (results[1] == 'OK') {
|
||||||
print("SyncVisites OK");
|
print("SyncVisites OK");
|
||||||
} else {
|
} else {
|
||||||
print("SyncVisites Error:" + apiResponseVisites);
|
print("SyncVisites Error:" + results[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (apiResponsePhotos == 'OK') {
|
if (results[0] == 'OK') {
|
||||||
print("SyncPhotos OK");
|
print("SyncPhotos OK");
|
||||||
} else {
|
} else {
|
||||||
print("SyncPhotos Error:" + apiResponsePhotos);
|
print("SyncPhotos Error:" + results[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
///
|
///
|
||||||
|
|
|
||||||
56
pubspec.lock
56
pubspec.lock
|
|
@ -321,6 +321,22 @@ packages:
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "5.1.1"
|
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:
|
fake_async:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
@ -573,6 +589,14 @@ packages:
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.8.0"
|
version: "4.8.0"
|
||||||
|
logger:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: logger
|
||||||
|
sha256: db2ff852ed77090ba9f62d3611e4208a3d11dfa35991a81ae724c113fcb3e3f7
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "1.3.0"
|
||||||
logging:
|
logging:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
@ -1186,6 +1210,38 @@ packages:
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.3.0"
|
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:
|
win32:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
|
||||||
|
|
@ -78,9 +78,15 @@ dependencies:
|
||||||
universal_io: 2.2.0
|
universal_io: 2.2.0
|
||||||
xml: ^6.2.2
|
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
|
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:
|
dev_dependencies:
|
||||||
flutter_test:
|
flutter_test:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
|
|
@ -147,6 +153,7 @@ flutter:
|
||||||
- assets/images/mastercard.png
|
- assets/images/mastercard.png
|
||||||
- assets/images/logo.png
|
- assets/images/logo.png
|
||||||
- assets/images/logo_dark.png
|
- assets/images/logo_dark.png
|
||||||
|
- assets/images/logo_mp4.png
|
||||||
- assets/images/logo_horizontal.png
|
- assets/images/logo_horizontal.png
|
||||||
- assets/images/onboarding/search_product.gif
|
- assets/images/onboarding/search_product.gif
|
||||||
- assets/images/process_timeline/status1.png
|
- assets/images/process_timeline/status1.png
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue