Extension Library Version

På server consollen kan du skrive nedenstående kommando for at få at vide hvilken version af Extension Library der er installeret på serveren:

tell http osgi ss com.ibm.xsp.extlib

Du kan evt. lave en knap på din toolbar med denne kommando:

@Command([AdminRemoteConsole])

så får du en hurtig genvej til server konsollen. Knappen findes som default på Developer Toolbaren

Du kan også få versionsnummeret via SSJS:

RichText felter

XPages benytter en CKEditor til RichText redigering. Med simpel kode kan du selv kontrollere menuen og dermed hvilken muligheder brugeren skal have, læs mere her: CKEditor in XPages eller brug XSnippet. Eksempel:

<xp:inputRichText value="#{document1.body}" id="body1" style="width:600px">
 <xp:this.dojoAttributes>
 <xp:dojoAttribute name="toolbar">
 <xp:this.value><![CDATA[#{javascript:var myToolbar = "[['Bold','Italic','Underline','Strike'],['TextColor','BGColor']]";
return myToolbar}]]></xp:this.value>
 </xp:dojoAttribute>
 </xp:this.dojoAttributes>
 </xp:inputRichText>

Hvis du skal vise RichText i en Repeat control (et view), så kan du benytte dette lille trick: Displaying mixed-type Rich Text in an XPages repeat control. Et Panel indsættes i Repeat Controllen og tildeles en datasource – herefter kan Body feltet inkluderes (og bliver renderet korrekt):

<xp:panel>
 <xp:this.data>
 <xp:dominoDocument var="entryDoc" formName="MainTopic"
 documentId="#{javascript:rowData.getUniversalID();}"
 ignoreRequestParams="true" action="editDocument">
 </xp:dominoDocument>
 </xp:this.data>

Med en Custom Converter kan du, on-the-fly, fjerne eks. FONT tags, SCRIPT tags eller andet uønsket html fra feltet inden det vises:

<xp:this.converter>
 <xp:customConverter>
 <xp:this.getAsObject><![CDATA[#{javascript:value}]]></xp:this.getAsObject>
 <xp:this.getAsString><![CDATA[#{javascript:
 try{
 var html=value.toString();
 html=html.replace(/<(FONT|font)([ ]([a-zA-Z]+)=(\"|')[^\"\\']+(\"|'))*[^>]+>/g,"")
 html=html.replace(/(<\/FONT>|<\/font>)/g,"")
 return html;
 }catch(e){
 print (e);
 }}]]>
 </xp:this.getAsString>
 </xp:customConverter>
 </xp:this.converter>

 Per Lausten har lavet ovenstående eksempel som også findes på OpenNTF

Attachments

Dynamic Views

Dynamic Views er en component i Extension Library – gør det muligt at lave én XPages som herefter kan bruges til at vise alle views i din database!

I teorien skal componenten blot indsættes på din XPage – men der er lige et par småting der skal gøres:

  • Data source: viewName skal beregnes. På links i din navigator (hvor view vælges) sættes en querystring variable med navnet på viewet. Data Source på DynamicView controllen kan herefter læse denne og åbne det korrekte view.
  • Collapse All: Data source, expandLevel = 1
  • Pager: Indsæt blot en Core Custom Control Pager
  • CustomizerBean: DynamicView kontrollen har en række ‘fejl’ – f.eks. åbnes alle dokumenter i Edit mode. Dette kan dog rettes ved at bruge en CustomizerBean som vist nedenfor. Andre fejl må rettes direkte i viewet – eller ved at udbygge CustomizerBean’en som gjort på frostillic.us.
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import com.ibm.xsp.extlib.builder.ControlBuilder.IControl;
import com.ibm.xsp.extlib.component.dynamicview.DominoDynamicColumnBuilder.DominoViewCustomizer;
import com.ibm.xsp.extlib.component.dynamicview.UIDynamicViewPanel.DynamicColumn;
import com.ibm.xsp.extlib.component.dynamicview.ViewDesign.ColumnDef;
public class customizer extends DominoViewCustomizer{
 @Override
 public void afterCreateColumn(FacesContext context, int index,
 ColumnDef colDef, IControl column) {
 //Create a variable for the current component
 UIComponent columnComponent = column.getComponent();
 //Create a reference to the column and set the links to open in read mode
 DynamicColumn dynamicColumn = (DynamicColumn) columnComponent;
 //To have every view open the selected documents in read mode add the following
 dynamicColumn.setOpenDocAsReadonly(true);
 super.afterCreateColumn(context, index, colDef, column);
 }
}

Links

Extension Library

Med Extension Library får du rigtigt meget kode foræret. Extension Library kan downloades fra OpenNTF eller installeres om en del af Upgrade Pack 1 fra IBM.

Vil varmt anbefale at benytte Upgrade Pack af 2 årsager:

  • Lettere at installere og opgradere
  • Supporteret af IBM

Upgrade Pack skal installere både på serveren og på din Developer PC. Hvis i skal køre XPiNC (XPages in the Notes Client), så skal der installeres på alle PC’ere. Til gengæld bliver det meget nemmere at udvikle nye apps, så det er besværet værd – og pakken udvides hele tiden med nye components.

Du skal også downloade en version fra OpenNTF for at få sample databasen: XPagesExt.nsf (som er en del af pakken). Samme sted finder du ‘XPages-Doc.zip’ som indeholder ‘The XPages Extension Library API documentation’

Dokumentationen skal købes seperat fra IBM Press: XPages Extension Library: A Step-by-Step Guide to the Next Generation of XPages Components. Gør det hellere med det samme – du får brug for den 😉

Endnu ikke overbevist? Så se denne præsentation: Create an app in 1 hour (almost) with XPages Extension Library

XAgent

XAgent’s er en metode til at lave SSJS agenter med XPages. Fordel: De performaner langt bedre end alm. Notes agenter!

De er nemme at lave:

  1. Opret en ny XPage
  2. Sæt rendered = False
  3. Indsæt nedenstående kode i afterRenderResponse event:

var externalContext = facesContext.getExternalContext();

var writer = facesContext.getResponseWriter();
var response = externalContext.getResponse();
 
// set content type, e.g. ...
response.setContentType("text/xml");
// response.setContentType("application/json");
response.setHeader("Cache-Control", "no-cache");
 
// read parameters, e.g. ...
var param = context.getUrlParameter("myParam");
 
// write HTML output e.g. ...
writer.write("<br></br>");
// writer.write("{'jsonvar'='jsonvalue'}");
writer.endDocument();

 

Ligger også som en Snippet på OpenNTF

Nyt i 8.5.3: view.postScript

Med denne ‘event’ kan du kører Client Side JavaScript efter Server Side JavaScript har kørt. Eksempel fra OpenNTF Snippets: Display Client-Side alert if Server-Side validation fails

<xp:label id="label1">
 <xp:this.value><![CDATA[#{javascript:/** If there are any messages for this request, run the client-side JavaScript after the viewRoot response is completed **/
 if(facesContext.getMessages().hasNext()){
 var x="alert('THE DOCUMENT WAS NOT SAVED.\\n\\nAll required fields were not completed or they do not contain valid data.\\n\\nPlease review the fields and correct any errors.');";
 view.postScript(x);
 }}]]></xp:this.value>
</xp:label>

Ovenstående stump kode vil fint kunne løse dette problem -> http://xpages.dk/?p=297 mht.  Service Side Validation og Partial Update

JavaScript noter

JavaScript IF THEN ELSE statement kan forkortes til :

conditionExpr ? thenExpr : elseExpr

Lighedtegnet i JavaScript:

Med ét lighedstegn (=) laves en tildeling
Med 2 lighedstegn (==) laves en sammenligning med type konvertering, dermed vil ‘5’==5 returnere True (dvs. String 5 er lig med Int 5).
Med 3 lighedstegn (===) kan 2 værdier sammenlignes uden at der laves type konvertering – dermed vil ´5’===5 returnere False. Se også denne artikel: Equals Equals Equals

URL Håndtering

Der er flere måde at læse en url på i XPages. Først den helt simple:

context.getUrlParameter("Tagname")

Her et eksempel med XSPUrl:

//Read the url parameter ID
var url:XSPUrl;
try {
 url = context.getUrl();
 var n = url.getParametersCount();
 if (n > 0) {
 var id = url.getParameter('id');
}} catch(e) {}
//Remove the id from the url
 url.removeParameter( "id");
 facesContext.getExternalContext().redirect(url.toString());

En anden mulighed er via facesContext:

var exCon = facesContext.getExternalContext();
var request = exCon.getRequest(); // This is the actual HTTP servlet request...
var paramValue = request.getParameter("paramName");
return paramValue;

Eksempler på Redirects i XPages: How to redirect to an rul in XPages

context.redirectToPage(…)

ellser

context.redirectToHome()

 

Generelt Server Side JavaScript

Her er mit standard Server Side javascript som jeg altid benytter. Indeholder følgende funktioner:

  • getWebDbPath(): returnerer filepath til current database.
  • getTime( dt ): Formatere datoen (dt) til: hh:nn
  • getDate( dt ): Formatere datoen (dt) til formatet:
    d. mmmm yyyy, eksempel:getDate(  document1.getDocument().getCreated().toJavaDate() )

    giver: 23. april 2012

  •  getDateTime( dt ): Formatere både dato og tid.
  • URLEncode( url ): UTF-8 encoder en string så den f.eks. kan benyttes i en URL.

 

Download: