mirror of
https://github.com/nextcloud/server.git
synced 2026-04-25 08:08:33 -04:00
feat: only load template fields when requested
Signed-off-by: Elizabeth Danzberger <lizzy7128@tutanota.de>
This commit is contained in:
parent
5129a79720
commit
5c7216f3fd
7 changed files with 119 additions and 7 deletions
|
|
@ -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…
Reference in a new issue