Pass parameters to a computed custom control - xpages

I'm using the xp:include tag for displaying custom controls according business rules.
I configured my custom controls with parameters (the custom prperties) that I used through the compositeData syntax.
My question is :
How can I declare the computed xpages for passing arguments to my custom control ?

Switch control or Dynamic Content Control may be a better option to choose. The difference is Switch control loads all facets into the component tree, Dynamic Content Control only loads the current facet to be displayed. So if they're specific to different parts in the business process, Dynamic Content Control may be more suitable.
Alternatively, use different XPages for different stages in the business process. With XPages links from views can be computed to go to a specific XPage rather than a single one defined for the form.

Related

How to open a document in a dynamiccontent control facet from a viewpanel control

I have a dynamiccontent control on a XPage with a facet containing a custom control which has a viewpanel in it. I also have a second facet in the dynamiccontent control containing a custom control which is connected to a document data source.
What I am trying to figure out is when the viewpanel custom control is loaded in the dynamiccontent how do I get the links in the viewpanel custom control to load the dynamiccontent facet containing the custom control connected to the document data source and display the document?
I think the Dynamic Content example in the Extension Library Demo database is self explaining. It use also a view and a document
Well I'ver always found ViewPanels to be very limiting if you want to do anything fancy. I don't think you can easily use any of the built in features. I would personally use a Repeat Control and then have a button that takes the intended document and gets the unid. You can then put that unid into a viewScope variable, change your dynamic content control to the document facet and have that custom control get the unid from viewScope to get the correct document.
I long time ago I did a rather crappy demo that showed a couple of these techniques. https://www.youtube.com/watch?v=GSLAy6U2_3A
The CSS attempt failed there but you should be able to see a repeat control and putting the unid into scope etc. It might help you a little.

Is there a way to use a javascript object as a custom control property?

I'm currently building a custom control to be used as an application's view navigator (classic OneUI style). First of all: this is a 8.5.3 based project, and unfortunately there's no way to use Extlib stuff or other extensions / plug-ins. So we have to build all the tricky stuff ourselves using only what came "out-of-the-box" with 8.5.3.
I'd llike to build my navigator using a repeat control containing <xp:link> controls. Datasource could be an array of javascript objects where each single object would look like this:
var navEntry = {"entryLabel" : "label-of-link",
"entryTarget" : "target-url-of-link",
"entryStyle" : "style-to-emphasize-selected-link"}
Each array element then would describe a single navigator entry.
Since the navigator will be used in all possible "DominoView" Xpages it yould make sense to build the array of JS objects at the Xpage level and then pass that info into the custom control.
I'm aware that there are multiple ways to do this, and one could be "Custom Control Properties". If there was a way to pass my JS object array.
(Hope I could make clear what I'm trying to do here...)
That object looks like a HashMap to me really. You should be able to pass that in to a custom control via custom property if you use the type java.util.HashMap I'd think. You'll need to type it in I'm sure. I've passed custom objects in by using java.lang.Object.
The custom control will get loaded during the Page Load event, and usually properties have to be available at that point. If they're loaded during the Render Response phase, that's too late. So your SSJS object will need to be Compute on Page Load.
To use contents of a repeat control, you would need to set repeatControls=true, otherwise the repeat is only built during render response. Until then it's just a single set of controls with no data in them. However, Im pretty sure repeatControls="true" means you only get the number of rows you define. You can't change it via a pager.
You can manually define the type of the custom property. For a standard SSJS Object you use "com.ibm.jscript.std.ObjectObject", for a SSJS Array you use "com.ibm.jscript.std.ArrayObject" etc. As editor for the custom property, I set the string editor ("String value").

Dynamically add / remove editable area to custom control embedded in XPage

Okay... this is a little difficult to explain but I will try my best.
In Custom Control while adding properties in Property Definition we can set "Allow multiple instances" which allows us to add multiple instances of that property when the control is embedded in XPage.
Similarly, I need to know whether it is possible to add (and remove) Editable Areas in a custom control when it is embedded in XPage? What I plan is that I would have a repeat control inside my custom control and I would be able to put the contents in each editable area in every loop of that repeat.
Is this the right way to go about or am I looking at this problem incorrectly? Any solution not involving editable areas is also welcome :)
Update 4 Apr 2013:
A use case context I am looking for is a simple carousel where contents of each screen in carousel can have different contents. These contents would be put into each (dynamically added) editable area. The contents can be very different from each other with one screen containing only text, other only image and another both image and text.
Look at the table walker example in the 26 original exercises. It does mostly what you are looking for (conceptually). You won't need multiple editable areas. Whatever is inside the repeat gets repeated.
What you want to do is to give the control a custom property "boolean editMode" so you can render that one line to be edited - if that's the UI pattern you want to follow.
You also could consider a dojo table with Ajax which allows for a familiar spreadsheet UI

Passing properties to a custom control using xp:include

When using an Include Page to dynamically load a custom control onto an XPage, is there a way to pass custom property values to the custom control as part of the include?
Peter, the include page doesn't load a custom control but another XPage. Pages don't have properties. However... the page becomes part of the component tree, so you have access to its contained controls using getComponent("thecomponent").getParameterMap (Off my head, might be called slightly different)
Does that help?

Can you compute which custom control to use?

Think "computed subform", but in Xpages.
On one of my custom controls, depending on a certain value, I want to either present a custom control that renders a drop-down list using a combobox or renders an input box with a type-ahead.
This is on a custom control that renders a view, with all view configuration choices handled by a document rather than design, so several different views utilize the same custom control.
For example: I have a By Status view using the custom control that has status as the first column and we use a combobox to allow the user to select which Status value to filter by. Another view is sorted by Requisition number and I want to use a type-ahead instead of the combobox.
My preference is to use the same dynamic view custom control for both and have a formula that determines which of the two (comboBox or inputText) to use. How do I compute which custom control to load?
(Credit for the dynamic view control goes to Scott Good's folks over at Teamworks Solutions.)
During it's life cycle, an XPage exists in two places. First of all a representation of the XPage's relevant components is stored on the server. Then the page goes through a lifecycle, retrieving properties from documents, checking which components should be rendered, retrieving the data for any repeating control such as a View Panel etc., and passing the relevant HTML to the browser. The browser is the second place it exists.
So you can't compute a custom control as such. All you can do is set the loaded property, and loaded needs to be based on a non-dynamic calculation such as a viewScope variable, the current XPage name, a view name stored on the XPage etc. What you would have difficulty doing would be using a different custom control based on data on that row entry.
The other option is the Dynamic Content control or Switch control from the Extension Library. Both are similar to using the loaded property, in that you're putting both custom controls on the page and choosing which to display.
From what you're describing, the loaded property should cover what you need.
Some time back I saw this question on StackOverflow where the author had used Include Page control (xp:include) to include custom controls using pageName attribute based on formula.
<xp:include>
<xp:this.pageName><![CDATA[${javascript:sessionScope.ccPageName + ".xsp";}]]> </xp:this.pageName>
</xp:include>
Similar to the technique described by Paul Withers in his answer the attribute of pageName is also computed on page load.

Resources