From 152401a9a31827dbfd03db64f43b918c666c3a19 Mon Sep 17 00:00:00 2001 From: FinnStutzenstein Date: Fri, 3 Apr 2020 16:34:15 +0200 Subject: [PATCH] Duplicates single and multiple topics in the agenda --- .../topics/topic-repository.service.ts | 12 ++++++ .../agenda-list/agenda-list.component.html | 25 ++++++------ .../agenda-list/agenda-list.component.ts | 39 +++++++++++++++++++ .../src/app/site/topics/models/view-topic.ts | 4 ++ 4 files changed, 69 insertions(+), 11 deletions(-) diff --git a/client/src/app/core/repositories/topics/topic-repository.service.ts b/client/src/app/core/repositories/topics/topic-repository.service.ts index 8377d1896..7f75a32d3 100644 --- a/client/src/app/core/repositories/topics/topic-repository.service.ts +++ b/client/src/app/core/repositories/topics/topic-repository.service.ts @@ -10,6 +10,7 @@ import { ViewModelStoreService } from 'app/core/core-services/view-model-store.s import { RelationDefinition } from 'app/core/definitions/relations'; import { Topic } from 'app/shared/models/topics/topic'; import { ViewMediafile } from 'app/site/mediafiles/models/view-mediafile'; +import { CreateTopic } from 'app/site/topics/models/create-topic'; import { TopicTitleInformation, ViewTopic } from 'app/site/topics/models/view-topic'; import { BaseIsAgendaItemAndListOfSpeakersContentObjectRepository } from '../base-is-agenda-item-and-list-of-speakers-content-object-repository'; @@ -72,4 +73,15 @@ export class TopicRepositoryService extends BaseIsAgendaItemAndListOfSpeakersCon public getVerboseName = (plural: boolean = false) => { return this.translate.instant(plural ? 'Topics' : 'Topic'); }; + + public duplicateTopic(topic: ViewTopic): void { + this.create( + new CreateTopic({ + ...topic.topic, + agenda_type: topic.item.type, + agenda_parent_id: topic.item.parent_id, + agenda_weight: topic.item.weight + }) + ); + } } diff --git a/client/src/app/site/agenda/components/agenda-list/agenda-list.component.html b/client/src/app/site/agenda/components/agenda-list/agenda-list.component.html index d6a7d2e0b..14c3aff22 100644 --- a/client/src/app/site/agenda/components/agenda-list/agenda-list.component.html +++ b/client/src/app/site/agenda/components/agenda-list/agenda-list.component.html @@ -180,6 +180,12 @@ + + + + + + - - diff --git a/client/src/app/site/agenda/components/agenda-list/agenda-list.component.ts b/client/src/app/site/agenda/components/agenda-list/agenda-list.component.ts index 2a1bbab15..f4aa27763 100644 --- a/client/src/app/site/agenda/components/agenda-list/agenda-list.component.ts +++ b/client/src/app/site/agenda/components/agenda-list/agenda-list.component.ts @@ -350,4 +350,43 @@ export class AgendaListComponent extends BaseListViewComponent impleme this.listOfSpeakersRepo.deleteAllSpeakersOfAllListsOfSpeakers().catch(this.raiseError); } } + + /** + * Duplicates a single selected item. + * + * @param item The item to duplicte. + */ + public duplicateTopic(topic: ViewTopic): void { + this.topicRepo.duplicateTopic(topic); + } + + /** + * Duplicates all selected items, that are topics. + * + * @param selectedItems All selected items. + */ + public duplicateMultipleTopics(selectedItems: ViewItem[]): void { + for (const item of selectedItems) { + if (this.isTopic(item.contentObject)) { + this.duplicateTopic(item.contentObject); + } + } + } + + /** + * Helper function to determine, if the given item is a `Topic`. + * + * @param item The selected item. + * + * @returns `true` if the given item's collection is equal to the `Topic.COLLECTIONSTRING`. + */ + public isTopic(obj: any): obj is ViewTopic { + const topic = obj as ViewTopic; + return ( + !!topic && + topic.collectionString !== undefined && + topic.collectionString === ViewTopic.COLLECTIONSTRING && + !!topic.topic + ); + } } diff --git a/client/src/app/site/topics/models/view-topic.ts b/client/src/app/site/topics/models/view-topic.ts index 897769ce6..26fb3ba6a 100644 --- a/client/src/app/site/topics/models/view-topic.ts +++ b/client/src/app/site/topics/models/view-topic.ts @@ -17,6 +17,10 @@ export interface TopicTitleInformation extends TitleInformationWithAgendaItem { export class ViewTopic extends BaseViewModelWithAgendaItemAndListOfSpeakers implements TopicTitleInformation { public static COLLECTIONSTRING = Topic.COLLECTIONSTRING; + public get topic(): Topic { + return this._model; + } + /** * Formats the category for search *