index.html 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495
  1. <!DOCTYPE html>
  2. <html lang="ru">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <title>Метеосистема</title>
  6. <link rel="stylesheet" href="./main.css" />
  7. <script>
  8. document.addEventListener('DOMContentLoaded', () => {
  9. // Переключение вкладок (МЕТЕОБЮЛЛЕТЕНЬ / ЖУРНАЛ ИЗМЕРЕНИЙ)
  10. const tabButtons = document.querySelectorAll('.meteo__nav-btn');
  11. const tabContents = document.querySelectorAll('.meteo__tab');
  12. tabButtons.forEach(btn => {
  13. btn.addEventListener('click', () => {
  14. // Сбрасываем класс active на всех кнопках
  15. tabButtons.forEach(b => b.classList.remove('meteo__nav-btn--active'));
  16. // Назначаем active на текущую
  17. btn.classList.add('meteo__nav-btn--active');
  18. const targetTab = btn.getAttribute('data-tab');
  19. // Показываем нужный блок, скрываем остальные
  20. tabContents.forEach(tc => {
  21. if (tc.id === targetTab) {
  22. tc.classList.remove('meteo__tab--hidden');
  23. } else {
  24. tc.classList.add('meteo__tab--hidden');
  25. }
  26. });
  27. });
  28. });
  29. // Переключение режимов (ДМК / ВР)
  30. const modeButtons = document.querySelectorAll('.mode-selector__btn');
  31. const windSpeedGroup = document.getElementById('windSpeedGroup');
  32. const bulletDriftGroup = document.getElementById('bulletDriftGroup');
  33. let currentMode = 'dmk'; // По умолчанию ДМК
  34. modeButtons.forEach(btn => {
  35. btn.addEventListener('click', () => {
  36. modeButtons.forEach(b => b.classList.remove('mode-selector__btn--active'));
  37. btn.classList.add('mode-selector__btn--active');
  38. currentMode = btn.getAttribute('data-mode');
  39. if (currentMode === 'dmk') {
  40. // Отображаем "Скорость ветра"
  41. windSpeedGroup.style.display = 'flex';
  42. // Скрываем "Дальность сноса пуль"
  43. bulletDriftGroup.style.display = 'none';
  44. } else {
  45. // Скрываем "Скорость ветра"
  46. windSpeedGroup.style.display = 'none';
  47. // Отображаем "Дальность сноса пуль"
  48. bulletDriftGroup.style.display = 'flex';
  49. }
  50. checkFormValidity();
  51. });
  52. });
  53. // Валидация формы
  54. const inputs = document.querySelectorAll('.input-form__field');
  55. const createBtn = document.getElementById('createMeteo11');
  56. inputs.forEach(input => {
  57. input.addEventListener('input', checkFormValidity);
  58. });
  59. function checkFormValidity() {
  60. let allValid = true;
  61. inputs.forEach(input => {
  62. // Проверяем только те инпуты, которые видимы (не скрыты через display: none)
  63. if (input.parentElement.style.display !== 'none') {
  64. if (input.value.trim() === '') {
  65. allValid = false;
  66. }
  67. const value = parseFloat(input.value);
  68. /*const min = parseFloat(input.min);
  69. const max = parseFloat(input.max);
  70. if (input.hasAttribute('min') && value < min) {
  71. allValid = false;
  72. }
  73. if (input.hasAttribute('max') && value > max) {
  74. allValid = false;
  75. }*/
  76. }
  77. });
  78. createBtn.disabled = !allValid;
  79. }
  80. // Заполнение таблицы "МЕТЕО-11 ПРИБЛИЖЕННЫЙ" и отображение кнопки "Принять как Действ."
  81. const meteoTableBodies = document.querySelectorAll('.meteo-table__body');
  82. const acceptBtn = document.getElementById('acceptBtn');
  83. createBtn.addEventListener('click', () => {
  84. // Очищаем и заполняем обе таблицы
  85. meteoTableBodies.forEach(tableBody => {
  86. tableBody.innerHTML = ''; // Очищаем предыдущие результаты
  87. for (let i = 0; i < 8; i++) {
  88. const row = document.createElement('tr');
  89. row.className = 'meteo-table__row';
  90. const cells = ['diCell', 'dtCell', 'dWCell', 'wCell'].map(() => {
  91. const cell = document.createElement('td');
  92. cell.className = 'meteo-table__cell';
  93. return cell;
  94. });
  95. cells[0].textContent = i * 2;
  96. cells[1].textContent = `0${i} ч`;
  97. cells[2].textContent = (Math.random() * 10).toFixed(2);
  98. cells[3].textContent = (Math.random() * 5).toFixed(2);
  99. cells.forEach(cell => row.appendChild(cell));
  100. tableBody.appendChild(row);
  101. }
  102. });
  103. // Показываем кнопку "Принять как Действ."
  104. acceptBtn.classList.remove('meteo-btn--hidden');
  105. });
  106. acceptBtn.addEventListener('click', () => {
  107. // Добавляем запись в журнал измерений
  108. const logBody = document.querySelector('.log__body');
  109. const now = new Date();
  110. const dateStr = `${now.getDate().toString().padStart(2, '0')}.${(now.getMonth() + 1).toString().padStart(2, '0')}.${now.getFullYear()} ${now.getHours().toString().padStart(2, '0')}:${now.getMinutes().toString().padStart(2, '0')}`;
  111. const row = document.createElement('tr');
  112. row.className = 'log__row';
  113. const data = [
  114. dateStr,
  115. document.getElementById('height').value,
  116. document.getElementById('temperature').value,
  117. document.getElementById('pressure').value,
  118. document.getElementById('windDirection').value,
  119. currentMode === 'dmk' ?
  120. document.getElementById('windSpeed').value :
  121. document.getElementById('bulletDrift').value
  122. ];
  123. data.forEach(text => {
  124. const cell = document.createElement('td');
  125. cell.className = 'log__cell';
  126. cell.textContent = text;
  127. row.appendChild(cell);
  128. });
  129. logBody.appendChild(row);
  130. alert('Принят как действующий метеобюллетень!');
  131. });
  132. });
  133. </script>
  134. </head>
  135. <body>
  136. <div class="meteo">
  137. <nav class="meteo__nav">
  138. <button class="meteo__nav-btn meteo__nav-btn--active" data-tab="meteo-bulletin">МЕТЕОБЮЛЛЕТЕНЬ</button>
  139. <button class="meteo__nav-btn" data-tab="measurement-log">ЖУРНАЛ ИЗМЕРЕНИЙ</button>
  140. </nav>
  141. <div class="meteo__tab" id="meteo-bulletin">
  142. <div class="meteo__content">
  143. <!-- Left Panel -->
  144. <div class="input-panel">
  145. <div class="input-panel__header">
  146. <div class="mode-selector">
  147. <button class="mode-selector__btn mode-selector__btn--active" data-mode="dmk">ДМК</button>
  148. <button class="mode-selector__btn" data-mode="vr">ВР</button>
  149. </div>
  150. </div>
  151. <div class="input-form">
  152. <div class="input-form__group">
  153. <label class="input-form__label" for="height">Высота метеопоста</label>
  154. <input class="input-form__field" type="number" id="height" name="height" step="1" value="100">
  155. </div>
  156. <div class="input-form__group">
  157. <label class="input-form__label" for="temperature">Температура</label>
  158. <input class="input-form__field" type="number" id="temperature" name="temperature" step="0.1" value="15">
  159. </div>
  160. <div class="input-form__group">
  161. <label class="input-form__label" for="pressure">Давление</label>
  162. <input class="input-form__field" type="number" id="pressure" name="pressure" step="1" value="750">
  163. </div>
  164. <div class="input-form__group">
  165. <label class="input-form__label" for="windDirection">Направление ветра</label>
  166. <input class="input-form__field" type="number" id="windDirection" name="windDirection" step="1" value="0">
  167. </div>
  168. <div class="input-form__group" id="windSpeedGroup">
  169. <label class="input-form__label" for="windSpeed">Скорость ветра</label>
  170. <input class="input-form__field" type="number" id="windSpeed" name="windSpeed" step="1" value="0">
  171. </div>
  172. <div class="input-form__group" id="bulletDriftGroup" style="display: none;">
  173. <label class="input-form__label" for="bulletDrift">Дальность сноса пуль</label>
  174. <input class="input-form__field" type="number" id="bulletDrift" name="bulletDrift" step="1" value="0">
  175. </div>
  176. </div>
  177. <button class="meteo-btn meteo-btn--primary" id="createMeteo11">СОСТАВИТЬ МЕТЕО-11</button>
  178. <button class="meteo-btn meteo-btn--red" id="acceptBtn">ПРИНЯТЬ КАК ДЕЙСТВ.</button>
  179. </div>
  180. <!-- Right Panel - МЕТЕО-11 приближенный -->
  181. <div class="result-panel">
  182. <div class="result-panel__header">
  183. <div class="result-panel__title">
  184. МЕТЕО-11 <span class="result-panel__subtitle">приближённый</span>
  185. </div>
  186. </div>
  187. <div class="result-panel__dates">
  188. <div class="result-panel__date">ДДЧЧМ</div>
  189. <div class="result-panel__date">ДДЧЧМ</div>
  190. <div class="result-panel__date">ДДЧЧМ</div>
  191. </div>
  192. <div class="result-panel__header">
  193. <div class="result-panel__dt-list">
  194. <div class="result-panel__dt">dt</div>
  195. <div class="result-panel__dt">dt</div>
  196. <div class="result-panel__dt">dt</div>
  197. </div>
  198. </div>
  199. <div class="meteo-table">
  200. <table class="meteo-table__content">
  201. <tbody class="meteo-table__body">
  202. <tr class="meteo-table__row">
  203. <td class="meteo-table__cell"></td>
  204. <td class="meteo-table__cell"></td>
  205. <td class="meteo-table__cell"></td>
  206. <td class="meteo-table__cell"></td>
  207. </tr>
  208. <tr class="meteo-table__row">
  209. <td class="meteo-table__cell"></td>
  210. <td class="meteo-table__cell"></td>
  211. <td class="meteo-table__cell"></td>
  212. <td class="meteo-table__cell"></td>
  213. </tr>
  214. <tr class="meteo-table__row">
  215. <td class="meteo-table__cell"></td>
  216. <td class="meteo-table__cell"></td>
  217. <td class="meteo-table__cell"></td>
  218. <td class="meteo-table__cell"></td>
  219. </tr>
  220. <tr class="meteo-table__row">
  221. <td class="meteo-table__cell"></td>
  222. <td class="meteo-table__cell"></td>
  223. <td class="meteo-table__cell"></td>
  224. <td class="meteo-table__cell"></td>
  225. </tr>
  226. <tr class="meteo-table__row">
  227. <td class="meteo-table__cell"></td>
  228. <td class="meteo-table__cell"></td>
  229. <td class="meteo-table__cell"></td>
  230. <td class="meteo-table__cell"></td>
  231. </tr>
  232. <tr class="meteo-table__row">
  233. <td class="meteo-table__cell"></td>
  234. <td class="meteo-table__cell"></td>
  235. <td class="meteo-table__cell"></td>
  236. <td class="meteo-table__cell"></td>
  237. </tr>
  238. <tr class="meteo-table__row">
  239. <td class="meteo-table__cell"></td>
  240. <td class="meteo-table__cell"></td>
  241. <td class="meteo-table__cell"></td>
  242. <td class="meteo-table__cell"></td>
  243. </tr>
  244. <tr class="meteo-table__row">
  245. <td class="meteo-table__cell"></td>
  246. <td class="meteo-table__cell"></td>
  247. <td class="meteo-table__cell"></td>
  248. <td class="meteo-table__cell"></td>
  249. </tr>
  250. </tbody>
  251. </table>
  252. </div>
  253. </div>
  254. <!-- Right Panel - МЕТЕО-11 -->
  255. <div class="result-panel">
  256. <div class="result-panel__header">
  257. <div class="result-panel__title">МЕТЕО-11</div>
  258. </div>
  259. <div class="result-panel__dates">
  260. <div class="result-panel__date">ДДЧЧМ</div>
  261. <div class="result-panel__date">ДДЧЧМ</div>
  262. <div class="result-panel__date">ДДЧЧМ</div>
  263. </div>
  264. <div class="result-panel__header">
  265. <div class="result-panel__dt-list">
  266. <div class="result-panel__dt">dt</div>
  267. <div class="result-panel__dt">dt</div>
  268. <div class="result-panel__dt">dt</div>
  269. </div>
  270. </div>
  271. <div class="meteo-table">
  272. <table class="meteo-table__content">
  273. <tbody class="meteo-table__body">
  274. <tr class="meteo-table__row">
  275. <td class="meteo-table__cell"></td>
  276. <td class="meteo-table__cell"></td>
  277. <td class="meteo-table__cell"></td>
  278. <td class="meteo-table__cell"></td>
  279. </tr>
  280. <tr class="meteo-table__row">
  281. <td class="meteo-table__cell"></td>
  282. <td class="meteo-table__cell"></td>
  283. <td class="meteo-table__cell"></td>
  284. <td class="meteo-table__cell"></td>
  285. </tr>
  286. <tr class="meteo-table__row">
  287. <td class="meteo-table__cell"></td>
  288. <td class="meteo-table__cell"></td>
  289. <td class="meteo-table__cell"></td>
  290. <td class="meteo-table__cell"></td>
  291. </tr>
  292. <tr class="meteo-table__row">
  293. <td class="meteo-table__cell"></td>
  294. <td class="meteo-table__cell"></td>
  295. <td class="meteo-table__cell"></td>
  296. <td class="meteo-table__cell"></td>
  297. </tr>
  298. <tr class="meteo-table__row">
  299. <td class="meteo-table__cell"></td>
  300. <td class="meteo-table__cell"></td>
  301. <td class="meteo-table__cell"></td>
  302. <td class="meteo-table__cell"></td>
  303. </tr>
  304. <tr class="meteo-table__row">
  305. <td class="meteo-table__cell"></td>
  306. <td class="meteo-table__cell"></td>
  307. <td class="meteo-table__cell"></td>
  308. <td class="meteo-table__cell"></td>
  309. </tr>
  310. <tr class="meteo-table__row">
  311. <td class="meteo-table__cell"></td>
  312. <td class="meteo-table__cell"></td>
  313. <td class="meteo-table__cell"></td>
  314. <td class="meteo-table__cell"></td>
  315. </tr>
  316. <tr class="meteo-table__row">
  317. <td class="meteo-table__cell"></td>
  318. <td class="meteo-table__cell"></td>
  319. <td class="meteo-table__cell"></td>
  320. <td class="meteo-table__cell"></td>
  321. </tr>
  322. </tbody>
  323. </table>
  324. </div>
  325. </div>
  326. </div>
  327. </div>
  328. <!-- Журнал измерений tab -->
  329. <div class="meteo__tab meteo__tab--hidden" id="measurement-log">
  330. <h2 class="meteo__heading">Журнал измерений</h2>
  331. <div class="log">
  332. <table class="log__table">
  333. <thead class="log__header">
  334. <tr class="log__row">
  335. <th class="log__cell log__cell--header">Дата</th>
  336. <th class="log__cell log__cell--header">Высота</th>
  337. <th class="log__cell log__cell--header">Темп.</th>
  338. <th class="log__cell log__cell--header">Давл.</th>
  339. <th class="log__cell log__cell--header">Напр. ветра</th>
  340. <th class="log__cell log__cell--header">Скорость/Дальность</th>
  341. </tr>
  342. </thead>
  343. <tbody class="log__body">
  344. <!-- Dynamic content -->
  345. <tr class="log__row">
  346. <td class="log__cell"></td>
  347. <td class="log__cell"></td>
  348. <td class="log__cell"></td>
  349. <td class="log__cell"></td>
  350. <td class="log__cell"></td>
  351. <td class="log__cell"></td>
  352. </tr>
  353. <tr class="log__row">
  354. <td class="log__cell"></td>
  355. <td class="log__cell"></td>
  356. <td class="log__cell"></td>
  357. <td class="log__cell"></td>
  358. <td class="log__cell"></td>
  359. <td class="log__cell"></td>
  360. </tr>
  361. <tr class="log__row">
  362. <td class="log__cell"></td>
  363. <td class="log__cell"></td>
  364. <td class="log__cell"></td>
  365. <td class="log__cell"></td>
  366. <td class="log__cell"></td>
  367. <td class="log__cell"></td>
  368. </tr>
  369. <tr class="log__row">
  370. <td class="log__cell"></td>
  371. <td class="log__cell"></td>
  372. <td class="log__cell"></td>
  373. <td class="log__cell"></td>
  374. <td class="log__cell"></td>
  375. <td class="log__cell"></td>
  376. </tr>
  377. <tr class="log__row">
  378. <td class="log__cell"></td>
  379. <td class="log__cell"></td>
  380. <td class="log__cell"></td>
  381. <td class="log__cell"></td>
  382. <td class="log__cell"></td>
  383. <td class="log__cell"></td>
  384. </tr>
  385. <tr class="log__row">
  386. <td class="log__cell"></td>
  387. <td class="log__cell"></td>
  388. <td class="log__cell"></td>
  389. <td class="log__cell"></td>
  390. <td class="log__cell"></td>
  391. <td class="log__cell"></td>
  392. </tr>
  393. <tr class="log__row">
  394. <td class="log__cell"></td>
  395. <td class="log__cell"></td>
  396. <td class="log__cell"></td>
  397. <td class="log__cell"></td>
  398. <td class="log__cell"></td>
  399. <td class="log__cell"></td>
  400. </tr>
  401. <tr class="log__row">
  402. <td class="log__cell"></td>
  403. <td class="log__cell"></td>
  404. <td class="log__cell"></td>
  405. <td class="log__cell"></td>
  406. <td class="log__cell"></td>
  407. <td class="log__cell"></td>
  408. </tr>
  409. <tr class="log__row">
  410. <td class="log__cell"></td>
  411. <td class="log__cell"></td>
  412. <td class="log__cell"></td>
  413. <td class="log__cell"></td>
  414. <td class="log__cell"></td>
  415. <td class="log__cell"></td>
  416. </tr>
  417. <tr class="log__row">
  418. <td class="log__cell"></td>
  419. <td class="log__cell"></td>
  420. <td class="log__cell"></td>
  421. <td class="log__cell"></td>
  422. <td class="log__cell"></td>
  423. <td class="log__cell"></td>
  424. </tr>
  425. <tr class="log__row">
  426. <td class="log__cell"></td>
  427. <td class="log__cell"></td>
  428. <td class="log__cell"></td>
  429. <td class="log__cell"></td>
  430. <td class="log__cell"></td>
  431. <td class="log__cell"></td>
  432. </tr>
  433. <tr class="log__row">
  434. <td class="log__cell"></td>
  435. <td class="log__cell"></td>
  436. <td class="log__cell"></td>
  437. <td class="log__cell"></td>
  438. <td class="log__cell"></td>
  439. <td class="log__cell"></td>
  440. </tr>
  441. <tr class="log__row">
  442. <td class="log__cell"></td>
  443. <td class="log__cell"></td>
  444. <td class="log__cell"></td>
  445. <td class="log__cell"></td>
  446. <td class="log__cell"></td>
  447. <td class="log__cell"></td>
  448. </tr>
  449. </tbody>
  450. </table>
  451. </div>
  452. </div>
  453. </div>
  454. </body>
  455. </html>