commit
9785f67562
@ -36,7 +36,6 @@ export class ProjectionDialogService {
|
||||
} else {
|
||||
descriptor = obj;
|
||||
}
|
||||
|
||||
const dialogRef = this.dialog.open<
|
||||
ProjectionDialogComponent,
|
||||
ProjectorElementBuildDeskriptor,
|
||||
|
@ -5,8 +5,13 @@ mat-dialog-content {
|
||||
div.projectors {
|
||||
padding: 15px 0;
|
||||
|
||||
mat-checkbox {
|
||||
padding: 0 10px;
|
||||
}
|
||||
|
||||
.right {
|
||||
float: right;
|
||||
padding-right: 10px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -24,7 +24,7 @@ export class ProjectorButtonComponent implements OnInit {
|
||||
/**
|
||||
* The object to project.
|
||||
*/
|
||||
private _object: Projectable | ProjectorElementBuildDeskriptor;
|
||||
private _object: Projectable | ProjectorElementBuildDeskriptor | null;
|
||||
|
||||
public get object(): Projectable | ProjectorElementBuildDeskriptor {
|
||||
return this._object;
|
||||
@ -35,10 +35,7 @@ export class ProjectorButtonComponent implements OnInit {
|
||||
if (isProjectable(obj) || isProjectorElementBuildDeskriptor(obj)) {
|
||||
this._object = obj;
|
||||
} else {
|
||||
console.error(
|
||||
'Your model for the projectorbutton is not projectable and not' + 'a projectorElementBuildDescriptor!',
|
||||
obj
|
||||
);
|
||||
this.object = null;
|
||||
}
|
||||
}
|
||||
|
||||
@ -62,8 +59,10 @@ export class ProjectorButtonComponent implements OnInit {
|
||||
*/
|
||||
public onClick(event: Event): void {
|
||||
event.stopPropagation();
|
||||
if (this.object) {
|
||||
this.projectionDialogService.openProjectDialogFor(this.object);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
|
@ -28,6 +28,16 @@
|
||||
</mat-cell>
|
||||
</ng-container>
|
||||
|
||||
<!-- Projector column -->
|
||||
<ng-container matColumnDef="projector">
|
||||
<mat-header-cell *matHeaderCellDef mat-sort-header>Projector</mat-header-cell>
|
||||
<mat-cell *matCellDef="let item">
|
||||
<div *ngIf="item.contentObject">
|
||||
<os-projector-button [object]="item.contentObject"></os-projector-button>
|
||||
</div>
|
||||
</mat-cell>
|
||||
</ng-container>
|
||||
|
||||
<!-- title column -->
|
||||
<ng-container matColumnDef="title">
|
||||
<mat-header-cell *matHeaderCellDef mat-sort-header>Topic</mat-header-cell>
|
||||
|
@ -54,6 +54,7 @@ export class AgendaListComponent extends ListViewBaseComponent<ViewItem> impleme
|
||||
* @param titleService Setting the browser tab title
|
||||
* @param translate translations
|
||||
* @param matSnackBar Shows errors and messages
|
||||
* @param operator The current user
|
||||
* @param route Angulars ActivatedRoute
|
||||
* @param router Angulars router
|
||||
* @param repo the agenda repository,
|
||||
@ -66,12 +67,12 @@ export class AgendaListComponent extends ListViewBaseComponent<ViewItem> impleme
|
||||
* @param filterService: service for filtering data
|
||||
* @param agendaPdfService: service for preparing a pdf of the agenda
|
||||
* @param pdfService: Service for exporting a pdf
|
||||
* @param operator the current user
|
||||
*/
|
||||
public constructor(
|
||||
titleService: Title,
|
||||
translate: TranslateService,
|
||||
matSnackBar: MatSnackBar,
|
||||
private operator: OperatorService,
|
||||
private route: ActivatedRoute,
|
||||
private router: Router,
|
||||
private repo: ItemRepositoryService,
|
||||
@ -83,8 +84,7 @@ export class AgendaListComponent extends ListViewBaseComponent<ViewItem> impleme
|
||||
private csvExport: AgendaCsvExportService,
|
||||
public filterService: AgendaFilterListService,
|
||||
private agendaPdfService: AgendaPdfService,
|
||||
private pdfService: PdfDocumentService,
|
||||
private operator: OperatorService
|
||||
private pdfService: PdfDocumentService
|
||||
) {
|
||||
super(titleService, translate, matSnackBar);
|
||||
|
||||
@ -238,11 +238,14 @@ export class AgendaListComponent extends ListViewBaseComponent<ViewItem> impleme
|
||||
* @returns an array of strings with the dialogs to show
|
||||
*/
|
||||
public getColumnDefinition(): string[] {
|
||||
const list = this.vp.isMobile ? this.displayedColumnsMobile : this.displayedColumnsDesktop;
|
||||
if (this.isMultiSelect) {
|
||||
return ['selector'].concat(list);
|
||||
let columns = this.vp.isMobile ? this.displayedColumnsMobile : this.displayedColumnsDesktop;
|
||||
if (this.operator.hasPerms('core.can_manage_projector')) {
|
||||
columns = ['projector'].concat(columns);
|
||||
}
|
||||
return list;
|
||||
if (this.isMultiSelect) {
|
||||
columns = ['selector'].concat(columns);
|
||||
}
|
||||
return columns;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -96,7 +96,16 @@ export class ViewTopic extends BaseAgendaViewModel {
|
||||
}
|
||||
|
||||
public getSlide(): ProjectorElementBuildDeskriptor {
|
||||
throw new Error('TODO');
|
||||
return {
|
||||
getBasicProjectorElement: () => ({
|
||||
name: Topic.COLLECTIONSTRING,
|
||||
id: this.id,
|
||||
getIdentifiers: () => ['name', 'id']
|
||||
}),
|
||||
slideOptions: [],
|
||||
projectionDefaultName: 'topics',
|
||||
getTitle: () => this.getTitle()
|
||||
};
|
||||
}
|
||||
|
||||
public hasAttachments(): boolean {
|
||||
|
@ -80,6 +80,15 @@ export class ViewAssignment extends BaseAgendaViewModel {
|
||||
}
|
||||
|
||||
public getSlide(): ProjectorElementBuildDeskriptor {
|
||||
throw new Error('TODO');
|
||||
return {
|
||||
getBasicProjectorElement: () => ({
|
||||
name: Assignment.COLLECTIONSTRING,
|
||||
id: this.id,
|
||||
getIdentifiers: () => ['name', 'id']
|
||||
}),
|
||||
slideOptions: [],
|
||||
projectionDefaultName: 'assignments',
|
||||
getTitle: () => this.getTitle()
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@ -5,6 +5,7 @@ import { SlideOptions } from './slide-options';
|
||||
export function isProjectorElementBuildDeskriptor(obj: any): obj is ProjectorElementBuildDeskriptor {
|
||||
const deskriptor = <ProjectorElementBuildDeskriptor>obj;
|
||||
return (
|
||||
!!deskriptor &&
|
||||
deskriptor.slideOptions !== undefined &&
|
||||
deskriptor.getBasicProjectorElement !== undefined &&
|
||||
deskriptor.getTitle !== undefined
|
||||
@ -23,7 +24,11 @@ export interface ProjectorElementBuildDeskriptor {
|
||||
}
|
||||
|
||||
export function isProjectable(obj: any): obj is Projectable {
|
||||
if (obj) {
|
||||
return (<Projectable>obj).getSlide !== undefined;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -0,0 +1,4 @@
|
||||
export interface TopicsTopicSlideData {
|
||||
title: string;
|
||||
text: string;
|
||||
}
|
@ -0,0 +1,5 @@
|
||||
<div *ngIf="data">
|
||||
<h1>{{ data.data.title }}</h1>
|
||||
|
||||
<div [innerHTML]="data.data.text"></div>
|
||||
</div>
|
@ -0,0 +1,26 @@
|
||||
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
|
||||
import { TopicsTopicSlideComponent } from './topics-topic-slide.component';
|
||||
import { E2EImportsModule } from 'e2e-imports.module';
|
||||
|
||||
describe('TopicsTopicSlideComponent', () => {
|
||||
let component: TopicsTopicSlideComponent;
|
||||
let fixture: ComponentFixture<TopicsTopicSlideComponent>;
|
||||
|
||||
beforeEach(async(() => {
|
||||
TestBed.configureTestingModule({
|
||||
imports: [E2EImportsModule],
|
||||
declarations: [TopicsTopicSlideComponent]
|
||||
}).compileComponents();
|
||||
}));
|
||||
|
||||
beforeEach(() => {
|
||||
fixture = TestBed.createComponent(TopicsTopicSlideComponent);
|
||||
component = fixture.componentInstance;
|
||||
fixture.detectChanges();
|
||||
});
|
||||
|
||||
it('should create', () => {
|
||||
expect(component).toBeTruthy();
|
||||
});
|
||||
});
|
@ -0,0 +1,14 @@
|
||||
import { Component } from '@angular/core';
|
||||
import { BaseSlideComponent } from 'app/slides/base-slide-component';
|
||||
import { TopicsTopicSlideData } from './topics-topic-slide-data';
|
||||
|
||||
@Component({
|
||||
selector: 'os-topic-slide',
|
||||
templateUrl: './topics-topic-slide.component.html',
|
||||
styleUrls: ['./topics-topic-slide.component.scss']
|
||||
})
|
||||
export class TopicsTopicSlideComponent extends BaseSlideComponent<TopicsTopicSlideData> {
|
||||
public constructor() {
|
||||
super();
|
||||
}
|
||||
}
|
@ -0,0 +1,13 @@
|
||||
import { TopicsTopicSlideModule } from './topics-topic-slide.module';
|
||||
|
||||
describe('TopicsTopicSlideModule', () => {
|
||||
let topicsTopicSlideModule: TopicsTopicSlideModule;
|
||||
|
||||
beforeEach(() => {
|
||||
topicsTopicSlideModule = new TopicsTopicSlideModule();
|
||||
});
|
||||
|
||||
it('should create an instance', () => {
|
||||
expect(topicsTopicSlideModule).toBeTruthy();
|
||||
});
|
||||
});
|
@ -0,0 +1,7 @@
|
||||
import { NgModule } from '@angular/core';
|
||||
|
||||
import { makeSlideModule } from 'app/slides/base-slide-module';
|
||||
import { TopicsTopicSlideComponent } from './topics-topic-slide.component';
|
||||
|
||||
@NgModule(makeSlideModule(TopicsTopicSlideComponent))
|
||||
export class TopicsTopicSlideModule {}
|
@ -8,6 +8,16 @@ import { SlideManifest } from './slide-manifest';
|
||||
* is no such thing as "dynamic update" in this case..
|
||||
*/
|
||||
export const allSlides: SlideManifest[] = [
|
||||
{
|
||||
slide: 'topics/topic',
|
||||
path: 'topics/topic',
|
||||
loadChildren: './slides/agenda/topic/topics-topic-slide.module#TopicsTopicSlideModule',
|
||||
scaleable: true,
|
||||
scrollable: true,
|
||||
verboseName: 'Topic',
|
||||
elementIdentifiers: ['name', 'id'],
|
||||
canBeMappedToModel: true
|
||||
},
|
||||
{
|
||||
slide: 'motions/motion',
|
||||
path: 'motions/motion',
|
||||
|
@ -1,9 +0,0 @@
|
||||
#outer {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: 0;
|
||||
background-color: green;
|
||||
height: 30px;
|
||||
margin: 10px;
|
||||
z-index: 2;
|
||||
}
|
@ -1,6 +1,10 @@
|
||||
from typing import Any, Dict
|
||||
|
||||
from ..utils.projector import AllData, register_projector_slide
|
||||
from ..utils.projector import (
|
||||
AllData,
|
||||
ProjectorElementException,
|
||||
register_projector_slide,
|
||||
)
|
||||
|
||||
|
||||
# Important: All functions have to be prune. This means, that thay can only
|
||||
@ -12,8 +16,22 @@ from ..utils.projector import AllData, register_projector_slide
|
||||
def topic_slide(all_data: AllData, element: Dict[str, Any]) -> Dict[str, Any]:
|
||||
"""
|
||||
Topic slide.
|
||||
|
||||
The returned dict can contain the following fields:
|
||||
* title
|
||||
* text
|
||||
"""
|
||||
return {"error": "TODO"}
|
||||
topic_id = element.get("id")
|
||||
|
||||
if topic_id is None:
|
||||
raise ProjectorElementException("id is required for topic slide")
|
||||
|
||||
try:
|
||||
topic = all_data["topics/topic"][topic_id]
|
||||
except KeyError:
|
||||
raise ProjectorElementException(f"topic with id {topic_id} does not exist")
|
||||
|
||||
return {"title": topic["title"], "text": topic["text"]}
|
||||
|
||||
|
||||
def register_projector_slides() -> None:
|
||||
|
Loading…
Reference in New Issue
Block a user