 - [ ] (8:00?) #unclear way to show other viewers that a field is being actively edited by a user (no idea how to do this in react)
 
 DONE:
+- [x] (0:45?) (0:20) re-assign/re-copy/re-collect need to have ... and confirm, since they are dangerous.
+- [x] (0:45?) (0:55) while doing any of three steps of workflow, set something in database and store, which locks things (with a minute limit and spinner) to prevent double click.
 - [x] (0:45?) (2:30) make confirm copies have nice text and look nice
 - [x] (0:45?) (0:37) xs mobile assignment looks bad -- need a fullscreen toggle thing.
 - [x] (1:00?) (1:17) make it so creating a project does not open it until user explicitly opens it.

            {name}ed <BigTime date={time} />
        </div>

    render_open_recopy: (name, open, copy, copy_tip, open_tip) ->
        if name == "Return"
            placement = 'left'
        <ButtonGroup key='open_recopy'>
            <Button key="copy" bsStyle='warning' onClick={copy}>
                <Tip title={name} placement={placement}
                    tip={<span>{copy_tip}</span>}>
                    <Icon name='share-square-o' rotate={"180" if name=='Collect'}/> Re-{name.toLowerCase()}
                </Tip>
            </Button>
            <Button key='open'  onClick={open}>
                <Tip title="Open assignment" placement={placement} tip={open_tip}>
                    <Icon name="folder-open-o" /> Open

                @_update(set:{"#{type}":x}, where:where)

        _start_copy: (assignment, student, type) =>
            if student? and assignment?
                store = get_store(); student = store.get_student(student); assignment = store.get_assignment(assignment)
                where = {table:'assignments', assignment_id:assignment.get('assignment_id')}
                x = syncdb.select_one(where:where)?[type] ? {}
                y = (x[student.get('student_id')]) ? {}
                if y.start? and new Date() - y.start <= 15000
                    return true  # never retry a copy until at least 15 seconds later.
                y.start = misc.mswalltime()
                x[student.get('student_id')] = y
                @_update(set:{"#{type}":x}, where:where)
            return false

