LLWiki正在建设中,欢迎加入我们

“MediaWiki:Gadget-SettingsDialog.js”的版本间差异

跳转到导航 跳转到搜索
(暂时移除添加表单的部分)
* saveOptions:将设置保存到localStorage
* clearOptions:还原设置
* @Dependencies: mediawiki.util, mediawiki.storage, oojs, oojs-ui-corewindows, oojs-ui-windowswidgets, ext.gadget.site-lib, user
* @Author: [[User:Bhsd]]
*/
const dialog = this;
if (action == 'save') {
mw.notify(mw.msg( 'gadget-sd-notify' ), {type: 'success'});
this.gadgets.forEach(function(ele) { dialog.saveOptions(ele); });
mw.notify(mw.msg( 'gadget-sd-notify' ), {type: 'success'});
}
else { this.gadgets.forEach(function(ele) { dialog.clearOptions(ele); }); }
// 需要同时添加数据和HTML
SettingsDialog.prototype.addTab = function(params) {
const settingspanel = mwnew OO.ui.gadgets[TabPanelLayout( params.name ] ||, {label: params.label}, );
types = [
['checkboxes', 'CheckboxInputWidget', [], 'selected', []],
['radios', 'RadioSelectInputWidget', ['options'], 'value', ['multioptions-wrap']]
];
types.forEach(function(type) {
params[ type[0] ] = params[ type[0] ] || [];
params[ type[0] ].forEach(function(ele) {
const config = Object.fromEntries( type[2].map(function(e) { return [e, ele[e]]; }) );
type[2].forEach(function(e) { delete ele[e]; });
config[ type[3] ] = settings[ ele.data ] || ele.default;
ele.widget = new OO.ui[ type[1] ](config);
});
});
const panel = new OO.ui.TabPanelLayout( params.name, {label: params.label} ),
dialog = this;
panel.$element.append( $('<div>', {class: 'dialog-help', html: [mw.msg('gadget-sd-help')].concat(
params.help ? [mw.msg('gadget-sd-helppage'), $('<a>', {href: mw.util.getUrl(params.help), text: params.help}),
'。'] : []
)}) );
panel.$element.append( types.map(function(type) {
return params[ type[0] ].map(function(ele) {
return new OO.ui.FieldLayout(ele.widget, {label: ele.label, align: 'inline', help: ele.help,
helpinline: true, classes: type[4]}).$element;
});
}).flat() );
$('<div>', {class: 'panel-btns', html: [
new OO.ui.ButtonWidget({label: mw.msg('gadget-sd-back'), flags: 'destructive'}).on('click', function() {
dialog.clearOptions( params.name );
}), new OO.ui.ButtonWidget({label: mw.msg('gadget-sd-save'), flags: 'progressive'}).on('click', function() {
dialog.saveOptions( params.name );
})].map(function(ele) { return ele.$element; })}).appendTo( panel.$element );
this.gadgets.push( params );
this.content.addTabPanels( [panel] );
};
SettingsDialog.prototype.clearOptions = function(arg) {
const namegadget = this.getNamegetObject(arg),;
gadget = this.getObject(arg),
settings = mw.gadgets[ name ] || {};
if (!gadget) {
console.warn( '无法还原不存在的小工具设置!' );
return;
}
(gadget.clearOptions || function() {})();
// 下面的循环使用容易扩展的写法
$.each({checkboxes: 'setSelected', radios: 'setValue'}, function(key, val) {
gadget[key].forEach(function(ele) { ele.widget[val]( settings[ ele.data ] || ele.default ); });
});
};
SettingsDialog.prototype.saveOptions = function(arg) {
const namegadget = this.getNamegetObject(arg),;
gadget = this.getObject(arg);
if (!gadget) {
console.warn( '无法保存不存在的小工具设置!' );
return;
}
(gadget.saveOptions || function() {})();
// 尽量采用容易扩展的写法
const entries = [['checkboxes', 'isSelected'], ['radios', 'getValue']].map(function(ele) {
return gadget[ ele[0] ].map(function(e) { return [e.data, e.widget[ ele[1] ]()]; });
}).flat(),
settings = Object.fromEntries( entries );
mw.gadgets[ name ] = settings;
mw.storage.setObject('gadget-' + name, settings);
mw.hook( 'settings.update' ).fire( name ); // 视情况根据新设置更新小工具,有些设置可能需要刷新页面才会生效
};
SettingsDialog.static = {name: 'settingsDialog', tagName: 'div', title: mw.msg('gadget-sd-title'),
mw.hook( 'mobile.menu' ).add(function($menu) {
console.log('Hook: mobile.menu, 开始添加小工具设置按钮');
$('<li>').appendTo( $menu.find('ul:not(.hlist)').last() ).append( $mw.addMobileLinks({icon: '<a>user-cog', {idmsg: 'cagadget-settingsDialogsd-title',}) );
html: [$('<i>', {class: 'fa fa-user-cog'}), $('<span>', {text: mw.msg('gadget-sd-title')})]
}) );
});
} else {
mw.msg('gadget-sd-tooltip'));
}
$('document.body').on('click', '#ca-settingsDialog', function(e) {
e.preventDefault();
mw.settingsDialog.open();