Merge branch 'master' of https://github.com/ONLYOFFICE/CommunityServer-AspNetCore
This commit is contained in:
commit
4bb4266bf9
18
.github/workflows/telegram.yml
vendored
Normal file
18
.github/workflows/telegram.yml
vendored
Normal 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.
|
@ -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%/" />
|
||||
<!--
|
||||
|
@ -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;
|
@ -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}
|
||||
|
@ -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) {
|
||||
|
@ -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%/" />
|
||||
<!--
|
||||
|
@ -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) {
|
||||
|
@ -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",
|
||||
|
@ -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>
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
});
|
||||
|
||||
|
@ -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}
|
||||
|
@ -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])
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user