qr code maj
This commit is contained in:
parent
34569c2843
commit
ea3c1d69df
@ -4,6 +4,8 @@ import 'package:flutter/material.dart';
|
|||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:file_picker/file_picker.dart';
|
import 'package:file_picker/file_picker.dart';
|
||||||
|
import 'package:open_file/open_file.dart';
|
||||||
|
import 'package:pdf/widgets.dart' as pw;
|
||||||
import 'package:qr_flutter/qr_flutter.dart';
|
import 'package:qr_flutter/qr_flutter.dart';
|
||||||
import 'package:intl/intl.dart';
|
import 'package:intl/intl.dart';
|
||||||
import 'package:path_provider/path_provider.dart';
|
import 'package:path_provider/path_provider.dart';
|
||||||
@ -912,10 +914,17 @@ Widget _buildImportProgressIndicator() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void _showQRCode(Product product) {
|
void _showQRCode(Product product) {
|
||||||
final qrUrl = 'https://stock.guycom.mg/${product.reference}';
|
// État pour contrôler le type d'affichage (true = URL complète, false = référence seulement)
|
||||||
|
RxBool showFullUrl = true.obs;
|
||||||
|
|
||||||
Get.dialog(
|
Get.dialog(
|
||||||
AlertDialog(
|
Obx(() {
|
||||||
|
// Données du QR code selon l'état
|
||||||
|
final qrData = showFullUrl.value
|
||||||
|
? 'https://stock.guycom.mg/${product.reference}'
|
||||||
|
: product.reference!;
|
||||||
|
|
||||||
|
return AlertDialog(
|
||||||
title: Row(
|
title: Row(
|
||||||
children: [
|
children: [
|
||||||
const Icon(Icons.qr_code_2, color: Colors.blue),
|
const Icon(Icons.qr_code_2, color: Colors.blue),
|
||||||
@ -933,6 +942,28 @@ Widget _buildImportProgressIndicator() {
|
|||||||
child: Column(
|
child: Column(
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
children: [
|
children: [
|
||||||
|
// Bouton pour basculer entre URL et référence
|
||||||
|
ElevatedButton.icon(
|
||||||
|
onPressed: () {
|
||||||
|
showFullUrl.value = !showFullUrl.value;
|
||||||
|
},
|
||||||
|
icon: Icon(
|
||||||
|
showFullUrl.value ? Icons.link : Icons.tag,
|
||||||
|
size: 16,
|
||||||
|
),
|
||||||
|
label: Text(
|
||||||
|
showFullUrl.value ? 'URL/Référence' : 'Référence',
|
||||||
|
style: const TextStyle(fontSize: 14),
|
||||||
|
),
|
||||||
|
style: ElevatedButton.styleFrom(
|
||||||
|
backgroundColor: showFullUrl.value ? Colors.blue : Colors.green,
|
||||||
|
foregroundColor: Colors.white,
|
||||||
|
minimumSize: const Size(double.infinity, 36),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(height: 16),
|
||||||
|
|
||||||
|
// Container du QR Code
|
||||||
Container(
|
Container(
|
||||||
padding: const EdgeInsets.all(16),
|
padding: const EdgeInsets.all(16),
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
@ -941,13 +972,15 @@ Widget _buildImportProgressIndicator() {
|
|||||||
border: Border.all(color: Colors.grey.shade300),
|
border: Border.all(color: Colors.grey.shade300),
|
||||||
),
|
),
|
||||||
child: QrImageView(
|
child: QrImageView(
|
||||||
data: qrUrl,
|
data: qrData,
|
||||||
version: QrVersions.auto,
|
version: QrVersions.auto,
|
||||||
size: 200,
|
size: 200,
|
||||||
backgroundColor: Colors.white,
|
backgroundColor: Colors.white,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
const SizedBox(height: 16),
|
const SizedBox(height: 16),
|
||||||
|
|
||||||
|
// Affichage des données actuelles
|
||||||
Container(
|
Container(
|
||||||
padding: const EdgeInsets.all(12),
|
padding: const EdgeInsets.all(12),
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
@ -957,12 +990,12 @@ Widget _buildImportProgressIndicator() {
|
|||||||
child: Column(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
Text(
|
Text(
|
||||||
'Référence: ${product.reference}',
|
showFullUrl.value ? 'URL Complète' : 'Référence Seulement',
|
||||||
style: const TextStyle(fontWeight: FontWeight.bold),
|
style: const TextStyle(fontWeight: FontWeight.bold),
|
||||||
),
|
),
|
||||||
const SizedBox(height: 4),
|
const SizedBox(height: 4),
|
||||||
Text(
|
Text(
|
||||||
qrUrl,
|
qrData,
|
||||||
style: const TextStyle(fontSize: 12, color: Colors.grey),
|
style: const TextStyle(fontSize: 12, color: Colors.grey),
|
||||||
textAlign: TextAlign.center,
|
textAlign: TextAlign.center,
|
||||||
),
|
),
|
||||||
@ -975,24 +1008,63 @@ Widget _buildImportProgressIndicator() {
|
|||||||
actions: [
|
actions: [
|
||||||
TextButton(
|
TextButton(
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
Clipboard.setData(ClipboardData(text: qrUrl));
|
Clipboard.setData(ClipboardData(text: qrData));
|
||||||
Get.back();
|
Get.back();
|
||||||
Get.snackbar(
|
Get.snackbar(
|
||||||
'Copié',
|
'Copié',
|
||||||
'URL copiée dans le presse-papiers',
|
'${showFullUrl.value ? "URL" : "Référence"} copiée dans le presse-papiers',
|
||||||
backgroundColor: Colors.green,
|
backgroundColor: Colors.green,
|
||||||
colorText: Colors.white,
|
colorText: Colors.white,
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
child: const Text('Copier URL'),
|
child: Text('Copier ${showFullUrl.value ? "URL" : "Référence"}'),
|
||||||
|
),
|
||||||
|
TextButton(
|
||||||
|
onPressed: () => _generatePDF(product, qrData),
|
||||||
|
child: const Text('Imprimer en PDF'),
|
||||||
),
|
),
|
||||||
TextButton(
|
TextButton(
|
||||||
onPressed: () => Get.back(),
|
onPressed: () => Get.back(),
|
||||||
child: const Text('Fermer'),
|
child: const Text('Fermer'),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
);
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
Future<void> _generatePDF(Product product, String qrUrl) async {
|
||||||
|
final pdf = pw.Document();
|
||||||
|
|
||||||
|
pdf.addPage(
|
||||||
|
pw.Page(
|
||||||
|
build: (pw.Context context) {
|
||||||
|
return pw.Center(
|
||||||
|
child: pw.Column(
|
||||||
|
children: [
|
||||||
|
pw.Text('QR Code - ${product.name}', style: pw.TextStyle(fontSize: 20)),
|
||||||
|
pw.SizedBox(height: 20),
|
||||||
|
pw.BarcodeWidget(
|
||||||
|
barcode: pw.Barcode.qrCode(),
|
||||||
|
data: qrUrl,
|
||||||
|
width: 200,
|
||||||
|
height: 200,
|
||||||
|
),
|
||||||
|
pw.SizedBox(height: 20),
|
||||||
|
pw.Text('URL/Référence: $qrUrl', style: pw.TextStyle(fontSize: 12)),
|
||||||
|
pw.SizedBox(height: 10),
|
||||||
|
pw.Text('Référence: ${product.reference}', style: pw.TextStyle(fontSize: 12)),
|
||||||
|
],
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
final output = await getTemporaryDirectory();
|
||||||
|
final file = File("${output.path}/qrcode.pdf");
|
||||||
|
await file.writeAsBytes(await pdf.save());
|
||||||
|
|
||||||
|
OpenFile.open(file.path);
|
||||||
}
|
}
|
||||||
|
|
||||||
void _editProduct(Product product) {
|
void _editProduct(Product product) {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user