Goal
Extend the Link Dialog of Touch UI Rich Text Editor to add Coral Select widget for selecting rel attribute of anchor tag
For AEM 63 check this post
Demo | Package Install | GitHub
rel Attribute select in Link Dialog
Solution
1) Login to CRXDE Lite, create folder (nt:folder) /apps/eaem-touchui-extend-rte-link-options
2) Create clientlib (type cq:ClientLibraryFolder) /apps/eaem-touchui-extend-rte-link-options/clientlib and set property categories of String type to cq.authoring.dialog and dependencies String[] to underscore
3) Create file ( type nt:file ) /apps/eaem-touchui-extend-rte-link-options/clientlib/js.txt, add the following
link-options.js
4) Create file (type nt:file) /apps/eaem-touchui-extend-rte-link-options/clientlib/link-options.js, add the following code
(function ($) { "use strict"; var _ = window._, Class = window.Class, CUI = window.CUI, REL_FIELD = "rel", RTE_LINK_DIALOG = "rtelinkdialog"; if(CUI.rte.ui.cui.CuiDialogHelper.eaemExtended){ return; } var EAEMLinkBaseDialog = new Class({ extend: CUI.rte.ui.cui.LinkBaseDialog, toString: "EAEMLinkBaseDialog", initialize: function(config) { this.superClass.initialize.call(this, config); this.$rteDialog = this.$container.find("[data-rte-dialog=link]"); this.$rteDialog.find(".coral-Popover-content").append(getLinkRelOptionsHtml()); }, dlgToModel: function() { this.superClass.dlgToModel.call(this); var relField = this.getFieldByType(REL_FIELD); if(_.isEmpty(relField)){ return; } var relVal = relField.val(); if (_.isEmpty(relVal)) { return; } this.objToEdit.attributes["rel"] = relVal; } }); CUI.rte.ui.cui.CuiDialogHelper = new Class({ extend: CUI.rte.ui.cui.CuiDialogHelper, toString: "EAEMCuiDialogHelper", instantiateDialog: function(dialogConfig) { var type = dialogConfig.type; if(type !== RTE_LINK_DIALOG){ this.superClass.instantiateDialog.call(this, dialogConfig); return; } var $editable = $(this.editorKernel.getEditContext().root), $container = CUI.rte.UIUtils.getUIContainer($editable), dialog = new EAEMLinkBaseDialog(); dialog.attach(dialogConfig, $container, this.editorKernel); return dialog; } }); function getLinkRelOptionsHtml(){ var html = "<div class='coral-RichText-dialog-columnContainer'>" + "<div class='coral-RichText-dialog-column'>" + "<coral-select data-type='rel' placeholder='Choose \"rel\" attribute'>"; var options = ["alternate", "author", "bookmark", "external", "help", "license", "next", "nofollow", "noreferrer", "noopener", "prev", "search", "tag" ]; _.each(options, function(option){ html = html + getOptionHtml(option); }); html = html + "</coral-select></div></div>"; return html; function getOptionHtml(option){ return "<coral-select-item>" + option + "</coral-select-item>" } } CUI.rte.ui.cui.CuiDialogHelper.eaemExtended = true; })(jQuery);
Hi Sreekanth, I am not able to retrieve saved value from rel/any custom attribute using dlgFromModel. If I am using
ReplyDeletedlgFromModel: function() {
this.superClass.dlgFromModel.call(this);
alert(this.objToEdit.attributes["rel"]);
}
The alert does not return previously stored value. Please help.
hi Anupam - make sure the attribute is added in antisamy check this post http://experience-aem.blogspot.com/2017/09/aem-63-touch-ui-extend-rich-text-link-dialog-add-rel-select.html
DeleteSreekanth, any chance you could provide insights on extending the "Target" options list to include a new "Overlay" option that we would use to utilize a modal Overlay "colorbox" implementation?
ReplyDeleteIE: We would like to add "Overlay" as an option to this existing drop down:
li class="coral-SelectList-item coral-SelectList-item--option is-highlighted" data-value="" aria-selected="true" role="option" id="coral-92" tabindex="0">Target
li class="coral-SelectList-item coral-SelectList-item--option" data-value="_self" aria-selected="false" role="option" id="coral-93">Same Tab
li class="coral-SelectList-item coral-SelectList-item--option" data-value="_blank" aria-selected="false" role="option" id="coral-94">New Tab
li class="coral-SelectList-item coral-SelectList-item--option" data-value="_parent" aria-selected="false" role="option" id="coral-95">Parent Frame
li class="coral-SelectList-item coral-SelectList-item--option" data-value="_top" aria-selected="false" role="option" id="coral-96">Top Frame