...
 
Commits (1001)
variables:
BUILD_DIR: dist
MIRROR_REPO: git@github.com:thm-projects/arsnova-lite.git
stages:
- codestyle
......@@ -46,38 +44,38 @@ ngbuild:
script:
- npm install -g @angular/cli
- npm install
- ng build --prod --aot=false --build-optimizer=false
- ng build --prod --aot
artifacts:
paths:
- "$BUILD_DIR"
#review:
# stage: review
# script:
# - rsync -av --delete "$BUILD_DIR" /srv/nginx/pages/$CI_BUILD_REF_SLUG
# environment:
# name: review/$CI_BUILD_REF_NAME
# url: http://$CI_BUILD_REF_SLUG.$SERVER_URL
# on_stop: stop_review
# only:
# - branches
# except:
# - master
# tags:
# - nginx
review:
stage: review
script:
- rsync -av --delete "$BUILD_DIR" /srv/nginx/pages/$CI_BUILD_REF_SLUG
environment:
name: review/$CI_BUILD_REF_NAME
url: http://$CI_BUILD_REF_SLUG.$REVIEW_SERVER_URL
on_stop: stop_review
only:
- branches
except:
- master
tags:
- nginx
#stop_review:
# stage: review
# script:
# - rm -rf "$BUILD_DIR" /srv/nginx/pages/$CI_BUILD_REF_SLUG
# variables:
# GIT_STRATEGY: none
# when: manual
# environment:
# name: review/$CI_BUILD_REF_NAME
# action: stop
# tags:
# - nginx
stop_review:
stage: review
script:
- rm -rf "$BUILD_DIR" /srv/nginx/pages/$CI_BUILD_REF_SLUG
variables:
GIT_STRATEGY: none
when: manual
environment:
name: review/$CI_BUILD_REF_NAME
action: stop
tags:
- nginx
deploy:
......@@ -95,18 +93,3 @@ deploy:
- ssh-keyscan "$SERVER_URL" >> ~/.ssh/known_hosts
- ssh-add <(echo "$SSH_PRIVATE_KEY")
- scp -r "$BUILD_DIR"* "$SSH_URL"
sync_mirror:
stage: deploy
tags:
- git
when: always
allow_failure: true
dependencies: []
script:
- eval $(ssh-agent -s)
- mkdir ~/.ssh && echo "$SYNC_SSH_KNOWN_HOSTS" > ~/.ssh/known_hosts
- ssh-add <(echo "$SYNC_SSH_PRIVATE_KEY")
- git clone --bare "$CI_REPOSITORY_URL" mirror.git
- cd mirror.git
- git push --mirror "$MIRROR_REPO"
# Changelog
## 1.3
Changes to the role system:
* Removes the distinction between participant and lecturer on login
* Adds a user home where all related sessions are listed
* Adds a moderator role
Moderated comment board:
* Creators of sessions can add moderators (via room settings)
* Creators and moderators have access to the moderator board
* Two modes of moderating:
* Default: new comments are auto-acknowledged and are visible on the normal comment board
* Whitelist: new comments are only visible in the moderator board and need acknowledgement
Other Changes:
* Comments can now be marked as wrong
* Comments can get banned (to the moderator board, see above)
* User can delete his account
* Improve wording
**This version is brought to you by:**
Project management: Klaus Quibeldey-Cirkel
Lead programming: Tom "tekay" Käsler, Lukas Mauß
## 1.2.1
Bug Fixes:
* Fix icons in room view for both roles
**This version is brought to you by:**
Project management: Klaus Quibeldey-Cirkel
Lead programming: Tom "tekay" Käsler, Lukas Mauß
## 1.2
Features:
* Adds a counter for the comments
* Adds a badge in the comment view that counts comments / filtered comments
* Adds a guest login for speaker role
Performance improvements:
* Enables Angular Ahead-of-Time compiler
* Improves loading strategy for Service Workers
General improvements:
* Optimizes dark theme for better readability
* Only shows the toolbar for the comments when there are more than 3 comments
* Pins the searchbar for the comments to the top
* Adds ID and local time to the header component in the comment view
* Improves overall wording
Bug Fixes:
* Closes presentation view for comments on pressing ESC when in browser fullscreen
* Fixed not being able to scoll in room settings
**This version is brought to you by:**
Project management: Klaus Quibeldey-Cirkel
Lead programming: Tom "tekay" Käsler, Lukas Mauß
## 1.1
Comment Feature:
* Interaction via WebSockets
* Voting on comments by participants
* New attributes: read, favorite, correct
* Search function
* Sorting and filtering
* Presentation mode with color indication for participants
* Threshold to hide negative comments from participant and lecturer
Improvements:
* Add Progressive Web App functionality for a 'native app' feeling
* Theme Manager with 4 Themes to chose from
* Designimprovements
**This version is brought to you by:**
Project management: Klaus Quibeldey-Cirkel
Lead programming: Tom "tekay" Käsler, Lukas Mauß
# ARSnova lite
This is the new Frontend for the Audience Response System ARSnova and is currently in beta.
This is the new frontend for the Audience Response System [ARSnova](https://arsnova.eu) and is currently in beta.
The project aims to provide a new experience with ARS systems and breaks with conventions introduced by arsnova-mobile. You can head over to [arsnova-lite](https://arsnova-lite.mni.thm.de/) to see it in action.
The project aims at creating the best possible user experience with a web-based audience response app. You can head over to [ARSnova lite](https://beta.arsnova.eu) to see it in action.
## Documentation
......@@ -10,4 +10,4 @@ The project aims to provide a new experience with ARS systems and breaks with co
## Credits
ARSnova is powered by Technische Hochschule Mittelhessen - University of Applied Sciences.
frag.jetzt is powered by Technische Hochschule Mittelhessen - University of Applied Sciences.
......@@ -46,7 +46,8 @@
"with": "src/environments/environment.prod.ts"
}
],
"serviceWorker": true
"serviceWorker": true,
"ngswConfigPath": "ngsw-config.json"
}
}
},
......
[TOC]
# Making HTML elements a11y
### Example (meeting_room) for Buttons
```html
<button mat-button *ngIf="user && deviceType === 'desktop'" [matMenuTriggerFor]="userMenu" aria-labelledby="meeting_room"></button>
<!--Hidden Div's for a11y-Descriptions-->
<div class="visually-hidden">
<div id="meeting_room">{{'header.a11y-meeting_room' | translate}}</div>
</div>
```
### style.sccs
```scss
.visually-hidden {
position: absolute;
width: 1px;
height: 1px;
overflow: hidden;
left: -10000px;
}
```
### Dynamic ARIA labels
Dynamic Aria labels like used in generic components are also possible!
For usage only the `attr.` tag prefix must be added like in following code example:
```html
<button
mat-button
attr.aria-labelledby="{{ ariaPrefix + 'cancel' }}"
...
...
<div id="{{ ariaPrefix + 'cancel'}}">{{ buttonsLabelSection + '.cancel-description' | translate }}</div>
```
@see: [Accessible components: #2 dynamic ARIA labels](https://blog.prototypr.io/accessible-components-2-dynamic-aria-labels-6bf281f26d17)
### Live Announcer
#### To Add Live Announcer you need to import:
``import { LiveAnnouncer } from '@angular/cdk/a11y';``
##### And add to the constructor:
```typescript
constructor(
...
private liveAnnouncer: LiveAnnouncer) {
...
}
```
#### You also need to add to the `ngOnInit()` - Function:
```typescript
ngOnInit() {
...
this.announce();
}
```
#### And this is the function to start the announcement:
```typescript
public announce() {
this.liveAnnouncer.announce('Willkommenstext', 'assertive');
}
```
#### Problems with JAWS and Microsoft Speech
JAWS and Microsoft Speech cannot play the "title" attributes. Only NVDA plays the "title" attribute.
Attribute "aria-label" does not work with multi-language titles, voice output reads registered string directly 1 to 1.
`aria-labelledby` works finde with Microsoft Speech, JAWS and NVDA. If "title" attribute is additionally set, NVDA plays the text twice.
### Keyboard Shortcut
To enter Keyboard Shortcuts you first need to import `Renderer2`, `InDestroy` and the `EventService` form `angular/core`:
```typescript
import { Component, OnInit, OnDestroy, Renderer2 } from '@angular/core';
import { EventService } from '../../../services/util/event.service';
```
After that you also need to add it to the constructor
```typescript
constructor(
...
private eventService: EventService,
private _r: Renderer2){
...
}
}
```
When this is done you need to add a listener to the ``ngOnInit()`` function.
Example:
```typescript
ngOnInit() {
...
// But first you need to add a variable:
listenerFn: () => void;
// listenerFn is for closing the listener in the ngOnDestroy() function when leaving the page
// Example of start-page
this.listenerFn = this._r.listen(document, 'keyup', (event) => {
if (event.keyCode === 49 && this.eventService.focusOnInput === false) {
document.getElementById('session_id-input').focus();
} else if (event.keyCode === 51 && this.eventService.focusOnInput === false) {
document.getElementById('new_session-button').focus();
} else if (event.keyCode === 52 && this.eventService.focusOnInput === false) {
document.getElementById('language-menu').focus();
} else if ((event.keyCode === 57 || event.keyCode === 27) && this.eventService.focusOnInput === false) {
this.announce();
} else if (event.keyCode === 27 && this.eventService.focusOnInput === true) {
document.getElementById('session_enter-button').focus();
}
});
}
// HTML Code:
<button id="session_enter-button" ...>
...
</button>
// 'focusOnInput' is a boolean variable which should be triggered when an input element is focused and unfocused
// Example of room-join.component.html
<input id="session_id-input" matInput #roomId (focus)="eventService.makeFocusOnInputTrue()"
(blur)="eventService.makeFocusOnInputFalse()"
.../>
// ngOnDestroy function for closing the listener when leaving the page
ngOnDestroy() {
this.listenerFn();
}
```
## HTML5 Accessibility: aria-hidden and role=”presentation”
A page about `aria-hidden` and `role="presentation"` attribute usage tests:
Source: [HTML5 Accessibility: aria-hidden and role=”presentation”](http://john.foliot.ca/aria-hidden/)
This diff is collapsed.
This diff is collapsed.
@startuml
skinparam class {
BackgroundColor PaleGreen
BorderColor Green
ArrowColor black
FontSize 28
BackgroundColor<<USP>> Pink
BorderColor<<USP>> HotPink
}
skinparam backgroundColor Linen
skinparam linetype ortho
skinparam shadowing true
skinparam minClassWidth 200
skinparam LegendBackgroundColor Strategy
skinparam LegendBorderThickness 0
skinparam LegendFontSize 20
skinparam defaultFontSize 20
skinparam Padding 8
skinparam Nodesep 150
skinparam ArrowThickness 2
skinparam ArrowColor DarkSlateGray
hide methods
hide empty members
hide circle
package "frag.jetzt | domain diagram" <<Frame>> {
class GuestUser {
}
class RegisteredUser {
email
password
}
GuestUser -left-|> User
RegisteredUser -up-|> User
class SessionParticipant {
}
class TemporalSessionHolder {
}
SessionParticipant -left-|> GuestUser
TemporalSessionHolder -up-|> GuestUser
class Moderator <<USP>> {
}
class BonusParticipant <<USP>> {
}
class PermanentSessionHolder{
}
PermanentSessionHolder -left-|> RegisteredUser
Moderator -up-|> RegisteredUser
Moderator -down- Session :assigned to >
BonusParticipant -right-|> RegisteredUser
class Session {
id
name
description
holder
moderators
}
class Question {
votes
}
class Status {
affirmed
negated
bonus
discussed
}
Status -up- Question
class Board {
helpPage
}
class QuestionBoard {
counter
search
sorting
filtering
displayThreshold
}
class ModeratorBoard {
counter
search
sorting
filtering
}
Session *-right- Board
QuestionBoard -up-|> Board
ModeratorBoard -up-|> Board
Question -right-o QuestionBoard
ModeratorBoard o-down- BannedQuestion
}
legend right
|<img:https://git.thm.de/arsnova/arsnova-lite/raw/staging/src/assets/icons/Logo_frag_jetzt_128x128.png> |= \n\n »frag.jetzt« |
| Produktion | [[https://frag.jetzt]] |
| Repository | [[https://git.thm.de/arsnova/frag.jetzt]] |
| Staging Server | [[https://staging.frag.jetzt]] |
| UML-Tool| PlantUML v1.2019.5|
| Ersteller| Klaus Quibeldey-Cirkel|
| Mail| klaus.quibeldey-cirkel@mni.thm.de |
| Letzte Änderung| 26.08.2019 |
end legend
@enduml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<diagram program="umlet" version="14.2">
<zoom_level>13</zoom_level>
<element>
<id>UMLActor</id>
<coordinates>
<x>0</x>
<y>208</y>
<w>104</w>
<h>156</h>
</coordinates>
<panel_attributes>Participant
</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>65</x>
<y>221</y>
<w>442</w>
<h>104</h>
</coordinates>
<panel_attributes/>
<additional_attributes>10.0;10.0;320.0;60.0</additional_attributes>
</element>
<element>
<id>UMLUseCase</id>
<coordinates>
<x>884</x>
<y>208</y>
<w>182</w>
<h>52</h>
</coordinates>
<panel_attributes>join created
room</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLUseCase</id>
<coordinates>
<x>676</x>
<y>481</y>
<w>156</w>
<h>65</h>
</coordinates>
<panel_attributes>create content
for room</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLUseCase</id>
<coordinates>
<x>520</x>
<y>65</y>
<w>156</w>
<h>52</h>
</coordinates>
<panel_attributes>give a
comment</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLUseCase</id>
<coordinates>
<x>481</x>
<y>169</y>
<w>156</w>
<h>65</h>
</coordinates>
<panel_attributes>show content
in room</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLUseCase</id>
<coordinates>
<x>377</x>
<y>715</y>
<w>156</w>
<h>52</h>
</coordinates>
<panel_attributes>see feedback</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLUseCase</id>
<coordinates>
<x>975</x>
<y>611</y>
<w>208</w>
<h>65</h>
</coordinates>
<panel_attributes>see answer statistics</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>806</x>
<y>507</y>
<w>195</w>
<h>156</h>
</coordinates>
<panel_attributes>lt=.&gt;
&lt;&lt;extends&gt;&gt;</panel_attributes>
<additional_attributes>130.0;100.0;10.0;17.0</additional_attributes>
</element>
<element>
<id>UMLUseCase</id>
<coordinates>
<x>1001</x>
<y>468</y>
<w>169</w>
<h>78</h>
</coordinates>
<panel_attributes>start new
voting round</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>819</x>
<y>481</y>
<w>208</w>
<h>52</h>
</coordinates>
<panel_attributes>lt=.&gt;
&lt;&lt;extends&gt;&gt;</panel_attributes>
<additional_attributes>140.0;20.0;10.0;20.0</additional_attributes>
</element>
<element>
<id>UMLClass</id>
<coordinates>
<x>156</x>
<y>13</y>
<w>156</w>
<h>39</h>
</coordinates>
<panel_attributes>ARSnova</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLActor</id>
<coordinates>
<x>0</x>
<y>546</y>
<w>78</w>
<h>156</h>
</coordinates>
<panel_attributes>Creator
</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLClass</id>
<coordinates>
<x>156</x>
<y>13</y>
<w>1144</w>
<h>949</h>
</coordinates>
<panel_attributes>
</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLUseCase</id>
<coordinates>
<x>481</x>
<y>273</y>
<w>156</w>
<h>52</h>
</coordinates>
<panel_attributes>give feedback
</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLUseCase</id>
<coordinates>
<x>416</x>
<y>598</y>
<w>156</w>
<h>52</h>
</coordinates>
<panel_attributes>create room
</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>26</x>
<y>559</y>
<w>416</w>
<h>91</h>
</coordinates>
<panel_attributes/>
<additional_attributes>300.0;50.0;10.0;10.0</additional_attributes>
</element>
<element>
<id>UMLUseCase</id>
<coordinates>
<x>663</x>
<y>637</y>
<w>156</w>
<h>52</h>
</coordinates>
<panel_attributes>login</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>546</x>
<y>624</y>
<w>143</w>
<h>65</h>
</coordinates>
<panel_attributes>lt=&lt;.
&lt;&lt;include&gt;&gt;</panel_attributes>
<additional_attributes>90.0;30.0;10.0;10.0</additional_attributes>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>663</x>
<y>78</y>
<w>247</w>
<h>169</h>
</coordinates>
<panel_attributes>lt=&lt;.
&lt;&lt;include&gt;&gt;</panel_attributes>
<additional_attributes>10.0;10.0;170.0;110.0</additional_attributes>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>624</x>
<y>195</y>
<w>286</w>
<h>65</h>
</coordinates>
<panel_attributes>lt=&lt;.
&lt;&lt;include&gt;&gt;</panel_attributes>
<additional_attributes>10.0;10.0;200.0;30.0</additional_attributes>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>624</x>
<y>234</y>
<w>286</w>
<h>91</h>
</coordinates>
<panel_attributes>lt=&lt;.
&lt;&lt;include&gt;&gt;</panel_attributes>
<additional_attributes>10.0;50.0;200.0;10.0</additional_attributes>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>52</x>
<y>507</y>
<w>650</w>
<h>78</h>
</coordinates>
<panel_attributes/>
<additional_attributes>10.0;40.0;480.0;10.0</additional_attributes>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>520</x>
<y>533</y>
<w>260</w>
<h>91</h>
</coordinates>
<panel_attributes>lt=&lt;.
&lt;&lt;include&gt;&gt;</panel_attributes>
<additional_attributes>10.0;50.0;180.0;10.0</additional_attributes>
</element>
<element>
<id>UMLUseCase</id>
<coordinates>
<x>429</x>
<y>832</y>
<w>156</w>
<h>78</h>
</coordinates>
<panel_attributes>see participant's
comments</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>39</x>
<y>598</y>
<w>416</w>
<h>286</h>
</coordinates>
<panel_attributes/>
<additional_attributes>10.0;10.0;300.0;200.0</additional_attributes>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>39</x>
<y>585</y>
<w>364</w>
<h>182</h>
</coordinates>
<panel_attributes/>
<additional_attributes>10.0;10.0;260.0;120.0</additional_attributes>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>520</x>
<y>637</y>
<w>117</w>
<h>130</h>
</coordinates>
<panel_attributes>lt=&lt;.
&lt;&lt;include&gt;&gt;</panel_attributes>
<additional_attributes>10.0;10.0;10.0;80.0</additional_attributes>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>65</x>
<y>195</y>
<w>455</w>
<h>52</h>
</coordinates>
<panel_attributes/>
<additional_attributes>10.0;20.0;330.0;20.0</additional_attributes>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>65</x>
<y>78</y>
<w>481</w>
<h>156</h>
</coordinates>
<panel_attributes/>
<additional_attributes>10.0;100.0;350.0;10.0</additional_attributes>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>533</x>
<y>624</y>
<w>130</w>
<h>273</h>
</coordinates>
<panel_attributes>lt=&lt;.
&lt;&lt;include&gt;&gt;</panel_attributes>
<additional_attributes>10.0;10.0;40.0;190.0</additional_attributes>
</element>
<element>
<id>UMLUseCase</id>
<coordinates>
<x>338</x>
<y>26</y>
<w>182</w>
<h>52</h>
</coordinates>
<panel_attributes>give answer
to a content</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>403</x>
<y>65</y>
<w>156</w>
<h>156</h>
</coordinates>
<panel_attributes>lt=.&gt;
&lt;&lt;extends&gt;&gt;</panel_attributes>
<additional_attributes>60.0;100.0;10.0;10.0</additional_attributes>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>65</x>
<y>65</y>
<w>351</w>
<h>156</h>
</coordinates>
<panel_attributes/>
<additional_attributes>250.0;10.0;10.0;100.0</additional_attributes>
</element>
</diagram>
@startuml
scale 1.0
left to right direction
skinparam backgroundColor Linen
skinparam LegendBackgroundColor Strategy
skinparam LegendBorderThickness 0
skinparam LegendFontSize 20
skinparam Padding 5
skinparam defaultFontSize 24
skinparam Nodesep 100
skinparam ArrowThickness 2
skinparam shadowing true
skinparam usecase {
BackgroundColor PaleGreen
BorderColor Green
BackgroundColor<<USP>> Pink
BorderColor<<USP>> HotPink
BorderThickness 2
ArrowThickness 2
ArrowColor Green
ActorBorderColor Green
}
actor Lecturer
actor Student
actor Moderator
note "If a lecturer is registered and logs in with her account, \nher sessions remain stored for 180 days after the last visit, \notherwise they are deleted when she logs out." as NoteForCreateSession
note "Registered students can receive a bonus \nfor particularly interesting questions." as NoteForJoinSession
rectangle "frag.jetzt | use-case diagram \n" << Business >> {
(Join session) --- NoteForJoinSession
(Create session) --- NoteForCreateSession
Lecturer -- (Create session)
(Evaluate questions) <.. (Delete question) : << extend >>
Student-- (Join session)
Moderator ---- (Moderate questions)
(Create session) <.. (Export questions) : << extend >>
(Create session) <.. (Assign moderator to session) : << extend >>
(Create session) <.. (Ask question) : << extend >>
(Create session) <.. (Evaluate questions) : << extend >>
(Moderate questions) <.. (Ban question) : << extend >>
(Evaluate questions) <.. (Ban question) : << extend >>
(Join session) <.. (Ask question) : << extend >>
(Join session) <.. (Vote up question) : << extend >>
(Join session) <.. (Vote down question) : << extend >>
}
legend right
|<img:https://git.thm.de/arsnova/arsnova-lite/raw/staging/src/assets/icons/Logo_frag_jetzt_128x128.png> |= \n\n »frag.jetzt« |
| Produktion | [[https://frag.jetzt]] |
| Repository | [[https://git.thm.de/arsnova/frag.jetzt]] |
| Staging Server | [[https://staging.frag.jetzt]] |
| UML-Tool| PlantUML v1.2019.5|
| Ersteller| Klaus Quibeldey-Cirkel|
| Mail| klaus.quibeldey-cirkel@mni.thm.de |
| Letzte Änderung| 26.08.2019 |
end legend
@enduml
# 1.1
## Design improvements
## Features
- add PWA functionality
- Theme Manager
## Comments
- interaction via websockets
- voting to comments
- read, factorite, correct as attributes
- sorting
- export
- search
- presentation mode with color indication for participants
- threshold to hide negative comments from view
- give user option to withdraw their vote on a comment
# 1.2
# 1.4
## Performance improvements
- use lazy-loading
- enable Ahead-of-Time compiler
- improve service worker strategy (load preference for offline/online etc.)
- Production server performance analysis
- production server performance analysis
- improve on handling STOMP subscribtions
## Web Accessibility Initiative
## Barrier-free
- adhere to WCAG 2.1 for accessibility
# No version planned
# 1.3
## Configuration
- load some configs from the backend
## Improved role system
## Tests
- add automated testing for use cases
### Break up role concept by not needing to log into specific roles
### Moderators
- implement moderators that have the same access rights (without being able to delete the room) as the owner of a room
- add dialog to room to manage moderators
- add blacklist/whitelist mode for comments
- implement moderator view to monitor/manage incoming comments
# 1.4
## Feedback
- implement a circle for the feedback
- add a freeze option to stop the feedback
## Bonus
- mark room as "bonus" on creation
- bonus rooms save the users id on comment and answer creation
## Message flow
- add message channels for domain objects
- channels provide information on new content, feedback, etc
## New feedback view
- implement a circle for the feedback
## Content
- improve on the UX
- add a markup language for the text
- improve on the theme/style
......@@ -4,26 +4,38 @@
[
{
"name": "api",
"urls": ["/**"],
"urls": ["/api/**"],
"cacheConfig": {
"strategy": "freshness",
"maxSize": 500,
"timeout": "3s",
"maxAge": "7d"
}
},
{
"name": "static",
"urls": [
"!/**/*api*/**"
],
"cacheConfig": {
"strategy": "performance",
"maxSize": 500,
"timeout": "3s",
"maxAge": "30d"
}
}
],
"assetGroups": [
{
"name": "app",
"installMode": "prefetch",
"updateMode": "prefetch",
"installMode": "lazy",
"updateMode": "lazy",
"resources": {
"files": [
"/favicon.ico",
"/*.html",
"/*.css",
"/*.js"
"/*.scss",
"/*.ts"
],
"urls": [
"https://fonts.googleapis.com/**"
......
This diff is collapsed.
{
"name": "arsnova-lite",
"version": "1.1.0-SNAPSHOT",
"version": "1.4.0-SNAPSHOT",
"license": "MIT",
"scripts": {
"ng": "ng",
......@@ -62,7 +62,7 @@
"karma-jasmine-html-reporter": "^0.2.2",
"protractor": "~5.1.2",
"ts-node": "~4.1.0",
"tslint": "~5.9.1",
"tslint": "^5.9.1",
"typescript": "3.2.4"
}
}
......@@ -15,6 +15,14 @@
},
"logLevel": "debug"
},
"/api/settings": {
"target": "http://localhost:8088",
"secure": false,
"pathRewrite": {
"^/api": ""
},
"logLevel": "debug"
},
"/api": {
"target": "http://localhost:8080",
"secure": false,
......
......@@ -2,6 +2,10 @@ import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { PageNotFoundComponent } from './components/shared/page-not-found/page-not-found.component';
import { HomePageComponent } from './components/home/home-page/home-page.component';
import { UserHomeComponent } from './components/home/user-home/user-home.component';
import { ImprintComponent } from './components/home/_dialogs/imprint/imprint.component';
import { DataProtectionComponent } from './components/home/_dialogs/data-protection/data-protection.component';
import { HelpPageComponent } from './components/shared/_dialogs/help-page/help-page.component';
const routes: Routes = [
{
......@@ -13,6 +17,22 @@ const routes: Routes = [
path: 'home',
component: HomePageComponent
},
{
path: 'user',
component: UserHomeComponent
},
{
path: 'imprint',
component: ImprintComponent
},
{
path: 'data-protection',
component: DataProtectionComponent
},
{
path: 'help-page',
component: HelpPageComponent
},
{
path: 'creator',
loadChildren: './components/creator/creator.module#CreatorModule'
......@@ -21,6 +41,10 @@ const routes: Routes = [
path: 'participant',
loadChildren: './components/participant/participant.module#ParticipantModule'
},
{
path: 'moderator',
loadChildren: './components/moderator/moderator.module#ModeratorModule'
},
{
path: '**',
component: PageNotFoundComponent
......
<div fxLayout="column" fxFill appTheme>
<script src="models/rescale.ts"></script>
<div fxLayout="column" fxFill appTheme>
<header class="header" id="header_rescale">
<app-header #header></app-header>
<div fxFlex class="app-component">
<router-outlet></router-outlet>
</header>
<div id="rescale_screen">
<div class="main_container">
<div class="inner_main_container">
<main fxFlex class="app-component">
<router-outlet></router-outlet>
</main>
</div>
</div>
</div>
<footer role="contentinfo" class="footer" id="footer_rescale">
<app-footer></app-footer>
</footer>
<div class="rescale_overlay" id="overlay_rescale" aria-hidden="true">
<button mat-icon-button (click)="getRescale().toggleState()" title="toggle">
<mat-icon>{{getRescale().getState()==1?'fullscreen':'fullscreen_exit'}}</mat-icon>
</button>
<button mat-icon-button (click)="getRescale().scaleUp()" title="Zoom +">
<mat-icon>zoom_in</mat-icon>
</button>
<button mat-icon-button (click)="getRescale().scaleDown()" title="Zoom -">
<mat-icon>zoom_out</mat-icon>
</button>
<button mat-icon-button (click)="getRescale().scaleUndo()" title="Reset Zoom">
<mat-icon>refresh</mat-icon>
</button>
</div>
</div>
</
.app-component {
padding: 4%;
z-index:1;
}
main {
height: 100%;
}
#rescale_screen{
width:100%;
height:100%;
float:left;
overflow:hidden;
}
.main_container{
width:100%;
height:100%;
overflow-y:auto;
background-color:var(--background);
}
.inner_main_container{
width:100%;
margin-top:64px;
margin-bottom:64px;
float:left;
}
.header{
width:100%;
position:fixed;
left:0;
top:0;