From 158bfa0c32dfef54a04ec8a7806e621065662d00 Mon Sep 17 00:00:00 2001 From: Christophe Bossens Date: Fri, 20 Sep 2024 10:24:52 +0200 Subject: [PATCH 1/2] add plugin-image-click-response --- .../plugin-image-click-response/README.md | 35 ++++ .../docs/image-click-response.md | 64 +++++++ .../examples/index.html | 25 +++ .../examples/jspsych-logo.jpg | Bin 0 -> 70894 bytes .../jest.config.cjs | 1 + .../plugin-image-click-response/package.json | 47 +++++ .../rollup.config.mjs | 3 + .../src/index.spec.ts | 106 +++++++++++ .../plugin-image-click-response/src/index.ts | 179 ++++++++++++++++++ .../plugin-image-click-response/tsconfig.json | 8 + 10 files changed, 468 insertions(+) create mode 100644 packages/plugin-image-click-response/README.md create mode 100644 packages/plugin-image-click-response/docs/image-click-response.md create mode 100644 packages/plugin-image-click-response/examples/index.html create mode 100644 packages/plugin-image-click-response/examples/jspsych-logo.jpg create mode 100644 packages/plugin-image-click-response/jest.config.cjs create mode 100644 packages/plugin-image-click-response/package.json create mode 100644 packages/plugin-image-click-response/rollup.config.mjs create mode 100644 packages/plugin-image-click-response/src/index.spec.ts create mode 100644 packages/plugin-image-click-response/src/index.ts create mode 100644 packages/plugin-image-click-response/tsconfig.json diff --git a/packages/plugin-image-click-response/README.md b/packages/plugin-image-click-response/README.md new file mode 100644 index 00000000..f8300c5c --- /dev/null +++ b/packages/plugin-image-click-response/README.md @@ -0,0 +1,35 @@ +# image-click-response + +## Overview + +This plugin shows an image on which the user can place points by clicking/touching the image. The location of each point is recorded as data. + +## Loading + +### In browser + +```js + +``` + +### Via NPM + +``` +npm install @jspsych-contrib/plugin-image-click-response +``` + +```js +import jsPsychImageClickResponse from '@jspsych-contrib/plugin-image-click-response'; +``` + +## Compatibility + +jsPsych 7.0.0 + +## Documentation + +See [documentation](https://github.com/jspsych/jspsych-contrib/blob/main/packages/plugin-image-click-response/docs/jspsych-image-click-response.md) + +## Author / Citation + +[Christophe Bossens](https://github.com/ChristopheBossens) diff --git a/packages/plugin-image-click-response/docs/image-click-response.md b/packages/plugin-image-click-response/docs/image-click-response.md new file mode 100644 index 00000000..6edc8414 --- /dev/null +++ b/packages/plugin-image-click-response/docs/image-click-response.md @@ -0,0 +1,64 @@ +# image-click-response + +This plugin shows an image on which the user can place points by clicking/touching the image. The x,y coordinates for each point are recorderd. + +## Parameters + +In addition to the [parameters available in all plugins](https://jspsych.org/latest/overview/plugins.md#parameters-available-in-all-plugins), this plugin accepts the following parameters. Parameters with a default value of undefined must be specified. Other parameters can be left unspecified if the default value is acceptable. + +| Parameter | Type | Default Value | Description | +| ------------------- | ---------------- | ------------------ | ---------------------------------------- | +| preamble | HTML_STRING |

Click the image to add a point. Click a point to remove

| Instruction text that will appear above the image | +| stimulus |IMAGE | undefined | URL to the image that will be displayed| +| dot_radius | INT | 5| Radius of the dot in pixels| +| dot_color | STRING | lightblue| Color name for the dot| +| button_label | STRING | Continue| Label for the continue button | +| minimum_dots_required | INT | 0| Minimum number of dots required before the Continue button becomes active| + +## Data Generated + +In addition to the [default data collected by all plugins](https://jspsych.org/latest/overview/plugins.md#data-collected-by-all-plugins), this plugin collects the following data for each trial. + +| Name | Type | Value | +| --------- | ------- | ---------------------------------------- | +| stimulus | IMAGE | URL to the image that will be displayed | +| rt | INT | Time in milliseconds to compete the trial | +| points | ARRAY | Array of (x,y) coordinates for each point on the image | + +## Install + +Using the CDN-hosted JavaScript file: + +```js + +``` + +Using the JavaScript file downloaded from a GitHub release dist archive: + +```js + +``` + +Using NPM: + +``` +npm install @jspsych-contrib/plugin-image-click-response +``` + +```js +import ImageClickResponse from '@jspsych-contrib/plugin-image-click-response'; +``` + +## Examples + +### Title of Example + +```javascript +const trial = { + type: jsPsychImageClickResponse, + stimulus: "https://www.jspsych.org/7.3/img/jspsych-logo.jpg", + dot_radius : 10 + }; +``` + +See [example #1](../examples/index.html) for a live demonstration. \ No newline at end of file diff --git a/packages/plugin-image-click-response/examples/index.html b/packages/plugin-image-click-response/examples/index.html new file mode 100644 index 00000000..6bad3081 --- /dev/null +++ b/packages/plugin-image-click-response/examples/index.html @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/plugin-image-click-response/examples/jspsych-logo.jpg b/packages/plugin-image-click-response/examples/jspsych-logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c402d41d6b395d6c0850ec5d62b1b18196adc815 GIT binary patch literal 70894 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 literal 0 HcmV?d00001 diff --git a/packages/plugin-image-click-response/jest.config.cjs b/packages/plugin-image-click-response/jest.config.cjs new file mode 100644 index 00000000..6ac19d5c --- /dev/null +++ b/packages/plugin-image-click-response/jest.config.cjs @@ -0,0 +1 @@ +module.exports = require("@jspsych/config/jest").makePackageConfig(__dirname); diff --git a/packages/plugin-image-click-response/package.json b/packages/plugin-image-click-response/package.json new file mode 100644 index 00000000..ccda282f --- /dev/null +++ b/packages/plugin-image-click-response/package.json @@ -0,0 +1,47 @@ +{ + "name": "@jspsych-contrib/plugin-image-click-response", + "version": "0.0.1", + "description": "This plugin shows an image on which the user can place points by clicking/touching the image. The location of each point is recorded as data.", + "type": "module", + "main": "dist/index.cjs", + "exports": { + "import": "./dist/index.js", + "require": "./dist/index.cjs" + }, + "typings": "dist/index.d.ts", + "unpkg": "dist/index.browser.min.js", + "files": [ + "src", + "dist" + ], + "source": "src/index.ts", + "scripts": { + "test": "jest", + "test:watch": "npm test -- --watch", + "tsc": "tsc", + "build": "rollup --config", + "build:watch": "npm run build -- --watch" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/jspsych/jspsych-contrib.git", + "directory": "packages/plugin-image-click-response" + }, + "author": { + "name": "Christophe Bossens", + "url": "https://github.com/ChristopheBossens" + }, + "license": "MIT", + "bugs": { + "url": "https://github.com/jspsych/jspsych-contrib/issues" + }, + "homepage": "https://github.com/jspsych/jspsych-contrib/tree/main/packages/plugin-image-click-response", + "peerDependencies": { + "jspsych": ">=7.0.0" + }, + "devDependencies": { + "@jspsych/config": "^2.0.0", + "@jspsych/test-utils": "^1.0.0", + "jspsych": "^7.0.0" + } +} diff --git a/packages/plugin-image-click-response/rollup.config.mjs b/packages/plugin-image-click-response/rollup.config.mjs new file mode 100644 index 00000000..51c93323 --- /dev/null +++ b/packages/plugin-image-click-response/rollup.config.mjs @@ -0,0 +1,3 @@ +import { makeRollupConfig } from "@jspsych/config/rollup"; + +export default makeRollupConfig("jsPsychImageClickResponse"); diff --git a/packages/plugin-image-click-response/src/index.spec.ts b/packages/plugin-image-click-response/src/index.spec.ts new file mode 100644 index 00000000..8e085f98 --- /dev/null +++ b/packages/plugin-image-click-response/src/index.spec.ts @@ -0,0 +1,106 @@ +import { clickTarget, startTimeline } from "@jspsych/test-utils"; + +import jsPsychImageClickResponse from "."; + +jest.useFakeTimers(); + +describe("imag-click-response", () => { + it("should load", async () => { + const { expectFinished, getHTML, getData, displayElement, jsPsych } = await startTimeline([ + { + type: jsPsychImageClickResponse, + stimulus: "image.jpg", + dot_radius: 6, + dot_color: "blue", + minimum_dots_required: 1, + }, + ]); + }); + + it("correctly configures layout parameters", async () => { + const stimulus_value = "../examples/jspsych-logo.jpg"; + const button_label_value = "random label"; + + const { expectRunning, getHTML } = await startTimeline([ + { + type: jsPsychImageClickResponse, + stimulus: stimulus_value, + button_label: button_label_value, + }, + ]); + + await expectRunning(); + + const html = getHTML().replace(/"/g, "'"); + + expect(html).toContain(`href='${stimulus_value}'`); + expect(html).toContain(button_label_value); + }); + + it("correctly sets the continue button state when the minimum_dots_required parameter is > 0", async () => { + const minimum_dots_required = 1; + + const { expectRunning, getHTML, getData, displayElement, jsPsych } = await startTimeline([ + { + type: jsPsychImageClickResponse, + stimulus: "image.jpg", + minimum_dots_required: 1, + }, + ]); + + const response_button = displayElement.querySelector( + "#image-click-response-button" + ) as HTMLButtonElement; + const svg_container = document.getElementById("image-click-response-svg") as HTMLElement; + + await expectRunning(); + + expect(response_button.disabled).toBe(true); + await clickTarget(svg_container); + + expect(response_button.disabled).toBe(false); + }); + + it("should end the trial when the button is clicked", async () => { + const { expectRunning, getHTML, expectFinished, getData, displayElement, jsPsych } = + await startTimeline([ + { + type: jsPsychImageClickResponse, + stimulus: "image.jpg", + }, + ]); + + const response_button = displayElement.querySelector( + "#image-click-response-button" + ) as HTMLButtonElement; + await clickTarget(response_button); + + await expectFinished(); + }); + + it("should add (x,y) coordinates to the data structure when the image is clicked", async () => { + const { expectRunning, getHTML, expectFinished, getData, displayElement, jsPsych } = + await startTimeline([ + { + type: jsPsychImageClickResponse, + stimulus: "image.jpg", + }, + ]); + + const response_button = displayElement.querySelector( + "#image-click-response-button" + ) as HTMLButtonElement; + const svg_container = document.getElementById("image-click-response-svg") as HTMLElement; + + await clickTarget(svg_container); + await clickTarget(response_button); + + await expectFinished(); + + const data = getData().values()[0]; + console.log(data); + expect(data).toHaveProperty("points"); + expect(data.points.length).toBe(1); + expect(data.points[0].length).toBe(2); + }); +}); diff --git a/packages/plugin-image-click-response/src/index.ts b/packages/plugin-image-click-response/src/index.ts new file mode 100644 index 00000000..115dc191 --- /dev/null +++ b/packages/plugin-image-click-response/src/index.ts @@ -0,0 +1,179 @@ +import { JsPsych, JsPsychPlugin, ParameterType, TrialType } from "jspsych"; + +import { version } from "../package.json"; + +const info = { + name: "image-click-response", + version: version, + parameters: { + /** Text that will appear above the image */ + preamble: { + type: ParameterType.HTML_STRING, // BOOL, STRING, INT, FLOAT, FUNCTION, KEY, KEYS, SELECT, HTML_STRING, IMAGE, AUDIO, VIDEO, OBJECT, COMPLEX + default: "

Click the image to add a point. Click a point to remove

", + pretty_name: "Preamble", + }, + /** The image that needs to be displayed */ + stimulus: { + type: ParameterType.IMAGE, + default: undefined, + pretty_name: "Stimulus", + }, + /** Radius of the dot on the image */ + dot_radius: { + type: ParameterType.INT, + default: 5, + pretty_name: "Dot radius'", + }, + /** Color of the dot on the image */ + dot_color: { + type: ParameterType.STRING, + default: "lightblue", + pretty_name: "Dot color", + }, + /** Text for the continue button */ + button_label: { + type: ParameterType.STRING, + default: "Continue", + pretty_name: "Button label", + }, + /** How many dots are required before the trial can be completed */ + minimum_dots_required: { + type: ParameterType.INT, + default: -1, + pretty_name: "Minimum number of dots", + }, + }, + data: { + /** Image that was presented */ + stimulus: { + type: ParameterType.IMAGE, + }, + /** Time to complete the trial */ + rt: { + type: ParameterType.INT, + }, + /** Array of (x,y) values for each point in the image */ + points: { + type: ParameterType.COMPLEX, + }, + }, +}; + +type Info = typeof info; + +/** + * **image-click-response** + * + * This plugin shows an image on which the user can place points by clicking/touching the image. The location of each point is recorded as data. + * + * @author Christophe Bossens + * @see {@link https://github.com/jspsych/jspsych-contrib/packages/plugin-image-click-response/README.md}} + */ +class ImageClickResponsePlugin implements JsPsychPlugin { + static info = info; + + constructor(private jsPsych: JsPsych) {} + + trial(display_element: HTMLElement, trial: TrialType) { + // Callback functions + function svgImageClicked(e) { + if (e.target.tagName === "circle") return; + + // Get click coordinates + let cx = e.offsetX; + let cy = e.offsetY; + + // Create a circle + let circle = document.createElementNS("http://www.w3.org/2000/svg", "circle"); + + // Style the circle + circle.setAttribute("cx", cx); + circle.setAttribute("cy", cy); + circle.setAttribute("r", trial.dot_radius.toString()); + circle.setAttribute("fill", trial.dot_color); + circle.setAttribute("stroke", trial.dot_color); + circle.style.cursor = "pointer"; + circle.style.transition = "0.1s ease-in"; + + // Add event listeners + circle.addEventListener("mouseenter", (e) => { + const target = e.target as HTMLElement; + target.setAttribute("r", (trial.dot_radius + 1).toString()); + }); + + circle.addEventListener("mouseup", (e) => { + const target = e.target as HTMLElement; + svg_container.removeChild(target); + }); + circle.addEventListener("mouseleave", (e) => { + const target = e.target as HTMLElement; + target.setAttribute("r", trial.dot_radius.toString()); + }); + + // Add circle + svg_container.appendChild(circle); + + // Check mininum dot number requirement + button.disabled = + svg_container.querySelectorAll("circle").length < trial.minimum_dots_required; + } + + // Create layout + let html = ""; + let preamble_html = `
${trial.preamble}
`; + let button_html = `
`; + let svg_html = `
`; + display_element.innerHTML = preamble_html + svg_html + button_html; + + let svg_container = document.getElementById("image-click-response-svg") as HTMLElement; + let button = document.getElementById("image-click-response-button") as HTMLButtonElement; + + svg_container.addEventListener("click", svgImageClicked); + + if (trial.minimum_dots_required > 0) { + button.disabled = true; + } + + // Load the image to set the svg container dimensions + let image = new Image(); + image.onload = function () { + svg_container.style.width = image.naturalWidth.toString(); + svg_container.style.height = image.naturalHeight.toString(); + }; + image.src = trial.stimulus; + + // data saving + var trial_data = { + stimulus: trial.stimulus, + rt: undefined, + points: [], + }; + + function collect_responses() { + // measure rt + let end_time = performance.now(); + trial_data.rt = Math.round(end_time - start_time); + + // get indicated points + let points = svg_container.querySelectorAll("circle"); + let svgBoundingBox = svg_container.getBoundingClientRect(); + for (let point of points) + trial_data.points.push([ + point.getBoundingClientRect().left - svgBoundingBox.left, + point.getBoundingClientRect().top - svgBoundingBox.top, + ]); + + end_trial(); + } + + const end_trial = () => { + this.jsPsych.finishTrial(trial_data); + }; + + display_element.querySelector("button").addEventListener("click", () => collect_responses()); + + let start_time = performance.now(); + } +} + +export default ImageClickResponsePlugin; diff --git a/packages/plugin-image-click-response/tsconfig.json b/packages/plugin-image-click-response/tsconfig.json new file mode 100644 index 00000000..8a845081 --- /dev/null +++ b/packages/plugin-image-click-response/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "@jspsych/config/tsconfig.contrib.json", + "compilerOptions": { + "baseUrl": ".", + "resolveJsonModule": true + }, + "include": ["src"] +} From 769681de25580f6f2e4b6339bb1bc5e40784960a Mon Sep 17 00:00:00 2001 From: Christophe Bossens Date: Wed, 9 Oct 2024 11:16:22 +0200 Subject: [PATCH 2/2] updated package-lock.json --- package-lock.json | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/package-lock.json b/package-lock.json index 0a97c4a4..51d76279 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3454,6 +3454,10 @@ "resolved": "packages/plugin-image-array-keyboard-response", "link": true }, + "node_modules/@jspsych-contrib/plugin-image-click-response": { + "resolved": "packages/plugin-image-click-response", + "link": true + }, "node_modules/@jspsych-contrib/plugin-image-multi-response": { "resolved": "packages/plugin-image-multi-response", "link": true @@ -18937,6 +18941,19 @@ "jspsych": ">=7.0.0" } }, + "packages/plugin-image-click-response": { + "name": "@jspsych-contrib/plugin-image-click-response", + "version": "0.0.1", + "license": "MIT", + "devDependencies": { + "@jspsych/config": "^2.0.0", + "@jspsych/test-utils": "^1.0.0", + "jspsych": "^7.0.0" + }, + "peerDependencies": { + "jspsych": ">=7.0.0" + } + }, "packages/plugin-image-multi-response": { "name": "@jspsych-contrib/plugin-image-multi-response", "version": "1.0.1",