Goal
Create a composite multifield configuration with radio buttons in multifield items
Demo | Package Install | Github
RadioGroup in Multifield
Dialog XML
<?xml version="1.0" encoding="UTF-8"?> <jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" jcr:primaryType="nt:unstructured" jcr:title="65 Composite Multi Field Radio" sling:resourceType="cq/gui/components/authoring/dialog"> <content jcr:primaryType="nt:unstructured" sling:resourceType="granite/ui/components/coral/foundation/fixedcolumns"> <items jcr:primaryType="nt:unstructured"> <column jcr:primaryType="nt:unstructured" sling:resourceType="granite/ui/components/coral/foundation/container"> <items jcr:primaryType="nt:unstructured"> <products jcr:primaryType="nt:unstructured" sling:resourceType="granite/ui/components/coral/foundation/form/multifield" composite="{Boolean}true" eaem-show-on-collapse="EAEM.showProductName" fieldLabel="Products"> <field jcr:primaryType="nt:unstructured" sling:resourceType="granite/ui/components/coral/foundation/container" name="./products"> <items jcr:primaryType="nt:unstructured"> <column jcr:primaryType="nt:unstructured" sling:resourceType="granite/ui/components/coral/foundation/container"> <items jcr:primaryType="nt:unstructured"> <product jcr:primaryType="nt:unstructured" sling:resourceType="granite/ui/components/coral/foundation/form/textfield" fieldDescription="Name of Product" fieldLabel="Product Name" name="./product"/> <path jcr:primaryType="nt:unstructured" sling:resourceType="granite/ui/components/coral/foundation/form/pathbrowser" fieldDescription="Select Path" fieldLabel="Path" name="./path" rootPath="/content"/> <size jcr:primaryType="nt:unstructured" sling:resourceType="granite/ui/components/coral/foundation/form/radiogroup" name="./size" vertical="{Boolean}true"> <items jcr:primaryType="nt:unstructured"> <small jcr:primaryType="nt:unstructured" checked="{Boolean}true" text="Small" value="small"/> <medium jcr:primaryType="nt:unstructured" text="Medium" value="medium"/> <large jcr:primaryType="nt:unstructured" text="Large" value="large"/> </items> </size> </items> </column> </items> </field> </products> </items> </column> </items> </content> </jcr:root>
Solution
1) Login to CRXDE Lite, create folder (nt:folder) /apps/eaem-touchui-composite-multifield-with-radio
2) Create clientlib (type cq:ClientLibraryFolder) /apps/eaem-touchui-composite-multifield-with-radio/clientlib and set a property categories of String[] type to [cq.authoring.dialog.all], dependencies of type String[] with value lodash
3) Create file ( type nt:file ) /apps/eaem-touchui-composite-multifield-with-radio/clientlib/js.txt, add the following
select-radios.js
4) Create file ( type nt:file ) /apps/eaem-touchui-composite-multifield-with-radio/clientlib/select-radios.js, add the following code to fix the issue with radio button select on dialog load
(function ($, $document) { var COMPOSITE_MULTIFIELD_SELECTOR = "coral-multifield[data-granite-coral-multifield-composite]"; $document.on("foundation-contentloaded", function(e) { var composites = $(COMPOSITE_MULTIFIELD_SELECTOR, e.target); composites.each(function() { Coral.commons.ready(this, function(el) { selectRadioValue(el); }); }); }); function selectRadioValue(multifield){ var $multifield = $(multifield), dataPath = $multifield.closest(".cq-dialog").attr("action"), mfName = $multifield.attr("data-granite-coral-multifield-name"); dataPath = dataPath + "/" + getStringAfterLastSlash(mfName); $.ajax({ url: dataPath + ".2.json", cache: false }).done(handler); function handler(mfData){ multifield.items.getAll().forEach(function(item, i) { var $mfItem = $(item), $radio = $mfItem.find('[type="radio"]'); var itemName = getJustMFItemName($radio.attr("name")), radioName = $radio.attr("name"); radioName = radioName.substring(radioName.lastIndexOf("/") + 1); if(_.isEmpty(mfData[itemName]) || _.isEmpty((mfData[itemName][radioName]))){ return; } $radio.filter("[value='" + mfData[itemName][radioName] + "']").prop("checked", "true"); }); } function getJustMFItemName(itemName){ itemName = itemName.substr(itemName.indexOf(mfName) + mfName.length + 1); itemName = itemName.substring(0, itemName.indexOf("/")); return itemName; } } function getStringAfterLastSlash(str){ if(!str || (str.indexOf("/") == -1)){ return ""; } return str.substr(str.lastIndexOf("/") + 1); } }(jQuery, jQuery(document), Granite.author));
No comments:
Post a Comment