123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206 |
- /*
- * Copyright (C) 2014 - present Instructure, Inc.
- *
- * This file is part of Canvas.
- *
- * Canvas is free software: you can redistribute it and/or modify it under
- * the terms of the GNU Affero General Public License as published by the Free
- * Software Foundation, version 3 of the License.
- *
- * Canvas is distributed in the hope that it will be useful, but WITHOUT ANY
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
- * details.
- *
- * You should have received a copy of the GNU Affero General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
- import React from 'react'
- import PropTypes from 'prop-types'
- import I18n from 'i18n!external_tools'
- import numberHelper from 'jsx/shared/helpers/numberHelper'
- const { bool, func, number } = PropTypes;
- var DataRow = React.createClass({
- propTypes: {
- onRowMinScoreChange: func.isRequired,
- uniqueId: number.isRequired,
- round: func.isRequired,
- editing: bool.isRequired,
- },
- getInitialState () {
- return { showBottomBorder: false };
- },
- componentWillReceiveProps () {
- this.setState({ showBottomBorder: false });
- },
- getRowData () {
- var rowData = {name: this.props.row[0], minScore: this.props.row[1], maxScore: null};
- rowData.maxScore = this.props.uniqueId === 0 ? 100 : this.props.siblingRow[1];
- return rowData;
- },
- hideBottomBorder () {
- this.setState({showBottomBorder: false});
- },
- showBottomBorder () {
- this.setState({showBottomBorder: true});
- },
- triggerRowNameChange (event) {
- this.props.onRowNameChange(this.props.uniqueId, event.target.value);
- },
- triggerRowMinScoreBlur () {
- if (this.state.minScoreInput == null) return;
- const inputVal = numberHelper.parse(this.state.minScoreInput);
- if (!isNaN(inputVal) && inputVal >= 0 && inputVal <= 100) {
- this.props.onRowMinScoreChange(this.props.uniqueId, String(inputVal));
- }
- this.setState({ minScoreInput: null });
- },
- triggerRowMinScoreChange (event) {
- this.setState({ minScoreInput: event.target.value });
- },
- triggerDeleteRow (event) {
- event.preventDefault();
- return this.props.onDeleteRow(this.props.uniqueId);
- },
- triggerInsertRow (event) {
- event.preventDefault();
- return this.props.onInsertRow(this.props.uniqueId);
- },
- renderInsertRowButton () {
- return (
- <button className="Button Button--icon-action insert_row_button"
- onMouseEnter={this.showBottomBorder} onFocus={this.showBottomBorder}
- onBlur={this.hideBottomBorder} onMouseLeave={this.hideBottomBorder}
- onClick={this.triggerInsertRow} type="button">
- <span className="screenreader-only">{I18n.t("Insert row below")}</span>
- <i className="icon-add"/>
- </button>);
- },
- renderMaxScore () {
- const maxScore = this.props.round(this.getRowData().maxScore);
- return (maxScore === 100 ? '' : '< ') + I18n.n(maxScore);
- },
- renderMinScore () {
- let minScore = this.getRowData().minScore;
- if (!this.props.editing) {
- minScore = this.props.round(minScore);
- } else if (this.state.minScoreInput != null) {
- return this.state.minScoreInput;
- }
- return I18n.n(minScore);
- },
- renderDeleteRowButton () {
- if(this.props.onlyDataRowRemaining) return null;
- return(
- <button ref="deleteButton" className="Button Button--icon-action delete_row_button"
- onClick={this.triggerDeleteRow} type="button">
- <span className="screenreader-only">{I18n.t("Remove row")}</span>
- <i className="icon-end"/>
- </button>
- );
- },
- renderViewMode () {
- return (
- <tr className="grading_standard_row react_grading_standard_row" ref="viewContainer">
- <td className="insert_row_icon_container"/>
- <td className="row_name_container">
- <div className="name" ref="name">
- {this.getRowData().name}
- </div>
- </td>
- <td className="row_cell max_score_cell" ariaLabel={I18n.t('Upper limit of range')} >
- <div>
- <span className="max_score" ref="maxScore" title="Upper limit of range">
- {this.renderMaxScore() + "%"}
- </span>
- </div>
- </td>
- <td className="row_cell">
- <div>
- <span className="range_to" ref="minScore">{I18n.t("to %{minScore}%", {minScore: this.renderMinScore()})}</span>
- <span className="min_score">
- </span>
- </div>
- </td>
- <td className="row_cell last_row_cell"/>
- </tr>
- );
- },
- renderEditMode () {
- return (
- <tr className={this.state.showBottomBorder ?
- "grading_standard_row react_grading_standard_row border_below" :
- "grading_standard_row react_grading_standard_row"}
- ref="editContainer">
- <td className="insert_row_icon_container">
- {this.renderInsertRowButton()}
- </td>
- <td className="row_name_container">
- <div>
- <input type="text" ref="nameInput" onChange={this.triggerRowNameChange}
- className="standard_name" title={I18n.t('Range name')} ariaLabel={I18n.t('Range name')}
- name={"grading_standard[standard_data][scheme_" + this.props.uniqueId + "[name]"}
- value={this.getRowData().name}/>
- </div>
- </td>
- <td className="row_cell max_score_cell edit_max_score">
- <span className="edit_max_score">
- {this.renderMaxScore() + "%"}
- <span className="screenreader-only">{I18n.t("Upper limit of range")}</span>
- </span>
- </td>
- <td className="row_cell">
- <div>
- <span className="range_to" ariaHidden="true">{I18n.t("to ")}</span>
- <input
- type="text"
- className="standard_value"
- ref={(input) => { this.minScoreInput = input; }}
- onChange={this.triggerRowMinScoreChange}
- onBlur={this.triggerRowMinScoreBlur}
- title={I18n.t('Lower limit of range')}
- ariaLabel={I18n.t('Lower limit of range')}
- name={`grading_standard[standard_data][scheme_${this.props.uniqueId}][value]`}
- value={this.renderMinScore()}
- />
- <span ariaHidden="true"> % </span>
- </div>
- </td>
- <td className="row_cell last_row_cell">
- {this.renderDeleteRowButton()}
- </td>
- </tr>
- );
- },
- render () {
- return this.props.editing ? this.renderEditMode() : this.renderViewMode();
- }
- });
- export default DataRow
|