Web: Added possibility to change number through the input, changed the display of the maximum number, added border numbers for the track.
This commit is contained in:
parent
12a83327b0
commit
2ca45ff75d
@ -1,6 +1,5 @@
|
||||
import React, { useState } from "react";
|
||||
import styled from "styled-components";
|
||||
import { useTranslation, Trans } from "react-i18next";
|
||||
import Text from "@docspace/components/text";
|
||||
import { inject, observer } from "mobx-react";
|
||||
|
||||
@ -24,9 +23,10 @@ const StyledBody = styled.div`
|
||||
}
|
||||
`;
|
||||
|
||||
const step = "1",
|
||||
const step = 1,
|
||||
minUsersCount = 1,
|
||||
maxUsersCount = 1000;
|
||||
maxUsersCount = 1000,
|
||||
maxSliderNumber = 999;
|
||||
|
||||
const PriceCalculation = ({ t, price }) => {
|
||||
const [usersCount, setUsersCount] = useState(minUsersCount);
|
||||
@ -36,12 +36,46 @@ const PriceCalculation = ({ t, price }) => {
|
||||
count > minUsersCount ? setUsersCount(count) : setUsersCount(minUsersCount);
|
||||
};
|
||||
|
||||
const onPlusClick = () => {
|
||||
usersCount < maxUsersCount && setUsersCount(usersCount + 1);
|
||||
};
|
||||
const onClickOperations = (e) => {
|
||||
const operation = e.currentTarget.dataset.operation;
|
||||
|
||||
const onMinusClick = () => {
|
||||
usersCount > minUsersCount && setUsersCount(usersCount - 1);
|
||||
let value = +usersCount;
|
||||
|
||||
if (operation === "plus") {
|
||||
if (usersCount < maxUsersCount) {
|
||||
value += step;
|
||||
}
|
||||
}
|
||||
if (operation === "minus") {
|
||||
if (usersCount >= maxUsersCount) {
|
||||
value = maxSliderNumber;
|
||||
} else {
|
||||
if (usersCount > minUsersCount) {
|
||||
value -= step;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
value !== +usersCount && setUsersCount(value);
|
||||
};
|
||||
const onChangeNumber = (e) => {
|
||||
const { target } = e;
|
||||
let value = target.value;
|
||||
|
||||
if (usersCount >= maxUsersCount) {
|
||||
value = value.slice(0, -1);
|
||||
}
|
||||
|
||||
const numberValue = +value;
|
||||
|
||||
if (isNaN(numberValue)) return;
|
||||
|
||||
if (numberValue === 0) {
|
||||
setUsersCount(minUsersCount);
|
||||
return;
|
||||
}
|
||||
|
||||
setUsersCount(numberValue);
|
||||
};
|
||||
|
||||
return (
|
||||
@ -51,11 +85,12 @@ const PriceCalculation = ({ t, price }) => {
|
||||
</Text>
|
||||
<SelectUsersCountContainer
|
||||
maxUsersCount={maxUsersCount}
|
||||
maxSliderNumber={maxSliderNumber}
|
||||
step={step}
|
||||
usersCount={usersCount}
|
||||
onMinusClick={onMinusClick}
|
||||
onPlusClick={onPlusClick}
|
||||
onClickOperations={onClickOperations}
|
||||
onSliderChange={onSliderChange}
|
||||
onChangeNumber={onChangeNumber}
|
||||
/>
|
||||
<TotalTariffContainer t={t} usersCount={usersCount} price={price} />
|
||||
</StyledBody>
|
||||
|
@ -13,6 +13,7 @@ import PriceCalculation from "./PriceCalculation";
|
||||
import BenefitsContainer from "./BenefitsContainer";
|
||||
import { smallTablet } from "@docspace/components/utils/device";
|
||||
import ContactContainer from "./ContactContainer";
|
||||
import toastr from "@docspace/components/toast/toastr";
|
||||
|
||||
const StyledBody = styled.div`
|
||||
max-width: 660px;
|
||||
@ -54,7 +55,7 @@ const TariffsPageWrapper = ({
|
||||
useEffect(() => {
|
||||
(async () => {
|
||||
try {
|
||||
await Promise.all([setQuota(), setTariffsInfo()]);
|
||||
await Promise.all([setQuota()]);
|
||||
} catch (error) {
|
||||
toastr.error(error);
|
||||
}
|
||||
|
@ -6,6 +6,9 @@ import Slider from "@docspace/components/slider";
|
||||
import PlusIcon from "../../../../public/images/plus.react.svg";
|
||||
import MinusIcon from "../../../../public/images/minus.react.svg";
|
||||
import { smallTablet } from "@docspace/components/utils/device";
|
||||
import TextInput from "@docspace/components/text-input";
|
||||
import { inject, observer } from "mobx-react";
|
||||
|
||||
const StyledBody = styled.div`
|
||||
max-width: 272px;
|
||||
margin: 0 auto;
|
||||
@ -14,6 +17,36 @@ const StyledBody = styled.div`
|
||||
max-width: 520px;
|
||||
}
|
||||
|
||||
.slider-track {
|
||||
display: flex;
|
||||
position: relative;
|
||||
margin-top: -10px;
|
||||
height: 16px;
|
||||
|
||||
.slider-track-value_min,
|
||||
.slider-track-value_max {
|
||||
color: ${(props) =>
|
||||
props.theme.avatarEditorBody.slider.trackNumber.color};
|
||||
}
|
||||
|
||||
.slider-track-value_max {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
}
|
||||
.slider-track-value_min {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.payments-operations_input {
|
||||
width: 111px;
|
||||
font-size: 44px;
|
||||
text-align: center;
|
||||
margin-left: 20px;
|
||||
margin-right: 20px;
|
||||
}
|
||||
|
||||
.tariff-users {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
@ -48,36 +81,55 @@ const StyledBody = styled.div`
|
||||
}
|
||||
`;
|
||||
|
||||
const min = 0;
|
||||
const SelectUsersCountContainer = ({
|
||||
maxUsersCount,
|
||||
step,
|
||||
maxSliderNumber,
|
||||
usersCount,
|
||||
onMinusClick,
|
||||
onPlusClick,
|
||||
onSliderChange,
|
||||
onClickOperations,
|
||||
onChangeNumber,
|
||||
theme,
|
||||
}) => {
|
||||
const { t } = useTranslation("Payments");
|
||||
|
||||
const value =
|
||||
usersCount >= maxUsersCount ? maxSliderNumber + "+" : usersCount + "";
|
||||
|
||||
console.log("usersCount", usersCount, "value", value);
|
||||
return (
|
||||
<StyledBody>
|
||||
<StyledBody theme={theme}>
|
||||
<Text noSelect fontWeight={600} className="tariff-users_text">
|
||||
{t("ManagersNumber")}
|
||||
</Text>
|
||||
<div className="tariff-users">
|
||||
<div className="circle" onClick={onMinusClick}>
|
||||
<MinusIcon onClick={onMinusClick} className="tariff-score" />
|
||||
<div
|
||||
className="circle"
|
||||
onClick={onClickOperations}
|
||||
data-operation={"minus"}
|
||||
>
|
||||
<MinusIcon onClick={onClickOperations} className="tariff-score" />
|
||||
</div>
|
||||
<Text noSelect fontSize={"44px"} className="tariff-users_count" isBold>
|
||||
{usersCount}
|
||||
</Text>
|
||||
<div className="circle" onClick={onPlusClick}>
|
||||
<PlusIcon onClick={onPlusClick} className="tariff-score" />
|
||||
|
||||
<TextInput
|
||||
withBorder={false}
|
||||
className="payments-operations_input"
|
||||
value={value}
|
||||
onChange={onChangeNumber}
|
||||
/>
|
||||
<div
|
||||
className="circle"
|
||||
onClick={onClickOperations}
|
||||
data-operation={"plus"}
|
||||
>
|
||||
<PlusIcon onClick={onClickOperations} className="tariff-score" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<Slider
|
||||
type="range"
|
||||
min={"0"}
|
||||
min={min}
|
||||
max={maxUsersCount.toString()}
|
||||
step={step}
|
||||
withPouring
|
||||
@ -85,8 +137,15 @@ const SelectUsersCountContainer = ({
|
||||
onChange={onSliderChange}
|
||||
colorPouring={"#20D21F"}
|
||||
/>
|
||||
<div className="slider-track">
|
||||
<Text className="slider-track-value_min">{min}</Text>
|
||||
<Text className="slider-track-value_max">{maxSliderNumber + "+"}</Text>
|
||||
</div>
|
||||
</StyledBody>
|
||||
);
|
||||
};
|
||||
|
||||
export default SelectUsersCountContainer;
|
||||
export default inject(({ auth }) => {
|
||||
const { theme } = auth.settingsStore;
|
||||
return { theme };
|
||||
})(observer(SelectUsersCountContainer));
|
||||
|
@ -19,7 +19,7 @@ const StyledBody = styled.div`
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
background: #f3f4f4;
|
||||
|
||||
margin-top: 24px;
|
||||
p:first-child {
|
||||
margin-right: 8px;
|
||||
}
|
||||
|
@ -1177,6 +1177,10 @@ const Base = {
|
||||
height: "8px",
|
||||
},
|
||||
|
||||
trackNumber: {
|
||||
color: "#A3A9AE",
|
||||
},
|
||||
|
||||
fillLower: {
|
||||
background: grayLightMid,
|
||||
focusBackground: grayLightMid,
|
||||
|
@ -1174,6 +1174,10 @@ const Dark = {
|
||||
height: "8px",
|
||||
},
|
||||
|
||||
trackNumber: {
|
||||
color: "#A3A9AE",
|
||||
},
|
||||
|
||||
fillLower: {
|
||||
background: "#242424",
|
||||
focusBackground: "#242424",
|
||||
|
Loading…
Reference in New Issue
Block a user