Skip to content

Commit 19e88fa

Browse files
committed
Optimization: Alterations in file selection for submission
1 parent 3f1802f commit 19e88fa

File tree

5 files changed

+80
-47
lines changed

5 files changed

+80
-47
lines changed

Diff for: frontend/src/App.css

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
.sides {
88
width: 24%;
9-
min-width: 170px;
9+
min-width: 240px;
1010
overflow: hidden;
1111
background-color: #dfe3e3;
1212
height: 100%;

Diff for: frontend/src/components/changes/FileState.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ const FileState = (props: { s: repository.FileStatus }) => {
7777
}
7878

7979
return <div className="file">
80-
<Checkbox disabled={(props.s.staging != " " ) && (props.s.staging != "?")} value={props.s.path} style={{marginRight: 6}}/>
80+
<Checkbox disabled={props.s.worktree == " " } value={props.s.path} style={{marginRight: 6}}/>
8181
<Dropdown menu={{ items:contextMenu(props.s.path) }} trigger={['contextMenu']}>
8282
<span
8383
className="file-name"

Diff for: frontend/src/components/changes/Index.tsx

+26-44
Original file line numberDiff line numberDiff line change
@@ -2,51 +2,51 @@ import "./style.scss"
22
import {State} from "../../store";
33
import Block from "../block/Index"
44
import FileState from "./FileState"
5-
import React, {useState} from 'react';
5+
import React, {useState,useMemo,useEffect} from 'react';
66
import {useDispatch, useSelector} from "react-redux";
7-
import {Input, Button, Space, Checkbox,Badge} from 'antd';
7+
import { Space, Checkbox,Badge} from 'antd';
88
import { PresetStatusColorType } from "antd/es/_util/colors"
9-
import {FileStatus,Commit} from "../../../wailsjs/go/repository/Repository"
9+
import {FileStatus} from "../../../wailsjs/go/repository/Repository"
1010
import type {CheckboxChangeEvent} from 'antd/es/checkbox';
1111
import type {CheckboxValueType} from 'antd/es/checkbox/Group';
1212
import {success, warning} from "../../utils/common";
1313
import {setRepositoryStatus, updateWorkZone} from "../../utils/repo";
1414
import {setStatus} from "../../store/sliceMain";
15+
import SubmitView from "./SubmitView";
1516

1617

17-
const {TextArea} = Input;
18-
1918

2019
const Changes = () => {
2120
const dispatch = useDispatch();
2221
const branch = useSelector((state: State) => state.main.selectedRepositoryBranch);
2322
const selectedRepositoryId = useSelector((state: State) => state.main.selectedRepositoryId);
24-
const fileState = useSelector((state: State) => state.main.currentlyRepositoryFileState);
25-
26-
const [commitName,setCommitName] = useState<string>("")
27-
const [commitMessage,setCommitMessage] = useState<string>("")
28-
2923
const [badgeStatus,setBadgeStatus] = useState<PresetStatusColorType>("success")
3024

25+
const fileState = useSelector((state: State) => state.main.currentlyRepositoryFileState);
26+
27+
const changedFileInWorkspace = useMemo( ()=>fileState.filter(r=>(r.worktree != " ")).map(r => r.path),[fileState])
28+
const unchangedFileInWorkspace = useMemo( ()=>fileState.filter(r=>(r.worktree == " ")).map(r => r.path),[fileState])
3129

32-
const [checkedList, setCheckedList] = useState<CheckboxValueType[]>([]);
30+
const [checkedList, setCheckedList] = useState<string[]>(unchangedFileInWorkspace);
3331
const [indeterminate, setIndeterminate] = useState(true);
3432
const [checkAll, setCheckAll] = useState(false);
3533

36-
const commit = async () => {
37-
if(commitName.length === 0){
38-
warning("Please fill in the title for the submission.")
39-
return
40-
}
41-
if(checkedList.length === 0){
42-
warning("Please check the box for the file you want to submit.")
34+
useEffect(()=>{
35+
setCheckedList(unchangedFileInWorkspace)
36+
},[fileState])
37+
38+
useEffect(()=>{
39+
if(fileState.length===0){
40+
setCheckAll(false);
41+
setIndeterminate(false);
4342
return
4443
}
44+
setCheckAll(checkedList.length === fileState.length);
45+
setIndeterminate(checkedList.length !==0 && checkedList.length < fileState.length);
46+
},[checkedList])
47+
48+
const commitSuccess = async () => {
4549
try {
46-
const hash = await Commit(commitName,commitMessage,checkedList as string[]);
47-
success("Commit hash:"+hash)
48-
setCommitName("")
49-
setCommitMessage("")
5050
setCheckedList([])
5151
await updateWorkZone(selectedRepositoryId,branch)
5252
}catch (e) {
@@ -56,16 +56,12 @@ const Changes = () => {
5656
}
5757

5858
const onChange = (list: CheckboxValueType[]) => {
59-
setCheckedList(list);
60-
setIndeterminate(!!list.length && list.length < fileState.length);
61-
setCheckAll(list.length === fileState.length);
59+
setCheckedList(list as string[]);
6260
};
6361

6462
const onCheckAllChange = (e: CheckboxChangeEvent) => {
65-
let file = fileState.filter(r=>(r.staging==" "||r.staging=="?")).map(r => r.path)
66-
setCheckedList(e.target.checked ? file : []);
67-
setIndeterminate(false);
68-
setCheckAll(e.target.checked);
63+
let checkedList = e.target.checked ? [...changedFileInWorkspace,...unchangedFileInWorkspace] : unchangedFileInWorkspace
64+
setCheckedList(checkedList);
6965
};
7066

7167
const getChangesStatus = () => {
@@ -83,18 +79,6 @@ const Changes = () => {
8379
})
8480
}
8581

86-
const bottom = <div style={{padding: 12}}>
87-
<Space direction="vertical" size="middle" style={{display: 'flex'}}>
88-
<Input value={commitName} onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
89-
setCommitName(e.target.value)
90-
}} placeholder="Title"/>
91-
<TextArea value={commitMessage} onChange={(e: React.ChangeEvent<HTMLTextAreaElement>) => {
92-
setCommitMessage(e.target.value)
93-
}} rows={4}/>
94-
<Button block type="primary" onClick={async ()=>{await commit()}}>Commit to { branch }</Button>
95-
</Space>
96-
</div>
97-
9882
const action = <Space size="middle" style={{display: 'flex'}}>
9983
<div>{checkedList.length}</div>
10084
<Checkbox indeterminate={indeterminate} onChange={onCheckAllChange} checked={checkAll}>
@@ -103,16 +87,14 @@ const Changes = () => {
10387
</Space>
10488

10589

106-
10790
return (
10891
<Block
109-
// title={<Badge status="success" /><RedoOutlined onClick={getChangesStatus} style={{cursor:'pointer'}} />}
11092
title={
11193
<div style={{cursor:'pointer'}} onClick={getChangesStatus}>
11294
<Badge status={badgeStatus} text="Refresh"/>
11395
</div>
11496
}
115-
bottom={bottom}
97+
bottom={<SubmitView checkedList={checkedList} success={commitSuccess} unchangedFileInWorkspace={unchangedFileInWorkspace}/>}
11698
action={action}>
11799
<Checkbox.Group
118100
value={checkedList}

Diff for: frontend/src/components/changes/SubmitView.tsx

+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import {State} from "../../store";
2+
import React, {useState} from "react";
3+
import {Button, Input,Space} from 'antd';
4+
import { useSelector} from "react-redux";
5+
import {success, warning} from "../../utils/common"
6+
import {Commit} from "../../../wailsjs/go/repository/Repository"
7+
8+
const {TextArea} = Input;
9+
10+
const SubmitView = (props: { checkedList :string[],unchangedFileInWorkspace:string[],success:()=>void }) => {
11+
const [commitName,setCommitName] = useState<string>("")
12+
const [commitMessage,setCommitMessage] = useState<string>("")
13+
const branch = useSelector((state: State) => state.main.selectedRepositoryBranch);
14+
15+
const commit = async () => {
16+
if(commitName.length === 0){
17+
warning("Please fill in the title for the submission.")
18+
return
19+
}
20+
if(props.checkedList.length === 0 && props.unchangedFileInWorkspace.length==0){
21+
warning("Please check the box for the file you want to submit.")
22+
return
23+
}
24+
let submitList = props.checkedList.filter((item) => !props.unchangedFileInWorkspace.includes(item));
25+
26+
try {
27+
const hash = await Commit(commitName,commitMessage,submitList);
28+
success("Commit hash:"+hash)
29+
setCommitName("")
30+
setCommitMessage("")
31+
props.success()
32+
}catch (e) {
33+
console.log(e)
34+
warning(JSON.stringify(e))
35+
}
36+
}
37+
38+
return <div style={{padding: 12}}>
39+
<Space direction="vertical" size="middle" style={{display: 'flex'}}>
40+
<Input value={commitName} onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
41+
setCommitName(e.target.value)
42+
}} placeholder="Title"/>
43+
<TextArea value={commitMessage} onChange={(e: React.ChangeEvent<HTMLTextAreaElement>) => {
44+
setCommitMessage(e.target.value)
45+
}} rows={4}/>
46+
<Button block type="primary" onClick={async ()=>{await commit()}}>Commit to { branch }</Button>
47+
</Space>
48+
</div>
49+
}
50+
51+
export default SubmitView

Diff for: frontend/src/store/sliceMain.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import {repository} from "../../wailsjs/go/models"
2-
import {createSlice, PayloadAction} from "@reduxjs/toolkit";
2+
import {createSlice, PayloadAction,createSelector} from "@reduxjs/toolkit";
33

44
export type Main = {
55
selectedRepositoryId: string

0 commit comments

Comments
 (0)