Browse Source

사용자관리 그룹화 작업

pull/2/head
junh_eee(이준희) 2 years ago
parent
commit
acb1db2c96
  1. 79
      src/components/basis/group/BasisGroupGrid.js
  2. 50
      src/components/basis/group/BasisGroupUsersGrid.js
  3. 3
      src/components/basis/group/BasisGroupUsersSearch.js
  4. 29
      src/containers/basis/group/BasisGroupApprovalContainer.js
  5. 358
      src/containers/basis/group/BasisGroupUsersContainer.js

79
src/components/basis/group/BasisGroupGrid.js

@ -1,38 +1,18 @@
import { GridDatabase } from '../../crud/grid/GridDatatable'; import { GridDatabase } from '../../crud/grid/GridDatatable';
import { import { Card } from 'reactstrap';
Row,
Col,
Table,
Badge,
UncontrolledDropdown,
DropdownMenu,
DropdownItem,
DropdownToggle,
Card,
CardHeader,
CardBody,
CardTitle,
CardSubtitle,
ButtonGroup,
Button,
Input,
CustomInput,
FormGroup,
Spinner
} from 'reactstrap';
import { ExcelExportButton } from '../../crud/excel/ExcelExportButton';
export const BasisGroupGrid = props => { export const BasisGroupGrid = props => {
return ( return (
<div className='pal-card-box'> // <div className='pal-card-box'>
<Row> // <Row>
<Col> // <Col>
<div className='cont-ti d-flex justify-content-between align-items-sm-center align-items-start flex-sm-row'> <>
<div> <div className='cont-ti d-flex justify-content-between align-items-sm-center align-items-start flex-sm-row'>
<h4>{props.title} 목록</h4> <div>
<span className='search-case'>검색결과 {props.count}</span> <h4>{props.title} 목록</h4>
</div> <span className='search-case'>검색결과 {props.count}</span>
<div className='d-flex align-items-center'> </div>
{/* <div className='d-flex align-items-center'>
<Button.Ripple <Button.Ripple
color='primary' color='primary'
size='sm' size='sm'
@ -40,26 +20,27 @@ export const BasisGroupGrid = props => {
> >
그룹생성 그룹생성
</Button.Ripple> </Button.Ripple>
</div> </div> */}
</div> </div>
<div className='invoice-list-wrapper'> <div className='invoice-list-wrapper'>
<Card> <Card>
{/* <div className='grid-loading'> {/* <div className='grid-loading'>
<div><Spinner color='primary' /><span>Loading...</span></div> <div><Spinner color='primary' /><span>Loading...</span></div>
</div> */} </div> */}
<div className='invoice-list-dataTable'> <div className='invoice-list-dataTable'>
<GridDatabase <GridDatabase
title={'비행이력'} title={'비행이력'}
data={props.data} data={props.data}
count={props.count} count={props.count}
columns={props.columns} columns={props.columns}
pagination={props.pagination} pagination={props.pagination}
/> />
</div>
</Card>
</div> </div>
</Col> </Card>
</Row> </div>
</div> </>
// </Col>
// </Row>
// </div>
); );
}; };

50
src/components/basis/group/BasisGroupUsersGrid.js

@ -3,15 +3,16 @@ import { Row, Col, Card } from 'reactstrap';
export const BasisGroupUsersGrid = props => { export const BasisGroupUsersGrid = props => {
return ( return (
<div className='pal-card-box'> // <div className='pal-card-box'>
<Row> // <Row>
<Col> // <Col>
<div className='cont-ti d-flex justify-content-between align-items-sm-center align-items-start flex-sm-row'> <>
<div> <div className='mt-2 cont-ti d-flex justify-content-between align-items-sm-center align-items-start flex-sm-row'>
<h4>{props.title} 목록</h4> <div>
<span className='search-case'>검색결과 {props.count}</span> <h4>{props.title} 목록</h4>
</div> <span className='search-case'>검색결과 {props.count}</span>
{/* <div className='d-flex align-items-center'> </div>
{/* <div className='d-flex align-items-center'>
<Button.Ripple <Button.Ripple
color='primary' color='primary'
size='sm' size='sm'
@ -20,22 +21,23 @@ export const BasisGroupUsersGrid = props => {
그룹생성 그룹생성
</Button.Ripple> </Button.Ripple>
</div> */} </div> */}
</div>
<div className='invoice-list-wrapper'>
<Card>
<div className='invoice-list-dataTable'>
<GridDatabase
title={'비행이력'}
data={props.data}
count={props.count}
columns={props.columns}
pagination={props.pagination}
/>
</div> </div>
<div className='invoice-list-wrapper'> </Card>
<Card> </div>
<div className='invoice-list-dataTable'> {/* </Col>
<GridDatabase
title={'비행이력'}
data={props.data}
count={props.count}
columns={props.columns}
pagination={props.pagination}
/>
</div>
</Card>
</div>
</Col>
</Row> </Row>
</div> </div> */}
</>
); );
}; };

3
src/components/basis/group/BasisGroupUsersSearch.js

@ -27,7 +27,8 @@ import moment from 'moment';
export const BasisGroupUsersSearch = props => { export const BasisGroupUsersSearch = props => {
return ( return (
<div className='pal-card-box'> // <div className='pal-card-box'>
<div>
<Row> <Row>
<Col> <Col>
<div className='cont-ti d-flex justify-content-between align-items-sm-center align-items-start flex-sm-row'> <div className='cont-ti d-flex justify-content-between align-items-sm-center align-items-start flex-sm-row'>

29
src/containers/basis/group/BasisGroupApprovalContainer.js

@ -6,7 +6,7 @@ import { BasisGroupApprovalSearch } from '../../../components/basis/group/BasisG
import { CustomMainLayout } from '../../../components/layout/CustomMainLayout'; import { CustomMainLayout } from '../../../components/layout/CustomMainLayout';
import { ConfirmModal } from '../../../components/modal/ConfirmModal'; import { ConfirmModal } from '../../../components/modal/ConfirmModal';
import * as Actions from '../../../modules/basis/group/actions/basisGroupAction'; import * as Actions from '../../../modules/basis/group/actions/basisGroupAction';
import * as GroupActions from '../../../modules/basis/group/actions/basisGroupAction'; // import * as GroupActions from '../../../modules/basis/group/actions/basisGroupAction';
import { BasisGroupDronGrid } from '../../../components/basis/dron/BasisGroupDronGrid'; import { BasisGroupDronGrid } from '../../../components/basis/dron/BasisGroupDronGrid';
export const BasisGroupApprovalContainer = props => { export const BasisGroupApprovalContainer = props => {
@ -20,7 +20,7 @@ export const BasisGroupApprovalContainer = props => {
const titleName = '승인관리'; const titleName = '승인관리';
const [params, setParams] = useState({ const [params, setParams] = useState({
cstmrSno: user?.cstmrSno, cstmrSno: user?.cstmrSno,
aprvYn: '', aprvYn: ''
}); });
const column = [ const column = [
{ {
@ -66,7 +66,7 @@ export const BasisGroupApprovalContainer = props => {
row?.groupId, row?.groupId,
row?.groupNm, row?.groupNm,
row?.groupAuthCd, row?.groupAuthCd,
row?.aprvlYn, row?.aprvlYn
) )
} }
> >
@ -90,11 +90,13 @@ export const BasisGroupApprovalContainer = props => {
dispatch( dispatch(
Actions.APPROVAL_LIST.request({ Actions.APPROVAL_LIST.request({
searchParams: { cstmrSno: user?.cstmrSno, aprvYn: '', groupId: groupId } searchParams: {
cstmrSno: user?.cstmrSno,
aprvYn: '',
groupId: groupId
}
}) })
);
);
} }
}; };
@ -121,7 +123,6 @@ export const BasisGroupApprovalContainer = props => {
cstmrSno: user?.cstmrSno, cstmrSno: user?.cstmrSno,
groupId: selectData?.groupId groupId: selectData?.groupId
}) })
); );
} }
}, [user]); }, [user]);
@ -168,13 +169,7 @@ export const BasisGroupApprovalContainer = props => {
// minWidth: '102px', // minWidth: '102px',
sortable: true, sortable: true,
cell: row => { cell: row => {
return ( return <Link to={`/basis/dron/detail/${row.arcrftSno}`}>상세보기</Link>;
<Link
to={`/basis/dron/detail/${row.arcrftSno}`}
>
상세보기
</Link>
);
} }
} }
]; ];
@ -283,7 +278,6 @@ export const BasisGroupApprovalContainer = props => {
} }
]; ];
const onKeyPress = e => { const onKeyPress = e => {
if (e.key == 'Enter') { if (e.key == 'Enter') {
// handlerSearch(); // handlerSearch();
@ -365,8 +359,7 @@ export const BasisGroupApprovalContainer = props => {
<Col sm='12'> <Col sm='12'>
{!selectData ? ( {!selectData ? (
<> <>
<div className='no-dataTable'> <div className='no-dataTable'></div>
</div>
</> </>
) : ( ) : (
<BasisGroupApprovalGrid <BasisGroupApprovalGrid

358
src/containers/basis/group/BasisGroupUsersContainer.js

@ -12,16 +12,8 @@ import * as Actions from '../../../modules/basis/group/actions/basisGroupAction'
export const BasisGroupUsersContainer = props => { export const BasisGroupUsersContainer = props => {
const dispatch = useDispatch(); const dispatch = useDispatch();
const history = useHistory(); const { joinList, joinListCount, selectData, userList, userCount } =
const { useSelector(state => state.groupState);
joinList,
joinListCount,
selectGroup,
groupList,
groupListCount,
userList,
userListCount
} = useSelector(state => state.groupState);
const { user } = useSelector(state => state.authState); const { user } = useSelector(state => state.authState);
const [params, setParams] = useState({ const [params, setParams] = useState({
@ -74,36 +66,25 @@ export const BasisGroupUsersContainer = props => {
name: '', name: '',
sortable: true, sortable: true,
cell: row => { cell: row => {
// return selectData?.groupId === row?.groupId ? ( return selectData?.groupId === row?.groupId ? (
// <Button.Ripple <Button.Ripple
// color='danger' color='danger'
// className='badge badge-danger' className='badge badge-danger'
// onClick={() => handlerCancel()} onClick={() => handlerCancel()}
// > >
// 선택취소 선택취소
// </Button.Ripple> </Button.Ripple>
// ) : ( ) : (
// <Button.Ripple
// color='primary'
// className='badge badge-primary'
// onClick={() =>
// handlerDetail(
// row?.groupId,
// row?.groupNm,
// row?.groupAuthCd,
// row?.aprvlYn
// )
// }
// >
// 상세보기
// </Button.Ripple>
// );
return (
<Button.Ripple <Button.Ripple
color='primary' color='primary'
className='badge badge-primary' className='badge badge-primary'
onClick={() => onClick={() =>
handlerDetail(row?.groupId, row?.groupAuthCd, row?.aprvlYn) handlerDetail(
row?.groupId,
row?.groupNm,
row?.groupAuthCd,
row?.aprvlYn
)
} }
> >
상세보기 상세보기
@ -117,7 +98,7 @@ export const BasisGroupUsersContainer = props => {
{ {
name: '그룹명', name: '그룹명',
selector: 'groupNm', selector: 'groupNm',
minWidth: '150px', // minWidth: '102px',
sortable: true, sortable: true,
cell: row => { cell: row => {
return row?.groupNm; return row?.groupNm;
@ -127,7 +108,7 @@ export const BasisGroupUsersContainer = props => {
{ {
name: '그룹 코드', name: '그룹 코드',
selector: 'groupId', selector: 'groupId',
minWidth: '102px', // minWidth: '102px',
sortable: true, sortable: true,
cell: row => { cell: row => {
return row?.groupId; return row?.groupId;
@ -136,7 +117,7 @@ export const BasisGroupUsersContainer = props => {
{ {
name: '사용자 명', name: '사용자 명',
selector: 'memberName', selector: 'memberName',
minWidth: '102px', // minWidth: '102px',
sortable: true, sortable: true,
cell: row => { cell: row => {
return row?.memberName; return row?.memberName;
@ -145,7 +126,7 @@ export const BasisGroupUsersContainer = props => {
{ {
name: '사용자 ID', name: '사용자 ID',
selector: 'userId', selector: 'userId',
minWidth: '120px', // minWidth: '102px',
sortable: true, sortable: true,
cell: row => { cell: row => {
return row?.userId; return row?.userId;
@ -155,7 +136,7 @@ export const BasisGroupUsersContainer = props => {
{ {
name: '권한명', name: '권한명',
selector: 'groupAuthCd', selector: 'groupAuthCd',
minWidth: '105px', // minWidth: '102px',
sortable: true, sortable: true,
cell: row => { cell: row => {
return row?.groupAuthCd; return row?.groupAuthCd;
@ -164,7 +145,7 @@ export const BasisGroupUsersContainer = props => {
{ {
name: '가입 일시', name: '가입 일시',
selector: 'joinDt', selector: 'joinDt',
minWidth: '150px', // minWidth: '150px',
sortable: true, sortable: true,
cell: row => { cell: row => {
return row?.joinDt; return row?.joinDt;
@ -173,7 +154,7 @@ export const BasisGroupUsersContainer = props => {
{ {
name: '권한 변경', name: '권한 변경',
// selector: 'cntrlStDate', // selector: 'cntrlStDate',
minWidth: '130px', minWidth: '300px',
sortable: false, sortable: false,
cell: row => { cell: row => {
const my = joinList?.find((prev, idx) => { const my = joinList?.find((prev, idx) => {
@ -181,71 +162,186 @@ export const BasisGroupUsersContainer = props => {
return prev; return prev;
} }
}); });
let m_disabled = false;
let l_disabled = false;
let n_disabled = false;
if (row?.groupAuthCd === 'MASTER') { if (user.authId === 'SUPER') {
return <div>수정불가</div>; {
} else if (row?.groupAuthCd === 'LEADER') { }
if (my?.groupAuthCd === 'MASTER') { } else if (user.authId === 'ADMIN') {
return ( if (my.groupAuthCd === 'MASTER') {
<Button.Ripple if (row.groupAuthCd === 'LEADER') {
color='primary' l_disabled = true;
className='badge badge-primary' } else if (row.groupAuthCd === 'NORMAL') {
onClick={() => handlerUserConfirm(row?.cstmrGroupSno)} m_disabled = true;
> n_disabled = true;
NORMAL }
</Button.Ripple> } else if (my.groupAuthCd === 'LEADER') {
); if (row.groupAuthCd === 'MASTER') {
m_disabled = true;
l_disabled = true;
n_disabled = true;
} else if (row.groupAuthCd === 'LEADER') {
m_disabled = true;
l_disabled = true;
n_disabled = true;
} else if (row.groupAuthCd === 'NORMAL') {
m_disabled = true;
n_disabled = true;
}
} else { } else {
return <div>수정불가</div>; //내 권한이 마스터도 리더도 아니니까 우리그룹이 아님
m_disabled = true;
l_disabled = true;
n_disabled = true;
} }
} else if (row?.groupAuthCd === 'NORMAL') { } else if (user.authId === 'ROLE_USER') {
if (my?.groupAuthCd === 'MASTER' || my?.groupAuthCd === 'LEADER') { if (my.groupAuthCd === 'MASTER') {
return ( if (row.groupAuthCd === 'LEADER') {
<Button.Ripple l_disabled = true;
color='danger' } else if (row.groupAuthCd === 'NORMAL') {
className='badge badge-danger' m_disabled = true;
onClick={() => handlerAdminConfirm(row?.cstmrGroupSno)} n_disabled = true;
> }
LEADER } else if (my.groupAuthCd === 'LEADER') {
</Button.Ripple> if (row.groupAuthCd === 'MASTER') {
); m_disabled = true;
l_disabled = true;
n_disabled = true;
} else if (row.groupAuthCd === 'LEADER') {
m_disabled = true;
l_disabled = true;
n_disabled = true;
} else if (row.groupAuthCd === 'NORMAL') {
m_disabled = true;
n_disabled = true;
}
} }
} }
}
},
{
name: '위임 하기',
// minWidth: '102px',
sortable: false,
cell: row => {
const my = joinList?.find((prev, idx) => {
if (prev.groupId === row?.groupId) {
return prev;
}
});
if (row?.groupAuthCd === 'LEADER') { const master = (
if (my?.groupAuthCd === 'MASTER') { <>
return ( <Button.Ripple
<Button.Ripple color='warning'
color='warning' className='badge badge-warning'
className='badge badge-warning' style={{ marginRight: '0.35rem' }}
onClick={() => onClick={() =>
handlerCreaterConfirm(row?.cstmrGroupSno, my?.cstmrGroupSno) handlerMaster(row?.cstmrGroupSno, my?.cstmrGroupSno)
} }
> disabled={m_disabled}
MASTER >
</Button.Ripple> MASTER
); </Button.Ripple>
} </>
} );
const leader = (
<>
<Button.Ripple
color='danger'
className='badge badge-danger'
style={{ marginRight: '0.35rem' }}
onClick={() => handlerLeader(row?.cstmrGroupSno)}
disabled={l_disabled}
>
LEADER
</Button.Ripple>
</>
);
const normal = (
<>
<Button.Ripple
color='primary'
className='badge badge-primary'
onClick={() => handlerNormal(row?.cstmrGroupSno)}
disabled={n_disabled}
>
NORMAL
</Button.Ripple>
</>
);
return (
<>
{master}
{leader}
{normal}
</>
);
// const my = joinList?.find((prev, idx) => {
// if (prev.groupId === row?.groupId) {
// return prev;
// }
// });
// if (row?.groupAuthCd === 'MASTER') {
// return <div>수정불가</div>;
// } else if (row?.groupAuthCd === 'LEADER') {
// if (my?.groupAuthCd === 'MASTER') {
// return (
// <Button.Ripple
// color='primary'
// className='badge badge-primary'
// onClick={() => handlerUserConfirm(row?.cstmrGroupSno)}
// >
// NORMAL
// </Button.Ripple>
// );
// } else {
// return <div>수정불가</div>;
// }
// } else if (row?.groupAuthCd === 'NORMAL') {
// if (my?.groupAuthCd === 'MASTER' || my?.groupAuthCd === 'LEADER') {
// return (
// <Button.Ripple
// color='danger'
// className='badge badge-danger'
// onClick={() => handlerAdminConfirm(row?.cstmrGroupSno)}
// >
// LEADER
// </Button.Ripple>
// );
// }
// }
} }
} }
// {
// name: '위임 하기',
// // minWidth: '102px',
// sortable: false,
// cell: row => {
// const my = joinList?.find((prev, idx) => {
// if (prev.groupId === row?.groupId) {
// return prev;
// }
// });
// if (row?.groupAuthCd === 'LEADER') {
// if (my?.groupAuthCd === 'MASTER') {
// return (
// <Button.Ripple
// color='warning'
// className='badge badge-warning'
// onClick={() =>
// handlerCreaterConfirm(row?.cstmrGroupSno, my?.cstmrGroupSno)
// }
// >
// MASTER
// </Button.Ripple>
// );
// }
// }
// }
// }
]; ];
// useEffect(() => { useEffect(() => {
// handlerSearch(); // handlerSearch();
// }, []); handlerCancel();
}, []);
const handlerSearch = () => { const handlerSearch = () => {
if (params.cstmrSno && user?.cstmrSno) { if (params.cstmrSno && user?.cstmrSno) {
@ -268,17 +364,17 @@ export const BasisGroupUsersContainer = props => {
} }
}, [user]); }, [user]);
const handlerDetail = (groupId, groupAuthCd, aprvlYn) => { const handlerDetail = (groupId, groupNm, groupAuthCd, aprvlYn) => {
if ( if (
groupAuthCd === 'MASTER' || groupAuthCd === 'MASTER' ||
user.authId === 'SUPER' || user.authId === 'SUPER' ||
user.authId === 'ADMIN' || user.authId === 'ADMIN' ||
(aprvlYn === 'Y' && groupAuthCd === 'LEADER') (aprvlYn === 'Y' && groupAuthCd === 'LEADER')
) { ) {
dispatch(Actions.SELECT({ groupId: groupId, groupNm, groupNm }));
const param = params; const param = params;
param.groupId = groupId; param.groupId = groupId;
param.groupAuthCd = groupAuthCd; param.memberNm = '';
param.aprvlYn = aprvlYn;
dispatch( dispatch(
Actions.USER_LIST.request({ Actions.USER_LIST.request({
@ -291,10 +387,20 @@ export const BasisGroupUsersContainer = props => {
title: '권한 확인', title: '권한 확인',
desc: '사용자관리 확인을 위해서는 운영자 권한이 필요합니다. 운영자에게 권한을 부여받고 다시 시도해 주세요.' desc: '사용자관리 확인을 위해서는 운영자 권한이 필요합니다. 운영자에게 권한을 부여받고 다시 시도해 주세요.'
}); });
return;
} }
}; };
const handlerAdminConfirm = cstmrGroupSno => { const handlerCancel = () => {
dispatch(Actions.SELECT());
setParams({
...params,
groupId: '',
memberNm: ''
});
};
const handlerLeader = cstmrGroupSno => {
setModal({ setModal({
isOpen: true, isOpen: true,
title: '권한 확인', title: '권한 확인',
@ -314,7 +420,7 @@ export const BasisGroupUsersContainer = props => {
} }
}; };
const handlerUserConfirm = cstmrGroupSno => { const handlerNormal = cstmrGroupSno => {
setModal({ setModal({
isOpen: true, isOpen: true,
title: '권한 확인', title: '권한 확인',
@ -328,7 +434,7 @@ export const BasisGroupUsersContainer = props => {
}); });
}; };
const handlerCreaterConfirm = (row, my) => { const handlerMaster = (row, my) => {
setModal({ setModal({
isOpen: true, isOpen: true,
title: '권한 위임', title: '권한 위임',
@ -393,38 +499,42 @@ export const BasisGroupUsersContainer = props => {
/> />
</Col> </Col>
<Col sm='8'> <Col sm='8'>
{!userList ? ( {selectData ? (
<div className='no-dataTable'>
그룹 목록에서 상세보기를 클릭하세요.
</div>
) : (
<> <>
<BasisGroupUsersSearch <BasisGroupUsersSearch
handlerInput={handlerInput} handlerInput={handlerInput}
// handlerSearch={handlerSearch} handlerSearch={handlerSearch}
params={params} params={params}
onKeyPress={onKeyPress} onKeyPress={onKeyPress}
setParams={setParams} setParams={setParams}
/> />
{/* <BasisGroupUsersGrid <BasisGroupUsersGrid
data={userList} data={userList}
title={'그룹'} title={'사용자'}
columns={userColumns} columns={userColumns}
count={userListCount} count={userCount}
pagination={false} pagination={false}
/> */} />
</> </>
) : (
<div className='no-dataTable'>
그룹 목록에서 상세보기를 클릭하세요.
</div>
)} )}
</Col> </Col>
<Col sm='12'> {/* <Col sm='12'>
<BasisGroupUsersGrid {selectData ? (
data={userList} <BasisGroupUsersGrid
title={'그룹'} data={userList}
columns={userColumns} title={'사용자'}
count={userListCount} columns={userColumns}
pagination={false} count={userCount}
/> pagination={false}
</Col> />
) : (
<div className='no-dataTable'></div>
)}
</Col> */}
</Row> </Row>
</div> </div>
@ -434,7 +544,7 @@ export const BasisGroupUsersContainer = props => {
handlerConfirm={handlerAuthSave} handlerConfirm={handlerAuthSave}
color='primary' color='primary'
/> />
{/* <InfoModal model={infoModal} setModal={setInfoModal} /> */} <InfoModal modal={infoModal} setModal={setInfoModal} />
</CustomMainLayout> </CustomMainLayout>
); );
}; };

Loading…
Cancel
Save