


What I need to do is hide or show a text field (may be many more fields in the future) based on an option I select in another dialog. Let's say there are two dialogs A and B. There is a dropdown in dialog A which has two options 'Hide' and 'Show' and a textfield in dialog B. If I choose 'Show' from dialog A, a field in dialog B should be made visible the next time I open dialog B. If I choose 'Hide' from dialog A, then that field must be hidden in dialog B. The field in dialog B needs to be hidden by default. In such a way, is it possible to hide or show fields in dialogs based on selections in other dialogs? Currently developing in AEM 6.4.
Solved! Go to Solution.
Hi,
i create something of similar for a project. In my case i use java code in order to change the dialog.
I attach here an example.
If i can suggest you, after using this way i think that it's better to change the design of your components in order to avoid this kind of behaviour.
It's better that elements of a dialog that are related, are configured in the same dialog. If you need to make this configuration because you have a "container" and elements configured for this container, is better that you try to create just only one dialog or manage this configuration by using page property (if it's possible).
@Override
protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response)
throws ServletException, IOException {
BundleContext bundleContext = FrameworkUtil.getBundle(SessionService.class).getBundleContext();
ServiceReference<?> osgiRef = bundleContext.getServiceReference(SessionService.class.getName());
SessionService service = (SessionService) bundleContext.getService(osgiRef);
if (service != null) {
session = service.getSession();
String[] tabList = null;
String dialogPath = request.getParameter("dialogPath");
resourcePath = request.getParameter("resourcePath");
LOGGER.debug("dialogPath: "+dialogPath);
LOGGER.debug("resourcePath: "+resourcePath);
if (StringUtils.isNotBlank(dialogPath) && StringUtils.isNotBlank(resourcePath)) {
String tabPartialName = "image";
dialogPath += "/items/items";
Resource resource = request.getResourceResolver().getResource(resourcePath);
tabList = resource.getValueMap().get("nameoftabs", String[].class);
if (tabList != null && tabList.length > 0) {
WcmUtilsClassicUi.clearOldValueIntoResource(session, tabList, resource);
WcmUtilsClassicUi.clearOldDialog(session, dialogPath, tabPartialName);
updateDialogNodes(dialogPath, tabList, tabPartialName);
} else {
WcmUtilsClassicUi.clearOldDialog(session, dialogPath, tabPartialName);
}
}
} else {
LOGGER.error("Box - error on activate method: is null");
}
}
Views
Replies
Sign in to like this content
Total Likes
I'm not sure of the requirements that you have but in order to achieve your use case, you would need to persist & cleanup the state of those fields either in JCR node/json or in browser via cookie/localStorage/sessionStorage etc. The reason is because you want to perform certain actions that are outside the scope of your original request in a stateless architecture.
You would definitely need to consider the end-to-end design when concurrent users may want to interact with the system, probably same page/same component use cases.
Views
Replies
Sign in to like this content
Total Likes
YOu can write JQUery code to manipulate fields on the same dialog. For 2 different dialogs - never seen that uses case. However - i passed this to our Touch UI team to get their thoughts. (but best practice is 1-1 - all fields are on 1 dialog and have nothing to do with other dialogs)
Views
Replies
Sign in to like this content
Total Likes
Hi,
i create something of similar for a project. In my case i use java code in order to change the dialog.
I attach here an example.
If i can suggest you, after using this way i think that it's better to change the design of your components in order to avoid this kind of behaviour.
It's better that elements of a dialog that are related, are configured in the same dialog. If you need to make this configuration because you have a "container" and elements configured for this container, is better that you try to create just only one dialog or manage this configuration by using page property (if it's possible).
@Override
protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response)
throws ServletException, IOException {
BundleContext bundleContext = FrameworkUtil.getBundle(SessionService.class).getBundleContext();
ServiceReference<?> osgiRef = bundleContext.getServiceReference(SessionService.class.getName());
SessionService service = (SessionService) bundleContext.getService(osgiRef);
if (service != null) {
session = service.getSession();
String[] tabList = null;
String dialogPath = request.getParameter("dialogPath");
resourcePath = request.getParameter("resourcePath");
LOGGER.debug("dialogPath: "+dialogPath);
LOGGER.debug("resourcePath: "+resourcePath);
if (StringUtils.isNotBlank(dialogPath) && StringUtils.isNotBlank(resourcePath)) {
String tabPartialName = "image";
dialogPath += "/items/items";
Resource resource = request.getResourceResolver().getResource(resourcePath);
tabList = resource.getValueMap().get("nameoftabs", String[].class);
if (tabList != null && tabList.length > 0) {
WcmUtilsClassicUi.clearOldValueIntoResource(session, tabList, resource);
WcmUtilsClassicUi.clearOldDialog(session, dialogPath, tabPartialName);
updateDialogNodes(dialogPath, tabList, tabPartialName);
} else {
WcmUtilsClassicUi.clearOldDialog(session, dialogPath, tabPartialName);
}
}
} else {
LOGGER.error("Box - error on activate method: is null");
}
}
Views
Replies
Sign in to like this content
Total Likes
Our team replied:
Hey there is a acs aem commons extension for this purpose… check if it helps
Views
Replies
Sign in to like this content
Total Likes
Great response!