Skip to content

Commit c1b4eab

Browse files
committed
feat: only load template fields when requested
Signed-off-by: Elizabeth Danzberger <lizzy7128@tutanota.de>
1 parent 91b8789 commit c1b4eab

File tree

7 files changed

+119
-7
lines changed

7 files changed

+119
-7
lines changed

apps/files/appinfo/routes.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,11 @@
136136
'url' => '/api/v1/templates',
137137
'verb' => 'GET'
138138
],
139+
[
140+
'name' => 'Template#listTemplateFields',
141+
'url' => '/api/v1/templates/fields/{fileId}',
142+
'verb' => 'GET'
143+
],
139144
[
140145
'name' => 'Template#create',
141146
'url' => '/api/v1/templates/create',

apps/files/lib/Controller/TemplateController.php

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,23 @@ public function list(): DataResponse {
5252
}, $this->templateManager->listTemplates()));
5353
}
5454

55+
/**
56+
* List the fields for the template specified by the given file ID
57+
*
58+
* @param int $fileId File ID of the template
59+
* @return DataResponse<Http::STATUS_OK, array<string, FilesTemplateField>, array{}>
60+
*
61+
* 200: Fields returned
62+
*/
63+
public function listTemplateFields(int $fileId): DataResponse {
64+
$fields = $this->templateManager->listTemplateFields($fileId);
65+
66+
return new DataResponse(
67+
array_merge([], ...$fields),
68+
Http::STATUS_OK
69+
);
70+
}
71+
5572
/**
5673
* Create a template
5774
*

apps/files/src/services/Templates.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@ export const getTemplates = async function() {
1111
return response.data.ocs.data
1212
}
1313

14+
export const getTemplateFields = async function(fileId) {
15+
const response = await axios.get(generateOcsUrl(`apps/files/api/v1/templates/fields/${fileId}`))
16+
return response.data.ocs.data
17+
}
18+
1419
/**
1520
* Create a new file from a specified template
1621
*

apps/files/src/views/TemplatePicker.vue

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ import { translate as t } from '@nextcloud/l10n'
5757
import { generateRemoteUrl } from '@nextcloud/router'
5858
import { normalize, extname, join } from 'path'
5959
import { defineComponent } from 'vue'
60-
import { createFromTemplate, getTemplates } from '../services/Templates.js'
60+
import { createFromTemplate, getTemplates, getTemplateFields } from '../services/Templates.js'
6161
6262
import NcEmptyContent from '@nextcloud/vue/dist/Components/NcEmptyContent.js'
6363
import NcModal from '@nextcloud/vue/dist/Components/NcModal.js'
@@ -215,7 +215,7 @@ export default defineComponent({
215215
}
216216
},
217217
218-
async createFile(templateFields) {
218+
async createFile(templateFields = []) {
219219
const currentDirectory = new URL(window.location.href).searchParams.get('dir') || '/'
220220
221221
// If the file doesn't have an extension, add the default one
@@ -274,9 +274,12 @@ export default defineComponent({
274274
},
275275
276276
async onSubmit() {
277-
if (this.selectedTemplate?.fields?.length > 0) {
277+
const fileId = this.selectedTemplate?.fileid
278+
const fields = await getTemplateFields(fileId)
279+
280+
if (fields.length > 0) {
278281
spawnDialog(TemplateFiller, {
279-
fields: this.selectedTemplate.fields,
282+
fields,
280283
onSubmit: this.createFile,
281284
})
282285
} else {

lib/private/Files/Template/TemplateManager.php

Lines changed: 63 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
use OCP\Files\Node;
2020
use OCP\Files\NotFoundException;
2121
use OCP\Files\Template\BeforeGetTemplatesEvent;
22+
use OCP\Files\Template\Field;
2223
use OCP\Files\Template\FileCreatedFromTemplateEvent;
2324
use OCP\Files\Template\ICustomTemplateProvider;
2425
use OCP\Files\Template\ITemplateManager;
@@ -125,6 +126,19 @@ public function listTemplates(): array {
125126
}, $this->listCreators()));
126127
}
127128

129+
public function listTemplateFields(int $fileId): array {
130+
foreach ($this->listCreators() as $creator) {
131+
$fields = $this->getTemplateFields($creator, $fileId);
132+
if (empty($fields)) {
133+
continue;
134+
}
135+
136+
return $fields;
137+
}
138+
139+
return [];
140+
}
141+
128142
/**
129143
* @param string $filePath
130144
* @param string $templateId
@@ -187,6 +201,20 @@ private function getTemplateFolder(): Folder {
187201
* @return list<Template>
188202
*/
189203
private function getTemplateFiles(TemplateFileCreator $type): array {
204+
$templates = array_merge(
205+
$this->getProviderTemplates($type),
206+
$this->getUserTemplates($type)
207+
);
208+
209+
$this->eventDispatcher->dispatchTyped(new BeforeGetTemplatesEvent($templates, false));
210+
211+
return $templates;
212+
}
213+
214+
/**
215+
* @return list<Template>
216+
*/
217+
private function getProviderTemplates(TemplateFileCreator $type): array {
190218
$templates = [];
191219
foreach ($this->getRegisteredProviders() as $provider) {
192220
foreach ($type->getMimetypes() as $mimetype) {
@@ -195,11 +223,22 @@ private function getTemplateFiles(TemplateFileCreator $type): array {
195223
}
196224
}
197225
}
226+
227+
return $templates;
228+
}
229+
230+
/**
231+
* @return list<Template>
232+
*/
233+
private function getUserTemplates(TemplateFileCreator $type): array {
234+
$templates = [];
235+
198236
try {
199237
$userTemplateFolder = $this->getTemplateFolder();
200238
} catch (\Exception $e) {
201239
return $templates;
202240
}
241+
203242
foreach ($type->getMimetypes() as $mimetype) {
204243
foreach ($userTemplateFolder->searchByMime($mimetype) as $templateFile) {
205244
$template = new Template(
@@ -212,11 +251,33 @@ private function getTemplateFiles(TemplateFileCreator $type): array {
212251
}
213252
}
214253

215-
$this->eventDispatcher->dispatchTyped(new BeforeGetTemplatesEvent($templates));
216-
217254
return $templates;
218255
}
219256

257+
/*
258+
* @return list<Field>
259+
*/
260+
private function getTemplateFields(TemplateFileCreator $type, int $fileId): array {
261+
$providerTemplates = $this->getProviderTemplates($type);
262+
$userTemplates = $this->getUserTemplates($type);
263+
264+
$matchedTemplates = array_filter(
265+
array_merge($providerTemplates, $userTemplates),
266+
function (Template $template) use ($fileId) {
267+
return $template->jsonSerialize()['fileid'] === $fileId;
268+
});
269+
270+
if (empty($matchedTemplates)) {
271+
return [];
272+
}
273+
274+
$this->eventDispatcher->dispatchTyped(new BeforeGetTemplatesEvent($matchedTemplates, true));
275+
276+
return array_values(array_map(function (Template $template) {
277+
return $template->jsonSerialize()['fields'] ?? [];
278+
}, $matchedTemplates));
279+
}
280+
220281
/**
221282
* @param Node|File $file
222283
* @return array

lib/public/Files/Template/BeforeGetTemplatesEvent.php

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,19 @@
1717
class BeforeGetTemplatesEvent extends Event {
1818
/** @var array<Template> */
1919
private array $templates;
20+
/** @var bool */
21+
private bool $withFields;
2022

2123
/**
2224
* @param array<Template> $templates
2325
*
2426
* @since 30.0.0
2527
*/
26-
public function __construct(array $templates) {
28+
public function __construct(array $templates, bool $withFields = false) {
2729
parent::__construct();
2830

2931
$this->templates = $templates;
32+
$this->withFields = $withFields;
3033
}
3134

3235
/**
@@ -37,4 +40,13 @@ public function __construct(array $templates) {
3740
public function getTemplates(): array {
3841
return $this->templates;
3942
}
43+
44+
/**
45+
* @return bool
46+
*
47+
* @since 32.0.0
48+
*/
49+
public function shouldGetFields(): bool {
50+
return $this->withFields;
51+
}
4052
}

lib/public/Files/Template/ITemplateManager.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,15 @@ public function listCreators(): array;
3838
*/
3939
public function listTemplates(): array;
4040

41+
/**
42+
* Get the fields for a given template
43+
*
44+
* @param int $fileId
45+
* @return array
46+
* @since 32.0.0
47+
*/
48+
public function listTemplateFields(int $fileId): array;
49+
4150
/**
4251
* @return bool
4352
* @since 21.0.0

0 commit comments

Comments
 (0)