Skip to content

Commit dcbb877

Browse files
author
Marcin Wojciechowski
committed
No need to provide itemId in ListItemAttachments
1 parent 3c575e2 commit dcbb877

File tree

4 files changed

+88
-25
lines changed

4 files changed

+88
-25
lines changed

src/controls/listItemAttachments/IListItemAttachmentsState.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,6 @@ export interface IListItemAttachmentsState {
88
disableButton: boolean;
99
showPlaceHolder: boolean;
1010
fireUpload: boolean;
11+
filesToUpload?: File[];
12+
itemId?: number;
1113
}

src/controls/listItemAttachments/IUploadAttachmentProps.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@ import { BaseComponentContext } from '@microsoft/sp-component-base';
22

33
export interface IUploadAttachmentProps {
44
listId: string;
5-
itemId: number;
5+
itemId?: number;
66
className?: string;
7-
webUrl?:string;
7+
webUrl?: string;
88
disabled?: boolean;
99
context: BaseComponentContext;
10-
fireUpload?:boolean;
11-
onAttachmentUpload: () => void;
10+
fireUpload?: boolean;
11+
onAttachmentUpload: (file?: File) => void;
1212
}

src/controls/listItemAttachments/ListItemAttachments.tsx

Lines changed: 78 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,13 @@ interface IPreviewImageCollection {
2929

3030
export class ListItemAttachments extends React.Component<IListItemAttachmentsProps, IListItemAttachmentsState> {
3131
private _spservice: SPservice;
32-
private previewImages: IPreviewImageCollection;
32+
private previewImages: IPreviewImageCollection = {};
3333
private _utilities: utilities;
3434

3535
constructor(props: IListItemAttachmentsProps) {
3636
super(props);
3737

3838
telemetry.track('ReactListItemAttachments', {});
39-
4039
this.state = {
4140
file: null,
4241
hideDialog: true,
@@ -45,7 +44,9 @@ export class ListItemAttachments extends React.Component<IListItemAttachmentsPro
4544
deleteAttachment: false,
4645
disableButton: false,
4746
showPlaceHolder: false,
48-
fireUpload: false
47+
fireUpload: false,
48+
filesToUpload: [],
49+
itemId: props.itemId
4950
};
5051

5152
// Get SPService Factory
@@ -73,26 +74,43 @@ export class ListItemAttachments extends React.Component<IListItemAttachmentsPro
7374
});
7475
}
7576

76-
/**
77-
* Load Item Attachments
78-
*/
79-
private async loadAttachments() {
80-
this._spservice.getListItemAttachments(this.props.listId, this.props.itemId).then((files: IListItemAttachmentFile[]) => {
81-
const filePreviewImages = files.map(file => this.loadAttachmentPreview(file));
82-
return Promise.all(filePreviewImages).then(filePreviews => {
83-
this.previewImages = {};
84-
filePreviews.forEach(preview => {
85-
this.previewImages[preview.name] = preview;
86-
});
77+
public async uploadAttachments(itemId: number){
78+
if(this.state.filesToUpload){
79+
await Promise.all(this.state.filesToUpload.map(file=>this._spservice.addAttachment(
80+
this.props.listId,
81+
itemId,
82+
file.name,
83+
file,
84+
this.props.webUrl)));
85+
}
86+
this.setState({
87+
filesToUpload: [],
88+
itemId: itemId
89+
},this.loadAttachments);
90+
}
91+
protected loadAttachmentsPreview(files: IListItemAttachmentFile[]){
92+
const filePreviewImages = files.map(file => this.loadAttachmentPreview(file));
93+
return Promise.all(filePreviewImages).then(filePreviews => {
94+
filePreviews.forEach(preview => {
95+
this.previewImages[preview.name] = preview;
96+
});
8797

88-
this.setState({
98+
this.setState({
8999
fireUpload: false,
90100
hideDialog: true,
91101
dialogMessage: '',
92102
attachments: files,
93103
showPlaceHolder: files.length === 0 ? true : false
94104
});
95-
});
105+
});
106+
}
107+
/**
108+
* Load Item Attachments
109+
*/
110+
private async loadAttachments() {
111+
if(this.state.itemId){
112+
this._spservice.getListItemAttachments(this.props.listId, this.state.itemId).then(async (files: IListItemAttachmentFile[]) => {
113+
await this.loadAttachmentsPreview(files);
96114
}).catch((error: Error) => {
97115
this.setState({
98116
fireUpload: false,
@@ -101,6 +119,22 @@ export class ListItemAttachments extends React.Component<IListItemAttachmentsPro
101119
});
102120
});
103121
}
122+
else if(this.state.filesToUpload && this.state.filesToUpload.length > 0){
123+
let files = this.state.filesToUpload.map(file=>({
124+
FileName: file.name,
125+
ServerRelativeUrl: undefined
126+
}));
127+
await this.loadAttachmentsPreview(files);
128+
}
129+
else{
130+
this.setState({
131+
fireUpload: false,
132+
hideDialog: true,
133+
dialogMessage: '',
134+
showPlaceHolder: true
135+
});
136+
}
137+
}
104138

105139
/**
106140
* Close the dialog
@@ -120,8 +154,15 @@ export class ListItemAttachments extends React.Component<IListItemAttachmentsPro
120154
/**
121155
* Attachment uploaded event handler
122156
*/
123-
private _onAttachmentUpload = () => {
157+
private _onAttachmentUpload = (file: File) => {
124158
// load Attachments
159+
if(!this.state.itemId){
160+
let files = this.state.filesToUpload || [];
161+
files.push(file);
162+
this.setState({
163+
filesToUpload: [...files]
164+
});
165+
}
125166
this.loadAttachments();
126167
}
127168

@@ -153,8 +194,26 @@ export class ListItemAttachments extends React.Component<IListItemAttachmentsPro
153194
});
154195

155196
try {
156-
await this._spservice.deleteAttachment(file.FileName, this.props.listId, this.props.itemId, this.props.webUrl);
197+
if(this.state.itemId){
198+
await this._spservice.deleteAttachment(file.FileName, this.props.listId, this.state.itemId, this.props.webUrl);
199+
}
200+
else{
201+
let filesToUpload = this.state.filesToUpload;
202+
let fileToRemove = filesToUpload.find(f=>f.name === file.FileName);
203+
if(fileToRemove){
204+
filesToUpload.splice(filesToUpload.indexOf(fileToRemove),1);
205+
}
206+
let attachments = this.state.attachments;
207+
let attachmentToRemove = attachments.find(attachment => attachment.FileName === file.FileName);
208+
if(attachmentToRemove){
209+
attachments.splice(attachments.indexOf(attachmentToRemove),1);
157210

211+
}
212+
this.setState({
213+
filesToUpload: [...filesToUpload],
214+
attachments: [...attachments]
215+
});
216+
}
158217
this.setState({
159218
fireUpload: false,
160219
hideDialog: false,
@@ -183,7 +242,7 @@ export class ListItemAttachments extends React.Component<IListItemAttachmentsPro
183242
<div className={styles.ListItemAttachments}>
184243
<UploadAttachment
185244
listId={this.props.listId}
186-
itemId={this.props.itemId}
245+
itemId={this.state.itemId}
187246
disabled={this.props.disabled}
188247
context={this.props.context}
189248
onAttachmentUpload={this._onAttachmentUpload}

src/controls/listItemAttachments/UploadAttachment.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,12 +67,14 @@ export class UploadAttachment extends React.Component<IUploadAttachmentProps, IU
6767
});
6868

6969
try {
70-
await this._spservice.addAttachment(this.props.listId, this.props.itemId, file.name, file, this.props.webUrl);
70+
if(this.props.itemId && this.props.itemId > 0){
71+
await this._spservice.addAttachment(this.props.listId, this.props.itemId, file.name, file, this.props.webUrl);
72+
}
7173

7274
this.setState({
7375
isLoading: false
7476
});
75-
this.props.onAttachmentUpload();
77+
this.props.onAttachmentUpload(file);
7678
} catch (error) {
7779
this.setState({
7880
hideDialog: false,

0 commit comments

Comments
 (0)