...
This page shows information for Grouper developers (or perhaps customizers) to work with the new Grouper v2.2 UI.
Naming
Give each JSP a unique name. e.g. dont put attributeAssignAddValue.jsp in various folders. Helps with patching
Common operations
Externalized text in JSP
Code Block |
---|
${textContainer.text['groupLabelPath']} |
...
Code Block |
---|
${grouper:escapeJavascript(someVar.someField)} |
sdf
Validation errors
You can put icons next to fields where there are validation errors. Just make sure there is a way to refer to where you want the icons to go, give a message type and message.
...
This is what it looks like when there is a problem
sfd
Hide / show
Here is an example of a hide/show. Use CSS classes and jquery. Set display none on initially hidden things
Code Block |
---|
<p class="shownAdvancedProperties"><a href="#" onclick="$('.hiddenAdvancedProperties').show('slow'); $('.shownAdvancedProperties').hide('slow'); return false;" >${textContainer.text['groupCreateAdvanced'] } <i class="icon-angle-down"></i></a></p> <p class="hiddenAdvancedProperties" style="display: none" onclick="$('.hiddenAdvancedProperties').hide('slow'); $('.shownAdvancedProperties').show('slow'); return false;" ><a href="#" >${textContainer.text['groupCreateHideAdvanced'] } <i class="icon-angle-up"></i></a></p> <div class="hiddenAdvancedProperties" style="display: none"> |
Call ajax
There are two ways to call ajax, one is ajax that affects the page but does not change the URL (for bookmarks and back button). This is used when submitting a form, or when doing minor things like sorting or paging.
...
Code Block |
---|
guiResponseJs.addAction(GuiScreenAction.newScript("guiV2link('operation=UiV2Subject.viewSubject&memberId=" + member.getId() + "');")); |
sfd
Search form (with modal results)
We have search forms which are similar to the comboboxes, but might have more options, and might be easier to use on some devices
...
Code Block |
---|
/** * search for a subject to add to the group * @param request * @param response */ public void addMemberSearch(HttpServletRequest request, HttpServletResponse response) { GrouperRequestContainer grouperRequestContainer = GrouperRequestContainer.retrieveFromRequestOrCreate(); final Subject loggedInSubject = GrouperUiFilter.retrieveSubjectLoggedIn(); GuiResponseJs guiResponseJs = GuiResponseJs.retrieveGuiResponseJs(); GrouperSession grouperSession = null; try { grouperSession = GrouperSession.start(loggedInSubject); Group group = retrieveGroupHelper(request, AccessPrivilege.UPDATE).getGroup(); if (group == null) { return; } GroupContainer groupContainer = grouperRequestContainer.getGroupContainer(); String searchString = request.getParameter("addMemberSubjectSearch"); boolean searchOk = GrouperUiUtils.searchStringValid(searchString); if (!searchOk) { guiResponseJs.addAction(GuiScreenAction.newInnerHtml("#addMemberResults", TextContainer.retrieveFromRequest().getText().get("groupAddMemberNotEnoughChars"))); return; } Set<Subject> subjects = SubjectFinder.findPageInStem(group.getParentStemName(), searchString).getResults(); if (GrouperUtil.length(subjects) == 0) { guiResponseJs.addAction(GuiScreenAction.newInnerHtml("#addMemberResults", TextContainer.retrieveFromRequest().getText().get("groupAddMemberNoSubjectsFound"))); return; } Set<GuiSubject> guiSubjects = GuiSubject.convertFromSubjects(subjects, "uiV2.subjectSearchResults", 30); groupContainer.setGuiSubjectsAddMember(guiSubjects); guiResponseJs.addAction(GuiScreenAction.newInnerHtmlFromJsp("#addMemberResults", "/WEB-INF/grouperUi2/group/addMemberResults.jsp")); } finally { GrouperSession.stopQuietly(grouperSession); } } |
sfd
Combobox
To use the new combobox, there are several parts:
Combobox - JSP custom tag
Geneerally you need an idBase (some unique id for combos on that page), a width (via style), and an operation (which can include dynamic params). Note, there are other options like sending other form elements during the filter jax operation
Code Block |
---|
<grouper:combobox2 idBase="parentFolderCombo" style="width: 30em" filterOperation="../app/UiV2Stem.stemCopyParentFolderFilter?stemId=${grouperRequestContainer.stemContainer.guiStem.stem.id}"/> |
Combobox - filter ajax method
There is a helper logic structure to easily do the combobox ajax logic, here is an example:
Code Block |
---|
/** * combo filter copy parent folder * @param request * @param response */ public void stemCopyParentFolderFilter(final HttpServletRequest request, HttpServletResponse response) { //run the combo logic DojoComboLogic.logic(request, response, new DojoComboQueryLogicBase<Stem>() { /** * */ @Override public Stem lookup(HttpServletRequest request, GrouperSession grouperSession, String query) { Subject loggedInSubject = grouperSession.getSubject(); Stem theStem = new StemFinder().addPrivilege(NamingPrivilege.STEM).assignSubject(loggedInSubject) .assignFindByUuidOrName(true).assignScope(query).findStem(); return theStem; } /** * */ @Override public Collection<Stem> search(HttpServletRequest request, GrouperSession grouperSession, String query) { Subject loggedInSubject = grouperSession.getSubject(); QueryOptions queryOptions = QueryOptions.create(null, null, 1, 50); return new StemFinder().addPrivilege(NamingPrivilege.STEM).assignScope(query).assignSubject(loggedInSubject) .assignSplitScope(true).assignQueryOptions(queryOptions).findStems(); } /** * * @param t * @return */ @Override public String retrieveId(GrouperSession grouperSession, Stem t) { return t.getId(); } /** * */ @Override public String retrieveLabel(GrouperSession grouperSession, Stem t) { return t.getDisplayName(); } /** * */ @Override public String retrieveHtmlLabel(GrouperSession grouperSession, Stem t) { //description could be null? String label = GrouperUiUtils.escapeHtml(t.getDisplayName(), true); String htmlLabel = "<img src=\"../../grouperExternal/public/assets/images/folder.gif\" /> " + label; return htmlLabel; } /** * */ @Override public String initialValidationError(HttpServletRequest request, GrouperSession grouperSession) { Stem stem = retrieveStemHelper(request, true).getStem(); if (stem == null) { return TextContainer.retrieveFromRequest().getText().get("stemCopyInsufficientPrivileges"); } return null; } }); } |
Combobox submit form
Then the form that has the combobox is submitted, process the data. You do this by appending "Name" to the id label. Also, if the user typed something in, but didnt select anything, append "NameDisplay" to the id base.
Code Block |
---|
String parentFolderId = request.getParameter("parentFolderComboName"); //just get what they typed in if (StringUtils.isBlank(parentFolderId)) { parentFolderId = request.getParameter("parentFolderComboNameDisplay"); } |
Combobox control from ajax
If you need to set an ID and label to the combobox from ajax, you can do this: (not sure if this works btw)
...