xpages文档默认设置为只读加载 - 某些文件在编辑模式下加载

时间:2016-12-05 23:37:12

标签: javascript xpages xpages-ssjs

  • 我正在使用一个视图面板,并允许用户通过"选择"中的复选框选择文档。面板。

  • 文档来源在" view / edit"中定义。面板。

    • 当他们到达最后一个文档时,"查看/编辑"面板消失,"选择"面板出现。

以上所有作品。

  • 我在顶部有导航按钮,可以打开"查看/编辑"面板。如果用户将文档置于编辑模式并决定(无论出于何种原因)他们想要使用导航按钮返回"选择"然后选择一批新文档进行查看或编辑,处于编辑模式的文档是第一个要查看的文档 - 它仍处于编辑模式。

    • 我尝试过使用javascript命令: context.setDocumentMode(" readonly")在许多不同的地方(在计算文档之前,在afterRestoreView中,在导航按钮中)无效。

我希望有一个明显的解决方案。

这是一个代码简化代码片段,用于演示此问题。您只需要插入自己的数据源:>)

    <?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
    >
    <xp:panel id="buttonpanel">
        <xp:button id="button1" value="Choose Docs">
            <xp:eventHandler event="onclick" submit="true"
                refreshMode="partial" refreshId="wrapperpanel">
                <xp:this.action><![CDATA[#{javascript:viewScope.choosepanelvis= true;
viewScope.vieweditpanelvis = false;}]]></xp:this.action>
            </xp:eventHandler>
        </xp:button>
    </xp:panel>
    <xp:panel id="wrapperpanel">
        <xp:panel id="choosepanel" rendered="#{javascript:viewScope.choosepanelvis}">
            <xp:label id="label1"></xp:label>
            <xp:button styleClass="BlueButton" id="button6"
                value="View/Edit Selected Docs">
                <xp:eventHandler event="onclick" submit="true"
                    refreshMode="partial" refreshId="wrapperpanel">
                    <xp:this.action>
                        <xp:actionGroup>
                            <xp:executeScript>
                                <xp:this.script><![CDATA[#{javascript:viewScope.DocIdList = new Array();
var viewPanel = getComponent("viewPanel1");
var docIDList = viewPanel.getSelectedIds();
viewScope.DocIdList = docIDList;
viewScope.DocIdLength = viewScope.DocIdList.length;}]]></xp:this.script>
                            </xp:executeScript>
                            <xp:actionGroup condition="#{javascript:viewScope.DocIdList.length === 0;}">
                                <xp:executeScript>
                                    <xp:this.script><![CDATA[#{javascript:var varAlert = "Please select one or more documents.";
var al = "alert('"+ varAlert +"')";
view.postScript(al);
return false;
}]]></xp:this.script>
                                </xp:executeScript>
                            </xp:actionGroup>
                            <xp:actionGroup>
                                <xp:this.condition><![CDATA[#{javascript:viewScope.DocIdList.length > 0}]]></xp:this.condition>
                                <xp:executeScript>
                                    <xp:this.script><![CDATA[#{javascript:viewScope.DocIdIndex = 0
var DocId=viewScope.DocIdList[viewScope.DocIdIndex];
viewScope.DocId = DocId;

viewScope.choosepanelvis= false;
viewScope.vieweditpanelvis = true;}]]></xp:this.script>
                                </xp:executeScript>
                            </xp:actionGroup>
                        </xp:actionGroup>
                    </xp:this.action>
                </xp:eventHandler>
            </xp:button>
            <xp:viewPanel rows="30" id="viewPanel1">
                <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="NISDTeacher">
                    </xp:dominoView>
                </xp:this.data>
                <xp:viewColumn columnName="CampusName" id="viewColumn1"
                    showCheckbox="true">
                    <xp:viewColumnHeader value="CampusName" id="viewColumnHeader1"
                        showCheckbox="true">
                    </xp:viewColumnHeader>
                </xp:viewColumn>
                <xp:viewColumn columnName="TeacherFirst" id="viewColumn2">
                    <xp:viewColumnHeader value="TeacherFirst" id="viewColumnHeader2">
                    </xp:viewColumnHeader>
                </xp:viewColumn>
                <xp:viewColumn columnName="TeacherLast" id="viewColumn3">
                    <xp:viewColumnHeader value="TeacherLast" id="viewColumnHeader3">
                    </xp:viewColumnHeader>
                </xp:viewColumn>
            </xp:viewPanel>
        </xp:panel>
        <xp:panel id="vieweditpanel" rendered="#{javascript:viewScope.vieweditpanelvis}">
            <xp:this.data>
                <xp:dominoDocument var="document1" action="openDocument"
                    formName="CoopInfo" documentId="#{javascript:viewScope.DocId}"
                    ignoreRequestParams="true">
                </xp:dominoDocument>
            </xp:this.data>
            <xp:text escape="true" id="computedField1" value="#{document1.TeacherFirst}"></xp:text>
            <xp:text escape="true" id="computedField2" value="#{document1.TeacherLast}"></xp:text>
            <xp:text escape="true" id="computedField3" value="#{document1.CampusName}"></xp:text>
            <xp:br></xp:br>
            <xp:inputTextarea id="inputTextarea1" value="#{document1.Comments}"></xp:inputTextarea>
            <xp:button id="button2" styleClass="BlueButton" value="View Next Doc">
                <xp:eventHandler event="onclick" submit="true"
                    refreshMode="partial" id="eventHandler5" refreshId="wrapperpanel">
                    <xp:this.action>
                        <xp:actionGroup>
                            <xp:executeScript script="#{javascript:viewScope.DocIdIndex++;}">
                            </xp:executeScript>
                            <xp:actionGroup>
                                <xp:this.condition><![CDATA[#{javascript:viewScope.DocIdIndex >= viewScope.DocIdLength}]]></xp:this.condition>
                                <xp:executeScript>
                                    <xp:this.script><![CDATA[#{javascript:viewScope.DocIdList = new Array();
viewScope.choosepanelvis= true;
viewScope.vieweditpanelvis = false;}]]></xp:this.script>
                                </xp:executeScript>
                            </xp:actionGroup>
                            <xp:actionGroup>
                                <xp:this.condition><![CDATA[#{javascript:viewScope.DocIdIndex < viewScope.DocIdLength}]]></xp:this.condition>
                                <xp:executeScript>
                                    <xp:this.script><![CDATA[#{javascript:var DocId=viewScope.DocIdList[viewScope.DocIdIndex];
viewScope.DocId = DocId;}]]></xp:this.script>
                                </xp:executeScript>
                            </xp:actionGroup>
                        </xp:actionGroup>
                    </xp:this.action>
                </xp:eventHandler>
            </xp:button>
            <xp:button id="button3" styleClass="BlueButton" value="Edit This Record">
                <xp:this.rendered><![CDATA[#{javascript:if (document1.isEditable()) {
    return false;
} else {
    return true;
}}]]></xp:this.rendered>
                <xp:eventHandler event="onclick" submit="true"
                    refreshMode="partial" id="eventHandler8" refreshId="wrapperpanel">
                    <xp:this.action>
                        <xp:actionGroup>
                            <xp:executeScript>
                                <xp:this.script><![CDATA[#{javascript:context.setDocumentMode("document1","edit");}]]></xp:this.script>
                            </xp:executeScript>
                        </xp:actionGroup>
                    </xp:this.action>
                </xp:eventHandler>
            </xp:button>
            <xp:button id="button11" styleClass="BlueButton"
                value="Save Doc and View Next Record">
                <xp:this.rendered><![CDATA[#{javascript:if (document1.isEditable()) {
    return true;
} else {
    return false;
}}]]></xp:this.rendered>
                <xp:eventHandler event="onclick" submit="true"
                    refreshMode="partial" id="eventHandler7" refreshId="wrapperpanel">
                    <xp:this.script><![CDATA[var choice = null;
var comment = null;

for (var i=0; i<document.forms[0].elements.length; i++) { 
    if (document.forms[0].elements[i].name === "#{id:RadioG2}") { 
        if (document.forms[0].elements[i].checked === true) { 
            choice = document.forms[0].elements[i].value;
        }
    }
}

if (choice === "0") {
    for (var i=0; i<document.forms[0].elements.length; i++) { 
        if (document.forms[0].elements[i].name === "#{id:Comments2}") { 
            comment = document.forms[0].elements[i].value;
        }
    }
}

if (comment === "" && choice === "0") {
    alert("You must enter a comment if you are not going to recommend a teacher.");
    return false;
}


]]></xp:this.script>
                    <xp:this.action>
                        <xp:actionGroup>
                            <xp:executeScript>
                                <xp:this.script><![CDATA[#{javascript:var radioGroup1:com.ibm.xsp.component.xp.XspSelectOneRadio = getComponent("radioGroup1").getValue();
document1.replaceItemValue("RatingNum",radioGroup1);
var inputTextarea1:com.ibm.xsp.component.xp.XspInputTextarea = getComponent("inputTextarea1").getValue();
document1.replaceItemValue("Comments",inputTextarea1);
database.updateFTIndex(false); 
viewScope.DocIdIndex++;
}]]></xp:this.script>
                            </xp:executeScript>
                            <xp:actionGroup>
                                <xp:this.condition><![CDATA[#{javascript:viewScope.DocIdIndex >= viewScope.DocIdLength}]]></xp:this.condition>
                                <xp:executeScript>
                                    <xp:this.script><![CDATA[#{javascript:viewScope.DocIdList = new Array();
viewScope.choosepanelvis= true;
viewScope.vieweditpanelvis = false;}]]></xp:this.script>
                                </xp:executeScript>
                            </xp:actionGroup>
                            <xp:actionGroup>
                                <xp:this.condition><![CDATA[#{javascript:viewScope.DocIdIndex < viewScope.DocIdLength}]]></xp:this.condition>
                                <xp:executeScript>
                                    <xp:this.script><![CDATA[#{javascript:var DocId=viewScope.DocIdList[viewScope.DocIdIndex];
viewScope.DocId = DocId;
}]]></xp:this.script>
                                </xp:executeScript>
                            </xp:actionGroup>
                        </xp:actionGroup>
                    </xp:this.action>
                </xp:eventHandler>
            </xp:button>
            <xp:radioGroup id="radioGroup1" value="#{document1.RatingNum}">
                <xp:selectItem itemLabel="Highly Recommended"
                    itemValue="0">
                </xp:selectItem>
                <xp:selectItem itemLabel="Recommended" itemValue="1"></xp:selectItem>
                <xp:selectItem itemLabel="Not Recommended" itemValue="2"></xp:selectItem>
            </xp:radioGroup>
        </xp:panel>
    </xp:panel>
</xp:view>

2 个答案:

答案 0 :(得分:0)

context.setDocumentMode()将设置最本地XPages dominoDocument的编辑/读取模式。因此,只能在具有要控制其编辑模式的文档的特定行中工作。只要您访问该行之外的组件,它就不再能访问该特定的dominoDocument数据源。同样,从您设置编辑模式的按钮,我认为您也可以使用document1.setEditable(true()切换到编辑模式。但是您无法从外部影响该特定document1数据源的编辑模式。

您可以使用此wiki article中详述的.getData().get()来获取数据源的句柄,其中get()方法中传递的索引是相关的行索引。但是,ViewPanel可能不起作用,因为它是一个重复控件,并且相关数据源仅在行处理并在之后从内存中转储时创建。

可能的替代方法可能是设置viewScope变量,其中包含当前编辑的相关行文档UNID。一旦尝试编辑另一行的文档,然后替换viewScope变量,因此它只有一行。然后在保存代码中交叉引用viewScope变量,如果UNID不匹配则中止。这通常是我在任何类型的重复控件(重复控件,视图面板,数据视图等)中进行编辑时使用的方法。

答案 1 :(得分:0)

我继续使用我为此程序提交的简化代码。该代码定义了4个面板:

  1. 按钮面板(按钮面板)
  2. 包装面板(包装面板) 包装面包含
  3. 一个面板(listpanel),带有一个允许用户使用复选框选择记录的viewpanel。 4一个面板(被观看面板),用于查看所选记录并包含一个允许用户将文档置于编辑模式的按钮。该面板具有数据源定义。 加载程序时,将隐藏listpanel和Vieweditpanel。按钮面板中的按钮使列表面板可见。用户选择文档并单击隐藏列表面板的按钮,并使文档处于读取模式时可见的面板可见。我保存和加载所选文档的所有代码都运行正常 - 除非用户
  4. 将文档置于编辑模式
  5. 立即点击按钮面板中的按钮(隐藏被查看的面板并使列表面板可见)。
  6. 从视图面板中选择他们放置在编辑模式下的同一文档,然后单击隐藏列表面板的按钮,使被浏览的面板可见。
  7. 在这种情况下,文档将以编辑模式打开。

    我通过将以下代码添加到按钮面板中的按钮来解决了这个问题: viewScope.DocIdList = new Array(); viewScope.DocId = null;

    我的调试工作的描述如下 - 但正如我在最后所说,我仍然不确定为什么修复工作。 正如我在原帖中所描述的那样,我尝试将文档放在读取模式中的许多不同的地方,但正如保罗所解释的那样,XSP文档在我的下方发生了变化 - 可以这么说。

    最后,我允许所有面板都可见,并添加了一个计算字段,该字段在被视图面板中显示currentDocument的值。这实际上让我更加困惑,因为 1.我发现从程序加载一开始就在veiweditpanel中定义了一个XSP(currentDocument)文档。它处于编辑模式。没有显示任何信息,因为它与后端文档没有关联 - 我想。 然后我使用listpanel中的viewpanel选择了一个文档,并将其显示在被视图面板中。它将处于阅读模式 2(第二个令人困惑的事情)。当我将它置于编辑模式时,currentDocument会改变。

    很高兴,我按照帖子顶部描述的方式解决了问题。仍然不确定为什么它有效。