Создать документ Notes с вложением в него. Почему для его сохранения необходимо выполнить полное обновление? - PullRequest
0 голосов
/ 25 ноября 2018

В моем приложении XPages я представляю «форму» с помощью диалогового элемента управления xe :.Форма содержит только элемент управления xp: fileUpload для ввода.

<xp:fileUpload id="ctrlUpload"
    value="#{attachmentBean.uploadedFile}"
    disabled="#{javascript:!compositeData.editable}"
    disableValidators="true">
    <xp:this.attrs>
        <xp:attr name="data-duplicate"
            value="#{matter.attachment_duplicate_warning}" />
        <xp:attr name="data-limit"
            value="#{matter.attachment_file_limit}" />
        <xp:attr name="data-error"
            value="#{matter.attachment_limit_exceed}" />
        <xp:attr name="data-show-preview"
            value="false" />
    </xp:this.attrs>
    <xp:eventHandler event="onchange"
        submit="false">
        <xp:this.script>
            <xp:executeClientScript>
                <xp:this.script><![CDATA[function x$(idTag, param){
idTag=idTag.replace(/:/gi, "\\:")+(param ? param : "");
return($("#"+idTag));
}

//get the file that the user has selected
var fileToBeUploaded = document.getElementById("#{id:ctrlUpload}").value;
var test = '#{javascript:getComponent("ctrlUpload").size}';

var dots = fileToBeUploaded.split(".")
var fileType = dots[dots.length - 1];
//grab the file extension to see if it's approved to be attached to the proposal
fileType = fileType.toLowerCase();

//get the list of approved file extensions - is calculated in a computed field
var computedField = XSP.getElementById("#{id:lu_approvedFileExtensions}");
var listOfApprovedFileExtensions = computedField.innerHTML;

//check if the selected extension is in the approved list
var extensionIsInList = listOfApprovedFileExtensions.indexOf(fileType);
if (extensionIsInList == -1) {
//the selected file extension is not in the list of approved extensions.

alert(listOfApprovedFileExtensions);
XSP.getElementById("#{id:ctrlUpload}").value = "";
x$("#{id:btnSaveFile}").attr('disabled', 'disabled');
return false;
} else {
x$("#{id:btnSaveFile}").attr('disabled', false);
}]]></xp:this.script>
            </xp:executeClientScript>
        </xp:this.script>
    </xp:eventHandler>
</xp:fileUpload>

Данные передаются через внутренний класс, который запускается кнопкой:

<xp:button value="#{matter.attachment_upload}"
    id="btnSaveFile" styleClass="btnSaveFile" disabled="true">
    <i class="fa fa-upload" aria-hidden="true" />
    &#160;
    <xp:eventHandler event="onclick"
        submit="true" refreshMode="complete" execMode="partial"
        execId="pnlFilesBS" disableValidators="true"
        onComplete="$('#myModal').modal('show');">
        <xp:this.action><![CDATA[#{javascript:attachmentBean.save(viewScope.get("principalUnid"),viewScope.get("principalUnid"));
var ref = viewScope.get("principalUnid")
var key = viewScope.get("principalUnid")
attachmentBean.loadList(ref, key);
viewScope.put("attachments" + ref + key, attachmentBean.getAttachments());
facesContext.getViewRoot().postScript("$('#myModal').modal('show');");}]]></xp:this.action>

    </xp:eventHandler>
</xp:button>

Метод сохраненияв моем классе Java есть следующее:

public void save(String parentId, String type) throws NotesException {
    try {
        if (null != uploadedFile) {
            Database db = utils.openDatabase(server, dbPath + dbName);
            if (null != db){
                IUploadedFile iUploadedFile = uploadedFile.getUploadedFile();
                String tempClientFile = iUploadedFile.getClientFileName();
                File tempFile = iUploadedFile.getServerFile();
                String filePath = tempFile.getAbsolutePath();
                File correctedFile = new File(tempFile.getParentFile() + File.separator + tempClientFile);
                tempFile.renameTo(correctedFile);
                boolean success = true;
                if (success) {
                    Document doc = db.createDocument();
                    doc.appendItemValue("Form","fa_Attachment");
                    doc.appendItemValue("parentId", parentId);
                    doc.appendItemValue("type", type);

                    Name origAuthor = utils.getSession().createName(utils.getSession().getEffectiveUserName());

                    Vector<String> vecAuthors = new Vector<String>(4);
                    vecAuthors.add("[Admin]");
                    vecAuthors.add("[SuperAdmin]");
                    vecAuthors.add("[SuperDuper]");
                    vecAuthors.add(origAuthor.getCanonical());

                    TreeSet<String> uniqueAuthors = new TreeSet<String>(vecAuthors);
                    vecAuthors = new Vector<String>(uniqueAuthors);

                    Item authorRole = doc.replaceItemValue("Authors", vecAuthors);
                    authorRole.setAuthors(true);

                    RichTextItem rtFiles = doc.createRichTextItem("files");               
                    rtFiles.embedObject(lotus.domino.EmbeddedObject.EMBED_ATTACHMENT, "", correctedFile.getAbsolutePath(), null);

                    doc.save();

                    MultiGrowlMessages growl = new MultiGrowlMessages();
                    growl.createGrowlMessage("File: " + iUploadedFile.getClientFileName() + " uploaded", "success");

                    rtFiles.recycle();
                    doc.recycle();

                    correctedFile.renameTo(tempFile);

                    uploadedFile = null;
                }               
            }        
        }else{
              MultiGrowlMessages growl = new MultiGrowlMessages();
                growl.createGrowlMessage("you did not select a file", "error");
        }
    } catch (Exception e) {
        OpenLogUtil.logError(e);
    }
 }

Этот код работает хорошо, но я должен установить свойство refreshMode для завершения.В противном случае, кажется, что данные для отправки отсутствуют.

Конечно, при полной отправке диалог будет закрыт, что немного нежелательно, потому что в этом же диалоге я отображаю другие загруженные файлы, соответствующие той же ссылке и, конечно,Мне бы хотелось, чтобы этот список (элемент управления xp: repeat) обновлялся только для того, чтобы вновь добавленный загружаемый документ был включен в этот список.

Кто-то знает, что я делаю неправильно?У меня есть несколько элементов управления загрузкой в ​​моей форме, использующих тот же пользовательский элемент управления, который я отображаю в своем диалоговом окне, чтобы загружать файлы при различных условиях (ссылки).

...