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}} + + + + + + + + + + + {{#each this.sortedPresences as |presence|}} + + + + + + + {{/each}} + +
PersoonStatusTot
{{presence.user.fullNameWithNickname}} + {{t + (concat 'component.tools.studyRoomPresence.' presence.status) + }} + {{moment-format presence.endTime 'HH:mm'}} + {{#if (can 'destroy study-room-presences')}} + + {{/if}} +
+ {{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: