Giter Club home page Giter Club logo

craconweb's Introduction

Crave Control Frontend

To run in development, first ensure craconapi is running, then compile:

  • cd src/
  • elm make Main.elm --output ../public/js/app.js --debug --warn
  • Then cd ../public and run alfred or something to serve the files
  • visit http://localhost:4001/

This can be nice: while :; do clear; your_command; sleep 2; done Or this if you have elm-live installed:

elm-live Main.elm --output=../public/js/app.js --dir=../public --open --pushstate --debug --warn

craconweb's People

Contributors

abadi199 avatar gilbertkennen avatar daved avatar

Watchers

 avatar James Cloos avatar Nate avatar

Forkers

uosan

craconweb's Issues

fix go/no-go reporting accuracy

I responded to dashed border on the correct side - got the red X a few times. Report said "100%".

I think it needs to count dashed as incorrect, not just that the target/selected side matches?

MES time tracking

note to self:

.5 — may 4: 5:30 - 6 (mes branch)
1 — may 4: 9 - 10pm
8 — may 5: 9am - 5pm
~3 — may 6: morning
~3 — may 7: morning, afternoon
~10 hrs — may 12, 13, 14

call agenda

  • quick code reviews (https://github.com/lumastories/craconweb/pulls)
  • troubleshoot game score accuracy (i missed 4 or 5, still got 100%)
  • time estimate to add jitter feature (admin fmri column, stop signal adjustment, gsession has jitter bool) (~2hrs)
  • time estimate modify fmri stop signal to start on ' and lduring game, use 0 instead of space (~1hr)
  • time estimate to add touch capability for dot probe, stop signal, go/no-go (~2hr)
  • i would like room in the budget for bug fixes / minor mods. — testing next week.

Test website on lab computer

The room might be in use off and on for interviews, but if the room is empty then the computer is available.

Uid: sticelab
Pw: sticelab!

It is located in the Mt. Shasta room (#151 I think?)

gcycle data

@daved @nqthqn
Here's the json structure for gcycle that I came up with based on the data representation in the Elm code:

definitions:
  gcycle:
    type: object
    required:
      - eventName
      - timestamp
    properties:
      eventName:
        type: string
      seed:
        type: string
      text:
        type: string
      borderNone:
        type: boolean
      borderGrey:
        type: boolean
      borderBlue:
        type: boolean
      borderBlack:
        type: boolean
      borderDashed:
        type: boolean
      images:
        type: array
        items:
          $ref: '#/definitions/image'
      probeIndex:
        type: integer
      desired:
        type: boolean
      expectedIndex:
        type: integer
      actualIndex:
        type: integer
      timestamp:
        type: string
  image:
    type: object
    required: 
      - imageId
    properties:
      imageId:
        type: string
Example of JSON:

{ 
  "eventName" : "begin-session", 
  "seed" : 32123212, 
  "text" : null, 
  "borderNone": null, 
  "borderGrey": null, 
  "borderBlue": null, 
  "borderBlack": null, 
  "borderDashed": null, 
  "images" : [], 
  "probeIndex" : null, 
  "desired" : null, 
  "expectedIndex" : null, 
  "actualIndex" : null, 
  "timestamp" : "32123212"
}

{ 
  "eventName" : "end-session", 
  "seed" : null, 
  "text" : null, 
  "borderNone": null, 
  "borderGrey": null, 
  "borderBlue": null, 
  "borderBlack": null, 
  "borderDashed": null, 
  "images" : [], 
  "probeIndex" : null, 
  "desired" : null, 
  "expectedIndex" : null, 
  "actualIndex" : null, 
  "timestamp" : "32123212"
}

{ 
  "eventName" : "begin-trial", 
  "seed" : null, 
  "text" : null, 
  "borderNone": null, 
  "borderGrey": null, 
  "borderBlue": null, 
  "borderBlack": null, 
  "borderDashed": null, 
  "images" : [], 
  "probeIndex" : null, 
  "desired" : null, 
  "expectedIndex" : null, 
  "actualIndex" : null, 
  "timestamp" : "32123212"
}

{ 
  "eventName" : "end-trial", 
  "seed" : null, 
  "text" : null, 
  "borderNone": null, 
  "borderGrey": null, 
  "borderBlue": null, 
  "borderBlack": null, 
  "borderDashed": null, 
  "images" : [], 
  "probeIndex" : null, 
  "desired" : null, 
  "expectedIndex" : null, 
  "actualIndex" : null, 
  "timestamp" : "32123212"
}

{ 
  "eventName" : "info", 
  "seed" : null, 
  "text" : "<h3 class="title">Instructions</h3>You will see pictures presented in either a dark blue or light gray border. Press the space bar as quickly as you can. BUT only if you see a blue border around the picture. Do not press if you see a grey border. Go as fast as you can, but don't sacrifice accuracy for speed.<br><br>**Press any key to continue.**", 
  "borderNone": true, 
  "borderGrey": null, 
  "borderBlue": null, 
  "borderBlack": null, 
  "borderDashed": null, 
  "images" : [], 
  "probeIndex" : null, 
  "desired" : null, 
  "expectedIndex" : null, 
  "actualIndex" : null, 
  "timestamp" : "32123212"
}

{ 
  "eventName" : "display-image", 
  "seed" : null, 
  "text" : null, 
  "borderNone": null, 
  "borderGrey": null, 
  "borderBlue": true, 
  "borderBlack": null, 
  "borderDashed": null, 
  "images" : [ { "imageId" : "123123123" } ], 
  "probeIndex" : null, 
  "desired" : null, 
  "expectedIndex" : null, 
  "actualIndex" : null, 
  "timestamp" : "32123212"
}

{ 
  "eventName" : "display-image", 
  "seed" : null, 
  "text" : null, 
  "borderNone": null, 
  "borderGrey": true, 
  "borderBlue": null, 
  "borderBlack": null, 
  "borderDashed": null, 
  "images" : [ null, { "imageId" : "123123123" } ], 
  "probeIndex" : null, 
  "desired" : null, 
  "expectedIndex" : null, 
  "actualIndex" : null, 
  "timestamp" : "32123212"
}

{ 
  "eventName" : "display-image", 
  "seed" : null, 
  "text" : null, 
  "borderNone": null, 
  "borderGrey": true, 
  "borderBlue": null, 
  "borderBlack": null, 
  "borderDashed": null, 
  "images" : [ { "imageId" : "123123123" }, null ], 
  "probeIndex" : null, 
  "desired" : null, 
  "expectedIndex" : null, 
  "actualIndex" : null, 
  "timestamp" : "32123212"
}

{ 
  "eventName" : "display-image", 
  "seed" : null, 
  "text" : null, 
  "borderNone": null, 
  "borderGrey": true, 
  "borderBlue": null, 
  "borderBlack": null, 
  "borderDashed": null, 
  "images" : [ { "imageId" : "123123123" }, { "imageId" : "123123123" } ], 
  "probeIndex" : null, 
  "desired" : null, 
  "expectedIndex" : null, 
  "actualIndex" : null, 
  "timestamp" : "32123212"
}

{ 
  "eventName" : "display-image", 
  "seed" : null, 
  "text" : null, 
  "borderNone": null, 
  "borderGrey": true, 
  "borderBlue": null, 
  "borderBlack": null, 
  "borderDashed": null, 
  "images" : [ { "imageId" : "123123123" }, { "imageId" : "123123123" }, { "imageId" : "123123123" }, { "imageId" : "123123123" }, { "imageId" : "123123123" }{ "imageId" : "123123123" } ], 
  "probeIndex" : null, 
  "desired" : null, 
  "expectedIndex" : null, 
  "actualIndex" : null, 
  "timestamp" : "32123212"
}

{ 
  "eventName" : "display-redcross", 
  "seed" : null, 
  "text" : null, 
  "borderNone": null, 
  "borderGrey": null, 
  "borderBlue": null, 
  "borderBlack": null, 
  "borderDashed": true, 
  "images" : [], 
  "probeIndex" : null, 
  "desired" : null, 
  "expectedIndex" : null, 
  "actualIndex" : null, 
  "timestamp" : "32123212"
}

{ 
  "eventName" : "display-fixation", 
  "seed" : null, 
  "text" : null, 
  "borderNone": true, 
  "borderGrey": null, 
  "borderBlue": null, 
  "borderBlack": null, 
  "borderDashed": null, 
  "images" : [], 
  "probeIndex" : null, 
  "desired" : null, 
  "expectedIndex" : null, 
  "actualIndex" : null, 
  "timestamp" : "32123212"
}

{ 
  "eventName" : "display-probe", 
  "seed" : null, 
  "text" : null, 
  "borderNone": null, 
  "borderGrey": null, 
  "borderBlue": null, 
  "borderBlack": null, 
  "borderDashed": null, 
  "images" : [], 
  "probeIndex" : 0, 
  "desired" : null, 
  "expectedIndex" : null, 
  "actualIndex" : null, 
  "timestamp" : "32123212"
}

{ 
  "eventName" : "accept-indication", 
  "seed" : null, 
  "text" : null, 
  "borderNone": null, 
  "borderGrey": null, 
  "borderBlue": null, 
  "borderBlack": null, 
  "borderDashed": null, 
  "images" : [], 
  "probe" : null, 
  "desired" : true, 
  "expectedIndex" : null, 
  "actualIndex" : null, 
  "timestamp" : "32123212"
}

{ 
  "eventName" : "accept-direction", 
  "seed" : null, 
  "text" : null, 
  "borderNone": null, 
  "borderGrey": null, 
  "borderBlue": null, 
  "borderBlack": null, 
  "borderDashed": null, 
  "images" : [], 
  "probe" : null, 
  "desired" : null, 
  "expectedIndex" : 0, 
  "actualIndex" : 1, 
  "timestamp" : "32123212"
}

{ 
  "eventName" : "accept-selection", 
  "seed" : null, 
  "text" : null, 
  "borderNone": null, 
  "borderGrey": null, 
  "borderBlue": null, 
  "borderBlack": null, 
  "borderDashed": null, 
  "images" : [], 
  "probe" : null, 
  "desired" : null, 
  "expectedIndex" : 5, 
  "actualIndex" : 5, 
  "timestamp" : "32123212"
}

{ 
  "eventName" : "timeout", 
  "seed" : null, 
  "text" : null, 
  "borderNone": null, 
  "borderGrey": null, 
  "borderBlue": null, 
  "borderBlack": null, 
  "borderDashed": null, 
  "images" : [], 
  "probe" : null, 
  "desired" : true, 
  "expectedIndex" : null, 
  "actualIndex" : null, 
  "timestamp" : "32123212"
}

I'm not sure what the database representation for the images field should be, possible another table?
Let me know if you have any question or feedback, or if you would like to discuss this via chat.

FMRI Stop Signal

Respect new field user.jitter.

  • add statically seeded randomized 3 - 7 second inter-trial jitter
  • store jitter=true in gsession
  • change key responses for stop signal (spacebar -> 0) NOT '
  • trigger start on ' (scanner emits this keyboard events at start of scan, and continually pulses)
  • add fmri checkbox to admin for each user (PUT /user with jitter=true)
  • staff side button to start game.

segfault

  1. I issue a PUT request to update the user
curl 'http://localhost:8680/user/7975656064759239211' -X PUT -H 'Accept: application/json' -H 'Referer: http://localhost:8000/edit/7975656064759239211' -H 'Origin: http://localhost:8000' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36' -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJjcmFjb25hcGkiLCJleHAiOjE0OTQ4OTk0MjYsImlhdCI6MTQ5NDg3MDYyNiwiaXNzIjoiY3JhY29uYXBpIiwic3ViIjoiMTE0OTE2OTk3NTQyMjA5MjA4Iiwicm9sZXMiOlt7ImlkIjoiOTE3Mzc3NTc1NDIxNzkyMTEiLCJuYW1lIjoiYWRtaW4iLCJ3ZWlnaHQiOjEwMDAwfV19.y0aCCr52r9ICqtCz0ctArL-2RSHSLJZNTYTiReK-VBI' -H 'Content-Type: application/json' --data-binary '{"userRecord":{"username":"con","email":"[email protected]","firstName":"con","lastName":"con","groupId":"85117017542169206","password":""}}' --compressed
  1. The backend crashes
INFO[0001] tasksrv: from subdir "filler": 0 added, 101 skipped
INFO[0001] tasksrv: preloading completed
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x68 pc=0x44766c0]

goroutine 4287 [running]:
gitlab.com/lumastudio/craconapi/auth.(*Auth).TrimOvrUserReq(0xc4201a6b60, 0x4e5c690, 0xc4204abc80, 0xc4203d5c90, 0xc4205576f8, 0x400eb97)
        /Users/nathann/work/src/gitlab.com/lumastudio/craconapi/auth/usertrim.go:51 +0x160
gitlab.com/lumastudio/craconapi/svc/usersvc.(*UserSvc).OvrUser(0xc420215440, 0x4e5c690, 0xc4204abc80, 0xc4203d5c90, 0x0, 0x0, 0x0)
        /Users/nathann/work/src/gitlab.com/lumastudio/craconapi/svc/usersvc/usersvc.go:114 +0x56
gitlab.com/lumastudio/craconapi/grpc/idl._General_OvrUser_Handler.func1(0x4e5c690, 0xc4204abc80, 0x473aa40, 0xc4203d5c90, 0x4ba2500, 0x4e5c600, 0xc4204abc80, 0x0)
        /Users/nathann/work/src/gitlab.com/lumastudio/craconapi/grpc/idl/cracon.pb.go:3067 +0x89
gitlab.com/lumastudio/craconapi/svc.(*Svc).authUnaryInterceptor(0xc420215350, 0x4e5c690, 0xc4204abc80, 0x473aa40, 0xc4203d5c90, 0xc42052aa20, 0xc42052aa40, 0x3025ad2c, 0x4b83b40, 0x22a4, ...)
        /Users/nathann/work/src/gitlab.com/lumastudio/craconapi/svc/interceptors.go:55 +0x12d
gitlab.com/lumastudio/craconapi/svc.(*Svc).(gitlab.com/lumastudio/craconapi/svc.authUnaryInterceptor)-fm(0x4e5c690, 0xc4204ab9b0, 0x473aa40, 0xc4203d5c90, 0xc42052aa20, 0xc42052aa40, 0xc4201f78a8, 0x4011ea2, 0x20, 0x20)
        /Users/nathann/work/src/gitlab.com/lumastudio/craconapi/svc/svc.go:78 +0x73
github.com/codemodus/catena.(*UnaryServerCatena).Interceptor.func1.1.1(0x4e5c690, 0xc4204ab9b0, 0x473aa40, 0xc4203d5c90, 0xc4203d5ca0, 0x0, 0xc420060400, 0xc4201f7910)
        /Users/nathann/work/src/github.com/codemodus/catena/catena.go:63 +0x66
gitlab.com/lumastudio/craconapi/svc.(*Svc).accessUnaryInterceptor.func1(0x4e5c690, 0xc4204ab9b0, 0x473aa40, 0xc4203d5c90, 0xc42052aa20, 0xc42052aa60, 0x474d320, 0xc42052aa80, 0xc42052aa20, 0xc42052aa80)
        /Users/nathann/work/src/gitlab.com/lumastudio/craconapi/svc/interceptors.go:13 +0x4e
github.com/codemodus/catena.(*UnaryServerCatena).Interceptor.func1.1.1(0x4e5c690, 0xc4204ab9b0, 0x473aa40, 0xc4203d5c90, 0xc42052a9e0, 0xc4201f7940, 0x40126f8, 0x20)
        /Users/nathann/work/src/github.com/codemodus/catena/catena.go:63 +0x66
github.com/codemodus/catena.(*UnaryServerCatena).Interceptor.func1(0x4e5c690, 0xc4204ab9b0, 0x473aa40, 0xc4203d5c90, 0xc42052aa20, 0xc42052aa40, 0x0, 0xc4201f79b8, 0x40126f8, 0x50)
        /Users/nathann/work/src/github.com/codemodus/catena/catena.go:71 +0x102
gitlab.com/lumastudio/craconapi/grpc/idl._General_OvrUser_Handler(0x47a2a00, 0xc420215500, 0x4e5c690, 0xc4204ab9b0, 0xc4200899f0, 0xc420229930, 0x0, 0x0, 0x0, 0x0)
        /Users/nathann/work/src/gitlab.com/lumastudio/craconapi/grpc/idl/cracon.pb.go:3069 +0x177
google.golang.org/grpc.(*Server).processUnaryRPC(0xc42016f0e0, 0x4aafe20, 0xc4202ec160, 0xc42055c900, 0xc420215590, 0x4b7b540, 0xc4204aba40, 0x0, 0x0)
        /Users/nathann/work/src/google.golang.org/grpc/server.go:751 +0xc84
google.golang.org/grpc.(*Server).handleStream(0xc42016f0e0, 0x4aafe20, 0xc4202ec160, 0xc42055c900, 0xc4204aba40)
        /Users/nathann/work/src/google.golang.org/grpc/server.go:951 +0x15a0
google.golang.org/grpc.(*Server).serveStreams.func1.1(0xc4201ec210, 0xc42016f0e0, 0x4aafe20, 0xc4202ec160, 0xc42055c900)
        /Users/nathann/work/src/google.golang.org/grpc/server.go:517 +0xa9
created by google.golang.org/grpc.(*Server).serveStreams.func1
        /Users/nathann/work/src/google.golang.org/grpc/server.go:518 +0xa1

Filler data is missing!

I seem to have misplaced the filler data. What shall we do?

No worries, actually... I'll wrestle with this. I don't think there is a pretty solution, but will try to come up with something that is honest. Or, at least honest looking. Hopefully. 🙏

Ugimage data is missing CSV column "value".

Currently, the CSV column "rating" is mapped to the Ugimage field "value". It was initially stated that that was sufficient. However, this will make processing the data more difficult later on.

I suggest that a "rating" field is added to Ugimage, and the CSV columns "rating" and "value should be mapped directly to their Ugimage field counterparts. The database tables setup queries would be corrected, and a non-rollback/migrate sql file will be provided for the team to apply in order to preserve existing data.

Can I get an "amen"?

Accuracy calc.

How is accuracy calculated using a gcycle? If I do not need to know the "reason", can I avoid looking up the type of image or referring to the game? In other words, can accuracy be calculated using only the gcycle?

@abadi199
@nqthqn

fMRI GUI improvement.

During an fMRI game session...

  • Hide mouse
  • Cover header
  • 2.5 min x 4 blocks instead of 5 min x 2 blocks.

GoNoGo missing response data?

Average Response Time: No Response
Percent Correct: 41.26%

Seems odd. With no responses, shouldn't percent correct = 0% ?

update gcycle

uint64 id            DB generated unique id for trial
uint64 gsessionId    id to the game session (contains start and end times)
uint64 fixation      onset time of fixation cross
uint64 selection     onset time of users selection w/ keyboard or mouse
uint64 instruct      onset time of instructions block
uint64 pictures      onset time of pictures
uint64 redcross      onset time of cross (red cross indicating incorrect response)
uint64 probe         onset time of probe (dot)
uint64 border        onset time of border
uint64 timeout       onset time of timeout
uint32 width         width of matrix for visual search
uint32 height        height of matrix for visual search
bool blue            was the border blue?
bool dash            was the border dash?
uint32 probeIndex
uint32 targetIndex
uint32 selectedIndex
uint32 startIndex 
uint64[] images      ["1","2","3","4"] -- array of image ids

# gsession
uint64 seed     -- add seed

passwords

Currently saving a user without updating the password sets the password to "".

We plan on treating password changes as a separate process - using PATCH.

probe index != target index

example:

gcycle_id created_at gsession_id sort fixation selection pictures redcross probe border timeout rest width height blue gray dash probe_index target_index selected_index start_index
1149683869194219753 2017-06-14 12:39:54 5320972509009449754 45 1497469128357 1497469129728 1497469128857 0 1497469129360 0 0 0 1 1 0 0 0 1 0 1 0

if the probe is behind the unhealthy image (10% of the time) the target is actually the healthy image

fMRI Stop Signal Changes

Hi @abadi199 if we could chat about this tonight that would be great :)

reminder: Water should be 50% blue, 50% gray, Healthy should be blue border (always), Unhealthy should be gray border (always)

Fixes/changes ordered by priority

  • Current Incorrect: Is not using invalid images and Is assigning gray border to valid
  • Move instructions blocks to page that is awaiting trigger — concerned with consistent onset times.
  • Try to replicate 404 - don't reuse /stopsignal route (/fmri/:username? Restrict to admin and staff role users.)

Per our call: May need to rethink fMRI stop signal implementation.

short list

MOVED: #11

  • Access-Control-Allow-Methods add PUT (i am putting mesanswer and user)
  • change POST /auth for logging in with username (@nqthqn to change login on frontend)
  • make user email field non-required

border color for gcycle

@nqthqn @daved
I just realized, we actually have 3 possible border colors:

  • blue
  • grey
  • black

and also

  • dash
  • none

So I think we need to add all 3 color fields to gcycle data instead of just blue. Any thought?

todos

MOVED: #11

@abadi199

  • Collect and display game data (percent correct / average RT)
  • Save start time: POST /user/{userId}/gsession and end time PUT /gsession/{gsessionId}
  • Design gcycles w/ David.
  • Save log data at the end POST /gsession/{gsessionId}/gcycles
  • Add "click/tap" functionality to c/m/spacebar controlled games

@nqthqn

  • finish staff/admin functionality #7
  • Fix occasional missing animations in Visual search (trouble reproducing)
  • replace mock server data, write decoders/encoders

@daved

  • finish MES endpoints
  • design badges functionality

dotprobe

Glad we caught this 👍

  • probe should appear after high-cal food 10% of the time.
  • probe should appear after low-cal food 90% of the time.

Time logging accuracy improvement.

The system should be as accurate as possible. For example, the current "500 ms intervals" regularly report somewhere between 500 and 520 milliseconds.

  • Is logging to the console adding to the inaccuracy of the gcycle sections?
  • Can the order of function calls be arranged to ensure accuracy?
  • Can different functions be used underneath?

do testing

  • cross browser testing
  • baker testing
  • laptop testing

deploy with mesquerys

after #18 is addresses, we should be ready for a "new release" - i can assist with getting you online at ORI tomorrow. i know sonja wants to show the latest website iteration to collaborators overseas.

here are the mesquerys to add as "baseline" data... or whatever you want to call it.

What are three health problems associated with obesity?
What are three health problems associated with unhealthy eating?
What are three emotional burdens associated with obesity?
What are three emotional burdens associated with unhealthy eating?
What are three ways that obesity can negatively affect our relationships with other people?
What are three ways that unhealthy eating can negatively affect our relationships with other people?
What are three costs of obesity for our broader society?
What are three costs of unhealthy eating for our broader society?
What are three personally meaningful health costs of eating high fat, high sugar foods? (i.e., How has eating these foods personally affected you?)
What are three health benefits of eating healthy food?
What are three things you will do before you enter a risky situation involving unhealthy food to avoid slipping up?
What are three financial costs of obesity?
What are three financial costs of unhealthy eating?
What are three emotional benefits of a healthy weight?
What are three emotional benefits of healthy eating?
What are three interpersonal benefits of a healthy weight?
What are three interpersonal benefits of healthy eating?
What are three financial benefits of a healthy weight?
What are three financial benefits of healthy eating?
What are three health benefits of a healthy weight?
What are your top five long-term health goals?
What are your top five health related personal values?

tasks & timelines

Tasks

  • game data
    • add new fields to gcycle/gsession msgs
    • badges: frontend wip: #30 (backend has separate issue opened: #28 )
    • staff: get game data from user
    • staff: see data summary
  • fix csv parsing (handle empty values, and column names)
  • contact Josh regarding infrastructure
  • add loading screen (wip: #24) @nqthqn
  • add tapping/clicking for all games (dot should have large target area on mobile) @abadi199
  • deprecate email field
    • change POST /auth for logging in with username
    • @nqthqn to change login on frontend and related query(s)
    • make user email field non-required in db (email will be required, but copy the username into the email field so that values are always unique).
  • parse/handle user agent for mobile usage tracking (add to gsession?)
  • Add 3-7 second jitter to stop signal based on user flag (this should be editable) @abadi199
  • send invoice!
  • MES logic
  • MES request initials
  • staff: edit user,

Timeline

By Thurs May 18 (Friday = buffer day, ssshhhh...)

firefox support

I noticed c and m keyboard response is not working in firefox.

mes changes

current functionality

  • User is asked to append initials to statements.
  • Statements from both groups are displayed in the "Satements" tab.

adjusted functionality

  • User is not asked for initials
  • Statements from both groups are displayed in the "Statements" tab, BUT:
    • For users in the same group, full name is displayed along with statement
    • For users in different groups. initials are displayed along with statement
    • example: 2 control, 1 experimental, they all make a statement, everyone sees 3 statements, but for control the statement from the person in the experimental group only initials are shown
  • Statements are additionally visible for unauthenticated users
    • The login page would have an additional link "Read Statements from Participants"
    • This would open a dismissible modal where statements would only have the initials

blocks

Just go this feedback from the head honcho, what do you think?

I am hoping that perhaps we can break up the training into smaller blocks so that people have short breaks. I am not sure if that applies to all of the trainings, or just the go/no-go training.

Do we still have support for blocks?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.