12345 |
- /*
- Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
- !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(){var t=this.editor,e=CKEDITOR.document.getWindow(),i=t.editable(),s=i.isInline()?i:i.getDocument();CKEDITOR.env.iOS&&!i.isInline()&&(s=t.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(this.model.on("change-isActive",this.updateAriaAttributesOnEditable,this)),this._listeners.push(e.on("scroll",function(){this.viewRepositionListener()},this)),this._listeners.push(s.on("scroll",function(){this.viewRepositionListener()},this)),this._listeners.push(this.view.element.on("mousedown",function(t){t.data.preventDefault()},null,null,9999)),i&&(this.registerPanelNavigation(),this.addAriaAttributesToEditable()),t.on("contentDom",function(){this.registerPanelNavigation(),this.addAriaAttributesToEditable()},this)},registerPanelNavigation:function(){var t=this.editor.editable();this._listeners.push(t.attachListener(t,"keydown",function(t){this.onKeyDown(t)},this,null,5))},addAriaAttributesToEditable:function(){var t=this.editor.editable(),e=this.view.element.getAttribute("id");t.isInline()&&(t.setAttribute("aria-controls",e),t.setAttribute("aria-activedescendant",""),t.setAttribute("aria-autocomplete","list"),t.setAttribute("aria-expanded","false"))},updateAriaAttributesOnEditable:function(t){var e=this.editor.editable();t=t.data,e&&e.isInline()&&(e.setAttribute("aria-expanded",t?"true":"false"),t||e.setAttribute("aria-activedescendant",""))},updateAriaActiveDescendantAttributeOnEditable:function(t){var e=this.editor.editable();e.isInline()&&e.setAttribute("aria-activedescendant",t)},removeAriaAttributesFromEditable:function(){var t=this.editor.editable();t&&t.isInline()&&(t.removeAttributes(["aria-controls","aria-expanded","aria-activedescendant"]),t.setAttribute("aria-autocomplete","none"))},close:function(){this.model.setActive(!1),this.view.close()},commit:function(t){if(this.model.isActive){if(this.close(),null==t&&(t=this.model.selectedItemId,null==t))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(),this.removeAriaAttributesFromEditable()},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){t=t.data;var e=this.view.getItemById(t);this.model.setItem(t),this.view.selectItem(t),this.updateAriaActiveDescendantAttributeOnEditable(e.getAttribute("id"))},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),e=CKEDITOR.tools.getNextId();return t.setAttribute("id",e),t.addClass("cke_autocomplete_panel"),t.setStyle("z-index",this.editor.config.baseFloatZIndex-3),t.setAttribute("role","listbox"),t},createItem:function(t){t=s(t),t=CKEDITOR.dom.element.createFromHtml(this.itemTemplate.output(t),this.document);var e=CKEDITOR.tools.getNextId();return t.setAttribute("id",e),t.setAttribute("role","option"),t},getViewPosition:function(t){t=t.getClientRects(),t=t[t.length-1];var e;e=this.editor.editable(),e=e.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=this.element.getWindow(),i=e.getViewPaneSize(),e=function(t){var e=t.editorViewportRect,i=t.caretRect,s=t.viewHeight,n=t.scrollPositionY,o=t.windowHeight;if(e.bottom<i.bottom)return Math.min(i.top,e.bottom)-s;t=i.top-e.top;var a=e.bottom-i.bottom,l=i.top-s<n;return s>a&&t>s&&!l?i.top-s:e.top>i.top?Math.max(i.bottom,e.top):(n=i.bottom+s>o+n,s>a&&t>s||!n?Math.min(e.bottom,i.bottom):i.top-s)}({editorViewportRect:function(t){var e=t.editable();return CKEDITOR.env.iOS&&!e.isInline()?t.window.getFrame().getParent().getClientRect(!0):e.isInline()?e.getClientRect(!0):t.window.getFrame().getClientRect(!0)}(this.editor),caretRect:t,viewHeight:this.element.getSize("height"),scrollPositionY:e.getScrollPosition().y,windowHeight:i.height});t=function(t){var e=t.leftPosition,i=t.viewWidth;return t=t.windowWidth,e+i>t?t-i:e}({leftPosition:t.left,viewWidth:this.element.getSize("width"),windowWidth:i.width}),this.element.setStyles({left:t+"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;s>i;i++)if(e[i].id==t)return i;return-1},getItemById:function(t){return t=this.getIndexById(t),~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]}();
|