Newer
Older
2024-Ikarashi / map.js
// 地図の初期化 (山形県酒田市の中心に近い座標)
    const map = L.map('map').setView([38.9122, 139.8360], 13);
    const firebaseConfig = { /* ... Firebase設定のプレースホルダー ... */ };

    // 国土地理院の地図タイルレイヤーを追加
    L.tileLayer('https://cyberjapandata.gsi.go.jp/xyz/std/{z}/{x}/{y}.png', {
        attribution: '<a href="https://maps.gsi.go.jp/development/ichiran.html">国土地理院</a>',
        maxZoom: 18,
        minZoom: 5
    }).addTo(map);

    // ページ読み込み時の処理
    window.addEventListener('load', () => {
        loadSavedComments(); 
        setTimeout(() => {
            map.invalidateSize(); 
        }, 100); 
    });

    // マーカーを管理する配列。
    let markers = []; 

    // 地図をクリックしてマーカーと情報ウィンドウを追加
    map.on('click', (e) => {
        const { lat, lng } = e.latlng;
        addMarker(lat, lng);
    });

    // マーカーとコメント入力ウィンドウを追加
    function addMarker(lat, lng) {
        const marker = L.marker([lat, lng]).addTo(map);
        const popupContent = `
            <div class="info-window">
                <p>活動日記を入力してください:</p>
                <textarea id="comment" rows="3" style="width:100%;"></textarea>
                <button onclick="saveComment('${lat}', '${lng}')">保存</button>
            </div>
        `;
        marker.bindPopup(popupContent).openPopup();
    }

    // コメントを保存し、履歴に追加
    function saveComment(lat, lng) {
        const comment = document.getElementById("comment").value;
        const timestamp = new Date().toLocaleString();

        if (!comment.trim()) {
            alert("コメントを入力してください。");
            return;
        }

        const entry = { lat, lng, comment, timestamp };
        saveToLocalStorage(entry);  
        
        reloadComments(); // UIを再同期
    
   
    }

    // 保存されたコメントをロードして表示し、対応するマーカーも作成
    function loadSavedComments() {
        const comments = JSON.parse(localStorage.getItem('comments')) || [];
        
        markers.forEach(marker => map.removeLayer(marker)); 
        markers = []; 
        document.getElementById("comments-list").innerHTML = "";

        comments.forEach((entry, index) => {
            addCommentToHistory(entry, index); 
            
            const marker = L.marker([entry.lat, entry.lng]).addTo(map); 
            markers.push(marker); 
            
            marker.bindPopup(`
                <div class="info-window">
                    <p><strong>日時:</strong> ${entry.timestamp}</p>
                    <p><strong>コメント:</strong> ${entry.comment}</p>
                </div>
            `);
        });

        // コメントエントリにランダムな回転を適用(デザイン用)
        document.querySelectorAll('.history-entry').forEach((el) => {
            const rotation = (Math.random() * 2 - 1).toFixed(1); 
            el.style.setProperty('--rotation', rotation);
        });
    }

    // 履歴にコメント要素を動的に追加
    function addCommentToHistory({ lat, lng, comment, timestamp }, index) {
        const commentsList = document.getElementById("comments-list");
        const commentEntryDiv = document.createElement('div');
        commentEntryDiv.className = "history-entry";
        commentEntryDiv.setAttribute('data-index', index); 

        commentEntryDiv.innerHTML = `
            <p><strong>日時:</strong> ${timestamp}</p>
            <p><strong>場所:</strong> 緯度 ${lat}, 経度 ${lng}</p>
            <p><strong>活動日記:</strong> 
                <span class="comment-text" contenteditable="true" onblur="updateComment(${index}, this)">
                    ${comment}
                </span>
            </p>
            <button onclick="deleteComment(${index})">削除</button>
        `;
        commentsList.appendChild(commentEntryDiv);
    }

    // コメントを削除(対応するマーカーも同時に削除されるように修正)
    function deleteComment(index) {
        let comments = JSON.parse(localStorage.getItem('comments')) || [];

        if (markers[index]) {
            map.removeLayer(markers[index]);
            markers.splice(index, 1); 
        }

        comments.splice(index, 1);
        localStorage.setItem('comments', JSON.stringify(comments));

        reloadComments(); // UIを再同期
    }

    // コメントを直接編集し保存する
    function updateComment(index, element) {
        let comments = JSON.parse(localStorage.getItem('comments')) || [];
        const newComment = element.textContent.trim(); 

        if (!newComment) {
            alert("コメントは空白にできません。元の内容に戻します。");
            element.textContent = comments[index].comment; 
            return;
        }

        comments[index].comment = newComment;
        localStorage.setItem('comments', JSON.stringify(comments)); 
        
        reloadComments(); // UIを再同期
    }

    // コメント履歴とマーカーを完全にリロードして同期させる関数
    function reloadComments() {
        loadSavedComments(); 
    }