Thymeleaf list within list input

后端 未结 2 1308
被撕碎了的回忆
被撕碎了的回忆 2021-02-13 17:43

I have a data structure like this :-

WorkHistory{
    List jobs;
}
Jobs{
   List workDoneSentences;
}

Basically, I am

相关标签:
2条回答
  • 2021-02-13 18:07
    <td><a class="btn btn-primary btn-md" id="work_done0" name="work_done0"  th:href="Modal">Work done</a></td>
    

    The Modal part should be configured per your own demand

    0 讨论(0)
  • 2021-02-13 18:30

    I've tried as follows and it works properly.

    Template: Create unique "modal" for each job. (work-list.html)

    <form method="post" action="#" th:action="@{/work-list}" th:object="${workHistoryDetails}">
     <table>
      <thead>
       <tr>
        <th>
          <button type="submit" name="addRow" th:text="'Add Row'">Add row</button>
        </th>
       </tr>
      </thead>
      <tbody>
       <tr id='addr_work0' th:each="workRow, rowStat : *{jobs}">
        <td th:text="${rowStat.index + 1}"></td>
          <td><input type="text" 
                    placeholder='Company Name'  class="form-control" th:field="*{jobs[__${rowStat.index}__].companyName}"/></td>
          <td><input type="text" 
                    placeholder='Company city' class="form-control" th:field="*{jobs[__${rowStat.index}__].city}"/></td>
    
    
          <td><button type="button" class="btn btn-primary" data-toggle="modal" th:attr="data-target='#myModal'+${rowStat.index}" >Open modal</button></td>
    
          <!-- The Modal -->
          <div class="modal fade" th:id="'myModal'+${rowStat.index}">
           <div class="modal-dialog">
            <div class="modal-content">
    
             <!-- Modal Header -->
             <div class="modal-header">
               <h4 class="modal-title">Modal Heading</h4>
               <button type="button" class="close" data-dismiss="modal">&times;</button>
             </div>
    
             <!-- Modal body -->
             <div class="modal-body">
               <input type="text"
                    placeholder='Company Name'  class="form-control" th:field="*{jobs[__${rowStat.index}__].workDoneSentences[0]}"/>
               <input type="text" 
                    placeholder='Company city' class="form-control" th:field="*{jobs[__${rowStat.index}__].workDoneSentences[1]}"/>
             </div>
    
             <!-- Modal footer -->
             <div class="modal-footer">
               <button type="button" class="btn btn-danger" data-dismiss="modal">Close</button>
             </div>
    
            </div>
           </div>
          </div>
        </tr>
       </tbody>
      </table>
     <input type="submit" name="submit" value="Add" class="btn btn-danger" />
    </form> 
    

    Controller:

    @ModelAttribute("workHistoryDetails")
    public WorkHistory populateWorkHistories() {
        return this.workHistory.getAllHistoryDetail();
    }
    
    @Autowired
    WorkHistoryService workHistory;
    
    @GetMapping("/work-list")
    public String greeting(final WorkHistory workHistoryDetails) {
        return "work-list";
    }
    
    @RequestMapping(value="/work-list",method=RequestMethod.POST)
    public String create(final WorkHistory workHistoryDetails) {
    
       this.workHistory.setJobs(workHistoryDetails);
       return "work-list";
    }
    
    // for adding new row job to jobs list
    @RequestMapping(value="/work-list", params={"addRow"})
    public String addRow(final WorkHistory workHistoryDetails, Model model) {
    
        Jobs jobRow = new Jobs("","",new ArrayList<>());
        workHistoryDetails.getJobs().add(jobRow);
        model.addAttribute("workHistoryDetails", workHistoryDetails);
        return "work-list";
    }
    

    Service: Just for the sake of testing:

    @Service
    public class WorkHistoryService {
    
        static WorkHistory workHistoryDetails =new WorkHistory();
        static{
            List<String> workDones = new ArrayList<>();
            workDones.add("angular");
            workDones.add("description");
            List<String> workDones1 = new ArrayList<>();
            workDones1.add("java,c++");
            workDones1.add("description also");
    
            Jobs job1 = new Jobs("Twitter", "USA",workDones); 
            Jobs job2 = new Jobs("Microsoft", "USA",workDones1);
            List<Jobs> jobList = new ArrayList<>();
            jobList.add(job1);
            jobList.add(job2);
            workHistoryDetails.setJobs(jobList);
        }
    
        public WorkHistory getAllHistoryDetail(){
    
            return workHistoryDetails;
        }
    
        public void setJobs(WorkHistory workHistory){
            workHistoryDetails.getJobs().clear();
            List<Jobs> jobs = workHistory.getJobs();
            for (Jobs job : jobs) {
                workHistoryDetails.getJobs().add(job);
            }
        }
    }
    

    Jobs domain:

    public class Jobs {
       private String companyName;
       private String city;
       private List<String> workDoneSentences;
        //default constructor important!   
        public Jobs() {
        super();
        }
       //setter getter
    }
    

    I hope it helps you.

    0 讨论(0)
提交回复
热议问题