Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,4 @@ node_modules
data/kronos.bolt
bin
*.sqlite
.idea/
.husky/
.idea/
4 changes: 4 additions & 0 deletions .husky/pre-commit
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

npx lint-staged
53 changes: 53 additions & 0 deletions ui/src/components/atoms/ToggleAllCheckbox/ToggleAllCheckbox.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
import { Checkbox, CheckboxProps } from '@/components/chakra/checkbox.tsx';

interface ToggleAllCheckboxProps extends CheckboxProps {
/**
* The array of the checked items.
*/
checkedItems: unknown[];

/**
* The array that contains all the check-able items.
*/
allItems: unknown[];

/**
* Callback triggered when the checkbox is pressed when all the items are checked.
*/
onResetCheckedItems(): void;

/**
* Callback triggered when the checkbox is pressed and not all the items are checked.
*/
onCheckAllItems(): void;
}

export default function ToggleAllCheckbox(props: ToggleAllCheckboxProps) {
const {
checkedItems,
allItems,
onCheckAllItems,
onResetCheckedItems,
...rest
} = props;
const areAllChecked = checkedItems.length === allItems.length;
const indeterminate = checkedItems.length > 0 && !areAllChecked;

const handleCheck = () => {
if (areAllChecked) {
return onResetCheckedItems();
}

onCheckAllItems();
};

return (
<Checkbox
onCheckedChange={handleCheck}
checked={indeterminate ? 'indeterminate' : areAllChecked}
{...rest}
>
Select all schedules
</Checkbox>
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import {
Grid,
GridItem,
HStack,
VisuallyHidden,
} from '@chakra-ui/react';
import {
ActionBarContent,
Expand All @@ -23,6 +24,7 @@ import ScheduleActionButton, {
ScheduleAction,
} from '@/components/atoms/ScheduleActionButton/ScheduleActionButton.tsx';
import ScheduleDetail from '@/components/molecules/ScheduleDetail/ScheduleDetail.tsx';
import ToggleAllCheckbox from '@/components/atoms/ToggleAllCheckbox/ToggleAllCheckbox.tsx';

interface ScheduleCardListProps {
schedules: Schedule[];
Expand Down Expand Up @@ -84,8 +86,19 @@ export default function ScheduleCardList(props: ScheduleCardListProps) {
onValueChange={(schedules) => setCheckedSchedulesIds(schedules)}
>
<Fieldset.Legend textAlign="left" fontSize="sm" mb="2">
Schedules
<VisuallyHidden>Schedules</VisuallyHidden>
</Fieldset.Legend>

<ToggleAllCheckbox
mb={3}
checkedItems={checkedSchedulesIds}
allItems={schedules}
onResetCheckedItems={() => setCheckedSchedulesIds([])}
onCheckAllItems={() =>
setCheckedSchedulesIds(schedules.map((s) => s.id))
}
/>

<Grid
templateColumns={{
base: '1fr',
Expand Down
3 changes: 2 additions & 1 deletion ui/src/components/organisms/ScheduleList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,8 @@ export default function ScheduleList() {

const { state, dispatch } = useContext(AppContext);
const noSchedules = !schedules.isFetching && !schedules.data?.length;
const isAnimationDisabled = state.animationStatus === 'played';
const isAnimationDisabled =
!noSchedules || state.animationStatus === 'played';

const handleSeed = async () => {
try {
Expand Down