             if not @is_upgrade_input_valid(val, limit)
                 bs_style = 'error'
                 @_upgrade_is_invalid = true
+                if misc.parse_number_input(val)?
+                    label = <div style=UPGRADE_ERROR_STYLE>Reduce the above: you do not have enough upgrades</div>
+                else
+                    label = <div style=UPGRADE_ERROR_STYLE>Please enter a number</div>
+            else
+                label = <span></span>
             <span>
                 <Input
                     type       = 'text'

{NoUpgrades} = require('./project_settings')

PARALLEL_LIMIT = 3  # number of async things to do in parallel

redux_name = (project_id, course_filename) ->
    return "editor-#{project_id}-#{course_filename}"

            </Col>
            {# <Col md=2><b style={fontSize:'11pt'}>Current upgrades</b></Col> }
            <Col md=7>
                <b style={fontSize:'11pt'}>Distribute your quotas equally between {num_projects} student {misc.plural(num_projects, 'project')} (amounts may be fractional)</b>
            </Col>
        </Row>

    is_upgrade_input_valid: (val, limit) ->
        parsed_val = misc.parse_number_input(val, round_number=false)
        if not parsed_val? or parsed_val > Math.max(0, limit)  # val=0 is always valid
            return false
        else
            return true
