Xpages display attachment in dialog box from another document

665 views Asked by At

I am opening a dialog box in an Xpage. In the dialog box I am displaying some fields from 3 other documents, and allowing the user to save some notes. All of this works, except I want to display attachments if there are any. I entered a file download control and for the data source pointed to the target document and did a

tmpDoc.getAttachment("attachments")

to get the attachments. But nothing shows up.

Here is the code from the one row in the table in the dialog box.

The other fields work fine, and I know I am getting the tmpDoc, but how do I display the attachment so the user can view it?

<xp:td>
    <xp:fileDownload
        rows="30"
        id="fileDownload1"
        displayLastModified="false">
        <xp:this.value><![CDATA[#{javascript:
            var prtUNID:String = document.getItemValueString("PCTaskParentID");
            var tmpView:NotesView = database.getView("(dbAllPCTasksByTaskID)");
            var tmpDoc:NotesDocument = tmpView.getDocumentByKey(prtUNID);
            tmpDoc.getAttachment("attachments")
        }]]></xp:this.value>
    </xp:fileDownload>
</xp:td>

I am having more issues with this. Now it does not really work at all.

Here is what I am trying to accomplish.

I have a form PC Build. It is all the tasks that must be done to build a PC in my company. There is a list of Master Tasks called PC Tasks. When a new PC Build is saved, the PC Tasks get copied to rspPCTask forms attached to the PC Build.

As a user works om building a computer they can open up the PC Build and see the individual tasks. I want them to be able to click on a task and pull up the notes and attachments from the master task, while entering notes for the individual task.

Below is a screen shot. In the second field I am grabbing something with javascript. In the first field I am binding the field to the data source, but it is always blank. I cannot figure out why.

enter image description here

I have put in all my code below. Any assistance would be greatly appreciated!!!

<?xml version="1.0" encoding="UTF-8"?>
<xp:view
    xmlns:xp="http://www.ibm.com/xsp/core"
    xmlns:xe="http://www.ibm.com/xsp/coreex"
    xmlns:xc="http://www.ibm.com/xsp/custom"
    dojoForm="true"
    dojoParseOnLoad="true"
    dojoTheme="true">
    <xp:this.data>
        <xp:dominoDocument
            var="document1"
            action="openDocument"
            computeWithForm="onsave"
            formName="PCBuild">
            <xp:this.postNewDocument>
                <xp:actionGroup>
                    <xp:setValue
                        binding="#{document1.ID}"
                        value="#{javascript:session.evaluate('@Unique')}" />
                    <xp:setValue
                        binding="#{document1.crtDte}"
                        value="#{javascript:session.evaluate('@Today')}" />
                    <xp:setValue
                        binding="#{document1.crtUsr}"
                        value="#{javascript:session.getCommonUserName()}" />
                </xp:actionGroup>
            </xp:this.postNewDocument>
        </xp:dominoDocument>
    </xp:this.data>
    <xp:this.resources>
        <xp:styleSheet
            href="/custom.css" />
        <xp:script
            src="/xpValidationPCBuild.jss"
            clientSide="false" />
        <xp:script
            src="/xpUtilities.jss"
            clientSide="false"></xp:script>
        <xp:styleSheet
            href="/.ibmxspres/dojoroot/dojox/grid/resources/tundraGrid.css">
        </xp:styleSheet>
        <xp:styleSheet
            href="/.ibmxspres/dojoroot/dojox/grid/resources/tundraEnhancedGrid.css">
        </xp:styleSheet>
        <xp:dojoModule
            name="dojox.grid.EnhancedGrid"></xp:dojoModule>
    </xp:this.resources>
    <xp:this.beforePageLoad><![CDATA[#{javascript:viewScope.ID = document1.getItemValueString("ID")}]]></xp:this.beforePageLoad>
    <xp:this.afterPageLoad><![CDATA[#{javascript:viewScope.put("rows","25")}]]></xp:this.afterPageLoad>
    <xp:panel
        style="width:900.00px">
        <xp:panel>
            <xp:text
                escape="true"
                id="dspDocUNID"
                style="display:none">
                <xp:this.value><![CDATA[#{javascript:if (@IsNewDoc()) 
{
return "0"
}
else
{
var doc:NotesDocument = document1.getDocument();
var sUNID = doc.getUniversalID();
return sUNID
}}]]></xp:this.value>
            </xp:text>
            <xp:scriptBlock
                id="scriptBlock1">
                <xp:this.value><![CDATA[// Conditionally return an image tag to display an icon in a cell
function displayIcon (value) {

  var image = '';
 switch (value.toLowerCase()) {
    case "open":
      image = '<img alt="" src="blueUncheckedCheckBox15.png" />';
      break;
     case "closed":
      image = '<img alt="" src="blueCheckedCheckBox15.png" />';
      break;
    default:
      image = '<img alt="" src="greenChk50.png" />';
      break;
  }
  return image;
}]]></xp:this.value>
            </xp:scriptBlock>
        </xp:panel>
        <xe:widgetContainer
            id="widgetContainerHeader">
            <xp:panel
                style="padding-top:8.0px;padding-bottom:8.0px">
                <xp:button
                    id="button1"
                    value="Edit"
                    style="font-weight:bold;font-size:10pt"
                    rendered="#{javascript:!(document1.isEditable())}">
                    <xp:eventHandler
                        event="onclick"
                        submit="true"
                        refreshMode="complete">
                        <xp:this.action>
                            <xp:changeDocumentMode
                                mode="edit" />
                        </xp:this.action>
                    </xp:eventHandler>
                </xp:button>
                <xp:button
                    value="Save"
                    id="button3"
                    style="font-weight:bold;font-size:10pt"
                    rendered="#{javascript:(document1.isEditable())}">
                    <xp:eventHandler
                        event="onclick"
                        submit="true"
                        refreshMode="partial"
                        refreshId="plContainer">
                        <xp:this.action>
                            <xp:actionGroup
                                condition="#{javascript:validateForm()}">
                                <xp:saveDocument
                                    var="document1"></xp:saveDocument>
                                <xp:executeScript>
                                    <xp:this.script><![CDATA[#{javascript://Get handle on current doc and see if it is a new doc
var thisDoc:NotesDocument = document1.getDocument();
var tg = thisDoc.getItemValueString("tasksGenerated");

if (tg != "Y") {

//Set flag to Y and save document
thisDoc.replaceItemValue("tasksGenerated","Y")
thisDoc.save(true)

var rspDoc:NotesDocument;

//Loop through all PC Task Docs

var pcTasksView:NotesView = database.getView("(dbAllPCTasks)");
var pcTaskDoc:NotesDocument = pcTasksView.getFirstDocument();
var tmpDoc:NotesDocument;
while (pcTaskDoc != null)
{
//Make new doc and add as response to this doc
rspDoc = database.createDocument();
rspDoc.replaceItemValue("Form","rspPCTask");
rspDoc.replaceItemValue("category",pcTaskDoc.getItemValueString("category"));
rspDoc.replaceItemValue("title",pcTaskDoc.getItemValueString("title"));
rspDoc.replaceItemValue("status","Open");
rspDoc.replaceItemValue("PCBuildParentID",thisDoc.getItemValueString("ID"));
rspDoc.replaceItemValue("PCTaskParentID",pcTaskDoc.getItemValueString("ID"));
rspDoc.replaceItemValue("PCTaskParentUNID",pcTaskDoc.getUniversalID());
rspDoc.replaceItemValue("order",pcTaskDoc.getItemValueInteger("order"));
rspDoc.save();

tmpDoc = pcTasksView.getNextDocument(pcTaskDoc);
pcTaskDoc.recycle();
pcTaskDoc = tmpDoc;
}
}}]]></xp:this.script>
                                </xp:executeScript>
                                <xp:openPage
                                    name="$$PreviousPage"></xp:openPage>
                            </xp:actionGroup>
                        </xp:this.action>
                    </xp:eventHandler>
                </xp:button>
                <xp:button
                    id="button2"
                    style="font-weight:bold;font-size:10pt"
                    value="Close">
                    <xp:eventHandler
                        event="onclick"
                        submit="true"
                        refreshMode="norefresh">
                        <xp:this.action>
                            <xp:openPage
                                name="$$PreviousPage"
                                target="openDocument" />
                        </xp:this.action>
                    </xp:eventHandler>
                </xp:button>
                <xp:text
                    escape="true"
                    id="computedField3"
                    style="font-size:14pt;color:rgb(79,79,79);padding-left:px;padding-bottom:px;margin-bottom:px;padding-right:25.0px">
                    <xp:this.value><![CDATA[#{javascript:document1.getItemValueString("crtDte")}]]></xp:this.value>
                </xp:text>
            </xp:panel>
        </xe:widgetContainer>
        <xp:panel
            id="plContainer">
            <xp:panel>
                <xe:widgetContainer
                    id="widgetContainerData">
                    <xe:formTable
                        id="frLocationMaster"
                        disableErrorSummary="true"
                        disableRowError="true">
                        <xp:this.facets>
                        </xp:this.facets>
                        <xe:formRow
                            id="formRow5"
                            labelPosition="none"
                            style="padding-bottom:10.0px">
                            <xp:table
                                style="width:99%"
                                border="0"
                                cellpadding="0"
                                role="presentation"
                                cellspacing="0"
                                id="table4">
                                <xp:tr>
                                    <xp:td
                                        style="width:80.0px;min-width:120px">
                                        <xp:text
                                            id="cfTitle"
                                            xp:key="header"
                                            style="font-size:14pt;color:rgb(79,79,79);padding-left:px;padding-bottom:px;margin-bottom:px">
                                            <xp:this.value><![CDATA[#{javascript:"PC Build"}]]></xp:this.value>
                                        </xp:text>
                                    </xp:td>
                                    <xp:td
                                        style="width:250.0px">
                                    </xp:td>
                                    <xp:td
                                        style="text-align:right">
                                        <xp:text
                                            escape="true"
                                            id="computedField1"
                                            style="font-size:14pt;color:rgb(79,79,79);padding-left:25.0px;padding-bottom:px;margin-bottom:px">
                                            <xp:this.value><![CDATA[#{javascript:document1.getItemValueString("crtUsr") + " on "}]]></xp:this.value>
                                            <xp:this.rendered><![CDATA[#{javascript:if (@IsNewDoc() == 1) {
return false
} else {
return true;
}}]]></xp:this.rendered>
                                        </xp:text>
                                        <xp:text
                                            escape="true"
                                            id="computedField2"
                                            style="font-size:14pt;color:rgb(79,79,79);padding-left:px;padding-bottom:px;margin-bottom:px;padding-right:px"
                                            value="#{document1.CrtDte}">
                                            <xp:this.converter>
                                                <xp:convertDateTime
                                                    type="both"
                                                    timeStyle="short" />
                                            </xp:this.converter>
                                            <xp:this.rendered><![CDATA[#{javascript:if (@IsNewDoc() == 1) {
return false
} else {
return true;
}}]]></xp:this.rendered>
                                        </xp:text>
                                    </xp:td>
                                </xp:tr>
                            </xp:table>
                        </xe:formRow>
                        <xe:formRow
                            id="formRow1"
                            labelPosition="none">
                            <xp:table
                                style="width:99%"
                                border="0"
                                cellpadding="0"
                                role="presentation"
                                cellspacing="0"
                                id="table3">
                                <xp:tr>
                                    <xp:td
                                        style="width:10%;min-width:120px;">
                                        <xp:label
                                            id="label4"
                                            for="formRow1"
                                            value="Employee Name" />
                                    </xp:td>
                                    <xp:td
                                        style="width:100px">
                                        <xp:inputText
                                            value="#{document1.employeeName}"
                                            id="employeeName1">
                                            <xp:typeAhead
                                                mode="full"
                                                minChars="1"
                                                valueListSeparator=","
                                                ignoreCase="true"
                                                id="typeAhead1">
                                                <xp:this.valueList><![CDATA[#{javascript:var dbname = new Array(@Subset(@DbName(), 1),"names.nsf");
return @DbColumn(dbname,"($PeopleByName)",1);}]]></xp:this.valueList>
                                            </xp:typeAhead>
                                        </xp:inputText>
                                    </xp:td>
                                    <xp:td
                                        style="width:20px">
                                        <xe:valuePicker
                                            id="valuePicker1"
                                            for="employeeName1"
                                            pickerIcon="/picker.png"
                                            dialogTitle="Choose Employee">
                                            <xe:this.dataProvider>
                                                <xe:simpleValuePicker>
                                                    <xe:this.valueList><![CDATA[#{javascript:var db:NotesDatabase = session.getDatabase(database.getServer(),"names.nsf");
var viewHandle:NotesView = db.getView("($PeopleByName)");
return viewHandle.getColumnValues(0)


}]]></xe:this.valueList>
                                                </xe:simpleValuePicker>
                                            </xe:this.dataProvider>
                                        </xe:valuePicker>
                                    </xp:td>
                                    <xp:td>
                                        <xp:message
                                            id="message1"
                                            for="employeeName1" />
                                    </xp:td>
                                </xp:tr>
                            </xp:table>
                        </xe:formRow>
                        <xe:formRow
                            id="formRow2"
                            labelPosition="none">
                            <xp:table
                                style="width:99%"
                                border="0"
                                cellpadding="0"
                                role="presentation"
                                cellspacing="0"
                                id="table1">
                                <xp:tr>
                                    <xp:td
                                        style="width:10%;min-width:120px;">
                                        <xp:label
                                            id="label1"
                                            for="formRow1"
                                            value="Computer Name" />
                                    </xp:td>
                                    <xp:td
                                        style="width:100px">
                                        <xp:inputText
                                            value="#{document1.computerName}"
                                            id="computerName1">
                                        </xp:inputText>
                                    </xp:td>
                                    <xp:td
                                        style="width:20px">
                                    </xp:td>
                                    <xp:td>
                                        <xp:message
                                            id="message2"
                                            for="computerName1" />
                                    </xp:td>
                                </xp:tr>
                            </xp:table>
                        </xe:formRow>
                        <xe:formRow
                            id="formRow3"
                            labelPosition="none"
                            rendered="false">
                        </xe:formRow>
                        <xe:formRow
                            id="formRow4"
                            labelPosition="none"
                            rendered="false">
                        </xe:formRow>
                    </xe:formTable>
                </xe:widgetContainer>
            </xp:panel>
        </xp:panel>
        <xp:panel>
            <xe:widgetContainer
                id="widgetContainer1">
                <xp:panel>
                    <xp:viewPanel
                        rows="30"
                        id="viewPanel1"
                        var="thisEntry">
                        <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="(dbAllRpPCTasks)">
                                <xp:this.keys><![CDATA[#{javascript:document1.getItemValueString("ID")}]]></xp:this.keys>
                            </xp:dominoView>
                        </xp:this.data>
                        <xp:viewColumn
                            columnName="title"
                            id="viewColumn5"
                            displayAs="link">
                            <xp:viewColumnHeader
                                value="Title"
                                id="viewColumnHeader5">
                            </xp:viewColumnHeader>
                            <xp:eventHandler
                                event="onclick"
                                submit="false"
                                refreshMode="partial"
                                refreshId="panelDig">
                                <xp:this.action><![CDATA[#{javascript:viewScope.UNID = thisEntry.getDocument().getUniversalID();
viewScope.parUNID = thisEntry.getDocument().getItemValueString("PCTaskParentUNID");
getComponent('dialog1').show()}]]></xp:this.action>
                            </xp:eventHandler>
                        </xp:viewColumn>
                    </xp:viewPanel>
                    <xp:panel
                        id="panelDig">
                        <xp:this.data>
                            <xp:dominoDocument
                                var="document2"
                                formName="PCTask"
                                action="editDocument"
                                documentId="#{javascript:viewScope.parUNID}">
                            </xp:dominoDocument>
                            <xp:dominoDocument
                                var="document3"
                                formName="rspPCTask"
                                action="editDocument"
                                documentId="#{javascript:viewScope.parUNID}">
                            </xp:dominoDocument>
                        </xp:this.data>
                        <xe:dialog
                            id="dialog1"
                            style="width:700px;height:600px"
                            refreshOnShow="true">
                            <xp:table>
                                <xp:tr>
                                    <xp:td>
                                        <xp:label
                                            value="Master Title"
                                            id="label2" />
                                    </xp:td>
                                    <xp:td>
                                        <xp:text
                                            escape="true"
                                            id="computedField4"
                                            value="#{document2.title}">
                                        </xp:text>
                                    </xp:td>
                                </xp:tr>
                                <xp:tr>
                                    <xp:td>
                                        <xp:label
                                            value="Master Task Notes"
                                            id="label3" />
                                    </xp:td>
                                    <xp:td>
                                        <xp:text
                                            escape="true"
                                            id="computedField5">
                                            <xp:this.value><![CDATA[#{javascript:var tmpDoc:NotesDocument = database.getDocumentByUNID(viewScope.parUNID)
tmpDoc.getItemValueString("notes")}]]></xp:this.value>
                                        </xp:text>
                                    </xp:td>
                                </xp:tr>
                                <xp:tr>
                                    <xp:td>
                                        <xp:label
                                            value="Master Attachments"
                                            id="label5" />
                                    </xp:td>
                                    <xp:td></xp:td>
                                </xp:tr>
                                <xp:tr>
                                    <xp:td></xp:td>
                                    <xp:td></xp:td>
                                </xp:tr>
                                <xp:tr>
                                    <xp:td>
                                        <xp:label
                                            id="label7"
                                            value="Notes" />
                                    </xp:td>
                                    <xp:td>
                                        <xp:inputTextarea
                                            id="inputTextarea1"
                                            style="width:98.0%;height:100px"
                                            value="#{document3.notes}">
                                        </xp:inputTextarea>
                                    </xp:td>
                                </xp:tr>
                            </xp:table>
                        </xe:dialog>
                    </xp:panel>
                </xp:panel>
            </xe:widgetContainer>
        </xp:panel>
    </xp:panel>
    <xp:eventHandler
        event="onClientLoad"
        submit="true"
        refreshMode="norefresh">
        <xp:this.script><![CDATA[try {
 dojo.byId("#{id:employeeName1}").focus();
} catch (e) { }]]></xp:this.script>
    </xp:eventHandler>
</xp:view>
3

There are 3 answers

2
Knut Herrmann On BEST ANSWER

To show all rich text field's attachments of "another" document in a fileDowndload control:

  • add a panel around your fileDownload control,
  • add a dominoDocument data source to the panel
    set attribute documentId to "another" document's UNID
  • set fileDownload's value to document's rich text field
    (in your case the rich text field is called "attachments")
<xp:td>
    <xp:panel>
        <xp:this.data>
            <xp:dominoDocument
                var="documentPCTaskParent"
                action="openDocument">
                <xp:this.documentId><![CDATA[#{javascript:
                    document.getItemValueString("PCTaskParentID")
                }]]></xp:this.documentId>
            </xp:dominoDocument>
        </xp:this.data>
        <xp:fileDownload
            rows="30"
            id="fileDownload1"
            displayLastModified="false"
            value="#{documentPCTaskParent.attachments}">
        </xp:fileDownload>
    </xp:panel>
</xp:td>

BTW tmpDoc.getAttachment("attachments") you used doesn't return all attachments of rich text field "attachments" but would look for an attachment with the file name "attachments" somewhere in document.

0
Per Henrik Lausten On

Short answer: you can add tmpDoc as a true document data source (using

0
David Leedy On

I would avoid the file download control if possible. What you likely want to do is just build html links or images to the actual files themselves. So it's mostly a matter of figuring out the correct URL to get to it. Typically these are old school "non XPages" URL's... the classic domino stuff.

Everything I know about doing this I learned form this post: http://www.wissel.net/blog/d6plinks/SHWL-86QKNM