yoone-snow/js/admin-media.js

183 lines
7.2 KiB
JavaScript

(function(){
// 后台媒体选择交互脚本 用于在设置页选择媒体项目
function initAdminMedia(){
// 条件判断 如果没有媒体按钮则不执行
var addButton = document.getElementById('yooneSnowAddMedia');
var listContainer = document.getElementById('yooneSnowMediaList');
if (!addButton || !listContainer) { return; }
// 形状与媒体权重容器元素 获取以便动态更新
var weightsContainer = document.getElementById('yooneSnowWeightsContainer');
var shapeWeightsBox = document.getElementById('yooneSnowShapeWeights');
var mediaWeightsBox = document.getElementById('yooneSnowMediaWeights');
// 形状标签映射用于显示友好名称
var shapeLabelsMap = {
dot: 'Dot',
flake: 'Snowflake',
yuanbao: 'Yuanbao',
coin: 'Coin',
santa_hat: 'Santa Hat',
candy_cane: 'Candy Cane',
christmas_sock: 'Christmas Sock',
christmas_tree: 'Christmas Tree',
reindeer: 'Reindeer',
christmas_berry: 'Christmas Berry'
};
// 同步形状权重输入 根据勾选状态增删对应输入
function ensureShapeWeightInputs(){
// 条件判断 权重容器不存在则跳过
if (!shapeWeightsBox) { return; }
var checkboxes = document.querySelectorAll('input[name="yoone_snow_mixed_items[]"]');
var presentKeys = {};
// 收集已存在的标签记录用于对比
var existingLabels = shapeWeightsBox.querySelectorAll('label[data-shape-key]');
existingLabels.forEach(function(el){
presentKeys[el.getAttribute('data-shape-key')] = el;
});
checkboxes.forEach(function(cb){
var key = cb.value;
if (cb.checked){
// 条件判断 如果不存在对应输入则创建 默认权重值为 1
if (!presentKeys[key]){
var lab = document.createElement('label');
lab.setAttribute('data-shape-key', key);
lab.style.display = 'flex';
lab.style.flexDirection = 'column';
lab.style.minWidth = '160px';
var title = document.createElement('span');
title.textContent = shapeLabelsMap[key] || key;
var input = document.createElement('input');
input.type = 'number';
input.min = '0';
input.name = 'yoone_snow_shape_weights[' + key + ']';
input.value = '1';
input.style.width = '120px';
lab.appendChild(title);
lab.appendChild(input);
shapeWeightsBox.appendChild(lab);
}
} else {
// 条件判断 如果取消勾选则移除对应输入
var exist = shapeWeightsBox.querySelector('label[data-shape-key="' + key + '"]');
if (exist) { exist.remove(); }
}
});
}
// 添加媒体权重输入 根据附件 ID 创建输入 默认值为 1
function addMediaWeightInput(attachmentId){
if (!mediaWeightsBox) { return; }
var exist = mediaWeightsBox.querySelector('label[data-attachment-id="' + String(attachmentId) + '"]');
if (exist) { return; }
var lab = document.createElement('label');
lab.setAttribute('data-attachment-id', String(attachmentId));
lab.style.display = 'flex';
lab.style.flexDirection = 'column';
lab.style.minWidth = '160px';
var title = document.createElement('span');
title.textContent = 'Media ' + String(attachmentId);
var input = document.createElement('input');
input.type = 'number';
input.min = '0';
input.name = 'yoone_snow_media_weights[' + String(attachmentId) + ']';
input.value = '1';
input.style.width = '120px';
lab.appendChild(title);
lab.appendChild(input);
mediaWeightsBox.appendChild(lab);
}
// 移除媒体权重输入 根据附件 ID 删除对应输入
function removeMediaWeightInput(attachmentId){
if (!mediaWeightsBox) { return; }
var exist = mediaWeightsBox.querySelector('label[data-attachment-id="' + String(attachmentId) + '"]');
if (exist) { exist.remove(); }
}
// 初始化时同步一次形状权重输入
ensureShapeWeightInputs();
// 监听形状复选框变化事件 动态刷新权重输入
document.addEventListener('change', function(event){
var t = event.target;
if (t && t.name === 'yoone_snow_mixed_items[]'){
ensureShapeWeightInputs();
}
});
// 绑定移除按钮事件 使用事件委托处理动态元素
listContainer.addEventListener('click', function(event){
// 条件判断 如果点击的是移除按钮则执行删除
var target = event.target;
if (target && target.classList.contains('yoone-snow-remove-media')){
var item = target.closest('.yoone-snow-media-item');
if (item) {
var aidStr = item.getAttribute('data-attachment-id');
item.remove();
// 同步移除对应媒体权重输入
if (aidStr) { removeMediaWeightInput(aidStr); }
}
}
});
// 打开媒体选择器 支持多选 图片和 SVG
addButton.addEventListener('click', function(){
// 条件判断 如果 wp.media 不可用则终止
if (typeof wp === 'undefined' || !wp.media) { return; }
var frame = wp.media({
title: 'Select images or SVG',
multiple: true,
library: { type: [ 'image', 'image/svg+xml' ] }
});
frame.on('select', function(){
var selection = frame.state().get('selection');
selection.each(function(attachment){
var data = attachment.toJSON();
var id = data.id;
var url = data.sizes && data.sizes.thumbnail ? data.sizes.thumbnail.url : data.url;
// 创建预览项与隐藏输入 保存附件 ID
var wrapper = document.createElement('div');
wrapper.className = 'yoone-snow-media-item';
wrapper.setAttribute('data-attachment-id', String(id));
wrapper.style.border = '1px solid #ddd';
wrapper.style.padding = '8px';
wrapper.style.display = 'flex';
wrapper.style.flexDirection = 'column';
wrapper.style.alignItems = 'center';
var img = document.createElement('img');
img.src = url;
img.alt = 'media';
img.style.width = '72px';
img.style.height = '72px';
img.style.objectFit = 'contain';
var input = document.createElement('input');
input.type = 'hidden';
input.name = 'yoone_snow_media_items[]';
input.value = String(id);
var removeBtn = document.createElement('button');
removeBtn.type = 'button';
removeBtn.className = 'button yoone-snow-remove-media';
removeBtn.textContent = 'Remove';
removeBtn.style.marginTop = '6px';
wrapper.appendChild(img);
wrapper.appendChild(input);
wrapper.appendChild(removeBtn);
listContainer.appendChild(wrapper);
// 同步添加媒体权重输入 默认权重为 1
addMediaWeightInput(id);
});
});
frame.open();
});
}
// 条件判断 如果文档尚未加载则等待 DOMContentLoaded 事件
if (document.readyState === 'loading'){
document.addEventListener('DOMContentLoaded', initAdminMedia);
} else {
initAdminMedia();
}
})();