[ac151d1] | 1 | <nav class="navbar bg-secondary bg-gradient container-fluid px-0">
|
---|
| 2 | <div class="container-fluid">
|
---|
| 3 | <span class="navbar-brand mb-0 h1">Податоци за кандидатски листи</span>
|
---|
| 4 | </div>
|
---|
| 5 | </nav>
|
---|
| 6 |
|
---|
| 7 | <div class="container-fluid">
|
---|
| 8 | <div class="container my-3">
|
---|
| 9 |
|
---|
| 10 | <form th:object="${candidatesList}" action="/admin/candidatesList" method="post">
|
---|
| 11 | <input type="hidden" th:field="*{id}" name="id">
|
---|
| 12 | <div class="mb-3">
|
---|
| 13 | <label for="name" class="form-label">Име</label>
|
---|
| 14 | <input type="text" th:field="*{description}" class="form-control" id="name"
|
---|
| 15 | aria-describedby="emailHelp">
|
---|
| 16 | </div>
|
---|
| 17 |
|
---|
| 18 | <div class="mb-3">
|
---|
| 19 | <label class="form-label">Партија</label>
|
---|
| 20 | <select class="form-select" id="party" th:field="*{party}">
|
---|
| 21 | <option value=""></option>
|
---|
| 22 | <option th:each="party : ${parties}" th:value="${party.id}"
|
---|
| 23 | th:text="${party.name}"></option>
|
---|
| 24 | </select>
|
---|
| 25 | </div>
|
---|
| 26 | <div class="mb-3">
|
---|
| 27 | <label class="form-label">Реализација на избори</label>
|
---|
| 28 | <select class="form-select" id="eletionsRealizations" th:field="*{candidatesListElectionRealization}">
|
---|
| 29 | <option value=""></option>
|
---|
| 30 | <option th:each="realization : ${candidatesListElectionRealizations}" th:value="${realization.id}"
|
---|
| 31 | th:text="${realization.name}"></option>
|
---|
| 32 | </select>
|
---|
| 33 | </div>
|
---|
| 34 | <div class="mb-3">
|
---|
| 35 | <label class="form-label">Општина</label>
|
---|
| 36 | <select class="form-select" id="municipality" th:field="*{municipality}">
|
---|
| 37 | <option value="">Цела држава</option>
|
---|
| 38 | <option th:each="municipality : ${municipalities}" th:value="${municipality.id}"
|
---|
| 39 | th:text="${municipality.name}"></option>
|
---|
| 40 | </select>
|
---|
| 41 | </div>
|
---|
| 42 | <div class="mb-3">
|
---|
| 43 | <label class="form-label">Изборна Е</label>
|
---|
| 44 | <select class="form-select" id="electoralUnit" th:field="*{electoralUnit}">
|
---|
| 45 | <option value="">Цела држава</option>
|
---|
| 46 | <option th:each="unit : ${electoralUnits}" th:value="${unit.id}"
|
---|
| 47 | th:text="${unit.name}"></option>
|
---|
| 48 | </select>
|
---|
| 49 | </div>
|
---|
| 50 |
|
---|
| 51 | <div class="container mt-5">
|
---|
| 52 | <div class="row">
|
---|
| 53 | <div class="col-md-5">
|
---|
| 54 | <label for="leftSelect">Сите кандидати</label>
|
---|
| 55 | <select id="leftSelect" class="form-control" size="20" multiple>
|
---|
| 56 | <option th:each="candidate : ${candidatesNames}" th:value="${candidate?.id}" th:text="${candidate?.name + ' ' + candidate?.surname}">Избери членови</option>
|
---|
| 57 | </select>
|
---|
| 58 | </div>
|
---|
| 59 | <div class="col-md-2 text-center">
|
---|
| 60 | <button id="moveRight" class="btn btn-primary mb-2">>></button>
|
---|
| 61 | <button id="moveLeft" class="btn btn-primary mb-2"><<</button>
|
---|
| 62 | </div>
|
---|
| 63 | <div class="col-md-5">
|
---|
| 64 | <label for="rightSelect">Избрани кандидати</label>
|
---|
| 65 | <select id="rightSelect" class="form-control" size="20" name="candidatesInList" multiple>
|
---|
| 66 | <!-- Options moved from left select will appear here -->
|
---|
| 67 | </select>
|
---|
| 68 | </div>
|
---|
| 69 | </div>
|
---|
| 70 | </div>
|
---|
| 71 |
|
---|
| 72 | <!-- <div class="container">-->
|
---|
| 73 | <!-- <table class="table">-->
|
---|
| 74 | <!-- <thead class="table-header">-->
|
---|
| 75 | <!-- <tr>-->
|
---|
| 76 | <!-- <th>#</th>-->
|
---|
| 77 | <!-- <th>Кандидат</th>-->
|
---|
| 78 | <!-- </tr>-->
|
---|
| 79 | <!-- </thead>-->
|
---|
| 80 | <!-- <tbody>-->
|
---|
| 81 | <!-- <tr class="lista" th:each="candidate, iter : ${candidates}">-->
|
---|
| 82 | <!-- <td th:text="${iter.index + 1}"></td>-->
|
---|
| 83 | <!-- <td>-->
|
---|
| 84 | <!-- <select class="form-select" th:id="|${candidate.id}-${iter.index}|"-->
|
---|
| 85 | <!-- th:name="${'candidatesInList'}" th:value="${candidate.id}">-->
|
---|
| 86 | <!-- <option></option>-->
|
---|
| 87 | <!-- <option th:each="cand : ${candidatesNames}" th:value="${cand.id}"-->
|
---|
| 88 | <!-- th:text="|${cand.idNum} ${cand.name} ${cand.surname}|"-->
|
---|
| 89 | <!-- th:selected="${cand.id == candidate.id}"></option>-->
|
---|
| 90 | <!-- </select>-->
|
---|
| 91 | <!-- </td>-->
|
---|
| 92 | <!-- </tr>-->
|
---|
| 93 | <!-- </tbody>-->
|
---|
| 94 | <!-- </table>-->
|
---|
| 95 | <!-- </div>-->
|
---|
| 96 | <button type="submit" class="btn btn-primary">Запиши</button>
|
---|
| 97 | </form>
|
---|
| 98 | </div>
|
---|
| 99 |
|
---|
| 100 | <div class="container-fluid">
|
---|
| 101 | <table class="table table-striped table-hover">
|
---|
| 102 | <thead class="table-header">
|
---|
| 103 | <tr>
|
---|
| 104 | <th>#</th>
|
---|
| 105 | <th>Име</th>
|
---|
| 106 | <th>Партија</th>
|
---|
| 107 | <th>Реализација на избори</th>
|
---|
| 108 | <th>Општина</th>
|
---|
| 109 | <th>Изборна единица</th>
|
---|
| 110 | </tr>
|
---|
| 111 | </thead>
|
---|
| 112 | <tbody class="accordion" id="accordionExample">
|
---|
| 113 | <div th:each="list, iter : ${candidatesLists}">
|
---|
| 114 | <tr class="accordion-item" th:id="${list.id}">
|
---|
| 115 | <td th:text="${iter.count}"></td>
|
---|
| 116 | <td th:text="${list.description}"></td>
|
---|
| 117 | <td th:text="${list?.party?.name}"></td>
|
---|
| 118 | <td th:text="${list?.candidatesListElectionRealization?.name}"></td>
|
---|
| 119 | <td th:text="${list?.municipality?.name}"></td>
|
---|
| 120 | <td th:text="${list?.electoralUnit?.name}"></td>
|
---|
| 121 | <td>
|
---|
| 122 | <button class="btn btn-primary collapsed" type="button" data-bs-toggle="collapse"
|
---|
| 123 | th:data-bs-target="'#collapse' + ${list.id}" aria-expanded="false"
|
---|
| 124 | aria-controls="'collapse' + ${list.id}">
|
---|
| 125 | Прикажи кандидати
|
---|
| 126 | </button>
|
---|
| 127 | </td>
|
---|
| 128 | </tr>
|
---|
| 129 | <tr>
|
---|
| 130 | <td colspan="7" class="hiddenRow">
|
---|
| 131 | <div class="collapse" th:id="'collapse' + ${list?.id}">
|
---|
| 132 | <div class="accordion-body">
|
---|
| 133 | <table class="table">
|
---|
| 134 | <thead class="table-header">
|
---|
| 135 | <tr>
|
---|
| 136 | <th>#</th>
|
---|
| 137 | <th>Име</th>
|
---|
| 138 | <th>Презиме</th>
|
---|
| 139 | <th>ЕМБГ</th>
|
---|
| 140 | </tr>
|
---|
| 141 | </thead>
|
---|
| 142 | <tbody>
|
---|
| 143 | <tr th:each="candidate, iter : ${list.candidates}">
|
---|
| 144 | <td th:text="${iter.index + 1}"></td>
|
---|
| 145 | <td th:text="${candidate.name}"></td>
|
---|
| 146 | <td th:text="${candidate.surname}"></td>
|
---|
| 147 | <td th:text="${candidate.idNum}"></td>
|
---|
| 148 | </tr>
|
---|
| 149 | </tbody>
|
---|
| 150 | </table>
|
---|
| 151 | </div>
|
---|
| 152 | </div>
|
---|
| 153 | </td>
|
---|
| 154 | </tr>
|
---|
| 155 | </div>
|
---|
| 156 | </tbody>
|
---|
| 157 | </table>
|
---|
| 158 | </div>
|
---|
| 159 |
|
---|
| 160 | </div>
|
---|
| 161 |
|
---|
| 162 | <script>
|
---|
| 163 |
|
---|
| 164 | document.querySelectorAll("tr.accordion-item").forEach(x => x.addEventListener('click', (e) => {
|
---|
| 165 | console.log(e.target.parentElement)
|
---|
| 166 | if(e.target.tagName !== 'BUTTON' && !e.target.parentElement.classList.contains("lista"))
|
---|
| 167 | {
|
---|
| 168 | window.location.href = `/admin/candidatesList/${e.target.parentElement.id}`
|
---|
| 169 | }
|
---|
| 170 | }))
|
---|
| 171 | </script>
|
---|
| 172 |
|
---|
| 173 | <script>
|
---|
| 174 | document.getElementById('moveRight').addEventListener('click', function(e) {
|
---|
| 175 | e.preventDefault();
|
---|
| 176 | moveSelectedOptions('leftSelect', 'rightSelect', true);
|
---|
| 177 | });
|
---|
| 178 |
|
---|
| 179 | document.getElementById('moveLeft').addEventListener('click', function(e) {
|
---|
| 180 | e.preventDefault();
|
---|
| 181 | moveSelectedOptions('rightSelect', 'leftSelect', false);
|
---|
| 182 | });
|
---|
| 183 |
|
---|
| 184 | function moveSelectedOptions(sourceId, destinationId, addNumbers) {
|
---|
| 185 | let sourceSelect = document.getElementById(sourceId);
|
---|
| 186 | let destinationSelect = document.getElementById(destinationId);
|
---|
| 187 |
|
---|
| 188 | let selectedOptions = Array.from(sourceSelect.selectedOptions);
|
---|
| 189 |
|
---|
| 190 | console.log(destinationSelect.selectedOptions.length)
|
---|
| 191 | if (destinationId === 'rightSelect' && destinationSelect.selectedOptions.length >= 20){
|
---|
| 192 | alert("Бројот на пратеници во изборна единица мора да биде 20")
|
---|
| 193 | return;
|
---|
| 194 | }
|
---|
| 195 |
|
---|
| 196 | selectedOptions.forEach(option => {
|
---|
| 197 | if (addNumbers) {
|
---|
| 198 | destinationSelect.appendChild(option);
|
---|
| 199 | } else {
|
---|
| 200 | // Remove numbers when moving back to the left side
|
---|
| 201 | console.log('replace')
|
---|
| 202 | option.text = option.text.replace(/^\d+\.\s*/, '');
|
---|
| 203 | destinationSelect.appendChild(option);
|
---|
| 204 | }
|
---|
| 205 | });
|
---|
| 206 |
|
---|
| 207 | updateRightSelectNumbers();
|
---|
| 208 |
|
---|
| 209 |
|
---|
| 210 | }
|
---|
| 211 |
|
---|
| 212 | function updateRightSelectNumbers() {
|
---|
| 213 | const options = document.getElementById("rightSelect").options;
|
---|
| 214 | for (let i = 0; i < options.length; i++) {
|
---|
| 215 | options[i].text = `${i + 1}. ${options[i].text.replace(/^\d+\.\s*/, '')}`;
|
---|
| 216 | }
|
---|
| 217 | }
|
---|
| 218 | </script>
|
---|
| 219 |
|
---|
| 220 | <!--th:onclick="|window.location.href='/admin/candidatesList/${candidatesList.id}/edit';|"-->
|
---|