Skip to content

Commit 6c3fcb6

Browse files
author
vikasrohit
authored
Merge pull request #487 from appirio-tech/feature/file-deletion-confirmation
Feature/file deletion confirmation
2 parents d7defa3 + 55081f1 commit 6c3fcb6

File tree

4 files changed

+45
-71
lines changed

4 files changed

+45
-71
lines changed
Lines changed: 38 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,42 @@
11
import React, {PropTypes} from 'react'
2+
import Panel from '../Panel/Panel'
23
import FileListItem from './FileListItem'
4+
import cn from 'classnames'
5+
import uncontrollable from 'uncontrollable'
6+
import FileDeletionConfirmModal from './FileDeletionConfirmModal'
37
import './FileList.scss'
48

5-
const FileList = ({children}) => (
6-
<div className="file-list">
7-
{children}
8-
</div>
9+
const FileList = ({files, onDelete, onSave, deletingFile, onDeleteIntent}) => (
10+
<Panel className={cn('file-list', {'modal-active': deletingFile})}>
11+
{deletingFile && <div className="modal-overlay" />}
12+
{
13+
files.map((file, i) => {
14+
const _onConfirmDelete = () => {
15+
onDelete(file.id)
16+
onDeleteIntent(null)
17+
}
18+
const _onFileDeleteCancel = () => onDeleteIntent(null)
19+
if (deletingFile === file.id) {
20+
return (
21+
<FileDeletionConfirmModal
22+
key={i}
23+
fileName={ file.title }
24+
onConfirm={ _onConfirmDelete }
25+
onCancel={ _onFileDeleteCancel }
26+
/>
27+
)
28+
}
29+
return (
30+
<FileList.Item
31+
{...file}
32+
key={i}
33+
onDelete={ onDeleteIntent }
34+
onSave={ onSave }
35+
/>
36+
)
37+
})
38+
}
39+
</Panel>
940
)
1041

1142
FileList.propTypes = {
@@ -14,4 +45,6 @@ FileList.propTypes = {
1445

1546
FileList.Item = FileListItem
1647

17-
export default FileList
48+
export default uncontrollable(FileList, {
49+
deletingFile: 'onDeleteIntent'
50+
})

src/components/FileList/FileList.scss

Lines changed: 3 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
@import 'tc-includes';
22

33
.file-list {
4+
// reset styles of panel class, we need panel class to activate the modal-overlay
5+
border: none;
6+
box-shadow: none;
47
> h4 {
58

69
@include roboto-medium;
@@ -97,33 +100,5 @@
97100
}
98101

99102
.delete-file-modal {
100-
&:focus {
101-
// outline: none;
102-
}
103-
}
104-
105-
.file-deletion-dialog-overlay {
106-
display: flex;
107-
justify-content: center;
108-
align-items: center;
109-
background-color: $tc-gray-neutral-dark;
110-
position : fixed;
111-
top : 0;
112-
left : 0;
113-
right : 0;
114-
bottom : 0;
115-
z-index: 21;/* +1 of the z-index of the topbar */
116-
}
117103

118-
.file-deletion-dialog {
119-
top: 0px;
120-
left: 0px;
121-
}
122-
.file-deletion-dialog-close {
123-
cursor: pointer;
124-
position: absolute;
125-
top: 25px;
126-
right: 25px;
127-
width: 14px;
128-
height: 14px;
129104
}

src/components/FileList/FileListItem.jsx

Lines changed: 3 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
import _ from 'lodash'
22
import React, {PropTypes} from 'react'
3-
import Modal from 'react-modal'
43
import filesize from 'filesize'
54
import { Icons } from 'appirio-tech-react-components'
6-
import FileDeletionConfirmModal from './FileDeletionConfirmModal'
75

86
const { TrashIcon, CloseIcon, EditIcon, SaveIcon } = Icons
97

@@ -14,21 +12,17 @@ export default class FileListItem extends React.Component {
1412
this.state = {
1513
title: props.title,
1614
description: props.description,
17-
isEditing: false,
18-
showDeletionDialog: false
15+
isEditing: false
1916
}
2017
this.handleSave = this.handleSave.bind(this)
2118
this.startEdit = this.startEdit.bind(this)
2219
this.onDelete = this.onDelete.bind(this)
23-
this.showDeletionDialog = this.showDeletionDialog.bind(this)
24-
this.hideDeletionDialog = this.hideDeletionDialog.bind(this)
2520
this.validateForm = this.validateForm.bind(this)
2621
this.validateTitle = this.validateTitle.bind(this)
2722
this.onTitleChange = this.onTitleChange.bind(this)
2823
}
2924

3025
onDelete() {
31-
this.setState({ showDeletionDialog : false })
3226
this.props.onDelete(this.props.id)
3327
}
3428

@@ -73,14 +67,6 @@ export default class FileListItem extends React.Component {
7367
this.setState({ errors })
7468
}
7569

76-
showDeletionDialog() {
77-
this.setState({ showDeletionDialog : true })
78-
}
79-
80-
hideDeletionDialog() {
81-
this.setState({ showDeletionDialog : false })
82-
}
83-
8470
renderEditing() {
8571
const {title, description} = this.props
8672
const { errors } = this.state
@@ -103,28 +89,16 @@ export default class FileListItem extends React.Component {
10389

10490
renderReadOnly() {
10591
const {title, downloadUrl, description, size, isEditable} = this.props
106-
const { showDeletionDialog } = this.state
10792
return (
10893
<div>
109-
<Modal
110-
isOpen={ showDeletionDialog }
111-
className="file-deletion-dialog"
112-
overlayClassName="file-deletion-dialog-overlay"
113-
onRequestClose={ this.hideDeletionDialog }
114-
>
115-
<FileDeletionConfirmModal fileName={ title } onConfirm={ this.onDelete } onCancel={ this.hideDeletionDialog } />
116-
<div onClick={ this.hideDeletionDialog } className="file-deletion-dialog-close">
117-
<Icons.XMarkIcon />
118-
</div>
119-
</Modal>
12094
<div className="title">
12195
<h4><a href={downloadUrl} target="_blank" rel="noopener noreferrer">{title}</a></h4>
12296
<div className="size">
12397
{filesize(size)}
12498
</div>
12599
{isEditable && <div className="edit-icons">
126100
<i className="icon-edit" onClick={this.startEdit}><EditIcon /></i>
127-
<i className="icon-trash" onClick={this.showDeletionDialog}><TrashIcon /></i>
101+
<i className="icon-trash" onClick={this.onDelete}><TrashIcon /></i>
128102
</div>}
129103
</div>
130104
<p>{description}</p>
@@ -133,7 +107,7 @@ export default class FileListItem extends React.Component {
133107
}
134108

135109
render() {
136-
const {isEditing} = this.state
110+
const { isEditing } = this.state
137111
let iconPath
138112
try {
139113
iconPath = require('./images/' + this.props.contentType.split('/')[1] +'.svg')

src/projects/detail/components/FileListContainer.jsx

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -42,15 +42,7 @@ class FileListContainer extends Component {
4242
const storePath = `${PROJECT_ATTACHMENTS_FOLDER}/${projectId}/`
4343
return (
4444
<div>
45-
<FileList>
46-
{files.map((file, i) =>
47-
<FileList.Item
48-
{...file}
49-
key={i}
50-
onDelete={this.deleteFile}
51-
onSave={this.updateFile}
52-
/>)}
53-
</FileList>
45+
<FileList files={files} onDelete={ this.deleteFile } onSave={ this.updateFile } />
5446
<AddFiles successHandler={this.processUploadedFiles} storePath={storePath} category={'appDefinition'} />
5547
</div>
5648
)

0 commit comments

Comments
 (0)