16,874
个编辑
LLWiki正在建设中,欢迎加入我们!
小 (// 使用Wikiplus小工具快速编辑) 标签:移动版网页编辑 移动版编辑 |
(// 使用Wikiplus小工具快速编辑) 标签:移动版网页编辑 移动版编辑 |
||
(未显示同一用户的13个中间版本) | |||
/**
* @Function: 定义小工具设置对话框
* @Methods:
* getObject: 获取小工具对象
* getPanel: 获取小工具标签页
* addTab: 添加小工具
* generateOptions: 生成设置对象
"use strict";
/* global OO, hljs, wgULS */
mw.gadgets = mw.gadgets || {};
// 1. 设置繁简文字信息
mw.messages.set( wgULS({
'gadget-sd-
'gadget-sd-help': '您可以在这里修改小工具偏好,修改仅对当前浏览器有效。如果想要修改设置对所有浏览器生效,请查阅',
'gadget-sd-helptext': '帮助页面', 'gadget-sd-
'gadget-sd-
}, {
'gadget-sd-
'gadget-sd-help': '您可以在這裡修改小工具偏好,修改僅對當前瀏覽器有效。如果想要修改設定對所有瀏覽器生效,請查閱',
'gadget-sd-helptext': '說明頁面', 'gadget-sd-
'gadget-sd-
}) );
// 2. 准备HTML元素
var ready = false, dialog; // 是否是第一次打开对话框
const isUser = mw.config.get( 'wgUserGroups' ).includes( 'user' ),
gadgets = mw.gadgets,
$helpPage = $('<a>', {target: '_blank', text: mw.msg('gadget-sd-helptext')}), // 需要动态设置href
$help = $('<div>', {html: [ mw.msg('gadget-sd-help'), $helpPage, ',或',
$('<a>', {href: '#settingsDialog-btns', text: mw.msg('gadget-sd-exporthelp')}), '。' // 链接跳转到“导出”按钮
]}),
$
$code = $('<div>', {id: 'settingsDialog-code', html: [ mw.msg('gadget-sd-copy'),
$('<a>', {href: '/zh/special:mypage/common.js', target: '_blank', text: mw.msg('gadget-sd-js')}),
':', $block
]}),
$btns = $('<div>', {id: 'settingsDialog-btns', html: [
new OO.ui.ButtonWidget({label: mw.msg('gadget-sd-back'), flags: 'destructive'})
.on('click', function()
new OO.ui.ButtonWidget({label: mw.msg('gadget-sd-export'), flags: 'progressive', disabled: !isUser})
.on('click', function() {
const $panel = $btns.parent();
$block.text( dialog.export() );
if (window.hljs) { hljs.highlightBlock( $block[0] ); }
$code.show();
$panel.animate({scrollTop: $panel.prop( 'scrollHeight' )}, 'slow');
}).$element, $code
]}),
// 3. 准备私有工具函数
buildWidget = function(obj, settings) { // 生成单个OOUI widget
obj.widget = new OO.ui[obj.type + 'InputWidget']( $.extend({value: (settings || {})[ obj.key ]}, obj.config) );
const layout = new OO.ui.FieldLayout(obj.widget, {label: mw.msg( obj.label ), help: obj.help});
deleteKeys(['config', 'label', 'help']
return layout;
},
clearWidgets = function(arr, settings) { // 还原一组OOUI widget
(arr || []).forEach(function(ele) { ele.widget.setValue( settings ? settings[ele.key] || '' : '' ); });
},
getValues = function(arr) { // 获取一组OOUI widget的值
return Object.fromEntries( (arr || []).map(function(ele) {
return [ele.key, !ele.widget.isDisabled() && ele.widget.getValue()];
}).filter(function(ele) { return ele[1]; }) );
},
buildForm = function(params, $element) {
if (!params.ready) { // 生成表单,只需要执行一次,不用写成SettingsDialog的内置方法
const settings = gadgets[ params.name ];
$element.append( (params.
$element.append( (params.fields || []).map(function(ele) {
const field = new OO.ui.FieldsetLayout({ label: mw.msg( ele.label ), help: ele.help, helpInline: true,
}) );
params.ready = true;
mw.hook( 'settings.dialog' ).fire( params ); // 生成一个Hook
}
// 切换标签时添加帮助和按钮,不用写成SettingsDialog的内置方法
$helpPage.attr('href', mw.util.getUrl( 'Help:小工具/' + params.help ));
$element.prepend( $help ).append( $btns );
$code.hide();
openDialog = function(e) {
e.preventDefault();
$(document.body).removeClass( 'navigation-enabled primary-navigation-enabled' );
dialog.open().opening.then(function() { buildForm(dialog.getObject(), dialog.getPanel().$element); });
};
// 4. 定义SettingsDialog类
function SettingsDialog() { // constructor只添加一个id,剩下的交给addTab方法逐一添加小工具
SettingsDialog.super.call(this, {id: 'settingsDialog'});
};
SettingsDialog.prototype.getActionProcess = function(action) {
const dialog = this, // ES5不允许箭头函数,无法直接使用this关键字
if (action == 'save') {
else {
this.close();
return new OO.ui.Process();
// 添加按钮,注意手机版的执行时机
if (mw.config.get('skin') == 'minerva') {
$(mw.addMobileLinks( {icon: 'user-cog', msg: 'gadget-sd-title'} )).click( openDialog )
.appendTo( $('#mw-mf-page-left').find('ul:not(.hlist)').last() );
}
else { $( mw.util.addPortletLink('p-cactions', '#', mw.msg('gadget-sd-title')) ).click( openDialog ); }
ready = true;
};
/**
* @Description: 获取小工具名称
* @Param {
* @Return {String} 小工具名称
*/
SettingsDialog.prototype.getName = function(arg) {
return arg ? arg.name || arg : this.content.getCurrentTabPanelName();
};
/**
* @Description: 获取小工具数据
* @Param {String} 小工具名称(可选),默认为当前小工具
* @Return {Object} 小工具数据
*/
SettingsDialog.prototype.getObject = function(arg) {
if (typeof arg == '
};
/**
* @Description: 获取小工具标签页
* @Param {String} 小工具名称(可选),默认为当前小工具
* @Param {Object} 小工具数据(可选),默认为当前小工具
* @Return {OO.ui.TabPanelLayout} 小工具标签页
*/
SettingsDialog.prototype.getPanel = function(arg) {
return arg ? this.content.getTabPanel( arg.name || arg ) : this.content.getCurrentTabPanel();
};
/**
* @Description: 生成设置对象
* @Param {String} 小工具名称(可选),默认为当前小工具
* @Param {
* @Param {
* @Return {Object} 小工具設置
*/
SettingsDialog.prototype.generateOptions = function(arg, flag) {
const gadget = this.getObject(arg)
return $.extend( getValues( gadget.items ), Object.fromEntries( (gadget.fields || []).map(function(ele) {
const obj = getValues( ele.items );
}) ) );
};
/**
* @Description: 保存设置
* @Param {String} 小工具名称(可选),默认为当前小工具
* @Param {
*/
SettingsDialog.prototype.saveOptions = function(arg) {
const
gadgets[ name ] = settings
mw.storage.setObject('gadget-' + name, settings);
mw.notify(mw.msg( 'gadget-sd-notify' ), {type: 'success', tag: 'gadget-settings'});
/**
* @Description: 还原选项
* @Param {String} 小工具名称(可选),默认为当前小工具
* @Param {
*/
SettingsDialog.prototype.clearOptions = function(arg) {
const gadget = this.getObject(arg),
(gadget.
};
/**
* @Description: 导出JS格式的设置
* @Param {String} 小工具名称(可选),默认为当前小工具
* @Return {String} JS格式的设置
*/
SettingsDialog.prototype.export = function(
return 'mw.gadgets = $.extend(mw.gadgets, {' + name + ': ' +
};
SettingsDialog.static = {name: 'settingsDialog', tagName: 'div', title: mw.msg('gadget-sd-title'), escapable: true,
{action: 'cancel', label: mw.msg('ooui-dialog-message-reject'), flags: 'safe'}]
};
dialog = new SettingsDialog();
const manager = new OO.ui.WindowManager();
manager.$element.appendTo( document.body );
manager.addWindows( [
mw.settingsDialog = dialog; // 创造一个全局对象
//</nowiki>
// [[category:作为模块的小工具]] [[category:桌面版小工具]] [[category:手机版小工具]] [[category:系统工具]]
|