This commit is contained in:
Nikita Gopienko 2019-12-13 15:36:36 +03:00
commit 4bb4266bf9
13 changed files with 122 additions and 31 deletions

18
.github/workflows/telegram.yml vendored Normal file
View File

@ -0,0 +1,18 @@
name: CI
on:
pull_request:
branches:
- master
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
- name: telegram action on pull request
uses: appleboy/telegram-action@master
with:
to: ${{ secrets.TELEGRAM_TO }}
token: ${{ secrets.TELEGRAM_TOKEN }}
args: The ${{ github.event_name }} event triggered.

View File

@ -2,7 +2,7 @@
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no, user-scalable=no">
<meta name="theme-color" content="#000000">
<base href="%PUBLIC_URL%/" />
<!--

View File

@ -0,0 +1,58 @@
import React from "react";
import isEqual from "lodash/isEqual";
import {
FieldContainer,
EmailInput
} from "asc-web-components";
class EmailField extends React.Component {
shouldComponentUpdate(nextProps) {
return !isEqual(this.props, nextProps);
}
render() {
console.log("EmailField render");
const {
isRequired,
hasError,
labelText,
emailSettings,
inputName,
inputValue,
inputOnChange,
inputTabIndex,
placeholder,
scale,
inputIsDisabled,
onValidateInput,
} = this.props;
return (
<FieldContainer
isRequired={isRequired}
hasError={hasError}
labelText={labelText}
>
<EmailInput
className="field-input"
name={inputName}
value={inputValue}
onChange={inputOnChange}
emailSettings={emailSettings}
tabIndex={inputTabIndex}
placeholder={placeholder}
scale={scale}
autoComplete='email'
isDisabled={inputIsDisabled}
onValidateInput={onValidateInput}
/>
</FieldContainer>
);
}
}
export default EmailField;

View File

@ -8,6 +8,7 @@ import { createProfile, getUserPhoto } from '../../../../../store/profile/action
import { MainContainer, AvatarContainer, MainFieldsContainer } from './FormFields/Form'
import TextField from './FormFields/TextField'
import PasswordField from './FormFields/PasswordField'
import EmailField from './FormFields/EmailField';
import DateField from './FormFields/DateField'
import RadioField from './FormFields/RadioField'
import DepartmentField from './FormFields/DepartmentField'
@ -211,12 +212,11 @@ class CreateUserForm extends React.Component {
}
validate() {
const { profile } = this.state;
const emailRegex = /.+@.+\..+/;
const { profile, errors:stateErrors } = this.state;
const errors = {
firstName: !profile.firstName.trim(),
lastName: !profile.lastName.trim(),
email: !emailRegex.test(profile.email.trim()),
email: stateErrors.email,
password: profile.passwordType === "temp" && !profile.password.trim()
};
const hasError = errors.firstName || errors.lastName || errors.email || errors.password;
@ -319,6 +319,8 @@ class CreateUserForm extends React.Component {
this.setState(stateCopy)
}
onValidateEmailField = (value) => this.setState({errors: { ...this.state.errors, email:!value }});
render() {
const { isLoading, errors, profile, selector } = this.state;
const { t, settings, i18n } = this.props;
@ -373,7 +375,7 @@ class CreateUserForm extends React.Component {
inputOnChange={this.onInputChange}
inputTabIndex={2}
/>
<TextField
<EmailField
isRequired={true}
hasError={errors.email}
labelText={`${t("Email")}:`}
@ -396,6 +398,7 @@ class CreateUserForm extends React.Component {
</Trans>
</Text>
}
onValidateInput={this.onValidateEmailField}
/>
<PasswordField
isRequired={true}

View File

@ -22,7 +22,7 @@ const isLocalhost = Boolean(
export function register(config) {
if ('serviceWorker' in navigator) {
if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {
// The URL constructor is available in all browsers that support SW.
const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);
if (publicUrl.origin !== window.location.origin) {

View File

@ -2,7 +2,7 @@
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no, user-scalable=no">
<meta name="theme-color" content="#000000">
<base href="%PUBLIC_URL%/" />
<!--

View File

@ -21,7 +21,7 @@ const isLocalhost = Boolean(
);
export function register(config) {
if ('serviceWorker' in navigator) {
if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {
// The URL constructor is available in all browsers that support SW.
const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);
if (publicUrl.origin !== window.location.origin) {

View File

@ -1,6 +1,6 @@
{
"name": "asc-web-components",
"version": "1.0.231",
"version": "1.0.236",
"description": "Ascensio System SIA component library",
"license": "AGPL-3.0",
"main": "dist/asc-web-components.js",

View File

@ -34,6 +34,8 @@ const StyledFilterItem = styled.div`
`;
const StyledCloseButtonBlock = styled.div`
display: flex;
cursor: ${props =>
props.isDisabled || !props.isClickable ? "default" : "pointer"};
align-items: center;
position: absolute;
height: 100%;
@ -66,6 +68,7 @@ class FilterItem extends React.Component {
};
this.onSelect = this.onSelect.bind(this);
this.onClick = this.onClick.bind(this);
}
onSelect(option) {
@ -76,6 +79,9 @@ class FilterItem extends React.Component {
inSubgroup: !!option.inSubgroup
});
}
onClick(e){
!this.props.isDisabled && this.props.onClose(e, this.props.id);
}
render() {
return (
@ -98,10 +104,10 @@ class FilterItem extends React.Component {
: <StyledFilterName>{this.props.label}</StyledFilterName>
}
<StyledCloseButtonBlock>
<StyledCloseButtonBlock onClick={this.onClick}>
<CloseButton
isDisabled={this.props.isDisabled}
onClick={!this.props.isDisabled ? ((e) => this.props.onClose(e, this.props.id)) : undefined}
onClick={this.onClick}
/>
</StyledCloseButtonBlock>
</StyledFilterItem>

View File

@ -38,7 +38,7 @@ const cloneObjectsArray = function (props) {
const convertToInternalData = function (fullDataArray, inputDataArray) {
const filterItems = [];
for (let i = 0; i < inputDataArray.length; i++) {
const filterValue = fullDataArray.find(x => ((x.key === inputDataArray[i].key.replace(inputDataArray[i].group + "_", '')) && x.group === inputDataArray[i].group && !x.inSubgroup));
let filterValue = fullDataArray.find(x => ((x.key === inputDataArray[i].key.replace(inputDataArray[i].group + "_", '')) && x.group === inputDataArray[i].group && !x.inSubgroup));
if (filterValue) {
inputDataArray[i].key = inputDataArray[i].group + "_" + inputDataArray[i].key;
inputDataArray[i].label = filterValue.label;

View File

@ -40,7 +40,7 @@ class IconButton extends React.PureComponent {
if (isDisabled) return;
this.setState({
currentIconName: iconHoverName || iconName,
currentIconName: !('ontouchstart' in document.documentElement) ? iconHoverName || iconName : iconName,
currentIconColor: hoverColor || color
});
@ -71,7 +71,7 @@ class IconButton extends React.PureComponent {
if (isDisabled) return;
this.setState({
currentIconName: iconClickName || iconName,
currentIconName: !('ontouchstart' in document.documentElement) ? iconClickName || iconName : iconName,
currentIconColor: clickColor || color
});
@ -92,7 +92,7 @@ class IconButton extends React.PureComponent {
switch (e.nativeEvent.which) {
case 1: //Left click
this.setState({
currentIconName: iconHoverName || iconName,
currentIconName: !('ontouchstart' in document.documentElement) ? iconHoverName || iconName : iconName,
currentIconColor: iconHoverName || color
});

View File

@ -17,6 +17,8 @@ const StyledIconBlock = styled.div`
(props.size === 'big' && '30px') ||
(props.size === 'huge' && '30px')
};
cursor: ${props =>
props.isDisabled || !props.isClickable ? "default" : "pointer"};
height: 100%;
padding-right: 7px;
`;
@ -157,7 +159,10 @@ class InputBlock extends React.Component {
{
iconNames.includes(iconName) && (
<div className="append">
<StyledIconBlock>
<StyledIconBlock
isDisabled={isDisabled}
onClick={this.onIconClick}
isClickable={typeof onIconClick === 'function'}>
<IconButton
size={iconButtonSize}
color={iconColor}

View File

@ -1,9 +1,9 @@
import React from "react";
import styled from "styled-components";
import PropTypes from "prop-types";
import isEqual from "lodash/isEqual";
import Checkbox from "../checkbox";
import ContextMenuButton from "../context-menu-button";
import PropTypes from "prop-types";
import React from "react";
import isEqual from "lodash/isEqual";
import styled from "styled-components";
import { tablet } from "../../utils/device";
const StyledRow = styled.div`
@ -48,13 +48,14 @@ const StyledElement = styled.div`
`;
const StyledOptionButton = styled.div`
flex: 0 0 18px;
display: flex;
margin-left: 8px;
margin-right: 16px;
`;
// eslint-disable-next-line react/display-name
.expandButton > div:first-child {
padding-top: 8px;
padding-bottom: 8px;
padding-left: 16px;
}
`;
class Row extends React.Component {
shouldComponentUpdate(nextProps) {
@ -106,7 +107,7 @@ class Row extends React.Component {
<StyledContent>{children}</StyledContent>
<StyledOptionButton>
{renderContext && (
<ContextMenuButton directionX="right" getData={getOptions} />
<ContextMenuButton className="expandButton" directionX="right" getData={getOptions} />
)}
</StyledOptionButton>
</StyledRow>
@ -116,14 +117,14 @@ class Row extends React.Component {
Row.propTypes = {
checked: PropTypes.bool,
element: PropTypes.element,
children: PropTypes.element,
data: PropTypes.object,
contextOptions: PropTypes.array,
onSelect: PropTypes.func,
needForUpdate: PropTypes.func,
className: PropTypes.string,
contextOptions: PropTypes.array,
data: PropTypes.object,
element: PropTypes.element,
id: PropTypes.string,
needForUpdate: PropTypes.func,
onSelect: PropTypes.func,
style: PropTypes.oneOfType([PropTypes.object, PropTypes.array])
};