You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by we...@apache.org on 2023/06/27 18:00:34 UTC

[myfaces] branch main updated: https://issues.apache.org/jira/browse/MYFACES-4610

This is an automated email from the ASF dual-hosted git repository.

werpu pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/myfaces.git


The following commit(s) were added to refs/heads/main by this push:
     new e8d23c257 https://issues.apache.org/jira/browse/MYFACES-4610
     new c904cbde6 Merge pull request #592 from werpu/main
e8d23c257 is described below

commit e8d23c257b264fc2758ff76d03581fe2a30a3399
Author: Werner Punz <we...@gmail.com>
AuthorDate: Tue Jun 27 19:49:19 2023 +0200

    https://issues.apache.org/jira/browse/MYFACES-4610
    
    Fix for virtual issuing elements
    
    https://issues.apache.org/jira/browse/MYFACES-4605
    
    Fix for unique identifier number should start at 1
---
 api/src/client/package-lock.json                   | 14 +++----
 api/src/client/package.json                        |  2 +-
 .../faces/impl/util/HiddenInputBuilder.ts          |  4 +-
 .../typescript/faces/impl/xhrCore/XhrRequest.ts    | 10 +++--
 .../frameworkBase/_ext/shared/StandardInits.ts     | 22 +++++++++++
 .../faces/test/xhrCore/RequestTest.spec.ts         | 45 ++++++++++++++++++++++
 .../faces/test/xhrCore/ResponseTest.spec.ts        |  6 +--
 7 files changed, 86 insertions(+), 17 deletions(-)

diff --git a/api/src/client/package-lock.json b/api/src/client/package-lock.json
index 90fdf9bb9..197afef55 100644
--- a/api/src/client/package-lock.json
+++ b/api/src/client/package-lock.json
@@ -22,7 +22,7 @@
         "html-webpack-plugin": "^5.5.1",
         "jsdom": "^21.1.1",
         "jsdom-global": "^3.0.2",
-        "jsf.js_next_gen": "4.0.2-beta.1",
+        "jsf.js_next_gen": "4.0.2-beta.3",
         "mocha": "^10.2.0",
         "npm-check-updates": "^16.10.8",
         "nyc": "^15.1.0",
@@ -4990,9 +4990,9 @@
       }
     },
     "node_modules/jsf.js_next_gen": {
-      "version": "4.0.2-beta.1",
-      "resolved": "https://registry.npmjs.org/jsf.js_next_gen/-/jsf.js_next_gen-4.0.2-beta.1.tgz",
-      "integrity": "sha512-rzrvgZpIwRaW2WqsAKZppYMhdRSuxHkapWWUR+k15eapKXtYh6MWpCS0lvA38fZWKUGcTnDzWpvtZxdhNCAdHg==",
+      "version": "4.0.2-beta.3",
+      "resolved": "https://registry.npmjs.org/jsf.js_next_gen/-/jsf.js_next_gen-4.0.2-beta.3.tgz",
+      "integrity": "sha512-rqDExkH732v8mSTAZeKsIo7EWYCcz2huI8OpJDP3uYFiJTRhRAHY3cQmCPwwwrNrek2zEqosw4kk6eDtjfspEw==",
       "dev": true,
       "dependencies": {
         "mona-dish": "0.28.10"
@@ -13831,9 +13831,9 @@
       "dev": true
     },
     "jsf.js_next_gen": {
-      "version": "4.0.2-beta.1",
-      "resolved": "https://registry.npmjs.org/jsf.js_next_gen/-/jsf.js_next_gen-4.0.2-beta.1.tgz",
-      "integrity": "sha512-rzrvgZpIwRaW2WqsAKZppYMhdRSuxHkapWWUR+k15eapKXtYh6MWpCS0lvA38fZWKUGcTnDzWpvtZxdhNCAdHg==",
+      "version": "4.0.2-beta.3",
+      "resolved": "https://registry.npmjs.org/jsf.js_next_gen/-/jsf.js_next_gen-4.0.2-beta.3.tgz",
+      "integrity": "sha512-rqDExkH732v8mSTAZeKsIo7EWYCcz2huI8OpJDP3uYFiJTRhRAHY3cQmCPwwwrNrek2zEqosw4kk6eDtjfspEw==",
       "dev": true,
       "requires": {
         "mona-dish": "0.28.10"
diff --git a/api/src/client/package.json b/api/src/client/package.json
index ef10a2886..49f27aa6e 100644
--- a/api/src/client/package.json
+++ b/api/src/client/package.json
@@ -24,7 +24,7 @@
     "html-webpack-plugin": "^5.5.1",
     "jsdom": "^21.1.1",
     "jsdom-global": "^3.0.2",
-    "jsf.js_next_gen": "4.0.2-beta.1",
+    "jsf.js_next_gen": "4.0.2-beta.3",
     "mocha": "^10.2.0",
     "npm-check-updates": "^16.10.8",
     "nyc": "^15.1.0",
diff --git a/api/src/client/typescript/faces/impl/util/HiddenInputBuilder.ts b/api/src/client/typescript/faces/impl/util/HiddenInputBuilder.ts
index d2a50a484..ddcec7d64 100644
--- a/api/src/client/typescript/faces/impl/util/HiddenInputBuilder.ts
+++ b/api/src/client/typescript/faces/impl/util/HiddenInputBuilder.ts
@@ -59,7 +59,7 @@ export class HiddenInputBuilder {
 
         let existingStates = DQ$(`[name*='${$nsp(this.name)}']`);
         let cnt = existingStates.asArray.map(state => {
-            let ident: string = state.id.orElse("-1").value;
+            let ident: string = state.id.orElse("0").value;
             ident = ident.substring(ident.lastIndexOf(SEP)+1);
             return parseInt(ident);
         })
@@ -68,7 +68,7 @@ export class HiddenInputBuilder {
             })
             .reduce((item1, item2) => {
                 return Math.max(item1, item2);
-            }, -1);
+            }, 0); //we start with 1 (see cnt++)
         //the maximum  new ident is the current max + 1
         cnt++;
 
diff --git a/api/src/client/typescript/faces/impl/xhrCore/XhrRequest.ts b/api/src/client/typescript/faces/impl/xhrCore/XhrRequest.ts
index 586f71653..25eda21bf 100644
--- a/api/src/client/typescript/faces/impl/xhrCore/XhrRequest.ts
+++ b/api/src/client/typescript/faces/impl/xhrCore/XhrRequest.ts
@@ -152,10 +152,12 @@ export class XhrRequest extends AsyncRunnable<XMLHttpRequest> {
 
             const issuingItemId = this.internalContext.getIf(CTX_PARAM_SRC_CTL_ID).value;
             if(issuingItemId) {
-                const issuingItem = DQ.byId(issuingItemId);
-                const arr = new ExtConfig({});
-                arr.assign(issuingItemId).value = issuingItem.val;
-                formData.shallowMerge(arr, true, true);
+                const itemValue = DQ.byId(issuingItemId).inputValue;
+                if(itemValue.isPresent()) {
+                    const arr = new ExtConfig({});
+                    arr.assign(issuingItemId).value = itemValue.value;
+                    formData.shallowMerge(arr, true, true);
+                }
             }
 
             this.responseContext = requestPassThroughParams.deepCopy;
diff --git a/api/src/client/typescript/faces/test/frameworkBase/_ext/shared/StandardInits.ts b/api/src/client/typescript/faces/test/frameworkBase/_ext/shared/StandardInits.ts
index 65be83c5f..0201909a8 100644
--- a/api/src/client/typescript/faces/test/frameworkBase/_ext/shared/StandardInits.ts
+++ b/api/src/client/typescript/faces/test/frameworkBase/_ext/shared/StandardInits.ts
@@ -273,6 +273,23 @@ export module StandardInits {
 </html>`;
 
 
+    const VIRTUAL_ELEMENT = `<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Title</title>
+</head>
+<body>
+<form id="jd_0:blarg">
+    <tobago-multi-select id="page:numbers">
+        <input type="checkbox" name="page:numbers" id="page:numbers:1" value="1"></input>
+        <input type="checkbox" name="page:numbers" id="page:numbers:2" value="2"></input>
+        <input type="checkbox" name="page:numbers" id="page:numbers:3" value="3"></input>
+    </tobago-multi-select>
+</form>
+</body>
+</html>`;
+
 
     /**
      * a page simulating basically a simple faces form
@@ -499,6 +516,11 @@ function triggerRequestChain(event) {
     export function defaultMyFacesNamespaces(withJsf = true): Promise<() => void> {
         return init(HTML_FORM_NAMESPACED, withJsf);
     }
+
+    export function initVirtualElement(withJsf = true): Promise<() => void> {
+        return init(VIRTUAL_ELEMENT, withJsf);
+    }
+
     export function defaultMyFaces23(withJsf = true): Promise<() => void> {
         return init(HTML_FORM_DEFAULT.replace(/jakarta/gi, "javax"), withJsf, false);
     }
diff --git a/api/src/client/typescript/faces/test/xhrCore/RequestTest.spec.ts b/api/src/client/typescript/faces/test/xhrCore/RequestTest.spec.ts
index 1420eb883..b2b1a594b 100644
--- a/api/src/client/typescript/faces/test/xhrCore/RequestTest.spec.ts
+++ b/api/src/client/typescript/faces/test/xhrCore/RequestTest.spec.ts
@@ -30,7 +30,9 @@ import {
     SUCCESS
 } from "../../impl/core/Const";
 import defaultMyFaces = StandardInits.defaultMyFaces;
+import initVirtualElement = StandardInits.initVirtualElement;
 import STD_XML = StandardInits.STD_XML;
+import exp from "constants";
 
 declare var faces: any;
 declare var Implementation: any;
@@ -638,6 +640,49 @@ describe('Tests after core when it hits response', function () {
         done();
     });
 
+    it("must handle the virtual issuing elements correctly", function() {
+
+        const waitForResult = initVirtualElement();
+        return waitForResult.then((close) => {
+            const send = sinon.spy(XMLHttpRequest.prototype, "send");
+
+            try {
+                let dqElem = DomQuery.byId("page:numbers");
+                let element = dqElem.getAsElem(0).value;
+                dqElem.querySelectorAll("input").click();
+
+                faces.ajax.request(element, null, {
+                    execute: "page:numbers",
+                    render: "@form",
+                    params: {
+                        pass1: "pass1",
+                        pass2: "pass2"
+                    }
+                });
+
+                let argsVal: any = send.args[0][0];
+                let arsArr = argsVal.split("&");
+                let resultsMap = {};
+                let doubles = 0;
+                for (let val of arsArr) {
+                    let keyVal = val.split("=");
+                    if(!!resultsMap[keyVal[0]]) {
+                        doubles++;
+                    }
+                    resultsMap[keyVal[0]] = keyVal[1];
+                }
+
+                expect(doubles).to.eq(2);
+
+            } finally {
+
+                send.restore();
+            }
+
+            return true;
+        });
+
+    });
 
 });
 
diff --git a/api/src/client/typescript/faces/test/xhrCore/ResponseTest.spec.ts b/api/src/client/typescript/faces/test/xhrCore/ResponseTest.spec.ts
index 8a9c733df..0ff9f8fb4 100644
--- a/api/src/client/typescript/faces/test/xhrCore/ResponseTest.spec.ts
+++ b/api/src/client/typescript/faces/test/xhrCore/ResponseTest.spec.ts
@@ -723,9 +723,9 @@ describe('Tests of the various aspects of the response protocol functionality',
         expect(DQ$("#form2 [name*='jakarta.faces.ViewState']").val).to.eq("booga_after_update");
         expect(DQ$("#form3 [name*='jakarta.faces.ViewState']").val).to.eq("booga_after_update");
 
-        expect(DQ$("#form1 [name*='jakarta.faces.ViewState']").id.value.indexOf("viewroot_1:jakarta.faces.ViewState:0") === 0).to.be.true;
-        expect(DQ$("#form2 [name*='jakarta.faces.ViewState']").id.value.indexOf("viewroot_1:jakarta.faces.ViewState:1") === 0).to.be.true;
-        expect(DQ$("#form3 [name*='jakarta.faces.ViewState']").id.value.indexOf("viewroot_1:jakarta.faces.ViewState:2") === 0).to.be.true;
+        expect(DQ$("#form1 [name*='jakarta.faces.ViewState']").id.value.indexOf("viewroot_1:jakarta.faces.ViewState:1") === 0).to.be.true;
+        expect(DQ$("#form2 [name*='jakarta.faces.ViewState']").id.value.indexOf("viewroot_1:jakarta.faces.ViewState:2") === 0).to.be.true;
+        expect(DQ$("#form3 [name*='jakarta.faces.ViewState']").id.value.indexOf("viewroot_1:jakarta.faces.ViewState:3") === 0).to.be.true;
 
         done();
     });