imported>Hsl0 |
imported>Hsl0 |
(같은 사용자의 중간 판 8개는 보이지 않습니다) |
1번째 줄: |
1번째 줄: |
| /** | | /** |
| * 0. 모든 패키지가 로딩되고 DOM이 준비될때까지 기다립니다. 오류 여부는 상관없습니다. | | * @requires oojs-ui-widgets |
| * 1. renderer: DOM 요소를 만들거나 수정합니다.
| | * @requires ext.gadget.Tasker |
| * 2. handler: 이벤트를 예약합니다.
| |
| * 3. trigger: 본격적으로 작업을 수행합니다. | |
| **/ | | **/ |
| var TASKS = Symbol('tasks_queue');
| | registerRenderer(function createPopupButton() { |
| var WAITING = Symbol('waiting_queue');
| | $('.popuplink').each(function() { |
| | | var $header = $(this).find('.popuplink-header'); |
| function Tasker() { | | var widget = new OO.ui.PopupButtonWidget({ |
| this[TASKS] = new Set();
| | label: $(this).find('.popuplink-label'), |
| this[WAITING] = new Set();
| | framed: false, |
| }
| | popup: { |
| Tasker.prototype.push = function push() {
| | head: $header.length || !('autoclose' in this.dataset), |
| var tasker = this;
| | padded: true, |
| var items = arguments;
| | autoClose: 'autoclose' in this.dataset, |
| if(typeof items[0][Symbol.iterator] === 'function') items = items[0];
| | label: $header, |
| else items = Array.from(items);
| | $content: $(this).find('.popuplink-content') |
| items.forEach(function(item) {
| | } |
| if(typeof item === 'function') tasker[TASKS].add(item);
| | }); |
| else tasker[WAITING].add(item);
| | $(this).html(widget.$element); |
| });
| | }); |
| return this;
| |
| };
| |
| Tasker.prototype.wait = function wait() {
| |
| var tasker = this;
| |
| return new Promise(function(resolve) {
| |
| function capture(queue) {
| |
| var arr = Array.from(queue);
| |
| queue.clear();
| |
| return arr;
| |
| }
| |
| | |
| Promise.all(capture(tasker[WAITING])).then(function handle() {
| |
| var captured = capture(tasker[WAITING]);
| |
| if(captured.length) return Promise.all(captured).then(handle);
| |
| else resolve();
| |
| });
| |
| });
| |
| };
| |
| Tasker.prototype.run = function run() {
| |
| var tasker = this;
| |
| this[TASKS].forEach(function(task) {
| |
| tasker[WAITING].add(task());
| |
| });
| |
| return this;
| |
| };
| |
| window.Tasker = Tasker;
| |
| | |
| var taskers = {
| |
| renderer: new Tasker(),
| |
| handler: new Tasker(),
| |
| trigger: new Tasker()
| |
| };
| |
| function runTask() {
| |
| var tasker = this;
| |
| this[TASKS].forEach(function(task) {
| |
| if(typeof task === 'string') tasker[WAITING].add(mw.loader.using(task));
| |
| else tasker[WAITING].add(task());
| |
| });
| |
| return this;
| |
| }
| |
| taskers.renderer.push = function() {
| |
| Tasker.prototype.push.apply(this, arguments);
| |
| if(documentReady && modulesReady) this.run();
| |
| return this;
| |
| };
| |
| taskers.handler.push = function() {
| |
| Tasker.prototype.push.apply(this, arguments);
| |
| if(rendererDone) this.run();
| |
| return this;
| |
| };
| |
| taskers.trigger.push = function() {
| |
| Tasker.prototype.push.apply(this, arguments);
| |
| if(hendlerDone) this.run();
| |
| return this;
| |
| };
| |
| taskers.renderer.run = runTask;
| |
| taskers.handler.run = runTask;
| |
| taskers.trigger.run = runTask;
| |
| | |
| var documentReady = false;
| |
| var modulesReady = false;
| |
| var rendererDone = false;
| |
| var handlerDone = false;
| |
| | |
| window.registerRenderer = function registerRenderer() {
| |
| var renderers = arguments;
| |
| if(typeof renderers[0][Symbol.iterator] === 'function') renderers = renderers[0];
| |
| taskers.renderer.push(arguments);
| |
| }; | |
| window.registerHandler = function registerHandler() {
| |
| var handlers = arguments;
| |
| if(typeof handlers[0][Symbol.iterator] === 'function') handlers = handlers[0];
| |
| taskers.handler.push(arguments);
| |
| }; | |
| window.registerTrigger = function registerTrigger() {
| |
| var triggers = arguments;
| |
| if(typeof triggers[0][Symbol.iterator] === 'function') triggers = triggers[0];
| |
| taskers.trigger.push(arguments);
| |
| };
| |
| | |
| $(function() { | |
| documentReady = true;
| |
| mw.loader.using(RLPAGEMODULES).always(function() {
| |
| modulesReady = true;
| |
| return taskers.renderer.run().wait();
| |
| }).always(function() {
| |
| rendererDone = true;
| |
| return taskers.handler.run().wait();
| |
| }).always(function() {
| |
| handlerDone = true;
| |
| taskers.trigger.run();
| |
| });
| |
| }); | | }); |