diff --git a/prod115rb-back-b/authsec_springboot/backend/src/main/java/com/realnet/Builders/Services/BuilderService.java b/prod115rb-back-b/authsec_springboot/backend/src/main/java/com/realnet/Builders/Services/BuilderService.java index df685fd..f294100 100644 --- a/prod115rb-back-b/authsec_springboot/backend/src/main/java/com/realnet/Builders/Services/BuilderService.java +++ b/prod115rb-back-b/authsec_springboot/backend/src/main/java/com/realnet/Builders/Services/BuilderService.java @@ -69,6 +69,9 @@ public class BuilderService { executeDump(true); // ADD OTHER SERVICE +addCustomMenu( "Forma", "Transcations"); + + System.out.println("dashboard and menu inserted..."); diff --git a/prod115rb-back-b/authsec_springboot/backend/src/main/java/com/realnet/basicp1/Controllers/FormaController.java b/prod115rb-back-b/authsec_springboot/backend/src/main/java/com/realnet/basicp1/Controllers/FormaController.java new file mode 100644 index 0000000..05f94b9 --- /dev/null +++ b/prod115rb-back-b/authsec_springboot/backend/src/main/java/com/realnet/basicp1/Controllers/FormaController.java @@ -0,0 +1,90 @@ +package com.realnet.basicp1.Controllers; +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; + import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import com.fasterxml.jackson.core.JsonProcessingException; +import org.springframework.web.bind.annotation.CrossOrigin; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.realnet.config.EmailService; +import com.realnet.users.entity1.AppUser; +import com.realnet.users.service1.AppUserServiceImpl; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.beans.factory.annotation.*; +import com.realnet.basicp1.Entity.Forma; +import com.realnet.basicp1.Services.FormaService ; +@RequestMapping(value = "/Forma") + @CrossOrigin("*") +@RestController +public class FormaController { + @Autowired + private FormaService Service; + +@Value("${projectPath}") + private String projectPath; + + + + + + + + + + @PostMapping("/Forma") + public Forma Savedata(@RequestBody Forma data) { + Forma save = Service.Savedata(data) ; + + + + + + + + System.out.println("data saved..." + save); + + return save; + } +@PutMapping("/Forma/{id}") + public Forma update(@RequestBody Forma data,@PathVariable Integer id ) { + Forma update = Service.update(data,id); + System.out.println("data update..." + update); + return update; + } +// get all with pagination + @GetMapping("/Forma/getall/page") + public Page getall(@RequestParam(value = "page", required = false) Integer page, + @RequestParam(value = "size", required = false) Integer size) { + Pageable paging = PageRequest.of(page, size); + Page get = Service.getAllWithPagination(paging); + + return get; + + } + @GetMapping("/Forma") + public List getdetails() { + List get = Service.getdetails(); + return get; +} +// get all without authentication + + @GetMapping("/token/Forma") + public List getallwioutsec() { + List get = Service.getdetails(); + return get; +} +@GetMapping("/Forma/{id}") + public Forma getdetailsbyId(@PathVariable Integer id ) { + Forma get = Service.getdetailsbyId(id); + return get; + } +@DeleteMapping("/Forma/{id}") + public void delete_by_id(@PathVariable Integer id ) { + Service.delete_by_id(id); + + } + +} \ No newline at end of file diff --git a/prod115rb-back-b/authsec_springboot/backend/src/main/java/com/realnet/basicp1/Entity/Forma.java b/prod115rb-back-b/authsec_springboot/backend/src/main/java/com/realnet/basicp1/Entity/Forma.java new file mode 100644 index 0000000..83a14ae --- /dev/null +++ b/prod115rb-back-b/authsec_springboot/backend/src/main/java/com/realnet/basicp1/Entity/Forma.java @@ -0,0 +1,37 @@ +package com.realnet.basicp1.Entity; + import lombok.*; +import com.realnet.WhoColumn.Extension; + import javax.persistence.*; + import java.time.LocalDateTime; + import java.util.*; + + + + + + + + + + @Entity + @Data + public class Forma extends Extension { + /** + * + */ + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Integer id; + +private String namen; + +private String qrcoded; + +private String barcoded; + +private String currencyn; + + +} diff --git a/prod115rb-back-b/authsec_springboot/backend/src/main/java/com/realnet/basicp1/Repository/FormaRepository.java b/prod115rb-back-b/authsec_springboot/backend/src/main/java/com/realnet/basicp1/Repository/FormaRepository.java new file mode 100644 index 0000000..6a69400 --- /dev/null +++ b/prod115rb-back-b/authsec_springboot/backend/src/main/java/com/realnet/basicp1/Repository/FormaRepository.java @@ -0,0 +1,23 @@ +package com.realnet.basicp1.Repository; + + +import org.springframework.data.jpa.repository.JpaRepository; + +import org.springframework.stereotype.Repository; +import java.util.*; + + + + + + + + + + + +import com.realnet.basicp1.Entity.Forma; + +@Repository +public interface FormaRepository extends JpaRepository { +} \ No newline at end of file diff --git a/prod115rb-back-b/authsec_springboot/backend/src/main/java/com/realnet/basicp1/Services/FormaService.java b/prod115rb-back-b/authsec_springboot/backend/src/main/java/com/realnet/basicp1/Services/FormaService.java new file mode 100644 index 0000000..6753d02 --- /dev/null +++ b/prod115rb-back-b/authsec_springboot/backend/src/main/java/com/realnet/basicp1/Services/FormaService.java @@ -0,0 +1,84 @@ +package com.realnet.basicp1.Services; +import com.realnet.basicp1.Repository.FormaRepository; +import com.realnet.basicp1.Entity.Forma;import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import com.realnet.SequenceGenerator.Service.SequenceService; +import com.realnet.Notification.Entity.NotificationService; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import com.realnet.users.service1.AppUserServiceImpl; +import com.realnet.users.entity1.AppUser; + + + + + + + + + import org.springframework.stereotype.Service; + +@Service + public class FormaService { +@Autowired +private FormaRepository Repository; + @Autowired + private AppUserServiceImpl userService; + + + + + + + +public Forma Savedata(Forma data) { + + + + + + + + +Forma save = Repository.save(data); + return save; + } + + +// get all with pagination + public Page getAllWithPagination(Pageable page) { + return Repository.findAll(page); + } +public List getdetails() { + return (List) Repository.findAll(); + } + + +public Forma getdetailsbyId(Integer id) { + return Repository.findById(id).get(); + } + + + public void delete_by_id(Integer id) { + Repository.deleteById(id); +} + + +public Forma update(Forma data,Integer id) { + Forma old = Repository.findById(id).get(); +old.setNamen(data.getNamen()); + +old.setQrcoded(data.getQrcoded()); + +old.setBarcoded(data.getBarcoded()); + +old.setCurrencyn(data.getCurrencyn()); + +final Forma test = Repository.save(old); + return test;} + public AppUser getUser() { + AppUser user = userService.getLoggedInUser(); + return user; + + }} diff --git a/prod115rb-db-d/authsec_mysql/mysql/wf_table/wf_table.sql b/prod115rb-db-d/authsec_mysql/mysql/wf_table/wf_table.sql new file mode 100755 index 0000000..ace3c0f --- /dev/null +++ b/prod115rb-db-d/authsec_mysql/mysql/wf_table/wf_table.sql @@ -0,0 +1,2 @@ +CREATE TABLE db.Forma(id BIGINT NOT NULL AUTO_INCREMENT, BarCoded VARCHAR(400), Currencyn VARCHAR(400), Namen VARCHAR(400), QRCoded VARCHAR(400), PRIMARY KEY (id)); + diff --git a/prod115rb-front-f/authsec_flutterNewUi/base_project/lib/Entity/basicp1/Forma/Forma_api_service.dart b/prod115rb-front-f/authsec_flutterNewUi/base_project/lib/Entity/basicp1/Forma/Forma_api_service.dart new file mode 100644 index 0000000..799947e --- /dev/null +++ b/prod115rb-front-f/authsec_flutterNewUi/base_project/lib/Entity/basicp1/Forma/Forma_api_service.dart @@ -0,0 +1,92 @@ +import 'package:dio/dio.dart'; +import 'package:http_parser/http_parser.dart'; +import 'dart:typed_data'; +import 'package:image_picker/image_picker.dart'; +import '../../../resources/api_constants.dart'; +import '../../../helpers/api_helper/api_helper.dart'; +import 'dart:convert'; +import 'dart:typed_data'; +class formaApiService { + final String baseUrl = ApiConstants.baseUrl; + final Dio dio = Dio(); + final ApiHelper _helper = ApiHelper(); + + + Future>> getEntities() async { + + try { + final response = await _helper.get('$baseUrl/Forma/Forma'); + final entities = (response.data as List).cast>(); + return entities; + } catch (e) { + throw Exception('Failed to get all entities: $e'); + } + } +Future>> getAllWithPagination( + String token, int page, int Size) async { + try { + dio.options.headers['Authorization'] = 'Bearer $token'; + final response = await dio + .get('$baseUrl/Forma/Forma/getall/page?page=$page&size=$Size'); + final entities = + (response.data['content'] as List).cast>(); + return entities; + } catch (e) { + throw Exception('Failed to get all without pagination: $e'); + } + } + Future> createEntity( + String token, Map entity) async { + try { + print("in post api$entity"); + dio.options.headers['Authorization'] = 'Bearer $token'; + final response = + await dio.post('$baseUrl/Forma/Forma', data: entity); + + print(entity); + + // Assuming the response is a Map + Map responseData = response.data; + + return responseData; + } catch (e) { + throw Exception('Failed to create entity: $e'); + } + } + + + + + + + + + + Future updateEntity(String token, int entityId, Map entity) async { + try { + dio.options.headers['Authorization'] = 'Bearer $token'; + await dio.put('$baseUrl/Forma/Forma/$entityId', + data: entity); print(entity); + + } catch (e) { + throw Exception('Failed to update entity: $e'); + } + } + + Future deleteEntity(String token, int entityId) async { + try { + dio.options.headers['Authorization'] = 'Bearer $token'; + await dio.delete('$baseUrl/Forma/Forma/$entityId'); + } catch (e) { + throw Exception('Failed to delete entity: $e'); + } + } + + + + + + + + +} \ No newline at end of file diff --git a/prod115rb-front-f/authsec_flutterNewUi/base_project/lib/Entity/basicp1/Forma/Forma_create_entity_screen.dart b/prod115rb-front-f/authsec_flutterNewUi/base_project/lib/Entity/basicp1/Forma/Forma_create_entity_screen.dart new file mode 100644 index 0000000..e447d0e --- /dev/null +++ b/prod115rb-front-f/authsec_flutterNewUi/base_project/lib/Entity/basicp1/Forma/Forma_create_entity_screen.dart @@ -0,0 +1,363 @@ +// ignore_for_file: use_build_context_synchronously +import 'dart:convert'; +import 'package:flutter/material.dart'; +import 'package:file_picker/file_picker.dart'; +import 'package:image_picker/image_picker.dart'; +import '../../../utils/image_constant.dart'; +import '../../../utils/size_utils.dart'; +import '../../../theme/app_style.dart'; +import '../../../widgets/app_bar/appbar_image.dart'; +import '../../../widgets/app_bar/appbar_title.dart'; +import '../../../widgets/app_bar/custom_app_bar.dart'; +import '../../../widgets/custom_button.dart'; +import '../../../widgets/custom_text_form_field.dart'; +import '../../../widgets/custom_dropdown_field.dart'; +import 'dart:math'; +import 'package:qr_flutter/qr_flutter.dart'; +import 'package:barcode_widget/barcode_widget.dart'; +import 'package:flutter_barcode_scanner/flutter_barcode_scanner.dart'; +import 'package:intl/intl.dart'; + +import 'Forma_api_service.dart'; +import '../../../providers/token_manager.dart'; +import 'package:autocomplete_textfield/autocomplete_textfield.dart'; +import 'package:http/http.dart' as http; +import 'package:flutter/services.dart'; +import 'package:image_picker/image_picker.dart'; +import 'package:fluttertoast/fluttertoast.dart'; +import '../../../Reuseable/reusable_date_picker_field.dart'; +import '../../../Reuseable/reusable_date_time_picker_field.dart' +;import 'package:multi_select_flutter/multi_select_flutter.dart'; +import 'package:just_audio/just_audio.dart'; +import 'package:video_player/video_player.dart'; +import 'dart:io'; +import '../../../Reuseable/reusable_text_field.dart'; +import 'package:google_mlkit_text_recognition/google_mlkit_text_recognition.dart'; +class formaCreateEntityScreen extends StatefulWidget { + const formaCreateEntityScreen({super.key}); + + @override + _formaCreateEntityScreenState createState() => _formaCreateEntityScreenState(); +} + +class _formaCreateEntityScreenState extends State { + final formaApiService apiService = formaApiService(); +final Map formData = {}; + final _formKey = GlobalKey(); + final TextEditingController namenController = TextEditingController(); + + + String inputDataqrcoded = 'Hello QR!'; // Default data for QR code generation + TextEditingController controllerInputqrcoded = TextEditingController(); + + String inputDatabarcoded = 'Hello BarCode'; // By default barcode + TextEditingController controllerInputbarcoded = TextEditingController(); + +String inputValuecurrencyn = ''; +String outputValuecurrencyn = ''; + +void _convertCurrency_currencyn() { + String inputText = inputValuecurrencyn.replaceAll(',', ''); // Remove commas + try { + double parsedValue = double.parse(inputText); // Parse the value + String formattedValue = + parsedValue.toStringAsFixed(2); // Format to 2 decimal places + setState(() { + outputValuecurrencyn = formattedValue; + }); + } catch (e) { + setState(() { + outputValuecurrencyn = "Invalid input"; + }); + } +} + + + @override + void initState() { + super.initState(); + + +controllerInputqrcoded.text = inputDataqrcoded; + + controllerInputbarcoded.text = inputDatabarcoded; + + + +} + + Future performOCR() async { + try { + final ImagePicker _picker = ImagePicker(); + + // Show options for gallery or camera using a dialog + await showDialog( + context: context, + builder: (BuildContext context) { + return AlertDialog( + title: const Text('Select Image Source'), + content: SingleChildScrollView( + child: ListBody( + children: [ + GestureDetector( + child: const Text('Gallery'), + onTap: () async { + Navigator.of(context).pop(); + final XFile? image = + await _picker.pickImage(source: ImageSource.gallery); + processImage(image); + }, + ), + const SizedBox(height: 20), + GestureDetector( + child: const Text('Camera'), + onTap: () async { + Navigator.of(context).pop(); + final XFile? image = + await _picker.pickImage(source: ImageSource.camera); + processImage(image); + }, + ), + ], + ), + ), + ); + }, + ); + } catch (e) { + print("OCR Error: $e"); + // Handle OCR errors here + } + } + + + final textRecognizer = TextRecognizer(); + + void processImage(XFile? image) async { + if (image == null) return; // User canceled image picking + + final file = File(image.path); + + final inputImage = InputImage.fromFile(file); + final recognizedText = await textRecognizer.processImage(inputImage); + + StringBuffer extractedTextBuffer = StringBuffer(); + for (TextBlock block in recognizedText.blocks) { + for (TextLine line in block.lines) { + extractedTextBuffer.write(line.text + ' '); + } + } + + textRecognizer.close(); + + String extractedText = extractedTextBuffer.toString().trim(); + + // Now you can process the extracted text as needed + // For example, you can update the corresponding TextFormField with the extracted text + setState(() { + formData['description'] = extractedText; + }); + } + + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: CustomAppBar( + height: getVerticalSize(49), + leadingWidth: 40, + leading: AppbarImage( + height: getSize(24), + width: getSize(24), + svgPath: ImageConstant.imgArrowleftBlueGray900, + margin: getMargin(left: 16, top: 12, bottom: 13), + onTap: () { + Navigator.pop(context); + }), + centerTitle: true, + title: AppbarTitle(text: "Create Forma"), + + + + + + + +), + body: SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.all(16), + child: Form( + key: _formKey, + child: Column( + children: [ + ReusableTextField( + controller: namenController, + + onSaved:(value) => formData['namen'] = value , + label:"Enter Namen", + // ValidationProperties +), + + SizedBox(height: 16), + + + Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + 'Generate QR Code', + style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + ), + const SizedBox(height: 16), + QrImageView( + data: inputDataqrcoded, + version: QrVersions.auto, + size: 200.0, + gapless: false, + ), + const SizedBox(height: 16), + TextField( + controller: controllerInputqrcoded, + decoration: InputDecoration( + border: OutlineInputBorder(), + labelText: 'Enter data for QR code', + ), + onChanged: (value) { + setState(() { + inputDataqrcoded = value; + }); + }, + ), + ], + ), + ), + + + Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + const Text( + 'Generate Barcode', + style: TextStyle(fontSize: 18), + ), + const SizedBox(height: 16), + if (inputDatabarcoded.isNotEmpty) + BarcodeWidget( + barcode: Barcode.code128(), // Choose the type of barcode + data: inputDatabarcoded, + width: 200, + height: 80, + ), + const SizedBox(height: 16), + TextField( + controller: controllerInputbarcoded, + decoration: const InputDecoration( + border: OutlineInputBorder(), + labelText: 'Enter data for barcode', + ), + onChanged: (value) { + setState(() { + inputDatabarcoded = value; + formData['barcoded'] = inputDatabarcoded; + }); + }, + ), + const SizedBox(height: 16), + + ], + ), + + TextFormField( + keyboardType: TextInputType.number, + onChanged: (text) { + setState(() { + inputValuecurrencyn = text; + }); + }, + decoration: const InputDecoration( + labelText: + 'Enter Currency Value (with or without commas)', + prefixIcon: Icon(Icons.currency_rupee), + border: OutlineInputBorder(), + + ), + onSaved: (value) { + _convertCurrency_currencyn(); + formData['currencyn'] = outputValuecurrencyn; + }), + const SizedBox(height: 16), + + const SizedBox(width: 8), + CustomButton( + height: getVerticalSize(50), + text: "Submit", + margin: getMargin(top: 24, bottom: 5), + onTap: () async { + if (_formKey.currentState!.validate()) { + _formKey.currentState!.save(); + + + + + + + + + + final token = await TokenManager.getToken(); + try { + print(formData); + Map createdEntity = await apiService.createEntity(token!, formData); + + + + + + + + + + + Navigator.pop(context); + } catch (e) { + // ignore: use_build_context_synchronously + showDialog( + context: context, + builder: (BuildContext context) { + return AlertDialog( + title: const Text('Error'), + content: Text('Failed to create Forma: $e'), + actions: [ + TextButton( + child: const Text('OK'), + onPressed: () { + Navigator.of(context).pop(); + }, + ), + ], + ); + }, + ); + } + } + }, + ), + + + + + + + + + ], + ), + ), + ), + ), + ); + } +} diff --git a/prod115rb-front-f/authsec_flutterNewUi/base_project/lib/Entity/basicp1/Forma/Forma_entity_list_screen.dart b/prod115rb-front-f/authsec_flutterNewUi/base_project/lib/Entity/basicp1/Forma/Forma_entity_list_screen.dart new file mode 100644 index 0000000..b9d096f --- /dev/null +++ b/prod115rb-front-f/authsec_flutterNewUi/base_project/lib/Entity/basicp1/Forma/Forma_entity_list_screen.dart @@ -0,0 +1,672 @@ +// ignore_for_file: use_build_context_synchronously +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'Forma_api_service.dart'; +import 'Forma_create_entity_screen.dart'; +import 'Forma_update_entity_screen.dart'; +import '../../../providers/token_manager.dart'; +import 'package:flutter/services.dart'; +import 'package:speech_to_text/speech_to_text.dart' as stt; +import '../../../theme/app_style.dart'; +import '../../../utils/size_utils.dart'; +import '../../../widgets/custom_icon_button.dart'; +import '../../../utils/image_constant.dart'; +import '../../../widgets/app_bar/appbar_image.dart'; +import '../../../widgets/app_bar/appbar_title.dart'; +import '../../../widgets/app_bar/custom_app_bar.dart'; +import '../../../theme/app_decoration.dart'; +import 'package:multi_select_flutter/multi_select_flutter.dart'; +import '../../../Reuseable/reusable_text_field.dart'; +import 'package:fluttertoast/fluttertoast.dart'; + +class forma_entity_list_screen extends StatefulWidget { + static const String routeName = '/entity-list'; + + @override + _forma_entity_list_screenState createState() => _forma_entity_list_screenState(); +} + +class _forma_entity_list_screenState extends State { + + final formaApiService apiService = formaApiService(); + List> entities = []; + List> filteredEntities = []; + List> serachEntities = []; + + bool showCardView = true; // Add this variable to control the view mode + TextEditingController searchController = TextEditingController(); + late stt.SpeechToText _speech; + + bool isLoading = false; // Add this variable to track loading state + int currentPage = 0; + int pageSize = 10; // Adjust this based on your backend API + + final ScrollController _scrollController = ScrollController(); + @override + void initState() { + _speech = stt.SpeechToText(); + super.initState(); + fetchEntities(); + _scrollController.addListener(_scrollListener); + fetchwithoutpaging(); + } + + + + + + + + + + Future fetchwithoutpaging() async { + try { + final token = await TokenManager.getToken(); + if (token != null) { + final fetchedEntities = + await apiService.getEntities(); + print('withoutpaging data is $fetchedEntities'); + setState(() { + serachEntities = fetchedEntities; // Update only filteredEntities + }); + print('Forma entity is .. $serachEntities'); + } + } catch (e) { + showDialog( + context: context, + builder: (BuildContext context) { + return AlertDialog( + title: const Text('Error'), + content: Text('Failed to fetch Forma: $e'), + actions: [ + TextButton( + child: const Text('OK'), + onPressed: () { + Navigator.of(context).pop(); + }, + ), + ], + ); + }, + ); + } + } +Future fetchEntities() async { + try { + setState(() { + isLoading = true; + }); + + final token = await TokenManager.getToken(); + if (token != null) { + + final fetchedEntities = + await apiService.getAllWithPagination(token, currentPage, pageSize); + print('pagination data is $fetchedEntities'); + setState(() { + entities.addAll(fetchedEntities); // Add new data to the existing list + filteredEntities = entities.toList(); // Update only filteredEntities + currentPage++; + }); + + print(' entity is .. $filteredEntities'); + } + } catch (e) { + showDialog( + context: context, + builder: (BuildContext context) { + return AlertDialog( + title: const Text('Error'), + content: Text('Failed to fetch Forma data: $e'), + actions: [ + TextButton( + child: const Text('OK'), + onPressed: () { + Navigator.of(context).pop(); + }, + ), + ], + ); + }, + ); + } finally { + setState(() { + isLoading = false; + }); + } + } + + void _scrollListener() { + if (_scrollController.position.pixels == + _scrollController.position.maxScrollExtent) { + fetchEntities(); + } + } + + Future deleteEntity(Map entity) async { + try { + final token = await TokenManager.getToken(); + await apiService.deleteEntity(token!, entity['id']); + setState(() { + entities.remove(entity); + }); + } catch (e) { + showDialog( + context: context, + builder: (BuildContext context) { + return AlertDialog( + title: const Text('Error'), + content: Text('Failed to delete entity: $e'), + actions: [ + TextButton( + child: const Text('OK'), + onPressed: () { + Navigator.of(context).pop(); + }, + ), + ], + ); + }, + ); + } + } + + void _searchEntities(String keyword) { + setState(() { + filteredEntities = serachEntities + .where((entity) => + + + + entity['namen'].toString().toLowerCase().contains(keyword.toLowerCase()) || + + + + + + entity['qrcoded'].toString().toLowerCase().contains(keyword.toLowerCase()) || + + + + + + entity['barcoded'].toString().toLowerCase().contains(keyword.toLowerCase()) || + + + + + + entity['currencyn'].toString().toLowerCase().contains(keyword.toLowerCase()) + + + ).toList(); + }); + } + + void _startListening() async { + if (!_speech.isListening) { + bool available = await _speech.initialize( + onStatus: (status) { + print('Speech recognition status: $status'); + }, + onError: (error) { + print('Speech recognition error: $error'); + }, + ); + + if (available) { + _speech.listen( + onResult: (result) { + if (result.finalResult) { + searchController.text = result.recognizedWords; + _searchEntities(result.recognizedWords); + } + }, + ); + } + } + } + + void _stopListening() { + if (_speech.isListening) { + _speech.stop(); + } + } + + @override + void dispose() { + _speech.cancel(); + super.dispose(); + } + +onTapArrowleft1(BuildContext context) { + Navigator.pop(context); + } + @override + Widget build(BuildContext context) { + return SafeArea( + child: Scaffold( + appBar: CustomAppBar( + height: getVerticalSize(49), + leadingWidth: 40, + leading: AppbarImage( + height: getSize(24), + width: getSize(24), + svgPath: ImageConstant.imgArrowleft, + margin: getMargin(left: 16, top: 12, bottom: 13), + onTap: () { + onTapArrowleft1(context); + }), + centerTitle: true, + title: AppbarTitle(text: " Forma"), + actions: [ + Row( + children: [ + Switch( + activeColor: Colors.greenAccent, + inactiveThumbColor: Colors.white, + value: showCardView, + onChanged: (value) { + setState(() { + showCardView = value; + }); + }, + ), + + + + + + + + + + ], + ), ], + ), + body: RefreshIndicator( + onRefresh: () async { + currentPage = 1; + entities.clear(); + await fetchEntities(); + }, + child: Column( + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: TextField( + controller: searchController, + onChanged: (value) { + _searchEntities(value); + }, + decoration: InputDecoration( + hintText: 'Search...', + contentPadding: const EdgeInsets.symmetric(horizontal: 16.0), + filled: true, + fillColor: Colors.grey[200], + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(10.0), + borderSide: BorderSide.none, + ), + suffixIcon: IconButton( + icon: const Icon(Icons.mic), + onPressed: () { + _startListening(); + }, + ), + ), + ), + ), + Expanded( + child: ListView.builder( + itemCount: filteredEntities.length + (isLoading ? 1 : 0), + itemBuilder: (BuildContext context, int index) { + if (index < filteredEntities.length) { + final entity = filteredEntities[index]; + return _buildListItem(entity); + } else { + // Display the loading indicator at the bottom when new data is loading + return const Padding( + padding: EdgeInsets.all(8.0), + child: Center( + child: CircularProgressIndicator(), + ), + ); + } + }, + controller: _scrollController, + ), + ), + ], + ), + ), + floatingActionButton: FloatingActionButton( + onPressed: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => formaCreateEntityScreen(), + ), + ).then((_) { + fetchEntities(); + }); + }, + child: const Icon(Icons.add), + ), + )); + } + + Widget _buildListItem(Map entity) { + return showCardView ? _buildCardView(entity) : _buildNormalView(entity); + } + + + // Function to build card view for a list item + Widget _buildCardView(Map entity) { + return Card( + elevation: 2, + margin: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), + child: _buildNormalView(entity)) + ; } + + // Function to build normal view for a list item + + // Function to build normal view for a list item + + Widget _buildNormalView(Map entity) { + final values = entity.values.elementAt(21) ?? 'Authsec'; + + return SizedBox( + width: double.maxFinite, + child: Container( + padding: getPadding( + left: 16, + top: 5, + right: 5, + bottom: 17, + ), + decoration: AppDecoration.outlineGray70011.copyWith( + borderRadius: BorderRadiusStyle.roundedBorder6, + color: Colors.grey[100]), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: getPadding( + //right: 13, + ), + child: Row( + children: [ + Container( + width: MediaQuery.of(context).size.width * 0.30, + margin: getMargin( + left: 8, + top: 3, + bottom: 1, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text( + entity['id'].toString(), + overflow: TextOverflow.ellipsis, + textAlign: TextAlign.left, + style: AppStyle.txtGreenSemiBold16, + ), + ], + ), + ), + const Spacer(), + PopupMenuButton( + icon: const Icon( + Icons.more_vert, + color: Colors.black, + size: 16, + ), + itemBuilder: (BuildContext context) { + return [ + PopupMenuItem( + value: 'edit', + child: Row( + children: [ + const Icon( + Icons.edit, + size: 16, // Adjust the icon size as needed + ), + const SizedBox(width: 8), + Text( + 'Edit', + style: AppStyle + .txtGilroySemiBold16, // Adjust the text size as needed + ), + ], + ), + ), + PopupMenuItem( + value: 'delete', + child: Row( + children: [ + const Icon( + Icons.delete, + size: 16, // Adjust the icon size as needed + ), + const SizedBox(width: 8), + Text( + 'Delete', + style: AppStyle + .txtGilroySemiBold16, // Adjust the text size as needed + ), + ], + ), + ), + ]; + }, + onSelected: (String value) { + if (value == 'edit') { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => + formaUpdateEntityScreen(entity: entity), + ), + ).then((_) { + fetchEntities(); + }); + } else if (value == 'delete') { + showDialog( + context: context, + builder: (BuildContext context) { + return AlertDialog( + title: const Text('Confirm Deletion'), + content: const Text( + 'Are you sure you want to delete?'), + actions: [ + TextButton( + child: const Text('Cancel'), + onPressed: () { + Navigator.of(context).pop(); + }, + ), + TextButton( + child: const Text('Delete'), + onPressed: () { + Navigator.of(context).pop(); + deleteEntity(entity) + .then((value) => {fetchEntities()}); + }, + ), + ], + ); + }, + ); + } + }, + ), + ], + ), + ), + + Padding( + padding: getPadding( + top: 10, + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + "Namen : ", + overflow: TextOverflow.ellipsis, + textAlign: TextAlign.left, + style: AppStyle.txtGilroyMedium16, + ), + Text( + entity['namen'].toString() ?? 'No Namen Available', + overflow: TextOverflow.ellipsis, + textAlign: TextAlign.left, + style: AppStyle.txtGilroyMedium16Bluegray900, + ), + ], + ), + ), + + + Padding( + padding: getPadding( + top: 10, + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + "QRCoded : ", + overflow: TextOverflow.ellipsis, + textAlign: TextAlign.left, + style: AppStyle.txtGilroyMedium16, + ), + Text( + entity['qrcoded'].toString() ?? 'No QRCoded Available', + overflow: TextOverflow.ellipsis, + textAlign: TextAlign.left, + style: AppStyle.txtGilroyMedium16Bluegray900, + ), + ], + ), + ), + + + Padding( + padding: getPadding( + top: 10, + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + "BarCoded : ", + overflow: TextOverflow.ellipsis, + textAlign: TextAlign.left, + style: AppStyle.txtGilroyMedium16, + ), + Text( + entity['barcoded'].toString() ?? 'No BarCoded Available', + overflow: TextOverflow.ellipsis, + textAlign: TextAlign.left, + style: AppStyle.txtGilroyMedium16Bluegray900, + ), + ], + ), + ), + + + Padding( + padding: getPadding( + top: 10, + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + "Currencyn : ", + overflow: TextOverflow.ellipsis, + textAlign: TextAlign.left, + style: AppStyle.txtGilroyMedium16, + ), + Text( + entity['currencyn'].toString() ?? 'No Currencyn Available', + overflow: TextOverflow.ellipsis, + textAlign: TextAlign.left, + style: AppStyle.txtGilroyMedium16Bluegray900, + ), + ], + ), + ), + + + ], + ), + ), + ); + } + + Widget _buildLeadingIcon(String title) { + return CircleAvatar( + backgroundColor: Colors.blue, + child: Text( + title.isNotEmpty ? title[0].toUpperCase() : 'NA', + style: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold), + ), + ); + } + + void _showAdditionalFieldsDialog( + BuildContext context, + Map entity, + ) { + final dateFormat = DateFormat('yyyy-MM-dd HH:mm:ss'); + + showDialog( + context: context, + builder: (BuildContext context) { + return AlertDialog( + title: const Text('Additional Fields'), + content: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Text( + 'Created At: ${_formatTimestamp(entity['createdAt'], dateFormat)}'), + Text('Created By: ${entity['createdBy'] ?? 'N/A'}'), + Text('Updated By: ${entity['updatedBy'] ?? 'N/A'}'), + Text( + 'Updated At: ${_formatTimestamp(entity['updatedAt'], dateFormat)}'), + Text('Account ID: ${entity['accountId'] ?? 'N/A'}'), + ], + ), + actions: [ + TextButton( + child: const Text('Close'), + onPressed: () { + Navigator.of(context).pop(); + }, + ), + ], + ); + }, + ); + } + + String _formatTimestamp(dynamic timestamp, DateFormat dateFormat) { + if (timestamp is int) { + final DateTime dateTime = DateTime.fromMillisecondsSinceEpoch(timestamp); + return dateFormat.format(dateTime); + } else if (timestamp is String) { + return timestamp; + } else { + return 'N/A'; + } + } +} + \ No newline at end of file diff --git a/prod115rb-front-f/authsec_flutterNewUi/base_project/lib/Entity/basicp1/Forma/Forma_update_entity_screen.dart b/prod115rb-front-f/authsec_flutterNewUi/base_project/lib/Entity/basicp1/Forma/Forma_update_entity_screen.dart new file mode 100644 index 0000000..de1d0b8 --- /dev/null +++ b/prod115rb-front-f/authsec_flutterNewUi/base_project/lib/Entity/basicp1/Forma/Forma_update_entity_screen.dart @@ -0,0 +1,306 @@ +// ignore_for_file: use_build_context_synchronously +import 'dart:convert'; +import '../../../utils/image_constant.dart'; +import '../../../utils/size_utils.dart'; +import '../../../theme/app_style.dart'; +import '../../../widgets/app_bar/appbar_image.dart'; +import '../../../widgets/app_bar/appbar_title.dart'; +import '../../../widgets/app_bar/custom_app_bar.dart'; +import 'package:barcode_widget/barcode_widget.dart'; +import 'package:fluttertoast/fluttertoast.dart'; +import '../../../widgets/custom_button.dart'; +import '../../../widgets/custom_text_form_field.dart'; +import 'package:flutter/material.dart'; +import 'package:autocomplete_textfield/autocomplete_textfield.dart'; +import 'package:qr_flutter/qr_flutter.dart'; +import 'package:intl/intl.dart'; + +import 'Forma_api_service.dart'; +import 'dart:math'; +import '../../../Reuseable/reusable_text_field.dart'; +import '../../../Reuseable/reusable_date_picker_field.dart'; +import '../../../Reuseable/reusable_date_time_picker_field.dart'; +import '../../../providers/token_manager.dart'; + +import 'package:flutter/services.dart'; +class formaUpdateEntityScreen extends StatefulWidget { + final Map entity; + + + formaUpdateEntityScreen({required this.entity}); + + @override + _formaUpdateEntityScreenState createState() => _formaUpdateEntityScreenState(); +} + +class _formaUpdateEntityScreenState extends State { + final formaApiService apiService = formaApiService(); + final _formKey = GlobalKey(); + + + +late String inputDataqrcoded; + late TextEditingController controllerInputqrcoded; + + + late String inputDatabarcoded; // By default barcode + TextEditingController controllerInputbarcoded = TextEditingController(); + + +final TextEditingController _inputcurrencynController = TextEditingController(); +double editedcurrencynValue = 0.0; + + + @override + void initState() { + super.initState(); + + + inputDataqrcoded = widget.entity['qrcoded'] ?? "Hello"; + controllerInputqrcoded = TextEditingController(text: inputDataqrcoded); + + inputDatabarcoded = widget.entity['barcoded'] ?? "Hello"; + controllerInputbarcoded.text = inputDatabarcoded; + + + // Convert the currency value to double if it's not already + if (widget.entity['currency'] is String) { + widget.entity['currency'] = + double.tryParse(widget.entity['currency']) ?? 0.0; + } + + // Initially set the controller text without formatting + _inputcurrencyController.text = widget.entity['currency'].toString(); + editedcurrencyValue = widget.entity['currency']; + +} + + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: CustomAppBar( + height: getVerticalSize(49), + leadingWidth: 40, + leading: AppbarImage( + height: getSize(24), + width: getSize(24), + svgPath: ImageConstant.imgArrowleftBlueGray900, + margin: getMargin(left: 16, top: 12, bottom: 13), + onTap: () { + Navigator.pop(context); + }), + centerTitle: true, + title: AppbarTitle(text: "Update Forma"), actions: [ + + + + + + + + + ], +), + body: SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.all(16), + child: Form( + key: _formKey, + child: Column( + children: [ + + ReusableTextField( + + label: "Please Enter Namen", + initialValue: widget.entity['namen'] ?? '', + + // ValidationProperties + onSaved: (value) => widget.entity['namen'] = value, +), + + SizedBox(height: 16), + + +Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + 'Generate QR Code', + style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + ), + const SizedBox(height: 16), + QrImageView( + data: inputDataqrcoded, + version: QrVersions.auto, + size: 200.0, + gapless: false, + ), + const SizedBox(height: 16), + TextField( + controller: controllerInputqrcoded, + decoration: InputDecoration( + border: OutlineInputBorder(), + labelText: 'Enter data for QR code', + ), + onChanged: (value) { + setState(() { + inputDataqrcoded = value; + }); + }, + ), + ], + ), + + Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + const Text( + 'Generate Barcode', + style: TextStyle(fontSize: 18), + ), + const SizedBox(height: 16), + if (inputDatabarcoded.isNotEmpty) + BarcodeWidget( + barcode: Barcode.code128(), // Choose the type of barcode + data: inputDatabarcoded, + width: 200, + height: 80, + ), + const SizedBox(height: 16), + TextField( + controller: controllerInputbarcoded, + decoration: const InputDecoration( + border: OutlineInputBorder(), + labelText: 'Enter data for barcode', + ), + onChanged: (value) { + setState(() { + inputDatabarcoded = value; + widget.entity['barcoded'] = inputDatabarcoded; + }); + }, + ), + const SizedBox(height: 16), + // ElevatedButton( + // onPressed: () { + // setState(() { + // inputData = controllerInput.text; + // }); + // }, + // child: const Text('Generate Barcode'), + // ), + ], + ), + const SizedBox(height: 16), + +Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + TextFormField( + controller: _inputcurrencynController, + keyboardType: TextInputType.number, + decoration: const InputDecoration( + labelText: 'Edit Currency Value', + prefixIcon: Icon(Icons.money), + border: OutlineInputBorder(), + + ), + onChanged: (text) { + setState(() { + try { + String currencyString = text; + currencyString = currencyString.replaceAll(',', ''); // Remove commas + currencyString = currencyString.replaceAll('₹', ''); // Remove currency symbol + editedcurrencynValue = double.parse(currencyString); + print("Parsed double value: $editedcurrencynValue"); + } catch (e) { + print("Invalid input: $text"); + editedcurrencynValue = 0.0; // Set to a default value or handle the error accordingly + } + }); + }, + onSaved: (value) { + widget.entity['currencyn'] = editedcurrencynValue; + }, + ), + SizedBox(height: 16), + Text( + 'Edited Currency Value: ${editedcurrencynValue.toStringAsFixed(2)}', // Display formatted currency value + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + ), + ), + SizedBox(height: 16), + // Add other form fields here + ], +), + + + + CustomButton( + height: getVerticalSize(50), + text: "Update", + margin: getMargin(top: 24, bottom: 5), + onTap: () async { + if (_formKey.currentState!.validate()) { + _formKey.currentState!.save(); + + + + + + + + + + final token = await TokenManager.getToken(); + try { + await apiService.updateEntity( + token!, + widget.entity[ + 'id'], // Assuming 'id' is the key in your entity map + widget.entity); + + + + + + + + + + Navigator.pop(context); + } catch (e) { + // ignore: use_build_context_synchronously + showDialog( + context: context, + builder: (BuildContext context) { + return AlertDialog( + title: const Text('Error'), + content: + Text('Failed to update Forma: $e'), + actions: [ + TextButton( + child: const Text('OK'), + onPressed: () { + Navigator.of(context).pop(); + }, + ), + ], + ); + }, + ); + } + } + }, + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/prod115rb-front-f/authsec_flutterNewUi/base_project/lib/screens/ReuseableWidgets/CustomDrawer.dart b/prod115rb-front-f/authsec_flutterNewUi/base_project/lib/screens/ReuseableWidgets/CustomDrawer.dart index cac5229..c132d28 100644 --- a/prod115rb-front-f/authsec_flutterNewUi/base_project/lib/screens/ReuseableWidgets/CustomDrawer.dart +++ b/prod115rb-front-f/authsec_flutterNewUi/base_project/lib/screens/ReuseableWidgets/CustomDrawer.dart @@ -1,3 +1,5 @@ +import '../../Entity/basicp1/Forma/Forma_entity_list_screen.dart'; + import 'dart:io'; import 'package:base_project/core/app_export.dart'; import 'package:flutter/material.dart'; @@ -171,6 +173,21 @@ class _CustomDrawerState extends State { SizedBox(height: 18.v), // NEW MENU +_myButton( + context, + "Forma", + () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => forma_entity_list_screen(), + ), + ); + }, + false, + ), + SizedBox(height: 18.v), + _myButton( context, @@ -301,4 +318,4 @@ class _CustomDrawerState extends State { }, ); } -} +} \ No newline at end of file