diff --git a/app/abilities/study-room-presence.js b/app/abilities/study-room-presence.js
new file mode 100644
index 000000000..2ff1bc004
--- /dev/null
+++ b/app/abilities/study-room-presence.js
@@ -0,0 +1,15 @@
+import { Ability } from 'ember-can';
+
+export default class StudyRoomPresence extends Ability {
+ get canShow() {
+ return this.session.hasPermission('study-room-presence.read');
+ }
+
+ get canCreate() {
+ return this.session.hasPermission('study-room-presence.create');
+ }
+
+ get canDestroy() {
+ return this.session.hasPermission('study-room-presence.destroy');
+ }
+}
diff --git a/app/components/index/authenticated.hbs b/app/components/index/authenticated.hbs
index 4a82afe64..e69b3c6d2 100644
--- a/app/components/index/authenticated.hbs
+++ b/app/components/index/authenticated.hbs
@@ -1,5 +1,6 @@
+
diff --git a/app/components/tools/board-room-presence.hbs b/app/components/tools/board-room-presence.hbs
index b70989892..5ac073729 100644
--- a/app/components/tools/board-room-presence.hbs
+++ b/app/components/tools/board-room-presence.hbs
@@ -1,4 +1,4 @@
-
+
Bestuurskamer
diff --git a/app/components/tools/study-room-presence.hbs b/app/components/tools/study-room-presence.hbs
new file mode 100644
index 000000000..0d9d0b2a6
--- /dev/null
+++ b/app/components/tools/study-room-presence.hbs
@@ -0,0 +1,136 @@
+
+
+
+ 2de kamer
+
+
+
+ {{#each this.sortedPresences as |presence|}}
+
+
+
+ {{presence.user.fullNameWithNickname}}
+
+
+
+ {{t (concat 'component.tools.studyRoomPresence.' presence.status)}}
+ van
+ {{moment-format presence.startTime 'HH:mm'}}
+ tot
+ {{moment-format presence.endTime 'HH:mm'}}
+
+
+ {{else}}
+ Er is niemand aanwezig
+ {{/each}}
+
+ {{#if (can 'create study-room-presences')}}
+
+
+
+ {{/if}}
+
+
+
+
+{{#if presenceModalIsOpen}}
+
+
+ {{#if this.sortedPresences}}
+
+
+
+ Persoon |
+ Status |
+ Tot |
+ |
+
+
+
+ {{#each this.sortedPresences as |presence|}}
+
+ {{presence.user.fullNameWithNickname}} |
+
+ {{t
+ (concat 'component.tools.studyRoomPresence.' presence.status)
+ }}
+ |
+ {{moment-format presence.endTime 'HH:mm'}} |
+
+ {{#if (can 'destroy study-room-presences')}}
+
+ {{/if}}
+ |
+
+ {{/each}}
+
+
+ {{else}}
+ Er zijn geen alphanen aanwezig
+ {{/if}}
+
+ {{#if (can 'create study-room-presences')}}
+ {{#if this.currentUserPresence}}
+
+
+
+
+
+
+ {{else}}
+
+ {{/if}}
+ {{/if}}
+
+
+{{/if}}
\ No newline at end of file
diff --git a/app/components/tools/study-room-presence.js b/app/components/tools/study-room-presence.js
new file mode 100644
index 000000000..96745b6af
--- /dev/null
+++ b/app/components/tools/study-room-presence.js
@@ -0,0 +1,127 @@
+import { dropTask, restartableTask, timeout } from 'ember-concurrency';
+import Component from '@glimmer/component';
+import { action } from '@ember/object';
+import moment from 'moment';
+import { inject as service } from '@ember/service';
+import { tracked } from '@glimmer/tracking';
+import Ember from 'ember';
+
+export default class BoardRoomPresence extends Component {
+ @service session;
+ @service store;
+ @service abilities;
+
+ @tracked presenceModalIsOpen = false;
+ @tracked model = [];
+ @tracked newCurrentUserPresence = null;
+
+ statusOptions = [
+ {
+ value: 'chilling',
+ label: 'Chillen',
+ },
+ {
+ value: 'studying',
+ label: 'Studeren',
+ },
+ {
+ value: 'vergaderen',
+ label: 'Vergaderen',
+ },
+ ];
+
+ @dropTask({ cancelOn: 'didInsertElement' }) *poll() {
+ while (!Ember.testing) {
+ yield this.fetchData.perform();
+ yield timeout(1000 * 30); // Wait 30 seconds
+ }
+ }
+
+ @restartableTask *fetchData() {
+ /* eslint-disable camelcase */
+ this.model = yield this.store.query('study-room-presence', {
+ filter: { current_and_future: true },
+ });
+ /* eslint-enable camelcase */
+ }
+
+ constructor() {
+ super(...arguments);
+ this.poll.perform();
+ }
+
+ get currentUserPresence() {
+ if (this.newCurrentUserPresence) {
+ return this.newCurrentUserPresence;
+ }
+ return (
+ this.model.filter((presence) => presence.user.get('isCurrentUser'))[0] ||
+ null
+ );
+ }
+
+ set currentUserPresence(presence) {
+ this.newCurrentUserPresence = presence;
+ }
+
+ get sortedPresences() {
+ return this.model.sortBy('endTime');
+ }
+
+ get overallStatus() {
+ const currentStatusses = this.model
+ .filter((presence) => {
+ return moment().isBetween(
+ moment(presence.get('startTime')),
+ moment(presence.get('endTime')),
+ 'minute',
+ '[)'
+ );
+ })
+ .mapBy('status');
+
+ if (currentStatusses.includes('chilling')) {
+ return 'Chillen';
+ }
+
+ if (currentStatusses.includes('studeren')) {
+ return 'Studying';
+ }
+
+ return 'Vergaderen';
+ }
+
+ get saveButtonDisabled() {
+ return this.currentUserPresence === null;
+ }
+
+ @action
+ setPresenceModalState(state) {
+ this.presenceModalIsOpen = state === 'open';
+ }
+
+ @action
+ deletePresence() {
+ this.currentUserPresence.destroyRecord().then(() => {
+ this.currentUserPresence = null;
+ });
+ }
+
+ @action
+ newPresence() {
+ this.currentUserPresence = this.store.createRecord('study-room-presence', {
+ startTime: moment().startOf('minute').toDate(),
+ endTime: moment().startOf('minute').add(1, 'hours').toDate(),
+ status: 'present',
+ user: this.session.currentUser,
+ });
+ }
+
+ @action
+ save() {
+ const presence = this.currentUserPresence;
+ const fetch = this.fetchData;
+ presence.save().then(() => fetch.perform());
+ this.presenceModalIsOpen = false;
+ }
+}
diff --git a/app/models/study-room-presence.js b/app/models/study-room-presence.js
new file mode 100644
index 000000000..5721bbf03
--- /dev/null
+++ b/app/models/study-room-presence.js
@@ -0,0 +1,11 @@
+import Model, { belongsTo, attr } from '@ember-data/model';
+
+export default class StudyRoomPresence extends Model {
+ // Properties
+ @attr startTime;
+ @attr endTime;
+ @attr status;
+
+ // Relations
+ @belongsTo user;
+}
diff --git a/app/styles/app.scss b/app/styles/app.scss
index d1288923e..45ed2c239 100644
--- a/app/styles/app.scss
+++ b/app/styles/app.scss
@@ -33,7 +33,7 @@
@import 'components/quickpost';
@import 'components/sidebar';
@import 'components/social-media-buttons';
-@import 'components/tools/board-room-presence';
+@import 'components/tools/room-presence';
@import 'components/tools/upcoming-birthdays';
@import 'components/tools/upcoming-activities';
@import 'components/tools/forum-tool';
diff --git a/app/styles/components/tools/board-room-presence.scss b/app/styles/components/tools/room-presence.scss
similarity index 74%
rename from app/styles/components/tools/board-room-presence.scss
rename to app/styles/components/tools/room-presence.scss
index 683763d55..0518fb24e 100644
--- a/app/styles/components/tools/board-room-presence.scss
+++ b/app/styles/components/tools/room-presence.scss
@@ -10,7 +10,7 @@
font-weight: bold;
}
-.board-room-presence-dropdown {
+.room-presence-dropdown {
color: $white;
}
@@ -26,6 +26,18 @@
background-color: $brand-danger;
}
+.label-chilling {
+ background-color: $brand-success;
+}
+
+.label-studying {
+ background-color: $brand-warning;
+}
+
+.label-vergaderen {
+ background-color: $brand-success;
+}
+
.edit-presence {
.edit-presence-row {
margin: 5px;
diff --git a/mirage/config.js b/mirage/config.js
index 8241fd8ae..1afd1afa4 100644
--- a/mirage/config.js
+++ b/mirage/config.js
@@ -32,6 +32,7 @@ export default function () {
this.resource('groups');
this.resource('quickpost_messages');
this.resource('board_room_presences');
+ this.resource('study_room_presences');
this.resource('photo_albums');
this.resource('photo_comments');
this.resource('photo_tags');
diff --git a/mirage/scenarios/default.js b/mirage/scenarios/default.js
index db12aec4a..b1e3f3afa 100644
--- a/mirage/scenarios/default.js
+++ b/mirage/scenarios/default.js
@@ -8,6 +8,7 @@ export default function (server) {
'article',
'article_comment',
'board_room_presence',
+ 'study_room_presence',
'group',
'membership',
'photo_album',
diff --git a/translations/en.yaml b/translations/en.yaml
index b11419698..d5d40ac4b 100644
--- a/translations/en.yaml
+++ b/translations/en.yaml
@@ -276,6 +276,10 @@ component:
present: Present
busy: Busy
absent: Absent
+ studyRoomPresence:
+ chilling: Chilling
+ studying: Studying
+ vergaderen: In a meeting
userComment:
anonymous: Anonymous user
mixin:
diff --git a/translations/nl.yaml b/translations/nl.yaml
index d44a0eaee..655e2d611 100644
--- a/translations/nl.yaml
+++ b/translations/nl.yaml
@@ -281,6 +281,10 @@ component:
present: Aanwezig
busy: Bezig
absent: Afwezig
+ studyRoomPresence:
+ chilling: Chillen
+ studying: Studeren
+ vergaderen: In een vergadering
userComment:
anonymous: Anonieme gebruiker
mixin: