feat: only load template fields when requested

Signed-off-by: Elizabeth Danzberger <lizzy7128@tutanota.de>
pull/52514/head
Elizabeth Danzberger 12 months ago
parent 5129a79720
commit 5c7216f3fd
No known key found for this signature in database
GPG Key ID: D64CE07FD0188C79
  1. 5
      apps/files/appinfo/routes.php
  2. 17
      apps/files/lib/Controller/TemplateController.php
  3. 5
      apps/files/src/services/Templates.js
  4. 11
      apps/files/src/views/TemplatePicker.vue
  5. 65
      lib/private/Files/Template/TemplateManager.php
  6. 14
      lib/public/Files/Template/BeforeGetTemplatesEvent.php
  7. 9
      lib/public/Files/Template/ITemplateManager.php

@ -136,6 +136,11 @@ return [
'url' => '/api/v1/templates',
'verb' => 'GET'
],
[
'name' => 'Template#listTemplateFields',
'url' => '/api/v1/templates/fields/{fileId}',
'verb' => 'GET'
],
[
'name' => 'Template#create',
'url' => '/api/v1/templates/create',

@ -52,6 +52,23 @@ class TemplateController extends OCSController {
}, $this->templateManager->listTemplates()));
}
/**
* List the fields for the template specified by the given file ID
*
* @param int $fileId File ID of the template
* @return DataResponse<Http::STATUS_OK, array<string, FilesTemplateField>, array{}>
*
* 200: Fields returned
*/
public function listTemplateFields(int $fileId): DataResponse {
$fields = $this->templateManager->listTemplateFields($fileId);
return new DataResponse(
array_merge([], ...$fields),
Http::STATUS_OK
);
}
/**
* Create a template
*

@ -11,6 +11,11 @@ export const getTemplates = async function() {
return response.data.ocs.data
}
export const getTemplateFields = async function(fileId) {
const response = await axios.get(generateOcsUrl(`apps/files/api/v1/templates/fields/${fileId}`))
return response.data.ocs.data
}
/**
* Create a new file from a specified template
*

@ -57,7 +57,7 @@ import { translate as t } from '@nextcloud/l10n'
import { generateRemoteUrl } from '@nextcloud/router'
import { normalize, extname, join } from 'path'
import { defineComponent } from 'vue'
import { createFromTemplate, getTemplates } from '../services/Templates.js'
import { createFromTemplate, getTemplates, getTemplateFields } from '../services/Templates.js'
import NcEmptyContent from '@nextcloud/vue/components/NcEmptyContent'
import NcModal from '@nextcloud/vue/components/NcModal'
@ -215,7 +215,7 @@ export default defineComponent({
}
},
async createFile(templateFields) {
async createFile(templateFields = []) {
const currentDirectory = new URL(window.location.href).searchParams.get('dir') || '/'
// If the file doesn't have an extension, add the default one
@ -274,9 +274,12 @@ export default defineComponent({
},
async onSubmit() {
if (this.selectedTemplate?.fields?.length > 0) {
const fileId = this.selectedTemplate?.fileid
const fields = await getTemplateFields(fileId)
if (fields.length > 0) {
spawnDialog(TemplateFiller, {
fields: this.selectedTemplate.fields,
fields,
onSubmit: this.createFile,
})
} else {

@ -19,6 +19,7 @@ use OCP\Files\IRootFolder;
use OCP\Files\Node;
use OCP\Files\NotFoundException;
use OCP\Files\Template\BeforeGetTemplatesEvent;
use OCP\Files\Template\Field;
use OCP\Files\Template\FileCreatedFromTemplateEvent;
use OCP\Files\Template\ICustomTemplateProvider;
use OCP\Files\Template\ITemplateManager;
@ -125,6 +126,19 @@ class TemplateManager implements ITemplateManager {
}, $this->listCreators()));
}
public function listTemplateFields(int $fileId): array {
foreach ($this->listCreators() as $creator) {
$fields = $this->getTemplateFields($creator, $fileId);
if (empty($fields)) {
continue;
}
return $fields;
}
return [];
}
/**
* @param string $filePath
* @param string $templateId
@ -187,6 +201,20 @@ class TemplateManager implements ITemplateManager {
* @return list<Template>
*/
private function getTemplateFiles(TemplateFileCreator $type): array {
$templates = array_merge(
$this->getProviderTemplates($type),
$this->getUserTemplates($type)
);
$this->eventDispatcher->dispatchTyped(new BeforeGetTemplatesEvent($templates, false));
return $templates;
}
/**
* @return list<Template>
*/
private function getProviderTemplates(TemplateFileCreator $type): array {
$templates = [];
foreach ($this->getRegisteredProviders() as $provider) {
foreach ($type->getMimetypes() as $mimetype) {
@ -195,11 +223,22 @@ class TemplateManager implements ITemplateManager {
}
}
}
return $templates;
}
/**
* @return list<Template>
*/
private function getUserTemplates(TemplateFileCreator $type): array {
$templates = [];
try {
$userTemplateFolder = $this->getTemplateFolder();
} catch (\Exception $e) {
return $templates;
}
foreach ($type->getMimetypes() as $mimetype) {
foreach ($userTemplateFolder->searchByMime($mimetype) as $templateFile) {
$template = new Template(
@ -212,11 +251,33 @@ class TemplateManager implements ITemplateManager {
}
}
$this->eventDispatcher->dispatchTyped(new BeforeGetTemplatesEvent($templates));
return $templates;
}
/*
* @return list<Field>
*/
private function getTemplateFields(TemplateFileCreator $type, int $fileId): array {
$providerTemplates = $this->getProviderTemplates($type);
$userTemplates = $this->getUserTemplates($type);
$matchedTemplates = array_filter(
array_merge($providerTemplates, $userTemplates),
function (Template $template) use ($fileId) {
return $template->jsonSerialize()['fileid'] === $fileId;
});
if (empty($matchedTemplates)) {
return [];
}
$this->eventDispatcher->dispatchTyped(new BeforeGetTemplatesEvent($matchedTemplates, true));
return array_values(array_map(function (Template $template) {
return $template->jsonSerialize()['fields'] ?? [];
}, $matchedTemplates));
}
/**
* @param Node|File $file
* @return array

@ -17,16 +17,19 @@ use OCP\EventDispatcher\Event;
class BeforeGetTemplatesEvent extends Event {
/** @var array<Template> */
private array $templates;
/** @var bool */
private bool $withFields;
/**
* @param array<Template> $templates
*
* @since 30.0.0
*/
public function __construct(array $templates) {
public function __construct(array $templates, bool $withFields = false) {
parent::__construct();
$this->templates = $templates;
$this->withFields = $withFields;
}
/**
@ -37,4 +40,13 @@ class BeforeGetTemplatesEvent extends Event {
public function getTemplates(): array {
return $this->templates;
}
/**
* @return bool
*
* @since 32.0.0
*/
public function shouldGetFields(): bool {
return $this->withFields;
}
}

@ -38,6 +38,15 @@ interface ITemplateManager {
*/
public function listTemplates(): array;
/**
* Get the fields for a given template
*
* @param int $fileId
* @return array
* @since 32.0.0
*/
public function listTemplateFields(int $fileId): array;
/**
* @return bool
* @since 21.0.0

Loading…
Cancel
Save