Websocket clock server web interface written in ReactJS/TypeScript
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

Alarms.js 2.1KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import * as React from 'react';
  2. import util from'./utils';
  3. import Alarm from './Alarm';
  4. import './Alarms.css';
  5. /* An alarm list component : a table with Alarm component instances */
  6. class Alarms extends React.Component {
  7. constructor(props:{ alarms:list, // List of alarm informations
  8. ws:WebSocket, // Clock.state.ws reference
  9. alrmUpd:function // Clock.alrmUpdate() reference
  10. }) {
  11. super(props);
  12. this.state = { new_alrm:'', // new alarm input value
  13. add_alrm:false // if true show new alarm input
  14. }
  15. this.handleNewAlarm = this.handleNewAlarm.bind(this)
  16. this.handleNewAlarmChange = this.handleNewAlarmChange.bind(this)
  17. }
  18. render() {
  19. let add_alrm_lbl = 'New alarm'
  20. let add_alrm = (
  21. <button
  22. onClick={this.handleNewAlarm}
  23. >{add_alrm_lbl}</button>);
  24. if(this.state.add_alrm) {
  25. add_alrm = (
  26. <form onSubmit={this.handleNewAlarm}>
  27. <input
  28. type="submit"
  29. value={add_alrm_lbl}
  30. />
  31. <label
  32. htmlFor="new-alrm"
  33. >
  34. New alarm name
  35. </label>
  36. <input
  37. id="new-alrm"
  38. onChange={this.handleNewAlarmChange}
  39. value={this.state.new_alrm}
  40. />
  41. </form>
  42. );
  43. }
  44. return (
  45. <div className="Alarms">
  46. <table className="AlrmList">
  47. <tbody>
  48. {Object.entries(this.props.alarms).map(alrm => (
  49. <Alarm
  50. key={alrm[0]}
  51. name={alrm[0]}
  52. time={alrm[1].time}
  53. on={alrm[1].on}
  54. ringing={alrm[1].ringing}
  55. snooze={alrm[1].snooze}
  56. ws={this.props.ws}
  57. upd={this.props.alrmUpd}
  58. />
  59. ))}
  60. </tbody>
  61. </table>
  62. {add_alrm}
  63. </div>
  64. );
  65. }
  66. /* New alarm input form submit handler */
  67. handleNewAlarm(evt) {
  68. evt.preventDefault();
  69. if(!this.state.add_alrm) {
  70. this.setState({add_alrm:true})
  71. return
  72. }
  73. if(this.state.new_alrm.length == 0) {
  74. this.setState({add_alrm:false})
  75. return;
  76. }
  77. let esc_name = util.escape_arg(this.state.new_alrm)
  78. this.props.ws.send('alarm add '+esc_name)
  79. this.setState({new_alrm:'', add_alrm:false})
  80. this.props.alrmUpd()
  81. }
  82. /* New alarm input change handler */
  83. handleNewAlarmChange(evt) {
  84. this.setState({new_alrm:evt.target.value})
  85. }
  86. }
  87. export default Alarms;