HTMLの編集と、$p.apiDeleteSiteによるサイト削除
要件と実装内容は以下の通りです。
①削除対象判別用のチェックボックスをサイトのアイコンに追加する
②削除実行用のボタンを画面に追加する
③ボタンを押下するとチェックボックスがONのサイトを判別し、スクリプトの $p.apiDeleteSite で一括削除する
それでは早速、上記を実現した方法をご紹介いたします。
まず、フォルダを作成します。
そしてフォルダの管理画面を開き、スクリプトタブに以下のスクリプトを設定します。
// チェックボックス追加処理
function addCheckboxes() {
$('.nav-site').each(function () {
const $site = $(this);
// 「上へ」ボタンにはチェックボックスを追加しない(to-parent クラスで判定)
if ($site.hasClass('to-parent')) return;
// チェックボックスは各ボタンのタイトル前を指定するため、画面要素内からtitleを抽出する
const $title = $site.find('.title');
// すでにチェックボックスがあるならスキップ
if ($title.find('input.site-checkbox').length > 0) return;
const titleText = $title.text().trim();
const checkbox = $('<input type="checkbox" class="site-checkbox" style="margin-right:5px;">');
$title.empty().append(checkbox).append(document.createTextNode(titleText));
});
}
// 削除ボタンの追加処理
function addDeleteButton() {
if ($('#DeleteCheckedSites').length === 0) {
// 削除ボタン追加
$('#MainCommands').append(
$('<button id="DeleteCheckedSites">選択サイトを削除</button>').button({ icon: 'ui-icon-trash' })
);
// 削除処理
$('#DeleteCheckedSites').on('click', function () {
const checkedSites = $('.site-checkbox:checked').closest('.nav-site');
if (checkedSites.length === 0) {
alert('フォルダ内で削除するサイトを選択してください。');
return;
}
if (!confirm('選択したサイトを削除しますか?')) return;
checkedSites.each(function () {
const siteId = $(this).data('value');
$p.apiDeleteSite({
id: siteId,
done: function () {
console.log('削除成功: ' + siteId);
// サイト自体は削除されるが、見た目上画面に残ってしまうため要素を削除
$(`.nav-site[data-value="${siteId}"]`).remove();
},
fail: function () {
console.error('削除失敗: ' + siteId);
}
});
});
});
}
}
// サイトを追加するとチェックボックスと削除ボタンの追加処理がリフレッシュされてしまう
// そこでサイト追加のXMLHttpRequestを監視し、リクエスト完了後に再度処理を実行させる
(function () {
const originalOpen = XMLHttpRequest.prototype.open;
const originalSend = XMLHttpRequest.prototype.send;
XMLHttpRequest.prototype.open = function (method, url) {
this._url = url; // 後で使うために保存
this._method = method;
return originalOpen.apply(this, arguments);
};
XMLHttpRequest.prototype.send = function (body) {
const xhr = this;
const isTargetRequest = () => {
return xhr._method === 'POST' &&
// リクエストURLの一部をフック
xhr._url.includes('/createbytemplate');
};
// リクエスト完了後に処理を実行
xhr.addEventListener('load', function () {
if (isTargetRequest()) {
console.log('指定のPOSTリクエストを検知しました:', xhr._url);
// リクエスト成功後に実行したい処理
addCheckboxes();
addDeleteButton();
}
});
return originalSend.apply(this, arguments);
};
})();
// 初期化
$(function () {
addCheckboxes();
addDeleteButton();
});
・addCheckboxes
削除対象判別用のチェックボックスを追加する処理になっています。
各サイトのアイコンが表示されるこの画面ですが、class="nav-sites" の順不同リストで構成されています。
さらにその中からサイトのタイトル(class="title")を判別し、その先頭にチェックボックスを追加させています。
ただし、それだけだとデフォルトで配置されている「上へ」にもチェックボックスが追加されてしまうため、固有のクラス「to-parent」で除外指定が必要でした。
・addDeleteButton
削除実行ボタンの追加と、押下時の削除処理になっています。
今回、削除実行ボタンは「戻る」ボタンなどが配置される MainCommands 部分にしております。
そして削除処理部分は、チェックボックスの状態を取得し、チェックがONのサイトIDを取得、そして取得したサイトIDを使い $p.apiDeleteSite で削除という流れです。
ただ、削除できていても画面上の要素が残ってしまいアイコンが残ってしまうため、見た目上の処理として削除サイトの要素も削除させています。
・XMLHttpRequestの監視
先述した二つの処理だけで問題なく動作するのですが、このフォルダ内で新規にサイトを作成するとスクリプトがリフレッシュされてしまうという課題がありました。
それを解決したのがこの処理です。
サイト作成時の XMLHttpRequest によるPOSTリクエストを監視し、それをキャッチした場合は再度上記のスクリプトを実行させています。
それでは、実際に動作させた画面をご覧ください。
スクリプトを設定したフォルダ内に、削除しても問題のないサイトを用意します。
あとは、そのサイトタイトル部分に表示させたチェックボックスにチェックを入れ、追加した削除実行ボタンをクリックすると、削除処理が実行されます。
ご覧の通り、サイトの種別を問わず削除することが可能です。


まとめ
いかがでしたか?
今回はあくまで手動で削除対象を選ぶ形で実装していますが、全てにチェックを入れる・外すという機能や、ログインユーザを判別して機能のON・OFFを切り替えるなどのカスタマイズも可能かと思います。
しかし同時に、誤操作によるサイトの削除も考えられますので、その点を考慮した運用や実装で、ぜひお試しいただければと思います。
弊社ではプリザンターをご使用中の方、これからご使用になられる方向けに以下サービスの提供も行っております。
・各種書籍
・帳票出力(Excel/PDF)支援パック
プリザンターの導入から開発・運用をあらゆる角度から全力サポートいたします。
ぜひお気軽にご相談ください!
☆☆☆
サービスの説明などをご希望の方は【 問い合わせフォーム 】よりお気軽にお問い合わせください。
☆☆☆
サイト削除の手間を軽減したい
こんにちは、シーイーシーカスタマサービスの新村です。
様々なサイトを作成していくと不要になったサイトも増えてしまう、といった経験はないでしょうか。
しかし、サイトは1サイトずつ削除していく必要があり、削除対象が複数ある場合は手間がかかります。
今回はそんな手間を軽減できる方法を考えてみました。