Hier ein Lösungsvorschlag:
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
<xp:viewPanel rows="30" id="viewPanel1" >
<xp:this.facets>
<xp:pager partialRefresh="true" layout="Previous Group Next"
xp:key="footerPager" id="pager1">
</xp:pager>
<xp:scriptBlock id="scriptBlockViewPanel" xp:key="south">
<xp:this.value>
<![CDATA[
var data = new Array();
#{javascript:
var viewPanel = getComponent("viewPanel1");
var vPanelId = getClientId( "viewPanel1" );
var m:java.util.Map = facesContext.getExternalContext().getRequestParameterMap();
var it:java.util.Iterator = m.keySet().iterator();
var data = new java.util.Vector();
while( it.hasNext() ){
var key = it.next();
if( key.toString().indexOf( vPanelId ) != (-1) ){
data.push( m.get(key) );
}
}
var jsCode = "";
for( i=0; i< data.size(); i++){
jsCode += 'data["' + data.get(i) + '"]="' + data.get(i) + '";\n'
}
return jsCode
}
dojo.query(".xspCheckBoxViewColumn").forEach( function(node) {
if( data[node.value] )
node.checked = true;
})]]>
</xp:this.value>
</xp:scriptBlock>
</xp:this.facets>
<xp:this.data>
<xp:dominoView var="view1" viewName="All"></xp:dominoView>
</xp:this.data>
<xp:viewColumn columnName="Form" id="viewColumn1"
showCheckbox="true">
<xp:viewColumnHeader value="Form" id="viewColumnHeader1"></xp:viewColumnHeader>
</xp:viewColumn>
</xp:viewPanel>
</xp:view>
Das ganze funktioniert dadurch, das bei jeden Refresh ein CSJS-Script generiert wird, das die Selektion wieder herstellt. So bleibt di Selektion für ausgeklappte Kategorien erhalten. Für's Pagern müsste die Selektion im viewScope zwischengespeichert werden.
Argh, hier die noch simplere Variante. Damit geht sowohl das Pagen als auch das Zu-/Aufklappen.
Einzig bei neuladen / Full refresh etc. ist die Selektion weg:
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core"
xmlns:xp_1="http://www.ibm.com/xsp/coreex">
<xp:viewPanel rows="3" id="viewPanel1">
<xp:this.facets>
<xp:pager partialRefresh="true" layout="Previous Group Next"
xp:key="footerPager" id="pager1">
</xp:pager>
<xp:scriptBlock id="scriptBlockViewPanel" xp:key="south">
<xp:this.value>
<![CDATA[
dojo.addOnLoad( function(){
dojo.query(".xspCheckBoxViewColumn").connect('onclick', function() {
selDocs[ this.id ] = this.checked;
});
rebuildDocSelection();
});
]]></xp:this.value>
</xp:scriptBlock>
</xp:this.facets>
<xp:this.data>
<xp:dominoView var="view1" viewName="All"></xp:dominoView>
</xp:this.data>
<xp:viewColumn columnName="Form" id="viewColumn1"
showCheckbox="true">
<xp:viewColumnHeader value="Form" id="viewColumnHeader1"></xp:viewColumnHeader>
</xp:viewColumn>
</xp:viewPanel>
<xp:scriptBlock id="scriptBlockViewPanelHelper">
<xp:this.value>
<![CDATA[
var selDocs = new Array();
function rebuildDocSelection(){
for( e in selDocs ){
try{
dojo.byId( e ).checked = selDocs[e];
}catch(e){}
}
}
]]>
</xp:this.value>
</xp:scriptBlock>
</xp:view>
Edit:
Ein Detail fehlt allerdings noch: Die Selektion zu merken ist eine Sache, die selektierten Dokumente an den Server zu senden eine andere... Das muss ich noch basteln!
Ja bitte.
Here we go:
<?xml version="1.0" encoding="UTF-8"?>
<xp:view
xmlns:xp="http://www.ibm.com/xsp/core"
xmlns:xc="http://www.ibm.com/xsp/custom"
xmlns:xe="http://www.ibm.com/xsp/coreex"
>
<xp:this.data>
<xp:dominoDocument
var="document1"
formName="Liniendokument"
>
</xp:dominoDocument>
<xp:dominoView
var="view2"
viewName="helperViewInventar"
>
</xp:dominoView>
<xp:dominoView
var="viewZuordnung"
viewName="helperViewLiniendokInventar"
>
</xp:dominoView>
</xp:this.data>
<xp:this.resources>
<xp:styleSheet href="/cssTest.css"></xp:styleSheet>
</xp:this.resources>
<xp:this.beforeRenderResponse><![CDATA[#{javascript:var con = facesContext.getExternalContext();
var request:com.sun.faces.context.MyHttpServletRequestWrapper = con.getRequest();
var map:java.util.Map = request.getParameterMap();
var fileDataName = "file"; //name of the POST request parameter that contains the file
var fileData:com.ibm.xsp.http.UploadedFile = map.get( fileDataName );
var tempFile:java.io.File = fileData.getServerFile();}]]></xp:this.beforeRenderResponse>
<xp:table>
<xp:tr>
<xp:td colspan="2">
<xp:button
value="Bearbeiten"
id="button1"
>
<xp:this.rendered><![CDATA[#{javascript://Button wird ausgeblendet, wenn sich das Dok nicht im EditMode befindet
return !document1.isEditable()}]]></xp:this.rendered>
<xp:eventHandler
event="onclick"
submit="true"
refreshMode="complete"
id="eventHandler1"
>
<xp:this.action>
<xp:openPage
name="/xInventar.xsp"
target="editDocument"
>
</xp:openPage>
</xp:this.action>
</xp:eventHandler>
</xp:button>
  
<xp:button
value="Schließen ohne Speichern"
id="button2"
>
<xp:this.rendered><![CDATA[#{javascript://Button wird angezeigt, wenn sich das Dok im EditMode befindet
return document1.isEditable()}]]></xp:this.rendered>
<xp:eventHandler
event="onclick"
submit="true"
refreshMode="complete"
immediate="true"
save="false"
id="eventHandler2"
>
<xp:this.action>
<xp:openPage name="$$PreviousPage"></xp:openPage>
</xp:this.action>
</xp:eventHandler>
</xp:button>
  
<xp:button
id="button3"
value="Speichern"
>
<xp:this.rendered><![CDATA[#{javascript://Button wird angezeigt, wenn sich das Dok im EditMode befindet
return document1.isEditable()}]]></xp:this.rendered>
<xp:eventHandler
event="onclick"
submit="true"
refreshMode="complete"
id="eventHandler3"
>
<xp:this.action>
<xp:save></xp:save>
</xp:this.action>
</xp:eventHandler>
</xp:button>
  
<xp:button id="button4">
<xp:this.value><![CDATA[Speichern & Schließen]]></xp:this.value>
<xp:this.rendered><![CDATA[#{javascript://Button wird angezeigt, wenn sich das Dok im EditMode befindet
return document1.isEditable()}]]></xp:this.rendered>
<xp:eventHandler
event="onclick"
submit="true"
refreshMode="complete"
immediate="false"
save="false"
id="eventHandler4"
>
<xp:this.action>
<xp:actionGroup>
<xp:actionGroup>
<xp:saveDocument></xp:saveDocument>
<xp:openPage
name="$$PreviousPage"
>
</xp:openPage>
</xp:actionGroup>
</xp:actionGroup>
</xp:this.action>
</xp:eventHandler>
</xp:button>
  
<xp:button id="button7">
<xp:this.value><![CDATA["Freeze"]]></xp:this.value>
<xp:this.rendered><![CDATA[#{javascript:getComponent("freeze1").getValue() != "1"}]]></xp:this.rendered><xp:eventHandler
event="onclick"
submit="true"
refreshMode="complete"
id="eventHandler5">
<xp:this.action><![CDATA[#{javascript:var thisDoc:NotesDocument = document1.getDocument();
var thisUNID = thisDoc.getUniversalID();
var db:NotesDatabase = thisDoc.getParentDatabase();
var inventarView:NotesView = db.getView("(inventarByLinieUNID)");
var col:NotesDocumentCollection = inventarView.getAllDocumentsByKey(thisUNID);
print("gefundene InvenarDoks zu akt. LinienDok: " + col.getCount())
var invDoc:NotesDocument;
invDoc = col.getFirstDocument();
while (invDoc != null) {
print(invDoc.getUniversalID());
invDoc.replaceItemValue("Freeze", "1");
invDoc.save();
invDoc = col.getNextDocument(invDoc);
}
thisDoc.replaceItemValue("Freeze", "1");
thisDoc.save();
}]]></xp:this.action>
</xp:eventHandler>
</xp:button>
  <xp:button id="button8">
<xp:this.value><![CDATA["Unfreeze"]]></xp:this.value>
<xp:this.rendered><![CDATA[#{javascript:getComponent("freeze1").getValue() == "1"}]]></xp:this.rendered><xp:eventHandler
event="onclick"
submit="true"
refreshMode="complete"
id="eventHandler8"
>
<xp:this.action><![CDATA[#{javascript:var thisDoc:NotesDocument = document1.getDocument();
var thisUNID = thisDoc.getUniversalID();
var db:NotesDatabase = thisDoc.getParentDatabase();
var inventarView:NotesView = db.getView("(inventarByLinieUNID)");
var col:NotesDocumentCollection = inventarView.getAllDocumentsByKey(thisUNID);
print("gefundene InvenarDoks zu akt. LinienDok: " + col.getCount())
var invDoc:NotesDocument;
invDoc = col.getFirstDocument();
while (invDoc != null) {
print(invDoc.getUniversalID());
invDoc.replaceItemValue("Freeze", "");
invDoc.save();
invDoc = col.getNextDocument(invDoc);
}
thisDoc.replaceItemValue("Freeze", "");
thisDoc.save();
}]]></xp:this.action>
</xp:eventHandler>
</xp:button></xp:td>
</xp:tr>
<xp:tr>
<xp:td rendered="false">
<xp:label
value="Freeze:"
id="freeze_Label1"
for="freeze1"
>
</xp:label>
</xp:td>
<xp:td rendered="false">
<xp:inputText
value="#{document1.Freeze}"
id="freeze1"
>
</xp:inputText>
</xp:td>
</xp:tr>
<xp:tr>
<xp:td
colspan="2"
styleClass="Bereich"
>
<xp:span style="font-weight:bold;font-size:12pt">
</xp:span>
<xp:span
style="font-weight:bold;font-size:12pt"
styleClass="Bereich"
>
Anlage / Ort
</xp:span>
<xp:span styleClass="Bereich"></xp:span>
</xp:td>
</xp:tr>
<xp:tr>
<xp:td>
<xp:label
value="Anlagenbezeichnung:"
id="liniendokAnlagenbezeichnung_Label1"
for="liniendokAnlagenbezeichnung1"
>
</xp:label>
</xp:td>
<xp:td>
<xp:inputText
value="#{document1.liniendokAnlagenbezeichnung}"
id="liniendokAnlagenbezeichnung1"
>
</xp:inputText>
</xp:td>
</xp:tr>
<xp:tr>
<xp:td>
<xp:label
value="Lokation:"
id="liniendokLokation_Label1"
for="liniendokLokation1"
>
</xp:label>
</xp:td>
<xp:td>
<xp:inputText
value="#{document1.liniendokLokation}"
id="liniendokLokation1"
>
</xp:inputText>
</xp:td>
</xp:tr>
<xp:tr>
<xp:td>
<xp:label
value="Maschinennummer:"
id="liniendokMaschinennummer_Label1"
for="liniendokMaschinennummer1"
>
</xp:label>
</xp:td>
<xp:td>
<xp:inputText
value="#{document1.liniendokMaschinennummer}"
id="liniendokMaschinennummer1"
>
</xp:inputText>
</xp:td>
</xp:tr>
<xp:tr>
<xp:td>
<xp:label
value="Kommentar"
id="label1"
>
</xp:label>
</xp:td>
<xp:td>
</xp:td>
</xp:tr>
<xp:tr>
<xp:td>
<xp:label
id="label2"
value="Anhänge"
>
</xp:label>
</xp:td>
<xp:td>
<xp:fileUpload
id="fileUpload1"
value="#{document1.liniendokBody}"
>
</xp:fileUpload>
</xp:td>
</xp:tr>
<xp:tr>
<xp:td></xp:td>
<xp:td>
<xp:fileDownload
rows="30"
id="fileDownload1"
displayLastModified="false"
value="#{document1.liniendokBody}"
>
</xp:fileDownload>
</xp:td>
</xp:tr>
<xp:tr>
<xp:td
colspan="2"
styleClass="Bereich"
>
zugeordn
<xp:span styleClass="Bereich"></xp:span>
etes Inventar
</xp:td>
</xp:tr>
<xp:tr>
<xp:td></xp:td>
<xp:td></xp:td>
</xp:tr>
<xp:tr>
<xp:td colspan="2"><xp:this.rendered><![CDATA[#{javascript:getComponent("freeze1").getValue() == "1"}]]></xp:this.rendered>
<xp:label
id="label3" styleClass="hinweis">
<xp:this.value><![CDATA[Dieses Liniendokument wurde "gefreezed" - deshalb können keine Maschinen hinzugefügt oder entfernt werden!]]></xp:this.value></xp:label></xp:td>
</xp:tr>
<xp:tr>
<xp:td colspan="2">
<xp:panel id="addRemovePanel">
<xp:this.rendered><![CDATA[#{javascript:getComponent("freeze1").getValue() != "1"}]]></xp:this.rendered>
<xp:button
value="Maschine hinzufügen"
id="button5"
>
<xp:eventHandler
event="onclick"
submit="false"
id="eventHandler6">
<xp:this.script><![CDATA[XSP.openDialog('#{id:inPlaceDialog1}')]]></xp:this.script>
</xp:eventHandler>
</xp:button>
   
<xp:button
value="Maschine entfernen"
id="button6"
>
<xp:eventHandler
event="onclick"
submit="true"
refreshMode="complete"
id="eventHandler7"
>
<xp:this.action><![CDATA[#{javascript:var ansicht = getComponent("viewPanelEmbedded");
var docIDArray = ansicht.getSelectedIds();
for (i=0; i < docIDArray.length; i++) {
var docId = docIDArray[i];
print("schreibe die UNID des Liniendoks ins Inventar-Dok: " + docId)
var doc = database.getDocumentByID(docId);
doc.replaceItemValue("linieUNID", "");
if (doc.save()) {
print("Speichern erfolgreich!")
} else {
print("Fehler beim Speichern!")
}
}}]]></xp:this.action>
</xp:eventHandler>
</xp:button>
</xp:panel>
<xe:dialog id="inPlaceDialog1">
<xe:this.title><![CDATA[Wählen Sie die hinzuzufügenden Maschinen und klicken Sie auf "OK"]]></xe:this.title>
<xc:ccInventarPicker></xc:ccInventarPicker>
</xe:dialog>
<xp:br id="br1"></xp:br>
</xp:td>
</xp:tr>
<xp:tr>
<xp:td colspan="2">
<xp:panel>
<xp:viewPanel
rows="30"
id="viewPanelEmbedded"
>
<xp:this.facets>
<xp:pager
partialRefresh="true"
layout="Previous Group Next"
xp:key="headerPager"
id="pager1"
>
</xp:pager>
</xp:this.facets>
<xp:this.data>
<xp:dominoView
var="view1"
viewName="helperViewLiniendokInventar"
categoryFilter="#{javascript:document1.getDocument().getUniversalID()}"
>
</xp:dominoView>
</xp:this.data>
<xp:viewColumn
columnName="linieUNID"
id="viewColumn1"
style="width:150px"
displayAs="hidden"
rendered="false"
>
<xp:viewColumnHeader
value="Linie u n i d"
id="viewColumnHeader1"
rendered="false"
>
</xp:viewColumnHeader>
</xp:viewColumn>
<xp:viewColumn
id="viewColumn4"
columnName="$2"
displayAs="hidden"
>
<xp:this.facets>
<xp:viewColumnHeader
xp:key="header"
id="viewColumnHeader4"
value="$2"
rendered="false"
>
</xp:viewColumnHeader>
</xp:this.facets>
</xp:viewColumn>
<xp:viewColumn
columnName="InventarTyp"
id="viewColumn2"
style="width:200px"
showCheckbox="true"
>
<xp:viewColumnHeader
value="Inventar typ"
id="viewColumnHeader2"
sortable="true"
>
</xp:viewColumnHeader>
</xp:viewColumn>
<xp:viewColumn
columnName="Bezeichnung"
id="viewColumn3"
style="width:200px"
>
<xp:viewColumnHeader
value="Bezeichnung"
id="viewColumnHeader3"
>
</xp:viewColumnHeader>
</xp:viewColumn>
<xp:viewColumn
id="viewColumn5"
columnName="spezMaxLP"
>
<xp:this.facets>
<xp:viewColumnHeader
xp:key="header"
id="viewColumnHeader5"
value="Max l p"
>
</xp:viewColumnHeader>
</xp:this.facets>
</xp:viewColumn>
<xp:viewColumn
id="viewColumn6"
columnName="spezBauformMin"
>
<xp:this.facets>
<xp:viewColumnHeader
xp:key="header"
id="viewColumnHeader6"
value="Min. bauform"
>
</xp:viewColumnHeader>
</xp:this.facets>
</xp:viewColumn>
<xp:viewColumn
id="viewColumn7"
columnName="spezBauformMax"
>
<xp:this.facets>
<xp:viewColumnHeader
xp:key="header"
id="viewColumnHeader7"
value="Max. bauform"
>
</xp:viewColumnHeader>
</xp:this.facets>
</xp:viewColumn>
<xp:viewColumn
id="viewColumn8"
columnName="spezMaxBauteilhoehe"
>
<xp:this.facets>
<xp:viewColumnHeader
xp:key="header"
id="viewColumnHeader8"
value="Max. bauteilhöhe"
>
</xp:viewColumnHeader>
</xp:this.facets>
</xp:viewColumn>
<xp:viewColumn
id="viewColumn9"
columnName="spezMinPitch"
>
<xp:this.facets>
<xp:viewColumnHeader
xp:key="header"
id="viewColumnHeader9"
value="Min. pitch"
>
</xp:viewColumnHeader>
</xp:this.facets>
</xp:viewColumn>
</xp:viewPanel>
</xp:panel>
</xp:td>
</xp:tr>
<xp:tr>
<xp:td></xp:td>
<xp:td></xp:td>
</xp:tr>
</xp:table>
</xp:view>
Das Problem liegt in diesem Fall daran, das die Funktion noch nicht geladen d.h. im Sourcecode des Browsers vorhanden ist.
Erst mit dem Aufruf von "show" wird ein Partial Refresh ausgelöst, der den Code dann nachlädt. Daher die Fehlermeldung.
Bitte entferne den Scriptblock mit der "refreshSelectedDoc"-Funktion aus Deinem Dialog und füge diesen auf der XPage ein.
Der Code müsste dann in etwa so aussehen:
<xe:dialog id="inPlaceDialog1">
<xe:this.title><![CDATA[Wählen Sie die hinzuzufügenden Maschinen und klicken Sie auf "OK"]]></xe:this.title>
<xe:this.onShow><![CDATA[selDocs = new Array();]]></xe:this.onShow>
<xe:this.onHide><![CDATA[selDocs = new Array();]]></xe:this.onHide>
<xc:ccInventarPicker></xc:ccInventarPicker>
</xe:dialog>
<xp:scriptBlock id="scriptBlockViewPanelHelper">
<xp:this.value>
<![CDATA[
var selDocs = new Array();
function rebuildDocSelection(){
for( e in selDocs ){
try{
dojo.byId( e ).checked = selDocs[e];
}catch(e){}
}
}
]]>
</xp:this.value>
</xp:scriptBlock>
Im onShow und onHide-Event wird der Array für die gemerkten DocIds sicherheitshalber jedesmal gelöscht.
P.S.
Das mit den selectedIds wird nicht funktionieren. Hier müssen die Daten noch zum Server gepusht werden.