build_app
This commit is contained in:
parent
4800cec522
commit
e4d166f2b7
@ -69,6 +69,12 @@ public class BuilderService {
|
|||||||
executeDump(true);
|
executeDump(true);
|
||||||
|
|
||||||
// ADD OTHER SERVICE
|
// ADD OTHER SERVICE
|
||||||
|
addCustomMenu( "Child", "Transcations");
|
||||||
|
|
||||||
|
|
||||||
|
addCustomMenu( "Testm", "Transcations");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
System.out.println("dashboard and menu inserted...");
|
System.out.println("dashboard and menu inserted...");
|
||||||
|
|
||||||
|
|||||||
@ -0,0 +1,83 @@
|
|||||||
|
package com.realnet.forma.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.*;
|
||||||
|
import com.realnet.fnd.response.EntityResponse;
|
||||||
|
import org.springframework.http.*;
|
||||||
|
import org.springframework.beans.factory.annotation.*;
|
||||||
|
import com.realnet.forma.Entity.Child;
|
||||||
|
import com.realnet.forma.Services.ChildService ;
|
||||||
|
|
||||||
|
|
||||||
|
@RequestMapping(value = "/Child")
|
||||||
|
@CrossOrigin("*")
|
||||||
|
@RestController
|
||||||
|
public class ChildController {
|
||||||
|
@Autowired
|
||||||
|
private ChildService Service;
|
||||||
|
|
||||||
|
@Value("${projectPath}")
|
||||||
|
private String projectPath;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@PostMapping("/Child")
|
||||||
|
public Child Savedata(@RequestBody Child data) {
|
||||||
|
Child save = Service.Savedata(data) ;
|
||||||
|
|
||||||
|
System.out.println("data saved..." + save);
|
||||||
|
|
||||||
|
return save;
|
||||||
|
}
|
||||||
|
@PutMapping("/Child/{id}")
|
||||||
|
public Child update(@RequestBody Child data,@PathVariable Integer id ) {
|
||||||
|
Child update = Service.update(data,id);
|
||||||
|
System.out.println("data update..." + update);
|
||||||
|
return update;
|
||||||
|
}
|
||||||
|
// get all with pagination
|
||||||
|
@GetMapping("/Child/getall/page")
|
||||||
|
public Page<Child> getall(@RequestParam(value = "page", required = false) Integer page,
|
||||||
|
@RequestParam(value = "size", required = false) Integer size) {
|
||||||
|
Pageable paging = PageRequest.of(page, size);
|
||||||
|
Page<Child> get = Service.getAllWithPagination(paging);
|
||||||
|
|
||||||
|
return get;
|
||||||
|
|
||||||
|
}
|
||||||
|
@GetMapping("/Child")
|
||||||
|
public List<Child> getdetails() {
|
||||||
|
List<Child> get = Service.getdetails();
|
||||||
|
return get;
|
||||||
|
}
|
||||||
|
// get all without authentication
|
||||||
|
|
||||||
|
@GetMapping("/token/Child")
|
||||||
|
public List<Child> getallwioutsec() {
|
||||||
|
List<Child> get = Service.getdetails();
|
||||||
|
return get;
|
||||||
|
}
|
||||||
|
@GetMapping("/Child/{id}")
|
||||||
|
public Child getdetailsbyId(@PathVariable Integer id ) {
|
||||||
|
Child get = Service.getdetailsbyId(id);
|
||||||
|
return get;
|
||||||
|
}
|
||||||
|
@DeleteMapping("/Child/{id}")
|
||||||
|
public ResponseEntity<?> delete_by_id(@PathVariable Integer id ) {
|
||||||
|
Service.delete_by_id(id);
|
||||||
|
return new ResponseEntity<>(new EntityResponse("Deleted"), HttpStatus.OK);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,139 @@
|
|||||||
|
package com.realnet.forma.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.*;
|
||||||
|
import com.realnet.fnd.response.EntityResponse;
|
||||||
|
import org.springframework.http.*;
|
||||||
|
import org.springframework.beans.factory.annotation.*;
|
||||||
|
import com.realnet.forma.Entity.Testm;
|
||||||
|
import com.realnet.forma.Services.TestmService ;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@RequestMapping(value = "/Testm")
|
||||||
|
@CrossOrigin("*")
|
||||||
|
@RestController
|
||||||
|
public class TestmController {
|
||||||
|
@Autowired
|
||||||
|
private TestmService Service;
|
||||||
|
|
||||||
|
@Value("${projectPath}")
|
||||||
|
private String projectPath;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@PostMapping("/Testm")
|
||||||
|
public Testm Savedata(@RequestBody Testm data) {
|
||||||
|
Testm save = Service.Savedata(data) ;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
System.out.println("data saved..." + save);
|
||||||
|
|
||||||
|
return save;
|
||||||
|
}
|
||||||
|
@PutMapping("/Testm/{id}")
|
||||||
|
public Testm update(@RequestBody Testm data,@PathVariable Integer id ) {
|
||||||
|
Testm update = Service.update(data,id);
|
||||||
|
System.out.println("data update..." + update);
|
||||||
|
return update;
|
||||||
|
}
|
||||||
|
// get all with pagination
|
||||||
|
@GetMapping("/Testm/getall/page")
|
||||||
|
public Page<Testm> getall(@RequestParam(value = "page", required = false) Integer page,
|
||||||
|
@RequestParam(value = "size", required = false) Integer size) {
|
||||||
|
Pageable paging = PageRequest.of(page, size);
|
||||||
|
Page<Testm> get = Service.getAllWithPagination(paging);
|
||||||
|
|
||||||
|
return get;
|
||||||
|
|
||||||
|
}
|
||||||
|
@GetMapping("/Testm")
|
||||||
|
public List<Testm> getdetails() {
|
||||||
|
List<Testm> get = Service.getdetails();
|
||||||
|
return get;
|
||||||
|
}
|
||||||
|
// get all without authentication
|
||||||
|
|
||||||
|
@GetMapping("/token/Testm")
|
||||||
|
public List<Testm> getallwioutsec() {
|
||||||
|
List<Testm> get = Service.getdetails();
|
||||||
|
return get;
|
||||||
|
}
|
||||||
|
@GetMapping("/Testm/{id}")
|
||||||
|
public Testm getdetailsbyId(@PathVariable Integer id ) {
|
||||||
|
Testm get = Service.getdetailsbyId(id);
|
||||||
|
return get;
|
||||||
|
}
|
||||||
|
@DeleteMapping("/Testm/{id}")
|
||||||
|
public ResponseEntity<?> delete_by_id(@PathVariable Integer id ) {
|
||||||
|
Service.delete_by_id(id);
|
||||||
|
return new ResponseEntity<>(new EntityResponse("Deleted"), HttpStatus.OK);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,24 @@
|
|||||||
|
package com.realnet.forma.Controllers;
|
||||||
|
import java.util.List;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
import com.realnet.forma.Entity.Testm_ListFilter1;
|
||||||
|
import com.realnet.forma.Services.Testm_ListFilter1Service ;
|
||||||
|
@RequestMapping(value = "/Testm_ListFilter1")
|
||||||
|
@RestController
|
||||||
|
public class Testm_ListFilter1Controller {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private Testm_ListFilter1Service Service;
|
||||||
|
|
||||||
|
@GetMapping("/Testm_ListFilter1")
|
||||||
|
public List<Testm_ListFilter1> getlist() {
|
||||||
|
List<Testm_ListFilter1> get = Service.getlistbuilder();
|
||||||
|
return get;
|
||||||
|
}
|
||||||
|
@GetMapping("/Testm_ListFilter11")
|
||||||
|
public List<Testm_ListFilter1> getlistwithparam( ) {
|
||||||
|
List<Testm_ListFilter1> get = Service.getlistbuilderparam( );
|
||||||
|
return get;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,24 @@
|
|||||||
|
package com.realnet.forma.Entity;
|
||||||
|
import lombok.*;
|
||||||
|
import com.realnet.WhoColumn.Entity.Extension;
|
||||||
|
import javax.persistence.*;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@Data
|
||||||
|
public class Child extends Extension {
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
|
private Integer id;
|
||||||
|
|
||||||
|
private String namemmm;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,64 @@
|
|||||||
|
package com.realnet.forma.Entity;
|
||||||
|
import lombok.*;
|
||||||
|
import com.realnet.WhoColumn.Entity.Extension;
|
||||||
|
import javax.persistence.*;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
import com.realnet.forma.Entity.Child;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@Data
|
||||||
|
public class Testm extends Extension {
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
|
private Integer id;
|
||||||
|
|
||||||
|
private String namem;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private String bar_code;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private String qr_code;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@OneToOne( cascade=CascadeType.ALL)
|
||||||
|
private Child child;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private int numberm;
|
||||||
|
|
||||||
|
private int numberb;
|
||||||
|
|
||||||
|
private String calculatedgg;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
package com.realnet.forma.Entity;
|
||||||
|
import lombok.*;
|
||||||
|
import javax.persistence.*;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class Testm_ListFilter1 {
|
||||||
|
|
||||||
|
private Integer id;
|
||||||
|
|
||||||
|
|
||||||
|
private String namem;
|
||||||
|
}
|
||||||
@ -0,0 +1,26 @@
|
|||||||
|
package com.realnet.forma.Repository;
|
||||||
|
|
||||||
|
|
||||||
|
import org.springframework.data.domain.Page;
|
||||||
|
import org.springframework.data.domain.Pageable;
|
||||||
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
import org.springframework.data.jpa.repository.Query;
|
||||||
|
|
||||||
|
import org.springframework.stereotype.Repository;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
import com.realnet.forma.Entity.Child;
|
||||||
|
|
||||||
|
@Repository
|
||||||
|
public interface ChildRepository extends JpaRepository<Child, Integer> {
|
||||||
|
|
||||||
|
@Query(value = "select * from child where created_by=?1", nativeQuery = true)
|
||||||
|
List<Child> findAll(Long creayedBy);
|
||||||
|
|
||||||
|
@Query(value = "select * from child where created_by=?1", nativeQuery = true)
|
||||||
|
Page<Child> findAll(Pageable page, Long creayedBy);
|
||||||
|
}
|
||||||
@ -0,0 +1,40 @@
|
|||||||
|
package com.realnet.forma.Repository;
|
||||||
|
|
||||||
|
|
||||||
|
import org.springframework.data.domain.Page;
|
||||||
|
import org.springframework.data.domain.Pageable;
|
||||||
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
import org.springframework.data.jpa.repository.Query;
|
||||||
|
|
||||||
|
import org.springframework.stereotype.Repository;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
import com.realnet.forma.Entity.Testm;
|
||||||
|
|
||||||
|
@Repository
|
||||||
|
public interface TestmRepository extends JpaRepository<Testm, Integer> {
|
||||||
|
|
||||||
|
@Query(value = "select * from testm where created_by=?1", nativeQuery = true)
|
||||||
|
List<Testm> findAll(Long creayedBy);
|
||||||
|
|
||||||
|
@Query(value = "select * from testm where created_by=?1", nativeQuery = true)
|
||||||
|
Page<Testm> findAll(Pageable page, Long creayedBy);
|
||||||
|
}
|
||||||
@ -0,0 +1,73 @@
|
|||||||
|
package com.realnet.forma.Services;
|
||||||
|
import com.realnet.forma.Repository.ChildRepository;
|
||||||
|
import com.realnet.forma.Entity.Child
|
||||||
|
;import java.util.*;
|
||||||
|
|
||||||
|
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 com.realnet.realm.Entity.Realm;
|
||||||
|
import com.realnet.realm.Services.RealmService;
|
||||||
|
import org.springframework.data.domain.Pageable;
|
||||||
|
import org.springframework.http.*;import com.realnet.users.service1.AppUserServiceImpl;
|
||||||
|
import com.realnet.users.entity1.AppUser;
|
||||||
|
|
||||||
|
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class ChildService {
|
||||||
|
@Autowired
|
||||||
|
private ChildRepository Repository;
|
||||||
|
@Autowired
|
||||||
|
private AppUserServiceImpl userService;
|
||||||
|
@Autowired
|
||||||
|
private RealmService realmService;
|
||||||
|
|
||||||
|
public Child Savedata(Child data) {
|
||||||
|
|
||||||
|
|
||||||
|
data.setUpdatedBy(getUser().getUserId());
|
||||||
|
data.setCreatedBy(getUser().getUserId());
|
||||||
|
data.setAccountId(getUser().getAccount().getAccount_id());
|
||||||
|
Child save = Repository.save(data);
|
||||||
|
return save;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// get all with pagination
|
||||||
|
public Page<Child> getAllWithPagination(Pageable page) {
|
||||||
|
return Repository.findAll(page, getUser().getUserId());
|
||||||
|
}
|
||||||
|
public List<Child> getdetails() {
|
||||||
|
List<Realm> realm = realmService.findByUserId(getUser().getUserId());
|
||||||
|
List<Child> all = Repository.findAll(getUser().getUserId());
|
||||||
|
|
||||||
|
return all ; }
|
||||||
|
|
||||||
|
|
||||||
|
public Child getdetailsbyId(Integer id) {
|
||||||
|
return Repository.findById(id).get();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void delete_by_id(Integer id) {
|
||||||
|
Repository.deleteById(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public Child update(Child data,Integer id) {
|
||||||
|
Child old = Repository.findById(id).get();
|
||||||
|
old.setNamemmm(data.getNamemmm());
|
||||||
|
|
||||||
|
final Child test = Repository.save(old);
|
||||||
|
data.setUpdatedBy(getUser().getUserId());
|
||||||
|
return test;}
|
||||||
|
|
||||||
|
|
||||||
|
public AppUser getUser() {
|
||||||
|
AppUser user = userService.getLoggedInUser();
|
||||||
|
return user;
|
||||||
|
|
||||||
|
}}
|
||||||
@ -0,0 +1,152 @@
|
|||||||
|
package com.realnet.forma.Services;
|
||||||
|
import com.realnet.forma.Repository.TestmRepository;
|
||||||
|
import com.realnet.forma.Entity.Testm
|
||||||
|
;import java.util.*;
|
||||||
|
|
||||||
|
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 com.realnet.realm.Entity.Realm;
|
||||||
|
import com.realnet.realm.Services.RealmService;
|
||||||
|
import org.springframework.data.domain.Pageable;
|
||||||
|
import org.springframework.http.*;import com.realnet.users.service1.AppUserServiceImpl;
|
||||||
|
import com.realnet.users.entity1.AppUser;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class TestmService {
|
||||||
|
@Autowired
|
||||||
|
private TestmRepository Repository;
|
||||||
|
@Autowired
|
||||||
|
private AppUserServiceImpl userService;
|
||||||
|
@Autowired
|
||||||
|
private RealmService realmService;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public Testm Savedata(Testm data) {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
data.setUpdatedBy(getUser().getUserId());
|
||||||
|
data.setCreatedBy(getUser().getUserId());
|
||||||
|
data.setAccountId(getUser().getAccount().getAccount_id());
|
||||||
|
Testm save = Repository.save(data);
|
||||||
|
return save;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// get all with pagination
|
||||||
|
public Page<Testm> getAllWithPagination(Pageable page) {
|
||||||
|
return Repository.findAll(page, getUser().getUserId());
|
||||||
|
}
|
||||||
|
public List<Testm> getdetails() {
|
||||||
|
List<Realm> realm = realmService.findByUserId(getUser().getUserId());
|
||||||
|
List<Testm> all = Repository.findAll(getUser().getUserId());
|
||||||
|
|
||||||
|
return all ; }
|
||||||
|
|
||||||
|
|
||||||
|
public Testm getdetailsbyId(Integer id) {
|
||||||
|
return Repository.findById(id).get();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void delete_by_id(Integer id) {
|
||||||
|
Repository.deleteById(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public Testm update(Testm data,Integer id) {
|
||||||
|
Testm old = Repository.findById(id).get();
|
||||||
|
old.setNamem(data.getNamem());
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
old.setBar_code(data.getBar_code());
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
old.setQr_code(data.getQr_code());
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
old.setChild(data.getChild());
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
old.setNumberm(data.getNumberm());
|
||||||
|
|
||||||
|
old.setNumberb(data.getNumberb());
|
||||||
|
|
||||||
|
old.setCalculatedgg(data.getCalculatedgg());
|
||||||
|
|
||||||
|
final Testm test = Repository.save(old);
|
||||||
|
data.setUpdatedBy(getUser().getUserId());
|
||||||
|
return test;}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public AppUser getUser() {
|
||||||
|
AppUser user = userService.getLoggedInUser();
|
||||||
|
return user;
|
||||||
|
|
||||||
|
}}
|
||||||
@ -0,0 +1,47 @@
|
|||||||
|
package com.realnet.forma.Services;
|
||||||
|
import java.util.*;
|
||||||
|
import com.realnet.forma.Repository.TestmRepository;
|
||||||
|
import com.realnet.forma.Entity.Testm;
|
||||||
|
|
||||||
|
import com.realnet.forma.Entity.Testm_ListFilter1;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class Testm_ListFilter1Service {
|
||||||
|
@Autowired
|
||||||
|
private TestmRepository Repository;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public List<Testm_ListFilter1> getlistbuilder() {
|
||||||
|
List<Testm> list= Repository.findAll();
|
||||||
|
ArrayList<Testm_ListFilter1> l = new ArrayList<>();
|
||||||
|
for (Testm data : list) {
|
||||||
|
{
|
||||||
|
Testm_ListFilter1 dummy = new Testm_ListFilter1();
|
||||||
|
dummy.setId(data.getId());
|
||||||
|
dummy.setNamem(data.getNamem());
|
||||||
|
l.add(dummy);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return l;}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public List<Testm_ListFilter1> getlistbuilderparam( ) {
|
||||||
|
List<Testm> list= Repository.findAll();
|
||||||
|
ArrayList<Testm_ListFilter1> l = new ArrayList<>();
|
||||||
|
for (Testm data : list) {
|
||||||
|
{
|
||||||
|
Testm_ListFilter1 dummy = new Testm_ListFilter1();
|
||||||
|
dummy.setId(data.getId());
|
||||||
|
dummy.setNamem(data.getNamem());
|
||||||
|
l.add(dummy);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return l;}
|
||||||
|
}
|
||||||
4
testflutter25-db-d/authsec_mysql/mysql/wf_table/wf_table.sql
Executable file
4
testflutter25-db-d/authsec_mysql/mysql/wf_table/wf_table.sql
Executable file
@ -0,0 +1,4 @@
|
|||||||
|
CREATE TABLE db.Testm(id BIGINT NOT NULL AUTO_INCREMENT, calculatedgg VARCHAR(400), onetoone VARCHAR(400), numberb int, valuell VARCHAR(400), bar_code VARCHAR(400), qr_code VARCHAR(400), namem VARCHAR(400), datagg VARCHAR(400), numberm int, PRIMARY KEY (id));
|
||||||
|
|
||||||
|
CREATE TABLE db.Child(id BIGINT NOT NULL AUTO_INCREMENT, namemmm VARCHAR(400), PRIMARY KEY (id));
|
||||||
|
|
||||||
@ -0,0 +1,76 @@
|
|||||||
|
import 'dart:typed_data';
|
||||||
|
import 'package:dio/dio.dart';
|
||||||
|
import 'package:http_parser/http_parser.dart';
|
||||||
|
import '../../../../resources/api_constants.dart';
|
||||||
|
import '../../../../data/network/base_network_service.dart';
|
||||||
|
import '../../../../data/network/network_api_service.dart';
|
||||||
|
|
||||||
|
class childApiService {
|
||||||
|
final String baseUrl = ApiConstants.baseUrl;
|
||||||
|
|
||||||
|
final BaseNetworkService _helper = NetworkApiService();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Future<List<Map<String, dynamic>>> getEntities() async {
|
||||||
|
|
||||||
|
try {
|
||||||
|
final response = await _helper.getGetApiResponse('$baseUrl/Child/Child');
|
||||||
|
final entities = (response as List).cast<Map<String, dynamic>>();
|
||||||
|
return entities;
|
||||||
|
} catch (e) {
|
||||||
|
throw Exception('Failed to get all entities: $e');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Future<List<Map<String, dynamic>>> getAllWithPagination(
|
||||||
|
int page, int size) async {
|
||||||
|
try {
|
||||||
|
final response =
|
||||||
|
await _helper.getGetApiResponse('$baseUrl/Child/Child/getall/page?page=$page&size=$size');
|
||||||
|
final entities =
|
||||||
|
(response['content'] as List).cast<Map<String, dynamic>>();
|
||||||
|
return entities;
|
||||||
|
} catch (e) {
|
||||||
|
throw Exception('Failed to get all without pagination: $e');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Future<Map<String, dynamic>> createEntity(
|
||||||
|
Map<String, dynamic> entity) async {
|
||||||
|
try {
|
||||||
|
print("in post api$entity");
|
||||||
|
final response =
|
||||||
|
await _helper.getPostApiResponse('$baseUrl/Child/Child', entity);
|
||||||
|
|
||||||
|
print(entity);
|
||||||
|
|
||||||
|
// Assuming the response is a Map<String, dynamic>
|
||||||
|
Map<String, dynamic> responseData = response;
|
||||||
|
|
||||||
|
return responseData;
|
||||||
|
} catch (e) {
|
||||||
|
throw Exception('Failed to create entity: $e');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Future<void> updateEntity( int entityId, Map<String, dynamic> entity) async {
|
||||||
|
try {
|
||||||
|
await _helper.getPutApiResponse('$baseUrl/Child/Child/$entityId',
|
||||||
|
entity); print(entity);
|
||||||
|
|
||||||
|
} catch (e) {
|
||||||
|
throw Exception('Failed to update entity: $e');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> deleteEntity( int entityId) async {
|
||||||
|
try {
|
||||||
|
await _helper.getDeleteApiResponse('$baseUrl/Child/Child/$entityId');
|
||||||
|
} catch (e) {
|
||||||
|
throw Exception('Failed to delete entity: $e');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,152 @@
|
|||||||
|
// 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 'package:provider/provider.dart';
|
||||||
|
import '../Child_viewModel/Child_view_model_screen.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:intl/intl.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 'package:google_fonts/google_fonts.dart';
|
||||||
|
import 'package:lottie/lottie.dart';
|
||||||
|
import '../../../../utils/toast_messages/toast_message_util.dart';
|
||||||
|
import 'dart:io';
|
||||||
|
import '../../../../Reuseable/reusable_text_field.dart';
|
||||||
|
import '../../../../Reuseable/reusable_dropdown_field.dart';
|
||||||
|
|
||||||
|
|
||||||
|
class childCreateEntityScreen extends StatefulWidget {
|
||||||
|
const childCreateEntityScreen({super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
_childCreateEntityScreenState createState() => _childCreateEntityScreenState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _childCreateEntityScreenState extends State<childCreateEntityScreen> {
|
||||||
|
|
||||||
|
final Map<String, dynamic> formData = {};
|
||||||
|
final _formKey = GlobalKey<FormState>();
|
||||||
|
final TextEditingController namemmmController = TextEditingController();
|
||||||
|
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
super.initState();
|
||||||
|
final provider = Provider.of<ChildViewModelScreen>(context, listen: false);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
final provider = Provider.of<ChildViewModelScreen>(context, listen: false);
|
||||||
|
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 Child"),
|
||||||
|
|
||||||
|
),
|
||||||
|
body: SingleChildScrollView(
|
||||||
|
child: Padding(
|
||||||
|
padding: const EdgeInsets.all(16),
|
||||||
|
child: Form(
|
||||||
|
key: _formKey,
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
ReusableTextField(
|
||||||
|
controller: namemmmController,
|
||||||
|
|
||||||
|
onSaved:(value) => formData['namemmm'] = value ,
|
||||||
|
label:"Enter Namemmm",
|
||||||
|
// ValidationProperties
|
||||||
|
),
|
||||||
|
|
||||||
|
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();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
try {
|
||||||
|
print(formData);
|
||||||
|
Map<String, dynamic> createdEntity = await provider.createEntity(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 Child: $e'),
|
||||||
|
actions: [
|
||||||
|
TextButton(
|
||||||
|
child: const Text('OK'),
|
||||||
|
onPressed: () {
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
),
|
||||||
|
|
||||||
|
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,578 @@
|
|||||||
|
// ignore_for_file: use_build_context_synchronously
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:intl/intl.dart';
|
||||||
|
import 'Child_create_entity_screen.dart';
|
||||||
|
import 'Child_update_entity_screen.dart';
|
||||||
|
import '../Child_viewModel/Child_view_model_screen.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:provider/provider.dart';
|
||||||
|
import 'package:fluttertoast/fluttertoast.dart';
|
||||||
|
|
||||||
|
class child_entity_list_screen extends StatefulWidget {
|
||||||
|
|
||||||
|
|
||||||
|
final Map<String, dynamic> tabEntity;
|
||||||
|
const child_entity_list_screen({required this.tabEntity, Key? key})
|
||||||
|
: super(key: key); static const String routeName = '/entity-list';
|
||||||
|
|
||||||
|
@override
|
||||||
|
_child_entity_list_screenState createState() => _child_entity_list_screenState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _child_entity_list_screenState extends State<child_entity_list_screen> {
|
||||||
|
List<Map<String, dynamic>> entities = [];
|
||||||
|
List<Map<String, dynamic>> filteredEntities = [];
|
||||||
|
List<Map<String, dynamic>> 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<void> fetchwithoutpaging() async {
|
||||||
|
try {
|
||||||
|
final provider =
|
||||||
|
Provider.of<ChildViewModelScreen>(context, listen: false);
|
||||||
|
final fetchedEntities = await provider.getEntities();
|
||||||
|
print('withoutpaging data is $fetchedEntities');
|
||||||
|
setState(() {
|
||||||
|
serachEntities = fetchedEntities; // Update only filteredEntities
|
||||||
|
});
|
||||||
|
print('Child entity is .. $serachEntities');
|
||||||
|
} catch (e) {
|
||||||
|
showDialog(
|
||||||
|
context: context,
|
||||||
|
builder: (BuildContext context) {
|
||||||
|
return AlertDialog(
|
||||||
|
title: const Text('Error'),
|
||||||
|
content: Text('Failed to fetch Child: $e'),
|
||||||
|
actions: [
|
||||||
|
TextButton(
|
||||||
|
child: const Text('OK'),
|
||||||
|
onPressed: () {
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Future<void> fetchEntities() async {
|
||||||
|
try {
|
||||||
|
setState(() {
|
||||||
|
isLoading = true;
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
final provider =
|
||||||
|
Provider.of<ChildViewModelScreen>(context, listen: false);
|
||||||
|
final fetchedEntities = await provider.getEntities(widget.tabEntity['id']);
|
||||||
|
setState(() {
|
||||||
|
var getentity = widget.tabEntity['gauravt2'];
|
||||||
|
final fetchedEntities =
|
||||||
|
(getentity as List).cast<Map<String, dynamic>>();
|
||||||
|
entities.addAll(fetchedEntities); // Add new data to the existing list
|
||||||
|
filteredEntities = entities.toList(); // Update only filteredEntities
|
||||||
|
serachEntities = 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 Child 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<void> deleteEntity(Map<String, dynamic> entity) async {
|
||||||
|
try {
|
||||||
|
final provider =
|
||||||
|
Provider.of<ChildViewModelScreen>(context, listen: false);
|
||||||
|
|
||||||
|
await provider.deleteEntity(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['namemmm'].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: " Child"),
|
||||||
|
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) => ChangeNotifierProvider(
|
||||||
|
create: (context) => ChildViewModelScreen(),
|
||||||
|
child: childCreateEntityScreen(),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
).then((_) {
|
||||||
|
fetchEntities();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
child: const Icon(Icons.add),
|
||||||
|
),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _buildListItem(Map<String, dynamic> entity) {
|
||||||
|
return showCardView ? _buildCardView(entity) : _buildNormalView(entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Function to build card view for a list item
|
||||||
|
Widget _buildCardView(Map<String, dynamic> 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<String, dynamic> 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<String>(
|
||||||
|
icon: const Icon(
|
||||||
|
Icons.more_vert,
|
||||||
|
color: Colors.black,
|
||||||
|
size: 16,
|
||||||
|
),
|
||||||
|
itemBuilder: (BuildContext context) {
|
||||||
|
return [
|
||||||
|
PopupMenuItem<String>(
|
||||||
|
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<String>(
|
||||||
|
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) => ChangeNotifierProvider(
|
||||||
|
create: (context) => ChildViewModelScreen(),
|
||||||
|
child: childUpdateEntityScreen(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(
|
||||||
|
"Namemmm : ",
|
||||||
|
overflow: TextOverflow.ellipsis,
|
||||||
|
textAlign: TextAlign.left,
|
||||||
|
style: AppStyle.txtGilroyMedium16,
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
entity['namemmm'].toString() ?? 'No Namemmm 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<String, dynamic> 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';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@ -0,0 +1,143 @@
|
|||||||
|
// ignore_for_file: use_build_context_synchronously
|
||||||
|
import 'dart:convert';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
import '../Child_viewModel/Child_view_model_screen.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 '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 'dart:math';
|
||||||
|
import '../../../../Reuseable/reusable_text_field.dart';
|
||||||
|
import '../../../../Reuseable/reusable_date_picker_field.dart';
|
||||||
|
import '../../../../Reuseable/reusable_date_time_picker_field.dart';
|
||||||
|
import '../../../../Reuseable/reusable_dropdown_field.dart';
|
||||||
|
import 'package:flutter/services.dart';
|
||||||
|
class childUpdateEntityScreen extends StatefulWidget {
|
||||||
|
final Map<String, dynamic> entity;
|
||||||
|
|
||||||
|
|
||||||
|
childUpdateEntityScreen({required this.entity});
|
||||||
|
|
||||||
|
@override
|
||||||
|
_childUpdateEntityScreenState createState() => _childUpdateEntityScreenState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _childUpdateEntityScreenState extends State<childUpdateEntityScreen> {
|
||||||
|
final _formKey = GlobalKey<FormState>();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
super.initState();
|
||||||
|
final provider = Provider.of<ChildViewModelScreen>(context, listen: false);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
final provider = Provider.of<ChildViewModelScreen>(context, listen: false);
|
||||||
|
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 Child"), actions: [
|
||||||
|
|
||||||
|
|
||||||
|
],
|
||||||
|
),
|
||||||
|
body: SingleChildScrollView(
|
||||||
|
child: Padding(
|
||||||
|
padding: const EdgeInsets.all(16),
|
||||||
|
child: Form(
|
||||||
|
key: _formKey,
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
|
||||||
|
ReusableTextField(
|
||||||
|
|
||||||
|
label: "Please Enter Namemmm",
|
||||||
|
initialValue: widget.entity['namemmm'] ?? '',
|
||||||
|
|
||||||
|
// ValidationProperties
|
||||||
|
onSaved: (value) => widget.entity['namemmm'] = value,
|
||||||
|
),
|
||||||
|
|
||||||
|
SizedBox(height: 16),
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
CustomButton(
|
||||||
|
height: getVerticalSize(50),
|
||||||
|
text: "Update",
|
||||||
|
margin: getMargin(top: 24, bottom: 5),
|
||||||
|
onTap: () async {
|
||||||
|
if (_formKey.currentState!.validate()) {
|
||||||
|
_formKey.currentState!.save();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
try {
|
||||||
|
await provider.updateEntity(
|
||||||
|
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 Child: $e'),
|
||||||
|
actions: [
|
||||||
|
TextButton(
|
||||||
|
child: const Text('OK'),
|
||||||
|
onPressed: () {
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,64 @@
|
|||||||
|
import 'package:dio/dio.dart';
|
||||||
|
import '../../../../data/network/base_network_service.dart';
|
||||||
|
import '../../../../data/network/network_api_service.dart';
|
||||||
|
import '../../../../resources/api_constants.dart';
|
||||||
|
|
||||||
|
class ChildRepoScreen {
|
||||||
|
final String baseUrl = ApiConstants.baseUrl;
|
||||||
|
final BaseNetworkService _helper = NetworkApiService();
|
||||||
|
|
||||||
|
Future<dynamic> getEntities() async {
|
||||||
|
try {
|
||||||
|
final response =
|
||||||
|
await _helper.getGetApiResponse('$baseUrl/Child/Child');
|
||||||
|
return response;
|
||||||
|
} catch (e) {
|
||||||
|
throw Exception('Failed to get all entities: $e');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<dynamic> getAllWithPagination(int page, int size) async {
|
||||||
|
try {
|
||||||
|
final response = await _helper.getGetApiResponse(
|
||||||
|
'$baseUrl/Child/Child/getall/page?page=$page&size=$size');
|
||||||
|
return response;
|
||||||
|
} catch (e) {
|
||||||
|
throw Exception('Failed to get all without pagination: $e');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<dynamic> createEntity(Map<String, dynamic> entity) async {
|
||||||
|
try {
|
||||||
|
print("in post api$entity");
|
||||||
|
final response = await _helper.getPostApiResponse(
|
||||||
|
'$baseUrl/Child/Child', entity);
|
||||||
|
|
||||||
|
print(entity);
|
||||||
|
|
||||||
|
return response;
|
||||||
|
} catch (e) {
|
||||||
|
throw Exception('Failed to create entity: $e');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> updateEntity(int entityId, Map<String, dynamic> entity) async {
|
||||||
|
try {
|
||||||
|
await _helper.getPutApiResponse(
|
||||||
|
'$baseUrl/Child/Child/$entityId', entity);
|
||||||
|
print(entity);
|
||||||
|
} catch (e) {
|
||||||
|
throw Exception('Failed to update entity: $e');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> deleteEntity(int entityId) async {
|
||||||
|
try {
|
||||||
|
await _helper
|
||||||
|
.getDeleteApiResponse('$baseUrl/Child/Child/$entityId');
|
||||||
|
} catch (e) {
|
||||||
|
throw Exception('Failed to delete entity: $e');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,103 @@
|
|||||||
|
import 'dart:typed_data';
|
||||||
|
import 'package:dio/dio.dart';
|
||||||
|
import 'package:http_parser/http_parser.dart';
|
||||||
|
import '../../../../utils/toast_messages/toast_message_util.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import '../Child_Repo/Child_repo_screen.dart';
|
||||||
|
|
||||||
|
class ChildViewModelScreen extends ChangeNotifier{
|
||||||
|
final ChildRepoScreen repo = ChildRepoScreen();
|
||||||
|
|
||||||
|
Future<List<Map<String, dynamic>>> getEntities() async {
|
||||||
|
try {
|
||||||
|
final response = await repo.getEntities();
|
||||||
|
final entities = (response as List).cast<Map<String, dynamic>>();
|
||||||
|
return entities;
|
||||||
|
} catch (e) {
|
||||||
|
throw Exception('Failed to get all entities: $e');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Future<List<Map<String, dynamic>>> getAllWithPagination(
|
||||||
|
int page, int size) async {
|
||||||
|
try {
|
||||||
|
final response =
|
||||||
|
await repo.getAllWithPagination(page, size); // ✅ Use await
|
||||||
|
|
||||||
|
print('res - $response');
|
||||||
|
|
||||||
|
// ✅ Ensure response is a Map<String, dynamic>
|
||||||
|
if (response is! Map<String, dynamic>) {
|
||||||
|
throw Exception('Unexpected response format: $response');
|
||||||
|
}
|
||||||
|
|
||||||
|
// ✅ Extract 'content' and ensure it's a list
|
||||||
|
final entities = (response['content'] as List)
|
||||||
|
.cast<Map<String, dynamic>>() // ✅ Ensure list of maps
|
||||||
|
.toList();
|
||||||
|
return entities;
|
||||||
|
} catch (e) {
|
||||||
|
print(e);
|
||||||
|
throw Exception('Failed to get all without pagination :- $e');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Future<Map<String, dynamic>> createEntity(Map<String, dynamic> entity) async {
|
||||||
|
try {
|
||||||
|
print("in post api - $entity");
|
||||||
|
// Wait for API response
|
||||||
|
final responseData =
|
||||||
|
await repo.createEntity(entity) as Map<String, dynamic>;
|
||||||
|
print('after value - $responseData');
|
||||||
|
ToastMessageUtil.showToast(
|
||||||
|
message: "Added Successfully", toastType: ToastType.success);
|
||||||
|
|
||||||
|
return responseData; // Return the data AFTER it is received
|
||||||
|
} catch (error) {
|
||||||
|
print("error--$error");
|
||||||
|
ToastMessageUtil.showToast(
|
||||||
|
message: "Got Error", toastType: ToastType.error);
|
||||||
|
|
||||||
|
throw Exception(
|
||||||
|
'Failed to Create Entity: $error'); // Properly rethrow the error
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Future<void> updateEntity(int entityId, Map<String, dynamic> entity) async {
|
||||||
|
try {
|
||||||
|
repo.updateEntity(entityId, entity).then((value) {
|
||||||
|
ToastMessageUtil.showToast(
|
||||||
|
message: "Updated Successfully", toastType: ToastType.success);
|
||||||
|
}).onError(
|
||||||
|
(error, stackTrace) {
|
||||||
|
print("error--$error");
|
||||||
|
ToastMessageUtil.showToast(
|
||||||
|
message: "Got Error", toastType: ToastType.error);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
print(entity);
|
||||||
|
} catch (e) {
|
||||||
|
throw Exception('Failed to update entity: $e');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> deleteEntity(int entityId) async {
|
||||||
|
try {
|
||||||
|
repo.deleteEntity(entityId).then((value) {
|
||||||
|
ToastMessageUtil.showToast(
|
||||||
|
message: "Deleted Successfully", toastType: ToastType.success);
|
||||||
|
}).onError(
|
||||||
|
(error, stackTrace) {
|
||||||
|
print("error--$error");
|
||||||
|
ToastMessageUtil.showToast(
|
||||||
|
message: "Got Error", toastType: ToastType.error);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
} catch (e) {
|
||||||
|
throw Exception('Failed to delete entity: $e');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,104 @@
|
|||||||
|
import 'dart:typed_data';
|
||||||
|
import 'package:dio/dio.dart';
|
||||||
|
import 'package:http_parser/http_parser.dart';
|
||||||
|
import '../../../../resources/api_constants.dart';
|
||||||
|
import '../../../../data/network/base_network_service.dart';
|
||||||
|
import '../../../../data/network/network_api_service.dart';
|
||||||
|
|
||||||
|
class testmApiService {
|
||||||
|
final String baseUrl = ApiConstants.baseUrl;
|
||||||
|
|
||||||
|
final BaseNetworkService _helper = NetworkApiService();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Future<List<Map<String, dynamic>>> getEntities() async {
|
||||||
|
|
||||||
|
try {
|
||||||
|
final response = await _helper.getGetApiResponse('$baseUrl/Testm/Testm');
|
||||||
|
final entities = (response as List).cast<Map<String, dynamic>>();
|
||||||
|
return entities;
|
||||||
|
} catch (e) {
|
||||||
|
throw Exception('Failed to get all entities: $e');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Future<List<Map<String, dynamic>>> getAllWithPagination(
|
||||||
|
int page, int size) async {
|
||||||
|
try {
|
||||||
|
final response =
|
||||||
|
await _helper.getGetApiResponse('$baseUrl/Testm/Testm/getall/page?page=$page&size=$size');
|
||||||
|
final entities =
|
||||||
|
(response['content'] as List).cast<Map<String, dynamic>>();
|
||||||
|
return entities;
|
||||||
|
} catch (e) {
|
||||||
|
throw Exception('Failed to get all without pagination: $e');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Future<Map<String, dynamic>> createEntity(
|
||||||
|
Map<String, dynamic> entity) async {
|
||||||
|
try {
|
||||||
|
print("in post api$entity");
|
||||||
|
final response =
|
||||||
|
await _helper.getPostApiResponse('$baseUrl/Testm/Testm', entity);
|
||||||
|
|
||||||
|
print(entity);
|
||||||
|
|
||||||
|
// Assuming the response is a Map<String, dynamic>
|
||||||
|
Map<String, dynamic> responseData = response;
|
||||||
|
|
||||||
|
return responseData;
|
||||||
|
} catch (e) {
|
||||||
|
throw Exception('Failed to create entity: $e');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Future<void> updateEntity( int entityId, Map<String, dynamic> entity) async {
|
||||||
|
try {
|
||||||
|
await _helper.getPutApiResponse('$baseUrl/Testm/Testm/$entityId',
|
||||||
|
entity); print(entity);
|
||||||
|
|
||||||
|
} catch (e) {
|
||||||
|
throw Exception('Failed to update entity: $e');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> deleteEntity( int entityId) async {
|
||||||
|
try {
|
||||||
|
await _helper.getDeleteApiResponse('$baseUrl/Testm/Testm/$entityId');
|
||||||
|
} catch (e) {
|
||||||
|
throw Exception('Failed to delete entity: $e');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,687 @@
|
|||||||
|
// 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 'package:provider/provider.dart';
|
||||||
|
import '../Testm_viewModel/Testm_view_model_screen.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:intl/intl.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 'package:google_fonts/google_fonts.dart';
|
||||||
|
import 'package:lottie/lottie.dart';
|
||||||
|
import '../../../../utils/toast_messages/toast_message_util.dart';
|
||||||
|
import 'dart:io';
|
||||||
|
import '../../../../Reuseable/reusable_text_field.dart';
|
||||||
|
import '../../../../Reuseable/reusable_dropdown_field.dart';
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class testmCreateEntityScreen extends StatefulWidget {
|
||||||
|
const testmCreateEntityScreen({super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
_testmCreateEntityScreenState createState() => _testmCreateEntityScreenState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _testmCreateEntityScreenState extends State<testmCreateEntityScreen> {
|
||||||
|
|
||||||
|
final Map<String, dynamic> formData = {};
|
||||||
|
final _formKey = GlobalKey<FormState>();
|
||||||
|
final TextEditingController namemController = TextEditingController();
|
||||||
|
|
||||||
|
|
||||||
|
final TextEditingController fieldggController = TextEditingController();
|
||||||
|
|
||||||
|
|
||||||
|
Widget buildFormField(String fieldOption) {
|
||||||
|
return Padding(
|
||||||
|
padding: const EdgeInsets.only(bottom: 16.0),
|
||||||
|
child: Card(
|
||||||
|
elevation: 4,
|
||||||
|
shape: RoundedRectangleBorder(
|
||||||
|
borderRadius: BorderRadius.circular(8),
|
||||||
|
),
|
||||||
|
child: Padding(
|
||||||
|
padding: const EdgeInsets.all(12.0),
|
||||||
|
child: TextFormField(
|
||||||
|
decoration: InputDecoration(
|
||||||
|
labelText: fieldOption,
|
||||||
|
border: OutlineInputBorder(
|
||||||
|
borderRadius: BorderRadius.circular(8),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
onSaved: (value) {
|
||||||
|
if (formData['child'] == null) {
|
||||||
|
formData['child'] = {};
|
||||||
|
}
|
||||||
|
formData['child'][fieldOption] = value;
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
late Future<List<Map<String, dynamic>>> _dataggdataFuture; // Data from fetchData
|
||||||
|
|
||||||
|
Future<List<Map<String, dynamic>>> dataggfetchData() async {
|
||||||
|
|
||||||
|
final provider =
|
||||||
|
Provider.of<TestmViewModelScreen>(context, listen: false);
|
||||||
|
final resp = await provider.getdataggGrid();
|
||||||
|
|
||||||
|
if (resp != null) {
|
||||||
|
return resp;
|
||||||
|
} else {
|
||||||
|
throw Exception('Failed to load data: ');
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
late Future<List<Map<String, dynamic>>> _valuelldataFuture; // Data from fetchData
|
||||||
|
|
||||||
|
Future<List<Map<String, dynamic>>> valuellfetchData() async {
|
||||||
|
|
||||||
|
final resp = await apiService.getEntities();
|
||||||
|
|
||||||
|
if (resp != null) {
|
||||||
|
return resp;
|
||||||
|
} else {
|
||||||
|
throw Exception('Failed to load data: ');
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void showvaluellDialog(BuildContext context) {
|
||||||
|
showDialog(
|
||||||
|
context: context,
|
||||||
|
builder: (BuildContext context) {
|
||||||
|
return SingleChildScrollView(
|
||||||
|
child: AlertDialog(
|
||||||
|
title: const Text('Select a record'),
|
||||||
|
content: FutureBuilder<List<Map<String, dynamic>>>(
|
||||||
|
future: _valuelldataFuture,
|
||||||
|
builder: (context, snapshot) {
|
||||||
|
if (snapshot.connectionState == ConnectionState.waiting) {
|
||||||
|
return const Center(child: CircularProgressIndicator());
|
||||||
|
} else if (snapshot.hasError) {
|
||||||
|
return Center(child: Text('Error: ${snapshot.error}'));
|
||||||
|
} else if (!snapshot.hasData || snapshot.data!.isEmpty) {
|
||||||
|
return const Center(child: Text('No data available..'));
|
||||||
|
} else {
|
||||||
|
final List<String> columnsToShow = [
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
'namem',
|
||||||
|
|
||||||
|
|
||||||
|
];
|
||||||
|
return SingleChildScrollView(
|
||||||
|
scrollDirection: Axis.horizontal,
|
||||||
|
child: DataTable(
|
||||||
|
columnSpacing: 30,
|
||||||
|
headingRowColor: MaterialStateColor.resolveWith(
|
||||||
|
(states) => Colors.blue.shade100),
|
||||||
|
dataRowColor: MaterialStateColor.resolveWith(
|
||||||
|
(states) => Colors.white),
|
||||||
|
dividerThickness: 0.5,
|
||||||
|
columns: columnsToShow
|
||||||
|
.map(
|
||||||
|
(key) => DataColumn(
|
||||||
|
label: Text(
|
||||||
|
key,
|
||||||
|
style: const TextStyle(
|
||||||
|
fontWeight: FontWeight.bold, fontSize: 16),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
.toList(),
|
||||||
|
rows: snapshot.data!.map((item) {
|
||||||
|
return DataRow(
|
||||||
|
cells: columnsToShow.map((key) {
|
||||||
|
return DataCell(
|
||||||
|
Text(
|
||||||
|
item[key].toString(),
|
||||||
|
style: const TextStyle(fontSize: 14),
|
||||||
|
),
|
||||||
|
onTap: () {
|
||||||
|
setState(() {
|
||||||
|
|
||||||
|
|
||||||
|
namemController.text = item['namem'] ?? '';
|
||||||
|
|
||||||
|
|
||||||
|
// Add more fields as needed
|
||||||
|
});
|
||||||
|
Navigator.pop(context);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}).toList());
|
||||||
|
}).toList(),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
),
|
||||||
|
actions: [
|
||||||
|
TextButton(
|
||||||
|
child: const Text('Close'),
|
||||||
|
onPressed: () {
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
final TextEditingController numbermController = TextEditingController();
|
||||||
|
|
||||||
|
|
||||||
|
final TextEditingController numberbController = TextEditingController();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
String calculatedggOperator = '+';
|
||||||
|
String calculatedggresult = '';
|
||||||
|
|
||||||
|
final List<String> calculatedggoperators = ['+', '-', '*', '/'];
|
||||||
|
|
||||||
|
void calculatecalculatedggResult() {
|
||||||
|
int calculation;
|
||||||
|
switch (calculatedggOperator) {
|
||||||
|
case '+':
|
||||||
|
calculation =
|
||||||
|
|
||||||
|
|
||||||
|
int.parse(numbermController.text) +
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int.parse(numberbController.text) +
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
0;
|
||||||
|
|
||||||
|
|
||||||
|
break;
|
||||||
|
case '-':
|
||||||
|
calculation =
|
||||||
|
|
||||||
|
|
||||||
|
int.parse(numbermController.text) -
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int.parse(numberbController.text) -
|
||||||
|
|
||||||
|
|
||||||
|
0;
|
||||||
|
break;
|
||||||
|
case '*':
|
||||||
|
calculation =
|
||||||
|
|
||||||
|
|
||||||
|
int.parse(numbermController.text) *
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int.parse(numberbController.text) *
|
||||||
|
|
||||||
|
|
||||||
|
1;
|
||||||
|
break;
|
||||||
|
case '/':
|
||||||
|
if (
|
||||||
|
|
||||||
|
|
||||||
|
int.parse(numbermController.text)== 0 ||
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int.parse(numberbController.text)== 0 ||
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
1 != 1) {
|
||||||
|
calculatedggresult = 'Division by zero error';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
calculation = (
|
||||||
|
|
||||||
|
|
||||||
|
int.parse(numbermController.text) /
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int.parse(numberbController.text) /
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
1).toInt();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
calculation = 0;
|
||||||
|
}
|
||||||
|
setState(() {
|
||||||
|
calculatedggresult = 'Result: $calculation';
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
super.initState();
|
||||||
|
final provider = Provider.of<TestmViewModelScreen>(context, listen: false);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
_dataggdataFuture = dataggfetchData(); // Initialize _dataFuture with the function
|
||||||
|
|
||||||
|
|
||||||
|
_valuelldataFuture = valuellfetchData(); // Initialize _dataFuture with the function
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
final provider = Provider.of<TestmViewModelScreen>(context, listen: false);
|
||||||
|
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 Testm"),
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
actions: [
|
||||||
|
IconButton(
|
||||||
|
icon: const Icon(Icons.grid_on),
|
||||||
|
onPressed: () {
|
||||||
|
showvaluellDialog(context);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
),
|
||||||
|
body: SingleChildScrollView(
|
||||||
|
child: Padding(
|
||||||
|
padding: const EdgeInsets.all(16),
|
||||||
|
child: Form(
|
||||||
|
key: _formKey,
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
ReusableTextField(
|
||||||
|
controller: namemController,
|
||||||
|
|
||||||
|
onSaved:(value) => formData['namem'] = value ,
|
||||||
|
label:"Enter Namem",
|
||||||
|
// ValidationProperties
|
||||||
|
),
|
||||||
|
|
||||||
|
SizedBox(height: 16),
|
||||||
|
|
||||||
|
|
||||||
|
Container(
|
||||||
|
padding: EdgeInsets.all(16.0),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.grey[200],
|
||||||
|
borderRadius: BorderRadius.circular(8.0),
|
||||||
|
boxShadow: [
|
||||||
|
BoxShadow(
|
||||||
|
color: Colors.black.withOpacity(0.2),
|
||||||
|
spreadRadius: 2,
|
||||||
|
blurRadius: 4,
|
||||||
|
offset: Offset(0, 2),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
"Fieldgg",
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 18,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(height: 16),
|
||||||
|
|
||||||
|
|
||||||
|
ReusableTextField(
|
||||||
|
onSaved:(value) => formData['bar_code'] = value ,
|
||||||
|
label:"Enter Bar_code",
|
||||||
|
// ValidationProperties
|
||||||
|
),
|
||||||
|
|
||||||
|
SizedBox(height: 16),
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ReusableTextField(
|
||||||
|
onSaved:(value) => formData['qr_code'] = value ,
|
||||||
|
label:"Enter Qr_code",
|
||||||
|
// ValidationProperties
|
||||||
|
),
|
||||||
|
|
||||||
|
SizedBox(height: 16),
|
||||||
|
|
||||||
|
|
||||||
|
SizedBox(height: 16),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(height: 16),
|
||||||
|
|
||||||
|
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.all(16.0),
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
const SizedBox(
|
||||||
|
height: 20,
|
||||||
|
child: Text(
|
||||||
|
'Child',
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 18,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
color: Colors.black,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(height: 16), // Add space between elements
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
buildFormField('namemmm'),
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ReusableTextField(
|
||||||
|
controller: numbermController,
|
||||||
|
|
||||||
|
onSaved:(value) => formData['numberm'] = value ,
|
||||||
|
label: "Enter Numberm",
|
||||||
|
keyboardType: TextInputType.number,
|
||||||
|
inputFormatters: [
|
||||||
|
FilteringTextInputFormatter.allow((RegExp(r'[0-9]'))),
|
||||||
|
],
|
||||||
|
// ValidationProperties
|
||||||
|
),
|
||||||
|
|
||||||
|
SizedBox(height: 16),
|
||||||
|
|
||||||
|
ReusableTextField(
|
||||||
|
controller: numberbController,
|
||||||
|
|
||||||
|
onSaved:(value) => formData['numberb'] = value ,
|
||||||
|
label: "Enter Numberb",
|
||||||
|
keyboardType: TextInputType.number,
|
||||||
|
inputFormatters: [
|
||||||
|
FilteringTextInputFormatter.allow((RegExp(r'[0-9]'))),
|
||||||
|
],
|
||||||
|
// ValidationProperties
|
||||||
|
),
|
||||||
|
|
||||||
|
SizedBox(height: 16),
|
||||||
|
|
||||||
|
|
||||||
|
const SizedBox(height: 8.0),
|
||||||
|
DropdownButtonFormField<String>(
|
||||||
|
value: calculatedggOperator,
|
||||||
|
items: calculatedggoperators.map((String operator) {
|
||||||
|
return DropdownMenuItem(
|
||||||
|
value: operator,
|
||||||
|
child: Text(operator),
|
||||||
|
);
|
||||||
|
}).toList(),
|
||||||
|
onChanged: (value) {
|
||||||
|
setState(() {
|
||||||
|
calculatedggOperator = value!;
|
||||||
|
print(calculatedggOperator.toString());
|
||||||
|
print("value-- $value");
|
||||||
|
});
|
||||||
|
},
|
||||||
|
decoration: const InputDecoration(labelText: 'Operator'),
|
||||||
|
),
|
||||||
|
const SizedBox(height: 20.0),
|
||||||
|
ElevatedButton(
|
||||||
|
onPressed: () {
|
||||||
|
if (_formKey.currentState!.validate()) {
|
||||||
|
_formKey.currentState?.save(); // Save the form fields
|
||||||
|
|
||||||
|
}
|
||||||
|
calculatecalculatedggResult();
|
||||||
|
setState(() {
|
||||||
|
|
||||||
|
});
|
||||||
|
},
|
||||||
|
child: const Text('Calculate'),
|
||||||
|
),
|
||||||
|
const SizedBox(height: 20.0),
|
||||||
|
Text(calculatedggresult,style: TextStyle(color: Colors.black),),
|
||||||
|
|
||||||
|
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();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
try {
|
||||||
|
print(formData);
|
||||||
|
Map<String, dynamic> createdEntity = await provider.createEntity(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 Testm: $e'),
|
||||||
|
actions: [
|
||||||
|
TextButton(
|
||||||
|
child: const Text('OK'),
|
||||||
|
onPressed: () {
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
),
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
SizedBox(height: 16),
|
||||||
|
|
||||||
|
FutureBuilder<List<Map<String, dynamic>>>(
|
||||||
|
future: _dataggdataFuture,
|
||||||
|
builder: (context, snapshot) {
|
||||||
|
if (snapshot.connectionState == ConnectionState.waiting) {
|
||||||
|
return const Center(child: CircularProgressIndicator());
|
||||||
|
} else if (snapshot.hasError) {
|
||||||
|
return Center(child: Text('Error: ${snapshot.error}'));
|
||||||
|
} else if (!snapshot.hasData || snapshot.data!.isEmpty) {
|
||||||
|
return const Center(child: Text('No data available..'));
|
||||||
|
} else {
|
||||||
|
final keys = snapshot.data!.first.keys.toList();
|
||||||
|
|
||||||
|
return SingleChildScrollView(
|
||||||
|
scrollDirection: Axis.horizontal,
|
||||||
|
child: DataTable(
|
||||||
|
columnSpacing: 30,
|
||||||
|
headingRowColor: MaterialStateColor.resolveWith((states) => Colors.blue.shade100),
|
||||||
|
dataRowColor: MaterialStateColor.resolveWith((states) => Colors.white),
|
||||||
|
dividerThickness: 0.5,
|
||||||
|
columns: keys.map(
|
||||||
|
(key) => DataColumn(
|
||||||
|
label: Text(
|
||||||
|
key,
|
||||||
|
style: const TextStyle(fontWeight: FontWeight.bold, fontSize: 16),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
.toList(),
|
||||||
|
rows: snapshot.data!.map((item) {
|
||||||
|
return DataRow(cells: keys.map((key) {
|
||||||
|
return DataCell(
|
||||||
|
Text(
|
||||||
|
item[key].toString(),
|
||||||
|
style: const TextStyle(fontSize: 14),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}).toList());
|
||||||
|
}).toList(),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
),
|
||||||
|
SizedBox(height: 16),
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,760 @@
|
|||||||
|
// ignore_for_file: use_build_context_synchronously
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:intl/intl.dart';
|
||||||
|
import 'Testm_create_entity_screen.dart';
|
||||||
|
import 'Testm_update_entity_screen.dart';
|
||||||
|
import '../Testm_viewModel/Testm_view_model_screen.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:provider/provider.dart';
|
||||||
|
import 'package:fluttertoast/fluttertoast.dart';
|
||||||
|
|
||||||
|
class testm_entity_list_screen extends StatefulWidget {
|
||||||
|
static const String routeName = '/entity-list';
|
||||||
|
|
||||||
|
@override
|
||||||
|
_testm_entity_list_screenState createState() => _testm_entity_list_screenState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _testm_entity_list_screenState extends State<testm_entity_list_screen> {
|
||||||
|
List<Map<String, dynamic>> entities = [];
|
||||||
|
List<Map<String, dynamic>> filteredEntities = [];
|
||||||
|
List<Map<String, dynamic>> 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<void> fetchwithoutpaging() async {
|
||||||
|
try {
|
||||||
|
final provider =
|
||||||
|
Provider.of<TestmViewModelScreen>(context, listen: false);
|
||||||
|
final fetchedEntities = await provider.getEntities();
|
||||||
|
print('withoutpaging data is $fetchedEntities');
|
||||||
|
setState(() {
|
||||||
|
serachEntities = fetchedEntities; // Update only filteredEntities
|
||||||
|
});
|
||||||
|
print('Testm entity is .. $serachEntities');
|
||||||
|
} catch (e) {
|
||||||
|
showDialog(
|
||||||
|
context: context,
|
||||||
|
builder: (BuildContext context) {
|
||||||
|
return AlertDialog(
|
||||||
|
title: const Text('Error'),
|
||||||
|
content: Text('Failed to fetch Testm: $e'),
|
||||||
|
actions: [
|
||||||
|
TextButton(
|
||||||
|
child: const Text('OK'),
|
||||||
|
onPressed: () {
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Future<void> fetchEntities() async {
|
||||||
|
try {
|
||||||
|
setState(() {
|
||||||
|
isLoading = true;
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
final provider =
|
||||||
|
Provider.of<TestmViewModelScreen>(context, listen: false);
|
||||||
|
final fetchedEntities =
|
||||||
|
await provider.getAllWithPagination(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 Testm 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<void> deleteEntity(Map<String, dynamic> entity) async {
|
||||||
|
try {
|
||||||
|
final provider =
|
||||||
|
Provider.of<TestmViewModelScreen>(context, listen: false);
|
||||||
|
|
||||||
|
await provider.deleteEntity(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['namem'].toString().toLowerCase().contains(keyword.toLowerCase()) ||
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
entity['bar_code'].toString().toLowerCase().contains(keyword.toLowerCase()) ||
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
entity['qr_code'].toString().toLowerCase().contains(keyword.toLowerCase()) ||
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
entity['child'].toString().toLowerCase().contains(keyword.toLowerCase()) ||
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
entity['datagg'].toString().toLowerCase().contains(keyword.toLowerCase()) ||
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
entity['numberm'].toString().toLowerCase().contains(keyword.toLowerCase()) ||
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
entity['numberb'].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: " Testm"),
|
||||||
|
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) => ChangeNotifierProvider(
|
||||||
|
create: (context) => TestmViewModelScreen(),
|
||||||
|
child: testmCreateEntityScreen(),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
).then((_) {
|
||||||
|
fetchEntities();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
child: const Icon(Icons.add),
|
||||||
|
),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _buildListItem(Map<String, dynamic> entity) {
|
||||||
|
return showCardView ? _buildCardView(entity) : _buildNormalView(entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Function to build card view for a list item
|
||||||
|
Widget _buildCardView(Map<String, dynamic> 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<String, dynamic> 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<String>(
|
||||||
|
icon: const Icon(
|
||||||
|
Icons.more_vert,
|
||||||
|
color: Colors.black,
|
||||||
|
size: 16,
|
||||||
|
),
|
||||||
|
itemBuilder: (BuildContext context) {
|
||||||
|
return [
|
||||||
|
PopupMenuItem<String>(
|
||||||
|
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<String>(
|
||||||
|
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) => ChangeNotifierProvider(
|
||||||
|
create: (context) => TestmViewModelScreen(),
|
||||||
|
child: testmUpdateEntityScreen(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(
|
||||||
|
"Namem : ",
|
||||||
|
overflow: TextOverflow.ellipsis,
|
||||||
|
textAlign: TextAlign.left,
|
||||||
|
style: AppStyle.txtGilroyMedium16,
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
entity['namem'].toString() ?? 'No Namem Available',
|
||||||
|
overflow: TextOverflow.ellipsis,
|
||||||
|
textAlign: TextAlign.left,
|
||||||
|
style: AppStyle.txtGilroyMedium16Bluegray900,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Padding(
|
||||||
|
padding: getPadding(
|
||||||
|
top: 10,
|
||||||
|
),
|
||||||
|
child: Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
"Bar_code : ",
|
||||||
|
overflow: TextOverflow.ellipsis,
|
||||||
|
textAlign: TextAlign.left,
|
||||||
|
style: AppStyle.txtGilroyMedium16,
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
entity['bar_code'].toString() ?? 'No Bar_code Available',
|
||||||
|
overflow: TextOverflow.ellipsis,
|
||||||
|
textAlign: TextAlign.left,
|
||||||
|
style: AppStyle.txtGilroyMedium16Bluegray900,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Padding(
|
||||||
|
padding: getPadding(
|
||||||
|
top: 10,
|
||||||
|
),
|
||||||
|
child: Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
"Qr_code : ",
|
||||||
|
overflow: TextOverflow.ellipsis,
|
||||||
|
textAlign: TextAlign.left,
|
||||||
|
style: AppStyle.txtGilroyMedium16,
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
entity['qr_code'].toString() ?? 'No Qr_code Available',
|
||||||
|
overflow: TextOverflow.ellipsis,
|
||||||
|
textAlign: TextAlign.left,
|
||||||
|
style: AppStyle.txtGilroyMedium16Bluegray900,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Padding(
|
||||||
|
padding: getPadding(
|
||||||
|
top: 10,
|
||||||
|
),
|
||||||
|
child: Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
"Numberm : ",
|
||||||
|
overflow: TextOverflow.ellipsis,
|
||||||
|
textAlign: TextAlign.left,
|
||||||
|
style: AppStyle.txtGilroyMedium16,
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
entity['numberm'].toString() ?? 'No Numberm Available',
|
||||||
|
overflow: TextOverflow.ellipsis,
|
||||||
|
textAlign: TextAlign.left,
|
||||||
|
style: AppStyle.txtGilroyMedium16Bluegray900,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
|
||||||
|
Padding(
|
||||||
|
padding: getPadding(
|
||||||
|
top: 10,
|
||||||
|
),
|
||||||
|
child: Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
"Numberb : ",
|
||||||
|
overflow: TextOverflow.ellipsis,
|
||||||
|
textAlign: TextAlign.left,
|
||||||
|
style: AppStyle.txtGilroyMedium16,
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
entity['numberb'].toString() ?? 'No Numberb 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<String, dynamic> 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';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@ -0,0 +1,393 @@
|
|||||||
|
// ignore_for_file: use_build_context_synchronously
|
||||||
|
import 'dart:convert';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
import '../Testm_viewModel/Testm_view_model_screen.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 '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 'dart:math';
|
||||||
|
import '../../../../Reuseable/reusable_text_field.dart';
|
||||||
|
import '../../../../Reuseable/reusable_date_picker_field.dart';
|
||||||
|
import '../../../../Reuseable/reusable_date_time_picker_field.dart';
|
||||||
|
import '../../../../Reuseable/reusable_dropdown_field.dart';
|
||||||
|
import 'package:flutter/services.dart';
|
||||||
|
class testmUpdateEntityScreen extends StatefulWidget {
|
||||||
|
final Map<String, dynamic> entity;
|
||||||
|
|
||||||
|
|
||||||
|
testmUpdateEntityScreen({required this.entity});
|
||||||
|
|
||||||
|
@override
|
||||||
|
_testmUpdateEntityScreenState createState() => _testmUpdateEntityScreenState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _testmUpdateEntityScreenState extends State<testmUpdateEntityScreen> {
|
||||||
|
final _formKey = GlobalKey<FormState>();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Widget buildFormField(String fieldOption) {
|
||||||
|
return Padding(
|
||||||
|
padding: const EdgeInsets.only(bottom: 16.0),
|
||||||
|
child: Card(
|
||||||
|
elevation: 4,
|
||||||
|
shape: RoundedRectangleBorder(
|
||||||
|
borderRadius: BorderRadius.circular(8),
|
||||||
|
),
|
||||||
|
child: Padding(
|
||||||
|
padding: const EdgeInsets.all(12.0),
|
||||||
|
child: TextFormField(
|
||||||
|
initialValue: widget.entity['child'] != null &&
|
||||||
|
widget.entity['child'][fieldOption] != null
|
||||||
|
? widget.entity['child'][fieldOption]
|
||||||
|
: '',
|
||||||
|
decoration: InputDecoration(
|
||||||
|
labelText: fieldOption,
|
||||||
|
border: OutlineInputBorder(
|
||||||
|
borderRadius: BorderRadius.circular(8),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
onSaved: (value) {
|
||||||
|
if (widget.entity['child'] == null) {
|
||||||
|
widget.entity['child'] = {};
|
||||||
|
}
|
||||||
|
widget.entity['child'][fieldOption] = value;
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
super.initState();
|
||||||
|
final provider = Provider.of<TestmViewModelScreen>(context, listen: false);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
final provider = Provider.of<TestmViewModelScreen>(context, listen: false);
|
||||||
|
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 Testm"), actions: [
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
],
|
||||||
|
),
|
||||||
|
body: SingleChildScrollView(
|
||||||
|
child: Padding(
|
||||||
|
padding: const EdgeInsets.all(16),
|
||||||
|
child: Form(
|
||||||
|
key: _formKey,
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
|
||||||
|
ReusableTextField(
|
||||||
|
|
||||||
|
label: "Please Enter Namem",
|
||||||
|
initialValue: widget.entity['namem'] ?? '',
|
||||||
|
|
||||||
|
// ValidationProperties
|
||||||
|
onSaved: (value) => widget.entity['namem'] = value,
|
||||||
|
),
|
||||||
|
|
||||||
|
SizedBox(height: 16),
|
||||||
|
|
||||||
|
|
||||||
|
Container(
|
||||||
|
padding: EdgeInsets.all(16.0),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.grey[200],
|
||||||
|
borderRadius: BorderRadius.circular(8.0),
|
||||||
|
boxShadow: [
|
||||||
|
BoxShadow(
|
||||||
|
color: Colors.black.withOpacity(0.2),
|
||||||
|
spreadRadius: 2,
|
||||||
|
blurRadius: 4,
|
||||||
|
offset: Offset(0, 2),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
"Fieldgg",
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 18,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(height: 16),
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
SizedBox(height: 16),
|
||||||
|
TextFormField(
|
||||||
|
initialValue: widget.entity['bar_code'],
|
||||||
|
decoration: InputDecoration(
|
||||||
|
labelText: 'fieldgg bar_code',
|
||||||
|
),
|
||||||
|
onChanged: (value) {
|
||||||
|
setState(() {
|
||||||
|
widget.entity['bar_code'] = value;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
),
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
SizedBox(height: 16),
|
||||||
|
TextFormField(
|
||||||
|
initialValue: widget.entity['qr_code'],
|
||||||
|
decoration: InputDecoration(
|
||||||
|
labelText: 'fieldgg qr_code',
|
||||||
|
),
|
||||||
|
onChanged: (value) {
|
||||||
|
setState(() {
|
||||||
|
widget.entity['qr_code'] = value;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
),
|
||||||
|
|
||||||
|
|
||||||
|
SizedBox(height: 16),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(height: 16),
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.all(16.0),
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
const SizedBox(
|
||||||
|
height: 20,
|
||||||
|
child: Text(
|
||||||
|
'Child',
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 18,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
color: Colors.black,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(height: 16), // Add space between elements
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
buildFormField('namemmm'),
|
||||||
|
|
||||||
|
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Padding(
|
||||||
|
padding: EdgeInsets.all(16),
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: <Widget>[
|
||||||
|
|
||||||
|
|
||||||
|
ElevatedButton(
|
||||||
|
onPressed: () {
|
||||||
|
// Save changes logic here
|
||||||
|
|
||||||
|
|
||||||
|
Navigator.pop(context);
|
||||||
|
// Implement API call to update data
|
||||||
|
},
|
||||||
|
child: Text('Save'),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
ReusableTextField(
|
||||||
|
initialValue: widget.entity['numberm'].toString(),
|
||||||
|
onSaved: (value) => widget.entity['numberm']= value,
|
||||||
|
label: "Enter Numberm",
|
||||||
|
keyboardType: TextInputType.number,
|
||||||
|
inputFormatters: [
|
||||||
|
FilteringTextInputFormatter.allow((RegExp(r'[0-9]'))),
|
||||||
|
],
|
||||||
|
validator: (value) {
|
||||||
|
if (value == null || value.isEmpty) {
|
||||||
|
return 'Please enter a number';
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
},
|
||||||
|
),
|
||||||
|
|
||||||
|
ReusableTextField(
|
||||||
|
initialValue: widget.entity['numberb'].toString(),
|
||||||
|
onSaved: (value) => widget.entity['numberb']= value,
|
||||||
|
label: "Enter Numberb",
|
||||||
|
keyboardType: TextInputType.number,
|
||||||
|
inputFormatters: [
|
||||||
|
FilteringTextInputFormatter.allow((RegExp(r'[0-9]'))),
|
||||||
|
],
|
||||||
|
validator: (value) {
|
||||||
|
if (value == null || value.isEmpty) {
|
||||||
|
return 'Please enter a number';
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
},
|
||||||
|
),
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
CustomButton(
|
||||||
|
height: getVerticalSize(50),
|
||||||
|
text: "Update",
|
||||||
|
margin: getMargin(top: 24, bottom: 5),
|
||||||
|
onTap: () async {
|
||||||
|
if (_formKey.currentState!.validate()) {
|
||||||
|
_formKey.currentState!.save();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
try {
|
||||||
|
await provider.updateEntity(
|
||||||
|
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 Testm: $e'),
|
||||||
|
actions: [
|
||||||
|
TextButton(
|
||||||
|
child: const Text('OK'),
|
||||||
|
onPressed: () {
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,86 @@
|
|||||||
|
import 'package:dio/dio.dart';
|
||||||
|
import '../../../../data/network/base_network_service.dart';
|
||||||
|
import '../../../../data/network/network_api_service.dart';
|
||||||
|
import '../../../../resources/api_constants.dart';
|
||||||
|
|
||||||
|
class TestmRepoScreen {
|
||||||
|
final String baseUrl = ApiConstants.baseUrl;
|
||||||
|
final BaseNetworkService _helper = NetworkApiService();
|
||||||
|
|
||||||
|
Future<dynamic> getEntities() async {
|
||||||
|
try {
|
||||||
|
final response =
|
||||||
|
await _helper.getGetApiResponse('$baseUrl/Testm/Testm');
|
||||||
|
return response;
|
||||||
|
} catch (e) {
|
||||||
|
throw Exception('Failed to get all entities: $e');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<dynamic> getAllWithPagination(int page, int size) async {
|
||||||
|
try {
|
||||||
|
final response = await _helper.getGetApiResponse(
|
||||||
|
'$baseUrl/Testm/Testm/getall/page?page=$page&size=$size');
|
||||||
|
return response;
|
||||||
|
} catch (e) {
|
||||||
|
throw Exception('Failed to get all without pagination: $e');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<dynamic> createEntity(Map<String, dynamic> entity) async {
|
||||||
|
try {
|
||||||
|
print("in post api$entity");
|
||||||
|
final response = await _helper.getPostApiResponse(
|
||||||
|
'$baseUrl/Testm/Testm', entity);
|
||||||
|
|
||||||
|
print(entity);
|
||||||
|
|
||||||
|
return response;
|
||||||
|
} catch (e) {
|
||||||
|
throw Exception('Failed to create entity: $e');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> updateEntity(int entityId, Map<String, dynamic> entity) async {
|
||||||
|
try {
|
||||||
|
await _helper.getPutApiResponse(
|
||||||
|
'$baseUrl/Testm/Testm/$entityId', entity);
|
||||||
|
print(entity);
|
||||||
|
} catch (e) {
|
||||||
|
throw Exception('Failed to update entity: $e');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> deleteEntity(int entityId) async {
|
||||||
|
try {
|
||||||
|
await _helper
|
||||||
|
.getDeleteApiResponse('$baseUrl/Testm/Testm/$entityId');
|
||||||
|
} catch (e) {
|
||||||
|
throw Exception('Failed to delete entity: $e');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Future<dynamic> getdataggGrid() async {
|
||||||
|
try {
|
||||||
|
String apiUrl = "$baseUrl/Testm_ListFilter1/Testm_ListFilter1";
|
||||||
|
final response = await _helper.getGetApiResponse(apiUrl);
|
||||||
|
return response;
|
||||||
|
} catch (e) {
|
||||||
|
throw Exception('Failed to Upload datagg: $e');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,132 @@
|
|||||||
|
import 'dart:typed_data';
|
||||||
|
import 'package:dio/dio.dart';
|
||||||
|
import 'package:http_parser/http_parser.dart';
|
||||||
|
import '../../../../utils/toast_messages/toast_message_util.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import '../Testm_Repo/Testm_repo_screen.dart';
|
||||||
|
|
||||||
|
class TestmViewModelScreen extends ChangeNotifier{
|
||||||
|
final TestmRepoScreen repo = TestmRepoScreen();
|
||||||
|
|
||||||
|
Future<List<Map<String, dynamic>>> getEntities() async {
|
||||||
|
try {
|
||||||
|
final response = await repo.getEntities();
|
||||||
|
final entities = (response as List).cast<Map<String, dynamic>>();
|
||||||
|
return entities;
|
||||||
|
} catch (e) {
|
||||||
|
throw Exception('Failed to get all entities: $e');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Future<List<Map<String, dynamic>>> getAllWithPagination(
|
||||||
|
int page, int size) async {
|
||||||
|
try {
|
||||||
|
final response =
|
||||||
|
await repo.getAllWithPagination(page, size); // ✅ Use await
|
||||||
|
|
||||||
|
print('res - $response');
|
||||||
|
|
||||||
|
// ✅ Ensure response is a Map<String, dynamic>
|
||||||
|
if (response is! Map<String, dynamic>) {
|
||||||
|
throw Exception('Unexpected response format: $response');
|
||||||
|
}
|
||||||
|
|
||||||
|
// ✅ Extract 'content' and ensure it's a list
|
||||||
|
final entities = (response['content'] as List)
|
||||||
|
.cast<Map<String, dynamic>>() // ✅ Ensure list of maps
|
||||||
|
.toList();
|
||||||
|
return entities;
|
||||||
|
} catch (e) {
|
||||||
|
print(e);
|
||||||
|
throw Exception('Failed to get all without pagination :- $e');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Future<Map<String, dynamic>> createEntity(Map<String, dynamic> entity) async {
|
||||||
|
try {
|
||||||
|
print("in post api - $entity");
|
||||||
|
// Wait for API response
|
||||||
|
final responseData =
|
||||||
|
await repo.createEntity(entity) as Map<String, dynamic>;
|
||||||
|
print('after value - $responseData');
|
||||||
|
ToastMessageUtil.showToast(
|
||||||
|
message: "Added Successfully", toastType: ToastType.success);
|
||||||
|
|
||||||
|
return responseData; // Return the data AFTER it is received
|
||||||
|
} catch (error) {
|
||||||
|
print("error--$error");
|
||||||
|
ToastMessageUtil.showToast(
|
||||||
|
message: "Got Error", toastType: ToastType.error);
|
||||||
|
|
||||||
|
throw Exception(
|
||||||
|
'Failed to Create Entity: $error'); // Properly rethrow the error
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Future<void> updateEntity(int entityId, Map<String, dynamic> entity) async {
|
||||||
|
try {
|
||||||
|
repo.updateEntity(entityId, entity).then((value) {
|
||||||
|
ToastMessageUtil.showToast(
|
||||||
|
message: "Updated Successfully", toastType: ToastType.success);
|
||||||
|
}).onError(
|
||||||
|
(error, stackTrace) {
|
||||||
|
print("error--$error");
|
||||||
|
ToastMessageUtil.showToast(
|
||||||
|
message: "Got Error", toastType: ToastType.error);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
print(entity);
|
||||||
|
} catch (e) {
|
||||||
|
throw Exception('Failed to update entity: $e');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> deleteEntity(int entityId) async {
|
||||||
|
try {
|
||||||
|
repo.deleteEntity(entityId).then((value) {
|
||||||
|
ToastMessageUtil.showToast(
|
||||||
|
message: "Deleted Successfully", toastType: ToastType.success);
|
||||||
|
}).onError(
|
||||||
|
(error, stackTrace) {
|
||||||
|
print("error--$error");
|
||||||
|
ToastMessageUtil.showToast(
|
||||||
|
message: "Got Error", toastType: ToastType.error);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
} catch (e) {
|
||||||
|
throw Exception('Failed to delete entity: $e');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
late List<Map<String, dynamic>> dataggdataFuture =
|
||||||
|
[]; // Data from fetchData
|
||||||
|
|
||||||
|
Future<List<Map<String, dynamic>>> getdataggGrid() async {
|
||||||
|
|
||||||
|
try {
|
||||||
|
final value = await repo.getdataggGrid();
|
||||||
|
dataggdataFuture = (value as List)
|
||||||
|
.map((item) => item as Map<String, dynamic>)
|
||||||
|
.toList();
|
||||||
|
|
||||||
|
return dataggdataFuture;
|
||||||
|
} catch (e) {
|
||||||
|
throw Exception('Failed to get all: $e');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -1,3 +1,6 @@
|
|||||||
|
import '../../Entity/forma/Testm/TestmView/Testm_entity_list_screen.dart';
|
||||||
|
import '../../Entity/forma/Testm/Testm_viewModel/Testm_view_model_screen.dart';
|
||||||
|
|
||||||
import 'package:base_project/utils/image_constant.dart';
|
import 'package:base_project/utils/image_constant.dart';
|
||||||
import 'package:base_project/commans/widgets/custome_drawe_item.dart';
|
import 'package:base_project/commans/widgets/custome_drawe_item.dart';
|
||||||
import 'package:base_project/resources/app_colors.dart';
|
import 'package:base_project/resources/app_colors.dart';
|
||||||
@ -9,79 +12,96 @@ import 'package:flutter_svg/svg.dart';
|
|||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
class MyCustomDrawer extends StatelessWidget {
|
class MyCustomDrawer extends StatelessWidget {
|
||||||
const MyCustomDrawer({super.key});
|
const MyCustomDrawer({super.key});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final email = UserManager().email;
|
final email = UserManager().email;
|
||||||
final userName = UserManager().userName;
|
final userName = UserManager().userName;
|
||||||
final provider = Provider.of<ProfileViewModel>(context, listen: false);
|
final provider = Provider.of<ProfileViewModel>(context, listen: false);
|
||||||
return Drawer(
|
return Drawer(
|
||||||
child: ListView(
|
child: ListView(
|
||||||
padding: EdgeInsets.zero,
|
padding: EdgeInsets.zero,
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
UserAccountsDrawerHeader(
|
UserAccountsDrawerHeader(
|
||||||
decoration: const BoxDecoration(
|
decoration: const BoxDecoration(
|
||||||
color: AppColors.primary,
|
color: AppColors.primary,
|
||||||
),
|
),
|
||||||
currentAccountPicture: CircleAvatar(
|
currentAccountPicture: CircleAvatar(
|
||||||
radius: 60,
|
radius: 60,
|
||||||
backgroundColor: AppColors.primary.withOpacity(0.3),
|
backgroundColor: AppColors.primary.withOpacity(0.3),
|
||||||
backgroundImage: provider.profileImageBytes != null
|
backgroundImage: provider.profileImageBytes != null
|
||||||
? MemoryImage(provider.profileImageBytes!)
|
? MemoryImage(provider.profileImageBytes!)
|
||||||
: null,
|
: null,
|
||||||
child: provider.profileImageBytes != null
|
child: provider.profileImageBytes != null
|
||||||
? null // Use backgroundImage for the actual image, so child should be null
|
? null // Use backgroundImage for the actual image, so child should be null
|
||||||
: SvgPicture.asset(
|
: SvgPicture.asset(
|
||||||
ImageConstant.userProfileImg, // Placeholder SVG asset
|
ImageConstant.userProfileImg, // Placeholder SVG asset
|
||||||
|
|
||||||
// AppImages.userProfileImg, // Placeholder SVG asset
|
// AppImages.userProfileImg, // Placeholder SVG asset
|
||||||
width: 60, // Adjust to fit the CircleAvatar
|
width: 60, // Adjust to fit the CircleAvatar
|
||||||
height: 60,
|
height: 60,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
accountName: Text("Hello, $userName"),
|
accountName: Text("Hello, $userName"),
|
||||||
accountEmail: Text(email.toString()),
|
accountEmail: Text(email.toString()),
|
||||||
),
|
),
|
||||||
DrawerItem(
|
DrawerItem(
|
||||||
color: AppColors.primary,
|
color: AppColors.primary,
|
||||||
icon: Icons.person,
|
icon: Icons.person,
|
||||||
title: 'Profile',
|
title: 'Profile',
|
||||||
onTap: () {
|
onTap: () {
|
||||||
Navigator.pushNamed(context, RouteNames.profileView);
|
Navigator.pushNamed(context, RouteNames.profileView);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
DrawerItem(
|
DrawerItem(
|
||||||
color: AppColors.primary,
|
color: AppColors.primary,
|
||||||
icon: Icons.system_security_update,
|
icon: Icons.system_security_update,
|
||||||
title: 'System Parameters',
|
title: 'System Parameters',
|
||||||
onTap: () {
|
onTap: () {
|
||||||
// Add navigation or other logic here
|
// Add navigation or other logic here
|
||||||
Navigator.pushNamed(context, RouteNames.systemParamsView);
|
Navigator.pushNamed(context, RouteNames.systemParamsView);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
DrawerItem(
|
DrawerItem(
|
||||||
color: AppColors.primary,
|
color: AppColors.primary,
|
||||||
icon: Icons.password,
|
icon: Icons.password,
|
||||||
title: 'change password',
|
title: 'change password',
|
||||||
onTap: () {
|
onTap: () {
|
||||||
Navigator.pushNamed(context, RouteNames.changePasswordView);
|
Navigator.pushNamed(context, RouteNames.changePasswordView);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
|
||||||
// NEW MENU
|
// NEW MENU
|
||||||
|
DrawerItem(
|
||||||
DrawerItem(
|
color: AppColors.primary,
|
||||||
icon: Icons.logout,
|
icon: Icons.chat_bubble,
|
||||||
color: Colors.red,
|
title: 'Testm',
|
||||||
title: 'Logout',
|
onTap: () {
|
||||||
onTap: () async {
|
Navigator.push(
|
||||||
await UserManager().clearUser();
|
context,
|
||||||
Navigator.pushReplacementNamed(context, RouteNames.splashView);
|
MaterialPageRoute(
|
||||||
},
|
builder: (context) => ChangeNotifierProvider(
|
||||||
|
create: (context) => TestmViewModelScreen(),
|
||||||
|
child: testm_entity_list_screen(),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
),
|
),
|
||||||
],
|
|
||||||
),
|
|
||||||
);
|
DrawerItem(
|
||||||
}
|
icon: Icons.logout,
|
||||||
|
color: Colors.red,
|
||||||
|
title: 'Logout',
|
||||||
|
onTap: () async {
|
||||||
|
await UserManager().clearUser();
|
||||||
|
Navigator.pushReplacementNamed(context, RouteNames.splashView);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user