「Widget:Custom map」の版間の差分

提供:ロマサガ2リメイク 攻略Wiki(ロマンシング・サガ2 リベンジオブザセブン):ヘイグ
移動先:案内検索
編集の要約なし
タグ: 差し戻し済み
編集の要約なし
タグ: 手動差し戻し
 
(同じ利用者による、間の2版が非表示)
7行目: 7行目:


<script type="text/javascript">
<script type="text/javascript">
mw.loader.using(['mediawiki.api', 'mediawiki.user']).then(function() {
let map;
let map;
var drawnItems;
var drawnItems;
43行目: 42行目:
map.addLayer(drawnItems);
map.addLayer(drawnItems);


var DEBUG_MODE = true;


function debugLog(message) {
    if (DEBUG_MODE) {
        console.log("DEBUG:", message);
    }
}
function isMwAvailable() {
    return typeof mw !== 'undefined' && mw.user && mw.api;
}
// Leaflet.Draw
// Leaflet.Draw
var drawnItems = new L.FeatureGroup();
var drawnItems = new L.FeatureGroup();
255行目: 244行目:
// MediaWikiコンテンツのレンダリング
// MediaWikiコンテンツのレンダリング
function renderMediaWikiContent(content) {
function renderMediaWikiContent(content) {
    if (typeof mw === 'undefined' || !mw.Api) {
        console.warn('MediaWiki API is not available. Returning raw content.');
        return content;
    }
     var renderedContent = '';
     var renderedContent = '';
     $.ajax({
     $.ajax({
272行目: 256行目:
             renderedContent = data.parse.text['*'];
             renderedContent = data.parse.text['*'];
         },
         },
         error: function(xhr, status, error) {
         error: function() {
             console.error('Failed to render MediaWiki content:', error);
             console.error('Failed to render MediaWiki content');
            renderedContent = content;  // エラー時は元のコンテンツを返す
         }
         }
     });
     });
     return renderedContent;
     return renderedContent;
}
}


// ポップアップの内容を保存
// ポップアップの内容を保存
333行目: 317行目:
         title: 'マップを編集する',
         title: 'マップを編集する',
         onClick: function(btn, map) {
         onClick: function(btn, map) {
             editMode = true;
             checkUserGroup('map-edit-member', function(isInGroup) {
            map.addControl(drawControl);
                if (isInGroup) {
            btn.state('disable-edit');
                    editMode = true;
            updateAllPopups();
                    map.addControl(drawControl);
            saveButton.addTo(map); // saveButtonを表示する
                    btn.state('disable-edit');
                    updateAllPopups();
                    saveButton.addTo(map); // saveButtonを表示する
                } else {
                    alert('あなたには編集権限がありません。\n攻略に参加することでマップが編集できるようになります。');
                }
            });
         }
         }
     }, {
     }, {
368行目: 358行目:


// 保存ボタン
// 保存ボタン
var saveButton = L.easyButton('<img src="https://dq.h1g.jp/img/marker-icon-img/save-solid.svg">', async function() {
var saveButton = L.easyButton('<img src="https://dq.h1g.jp/img/marker-icon-img/save-solid.svg">', function() {
     if (editMode) {
     if (editMode) {
         var geoJSONData = convertToGeoJSON(drawnItems);
         var geoJSONData = convertToGeoJSON(drawnItems);
         if (geoJSONData) {
         if (geoJSONData) {
             await saveToWikiPage(geoJSONData);
//            console.log(geoJSONData);
             // Note: saveButton.remove() is now called inside saveToWikiPage on success
             saveToWikiPage(geoJSONData);
             saveButton.remove(); // saveButtonを非表示にする
         } else {
         } else {
             alert('Error: Invalid GeoJSON data');
             alert('Error: Invalid GeoJSON data');
381行目: 372行目:
     }
     }
}, '変更を保存');
}, '変更を保存');




554行目: 546行目:
}).addTo(map);
}).addTo(map);


function checkUserLoggedIn() {
    if (typeof mw !== 'undefined' && mw.user) {
        return mw.user.isAnon() === false;
    }
    return false;
}


function getCSRFToken() {
 
     return new Promise((resolve, reject) => {
function saveToWikiPage(geoJSONData) {
        if (!isMwAvailable()) {
     var formattedData = geoJSONData;
             reject('MediaWiki API is not available');
    $.ajax({
             return;
        type: "POST",
        url: 'http://162.43.54.49/api.php',
        data: {
            action: 'edit',
            title: '<!--{$geojson}-->',
            text: formattedData,
            token: mw.user.tokens.get('csrfToken'),
            format: 'json'
        },
        success: function(response) {
//            console.log("Save response:", response);
            if (response.edit && response.edit.result === 'Success') {
                alert('データは正常に保存されました');
                editMode = false;
                drawControl.remove();
                editButton.state('enable-edit');
                saveButton.remove(); // saveButtonを非表示にする
               
                setTimeout(function() {
                    loadPinsFromWikiPage();
                }, 1000);
             } else {
                alert('Error saving data: ' + JSON.stringify(response));
            }
        },
        error: function(xhr, status, error) {
            console.error("Save error:", error);
//            console.log("XHR status:", status);
//            console.log("XHR response:", xhr.responseText);
             alert('Error saving data: ' + error);
         }
         }
        mw.user.getToken().then(token => {
            resolve(token);
        }).catch(err => {
            reject('Failed to get CSRF token: ' + err);
        });
     });
     });
}
}
async function saveToWikiPage(geoJSONData) {
    if (!isMwAvailable()) {
        alert('エラー: MediaWiki APIが利用できません。ページを再読み込みしてから再試行してください。');
        return;
    }
    try {
        const csrfToken = await getCSRFToken();
        $.ajax({
            type: "POST",
            url: mw.util.wikiScript('api'),
            data: {
                action: 'edit',
                title: '<!--{$geojson}-->',
                text: formattedData,
                token: csrfToken,
                format: 'json'
            },
            success: function(response) {
                console.log("Save response:", response);
                if (response.edit && response.edit.result === 'Success') {
                    alert('データは正常に保存されました');
                    editMode = false;
                    drawControl.remove();
                    editButton.state('enable-edit');
                    saveButton.remove();
                   
                    setTimeout(function() {
                        loadPinsFromWikiPage();
                    }, 1000);
                } else {
                    alert('Error saving data: ' + JSON.stringify(response));
                }
            },
            error: function(xhr, status, error) {
                console.error("Save error:", error);
                console.log("XHR status:", status);
                console.log("XHR response:", xhr.responseText);
                alert('Error saving data: ' + error);
            }
        });
    } catch (error) {
        console.error("Error getting CSRF token:", error);
        alert('Error: Unable to get CSRF token. ' + error);
    }
}
map.on(L.Draw.Event.CREATED, function (event) {
map.on(L.Draw.Event.CREATED, function (event) {
     var layer = event.layer;
     var layer = event.layer;
644行目: 602行目:
         loadPinsFromWikiPage();
         loadPinsFromWikiPage();
     }, 500);  // 少し長めの遅延を設定
     }, 500);  // 少し長めの遅延を設定
});
});
});
</script>
</script>


</includeonly>
</includeonly>

2024年9月24日 (火) 13:45時点における最新版

地図表示Widget「Widget:Custom map」です。