plugin.js 8.55 KB
Newer Older
Julien Jorry committed
1
!function(){function t(t,e){var i=t.config.autocomplete_commitKeystrokes||CKEDITOR.config.autocomplete_commitKeystrokes;this.editor=t,this.throttle=void 0!==e.throttle?e.throttle:20,this.view=this.getView(),this.model=this.getModel(e.dataCallback),this.model.itemsLimit=e.itemsLimit,this.textWatcher=this.getTextWatcher(e.textTestCallback),this.commitKeystrokes=CKEDITOR.tools.array.isArray(i)?i.slice():[i],this._listeners=[],this.outputTemplate=void 0!==e.outputTemplate?new CKEDITOR.template(e.outputTemplate):null,e.itemTemplate&&(this.view.itemTemplate=new CKEDITOR.template(e.itemTemplate)),"ready"===this.editor.status?this.attach():this.editor.on("instanceReady",(function(){this.attach()}),this),t.on("destroy",(function(){this.destroy()}),this)}function e(t){this.itemTemplate=new CKEDITOR.template('<li data-id="{id}">{name}</li>'),this.editor=t}function i(t){this.dataCallback=t,this.isActive=!1,this.itemsLimit=0}function s(t){return CKEDITOR.tools.array.reduce(CKEDITOR.tools.object.keys(t),(function(e,i){return e[i]=CKEDITOR.tools.htmlEncode(t[i]),e}),{})}CKEDITOR.plugins.add("autocomplete",{requires:"textwatcher",onLoad:function(){CKEDITOR.document.appendStyleSheet(this.path+"skins/default.css")},isSupportedEnvironment:function(){return!CKEDITOR.env.ie||8<CKEDITOR.env.version}}),t.prototype={attach:function(){function t(){this._listeners.push(s.on("keydown",(function(t){this.onKeyDown(t)}),this,null,5))}var e=this.editor,i=CKEDITOR.document.getWindow(),s=e.editable(),n=s.isInline()?s:s.getDocument();CKEDITOR.env.iOS&&!s.isInline()&&(n=e.window.getFrame().getParent()),this.view.append(),this.view.attach(),this.textWatcher.attach(),this._listeners.push(this.textWatcher.on("matched",this.onTextMatched,this)),this._listeners.push(this.textWatcher.on("unmatched",this.onTextUnmatched,this)),this._listeners.push(this.model.on("change-data",this.modelChangeListener,this)),this._listeners.push(this.model.on("change-selectedItemId",this.onSelectedItemId,this)),this._listeners.push(this.view.on("change-selectedItemId",this.onSelectedItemId,this)),this._listeners.push(this.view.on("click-item",this.onItemClick,this)),this._listeners.push(i.on("scroll",(function(){this.viewRepositionListener()}),this)),this._listeners.push(n.on("scroll",(function(){this.viewRepositionListener()}),this)),this._listeners.push(e.on("contentDom",t,this)),this._listeners.push(e.on("change",(function(){this.viewRepositionListener()}),this)),this._listeners.push(this.view.element.on("mousedown",(function(t){t.data.preventDefault()}),null,null,9999)),s&&t.call(this)},close:function(){this.model.setActive(!1),this.view.close()},commit:function(t){if(this.model.isActive){if(this.close(),null==t&&null==(t=this.model.selectedItemId))return;t=this.model.getItemById(t);var e=this.editor;e.fire("saveSnapshot"),e.getSelection().selectRanges([this.model.range]),e.insertHtml(this.getHtmlToInsert(t),"text"),e.fire("saveSnapshot")}},destroy:function(){CKEDITOR.tools.array.forEach(this._listeners,(function(t){t.removeListener()})),this._listeners=[],this.view.element&&this.view.element.remove()},getHtmlToInsert:function(t){return t=s(t),this.outputTemplate?this.outputTemplate.output(t):t.name},getModel:function(t){var e=this;return new i((function(i,s){return t.call(this,CKEDITOR.tools.extend({autocomplete:e},i),s)}))},getTextWatcher:function(t){return new CKEDITOR.plugins.textWatcher(this.editor,t,this.throttle)},getView:function(){return new e(this.editor)},open:function(){this.model.hasData()&&(this.model.setActive(!0),this.view.open(),this.model.selectFirst(),this.view.updatePosition(this.model.range))},viewRepositionListener:function(){this.model.isActive&&this.view.updatePosition(this.model.range)},modelChangeListener:function(t){this.model.hasData()?(this.view.updateItems(t.data),this.open()):this.close()},onItemClick:function(t){this.commit(t.data)},onKeyDown:function(t){if(this.model.isActive){var e=t.data.getKey(),i=!1;27==e?(this.close(),this.textWatcher.unmatch(),i=!0):40==e?(this.model.selectNext(),i=!0):38==e?(this.model.selectPrevious(),i=!0):-1!=CKEDITOR.tools.indexOf(this.commitKeystrokes,e)&&(this.commit(),this.textWatcher.unmatch(),i=!0),i&&(t.cancel(),t.data.preventDefault(),this.textWatcher.consumeNext())}},onSelectedItemId:function(t){this.model.setItem(t.data),this.view.selectItem(t.data)},onTextMatched:function(t){this.model.setActive(!1),this.model.setQuery(t.data.text,t.data.range)},onTextUnmatched:function(){this.model.query=null,this.model.lastRequestId=null,this.close()}},e.prototype={append:function(){this.document=CKEDITOR.document,this.element=this.createElement(),this.document.getBody().append(this.element)},appendItems:function(t){this.element.setHtml(""),this.element.append(t)},attach:function(){this.element.on("click",(function(t){(t=t.data.getTarget().getAscendant(this.isItemElement,!0))&&this.fire("click-item",t.data("id"))}),this),this.element.on("mouseover",(function(t){t=t.data.getTarget(),this.element.contains(t)&&(t=t.getAscendant((function(t){return t.hasAttribute("data-id")}),!0))&&(t=t.data("id"),this.fire("change-selectedItemId",t))}),this)},close:function(){this.element.removeClass("cke_autocomplete_opened")},createElement:function(){var t=new CKEDITOR.dom.element("ul",this.document);return t.addClass("cke_autocomplete_panel"),t.setStyle("z-index",this.editor.config.baseFloatZIndex-3),t},createItem:function(t){return t=s(t),CKEDITOR.dom.element.createFromHtml(this.itemTemplate.output(t),this.document)},getViewPosition:function(t){var e;t=(t=t.getClientRects())[t.length-1],e=(e=this.editor.editable()).isInline()?CKEDITOR.document.getWindow().getScrollPosition():e.getParent().getDocumentPosition(CKEDITOR.document);var i=CKEDITOR.document.getBody();return"static"===i.getComputedStyle("position")&&(i=i.getParent()),i=i.getDocumentPosition(),e.x-=i.x,e.y-=i.y,{top:t.top+e.y,bottom:t.top+t.height+e.y,left:t.left+e.x}},getItemById:function(t){return this.element.findOne('li[data-id="'+t+'"]')},isItemElement:function(t){return t.type==CKEDITOR.NODE_ELEMENT&&Boolean(t.data("id"))},open:function(){this.element.addClass("cke_autocomplete_opened")},selectItem:function(t){null!=this.selectedItemId&&this.getItemById(this.selectedItemId).removeClass("cke_autocomplete_selected");var e=this.getItemById(t);e.addClass("cke_autocomplete_selected"),this.selectedItemId=t,this.scrollElementTo(e)},setPosition:function(t){var e,i=this.editor,s=this.element.getSize("height"),n=i.editable(),o=(i=CKEDITOR.env.iOS&&!n.isInline()?i.window.getFrame().getParent().getClientRect(!0):n.isInline()?n.getClientRect(!0):i.window.getFrame().getClientRect(!0),n=t.top-i.top,i.bottom-t.bottom);e=t.top<i.top?i.top:Math.min(i.bottom,t.bottom),s>o&&s<n&&(e=t.top-s),i.bottom<t.bottom&&(e=Math.min(t.top-s,i.bottom-s)),i.top>t.top&&(e=Math.max(t.bottom,i.top)),this.element.setStyles({left:t.left+"px",top:e+"px"})},scrollElementTo:function(t){t.scrollIntoParent(this.element)},updateItems:function(t){var e,i=new CKEDITOR.dom.documentFragment(this.document);for(e=0;e<t.length;++e)i.append(this.createItem(t[e]));this.appendItems(i),this.selectedItemId=null},updatePosition:function(t){this.setPosition(this.getViewPosition(t))}},CKEDITOR.event.implementOn(e.prototype),i.prototype={getIndexById:function(t){if(!this.hasData())return-1;for(var e=this.data,i=0,s=e.length;i<s;i++)if(e[i].id==t)return i;return-1},getItemById:function(t){return~(t=this.getIndexById(t))&&this.data[t]||null},hasData:function(){return Boolean(this.data&&this.data.length)},setItem:function(t){if(0>this.getIndexById(t))throw Error("Item with given id does not exist");this.selectedItemId=t},select:function(t){this.fire("change-selectedItemId",t)},selectFirst:function(){this.hasData()&&this.select(this.data[0].id)},selectLast:function(){this.hasData()&&this.select(this.data[this.data.length-1].id)},selectNext:function(){if(null==this.selectedItemId)this.selectFirst();else{var t=this.getIndexById(this.selectedItemId);0>t||t+1==this.data.length?this.selectFirst():this.select(this.data[t+1].id)}},selectPrevious:function(){if(null==this.selectedItemId)this.selectLast();else{var t=this.getIndexById(this.selectedItemId);0>=t?this.selectLast():this.select(this.data[t-1].id)}},setActive:function(t){this.isActive=t,this.fire("change-isActive",t)},setQuery:function(t,e){var i=this,s=CKEDITOR.tools.getNextId();this.lastRequestId=s,this.query=t,this.range=e,this.selectedItemId=this.data=null,this.dataCallback({query:t,range:e},(function(t){s==i.lastRequestId&&(i.data=i.itemsLimit?t.slice(0,i.itemsLimit):t,i.fire("change-data",i.data))}))}},CKEDITOR.event.implementOn(i.prototype),CKEDITOR.plugins.autocomplete=t,t.view=e,t.model=i,CKEDITOR.config.autocomplete_commitKeystrokes=[9,13]}();