@@ -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 border = 2
6769const margin = 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 templates = await getTemplates ()
169177 const fetchedProvider = 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 fileInfo = 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 owner = getCurrentUser ()?.uid || null
229- const node = 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 client = getClient ()
230+ const filename = join (getRootPath (), currentDirectory , this .name ?? ' ' )
231+
232+ await client .putFileContents (filename , ' ' )
233+ const response = await client .stat (filename , { data: getDefaultPropfind (), details: true }) as ResponseDataDetailed <FileStat >
234+ logger .debug (' Created new file' , { fileInfo: response .data })
235+
236+ const node = 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' , fileid: 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 fileInfo = 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 owner = getCurrentUser ()?.uid || null
250+ const node = 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' , fileid: 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