add "reset to default" color option for ColorPicker (#8643)
* add reset to default color option * Do not show reset button in DOM if resetDefaultValue is undefined * handle edge case: if invalid hexcode is set for resetDefaultValue * Do not show the reset button if the color is already set to the default value * Remove data-testid from Button --------- Co-authored-by: Praneeth Bhogaraju <praneeth.bhogaraju@ni.com> Co-authored-by: sean-brydon <55134778+sean-brydon@users.noreply.github.com>pull/8699/head^2
parent
76807a7e70
commit
371e7b024a
|
@ -146,6 +146,7 @@ const AppearanceView = () => {
|
||||||
<p className="text-default mb-2 block text-sm font-medium">{t("light_brand_color")}</p>
|
<p className="text-default mb-2 block text-sm font-medium">{t("light_brand_color")}</p>
|
||||||
<ColorPicker
|
<ColorPicker
|
||||||
defaultValue={user.brandColor}
|
defaultValue={user.brandColor}
|
||||||
|
resetDefaultValue="#292929"
|
||||||
onChange={(value) => {
|
onChange={(value) => {
|
||||||
if (!checkWCAGContrastColor("#ffffff", value)) {
|
if (!checkWCAGContrastColor("#ffffff", value)) {
|
||||||
setLightModeError(true);
|
setLightModeError(true);
|
||||||
|
@ -167,6 +168,7 @@ const AppearanceView = () => {
|
||||||
<p className="text-default mb-2 block text-sm font-medium">{t("dark_brand_color")}</p>
|
<p className="text-default mb-2 block text-sm font-medium">{t("dark_brand_color")}</p>
|
||||||
<ColorPicker
|
<ColorPicker
|
||||||
defaultValue={user.darkBrandColor}
|
defaultValue={user.darkBrandColor}
|
||||||
|
resetDefaultValue="#fafafa"
|
||||||
onChange={(value) => {
|
onChange={(value) => {
|
||||||
if (!checkWCAGContrastColor("#101010", value)) {
|
if (!checkWCAGContrastColor("#101010", value)) {
|
||||||
setDarkModeError(true);
|
setDarkModeError(true);
|
||||||
|
|
|
@ -151,6 +151,7 @@ const ProfileView = () => {
|
||||||
<p className="text-emphasis mb-2 block text-sm font-medium">{t("light_brand_color")}</p>
|
<p className="text-emphasis mb-2 block text-sm font-medium">{t("light_brand_color")}</p>
|
||||||
<ColorPicker
|
<ColorPicker
|
||||||
defaultValue={team.brandColor}
|
defaultValue={team.brandColor}
|
||||||
|
resetDefaultValue="#292929"
|
||||||
onChange={(value) => form.setValue("brandColor", value, { shouldDirty: true })}
|
onChange={(value) => form.setValue("brandColor", value, { shouldDirty: true })}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
@ -165,6 +166,7 @@ const ProfileView = () => {
|
||||||
<p className="text-emphasis mb-2 block text-sm font-medium">{t("dark_brand_color")}</p>
|
<p className="text-emphasis mb-2 block text-sm font-medium">{t("dark_brand_color")}</p>
|
||||||
<ColorPicker
|
<ColorPicker
|
||||||
defaultValue={team.darkBrandColor}
|
defaultValue={team.darkBrandColor}
|
||||||
|
resetDefaultValue="#fafafa"
|
||||||
onChange={(value) => form.setValue("darkBrandColor", value, { shouldDirty: true })}
|
onChange={(value) => form.setValue("darkBrandColor", value, { shouldDirty: true })}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -4,6 +4,8 @@ import { HexColorInput, HexColorPicker } from "react-colorful";
|
||||||
|
|
||||||
import cx from "@calcom/lib/classNames";
|
import cx from "@calcom/lib/classNames";
|
||||||
import { fallBackHex, isValidHexCode } from "@calcom/lib/getBrandColours";
|
import { fallBackHex, isValidHexCode } from "@calcom/lib/getBrandColours";
|
||||||
|
import { Button } from "@calcom/ui";
|
||||||
|
import { RotateCcw } from "@calcom/ui/components/icon";
|
||||||
|
|
||||||
export type ColorPickerProps = {
|
export type ColorPickerProps = {
|
||||||
defaultValue: string;
|
defaultValue: string;
|
||||||
|
@ -11,12 +13,18 @@ export type ColorPickerProps = {
|
||||||
container?: HTMLElement;
|
container?: HTMLElement;
|
||||||
popoverAlign?: React.ComponentProps<typeof Popover.Content>["align"];
|
popoverAlign?: React.ComponentProps<typeof Popover.Content>["align"];
|
||||||
className?: string;
|
className?: string;
|
||||||
|
resetDefaultValue?: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
const ColorPicker = (props: ColorPickerProps) => {
|
const ColorPicker = (props: ColorPickerProps) => {
|
||||||
const init = !isValidHexCode(props.defaultValue)
|
const init = !isValidHexCode(props.defaultValue)
|
||||||
? fallBackHex(props.defaultValue, false)
|
? fallBackHex(props.defaultValue, false)
|
||||||
: props.defaultValue;
|
: props.defaultValue;
|
||||||
|
const resetDefaultValue =
|
||||||
|
props.resetDefaultValue &&
|
||||||
|
(!isValidHexCode(props.resetDefaultValue)
|
||||||
|
? fallBackHex(props.resetDefaultValue, false)
|
||||||
|
: props.resetDefaultValue);
|
||||||
const [color, setColor] = useState(init);
|
const [color, setColor] = useState(init);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
@ -57,6 +65,22 @@ const ColorPicker = (props: ColorPickerProps) => {
|
||||||
}}
|
}}
|
||||||
type="text"
|
type="text"
|
||||||
/>
|
/>
|
||||||
|
{resetDefaultValue && color != resetDefaultValue && (
|
||||||
|
<div className="px-1">
|
||||||
|
<Button
|
||||||
|
color={resetDefaultValue == "#292929" ? "primary" : "secondary"}
|
||||||
|
target="_blank"
|
||||||
|
variant="icon"
|
||||||
|
rel="noreferrer"
|
||||||
|
StartIcon={RotateCcw}
|
||||||
|
tooltip="Reset to default"
|
||||||
|
onClick={() => {
|
||||||
|
setColor(fallBackHex(resetDefaultValue, false));
|
||||||
|
props.onChange(resetDefaultValue);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue