From 9e40959ef6bfaedb7ace71922acbb94a0f9d7557 Mon Sep 17 00:00:00 2001 From: Alexander Zobnin Date: Thu, 27 Dec 2018 13:57:08 +0300 Subject: [PATCH] problems ack dialog: submit on enter and show error for empty message --- package.json | 1 + src/panel-triggers/components/Modal.tsx | 54 ++++++++++++++++++++----- src/sass/_panel-problems.scss | 19 +++++++++ yarn.lock | 2 +- 4 files changed, 65 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 097484b..09d0ea9 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ "babel-preset-env": "^1.7.0", "babel-preset-react": "^6.24.1", "benchmark": "^2.1.4", + "classnames": "^2.2.6", "clean-webpack-plugin": "^0.1.19", "codecov": "^3.1.0", "copy-webpack-plugin": "^4.5.4", diff --git a/src/panel-triggers/components/Modal.tsx b/src/panel-triggers/components/Modal.tsx index 69064da..74fe230 100644 --- a/src/panel-triggers/components/Modal.tsx +++ b/src/panel-triggers/components/Modal.tsx @@ -1,5 +1,9 @@ import React, { PureComponent } from 'react'; import ReactDOM from 'react-dom'; +import classNames from 'classnames'; + +const KEYBOARD_ENTER_KEY = 13; +const KEYBOARD_ESCAPE_KEY = 27; interface ModalProps { isOpen?: boolean; @@ -10,6 +14,8 @@ interface ModalProps { interface ModalState { value: string; + error: boolean; + message: string; } export interface AckProblemData { @@ -23,23 +29,43 @@ export class Modal extends PureComponent { constructor(props) { super(props); - this.state = { value: '' }; + this.state = { + value: '', + error: false, + message: '', + }; this.modalContainer = document.body; } handleChange = (event: React.ChangeEvent) => { - this.setState({ value: event.target.value }); + this.setState({ value: event.target.value, error: false }); + } + + handleKeyUp = (event: React.KeyboardEvent) => { + if (event.which === KEYBOARD_ENTER_KEY || event.key === 'Enter') { + this.submit(); + } else if (event.which === KEYBOARD_ESCAPE_KEY || event.key === 'Escape') { + this.dismiss(); + } + } + + handleBackdropClick = () => { + this.dismiss(); } dismiss = () => { - console.log('dismiss'); - this.setState({ value: '' }); + this.setState({ value: '', error: false, message: '' }); this.props.onClose(); } submit = () => { - console.log('submit', this.state.value); + if (!this.state.value) { + return this.setState({ + error: true, + message: 'Enter message text' + }); + } this.props.onSubmit({ message: this.state.value }).then(() => { @@ -52,8 +78,10 @@ export class Modal extends PureComponent { return null; } + const inputClass = classNames('gf-form-input', { 'zbx-ack-error': this.state.error }); + const modalNode = ( -
+

@@ -66,10 +94,9 @@ export class Modal extends PureComponent {

- {/* Message */}
+
+
@@ -93,7 +127,7 @@ export class Modal extends PureComponent { const modalNodeWithBackdrop = [ modalNode, -
+
]; const modal = this.props.withBackdrop ? modalNodeWithBackdrop : modalNode; diff --git a/src/sass/_panel-problems.scss b/src/sass/_panel-problems.scss index d108ee9..0e42528 100644 --- a/src/sass/_panel-problems.scss +++ b/src/sass/_panel-problems.scss @@ -510,6 +510,25 @@ } } +.zbx-ack-modal { + .gf-form-input.zbx-ack-error { + border-color: $btn-danger-bg; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 5px $btn-danger-bg; + } + + .gf-form .gf-form-hint { + .gf-form-hint-text { + display: inherit; + float: right; + + &.ack-error-message { + float: left; + color: $error-text-color; + } + } + } +} + @keyframes slide-down { 0% { opacity: 0; diff --git a/yarn.lock b/yarn.lock index 453a593..9915e04 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1821,7 +1821,7 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" -classnames@^2.2.5: +classnames@^2.2.5, classnames@^2.2.6: version "2.2.6" resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==