XPages: Optimized partial refreshes for event handlers

September 20th, 2014

Sven Hasselbach has created an optimized version of the XSP.partialRefreshPost() method. This works great to reduce the number of form fields that are included in the request for a partialRefreshPost.

But his version does not include support for running server-side actions because the the form fields included in the POST doesn't include the server-side event handler.

So I have created an optimized version of his optimized version that supports this 🙂
My versions adds a 'submitid' parameter that should point to the id of the event handler that you want to execute on the server.

XSP.partialRefreshPost(
    '#{id:somePart}',
    {
      clearForm: true,
      submitid: '#{id:submitEventHandler}'
    }
);

Here's an example of using the optimized partial refresh for an eventhandler:

<xp:button id="button1">
    <xp:eventHandler event="onclick" submit="false" id="submitEventHandler" refreshMode="partial" refreshId="somePart">
        <xp:this.action><![CDATA[#{javascript:someServerSideAction();}]]></xp:this.action>
        <xp:this.script><![CDATA[
            XSP.partialRefreshPost(
                '#{id:somePart}',
                {
                    clearForm: true,
                    submitid: '#{id:submitEventHandler}'
                }
            );
        ]]></xp:this.script>
    </xp:eventHandler>
</xp:button>

Here's the complete code snippet (available as an OpenNTF XSnippets too):

	<xp:scriptBlock id="scriptBlockPROptimized">
        <xp:this.value><![CDATA[
			XSP.addOnLoad(function(){

			    // hijack the existing partial refresh method
			    if( !XSP.__partialRefresh ){
			        XSP.__partialRefresh = XSP._partialRefresh;
			    }

			    // add the new one to the XSP object
			    XSP._partialRefresh = function x_prfh(method, form, refreshId, options){

			        // clear the form?
			        if( options.clearForm ){

			            // create a new HTML form...
			            var newForm = document.createElement( "form" );
			            newForm.setAttribute( "method", form.method );
			            newForm.setAttribute( "action", form.action );

			            // ... and loop all existing fields
			            for( var i = 0; i<form.length; i++ ){
			                var field = form[i];
			                var fieldName = field.name;
			                var includeField = false;

			                try{

			                    // check for addition fields
			                    if( options.additionalFields ){
			                        includeField = dojo.indexOf(options.additionalFields, fieldName)!=(-1)?true:false;
			                    }

			                    // only add XPages relevant fields and addtional fields
			                    if( fieldName == form.id || fieldName.substr(0,2) == '$$' || includeField ){

			                        var newField = null;
			                        if( field.options ){
			                            // special handling for fields with options
			                            for( var j=0; j<field.length; j++ ){
			                                if( field.options[j].selected ){
			                                    newField = document.createElement( "input" );
			                                    newField.setAttribute( "type", "hidden" );
			                                    newField.setAttribute( "name", fieldName );
			                                    newField.setAttribute( "value", field.options[j].value );
			                                    newForm.appendChild( newField );
			                                }
			                            }
			                        }else{
			                            // default field handling: just clone the DOM element

			                            // check for $$xspsubmitid option
							            if( options.submitid && fieldName == "$$xspsubmitid"){
							                newField = document.createElement( "input" );
							                newField.setAttribute( "type", "hidden" );
							                newField.setAttribute( "name", "$$xspsubmitid" );
							                newField.setAttribute( "value", options.submitid );
							                newForm.appendChild( newField );
							            } else {
				                            newField = field.cloneNode( true );
				                            newForm.appendChild( newField );
				                        }
			                        }
			                    }
			                }catch(e){
			                    console.log(e);
			                }
			            }

			            // call the original refresh method with the new form
			            return XSP.__partialRefresh(method, newForm, refreshId, options);
			        }

			        XSP.__partialRefresh(method, form, refreshId, options);
			    };
			});
		]]></xp:this.value>
    </xp:scriptBlock>

Keep in mind that to optimize a partial refresh you need to focus on more than just the size of the POST request. You should also look at partial execution mode (execMode="partial") in order to reduce the amount of work that the server has to do.

Authenticating your IBM Domino and IBM XWork Server web apps against Active Directory (LDAP)

August 28th, 2014

With IBM Domino and IBM XWork Server you can set up web authentication against an external LDAP such as Microsoft Active Directory. This is useful if you are deploying a web application and your users are already in an external directory. In this blog post I will show you how to set this up.

  1. Create a Directory Assistance application on the server based on the Directory Assistance application template
  2. Edit the server document in the Domino Directory and add the path to the Directory Assistance application from step 1 to the Directory Assistance database name field on the Basics tab
  3. Create a new Directory Assistance document in the Directory Assistance application and fill out the following:
    1. Domain type: LDAP
    2. Domain name: Company domain (notice: the domain name in the Directory Assistance document MUST not be equal to the Domino domain!)
    3. Company name: Company name
    4. Naming Contexts (Rules) - Trusted for Credentials: Yes
    5. Hostname: host name of Microsoft Active Directory (tip: use the Verify button to check access to the host)
    6. Optional authentication credential for search: If the Active Directory does not allow anonymous LDAP searches, then add username and password for a user with access to Active Directory
    7. LDAP vendor: Active Directory
    8. Base DN for search: DC=company,DC=com (use the Suggest button to find the correct format)
    9. Channel encryption: SSL or none (notice: if changing from SSL to none make sure that Naming Contexts (Rules) - Trusted for Credentials is not changed from Yes to No)
  4. Restart your server

It's now time to test your your LDAP configuration. Start by creating a new application with access control set to Readers for Default and No Access for Anonymous. Try to access the application from a browser and you will be prompted for credentials. Now logon using a valid username and password. You will be able to access the application if your Directory Assistance setup is working. Congratulations - you can now deploy your web application and have users authenticate using Microsoft Active Directory - without having any user details stored on the IBM Domino/IBM XWork server!

If authentication fails, you should start with issuing the "show xdir" command on the server console. You should see two entries in the list - the first one pointing to the Domino directory (names.nsf) and the second one pointing to your LDAP configuration.

You can also use the webauth_verbose_trace=1 option to enable debug messages on the server console by issuing "set conf webauth_verbose_trace=1" on the server console.

XPages and Domino 9.0.1 FP2: upgrades to CKEditor and Dojo

August 24th, 2014

IBM released fix pack 2 for Domino and XWork Server 9.0.1 this week. Among many fixes it includes the following fix:

SPR# TMGN9KJTEB - Adds Internet Explorer 11 support for xPages

I asked Brian Gleeson from the IBM Dublin team what exactly this means, and he responded that it covers an upgrade of CKEditor from 3.6.x to 4.3.2 and an upgrade of Dojo from 1.8.3 to 1.9.2.

One issue I have seen so far with CKEditor 4.3.2 is that the "Insert image" button called 'Image' in a custom toolbar is different from the standard "Insert image" button used if you use the default toolbar. Instead, you need to use 'IbmImage' as the name of the image button.

The latest CKEditor adds a spell check option - either through the default toolbar or by adding 'IbmSpellChecker' to your custom toolbar. It's great that the CKEditor in XPages finally adds that facility. Here it is in action:

CKEditor spell checker

With the new CKEditor the 'toolbarType' Dojo attribute no longer works. Instead use 'toolbar' as Dojo attribute with Slim, Medium, Large and Full as possible values.

Presentation: an introduction to Bootstrap4XPages

August 22nd, 2014

Today I am with the rest of the Notesnet.dk members at our yearly 2-day conference. I did a brief presentation on Bootstrap4XPages:

Bootstrap4XPages - an introduction from Per Henrik Lausten

Submit your session abstracts for the DanNotes 52nd conference

August 22nd, 2014

DanNotes

The 52nd DanNotes conference takes place on November 19-20, 2014. I am part of the organizers team and we are hard at work planning the conference and have opened for session abstract submissions. If you are interested in speaking at the conference, please register and submit your session abstract.

We are looking for business related sessions, technical sessions, case stories and more - and we are looking for speakers from all over the world.

One important point: DanNotes will take care of your travel and accommodation expenses! So what are you waiting for? 🙂

Presentation: an introduction to IBM BlueMix

August 20th, 2014

In June I introduced the Notesnet.dk members to IBM BlueMix. I used a combination of the presentation below and hands-on examples.

An introduction to IBM BlueMix from Per Henrik Lausten

XPages boilerplate: useful code snippets and modules for your next XPages project

December 11th, 2013

When I start a new XPages project, I use lots of code snippets and modules from previous projects. Many of these code snippets and modules are open source or available on blog posts from fellow XPages bloggers. In this blog post I will list some of these useful code snippets and modules and hope that this will inspire you and help you enhance your next XPages project.

Useful code snippets and modules:

You can also take a look at the XPages Scaffolding project by Jesse Gallagher. At least look at the README.md file in which Jesse describes what's included.

Of course, you should not forget all the useful libraries and tools available in OpenNTF Essentials (both in the Essentials Runtime and in Essentials Toolbox) such as the OpenNTF Domino API, XPages Debug Toolbar and XPages Log File Reader. Also of great value is Auto Logins which provides "remember me" functionality for your app.

I am going to IBM Connect 2014

December 11th, 2013

IBM Connect 2014

The IBM Connect 2014 conference takes place next month. I am going once again and look forward to the atmosphere, the sessions, and most importantly the people.

I arrive Friday evening January 24th and leave again Friday January 31st. I will be staying at the Dolphin hotel.

See you there?

Hour of Code: Anybody can learn

December 9th, 2013

Computer Science Education WeekThis week is the Hour of Code week.

I am going to introduce my oldest son's school class to programming (he is 8 years old). I will use some of the available resources from code.org such as LightBot,

Who are you going to introduce to the world of programming this week?

I have been re-elected as IBM Champion

December 5th, 2013

I am honoured and proud to have been re-elected as IBM Champion with a group of 86 other 2014 IBM Champions for IBM Collaboration Solutions.

IBM Champion logo