Skip to content

Commit 17d110a

Browse files
committed
feat(pluggable-widgets-commons): add three state checkbox
1 parent 21fc936 commit 17d110a

File tree

6 files changed

+95
-6
lines changed

6 files changed

+95
-6
lines changed

packages/pluggableWidgets/selection-helper-web/src/ui/CheckBox.scss renamed to packages/modules/data-widgets/src/themesource/datawidgets/web/_three-state-checkbox.scss

File renamed without changes.

packages/modules/data-widgets/src/themesource/datawidgets/web/main.scss

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,6 @@
55
@import "drop-down-sort";
66
@import "gallery";
77
@import "gallery-design-properties";
8+
@import "three-state-checkbox";
89
@import "tree-node";
910
@import "tree-node-design-properties";

packages/pluggableWidgets/selection-helper-web/src/components/SelectionHelperComponent.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { createElement, ReactElement, ReactNode, useMemo } from "react";
2-
import { CheckBox } from "./CheckBox";
2+
import { ThreeStateCheckBox } from "@mendix/pluggable-widgets-commons/components/web";
33

44
interface Props {
55
type: "checkbox" | "custom";
@@ -30,7 +30,7 @@ export function SelectionHelperComponent(props: Props): ReactElement {
3030
</div>
3131
) : (
3232
<div className="selection-helper-checkbox mx-checkbox form-group label-after">
33-
<CheckBox id={id} value={props.status} onChange={props.onClick} />
33+
<ThreeStateCheckBox id={id} value={props.status} onChange={props.onClick} />
3434
<label htmlFor={id} className="control-label">
3535
{props.children}
3636
</label>

packages/pluggableWidgets/selection-helper-web/src/components/CheckBox.tsx renamed to packages/shared/pluggable-widgets-commons/src/components/web/ThreeStateCheckBox.tsx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
import { createElement, ReactElement, useEffect, useRef } from "react";
2-
import "../ui/CheckBox.scss";
32

4-
interface CheckBoxProps {
5-
id: string;
3+
interface ThreeStateCheckBoxProps {
4+
id?: string;
65
value: "all" | "some" | "none";
76
onChange?: () => void;
87
}
98

10-
export function CheckBox({ id, value, onChange }: CheckBoxProps): ReactElement {
9+
export function ThreeStateCheckBox({ id, value, onChange }: ThreeStateCheckBoxProps): ReactElement {
1110
const checkboxRef = useRef<HTMLInputElement | null>(null);
1211
useEffect(() => {
1312
if (!checkboxRef.current) {

packages/shared/pluggable-widgets-commons/src/components/web/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ export * from "./components";
22
export * from "./FilterSelector";
33
export * from "./InfiniteBody";
44
export * from "./Pagination";
5+
export * from "./ThreeStateCheckBox";
56
export * from "./usePositionObserver";
67
export * from "./utils";
78
export * from "./preview";
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
input[type="checkbox"].three-state-checkbox {
2+
position: relative !important; //Remove after mxui merge
3+
width: 16px;
4+
height: 16px;
5+
margin: 0 !important; // Remove after mxui merge
6+
cursor: pointer;
7+
-webkit-user-select: none;
8+
user-select: none;
9+
appearance: none;
10+
-moz-appearance: none;
11+
-webkit-appearance: none;
12+
transform: translateZ(0);
13+
14+
&:before,
15+
&:after {
16+
position: absolute;
17+
display: block;
18+
transition: all 0.3s ease;
19+
}
20+
21+
&:before {
22+
// Checkbox
23+
width: 100%;
24+
height: 100%;
25+
content: "";
26+
border: 1px solid #e7e7e9;
27+
border-radius: 4px;
28+
background-color: transparent;
29+
}
30+
31+
&:not(:indeterminate):after {
32+
// Checkmark
33+
width: 8px;
34+
height: 4px;
35+
margin: 5px 4px;
36+
transform: rotate(-45deg);
37+
pointer-events: none;
38+
border: 2px solid #ffffff;
39+
border-top: 0;
40+
border-right: 0;
41+
}
42+
43+
&:indeterminate:after {
44+
// Checkmark
45+
width: 8px;
46+
height: 4px;
47+
margin: 5px 4px;
48+
transform: rotate(0deg);
49+
pointer-events: none;
50+
border: 0 solid #ffffff;
51+
border-bottom-width: 2px;
52+
transition: border 0s;
53+
}
54+
55+
&:not(:disabled):not(:checked):hover:after {
56+
content: "";
57+
border-color: #e7e7e9; // color of checkmark on hover
58+
}
59+
60+
&:indeterminate:before,
61+
&:checked:before {
62+
border-color: #264ae5;
63+
background-color: #264ae5;
64+
}
65+
66+
&:indeterminate:after,
67+
&:checked:after {
68+
content: "";
69+
}
70+
71+
&:disabled:before {
72+
background-color: #f8f8f8;
73+
}
74+
75+
&:checked:disabled:before {
76+
border-color: transparent;
77+
background-color: rgba(#264ae5, 0.4);
78+
}
79+
80+
&:disabled:after,
81+
&:checked:disabled:after {
82+
border-color: #f8f8f8;
83+
}
84+
85+
& + .control-label {
86+
margin-left: 8px;
87+
}
88+
}

0 commit comments

Comments
 (0)