Goal
Set the Multi line text widget required (Plain / Markdown / Richtext)
Demo | Package Install | Github
Multi Line in Model
Set Required in CRX Manually
Content Fragment Editor Error
Solution
1) Login to CRXDE Lite, create folder (nt:folder) /apps/eaem-cfm-multi-line-text-required-validator
2) Create clientlib (type cq:ClientLibraryFolder) /apps/eaem-cfm-multi-line-text-required-validator and set a property categories of String type to dam.cfm.authoring.contenteditor.v2, dependencies of type String[] with value underscore
3) Create file ( type nt:file ) /apps/eaem-cfm-multi-line-text-required-validator/clientlib/js.txt, add the following
multiline-required.js
4) Create file ( type nt:file ) /apps/eaem-cfm-multi-line-text-required-validator/clientlib/multiline-required.js, add the following code
(function ($, $document) {
var CFM = window.Dam.CFM,
EAEM_INVISIBLE_CLASS = "eaem-text-invisible",
PLAIN_MARKDOWN_SELECTOR = "textarea.plaintext-editor, textarea.markdown-editor",
registry = $(window).adaptTo("foundation-registry");
//for plain text, markdown
registry.register("foundation.validation.validator", {
selector: PLAIN_MARKDOWN_SELECTOR,
validate: validator
});
//for richtext
registry.register("foundation.validation.validator", {
selector: "." + EAEM_INVISIBLE_CLASS,
validate: validator,
show: function (invisibleText, message) {
$(invisibleText).prevAll("[data-cfm-richtext-editable]").css("border-color", "#e14132");
},
clear: function (invisibleText) {
$(invisibleText).prevAll("[data-cfm-richtext-editable]").css("border-color", "#d0d0d0");
}
});
CFM.Core.registerReadyHandler(registerRTEValidator);
function registerRTEValidator(){
var $cfmMultiEditor = $(".cfm-multieditor");
if ($cfmMultiEditor.find(".coral-Form-field").attr("aria-required") !== "true") {
return;
}
var $multiLineLabel = $cfmMultiEditor.find(".cfm-multieditor-embedded-label");
$multiLineLabel.html($multiLineLabel.html() + " *");
var $rte = $("textarea.rte-sourceEditor");
if(!_.isEmpty($rte)){
//coral validation framework ignores hidden and contenteditable fields, so add an invisible text field
//the text field is just for registering a validator
var $eaemCopyField = $("<input type=text style='display:none' class='" + EAEM_INVISIBLE_CLASS + "'/>")
.insertAfter($rte);
var $rteEditable = $rte.prev("[data-cfm-richtext-editable]");
$eaemCopyField.val($rteEditable.text().trim());
checkValidity.call($eaemCopyField[0]);
$rte.prev("[data-cfm-richtext-editable]").on("input", function() {
$eaemCopyField.val($(this).text().trim());
checkValidity.call($eaemCopyField[0]);
});
}else{
//$(PLAIN_MARKDOWN_SELECTOR).each(checkValidity);
}
}
function checkValidity() {
var foundationValidation = $(this).adaptTo("foundation-validation");
foundationValidation.checkValidity();
foundationValidation.updateUI();
}
function validator(element){
var $element = $(element),
$cfmMultiLineField = $element.closest(".cfm-multieditor").find(".coral-Form-field");
if ($cfmMultiLineField.attr("aria-required") !== "true") {
return;
}
if (!_.isEmpty($element.val())) {
return;
}
return Granite.I18n.get("Please fill out this field.");
}
}(jQuery, jQuery(document)));



Hey Sreekanth, Could you please help with - how can i use multiline editor data type as a multifield? Currently that option is not available as default with CF model.
ReplyDeleteIs there any input on questions above?
ReplyDeleteHey everyone, I am also not getting the red tool tip with the message. But with multiple multi-line text fields, I made some changes and this is what you need to have for your method registerRTEValidator():
ReplyDeletefunction registerRTEValidator() {
var $cfmMultiEditor = $(".cfm-multieditor");
if ($cfmMultiEditor.length > 0) {
$cfmMultiEditor.each(function() {
if ($(this).find(".coral-Form-field").attr("aria-required") !== "true") {
return;
}
let $multiLineEmbeddedLabel = $(this).find(".cfm-multieditor-embedded-label");
let $multiLineTopLabel = $(this).find(".cfm-multieditor-top-label");
$multiLineEmbeddedLabel.html($multiLineEmbeddedLabel.html() + " *");
$multiLineTopLabel.html($multiLineTopLabel.html() + " *");
let $rte = $(this).find("textarea.rte-sourceEditor");
if (!_.isEmpty($rte)) {
//coral validation framework ignores hidden and contenteditable fields, so add an invisible text field
//the text field is just for registering a validator
let $eaemCopyField = $("<_input_ type=text style='display:none' class='" + EAEM_INVISIBLE_CLASS + "'/>")
.insertAfter($rte);
let $rteEditable = $rte.prev("[data-cfm-richtext-editable]");
$eaemCopyField.val($rteEditable.text().trim());
checkValidity.call($eaemCopyField[0]);
$rte.prev("[data-cfm-richtext-editable]").on("input", function () {
$eaemCopyField.val($(this).text().trim());
checkValidity.call($eaemCopyField[0]);
});
} else {
//$(PLAIN_MARKDOWN_SELECTOR).each(checkValidity);
}
});
}
}
it won't allow me to add the input element's HTML markup as it was, so just remove the underscores before and after the input tag name.