LLWiki正在建设中,欢迎加入我们!
MediaWiki:Gadget-SettingsDialog.js
跳转到导航
跳转到搜索
注意:在保存之后,您可能需要清除浏览器缓存才能看到所作出的变更的影响。
- Firefox或Safari:按住Shift的同时单击刷新,或按Ctrl-F5或Ctrl-R(Mac为⌘-R)
- Google Chrome:按Ctrl-Shift-R(Mac为⌘-Shift-R)
- Internet Explorer:按住Ctrl的同时单击刷新,或按Ctrl-F5
- Opera:前往菜单 → 设置(Mac为Opera → Preferences),然后隐私和安全 → 清除浏览数据 → 缓存的图片和文件。
//<nowiki> // 由ResourceLoader直接调用,不可使用ES6语法 /** * @Function: 定义小工具设置对话框 * @Methods: constructor:构建mw.SettingsDialog对象 * initialize:初始化html * getActionProcess:点击按钮时执行动作 * getIndex:获取小工具编号 * getName:获取小工具名称 * getObject:获取小工具对象 * addTab:添加小工具 * removeTab:移除小工具 * saveOptions:将设置保存到localStorage * clearOptions:还原设置 * @Dependencies: mediawiki.util, mediawiki.storage, oojs-ui-windows, oojs-ui-widgets, ext.gadget.site-lib, user * @Author: [[User:Bhsd]] */ "use strict"; /* global OO, wgULS */ //避免使用API加载消息,直接手动添加 mw.messages.set( wgULS({ 'gadget-sd-title': '小工具设置', 'gadget-sd-notify': '您的设置已保存!', 'gadget-sd-save': '保存', 'gadget-sd-cancel': '取消', 'gadget-sd-tooltip': '为当前浏览器设置小工具偏好', 'gadget-sd-help': '您可以在这里修改小工具偏好,修改仅对当前浏览器有效。', 'gadget-sd-back': '还原', 'gadget-sd-helppage': '如果想要修改设置对所有浏览器生效,请查阅' }, { 'gadget-sd-title': '小工具偏好設定', 'gadget-sd-notify': '您的偏好設定已儲存!', 'gadget-sd-save': '儲存', 'gadget-sd-cancel': '取消', 'gadget-sd-tooltip': '為當前瀏覽器設定小工具偏好', 'gadget-sd-help': '您可以在這裡修改小工具偏好,修改僅對當前瀏覽器有效。', 'gadget-sd-back': '復原', 'gadget-sd-helppage': '如果想要修改設定對所有瀏覽器生效,請查閱' }) ); // constructor只添加一个CSS类,剩下的交给addTab方法逐一添加小工具 function SettingsDialog() { SettingsDialog.super.call(this, {classes: ['settingsDialog']}); this.gadgets = []; } OO.inheritClass(SettingsDialog, OO.ui.ProcessDialog); // initialize只创建一个OO.ui.IndexLayout对象,剩下的交给addTab方法填入内容 SettingsDialog.prototype.initialize = function() { SettingsDialog.super.prototype.initialize.apply(this, arguments); this.content = new OO.ui.IndexLayout(); this.$body.append( this.content.$element ); }; SettingsDialog.prototype.getActionProcess = function(action) { const dialog = this; if (action == 'save') { 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); }); } this.close(); return new OO.ui.Process(); }; // 需要同时添加数据和HTML SettingsDialog.prototype.addTab = function(params) { const panel = new OO.ui.TabPanelLayout( params.name, {label: params.label} ); this.gadgets.push( params ); this.content.addTabPanels( [panel] ); }; SettingsDialog.prototype.getIndex = function(arg) { if (typeof arg == 'string') { return this.gadgets.findIndex(function(ele) { return ele.name == arg; }); } else if (typeof arg == 'number') { return arg; } else { return this.gadgets.indexOf( arg ); } }; SettingsDialog.prototype.getName = function(arg) { if (typeof arg == 'string') { return arg; } else if (typeof arg == 'number') { return this.gadgets[ arg ].name; } else { return arg.name; } }; SettingsDialog.prototype.getObject = function(arg) { if (typeof arg == 'string') { return this.gadgets.find(function(ele) { return ele.name == arg; }); } else if (typeof arg == 'number') { return this.gadgets[ arg ]; } else { return arg; } }; SettingsDialog.prototype.removeTab = function(arg) { const name = this.getName(arg), index = this.getIndex(arg); if (index == -1) { console.warn( '无法删除不存在的小工具设置!' ); return; } // 需要同时移除数据和对应的HTML元素 this.gadgets.splice(index, 1); this.content.removeTabPanels( this.content.getTabPanel( name ) ); }; SettingsDialog.prototype.clearOptions = function(arg) { const gadget = this.getObject(arg); if (!gadget) { console.warn( '无法还原不存在的小工具设置!' ); return; } (gadget.clearOptions || function() {})(); }; SettingsDialog.prototype.saveOptions = function(arg) { const gadget = this.getObject(arg); if (!gadget) { console.warn( '无法保存不存在的小工具设置!' ); return; } (gadget.saveOptions || function() {})(); }; SettingsDialog.static = {name: 'settingsDialog', tagName: 'div', title: mw.msg('gadget-sd-title'), actions: [{action: 'save', label: mw.msg('gadget-sd-save'), flags: ['primary', 'progressive']}, {action: 'cancel', label: mw.msg('gadget-sd-cancel'), flags: 'safe'}] }; mw.settingsDialog = new SettingsDialog(); if (!mw.windowManager) { mw.windowManager = mw.windowmanager || new OO.ui.WindowManager(); mw.windowManager.$element.appendTo( 'body' ); } mw.windowManager.addWindows( [mw.settingsDialog] ); // 此时已经初始化 // 添加按钮,注意手机版的执行时机 if (mw.config.get('skin') == 'minerva') { mw.hook( 'mobile.menu' ).add(function($menu) { console.log('Hook: mobile.menu, 开始添加小工具设置按钮'); mw.addMobileLinks([{icon: 'user-cog', msg: 'gadget-sd-title', attr: {id: 'ca-settingsDialog'}}]) .appendTo( $menu.find('ul:not(.hlist)').last() ); }); } else { mw.util.addPortletLink('p-cactions', '#', mw.msg('gadget-sd-title'), 'ca-settingsDialog', mw.msg('gadget-sd-tooltip')); } $(document.body).on('click', '#ca-settingsDialog', function(e) { e.preventDefault(); mw.settingsDialog.open(); }); //</nowiki> // [[category:作为模块的小工具]] [[category:桌面版小工具]] [[category:手机版小工具]] [[category:系统工具]] // {{DEFAULTSORT:SettingsDialog.js}}