ode-ngjs-front 1.4.12-develop-integration.202507011752 → 1.4.12-develop-integration.202507211603

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -16,8 +16,6 @@ export declare class Controller {
16
16
  todayOnCampus: number;
17
17
  todayOffCampus: number;
18
18
  todayTotal: number;
19
- todaySchoolUsePercentage: number;
20
- todayOutOfSchoolPercentage: number;
21
19
  weeklyAvgOnCampus: number;
22
20
  weeklyAvgOffCampus: number;
23
21
  weeklyTotalAverage: number;
@@ -26,8 +24,6 @@ export declare class Controller {
26
24
  fixedTodayOnCampus: number;
27
25
  fixedTodayOffCampus: number;
28
26
  fixedTodayTotal: number;
29
- fixedTodaySchoolUsePercentage: number;
30
- fixedTodayOutOfSchoolPercentage: number;
31
27
  fixedWeeklyAvgOnCampus: number;
32
28
  fixedWeeklyAvgOffCampus: number;
33
29
  fixedWeeklyTotalAverage: number;
@@ -53,6 +49,13 @@ export declare class Controller {
53
49
  toggleDatePicker(show: boolean): void;
54
50
  setDateFromPicker(date: string): void;
55
51
  toggleLightbox(show: boolean): void;
52
+ private getCurrentSchoolYear;
53
+ private setSelectedDate;
54
+ private setSelectedWeek;
55
+ canGoToPreviousWeek(): boolean;
56
+ canGoToNextWeek(): boolean;
57
+ canGoToPreviousDay(): boolean;
58
+ canGoToNextDay(): boolean;
56
59
  changeDay(offset: number): void;
57
60
  changeWeek(offset: number): void;
58
61
  get selectedDailyDateObj(): Date;
@@ -1 +1 @@
1
- {"version":3,"file":"screen-time-widget.widget.d.ts","sourceRoot":"","sources":["../../../../src/ts/widgets/screen-time-widget/screen-time-widget.widget.ts"],"names":[],"mappings":"AAGA,OAAe,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,kBAAkB,CAAC;AAM1B,qBAAa,UAAU;IACZ,YAAY,EAAE,MAAM,CAAM;IAC1B,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAY;IAExC,QAAQ,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG;YAAE,MAAM,EAAE,GAAG,CAAC;YAAC,KAAK,EAAE,GAAG,CAAA;SAAE,CAAA;KAAE,CAAM;IAC9D,iBAAiB,EAAE,MAAM,CAAiC;IAC1D,SAAS,EAAE,MAAM,CAA+B;IAChD,OAAO,EAAE,MAAM,CAA6B;IAE5C,WAAW,EAAE,MAAM,IAAI,CAAa;IAEpC,aAAa,SAAK;IAClB,cAAc,SAAK;IACnB,UAAU,SAAK;IACf,wBAAwB,EAAE,MAAM,CAAK;IACrC,0BAA0B,EAAE,MAAM,CAAK;IAEvC,iBAAiB,SAAK;IACtB,kBAAkB,SAAK;IACvB,kBAAkB,SAAK;IACvB,4BAA4B,EAAE,MAAM,CAAK;IACzC,8BAA8B,EAAE,MAAM,CAAK;IAG3C,kBAAkB,SAAK;IACvB,mBAAmB,SAAK;IACxB,eAAe,SAAK;IACpB,6BAA6B,EAAE,MAAM,CAAK;IAC1C,+BAA+B,EAAE,MAAM,CAAK;IAE5C,sBAAsB,SAAK;IAC3B,uBAAuB,SAAK;IAC5B,uBAAuB,SAAK;IAC5B,iCAAiC,EAAE,MAAM,CAAK;IAC9C,mCAAmC,EAAE,MAAM,CAAK;IAKhD,cAAc,EAAE,OAAO,CAAS;IAChC,eAAe,EAAE,MAAM,CAAM;IAC7B,aAAa,EAAE,MAAM,CAAM;IAE3B,QAAQ,EAAE,OAAO,CAAS;IAE1B,QAAQ,EAAE,OAAO,CAAS;IAC1B,YAAY,EAAE,MAAM,CAAM;IAE1B,uBAAuB,EAAE,MAAM,IAAI,CAAa;IAChD,iBAAiB,EAAE,MAAM,IAAI,CAAa;IAE1C,YAAY,EAAE,OAAO,CAAS;IAC9B,cAAc,EAAE,OAAO,CAAS;IAEhC,QAAQ,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAM;IAC9D,aAAa,OAAQ;IACrB,sBAAsB,SAAM;IAE5B,gBAAgB,CAAC,IAAI,EAAE,OAAO;IAI9B,iBAAiB,CAAC,IAAI,EAAE,MAAM;IAM9B,cAAc,CAAC,IAAI,EAAE,OAAO;IAwB5B,SAAS,CAAC,MAAM,EAAE,MAAM;IAKxB,UAAU,CAAC,MAAM,EAAE,MAAM;IAMhC,IAAW,oBAAoB,IAAI,IAAI,CAEtC;IAED,IAAW,SAAS,IAAI,MAAM,CAI7B;CACJ;AA2WD,eAAO,MAAM,aAAa,2BAA2B,CAAC"}
1
+ {"version":3,"file":"screen-time-widget.widget.d.ts","sourceRoot":"","sources":["../../../../src/ts/widgets/screen-time-widget/screen-time-widget.widget.ts"],"names":[],"mappings":"AAGA,OAAe,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,kBAAkB,CAAC;AAM1B,qBAAa,UAAU;IACZ,YAAY,EAAE,MAAM,CAAM;IAC1B,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAY;IAExC,QAAQ,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG;YAAE,MAAM,EAAE,GAAG,CAAC;YAAC,KAAK,EAAE,GAAG,CAAA;SAAE,CAAA;KAAE,CAAM;IAC9D,iBAAiB,EAAE,MAAM,CAAiC;IAC1D,SAAS,EAAE,MAAM,CAA+B;IAChD,OAAO,EAAE,MAAM,CAA6B;IAE5C,WAAW,EAAE,MAAM,IAAI,CAAa;IAEpC,aAAa,SAAK;IAClB,cAAc,SAAK;IACnB,UAAU,SAAK;IAEf,iBAAiB,SAAK;IACtB,kBAAkB,SAAK;IACvB,kBAAkB,SAAK;IACvB,4BAA4B,EAAE,MAAM,CAAK;IACzC,8BAA8B,EAAE,MAAM,CAAK;IAG3C,kBAAkB,SAAK;IACvB,mBAAmB,SAAK;IACxB,eAAe,SAAK;IAEpB,sBAAsB,SAAK;IAC3B,uBAAuB,SAAK;IAC5B,uBAAuB,SAAK;IAC5B,iCAAiC,EAAE,MAAM,CAAK;IAC9C,mCAAmC,EAAE,MAAM,CAAK;IAKhD,cAAc,EAAE,OAAO,CAAS;IAChC,eAAe,EAAE,MAAM,CAAM;IAC7B,aAAa,EAAE,MAAM,CAAM;IAE3B,QAAQ,EAAE,OAAO,CAAS;IAE1B,QAAQ,EAAE,OAAO,CAAS;IAC1B,YAAY,EAAE,MAAM,CAAM;IAE1B,uBAAuB,EAAE,MAAM,IAAI,CAAa;IAChD,iBAAiB,EAAE,MAAM,IAAI,CAAa;IAE1C,YAAY,EAAE,OAAO,CAAS;IAC9B,cAAc,EAAE,OAAO,CAAS;IAEhC,QAAQ,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAM;IAC9D,aAAa,OAAQ;IACrB,sBAAsB,SAAM;IAE5B,gBAAgB,CAAC,IAAI,EAAE,OAAO;IAI9B,iBAAiB,CAAC,IAAI,EAAE,MAAM;IAO9B,cAAc,CAAC,IAAI,EAAE,OAAO;IAsBnC,OAAO,CAAC,oBAAoB;IAqB5B,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,eAAe;IAOjB,mBAAmB,IAAI,OAAO;IAO9B,eAAe,IAAI,OAAO;IAO1B,kBAAkB,IAAI,OAAO;IAO5B,cAAc,IAAI,OAAO;IAOzB,SAAS,CAAC,MAAM,EAAE,MAAM;IAMxB,UAAU,CAAC,MAAM,EAAE,MAAM;IAMhC,IAAW,oBAAoB,IAAI,IAAI,CAEtC;IAED,IAAW,SAAS,IAAI,MAAM,CAI7B;CACJ;AAsWD,eAAO,MAAM,aAAa,2BAA2B,CAAC"}
package/dist/version.txt CHANGED
@@ -1 +1 @@
1
- ode-ngjs-front 01/07/2025 17:53:17
1
+ ode-ngjs-front 21/07/2025 16:04:06
@@ -1,2 +1,2 @@
1
- "use strict";(self.webpackChunkode_ngjs_front=self.webpackChunkode_ngjs_front||[]).push([[815],{2805:(e,t,n)=>{n.d(t,{Z:()=>a});const a=' <div class="widget-calendar"> <div class="widget-header"> <div class="subtitle"> <a class="seemore" href="/calendar" i18n-title="agenda-widget.widget.see.all" ng-click="trackEvent($event, { detail:{\'open\':\'app\'} })"> <i18n>agenda-widget.widget.title</i18n> <span class="seemore-text"><i18n>agenda-widget.widget.see.more</i18n></span> </a> </div> <div class="widget-options"> <div class="widget-handle" title="Déplacer le widget"><i class="fas fa-grip-vertical" aria-hidden="true"></i></div> </div> </div> <div class="widget-body" dnd-nodrag> <div class="widget-empty-message" ng-if="ctrl.userEvents === undefined || ctrl.userEvents.length === 0"> <i18n>agenda-widget.widget.empty</i18n> </div> <ul class="day-list" ng-if="ctrl.userEvents !== undefined && ctrl.userEvents.length >= 0"> <li class="day-item" ng-repeat="group in ctrl.dayGroups"> <div class="day-item-title"> {{group}} </div> <ul class="moment-list"> <li class="moment-item" ng-repeat="event in ctrl.userEvents | filter:{displayedGroup: group}"> <span class="icon"><i class="fas fa-calendar-alt"></i></span> <span class="hour" ng-if="!event.allday">[[event.displayedDate]]</span> <span class="link"><a href="/calendar" ng-click="trackEvent($event, { detail:{\'open\':\'event\'} })">[[event.title]]</a></span> </li> </ul> </li> </ul> </div> </div>'},624:function(e,t,n){var a=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.odeModuleName=void 0;var i=a(n(4202)),d=n(9419),s=function(){function e(){this.userEvents=[],this.dayGroups=[],this.MAX_EVENTS_DISPLAYED=5}return e.prototype.dateToMoment=function(e){var t=d.L10n.moment(d.L10n.moment(e).format("YYYY MM DD HH:MM"),"YYYY MM DD HH:MM").format("Z").split(":")[0];return d.L10n.utc(e).add(t,"hours")},e.prototype.toDisplayedGroup=function(e){return this.dateToMoment(e).format("dddd D MMMM YYYY")},e.prototype.toDisplayedDate=function(e){return this.dateToMoment(e).format("HH:mm")},e.prototype.today=function(e){return d.L10n.moment().format(e)},e.prototype.loadEvents=function(){var e=this;return(0,d.http)().get("/calendar/calendars").then(function(e){if(i.default.isArray(e)&&e.length>0){var t=e.map(function(e){return"calendarId="+e._id}).join("&");return console.log("filter calendarWidget : "+t),t}return null}).then(function(t){return null===t?[]:(0,d.http)().get("/calendar/events/widget?"+t+"&nb="+e.MAX_EVENTS_DISPLAYED)})},e.prototype.setEvents=function(e){var t=this;if(i.default.isArray(e)){this.dayGroups=[],this.userEvents=[];var n="";e.forEach(function(e){var a=Object.assign({displayedGroup:t.toDisplayedGroup(e.startMoment),displayedDate:t.toDisplayedDate(e.startMoment)},e);t.userEvents.push(a),n!==a.displayedGroup&&(n=a.displayedGroup,t.dayGroups.push(n))})}},e}(),r=function(){function e(){this.restrict="E",this.template=n(2805).Z,this.scope={},this.bindToController=!0,this.controller=[s],this.controllerAs="ctrl",this.require=["odeAgendaWidget"]}return e.prototype.link=function(e,t,n,a){var i=a?a[0]:null;i&&(i.loadEvents().then(function(t){i.setEvents(t),e.$apply()}),e.trackEvent=function(e,t){var n,a;void 0===t.bubbles&&(t.bubbles=!0);var i=null;(t&&"app"===(null===(n=t.detail)||void 0===n?void 0:n.open)||t&&"event"===(null===(a=t.detail)||void 0===a?void 0:a.open))&&(i=new CustomEvent(d.TrackedActionFromWidget.agenda,t)),i&&e.currentTarget&&e.currentTarget.dispatchEvent(i)})},e}();(0,d.notif)().onLangReady().promise.then(function(e){(0,d.conf)().Platform.idiom.addKeys(n(1014))}),t.odeModuleName="odeAgendaWidgetModule",i.default.module(t.odeModuleName,[]).directive("odeAgendaWidget",function(){return new r})},1014:e=>{e.exports=JSON.parse('{"agenda-widget":"Agenda","agenda-widget.widget.title":"Agenda","agenda-widget.widget.empty":"Aucun événement prévu","agenda-widget.widget.next.events":"Prochains événements","agenda-widget.widget.access.module":"Vers module Agenda","agenda-widget.widget.see.more":"voir plus","agenda-widget.widget.see.all":"Voir tout l\'agenda"}')}}]);
1
+ "use strict";(self.webpackChunkode_ngjs_front=self.webpackChunkode_ngjs_front||[]).push([[815],{2805:(e,t,n)=>{n.d(t,{Z:()=>a});const a=' <div class="widget-calendar"> <div class="widget-header"> <div class="subtitle"> <a class="seemore" href="/calendar" i18n-title="agenda-widget.widget.see.all" ng-click="trackEvent($event, { detail:{\'open\':\'app\'} })"> <i18n>agenda-widget.widget.title</i18n> <span class="seemore-text"><i18n>agenda-widget.widget.see.more</i18n></span> </a> </div> <div class="widget-options"> <div class="widget-handle" title="Déplacer le widget"><i class="fas fa-grip-vertical" aria-hidden="true"></i></div> </div> </div> <div class="widget-body" dnd-nodrag> <div class="widget-empty-message" ng-if="ctrl.userEvents === undefined || ctrl.userEvents.length === 0"> <i18n>agenda-widget.widget.empty</i18n> </div> <ul class="day-list" ng-if="ctrl.userEvents !== undefined && ctrl.userEvents.length >= 0"> <li class="day-item" ng-repeat="group in ctrl.dayGroups"> <div class="day-item-title"> {{group}} </div> <ul class="moment-list"> <li class="moment-item" ng-repeat="event in ctrl.userEvents | filter:{displayedGroup: group}"> <span class="icon"><i class="fas fa-calendar-alt"></i></span> <span class="hour" ng-if="!event.allday">[[event.displayedDate]]</span> <span class="link"><a href="/calendar" ng-click="trackEvent($event, { detail:{\'open\':\'event\'} })">[[event.title]]</a></span> </li> </ul> </li> </ul> </div> </div>'},624:function(e,t,n){var a=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.odeModuleName=void 0;var i=a(n(4202)),d=n(9419),s=function(){function e(){this.userEvents=[],this.dayGroups=[],this.MAX_EVENTS_DISPLAYED=5}return e.prototype.dateToMoment=function(e){var t=d.L10n.moment(d.L10n.moment(e).format("YYYY MM DD HH:MM"),"YYYY MM DD HH:MM").format("Z").split(":")[0];return d.L10n.utc(e).add(t,"hours")},e.prototype.toDisplayedGroup=function(e){return this.dateToMoment(e).format("dddd D MMMM YYYY")},e.prototype.toDisplayedDate=function(e){return this.dateToMoment(e).format("HH:mm")},e.prototype.today=function(e){return d.L10n.moment().format(e)},e.prototype.loadEvents=function(){var e=this;return(0,d.http)().get("/calendar/calendars").then(function(e){if(i.default.isArray(e)&&e.length>0){var t=e.map(function(e){return"calendarId="+e._id}).join("&");return console.log("filter calendarWidget : "+t),t}return null}).then(function(t){return null===t?[]:(0,d.http)().get("/calendar/events/widget?"+t+"&nb="+e.MAX_EVENTS_DISPLAYED)})},e.prototype.setEvents=function(e){var t=this;if(i.default.isArray(e)){this.dayGroups=[],this.userEvents=[];var n="";e.forEach(function(e){var a=Object.assign({displayedGroup:t.toDisplayedGroup(e.startMoment),displayedDate:t.toDisplayedDate(e.startMoment)},e);t.userEvents.push(a),n!==a.displayedGroup&&(n=a.displayedGroup,t.dayGroups.push(n))})}},e}(),r=function(){function e(){this.restrict="E",this.template=n(2805).Z,this.scope={},this.bindToController=!0,this.controller=[s],this.controllerAs="ctrl",this.require=["odeAgendaWidget"]}return e.prototype.link=function(e,t,n,a){var i=a?a[0]:null;i&&(i.loadEvents().then(function(t){i.setEvents(t),e.$apply()}),e.trackEvent=function(e,t){var n,a;void 0===t.bubbles&&(t.bubbles=!0);var i=null;(t&&"app"===(null===(n=t.detail)||void 0===n?void 0:n.open)||t&&"event"===(null===(a=t.detail)||void 0===a?void 0:a.open))&&(i=new CustomEvent(d.TrackedActionFromWidget.agenda,t)),i&&e.currentTarget&&e.currentTarget.dispatchEvent(i)})},e}();(0,d.notif)().onLangReady().promise.then(function(e){(0,d.conf)().Platform.idiom.addKeys(n(1014))}),t.odeModuleName="odeAgendaWidgetModule",i.default.module(t.odeModuleName,[]).directive("odeAgendaWidget",function(){return new r})},1014:e=>{e.exports=JSON.parse('{"agenda-widget":"Agenda","agenda-widget.widget.access.module":"Vers module Agenda","agenda-widget.widget.empty":"Aucun événement prévu","agenda-widget.widget.next.events":"Prochains événements","agenda-widget.widget.see.all":"Voir tout l\'agenda","agenda-widget.widget.see.more":"voir plus","agenda-widget.widget.title":"Agenda"}')}}]);
2
2
  //# sourceMappingURL=agenda-widget.widget.js.map
@@ -1,2 +1,2 @@
1
- "use strict";(self.webpackChunkode_ngjs_front=self.webpackChunkode_ngjs_front||[]).push([[364],{7562:(t,e,o)=>{o.d(e,{Z:()=>r});const r='<div class="widget-bookmarks"> <div class="widget-header"> <div class="subtitle"><i18n>bookmark-widget.widget.title</i18n></div> <div class="widget-options"> <div class="tools"> <a href="" class="tool tool-option" i18n-title="bookmark-widget.widget.manage.bookmarks" ng-click="ctrl.display.manage = true"> <i class="fas fa-cog"></i> </a> </div> <div class="widget-handle" title="Déplacer le widget"><i class="fas fa-grip-vertical" aria-hidden="true"></i></div> </div> </div> <div class="widget-body"> <div class="widget-empty-message link" ng-click="ctrl.display.manage = true" ng-if="ctrl.bookmarks.length === 0"> <i18n>bookmark-widget.widget.empty</i18n> </div> <ul class="bookmark-list" ng-if="!ctrl.bookmarks.isEmpty()"> <li class="bookmark-item" ng-repeat="bookmark in ctrl.bookmarks | orderBy:\'name\'"> <a class="link" href="[[bookmark.url]]" target="_blank" ng-click="trackEvent($event, {detail:{\'open\':bookmark.url} })"> [[bookmark.name]] </a> </li> </ul> </div> </div> <ode-modal size="lg" visible="ctrl.display.manage" on-close="ctrl.display.manage = false" dnd-nodrag> <ode-modal-title> <i18n>bookmark-widget.widget.manage.title</i18n> </ode-modal-title> <ode-modal-body> <div ng-if="ctrl.bookmarks.length === 0"> <p><i18n>bookmark-widget.widget.manage.empty</i18n></p> </div> <table class="table table-hover" ng-if="ctrl.bookmarks.length !== 0"> <thead> <tr class="bg-secondary text-light"> <th><i18n>bookmark-widget.widget.managetable.name</i18n></th> <th><i18n>bookmark-widget.widget.managetable.url</i18n></th> <th></th> </tr> </thead> <tbody> <tr class="c-pointer" ng-repeat="bookmark in ctrl.bookmarks" ng-class="{ \'table-active\' : ctrl.editedBookmark && bookmark._id === ctrl.editedBookmark._id }"> <td ng-click="ctrl.editBookmark(bookmark)">[[bookmark.name]]</td> <td ng-click="ctrl.editBookmark(bookmark)">[[bookmark.url]]</td> <td ng-click="ctrl.deleteBookmark(bookmark)"> <button type="button" class="btn-close" aria-label="Close"></button> </td> </tr> </tbody> </table> <form id="formCreated" autocomplete="off" class="mt-5" ng-if="ctrl.isCreatingBookmark()"> <h3><i18n>bookmark-widget.widget.createform.title</i18n></h3> <div class="form-group row mt-3"> <label for="inputCreatedName" class="col-sm-2 col-form-label"><i18n>bookmark-widget.widget.createform.name</i18n></label> <div class="col-sm-10"> <input type="text" id="inputCreatedName" class="form-control auto-focused" ng-model="ctrl.createdBookmark.name"/> </div> </div> <div class="form-group row mt-3"> <label for="inputCreatedUrl" class="col-sm-2 col-form-label"><i18n>bookmark-widget.widget.createform.url</i18n></label> <div class="col-sm-10"> <input type="text" id="inputCreatedUrl" class="form-control" ng-model="ctrl.createdBookmark.url"/> </div> </div> </form> <form id="formEdited" autocomplete="off" class="mt-5" ng-if="ctrl.isEditingBookmark()"> <h3><i18n>bookmark-widget.widget.edit.bookmark</i18n></h3> <div class="form-group row mt-3"> <label for="inputEditedName" class="col-sm-2 col-form-label"><i18n>bookmark-widget.widget.editform.name</i18n></label> <div class="col-sm-10"> <input type="text" id="inputEditedName" class="form-control auto-focused" ng-model="ctrl.editedBookmark.name"/> </div> </div> <div class="form-group row mt-3"> <label for="inputEditedUrl" class="col-sm-2 col-form-label"><i18n>bookmark-widget.widget.editform.url</i18n></label> <div class="col-sm-10"> <input type="text" id="inputEditedUrl" class="form-control" ng-model="ctrl.editedBookmark.url"/> </div> </div> </form> </ode-modal-body> <ode-modal-footer> <div ng-if="!ctrl.isCreatingBookmark() && !ctrl.isEditingBookmark()"> <button class="btn btn-primary" ng-click="ctrl.newBookmark()"><i18n>bookmark-widget.widget.new.bookmark</i18n></button> </div> <div ng-if="ctrl.isCreatingBookmark()"> <button form="formCreated" type="reset" class="btn btn-light" ng-click="ctrl.cancelCreate()"> <i18n>bookmark-widget.widget.createform.cancel</i18n> </button> <button form="formCreated" type="submit" class="btn btn-primary" ng-click="ctrl.createBookmark()"> <i18n>bookmark-widget.widget.createform.save</i18n> </button> </div> <div ng-if="ctrl.isEditingBookmark()"> <button form="formEdited" type="reset" class="btn btn-light" ng-click="ctrl.cancelEdit()"> <i18n>bookmark-widget.widget.editform.cancel</i18n> </button> <button form="formEdited" type="submit" class="btn btn-primary" ng-click="ctrl.updateBookmark()"> <i18n>bookmark-widget.widget.editform.save</i18n> </button> </div> </ode-modal-footer> </ode-modal>'},9278:function(t,e,o){var r=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.odeModuleName=void 0;var i=r(o(4202)),a=o(9419),n=o(6731);function d(t){return!t||0===t.trim().length}var l=function(){function t(t){this.name="",this.url="",this.flatCopy(t)}return t.prototype.flatCopy=function(t){return t&&Object.assign(this,t),this},t.prototype.create=function(){var t=this;return d(this.name)?(n.notify.error("bookmark-widget.widget.form.name.is.empty"),Promise.reject()):d(this.url)?(n.notify.error("bookmark-widget.widget.form.url.is.empty"),Promise.reject()):(0,a.http)().postJson("/bookmark",this).then(function(e){if(200!==(0,a.http)().latestResponse.status)throw"Rejected bookmark";return t.flatCopy(e)}).catch(function(t){throw 400===(0,a.http)().latestResponse.status&&n.notify.error(JSON.parse((0,a.http)().latestResponse.statusText).error),t})},t.prototype.update=function(){var t=this;return d(this.name)?(n.notify.error("bookmark.widget.form.name.is.empty"),Promise.reject()):d(this.url)?(n.notify.error("bookmark.widget.form.url.is.empty"),Promise.reject()):(0,a.http)().putJson("/bookmark/".concat(this._id),this).then(function(){return t}).catch(function(t){throw 400===(0,a.http)().latestResponse.status&&n.notify.error(JSON.parse((0,a.http)().latestResponse.statusText).error),t})},t.prototype.delete=function(){var t=this;return(0,a.http)().delete("/bookmark/".concat(this._id)).then(function(){return t})},t.prototype.toJSON=function(){return{name:this.name,url:this.url}},t}(),s=function(){function t(){this.bookmarks=[],this.display={manage:!1}}return t.prototype.getBookmarks=function(){var t=this;return(0,a.http)().get("/bookmark").then(function(e){e&&e.bookmarks?t.bookmarks=e.bookmarks.map(function(t){return new l(t)}):t.bookmarks=[],t.apply&&t.apply()})},t.prototype.removeHashStart=function(t){return t.replace("#start","")},t.prototype.createBookmark=function(){var t=this;this.createdBookmark&&(this.createdBookmark.url=this.removeHashStart(this.createdBookmark.url),this.createdBookmark.create().then(function(e){t.bookmarks.push(e),t.cancelCreate(),t.apply&&t.apply()}))},t.prototype.updateBookmark=function(){var t=this;if(this.editedBookmark){this.editedBookmark.url=this.removeHashStart(this.editedBookmark.url);var e=this.editedBookmark;e.update().then(function(){var o=t.bookmarks.find(function(t){return t._id===e._id});null==o||o.flatCopy(e),t.cancelEdit(),t.apply&&t.apply()})}},t.prototype.deleteBookmark=function(t){var e=this;t.delete().then(function(t){var o=e.bookmarks.indexOf(t);e.bookmarks.splice(o,1),e.cancelEdit(),e.apply&&e.apply()})},t.prototype.newBookmark=function(){this.createdBookmark=new l({url:"http://",name:""}),this.cancelEdit()},t.prototype.isCreatingBookmark=function(){return i.default.isDefined(this.createdBookmark)},t.prototype.isEditingBookmark=function(){return i.default.isDefined(this.editedBookmark)},t.prototype.editBookmark=function(t){this.editedBookmark=new l(t),this.cancelCreate()},t.prototype.cancelCreate=function(){this.createdBookmark=void 0},t.prototype.cancelEdit=function(){this.editedBookmark=void 0},t}(),m=function(){function t(){this.restrict="E",this.template=o(7562).Z,this.controller=[s],this.controllerAs="ctrl",this.require=["odeBookmarkWidget"]}return t.prototype.link=function(t,e,o,r){var i=r?r[0]:null;i&&(i.getBookmarks().then(function(){t.$apply()}),i.apply=function(){t.$apply()},t.trackEvent=function(t,e){var o;void 0===e.bubbles&&(e.bubbles=!0);var r=null;e&&"string"==typeof(null===(o=e.detail)||void 0===o?void 0:o.open)&&(r=new CustomEvent(a.TrackedActionFromWidget.bookmark,e)),r&&t.currentTarget&&t.currentTarget.dispatchEvent(r)})},t}();(0,a.notif)().onLangReady().promise.then(function(t){(0,a.conf)().Platform.idiom.addKeys(o(2731))}),e.odeModuleName="odeBookmarkWidgetModule",i.default.module(e.odeModuleName,[]).directive("odeBookmarkWidget",function(){return new m})},2731:t=>{t.exports=JSON.parse('{"bookmark-widget.widget.title":"Liens utiles","bookmark-widget":"Liens utiles","bookmark-widget.widget.createform.cancel":"Annuler","bookmark-widget.widget.createform.name":"Nom","bookmark-widget.widget.createform.save":"Enregistrer","bookmark-widget.widget.createform.title":"Nouveau lien utile","bookmark-widget.widget.createform.url":"Adresse","bookmark-widget.widget.edit.bookmark":"Mettre à jour le lien utile","bookmark-widget.widget.editform.cancel":"Annuler","bookmark-widget.widget.editform.name":"Nom","bookmark-widget.widget.editform.save":"Enregistrer","bookmark-widget.widget.editform.url":"Adresse","bookmark-widget.widget.empty":"Gardez à portée de main les sites web que vous utilisez souvent.","bookmark-widget.widget.form.name.is.empty":"Le champ \'nom\' est obligatoire","bookmark-widget.widget.form.url.is.empty":"Le champ \'adresse\' est obligatoire","bookmark-widget.widget.manage.empty":"Aucun lien utile","bookmark-widget.widget.manage.bookmarks":"Gérer les liens utiles","bookmark-widget.widget.manage.title":"Gérer les liens utiles","bookmark-widget.widget.managetable.name":"Nom","bookmark-widget.widget.managetable.url":"Adresse","bookmark-widget.widget.new.bookmark":"Nouveau lien utile"}')}}]);
1
+ "use strict";(self.webpackChunkode_ngjs_front=self.webpackChunkode_ngjs_front||[]).push([[364],{7562:(t,e,o)=>{o.d(e,{Z:()=>r});const r='<div class="widget-bookmarks"> <div class="widget-header"> <div class="subtitle"><i18n>bookmark-widget.widget.title</i18n></div> <div class="widget-options"> <div class="tools"> <a href="" class="tool tool-option" i18n-title="bookmark-widget.widget.manage.bookmarks" ng-click="ctrl.display.manage = true"> <i class="fas fa-cog"></i> </a> </div> <div class="widget-handle" title="Déplacer le widget"><i class="fas fa-grip-vertical" aria-hidden="true"></i></div> </div> </div> <div class="widget-body"> <div class="widget-empty-message link" ng-click="ctrl.display.manage = true" ng-if="ctrl.bookmarks.length === 0"> <i18n>bookmark-widget.widget.empty</i18n> </div> <ul class="bookmark-list" ng-if="!ctrl.bookmarks.isEmpty()"> <li class="bookmark-item" ng-repeat="bookmark in ctrl.bookmarks | orderBy:\'name\'"> <a class="link" href="[[bookmark.url]]" target="_blank" ng-click="trackEvent($event, {detail:{\'open\':bookmark.url} })"> [[bookmark.name]] </a> </li> </ul> </div> </div> <ode-modal size="lg" visible="ctrl.display.manage" on-close="ctrl.display.manage = false" dnd-nodrag> <ode-modal-title> <i18n>bookmark-widget.widget.manage.title</i18n> </ode-modal-title> <ode-modal-body> <div ng-if="ctrl.bookmarks.length === 0"> <p><i18n>bookmark-widget.widget.manage.empty</i18n></p> </div> <table class="table table-hover" ng-if="ctrl.bookmarks.length !== 0"> <thead> <tr class="bg-secondary text-light"> <th><i18n>bookmark-widget.widget.managetable.name</i18n></th> <th><i18n>bookmark-widget.widget.managetable.url</i18n></th> <th></th> </tr> </thead> <tbody> <tr class="c-pointer" ng-repeat="bookmark in ctrl.bookmarks" ng-class="{ \'table-active\' : ctrl.editedBookmark && bookmark._id === ctrl.editedBookmark._id }"> <td ng-click="ctrl.editBookmark(bookmark)">[[bookmark.name]]</td> <td ng-click="ctrl.editBookmark(bookmark)">[[bookmark.url]]</td> <td ng-click="ctrl.deleteBookmark(bookmark)"> <button type="button" class="btn-close" aria-label="Close"></button> </td> </tr> </tbody> </table> <form id="formCreated" autocomplete="off" class="mt-5" ng-if="ctrl.isCreatingBookmark()"> <h3><i18n>bookmark-widget.widget.createform.title</i18n></h3> <div class="form-group row mt-3"> <label for="inputCreatedName" class="col-sm-2 col-form-label"><i18n>bookmark-widget.widget.createform.name</i18n></label> <div class="col-sm-10"> <input type="text" id="inputCreatedName" class="form-control auto-focused" ng-model="ctrl.createdBookmark.name"/> </div> </div> <div class="form-group row mt-3"> <label for="inputCreatedUrl" class="col-sm-2 col-form-label"><i18n>bookmark-widget.widget.createform.url</i18n></label> <div class="col-sm-10"> <input type="text" id="inputCreatedUrl" class="form-control" ng-model="ctrl.createdBookmark.url"/> </div> </div> </form> <form id="formEdited" autocomplete="off" class="mt-5" ng-if="ctrl.isEditingBookmark()"> <h3><i18n>bookmark-widget.widget.edit.bookmark</i18n></h3> <div class="form-group row mt-3"> <label for="inputEditedName" class="col-sm-2 col-form-label"><i18n>bookmark-widget.widget.editform.name</i18n></label> <div class="col-sm-10"> <input type="text" id="inputEditedName" class="form-control auto-focused" ng-model="ctrl.editedBookmark.name"/> </div> </div> <div class="form-group row mt-3"> <label for="inputEditedUrl" class="col-sm-2 col-form-label"><i18n>bookmark-widget.widget.editform.url</i18n></label> <div class="col-sm-10"> <input type="text" id="inputEditedUrl" class="form-control" ng-model="ctrl.editedBookmark.url"/> </div> </div> </form> </ode-modal-body> <ode-modal-footer> <div ng-if="!ctrl.isCreatingBookmark() && !ctrl.isEditingBookmark()"> <button class="btn btn-primary" ng-click="ctrl.newBookmark()"><i18n>bookmark-widget.widget.new.bookmark</i18n></button> </div> <div ng-if="ctrl.isCreatingBookmark()"> <button form="formCreated" type="reset" class="btn btn-light" ng-click="ctrl.cancelCreate()"> <i18n>bookmark-widget.widget.createform.cancel</i18n> </button> <button form="formCreated" type="submit" class="btn btn-primary" ng-click="ctrl.createBookmark()"> <i18n>bookmark-widget.widget.createform.save</i18n> </button> </div> <div ng-if="ctrl.isEditingBookmark()"> <button form="formEdited" type="reset" class="btn btn-light" ng-click="ctrl.cancelEdit()"> <i18n>bookmark-widget.widget.editform.cancel</i18n> </button> <button form="formEdited" type="submit" class="btn btn-primary" ng-click="ctrl.updateBookmark()"> <i18n>bookmark-widget.widget.editform.save</i18n> </button> </div> </ode-modal-footer> </ode-modal>'},9278:function(t,e,o){var r=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.odeModuleName=void 0;var i=r(o(4202)),a=o(9419),n=o(6731);function d(t){return!t||0===t.trim().length}var l=function(){function t(t){this.name="",this.url="",this.flatCopy(t)}return t.prototype.flatCopy=function(t){return t&&Object.assign(this,t),this},t.prototype.create=function(){var t=this;return d(this.name)?(n.notify.error("bookmark-widget.widget.form.name.is.empty"),Promise.reject()):d(this.url)?(n.notify.error("bookmark-widget.widget.form.url.is.empty"),Promise.reject()):(0,a.http)().postJson("/bookmark",this).then(function(e){if(200!==(0,a.http)().latestResponse.status)throw"Rejected bookmark";return t.flatCopy(e)}).catch(function(t){throw 400===(0,a.http)().latestResponse.status&&n.notify.error(JSON.parse((0,a.http)().latestResponse.statusText).error),t})},t.prototype.update=function(){var t=this;return d(this.name)?(n.notify.error("bookmark.widget.form.name.is.empty"),Promise.reject()):d(this.url)?(n.notify.error("bookmark.widget.form.url.is.empty"),Promise.reject()):(0,a.http)().putJson("/bookmark/".concat(this._id),this).then(function(){return t}).catch(function(t){throw 400===(0,a.http)().latestResponse.status&&n.notify.error(JSON.parse((0,a.http)().latestResponse.statusText).error),t})},t.prototype.delete=function(){var t=this;return(0,a.http)().delete("/bookmark/".concat(this._id)).then(function(){return t})},t.prototype.toJSON=function(){return{name:this.name,url:this.url}},t}(),s=function(){function t(){this.bookmarks=[],this.display={manage:!1}}return t.prototype.getBookmarks=function(){var t=this;return(0,a.http)().get("/bookmark").then(function(e){e&&e.bookmarks?t.bookmarks=e.bookmarks.map(function(t){return new l(t)}):t.bookmarks=[],t.apply&&t.apply()})},t.prototype.removeHashStart=function(t){return t.replace("#start","")},t.prototype.createBookmark=function(){var t=this;this.createdBookmark&&(this.createdBookmark.url=this.removeHashStart(this.createdBookmark.url),this.createdBookmark.create().then(function(e){t.bookmarks.push(e),t.cancelCreate(),t.apply&&t.apply()}))},t.prototype.updateBookmark=function(){var t=this;if(this.editedBookmark){this.editedBookmark.url=this.removeHashStart(this.editedBookmark.url);var e=this.editedBookmark;e.update().then(function(){var o=t.bookmarks.find(function(t){return t._id===e._id});null==o||o.flatCopy(e),t.cancelEdit(),t.apply&&t.apply()})}},t.prototype.deleteBookmark=function(t){var e=this;t.delete().then(function(t){var o=e.bookmarks.indexOf(t);e.bookmarks.splice(o,1),e.cancelEdit(),e.apply&&e.apply()})},t.prototype.newBookmark=function(){this.createdBookmark=new l({url:"http://",name:""}),this.cancelEdit()},t.prototype.isCreatingBookmark=function(){return i.default.isDefined(this.createdBookmark)},t.prototype.isEditingBookmark=function(){return i.default.isDefined(this.editedBookmark)},t.prototype.editBookmark=function(t){this.editedBookmark=new l(t),this.cancelCreate()},t.prototype.cancelCreate=function(){this.createdBookmark=void 0},t.prototype.cancelEdit=function(){this.editedBookmark=void 0},t}(),m=function(){function t(){this.restrict="E",this.template=o(7562).Z,this.controller=[s],this.controllerAs="ctrl",this.require=["odeBookmarkWidget"]}return t.prototype.link=function(t,e,o,r){var i=r?r[0]:null;i&&(i.getBookmarks().then(function(){t.$apply()}),i.apply=function(){t.$apply()},t.trackEvent=function(t,e){var o;void 0===e.bubbles&&(e.bubbles=!0);var r=null;e&&"string"==typeof(null===(o=e.detail)||void 0===o?void 0:o.open)&&(r=new CustomEvent(a.TrackedActionFromWidget.bookmark,e)),r&&t.currentTarget&&t.currentTarget.dispatchEvent(r)})},t}();(0,a.notif)().onLangReady().promise.then(function(t){(0,a.conf)().Platform.idiom.addKeys(o(2731))}),e.odeModuleName="odeBookmarkWidgetModule",i.default.module(e.odeModuleName,[]).directive("odeBookmarkWidget",function(){return new m})},2731:t=>{t.exports=JSON.parse('{"bookmark-widget":"Liens utiles","bookmark-widget.widget.createform.cancel":"Annuler","bookmark-widget.widget.createform.name":"Nom","bookmark-widget.widget.createform.save":"Enregistrer","bookmark-widget.widget.createform.title":"Nouveau lien utile","bookmark-widget.widget.createform.url":"Adresse","bookmark-widget.widget.edit.bookmark":"Mettre à jour le lien utile","bookmark-widget.widget.editform.cancel":"Annuler","bookmark-widget.widget.editform.name":"Nom","bookmark-widget.widget.editform.save":"Enregistrer","bookmark-widget.widget.editform.url":"Adresse","bookmark-widget.widget.empty":"Gardez à portée de main les sites web que vous utilisez souvent.","bookmark-widget.widget.form.name.is.empty":"Le champ \'nom\' est obligatoire","bookmark-widget.widget.form.url.is.empty":"Le champ \'adresse\' est obligatoire","bookmark-widget.widget.manage.bookmarks":"Gérer les liens utiles","bookmark-widget.widget.manage.empty":"Aucun lien utile","bookmark-widget.widget.manage.title":"Gérer les liens utiles","bookmark-widget.widget.managetable.name":"Nom","bookmark-widget.widget.managetable.url":"Adresse","bookmark-widget.widget.new.bookmark":"Nouveau lien utile","bookmark-widget.widget.title":"Liens utiles"}')}}]);
2
2
  //# sourceMappingURL=bookmark-widget.widget.js.map
@@ -1,2 +1,2 @@
1
- "use strict";(self.webpackChunkode_ngjs_front=self.webpackChunkode_ngjs_front||[]).push([[438],{5893:(e,t,r)=>{r.d(t,{Z:()=>n});const n=' <div class="widget-dashboard"> <div class="widget-header"> <div class="subtitle"><i18n>carnet-de-bord.widget.title</i18n></div> <div class="widget-options"> <div class="widget-handle" title="Déplacer le widget"><i class="fas fa-grip-vertical" aria-hidden="true"></i></div> </div> </div> <div class="widget-body" dnd-nodrag> <div class="widget-empty-message" ng-if="ctrl.errorMsg"> <span class="info" translate content="[[ctrl.errorMsg.error]]"></span> </div> <div class="dashboard-choice" ng-if="!ctrl.errorMsg && ctrl.description.profiles.indexOf(\'Relative\')>=0 && ctrl.eleves.length>0 && ctrl.structures"> <a href="" class="avatar-link" ng-repeat="eleve in ctrl.eleves" ng-click="ctrl.getEleve($index)" ng-class="{\'active\': eleve===ctrl.currentEleve}"> <img ng-src="[[ctrl.getAvatar($index)]]"/> <span>[[ ctrl.getTag(\'Prenom\', $index) ]]</span> </a> </div> <ul class="dashboard-list" ng-if="!ctrl.errorMsg"> <li class="item link-discret" ng-repeat="contentType in ctrl.contentTypes" ng-click="ctrl.openLightBox(contentType, $event)"> <a href="#" class="item-inner"> <div class="left"> <div class="icon"> <i class="[[contentType.icon]]"></i> </div> </div> <div class="right"> <div class="label" translate content="carnet-de-bord.widget.[[contentType.title]]"></div> <div class="info meta" ng-if="contentType.compact">[[contentType.compact]]</div> <div class="info meta" ng-if="!contentType.compact"><i18n>carnet-de-bord.widget.empty</i18n></div> </div> </a> </li> </ul> </div> <ode-modal visible="ctrl.showLightbox" on-close="ctrl.showLightbox=false" dnd-nodrag> <ode-modal-title> <span translate content="[[ctrl.currentContentType.lightboxTitle]]"></span> <span ng-if="ctrl.me.type !== \'ELEVE\' "> <i18n>carnet-de-bord.widget.of</i18n> [[ctrl.getCurrentTag(\'Prenom\')]] </span> </ode-modal-title> <ode-modal-body> <article> <div ng-repeat="item in ctrl.currentContentType.full"> <p ng-if="!item.subsections && !item.pageUrl"> <span>•</span>[[ item.value ]] </p> <p ng-if="!item.subsections && item.pageUrl"> <a target="_blank" rel="noopener" href="[[ctrl.structureAddress]]/[[ctrl.userStatus()]].html?page=[[ item.pageUrl ]]" ng-click="ctrl.trackEvent($event, {detail:{\'open\':\'any\'} })"> <span>•</span>[[ item.value ]] <i class="new-tab right-magnet" i18n-title="carnet-de-bord.widget.target.tooltip"></i> </a> </p> <h4 ng-if="item.subsections && !item.pageUrl"> [[ item.value ]] </h4> <h4 ng-if="item.subsections && item.pageUrl"> <a target="_blank" rel="noopener" href="[[ctrl.structureAddress]]/[[ctrl.userStatus()]].html?page=[[ item.pageUrl ]]" ng-click="ctrl.trackEvent($event, {detail:{\'open\':\'any\'} })"> [[ item.value ]] <i class="new-tab right-magnet" i18n-title="carnet-de-bord.widget.target.tooltip"></i> </a> </h4> <div ng-if="item.subsections"> <section ng-repeat="subsection in item.subsections"> <b ng-if="!subsection.pageUrl">[[ subsection.header ]]</b> <a ng-if="subsection.pageUrl" target="_blank" rel="noopener" href="[[ctrl.structureAddress]]/[[ctrl.userStatus()]].html?page=[[ subsection.pageUrl ]]" ng-click="ctrl.trackEvent($event, {detail:{\'open\':\'any\'} })"> <b>[[ subsection.header ]] <i class="new-tab right-magnet" i18n-title="carnet-de-bord.widget.target.tooltip"></i> </b> </a> <br> <span> [[ subsection.content ]] </span> </section> </div> </div> </article> </ode-modal-body> <ode-modal-footer> </ode-modal-footer> </ode-modal> </div> '},5613:function(e,t,r){var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.odeModuleName=void 0;var i=n(r(4202)),a=r(9419),o=function(){function e(e){this.themeHelperSvc=e,this.me=(0,a.session)().user,this.description=(0,a.session)().description,this.structures=[],this.eleves=[],this.showLightbox=!1,this.contentTypes=[{title:"lateness",icon:"ic-timer-off",compact:"",full:[],lightboxTitle:"carnet-de-bord.widget.lateness.all"},{title:"absences",icon:"ic-nobody",compact:"",full:[],lightboxTitle:"carnet-de-bord.widget.absences.all"},{title:"grades",icon:"ic-grades",compact:"",full:[],lightboxTitle:"carnet-de-bord.widget.grades.all"},{title:"diary",icon:"ic-homeworks",compact:"",full:[],lightboxTitle:"carnet-de-bord.widget.diary.all"},{title:"skills",icon:"ic-trending-up",compact:"",full:[],lightboxTitle:"carnet-de-bord.widget.skills.all"}],this.structureAddress="",this.structureId=""}return e.prototype.getAvatar=function(e){return e<this.eleves.length?"/userbook/avatar/".concat(this.getChildId(e),"?thumbnail=100x100"):this.themeHelperSvc.toSkinUrl("/img/illustrations/no-avatar.svg?thumbnail=100x100")},e.prototype.getEleve=function(e){var t=this;e<this.eleves.length&&(this.currentEleve=this.eleves[e],this.contentTypes.forEach(function(e){t.getContent(e,t.currentEleve)}))},e.prototype.getTag=function(e,t){return t<this.eleves.length?$(this.eleves[t]).find(e).text():""},e.prototype.getCurrentTag=function(e){return this.currentEleve?$(this.currentEleve).find(e).text():""},e.prototype.userStatus=function(){return"PERSRELELEVE"===this.me.type?"parent":"ELEVE"===this.me.type?"eleve":""},e.prototype.getChildId=function(e){var t=this.getTag("Prenom",e).toLowerCase(),r=this.getTag("Nom",e).toLowerCase();for(var n in this.me.children){var i=this.me.children[n].firstName.toLowerCase(),a=this.me.children[n].lastName.toLowerCase();if(i===t&&a===r)return n}},e.prototype.openLightBox=function(e,t){this.currentContentType=e,this.showLightbox=!0,t.currentTarget&&this.trackEvent(t,{detail:{properties:"any"}})},e.prototype.trackEvent=function(e,t){var r,n;void 0===t.bubbles&&(t.bubbles=!0);var i=null;!t||"string"!=typeof(null===(r=t.detail)||void 0===r?void 0:r.open)&&"string"!=typeof(null===(n=t.detail)||void 0===n?void 0:n.properties)||(i=new CustomEvent(a.TrackedActionFromWidget.carnetDeBord,t)),i&&e.currentTarget&&e.currentTarget.dispatchEvent(i)},e.prototype.getContent=function(e,t){var r=(0,a.conf)().Platform.idiom;if("lateness"===e.title){var n=$(t).find("Retard Justifie"),i=!1,o=[];e.compact=!1,e.full=!1,n&&(n.each(function(t,n){if("false"===$(n).text()){var s=$(n).parent().attr("page");i=$(n).parent().find("Date").text(),i=a.L10n.moment(i),i=r.translate("carnet-de-bord.widget.the")+" "+i.format("DD/MM/YYYY - HH:mm"),o.push({value:i,pageUrl:s}),e.compact=o[0].value}}),e.full=o)}else if("absences"===e.title){var s=[];e.compact=!1,e.full=!1;var d=$(t).find("Absence Justifie");d&&(d.each(function(t,n){if("false"===$(n).text()){var i=$(n).parent().attr("page"),o=void 0;if("false"===$(n).parent().find("EstOuverte").text()){var d=$(n).parent().find("DateDebut").text(),l=$(n).parent().find("DateFin").text();d=a.L10n.moment(d),l=a.L10n.moment(l),d=d.format("DD/MM/YYYY HH:mm"),l=l.format("DD/MM/YYYY HH:mm"),o=r.translate("carnet-de-bord.widget.from")+" "+d+" "+r.translate("carnet-de-bord.widget.to")+" "+l}else o=$(n).parent().find("DateDebut").text(),o=(o=a.L10n.moment(o)).format("DD/MM/YYYY HH:mm"),o=r.translate("carnet-de-bord.widget.the")+" "+o;s.push({value:o,pageUrl:i}),e.compact=s[0].value}}),e.full=s)}else if("grades"===e.title){var l=[];if(e.compact=!1,e.full=!1,$(t).find("PageReleveDeNotes Devoir Note").text())$(t).find("PageReleveDeNotes Devoir").each(function(t,n){var i=$(n).attr("page"),o=$(n).find("Note").text(),s=$(n).find("Bareme").text(),d=$(n).find("Matiere").text(),c=a.L10n.moment($(n).find("Date").text());c=c.format("DD/MM/YYYY");var u=o+"/"+s+" "+r.translate("carnet-de-bord.widget.in")+" "+d+" "+r.translate("carnet-de-bord.widget.the")+" "+c;l.push({value:u,pageUrl:i}),e.compact=l[0].value}),e.full=l}else if("diary"===e.title){var c=[];if(e.compact=!1,e.full=!1,$(t).find("PageCahierDeTextes CahierDeTextes TravailAFaire Descriptif").text()){var u=new DOMParser,p=$(t).find("PageCahierDeTextes CahierDeTextes");$(p).each(function(t,n){if($(n).find("TravailAFaire Descriptif").text()){var i=r.translate("carnet-de-bord.widget.new.homework")+" "+$(n).find("Matiere").text(),o=$(n).find("TravailAFaire"),s=[];$(o).each(function(e,t){var n=$(t).attr("page"),i=($(t).parent().find("Matiere").text(),a.L10n.moment($(t).find("PourLe").text()));i=i.format("DD/MM/YYYY"),i=r.translate("carnet-de-bord.widget.for")+" "+i;var o=$(t).find("Descriptif"),d=u.parseFromString(o.text(),"text/html");o=d.documentElement.textContent,s.push({header:i,content:o,pageUrl:n})}),c.push({value:i,subsections:s}),e.compact=c[0].value+" "+c[0].subsections[0].header}}),e.full=c}}else if("skills"===e.title){var g=[];if(e.compact=!1,e.full=!1,$(t).find("PageCompetences Competence").text())$(t).find("PageCompetences Competence").parent().each(function(t,n){if("Acquis"===$(n).find("Libelle").text()){var i=$(n).attr("page"),o=$(n).find("Intitule").text(),s=$(n).find("Competence").text()+" ",d=$(n).find("Item").text()+" ",l=$(n).find("Matiere").text(),c=a.L10n.moment($(n).find("Date").text());c=c.format("DD/MM/YYYY");var u=r.translate("carnet-de-bord.widget.skills")+" ",p=r.translate("carnet-de-bord.widget.skills.item")+" ",f=o+" "+r.translate("carnet-de-bord.widget.the")+" "+c;l&&(f=f+" "+r.translate("carnet-de-bord.widget.in")+" "+l);var m=[{header:u,content:s}];$(n).find("Item").text()&&m.push({header:p,content:d}),g.push({value:f,subsections:m,pageUrl:i}),e.compact=g[0].value}}),e.full=g}},e}(),s=function(){function e(){this.restrict="E",this.template=r(5893).Z,this.controller=["odeThemeHelperService",o],this.controllerAs="ctrl",this.require=["odeCarnetDeBord"]}return e.prototype.link=function(e,t,r,n){var o=n?n[0]:null;o&&(0,a.http)().get("/sso/pronote").then(function(t){if(200!==(0,a.http)().latestResponse.status)throw"carnet-de-bord.widget.pronote.access.error";if(!i.default.isArray(t))throw"carnet-de-bord.widget.nodata";o.structures=t,o.eleves=[];var r=!0;t.forEach(function(e){o.structureAddress=e.address,o.structureId=e.structureId;var t=$.parseXML(e.xmlResponse),n=$(t);o.parentTag=n.find("Parent"),o.eleves=o.eleves.concat($.makeArray(n.find("Eleve"))),r&&o.eleves.length>0&&(o.getEleve(0),r=!1)}),e.$apply()}).catch(function(e){o.errorMsg="string"==typeof e?{error:e}:JSON.parse((0,a.http)().latestResponse.statusText)})},e}();(0,a.notif)().onLangReady().promise.then(function(e){(0,a.conf)().Platform.idiom.addKeys(r(1056))}),t.odeModuleName="odeCarnetDeBordModule",i.default.module(t.odeModuleName,[]).directive("odeCarnetDeBord",function(){return new s})},1056:e=>{e.exports=JSON.parse('{"carnet-de-bord":"Carnet de bord","carnet-de-bord.widget.title":"Carnet de bord","carnet-de-bord.widget.deny":"Vous n\'avez pas accès à Pronote","carnet-de-bord.widget.empty":"vide","carnet-de-bord.widget.lateness":"Retards non justifiés","carnet-de-bord.widget.absences":"Absences non justifiées","carnet-de-bord.widget.grades":"Notes","carnet-de-bord.widget.diary":"Cahier de textes","carnet-de-bord.widget.skills":"Compétences acquises","carnet-de-bord.widget.lateness.all":"Tous les retards non justifiés","carnet-de-bord.widget.absences.all":"Toutes les absences non justifiées","carnet-de-bord.widget.grades.all":"Toutes les notes","carnet-de-bord.widget.diary.all":"Tous les devoirs","carnet-de-bord.widget.skills.all":"Toutes les compétences acquises","carnet-de-bord.widget.lateness.tooltip":"Voir tous les retards non justifiés","carnet-de-bord.widget.absences.tooltip":"Voir toutes les absences non justifiées","carnet-de-bord.widget.grades.tooltip":"Voir toutes les notes","carnet-de-bord.widget.diary.tooltip":"Voir tous les devoirs","carnet-de-bord.widget.skills.tooltip":"Voir toutes les compétences acquises","carnet-de-bord.widget.target.tooltip":"Voir sur l\'application","carnet-de-bord.widget.skills.item":"Contenu de l\'item","carnet-de-bord.widget.of":"de","carnet-de-bord.widget.in":"en","carnet-de-bord.widget.the":"le","carnet-de-bord.widget.from":"du","carnet-de-bord.widget.to":"au","carnet-de-bord.widget.since":"depuis le","carnet-de-bord.widget.for":"pour le","carnet-de-bord.widget.new.homework":"Travail en","carnet-de-bord.widget.pronote.unregistered.error":"Vous n\'avez pas accès à l\'application Pronote.","carnet-de-bord.widget.pronote.uri.error":"L\'adresse du serveur Pronote n’est pas correctement renseignée dans la console d’administration de l’ENT.","carnet-de-bord.widget.pronote.access.error":"Connexion Pronote impossible. Si le problème persiste, veuillez contacter l\'administrateur de votre établissement.","carnet-de-bord.widget.pronote.connection.error":"Problème de connexion au serveur Pronote","carnet-de-bord.widget.nodata":"Aucune donnée disponible."}')}}]);
1
+ "use strict";(self.webpackChunkode_ngjs_front=self.webpackChunkode_ngjs_front||[]).push([[438],{5893:(e,t,r)=>{r.d(t,{Z:()=>n});const n=' <div class="widget-dashboard"> <div class="widget-header"> <div class="subtitle"><i18n>carnet-de-bord.widget.title</i18n></div> <div class="widget-options"> <div class="widget-handle" title="Déplacer le widget"><i class="fas fa-grip-vertical" aria-hidden="true"></i></div> </div> </div> <div class="widget-body" dnd-nodrag> <div class="widget-empty-message" ng-if="ctrl.errorMsg"> <span class="info" translate content="[[ctrl.errorMsg.error]]"></span> </div> <div class="dashboard-choice" ng-if="!ctrl.errorMsg && ctrl.description.profiles.indexOf(\'Relative\')>=0 && ctrl.eleves.length>0 && ctrl.structures"> <a href="" class="avatar-link" ng-repeat="eleve in ctrl.eleves" ng-click="ctrl.getEleve($index)" ng-class="{\'active\': eleve===ctrl.currentEleve}"> <img ng-src="[[ctrl.getAvatar($index)]]"/> <span>[[ ctrl.getTag(\'Prenom\', $index) ]]</span> </a> </div> <ul class="dashboard-list" ng-if="!ctrl.errorMsg"> <li class="item link-discret" ng-repeat="contentType in ctrl.contentTypes" ng-click="ctrl.openLightBox(contentType, $event)"> <a href="#" class="item-inner"> <div class="left"> <div class="icon"> <i class="[[contentType.icon]]"></i> </div> </div> <div class="right"> <div class="label" translate content="carnet-de-bord.widget.[[contentType.title]]"></div> <div class="info meta" ng-if="contentType.compact">[[contentType.compact]]</div> <div class="info meta" ng-if="!contentType.compact"><i18n>carnet-de-bord.widget.empty</i18n></div> </div> </a> </li> </ul> </div> <ode-modal visible="ctrl.showLightbox" on-close="ctrl.showLightbox=false" dnd-nodrag> <ode-modal-title> <span translate content="[[ctrl.currentContentType.lightboxTitle]]"></span> <span ng-if="ctrl.me.type !== \'ELEVE\' "> <i18n>carnet-de-bord.widget.of</i18n> [[ctrl.getCurrentTag(\'Prenom\')]] </span> </ode-modal-title> <ode-modal-body> <article> <div ng-repeat="item in ctrl.currentContentType.full"> <p ng-if="!item.subsections && !item.pageUrl"> <span>•</span>[[ item.value ]] </p> <p ng-if="!item.subsections && item.pageUrl"> <a target="_blank" rel="noopener" href="[[ctrl.structureAddress]]/[[ctrl.userStatus()]].html?page=[[ item.pageUrl ]]" ng-click="ctrl.trackEvent($event, {detail:{\'open\':\'any\'} })"> <span>•</span>[[ item.value ]] <i class="new-tab right-magnet" i18n-title="carnet-de-bord.widget.target.tooltip"></i> </a> </p> <h4 ng-if="item.subsections && !item.pageUrl"> [[ item.value ]] </h4> <h4 ng-if="item.subsections && item.pageUrl"> <a target="_blank" rel="noopener" href="[[ctrl.structureAddress]]/[[ctrl.userStatus()]].html?page=[[ item.pageUrl ]]" ng-click="ctrl.trackEvent($event, {detail:{\'open\':\'any\'} })"> [[ item.value ]] <i class="new-tab right-magnet" i18n-title="carnet-de-bord.widget.target.tooltip"></i> </a> </h4> <div ng-if="item.subsections"> <section ng-repeat="subsection in item.subsections"> <b ng-if="!subsection.pageUrl">[[ subsection.header ]]</b> <a ng-if="subsection.pageUrl" target="_blank" rel="noopener" href="[[ctrl.structureAddress]]/[[ctrl.userStatus()]].html?page=[[ subsection.pageUrl ]]" ng-click="ctrl.trackEvent($event, {detail:{\'open\':\'any\'} })"> <b>[[ subsection.header ]] <i class="new-tab right-magnet" i18n-title="carnet-de-bord.widget.target.tooltip"></i> </b> </a> <br> <span> [[ subsection.content ]] </span> </section> </div> </div> </article> </ode-modal-body> <ode-modal-footer> </ode-modal-footer> </ode-modal> </div> '},5613:function(e,t,r){var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.odeModuleName=void 0;var i=n(r(4202)),a=r(9419),o=function(){function e(e){this.themeHelperSvc=e,this.me=(0,a.session)().user,this.description=(0,a.session)().description,this.structures=[],this.eleves=[],this.showLightbox=!1,this.contentTypes=[{title:"lateness",icon:"ic-timer-off",compact:"",full:[],lightboxTitle:"carnet-de-bord.widget.lateness.all"},{title:"absences",icon:"ic-nobody",compact:"",full:[],lightboxTitle:"carnet-de-bord.widget.absences.all"},{title:"grades",icon:"ic-grades",compact:"",full:[],lightboxTitle:"carnet-de-bord.widget.grades.all"},{title:"diary",icon:"ic-homeworks",compact:"",full:[],lightboxTitle:"carnet-de-bord.widget.diary.all"},{title:"skills",icon:"ic-trending-up",compact:"",full:[],lightboxTitle:"carnet-de-bord.widget.skills.all"}],this.structureAddress="",this.structureId=""}return e.prototype.getAvatar=function(e){return e<this.eleves.length?"/userbook/avatar/".concat(this.getChildId(e),"?thumbnail=100x100"):this.themeHelperSvc.toSkinUrl("/img/illustrations/no-avatar.svg?thumbnail=100x100")},e.prototype.getEleve=function(e){var t=this;e<this.eleves.length&&(this.currentEleve=this.eleves[e],this.contentTypes.forEach(function(e){t.getContent(e,t.currentEleve)}))},e.prototype.getTag=function(e,t){return t<this.eleves.length?$(this.eleves[t]).find(e).text():""},e.prototype.getCurrentTag=function(e){return this.currentEleve?$(this.currentEleve).find(e).text():""},e.prototype.userStatus=function(){return"PERSRELELEVE"===this.me.type?"parent":"ELEVE"===this.me.type?"eleve":""},e.prototype.getChildId=function(e){var t=this.getTag("Prenom",e).toLowerCase(),r=this.getTag("Nom",e).toLowerCase();for(var n in this.me.children){var i=this.me.children[n].firstName.toLowerCase(),a=this.me.children[n].lastName.toLowerCase();if(i===t&&a===r)return n}},e.prototype.openLightBox=function(e,t){this.currentContentType=e,this.showLightbox=!0,t.currentTarget&&this.trackEvent(t,{detail:{properties:"any"}})},e.prototype.trackEvent=function(e,t){var r,n;void 0===t.bubbles&&(t.bubbles=!0);var i=null;!t||"string"!=typeof(null===(r=t.detail)||void 0===r?void 0:r.open)&&"string"!=typeof(null===(n=t.detail)||void 0===n?void 0:n.properties)||(i=new CustomEvent(a.TrackedActionFromWidget.carnetDeBord,t)),i&&e.currentTarget&&e.currentTarget.dispatchEvent(i)},e.prototype.getContent=function(e,t){var r=(0,a.conf)().Platform.idiom;if("lateness"===e.title){var n=$(t).find("Retard Justifie"),i=!1,o=[];e.compact=!1,e.full=!1,n&&(n.each(function(t,n){if("false"===$(n).text()){var s=$(n).parent().attr("page");i=$(n).parent().find("Date").text(),i=a.L10n.moment(i),i=r.translate("carnet-de-bord.widget.the")+" "+i.format("DD/MM/YYYY - HH:mm"),o.push({value:i,pageUrl:s}),e.compact=o[0].value}}),e.full=o)}else if("absences"===e.title){var s=[];e.compact=!1,e.full=!1;var d=$(t).find("Absence Justifie");d&&(d.each(function(t,n){if("false"===$(n).text()){var i=$(n).parent().attr("page"),o=void 0;if("false"===$(n).parent().find("EstOuverte").text()){var d=$(n).parent().find("DateDebut").text(),l=$(n).parent().find("DateFin").text();d=a.L10n.moment(d),l=a.L10n.moment(l),d=d.format("DD/MM/YYYY HH:mm"),l=l.format("DD/MM/YYYY HH:mm"),o=r.translate("carnet-de-bord.widget.from")+" "+d+" "+r.translate("carnet-de-bord.widget.to")+" "+l}else o=$(n).parent().find("DateDebut").text(),o=(o=a.L10n.moment(o)).format("DD/MM/YYYY HH:mm"),o=r.translate("carnet-de-bord.widget.the")+" "+o;s.push({value:o,pageUrl:i}),e.compact=s[0].value}}),e.full=s)}else if("grades"===e.title){var l=[];if(e.compact=!1,e.full=!1,$(t).find("PageReleveDeNotes Devoir Note").text())$(t).find("PageReleveDeNotes Devoir").each(function(t,n){var i=$(n).attr("page"),o=$(n).find("Note").text(),s=$(n).find("Bareme").text(),d=$(n).find("Matiere").text(),c=a.L10n.moment($(n).find("Date").text());c=c.format("DD/MM/YYYY");var u=o+"/"+s+" "+r.translate("carnet-de-bord.widget.in")+" "+d+" "+r.translate("carnet-de-bord.widget.the")+" "+c;l.push({value:u,pageUrl:i}),e.compact=l[0].value}),e.full=l}else if("diary"===e.title){var c=[];if(e.compact=!1,e.full=!1,$(t).find("PageCahierDeTextes CahierDeTextes TravailAFaire Descriptif").text()){var u=new DOMParser,g=$(t).find("PageCahierDeTextes CahierDeTextes");$(g).each(function(t,n){if($(n).find("TravailAFaire Descriptif").text()){var i=r.translate("carnet-de-bord.widget.new.homework")+" "+$(n).find("Matiere").text(),o=$(n).find("TravailAFaire"),s=[];$(o).each(function(e,t){var n=$(t).attr("page"),i=($(t).parent().find("Matiere").text(),a.L10n.moment($(t).find("PourLe").text()));i=i.format("DD/MM/YYYY"),i=r.translate("carnet-de-bord.widget.for")+" "+i;var o=$(t).find("Descriptif"),d=u.parseFromString(o.text(),"text/html");o=d.documentElement.textContent,s.push({header:i,content:o,pageUrl:n})}),c.push({value:i,subsections:s}),e.compact=c[0].value+" "+c[0].subsections[0].header}}),e.full=c}}else if("skills"===e.title){var p=[];if(e.compact=!1,e.full=!1,$(t).find("PageCompetences Competence").text())$(t).find("PageCompetences Competence").parent().each(function(t,n){if("Acquis"===$(n).find("Libelle").text()){var i=$(n).attr("page"),o=$(n).find("Intitule").text(),s=$(n).find("Competence").text()+" ",d=$(n).find("Item").text()+" ",l=$(n).find("Matiere").text(),c=a.L10n.moment($(n).find("Date").text());c=c.format("DD/MM/YYYY");var u=r.translate("carnet-de-bord.widget.skills")+" ",g=r.translate("carnet-de-bord.widget.skills.item")+" ",f=o+" "+r.translate("carnet-de-bord.widget.the")+" "+c;l&&(f=f+" "+r.translate("carnet-de-bord.widget.in")+" "+l);var m=[{header:u,content:s}];$(n).find("Item").text()&&m.push({header:g,content:d}),p.push({value:f,subsections:m,pageUrl:i}),e.compact=p[0].value}}),e.full=p}},e}(),s=function(){function e(){this.restrict="E",this.template=r(5893).Z,this.controller=["odeThemeHelperService",o],this.controllerAs="ctrl",this.require=["odeCarnetDeBord"]}return e.prototype.link=function(e,t,r,n){var o=n?n[0]:null;o&&(0,a.http)().get("/sso/pronote").then(function(t){if(200!==(0,a.http)().latestResponse.status)throw"carnet-de-bord.widget.pronote.access.error";if(!i.default.isArray(t))throw"carnet-de-bord.widget.nodata";o.structures=t,o.eleves=[];var r=!0;t.forEach(function(e){o.structureAddress=e.address,o.structureId=e.structureId;var t=$.parseXML(e.xmlResponse),n=$(t);o.parentTag=n.find("Parent"),o.eleves=o.eleves.concat($.makeArray(n.find("Eleve"))),r&&o.eleves.length>0&&(o.getEleve(0),r=!1)}),e.$apply()}).catch(function(e){o.errorMsg="string"==typeof e?{error:e}:JSON.parse((0,a.http)().latestResponse.statusText)})},e}();(0,a.notif)().onLangReady().promise.then(function(e){(0,a.conf)().Platform.idiom.addKeys(r(1056))}),t.odeModuleName="odeCarnetDeBordModule",i.default.module(t.odeModuleName,[]).directive("odeCarnetDeBord",function(){return new s})},1056:e=>{e.exports=JSON.parse('{"carnet-de-bord":"Carnet de bord","carnet-de-bord.widget.absences":"Absences non justifiées","carnet-de-bord.widget.absences.all":"Toutes les absences non justifiées","carnet-de-bord.widget.absences.tooltip":"Voir toutes les absences non justifiées","carnet-de-bord.widget.deny":"Vous n\'avez pas accès à Pronote","carnet-de-bord.widget.diary":"Cahier de textes","carnet-de-bord.widget.diary.all":"Tous les devoirs","carnet-de-bord.widget.diary.tooltip":"Voir tous les devoirs","carnet-de-bord.widget.empty":"vide","carnet-de-bord.widget.for":"pour le","carnet-de-bord.widget.from":"du","carnet-de-bord.widget.grades":"Notes","carnet-de-bord.widget.grades.all":"Toutes les notes","carnet-de-bord.widget.grades.tooltip":"Voir toutes les notes","carnet-de-bord.widget.in":"en","carnet-de-bord.widget.lateness":"Retards non justifiés","carnet-de-bord.widget.lateness.all":"Tous les retards non justifiés","carnet-de-bord.widget.lateness.tooltip":"Voir tous les retards non justifiés","carnet-de-bord.widget.new.homework":"Travail en","carnet-de-bord.widget.nodata":"Aucune donnée disponible.","carnet-de-bord.widget.of":"de","carnet-de-bord.widget.pronote.access.error":"Nous avons rencontré un problème de communication avec le service Pronote.\\nDemandez à l\'administration de votre établissement de vérifier le paramétrage de Pronote.","carnet-de-bord.widget.pronote.connection.error":"Problème de connexion au serveur Pronote","carnet-de-bord.widget.pronote.unregistered.error":"Vous n\'avez pas accès à l\'application Pronote.","carnet-de-bord.widget.pronote.uri.error":"L\'adresse du serveur Pronote n’est pas correctement renseignée dans la console d’administration de l’ENT.","carnet-de-bord.widget.since":"depuis le","carnet-de-bord.widget.skills":"Compétences acquises","carnet-de-bord.widget.skills.all":"Toutes les compétences acquises","carnet-de-bord.widget.skills.item":"Contenu de l\'item","carnet-de-bord.widget.skills.tooltip":"Voir toutes les compétences acquises","carnet-de-bord.widget.target.tooltip":"Voir sur l\'application","carnet-de-bord.widget.the":"le","carnet-de-bord.widget.title":"Carnet de bord","carnet-de-bord.widget.to":"au"}')}}]);
2
2
  //# sourceMappingURL=carnet-de-bord.widget.js.map
@@ -1,2 +1,2 @@
1
- "use strict";(self.webpackChunkode_ngjs_front=self.webpackChunkode_ngjs_front||[]).push([[484],{194:(t,e,r)=>{r.d(e,{Z:()=>i});const i=' <style>.widget-cursus img{width:100%}::placeholder{font-size:15px}.p-4{padding:2rem!important}.heading-5{font-size:18px}</style> <div class="widget-cursus"> <div class="widget-header p-0"> <img class="subtitle" src="/cursus/public/img/logo.png" draggable="false"/> </div> <div class="widget-body p-4" dnd-nodrag> <div class="loading-panel" ng-if="ctrl.loads"> <h1 translate content="loading"></h1> </div> <form ng-if="!ctrl.loads"> <div ng-if="!ctrl.cardNb || ctrl.error"> <p ng-if="!ctrl.error"><i18n>cursus-widget.widget.inactive.text</i18n></p> <div ng-if="ctrl.error"> <p><i18n>cursus-widget.widget.error.text</i18n></p> <p><i18n>cursus-widget.widget.error.retry</i18n></p> </div> <div class="form-group row"> <label class="visually-hidden" for="cursusInputCardNb" translate content="cursus-widget.widget.cardNb"></label> <div class="col-sm-8"> <input class="form-control form-control-lg" id="cursusInputCardNb" type="text" ng-model="inputCardNb" i18n-placeholder="cursus-widget.widget.cardNb"> </div> <div class="col-sm-4 d-grid"> <button class="btn btn-outline-secondary btn-md" ng-click="ctrl.connect(inputCardNb)" ng-disabled="!inputCardNb" translate content="cursus-widget.widget.validate"></button> </div> </div> </div> <div ng-if="ctrl.cardNb && !ctrl.error"> <div> <h2 class="heading-5"><i18n>cursus-widget.widget.my.wallets</i18n></h2> <table class="twelve centered-text w-100"> <tbody ng-if="ctrl.sales"> <tr ng-repeat="sale in ctrl.sales"> <td>[[sale.wallet.libelle]]</td> <td>[[ctrl.formatSolde(sale.solde)]] €</td> </tr> </tbody> </table> </div> <div class="mt-4"> <h2 class="heading-5"><i18n>cursus-widget.widget.update.cardNb.title</i18n></h2> <i18n>cursus-widget.widget.update.cardNb.text</i18n>. <div class="d-grid mt-3"> <button class="btn btn-outline-secondary btn-lg" ng-click="ctrl.logout()" translate content="cursus-widget.widget.update.cardNb.button"></button> </div> </div> </div> </form> </div> </div>'},1916:function(t,e,r){var i=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.odeModuleName=void 0;var s=i(r(4202)),n=r(5262),d=r(9419),a=function(){function t(){this.loads=!1,this.error=!1,this.inputCardNb=""}return Object.defineProperty(t.prototype,"version",{get:function(){return(0,d.conf)().Platform.deploymentTag},enumerable:!1,configurable:!0}),t.prototype.logout=function(){return delete this.cardNb,delete this.sales,(0,d.conf)().User.preferences.update(n.USER_PREFS.CURSUS,{}).save(n.USER_PREFS.CURSUS)},t.prototype.connect=function(t){var e=this;return this.cardNb=t,this.loads=!0,this.getSales().finally(function(){e.loads=!1,e.apply&&e.apply()})},t.prototype.getCardNb=function(){var t=this;return(0,d.conf)().User.preferences.load(n.USER_PREFS.CURSUS).then(function(e){var r=e.cardNb;t.cardNb=r})},t.prototype.setCardNb=function(t){return(0,d.conf)().User.preferences.update(n.USER_PREFS.CURSUS,{cardNb:t}).save(n.USER_PREFS.CURSUS)},t.prototype.getSales=function(){var t=this;return this.cardNb?(0,d.http)().get("/cursus/sales",{queryParams:{cardNb:this.cardNb,_:this.version}}).then(function(e){if(200!==(0,d.http)().latestResponse.status)throw"Cannot get sales";return t.error=!1,t.cardNb&&t.setCardNb(t.cardNb),t.sales=e.sales,t.sales&&e.wallets&&t.sales.forEach(function(t){t.wallet=e.wallets.find(function(e){return e&&e.code==t.numPM})}),e}).catch(function(e){t.error=!0}).finally(function(){t.apply&&t.apply()}):Promise.reject()},t.prototype.formatSolde=function(t){return"string"!=typeof t||0===t.length?t:1===t.length?"0,0"+t:2===t.length?"0,"+t:t.substring(0,t.length-2)+","+t.substring(t.length-2)},t}(),o=function(){function t(){this.restrict="E",this.template=r(194).Z,this.controller=[a],this.controllerAs="ctrl",this.require=["odeCursusWidget"]}return t.prototype.link=function(t,e,r,i){var s=i?i[0]:null;s&&(s.apply=function(){t.$apply()},s.loads=!0,s.getCardNb().then(function(){return s.getSales()}).finally(function(){s.loads=!1,t.$apply()}))},t}();(0,d.notif)().onLangReady().promise.then(function(t){(0,d.conf)().Platform.idiom.addKeys(r(8109))}),e.odeModuleName="odeCursusWidgetModule",s.default.module(e.odeModuleName,[]).directive("odeCursusWidget",function(){return new o})},8109:t=>{t.exports=JSON.parse('{"cursus-widget":"#HDF","cursus-widget.widget.title":"Carte #HDF","cursus-widget.widget.inactive.text":"Veuillez entrer le numéro de votre carte Génération #HDF pour afficher les informations de votre compte.","cursus-widget.widget.error.text":"Le numéro de carte ne correspond pas à votre carte Génération #HDF.","cursus-widget.widget.error.retry":"Merci de saisir à nouveau votre numéro de carte :","cursus-widget.widget.cardNb":"Numéro de carte","cursus-widget.widget.wallet":"Porte-Monnaie","cursus-widget.widget.sale":"Solde","cursus-widget.widget.my.wallets":"Mes porte-monnaie","cursus-widget.widget.update.cardNb.title":"Gestion de ma carte","cursus-widget.widget.update.cardNb.text":"Cliquez sur le bouton ci-dessous pour changer le numéro de la carte dont vous souhaitez afficher les informations","cursus-widget.widget.update.cardNb.button":"Actualiser mon de carte","cursus-widget.widget.validate":"Valider"}')}}]);
1
+ "use strict";(self.webpackChunkode_ngjs_front=self.webpackChunkode_ngjs_front||[]).push([[484],{194:(t,e,r)=>{r.d(e,{Z:()=>i});const i=' <style>.widget-cursus img{width:100%}::placeholder{font-size:15px}.p-4{padding:2rem!important}.heading-5{font-size:18px}</style> <div class="widget-cursus"> <div class="widget-header p-0"> <img class="subtitle" src="/cursus/public/img/logo.png" draggable="false"/> </div> <div class="widget-body p-4" dnd-nodrag> <div class="loading-panel" ng-if="ctrl.loads"> <h1 translate content="loading"></h1> </div> <form ng-if="!ctrl.loads"> <div ng-if="!ctrl.cardNb || ctrl.error"> <p ng-if="!ctrl.error"><i18n>cursus-widget.widget.inactive.text</i18n></p> <div ng-if="ctrl.error"> <p><i18n>cursus-widget.widget.error.text</i18n></p> <p><i18n>cursus-widget.widget.error.retry</i18n></p> </div> <div class="form-group row"> <label class="visually-hidden" for="cursusInputCardNb" translate content="cursus-widget.widget.cardNb"></label> <div class="col-sm-8"> <input class="form-control form-control-lg" id="cursusInputCardNb" type="text" ng-model="inputCardNb" i18n-placeholder="cursus-widget.widget.cardNb"> </div> <div class="col-sm-4 d-grid"> <button class="btn btn-outline-secondary btn-md" ng-click="ctrl.connect(inputCardNb)" ng-disabled="!inputCardNb" translate content="cursus-widget.widget.validate"></button> </div> </div> </div> <div ng-if="ctrl.cardNb && !ctrl.error"> <div> <h2 class="heading-5"><i18n>cursus-widget.widget.my.wallets</i18n></h2> <table class="twelve centered-text w-100"> <tbody ng-if="ctrl.sales"> <tr ng-repeat="sale in ctrl.sales"> <td>[[sale.wallet.libelle]]</td> <td>[[ctrl.formatSolde(sale.solde)]] €</td> </tr> </tbody> </table> </div> <div class="mt-4"> <h2 class="heading-5"><i18n>cursus-widget.widget.update.cardNb.title</i18n></h2> <i18n>cursus-widget.widget.update.cardNb.text</i18n>. <div class="d-grid mt-3"> <button class="btn btn-outline-secondary btn-lg" ng-click="ctrl.logout()" translate content="cursus-widget.widget.update.cardNb.button"></button> </div> </div> </div> </form> </div> </div>'},1916:function(t,e,r){var i=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.odeModuleName=void 0;var s=i(r(4202)),n=r(5262),d=r(9419),a=function(){function t(){this.loads=!1,this.error=!1,this.inputCardNb=""}return Object.defineProperty(t.prototype,"version",{get:function(){return(0,d.conf)().Platform.deploymentTag},enumerable:!1,configurable:!0}),t.prototype.logout=function(){return delete this.cardNb,delete this.sales,(0,d.conf)().User.preferences.update(n.USER_PREFS.CURSUS,{}).save(n.USER_PREFS.CURSUS)},t.prototype.connect=function(t){var e=this;return this.cardNb=t,this.loads=!0,this.getSales().finally(function(){e.loads=!1,e.apply&&e.apply()})},t.prototype.getCardNb=function(){var t=this;return(0,d.conf)().User.preferences.load(n.USER_PREFS.CURSUS).then(function(e){var r=e.cardNb;t.cardNb=r})},t.prototype.setCardNb=function(t){return(0,d.conf)().User.preferences.update(n.USER_PREFS.CURSUS,{cardNb:t}).save(n.USER_PREFS.CURSUS)},t.prototype.getSales=function(){var t=this;return this.cardNb?(0,d.http)().get("/cursus/sales",{queryParams:{cardNb:this.cardNb,_:this.version}}).then(function(e){if(200!==(0,d.http)().latestResponse.status)throw"Cannot get sales";return t.error=!1,t.cardNb&&t.setCardNb(t.cardNb),t.sales=e.sales,t.sales&&e.wallets&&t.sales.forEach(function(t){t.wallet=e.wallets.find(function(e){return e&&e.code==t.numPM})}),e}).catch(function(e){t.error=!0}).finally(function(){t.apply&&t.apply()}):Promise.reject()},t.prototype.formatSolde=function(t){return"string"!=typeof t||0===t.length?t:1===t.length?"0,0"+t:2===t.length?"0,"+t:t.substring(0,t.length-2)+","+t.substring(t.length-2)},t}(),o=function(){function t(){this.restrict="E",this.template=r(194).Z,this.controller=[a],this.controllerAs="ctrl",this.require=["odeCursusWidget"]}return t.prototype.link=function(t,e,r,i){var s=i?i[0]:null;s&&(s.apply=function(){t.$apply()},s.loads=!0,s.getCardNb().then(function(){return s.getSales()}).finally(function(){s.loads=!1,t.$apply()}))},t}();(0,d.notif)().onLangReady().promise.then(function(t){(0,d.conf)().Platform.idiom.addKeys(r(8109))}),e.odeModuleName="odeCursusWidgetModule",s.default.module(e.odeModuleName,[]).directive("odeCursusWidget",function(){return new o})},8109:t=>{t.exports=JSON.parse('{"cursus-widget":"#HDF","cursus-widget.widget.cardNb":"Numéro de carte","cursus-widget.widget.error.retry":"Merci de saisir à nouveau votre numéro de carte :","cursus-widget.widget.error.text":"Le numéro de carte ne correspond pas à votre carte Génération #HDF.","cursus-widget.widget.inactive.text":"Veuillez entrer le numéro de votre carte Génération #HDF pour afficher les informations de votre compte.","cursus-widget.widget.my.wallets":"Mes porte-monnaie","cursus-widget.widget.sale":"Solde","cursus-widget.widget.title":"Carte #HDF","cursus-widget.widget.update.cardNb.button":"Actualiser mon n° de carte","cursus-widget.widget.update.cardNb.text":"Cliquez sur le bouton ci-dessous pour changer le numéro de la carte dont vous souhaitez afficher les informations","cursus-widget.widget.update.cardNb.title":"Gestion de ma carte","cursus-widget.widget.validate":"Valider","cursus-widget.widget.wallet":"Porte-Monnaie"}')}}]);
2
2
  //# sourceMappingURL=cursus-widget.widget.js.map
@@ -1,2 +1,2 @@
1
- "use strict";(self.webpackChunkode_ngjs_front=self.webpackChunkode_ngjs_front||[]).push([[376],{1918:(t,i,e)=>{e.d(i,{Z:()=>n});const n=' <div class="widget-news"> <div class="widget-header"> <div class="subtitle"> <a class="seemore" href="/actualites" i18n-title="last-infos-widget.widget.see.all" dnd-nodrag ng-click="trackEvent($event, { detail:{\'open\':\'app\'} })"> <i18n>last-infos-widget.widget.title</i18n> <span class="seemore-text"><i18n>last-infos-widget.widget.see.more</i18n></span> </a> </div> <div class="widget-options"> <div class="widget-handle" title="Déplacer le widget"><i class="fas fa-grip-vertical" aria-hidden="true"></i></div> </div> </div> <div class="widget-body" dnd-nodrag> <div class="widget-empty-message" ng-if="ctrl.infos === undefined || ctrl.infos.length === 0"> <i18n>last-infos-widget.widget.empty</i18n> </div> <a class="news-row" ng-repeat="info in ctrl.infos track by info._id" ng-href="/actualites#/view/thread/[[info.thread_id]]/info/[[info._id]]" ng-click="trackEvent($event, {detail:{\'open\':\'info\'} })"> <div class="news-row-image"> <img ng-if="!info.thread_icon" skin-src="/img/illustrations/news.svg" alt="[[info.thread_title]]" width="40" height="40"/> <img ng-if="info.thread_icon" ng-src="[[info.thread_icon]]?thumbnail=120x120" alt="[[info.thread_title]]" width="40" height="40"/> </div> <div class="news-row-text"> <span class="link d-block">[[info.title]]</span> <span class="meta">[[info.relativeDate]] - [[info.username]]</span> </div> </a> </div> </div> '},5479:function(t,i,e){var n=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(i,"__esModule",{value:!0}),i.odeModuleName=void 0;var s=n(e(4202)),o=e(9419),a=e(5262),d=function(){function t(){this.widget=new a.LastInfosWidget,this.lang=(0,o.conf)().Platform.idiom,this.infos=[],this.resultSizeValues=[1,2,3,4,5,6,7,8,9,10],this.resultSize=4,this.display={edition:!1}}return t.prototype.load=function(){var t=this;return this.widget.loadInfos(this.resultSize).then(function(i){t.infos=i.map(function(i){return i.relativeDate=o.L10n.moment(i.date).fromNow(),i.tooltip=t.lang.translate("last-infos-widget.widget.thread")+" : "+i.thread_title+" | "+t.lang.translate("last-infos-widget.widget.author")+" : "+i.username,i})})},t.prototype.openConfig=function(){this.display.edition=!0},t.prototype.closeConfig=function(){this.display.edition=!1},t.prototype.saveConfig=function(){return this.widget.setMaxResults(this.resultSize)},t}(),l=function(){function t(){this.restrict="E",this.template=e(1918).Z,this.controller=[d],this.controllerAs="ctrl",this.require=["odeLastInfosWidget"]}return t.prototype.link=function(t,i,e,n){var s=n?n[0]:null;s&&(t.trackEvent=function(t,i){var e,n;void 0===i.bubbles&&(i.bubbles=!0);var s=null;(i&&"app"===(null===(e=i.detail)||void 0===e?void 0:e.open)||i&&"info"===(null===(n=i.detail)||void 0===n?void 0:n.open))&&(s=new CustomEvent(o.TrackedActionFromWidget.lastInfos,i)),s&&t.currentTarget&&t.currentTarget.dispatchEvent(s)},s.widget.getMaxResults().then(function(i){s.resultSize=i,s.load().then(function(){t.$apply()})}))},t}();(0,o.notif)().onLangReady().promise.then(function(t){(0,o.conf)().Platform.idiom.addKeys(e(723))}),i.odeModuleName="odeLastInfosWidgetModule",s.default.module(i.odeModuleName,[]).directive("odeLastInfosWidget",function(){return new l})},723:t=>{t.exports=JSON.parse('{"last-infos-widget.widget.title":"Actualités","last-infos-widget.widget.author":"Auteur","last-infos-widget.widget.bad.request.invalid.size":"Nombre d\'actualités invalide : veuillez choisir un nombre compris entre 1 et 20.","last-infos-widget.widget.bad.request.size.must.be.an.integer":"Nombre d\'actualités invalide : veuillez utiliser un nombre.","last-infos-widget.widget.config":"Configurer","last-infos-widget.widget.config.cancel":"Annuler","last-infos-widget.widget.config.nbr":"Nombre d\'actualités à afficher","last-infos-widget.widget.config.save":"Enregistrer","last-infos-widget.widget.config.title":"Configuration","last-infos-widget.widget.empty":"Aucune actualité","last-infos-widget.widget.thread":"Fil","last-infos-widget.widget.see.all":"Voir toutes les actualités","last-infos-widget.widget.see.more":"voir plus","last-infos-widget.widget.options":"Options du widget"}')}}]);
1
+ "use strict";(self.webpackChunkode_ngjs_front=self.webpackChunkode_ngjs_front||[]).push([[376],{1918:(t,i,e)=>{e.d(i,{Z:()=>n});const n=' <div class="widget-news"> <div class="widget-header"> <div class="subtitle"> <a class="seemore" href="/actualites" i18n-title="last-infos-widget.widget.see.all" dnd-nodrag ng-click="trackEvent($event, { detail:{\'open\':\'app\'} })"> <i18n>last-infos-widget.widget.title</i18n> <span class="seemore-text"><i18n>last-infos-widget.widget.see.more</i18n></span> </a> </div> <div class="widget-options"> <div class="widget-handle" title="Déplacer le widget"><i class="fas fa-grip-vertical" aria-hidden="true"></i></div> </div> </div> <div class="widget-body" dnd-nodrag> <div class="widget-empty-message" ng-if="ctrl.infos === undefined || ctrl.infos.length === 0"> <i18n>last-infos-widget.widget.empty</i18n> </div> <a class="news-row" ng-repeat="info in ctrl.infos track by info._id" ng-href="/actualites#/view/thread/[[info.thread_id]]/info/[[info._id]]" ng-click="trackEvent($event, {detail:{\'open\':\'info\'} })"> <div class="news-row-image"> <img ng-if="!info.thread_icon" skin-src="/img/illustrations/news.svg" alt="[[info.thread_title]]" width="40" height="40"/> <img ng-if="info.thread_icon" ng-src="[[info.thread_icon]]?thumbnail=120x120" alt="[[info.thread_title]]" width="40" height="40"/> </div> <div class="news-row-text"> <span class="link d-block">[[info.title]]</span> <span class="meta">[[info.relativeDate]] - [[info.username]]</span> </div> </a> </div> </div> '},5479:function(t,i,e){var n=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(i,"__esModule",{value:!0}),i.odeModuleName=void 0;var s=n(e(4202)),o=e(9419),a=e(5262),d=function(){function t(){this.widget=new a.LastInfosWidget,this.lang=(0,o.conf)().Platform.idiom,this.infos=[],this.resultSizeValues=[1,2,3,4,5,6,7,8,9,10],this.resultSize=4,this.display={edition:!1}}return t.prototype.load=function(){var t=this;return this.widget.loadInfos(this.resultSize).then(function(i){t.infos=i.map(function(i){return i.relativeDate=o.L10n.moment(i.date).fromNow(),i.tooltip=t.lang.translate("last-infos-widget.widget.thread")+" : "+i.thread_title+" | "+t.lang.translate("last-infos-widget.widget.author")+" : "+i.username,i})})},t.prototype.openConfig=function(){this.display.edition=!0},t.prototype.closeConfig=function(){this.display.edition=!1},t.prototype.saveConfig=function(){return this.widget.setMaxResults(this.resultSize)},t}(),l=function(){function t(){this.restrict="E",this.template=e(1918).Z,this.controller=[d],this.controllerAs="ctrl",this.require=["odeLastInfosWidget"]}return t.prototype.link=function(t,i,e,n){var s=n?n[0]:null;s&&(t.trackEvent=function(t,i){var e,n;void 0===i.bubbles&&(i.bubbles=!0);var s=null;(i&&"app"===(null===(e=i.detail)||void 0===e?void 0:e.open)||i&&"info"===(null===(n=i.detail)||void 0===n?void 0:n.open))&&(s=new CustomEvent(o.TrackedActionFromWidget.lastInfos,i)),s&&t.currentTarget&&t.currentTarget.dispatchEvent(s)},s.widget.getMaxResults().then(function(i){s.resultSize=i,s.load().then(function(){t.$apply()})}))},t}();(0,o.notif)().onLangReady().promise.then(function(t){(0,o.conf)().Platform.idiom.addKeys(e(723))}),i.odeModuleName="odeLastInfosWidgetModule",s.default.module(i.odeModuleName,[]).directive("odeLastInfosWidget",function(){return new l})},723:t=>{t.exports=JSON.parse('{"last-infos-widget.widget.author":"Auteur","last-infos-widget.widget.bad.request.invalid.size":"Nombre d\'actualités invalide : veuillez choisir un nombre compris entre 1 et 20.","last-infos-widget.widget.bad.request.size.must.be.an.integer":"Nombre d\'actualités invalide : veuillez utiliser un nombre.","last-infos-widget.widget.config":"Configurer","last-infos-widget.widget.config.cancel":"Annuler","last-infos-widget.widget.config.nbr":"Nombre d\'actualités à afficher","last-infos-widget.widget.config.save":"Enregistrer","last-infos-widget.widget.config.title":"Configuration","last-infos-widget.widget.empty":"Aucune actualité","last-infos-widget.widget.options":"Options du widget","last-infos-widget.widget.see.all":"Voir toutes les actualités","last-infos-widget.widget.see.more":"voir plus","last-infos-widget.widget.thread":"Fil","last-infos-widget.widget.title":"Actualités"}')}}]);
2
2
  //# sourceMappingURL=last-infos-widget.widget.js.map
@@ -1,2 +1,2 @@
1
- "use strict";(self.webpackChunkode_ngjs_front=self.webpackChunkode_ngjs_front||[]).push([[536],{5541:(t,e,o)=>{o.d(e,{Z:()=>i});const i='<div class="widget-maxicours"> <div class="widget-header"> <div class="subtitle"><i18n>maxicours-widget.widget.title</i18n></div> <div class="widget-options"> <div class="widget-handle"><i class="fas fa-grip-vertical"></i></div> </div> </div> <div class="widget-body m-3" ng-if="!ctrl.showWidget()" dnd-nodrag> <p> <a data-maxicours-href href="[[ctrl.controllerData.connectorEndpoint]]" target="_blank" rel="noopener" i18n-title="maxicours-widget"> <i class="ic-maxicours"></i> </a> </p> </div> <div class="widget-body p-4" ng-if="ctrl.showWidget()" dnd-nodrag> <i class="ic-maxicours" ng-if="ctrl.controllerData.id < 0"></i> <p ng-if="ctrl.controllerData.id >= 0"> <a data-maxicours-href href="[[ctrl.controllerData.connectorEndpoint]]" target="_blank" rel="noopener" i18n-title="maxicours-widget" ng-if="ctrl.controllerData.id >= 0"> <i class="ic-maxicours"></i> </a> </p> <div ng-if="ctrl.loads"> <div class="widget-empty-message" translate content="loading"></div> </div> <div class="widget-empty-message" ng-if="!ctrl.loads && (!ctrl.controllerData.id || ctrl.controllerData.id < 0)"> <i18n>maxicours-widget.widget.inactive.user</i18n> <form class="mt-3" data-maxicours-action method="get"> <button class="btn btn-primary" ng-click="ctrl.initAuthProcess()" formtarget="_blank" rel="noopener" translate content="maxicours-widget.widget.connect"></button> </form> </div> <div ng-if="!ctrl.loads && ctrl.controllerData.id >= 0"> <div> <i18n>maxicours-widget.widget.my.points</i18n> : <span>[[ ctrl.controllerData.userInfo.activityScore ]]</span> </div> <div> <div ng-if="ctrl.controllerData.userInfo.hasSessionOfTheDay" class="mt-4"> <h4><a ng-href="[[ctrl.controllerData.userInfo.sessionOfTheDayUrl]]" target="_blank" rel="noopener"><i18n>maxicours-widget.widget.daily.session</i18n></a></h4> <ul ng-if="ctrl.controllerData.userInfo.hasSessionOfTheDay === \'true\'"> <li class="activity row border-top py-3 mx-1 align-items-center" ng-repeat="activity in ctrl.controllerData.userInfo.sessionOfTheDayActivities"> <div class="col-auto"> <img class="picto" ng-src="[[activity.picto]]"> </div> <div class="col-auto"> <strong>[[activity.title]]</strong> <p class="mb-0">[[activity.label]]</p> </div> </li> </ul> </div> <div ng-if="ctrl.controllerData.userInfo.newPersonnalCourses.length > 0"> <h4><i18n>maxicours-widget.widget.my.courses<i18n></i18n></i18n></h4> <ul> <li ng-repeat="course in ctrl.controllerData.userInfo.newPersonnalCourses"> <b> <a ng-href="[[course.url]]" target="_blank" rel="noopener">[[course.label]] ([[course.date]])</a> </b> </li> <li ng-repeat="course in ctrl.controllerData.userInfo.currentPersonnalCourses"> <a ng-href="[[course.url]]" target="_blank" rel="noopener">[[course.label]] ([[course.date]])</a> </li> </ul> </div> </div> </div> </div> </div>'},3132:function(t,e,o){var i=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.odeModuleName=void 0;var r=i(o(4202)),n=o(9419),a=i(o(3336)),s=function(){function t(){this.controllerData={},this.loads=!1}return Object.defineProperty(t.prototype,"version",{get:function(){return(0,n.conf)().Platform.deploymentTag},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"me",{get:function(){return(0,n.session)().user},enumerable:!1,configurable:!0}),t.prototype.showWidget=function(){return"ELEVE"===this.me.type},t.prototype.loading=function(t){this.loads=t,this.apply&&this.apply()},t.prototype.authProcess=function(t){var e=this;this.getUserStatus().then(function(){return e.getUserInfo(t)})},t.prototype.initAuthProcess=function(){var t=this,e=5;this.loading(!0);var o=function(){t.controllerData.id<0&&e-- >0?(t.authProcess(),setTimeout(o,2e3)):t.loading(!1)};setTimeout(o,2e3)},t.prototype.getConf=function(){var t=this;return(0,n.http)().get("/maxicours/conf",{queryParams:{_:this.version}}).then(function(e){if(200!==(0,n.http)().latestResponse.status)throw"Cannot get maxicours widget configuration.";Object.assign(t.controllerData,e),t.controllerData.connectorEndpoint&&((0,a.default)("[data-maxicours-action]").attr("action",t.controllerData.connectorEndpoint),(0,a.default)("[data-maxicours-href]").attr("href",t.controllerData.connectorEndpoint))}).catch(function(){console.log("HTTP error on /maxicours/conf. aide-aux-devoirs widget will not load.")})},t.prototype.getUserStatus=function(){var t=this;return(0,n.http)().get("/maxicours/getUserStatus",{queryParams:{_:this.version}}).then(function(e){if(200!==(0,n.http)().latestResponse.status)throw"Cannot get maxicours user status.";var o=a.default.parseXML(e),i=(0,a.default)(o);t.controllerData.id=i.find("mxcId").text(),t.apply&&t.apply()}).catch(function(){console.log("HTTP error on /maxicours/getUserStatus. aide-aux-devoirs widget will not load.")})},t.prototype.getUserInfo=function(t){var e=this;if(void 0===this.controllerData.id||"string"==typeof this.controllerData.id&&0===this.controllerData.id.trim().length||this.controllerData.id<0)return"function"==typeof t&&t(),Promise.resolve();(0,n.http)().get("/maxicours/getUserInfo/"+this.controllerData.id).then(function(t){if(200!==(0,n.http)().latestResponse.status)throw"Cannot get maxicours user info.";try{var o=a.default.parseXML(t),i=(0,a.default)(o),r=function(t,e,o){return(o?t.find(o).find(e):t.find(e)).text()},s=function(t){return(0,a.default)(t).children().toArray().map(function(t){for(var e={},o=(0,a.default)(t).children(),i=0;i<o.length;i++)e[o[i].nodeName]=o[i].textContent;return e})};e.controllerData.userInfo={hasAnActiveAccount:r(i,"hasAnActiveAccount"),activityScore:r(i,"activityScore"),hasSessionOfTheDay:r(i,"hasSessionOfTheDay"),sessionOfTheDayUrl:r(i,"sessionOfTheDayUrl"),sessionOfTheDayActivities:s(i.find("sessionOfTheDayActivities")),hasPersonnalCourses:r(i,"hasPersonnalCourses"),newPersonnalCourses:s(i.find("newPersonnalCourses")),currentPersonnalCourses:s(i.find("currentPersonnalCourses"))},e.apply&&e.apply()}catch(t){console.log("Cannot parse maxicours user info.")}}).finally(function(){"function"==typeof t&&t()})},t}(),c=function(){function t(){this.restrict="E",this.template=o(5541).Z,this.controller=[s],this.controllerAs="ctrl",this.require=["odeMaxicoursWidget"]}return t.prototype.link=function(t,e,o,i){var r=i?i[0]:null;r&&(r.apply=function(){t.$apply()},r.getConf().then(function(){return r.authProcess(function(){r.loading(!1),r.apply&&r.apply()})}))},t}();(0,n.notif)().onLangReady().promise.then(function(t){(0,n.conf)().Platform.idiom.addKeys(o(841))}),e.odeModuleName="odeMaxicoursWidgetModule",r.default.module(e.odeModuleName,[]).directive("odeMaxicoursWidget",function(){return new c})},841:t=>{t.exports=JSON.parse('{"maxicours-widget":"Aide aux devoirs","maxicours-widget.widget.title":"Aide aux devoirs","maxicours-widget.widget.inactive.user":"Vous n\'êtes pas authentifié sur le service.","maxicours-widget.widget.connect":"Activer mon compte","maxicours-widget.widget.refresh":"Rafraîchir les informations","maxicours-widget.widget.my.points":"Mes points","maxicours-widget.widget.points":"pts","maxicours-widget.widget.daily.session":"Ma séance du jour","maxicours-widget.widget.my.courses":"Mes parcours à réaliser"}')}}]);
1
+ "use strict";(self.webpackChunkode_ngjs_front=self.webpackChunkode_ngjs_front||[]).push([[536],{5541:(t,e,o)=>{o.d(e,{Z:()=>i});const i='<div class="widget-maxicours"> <div class="widget-header"> <div class="subtitle"><i18n>maxicours-widget.widget.title</i18n></div> <div class="widget-options"> <div class="widget-handle"><i class="fas fa-grip-vertical"></i></div> </div> </div> <div class="widget-body m-3" ng-if="!ctrl.showWidget()" dnd-nodrag> <p> <a data-maxicours-href href="[[ctrl.controllerData.connectorEndpoint]]" target="_blank" rel="noopener" i18n-title="maxicours-widget"> <i class="ic-maxicours"></i> </a> </p> </div> <div class="widget-body p-4" ng-if="ctrl.showWidget()" dnd-nodrag> <i class="ic-maxicours" ng-if="ctrl.controllerData.id < 0"></i> <p ng-if="ctrl.controllerData.id >= 0"> <a data-maxicours-href href="[[ctrl.controllerData.connectorEndpoint]]" target="_blank" rel="noopener" i18n-title="maxicours-widget" ng-if="ctrl.controllerData.id >= 0"> <i class="ic-maxicours"></i> </a> </p> <div ng-if="ctrl.loads"> <div class="widget-empty-message" translate content="loading"></div> </div> <div class="widget-empty-message" ng-if="!ctrl.loads && (!ctrl.controllerData.id || ctrl.controllerData.id < 0)"> <i18n>maxicours-widget.widget.inactive.user</i18n> <form class="mt-3" data-maxicours-action method="get"> <button class="btn btn-primary" ng-click="ctrl.initAuthProcess()" formtarget="_blank" rel="noopener" translate content="maxicours-widget.widget.connect"></button> </form> </div> <div ng-if="!ctrl.loads && ctrl.controllerData.id >= 0"> <div> <i18n>maxicours-widget.widget.my.points</i18n> : <span>[[ ctrl.controllerData.userInfo.activityScore ]]</span> </div> <div> <div ng-if="ctrl.controllerData.userInfo.hasSessionOfTheDay" class="mt-4"> <h4><a ng-href="[[ctrl.controllerData.userInfo.sessionOfTheDayUrl]]" target="_blank" rel="noopener"><i18n>maxicours-widget.widget.daily.session</i18n></a></h4> <ul ng-if="ctrl.controllerData.userInfo.hasSessionOfTheDay === \'true\'"> <li class="activity row border-top py-3 mx-1 align-items-center" ng-repeat="activity in ctrl.controllerData.userInfo.sessionOfTheDayActivities"> <div class="col-auto"> <img class="picto" ng-src="[[activity.picto]]"> </div> <div class="col-auto"> <strong>[[activity.title]]</strong> <p class="mb-0">[[activity.label]]</p> </div> </li> </ul> </div> <div ng-if="ctrl.controllerData.userInfo.newPersonnalCourses.length > 0"> <h4><i18n>maxicours-widget.widget.my.courses<i18n></i18n></i18n></h4> <ul> <li ng-repeat="course in ctrl.controllerData.userInfo.newPersonnalCourses"> <b> <a ng-href="[[course.url]]" target="_blank" rel="noopener">[[course.label]] ([[course.date]])</a> </b> </li> <li ng-repeat="course in ctrl.controllerData.userInfo.currentPersonnalCourses"> <a ng-href="[[course.url]]" target="_blank" rel="noopener">[[course.label]] ([[course.date]])</a> </li> </ul> </div> </div> </div> </div> </div>'},3132:function(t,e,o){var i=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.odeModuleName=void 0;var r=i(o(4202)),n=o(9419),a=i(o(3336)),s=function(){function t(){this.controllerData={},this.loads=!1}return Object.defineProperty(t.prototype,"version",{get:function(){return(0,n.conf)().Platform.deploymentTag},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"me",{get:function(){return(0,n.session)().user},enumerable:!1,configurable:!0}),t.prototype.showWidget=function(){return"ELEVE"===this.me.type},t.prototype.loading=function(t){this.loads=t,this.apply&&this.apply()},t.prototype.authProcess=function(t){var e=this;this.getUserStatus().then(function(){return e.getUserInfo(t)})},t.prototype.initAuthProcess=function(){var t=this,e=5;this.loading(!0);var o=function(){t.controllerData.id<0&&e-- >0?(t.authProcess(),setTimeout(o,2e3)):t.loading(!1)};setTimeout(o,2e3)},t.prototype.getConf=function(){var t=this;return(0,n.http)().get("/maxicours/conf",{queryParams:{_:this.version}}).then(function(e){if(200!==(0,n.http)().latestResponse.status)throw"Cannot get maxicours widget configuration.";Object.assign(t.controllerData,e),t.controllerData.connectorEndpoint&&((0,a.default)("[data-maxicours-action]").attr("action",t.controllerData.connectorEndpoint),(0,a.default)("[data-maxicours-href]").attr("href",t.controllerData.connectorEndpoint))}).catch(function(){console.log("HTTP error on /maxicours/conf. aide-aux-devoirs widget will not load.")})},t.prototype.getUserStatus=function(){var t=this;return(0,n.http)().get("/maxicours/getUserStatus",{queryParams:{_:this.version}}).then(function(e){if(200!==(0,n.http)().latestResponse.status)throw"Cannot get maxicours user status.";var o=a.default.parseXML(e),i=(0,a.default)(o);t.controllerData.id=i.find("mxcId").text(),t.apply&&t.apply()}).catch(function(){console.log("HTTP error on /maxicours/getUserStatus. aide-aux-devoirs widget will not load.")})},t.prototype.getUserInfo=function(t){var e=this;if(void 0===this.controllerData.id||"string"==typeof this.controllerData.id&&0===this.controllerData.id.trim().length||this.controllerData.id<0)return"function"==typeof t&&t(),Promise.resolve();(0,n.http)().get("/maxicours/getUserInfo/"+this.controllerData.id).then(function(t){if(200!==(0,n.http)().latestResponse.status)throw"Cannot get maxicours user info.";try{var o=a.default.parseXML(t),i=(0,a.default)(o),r=function(t,e,o){return(o?t.find(o).find(e):t.find(e)).text()},s=function(t){return(0,a.default)(t).children().toArray().map(function(t){for(var e={},o=(0,a.default)(t).children(),i=0;i<o.length;i++)e[o[i].nodeName]=o[i].textContent;return e})};e.controllerData.userInfo={hasAnActiveAccount:r(i,"hasAnActiveAccount"),activityScore:r(i,"activityScore"),hasSessionOfTheDay:r(i,"hasSessionOfTheDay"),sessionOfTheDayUrl:r(i,"sessionOfTheDayUrl"),sessionOfTheDayActivities:s(i.find("sessionOfTheDayActivities")),hasPersonnalCourses:r(i,"hasPersonnalCourses"),newPersonnalCourses:s(i.find("newPersonnalCourses")),currentPersonnalCourses:s(i.find("currentPersonnalCourses"))},e.apply&&e.apply()}catch(t){console.log("Cannot parse maxicours user info.")}}).finally(function(){"function"==typeof t&&t()})},t}(),c=function(){function t(){this.restrict="E",this.template=o(5541).Z,this.controller=[s],this.controllerAs="ctrl",this.require=["odeMaxicoursWidget"]}return t.prototype.link=function(t,e,o,i){var r=i?i[0]:null;r&&(r.apply=function(){t.$apply()},r.getConf().then(function(){return r.authProcess(function(){r.loading(!1),r.apply&&r.apply()})}))},t}();(0,n.notif)().onLangReady().promise.then(function(t){(0,n.conf)().Platform.idiom.addKeys(o(841))}),e.odeModuleName="odeMaxicoursWidgetModule",r.default.module(e.odeModuleName,[]).directive("odeMaxicoursWidget",function(){return new c})},841:t=>{t.exports=JSON.parse('{"maxicours-widget":"Aide aux devoirs","maxicours-widget.widget.connect":"Activer mon compte","maxicours-widget.widget.daily.session":"Ma séance du jour","maxicours-widget.widget.inactive.user":"Vous n\'êtes pas authentifié sur le service.","maxicours-widget.widget.my.courses":"Mes parcours à réaliser","maxicours-widget.widget.my.points":"Mes points","maxicours-widget.widget.points":"pts","maxicours-widget.widget.refresh":"Rafraîchir les informations","maxicours-widget.widget.title":"Aide aux devoirs"}')}}]);
2
2
  //# sourceMappingURL=maxicours-widget.widget.js.map
@@ -1,2 +1,2 @@
1
- "use strict";(self.webpackChunkode_ngjs_front=self.webpackChunkode_ngjs_front||[]).push([[649],{5052:(e,t,i)=>{i.d(t,{Z:()=>n});const n='<div class="widget-applications"> <div class="widget-header"> <div class="subtitle"><i18n>my-apps.widget.title</i18n></div> <div class="widget-options"> <div class="widget-handle"><i class="fas fa-grip-vertical"></i></div> </div> </div> <div class="widget-body" dnd-nodrag> <div class="widget-empty-message link" ng-if="ctrl.apps.length===0"> <a href="/welcome" ng-click="trackEvent($event, {detail:{\'open\':\'more\'} })"> <i18n>my-apps.widget.more</i18n> </a> </div> <ul class="icon-grid" ng-if="ctrl.apps.length>0"> <li class="icon-grid-item" ng-repeat="app in ctrl.apps"> <a connector-lightbox-trigger="app" ng-href="[[app.address]]" ng-click="trackEvent($event, {detail:{\'open\':\'app\', \'app\':app} })" aria-label="[[app.displayName]]" target="[[app.target]]" rel="noopener" i18n-title="[[app.displayName]]" ng-switch="app.icon.indexOf(\'/\')"> <i ng-class="ctrl.getIconClass(app)" ng-switch-when="-1"></i> <img skin-src="[[app.icon]]" ng-switch-default alt="[[app.displayName]]"/> </a> </li> </ul> </div> <div class="widget-footer border-top border-ghost" ng-if="ctrl.apps.length!==0"> <div class="widget-footer-action"> <a class="link" href="/welcome" ng-click="trackEvent($event, {detail:{\'open\':\'more\'} })"> <i18n>my-apps.widget.options</i18n> </a> </div> </div> </div>'},1204:function(e,t,i){var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.odeModuleName=void 0;var o=n(i(4202)),a=i(9419),p=function(){function e(e){this.themeSvc=e,this.apps=[]}return e.prototype.redirect=function(e){window.location.href=e},e.prototype.getIconClass=function(e){var t=this.themeSvc.getIconCode(e);return"ic-app-".concat(t," color-app-").concat(t)},e}(),s=function(){function e(){this.restrict="E",this.template=i(5052).Z,this.controller=["odeThemeHelperService",p],this.controllerAs="ctrl",this.require=["odeMyApps"]}return e.prototype.link=function(e,t,i,n){var o=n?n[0]:null;o&&((0,a.notif)().onSessionReady().promise.then(function(){o.apps=(0,a.conf)().User.bookmarkedApps,e.$apply()}),e.trackEvent=function(e,t){var i,n;void 0===t.bubbles&&(t.bubbles=!0);var o=null;(t&&"app"===(null===(i=t.detail)||void 0===i?void 0:i.open)||t&&"more"===(null===(n=t.detail)||void 0===n?void 0:n.open))&&(o=new CustomEvent(a.TrackedActionFromWidget.myApps,t)),o&&e.currentTarget&&e.currentTarget.dispatchEvent(o)})},e}();(0,a.notif)().onLangReady().promise.then(function(e){(0,a.conf)().Platform.idiom.addKeys(i(4865))}),t.odeModuleName="odeMyAppsModule",o.default.module(t.odeModuleName,[]).directive("odeMyApps",function(){return new s})},4865:e=>{e.exports=JSON.parse('{"my-apps.widget.title":"Mes applis","my-apps.widget.options":"Plus","my-apps.widget.more":"Sélectionner vos applications favorites"}')}}]);
1
+ "use strict";(self.webpackChunkode_ngjs_front=self.webpackChunkode_ngjs_front||[]).push([[649],{5052:(e,t,i)=>{i.d(t,{Z:()=>n});const n='<div class="widget-applications"> <div class="widget-header"> <div class="subtitle"><i18n>my-apps.widget.title</i18n></div> <div class="widget-options"> <div class="widget-handle"><i class="fas fa-grip-vertical"></i></div> </div> </div> <div class="widget-body" dnd-nodrag> <div class="widget-empty-message link" ng-if="ctrl.apps.length===0"> <a href="/welcome" ng-click="trackEvent($event, {detail:{\'open\':\'more\'} })"> <i18n>my-apps.widget.more</i18n> </a> </div> <ul class="icon-grid" ng-if="ctrl.apps.length>0"> <li class="icon-grid-item" ng-repeat="app in ctrl.apps"> <a connector-lightbox-trigger="app" ng-href="[[app.address]]" ng-click="trackEvent($event, {detail:{\'open\':\'app\', \'app\':app} })" aria-label="[[app.displayName]]" target="[[app.target]]" rel="noopener" i18n-title="[[app.displayName]]" ng-switch="app.icon.indexOf(\'/\')"> <i ng-class="ctrl.getIconClass(app)" ng-switch-when="-1"></i> <img skin-src="[[app.icon]]" ng-switch-default alt="[[app.displayName]]"/> </a> </li> </ul> </div> <div class="widget-footer border-top border-ghost" ng-if="ctrl.apps.length!==0"> <div class="widget-footer-action"> <a class="link" href="/welcome" ng-click="trackEvent($event, {detail:{\'open\':\'more\'} })"> <i18n>my-apps.widget.options</i18n> </a> </div> </div> </div>'},1204:function(e,t,i){var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.odeModuleName=void 0;var o=n(i(4202)),a=i(9419),p=function(){function e(e){this.themeSvc=e,this.apps=[]}return e.prototype.redirect=function(e){window.location.href=e},e.prototype.getIconClass=function(e){var t=this.themeSvc.getIconCode(e);return"ic-app-".concat(t," color-app-").concat(t)},e}(),s=function(){function e(){this.restrict="E",this.template=i(5052).Z,this.controller=["odeThemeHelperService",p],this.controllerAs="ctrl",this.require=["odeMyApps"]}return e.prototype.link=function(e,t,i,n){var o=n?n[0]:null;o&&((0,a.notif)().onSessionReady().promise.then(function(){o.apps=(0,a.conf)().User.bookmarkedApps,e.$apply()}),e.trackEvent=function(e,t){var i,n;void 0===t.bubbles&&(t.bubbles=!0);var o=null;(t&&"app"===(null===(i=t.detail)||void 0===i?void 0:i.open)||t&&"more"===(null===(n=t.detail)||void 0===n?void 0:n.open))&&(o=new CustomEvent(a.TrackedActionFromWidget.myApps,t)),o&&e.currentTarget&&e.currentTarget.dispatchEvent(o)})},e}();(0,a.notif)().onLangReady().promise.then(function(e){(0,a.conf)().Platform.idiom.addKeys(i(4865))}),t.odeModuleName="odeMyAppsModule",o.default.module(t.odeModuleName,[]).directive("odeMyApps",function(){return new s})},4865:e=>{e.exports=JSON.parse('{"my-apps.widget.more":"Sélectionner vos applications favorites","my-apps.widget.options":"Plus","my-apps.widget.title":"Mes applis"}')}}]);
2
2
  //# sourceMappingURL=my-apps.widget.js.map
@@ -1,2 +1,2 @@
1
- "use strict";(self.webpackChunkode_ngjs_front=self.webpackChunkode_ngjs_front||[]).push([[165],{8265:(t,e,n)=>{n.d(e,{Z:()=>a});const a=' <style>.widget-qwant .widget-header{border:0}.widget-qwant .widget-body img{margin:auto}</style> <div class="widget-qwant"> <div class="widget-header"> <div class="widget-options"> <div class="widget-handle"><i class="fas fa-grip-vertical"></i></div> </div> </div> <div class="widget-body" dnd-nodrag> <div class="widget-empty-message"> <div class="row row-cols-1 align-items-center"> <div class="mb-12"> <a href="https://www.qwant.com" target="_blank" rel="noopener" ng-click="trackEvent($event, {detail:{\'open\':\'qwant\'} })"> <img src="/assets/widgets/qwant/logo-qwant.svg" width="77" height="75" alt="Qwant"> </a> </div> </div> <form method="GET" target="_blank" action="https://www.qwant.com" autocomplete="off"> <div class="row row-cols-1 align-items-center"> <label class="sr-only" for="inputQwantQ" translate content="search"></label> <div class="input-group mb-2"> <input type="text" id="inputQwantQ" class="form-control" name="q" maxlength="255" i18n-placeholder="search"/> <input type="hidden" name="l" value="fr"/> <button class="btn btn-outline-secondary" aria-labelledby="inputQwantQ" ng-click="trackEvent($event, {detail:{\'search\':\'launch\'} })"> <i class="ic-search"></i> </button> </div> </div> </form> </div> </div> </div>'},3399:function(t,e,n){var a=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.odeModuleName=void 0;var i=a(n(4202)),o=n(9419),d=function(){function t(){this.restrict="E",this.template=n(8265).Z}return t.prototype.link=function(t){t.trackEvent=function(t,e){var n,a;void 0===e.bubbles&&(e.bubbles=!0);var i=null;!e||"qwant"!==(null===(n=e.detail)||void 0===n?void 0:n.open)&&"string"!=typeof(null===(a=e.detail)||void 0===a?void 0:a.search)||(i=new CustomEvent(o.TrackedActionFromWidget.qwant,e)),i&&t.currentTarget&&t.currentTarget.dispatchEvent(i)}},t}();(0,o.notif)().onLangReady().promise.then(function(t){(0,o.conf)().Platform.idiom.addKeys(n(2467))}),e.odeModuleName="odeQwantModule",i.default.module(e.odeModuleName,[]).directive("odeQwant",function(){return new d})},2467:t=>{t.exports=JSON.parse('{"qwant-widget.widget.title":"Qwant","qwant-junior":"QwantJunior","qwant":"Qwant"}')}}]);
1
+ "use strict";(self.webpackChunkode_ngjs_front=self.webpackChunkode_ngjs_front||[]).push([[165],{8265:(t,e,n)=>{n.d(e,{Z:()=>a});const a=' <style>.widget-qwant .widget-header{border:0}.widget-qwant .widget-body img{margin:auto}</style> <div class="widget-qwant"> <div class="widget-header"> <div class="widget-options"> <div class="widget-handle"><i class="fas fa-grip-vertical"></i></div> </div> </div> <div class="widget-body" dnd-nodrag> <div class="widget-empty-message"> <div class="row row-cols-1 align-items-center"> <div class="mb-12"> <a href="https://www.qwant.com" target="_blank" rel="noopener" ng-click="trackEvent($event, {detail:{\'open\':\'qwant\'} })"> <img src="/assets/widgets/qwant/logo-qwant.svg" width="77" height="75" alt="Qwant"> </a> </div> </div> <form method="GET" target="_blank" action="https://www.qwant.com" autocomplete="off"> <div class="row row-cols-1 align-items-center"> <label class="sr-only" for="inputQwantQ" translate content="search"></label> <div class="input-group mb-2"> <input type="text" id="inputQwantQ" class="form-control" name="q" maxlength="255" i18n-placeholder="search"/> <input type="hidden" name="l" value="fr"/> <button class="btn btn-outline-secondary" aria-labelledby="inputQwantQ" ng-click="trackEvent($event, {detail:{\'search\':\'launch\'} })"> <i class="ic-search"></i> </button> </div> </div> </form> </div> </div> </div>'},3399:function(t,e,n){var a=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.odeModuleName=void 0;var i=a(n(4202)),o=n(9419),d=function(){function t(){this.restrict="E",this.template=n(8265).Z}return t.prototype.link=function(t){t.trackEvent=function(t,e){var n,a;void 0===e.bubbles&&(e.bubbles=!0);var i=null;!e||"qwant"!==(null===(n=e.detail)||void 0===n?void 0:n.open)&&"string"!=typeof(null===(a=e.detail)||void 0===a?void 0:a.search)||(i=new CustomEvent(o.TrackedActionFromWidget.qwant,e)),i&&t.currentTarget&&t.currentTarget.dispatchEvent(i)}},t}();(0,o.notif)().onLangReady().promise.then(function(t){(0,o.conf)().Platform.idiom.addKeys(n(2467))}),e.odeModuleName="odeQwantModule",i.default.module(e.odeModuleName,[]).directive("odeQwant",function(){return new d})},2467:t=>{t.exports=JSON.parse('{"qwant":"Qwant","qwant-junior":"QwantJunior","qwant-widget.widget.title":"Qwant"}')}}]);
2
2
  //# sourceMappingURL=qwant-widget.widget.js.map
@@ -1,2 +1,2 @@
1
- "use strict";(self.webpackChunkode_ngjs_front=self.webpackChunkode_ngjs_front||[]).push([[390],{4643:(e,t,i)=>{i.d(t,{Z:()=>n});const n=' <div class="widget-rss"> <div class="widget-header"> <div class="subtitle"><i18n>rss-widget.widget.title</i18n></div> <div class="widget-options"> <div class="tools"> <a href="#" class="tool tool-option" i18n-title="rss-widget.widget.channel.config" ng-if="ctrl.canAddFeed" ng-click="ctrl.display.edition = true"> <i class="fas fa-cog"></i> </a> </div> <div class="widget-handle" title="Déplacer le widget"><i class="fas fa-grip-vertical" aria-hidden="true"></i></div> </div> </div> <div class="widget-body" dnd-nodrag> <div class="widget-empty-message link" ng-click="ctrl.display.edition = true" ng-if="ctrl.channel===undefined || ctrl.channel.feeds.length === 0"> <i18n>rss-widget.widget.empty.info</i18n> </div> <div class="widget-empty-message link" ng-if="ctrl.channel && ctrl.channel.feeds.length > 0 && ctrl.feeds.length === 0"> <i18n>rss-widget.widget.channel.feed.no.result</i18n> </div> <div class="rss-feed" ng-if="ctrl.feeds !== undefined" ng-repeat="feed in ctrl.feeds track by $index"> <div class="feed-title" ng-click="ctrl.showOrHideFeed($index)">[[feed.title]]</div> <ul class="list" ng-show="ctrl.display.selectedFeed === [[$index]]"> <li class="item link" ng-repeat="item in feed.Items track by $index"> <a href="[[item.link]]" target="_blank" rel="noopener" ng-click="trackEvent($event, {detail:{\'open\':item.link} })"> <div class="title">[[item.title]]</div> <div class="meta">[[ctrl.formatDate(item.pubDate)]]</div> <div class="meta" ng-bind-html="item.description"></div> </a> </li> </ul> </div> </div> </div> <ode-modal visible="ctrl.display.edition" on-close="ctrl.display.edition = false" dnd-nodrag> <ode-modal-title> <i18n ng-if="!ctrl.display.feedEdition">rss-widget.widget.channel.feed.list</i18n> <i18n ng-if="ctrl.display.feedEdition">rss-widget.widget.channel.feed.edit</i18n> </ode-modal-title> <ode-modal-body> <div ng-if="!ctrl.display.feedEdition"> <p ng-if="ctrl.channel.feeds.length === 0"><i18n>rss-widget.widget.channel.undefined</i18n></p> <table class="table table-hover" ng-if="ctrl.channel.feeds.length > 0"> <thead> <tr class="bg-secondary text-light"> <th><i18n>rss-widget.widget.channel.feed.title</i18n></th> <th><i18n>rss-widget.widget.channel.feed.show</i18n></th> <th></th> </tr> </thead> <tbody> <tr class="c-pointer" ng-repeat="feed in ctrl.channel.feeds track by $index" ng-class="{ \'table-active\' : ctrl.display.feedEdition && $index === ctrl.selectedFeedIndex }"> <td ng-click="ctrl.openFeedEdition($index)">[[ctrl.channel.feeds[$index].title]]</td> <td ng-click="ctrl.openFeedEdition($index)">[[ctrl.channel.feeds[$index].show]]</td> <td ng-click="ctrl.removeFeed($index)"> <button type="button" class="btn-close" aria-label="Close"></button> </td> </tr> </tbody> </table> </div> <form autocomplete="off" id="formFeedEdition" ng-if="ctrl.display.feedEdition"> <div class="form-group row"> <label for="inputFeedTitle" class="col-sm-4 col-form-label"><i18n>rss-widget.widget.channel.feed.title</i18n></label> <div class="col-sm-8"> <input type="text" i18n-placeholder="rss-widget.widget.channel.feed.title.placeholder" id="inputFeedTitle" class="form-control" ng-model="ctrl.selectedFeed.title"/> </div> </div> <div class="form-group row mt-3"> <label for="inputFeedUrl" class="col-sm-4 col-form-label"><i18n>rss-widget.widget.channel.feed.url</i18n></label> <div class="col-sm-8"> <input type="text" i18n-placeholder="rss-widget.widget.channel.feed.url.placeholder" id="inputFeedUrl" class="form-control" ng-model="ctrl.selectedFeed.link"/> </div> </div> <div class="form-group row mt-3"> <label for="inputFeedShow" class="col-sm-4 col-form-label"><i18n>rss-widget.widget.channel.feed.show</i18n></label> <div class="col-sm-8"> <select id="inputFeedShow" class="form-control" ng-options="n for n in ctrl.showValues" ng-model="ctrl.selectedFeed.show"></select> </div> </div> </form> </ode-modal-body> <ode-modal-footer> <div ng-if="!ctrl.display.feedEdition && ctrl.canAddFeed"> <button class="btn btn-primary" ng-click="ctrl.openFeedEdition()" translate content="rss-widget.widget.channel.feed.add"></button> </div> <div ng-if="ctrl.display.feedEdition"> <button form="formFeedEdition" type="reset" class="btn btn-light" ng-click="ctrl.closeFeedEdition()"> <i18n>rss-widget.widget.channel.feed.cancel</i18n> </button> <button form="formFeedEdition" type="submit" class="btn btn-primary" ng-click="ctrl.saveFeed()"> <i18n>rss-widget.widget.channel.feed.save</i18n> </button> </div> </ode-modal-footer> </ode-modal>'},7377:function(e,t,i){var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.odeModuleName=void 0;var d=n(i(4202)),l=i(9419),s=function(){function e(){this.channel=void 0,this.feeds=[],this.totalFeeds=10,this.defaultShow=3,this.showValues=[1,2,3,4,5,6,7,8,9,10],this.display={edition:!1,feedEdition:!1,selectedFeed:0}}return e.prototype.initFeeds=function(){var e=this;return void 0===this.channel?(0,l.http)().get("/rss/channels").then(function(t){return t&&t.length>0?e.channel=t[0]:e.channel={feeds:[]},e.loadFeeds(0)}).catch(function(t){console.warn("[widget.rss] failed to initFeeds: ",t),e.channel={feeds:[]}}):this.loadFeeds(0)},e.prototype.loadFeeds=function(e){var t=this;return this.feeds=[],Promise.all(this.channel.feeds.map(function(i){var n=i.title;return null!==i.link&&""!==i.link?(0,l.http)().get("/rss/feed/items?url="+encodeURIComponent(i.link)+"&force="+e).then(function(e){"object"!=typeof e||e.title||(e.title=n),200===e.status&&t.feeds.length<t.totalFeeds&&(void 0!==e.Items&&null!=i.show&&e.Items.length>i.show&&(e.Items=e.Items.slice(0,i.show)),t.feeds.push(e))}).catch(function(e){console.warn("[widget.rss] failed to loadFeeds: ",e)}):Promise.resolve()})).then(function(e){})},Object.defineProperty(e.prototype,"canAddFeed",{get:function(){var e=$(window).width();return this.channel&&this.channel.feeds.length<this.totalFeeds&&("number"!=typeof e||e>=992)},enumerable:!1,configurable:!0}),e.prototype.openFeedEdition=function(e){"number"==typeof e&&e>=0&&e<this.totalFeeds?(this.selectedFeed=d.default.copy(this.channel.feeds[e]),this.selectedFeedIndex=e):(this.selectedFeed={title:"",link:"",show:3},this.selectedFeedIndex=-1),this.display.feedEdition=!0},e.prototype.closeFeedEdition=function(){this.display.feedEdition=!1,this.selectedFeed=void 0,this.selectedFeedIndex=void 0},e.prototype.removeFeed=function(e){"number"==typeof e&&e>=0&&e<this.totalFeeds&&(this.channel.feeds.splice(e,1),this.saveChannel())},e.prototype.validFeed=function(e){return e&&e.title&&""!==e.title.trim()&&e.link&&""!==e.link.trim()},e.prototype.saveFeed=function(){"number"==typeof this.selectedFeedIndex&&this.validFeed(this.selectedFeed)&&this.selectedFeed&&(this.selectedFeedIndex>=0&&this.selectedFeedIndex<this.totalFeeds?this.channel.feeds[this.selectedFeedIndex]=this.selectedFeed:this.channel.feeds.push(this.selectedFeed),this.saveChannel()),this.closeFeedEdition()},e.prototype.saveChannel=function(){this.channel._id?this.editChannel():this.createChannel()},e.prototype.createChannel=function(){var e=this;this.channel?(0,l.http)().postJson("/rss/channel",this.channel).then(function(t){e.channel._id=t._id,e.loadFeeds(0)}):console.log("createChannel : channel is undefined")},e.prototype.editChannel=function(){var e=this;this.channel&&this.channel._id?(0,l.http)().putJson("/rss/channel/"+this.channel._id,{feeds:this.channel.feeds}).then(function(t){e.loadFeeds(0)}):console.log("editChannel : channel is undefined")},e.prototype.showOrHideFeed=function(e){this.display.selectedFeed===e?this.display.selectedFeed=void 0:this.display.selectedFeed=e},e.prototype.formatDate=function(e){return("number"==typeof e?l.L10n.unix(e):l.L10n.moment(e,void 0,"en")).locale("fr").format("dddd DD MMMM YYYY HH:mm")},e}(),o=function(){function e(){this.restrict="E",this.template=i(4643).Z,this.controller=[s],this.controllerAs="ctrl",this.require=["odeRssWidget"]}return e.prototype.link=function(e,t,i,n){var d=n?n[0]:null;d&&(d.initFeeds().then(function(){e.$apply()}),e.trackEvent=function(e,t){var i;void 0===t.bubbles&&(t.bubbles=!0);var n=null;t&&"string"==typeof(null===(i=t.detail)||void 0===i?void 0:i.open)&&(n=new CustomEvent(l.TrackedActionFromWidget.rss,t)),n&&e.currentTarget&&e.currentTarget.dispatchEvent(n)})},e}();(0,l.notif)().onLangReady().promise.then(function(e){(0,l.conf)().Platform.idiom.addKeys(i(2546))}),t.odeModuleName="odeRssWidgetModule",d.default.module(t.odeModuleName,[]).directive("odeRssWidget",function(){return new o})},2546:e=>{e.exports=JSON.parse('{"rss-widget.widget.title":"RSS","rss-widget.widget.channel.config":"Configurer","rss-widget.widget.channel.feed.add":"Ajouter un flux","rss-widget.widget.channel.feed.cancel":"Retour","rss-widget.widget.channel.feed.edit":"Edition d\'un flux","rss-widget.widget.channel.feed.list":"Liste des flux","rss-widget.widget.channel.feed.no.result":"Aucun résultat","rss-widget.widget.channel.feed.read.more":"Voir plus","rss-widget.widget.channel.feed.remove":"Supprimer le flux","rss-widget.widget.channel.feed.save":"Enregistrer","rss-widget.widget.channel.feed.show":"Nombre d\'articles à afficher","rss-widget.widget.channel.feed.title":"Titre","rss-widget.widget.channel.feed.update":"Actualiser","rss-widget.widget.channel.feed.url":"Adresse du flux","rss-widget.widget.channel.refresh":"Rafraîchir","rss-widget.widget.channel.undefined":"Aucun flux configuré","rss-widget.widget.channel.feed.title.placeholder":"Saisissez le titre du nouveau flux RSS","rss-widget.widget.channel.feed.url.placeholder":"Saisissez l\'Url du nouveau flux RSS","rss-widget.widget.empty.info":"Ajoutez un flux RSS pour voir vos derniers articles"}')}}]);
1
+ "use strict";(self.webpackChunkode_ngjs_front=self.webpackChunkode_ngjs_front||[]).push([[390],{4643:(e,t,i)=>{i.d(t,{Z:()=>n});const n=' <div class="widget-rss"> <div class="widget-header"> <div class="subtitle"><i18n>rss-widget.widget.title</i18n></div> <div class="widget-options"> <div class="tools"> <a href="#" class="tool tool-option" i18n-title="rss-widget.widget.channel.config" ng-if="ctrl.canAddFeed" ng-click="ctrl.display.edition = true"> <i class="fas fa-cog"></i> </a> </div> <div class="widget-handle" title="Déplacer le widget"><i class="fas fa-grip-vertical" aria-hidden="true"></i></div> </div> </div> <div class="widget-body" dnd-nodrag> <div class="widget-empty-message link" ng-click="ctrl.display.edition = true" ng-if="ctrl.channel===undefined || ctrl.channel.feeds.length === 0"> <i18n>rss-widget.widget.empty.info</i18n> </div> <div class="widget-empty-message link" ng-if="ctrl.channel && ctrl.channel.feeds.length > 0 && ctrl.feeds.length === 0"> <i18n>rss-widget.widget.channel.feed.no.result</i18n> </div> <div class="rss-feed" ng-if="ctrl.feeds !== undefined" ng-repeat="feed in ctrl.feeds track by $index"> <div class="feed-title" ng-click="ctrl.showOrHideFeed($index)">[[feed.title]]</div> <ul class="list" ng-show="ctrl.display.selectedFeed === [[$index]]"> <li class="item link" ng-repeat="item in feed.Items track by $index"> <a href="[[item.link]]" target="_blank" rel="noopener" ng-click="trackEvent($event, {detail:{\'open\':item.link} })"> <div class="title">[[item.title]]</div> <div class="meta">[[ctrl.formatDate(item.pubDate)]]</div> <div class="meta" ng-bind-html="item.description"></div> </a> </li> </ul> </div> </div> </div> <ode-modal visible="ctrl.display.edition" on-close="ctrl.display.edition = false" dnd-nodrag> <ode-modal-title> <i18n ng-if="!ctrl.display.feedEdition">rss-widget.widget.channel.feed.list</i18n> <i18n ng-if="ctrl.display.feedEdition">rss-widget.widget.channel.feed.edit</i18n> </ode-modal-title> <ode-modal-body> <div ng-if="!ctrl.display.feedEdition"> <p ng-if="ctrl.channel.feeds.length === 0"><i18n>rss-widget.widget.channel.undefined</i18n></p> <table class="table table-hover" ng-if="ctrl.channel.feeds.length > 0"> <thead> <tr class="bg-secondary text-light"> <th><i18n>rss-widget.widget.channel.feed.title</i18n></th> <th><i18n>rss-widget.widget.channel.feed.show</i18n></th> <th></th> </tr> </thead> <tbody> <tr class="c-pointer" ng-repeat="feed in ctrl.channel.feeds track by $index" ng-class="{ \'table-active\' : ctrl.display.feedEdition && $index === ctrl.selectedFeedIndex }"> <td ng-click="ctrl.openFeedEdition($index)">[[ctrl.channel.feeds[$index].title]]</td> <td ng-click="ctrl.openFeedEdition($index)">[[ctrl.channel.feeds[$index].show]]</td> <td ng-click="ctrl.removeFeed($index)"> <button type="button" class="btn-close" aria-label="Close"></button> </td> </tr> </tbody> </table> </div> <form autocomplete="off" id="formFeedEdition" ng-if="ctrl.display.feedEdition"> <div class="form-group row"> <label for="inputFeedTitle" class="col-sm-4 col-form-label"><i18n>rss-widget.widget.channel.feed.title</i18n></label> <div class="col-sm-8"> <input type="text" i18n-placeholder="rss-widget.widget.channel.feed.title.placeholder" id="inputFeedTitle" class="form-control" ng-model="ctrl.selectedFeed.title"/> </div> </div> <div class="form-group row mt-3"> <label for="inputFeedUrl" class="col-sm-4 col-form-label"><i18n>rss-widget.widget.channel.feed.url</i18n></label> <div class="col-sm-8"> <input type="text" i18n-placeholder="rss-widget.widget.channel.feed.url.placeholder" id="inputFeedUrl" class="form-control" ng-model="ctrl.selectedFeed.link"/> </div> </div> <div class="form-group row mt-3"> <label for="inputFeedShow" class="col-sm-4 col-form-label"><i18n>rss-widget.widget.channel.feed.show</i18n></label> <div class="col-sm-8"> <select id="inputFeedShow" class="form-control" ng-options="n for n in ctrl.showValues" ng-model="ctrl.selectedFeed.show"></select> </div> </div> </form> </ode-modal-body> <ode-modal-footer> <div ng-if="!ctrl.display.feedEdition && ctrl.canAddFeed"> <button class="btn btn-primary" ng-click="ctrl.openFeedEdition()" translate content="rss-widget.widget.channel.feed.add"></button> </div> <div ng-if="ctrl.display.feedEdition"> <button form="formFeedEdition" type="reset" class="btn btn-light" ng-click="ctrl.closeFeedEdition()"> <i18n>rss-widget.widget.channel.feed.cancel</i18n> </button> <button form="formFeedEdition" type="submit" class="btn btn-primary" ng-click="ctrl.saveFeed()"> <i18n>rss-widget.widget.channel.feed.save</i18n> </button> </div> </ode-modal-footer> </ode-modal>'},7377:function(e,t,i){var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.odeModuleName=void 0;var d=n(i(4202)),l=i(9419),s=function(){function e(){this.channel=void 0,this.feeds=[],this.totalFeeds=10,this.defaultShow=3,this.showValues=[1,2,3,4,5,6,7,8,9,10],this.display={edition:!1,feedEdition:!1,selectedFeed:0}}return e.prototype.initFeeds=function(){var e=this;return void 0===this.channel?(0,l.http)().get("/rss/channels").then(function(t){return t&&t.length>0?e.channel=t[0]:e.channel={feeds:[]},e.loadFeeds(0)}).catch(function(t){console.warn("[widget.rss] failed to initFeeds: ",t),e.channel={feeds:[]}}):this.loadFeeds(0)},e.prototype.loadFeeds=function(e){var t=this;return this.feeds=[],Promise.all(this.channel.feeds.map(function(i){var n=i.title;return null!==i.link&&""!==i.link?(0,l.http)().get("/rss/feed/items?url="+encodeURIComponent(i.link)+"&force="+e).then(function(e){"object"!=typeof e||e.title||(e.title=n),200===e.status&&t.feeds.length<t.totalFeeds&&(void 0!==e.Items&&null!=i.show&&e.Items.length>i.show&&(e.Items=e.Items.slice(0,i.show)),t.feeds.push(e))}).catch(function(e){console.warn("[widget.rss] failed to loadFeeds: ",e)}):Promise.resolve()})).then(function(e){})},Object.defineProperty(e.prototype,"canAddFeed",{get:function(){var e=$(window).width();return this.channel&&this.channel.feeds.length<this.totalFeeds&&("number"!=typeof e||e>=992)},enumerable:!1,configurable:!0}),e.prototype.openFeedEdition=function(e){"number"==typeof e&&e>=0&&e<this.totalFeeds?(this.selectedFeed=d.default.copy(this.channel.feeds[e]),this.selectedFeedIndex=e):(this.selectedFeed={title:"",link:"",show:3},this.selectedFeedIndex=-1),this.display.feedEdition=!0},e.prototype.closeFeedEdition=function(){this.display.feedEdition=!1,this.selectedFeed=void 0,this.selectedFeedIndex=void 0},e.prototype.removeFeed=function(e){"number"==typeof e&&e>=0&&e<this.totalFeeds&&(this.channel.feeds.splice(e,1),this.saveChannel())},e.prototype.validFeed=function(e){return e&&e.title&&""!==e.title.trim()&&e.link&&""!==e.link.trim()},e.prototype.saveFeed=function(){"number"==typeof this.selectedFeedIndex&&this.validFeed(this.selectedFeed)&&this.selectedFeed&&(this.selectedFeedIndex>=0&&this.selectedFeedIndex<this.totalFeeds?this.channel.feeds[this.selectedFeedIndex]=this.selectedFeed:this.channel.feeds.push(this.selectedFeed),this.saveChannel()),this.closeFeedEdition()},e.prototype.saveChannel=function(){this.channel._id?this.editChannel():this.createChannel()},e.prototype.createChannel=function(){var e=this;this.channel?(0,l.http)().postJson("/rss/channel",this.channel).then(function(t){e.channel._id=t._id,e.loadFeeds(0)}):console.log("createChannel : channel is undefined")},e.prototype.editChannel=function(){var e=this;this.channel&&this.channel._id?(0,l.http)().putJson("/rss/channel/"+this.channel._id,{feeds:this.channel.feeds}).then(function(t){e.loadFeeds(0)}):console.log("editChannel : channel is undefined")},e.prototype.showOrHideFeed=function(e){this.display.selectedFeed===e?this.display.selectedFeed=void 0:this.display.selectedFeed=e},e.prototype.formatDate=function(e){return("number"==typeof e?l.L10n.unix(e):l.L10n.moment(e,void 0,"en")).locale("fr").format("dddd DD MMMM YYYY HH:mm")},e}(),o=function(){function e(){this.restrict="E",this.template=i(4643).Z,this.controller=[s],this.controllerAs="ctrl",this.require=["odeRssWidget"]}return e.prototype.link=function(e,t,i,n){var d=n?n[0]:null;d&&(d.initFeeds().then(function(){e.$apply()}),e.trackEvent=function(e,t){var i;void 0===t.bubbles&&(t.bubbles=!0);var n=null;t&&"string"==typeof(null===(i=t.detail)||void 0===i?void 0:i.open)&&(n=new CustomEvent(l.TrackedActionFromWidget.rss,t)),n&&e.currentTarget&&e.currentTarget.dispatchEvent(n)})},e}();(0,l.notif)().onLangReady().promise.then(function(e){(0,l.conf)().Platform.idiom.addKeys(i(2546))}),t.odeModuleName="odeRssWidgetModule",d.default.module(t.odeModuleName,[]).directive("odeRssWidget",function(){return new o})},2546:e=>{e.exports=JSON.parse('{"rss-widget.widget.channel.config":"Configurer","rss-widget.widget.channel.feed.add":"Ajouter un flux","rss-widget.widget.channel.feed.cancel":"Retour","rss-widget.widget.channel.feed.edit":"Edition d\'un flux","rss-widget.widget.channel.feed.list":"Liste des flux","rss-widget.widget.channel.feed.no.result":"Aucun résultat","rss-widget.widget.channel.feed.read.more":"Voir plus","rss-widget.widget.channel.feed.remove":"Supprimer le flux","rss-widget.widget.channel.feed.save":"Enregistrer","rss-widget.widget.channel.feed.show":"Nombre d\'articles à afficher","rss-widget.widget.channel.feed.title":"Titre","rss-widget.widget.channel.feed.title.placeholder":"Saisissez le titre du nouveau flux RSS","rss-widget.widget.channel.feed.update":"Actualiser","rss-widget.widget.channel.feed.url":"Adresse du flux","rss-widget.widget.channel.feed.url.placeholder":"Saisissez l\'Url du nouveau flux RSS","rss-widget.widget.channel.refresh":"Rafraîchir","rss-widget.widget.channel.undefined":"Aucun flux configuré","rss-widget.widget.empty.info":"Ajoutez un flux RSS pour voir vos derniers articles","rss-widget.widget.title":"RSS"}')}}]);
2
2
  //# sourceMappingURL=rss-widget.widget.js.map
@@ -1,2 +1,2 @@
1
- "use strict";(self.webpackChunkode_ngjs_front=self.webpackChunkode_ngjs_front||[]).push([[306],{4257:(e,t,n)=>{n.d(t,{Z:()=>o});const o='<div class="widget-school"> <div class="widget-body"> <div class="widget-school-header" ng-style="ctrl.getWidgetStyle()"> <div class="d-flex align-items-center"> <div class="me-16"> <a href="/userbook/mon-compte" class="avatar-link" i18n-title="navbar.myaccount" ng-click="trackEvent($event, {detail:{\'open\':\'profile\'} })"> <img data-ng-src="[[ctrl.avatar ? ctrl.avatar+\'?thumbnail=48x48\' : \'\']]" alt="{{ctrl.description.displayName}}"/> </a> </div> <div class="flex-grow-1"> <div class="name">{{ctrl.description.displayName}}</div> <div ng-if="!ctrl.hasManySchools" class="school">{{ctrl.selectedSchool.name}}</div> <div ng-if="ctrl.hasManySchools" class="dropdown"> <div class="school-multiple dropdown-toggle" role="button" id="ddSchoolWidgetSchool" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> <a href="" class="text-white">{{ctrl.selectedSchool.name}}</a> </div> <div class="school-choice dropdown-menu" aria-labelledby="ddSchoolWidgetSchool"> <div tabindex="0" role="button" class="dropdown-item" ng-repeat="school in ctrl.description.schools" ng-click="ctrl.onSchoolSelected($index)" ng-keydown="ctrl.onSchoolSelected($index, $event)"> {{school.name}} </div> </div> </div> </div> </div> </div> <div class="btn-group"> <a href="/userbook/annuaire#/search" class="btn btn-secondary rounded-pill" ng-if="ctrl.isStudent" ng-click="trackEvent($event, {detail:{\'open\':\'student.class\'} })" translate content="school-widget.widget.my.classroom"></a> <a ng-href="{{ctrl.getUrlTeachersOfMyClass()}}" class="btn btn-outline-secondary rounded-pill" ng-if="ctrl.isStudent" ng-click="trackEvent($event, {detail:{\'open\':\'student.teachers\'} })" translate content="school-widget.widget.my.team"></a> <a ng-href="{{ctrl.getUrlStudentsOfMyClasses()}}" class="btn btn-secondary rounded-pill" ng-if="ctrl.isTeacher" ng-click="trackEvent($event, {detail:{\'open\':\'teacher.students\'} })" translate content="school-widget.widget.my.classrooms"></a> <a ng-href="{{ctrl.getUrlSchoolTeachers()}}" class="btn btn-outline-secondary rounded-pill" ng-if="ctrl.isTeacher" ng-click="trackEvent($event, {detail:{\'open\':\'teacher.teachers\'} })" translate content="school-widget.widget.school.team"></a> <a ng-href="{{ctrl.getUrlTeachersOfMyChildren()}}" class="btn btn-secondary rounded-pill" ng-if="ctrl.isRelative" ng-click="trackEvent($event, {detail:{\'open\':\'relative.teachers\'} })" translate content="school-widget.widget.school.team"></a> <a ng-href="{{ctrl.getUrlSchoolPersonnels()}}" class="btn btn-outline-secondary rounded-pill" ng-if="ctrl.isRelative" ng-click="trackEvent($event, {detail:{\'open\':\'relative.direction\'} })" translate content="school-widget.widget.school.managers"></a> <a ng-href="{{ctrl.getUrlSchoolPersonnelsAndTeachers()}}" class="btn btn-secondary rounded-pill" ng-if="ctrl.isPersonnel" ng-click="trackEvent($event, {detail:{\'open\':\'personnel.personnels\'} })" translate content="school-widget.widget.school.personnelAndTeachers"></a> <a ng-href="{{ctrl.getUrlStudents()}}" class="btn btn-outline-secondary rounded-pill" ng-if="ctrl.isPersonnel" ng-click="trackEvent($event, {detail:{\'open\':\'personnel.students\'} })" translate content="school-widget.widget.students"></a> </div> </div> </div> '},5623:function(e,t,n){var o=this&&this.__awaiter||function(e,t,n,o){return new(n||(n=Promise))(function(r,s){function l(e){try{c(o.next(e))}catch(e){s(e)}}function i(e){try{c(o.throw(e))}catch(e){s(e)}}function c(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n(function(e){e(t)})).then(l,i)}c((o=o.apply(e,t||[])).next())})},r=this&&this.__generator||function(e,t){var n,o,r,s,l={label:0,sent:function(){if(1&r[0])throw r[1];return r[1]},trys:[],ops:[]};return s={next:i(0),throw:i(1),return:i(2)},"function"==typeof Symbol&&(s[Symbol.iterator]=function(){return this}),s;function i(s){return function(i){return function(s){if(n)throw new TypeError("Generator is already executing.");for(;l;)try{if(n=1,o&&(r=2&s[0]?o.return:s[0]?o.throw||((r=o.return)&&r.call(o),0):o.next)&&!(r=r.call(o,s[1])).done)return r;switch(o=0,r&&(s=[2&s[0],r.value]),s[0]){case 0:case 1:r=s;break;case 4:return l.label++,{value:s[1],done:!1};case 5:l.label++,o=s[1],s=[0];continue;case 7:s=l.ops.pop(),l.trys.pop();continue;default:if(!(r=l.trys,(r=r.length>0&&r[r.length-1])||6!==s[0]&&2!==s[0])){l=0;continue}if(3===s[0]&&(!r||s[1]>r[0]&&s[1]<r[3])){l.label=s[1];break}if(6===s[0]&&l.label<r[1]){l.label=r[1],r=s;break}if(r&&l.label<r[2]){l.label=r[2],l.ops.push(s);break}r[2]&&l.ops.pop(),l.trys.pop();continue}s=t.call(e,l)}catch(e){s=[6,e],o=0}finally{n=r=0}if(5&s[0])throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}([s,i])}}},s=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.odeModuleName=void 0;var l=s(n(4202)),i=n(5262),c=n(9419),a=function(){function e(e){this.themeHelperSvc=e}return Object.defineProperty(e.prototype,"me",{get:function(){return(0,c.session)().user},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"description",{get:function(){return(0,c.session)().description},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"avatar",{get:function(){return(0,c.session)().avatarUrl},enumerable:!1,configurable:!0}),e.prototype.initialize=function(){var e,t;return o(this,void 0,void 0,function(){var n,o,s=this;return r(this,function(r){switch(r.label){case 0:return this._userPref=null===(e=i.WidgetFrameworkFactory.instance().list.find(function(e){return e.platformConf.name===i.WIDGET_NAME.SCHOOL}))||void 0===e?void 0:e.userPref,n=this,[4,this.themeHelperSvc.getBootstrapThemePath()];case 1:return n.themePath=r.sent(),[4,(0,c.notif)().onSessionReady().promise];case 2:return r.sent(),o=0,(null===(t=this._userPref)||void 0===t?void 0:t.schoolId)&&l.default.isArray(this.description.schools)&&(o=this.description.schools.findIndex(function(e){var t;return e.id===(null===(t=s._userPref)||void 0===t?void 0:t.schoolId)}),o<0&&(o=0)),this.setSelectedSchool(o),[2]}})})},e.prototype.getWidgetStyle=function(){return{"background-image":"url("+this.themePath+"/images/widget-3.png)"}},e.prototype.onSchoolSelected=function(e,t){var n;return(!t||"keydown"===t.type&&(13===t.which||32===t.which))&&(this._userPref&&this.setSelectedSchool(e)&&(this._userPref.schoolId=null===(n=this.selectedSchool)||void 0===n?void 0:n.id,i.WidgetFrameworkFactory.instance().saveUserPrefs()),!0)},e.prototype.setSelectedSchool=function(e){return 0<=e&&e<this.description.schools.length&&this.selectedSchool!==this.description.schools[e]&&(this.selectedSchool=this.description.schools[e],!0)},e.prototype.getDefaultUrl=function(){return"/userbook/annuaire#/search"},e.prototype.getUrlTeachersOfMyClass=function(){var e=this.getDefaultUrl();if(this.me.classes&&this.me.classes.length>0){e+="?filters=groups&profile=Teacher";for(var t=0,n=this.me.classes;t<n.length;t++){e+="&class="+n[t]}}return e},e.prototype.getUrlStudentsOfMyClasses=function(){var e=this.getDefaultUrl()+"?filters=groups&profile=Student";this.selectedSchool&&(e+="&structure="+this.selectedSchool.id);for(var t=0,n=this.me.classes;t<n.length;t++){e+="&class="+n[t]}return e},e.prototype.getUrlSchoolTeachers=function(){return this.selectedSchool?"/userbook/annuaire#/search?filters=groups&structure="+this.selectedSchool.id+"&profile=Teacher":this.getDefaultUrl()},e.prototype.getUrlTeachersOfMyChildren=function(){for(var e=this.getDefaultUrl()+"?filters=groups&profile=Teacher",t=0,n=this.me.classes;t<n.length;t++){e+="&class="+n[t]}return e},e.prototype.getUrlSchoolPersonnels=function(){return this.selectedSchool?"/userbook/annuaire#/search?filters=users&structure="+this.selectedSchool.id+"&profile=Personnel":this.getDefaultUrl()},e.prototype.getUrlSchoolPersonnelsAndTeachers=function(){return this.selectedSchool?"/userbook/annuaire#/search?filters=users&structure="+this.selectedSchool.id+"&profile=Personnel&profile=Teacher":this.getDefaultUrl()},e.prototype.getUrlStudents=function(){var e=this.getDefaultUrl()+"?filters=groups&profile=Student";return this.selectedSchool&&(e+="&structure="+this.selectedSchool.id),e},Object.defineProperty(e.prototype,"hasManySchools",{get:function(){return this.description.schools.length>1},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isStudent",{get:function(){return"ELEVE"===this.me.type},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isTeacher",{get:function(){return"ENSEIGNANT"===this.me.type},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isRelative",{get:function(){return"PERSRELELEVE"===this.me.type},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isPersonnel",{get:function(){return"PERSEDUCNAT"===this.me.type},enumerable:!1,configurable:!0}),e}(),d=function(){function e(){this.restrict="E",this.template=n(4257).Z,this.controller=["odeThemeHelperService",a],this.controllerAs="ctrl",this.require=["odeSchoolWidget"]}return e.prototype.link=function(e,t,n,s){return o(this,void 0,void 0,function(){var t;return r(this,function(n){switch(n.label){case 0:return(t=s?s[0]:null)?[4,t.initialize()]:[2];case 1:return n.sent(),e.$apply(),e.trackEvent=function(e,t){var n;void 0===t.bubbles&&(t.bubbles=!0);var o=null;(null===(n=null==t?void 0:t.detail)||void 0===n?void 0:n.open)&&-1!==["student.class","student.teachers","teacher.students","teacher.teachers","relative.teachers","relative.direction","profile"].indexOf(t.detail.open)&&(o=new CustomEvent(c.TrackedActionFromWidget.school,t)),o&&e.currentTarget&&e.currentTarget.dispatchEvent(o)},[2]}})})},e}();(0,c.notif)().onLangReady().promise.then(function(e){(0,c.conf)().Platform.idiom.addKeys(n(3926))}),t.odeModuleName="odeSchoolWidgetModule",l.default.module(t.odeModuleName,[]).directive("odeSchoolWidget",function(){return new d})},3926:e=>{e.exports=JSON.parse('{"school-widget.widget.my.classroom":"Ma classe","school-widget.widget.my.classrooms":"Mes classes","school-widget.widget.my.team":"Mes enseignants","school-widget.widget.school.team":"Équipe enseignante","school-widget.widget.school.managers":"Personnels","school-widget.widget.school.personnelAndTeachers":"Personnels et Enseignants","school-widget.widget.students":"Élèves","school-widget":"Mon réseau"}')}}]);
1
+ "use strict";(self.webpackChunkode_ngjs_front=self.webpackChunkode_ngjs_front||[]).push([[306],{4257:(e,t,n)=>{n.d(t,{Z:()=>o});const o='<div class="widget-school"> <div class="widget-body"> <div class="widget-school-header" ng-style="ctrl.getWidgetStyle()"> <div class="d-flex align-items-center"> <div class="me-16"> <a href="/userbook/mon-compte" class="avatar-link" i18n-title="navbar.myaccount" ng-click="trackEvent($event, {detail:{\'open\':\'profile\'} })"> <img data-ng-src="[[ctrl.avatar ? ctrl.avatar+\'?thumbnail=48x48\' : \'\']]" alt="{{ctrl.description.displayName}}"/> </a> </div> <div class="flex-grow-1"> <div class="name">{{ctrl.description.displayName}}</div> <div ng-if="!ctrl.hasManySchools" class="school">{{ctrl.selectedSchool.name}}</div> <div ng-if="ctrl.hasManySchools" class="dropdown"> <div class="school-multiple dropdown-toggle" role="button" id="ddSchoolWidgetSchool" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> <a href="" class="text-white">{{ctrl.selectedSchool.name}}</a> </div> <div class="school-choice dropdown-menu" aria-labelledby="ddSchoolWidgetSchool"> <div tabindex="0" role="button" class="dropdown-item" ng-repeat="school in ctrl.description.schools" ng-click="ctrl.onSchoolSelected($index)" ng-keydown="ctrl.onSchoolSelected($index, $event)"> {{school.name}} </div> </div> </div> </div> </div> </div> <div class="btn-group"> <a href="/userbook/annuaire#/search" class="btn btn-secondary rounded-pill" ng-if="ctrl.isStudent" ng-click="trackEvent($event, {detail:{\'open\':\'student.class\'} })" translate content="school-widget.widget.my.classroom"></a> <a ng-href="{{ctrl.getUrlTeachersOfMyClass()}}" class="btn btn-outline-secondary rounded-pill" ng-if="ctrl.isStudent" ng-click="trackEvent($event, {detail:{\'open\':\'student.teachers\'} })" translate content="school-widget.widget.my.team"></a> <a ng-href="{{ctrl.getUrlStudentsOfMyClasses()}}" class="btn btn-secondary rounded-pill" ng-if="ctrl.isTeacher" ng-click="trackEvent($event, {detail:{\'open\':\'teacher.students\'} })" translate content="school-widget.widget.my.classrooms"></a> <a ng-href="{{ctrl.getUrlSchoolTeachers()}}" class="btn btn-outline-secondary rounded-pill" ng-if="ctrl.isTeacher" ng-click="trackEvent($event, {detail:{\'open\':\'teacher.teachers\'} })" translate content="school-widget.widget.school.team"></a> <a ng-href="{{ctrl.getUrlTeachersOfMyChildren()}}" class="btn btn-secondary rounded-pill" ng-if="ctrl.isRelative" ng-click="trackEvent($event, {detail:{\'open\':\'relative.teachers\'} })" translate content="school-widget.widget.school.team"></a> <a ng-href="{{ctrl.getUrlSchoolPersonnels()}}" class="btn btn-outline-secondary rounded-pill" ng-if="ctrl.isRelative" ng-click="trackEvent($event, {detail:{\'open\':\'relative.direction\'} })" translate content="school-widget.widget.school.managers"></a> <a ng-href="{{ctrl.getUrlSchoolPersonnelsAndTeachers()}}" class="btn btn-secondary rounded-pill" ng-if="ctrl.isPersonnel" ng-click="trackEvent($event, {detail:{\'open\':\'personnel.personnels\'} })" translate content="school-widget.widget.school.personnelAndTeachers"></a> <a ng-href="{{ctrl.getUrlStudents()}}" class="btn btn-outline-secondary rounded-pill" ng-if="ctrl.isPersonnel" ng-click="trackEvent($event, {detail:{\'open\':\'personnel.students\'} })" translate content="school-widget.widget.students"></a> </div> </div> </div> '},5623:function(e,t,n){var o=this&&this.__awaiter||function(e,t,n,o){return new(n||(n=Promise))(function(r,s){function l(e){try{c(o.next(e))}catch(e){s(e)}}function i(e){try{c(o.throw(e))}catch(e){s(e)}}function c(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n(function(e){e(t)})).then(l,i)}c((o=o.apply(e,t||[])).next())})},r=this&&this.__generator||function(e,t){var n,o,r,s,l={label:0,sent:function(){if(1&r[0])throw r[1];return r[1]},trys:[],ops:[]};return s={next:i(0),throw:i(1),return:i(2)},"function"==typeof Symbol&&(s[Symbol.iterator]=function(){return this}),s;function i(s){return function(i){return function(s){if(n)throw new TypeError("Generator is already executing.");for(;l;)try{if(n=1,o&&(r=2&s[0]?o.return:s[0]?o.throw||((r=o.return)&&r.call(o),0):o.next)&&!(r=r.call(o,s[1])).done)return r;switch(o=0,r&&(s=[2&s[0],r.value]),s[0]){case 0:case 1:r=s;break;case 4:return l.label++,{value:s[1],done:!1};case 5:l.label++,o=s[1],s=[0];continue;case 7:s=l.ops.pop(),l.trys.pop();continue;default:if(!(r=l.trys,(r=r.length>0&&r[r.length-1])||6!==s[0]&&2!==s[0])){l=0;continue}if(3===s[0]&&(!r||s[1]>r[0]&&s[1]<r[3])){l.label=s[1];break}if(6===s[0]&&l.label<r[1]){l.label=r[1],r=s;break}if(r&&l.label<r[2]){l.label=r[2],l.ops.push(s);break}r[2]&&l.ops.pop(),l.trys.pop();continue}s=t.call(e,l)}catch(e){s=[6,e],o=0}finally{n=r=0}if(5&s[0])throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}([s,i])}}},s=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.odeModuleName=void 0;var l=s(n(4202)),i=n(5262),c=n(9419),a=function(){function e(e){this.themeHelperSvc=e}return Object.defineProperty(e.prototype,"me",{get:function(){return(0,c.session)().user},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"description",{get:function(){return(0,c.session)().description},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"avatar",{get:function(){return(0,c.session)().avatarUrl},enumerable:!1,configurable:!0}),e.prototype.initialize=function(){var e,t;return o(this,void 0,void 0,function(){var n,o,s=this;return r(this,function(r){switch(r.label){case 0:return this._userPref=null===(e=i.WidgetFrameworkFactory.instance().list.find(function(e){return e.platformConf.name===i.WIDGET_NAME.SCHOOL}))||void 0===e?void 0:e.userPref,n=this,[4,this.themeHelperSvc.getBootstrapThemePath()];case 1:return n.themePath=r.sent(),[4,(0,c.notif)().onSessionReady().promise];case 2:return r.sent(),o=0,(null===(t=this._userPref)||void 0===t?void 0:t.schoolId)&&l.default.isArray(this.description.schools)&&(o=this.description.schools.findIndex(function(e){var t;return e.id===(null===(t=s._userPref)||void 0===t?void 0:t.schoolId)}),o<0&&(o=0)),this.setSelectedSchool(o),[2]}})})},e.prototype.getWidgetStyle=function(){return{"background-image":"url("+this.themePath+"/images/widget-3.png)"}},e.prototype.onSchoolSelected=function(e,t){var n;return(!t||"keydown"===t.type&&(13===t.which||32===t.which))&&(this._userPref&&this.setSelectedSchool(e)&&(this._userPref.schoolId=null===(n=this.selectedSchool)||void 0===n?void 0:n.id,i.WidgetFrameworkFactory.instance().saveUserPrefs()),!0)},e.prototype.setSelectedSchool=function(e){return 0<=e&&e<this.description.schools.length&&this.selectedSchool!==this.description.schools[e]&&(this.selectedSchool=this.description.schools[e],!0)},e.prototype.getDefaultUrl=function(){return"/userbook/annuaire#/search"},e.prototype.getUrlTeachersOfMyClass=function(){var e=this.getDefaultUrl();if(this.me.classes&&this.me.classes.length>0){e+="?filters=groups&profile=Teacher";for(var t=0,n=this.me.classes;t<n.length;t++){e+="&class="+n[t]}}return e},e.prototype.getUrlStudentsOfMyClasses=function(){var e=this.getDefaultUrl()+"?filters=groups&profile=Student";this.selectedSchool&&(e+="&structure="+this.selectedSchool.id);for(var t=0,n=this.me.classes;t<n.length;t++){e+="&class="+n[t]}return e},e.prototype.getUrlSchoolTeachers=function(){return this.selectedSchool?"/userbook/annuaire#/search?filters=groups&structure="+this.selectedSchool.id+"&profile=Teacher":this.getDefaultUrl()},e.prototype.getUrlTeachersOfMyChildren=function(){for(var e=this.getDefaultUrl()+"?filters=groups&profile=Teacher",t=0,n=this.me.classes;t<n.length;t++){e+="&class="+n[t]}return e},e.prototype.getUrlSchoolPersonnels=function(){return this.selectedSchool?"/userbook/annuaire#/search?filters=users&structure="+this.selectedSchool.id+"&profile=Personnel":this.getDefaultUrl()},e.prototype.getUrlSchoolPersonnelsAndTeachers=function(){return this.selectedSchool?"/userbook/annuaire#/search?filters=users&structure="+this.selectedSchool.id+"&profile=Personnel&profile=Teacher":this.getDefaultUrl()},e.prototype.getUrlStudents=function(){var e=this.getDefaultUrl()+"?filters=groups&profile=Student";return this.selectedSchool&&(e+="&structure="+this.selectedSchool.id),e},Object.defineProperty(e.prototype,"hasManySchools",{get:function(){return this.description.schools.length>1},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isStudent",{get:function(){return"ELEVE"===this.me.type},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isTeacher",{get:function(){return"ENSEIGNANT"===this.me.type},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isRelative",{get:function(){return"PERSRELELEVE"===this.me.type},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isPersonnel",{get:function(){return"PERSEDUCNAT"===this.me.type},enumerable:!1,configurable:!0}),e}(),d=function(){function e(){this.restrict="E",this.template=n(4257).Z,this.controller=["odeThemeHelperService",a],this.controllerAs="ctrl",this.require=["odeSchoolWidget"]}return e.prototype.link=function(e,t,n,s){return o(this,void 0,void 0,function(){var t;return r(this,function(n){switch(n.label){case 0:return(t=s?s[0]:null)?[4,t.initialize()]:[2];case 1:return n.sent(),e.$apply(),e.trackEvent=function(e,t){var n;void 0===t.bubbles&&(t.bubbles=!0);var o=null;(null===(n=null==t?void 0:t.detail)||void 0===n?void 0:n.open)&&-1!==["student.class","student.teachers","teacher.students","teacher.teachers","relative.teachers","relative.direction","profile"].indexOf(t.detail.open)&&(o=new CustomEvent(c.TrackedActionFromWidget.school,t)),o&&e.currentTarget&&e.currentTarget.dispatchEvent(o)},[2]}})})},e}();(0,c.notif)().onLangReady().promise.then(function(e){(0,c.conf)().Platform.idiom.addKeys(n(3926))}),t.odeModuleName="odeSchoolWidgetModule",l.default.module(t.odeModuleName,[]).directive("odeSchoolWidget",function(){return new d})},3926:e=>{e.exports=JSON.parse('{"school-widget":"Mon réseau","school-widget.widget.my.classroom":"Ma classe","school-widget.widget.my.classrooms":"Mes classes","school-widget.widget.my.team":"Mes enseignants","school-widget.widget.school.managers":"Personnels","school-widget.widget.school.personnelAndTeachers":"Personnels et Enseignants","school-widget.widget.school.team":"Équipe enseignante","school-widget.widget.students":"Élèves"}')}}]);
2
2
  //# sourceMappingURL=school-widget.widget.js.map
@@ -1,2 +1,2 @@
1
- "use strict";(self.webpackChunkode_ngjs_front=self.webpackChunkode_ngjs_front||[]).push([[202],{5688:(e,t,o)=>{o.d(t,{Z:()=>a});const a='<style>.screen-time-summary{padding:16px;font-family:Roboto,sans-serif;display:flex;flex-direction:column;gap:12px}.title{padding-bottom:6px;font-size:16px;color:#4a4a4a;font-weight:700;border-bottom:1px solid #e0e0e0}.summary-row{display:flex;gap:12px}.summary-row:nth-of-type(2){margin-top:10px}.summary-block{flex:1;background:#e5f5ff;border-radius:12px;padding:12px;box-shadow:0 1px 3px rgba(0,0,0,.1)}.summary-block .label{font-size:16px;color:#4a4a4a;font-weight:700;margin-bottom:4px}.summary-block .value{font-size:32px;color:#333}.percentage-bar-container{width:100%;height:10px;background-color:#e0e0e0;border-radius:5px;margin-top:5px;display:flex;overflow:hidden}.percentage-bar{height:100%;transition:width .5s ease-in-out;border-radius:5px}.au-college{background-color:#2a9cc8}.hors-college{background-color:#ecbe30}.legend{display:flex;gap:16px;align-items:center;margin-top:10px;font-size:10px;color:#333}.legend-item{display:flex;align-items:center;gap:6px}.legend-square{width:16px;height:16px;border-radius:4px}.legend-au-college{background-color:#2a9cc8}.legend-hors-college{background-color:#ecbe30}.custom-select{appearance:none;border:none;padding:8px 32px 8px 12px;border-radius:6px;font-size:16px;color:#333;font-family:Roboto,sans-serif;background:#fff url("data:image/svg+xml,%3Csvg fill=\'none\' stroke=\'%23666\' stroke-width=\'2\' viewBox=\'0 0 24 24\' xmlns=\'http://www.w3.org/2000/svg\'%3E%3Cpath stroke-linecap=\'round\' stroke-linejoin=\'round\' d=\'M19 9l-7 7-7-7\'%3E%3C/path%3E%3C/svg%3E") no-repeat right 10px center;background-size:16px;cursor:pointer;min-width:150px}.custom-select:focus{outline:0;box-shadow:0 0 0 2px rgba(42,156,200,.3)}.see-more{display:flex;justify-content:flex-end;margin-top:8px;padding-left:4px}.see-more button{background-color:transparent;border:none;font-family:Roboto,sans-serif;font-weight:600;font-size:16px;line-height:24px;padding:6px 12px;cursor:pointer;color:#2a9cc8;border-radius:4px;transition:background-color .2s ease}.see-more button:hover{background-color:#f0f8fc}.centered-controls{margin:0 auto 20px auto;width:fit-content;text-align:center}.close-button-container{display:flex;justify-content:flex-end;margin-top:20px}.close-button{width:84px;height:40px;padding:8px 16px;background:#ff8d2e;color:#fff;font-size:16px;font-weight:700;border:none;border-radius:8px;cursor:pointer;transition:background .3s ease}.close-button:hover{background:#e67c24}.date-controls{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.nav-button{background:0 0;border:none;font-size:24px;cursor:pointer}.date-navigation{display:flex;align-items:center;justify-content:center;gap:1rem}.date-navigation button{background:0 0;border:none;font-size:1.5rem;cursor:pointer}.selected-date{cursor:pointer;font-weight:700}.error-message{background-color:#ffe5e5;color:#c00;border:1px solid #c00;padding:12px;border-radius:6px;font-size:14px;font-weight:500}</style> <div class="screen-time-widget-container"> <div class="screen-time-summary"> <div class="title"> <div class="label">TEMPS D\'ÉCRAN</div> </div> <div ng-if="ctrl.isParent"> <select id="userSelect" class="custom-select" ng-model="ctrl.selectedUser" ng-options="child.userId as child.name for child in ctrl.children" ng-change="ctrl.fetchDataForCurrentUser()"> </select> </div> <div class="error-message" ng-if="ctrl.errorMessage"> {{ ctrl.errorMessage }} </div> <div ng-if="!ctrl.errorMessage"> <div class="summary-row"> <div class="summary-block"> <div class="label">Aujourd\'hui</div> <div class="value">{{ ctrl.todayTotal | duration }}</div> <div class="percentage-bar-container"> <div class="percentage-bar au-college" ng-style="{ width: ctrl.todaySchoolUsePercentage + \'%\' }" title="{{ ctrl.todaySchoolUsePercentage | duration }} au collège"> </div> <div class="percentage-bar hors-college" ng-style="{ width: ctrl.todayOutOfSchoolPercentage + \'%\' }" title="{{ ctrl.todayOutOfSchoolPercentage | duration }} hors collège"></div> </div> </div> </div> <div class="summary-row"> <div class="summary-block"> <div class="label">Moyenne de la semaine</div> <div class="value">{{ ctrl.weeklyTotalAverage | duration }}</div> <div class="percentage-bar-container"> <div class="percentage-bar au-college" ng-style="{ width: ctrl.weeklyAvgSchoolUsePercentage + \'%\' }" title="{{ ctrl.weeklyAvgSchoolUsePercentage | duration }} au Collège"> </div> <div class="percentage-bar hors-college" ng-style="{ width: ctrl.weeklyAvgOutOfSchoolPercentage + \'%\' }" title="{{ ctrl.weeklyAvgOutOfSchoolPercentage | duration}} hors collège"></div> </div> </div> </div> <div class="legend"> <div class="legend-item"> <div class="legend-square legend-au-college"></div> <span>Au collège</span> </div> <div class="legend-item"> <div class="legend-square legend-hors-college"></div> <span>Hors collège</span> </div> <div class="see-more"> <button ng-click="ctrl.toggleLightbox(true)">Voir le détail</button> </div> </div> </div> </div> <ode-modal visible="ctrl.showLightbox" on-close="ctrl.toggleLightbox(false)" size="lg" dnd-nodrag> <ode-modal-title> <h2>Temps d\'écran</h2> </ode-modal-title> <ode-modal-body> <div class="centered-controls"> <label style="font-size:14px" for="userSelect">Utilisateur :</label> <div ng-if="ctrl.isParent"> <select id="userSelect" class="custom-select" ng-model="ctrl.selectedChildHistogram" ng-options="child.userId as child.name for child in ctrl.children"> </select> </div> <label for="viewMode">Affichage :</label> <select id="viewMode" class="custom-select" ng-model="ctrl.viewMode" ng-change="ctrl.updateChart()"> <option value="weekly">Hebdomadaire</option> <option value="daily">Quotidien</option> </select> </div> <canvas id="myChart" style="width:100%;height:200px"></canvas> <div class="date-selectors centered-controls" ng-if="ctrl.showLightbox"> <div class="date-navigation" ng-if="ctrl.viewMode === \'daily\'"> <button ng-click="ctrl.changeDay(-1)">←</button> <div ng-if="!ctrl.showDatePicker" class="selected-date" ng-click="ctrl.toggleDatePicker(true)"> {{ ctrl.selectedDailyDateObj | date:\'fullDate\' }} </div> <input type="date" ng-if="ctrl.showDatePicker" ng-model="ctrl.selectedDailyDate" ng-change="ctrl.setDateFromPicker(ctrl.selectedDailyDate)" ng-blur="ctrl.toggleDatePicker(false)" max="{{ ctrl.selectedDailyDate }}"/> <button ng-click="ctrl.changeDay(1)">→</button> </div> <div class="date-navigation" ng-if="ctrl.viewMode === \'weekly\'"> <button ng-click="ctrl.changeWeek(-1)">←</button> <div class="selected-date">{{ ctrl.weekLabel }}</div> <button ng-click="ctrl.changeWeek(1)">→</button> </div> </div> <div class="close-button-container"> <button class="close-button" ng-click="ctrl.toggleLightbox(false)">Fermer</button> </div> </ode-modal-body> </ode-modal> </div>'},58:function(e,t,o){var a=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.odeModuleName=t.Controller=void 0;var r=a(o(4202)),i=o(9419),s=o(5668),l=a(o(381));o(4470),s.Chart.register.apply(s.Chart,s.registerables),l.default.locale("fr");var n=function(){function e(){this.selectedUser="",this.viewMode="weekly",this.userData={},this.selectedDailyDate=(0,l.default)().format("YYYY-MM-DD"),this.weekStart=(0,l.default)().startOf("isoWeek"),this.weekEnd=(0,l.default)().endOf("isoWeek"),this.updateChart=function(){},this.todayOnCampus=0,this.todayOffCampus=0,this.todayTotal=0,this.todaySchoolUsePercentage=0,this.todayOutOfSchoolPercentage=0,this.weeklyAvgOnCampus=0,this.weeklyAvgOffCampus=0,this.weeklyTotalAverage=0,this.weeklyAvgSchoolUsePercentage=0,this.weeklyAvgOutOfSchoolPercentage=0,this.fixedTodayOnCampus=0,this.fixedTodayOffCampus=0,this.fixedTodayTotal=0,this.fixedTodaySchoolUsePercentage=0,this.fixedTodayOutOfSchoolPercentage=0,this.fixedWeeklyAvgOnCampus=0,this.fixedWeeklyAvgOffCampus=0,this.fixedWeeklyTotalAverage=0,this.fixedWeeklyAvgSchoolUsePercentage=0,this.fixedWeeklyAvgOutOfSchoolPercentage=0,this.customWeekMode=!1,this.customStartDate="",this.customEndDate="",this.isParent=!1,this.hasError=!1,this.errorMessage="",this.fetchDataForCurrentUser=function(){},this.fetchLightboxData=function(){},this.showLightbox=!1,this.showDatePicker=!1,this.children=[],this.selectedChild=null,this.selectedChildHistogram=""}return e.prototype.toggleDatePicker=function(e){this.showDatePicker=e},e.prototype.setDateFromPicker=function(e){this.selectedDailyDate=(0,l.default)(e).format("YYYY-MM-DD"),this.showDatePicker=!1,this.fetchLightboxData()},e.prototype.toggleLightbox=function(e){this.showLightbox=e,e&&(this.fixedTodayOnCampus=this.todayOnCampus,this.fixedTodayOffCampus=this.todayOffCampus,this.fixedTodayTotal=this.todayTotal,this.fixedTodaySchoolUsePercentage=this.todaySchoolUsePercentage,this.fixedTodayOutOfSchoolPercentage=this.todayOutOfSchoolPercentage,this.fixedWeeklyAvgOnCampus=this.weeklyAvgOnCampus,this.fixedWeeklyAvgOffCampus=this.weeklyAvgOffCampus,this.fixedWeeklyTotalAverage=this.weeklyTotalAverage,this.fixedWeeklyAvgSchoolUsePercentage=this.weeklyAvgSchoolUsePercentage,this.fixedWeeklyAvgOutOfSchoolPercentage=this.weeklyAvgOutOfSchoolPercentage,this.selectedDailyDate=(0,l.default)().format("YYYY-MM-DD"),this.weekStart=(0,l.default)().startOf("isoWeek"),this.weekEnd=(0,l.default)().endOf("isoWeek"),this.selectedChildHistogram=this.selectedUser)},e.prototype.changeDay=function(e){this.selectedDailyDate=(0,l.default)(this.selectedDailyDate).add(e,"days").format("YYYY-MM-DD"),this.fetchLightboxData()},e.prototype.changeWeek=function(e){this.weekStart=this.weekStart.clone().add(e,"weeks"),this.weekEnd=this.weekStart.clone().endOf("isoWeek"),this.fetchLightboxData()},Object.defineProperty(e.prototype,"selectedDailyDateObj",{get:function(){return new Date(this.selectedDailyDate)},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"weekLabel",{get:function(){var e=this.weekStart.format("dddd D MMMM"),t=this.weekEnd.format("dddd D MMMM");return"du ".concat(e," au ").concat(t)},enumerable:!1,configurable:!0}),e}();function c(e,t,o,a,r,i){t.children=d(t);var s="/appregistry/screen-time/".concat(o,"/weekly?startDate=").concat(r,"&endDate=").concat(i,"&mock=false"),l="/appregistry/screen-time/".concat(o,"/daily?date=").concat(a,"&mock=false");return Promise.all([e.get(s),e.get(l)]).then(function(e){var o=e[0],a=e[1];return console.log("weekly: ",o.data),console.log("daily: ",a.data),t.hasError=!1,t.errorMessage="",{weekly:o.data.dailySummaries.reduce(function(e,t){return e[t.date]={duration:t.durationMinutes,schoolUsePercentage:t.schoolUsePercentage/100},e},{}),daily:a.data.durations.map(function(e){return{hour:e.hour,duration:e.durationMinutes,schoolUsePercentage:e.schoolUsePercentage/100}})}}).catch(function(e){return t.hasError=!0,404===(null==e?void 0:e.status)?t.errorMessage="Erreur lors de l’identification de l’utilisateur. Contactez l’administrateur de votre établissement.":t.errorMessage="Un problème technique est survenu. Si le problème persiste contactez l’administrateur de votre établissement.",console.error("Error fetching data for current user and dates:",e),Promise.reject(e)})}function d(e){var t=(0,i.session)().user.children;e.isParent=!1;if(t&&Object.keys(t).length>0){e.isParent=!0;var o=100;return Object.entries(t).map(function(e){var t=e[0],a=e[1],r=(o++).toString();return{id:t,name:"".concat(a.firstName," ").concat(a.lastName),userId:r}})}return[]}t.Controller=n;var u=function(){function e(){this.restrict="E",this.template=o(5688).Z,this.scope={},this.bindToController=!0,this.controller=[n],this.controllerAs="ctrl",this.require=["odeScreenTimeWidget"]}return e.prototype.link=function(e,t,o,a){var n=a?a[0]:null;if(n){var u=r.default.injector(["ng"]).get("$http"),h=(0,i.session)().user.userId;n.fetchDataForCurrentUser();var g=null,f=function(e,t,o,a){return"".concat(e,"_daily_").concat(t,"_weekly_").concat(o,"_").concat(a)};n.fetchDataForCurrentUser=function(){n.errorMessage="",n.hasError=!1;var t=f(n.selectedUser,(0,l.default)().format("YYYY-MM-DD"),(0,l.default)().startOf("isoWeek").format("YYYY-MM-DD"),(0,l.default)().endOf("isoWeek").format("YYYY-MM-DD"));c(u,n,n.selectedUser,(0,l.default)().format("YYYY-MM-DD"),(0,l.default)().startOf("isoWeek").format("YYYY-MM-DD"),(0,l.default)().endOf("isoWeek").format("YYYY-MM-DD")).then(function(o){var a,r,i,s,c,d,u,h,g,f;n.userData[t]={weekly:o.weekly,daily:o.daily},a=o.weekly,r=0,i=0,s=0,c=(0,l.default)().format("YYYY-MM-DD"),d=0,u=0,h=0,g=0,f=0,Object.keys(a).forEach(function(e){var t=a[e],o=t.duration||0,p=t.schoolUsePercentage||0,y=o*p,m=o*(1-p);r+=y,i+=m,s++,h+=y,g+=m,f+=o,(0,l.default)(e).format("YYYY-MM-DD")===c&&(d=y,u=m,n.todaySchoolUsePercentage=100*t.schoolUsePercentage,n.todayOutOfSchoolPercentage=100-100*t.schoolUsePercentage)}),n.todayOnCampus=d,n.todayOffCampus=u,n.todayTotal=d+u,n.weeklyAvgOnCampus=s>0?r/s:0,n.weeklyAvgOffCampus=s>0?i/s:0,n.weeklyTotalAverage=n.weeklyAvgOnCampus+n.weeklyAvgOffCampus,f>0?(n.weeklyAvgSchoolUsePercentage=h/f*100,n.weeklyAvgOutOfSchoolPercentage=g/f*100):(n.weeklyAvgSchoolUsePercentage=0,n.weeklyAvgOutOfSchoolPercentage=0),e.$applyAsync()}).catch(function(t){e.$applyAsync(),console.error("Error fetching initial data for current user:",t)})},n.fetchLightboxData=function(){var t=n.selectedChildHistogram||n.selectedUser;if(t){var o=f(t,n.selectedDailyDate,n.weekStart.format("YYYY-MM-DD"),n.weekEnd.format("YYYY-MM-DD"));c(u,n,t,n.selectedDailyDate,n.weekStart.format("YYYY-MM-DD"),n.weekEnd.format("YYYY-MM-DD")).then(function(t){n.userData[o]={weekly:t.weekly,daily:t.daily},n.showLightbox&&setTimeout(function(){return n.updateChart()},50),e.$applyAsync()}).catch(function(e){console.error("Error fetching data for lightbox:",e)})}},n.updateChart=function(){var e=t[0].querySelector("#myChart");if(e){var o=e.getContext("2d");if(o){g&&g.destroy();var a=[],r=[],i=[],c=n.selectedChildHistogram||n.selectedUser,d=f(c,n.selectedDailyDate,n.weekStart.format("YYYY-MM-DD"),n.weekEnd.format("YYYY-MM-DD")),u=n.userData[d];if(u){var h="weekly"===n.viewMode?u.weekly:u.daily;if(h){if("weekly"===n.viewMode)Object.keys(h).sort().forEach(function(e){var t=h[e];a.push((0,l.default)(e).format("ddd D")),r.push(t.duration*t.schoolUsePercentage),i.push(t.duration*(1-t.schoolUsePercentage))});else h.forEach(function(e){a.push("".concat(e.hour,"h")),r.push(e.duration*e.schoolUsePercentage),i.push(e.duration*(1-e.schoolUsePercentage))});g=new s.Chart(o,{type:"bar",data:{labels:a,datasets:[{label:"Usage scolaire",data:r,backgroundColor:"#2A9CC8"},{label:"Usage hors scolaire",data:i,backgroundColor:"#ECBE30"}]},options:{plugins:{tooltip:{callbacks:{label:function(e){var t=e.raw;return"".concat(e.dataset.label,": ").concat(t," minutes")}}}},responsive:!0,scales:{x:{stacked:!0},y:{stacked:!0,beginAtZero:!0,title:{display:!0,text:"Minutes"}}}}})}}}}},n.children=d(n),n.isParent&&n.children.length>0?(n.selectedUser||(n.selectedUser=n.children[0].userId),n.fetchDataForCurrentUser()):!n.isParent&&h?(n.selectedUser=h,n.fetchDataForCurrentUser()):(n.hasError=!0,n.errorMessage="Aucun utilisateur disponible pour afficher les données de temps d'écran.",e.$applyAsync()),e.$watch(function(){return n.viewMode},function(e,t){e!==t&&n.showLightbox&&setTimeout(function(){return n.updateChart()},50)}),e.$watch(function(){return n.selectedChildHistogram},function(e,t){e!==t&&n.showLightbox&&n.fetchLightboxData()}),e.$watch(function(){return n.showLightbox},function(e){e?(n.selectedChildHistogram=n.selectedUser,setTimeout(function(){n.updateChart()},100)):g&&(g.destroy(),g=null)})}},e}();t.odeModuleName="odeCantineWidgetModule",r.default.module(t.odeModuleName,[]).filter("duration",function(){return function(e){if(isNaN(e)||null===e||e<0)return"0m";var t=Math.floor(e),o=Math.floor(t/60),a=t%60,r="";return o>0&&(r+="".concat(o,"h")),(a>0||0===o&&0===t)&&(r+="".concat(a,"m")),r.trim()||"0m"}}).directive("odeScreenTimeWidget",function(){return new u}),(0,i.notif)().onLangReady().promise.then(function(e){(0,i.conf)().Platform.idiom.addKeys(o(1245))})},1245:e=>{e.exports={}}}]);
1
+ "use strict";(self.webpackChunkode_ngjs_front=self.webpackChunkode_ngjs_front||[]).push([[202],{5688:(e,t,a)=>{a.d(t,{Z:()=>o});const o='<style>.screen-time-summary{padding:16px;font-family:Roboto,sans-serif;display:flex;flex-direction:column;gap:12px}.title{padding-bottom:6px;font-size:16px;color:#4a4a4a;font-weight:700;border-bottom:1px solid #e0e0e0}.summary-row{display:flex;gap:12px}.summary-row:nth-of-type(2){margin-top:10px}.summary-block{flex:1;background:#e5f5ff;border-radius:12px;padding:12px;box-shadow:0 1px 3px rgba(0,0,0,.1)}.summary-block .label{font-size:16px;color:#4a4a4a;font-weight:700;margin-bottom:4px}.summary-block .value{font-size:32px;color:#333}.percentage-bar-container{width:100%;height:10px;background-color:#e0e0e0;border-radius:5px;margin-top:5px;display:flex;overflow:hidden}.percentage-bar{height:100%;transition:width .5s ease-in-out;border-radius:5px}.legend{display:flex;gap:16px;align-items:center;margin-top:10px;font-size:10px;color:#333}.legend-item{display:flex;align-items:center;gap:6px}.legend-square{width:16px;height:16px;border-radius:4px}.custom-select{appearance:none;border:none;padding:8px 32px 8px 12px;border-radius:6px;font-size:16px;color:#333;font-family:Roboto,sans-serif;background:#fff url("data:image/svg+xml,%3Csvg fill=\'none\' stroke=\'%23666\' stroke-width=\'2\' viewBox=\'0 0 24 24\' xmlns=\'http://www.w3.org/2000/svg\'%3E%3Cpath stroke-linecap=\'round\' stroke-linejoin=\'round\' d=\'M19 9l-7 7-7-7\'%3E%3C/path%3E%3C/svg%3E") no-repeat right 10px center;background-size:16px;cursor:pointer;min-width:150px}.custom-select:focus{outline:0;box-shadow:0 0 0 2px rgba(42,156,200,.3)}.see-more{display:flex;justify-content:flex-end;margin-top:8px;padding-left:4px}.see-more button{background-color:transparent;border:none;font-family:Roboto,sans-serif;font-weight:600;font-size:16px;line-height:24px;padding:6px 12px;cursor:pointer;color:#2a9cc8;border-radius:4px;transition:background-color .2s ease}.see-more button:hover{background-color:#f0f8fc}.centered-controls{margin:0 auto 20px auto;width:fit-content;text-align:center}.view-controls{display:flex;width:100%;flex-direction:row;justify-content:flex-end;margin-bottom:16px}.control-group{display:flex;align-items:center}.close-button-container{display:flex;justify-content:flex-end;margin-top:20px}.close-button{width:84px;height:40px;padding:8px 16px;background:#ff8d2e;color:#fff;font-size:16px;font-weight:700;border:none;border-radius:8px;cursor:pointer;transition:background .3s ease}.close-button:hover{background:#e67c24}.date-controls{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.nav-button{background:0 0;border:none;font-size:24px;cursor:pointer}.date-navigation{display:flex;align-items:center;justify-content:center;gap:1rem}.date-navigation button{background:0 0;border:none;font-size:1.5rem;cursor:pointer}.date-navigation button:disabled{color:#d3d3d3;cursor:not-allowed}.selected-date{cursor:pointer;font-weight:700}.error-message{background-color:#ffe5e5;color:#c00;border:1px solid #c00;padding:12px;border-radius:6px;font-size:14px;font-weight:500}</style> <div class="screen-time-widget-container"> <div class="screen-time-summary"> <div class="title"> <div class="label"> <i18n>screenTime.title.uppercase</i18n> </div> </div> <div ng-if="ctrl.isParent"> <select id="userSelect" class="custom-select" ng-model="ctrl.selectedUser" ng-options="child.userId as child.name for child in ctrl.children" ng-change="ctrl.fetchDataForCurrentUser()"> </select> </div> <div class="error-message" ng-if="ctrl.errorMessage"> {{ ctrl.errorMessage }} </div> <div ng-if="!ctrl.errorMessage"> <div class="summary-row"> <div class="summary-block"> <div class="label"> <i18n>screenTime.today</i18n> </div> <div class="value">{{ ctrl.todayTotal | duration }}</div> </div> </div> <div class="summary-row"> <div class="summary-block"> <div class="label"> <i18n>screenTime.weekAverage</i18n> </div> <div class="value">{{ ctrl.weeklyTotalAverage | duration }}</div> </div> </div> <div class="legend"> <div class="see-more"> <button ng-click="ctrl.toggleLightbox(true)"> <i18n>screenTime.displayDetails</i18n> </button> </div> </div> </div> </div> <ode-modal visible="ctrl.showLightbox" on-close="ctrl.toggleLightbox(false)" size="lg" dnd-nodrag> <ode-modal-title> <h2> <i18n>screenTime.title.normal</i18n> </h2> </ode-modal-title> <ode-modal-body> <div class="view-controls"> <div class="control-group"> <label style="font-size:14px" for="userSelect"> <i18n>screenTime.user</i18n> :</label> <div ng-if="ctrl.isParent"> <select id="userSelect" class="custom-select" ng-model="ctrl.selectedChildHistogram" ng-options="child.userId as child.name for child in ctrl.children"> </select> </div> </div> <div class="control-group"> <label for="viewMode"> <i18n>screenTime.viewMode</i18n> :</label> <select id="viewMode" class="custom-select" ng-model="ctrl.viewMode" ng-change="ctrl.updateChart()"> <option value="weekly"> <i18n>screenTime.viewMode.weekly</i18n> </option> <option value="daily"> <i18n>screenTime.viewMode.daily</i18n> </option> </select> </div> </div> <canvas id="myChart" style="width:100%;height:500px;max-height:500px"></canvas> <div class="date-selectors centered-controls" ng-if="ctrl.showLightbox"> <div class="date-navigation" ng-if="ctrl.viewMode === \'daily\'"> <button ng-click="ctrl.changeDay(-1)" ng-disabled="!ctrl.canGoToPreviousDay()">←</button> <div ng-if="!ctrl.showDatePicker" class="selected-date" ng-click="ctrl.toggleDatePicker(true)"> {{ ctrl.selectedDailyDateObj | date:\'fullDate\' }} </div> <input type="date" ng-if="ctrl.showDatePicker" ng-model="ctrl.selectedDailyDate" ng-change="ctrl.setDateFromPicker(ctrl.selectedDailyDate)" ng-blur="ctrl.toggleDatePicker(false)" max="{{ ctrl.selectedDailyDate }}"/> <button ng-click="ctrl.changeDay(1)" ng-disabled="!ctrl.canGoToNextDay()">→</button> </div> <div class="date-navigation" ng-if="ctrl.viewMode === \'weekly\'"> <button ng-click="ctrl.changeWeek(-1)" ng-disabled="!ctrl.canGoToPreviousWeek()">←</button> <div class="selected-date">{{ ctrl.weekLabel }}</div> <button ng-click="ctrl.changeWeek(1)" ng-disabled="!ctrl.canGoToNextWeek()">→</button> </div> </div> <div class="close-button-container"> <button class="close-button" ng-click="ctrl.toggleLightbox(false)"> <i18n>screenTime.modal.close</i18n> </button> </div> </ode-modal-body> </ode-modal> </div>'},58:function(e,t,a){var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.odeModuleName=t.Controller=void 0;var r=o(a(4202)),i=a(9419),s=a(5668),n=o(a(381));a(4470),s.Chart.register.apply(s.Chart,s.registerables),n.default.locale("fr");var l=function(){function e(){this.selectedUser="",this.viewMode="weekly",this.userData={},this.selectedDailyDate=(0,n.default)().format("YYYY-MM-DD"),this.weekStart=(0,n.default)().startOf("isoWeek"),this.weekEnd=(0,n.default)().endOf("isoWeek"),this.updateChart=function(){},this.todayOnCampus=0,this.todayOffCampus=0,this.todayTotal=0,this.weeklyAvgOnCampus=0,this.weeklyAvgOffCampus=0,this.weeklyTotalAverage=0,this.weeklyAvgSchoolUsePercentage=0,this.weeklyAvgOutOfSchoolPercentage=0,this.fixedTodayOnCampus=0,this.fixedTodayOffCampus=0,this.fixedTodayTotal=0,this.fixedWeeklyAvgOnCampus=0,this.fixedWeeklyAvgOffCampus=0,this.fixedWeeklyTotalAverage=0,this.fixedWeeklyAvgSchoolUsePercentage=0,this.fixedWeeklyAvgOutOfSchoolPercentage=0,this.customWeekMode=!1,this.customStartDate="",this.customEndDate="",this.isParent=!1,this.hasError=!1,this.errorMessage="",this.fetchDataForCurrentUser=function(){},this.fetchLightboxData=function(){},this.showLightbox=!1,this.showDatePicker=!1,this.children=[],this.selectedChild=null,this.selectedChildHistogram=""}return e.prototype.toggleDatePicker=function(e){this.showDatePicker=e},e.prototype.setDateFromPicker=function(e){var t=(0,n.default)(e).format("YYYY-MM-DD");this.showDatePicker=!1,this.setSelectedDate(t),this.fetchLightboxData()},e.prototype.toggleLightbox=function(e){this.showLightbox=e,e&&(this.fixedTodayOnCampus=this.todayOnCampus,this.fixedTodayOffCampus=this.todayOffCampus,this.fixedTodayTotal=this.todayTotal,this.fixedWeeklyAvgOnCampus=this.weeklyAvgOnCampus,this.fixedWeeklyAvgOffCampus=this.weeklyAvgOffCampus,this.fixedWeeklyTotalAverage=this.weeklyTotalAverage,this.fixedWeeklyAvgSchoolUsePercentage=this.weeklyAvgSchoolUsePercentage,this.fixedWeeklyAvgOutOfSchoolPercentage=this.weeklyAvgOutOfSchoolPercentage,this.selectedDailyDate=(0,n.default)().format("YYYY-MM-DD"),this.weekStart=(0,n.default)().startOf("isoWeek"),this.weekEnd=(0,n.default)().endOf("isoWeek"),this.selectedChildHistogram=this.selectedUser)},e.prototype.getCurrentSchoolYear=function(){var e=(0,n.default)(),t=e.year(),a=e.month()<8?(0,n.default)({year:t-1,month:8,day:1}):(0,n.default)({year:t,month:8,day:1}),o=a.clone().add(1,"year").subtract(1,"day");return{schoolYearStart:a.startOf("day"),schoolYearEnd:o.endOf("day")}},e.prototype.setSelectedDate=function(e){var t=(0,n.default)(e);this.selectedDailyDate=t.format("YYYY-MM-DD"),this.weekStart=t.clone().startOf("isoWeek"),this.weekEnd=t.clone().endOf("isoWeek")},e.prototype.setSelectedWeek=function(e){this.weekStart=e.clone().startOf("isoWeek"),this.weekEnd=this.weekStart.clone().endOf("isoWeek"),this.selectedDailyDate=this.weekStart.format("YYYY-MM-DD")},e.prototype.canGoToPreviousWeek=function(){var e=this.weekStart.clone().subtract(1,"week"),t=this.getCurrentSchoolYear(),a=t.schoolYearStart,o=t.schoolYearEnd;return e.isBetween(a,o)},e.prototype.canGoToNextWeek=function(){var e=this.weekStart.clone().add(1,"week"),t=this.getCurrentSchoolYear(),a=t.schoolYearStart,o=t.schoolYearEnd;return e.isBetween(a,o)},e.prototype.canGoToPreviousDay=function(){var e=(0,n.default)(this.selectedDailyDate).subtract(1,"day"),t=this.getCurrentSchoolYear(),a=t.schoolYearStart,o=t.schoolYearEnd;return e.isBetween(a,o)},e.prototype.canGoToNextDay=function(){var e=(0,n.default)(this.selectedDailyDate).add(1,"day"),t=this.getCurrentSchoolYear(),a=t.schoolYearStart,o=t.schoolYearEnd;return e.isBetween(a,o)},e.prototype.changeDay=function(e){var t=(0,n.default)(this.selectedDailyDate).add(e,"days");this.setSelectedDate(t),this.fetchLightboxData()},e.prototype.changeWeek=function(e){var t=this.weekStart.clone().add(e,"weeks");this.setSelectedWeek(t),this.fetchLightboxData()},Object.defineProperty(e.prototype,"selectedDailyDateObj",{get:function(){return new Date(this.selectedDailyDate)},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"weekLabel",{get:function(){var e=this.weekStart.format("dddd D MMMM"),t=this.weekEnd.format("dddd D MMMM");return"du ".concat(e," au ").concat(t)},enumerable:!1,configurable:!0}),e}();function c(e,t,a,o,r,i){t.children=d(t);var s="/appregistry/screen-time/".concat(a,"/weekly?startDate=").concat(r,"&endDate=").concat(i,"&mock=false"),n="/appregistry/screen-time/".concat(a,"/daily?date=").concat(o,"&mock=false");return Promise.all([e.get(s),e.get(n)]).then(function(e){var a=e[0],o=e[1];return console.log("weekly: ",a.data),console.log("daily: ",o.data),t.hasError=!1,t.errorMessage="",{weekly:a.data.dailySummaries.reduce(function(e,t){return e[t.date]={duration:t.durationMinutes,schoolUsePercentage:t.schoolUsePercentage/100},e},{}),daily:o.data.durations.map(function(e){return{hour:e.hour,duration:e.durationMinutes,schoolUsePercentage:e.schoolUsePercentage/100}})}}).catch(function(e){return t.hasError=!0,404===(null==e?void 0:e.status)?t.errorMessage="Erreur lors de l’identification de l’utilisateur. Contactez l’administrateur de votre établissement.":t.errorMessage="Un problème technique est survenu. Si le problème persiste contactez l’administrateur de votre établissement.",console.error("Error fetching data for current user and dates:",e),Promise.reject(e)})}function d(e){var t=(0,i.session)().user.children;e.isParent=!1;if(t&&Object.keys(t).length>0){e.isParent=!0;var a=100;return Object.entries(t).map(function(e){var t=e[0],o=e[1],r=(a++).toString();return{id:t,name:"".concat(o.firstName," ").concat(o.lastName),userId:r}})}return[]}t.Controller=l;var u=function(){function e(){this.restrict="E",this.template=a(5688).Z,this.scope={},this.bindToController=!0,this.controller=[l],this.controllerAs="ctrl",this.require=["odeScreenTimeWidget"]}return e.prototype.link=function(e,t,a,o){var l=o?o[0]:null;if(l){var u=r.default.injector(["ng"]).get("$http"),f=(0,i.session)().user.userId;l.fetchDataForCurrentUser();var h=null,g=function(e,t,a,o){return"".concat(e,"_daily_").concat(t,"_weekly_").concat(a,"_").concat(o)};l.fetchDataForCurrentUser=function(){l.errorMessage="",l.hasError=!1;var t=g(l.selectedUser,(0,n.default)().format("YYYY-MM-DD"),(0,n.default)().startOf("isoWeek").format("YYYY-MM-DD"),(0,n.default)().endOf("isoWeek").format("YYYY-MM-DD"));c(u,l,l.selectedUser,(0,n.default)().format("YYYY-MM-DD"),(0,n.default)().startOf("isoWeek").format("YYYY-MM-DD"),(0,n.default)().endOf("isoWeek").format("YYYY-MM-DD")).then(function(a){var o,r,i,s,c,d,u,f,h,g;l.userData[t]={weekly:a.weekly,daily:a.daily},o=a.weekly,r=0,i=0,s=0,c=(0,n.default)().format("YYYY-MM-DD"),d=0,u=0,f=0,h=0,g=0,Object.keys(o).forEach(function(e){var t=o[e],a=t.duration||0,l=t.schoolUsePercentage||0,p=a*l,m=a*(1-l);r+=p,i+=m,s++,f+=p,h+=m,g+=a,(0,n.default)(e).format("YYYY-MM-DD")===c&&(d=p,u=m)}),l.todayOnCampus=d,l.todayOffCampus=u,l.todayTotal=d+u,l.weeklyAvgOnCampus=s>0?r/s:0,l.weeklyAvgOffCampus=s>0?i/s:0,l.weeklyTotalAverage=l.weeklyAvgOnCampus+l.weeklyAvgOffCampus,g>0?(l.weeklyAvgSchoolUsePercentage=f/g*100,l.weeklyAvgOutOfSchoolPercentage=h/g*100):(l.weeklyAvgSchoolUsePercentage=0,l.weeklyAvgOutOfSchoolPercentage=0),e.$applyAsync()}).catch(function(t){e.$applyAsync(),console.error("Error fetching initial data for current user:",t)})},l.fetchLightboxData=function(){var t=l.selectedChildHistogram||l.selectedUser;if(t){var a=g(t,l.selectedDailyDate,l.weekStart.format("YYYY-MM-DD"),l.weekEnd.format("YYYY-MM-DD"));c(u,l,t,l.selectedDailyDate,l.weekStart.format("YYYY-MM-DD"),l.weekEnd.format("YYYY-MM-DD")).then(function(t){l.userData[a]={weekly:t.weekly,daily:t.daily},l.showLightbox&&setTimeout(function(){return l.updateChart()},50),e.$applyAsync()}).catch(function(e){console.error("Error fetching data for lightbox:",e)})}},l.updateChart=function(){var e=t[0].querySelector("#myChart");if(e){var a=e.getContext("2d");if(a){var o=[],r=[],i=l.selectedChildHistogram||l.selectedUser,c=g(i,l.selectedDailyDate,l.weekStart.format("YYYY-MM-DD"),l.weekEnd.format("YYYY-MM-DD")),d=l.userData[c];if(d){var u="weekly"===l.viewMode?d.weekly:d.daily;if(u){if("weekly"===l.viewMode)Object.keys(u).sort().forEach(function(e){var t=u[e];o.push((0,n.default)(e).format("ddd D")),r.push(t.duration/60)});else u.forEach(function(e){o.push("".concat(e.hour,"h")),r.push(e.duration)});h?(h.data.labels=o,h.data.datasets[0].data=r,h.update("active")):h=new s.Chart(a,{type:"bar",data:{labels:o,datasets:[{label:"Usage total",data:r,backgroundColor:"#2A9CC8"}]},options:{plugins:{tooltip:{callbacks:{label:function(e){var t=e.raw;return"".concat(e.dataset.label,": ").concat(parseFloat(t).toFixed(1)," heures")}}}},responsive:!0,scales:{x:{stacked:!0},y:{stacked:!0,beginAtZero:!0,title:{display:!0,text:"Heures"}}}}})}}}}},l.children=d(l),l.isParent&&l.children.length>0?(l.selectedUser||(l.selectedUser=l.children[0].userId),l.fetchDataForCurrentUser()):!l.isParent&&f?(l.selectedUser=f,l.fetchDataForCurrentUser()):(l.hasError=!0,l.errorMessage="Aucun utilisateur disponible pour afficher les données de temps d'écran.",e.$applyAsync()),e.$watch(function(){return l.viewMode},function(e,t){e!==t&&l.showLightbox&&setTimeout(function(){return l.updateChart()},50)}),e.$watch(function(){return l.selectedChildHistogram},function(e,t){e!==t&&l.showLightbox&&l.fetchLightboxData()}),e.$watch(function(){return l.showLightbox},function(e){e?(l.selectedChildHistogram=l.selectedUser,setTimeout(function(){l.updateChart()},100)):h&&(h.destroy(),h=null)})}},e}();t.odeModuleName="odeCantineWidgetModule",r.default.module(t.odeModuleName,[]).filter("duration",function(){return function(e){if(isNaN(e)||null===e||e<0)return"0m";var t=Math.floor(e),a=Math.floor(t/60),o=t%60,r="";return a>0&&(r+="".concat(a,"h")),(o>0||0===a&&0===t)&&(r+="".concat(o,"m")),r.trim()||"0m"}}).directive("odeScreenTimeWidget",function(){return new u}),(0,i.notif)().onLangReady().promise.then(function(e){(0,i.conf)().Platform.idiom.addKeys(a(1245))})},1245:e=>{e.exports=JSON.parse('{"screenTime.title.normal":"Temps d\'écran","screenTime.title.uppercase":"TEMPS D\'ÉCRAN","screenTime.today":"Aujourd\'hui","screenTime.weekAverage":"Moyenne de la semaine","screenTime.displayDetails":"Voir le détail","screenTime.user":"Utilisateur","screenTime.viewMode":"Affichage","screenTime.viewMode.weekly":"Hebdomadaire","screenTime.viewMode.daily":"Quotidien","screenTime.modal.close":"Fermer"}')}}]);
2
2
  //# sourceMappingURL=screen-time-widget.widget.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"widgets/screen-time-widget/screen-time-widget.widget.js","mappings":"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","sources":["webpack://ode-ngjs-front/./src/ts/widgets/screen-time-widget/screen-time-widget.widget.html","webpack://ode-ngjs-front/./src/ts/widgets/screen-time-widget/screen-time-widget.widget.ts"],"sourcesContent":["// Module\nvar code = \"<style>.screen-time-summary{padding:16px;font-family:Roboto,sans-serif;display:flex;flex-direction:column;gap:12px}.title{padding-bottom:6px;font-size:16px;color:#4a4a4a;font-weight:700;border-bottom:1px solid #e0e0e0}.summary-row{display:flex;gap:12px}.summary-row:nth-of-type(2){margin-top:10px}.summary-block{flex:1;background:#e5f5ff;border-radius:12px;padding:12px;box-shadow:0 1px 3px rgba(0,0,0,.1)}.summary-block .label{font-size:16px;color:#4a4a4a;font-weight:700;margin-bottom:4px}.summary-block .value{font-size:32px;color:#333}.percentage-bar-container{width:100%;height:10px;background-color:#e0e0e0;border-radius:5px;margin-top:5px;display:flex;overflow:hidden}.percentage-bar{height:100%;transition:width .5s ease-in-out;border-radius:5px}.au-college{background-color:#2a9cc8}.hors-college{background-color:#ecbe30}.legend{display:flex;gap:16px;align-items:center;margin-top:10px;font-size:10px;color:#333}.legend-item{display:flex;align-items:center;gap:6px}.legend-square{width:16px;height:16px;border-radius:4px}.legend-au-college{background-color:#2a9cc8}.legend-hors-college{background-color:#ecbe30}.custom-select{appearance:none;border:none;padding:8px 32px 8px 12px;border-radius:6px;font-size:16px;color:#333;font-family:Roboto,sans-serif;background:#fff url(\\\"data:image/svg+xml,%3Csvg fill='none' stroke='%23666' stroke-width='2' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M19 9l-7 7-7-7'%3E%3C/path%3E%3C/svg%3E\\\") no-repeat right 10px center;background-size:16px;cursor:pointer;min-width:150px}.custom-select:focus{outline:0;box-shadow:0 0 0 2px rgba(42,156,200,.3)}.see-more{display:flex;justify-content:flex-end;margin-top:8px;padding-left:4px}.see-more button{background-color:transparent;border:none;font-family:Roboto,sans-serif;font-weight:600;font-size:16px;line-height:24px;padding:6px 12px;cursor:pointer;color:#2a9cc8;border-radius:4px;transition:background-color .2s ease}.see-more button:hover{background-color:#f0f8fc}.centered-controls{margin:0 auto 20px auto;width:fit-content;text-align:center}.close-button-container{display:flex;justify-content:flex-end;margin-top:20px}.close-button{width:84px;height:40px;padding:8px 16px;background:#ff8d2e;color:#fff;font-size:16px;font-weight:700;border:none;border-radius:8px;cursor:pointer;transition:background .3s ease}.close-button:hover{background:#e67c24}.date-controls{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.nav-button{background:0 0;border:none;font-size:24px;cursor:pointer}.date-navigation{display:flex;align-items:center;justify-content:center;gap:1rem}.date-navigation button{background:0 0;border:none;font-size:1.5rem;cursor:pointer}.selected-date{cursor:pointer;font-weight:700}.error-message{background-color:#ffe5e5;color:#c00;border:1px solid #c00;padding:12px;border-radius:6px;font-size:14px;font-weight:500}</style> <div class=\\\"screen-time-widget-container\\\"> <div class=\\\"screen-time-summary\\\"> <div class=\\\"title\\\"> <div class=\\\"label\\\">TEMPS D'ÉCRAN</div> </div> <div ng-if=\\\"ctrl.isParent\\\"> <select id=\\\"userSelect\\\" class=\\\"custom-select\\\" ng-model=\\\"ctrl.selectedUser\\\" ng-options=\\\"child.userId as child.name for child in ctrl.children\\\" ng-change=\\\"ctrl.fetchDataForCurrentUser()\\\"> </select> </div> <div class=\\\"error-message\\\" ng-if=\\\"ctrl.errorMessage\\\"> {{ ctrl.errorMessage }} </div> <div ng-if=\\\"!ctrl.errorMessage\\\"> <div class=\\\"summary-row\\\"> <div class=\\\"summary-block\\\"> <div class=\\\"label\\\">Aujourd'hui</div> <div class=\\\"value\\\">{{ ctrl.todayTotal | duration }}</div> <div class=\\\"percentage-bar-container\\\"> <div class=\\\"percentage-bar au-college\\\" ng-style=\\\"{ width: ctrl.todaySchoolUsePercentage + '%' }\\\" title=\\\"{{ ctrl.todaySchoolUsePercentage | duration }} au collège\\\"> </div> <div class=\\\"percentage-bar hors-college\\\" ng-style=\\\"{ width: ctrl.todayOutOfSchoolPercentage + '%' }\\\" title=\\\"{{ ctrl.todayOutOfSchoolPercentage | duration }} hors collège\\\"></div> </div> </div> </div> <div class=\\\"summary-row\\\"> <div class=\\\"summary-block\\\"> <div class=\\\"label\\\">Moyenne de la semaine</div> <div class=\\\"value\\\">{{ ctrl.weeklyTotalAverage | duration }}</div> <div class=\\\"percentage-bar-container\\\"> <div class=\\\"percentage-bar au-college\\\" ng-style=\\\"{ width: ctrl.weeklyAvgSchoolUsePercentage + '%' }\\\" title=\\\"{{ ctrl.weeklyAvgSchoolUsePercentage | duration }} au Collège\\\"> </div> <div class=\\\"percentage-bar hors-college\\\" ng-style=\\\"{ width: ctrl.weeklyAvgOutOfSchoolPercentage + '%' }\\\" title=\\\"{{ ctrl.weeklyAvgOutOfSchoolPercentage | duration}} hors collège\\\"></div> </div> </div> </div> <div class=\\\"legend\\\"> <div class=\\\"legend-item\\\"> <div class=\\\"legend-square legend-au-college\\\"></div> <span>Au collège</span> </div> <div class=\\\"legend-item\\\"> <div class=\\\"legend-square legend-hors-college\\\"></div> <span>Hors collège</span> </div> <div class=\\\"see-more\\\"> <button ng-click=\\\"ctrl.toggleLightbox(true)\\\">Voir le détail</button> </div> </div> </div> </div> <ode-modal visible=\\\"ctrl.showLightbox\\\" on-close=\\\"ctrl.toggleLightbox(false)\\\" size=\\\"lg\\\" dnd-nodrag> <ode-modal-title> <h2>Temps d'écran</h2> </ode-modal-title> <ode-modal-body> <div class=\\\"centered-controls\\\"> <label style=\\\"font-size:14px\\\" for=\\\"userSelect\\\">Utilisateur :</label> <div ng-if=\\\"ctrl.isParent\\\"> <select id=\\\"userSelect\\\" class=\\\"custom-select\\\" ng-model=\\\"ctrl.selectedChildHistogram\\\" ng-options=\\\"child.userId as child.name for child in ctrl.children\\\"> </select> </div> <label for=\\\"viewMode\\\">Affichage :</label> <select id=\\\"viewMode\\\" class=\\\"custom-select\\\" ng-model=\\\"ctrl.viewMode\\\" ng-change=\\\"ctrl.updateChart()\\\"> <option value=\\\"weekly\\\">Hebdomadaire</option> <option value=\\\"daily\\\">Quotidien</option> </select> </div> <canvas id=\\\"myChart\\\" style=\\\"width:100%;height:200px\\\"></canvas> <div class=\\\"date-selectors centered-controls\\\" ng-if=\\\"ctrl.showLightbox\\\"> <div class=\\\"date-navigation\\\" ng-if=\\\"ctrl.viewMode === 'daily'\\\"> <button ng-click=\\\"ctrl.changeDay(-1)\\\">←</button> <div ng-if=\\\"!ctrl.showDatePicker\\\" class=\\\"selected-date\\\" ng-click=\\\"ctrl.toggleDatePicker(true)\\\"> {{ ctrl.selectedDailyDateObj | date:'fullDate' }} </div> <input type=\\\"date\\\" ng-if=\\\"ctrl.showDatePicker\\\" ng-model=\\\"ctrl.selectedDailyDate\\\" ng-change=\\\"ctrl.setDateFromPicker(ctrl.selectedDailyDate)\\\" ng-blur=\\\"ctrl.toggleDatePicker(false)\\\" max=\\\"{{ ctrl.selectedDailyDate }}\\\"/> <button ng-click=\\\"ctrl.changeDay(1)\\\">→</button> </div> <div class=\\\"date-navigation\\\" ng-if=\\\"ctrl.viewMode === 'weekly'\\\"> <button ng-click=\\\"ctrl.changeWeek(-1)\\\">←</button> <div class=\\\"selected-date\\\">{{ ctrl.weekLabel }}</div> <button ng-click=\\\"ctrl.changeWeek(1)\\\">→</button> </div> </div> <div class=\\\"close-button-container\\\"> <button class=\\\"close-button\\\" ng-click=\\\"ctrl.toggleLightbox(false)\\\">Fermer</button> </div> </ode-modal-body> </ode-modal> </div>\";\n// Exports\nexport default code;","import angular, { IAttributes, IController, IDirective, IScope, IHttpService } from \"angular\";\nimport { conf, notif, session } from \"../../utils\";\nimport { Chart, registerables } from \"chart.js\";\nimport moment, { Moment } from \"moment\";\nimport 'moment/locale/fr';\n\nChart.register(...registerables);\nmoment.locale('fr');\n\n// Controller\nexport class Controller {\n public selectedUser: string = \"\";\n public viewMode: \"weekly\" | \"daily\" = \"weekly\";\n\n public userData: { [key: string]: { weekly: any, daily: any } } = {};\n public selectedDailyDate: string = moment().format('YYYY-MM-DD');\n public weekStart: Moment = moment().startOf('isoWeek'); // Monday\n public weekEnd: Moment = moment().endOf('isoWeek'); // Sunday\n\n public updateChart: () => void = () => { };\n\n public todayOnCampus = 0;\n public todayOffCampus = 0;\n public todayTotal = 0;\n public todaySchoolUsePercentage: number = 0;\n public todayOutOfSchoolPercentage: number = 0;\n\n public weeklyAvgOnCampus = 0;\n public weeklyAvgOffCampus = 0;\n public weeklyTotalAverage = 0;\n public weeklyAvgSchoolUsePercentage: number = 0;\n public weeklyAvgOutOfSchoolPercentage: number = 0;\n\n // new props\n public fixedTodayOnCampus = 0;\n public fixedTodayOffCampus = 0;\n public fixedTodayTotal = 0;\n public fixedTodaySchoolUsePercentage: number = 0;\n public fixedTodayOutOfSchoolPercentage: number = 0;\n\n public fixedWeeklyAvgOnCampus = 0;\n public fixedWeeklyAvgOffCampus = 0;\n public fixedWeeklyTotalAverage = 0;\n public fixedWeeklyAvgSchoolUsePercentage: number = 0;\n public fixedWeeklyAvgOutOfSchoolPercentage: number = 0;\n\n\n // end of new \n\n public customWeekMode: boolean = false;\n public customStartDate: string = \"\";\n public customEndDate: string = \"\";\n\n public isParent: boolean = false;\n\n public hasError: boolean = false;\n public errorMessage: string = \"\";\n\n public fetchDataForCurrentUser: () => void = () => { };\n public fetchLightboxData: () => void = () => { };\n\n public showLightbox: boolean = false;\n public showDatePicker: boolean = false;\n\n public children: { id: string; name: string; userId: string }[] = [];\n public selectedChild = null;\n public selectedChildHistogram = \"\";\n\n public toggleDatePicker(show: boolean) {\n this.showDatePicker = show;\n }\n\n public setDateFromPicker(date: string) {\n this.selectedDailyDate = moment(date).format('YYYY-MM-DD');\n this.showDatePicker = false;\n this.fetchLightboxData();\n }\n\n public toggleLightbox(show: boolean) {\n this.showLightbox = show;\n if (show) {\n // Store the current summary values when lightbox opens\n this.fixedTodayOnCampus = this.todayOnCampus;\n this.fixedTodayOffCampus = this.todayOffCampus;\n this.fixedTodayTotal = this.todayTotal;\n this.fixedTodaySchoolUsePercentage = this.todaySchoolUsePercentage;\n this.fixedTodayOutOfSchoolPercentage = this.todayOutOfSchoolPercentage;\n this.fixedWeeklyAvgOnCampus = this.weeklyAvgOnCampus;\n this.fixedWeeklyAvgOffCampus = this.weeklyAvgOffCampus;\n this.fixedWeeklyTotalAverage = this.weeklyTotalAverage;\n this.fixedWeeklyAvgSchoolUsePercentage = this.weeklyAvgSchoolUsePercentage;\n this.fixedWeeklyAvgOutOfSchoolPercentage = this.weeklyAvgOutOfSchoolPercentage;\n\n // Initialize lightbox dates to current date/week\n this.selectedDailyDate = moment().format('YYYY-MM-DD');\n this.weekStart = moment().startOf('isoWeek');\n this.weekEnd = moment().endOf('isoWeek');\n this.selectedChildHistogram = this.selectedUser;\n\n }\n }\n\n public changeDay(offset: number) {\n this.selectedDailyDate = moment(this.selectedDailyDate).add(offset, 'days').format('YYYY-MM-DD');\n this.fetchLightboxData();\n }\n\n public changeWeek(offset: number) {\n this.weekStart = this.weekStart.clone().add(offset, 'weeks');\n this.weekEnd = this.weekStart.clone().endOf('isoWeek');\n this.fetchLightboxData();\n }\n\n public get selectedDailyDateObj(): Date {\n return new Date(this.selectedDailyDate);\n }\n\n public get weekLabel(): string {\n const start = this.weekStart.format('dddd D MMMM');\n const end = this.weekEnd.format('dddd D MMMM');\n return `du ${start} au ${end}`;\n }\n}\n\nfunction fetchAllScreenTimeDataForUserAndDates($http: IHttpService, ctrl: Controller, userId: string, dailyDate: string, startDate: string, endDate: string): Promise<{ weekly: any, daily: any }> {\n ctrl.children = fetchChildren(ctrl);\n\n const weeklyEndpoint = `/appregistry/screen-time/${userId}/weekly?startDate=${startDate}&endDate=${endDate}&mock=false`;\n const dailyEndpoint = `/appregistry/screen-time/${userId}/daily?date=${dailyDate}&mock=false`;\n\n return Promise.all([\n $http.get(weeklyEndpoint),\n $http.get(dailyEndpoint)\n ]).then(([weeklyResponse, dailyResponse]: [any, any]) => {\n console.log(\"weekly: \", weeklyResponse.data);\n console.log(\"daily: \", dailyResponse.data);\n ctrl.hasError = false;\n ctrl.errorMessage = \"\";\n return {\n weekly: weeklyResponse.data.dailySummaries.reduce((acc: any, day: any) => {\n acc[day.date] = {\n duration: day.durationMinutes,\n schoolUsePercentage: day.schoolUsePercentage / 100 // convert to ratio\n };\n return acc;\n }, {}),\n daily: dailyResponse.data.durations.map((hour: any) => ({\n hour: hour.hour,\n duration: hour.durationMinutes,\n schoolUsePercentage: hour.schoolUsePercentage / 100 // convert to ratio\n }))\n };\n }).catch(error => {\n ctrl.hasError = true;\n\n if (error?.status === 404) {\n ctrl.errorMessage = \"Erreur lors de l’identification de l’utilisateur. Contactez l’administrateur de votre établissement.\";\n } else {\n ctrl.errorMessage = \"Un problème technique est survenu. Si le problème persiste contactez l’administrateur de votre établissement.\";\n }\n\n console.error(\"Error fetching data for current user and dates:\", error);\n return Promise.reject(error);\n });\n}\n\nfunction fetchChildren(ctrl: Controller) {\n const childrenObj = session().user.children;\n ctrl.isParent = false;\n\n const USE_MOCK_IDS = true;\n\n if (childrenObj && Object.keys(childrenObj).length > 0) {\n ctrl.isParent = true;\n\n // Replace userIds with mocked values: 100, 101, 102, ...\n let mockIdCounter = 100;\n\n return Object.entries(childrenObj).map(([userId, childData]) => {\n const child = childData as { firstName: string; lastName: string };\n const mockedId = (mockIdCounter++).toString(); // To remove and use real Id\n return {\n id: userId,\n name: `${child.firstName} ${child.lastName}`,\n userId: USE_MOCK_IDS ? mockedId : userId\n };\n });\n } else {\n return [];\n }\n}\n\nclass Directive implements IDirective<IScope, JQLite, IAttributes, IController[]> {\n restrict = \"E\";\n template = require(\"./screen-time-widget.widget.html\").default;\n scope = {};\n bindToController = true;\n controller = [Controller];\n controllerAs = \"ctrl\";\n require = [\"odeScreenTimeWidget\"];\n\n link(scope: IScope, elem: angular.IAugmentedJQuery, attrs: IAttributes, controllers?: IController[]) {\n const ctrl: Controller | null = controllers ? (controllers[0] as Controller) : null;\n if (!ctrl) return;\n\n const $http = angular.injector([\"ng\"]).get<IHttpService>(\"$http\");\n const currentUserId = session().user.userId;\n\n ctrl.fetchDataForCurrentUser();\n\n let chartInstance: Chart | null = null;\n\n // Function to update the summary values from the pre-fetched weekly data\n const updateSummary = (weeklyData: any) => {\n let totalOnCampus = 0;\n let totalOffCampus = 0;\n let daysCount = 0;\n const today = moment().format(\"YYYY-MM-DD\");\n let todayOnCampusTemp = 0;\n let todayOffCampusTemp = 0;\n\n let weeklyTotalSchoolUseDuration = 0;\n let weeklyTotalOutOfSchoolDuration = 0;\n let weeklyTotalOverallDuration = 0;\n\n Object.keys(weeklyData).forEach(dateStr => {\n const entry = weeklyData[dateStr];\n const duration = entry.duration || 0;\n const schoolUsePct = entry.schoolUsePercentage || 0;\n\n const onCampus = duration * schoolUsePct;\n const offCampus = duration * (1 - schoolUsePct);\n\n totalOnCampus += onCampus;\n totalOffCampus += offCampus;\n daysCount++;\n\n weeklyTotalSchoolUseDuration += onCampus;\n weeklyTotalOutOfSchoolDuration += offCampus;\n weeklyTotalOverallDuration += duration;\n\n if (moment(dateStr).format(\"YYYY-MM-DD\") === today) {\n todayOnCampusTemp = onCampus;\n todayOffCampusTemp = offCampus;\n ctrl.todaySchoolUsePercentage = entry.schoolUsePercentage * 100;\n ctrl.todayOutOfSchoolPercentage = 100 - (entry.schoolUsePercentage * 100);\n }\n });\n\n ctrl.todayOnCampus = todayOnCampusTemp;\n ctrl.todayOffCampus = todayOffCampusTemp;\n ctrl.todayTotal = todayOnCampusTemp + todayOffCampusTemp;\n ctrl.weeklyAvgOnCampus = daysCount > 0 ? totalOnCampus / daysCount : 0;\n ctrl.weeklyAvgOffCampus = daysCount > 0 ? totalOffCampus / daysCount : 0;\n ctrl.weeklyTotalAverage = ctrl.weeklyAvgOnCampus + ctrl.weeklyAvgOffCampus;\n\n if (weeklyTotalOverallDuration > 0) {\n ctrl.weeklyAvgSchoolUsePercentage = (weeklyTotalSchoolUseDuration / weeklyTotalOverallDuration) * 100;\n ctrl.weeklyAvgOutOfSchoolPercentage = (weeklyTotalOutOfSchoolDuration / weeklyTotalOverallDuration) * 100;\n } else {\n ctrl.weeklyAvgSchoolUsePercentage = 0;\n ctrl.weeklyAvgOutOfSchoolPercentage = 0;\n }\n };\n\n // Helper to generate a unique key for caching data based on user and date range\n const generateDataKey = (userId: string, dailyDate: string, startDate: string, endDate: string) => {\n return `${userId}_daily_${dailyDate}_weekly_${startDate}_${endDate}`;\n };\n\n // New function assigned to ctrl.fetchDataForCurrentUser to be called from HTML\n ctrl.fetchDataForCurrentUser = () => {\n ctrl.errorMessage = \"\";\n ctrl.hasError = false;\n const currentKey = generateDataKey(\n ctrl.selectedUser,\n moment().format('YYYY-MM-DD'), // Always use today's date for initial load\n moment().startOf('isoWeek').format('YYYY-MM-DD'),\n moment().endOf('isoWeek').format('YYYY-MM-DD')\n );\n\n // Fetch initial summary data (today and current week)\n fetchAllScreenTimeDataForUserAndDates(\n $http,\n ctrl,\n ctrl.selectedUser,\n moment().format('YYYY-MM-DD'),\n moment().startOf('isoWeek').format('YYYY-MM-DD'),\n moment().endOf('isoWeek').format('YYYY-MM-DD')\n ).then((data) => {\n ctrl.userData[currentKey] = { weekly: data.weekly, daily: data.daily };\n updateSummary(data.weekly); // Update the main summary values\n scope.$applyAsync();\n }).catch(error => {\n scope.$applyAsync();\n console.error(\"Error fetching initial data for current user:\", error);\n });\n };\n\n ctrl.fetchLightboxData = () => {\n\n const userIdForLightbox = ctrl.selectedChildHistogram || ctrl.selectedUser;\n\n if (!userIdForLightbox) return;\n\n const currentKey = generateDataKey(\n userIdForLightbox,\n ctrl.selectedDailyDate,\n ctrl.weekStart.format('YYYY-MM-DD'),\n ctrl.weekEnd.format('YYYY-MM-DD')\n );\n\n fetchAllScreenTimeDataForUserAndDates(\n $http,\n ctrl,\n userIdForLightbox,\n ctrl.selectedDailyDate,\n ctrl.weekStart.format('YYYY-MM-DD'),\n ctrl.weekEnd.format('YYYY-MM-DD')\n ).then((data) => {\n ctrl.userData[currentKey] = { weekly: data.weekly, daily: data.daily };\n if (ctrl.showLightbox) {\n setTimeout(() => ctrl.updateChart(), 50);\n }\n scope.$applyAsync();\n }).catch(error => {\n console.error(\"Error fetching data for lightbox:\", error);\n });\n };\n\n ctrl.updateChart = () => {\n const canvas = elem[0].querySelector<HTMLCanvasElement>(\"#myChart\");\n if (!canvas) return;\n\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return;\n\n if (chartInstance) chartInstance.destroy();\n\n let labels: string[] = [];\n let appTimes: number[] = [];\n let otherTimes: number[] = [];\n\n const userIdForChart = ctrl.selectedChildHistogram || ctrl.selectedUser;\n\n // Use the dates from the lightbox controls for the chart data key\n const currentDataKey = generateDataKey(\n userIdForChart,\n ctrl.selectedDailyDate,\n ctrl.weekStart.format('YYYY-MM-DD'),\n ctrl.weekEnd.format('YYYY-MM-DD')\n );\n const currentUserAndDateData = ctrl.userData[currentDataKey];\n\n if (!currentUserAndDateData) return;\n\n const dataToUse: any = ctrl.viewMode === \"weekly\" ? currentUserAndDateData.weekly : currentUserAndDateData.daily;\n if (!dataToUse) return;\n\n if (ctrl.viewMode === \"weekly\") {\n const sortedDates = Object.keys(dataToUse).sort();\n\n sortedDates.forEach(dateStr => {\n const entry = dataToUse[dateStr];\n labels.push(moment(dateStr).format(\"ddd D\"));\n appTimes.push(entry.duration * entry.schoolUsePercentage);\n otherTimes.push(entry.duration * (1 - entry.schoolUsePercentage));\n });\n } else {\n dataToUse.forEach((hourData: any) => {\n labels.push(`${hourData.hour}h`);\n appTimes.push(hourData.duration * hourData.schoolUsePercentage);\n otherTimes.push(hourData.duration * (1 - hourData.schoolUsePercentage));\n });\n }\n\n chartInstance = new Chart(ctx, {\n type: \"bar\",\n data: {\n labels,\n datasets: [\n {\n label: \"Usage scolaire\",\n data: appTimes,\n backgroundColor: \"#2A9CC8\"\n },\n {\n label: \"Usage hors scolaire\",\n data: otherTimes,\n backgroundColor: \"#ECBE30\"\n }\n ]\n },\n options: {\n plugins: {\n tooltip: {\n callbacks: {\n label: function (context) {\n const value = context.raw;\n return `${context.dataset.label}: ${value} minutes`;\n }\n }\n }\n },\n responsive: true,\n scales: {\n x: {\n stacked: true\n },\n y: {\n stacked: true,\n beginAtZero: true,\n title: {\n display: true,\n text: \"Minutes\"\n }\n }\n }\n }\n });\n };\n\n ctrl.children = fetchChildren(ctrl);\n\n // Determine the user whose data should be fetched on load\n if (ctrl.isParent && ctrl.children.length > 0) {\n // If a parent, and has children, default to the first child if no child is selected yet\n if (!ctrl.selectedUser) {\n ctrl.selectedUser = ctrl.children[0].userId;\n }\n ctrl.fetchDataForCurrentUser();\n } else if (!ctrl.isParent && currentUserId) {\n // If not a parent, and current user ID is available, fetch data for themselves\n ctrl.selectedUser = currentUserId; // Set selectedUser to the current logged-in user's ID\n ctrl.fetchDataForCurrentUser();\n } else {\n // No children AND no current user ID (or other error condition)\n ctrl.hasError = true;\n ctrl.errorMessage = \"Aucun utilisateur disponible pour afficher les données de temps d'écran.\";\n scope.$applyAsync(); // Ensure the error message is displayed\n }\n\n // Watch for changes in view mode (within lightbox): only updates the chart\n scope.$watch(() => ctrl.viewMode, (newVal, oldVal) => {\n if (newVal !== oldVal && ctrl.showLightbox) {\n setTimeout(() => ctrl.updateChart(), 50);\n }\n });\n // Watch for selectedUser changes within the lightbox to update chart data\n scope.$watch(() => ctrl.selectedChildHistogram, (newVal, oldVal) => { // Changed from ctrl.selectedUser\n if (newVal !== oldVal && ctrl.showLightbox) {\n ctrl.fetchLightboxData();\n }\n });\n\n // Watch for lightbox visibility changes\n scope.$watch(() => ctrl.showLightbox, (isVisible: boolean) => {\n if (isVisible) {\n // When lightbox opens:\n // 1. Set selectedChildHistogram. This will trigger the selectedChildHistogram watch,\n // which will then call fetchLightboxData() (the single desired API call).\n ctrl.selectedChildHistogram = ctrl.selectedUser;\n\n // 2. Schedule chart update after a short delay, allowing fetchLightboxData() to begin.\n setTimeout(() => {\n ctrl.updateChart();\n }, 100);\n } else {\n // When lightbox closes\n if (chartInstance) {\n chartInstance.destroy();\n chartInstance = null;\n }\n }\n });\n\n }\n}\n\n// Factory function for the directive\nfunction DirectiveFactory() {\n return new Directive();\n}\n\n// Define the module name\nexport const odeModuleName = \"odeCantineWidgetModule\";\n\n// Angular module definition\nangular\n .module(odeModuleName, [])\n // Define the custom 'duration' filter\n .filter('duration', function () {\n return function (input: number) {\n if (isNaN(input) || input === null || input < 0) {\n return '0m';\n }\n\n const totalMinutes = Math.floor(input);\n const hours = Math.floor(totalMinutes / 60);\n const minutes = totalMinutes % 60;\n\n let result = '';\n\n if (hours > 0) {\n result += `${hours}h`;\n }\n if (minutes > 0 || (hours === 0 && totalMinutes === 0)) {\n result += `${minutes}m`;\n }\n\n return result.trim() || '0m';\n };\n })\n\n // Register the directive\n .directive(\"odeScreenTimeWidget\", DirectiveFactory);\n\n// Internationalization setup\nnotif()\n .onLangReady()\n .promise.then((lang) => {\n switch (lang) {\n default:\n conf().Platform.idiom.addKeys(require(\"./i18n/fr.json\"));\n break;\n }\n });\n"],"names":["Chart","register","registerables","locale","selectedUser","viewMode","userData","selectedDailyDate","format","weekStart","startOf","weekEnd","endOf","updateChart","todayOnCampus","todayOffCampus","todayTotal","todaySchoolUsePercentage","todayOutOfSchoolPercentage","weeklyAvgOnCampus","weeklyAvgOffCampus","weeklyTotalAverage","weeklyAvgSchoolUsePercentage","weeklyAvgOutOfSchoolPercentage","fixedTodayOnCampus","fixedTodayOffCampus","fixedTodayTotal","fixedTodaySchoolUsePercentage","fixedTodayOutOfSchoolPercentage","fixedWeeklyAvgOnCampus","fixedWeeklyAvgOffCampus","fixedWeeklyTotalAverage","fixedWeeklyAvgSchoolUsePercentage","fixedWeeklyAvgOutOfSchoolPercentage","customWeekMode","customStartDate","customEndDate","isParent","hasError","errorMessage","fetchDataForCurrentUser","fetchLightboxData","showLightbox","showDatePicker","children","selectedChild","selectedChildHistogram","toggleDatePicker","show","this","setDateFromPicker","date","toggleLightbox","changeDay","offset","add","changeWeek","clone","Date","start","end","fetchAllScreenTimeDataForUserAndDates","$http","ctrl","userId","dailyDate","startDate","endDate","fetchChildren","weeklyEndpoint","dailyEndpoint","Promise","all","get","then","weeklyResponse","dailyResponse","console","log","data","weekly","dailySummaries","reduce","acc","day","duration","durationMinutes","schoolUsePercentage","daily","durations","map","hour","catch","error","status","reject","childrenObj","session","user","Object","keys","length","entries","child","mockedId","toString","id","name","firstName","lastName","Controller","restrict","template","scope","bindToController","controller","controllerAs","require","link","elem","attrs","controllers","injector","currentUserId","chartInstance","generateDataKey","currentKey","weeklyData","totalOnCampus","totalOffCampus","daysCount","today","todayOnCampusTemp","todayOffCampusTemp","weeklyTotalSchoolUseDuration","weeklyTotalOutOfSchoolDuration","weeklyTotalOverallDuration","forEach","dateStr","entry","schoolUsePct","onCampus","offCampus","$applyAsync","userIdForLightbox","setTimeout","canvas","querySelector","ctx","getContext","destroy","labels","appTimes","otherTimes","userIdForChart","currentDataKey","currentUserAndDateData","dataToUse","sort","push","hourData","type","datasets","label","backgroundColor","options","plugins","tooltip","callbacks","context","value","raw","dataset","responsive","scales","x","stacked","y","beginAtZero","title","display","text","$watch","newVal","oldVal","isVisible","odeModuleName","module","filter","input","isNaN","totalMinutes","Math","floor","hours","minutes","result","trim","directive","Directive","notif","onLangReady","promise","lang","conf","Platform","idiom","addKeys"],"sourceRoot":""}
1
+ {"version":3,"file":"widgets/screen-time-widget/screen-time-widget.widget.js","mappings":"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","sources":["webpack://ode-ngjs-front/./src/ts/widgets/screen-time-widget/screen-time-widget.widget.html","webpack://ode-ngjs-front/./src/ts/widgets/screen-time-widget/screen-time-widget.widget.ts"],"sourcesContent":["// Module\nvar code = \"<style>.screen-time-summary{padding:16px;font-family:Roboto,sans-serif;display:flex;flex-direction:column;gap:12px}.title{padding-bottom:6px;font-size:16px;color:#4a4a4a;font-weight:700;border-bottom:1px solid #e0e0e0}.summary-row{display:flex;gap:12px}.summary-row:nth-of-type(2){margin-top:10px}.summary-block{flex:1;background:#e5f5ff;border-radius:12px;padding:12px;box-shadow:0 1px 3px rgba(0,0,0,.1)}.summary-block .label{font-size:16px;color:#4a4a4a;font-weight:700;margin-bottom:4px}.summary-block .value{font-size:32px;color:#333}.percentage-bar-container{width:100%;height:10px;background-color:#e0e0e0;border-radius:5px;margin-top:5px;display:flex;overflow:hidden}.percentage-bar{height:100%;transition:width .5s ease-in-out;border-radius:5px}.legend{display:flex;gap:16px;align-items:center;margin-top:10px;font-size:10px;color:#333}.legend-item{display:flex;align-items:center;gap:6px}.legend-square{width:16px;height:16px;border-radius:4px}.custom-select{appearance:none;border:none;padding:8px 32px 8px 12px;border-radius:6px;font-size:16px;color:#333;font-family:Roboto,sans-serif;background:#fff url(\\\"data:image/svg+xml,%3Csvg fill='none' stroke='%23666' stroke-width='2' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M19 9l-7 7-7-7'%3E%3C/path%3E%3C/svg%3E\\\") no-repeat right 10px center;background-size:16px;cursor:pointer;min-width:150px}.custom-select:focus{outline:0;box-shadow:0 0 0 2px rgba(42,156,200,.3)}.see-more{display:flex;justify-content:flex-end;margin-top:8px;padding-left:4px}.see-more button{background-color:transparent;border:none;font-family:Roboto,sans-serif;font-weight:600;font-size:16px;line-height:24px;padding:6px 12px;cursor:pointer;color:#2a9cc8;border-radius:4px;transition:background-color .2s ease}.see-more button:hover{background-color:#f0f8fc}.centered-controls{margin:0 auto 20px auto;width:fit-content;text-align:center}.view-controls{display:flex;width:100%;flex-direction:row;justify-content:flex-end;margin-bottom:16px}.control-group{display:flex;align-items:center}.close-button-container{display:flex;justify-content:flex-end;margin-top:20px}.close-button{width:84px;height:40px;padding:8px 16px;background:#ff8d2e;color:#fff;font-size:16px;font-weight:700;border:none;border-radius:8px;cursor:pointer;transition:background .3s ease}.close-button:hover{background:#e67c24}.date-controls{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.nav-button{background:0 0;border:none;font-size:24px;cursor:pointer}.date-navigation{display:flex;align-items:center;justify-content:center;gap:1rem}.date-navigation button{background:0 0;border:none;font-size:1.5rem;cursor:pointer}.date-navigation button:disabled{color:#d3d3d3;cursor:not-allowed}.selected-date{cursor:pointer;font-weight:700}.error-message{background-color:#ffe5e5;color:#c00;border:1px solid #c00;padding:12px;border-radius:6px;font-size:14px;font-weight:500}</style> <div class=\\\"screen-time-widget-container\\\"> <div class=\\\"screen-time-summary\\\"> <div class=\\\"title\\\"> <div class=\\\"label\\\"> <i18n>screenTime.title.uppercase</i18n> </div> </div> <div ng-if=\\\"ctrl.isParent\\\"> <select id=\\\"userSelect\\\" class=\\\"custom-select\\\" ng-model=\\\"ctrl.selectedUser\\\" ng-options=\\\"child.userId as child.name for child in ctrl.children\\\" ng-change=\\\"ctrl.fetchDataForCurrentUser()\\\"> </select> </div> <div class=\\\"error-message\\\" ng-if=\\\"ctrl.errorMessage\\\"> {{ ctrl.errorMessage }} </div> <div ng-if=\\\"!ctrl.errorMessage\\\"> <div class=\\\"summary-row\\\"> <div class=\\\"summary-block\\\"> <div class=\\\"label\\\"> <i18n>screenTime.today</i18n> </div> <div class=\\\"value\\\">{{ ctrl.todayTotal | duration }}</div> </div> </div> <div class=\\\"summary-row\\\"> <div class=\\\"summary-block\\\"> <div class=\\\"label\\\"> <i18n>screenTime.weekAverage</i18n> </div> <div class=\\\"value\\\">{{ ctrl.weeklyTotalAverage | duration }}</div> </div> </div> <div class=\\\"legend\\\"> <div class=\\\"see-more\\\"> <button ng-click=\\\"ctrl.toggleLightbox(true)\\\"> <i18n>screenTime.displayDetails</i18n> </button> </div> </div> </div> </div> <ode-modal visible=\\\"ctrl.showLightbox\\\" on-close=\\\"ctrl.toggleLightbox(false)\\\" size=\\\"lg\\\" dnd-nodrag> <ode-modal-title> <h2> <i18n>screenTime.title.normal</i18n> </h2> </ode-modal-title> <ode-modal-body> <div class=\\\"view-controls\\\"> <div class=\\\"control-group\\\"> <label style=\\\"font-size:14px\\\" for=\\\"userSelect\\\"> <i18n>screenTime.user</i18n> :</label> <div ng-if=\\\"ctrl.isParent\\\"> <select id=\\\"userSelect\\\" class=\\\"custom-select\\\" ng-model=\\\"ctrl.selectedChildHistogram\\\" ng-options=\\\"child.userId as child.name for child in ctrl.children\\\"> </select> </div> </div> <div class=\\\"control-group\\\"> <label for=\\\"viewMode\\\"> <i18n>screenTime.viewMode</i18n> :</label> <select id=\\\"viewMode\\\" class=\\\"custom-select\\\" ng-model=\\\"ctrl.viewMode\\\" ng-change=\\\"ctrl.updateChart()\\\"> <option value=\\\"weekly\\\"> <i18n>screenTime.viewMode.weekly</i18n> </option> <option value=\\\"daily\\\"> <i18n>screenTime.viewMode.daily</i18n> </option> </select> </div> </div> <canvas id=\\\"myChart\\\" style=\\\"width:100%;height:500px;max-height:500px\\\"></canvas> <div class=\\\"date-selectors centered-controls\\\" ng-if=\\\"ctrl.showLightbox\\\"> <div class=\\\"date-navigation\\\" ng-if=\\\"ctrl.viewMode === 'daily'\\\"> <button ng-click=\\\"ctrl.changeDay(-1)\\\" ng-disabled=\\\"!ctrl.canGoToPreviousDay()\\\">←</button> <div ng-if=\\\"!ctrl.showDatePicker\\\" class=\\\"selected-date\\\" ng-click=\\\"ctrl.toggleDatePicker(true)\\\"> {{ ctrl.selectedDailyDateObj | date:'fullDate' }} </div> <input type=\\\"date\\\" ng-if=\\\"ctrl.showDatePicker\\\" ng-model=\\\"ctrl.selectedDailyDate\\\" ng-change=\\\"ctrl.setDateFromPicker(ctrl.selectedDailyDate)\\\" ng-blur=\\\"ctrl.toggleDatePicker(false)\\\" max=\\\"{{ ctrl.selectedDailyDate }}\\\"/> <button ng-click=\\\"ctrl.changeDay(1)\\\" ng-disabled=\\\"!ctrl.canGoToNextDay()\\\">→</button> </div> <div class=\\\"date-navigation\\\" ng-if=\\\"ctrl.viewMode === 'weekly'\\\"> <button ng-click=\\\"ctrl.changeWeek(-1)\\\" ng-disabled=\\\"!ctrl.canGoToPreviousWeek()\\\">←</button> <div class=\\\"selected-date\\\">{{ ctrl.weekLabel }}</div> <button ng-click=\\\"ctrl.changeWeek(1)\\\" ng-disabled=\\\"!ctrl.canGoToNextWeek()\\\">→</button> </div> </div> <div class=\\\"close-button-container\\\"> <button class=\\\"close-button\\\" ng-click=\\\"ctrl.toggleLightbox(false)\\\"> <i18n>screenTime.modal.close</i18n> </button> </div> </ode-modal-body> </ode-modal> </div>\";\n// Exports\nexport default code;","import angular, { IAttributes, IController, IDirective, IScope, IHttpService } from \"angular\";\nimport { conf, notif, session } from \"../../utils\";\nimport { Chart, registerables } from \"chart.js\";\nimport moment, { Moment } from \"moment\";\nimport 'moment/locale/fr';\n\nChart.register(...registerables);\nmoment.locale('fr');\n\n// Controller\nexport class Controller {\n public selectedUser: string = \"\";\n public viewMode: \"weekly\" | \"daily\" = \"weekly\";\n\n public userData: { [key: string]: { weekly: any, daily: any } } = {};\n public selectedDailyDate: string = moment().format('YYYY-MM-DD');\n public weekStart: Moment = moment().startOf('isoWeek'); // Monday\n public weekEnd: Moment = moment().endOf('isoWeek'); // Sunday\n\n public updateChart: () => void = () => { };\n\n public todayOnCampus = 0;\n public todayOffCampus = 0;\n public todayTotal = 0;\n\n public weeklyAvgOnCampus = 0;\n public weeklyAvgOffCampus = 0;\n public weeklyTotalAverage = 0;\n public weeklyAvgSchoolUsePercentage: number = 0;\n public weeklyAvgOutOfSchoolPercentage: number = 0;\n\n // new props\n public fixedTodayOnCampus = 0;\n public fixedTodayOffCampus = 0;\n public fixedTodayTotal = 0;\n\n public fixedWeeklyAvgOnCampus = 0;\n public fixedWeeklyAvgOffCampus = 0;\n public fixedWeeklyTotalAverage = 0;\n public fixedWeeklyAvgSchoolUsePercentage: number = 0;\n public fixedWeeklyAvgOutOfSchoolPercentage: number = 0;\n\n\n // end of new \n\n public customWeekMode: boolean = false;\n public customStartDate: string = \"\";\n public customEndDate: string = \"\";\n\n public isParent: boolean = false;\n\n public hasError: boolean = false;\n public errorMessage: string = \"\";\n\n public fetchDataForCurrentUser: () => void = () => { };\n public fetchLightboxData: () => void = () => { };\n\n public showLightbox: boolean = false;\n public showDatePicker: boolean = false;\n\n public children: { id: string; name: string; userId: string }[] = [];\n public selectedChild = null;\n public selectedChildHistogram = \"\";\n\n public toggleDatePicker(show: boolean) {\n this.showDatePicker = show;\n }\n\n public setDateFromPicker(date: string) {\n const newDate = moment(date).format('YYYY-MM-DD');\n this.showDatePicker = false;\n this.setSelectedDate(newDate);\n this.fetchLightboxData();\n }\n\n public toggleLightbox(show: boolean) {\n this.showLightbox = show;\n if (show) {\n // Store the current summary values when lightbox opens\n this.fixedTodayOnCampus = this.todayOnCampus;\n this.fixedTodayOffCampus = this.todayOffCampus;\n this.fixedTodayTotal = this.todayTotal;\n this.fixedWeeklyAvgOnCampus = this.weeklyAvgOnCampus;\n this.fixedWeeklyAvgOffCampus = this.weeklyAvgOffCampus;\n this.fixedWeeklyTotalAverage = this.weeklyTotalAverage;\n this.fixedWeeklyAvgSchoolUsePercentage = this.weeklyAvgSchoolUsePercentage;\n this.fixedWeeklyAvgOutOfSchoolPercentage = this.weeklyAvgOutOfSchoolPercentage;\n\n // Initialize lightbox dates to current date/week\n this.selectedDailyDate = moment().format('YYYY-MM-DD');\n this.weekStart = moment().startOf('isoWeek');\n this.weekEnd = moment().endOf('isoWeek');\n this.selectedChildHistogram = this.selectedUser;\n\n }\n }\n\n private getCurrentSchoolYear(): { schoolYearStart: moment.Moment, schoolYearEnd: moment.Moment } {\n const today = moment();\n const currentYear = today.year();\n const currentMonth = today.month();\n\n // If current month is less than september, school year is the previous one\n const schoolYearStart = currentMonth < 8\n ? moment({ year: currentYear - 1, month: 8, day: 1 }) // 1st september of previous school year\n : moment({ year: currentYear, month: 8, day: 1 }); // 1st september of current school year\n\n const schoolYearEnd = schoolYearStart\n .clone()\n .add(1, 'year')\n .subtract(1, 'day'); // 31 august of next school year\n\n return {\n schoolYearStart: schoolYearStart.startOf('day'),\n schoolYearEnd: schoolYearEnd.endOf('day'),\n };\n }\n\n private setSelectedDate(date: string | moment.Moment) {\n const momentDate = moment(date);\n\n this.selectedDailyDate = momentDate.format('YYYY-MM-DD');\n\n this.weekStart = momentDate.clone().startOf('isoWeek');\n this.weekEnd = momentDate.clone().endOf('isoWeek');\n }\n\n private setSelectedWeek(weekStart: moment.Moment) {\n this.weekStart = weekStart.clone().startOf('isoWeek');\n this.weekEnd = this.weekStart.clone().endOf('isoWeek');\n\n this.selectedDailyDate = this.weekStart.format('YYYY-MM-DD');\n }\n\n public canGoToPreviousWeek(): boolean {\n const offsetWeekStart = this.weekStart.clone().subtract(1, 'week');\n const { schoolYearStart, schoolYearEnd } = this.getCurrentSchoolYear();\n\n return offsetWeekStart.isBetween(schoolYearStart, schoolYearEnd);\n }\n\n public canGoToNextWeek(): boolean {\n const offsetWeekStart = this.weekStart.clone().add(1, 'week');\n const { schoolYearStart, schoolYearEnd } = this.getCurrentSchoolYear();\n\n return offsetWeekStart.isBetween(schoolYearStart, schoolYearEnd);\n }\n\n public canGoToPreviousDay(): boolean {\n const offsetDayStart = moment(this.selectedDailyDate).subtract(1, 'day');\n const { schoolYearStart, schoolYearEnd } = this.getCurrentSchoolYear();\n\n return offsetDayStart.isBetween(schoolYearStart, schoolYearEnd);\n }\n\n public canGoToNextDay(): boolean {\n const offsetDayStart = moment(this.selectedDailyDate).add(1, 'day');\n const { schoolYearStart, schoolYearEnd } = this.getCurrentSchoolYear();\n\n return offsetDayStart.isBetween(schoolYearStart, schoolYearEnd);\n }\n\n public changeDay(offset: number) {\n const newDate = moment(this.selectedDailyDate).add(offset, 'days');\n this.setSelectedDate(newDate);\n this.fetchLightboxData();\n }\n\n public changeWeek(offset: number) {\n const newWeekStart = this.weekStart.clone().add(offset, 'weeks');\n this.setSelectedWeek(newWeekStart);\n this.fetchLightboxData();\n }\n\n public get selectedDailyDateObj(): Date {\n return new Date(this.selectedDailyDate);\n }\n\n public get weekLabel(): string {\n const start = this.weekStart.format('dddd D MMMM');\n const end = this.weekEnd.format('dddd D MMMM');\n return `du ${start} au ${end}`;\n }\n}\n\nfunction fetchAllScreenTimeDataForUserAndDates($http: IHttpService, ctrl: Controller, userId: string, dailyDate: string, startDate: string, endDate: string): Promise<{ weekly: any, daily: any }> {\n ctrl.children = fetchChildren(ctrl);\n\n const weeklyEndpoint = `/appregistry/screen-time/${userId}/weekly?startDate=${startDate}&endDate=${endDate}&mock=false`;\n const dailyEndpoint = `/appregistry/screen-time/${userId}/daily?date=${dailyDate}&mock=false`;\n\n return Promise.all([\n $http.get(weeklyEndpoint),\n $http.get(dailyEndpoint)\n ]).then(([weeklyResponse, dailyResponse]: [any, any]) => {\n console.log(\"weekly: \", weeklyResponse.data);\n console.log(\"daily: \", dailyResponse.data);\n ctrl.hasError = false;\n ctrl.errorMessage = \"\";\n return {\n weekly: weeklyResponse.data.dailySummaries.reduce((acc: any, day: any) => {\n acc[day.date] = {\n duration: day.durationMinutes,\n schoolUsePercentage: day.schoolUsePercentage / 100 // convert to ratio\n };\n return acc;\n }, {}),\n daily: dailyResponse.data.durations.map((hour: any) => ({\n hour: hour.hour,\n duration: hour.durationMinutes,\n schoolUsePercentage: hour.schoolUsePercentage / 100 // convert to ratio\n }))\n };\n }).catch(error => {\n ctrl.hasError = true;\n\n if (error?.status === 404) {\n ctrl.errorMessage = \"Erreur lors de l’identification de l’utilisateur. Contactez l’administrateur de votre établissement.\";\n } else {\n ctrl.errorMessage = \"Un problème technique est survenu. Si le problème persiste contactez l’administrateur de votre établissement.\";\n }\n\n console.error(\"Error fetching data for current user and dates:\", error);\n return Promise.reject(error);\n });\n}\n\nfunction fetchChildren(ctrl: Controller) {\n const childrenObj = session().user.children;\n ctrl.isParent = false;\n\n const USE_MOCK_IDS = true;\n\n if (childrenObj && Object.keys(childrenObj).length > 0) {\n ctrl.isParent = true;\n\n // Replace userIds with mocked values: 100, 101, 102, ...\n let mockIdCounter = 100;\n\n return Object.entries(childrenObj).map(([userId, childData]) => {\n const child = childData as { firstName: string; lastName: string };\n const mockedId = (mockIdCounter++).toString(); // To remove and use real Id\n return {\n id: userId,\n name: `${child.firstName} ${child.lastName}`,\n userId: USE_MOCK_IDS ? mockedId : userId\n };\n });\n } else {\n return [];\n }\n}\n\nclass Directive implements IDirective<IScope, JQLite, IAttributes, IController[]> {\n restrict = \"E\";\n template = require(\"./screen-time-widget.widget.html\").default;\n scope = {};\n bindToController = true;\n controller = [Controller];\n controllerAs = \"ctrl\";\n require = [\"odeScreenTimeWidget\"];\n\n link(scope: IScope, elem: angular.IAugmentedJQuery, attrs: IAttributes, controllers?: IController[]) {\n const ctrl: Controller | null = controllers ? (controllers[0] as Controller) : null;\n if (!ctrl) return;\n\n const $http = angular.injector([\"ng\"]).get<IHttpService>(\"$http\");\n const currentUserId = session().user.userId;\n\n ctrl.fetchDataForCurrentUser();\n\n let chartInstance: Chart | null = null;\n\n // Function to update the summary values from the pre-fetched weekly data\n const updateSummary = (weeklyData: any) => {\n let totalOnCampus = 0;\n let totalOffCampus = 0;\n let daysCount = 0;\n const today = moment().format(\"YYYY-MM-DD\");\n let todayOnCampusTemp = 0;\n let todayOffCampusTemp = 0;\n\n let weeklyTotalSchoolUseDuration = 0;\n let weeklyTotalOutOfSchoolDuration = 0;\n let weeklyTotalOverallDuration = 0;\n\n Object.keys(weeklyData).forEach(dateStr => {\n const entry = weeklyData[dateStr];\n const duration = entry.duration || 0;\n const schoolUsePct = entry.schoolUsePercentage || 0;\n\n const onCampus = duration * schoolUsePct;\n const offCampus = duration * (1 - schoolUsePct);\n\n totalOnCampus += onCampus;\n totalOffCampus += offCampus;\n daysCount++;\n\n weeklyTotalSchoolUseDuration += onCampus;\n weeklyTotalOutOfSchoolDuration += offCampus;\n weeklyTotalOverallDuration += duration;\n\n if (moment(dateStr).format(\"YYYY-MM-DD\") === today) {\n todayOnCampusTemp = onCampus;\n todayOffCampusTemp = offCampus;\n }\n });\n\n ctrl.todayOnCampus = todayOnCampusTemp;\n ctrl.todayOffCampus = todayOffCampusTemp;\n ctrl.todayTotal = todayOnCampusTemp + todayOffCampusTemp;\n ctrl.weeklyAvgOnCampus = daysCount > 0 ? totalOnCampus / daysCount : 0;\n ctrl.weeklyAvgOffCampus = daysCount > 0 ? totalOffCampus / daysCount : 0;\n ctrl.weeklyTotalAverage = ctrl.weeklyAvgOnCampus + ctrl.weeklyAvgOffCampus;\n\n if (weeklyTotalOverallDuration > 0) {\n ctrl.weeklyAvgSchoolUsePercentage = (weeklyTotalSchoolUseDuration / weeklyTotalOverallDuration) * 100;\n ctrl.weeklyAvgOutOfSchoolPercentage = (weeklyTotalOutOfSchoolDuration / weeklyTotalOverallDuration) * 100;\n } else {\n ctrl.weeklyAvgSchoolUsePercentage = 0;\n ctrl.weeklyAvgOutOfSchoolPercentage = 0;\n }\n };\n\n // Helper to generate a unique key for caching data based on user and date range\n const generateDataKey = (userId: string, dailyDate: string, startDate: string, endDate: string) => {\n return `${userId}_daily_${dailyDate}_weekly_${startDate}_${endDate}`;\n };\n\n // New function assigned to ctrl.fetchDataForCurrentUser to be called from HTML\n ctrl.fetchDataForCurrentUser = () => {\n ctrl.errorMessage = \"\";\n ctrl.hasError = false;\n const currentKey = generateDataKey(\n ctrl.selectedUser,\n moment().format('YYYY-MM-DD'), // Always use today's date for initial load\n moment().startOf('isoWeek').format('YYYY-MM-DD'),\n moment().endOf('isoWeek').format('YYYY-MM-DD')\n );\n\n // Fetch initial summary data (today and current week)\n fetchAllScreenTimeDataForUserAndDates(\n $http,\n ctrl,\n ctrl.selectedUser,\n moment().format('YYYY-MM-DD'),\n moment().startOf('isoWeek').format('YYYY-MM-DD'),\n moment().endOf('isoWeek').format('YYYY-MM-DD')\n ).then((data) => {\n ctrl.userData[currentKey] = { weekly: data.weekly, daily: data.daily };\n updateSummary(data.weekly); // Update the main summary values\n scope.$applyAsync();\n }).catch(error => {\n scope.$applyAsync();\n console.error(\"Error fetching initial data for current user:\", error);\n });\n };\n\n ctrl.fetchLightboxData = () => {\n\n const userIdForLightbox = ctrl.selectedChildHistogram || ctrl.selectedUser;\n\n if (!userIdForLightbox) return;\n\n const currentKey = generateDataKey(\n userIdForLightbox,\n ctrl.selectedDailyDate,\n ctrl.weekStart.format('YYYY-MM-DD'),\n ctrl.weekEnd.format('YYYY-MM-DD')\n );\n\n fetchAllScreenTimeDataForUserAndDates(\n $http,\n ctrl,\n userIdForLightbox,\n ctrl.selectedDailyDate,\n ctrl.weekStart.format('YYYY-MM-DD'),\n ctrl.weekEnd.format('YYYY-MM-DD')\n ).then((data) => {\n ctrl.userData[currentKey] = { weekly: data.weekly, daily: data.daily };\n if (ctrl.showLightbox) {\n setTimeout(() => ctrl.updateChart(), 50);\n }\n scope.$applyAsync();\n }).catch(error => {\n console.error(\"Error fetching data for lightbox:\", error);\n });\n };\n\n ctrl.updateChart = () => {\n const canvas = elem[0].querySelector<HTMLCanvasElement>(\"#myChart\");\n if (!canvas) return;\n\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return;\n\n let labels: string[] = [];\n let totalTimes: number[] = [];\n\n const userIdForChart = ctrl.selectedChildHistogram || ctrl.selectedUser;\n\n // Use the dates from the lightbox controls for the chart data key\n const currentDataKey = generateDataKey(\n userIdForChart,\n ctrl.selectedDailyDate,\n ctrl.weekStart.format('YYYY-MM-DD'),\n ctrl.weekEnd.format('YYYY-MM-DD')\n );\n const currentUserAndDateData = ctrl.userData[currentDataKey];\n\n if (!currentUserAndDateData) return;\n\n const dataToUse: any = ctrl.viewMode === \"weekly\" ? currentUserAndDateData.weekly : currentUserAndDateData.daily;\n if (!dataToUse) return;\n\n if (ctrl.viewMode === \"weekly\") {\n const sortedDates = Object.keys(dataToUse).sort();\n\n sortedDates.forEach(dataStr => {\n const entry = dataToUse[dataStr];\n labels.push(moment(dataStr).format('ddd D'));\n totalTimes.push(entry.duration / 60);\n })\n } else {\n dataToUse.forEach((hourData: any) => {\n labels.push(`${hourData.hour}h`);\n totalTimes.push(hourData.duration);\n });\n }\n\n // If the chart already exists, we simply update it\n if (chartInstance) {\n chartInstance.data.labels = labels;\n chartInstance.data.datasets[0].data = totalTimes;\n chartInstance.update('active');\n } else {\n chartInstance = new Chart(ctx, {\n type: \"bar\",\n data: {\n labels,\n datasets: [\n {\n label: \"Usage total\",\n data: totalTimes,\n backgroundColor: \"#2A9CC8\"\n }\n ]\n },\n options: {\n plugins: {\n tooltip: {\n callbacks: {\n label: function (context) {\n const value = context.raw;\n return `${context.dataset.label}: ${parseFloat(value as string).toFixed(1)} heures`;\n }\n }\n }\n },\n responsive: true,\n scales: {\n x: {\n stacked: true\n },\n y: {\n stacked: true,\n beginAtZero: true,\n title: {\n display: true,\n text: \"Heures\"\n }\n }\n }\n }\n });\n }\n };\n\n ctrl.children = fetchChildren(ctrl);\n\n // Determine the user whose data should be fetched on load\n if (ctrl.isParent && ctrl.children.length > 0) {\n // If a parent, and has children, default to the first child if no child is selected yet\n if (!ctrl.selectedUser) {\n ctrl.selectedUser = ctrl.children[0].userId;\n }\n ctrl.fetchDataForCurrentUser();\n } else if (!ctrl.isParent && currentUserId) {\n // If not a parent, and current user ID is available, fetch data for themselves\n ctrl.selectedUser = currentUserId; // Set selectedUser to the current logged-in user's ID\n ctrl.fetchDataForCurrentUser();\n } else {\n // No children AND no current user ID (or other error condition)\n ctrl.hasError = true;\n ctrl.errorMessage = \"Aucun utilisateur disponible pour afficher les données de temps d'écran.\";\n scope.$applyAsync(); // Ensure the error message is displayed\n }\n\n // Watch for changes in view mode (within lightbox): only updates the chart\n scope.$watch(() => ctrl.viewMode, (newVal, oldVal) => {\n if (newVal !== oldVal && ctrl.showLightbox) {\n setTimeout(() => ctrl.updateChart(), 50);\n }\n });\n // Watch for selectedUser changes within the lightbox to update chart data\n scope.$watch(() => ctrl.selectedChildHistogram, (newVal, oldVal) => { // Changed from ctrl.selectedUser\n if (newVal !== oldVal && ctrl.showLightbox) {\n ctrl.fetchLightboxData();\n }\n });\n\n // Watch for lightbox visibility changes\n scope.$watch(() => ctrl.showLightbox, (isVisible: boolean) => {\n if (isVisible) {\n // When lightbox opens:\n // 1. Set selectedChildHistogram. This will trigger the selectedChildHistogram watch,\n // which will then call fetchLightboxData() (the single desired API call).\n ctrl.selectedChildHistogram = ctrl.selectedUser;\n\n // 2. Schedule chart update after a short delay, allowing fetchLightboxData() to begin.\n setTimeout(() => {\n ctrl.updateChart();\n }, 100);\n } else {\n // When lightbox closes\n if (chartInstance) {\n chartInstance.destroy();\n chartInstance = null;\n }\n }\n });\n\n }\n}\n\n// Factory function for the directive\nfunction DirectiveFactory() {\n return new Directive();\n}\n\n// Define the module name\nexport const odeModuleName = \"odeCantineWidgetModule\";\n\n// Angular module definition\nangular\n .module(odeModuleName, [])\n // Define the custom 'duration' filter\n .filter('duration', function () {\n return function (input: number) {\n if (isNaN(input) || input === null || input < 0) {\n return '0m';\n }\n\n const totalMinutes = Math.floor(input);\n const hours = Math.floor(totalMinutes / 60);\n const minutes = totalMinutes % 60;\n\n let result = '';\n\n if (hours > 0) {\n result += `${hours}h`;\n }\n if (minutes > 0 || (hours === 0 && totalMinutes === 0)) {\n result += `${minutes}m`;\n }\n\n return result.trim() || '0m';\n };\n })\n\n // Register the directive\n .directive(\"odeScreenTimeWidget\", DirectiveFactory);\n\n// Internationalization setup\nnotif()\n .onLangReady()\n .promise.then((lang) => {\n switch (lang) {\n default:\n conf().Platform.idiom.addKeys(require(\"./i18n/fr.json\"));\n break;\n }\n });\n"],"names":["Chart","register","registerables","locale","selectedUser","viewMode","userData","selectedDailyDate","format","weekStart","startOf","weekEnd","endOf","updateChart","todayOnCampus","todayOffCampus","todayTotal","weeklyAvgOnCampus","weeklyAvgOffCampus","weeklyTotalAverage","weeklyAvgSchoolUsePercentage","weeklyAvgOutOfSchoolPercentage","fixedTodayOnCampus","fixedTodayOffCampus","fixedTodayTotal","fixedWeeklyAvgOnCampus","fixedWeeklyAvgOffCampus","fixedWeeklyTotalAverage","fixedWeeklyAvgSchoolUsePercentage","fixedWeeklyAvgOutOfSchoolPercentage","customWeekMode","customStartDate","customEndDate","isParent","hasError","errorMessage","fetchDataForCurrentUser","fetchLightboxData","showLightbox","showDatePicker","children","selectedChild","selectedChildHistogram","toggleDatePicker","show","this","setDateFromPicker","date","newDate","setSelectedDate","toggleLightbox","getCurrentSchoolYear","today","currentYear","year","schoolYearStart","month","day","schoolYearEnd","clone","add","subtract","momentDate","setSelectedWeek","canGoToPreviousWeek","offsetWeekStart","isBetween","canGoToNextWeek","canGoToPreviousDay","offsetDayStart","canGoToNextDay","changeDay","offset","changeWeek","newWeekStart","Date","start","end","fetchAllScreenTimeDataForUserAndDates","$http","ctrl","userId","dailyDate","startDate","endDate","fetchChildren","weeklyEndpoint","dailyEndpoint","Promise","all","get","then","weeklyResponse","dailyResponse","console","log","data","weekly","dailySummaries","reduce","acc","duration","durationMinutes","schoolUsePercentage","daily","durations","map","hour","catch","error","status","reject","childrenObj","session","user","Object","keys","length","entries","child","mockedId","toString","id","name","firstName","lastName","Controller","restrict","template","scope","bindToController","controller","controllerAs","require","link","elem","attrs","controllers","injector","currentUserId","chartInstance","generateDataKey","currentKey","weeklyData","totalOnCampus","totalOffCampus","daysCount","todayOnCampusTemp","todayOffCampusTemp","weeklyTotalSchoolUseDuration","weeklyTotalOutOfSchoolDuration","weeklyTotalOverallDuration","forEach","dateStr","entry","schoolUsePct","onCampus","offCampus","$applyAsync","userIdForLightbox","setTimeout","canvas","querySelector","ctx","getContext","labels","totalTimes","userIdForChart","currentDataKey","currentUserAndDateData","dataToUse","sort","dataStr","push","hourData","datasets","update","type","label","backgroundColor","options","plugins","tooltip","callbacks","context","value","raw","dataset","parseFloat","toFixed","responsive","scales","x","stacked","y","beginAtZero","title","display","text","$watch","newVal","oldVal","isVisible","destroy","odeModuleName","module","filter","input","isNaN","totalMinutes","Math","floor","hours","minutes","result","trim","directive","Directive","notif","onLangReady","promise","lang","conf","Platform","idiom","addKeys"],"sourceRoot":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ode-ngjs-front",
3
- "version": "1.4.12-develop-integration.202507011752",
3
+ "version": "1.4.12-develop-integration.202507211603",
4
4
  "description": "Open Digital Education Frontend Framework",
5
5
  "homepage": "https://github.com/opendigitaleducation/ode-ngjs-front#readme",
6
6
  "bugs": {