|
@@ -11,8 +11,9 @@
|
|
|
* specific language governing permissions and limitations under the License.
|
|
|
*/
|
|
|
|
|
|
-import React, { CSSProperties, MouseEvent, useCallback, useEffect, useState } from "react";
|
|
|
+import React, { CSSProperties, MouseEvent, SyntheticEvent, useCallback, useEffect, useState } from "react";
|
|
|
import Box from "@mui/material/Box";
|
|
|
+import Switch from "@mui/material/Switch";
|
|
|
import Typography from "@mui/material/Typography";
|
|
|
import ToggleButton from "@mui/material/ToggleButton";
|
|
|
import ToggleButtonGroup from "@mui/material/ToggleButtonGroup";
|
|
@@ -22,24 +23,25 @@ import { createSendUpdateAction } from "../../context/taipyReducers";
|
|
|
import ThemeToggle from "./ThemeToggle";
|
|
|
import { LovProps, useLovListMemo } from "./lovUtils";
|
|
|
import { useClassNames, useDispatch, useDynamicProperty, useModule } from "../../utils/hooks";
|
|
|
-import { getUpdateVar } from "./utils";
|
|
|
+import { emptyStyle, getSuffixedClassNames, getUpdateVar } from "./utils";
|
|
|
import { Icon, IconAvatar } from "../../utils/icon";
|
|
|
+import { FormControlLabel } from "@mui/material";
|
|
|
|
|
|
-const groupSx = {verticalAlign: "middle"};
|
|
|
+const groupSx = { verticalAlign: "middle" };
|
|
|
|
|
|
interface ToggleProps extends LovProps<string> {
|
|
|
style?: CSSProperties;
|
|
|
label?: string;
|
|
|
- kind?: string;
|
|
|
unselectedValue?: string;
|
|
|
allowUnselect?: boolean;
|
|
|
+ mode?: string;
|
|
|
+ isSwitch? : boolean;
|
|
|
}
|
|
|
|
|
|
const Toggle = (props: ToggleProps) => {
|
|
|
const {
|
|
|
id,
|
|
|
- style = {},
|
|
|
- kind,
|
|
|
+ style = emptyStyle,
|
|
|
label,
|
|
|
updateVarName = "",
|
|
|
propagate = true,
|
|
@@ -48,9 +50,18 @@ const Toggle = (props: ToggleProps) => {
|
|
|
unselectedValue = "",
|
|
|
updateVars = "",
|
|
|
valueById,
|
|
|
+ mode = "",
|
|
|
+ isSwitch = false,
|
|
|
} = props;
|
|
|
const dispatch = useDispatch();
|
|
|
const [value, setValue] = useState(props.defaultValue);
|
|
|
+ const [bVal, setBVal] = useState(() =>
|
|
|
+ typeof props.defaultValue === "boolean"
|
|
|
+ ? props.defaultValue
|
|
|
+ : typeof props.value === "boolean"
|
|
|
+ ? props.value
|
|
|
+ : false
|
|
|
+ );
|
|
|
const module = useModule();
|
|
|
|
|
|
const className = useClassNames(props.libClassName, props.dynamicClassName, props.className);
|
|
@@ -61,7 +72,7 @@ const Toggle = (props: ToggleProps) => {
|
|
|
|
|
|
const changeValue = useCallback(
|
|
|
(evt: MouseEvent, val: string) => {
|
|
|
- if (!props.allowUnselect && val === null ) {
|
|
|
+ if (!props.allowUnselect && val === null) {
|
|
|
return;
|
|
|
}
|
|
|
dispatch(
|
|
@@ -73,36 +84,60 @@ const Toggle = (props: ToggleProps) => {
|
|
|
propagate,
|
|
|
valueById ? undefined : getUpdateVar(updateVars, "lov")
|
|
|
)
|
|
|
- )},
|
|
|
- [unselectedValue, updateVarName, propagate, dispatch, updateVars, valueById, props.onChange, props.allowUnselect, module]
|
|
|
+ );
|
|
|
+ },
|
|
|
+ [
|
|
|
+ unselectedValue,
|
|
|
+ updateVarName,
|
|
|
+ propagate,
|
|
|
+ dispatch,
|
|
|
+ updateVars,
|
|
|
+ valueById,
|
|
|
+ props.onChange,
|
|
|
+ props.allowUnselect,
|
|
|
+ module,
|
|
|
+ ]
|
|
|
+ );
|
|
|
+
|
|
|
+ const changeSwitchValue = useCallback(
|
|
|
+ (evt: SyntheticEvent, checked: boolean) =>
|
|
|
+ dispatch(createSendUpdateAction(updateVarName, checked, module, props.onChange, propagate)),
|
|
|
+ [updateVarName, dispatch, props.onChange, propagate, module]
|
|
|
);
|
|
|
|
|
|
- useEffect(() => {props.value !== undefined && setValue(props.value)}, [props.value]);
|
|
|
+ useEffect(() => {
|
|
|
+ typeof props.value === "boolean" ? setBVal(props.value) : props.value !== undefined && setValue(props.value);
|
|
|
+ }, [props.value]);
|
|
|
|
|
|
- return kind === "theme" ? (
|
|
|
+ return mode.toLowerCase() === "theme" ? (
|
|
|
<ThemeToggle {...props} />
|
|
|
) : (
|
|
|
<Box id={id} sx={style} className={className}>
|
|
|
- {label ? <Typography>{label}</Typography> : null}
|
|
|
+ {label && !isSwitch ? <Typography>{label}</Typography> : null}
|
|
|
<Tooltip title={hover || ""}>
|
|
|
- <ToggleButtonGroup
|
|
|
- value={value}
|
|
|
- exclusive
|
|
|
- onChange={changeValue}
|
|
|
- disabled={!active}
|
|
|
- sx={groupSx}
|
|
|
- >
|
|
|
- {lovList &&
|
|
|
- lovList.map((v) => (
|
|
|
- <ToggleButton value={v.id} key={v.id}>
|
|
|
- {typeof v.item === "string" ? (
|
|
|
- <Typography>{v.item}</Typography>
|
|
|
- ) : (
|
|
|
- <IconAvatar id={v.id} img={v.item as Icon} />
|
|
|
- )}
|
|
|
- </ToggleButton>
|
|
|
- ))}
|
|
|
- </ToggleButtonGroup>
|
|
|
+ {isSwitch ? (
|
|
|
+ <FormControlLabel
|
|
|
+ control={<Switch />}
|
|
|
+ checked={bVal}
|
|
|
+ onChange={changeSwitchValue}
|
|
|
+ disabled={!active}
|
|
|
+ label={label}
|
|
|
+ className={getSuffixedClassNames(className, "-switch")}
|
|
|
+ />
|
|
|
+ ) : (
|
|
|
+ <ToggleButtonGroup value={value} exclusive onChange={changeValue} disabled={!active} sx={groupSx}>
|
|
|
+ {lovList &&
|
|
|
+ lovList.map((v) => (
|
|
|
+ <ToggleButton value={v.id} key={v.id}>
|
|
|
+ {typeof v.item === "string" ? (
|
|
|
+ <Typography>{v.item}</Typography>
|
|
|
+ ) : (
|
|
|
+ <IconAvatar id={v.id} img={v.item as Icon} />
|
|
|
+ )}
|
|
|
+ </ToggleButton>
|
|
|
+ ))}
|
|
|
+ </ToggleButtonGroup>
|
|
|
+ )}
|
|
|
</Tooltip>
|
|
|
</Box>
|
|
|
);
|