diff --git a/.github/workflows/build-test.yml b/.github/workflows/build-test.yml new file mode 100644 index 00000000..aa41b0f8 --- /dev/null +++ b/.github/workflows/build-test.yml @@ -0,0 +1,24 @@ +name: build-test +run-name: ${{ github.actor }} is testing the viewer build +on: [push] +jobs: + test-viewer-build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: '16' + - run: npm install -g grunt-cli + - run: npm run deploy + - uses: GabrielBB/xvfb-action@v1 + with: + run: npm run test + - uses: "8398a7/action-slack@v3" + with: + status: ${{ job.status }} + fields: "repo,message,commit,author,action,eventName,ref,workflow,job,took,pullRequest" + env: + SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} + if: always() # Pick up events even if the job fails or is canceled. + diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 62c438d1..00000000 --- a/.travis.yml +++ /dev/null @@ -1,22 +0,0 @@ -sudo: false -language: node_js -node_js: - - "16" -env: - - CXX=g++-4.8 -addons: - apt: - sources: - - ubuntu-toolchain-r-test - packages: - - g++-4.8 - - dbus-x11 -before_install: - - "export DISPLAY=:99.0" -services: - - xvfb -install: - - npm install - - npm install -g grunt-cli -script: - - npm test diff --git a/README.md b/README.md index 348ee699..d0285762 100644 --- a/README.md +++ b/README.md @@ -97,7 +97,7 @@ The file viewer.html contains several endpoints to allow data to be be exported `getDataURL` - **\[optional]** the location of where you have previously stored the user's partially completed interview answer data. This is optional and only needed if you are setting up your website to remember the data that a user has entered so far. For example this is useful in cases such as where you let people register at your website and collect information that you can use in all interviews on your website and information that might be common to all interviews (like name, address, etc.). At present, this DOES NOT mean that the user can save the interview at a particular point and then come back to that same point. When they return to the interview later, they must start from the beginning - with the only advantage being that the data they had previously entered is already filled in. -`setDataURL` - **\[optional]** location of where you want to send the data from the interview when the user SENDs or SUBMITs the completed interview. This must be some website-based program that can "catch" the XML data stream that contains the user's answers to your interview in HotDocs .anx format and in an equivalent json format through an http POST. +`setDataURL` - **\[optional]** location of where you want to send the data from the interview when the user SENDs or SUBMITs the completed interview. This must be some website-based program that can "catch" the XML data stream that contains the user's answers to your interview in HotDocs .anx format and in an equivalent json format through an http POST. The xml/anx format can be accessed through the `AnswerKey` field of the body while the json format can be accessed through the `AnswerKeyJSON` field. `exitURL` - **\[optional]** location of where the user's browser is directed if they exit an interview without getting to the end. This is typically because they don't qualify to use the service. This is the DEFAULT URL. Inside the interview, the author can actually point the EXIT button to any URL they want and it will override this value. This URL is used only if the author has not specified a URL inside the interview for any EXIT buttons. diff --git a/demo/viewer/viewer.html b/demo/viewer/viewer.html index 17752e31..28f2610a 100644 --- a/demo/viewer/viewer.html +++ b/demo/viewer/viewer.html @@ -13,8 +13,8 @@ - -
+ +
@@ -53,9 +53,9 @@ diff --git a/index.dev.html b/index.dev.html index 677fdbf6..465cf592 100644 --- a/index.dev.html +++ b/index.dev.html @@ -59,6 +59,6 @@ errRepURL: '' })); - + \ No newline at end of file diff --git a/index.html b/index.html index 9dc748c4..9c795cc3 100644 --- a/index.html +++ b/index.html @@ -59,6 +59,6 @@ errRepURL: '' })); - + \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 13452318..bce8c8d9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,15 +1,15 @@ { "name": "@caliorg/a2jviewer", - "version": "8.1.4", + "version": "8.3.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@caliorg/a2jviewer", - "version": "8.1.4", + "version": "8.3.0", "license": "GNU AGPL v3.0", "dependencies": { - "@caliorg/a2jdeps": "^7.1.5", + "@caliorg/a2jdeps": "^7.1.7", "bit-tabs": "^2.0.0", "blueimp-file-upload": "^9.10.1", "bootstrap": "^3.4.1", @@ -1635,9 +1635,9 @@ } }, "node_modules/@caliorg/a2jdeps": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/@caliorg/a2jdeps/-/a2jdeps-7.1.5.tgz", - "integrity": "sha512-bBcgtmi+1rsL9MXb6WVLspOJPTPtEoMLi00t3r26hfcgHgmD0FdTj5LZJd6hnObxiKhi5SEjXlUfbrtDulfG5g==", + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/@caliorg/a2jdeps/-/a2jdeps-7.1.7.tgz", + "integrity": "sha512-9g2GEJEgAOm0q8QM2mVrHCIzlfKZTJ6qkw/TGETzNIsnL8TVQtaILI56dD2PQq8Q77L6WEBvFD2ujaY2T1QkPw==", "dependencies": { "bootstrap": "^3.4.1", "can-component": "^4.6.3", @@ -1690,6 +1690,246 @@ "node": ">= 6" } }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.0.tgz", + "integrity": "sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.0.tgz", + "integrity": "sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.0.tgz", + "integrity": "sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.0.tgz", + "integrity": "sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.0.tgz", + "integrity": "sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.0.tgz", + "integrity": "sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.0.tgz", + "integrity": "sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.0.tgz", + "integrity": "sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.0.tgz", + "integrity": "sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.0.tgz", + "integrity": "sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.0.tgz", + "integrity": "sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.0.tgz", + "integrity": "sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.0.tgz", + "integrity": "sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.0.tgz", + "integrity": "sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.0.tgz", + "integrity": "sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.0.tgz", + "integrity": "sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true + }, "node_modules/@types/estree": { "version": "0.0.38", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.38.tgz", @@ -1782,19 +2022,16 @@ } }, "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "devOptional": true, + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha512-Ajr4IcMXq/2QmMkEmSvxqfLN5zGmJ92gHXAeOXq1OekoH2rfDNsgdDoL2f7QaRCy7G/E6TpxBVdRuNraMztGHw==", + "dev": true, + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "json-schema-traverse": "^0.3.0" } }, "node_modules/ajv-keywords": { @@ -6540,18 +6777,6 @@ "node": ">=4" } }, - "node_modules/eslint/node_modules/ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "dependencies": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, "node_modules/eslint/node_modules/ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", @@ -6581,18 +6806,6 @@ "ms": "^2.1.1" } }, - "node_modules/eslint/node_modules/fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true - }, - "node_modules/eslint/node_modules/json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true - }, "node_modules/eslint/node_modules/strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", @@ -7140,10 +7353,11 @@ } }, "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "devOptional": true + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha512-fueX787WZKCV0Is4/T2cyAdM4+x1S3MXXOAhavE1ys/W42SHAPacLTQhucja22QBYrfGw50M2sRiXPtTGv9Ymw==", + "dev": true, + "license": "MIT" }, "node_modules/fast-glob": { "version": "2.2.7", @@ -8874,6 +9088,37 @@ "node": ">=6" } }, + "node_modules/har-validator/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", + "optional": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/har-validator/node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT", + "optional": true + }, + "node_modules/har-validator/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT", + "optional": true + }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -10167,10 +10412,11 @@ "optional": true }, "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "devOptional": true + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha512-4JD/Ivzg7PoW8NzdrBSr3UFwC9mHgvI7Z6z3QGBsSHgKaRTUDmyZAAKJo2UbG1kUVfS9WS8bi36N49U1xw43DA==", + "dev": true, + "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -12351,7 +12597,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "devOptional": true, + "optional": true, "engines": { "node": ">=6" } @@ -12839,6 +13085,43 @@ "inherits": "^2.0.1" } }, + "node_modules/rollup": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.0.tgz", + "integrity": "sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.24.0", + "@rollup/rollup-android-arm64": "4.24.0", + "@rollup/rollup-darwin-arm64": "4.24.0", + "@rollup/rollup-darwin-x64": "4.24.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.24.0", + "@rollup/rollup-linux-arm-musleabihf": "4.24.0", + "@rollup/rollup-linux-arm64-gnu": "4.24.0", + "@rollup/rollup-linux-arm64-musl": "4.24.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.24.0", + "@rollup/rollup-linux-riscv64-gnu": "4.24.0", + "@rollup/rollup-linux-s390x-gnu": "4.24.0", + "@rollup/rollup-linux-x64-gnu": "4.24.0", + "@rollup/rollup-linux-x64-musl": "4.24.0", + "@rollup/rollup-win32-arm64-msvc": "4.24.0", + "@rollup/rollup-win32-ia32-msvc": "4.24.0", + "@rollup/rollup-win32-x64-msvc": "4.24.0", + "fsevents": "~2.3.2" + } + }, "node_modules/rollup-plugin-commonjs": { "version": "9.3.4", "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-9.3.4.tgz", @@ -12864,6 +13147,14 @@ "estree-walker": "^0.6.1" } }, + "node_modules/rollup/node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/rsvp": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", @@ -14502,30 +14793,6 @@ "string-width": "^2.1.1" } }, - "node_modules/table/node_modules/ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "dependencies": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, - "node_modules/table/node_modules/fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true - }, - "node_modules/table/node_modules/json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true - }, "node_modules/tape": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/tape/-/tape-0.2.2.tgz", @@ -15578,7 +15845,8 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "devOptional": true, + "license": "BSD-2-Clause", + "optional": true, "dependencies": { "punycode": "^2.1.0" } @@ -17026,9 +17294,9 @@ } }, "@caliorg/a2jdeps": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/@caliorg/a2jdeps/-/a2jdeps-7.1.5.tgz", - "integrity": "sha512-bBcgtmi+1rsL9MXb6WVLspOJPTPtEoMLi00t3r26hfcgHgmD0FdTj5LZJd6hnObxiKhi5SEjXlUfbrtDulfG5g==", + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/@caliorg/a2jdeps/-/a2jdeps-7.1.7.tgz", + "integrity": "sha512-9g2GEJEgAOm0q8QM2mVrHCIzlfKZTJ6qkw/TGETzNIsnL8TVQtaILI56dD2PQq8Q77L6WEBvFD2ujaY2T1QkPw==", "requires": { "bootstrap": "^3.4.1", "can-component": "^4.6.3", @@ -17075,6 +17343,134 @@ "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", "dev": true }, + "@rollup/rollup-android-arm-eabi": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.0.tgz", + "integrity": "sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==", + "dev": true, + "optional": true, + "peer": true + }, + "@rollup/rollup-android-arm64": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.0.tgz", + "integrity": "sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==", + "dev": true, + "optional": true, + "peer": true + }, + "@rollup/rollup-darwin-arm64": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.0.tgz", + "integrity": "sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==", + "dev": true, + "optional": true, + "peer": true + }, + "@rollup/rollup-darwin-x64": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.0.tgz", + "integrity": "sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==", + "dev": true, + "optional": true, + "peer": true + }, + "@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.0.tgz", + "integrity": "sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==", + "dev": true, + "optional": true, + "peer": true + }, + "@rollup/rollup-linux-arm-musleabihf": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.0.tgz", + "integrity": "sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==", + "dev": true, + "optional": true, + "peer": true + }, + "@rollup/rollup-linux-arm64-gnu": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.0.tgz", + "integrity": "sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==", + "dev": true, + "optional": true, + "peer": true + }, + "@rollup/rollup-linux-arm64-musl": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.0.tgz", + "integrity": "sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==", + "dev": true, + "optional": true, + "peer": true + }, + "@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.0.tgz", + "integrity": "sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==", + "dev": true, + "optional": true, + "peer": true + }, + "@rollup/rollup-linux-riscv64-gnu": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.0.tgz", + "integrity": "sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==", + "dev": true, + "optional": true, + "peer": true + }, + "@rollup/rollup-linux-s390x-gnu": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.0.tgz", + "integrity": "sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==", + "dev": true, + "optional": true, + "peer": true + }, + "@rollup/rollup-linux-x64-gnu": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.0.tgz", + "integrity": "sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==", + "dev": true, + "optional": true, + "peer": true + }, + "@rollup/rollup-linux-x64-musl": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.0.tgz", + "integrity": "sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==", + "dev": true, + "optional": true, + "peer": true + }, + "@rollup/rollup-win32-arm64-msvc": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.0.tgz", + "integrity": "sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==", + "dev": true, + "optional": true, + "peer": true + }, + "@rollup/rollup-win32-ia32-msvc": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.0.tgz", + "integrity": "sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==", + "dev": true, + "optional": true, + "peer": true + }, + "@rollup/rollup-win32-x64-msvc": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.0.tgz", + "integrity": "sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==", + "dev": true, + "optional": true, + "peer": true + }, "@types/estree": { "version": "0.0.38", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.38.tgz", @@ -17151,15 +17547,15 @@ } }, "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "devOptional": true, + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha512-Ajr4IcMXq/2QmMkEmSvxqfLN5zGmJ92gHXAeOXq1OekoH2rfDNsgdDoL2f7QaRCy7G/E6TpxBVdRuNraMztGHw==", + "dev": true, "requires": { - "fast-deep-equal": "^3.1.1", + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "json-schema-traverse": "^0.3.0" } }, "ajv-keywords": { @@ -21207,18 +21603,6 @@ "text-table": "~0.2.0" }, "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", @@ -21245,18 +21629,6 @@ "ms": "^2.1.1" } }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true - }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", @@ -21854,10 +22226,10 @@ "dev": true }, "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "devOptional": true + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha512-fueX787WZKCV0Is4/T2cyAdM4+x1S3MXXOAhavE1ys/W42SHAPacLTQhucja22QBYrfGw50M2sRiXPtTGv9Ymw==", + "dev": true }, "fast-glob": { "version": "2.2.7", @@ -23226,6 +23598,32 @@ "requires": { "ajv": "^6.12.3", "har-schema": "^2.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "optional": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "optional": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "optional": true + } } }, "has": { @@ -24241,10 +24639,10 @@ "optional": true }, "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "devOptional": true + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha512-4JD/Ivzg7PoW8NzdrBSr3UFwC9mHgvI7Z6z3QGBsSHgKaRTUDmyZAAKJo2UbG1kUVfS9WS8bi36N49U1xw43DA==", + "dev": true }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -26029,7 +26427,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "devOptional": true + "optional": true }, "q": { "version": "1.5.1", @@ -26402,6 +26800,42 @@ "inherits": "^2.0.1" } }, + "rollup": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.0.tgz", + "integrity": "sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==", + "dev": true, + "peer": true, + "requires": { + "@rollup/rollup-android-arm-eabi": "4.24.0", + "@rollup/rollup-android-arm64": "4.24.0", + "@rollup/rollup-darwin-arm64": "4.24.0", + "@rollup/rollup-darwin-x64": "4.24.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.24.0", + "@rollup/rollup-linux-arm-musleabihf": "4.24.0", + "@rollup/rollup-linux-arm64-gnu": "4.24.0", + "@rollup/rollup-linux-arm64-musl": "4.24.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.24.0", + "@rollup/rollup-linux-riscv64-gnu": "4.24.0", + "@rollup/rollup-linux-s390x-gnu": "4.24.0", + "@rollup/rollup-linux-x64-gnu": "4.24.0", + "@rollup/rollup-linux-x64-musl": "4.24.0", + "@rollup/rollup-win32-arm64-msvc": "4.24.0", + "@rollup/rollup-win32-ia32-msvc": "4.24.0", + "@rollup/rollup-win32-x64-msvc": "4.24.0", + "@types/estree": "1.0.6", + "fsevents": "~2.3.2" + }, + "dependencies": { + "@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "peer": true + } + } + }, "rollup-plugin-commonjs": { "version": "9.3.4", "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-9.3.4.tgz", @@ -27825,32 +28259,6 @@ "lodash": "^4.17.4", "slice-ansi": "1.0.0", "string-width": "^2.1.1" - }, - "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true - } } }, "tape": { @@ -28709,7 +29117,7 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "devOptional": true, + "optional": true, "requires": { "punycode": "^2.1.0" } diff --git a/package.json b/package.json index 2e5f2bfd..72469e64 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@caliorg/a2jviewer", - "version": "8.1.4", + "version": "8.3.0", "description": "A2J Viewer standalone and preview app.", "main": "a2jviewer/app", "scripts": { @@ -71,7 +71,7 @@ } }, "dependencies": { - "@caliorg/a2jdeps": "^7.1.5", + "@caliorg/a2jdeps": "^7.1.7", "bit-tabs": "^2.0.0", "blueimp-file-upload": "^9.10.1", "bootstrap": "^3.4.1", @@ -156,6 +156,6 @@ "testee": "^0.9.1" }, "volta": { - "node": "16.14.2" + "node": "20.18.0" } } diff --git a/src/footer/footerVersion.js b/src/footer/footerVersion.js index f050fd3b..2522bb78 100644 --- a/src/footer/footerVersion.js +++ b/src/footer/footerVersion.js @@ -1,7 +1,7 @@ const version = { - number: '8.1.4', - date: '2022-07-06' + number: '8.3.0', + date: '2024-12-10' } export default version diff --git a/src/mobile/pages/fields/field/field.js b/src/mobile/pages/fields/field/field.js index 112998cd..9a690676 100644 --- a/src/mobile/pages/fields/field/field.js +++ b/src/mobile/pages/fields/field/field.js @@ -308,9 +308,46 @@ export const FieldVM = DefineMap.extend('FieldVM', { } else if (field.type === 'useravatar') { // TODO: validate the JSON string here? value = JSON.stringify(this.userAvatar.serialize()) } else if (field.type === 'datemdy') { + if ($el.val().length < 6) { + value = '' + } else { // format date to (mm/dd/yyyy) from acceptable inputs - value = this.normalizeDateInput($el.val()) + value = this.normalizeDateInput($el.val()) + } + + // date bounds are in 6 or 8 digit texts + // need to change to same format as value + // it would be sensible to keep bounds in this + // format but we need to support it to properly + // support older released guides without adding + // more complex code + + if (value.length) { + if (field.hasOwnProperty('max')) { + let maxDate = + field.max.substr(0, 2) + '/' + + field.max.substr(2, 2) + '/' + + field.max.substr(4) + + if (Date.parse(value) > Date.parse(maxDate)) { + value = maxDate + } + } + + if (field.hasOwnProperty('min')) { + let minDate = + field.min.substr(0, 2) + '/' + + field.min.substr(2, 2) + '/' + + field.min.substr(4) + + if (Date.parse(value) < Date.parse(minDate)) { + value = minDate + } + } + } + // render formatted date for end user + $el.val(value) } else { value = $el.val() @@ -318,6 +355,8 @@ export const FieldVM = DefineMap.extend('FieldVM', { _answerVm.values = value + console.log('answer value: ' + _answerVm.values) + let errors = _answerVm.errors field.hasError = errors // update group validation for radio buttons @@ -328,6 +367,10 @@ export const FieldVM = DefineMap.extend('FieldVM', { this.debugPanelMessage(field, value) } + if (((field.type === 'datemdy') && (value.length < 6))) { + _answerVm = undefined + } + return errors }, diff --git a/src/mobile/pages/pages-vm.js b/src/mobile/pages/pages-vm.js index ca96197a..76e3a4f7 100644 --- a/src/mobile/pages/pages-vm.js +++ b/src/mobile/pages/pages-vm.js @@ -202,6 +202,117 @@ export default DefineMap.extend('PagesVM', { } }, + /** + * @property {String} pages.ViewModel.prototype.validateAnswers answersString + * @parent pages.ViewModel + * + * XML version of the `answers` entered by the user. + * + * This is POSTed to `setDataURL` when user finishes the interview, + * and populated when a user loads saved answers. + */ + validatedAnswers (answers) { + /** + * @property {bool} pages.ViewModel.prototype.validateAnswers.isValidDate answersString + * @parent pages.ViewModel.validatedAnswers + * + * check is date is valid + */ + function isValidDate (date) { + let dmy = date.split('/') + // js wants mdy or ymd + // while a2j dates are d/m/yyyy + // if date has bad format bail + if (dmy.length !== 3) { + return false + } + + // slash delimited is not guaranteed supported everywhere + // so convert to ymd + let dateval = new Date( + dmy[2] + '-' + + dmy[0] + '-' + + dmy[1] + ) + return (!isNaN(dateval)) + } + + /* + inspired by but does not use + https://stackoverflow.com/questions/20169217/how-to-write-isnumber-in-javascript + */ + function isValidNumber (num) { + return !isNaN(Number(num)) && isFinite(Number(num)) + } + + function sanitizeAnswerValues (answer) { + const validator = new Map() + + validator.set('Date', isValidDate) + validator.set('Number', isValidNumber) + + if (validator.has(answer.type)) { + for (let i = 1; i < answer.values.length; i++) { + if (!validator.get(answer.type)(answer.values[i])) { + answer.values[i] = null + Object.defineProperty(answer, 'invalid', + { + value: true, + writable: true + }) + } + } + } + return answer + } + + Object.keys(answers).forEach(function filter (name) { + let sanitizedAnswer = sanitizeAnswerValues(answers[name]) + answers[name] = sanitizedAnswer + }) + + return answers + }, + + /** + * @property {String} pages.ViewModel.prototype.answersString answersString + * @parent pages.ViewModel + * + * XML version of the `answers` entered by the user. + * + * This is POSTed to `setDataURL` when user finishes the interview, + * and populated when a user loads saved answers. + */ + answersValidated: { + get () { + const parsed = this.validatedAnswers(this.answers.serialize()) + return parsed + } + }, + + /** + * @property {String} pages.ViewModel.prototype.answersString answersString + * @parent pages.ViewModel + * + * XML version of the `answers` entered by the user. + * + * This is POSTed to `setDataURL` when user finishes the interview, + * and populated when a user loads saved answers. + */ + invalidAnswers: { + get () { + let answers = this.answersValidated + let invalidVars = [] + Object.keys(answers).forEach(function filter (name) { + if (answers[name].invalid) { + invalidVars.push(answers[name].name) + } + }) + + return invalidVars + } + }, + /** * @property {String} pages.ViewModel.prototype.answersString answersString * @parent pages.ViewModel @@ -213,7 +324,8 @@ export default DefineMap.extend('PagesVM', { */ answersANX: { get () { - const parsed = Parser.parseANX(this.answers.serialize()) + // const parsed = Parser.parseANX(this.validatedAnswers(this.answers.serialize())) + const parsed = Parser.parseANX(this.answersValidated) return parsed } }, @@ -368,6 +480,11 @@ export default DefineMap.extend('PagesVM', { return // these buttons skip rest of navigate } + if (button.next === constants.qMESSAGE) { + vm.handleMessage(button, ev) + return + } + vm.handleCodeAfter(button, vm, page, logic) // afterLogic fired, but GOTO resolves later vm.setRepeatVariable(button) // set counting variables if exist @@ -568,6 +685,14 @@ export default DefineMap.extend('PagesVM', { } }, + handleMessage (button, ev) { + ev && ev.preventDefault() + this.appState.modalContent = { + title: 'Author note:', + text: button.message || 'You have completed this A2J Guided Interview. Please close your browser window to exit.' + } + }, + handlePreviewResponses (button, ev) { ev && ev.preventDefault() switch (button.next) { @@ -613,6 +738,7 @@ export default DefineMap.extend('PagesVM', { break } }, + /** Track special button clicks in Matomo analytics * @param button button id */ diff --git a/src/mobile/pages/pages.js b/src/mobile/pages/pages.js index 4b01423b..50826b24 100644 --- a/src/mobile/pages/pages.js +++ b/src/mobile/pages/pages.js @@ -8,6 +8,8 @@ import Preview from '~/src/models/preview' import { analytics } from '~/src/util/analytics' import stache from 'can-stache' import '~/src/mobile/util/helpers' +import constants from '~/src/models/constants' +import DefineMap from 'can-define/map/map' stache.registerPartial('assemble-form', assembleFormTpl) stache.registerPartial('save-answers-form', saveAnswersFormTpl) @@ -84,6 +86,37 @@ export default Component.extend({ } }, + 'a.learn-more click': function fireLearnMoreModal () { + // this is almost a line for line duplicate + // of src/desktop/steps.js + // should probably refactor + const vm = this.viewModel + const pages = this.viewModel.interview.pages + const pageName = this.viewModel.currentPage.name + // vm.appState.page + + if (pages && pageName) { + const page = pages.find(pageName) + + // piwik tracking of learn-more clicks + if (window._paq) { + analytics.trackCustomEvent('Learn-More', 'from: ' + pageName, page.learn) + } + + vm.appState.modalContent = { + // name undefined prevents stache warnings + title: page.learn, + text: page.help, + imageURL: (page.helpImageURL || '').trim(), + altText: page.helpAltText, + mediaLabel: page.helpMediaLabel, + audioURL: (page.helpAudioURL || '').trim(), + videoURL: (page.helpVideoURL || '').trim(), + helpReader: page.helpReader + } + } + }, + 'button.open-preview click': function (el, ev) { ev.preventDefault() @@ -110,6 +143,44 @@ export default Component.extend({ }) }, + 'button.save-answers click': function (el, ev) { + ev.preventDefault() + + const button = new DefineMap({ next: constants.qIDSUCCESS }) + + const vm = this.viewModel + + /*** + * !!! Change this in pproduction to prod server!!! + */ + if (!vm.appState.previewActive) { + let postBody = { + authorid: vm.interview.authorId, + interviewPath: vm.interview.interviewPath, + guideTitle: vm.interview.title, + invalidAnswers: vm.invalidAnswers, + url: window.location.href, + uri: document.documentURI, + viewerversion: constants.A2JVersionNum + } + + if (Array.isArray(postBody.invalidAnswers)) { + if (postBody.invalidAnswers.length) { + $.ajax({ + url: 'https://staging.a2jauthor.org/a2jauthor/bad-answer-alert.php', + type: 'POST', + data: JSON.stringify(postBody), + dataType: 'json' + }) + .then((response) => response.json()) + .then((json) => console.log(json)) + } + } + } + + vm.navigate(button, el, ev) + }, + // This event is fired when the Exit, Success, or AssembleSuccess button is clicked, // it waits to asynchronously submit the form that posts the XML answers // to the `setDataURL` endpoint. diff --git a/src/mobile/pages/pages.stache b/src/mobile/pages/pages.stache index 5e491823..2c18e2e9 100644 --- a/src/mobile/pages/pages.stache +++ b/src/mobile/pages/pages.stache @@ -52,7 +52,15 @@ {{#for(button of currentPage.buttons)}} diff --git a/src/mobile/pages/save-answers-form.stache b/src/mobile/pages/save-answers-form.stache index 5bab78c7..20cc7fec 100644 --- a/src/mobile/pages/save-answers-form.stache +++ b/src/mobile/pages/save-answers-form.stache @@ -10,8 +10,8 @@ diff --git a/src/mobile/util/tlang.js b/src/mobile/util/tlang.js index 93b513ea..519467ab 100644 --- a/src/mobile/util/tlang.js +++ b/src/mobile/util/tlang.js @@ -22,6 +22,7 @@ export default function (lang, makestr) { Dutch English French + Hebrew Hmong Korean Mon Khmer @@ -161,6 +162,9 @@ export default function (lang, makestr) { Ordinals_12: 'twelfth', Ordinals_13: '13th', RepeatAnd: 'and', + Show_Navigation: 'Show Navigation', + Navigation_Panel: 'Navigation Panel', + Open: 'Open', // Authoring system, non-translated elements. // Tab names @@ -1297,5 +1301,80 @@ export default function (lang, makestr) { RepeatAnd: 'และ' } + Languages.regional.he = { + locale: 'he', + Language: 'עברית', + LanguageEN: 'Hebrew', + AskYesNo_Yes: 'כן', + AskYesNo_No: 'לא', + Close: 'סגור', + Comment: 'הערה', + GoBack: 'חזרה', + GoNext: 'הבא', + LearnMore: 'קריאה נוספת', + MyProgress: 'ההתקדמות שלי', + ProvideFeedbackOrComment: 'משוב על עמוד זה', + SaveAndExit: 'שמור וצא', + ResumeExit: 'התחלה מחדש', + SendFeedback: 'שלח משוב', + SoundIsOff: 'צליל מושתק', + SoundIsOn: 'צליל פועל', + SoundPlay: 'הפעל', + SoundStop: 'עצור', + WhatDoYouMean: 'מה הכוונה?', + Continue: 'המשך', + Exit: 'יציאה ללא שמירה', + Male: 'זכר', + Female: 'נקבה', + ChooseListNumber: 'בחירה: ', + ChooseListText: 'בחר מרשימה זו: ', + CheckBoxNOTALabel: 'אף אחד מהתשובות', + ZoomNormal: 'גודל רגיל', + ZoomFull: 'מסך מלא', + TextEnlarge: 'הגדל תיבת טקסט', + TextShrink: 'הקטן תיבת טקסט', + TextSizeLetter: 'א', + UploadAnswers: 'יוצא, נא להמתין...', + CalcClear: 'נקה', + CalcEnter: 'הכנס', + MonthNamesShort: "ינו', פבר', מרץ, אפר', מאי, יוני, יולי, אוג', ספט', אוק', נוב', דצמ'", + MonthNamesLong: 'ינואר, פברואר, מרץ, אפריל, מאי, יוני, יולי, ספטמבר, אוקטובר, נובמבר, דצמבר', + FieldPrompts_ResponseRequired: 'חובה למלא תשובה בקווים הריקים ליד התיוג האדום לפני שממשיכים.', + FieldPrompts_SelectionRequired: 'חובה לבצע בחירה לפני שממשיכים.', + FieldPrompts_text: 'חובה להקליד תשובה במקומות הממורקרים לפני שממשיכים.', + FieldPrompts_textlong: 'חובה להקליד תשובה במקומות הממורקרים לפני שממשיכים.', + FieldPrompts_textpick: 'חובה לבחור מתוך המקום הממורקר לפני שממשיכים.', + FieldPrompts_number: 'חובה הלקליד מספר במקום הממורקר לפני שממשיכים.', + FieldPrompts_numberdollar: 'חובה להכניס סימן דולר במקום הממורקר לפני שממשיכים.', + FieldPrompts_numberssn: "חובה להכניס מס' תעודת זהות במקום הממורקר לפני שממשיכים.", + FieldPrompts_numberphone: "חובה להקליד מס' טלפון במקום הממורקר לפני שממשיכים.", + FieldPrompts_numberzip: 'חובה להקליד מיקוד במקום הממורקר לפני שממשיכים.', + FieldPrompts_numberpick: 'חובה לבחור מספר מתוך המקום הממורקר לפני שממשיכים.', + FieldPrompts_datemdy: 'חובה להקליד חודש, יום ושנה במקום הממורקר לפני שממשיכים.', + FieldPrompts_gender: 'בחרו אוואטר שייצג אותך.', + FieldPrompts_radio: 'חובה לבחור תגובה מתוך הבחירה הממורקרת לפני שממשיכים.', + FieldPrompts_checkbox: 'חובה לבחור אפשרות אחת או כמה לפני שממשיכים.', + FieldPrompts_checkboxNOTA: 'בחרו בבקשה אפשרות אחת או יותר או "אף אחת מהתשובות" לפני שממשיכים.', + Ordinals_1: 'ראשון', + Ordinals_2: 'שני', + Ordinals_3: 'שלישי', + Ordinals_4: 'רביעי', + Ordinals_5: 'חמישי', + Ordinals_6: 'שישי', + Ordinals_7: 'שביעי', + Ordinals_8: 'שמיני', + Ordinals_9: 'תשיעי', + Ordinals_10: 'עשירי', + Ordinals_11: 'אחד עשר', + Ordinals_12: 'שנים עשר', + Ordinals_13: 'שלושה עשר', + RepeatAnd: 'וגם', + Required: 'חובה', + Show_Navigation: 'הראה ניווט', + Navigation_Panel: 'לוח ניווט', + Open: 'לִפְתוֹחַ' + + } + return Languages }