@@ -50,7 +50,8 @@ import type { TemplateFile } from '../types.ts'
5050import  { getCurrentUser  } from  ' @nextcloud/auth' 
5151import  { showError , spawnDialog  } from  ' @nextcloud/dialogs' 
5252import  { emit  } from  ' @nextcloud/event-bus' 
53- import  { File  } from  ' @nextcloud/files' 
53+ import  { File , Node  } from  ' @nextcloud/files' 
54+ import  { getClient , getRootPath , resultToNode , getDefaultPropfind  } from  ' @nextcloud/files/dav' 
5455import  { translate  as  t  } from  ' @nextcloud/l10n' 
5556import  { generateRemoteUrl  } from  ' @nextcloud/router' 
5657import  { normalize , extname , join  } from  ' path' 
@@ -62,6 +63,7 @@ import NcModal from '@nextcloud/vue/dist/Components/NcModal.js'
6263import  TemplatePreview  from  ' ../components/TemplatePreview.vue' 
6364import  TemplateFiller  from  ' ../components/TemplateFiller.vue' 
6465import  logger  from  ' ../logger.ts' 
66+ import  type  { FileStat , ResponseDataDetailed  } from  ' webdav' 
6567
6668const =  2 
6769const =  8 
@@ -165,6 +167,12 @@ export default defineComponent({
165167			this .name  =  name  
166168			this .provider  =  provider  
167169
170+ 			//  Skip templates logic for external users. 
171+ 			if  (getCurrentUser () ===  null ) { 
172+ 				this .onSubmit () 
173+ 				return  
174+ 			} 
175+ 
168176			const =  await  getTemplates () 
169177			const =  templates .find ((fetchedProvider ) =>  fetchedProvider .app  ===  provider .app  &&  fetchedProvider .label  ===  provider .label ) 
170178			if  (fetchedProvider  ===  null ) { 
@@ -216,56 +224,80 @@ export default defineComponent({
216224				this .name  =  ` ${this .name }${this .provider ?.extension  ??  ' '  `  
217225			} 
218226
219- 			try  { 
220- 				const =  await  createFromTemplate ( 
221- 					normalize (` ${currentDirectory }/${this .name } ` ), 
222- 					this .selectedTemplate ?.filename  as  string  ??  ' '  
223- 					this .selectedTemplate ?.templateType  as  string  ??  ' '  
224- 					templateFields , 
225- 				) 
226- 				logger .debug (' Created new file' fileInfo ) 
227- 
228- 				const =  getCurrentUser ()?.uid  ||  null  
229- 				const =  new  File ({ 
230- 					id: fileInfo .fileid , 
231- 					source: generateRemoteUrl (join (` dav/files/${owner } ` , fileInfo .filename )), 
232- 					root: ` /files/${owner } ` , 
233- 					mime: fileInfo .mime , 
234- 					mtime: new  Date (fileInfo .lastmod  *  1000 ), 
235- 					owner , 
236- 					size: fileInfo .size , 
237- 					permissions: fileInfo .permissions , 
238- 					attributes: { 
239- 						//  Inherit some attributes from parent folder like the mount type and real owner 
240- 						' mount-type' this .parent ?.attributes ?.[' mount-type'  
241- 						' owner-id' this .parent ?.attributes ?.[' owner-id'  
242- 						' owner-display-name' this .parent ?.attributes ?.[' owner-display-name'  
243- 						... fileInfo , 
244- 						' has-preview' fileInfo .hasPreview , 
245- 					}, 
246- 				}) 
227+ 			//  Create a blank file for external users as we can't use the templates. 
228+ 			if  (getCurrentUser () ===  null ) { 
229+ 				const =  getClient () 
230+ 				const =  join (getRootPath (), currentDirectory , this .name  ??  ' '  
231+ 
232+ 				await  client .putFileContents (filename , ' '  
233+ 				const =  await  client .stat (filename , { data: getDefaultPropfind (), details: true  }) as  ResponseDataDetailed <FileStat > 
234+ 				logger .debug (' Created new file' response .data  }) 
235+ 
236+ 				const =  resultToNode (response .data ) 
247237
248- 				//  Update files list 
249- 				emit (' files:node:created' node ) 
250- 
251- 				//  Open the new file 
252- 				window .OCP .Files .Router .goToRoute ( 
253- 					null , //  use default route 
254- 					{ view: ' files' node .fileid  }, 
255- 					{ dir: node .dirname , openfile: ' true'  
256- 				) 
257- 
258- 				//  Close the picker 
259- 				this .close () 
260- 			} catch  (error ) { 
261- 				logger .error (' Error while creating the new file from template' error  }) 
262- 				showError (t (' files' ' Unable to create new file from template'  
263- 			} finally  { 
264- 				this .loading  =  false  
238+ 				this .handleFileCreation (node ) 
239+ 			} else  { 
240+ 				try  { 
241+ 					const =  await  createFromTemplate ( 
242+ 						normalize (` ${currentDirectory }/${this .name } ` ), 
243+ 						this .selectedTemplate ?.filename  as  string  ??  ' '  
244+ 						this .selectedTemplate ?.templateType  as  string  ??  ' '  
245+ 						templateFields , 
246+ 					) 
247+ 					logger .debug (' Created new file' fileInfo  }) 
248+ 
249+ 					const =  getCurrentUser ()?.uid  ||  null  
250+ 					const =  new  File ({ 
251+ 						id: fileInfo .fileid , 
252+ 						source: generateRemoteUrl (join (` dav/files/${owner } ` , fileInfo .filename )), 
253+ 						root: ` /files/${owner } ` , 
254+ 						mime: fileInfo .mime , 
255+ 						mtime: new  Date (fileInfo .lastmod  *  1000 ), 
256+ 						owner , 
257+ 						size: fileInfo .size , 
258+ 						permissions: fileInfo .permissions , 
259+ 						attributes: { 
260+ 							//  Inherit some attributes from parent folder like the mount type and real owner 
261+ 							' mount-type' this .parent ?.attributes ?.[' mount-type'  
262+ 							' owner-id' this .parent ?.attributes ?.[' owner-id'  
263+ 							' owner-display-name' this .parent ?.attributes ?.[' owner-display-name'  
264+ 							... fileInfo , 
265+ 							' has-preview' fileInfo .hasPreview , 
266+ 						}, 
267+ 					}) 
268+ 
269+ 					this .handleFileCreation (node ) 
270+ 
271+ 					//  Close the picker 
272+ 					this .close () 
273+ 				} catch  (error ) { 
274+ 					logger .error (' Error while creating the new file from template' error  }) 
275+ 					showError (t (' files' ' Unable to create new file from template'  
276+ 				} finally  { 
277+ 					this .loading  =  false  
278+ 				} 
265279			} 
266280		}, 
267281
282+ 		handleFileCreation(node :  Node ) { 
283+ 			//  Update files list 
284+ 			emit (' files:node:created' node ) 
285+ 
286+ 			//  Open the new file 
287+ 			window .OCP .Files .Router .goToRoute ( 
288+ 				null , //  use default route 
289+ 				{ view: ' files' node .fileid  }, 
290+ 				{ dir: node .dirname , openfile: ' true'  
291+ 			) 
292+ 		}, 
293+ 
268294		async  onSubmit() { 
295+ 			//  Skip templates logic for external users. 
296+ 			if  (getCurrentUser () ===  null ) { 
297+ 				this .loading  =  true  
298+ 				return  this .createFile () 
299+ 			} 
300+ 
269301			if  (this .selectedTemplate ?.fields ?.length  >  0 ) { 
270302				spawnDialog (TemplateFiller , { 
271303					fields: this .selectedTemplate .fields , 
0 commit comments