From 46a7909465591555ab4f673e2478874bde99ccdd Mon Sep 17 00:00:00 2001 From: Kevin Li Date: Wed, 16 Mar 2022 00:28:08 -0400 Subject: [PATCH 1/6] Logging functionality for user study Logs the actions of users during their Argo Scholar session Update ShareDialog.jsx --- argo-scholar/src/components/Dialogs.jsx | 4 +- argo-scholar/src/components/Navbar.jsx | 10 +- .../src/components/NewNetworkDialog.jsx | 1 + .../src/components/OpenSnapshotDialog.jsx | 1 + .../src/components/SaveSnapshotDialog.jsx | 1 + argo-scholar/src/components/SearchBar.jsx | 20 +- argo-scholar/src/components/ShareDialog.jsx | 2 + .../src/components/panels/AddNodesRow.jsx | 1 + .../src/components/panels/EdgesPanel.jsx | 23 +- .../src/components/panels/GlobalPanel.jsx | 30 ++- .../src/components/panels/LabelsPanel.jsx | 20 +- .../src/components/panels/SelectionPanel.jsx | 24 +- .../src/components/panels/ZoomPanel.jsx | 3 + .../graph-frontend/include/OrbitControls.js | 6 +- argo-scholar/src/graph-frontend/src/api.js | 14 ++ argo-scholar/src/graph-frontend/src/mouse.js | 132 +++++++++- argo-scholar/src/ipc/client.js | 1 + argo-scholar/src/ipc/logger.js | 234 ++++++++++++++++++ argo-scholar/src/services/BackendAPIUtils.js | 20 ++ argo-scholar/src/stores/GraphStore.js | 9 + argo-scholar/src/stores/index.js | 6 +- 21 files changed, 500 insertions(+), 62 deletions(-) create mode 100644 argo-scholar/src/ipc/logger.js diff --git a/argo-scholar/src/components/Dialogs.jsx b/argo-scholar/src/components/Dialogs.jsx index f27eecf..ebdaabd 100644 --- a/argo-scholar/src/components/Dialogs.jsx +++ b/argo-scholar/src/components/Dialogs.jsx @@ -22,8 +22,8 @@ export default class Dialogs extends React.Component {
{/* - */} - {/* */} + + */} {/* */} diff --git a/argo-scholar/src/components/Navbar.jsx b/argo-scholar/src/components/Navbar.jsx index 3ad4c68..629206f 100644 --- a/argo-scholar/src/components/Navbar.jsx +++ b/argo-scholar/src/components/Navbar.jsx @@ -87,6 +87,7 @@ class RegularNavbar extends React.Component { text={sampleSnapshotTitle} onClick={() => { window.loadAndDisplaySnapshotFromStrapi(sampleSnapshotStrapiUuid); + appState.logger.addLog({eventName: `LoadSample`, elementName: sampleSnapshotTitle}) }} /> ); @@ -100,7 +101,8 @@ class RegularNavbar extends React.Component { text="Save Snapshot" onClick={() => { appState.project.stringCopyOfSnapshot = appState.graph.saveImmediateStates(); - appState.project.isSaveSnapshotDialogOpen = true + appState.project.isSaveSnapshotDialogOpen = true; + appState.logger.addLog({eventName: `SaveSnapshot`, elementName: appState.graph.metadata.snapshotId}); }} /> { appState.preferences.statisticsDialogOpen = true }} + onClick={() => { + appState.preferences.statisticsDialogOpen = true; + appState.logger.addLog({eventName: `Statistics`, elementName: `Statistics`}) + }} /> { const fileAsString = reader.result; + appState.logger.addLog({eventName: `OpenSnapshot`, elementName: fileAsString}); appState.graph.loadImmediateStates(fileAsString); } }} diff --git a/argo-scholar/src/components/SaveSnapshotDialog.jsx b/argo-scholar/src/components/SaveSnapshotDialog.jsx index 3a0cde7..bb0c471 100644 --- a/argo-scholar/src/components/SaveSnapshotDialog.jsx +++ b/argo-scholar/src/components/SaveSnapshotDialog.jsx @@ -62,6 +62,7 @@ class SaveSnapshotDialog extends React.Component { onClick={() => { document.getElementById('snapshot-textarea').select(); document.execCommand("copy"); + // appState.logger.addLog({eventName: `SaveSnapshot`, elementName: `Copy to Clipboard`}) }} > Copy to Clipboard diff --git a/argo-scholar/src/components/SearchBar.jsx b/argo-scholar/src/components/SearchBar.jsx index 5f4b52c..5a8162b 100644 --- a/argo-scholar/src/components/SearchBar.jsx +++ b/argo-scholar/src/components/SearchBar.jsx @@ -137,24 +137,6 @@ class SearchBar extends React.Component { event.preventDefault(); } - createEmptyGraph(event) { - appState.graph.runActiveLayout(); - requestCreateNewProject({ - name: appState.project.newProjectName, - createdDate: new Date().toLocaleString(), - }); - requestCreateEmptyPaperGraph( - appState.project.newProjectName - ); - - // Importing a graph means no label would be shown by default, - // thus turn off label CSSRenderer for better performance. - appState.graph.frame.turnOffLabelCSSRenderer(); - event.preventDefault(); - appState.graph.selectedNodes.length = 0; - appState.graph.currentlyHovered = null; - } - addToast(message) { toaster.show({ message: message, @@ -172,7 +154,7 @@ class SearchBar extends React.Component { rightElement={ } - target={} + target={} position={Position.BOTTOM} isOpen={this.state.display && this.state.searchResults.length > 0} onClose={() => {this.setState({display: false})}} diff --git a/argo-scholar/src/components/ShareDialog.jsx b/argo-scholar/src/components/ShareDialog.jsx index 8ddc4e6..27d3ae2 100644 --- a/argo-scholar/src/components/ShareDialog.jsx +++ b/argo-scholar/src/components/ShareDialog.jsx @@ -104,6 +104,7 @@ class ShareDialog extends React.Component { // Update local state if (requestSuccess) { this.setState({ isFetching: false, isShared: true, sharedURL }); + appState.logger.addLog({eventName: `ShareSnapshot`, elementName: uuid}) } else { // request fails, toast fires this.setState({ isFetching: false, isShared: false }); @@ -248,6 +249,7 @@ class ShareDialog extends React.Component { // Update local state if (requestSuccess) { this.setState({ isFetching: false, isShared: true, sharedURL }); + appState.logger.addLog({eventName: `ShareSnapshot`, elementName: uuid}) } else { // request fails, toast fires this.setState({ isFetching: false, isShared: false }); diff --git a/argo-scholar/src/components/panels/AddNodesRow.jsx b/argo-scholar/src/components/panels/AddNodesRow.jsx index 7e0752e..794eba2 100644 --- a/argo-scholar/src/components/panels/AddNodesRow.jsx +++ b/argo-scholar/src/components/panels/AddNodesRow.jsx @@ -61,6 +61,7 @@ class AddNodesRow extends React.Component { }) .then((response) => { appState.graph.addNodetoGraph(response, "null", 0); + appState.logger.addLog({eventName: `AddPaper`, elementName: response.paperId, valueName: `Label`, newValue: response.title}); // console.log("add node curcount: ", offset); let paperNode = appState.graph.process.graph.getNode(response.paperId); paperNode.renderData.textHolder.children[0].element.override = true; diff --git a/argo-scholar/src/components/panels/EdgesPanel.jsx b/argo-scholar/src/components/panels/EdgesPanel.jsx index 41761d9..c6aef6b 100644 --- a/argo-scholar/src/components/panels/EdgesPanel.jsx +++ b/argo-scholar/src/components/panels/EdgesPanel.jsx @@ -35,10 +35,12 @@ class EdgesPanel extends React.Component { - this.setState({ - colorOptionOpen: !this.state.colorOptionOpen - }) + onToggle={() => { + this.setState({ + colorOptionOpen: !this.state.colorOptionOpen + }); + appState.logger.addLog({eventName: `EdgeColor`, elementName: `Global Color`}); + } } >
@@ -86,21 +88,22 @@ class EdgesPanel extends React.Component { - this.setState({ - directionOptionOpen: !this.state.directionOptionOpen - }) + onToggle={() => { + this.setState({ + directionOptionOpen: !this.state.directionOptionOpen + }); + } } >

Show Edge Direction:

-