来自视图面板列的单击事件的xpages - 从视图中弹出对话框窗体

时间:2014-06-26 05:31:15

标签: xpages xpages-ssjs xpages-extlib

有2个数据源:Cdoc(文档内容)和Pdoc(在对话框内)。

这两个数据源基于Cdoc'UNID链接在一起。

我的主视图面板是这样的:

     [_A_common_field] from Cdoc1 and all Pdocs from Cdoc1 ( this column is categorized )   
        Cdoc1
        Pdoc 1 from Cdoc1
        Pdoc 2 from Cdoc1
     [_A_common_field] from Cdoc2 and all Pdocs from Cdoc2 ( this column is categorized )
        Cdoc2
        Pdoc 1 from Cdoc2

考虑到我希望viewPanel1在对话框中打开(创建时)和Pdoc打开,我如何从Cdoc计算目标属性没有添加target属性的'clasical'模式?

3 个答案:

答案 0 :(得分:1)

此答案假定您尝试从对话框的视图面板中打开所选文档。 (实质上,打开一个对话框,其中包含嵌入视图中列出的文档中的值)

转发
我很可能只是在另一个窗口中打开文档并完成它。但是如果你想在对话框中打开它,那很好。如果您在对话框本身中定义数据源,请注意我个人在过去遇到过此类方法的问题,我认为应该在xpage视图级别定义数据源。

<强>答案
1.不要在视图中允许任何链接 2.视图中有一个复选框 3.添加一个按钮,您将获得所选文档的NoteID,同时确保选择了文档。

var vwpnl = getComponent("homeViewPanel");
        var docIDArray = vwpnl.getSelectedIds();
        if(docIDArray.length != 1){
            view.postScript("alert('"+MessageController.getMessageForCurrentUser("msg_SelectOneDocument") +"')");
            return;
        }
        var firstID = docIDArray.length > 0 ? docIDArray[0] : "";
        return firstID;

(你可以忽略MessageController,因为那是我的语言特定用户消息的助手类之一。)

4在对话框中计算数据源时使用该noteID(无论是否在viewScope中),确保对话框具有正确的设置,如刷新等。

修改

关于在工具箱中保持这种方法(性能除外)的好处在于,一旦掌握了文档本身,就可以计算任何东西。使用noteID只是为了设置对话框属性只是一个例子。您可以创建一个文档对象并使用这些值来做任何你想做的事情,包括打开另一个页面,其他动作,基本上你想要的任何东西。它可能不是您当前用例的最佳选择(您没有真正指定您的用例),但对于未来的读者,它有望成为一种帮助。

答案 1 :(得分:1)

您不需要视图面板目标功能。尝试使用dataView(xe:dataview),其中: [_A_common_field]适用于categorieColumn

Cdoc1用于summaryColumn,系统将为Cdoc创建OpenLink

<xe:dataView id="dataView2" columnTitles="true"
    pageName="/Cdoc_Write.xsp" rowStyleClass="xspHtmlTrView"
    openDocAsReadonly="true" collapsibleDetail="true"
    collapsibleRows="true" var="viewEntry">...

然后创建一个新的customControl(CC)并将其粘贴到Details部分。

进入CC,您需要一个包含3列和重复控制的表。使用xe:repeat,您将创建PDoc到这样的tr:

    <xp:table>

            <xp:repeat rows="30" id="repeatResults" var="resultDoc"
                repeatControls="false" first="0" indexVar="indexResults">
                <xp:this.value><![CDATA[#{javascript:if (viewEntry.isDocument()){
        var strUniqueID = viewEntry.getDocument().getItemValueString("Cdoc'UNID");    
        if(null != strUniqueID & ""!=strUniqueID) {
            var  teamsView = database.getView("All_PDocs4Cdoc");
            return  teamsView.getAllDocumentsByKey(strUniqueID);
            }
        }}]]></xp:this.value>
                <xp:tr>
                       <xp:td >Pdoc[j] from Cdoc[i]</xp:td>
                       <xp:td > modal or tooltip dialog link</xp:td>
                       <xp:td > Dialog - Form</p:td>
                </xp:tr>
        </xp:repeat>
    </xp:table>

第二列是用于将PDoc打开到对话框的链接 - &gt;请参阅XPages扩展库演示/在上下文对话框中。

第3名。 td包含Pdoc的隐藏对话框表单。

第一顺便提一下。 td包含来自Pdoc [j]的值,例如受试者

答案 2 :(得分:1)

根据我对你的问题的理解,这就是我要做的,如果我错了或在这里遗漏任何东西,请纠正我:

<?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">
    <xp:this.data>
        <xp:dominoView var="dominoView" viewName="ADR2"
            search="#{javascript:param.searchValue}" dataCache="full">
        </xp:dominoView>
    </xp:this.data>
<xp:table id="viewPanela" styleClass="xspRepeatTable" cellpadding="0" cellspacing="0" style="width:98%">
<xp:tr styleClass="xspHeaderRow">
        <xp:td style="width:2%"></xp:td>
        <xp:td><xp:label value="Title" id="label1"></xp:label></xp:td>
        <xp:td><xp:label value="Abteilung" id="label3"></xp:label></xp:td>
</xp:tr>
    <xp:repeat id="repeatList" value="#{javascript:dominoView}"
        var="ordnerData" rows="10" indexVar="repeatIndex">
        <xp:tr id="tr1">
            <xp:td><xp:image id="image1" style="width:12px" url="#{javascript:return findImage(ordnerData.getColumnValue('aIcon'));}"></xp:image></xp:td>
            <xp:td>
                <xp:div id="div1">
                    <xp:this.style>
                        <![CDATA[#{javascript:var level = ordnerData.getIndentLevel(); 
                            if(level != null && level > 0){
                                    return "padding-left:" + (level * 10) + "px !important";
                            }else{
                                    return "";
                            }}]]>
                    </xp:this.style>
                    <xp:link id="link1">
                        <xp:this.rendered><![CDATA[#{javascript:ordnerData.getChildCount() > 0}]]></xp:this.rendered>
                        <xp:eventHandler event="onclick" submit="true"
                            refreshMode="partial" refreshId="viewPanela" immediate="true">
                            <xp:this.action><![CDATA[#{javascript:ordnerData.toggleExpanded()}]]></xp:this.action>
                        </xp:eventHandler>
                        <xp:image id="image5" alt="Toggle Row">
                            <xp:this.url><![CDATA[#{javascript:if(ordnerData.isExpanded()){
                                            return("/tree_minus.gif");
                                        }else{
                                            return("/tree_plus.gif");
                                        }}]]></xp:this.url>
                        </xp:image>
                    </xp:link>
                    <xp:text escape="true" id="computedField3">
                        <xp:this.value><![CDATA[#{javascript:return "  " +ordnerData.getColumnValue('$92')}]]></xp:this.value>
                    </xp:text>
                </xp:div>
            </xp:td>
            <xp:td><xp:text escape="true" id="computedField4" value="#{javascript:ordnerData.getColumnValue('$95')}"></xp:text></xp:td>
            <xp:eventHandler event="ondblclick" submit="false">
                <xp:this.script><![CDATA[var docid="#{javascript:ordnerData.getDocument().getUniversalID()}";
var link="";
var typ="#{javascript:ordnerData.getDocument().getItemValueString('aTyp')}";
link='xx_openPageN.xsp?aTyp='+typ+'&action=openDocument&documentId='+docid;
window.open(link,'New','width=1000, height=650, left=250px, top=250px, menubar=no, resizable=0, scrollbars=yes');
]]></xp:this.script>
            </xp:eventHandler>
        </xp:tr>
    </xp:repeat>
<xp:tr styleClass="xspPagerRow">
        <xp:td colspan="4" align="right" style="width:100%">
            <xp:pager xp:key="headerPager" for="repeatList"
                id="pagerTop" partialRefresh="true"
                style="font-weight:inherit;margin-right:0.0px"
                layout="SeparatorPage Status FirstArrow Separator PreviousArrow Separator SeparatorPage Group Separator NextArrow Separator LastArrow">
            </xp:pager>
        </xp:td>
</xp:tr>
</xp:table>
</xp:view>

<强>解释

我有一个简单的dominoView作为viewSource,在你的情况下,它将是一个分类视图,其中Cdoc和Pdoc作为响应文档。要确定当前单击的文档,可以使用一个简单的JavaScript:

if(level != null && level > 0)
    return "Is a PDoc with document id "+ordnerData.getDocument().getUniversalID();
else
    return "Is a CDoc with document id "+ordnerData.getDocument().getUniversalID();

现在,这允许您对不同的文档执行不同的计算。如果您看到我的示例,我只需打开一个新窗口,其中相应的文档处于编辑模式。您可以在此处根据您的要求获得条件(例如,对话框中的PDoc和窗口中的CDoc)。如果有任何不清楚或遗漏,请告诉我。对不起,迟到了。希望这能解决你的问题。