@idea-ionic/agenda 5.29.1 → 6.0.0

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.
Files changed (302) hide show
  1. package/environment.d.ts +3 -0
  2. package/esm2020/environment.mjs +20 -0
  3. package/esm2020/idea-ionic-agenda.mjs +5 -0
  4. package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
  5. package/esm2020/src/agenda.component.mjs +248 -0
  6. package/esm2020/src/agenda.module.mjs +57 -0
  7. package/esm2020/src/calendar.component.mjs +125 -0
  8. package/esm2020/src/calendarCreation.component.mjs +142 -0
  9. package/esm2020/src/calendarItem.component.mjs +136 -0
  10. package/esm2020/src/calendars.service.mjs +255 -0
  11. package/esm2020/src/dateFormatter.provider.mjs +38 -0
  12. package/fesm2015/idea-ionic-agenda.mjs +974 -0
  13. package/fesm2015/idea-ionic-agenda.mjs.map +1 -0
  14. package/fesm2020/idea-ionic-agenda.mjs +967 -0
  15. package/fesm2020/idea-ionic-agenda.mjs.map +1 -0
  16. package/idea-ionic-agenda.d.ts +4 -0
  17. package/package.json +31 -19
  18. package/src/agenda.component.d.ts +127 -2
  19. package/src/agenda.module.d.ts +13 -0
  20. package/src/calendar.component.d.ts +41 -1
  21. package/src/calendarCreation.component.d.ts +41 -1
  22. package/src/calendarItem.component.d.ts +25 -0
  23. package/src/calendars.service.d.ts +50 -0
  24. package/src/dateFormatter.provider.d.ts +3 -0
  25. package/bundles/idea-ionic-agenda.umd.js +0 -1141
  26. package/bundles/idea-ionic-agenda.umd.js.map +0 -1
  27. package/bundles/idea-ionic-agenda.umd.min.js +0 -16
  28. package/bundles/idea-ionic-agenda.umd.min.js.map +0 -1
  29. package/esm2015/environment.js +0 -17
  30. package/esm2015/environment.ngsummary.json +0 -1
  31. package/esm2015/idea-ionic-agenda.js +0 -2
  32. package/esm2015/idea-ionic-agenda.ngsummary.json +0 -1
  33. package/esm2015/node_modules/@angular/animations/animations.ngsummary.json +0 -1
  34. package/esm2015/node_modules/@angular/common/common.ngfactory.js +0 -5
  35. package/esm2015/node_modules/@angular/common/common.ngsummary.json +0 -1
  36. package/esm2015/node_modules/@angular/common/http/http.ngsummary.json +0 -1
  37. package/esm2015/node_modules/@angular/core/core.ngfactory.js +0 -4
  38. package/esm2015/node_modules/@angular/core/core.ngsummary.json +0 -1
  39. package/esm2015/node_modules/@angular/forms/forms.ngfactory.js +0 -9
  40. package/esm2015/node_modules/@angular/forms/forms.ngsummary.json +0 -1
  41. package/esm2015/node_modules/@angular/router/router.ngfactory.js +0 -12
  42. package/esm2015/node_modules/@angular/router/router.ngsummary.json +0 -1
  43. package/esm2015/node_modules/@capacitor/core/dist/esm/core-plugin-definitions.ngsummary.json +0 -1
  44. package/esm2015/node_modules/@capacitor/core/dist/esm/definitions.ngsummary.json +0 -1
  45. package/esm2015/node_modules/@capacitor/core/dist/esm/global.ngsummary.json +0 -1
  46. package/esm2015/node_modules/@capacitor/core/dist/esm/index.ngsummary.json +0 -1
  47. package/esm2015/node_modules/@capacitor/core/dist/esm/web/accessibility.ngsummary.json +0 -1
  48. package/esm2015/node_modules/@capacitor/core/dist/esm/web/app.ngsummary.json +0 -1
  49. package/esm2015/node_modules/@capacitor/core/dist/esm/web/browser.ngsummary.json +0 -1
  50. package/esm2015/node_modules/@capacitor/core/dist/esm/web/camera.ngsummary.json +0 -1
  51. package/esm2015/node_modules/@capacitor/core/dist/esm/web/clipboard.ngsummary.json +0 -1
  52. package/esm2015/node_modules/@capacitor/core/dist/esm/web/device.ngsummary.json +0 -1
  53. package/esm2015/node_modules/@capacitor/core/dist/esm/web/filesystem.ngsummary.json +0 -1
  54. package/esm2015/node_modules/@capacitor/core/dist/esm/web/geolocation.ngsummary.json +0 -1
  55. package/esm2015/node_modules/@capacitor/core/dist/esm/web/index.ngsummary.json +0 -1
  56. package/esm2015/node_modules/@capacitor/core/dist/esm/web/local-notifications.ngsummary.json +0 -1
  57. package/esm2015/node_modules/@capacitor/core/dist/esm/web/modals.ngsummary.json +0 -1
  58. package/esm2015/node_modules/@capacitor/core/dist/esm/web/motion.ngsummary.json +0 -1
  59. package/esm2015/node_modules/@capacitor/core/dist/esm/web/network.ngsummary.json +0 -1
  60. package/esm2015/node_modules/@capacitor/core/dist/esm/web/permissions.ngsummary.json +0 -1
  61. package/esm2015/node_modules/@capacitor/core/dist/esm/web/share.ngsummary.json +0 -1
  62. package/esm2015/node_modules/@capacitor/core/dist/esm/web/splash-screen.ngsummary.json +0 -1
  63. package/esm2015/node_modules/@capacitor/core/dist/esm/web/storage.ngsummary.json +0 -1
  64. package/esm2015/node_modules/@capacitor/core/dist/esm/web/toast.ngsummary.json +0 -1
  65. package/esm2015/node_modules/@capacitor/core/dist/esm/web-plugins.ngsummary.json +0 -1
  66. package/esm2015/node_modules/@idea-ionic/common/idea-ionic-common.ngfactory.js +0 -1546
  67. package/esm2015/node_modules/@idea-ionic/common/idea-ionic-common.ngsummary.json +0 -1
  68. package/esm2015/node_modules/@ionic/angular/ionic-angular.ngfactory.js +0 -524
  69. package/esm2015/node_modules/@ionic/angular/ionic-angular.ngsummary.json +0 -1
  70. package/esm2015/node_modules/@ionic/angular/node_modules/tslib/tslib.ngsummary.json +0 -1
  71. package/esm2015/node_modules/@ionic/core/dist/types/components/action-sheet/action-sheet-interface.ngsummary.json +0 -1
  72. package/esm2015/node_modules/@ionic/core/dist/types/components/alert/alert-interface.ngsummary.json +0 -1
  73. package/esm2015/node_modules/@ionic/core/dist/types/components/checkbox/checkbox-interface.ngsummary.json +0 -1
  74. package/esm2015/node_modules/@ionic/core/dist/types/components/content/content-interface.ngsummary.json +0 -1
  75. package/esm2015/node_modules/@ionic/core/dist/types/components/datetime/datetime-interface.ngsummary.json +0 -1
  76. package/esm2015/node_modules/@ionic/core/dist/types/components/input/input-interface.ngsummary.json +0 -1
  77. package/esm2015/node_modules/@ionic/core/dist/types/components/loading/loading-interface.ngsummary.json +0 -1
  78. package/esm2015/node_modules/@ionic/core/dist/types/components/menu/menu-interface.ngsummary.json +0 -1
  79. package/esm2015/node_modules/@ionic/core/dist/types/components/modal/modal-interface.ngsummary.json +0 -1
  80. package/esm2015/node_modules/@ionic/core/dist/types/components/nav/constants.ngsummary.json +0 -1
  81. package/esm2015/node_modules/@ionic/core/dist/types/components/nav/nav-interface.ngsummary.json +0 -1
  82. package/esm2015/node_modules/@ionic/core/dist/types/components/nav/view-controller.ngsummary.json +0 -1
  83. package/esm2015/node_modules/@ionic/core/dist/types/components/picker/picker-interface.ngsummary.json +0 -1
  84. package/esm2015/node_modules/@ionic/core/dist/types/components/popover/popover-interface.ngsummary.json +0 -1
  85. package/esm2015/node_modules/@ionic/core/dist/types/components/radio-group/radio-group-interface.ngsummary.json +0 -1
  86. package/esm2015/node_modules/@ionic/core/dist/types/components/range/range-interface.ngsummary.json +0 -1
  87. package/esm2015/node_modules/@ionic/core/dist/types/components/refresher/refresher-interface.ngsummary.json +0 -1
  88. package/esm2015/node_modules/@ionic/core/dist/types/components/reorder-group/reorder-group-interface.ngsummary.json +0 -1
  89. package/esm2015/node_modules/@ionic/core/dist/types/components/route/route-interface.ngsummary.json +0 -1
  90. package/esm2015/node_modules/@ionic/core/dist/types/components/router/utils/interface.ngsummary.json +0 -1
  91. package/esm2015/node_modules/@ionic/core/dist/types/components/searchbar/searchbar-interface.ngsummary.json +0 -1
  92. package/esm2015/node_modules/@ionic/core/dist/types/components/segment/segment-interface.ngsummary.json +0 -1
  93. package/esm2015/node_modules/@ionic/core/dist/types/components/select/select-interface.ngsummary.json +0 -1
  94. package/esm2015/node_modules/@ionic/core/dist/types/components/select-popover/select-popover-interface.ngsummary.json +0 -1
  95. package/esm2015/node_modules/@ionic/core/dist/types/components/spinner/spinner-configs.ngsummary.json +0 -1
  96. package/esm2015/node_modules/@ionic/core/dist/types/components/spinner/spinner-interface.ngsummary.json +0 -1
  97. package/esm2015/node_modules/@ionic/core/dist/types/components/tab-bar/tab-bar-interface.ngsummary.json +0 -1
  98. package/esm2015/node_modules/@ionic/core/dist/types/components/textarea/textarea-interface.ngsummary.json +0 -1
  99. package/esm2015/node_modules/@ionic/core/dist/types/components/toast/toast-interface.ngsummary.json +0 -1
  100. package/esm2015/node_modules/@ionic/core/dist/types/components/toggle/toggle-interface.ngsummary.json +0 -1
  101. package/esm2015/node_modules/@ionic/core/dist/types/components/virtual-scroll/virtual-scroll-interface.ngsummary.json +0 -1
  102. package/esm2015/node_modules/@ionic/core/dist/types/components.ngsummary.json +0 -1
  103. package/esm2015/node_modules/@ionic/core/dist/types/global/config.ngsummary.json +0 -1
  104. package/esm2015/node_modules/@ionic/core/dist/types/index.ngsummary.json +0 -1
  105. package/esm2015/node_modules/@ionic/core/dist/types/interface.ngsummary.json +0 -1
  106. package/esm2015/node_modules/@ionic/core/dist/types/stencil-public-runtime.ngsummary.json +0 -1
  107. package/esm2015/node_modules/@ionic/core/dist/types/utils/animation/animation-interface.ngsummary.json +0 -1
  108. package/esm2015/node_modules/@ionic/core/dist/types/utils/animation/animation.ngsummary.json +0 -1
  109. package/esm2015/node_modules/@ionic/core/dist/types/utils/animation/cubic-bezier.ngsummary.json +0 -1
  110. package/esm2015/node_modules/@ionic/core/dist/types/utils/config.ngsummary.json +0 -1
  111. package/esm2015/node_modules/@ionic/core/dist/types/utils/gesture/gesture-controller.ngsummary.json +0 -1
  112. package/esm2015/node_modules/@ionic/core/dist/types/utils/gesture/index.ngsummary.json +0 -1
  113. package/esm2015/node_modules/@ionic/core/dist/types/utils/menu-controller/index.ngsummary.json +0 -1
  114. package/esm2015/node_modules/@ionic/core/dist/types/utils/overlays-interface.ngsummary.json +0 -1
  115. package/esm2015/node_modules/@ionic/core/dist/types/utils/overlays.ngsummary.json +0 -1
  116. package/esm2015/node_modules/@ionic/core/dist/types/utils/platform.ngsummary.json +0 -1
  117. package/esm2015/node_modules/@ionic/core/dist/types/utils/sanitization/index.ngsummary.json +0 -1
  118. package/esm2015/node_modules/@ionic/core/dist/types/utils/transition/index.ngsummary.json +0 -1
  119. package/esm2015/node_modules/@ionic/core/dist/types/utils/transition/ios.transition.ngsummary.json +0 -1
  120. package/esm2015/node_modules/@ionic/core/dist/types/utils/transition/md.transition.ngsummary.json +0 -1
  121. package/esm2015/node_modules/@ionic/storage/ionic-storage.ngsummary.json +0 -1
  122. package/esm2015/node_modules/@ionic/storage/node_modules/tslib/tslib.ngsummary.json +0 -1
  123. package/esm2015/node_modules/angular-calendar/angular-calendar.ngfactory.js +0 -397
  124. package/esm2015/node_modules/angular-calendar/angular-calendar.ngsummary.json +0 -1
  125. package/esm2015/node_modules/angular-calendar/date-adapters/date-fns/index.ngsummary.json +0 -1
  126. package/esm2015/node_modules/angular-calendar/node_modules/tslib/tslib.ngsummary.json +0 -1
  127. package/esm2015/node_modules/angular-draggable-droppable/angular-draggable-droppable.ngfactory.js +0 -5
  128. package/esm2015/node_modules/angular-draggable-droppable/angular-draggable-droppable.ngsummary.json +0 -1
  129. package/esm2015/node_modules/angular-draggable-droppable/node_modules/tslib/tslib.ngsummary.json +0 -1
  130. package/esm2015/node_modules/angular-resizable-element/angular-resizable-element.ngfactory.js +0 -5
  131. package/esm2015/node_modules/angular-resizable-element/angular-resizable-element.ngsummary.json +0 -1
  132. package/esm2015/node_modules/angular-resizable-element/node_modules/tslib/tslib.ngsummary.json +0 -1
  133. package/esm2015/node_modules/calendar-utils/calendar-utils.ngsummary.json +0 -1
  134. package/esm2015/node_modules/calendar-utils/date-adapters/date-adapter/index.ngsummary.json +0 -1
  135. package/esm2015/node_modules/date-fns/typings.ngsummary.json +0 -1
  136. package/esm2015/node_modules/idea-toolbox/dist/APIRequestLog.model.ngsummary.json +0 -1
  137. package/esm2015/node_modules/idea-toolbox/dist/RCAttachedResource.model.ngsummary.json +0 -1
  138. package/esm2015/node_modules/idea-toolbox/dist/RCConfiguredFolder.model.ngsummary.json +0 -1
  139. package/esm2015/node_modules/idea-toolbox/dist/RCFolder.model.ngsummary.json +0 -1
  140. package/esm2015/node_modules/idea-toolbox/dist/RCResource.model.ngsummary.json +0 -1
  141. package/esm2015/node_modules/idea-toolbox/dist/address.model.ngsummary.json +0 -1
  142. package/esm2015/node_modules/idea-toolbox/dist/amazonTranslateLanguages.enum.ngsummary.json +0 -1
  143. package/esm2015/node_modules/idea-toolbox/dist/announcement.model.ngsummary.json +0 -1
  144. package/esm2015/node_modules/idea-toolbox/dist/appointment.model.ngsummary.json +0 -1
  145. package/esm2015/node_modules/idea-toolbox/dist/attachment.model.ngsummary.json +0 -1
  146. package/esm2015/node_modules/idea-toolbox/dist/booleanChoices.enum.ngsummary.json +0 -1
  147. package/esm2015/node_modules/idea-toolbox/dist/cacheable.model.ngsummary.json +0 -1
  148. package/esm2015/node_modules/idea-toolbox/dist/cacheableResource.model.ngsummary.json +0 -1
  149. package/esm2015/node_modules/idea-toolbox/dist/calendar.model.ngsummary.json +0 -1
  150. package/esm2015/node_modules/idea-toolbox/dist/check.model.ngsummary.json +0 -1
  151. package/esm2015/node_modules/idea-toolbox/dist/clientInfo.model.ngsummary.json +0 -1
  152. package/esm2015/node_modules/idea-toolbox/dist/contactRequest.model.ngsummary.json +0 -1
  153. package/esm2015/node_modules/idea-toolbox/dist/contacts.model.ngsummary.json +0 -1
  154. package/esm2015/node_modules/idea-toolbox/dist/countries.enum.ngsummary.json +0 -1
  155. package/esm2015/node_modules/idea-toolbox/dist/customBlockMeta.model.ngsummary.json +0 -1
  156. package/esm2015/node_modules/idea-toolbox/dist/customFieldMeta.model.ngsummary.json +0 -1
  157. package/esm2015/node_modules/idea-toolbox/dist/customFieldTypes.enum.ngsummary.json +0 -1
  158. package/esm2015/node_modules/idea-toolbox/dist/customSectionMeta.model.ngsummary.json +0 -1
  159. package/esm2015/node_modules/idea-toolbox/dist/delta.model.ngsummary.json +0 -1
  160. package/esm2015/node_modules/idea-toolbox/dist/emailChangeRequest.model.ngsummary.json +0 -1
  161. package/esm2015/node_modules/idea-toolbox/dist/emailData.model.ngsummary.json +0 -1
  162. package/esm2015/node_modules/idea-toolbox/dist/epoch.ngsummary.json +0 -1
  163. package/esm2015/node_modules/idea-toolbox/dist/errorReport.model.ngsummary.json +0 -1
  164. package/esm2015/node_modules/idea-toolbox/dist/errorWhitelisted.model.ngsummary.json +0 -1
  165. package/esm2015/node_modules/idea-toolbox/dist/index.ngsummary.json +0 -1
  166. package/esm2015/node_modules/idea-toolbox/dist/invitation.model.ngsummary.json +0 -1
  167. package/esm2015/node_modules/idea-toolbox/dist/ionicons.enum.ngsummary.json +0 -1
  168. package/esm2015/node_modules/idea-toolbox/dist/label.model.ngsummary.json +0 -1
  169. package/esm2015/node_modules/idea-toolbox/dist/labelVariable.model.ngsummary.json +0 -1
  170. package/esm2015/node_modules/idea-toolbox/dist/languages.enum.ngsummary.json +0 -1
  171. package/esm2015/node_modules/idea-toolbox/dist/languages.model.ngsummary.json +0 -1
  172. package/esm2015/node_modules/idea-toolbox/dist/limitCounter.model.ngsummary.json +0 -1
  173. package/esm2015/node_modules/idea-toolbox/dist/markdown.ngsummary.json +0 -1
  174. package/esm2015/node_modules/idea-toolbox/dist/membership.model.ngsummary.json +0 -1
  175. package/esm2015/node_modules/idea-toolbox/dist/notification.model.ngsummary.json +0 -1
  176. package/esm2015/node_modules/idea-toolbox/dist/pdfTemplate.model.ngsummary.json +0 -1
  177. package/esm2015/node_modules/idea-toolbox/dist/projectPlan.model.ngsummary.json +0 -1
  178. package/esm2015/node_modules/idea-toolbox/dist/projectSubscription.model.ngsummary.json +0 -1
  179. package/esm2015/node_modules/idea-toolbox/dist/pushNotificationsDevice.model.ngsummary.json +0 -1
  180. package/esm2015/node_modules/idea-toolbox/dist/pushNotificationsPlatforms.enum.ngsummary.json +0 -1
  181. package/esm2015/node_modules/idea-toolbox/dist/resource.model.ngsummary.json +0 -1
  182. package/esm2015/node_modules/idea-toolbox/dist/sentiment.enum.ngsummary.json +0 -1
  183. package/esm2015/node_modules/idea-toolbox/dist/signature.model.ngsummary.json +0 -1
  184. package/esm2015/node_modules/idea-toolbox/dist/signedURL.model.ngsummary.json +0 -1
  185. package/esm2015/node_modules/idea-toolbox/dist/stringVariable.model.ngsummary.json +0 -1
  186. package/esm2015/node_modules/idea-toolbox/dist/suggestion.model.ngsummary.json +0 -1
  187. package/esm2015/node_modules/idea-toolbox/dist/team.model.ngsummary.json +0 -1
  188. package/esm2015/node_modules/idea-toolbox/dist/teamModules.model.ngsummary.json +0 -1
  189. package/esm2015/node_modules/idea-toolbox/dist/timeInterval.model.ngsummary.json +0 -1
  190. package/esm2015/node_modules/idea-toolbox/dist/user.model.ngsummary.json +0 -1
  191. package/esm2015/node_modules/idea-toolbox/dist/utils.ngsummary.json +0 -1
  192. package/esm2015/node_modules/ionicons/dist/types/components/icon/icon.ngsummary.json +0 -1
  193. package/esm2015/node_modules/ionicons/dist/types/components/icon/utils.ngsummary.json +0 -1
  194. package/esm2015/node_modules/ionicons/dist/types/components.ngsummary.json +0 -1
  195. package/esm2015/node_modules/ionicons/dist/types/index.ngsummary.json +0 -1
  196. package/esm2015/node_modules/ionicons/dist/types/stencil-public-runtime.ngsummary.json +0 -1
  197. package/esm2015/node_modules/localforage/typings/localforage.ngsummary.json +0 -1
  198. package/esm2015/node_modules/positioning/dist/entry.ngsummary.json +0 -1
  199. package/esm2015/node_modules/positioning/dist/positioning.ngsummary.json +0 -1
  200. package/esm2015/node_modules/rxjs/index.ngsummary.json +0 -1
  201. package/esm2015/node_modules/rxjs/internal/AsyncSubject.ngsummary.json +0 -1
  202. package/esm2015/node_modules/rxjs/internal/BehaviorSubject.ngsummary.json +0 -1
  203. package/esm2015/node_modules/rxjs/internal/InnerSubscriber.ngsummary.json +0 -1
  204. package/esm2015/node_modules/rxjs/internal/Notification.ngsummary.json +0 -1
  205. package/esm2015/node_modules/rxjs/internal/Observable.ngsummary.json +0 -1
  206. package/esm2015/node_modules/rxjs/internal/Operator.ngsummary.json +0 -1
  207. package/esm2015/node_modules/rxjs/internal/OuterSubscriber.ngsummary.json +0 -1
  208. package/esm2015/node_modules/rxjs/internal/ReplaySubject.ngsummary.json +0 -1
  209. package/esm2015/node_modules/rxjs/internal/Scheduler.ngsummary.json +0 -1
  210. package/esm2015/node_modules/rxjs/internal/Subject.ngsummary.json +0 -1
  211. package/esm2015/node_modules/rxjs/internal/Subscriber.ngsummary.json +0 -1
  212. package/esm2015/node_modules/rxjs/internal/Subscription.ngsummary.json +0 -1
  213. package/esm2015/node_modules/rxjs/internal/config.ngsummary.json +0 -1
  214. package/esm2015/node_modules/rxjs/internal/observable/ConnectableObservable.ngsummary.json +0 -1
  215. package/esm2015/node_modules/rxjs/internal/observable/bindCallback.ngsummary.json +0 -1
  216. package/esm2015/node_modules/rxjs/internal/observable/bindNodeCallback.ngsummary.json +0 -1
  217. package/esm2015/node_modules/rxjs/internal/observable/combineLatest.ngsummary.json +0 -1
  218. package/esm2015/node_modules/rxjs/internal/observable/concat.ngsummary.json +0 -1
  219. package/esm2015/node_modules/rxjs/internal/observable/defer.ngsummary.json +0 -1
  220. package/esm2015/node_modules/rxjs/internal/observable/empty.ngsummary.json +0 -1
  221. package/esm2015/node_modules/rxjs/internal/observable/forkJoin.ngsummary.json +0 -1
  222. package/esm2015/node_modules/rxjs/internal/observable/from.ngsummary.json +0 -1
  223. package/esm2015/node_modules/rxjs/internal/observable/fromEvent.ngsummary.json +0 -1
  224. package/esm2015/node_modules/rxjs/internal/observable/fromEventPattern.ngsummary.json +0 -1
  225. package/esm2015/node_modules/rxjs/internal/observable/generate.ngsummary.json +0 -1
  226. package/esm2015/node_modules/rxjs/internal/observable/iif.ngsummary.json +0 -1
  227. package/esm2015/node_modules/rxjs/internal/observable/interval.ngsummary.json +0 -1
  228. package/esm2015/node_modules/rxjs/internal/observable/merge.ngsummary.json +0 -1
  229. package/esm2015/node_modules/rxjs/internal/observable/never.ngsummary.json +0 -1
  230. package/esm2015/node_modules/rxjs/internal/observable/of.ngsummary.json +0 -1
  231. package/esm2015/node_modules/rxjs/internal/observable/onErrorResumeNext.ngsummary.json +0 -1
  232. package/esm2015/node_modules/rxjs/internal/observable/pairs.ngsummary.json +0 -1
  233. package/esm2015/node_modules/rxjs/internal/observable/partition.ngsummary.json +0 -1
  234. package/esm2015/node_modules/rxjs/internal/observable/race.ngsummary.json +0 -1
  235. package/esm2015/node_modules/rxjs/internal/observable/range.ngsummary.json +0 -1
  236. package/esm2015/node_modules/rxjs/internal/observable/throwError.ngsummary.json +0 -1
  237. package/esm2015/node_modules/rxjs/internal/observable/timer.ngsummary.json +0 -1
  238. package/esm2015/node_modules/rxjs/internal/observable/using.ngsummary.json +0 -1
  239. package/esm2015/node_modules/rxjs/internal/observable/zip.ngsummary.json +0 -1
  240. package/esm2015/node_modules/rxjs/internal/operators/groupBy.ngsummary.json +0 -1
  241. package/esm2015/node_modules/rxjs/internal/scheduled/scheduled.ngsummary.json +0 -1
  242. package/esm2015/node_modules/rxjs/internal/scheduler/Action.ngsummary.json +0 -1
  243. package/esm2015/node_modules/rxjs/internal/scheduler/AnimationFrameScheduler.ngsummary.json +0 -1
  244. package/esm2015/node_modules/rxjs/internal/scheduler/AsapScheduler.ngsummary.json +0 -1
  245. package/esm2015/node_modules/rxjs/internal/scheduler/AsyncAction.ngsummary.json +0 -1
  246. package/esm2015/node_modules/rxjs/internal/scheduler/AsyncScheduler.ngsummary.json +0 -1
  247. package/esm2015/node_modules/rxjs/internal/scheduler/QueueScheduler.ngsummary.json +0 -1
  248. package/esm2015/node_modules/rxjs/internal/scheduler/VirtualTimeScheduler.ngsummary.json +0 -1
  249. package/esm2015/node_modules/rxjs/internal/scheduler/animationFrame.ngsummary.json +0 -1
  250. package/esm2015/node_modules/rxjs/internal/scheduler/asap.ngsummary.json +0 -1
  251. package/esm2015/node_modules/rxjs/internal/scheduler/async.ngsummary.json +0 -1
  252. package/esm2015/node_modules/rxjs/internal/scheduler/queue.ngsummary.json +0 -1
  253. package/esm2015/node_modules/rxjs/internal/symbol/observable.ngsummary.json +0 -1
  254. package/esm2015/node_modules/rxjs/internal/types.ngsummary.json +0 -1
  255. package/esm2015/node_modules/rxjs/internal/util/ArgumentOutOfRangeError.ngsummary.json +0 -1
  256. package/esm2015/node_modules/rxjs/internal/util/EmptyError.ngsummary.json +0 -1
  257. package/esm2015/node_modules/rxjs/internal/util/ObjectUnsubscribedError.ngsummary.json +0 -1
  258. package/esm2015/node_modules/rxjs/internal/util/TimeoutError.ngsummary.json +0 -1
  259. package/esm2015/node_modules/rxjs/internal/util/UnsubscriptionError.ngsummary.json +0 -1
  260. package/esm2015/node_modules/rxjs/internal/util/identity.ngsummary.json +0 -1
  261. package/esm2015/node_modules/rxjs/internal/util/isObservable.ngsummary.json +0 -1
  262. package/esm2015/node_modules/rxjs/internal/util/noop.ngsummary.json +0 -1
  263. package/esm2015/node_modules/rxjs/internal/util/pipe.ngsummary.json +0 -1
  264. package/esm2015/node_modules/signature_pad/dist/types/point.ngsummary.json +0 -1
  265. package/esm2015/node_modules/signature_pad/dist/types/signature_pad.ngsummary.json +0 -1
  266. package/esm2015/node_modules/tslib/tslib.ngsummary.json +0 -1
  267. package/esm2015/public-api.ngsummary.json +0 -1
  268. package/esm2015/src/agenda.component.js +0 -142
  269. package/esm2015/src/agenda.component.ngfactory.js +0 -120
  270. package/esm2015/src/agenda.component.ngsummary.json +0 -1
  271. package/esm2015/src/agenda.component.scss.shim.ngstyle.js +0 -3
  272. package/esm2015/src/agenda.module.js +0 -40
  273. package/esm2015/src/agenda.module.ngfactory.js +0 -20
  274. package/esm2015/src/agenda.module.ngsummary.json +0 -1
  275. package/esm2015/src/calendar.component.js +0 -111
  276. package/esm2015/src/calendar.component.ngfactory.js +0 -54
  277. package/esm2015/src/calendar.component.ngsummary.json +0 -1
  278. package/esm2015/src/calendar.component.scss.shim.ngstyle.js +0 -3
  279. package/esm2015/src/calendarCreation.component.js +0 -116
  280. package/esm2015/src/calendarCreation.component.ngfactory.js +0 -43
  281. package/esm2015/src/calendarCreation.component.ngsummary.json +0 -1
  282. package/esm2015/src/calendarCreation.component.scss.shim.ngstyle.js +0 -3
  283. package/esm2015/src/calendarItem.component.js +0 -119
  284. package/esm2015/src/calendarItem.component.ngfactory.js +0 -24
  285. package/esm2015/src/calendarItem.component.ngsummary.json +0 -1
  286. package/esm2015/src/calendarItem.component.scss.shim.ngstyle.js +0 -3
  287. package/esm2015/src/calendars.service.js +0 -209
  288. package/esm2015/src/calendars.service.ngsummary.json +0 -1
  289. package/esm2015/src/dateFormatter.provider.js +0 -32
  290. package/esm2015/src/dateFormatter.provider.ngsummary.json +0 -1
  291. package/fesm2015/idea-ionic-agenda.js +0 -736
  292. package/fesm2015/idea-ionic-agenda.js.map +0 -1
  293. package/idea-ionic-agenda.metadata.json +0 -1
  294. package/src/agenda.component.ngfactory.d.ts +0 -1
  295. package/src/agenda.component.scss.shim.ngstyle.d.ts +0 -1
  296. package/src/agenda.module.ngfactory.d.ts +0 -3
  297. package/src/calendar.component.ngfactory.d.ts +0 -1
  298. package/src/calendar.component.scss.shim.ngstyle.d.ts +0 -1
  299. package/src/calendarCreation.component.ngfactory.d.ts +0 -1
  300. package/src/calendarCreation.component.scss.shim.ngstyle.d.ts +0 -1
  301. package/src/calendarItem.component.ngfactory.d.ts +0 -1
  302. package/src/calendarItem.component.scss.shim.ngstyle.d.ts +0 -1
@@ -0,0 +1,125 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import { Calendar, Check } from 'idea-toolbox';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "./calendars.service";
5
+ import * as i2 from "@ionic/angular";
6
+ import * as i3 from "@idea-ionic/common";
7
+ import * as i4 from "@angular/common";
8
+ import * as i5 from "@angular/forms";
9
+ export class IDEACalendarComponent {
10
+ constructor(calendars, modalCtrl, alertCtrl, tc, loading, message, API, t) {
11
+ this.calendars = calendars;
12
+ this.modalCtrl = modalCtrl;
13
+ this.alertCtrl = alertCtrl;
14
+ this.tc = tc;
15
+ this.loading = loading;
16
+ this.message = message;
17
+ this.API = API;
18
+ this.t = t;
19
+ /**
20
+ * Errors while validating the entity.
21
+ */
22
+ this.errors = new Set();
23
+ /**
24
+ * The default color for a calendar.
25
+ */
26
+ this.DEFAULT_COLOR = '#555';
27
+ }
28
+ ngOnInit() {
29
+ this.membership = this.tc.get('membership');
30
+ // work on a copy
31
+ this._calendar = new Calendar(this.calendar);
32
+ // load the teammates to use for shared calendars permissions
33
+ this.API.getResource(`teams/${this.membership.teamId}/memberships`)
34
+ .then((memberships) => (this.membershipsChecks = memberships.map(m => new Check({
35
+ value: m.userId,
36
+ name: m.name,
37
+ checked: (this._calendar.usersCanManageAppointments || []).some(x => x === m.userId)
38
+ }))))
39
+ .catch(() => { });
40
+ }
41
+ /**
42
+ * Set the support array to display errors in the UI.
43
+ */
44
+ hasFieldAnError(field) {
45
+ return this.errors.has(field);
46
+ }
47
+ /**
48
+ * Save a calendar with the new info.
49
+ */
50
+ async save() {
51
+ // set the default color, in case none was selected
52
+ if (!this._calendar.color)
53
+ this._calendar.color = this.DEFAULT_COLOR;
54
+ // map the memberships able to manage appointments
55
+ if (this._calendar.isShared() && this.advancedPermissions)
56
+ this._calendar.usersCanManageAppointments = this.membershipsChecks
57
+ .filter(x => x.checked)
58
+ .map(x => String(x.value));
59
+ else
60
+ delete this._calendar.usersCanManageAppointments;
61
+ // checkings
62
+ this.errors = new Set(this._calendar.validate());
63
+ if (this.errors.size)
64
+ return this.message.error('COMMON.FORM_HAS_ERROR_TO_CHECK');
65
+ // send a put request
66
+ await this.loading.show();
67
+ this.calendars
68
+ .putCalendar(this._calendar)
69
+ .then((res) => {
70
+ this.calendar.load(res);
71
+ this.message.success('IDEA_AGENDA.CALENDARS.CALENDAR_SAVED');
72
+ this.modalCtrl.dismiss(this.calendar);
73
+ })
74
+ .catch(() => this.message.error('COMMON.OPERATION_FAILED'))
75
+ .finally(() => this.loading.hide());
76
+ }
77
+ /**
78
+ * Delete the calendar.
79
+ */
80
+ delete() {
81
+ this.alertCtrl
82
+ .create({
83
+ header: this.t._('COMMON.ARE_YOU_SURE'),
84
+ subHeader: this.t._('IDEA_AGENDA.CALENDARS.DELETE_CALENDAR'),
85
+ message: this.t._('IDEA_AGENDA.CALENDARS.DELETE_CALENDAR_HINT'),
86
+ buttons: [
87
+ { text: this.t._('COMMON.CANCEL'), role: 'cancel' },
88
+ {
89
+ text: this.t._('COMMON.DELETE'),
90
+ handler: async () => {
91
+ await this.loading.show();
92
+ this.calendars
93
+ .deleteCalendar(this._calendar)
94
+ .then(() => {
95
+ this.message.success('IDEA_AGENDA.CALENDARS.CALENDAR_DELETED');
96
+ this.modalCtrl.dismiss(true);
97
+ })
98
+ .catch(() => this.message.error('COMMON.OPERATION_FAILED'))
99
+ .finally(() => this.loading.hide());
100
+ }
101
+ }
102
+ ]
103
+ })
104
+ .then(alert => alert.present());
105
+ }
106
+ /**
107
+ * Close the component.
108
+ */
109
+ close() {
110
+ this.modalCtrl.dismiss();
111
+ }
112
+ }
113
+ IDEACalendarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: IDEACalendarComponent, deps: [{ token: i1.IDEACalendarsService }, { token: i2.ModalController }, { token: i2.AlertController }, { token: i3.IDEATinCanService }, { token: i3.IDEALoadingService }, { token: i3.IDEAMessageService }, { token: i3.IDEAAWSAPIService }, { token: i3.IDEATranslationsService }], target: i0.ɵɵFactoryTarget.Component });
114
+ IDEACalendarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.1", type: IDEACalendarComponent, selector: "idea-calendar", inputs: { calendar: "calendar", advancedPermissions: "advancedPermissions", hideColor: "hideColor" }, ngImport: i0, template: "<ion-header>\n <ion-toolbar color=\"ideaToolbar\">\n <ion-buttons slot=\"start\">\n <ion-button [title]=\"t._('COMMON.CLOSE')\" (click)=\"close()\">\n <ion-icon name=\"close-circle\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n </ion-buttons>\n <ion-title>{{ 'IDEA_AGENDA.CALENDARS.EDIT_CALENDAR' | translate }}</ion-title>\n <ion-buttons slot=\"end\">\n <ion-button [title]=\"t._('COMMON.SAVE')\" (click)=\"save()\">\n <ion-icon name=\"checkmark-circle\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n<ion-content>\n <div class=\"maxWidthContainer\" *ngIf=\"_calendar\">\n <ion-list class=\"aList\">\n <ion-item\n lines=\"inset\"\n [class.fieldHasError]=\"hasFieldAnError('name')\"\n [title]=\"t._('IDEA_AGENDA.CALENDARS.NAME_HINT')\"\n >\n <ion-label position=\"stacked\">{{ 'IDEA_AGENDA.CALENDARS.NAME' | translate }} </ion-label>\n <ion-input [placeholder]=\"t._('IDEA_AGENDA.CALENDARS.NAME_HINT')\" [(ngModel)]=\"_calendar.name\"></ion-input>\n </ion-item>\n <ion-item\n lines=\"inset\"\n [class.fieldHasError]=\"hasFieldAnError('description')\"\n [title]=\"t._('IDEA_AGENDA.CALENDARS.DESCRIPTION_HINT')\"\n >\n <ion-label position=\"stacked\">{{ 'IDEA_AGENDA.CALENDARS.DESCRIPTION' | translate }} </ion-label>\n <ion-input\n [placeholder]=\"t._('IDEA_AGENDA.CALENDARS.DESCRIPTION_HINT')\"\n [(ngModel)]=\"_calendar.description\"\n ></ion-input>\n </ion-item>\n <idea-color-picker\n *ngIf=\"!hideColor\"\n [lines]=\"'inset'\"\n [current]=\"_calendar.color\"\n [label]=\"t._('IDEA_AGENDA.CALENDARS.COLOR')\"\n [class.fieldHasError]=\"hasFieldAnError('color')\"\n (select)=\"$event ? (_calendar.color = $event) : null\"\n ></idea-color-picker>\n <idea-checker\n *ngIf=\"membershipsChecks && _calendar.isShared() && advancedPermissions\"\n [data]=\"membershipsChecks\"\n [label]=\"t._('IDEA_AGENDA.CALENDARS.USERS_ALLOWED_TO_MANAGE_APPOINTMENTS')\"\n [searchPlaceholder]=\"t._('IDEA_AGENDA.CALENDARS.WHO_CAN_MANAGE_APPOINTMENTS')\"\n [noneText]=\"t._('IDEA_AGENDA.CALENDARS.NOBODY')\"\n [allText]=\"t._('IDEA_AGENDA.CALENDARS.EVERYONE')\"\n [allowSelectDeselectAll]=\"true\"\n [lines]=\"'inset'\"\n ></idea-checker>\n </ion-list>\n <ion-list class=\"aList\" *ngIf=\"_calendar.external?.service\">\n <ion-list-header>\n <ion-label>\n <h2>{{ 'IDEA_AGENDA.CALENDARS.INFO_ON_CALENDAR' | translate }}</h2>\n </ion-label>\n </ion-list-header>\n <ion-item lines=\"inset\" *ngIf=\"calendar.userId\">\n <ion-label>\n {{ 'IDEA_AGENDA.CALENDARS.PRIVATE_CALENDAR' | translate }}\n <p>{{ 'IDEA_AGENDA.CALENDARS.PRIVATE_CALENDAR_HINT' | translate }}</p>\n </ion-label>\n <ion-icon slot=\"end\" name=\"person\"></ion-icon>\n </ion-item>\n <ion-item lines=\"inset\" *ngIf=\"calendar.teamId\">\n <ion-label>\n {{ 'IDEA_AGENDA.CALENDARS.TEAM_CALENDAR' | translate }}\n <p>{{ 'IDEA_AGENDA.CALENDARS.TEAM_CALENDAR_HINT' | translate }}</p>\n </ion-label>\n <ion-icon slot=\"end\" name=\"people\"></ion-icon>\n </ion-item>\n <ion-item lines=\"inset\">\n <ion-label>\n {{ 'IDEA_AGENDA.CALENDARS.LINKED_TO' | translate }}\n {{ 'IDEA_AGENDA.CALENDARS.SERVICES.' + _calendar.external.service | translate }}\n <p>{{ _calendar.external.name }} ({{ _calendar.external.email }})</p>\n </ion-label>\n <ion-icon slot=\"end\" [name]=\"calendars.getServiceIcon(_calendar.external.service)\"></ion-icon>\n </ion-item>\n <ion-item lines=\"inset\">\n <ion-label>\n {{ 'IDEA_AGENDA.CALENDARS.ACCESS_LEVELS.' + _calendar.external.userAccess | translate }}\n <p>{{ 'IDEA_AGENDA.CALENDARS.BASED_ON_EXTERNAL_SERVICE_SHARING_PERMISSION' | translate }}</p>\n </ion-label>\n <ion-icon slot=\"end\" name=\"shield\"></ion-icon>\n </ion-item>\n </ion-list>\n <ion-list class=\"aList\">\n <ion-list-header>\n <ion-label color=\"danger\">\n <h2>{{ 'IDEA_AGENDA.CALENDARS.DANGEROUS_ZONE' | translate }}</h2>\n </ion-label>\n </ion-list-header>\n <ion-item lines=\"inset\">\n <ion-label class=\"ion-text-wrap\">\n {{ 'IDEA_AGENDA.CALENDARS.DELETE_CALENDAR' | translate }}\n <p>{{ 'IDEA_AGENDA.CALENDARS.DELETE_CALENDAR_HINT' | translate }}</p>\n </ion-label>\n <ion-button color=\"danger\" [title]=\"t._('IDEA_AGENDA.CALENDARS.DELETE_CALENDAR_HINT')\" (click)=\"delete()\">\n {{ 'COMMON.DELETE' | translate }}\n </ion-button>\n </ion-item>\n </ion-list>\n </div>\n</ion-content>\n", styles: [".maxWidthContainer{max-width:500px;padding-top:20px}\n"], components: [{ type: i2.IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { type: i2.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { type: i2.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { type: i2.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { type: i2.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { type: i2.IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { type: i2.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { type: i2.IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { type: i2.IonItem, selector: "ion-item", inputs: ["button", "color", "counter", "detail", "detailIcon", "disabled", "download", "fill", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "shape", "target", "type"] }, { type: i2.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { type: i2.IonInput, selector: "ion-input", inputs: ["accept", "autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearOnEdit", "color", "debounce", "disabled", "enterkeyhint", "inputmode", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "size", "spellcheck", "step", "type", "value"] }, { type: i3.IDEAColorPickerComponent, selector: "idea-color-picker", inputs: ["colors", "current", "label", "placeholder", "icon", "iconColor", "disabled", "obligatory", "lines"], outputs: ["select", "iconSelect"] }, { type: i3.IDEACheckerComponent, selector: "idea-checker", inputs: ["data", "numMaxElementsInPreview", "dataProvider", "label", "icon", "iconColor", "searchPlaceholder", "noPreviewText", "noElementsFoundText", "noneEqualsAll", "noneText", "allText", "lines", "disabled", "tappableWhenDisabled", "obligatory", "sortData", "showAvatars", "fallbackAvatar", "limitSelectionToNum", "allowSelectDeselectAll"], outputs: ["change", "iconSelect"] }, { type: i2.IonListHeader, selector: "ion-list-header", inputs: ["color", "lines", "mode"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.TextValueAccessor, selector: "ion-input:not([type=number]),ion-textarea,ion-searchbar" }, { type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], pipes: { "translate": i3.IDEATranslatePipe } });
115
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: IDEACalendarComponent, decorators: [{
116
+ type: Component,
117
+ args: [{ selector: 'idea-calendar', template: "<ion-header>\n <ion-toolbar color=\"ideaToolbar\">\n <ion-buttons slot=\"start\">\n <ion-button [title]=\"t._('COMMON.CLOSE')\" (click)=\"close()\">\n <ion-icon name=\"close-circle\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n </ion-buttons>\n <ion-title>{{ 'IDEA_AGENDA.CALENDARS.EDIT_CALENDAR' | translate }}</ion-title>\n <ion-buttons slot=\"end\">\n <ion-button [title]=\"t._('COMMON.SAVE')\" (click)=\"save()\">\n <ion-icon name=\"checkmark-circle\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n<ion-content>\n <div class=\"maxWidthContainer\" *ngIf=\"_calendar\">\n <ion-list class=\"aList\">\n <ion-item\n lines=\"inset\"\n [class.fieldHasError]=\"hasFieldAnError('name')\"\n [title]=\"t._('IDEA_AGENDA.CALENDARS.NAME_HINT')\"\n >\n <ion-label position=\"stacked\">{{ 'IDEA_AGENDA.CALENDARS.NAME' | translate }} </ion-label>\n <ion-input [placeholder]=\"t._('IDEA_AGENDA.CALENDARS.NAME_HINT')\" [(ngModel)]=\"_calendar.name\"></ion-input>\n </ion-item>\n <ion-item\n lines=\"inset\"\n [class.fieldHasError]=\"hasFieldAnError('description')\"\n [title]=\"t._('IDEA_AGENDA.CALENDARS.DESCRIPTION_HINT')\"\n >\n <ion-label position=\"stacked\">{{ 'IDEA_AGENDA.CALENDARS.DESCRIPTION' | translate }} </ion-label>\n <ion-input\n [placeholder]=\"t._('IDEA_AGENDA.CALENDARS.DESCRIPTION_HINT')\"\n [(ngModel)]=\"_calendar.description\"\n ></ion-input>\n </ion-item>\n <idea-color-picker\n *ngIf=\"!hideColor\"\n [lines]=\"'inset'\"\n [current]=\"_calendar.color\"\n [label]=\"t._('IDEA_AGENDA.CALENDARS.COLOR')\"\n [class.fieldHasError]=\"hasFieldAnError('color')\"\n (select)=\"$event ? (_calendar.color = $event) : null\"\n ></idea-color-picker>\n <idea-checker\n *ngIf=\"membershipsChecks && _calendar.isShared() && advancedPermissions\"\n [data]=\"membershipsChecks\"\n [label]=\"t._('IDEA_AGENDA.CALENDARS.USERS_ALLOWED_TO_MANAGE_APPOINTMENTS')\"\n [searchPlaceholder]=\"t._('IDEA_AGENDA.CALENDARS.WHO_CAN_MANAGE_APPOINTMENTS')\"\n [noneText]=\"t._('IDEA_AGENDA.CALENDARS.NOBODY')\"\n [allText]=\"t._('IDEA_AGENDA.CALENDARS.EVERYONE')\"\n [allowSelectDeselectAll]=\"true\"\n [lines]=\"'inset'\"\n ></idea-checker>\n </ion-list>\n <ion-list class=\"aList\" *ngIf=\"_calendar.external?.service\">\n <ion-list-header>\n <ion-label>\n <h2>{{ 'IDEA_AGENDA.CALENDARS.INFO_ON_CALENDAR' | translate }}</h2>\n </ion-label>\n </ion-list-header>\n <ion-item lines=\"inset\" *ngIf=\"calendar.userId\">\n <ion-label>\n {{ 'IDEA_AGENDA.CALENDARS.PRIVATE_CALENDAR' | translate }}\n <p>{{ 'IDEA_AGENDA.CALENDARS.PRIVATE_CALENDAR_HINT' | translate }}</p>\n </ion-label>\n <ion-icon slot=\"end\" name=\"person\"></ion-icon>\n </ion-item>\n <ion-item lines=\"inset\" *ngIf=\"calendar.teamId\">\n <ion-label>\n {{ 'IDEA_AGENDA.CALENDARS.TEAM_CALENDAR' | translate }}\n <p>{{ 'IDEA_AGENDA.CALENDARS.TEAM_CALENDAR_HINT' | translate }}</p>\n </ion-label>\n <ion-icon slot=\"end\" name=\"people\"></ion-icon>\n </ion-item>\n <ion-item lines=\"inset\">\n <ion-label>\n {{ 'IDEA_AGENDA.CALENDARS.LINKED_TO' | translate }}\n {{ 'IDEA_AGENDA.CALENDARS.SERVICES.' + _calendar.external.service | translate }}\n <p>{{ _calendar.external.name }} ({{ _calendar.external.email }})</p>\n </ion-label>\n <ion-icon slot=\"end\" [name]=\"calendars.getServiceIcon(_calendar.external.service)\"></ion-icon>\n </ion-item>\n <ion-item lines=\"inset\">\n <ion-label>\n {{ 'IDEA_AGENDA.CALENDARS.ACCESS_LEVELS.' + _calendar.external.userAccess | translate }}\n <p>{{ 'IDEA_AGENDA.CALENDARS.BASED_ON_EXTERNAL_SERVICE_SHARING_PERMISSION' | translate }}</p>\n </ion-label>\n <ion-icon slot=\"end\" name=\"shield\"></ion-icon>\n </ion-item>\n </ion-list>\n <ion-list class=\"aList\">\n <ion-list-header>\n <ion-label color=\"danger\">\n <h2>{{ 'IDEA_AGENDA.CALENDARS.DANGEROUS_ZONE' | translate }}</h2>\n </ion-label>\n </ion-list-header>\n <ion-item lines=\"inset\">\n <ion-label class=\"ion-text-wrap\">\n {{ 'IDEA_AGENDA.CALENDARS.DELETE_CALENDAR' | translate }}\n <p>{{ 'IDEA_AGENDA.CALENDARS.DELETE_CALENDAR_HINT' | translate }}</p>\n </ion-label>\n <ion-button color=\"danger\" [title]=\"t._('IDEA_AGENDA.CALENDARS.DELETE_CALENDAR_HINT')\" (click)=\"delete()\">\n {{ 'COMMON.DELETE' | translate }}\n </ion-button>\n </ion-item>\n </ion-list>\n </div>\n</ion-content>\n", styles: [".maxWidthContainer{max-width:500px;padding-top:20px}\n"] }]
118
+ }], ctorParameters: function () { return [{ type: i1.IDEACalendarsService }, { type: i2.ModalController }, { type: i2.AlertController }, { type: i3.IDEATinCanService }, { type: i3.IDEALoadingService }, { type: i3.IDEAMessageService }, { type: i3.IDEAAWSAPIService }, { type: i3.IDEATranslationsService }]; }, propDecorators: { calendar: [{
119
+ type: Input
120
+ }], advancedPermissions: [{
121
+ type: Input
122
+ }], hideColor: [{
123
+ type: Input
124
+ }] } });
125
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbW9kdWxlcy9hZ2VuZGEvc3JjL2NhbGVuZGFyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL21vZHVsZXMvYWdlbmRhL3NyYy9jYWxlbmRhci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUV6RCxPQUFPLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBYyxNQUFNLGNBQWMsQ0FBQzs7Ozs7OztBQWdCM0QsTUFBTSxPQUFPLHFCQUFxQjtJQW1DaEMsWUFDUyxTQUErQixFQUMvQixTQUEwQixFQUMxQixTQUEwQixFQUMxQixFQUFxQixFQUNyQixPQUEyQixFQUMzQixPQUEyQixFQUMzQixHQUFzQixFQUN0QixDQUEwQjtRQVAxQixjQUFTLEdBQVQsU0FBUyxDQUFzQjtRQUMvQixjQUFTLEdBQVQsU0FBUyxDQUFpQjtRQUMxQixjQUFTLEdBQVQsU0FBUyxDQUFpQjtRQUMxQixPQUFFLEdBQUYsRUFBRSxDQUFtQjtRQUNyQixZQUFPLEdBQVAsT0FBTyxDQUFvQjtRQUMzQixZQUFPLEdBQVAsT0FBTyxDQUFvQjtRQUMzQixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUN0QixNQUFDLEdBQUQsQ0FBQyxDQUF5QjtRQWpCbkM7O1dBRUc7UUFDSSxXQUFNLEdBQWdCLElBQUksR0FBRyxFQUFVLENBQUM7UUFDL0M7O1dBRUc7UUFDSSxrQkFBYSxHQUFHLE1BQU0sQ0FBQztJQVczQixDQUFDO0lBQ0csUUFBUTtRQUNiLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDNUMsaUJBQWlCO1FBQ2pCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLFFB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QUMsT0FBTyxFQUFFLENBQUM7SUFDM0IsQ0FBQzs7a0hBdklVLHFCQUFxQjtzR0FBckIscUJBQXFCLDJKQ2xCbEMseTBKQThHQTsyRkQ1RmEscUJBQXFCO2tCQUxqQyxTQUFTOytCQUNFLGVBQWU7K1VBUVQsUUFBUTtzQkFBdkIsS0FBSztnQkFJVSxtQkFBbUI7c0JBQWxDLEtBQUs7Z0JBSVUsU0FBUztzQkFBeEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTW9kYWxDb250cm9sbGVyLCBBbGVydENvbnRyb2xsZXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQgeyBDYWxlbmRhciwgQ2hlY2ssIE1lbWJlcnNoaXAgfSBmcm9tICdpZGVhLXRvb2xib3gnO1xuaW1wb3J0IHtcbiAgSURFQUxvYWRpbmdTZXJ2aWNlLFxuICBJREVBQVdTQVBJU2VydmljZSxcbiAgSURFQVRpbkNhblNlcnZpY2UsXG4gIElERUFNZXNzYWdlU2VydmljZSxcbiAgSURFQVRyYW5zbGF0aW9uc1NlcnZpY2Vcbn0gZnJvbSAnQGlkZWEtaW9uaWMvY29tbW9uJztcblxuaW1wb3J0IHsgSURFQUNhbGVuZGFyc1NlcnZpY2UgfSBmcm9tICcuL2NhbGVuZGFycy5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaWRlYS1jYWxlbmRhcicsXG4gIHRlbXBsYXRlVXJsOiAnY2FsZW5kYXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnY2FsZW5kYXIuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBJREVBQ2FsZW5kYXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAvKipcbiAgICogVGhlIGNhbGVuZGFyIHRvIG1hbmFnZS5cbiAgICovXG4gIEBJbnB1dCgpIHB1YmxpYyBjYWxlbmRhcjogQ2FsZW5kYXI7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHdlIHdhbnQgdG8gZW5hYmxlIGFkdmFuY2VkIHBlcm1pc3Npb25zIChiYXNlZCBvbiB0aGUgbWVtYmVyc2hpcHMpIG9uIHRoZSBjYWxlbmRhci5cbiAgICovXG4gIEBJbnB1dCgpIHB1YmxpYyBhZHZhbmNlZFBlcm1pc3Npb25zOiBib29sZWFuO1xuICAvKipcbiAgICogV2hldGhlciB0aGUgY2FsZW5kYXIgY29sb3IgaXMgYW4gaW1wb3J0YW50IGRldGFpbCBvciBpdCBzaG91bGRuJ3QgYmUgc2hvd24uXG4gICAqL1xuICBASW5wdXQoKSBwdWJsaWMgaGlkZUNvbG9yOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXb3JraW5nIGNvcHkgb2YgdGhlIGNhbGVuZGFyLCB0byB1cGRhdGUgb25seSB3aGVuIGNvbmZpcm1lZC5cbiAgICovXG4gIHB1YmxpYyBfY2FsZW5kYXI6IENhbGVuZGFyO1xuICAvKipcbiAgICogSGVscGVyIHRvIGFsbG93IHNlbGVjdGluZyBtZW1iZXJzaGlwcy5cbiAgICovXG4gIHB1YmxpYyBtZW1iZXJzaGlwc0NoZWNrczogQ2hlY2tbXTtcbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IG1lbWJlcnNoaXAuXG4gICAqL1xuICBwdWJsaWMgbWVtYmVyc2hpcDogTWVtYmVyc2hpcDtcbiAgLyoqXG4gICAqIEVycm9ycyB3aGlsZSB2YWxpZGF0aW5nIHRoZSBlbnRpdHkuXG4gICAqL1xuICBwdWJsaWMgZXJyb3JzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAvKipcbiAgICogVGhlIGRlZmF1bHQgY29sb3IgZm9yIGEgY2FsZW5kYXIuXG4gICAqL1xuICBwdWJsaWMgREVGQVVMVF9DT0xPUiA9ICcjNTU1JztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgY2FsZW5kYXJzOiBJREVBQ2FsZW5kYXJzU2VydmljZSxcbiAgICBwdWJsaWMgbW9kYWxDdHJsOiBNb2RhbENvbnRyb2xsZXIsXG4gICAgcHVibGljIGFsZXJ0Q3RybDogQWxlcnRDb250cm9sbGVyLFxuICAgIHB1YmxpYyB0YzogSURFQVRpbkNhblNlcnZpY2UsXG4gICAgcHVibGljIGxvYWRpbmc6IElERUFMb2FkaW5nU2VydmljZSxcbiAgICBwdWJsaWMgbWVzc2FnZTogSURFQU1lc3NhZ2VTZXJ2aWNlLFxuICAgIHB1YmxpYyBBUEk6IElERUFBV1NBUElTZXJ2aWNlLFxuICAgIHB1YmxpYyB0OiBJREVBVHJhbnNsYXRpb25zU2VydmljZVxuICApIHt9XG4gIHB1YmxpYyBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLm1lbWJlcnNoaXAgPSB0aGlzLnRjLmdldCgnbWVtYmVyc2hpcCcpO1xuICAgIC8vIHdvcmsgb24gYSBjb3B5XG4gICAgdGhpcy5fY2FsZW5kYXIgPSBuZXcgQ2FsZW5kYXIodGhpcy5jYWxlbmRhcik7XG4gICAgLy8gbG9hZCB0aGUgdGVhbW1hdGVzIHRvIHVzZSBmb3Igc2hhcmVkIGNhbGVuZGFycyBwZXJtaXNzaW9uc1xuICAgIHRoaXMuQVBJLmdldFJlc291cmNlKGB0ZWFtcy8ke3RoaXMubWVtYmVyc2hpcC50ZWFtSWR9L21lbWJlcnNoaXBzYClcbiAgICAgIC50aGVuKFxuICAgICAgICAobWVtYmVyc2hpcHM6IE1lbWJlcnNoaXBbXSkgPT5cbiAgICAgICAgICAodGhpcy5tZW1iZXJzaGlwc0NoZWNrcyA9IG1lbWJlcnNoaXBzLm1hcChcbiAgICAgICAgICAgIG0gPT5cbiAgICAgICAgICAgICAgbmV3IENoZWNrKHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogbS51c2VySWQsXG4gICAgICAgICAgICAgICAgbmFtZTogbS5uYW1lLFxuICAgICAgICAgICAgICAgIGNoZWNrZWQ6ICh0aGlzLl9jYWxlbmRhci51c2Vyc0Nhbk1hbmFnZUFwcG9pbnRtZW50cyB8fCBbXSkuc29tZSh4ID0+IHggPT09IG0udXNlcklkKVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICkpXG4gICAgICApXG4gICAgICAuY2F0Y2goKCkgPT4ge30pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgc3VwcG9ydCBhcnJheSB0byBkaXNwbGF5IGVycm9ycyBpbiB0aGUgVUkuXG4gICAqL1xuICBwdWJsaWMgaGFzRmllbGRBbkVycm9yKGZpZWxkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5lcnJvcnMuaGFzKGZpZWxkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlIGEgY2FsZW5kYXIgd2l0aCB0aGUgbmV3IGluZm8uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2F2ZSgpIHtcbiAgICAvLyBzZXQgdGhlIGRlZmF1bHQgY29sb3IsIGluIGNhc2Ugbm9uZSB3YXMgc2VsZWN0ZWRcbiAgICBpZiAoIXRoaXMuX2NhbGVuZGFyLmNvbG9yKSB0aGlzLl9jYWxlbmRhci5jb2xvciA9IHRoaXMuREVGQVVMVF9DT0xPUjtcbiAgICAvLyBtYXAgdGhlIG1lbWJlcnNoaXBzIGFibGUgdG8gbWFuYWdlIGFwcG9pbnRtZW50c1xuICAgIGlmICh0aGlzLl9jYWxlbmRhci5pc1NoYXJlZCgpICYmIHRoaXMuYWR2YW5jZWRQZXJtaXNzaW9ucylcbiAgICAgIHRoaXMuX2NhbGVuZGFyLnVzZXJzQ2FuTWFuYWdlQXBwb2ludG1lbnRzID0gdGhpcy5tZW1iZXJzaGlwc0NoZWNrc1xuICAgICAgICAuZmlsdGVyKHggPT4geC5jaGVja2VkKVxuICAgICAgICAubWFwKHggPT4gU3RyaW5nKHgudmFsdWUpKTtcbiAgICBlbHNlIGRlbGV0ZSB0aGlzLl9jYWxlbmRhci51c2Vyc0Nhbk1hbmFnZUFwcG9pbnRtZW50cztcbiAgICAvLyBjaGVja2luZ3NcbiAgICB0aGlzLmVycm9ycyA9IG5ldyBTZXQodGhpcy5fY2FsZW5kYXIudmFsaWRhdGUoKSk7XG4gICAgaWYgKHRoaXMuZXJyb3JzLnNpemUpIHJldHVybiB0aGlzLm1lc3NhZ2UuZXJyb3IoJ0NPTU1PTi5GT1JNX0hBU19FUlJPUl9UT19DSEVDSycpO1xuICAgIC8vIHNlbmQgYSBwdXQgcmVxdWVzdFxuICAgIGF3YWl0IHRoaXMubG9hZGluZy5zaG93KCk7XG4gICAgdGhpcy5jYWxlbmRhcnNcbiAgICAgIC5wdXRDYWxlbmRhcih0aGlzLl9jYWxlbmRhcilcbiAgICAgIC50aGVuKChyZXM6IENhbGVuZGFyKSA9PiB7XG4gICAgICAgIHRoaXMuY2FsZW5kYXIubG9hZChyZXMpO1xuICAgICAgICB0aGlzLm1lc3NhZ2Uuc3VjY2VzcygnSURFQV9BR0VOREEuQ0FMRU5EQVJTLkNBTEVOREFSX1NBVkVEJyk7XG4gICAgICAgIHRoaXMubW9kYWxDdHJsLmRpc21pc3ModGhpcy5jYWxlbmRhcik7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKCgpID0+IHRoaXMubWVzc2FnZS5lcnJvcignQ09NTU9OLk9QRVJBVElPTl9GQUlMRUQnKSlcbiAgICAgIC5maW5hbGx5KCgpID0+IHRoaXMubG9hZGluZy5oaWRlKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSB0aGUgY2FsZW5kYXIuXG4gICAqL1xuICBwdWJsaWMgZGVsZXRlKCkge1xuICAgIHRoaXMuYWxlcnRDdHJsXG4gICAgICAuY3JlYXRlKHtcbiAgICAgICAgaGVhZGVyOiB0aGlzLnQuXygnQ09NTU9OLkFSRV9ZT1VfU1VSRScpLFxuICAgICAgICBzdWJIZWFkZXI6IHRoaXMudC5fKCdJREVBX0FHRU5EQS5DQUxFTkRBUlMuREVMRVRFX0NBTEVOREFSJyksXG4gICAgICAgIG1lc3NhZ2U6IHRoaXMudC5fKCdJREVBX0FHRU5EQS5DQUxFTkRBUlMuREVMRVRFX0NBTEVOREFSX0hJTlQnKSxcbiAgICAgICAgYnV0dG9uczogW1xuICAgICAgICAgIHsgdGV4dDogdGhpcy50Ll8oJ0NPTU1PTi5DQU5DRUwnKSwgcm9sZTogJ2NhbmNlbCcgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0ZXh0OiB0aGlzLnQuXygnQ09NTU9OLkRFTEVURScpLFxuICAgICAgICAgICAgaGFuZGxlcjogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWRpbmcuc2hvdygpO1xuICAgICAgICAgICAgICB0aGlzLmNhbGVuZGFyc1xuICAgICAgICAgICAgICAgIC5kZWxldGVDYWxlbmRhcih0aGlzLl9jYWxlbmRhcilcbiAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2Uuc3VjY2VzcygnSURFQV9BR0VOREEuQ0FMRU5EQVJTLkNBTEVOREFSX0RFTEVURUQnKTtcbiAgICAgICAgICAgICAgICAgIHRoaXMubW9kYWxDdHJsLmRpc21pc3ModHJ1ZSk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goKCkgPT4gdGhpcy5tZXNzYWdlLmVycm9yKCdDT01NT04uT1BFUkFUSU9OX0ZBSUxFRCcpKVxuICAgICAgICAgICAgICAgIC5maW5hbGx5KCgpID0+IHRoaXMubG9hZGluZy5oaWRlKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSlcbiAgICAgIC50aGVuKGFsZXJ0ID0+IGFsZXJ0LnByZXNlbnQoKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgdGhlIGNvbXBvbmVudC5cbiAgICovXG4gIHB1YmxpYyBjbG9zZSgpIHtcbiAgICB0aGlzLm1vZGFsQ3RybC5kaXNtaXNzKCk7XG4gIH1cbn1cbiIsIjxpb24taGVhZGVyPlxuICA8aW9uLXRvb2xiYXIgY29sb3I9XCJpZGVhVG9vbGJhclwiPlxuICAgIDxpb24tYnV0dG9ucyBzbG90PVwic3RhcnRcIj5cbiAgICAgIDxpb24tYnV0dG9uIFt0aXRsZV09XCJ0Ll8oJ0NPTU1PTi5DTE9TRScpXCIgKGNsaWNrKT1cImNsb3NlKClcIj5cbiAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJjbG9zZS1jaXJjbGVcIiBzbG90PVwiaWNvbi1vbmx5XCI+PC9pb24taWNvbj5cbiAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICA8L2lvbi1idXR0b25zPlxuICAgIDxpb24tdGl0bGU+e3sgJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5FRElUX0NBTEVOREFSJyB8IHRyYW5zbGF0ZSB9fTwvaW9uLXRpdGxlPlxuICAgIDxpb24tYnV0dG9ucyBzbG90PVwiZW5kXCI+XG4gICAgICA8aW9uLWJ1dHRvbiBbdGl0bGVdPVwidC5fKCdDT01NT04uU0FWRScpXCIgKGNsaWNrKT1cInNhdmUoKVwiPlxuICAgICAgICA8aW9uLWljb24gbmFtZT1cImNoZWNrbWFyay1jaXJjbGVcIiBzbG90PVwiaWNvbi1vbmx5XCI+PC9pb24taWNvbj5cbiAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICA8L2lvbi1idXR0b25zPlxuICA8L2lvbi10b29sYmFyPlxuPC9pb24taGVhZGVyPlxuPGlvbi1jb250ZW50PlxuICA8ZGl2IGNsYXNzPVwibWF4V2lkdGhDb250YWluZXJcIiAqbmdJZj1cIl9jYWxlbmRhclwiPlxuICAgIDxpb24tbGlzdCBjbGFzcz1cImFMaXN0XCI+XG4gICAgICA8aW9uLWl0ZW1cbiAgICAgICAgbGluZXM9XCJpbnNldFwiXG4gICAgICAgIFtjbGFzcy5maWVsZEhhc0Vycm9yXT1cImhhc0ZpZWxkQW5FcnJvcignbmFtZScpXCJcbiAgICAgICAgW3RpdGxlXT1cInQuXygnSURFQV9BR0VOREEuQ0FMRU5EQVJTLk5BTUVfSElOVCcpXCJcbiAgICAgID5cbiAgICAgICAgPGlvbi1sYWJlbCBwb3NpdGlvbj1cInN0YWNrZWRcIj57eyAnSURFQV9BR0VOREEuQ0FMRU5EQVJTLk5BTUUnIHwgdHJhbnNsYXRlIH19IDwvaW9uLWxhYmVsPlxuICAgICAgICA8aW9uLWlucHV0IFtwbGFjZWhvbGRlcl09XCJ0Ll8oJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5OQU1FX0hJTlQnKVwiIFsobmdNb2RlbCldPVwiX2NhbGVuZGFyLm5hbWVcIj48L2lvbi1pbnB1dD5cbiAgICAgIDwvaW9uLWl0ZW0+XG4gICAgICA8aW9uLWl0ZW1cbiAgICAgICAgbGluZXM9XCJpbnNldFwiXG4gICAgICAgIFtjbGFzcy5maWVsZEhhc0Vycm9yXT1cImhhc0ZpZWxkQW5FcnJvcignZGVzY3JpcHRpb24nKVwiXG4gICAgICAgIFt0aXRsZV09XCJ0Ll8oJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5ERVNDUklQVElPTl9ISU5UJylcIlxuICAgICAgPlxuICAgICAgICA8aW9uLWxhYmVsIHBvc2l0aW9uPVwic3RhY2tlZFwiPnt7ICdJREVBX0FHRU5EQS5DQUxFTkRBUlMuREVTQ1JJUFRJT04nIHwgdHJhbnNsYXRlIH19IDwvaW9uLWxhYmVsPlxuICAgICAgICA8aW9uLWlucHV0XG4gICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInQuXygnSURFQV9BR0VOREEuQ0FMRU5EQVJTLkRFU0NSSVBUSU9OX0hJTlQnKVwiXG4gICAgICAgICAgWyhuZ01vZGVsKV09XCJfY2FsZW5kYXIuZGVzY3JpcHRpb25cIlxuICAgICAgICA+PC9pb24taW5wdXQ+XG4gICAgICA8L2lvbi1pdGVtPlxuICAgICAgPGlkZWEtY29sb3ItcGlja2VyXG4gICAgICAgICpuZ0lmPVwiIWhpZGVDb2xvclwiXG4gICAgICAgIFtsaW5lc109XCInaW5zZXQnXCJcbiAgICAgICAgW2N1cnJlbnRdPVwiX2NhbGVuZGFyLmNvbG9yXCJcbiAgICAgICAgW2xhYmVsXT1cInQuXygnSURFQV9BR0VOREEuQ0FMRU5EQVJTLkNPTE9SJylcIlxuICAgICAgICBbY2xhc3MuZmllbGRIYXNFcnJvcl09XCJoYXNGaWVsZEFuRXJyb3IoJ2NvbG9yJylcIlxuICAgICAgICAoc2VsZWN0KT1cIiRldmVudCA/IChfY2FsZW5kYXIuY29sb3IgPSAkZXZlbnQpIDogbnVsbFwiXG4gICAgICA+PC9pZGVhLWNvbG9yLXBpY2tlcj5cbiAgICAgIDxpZGVhLWNoZWNrZXJcbiAgICAgICAgKm5nSWY9XCJtZW1iZXJzaGlwc0NoZWNrcyAmJiBfY2FsZW5kYXIuaXNTaGFyZWQoKSAmJiBhZHZhbmNlZFBlcm1pc3Npb25zXCJcbiAgICAgICAgW2RhdGFdPVwibWVtYmVyc2hpcHNDaGVja3NcIlxuICAgICAgICBbbGFiZWxdPVwidC5fKCdJREVBX0FHRU5EQS5DQUxFTkRBUlMuVVNFUlNfQUxMT1dFRF9UT19NQU5BR0VfQVBQT0lOVE1FTlRTJylcIlxuICAgICAgICBbc2VhcmNoUGxhY2Vob2xkZXJdPVwidC5fKCdJREVBX0FHRU5EQS5DQUxFTkRBUlMuV0hPX0NBTl9NQU5BR0VfQVBQT0lOVE1FTlRTJylcIlxuICAgICAgICBbbm9uZVRleHRdPVwidC5fKCdJREVBX0FHRU5EQS5DQUxFTkRBUlMuTk9CT0RZJylcIlxuICAgICAgICBbYWxsVGV4dF09XCJ0Ll8oJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5FVkVSWU9ORScpXCJcbiAgICAgICAgW2FsbG93U2VsZWN0RGVzZWxlY3RBbGxdPVwidHJ1ZVwiXG4gICAgICAgIFtsaW5lc109XCInaW5zZXQnXCJcbiAgICAgID48L2lkZWEtY2hlY2tlcj5cbiAgICA8L2lvbi1saXN0PlxuICAgIDxpb24tbGlzdCBjbGFzcz1cImFMaXN0XCIgKm5nSWY9XCJfY2FsZW5kYXIuZXh0ZXJuYWw/LnNlcnZpY2VcIj5cbiAgICAgIDxpb24tbGlzdC1oZWFkZXI+XG4gICAgICAgIDxpb24tbGFiZWw+XG4gICAgICAgICAgPGgyPnt7ICdJREVBX0FHRU5EQS5DQUxFTkRBUlMuSU5GT19PTl9DQUxFTkRBUicgfCB0cmFuc2xhdGUgfX08L2gyPlxuICAgICAgICA8L2lvbi1sYWJlbD5cbiAgICAgIDwvaW9uLWxpc3QtaGVhZGVyPlxuICAgICAgPGlvbi1pdGVtIGxpbmVzPVwiaW5zZXRcIiAqbmdJZj1cImNhbGVuZGFyLnVzZXJJZFwiPlxuICAgICAgICA8aW9uLWxhYmVsPlxuICAgICAgICAgIHt7ICdJREVBX0FHRU5EQS5DQUxFTkRBUlMuUFJJVkFURV9DQUxFTkRBUicgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8cD57eyAnSURFQV9BR0VOREEuQ0FMRU5EQVJTLlBSSVZBVEVfQ0FMRU5EQVJfSElOVCcgfCB0cmFuc2xhdGUgfX08L3A+XG4gICAgICAgIDwvaW9uLWxhYmVsPlxuICAgICAgICA8aW9uLWljb24gc2xvdD1cImVuZFwiIG5hbWU9XCJwZXJzb25cIj48L2lvbi1pY29uPlxuICAgICAgPC9pb24taXRlbT5cbiAgICAgIDxpb24taXRlbSBsaW5lcz1cImluc2V0XCIgKm5nSWY9XCJjYWxlbmRhci50ZWFtSWRcIj5cbiAgICAgICAgPGlvbi1sYWJlbD5cbiAgICAgICAgICB7eyAnSURFQV9BR0VOREEuQ0FMRU5EQVJTLlRFQU1fQ0FMRU5EQVInIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPHA+e3sgJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5URUFNX0NBTEVOREFSX0hJTlQnIHwgdHJhbnNsYXRlIH19PC9wPlxuICAgICAgICA8L2lvbi1sYWJlbD5cbiAgICAgICAgPGlvbi1pY29uIHNsb3Q9XCJlbmRcIiBuYW1lPVwicGVvcGxlXCI+PC9pb24taWNvbj5cbiAgICAgIDwvaW9uLWl0ZW0+XG4gICAgICA8aW9uLWl0ZW0gbGluZXM9XCJpbnNldFwiPlxuICAgICAgICA8aW9uLWxhYmVsPlxuICAgICAgICAgIHt7ICdJREVBX0FHRU5EQS5DQUxFTkRBUlMuTElOS0VEX1RPJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIHt7ICdJREVBX0FHRU5EQS5DQUxFTkRBUlMuU0VSVklDRVMuJyArIF9jYWxlbmRhci5leHRlcm5hbC5zZXJ2aWNlIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPHA+e3sgX2NhbGVuZGFyLmV4dGVybmFsLm5hbWUgfX0gKHt7IF9jYWxlbmRhci5leHRlcm5hbC5lbWFpbCB9fSk8L3A+XG4gICAgICAgIDwvaW9uLWxhYmVsPlxuICAgICAgICA8aW9uLWljb24gc2xvdD1cImVuZFwiIFtuYW1lXT1cImNhbGVuZGFycy5nZXRTZXJ2aWNlSWNvbihfY2FsZW5kYXIuZXh0ZXJuYWwuc2VydmljZSlcIj48L2lvbi1pY29uPlxuICAgICAgPC9pb24taXRlbT5cbiAgICAgIDxpb24taXRlbSBsaW5lcz1cImluc2V0XCI+XG4gICAgICAgIDxpb24tbGFiZWw+XG4gICAgICAgICAge3sgJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5BQ0NFU1NfTEVWRUxTLicgKyBfY2FsZW5kYXIuZXh0ZXJuYWwudXNlckFjY2VzcyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDxwPnt7ICdJREVBX0FHRU5EQS5DQUxFTkRBUlMuQkFTRURfT05fRVhURVJOQUxfU0VSVklDRV9TSEFSSU5HX1BFUk1JU1NJT04nIHwgdHJhbnNsYXRlIH19PC9wPlxuICAgICAgICA8L2lvbi1sYWJlbD5cbiAgICAgICAgPGlvbi1pY29uIHNsb3Q9XCJlbmRcIiBuYW1lPVwic2hpZWxkXCI+PC9pb24taWNvbj5cbiAgICAgIDwvaW9uLWl0ZW0+XG4gICAgPC9pb24tbGlzdD5cbiAgICA8aW9uLWxpc3QgY2xhc3M9XCJhTGlzdFwiPlxuICAgICAgPGlvbi1saXN0LWhlYWRlcj5cbiAgICAgICAgPGlvbi1sYWJlbCBjb2xvcj1cImRhbmdlclwiPlxuICAgICAgICAgIDxoMj57eyAnSURFQV9BR0VOREEuQ0FMRU5EQVJTLkRBTkdFUk9VU19aT05FJyB8IHRyYW5zbGF0ZSB9fTwvaDI+XG4gICAgICAgIDwvaW9uLWxhYmVsPlxuICAgICAgPC9pb24tbGlzdC1oZWFkZXI+XG4gICAgICA8aW9uLWl0ZW0gbGluZXM9XCJpbnNldFwiPlxuICAgICAgICA8aW9uLWxhYmVsIGNsYXNzPVwiaW9uLXRleHQtd3JhcFwiPlxuICAgICAgICAgIHt7ICdJREVBX0FHRU5EQS5DQUxFTkRBUlMuREVMRVRFX0NBTEVOREFSJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDxwPnt7ICdJREVBX0FHRU5EQS5DQUxFTkRBUlMuREVMRVRFX0NBTEVOREFSX0hJTlQnIHwgdHJhbnNsYXRlIH19PC9wPlxuICAgICAgICA8L2lvbi1sYWJlbD5cbiAgICAgICAgPGlvbi1idXR0b24gY29sb3I9XCJkYW5nZXJcIiBbdGl0bGVdPVwidC5fKCdJREVBX0FHRU5EQS5DQUxFTkRBUlMuREVMRVRFX0NBTEVOREFSX0hJTlQnKVwiIChjbGljayk9XCJkZWxldGUoKVwiPlxuICAgICAgICAgIHt7ICdDT01NT04uREVMRVRFJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICA8L2lvbi1pdGVtPlxuICAgIDwvaW9uLWxpc3Q+XG4gIDwvZGl2PlxuPC9pb24tY29udGVudD5cbiJdfQ==
@@ -0,0 +1,142 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import { Calendar, ExternalCalendarInfo, ExternalCalendarSources } from 'idea-toolbox';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "./calendars.service";
5
+ import * as i2 from "@ionic/angular";
6
+ import * as i3 from "@idea-ionic/common";
7
+ import * as i4 from "@angular/common";
8
+ export class IDEACalendarCreationComponent {
9
+ constructor(calendars, modalCtrl, tc, loading, message, API, t) {
10
+ this.calendars = calendars;
11
+ this.modalCtrl = modalCtrl;
12
+ this.tc = tc;
13
+ this.loading = loading;
14
+ this.message = message;
15
+ this.API = API;
16
+ this.t = t;
17
+ /**
18
+ * The default color for a new calendar.
19
+ */
20
+ this.DEFAULT_COLOR = '#555';
21
+ /**
22
+ * The possible external services for the new calendar.
23
+ */
24
+ this.SOURCES = Object.keys(ExternalCalendarSources);
25
+ }
26
+ ngOnInit() {
27
+ this.calendar = new Calendar();
28
+ this.membership = this.tc.get('membership');
29
+ if (this.fixScope === CalendarScopes.SHARED)
30
+ this.calendar.teamId = this.membership.teamId;
31
+ if (this.fixScope === CalendarScopes.PRIVATE)
32
+ this.calendar.userId = this.membership.userId;
33
+ }
34
+ /**
35
+ * If allowed by the component configuration, reset the scope of the calendar (private/shared).
36
+ */
37
+ resetScope() {
38
+ if (this.canChangeScope())
39
+ this.calendar.teamId = this.calendar.userId = null;
40
+ }
41
+ /**
42
+ * Whether we can change the scope of the calendar (private/shared).
43
+ */
44
+ canChangeScope() {
45
+ return !this.fixScope && this.scopeIsSet();
46
+ }
47
+ /**
48
+ * Whether the scope has been set already.
49
+ */
50
+ scopeIsSet() {
51
+ return Boolean(this.calendar.userId) || Boolean(this.calendar.teamId);
52
+ }
53
+ /**
54
+ * Add a new calendar based on the configuration set.
55
+ */
56
+ async saveNewCalendar(service) {
57
+ // be sure the scope of the calendar was chosen
58
+ if (!this.scopeIsSet())
59
+ return;
60
+ // be sure we are allowed to create the calendar
61
+ if (!service && this.onlyExternalCalendars)
62
+ return;
63
+ // flag the calendar so it has to be linked to an externals service (the procedure follows the creation)
64
+ if (service) {
65
+ this.calendar.external = new ExternalCalendarInfo({ service });
66
+ this.calendar.name = '-'; // it will be substituted with the external name
67
+ }
68
+ else {
69
+ // default values for local calendars
70
+ this.calendar.name = this.calendar.userId
71
+ ? this.t._('IDEA_AGENDA.CALENDARS.DEFAULT_PERSONAL_CALENDAR_NAME')
72
+ : this.t._('IDEA_AGENDA.CALENDARS.DEFAULT_TEAM_CALENDAR_NAME');
73
+ this.calendar.color = this.DEFAULT_COLOR;
74
+ }
75
+ // save (create) the new calendar
76
+ await this.loading.show();
77
+ this.calendars
78
+ .postCalendar(this.calendar)
79
+ .then(cal => {
80
+ this.calendar.load(cal);
81
+ this.message.success('IDEA_AGENDA.CALENDARS.CALENDAR_CREATED');
82
+ // if the calendar is local, no further action is needed
83
+ if (!cal.external)
84
+ return this.modalCtrl.dismiss(this.calendar);
85
+ // if the calendar should be linked to an external service, proceed
86
+ this.calendars
87
+ .linkExtService(this.calendar)
88
+ // if the link was successful, let the user pick an external calendar to set
89
+ .then(() => this.calendars.chooseAndSetExternalCalendar(this.calendar))
90
+ .then(async (res) => {
91
+ // if a calendar wasn't set, it can be done later on
92
+ if (!res)
93
+ return this.modalCtrl.dismiss(this.calendar);
94
+ // if an external calendar was set, update the calendar
95
+ this.calendar.load(res);
96
+ // run a first sync for the linked external calendar
97
+ await this.loading.show(this.t._('IDEA_AGENDA.CALENDARS.FIRST_SYNC_MAY_TAKE_A_WHILE'));
98
+ this.calendars
99
+ .syncCalendar(this.calendar)
100
+ .then(() => this.message.success('IDEA_AGENDA.CALENDARS.FIRST_SYNC_COMPLETED'))
101
+ .catch(() => this.message.error('COMMON.OPERATION_FAILED'))
102
+ .finally(() => {
103
+ this.loading.hide();
104
+ // the calendar is ready to go
105
+ this.modalCtrl.dismiss(this.calendar);
106
+ });
107
+ })
108
+ .catch(() => {
109
+ this.message.error('COMMON.OPERATION_FAILED');
110
+ // the operation can be retried later on; close the modal anyway
111
+ this.modalCtrl.dismiss(this.calendar);
112
+ });
113
+ })
114
+ .catch(() => this.message.error('COMMON.OPERATION_FAILED'))
115
+ .finally(() => this.loading.hide());
116
+ }
117
+ /**
118
+ * Close the component.
119
+ */
120
+ close() {
121
+ this.modalCtrl.dismiss();
122
+ }
123
+ }
124
+ IDEACalendarCreationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: IDEACalendarCreationComponent, deps: [{ token: i1.IDEACalendarsService }, { token: i2.ModalController }, { token: i3.IDEATinCanService }, { token: i3.IDEALoadingService }, { token: i3.IDEAMessageService }, { token: i3.IDEAAWSAPIService }, { token: i3.IDEATranslationsService }], target: i0.ɵɵFactoryTarget.Component });
125
+ IDEACalendarCreationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.1", type: IDEACalendarCreationComponent, selector: "idea-calendar-creation", inputs: { fixScope: "fixScope", onlyExternalCalendars: "onlyExternalCalendars" }, ngImport: i0, template: "<ion-header>\n <ion-toolbar color=\"ideaToolbar\">\n <ion-buttons slot=\"start\">\n <ion-button *ngIf=\"!canChangeScope()\" [title]=\"t._('COMMON.CLOSE')\" (click)=\"close()\">\n <ion-icon name=\"close\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n <ion-button *ngIf=\"canChangeScope()\" (click)=\"resetScope()\">\n <ion-icon name=\"arrow-back\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n </ion-buttons>\n <ion-title>\n <span *ngIf=\"!scopeIsSet()\">{{ 'IDEA_AGENDA.CALENDARS.ADD_A_CALENDAR' | translate }}</span>\n <span *ngIf=\"calendar.userId\">{{ 'IDEA_AGENDA.CALENDARS.PERSONAL_CALENDAR' | translate }}</span>\n <span *ngIf=\"calendar.teamId\">\n {{ 'IDEA_AGENDA.CALENDARS.TEAM_CALENDAR' | translate: { team: tc.get('team').name } }}\n </span>\n </ion-title>\n </ion-toolbar>\n</ion-header>\n<ion-content>\n <!-- 1st STEP -->\n <ion-grid class=\"ion-padding choiceGrid\" *ngIf=\"!scopeIsSet()\">\n <ion-row>\n <ion-col class=\"ion-text-center\">\n <h1>{{ 'IDEA_AGENDA.CALENDARS.CREATE_PRIVATE_OR_TEAM' | translate }}</h1>\n </ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col class=\"ion-text-center\" [size]=\"12\" [sizeSm]=\"6\">\n <ion-card [button]=\"true\" (click)=\"calendar.userId = membership.userId\">\n <ion-card-header>\n <ion-card-title>\n <ion-icon name=\"person\"></ion-icon>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <h1>{{ 'IDEA_AGENDA.CALENDARS.PERSONAL_CALENDAR' | translate }}</h1>\n <p>{{ 'IDEA_AGENDA.CALENDARS.PERSONAL_CALENDAR_HINT' | translate }}</p>\n </ion-card-content>\n </ion-card>\n </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"12\" [sizeSm]=\"6\">\n <ion-card [button]=\"true\" (click)=\"calendar.teamId = membership.teamId\">\n <ion-card-header>\n <ion-card-title>\n <ion-icon name=\"people\"></ion-icon>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <h1>{{ 'IDEA_AGENDA.CALENDARS.TEAM_CALENDAR' | translate }}</h1>\n <p>{{ 'IDEA_AGENDA.CALENDARS.TEAM_CALENDAR_HINT' | translate }}</p>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n </ion-grid>\n <!-- 2nd STEP -->\n <ion-grid class=\"ion-padding choiceGrid\" *ngIf=\"scopeIsSet()\">\n <ion-row>\n <ion-col class=\"ion-text-center\">\n <h1>{{ 'IDEA_AGENDA.CALENDARS.WHICH_EXTERNAL_SERVICE_TO_LINK' | translate }}</h1>\n <p>{{ 'IDEA_AGENDA.CALENDARS.WHICH_EXTERNAL_SERVICE_TO_LINK_HINT' | translate }}</p>\n </ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col class=\"ion-text-center\" [size]=\"12\" *ngIf=\"!onlyExternalCalendars\">\n <ion-card class=\"step2\" [button]=\"true\" (click)=\"saveNewCalendar()\">\n <ion-card-header>\n <ion-card-title>\n <ion-icon name=\"remove\"></ion-icon>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <h1>{{ 'IDEA_AGENDA.CALENDARS.DONT_LINK' | translate }}</h1>\n <p>{{ 'IDEA_AGENDA.CALENDARS.DONT_LINK_HINT' | translate }}</p>\n </ion-card-content>\n </ion-card>\n </ion-col>\n <ion-col class=\"ion-text-center\" *ngFor=\"let s of SOURCES\" [size]=\"12\">\n <ion-card class=\"step2\" [button]=\"true\" (click)=\"saveNewCalendar(s)\">\n <ion-card-header>\n <ion-card-title>\n <ion-icon [name]=\"calendars.getServiceIcon(s)\"></ion-icon>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <h1>\n {{ 'IDEA_AGENDA.CALENDARS.LINK_TO' | translate }}\n {{ 'IDEA_AGENDA.CALENDARS.SERVICES.' + s | translate }}\n </h1>\n <p>{{ 'IDEA_AGENDA.CALENDARS.LINK_TO_HINT' | translate }}</p>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n </ion-grid>\n</ion-content>\n", styles: ["ion-content{--background: var(--ion-color-white-shade)}.choiceGrid ion-row ion-col>h1{margin:10px 0 0;font-size:1.1em}.choiceGrid ion-row ion-col>p{margin-top:0;margin-bottom:0;font-size:.9em}.choiceGrid ion-row:first-child ion-col{padding-bottom:25px}.choiceGrid ion-card{--ion-item-background: var(--ion-color-white);--color: var(--ion-color-dark-tint);height:240px;margin:0 auto;text-align:center}.choiceGrid ion-card ion-card-header{padding-bottom:10px}.choiceGrid ion-card ion-card-header ion-card-title{font-size:2.5em}.choiceGrid ion-card ion-card-content h1{font-size:1.4em;height:60px}.choiceGrid ion-card.step2{height:135px}.choiceGrid ion-card.step2 ion-card-header{padding-top:10px;padding-bottom:0}.choiceGrid ion-card.step2 ion-card-content h1{height:auto}\n"], components: [{ type: i2.IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { type: i2.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { type: i2.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { type: i2.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { type: i2.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { type: i2.IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { type: i2.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { type: i2.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { type: i2.IonRow, selector: "ion-row" }, { type: i2.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { type: i2.IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { type: i2.IonCardHeader, selector: "ion-card-header", inputs: ["color", "mode", "translucent"] }, { type: i2.IonCardTitle, selector: "ion-card-title", inputs: ["color", "mode"] }, { type: i2.IonCardContent, selector: "ion-card-content", inputs: ["mode"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "translate": i3.IDEATranslatePipe } });
126
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: IDEACalendarCreationComponent, decorators: [{
127
+ type: Component,
128
+ args: [{ selector: 'idea-calendar-creation', template: "<ion-header>\n <ion-toolbar color=\"ideaToolbar\">\n <ion-buttons slot=\"start\">\n <ion-button *ngIf=\"!canChangeScope()\" [title]=\"t._('COMMON.CLOSE')\" (click)=\"close()\">\n <ion-icon name=\"close\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n <ion-button *ngIf=\"canChangeScope()\" (click)=\"resetScope()\">\n <ion-icon name=\"arrow-back\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n </ion-buttons>\n <ion-title>\n <span *ngIf=\"!scopeIsSet()\">{{ 'IDEA_AGENDA.CALENDARS.ADD_A_CALENDAR' | translate }}</span>\n <span *ngIf=\"calendar.userId\">{{ 'IDEA_AGENDA.CALENDARS.PERSONAL_CALENDAR' | translate }}</span>\n <span *ngIf=\"calendar.teamId\">\n {{ 'IDEA_AGENDA.CALENDARS.TEAM_CALENDAR' | translate: { team: tc.get('team').name } }}\n </span>\n </ion-title>\n </ion-toolbar>\n</ion-header>\n<ion-content>\n <!-- 1st STEP -->\n <ion-grid class=\"ion-padding choiceGrid\" *ngIf=\"!scopeIsSet()\">\n <ion-row>\n <ion-col class=\"ion-text-center\">\n <h1>{{ 'IDEA_AGENDA.CALENDARS.CREATE_PRIVATE_OR_TEAM' | translate }}</h1>\n </ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col class=\"ion-text-center\" [size]=\"12\" [sizeSm]=\"6\">\n <ion-card [button]=\"true\" (click)=\"calendar.userId = membership.userId\">\n <ion-card-header>\n <ion-card-title>\n <ion-icon name=\"person\"></ion-icon>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <h1>{{ 'IDEA_AGENDA.CALENDARS.PERSONAL_CALENDAR' | translate }}</h1>\n <p>{{ 'IDEA_AGENDA.CALENDARS.PERSONAL_CALENDAR_HINT' | translate }}</p>\n </ion-card-content>\n </ion-card>\n </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"12\" [sizeSm]=\"6\">\n <ion-card [button]=\"true\" (click)=\"calendar.teamId = membership.teamId\">\n <ion-card-header>\n <ion-card-title>\n <ion-icon name=\"people\"></ion-icon>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <h1>{{ 'IDEA_AGENDA.CALENDARS.TEAM_CALENDAR' | translate }}</h1>\n <p>{{ 'IDEA_AGENDA.CALENDARS.TEAM_CALENDAR_HINT' | translate }}</p>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n </ion-grid>\n <!-- 2nd STEP -->\n <ion-grid class=\"ion-padding choiceGrid\" *ngIf=\"scopeIsSet()\">\n <ion-row>\n <ion-col class=\"ion-text-center\">\n <h1>{{ 'IDEA_AGENDA.CALENDARS.WHICH_EXTERNAL_SERVICE_TO_LINK' | translate }}</h1>\n <p>{{ 'IDEA_AGENDA.CALENDARS.WHICH_EXTERNAL_SERVICE_TO_LINK_HINT' | translate }}</p>\n </ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col class=\"ion-text-center\" [size]=\"12\" *ngIf=\"!onlyExternalCalendars\">\n <ion-card class=\"step2\" [button]=\"true\" (click)=\"saveNewCalendar()\">\n <ion-card-header>\n <ion-card-title>\n <ion-icon name=\"remove\"></ion-icon>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <h1>{{ 'IDEA_AGENDA.CALENDARS.DONT_LINK' | translate }}</h1>\n <p>{{ 'IDEA_AGENDA.CALENDARS.DONT_LINK_HINT' | translate }}</p>\n </ion-card-content>\n </ion-card>\n </ion-col>\n <ion-col class=\"ion-text-center\" *ngFor=\"let s of SOURCES\" [size]=\"12\">\n <ion-card class=\"step2\" [button]=\"true\" (click)=\"saveNewCalendar(s)\">\n <ion-card-header>\n <ion-card-title>\n <ion-icon [name]=\"calendars.getServiceIcon(s)\"></ion-icon>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <h1>\n {{ 'IDEA_AGENDA.CALENDARS.LINK_TO' | translate }}\n {{ 'IDEA_AGENDA.CALENDARS.SERVICES.' + s | translate }}\n </h1>\n <p>{{ 'IDEA_AGENDA.CALENDARS.LINK_TO_HINT' | translate }}</p>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n </ion-grid>\n</ion-content>\n", styles: ["ion-content{--background: var(--ion-color-white-shade)}.choiceGrid ion-row ion-col>h1{margin:10px 0 0;font-size:1.1em}.choiceGrid ion-row ion-col>p{margin-top:0;margin-bottom:0;font-size:.9em}.choiceGrid ion-row:first-child ion-col{padding-bottom:25px}.choiceGrid ion-card{--ion-item-background: var(--ion-color-white);--color: var(--ion-color-dark-tint);height:240px;margin:0 auto;text-align:center}.choiceGrid ion-card ion-card-header{padding-bottom:10px}.choiceGrid ion-card ion-card-header ion-card-title{font-size:2.5em}.choiceGrid ion-card ion-card-content h1{font-size:1.4em;height:60px}.choiceGrid ion-card.step2{height:135px}.choiceGrid ion-card.step2 ion-card-header{padding-top:10px;padding-bottom:0}.choiceGrid ion-card.step2 ion-card-content h1{height:auto}\n"] }]
129
+ }], ctorParameters: function () { return [{ type: i1.IDEACalendarsService }, { type: i2.ModalController }, { type: i3.IDEATinCanService }, { type: i3.IDEALoadingService }, { type: i3.IDEAMessageService }, { type: i3.IDEAAWSAPIService }, { type: i3.IDEATranslationsService }]; }, propDecorators: { fixScope: [{
130
+ type: Input
131
+ }], onlyExternalCalendars: [{
132
+ type: Input
133
+ }] } });
134
+ /**
135
+ * The possible scopes of the calendar.
136
+ */
137
+ export var CalendarScopes;
138
+ (function (CalendarScopes) {
139
+ CalendarScopes["SHARED"] = "shared";
140
+ CalendarScopes["PRIVATE"] = "private"; // userId
141
+ })(CalendarScopes || (CalendarScopes = {}));
142
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXJDcmVhdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9tb2R1bGVzL2FnZW5kYS9zcmMvY2FsZW5kYXJDcmVhdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9tb2R1bGVzL2FnZW5kYS9zcmMvY2FsZW5kYXJDcmVhdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUV6RCxPQUFPLEVBQUUsUUFBUSxFQUFFLG9CQUFvQixFQUFFLHVCQUF1QixFQUFjLE1BQU0sY0FBYyxDQUFDOzs7Ozs7QUFnQm5HLE1BQU0sT0FBTyw2QkFBNkI7SUEwQnhDLFlBQ1MsU0FBK0IsRUFDL0IsU0FBMEIsRUFDMUIsRUFBcUIsRUFDckIsT0FBMkIsRUFDM0IsT0FBMkIsRUFDM0IsR0FBc0IsRUFDdEIsQ0FBMEI7UUFOMUIsY0FBUyxHQUFULFNBQVMsQ0FBc0I7UUFDL0IsY0FBUyxHQUFULFNBQVMsQ0FBaUI7UUFDMUIsT0FBRSxHQUFGLEVBQUUsQ0FBbUI7UUFDckIsWUFBTyxHQUFQLE9BQU8sQ0FBb0I7UUFDM0IsWUFBTyxHQUFQLE9BQU8sQ0FBb0I7UUFDM0IsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFDdEIsTUFBQyxHQUFELENBQUMsQ0FBeUI7UUFoQm5DOztXQUVHO1FBQ0ksa0JBQWEsR0FBRyxNQUFNLENBQUM7UUFDOUI7O1dBRUc7UUFDSSxZQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0lBVW5ELENBQUM7SUFDRyxRQUFRO1FBQ2IsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDNUMs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QUMsQ0FBQzthQUMxRCxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUs7UUFDVixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzNCLENBQUM7OzBIQTlIVSw2QkFBNkI7OEdBQTdCLDZCQUE2QixnSkNsQjFDLGduSUFpR0E7MkZEL0VhLDZCQUE2QjtrQkFMekMsU0FBUzsrQkFDRSx3QkFBd0I7aVRBUWxCLFFBQVE7c0JBQXZCLEtBQUs7Z0JBSVUscUJBQXFCO3NCQUFwQyxLQUFLOztBQXlIUjs7R0FFRztBQUNILE1BQU0sQ0FBTixJQUFZLGNBR1g7QUFIRCxXQUFZLGNBQWM7SUFDeEIsbUNBQWlCLENBQUE7SUFDakIscUNBQW1CLENBQUEsQ0FBQyxTQUFTO0FBQy9CLENBQUMsRUFIVyxjQUFjLEtBQWQsY0FBYyxRQUd6QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTW9kYWxDb250cm9sbGVyIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHsgQ2FsZW5kYXIsIEV4dGVybmFsQ2FsZW5kYXJJbmZvLCBFeHRlcm5hbENhbGVuZGFyU291cmNlcywgTWVtYmVyc2hpcCB9IGZyb20gJ2lkZWEtdG9vbGJveCc7XG5pbXBvcnQge1xuICBJREVBTG9hZGluZ1NlcnZpY2UsXG4gIElERUFBV1NBUElTZXJ2aWNlLFxuICBJREVBVGluQ2FuU2VydmljZSxcbiAgSURFQU1lc3NhZ2VTZXJ2aWNlLFxuICBJREVBVHJhbnNsYXRpb25zU2VydmljZVxufSBmcm9tICdAaWRlYS1pb25pYy9jb21tb24nO1xuXG5pbXBvcnQgeyBJREVBQ2FsZW5kYXJzU2VydmljZSB9IGZyb20gJy4vY2FsZW5kYXJzLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdpZGVhLWNhbGVuZGFyLWNyZWF0aW9uJyxcbiAgdGVtcGxhdGVVcmw6ICdjYWxlbmRhckNyZWF0aW9uLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJ2NhbGVuZGFyQ3JlYXRpb24uY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBJREVBQ2FsZW5kYXJDcmVhdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHdlIHdhbnQgdG8gYWxsb3cgdGhlIGNyZWF0aW9uIG9mIG9ubHkgYSBwYXJ0aWN1bGFyIHR5cGUgb2YgY2FsZW5kYXIsIGJhc2VkIG9uIHRoZSBzY29wZS5cbiAgICovXG4gIEBJbnB1dCgpIHB1YmxpYyBmaXhTY29wZTogQ2FsZW5kYXJTY29wZXM7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHdlIHdhbnQgdG8gYWxsb3cgdGhlIGNyZWF0aW9uIG9mIGxvY2FsIGNhbGVuZGFycy5cbiAgICovXG4gIEBJbnB1dCgpIHB1YmxpYyBvbmx5RXh0ZXJuYWxDYWxlbmRhcnM6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBtZW1iZXJzaGlwIChnZW5lcmljKS5cbiAgICovXG4gIHB1YmxpYyBtZW1iZXJzaGlwOiBNZW1iZXJzaGlwO1xuICAvKipcbiAgICogVGhlIGNhbGVuZGFyIHRvIGNyZWF0ZS5cbiAgICovXG4gIHB1YmxpYyBjYWxlbmRhcjogQ2FsZW5kYXI7XG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCBjb2xvciBmb3IgYSBuZXcgY2FsZW5kYXIuXG4gICAqL1xuICBwdWJsaWMgREVGQVVMVF9DT0xPUiA9ICcjNTU1JztcbiAgLyoqXG4gICAqIFRoZSBwb3NzaWJsZSBleHRlcm5hbCBzZXJ2aWNlcyBmb3IgdGhlIG5ldyBjYWxlbmRhci5cbiAgICovXG4gIHB1YmxpYyBTT1VSQ0VTID0gT2JqZWN0LmtleXMoRXh0ZXJuYWxDYWxlbmRhclNvdXJjZXMpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBjYWxlbmRhcnM6IElERUFDYWxlbmRhcnNTZXJ2aWNlLFxuICAgIHB1YmxpYyBtb2RhbEN0cmw6IE1vZGFsQ29udHJvbGxlcixcbiAgICBwdWJsaWMgdGM6IElERUFUaW5DYW5TZXJ2aWNlLFxuICAgIHB1YmxpYyBsb2FkaW5nOiBJREVBTG9hZGluZ1NlcnZpY2UsXG4gICAgcHVibGljIG1lc3NhZ2U6IElERUFNZXNzYWdlU2VydmljZSxcbiAgICBwdWJsaWMgQVBJOiBJREVBQVdTQVBJU2VydmljZSxcbiAgICBwdWJsaWMgdDogSURFQVRyYW5zbGF0aW9uc1NlcnZpY2VcbiAgKSB7fVxuICBwdWJsaWMgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5jYWxlbmRhciA9IG5ldyBDYWxlbmRhcigpO1xuICAgIHRoaXMubWVtYmVyc2hpcCA9IHRoaXMudGMuZ2V0KCdtZW1iZXJzaGlwJyk7XG4gICAgaWYgKHRoaXMuZml4U2NvcGUgPT09IENhbGVuZGFyU2NvcGVzLlNIQVJFRCkgdGhpcy5jYWxlbmRhci50ZWFtSWQgPSB0aGlzLm1lbWJlcnNoaXAudGVhbUlkO1xuICAgIGlmICh0aGlzLmZpeFNjb3BlID09PSBDYWxlbmRhclNjb3Blcy5QUklWQVRFKSB0aGlzLmNhbGVuZGFyLnVzZXJJZCA9IHRoaXMubWVtYmVyc2hpcC51c2VySWQ7XG4gIH1cblxuICAvKipcbiAgICogSWYgYWxsb3dlZCBieSB0aGUgY29tcG9uZW50IGNvbmZpZ3VyYXRpb24sIHJlc2V0IHRoZSBzY29wZSBvZiB0aGUgY2FsZW5kYXIgKHByaXZhdGUvc2hhcmVkKS5cbiAgICovXG4gIHB1YmxpYyByZXNldFNjb3BlKCkge1xuICAgIGlmICh0aGlzLmNhbkNoYW5nZVNjb3BlKCkpIHRoaXMuY2FsZW5kYXIudGVhbUlkID0gdGhpcy5jYWxlbmRhci51c2VySWQgPSBudWxsO1xuICB9XG4gIC8qKlxuICAgKiBXaGV0aGVyIHdlIGNhbiBjaGFuZ2UgdGhlIHNjb3BlIG9mIHRoZSBjYWxlbmRhciAocHJpdmF0ZS9zaGFyZWQpLlxuICAgKi9cbiAgcHVibGljIGNhbkNoYW5nZVNjb3BlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5maXhTY29wZSAmJiB0aGlzLnNjb3BlSXNTZXQoKTtcbiAgfVxuICAvKipcbiAgICogV2hldGhlciB0aGUgc2NvcGUgaGFzIGJlZW4gc2V0IGFscmVhZHkuXG4gICAqL1xuICBwdWJsaWMgc2NvcGVJc1NldCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLmNhbGVuZGFyLnVzZXJJZCkgfHwgQm9vbGVhbih0aGlzLmNhbGVuZGFyLnRlYW1JZCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgbmV3IGNhbGVuZGFyIGJhc2VkIG9uIHRoZSBjb25maWd1cmF0aW9uIHNldC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzYXZlTmV3Q2FsZW5kYXIoc2VydmljZT86IEV4dGVybmFsQ2FsZW5kYXJTb3VyY2VzKSB7XG4gICAgLy8gYmUgc3VyZSB0aGUgc2NvcGUgb2YgdGhlIGNhbGVuZGFyIHdhcyBjaG9zZW5cbiAgICBpZiAoIXRoaXMuc2NvcGVJc1NldCgpKSByZXR1cm47XG4gICAgLy8gYmUgc3VyZSB3ZSBhcmUgYWxsb3dlZCB0byBjcmVhdGUgdGhlIGNhbGVuZGFyXG4gICAgaWYgKCFzZXJ2aWNlICYmIHRoaXMub25seUV4dGVybmFsQ2FsZW5kYXJzKSByZXR1cm47XG4gICAgLy8gZmxhZyB0aGUgY2FsZW5kYXIgc28gaXQgaGFzIHRvIGJlIGxpbmtlZCB0byBhbiBleHRlcm5hbHMgc2VydmljZSAodGhlIHByb2NlZHVyZSBmb2xsb3dzIHRoZSBjcmVhdGlvbilcbiAgICBpZiAoc2VydmljZSkge1xuICAgICAgdGhpcy5jYWxlbmRhci5leHRlcm5hbCA9IG5ldyBFeHRlcm5hbENhbGVuZGFySW5mbyh7IHNlcnZpY2UgfSk7XG4gICAgICB0aGlzLmNhbGVuZGFyLm5hbWUgPSAnLSc7IC8vIGl0IHdpbGwgYmUgc3Vic3RpdHV0ZWQgd2l0aCB0aGUgZXh0ZXJuYWwgbmFtZVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBkZWZhdWx0IHZhbHVlcyBmb3IgbG9jYWwgY2FsZW5kYXJzXG4gICAgICB0aGlzLmNhbGVuZGFyLm5hbWUgPSB0aGlzLmNhbGVuZGFyLnVzZXJJZFxuICAgICAgICA/IHRoaXMudC5fKCdJREVBX0FHRU5EQS5DQUxFTkRBUlMuREVGQVVMVF9QRVJTT05BTF9DQUxFTkRBUl9OQU1FJylcbiAgICAgICAgOiB0aGlzLnQuXygnSURFQV9BR0VOREEuQ0FMRU5EQVJTLkRFRkFVTFRfVEVBTV9DQUxFTkRBUl9OQU1FJyk7XG4gICAgICB0aGlzLmNhbGVuZGFyLmNvbG9yID0gdGhpcy5ERUZBVUxUX0NPTE9SO1xuICAgIH1cbiAgICAvLyBzYXZlIChjcmVhdGUpIHRoZSBuZXcgY2FsZW5kYXJcbiAgICBhd2FpdCB0aGlzLmxvYWRpbmcuc2hvdygpO1xuICAgIHRoaXMuY2FsZW5kYXJzXG4gICAgICAucG9zdENhbGVuZGFyKHRoaXMuY2FsZW5kYXIpXG4gICAgICAudGhlbihjYWwgPT4ge1xuICAgICAgICB0aGlzLmNhbGVuZGFyLmxvYWQoY2FsKTtcbiAgICAgICAgdGhpcy5tZXNzYWdlLnN1Y2Nlc3MoJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5DQUxFTkRBUl9DUkVBVEVEJyk7XG4gICAgICAgIC8vIGlmIHRoZSBjYWxlbmRhciBpcyBsb2NhbCwgbm8gZnVydGhlciBhY3Rpb24gaXMgbmVlZGVkXG4gICAgICAgIGlmICghY2FsLmV4dGVybmFsKSByZXR1cm4gdGhpcy5tb2RhbEN0cmwuZGlzbWlzcyh0aGlzLmNhbGVuZGFyKTtcbiAgICAgICAgLy8gaWYgdGhlIGNhbGVuZGFyIHNob3VsZCBiZSBsaW5rZWQgdG8gYW4gZXh0ZXJuYWwgc2VydmljZSwgcHJvY2VlZFxuICAgICAgICB0aGlzLmNhbGVuZGFyc1xuICAgICAgICAgIC5saW5rRXh0U2VydmljZSh0aGlzLmNhbGVuZGFyKVxuICAgICAgICAgIC8vIGlmIHRoZSBsaW5rIHdhcyBzdWNjZXNzZnVsLCBsZXQgdGhlIHVzZXIgcGljayBhbiBleHRlcm5hbCBjYWxlbmRhciB0byBzZXRcbiAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLmNhbGVuZGFycy5jaG9vc2VBbmRTZXRFeHRlcm5hbENhbGVuZGFyKHRoaXMuY2FsZW5kYXIpKVxuICAgICAgICAgIC50aGVuKGFzeW5jIHJlcyA9PiB7XG4gICAgICAgICAgICAvLyBpZiBhIGNhbGVuZGFyIHdhc24ndCBzZXQsIGl0IGNhbiBiZSBkb25lIGxhdGVyIG9uXG4gICAgICAgICAgICBpZiAoIXJlcykgcmV0dXJuIHRoaXMubW9kYWxDdHJsLmRpc21pc3ModGhpcy5jYWxlbmRhcik7XG4gICAgICAgICAgICAvLyBpZiBhbiBleHRlcm5hbCBjYWxlbmRhciB3YXMgc2V0LCB1cGRhdGUgdGhlIGNhbGVuZGFyXG4gICAgICAgICAgICB0aGlzLmNhbGVuZGFyLmxvYWQocmVzKTtcbiAgICAgICAgICAgIC8vIHJ1biBhIGZpcnN0IHN5bmMgZm9yIHRoZSBsaW5rZWQgZXh0ZXJuYWwgY2FsZW5kYXJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubG9hZGluZy5zaG93KHRoaXMudC5fKCdJREVBX0FHRU5EQS5DQUxFTkRBUlMuRklSU1RfU1lOQ19NQVlfVEFLRV9BX1dISUxFJykpO1xuICAgICAgICAgICAgdGhpcy5jYWxlbmRhcnNcbiAgICAgICAgICAgICAgLnN5bmNDYWxlbmRhcih0aGlzLmNhbGVuZGFyKVxuICAgICAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLm1lc3NhZ2Uuc3VjY2VzcygnSURFQV9BR0VOREEuQ0FMRU5EQVJTLkZJUlNUX1NZTkNfQ09NUExFVEVEJykpXG4gICAgICAgICAgICAgIC5jYXRjaCgoKSA9PiB0aGlzLm1lc3NhZ2UuZXJyb3IoJ0NPTU1PTi5PUEVSQVRJT05fRkFJTEVEJykpXG4gICAgICAgICAgICAgIC5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcuaGlkZSgpO1xuICAgICAgICAgICAgICAgIC8vIHRoZSBjYWxlbmRhciBpcyByZWFkeSB0byBnb1xuICAgICAgICAgICAgICAgIHRoaXMubW9kYWxDdHJsLmRpc21pc3ModGhpcy5jYWxlbmRhcik7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZS5lcnJvcignQ09NTU9OLk9QRVJBVElPTl9GQUlMRUQnKTtcbiAgICAgICAgICAgIC8vIHRoZSBvcGVyYXRpb24gY2FuIGJlIHJldHJpZWQgbGF0ZXIgb247IGNsb3NlIHRoZSBtb2RhbCBhbnl3YXlcbiAgICAgICAgICAgIHRoaXMubW9kYWxDdHJsLmRpc21pc3ModGhpcy5jYWxlbmRhcik7XG4gICAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKCgpID0+IHRoaXMubWVzc2FnZS5lcnJvcignQ09NTU9OLk9QRVJBVElPTl9GQUlMRUQnKSlcbiAgICAgIC5maW5hbGx5KCgpID0+IHRoaXMubG9hZGluZy5oaWRlKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIHRoZSBjb21wb25lbnQuXG4gICAqL1xuICBwdWJsaWMgY2xvc2UoKSB7XG4gICAgdGhpcy5tb2RhbEN0cmwuZGlzbWlzcygpO1xuICB9XG59XG5cbi8qKlxuICogVGhlIHBvc3NpYmxlIHNjb3BlcyBvZiB0aGUgY2FsZW5kYXIuXG4gKi9cbmV4cG9ydCBlbnVtIENhbGVuZGFyU2NvcGVzIHtcbiAgU0hBUkVEID0gJ3NoYXJlZCcsIC8vIHRlYW1JZFxuICBQUklWQVRFID0gJ3ByaXZhdGUnIC8vIHVzZXJJZFxufVxuIiwiPGlvbi1oZWFkZXI+XG4gIDxpb24tdG9vbGJhciBjb2xvcj1cImlkZWFUb29sYmFyXCI+XG4gICAgPGlvbi1idXR0b25zIHNsb3Q9XCJzdGFydFwiPlxuICAgICAgPGlvbi1idXR0b24gKm5nSWY9XCIhY2FuQ2hhbmdlU2NvcGUoKVwiIFt0aXRsZV09XCJ0Ll8oJ0NPTU1PTi5DTE9TRScpXCIgKGNsaWNrKT1cImNsb3NlKClcIj5cbiAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJjbG9zZVwiIHNsb3Q9XCJpY29uLW9ubHlcIj48L2lvbi1pY29uPlxuICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgPGlvbi1idXR0b24gKm5nSWY9XCJjYW5DaGFuZ2VTY29wZSgpXCIgKGNsaWNrKT1cInJlc2V0U2NvcGUoKVwiPlxuICAgICAgICA8aW9uLWljb24gbmFtZT1cImFycm93LWJhY2tcIiBzbG90PVwiaWNvbi1vbmx5XCI+PC9pb24taWNvbj5cbiAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICA8L2lvbi1idXR0b25zPlxuICAgIDxpb24tdGl0bGU+XG4gICAgICA8c3BhbiAqbmdJZj1cIiFzY29wZUlzU2V0KClcIj57eyAnSURFQV9BR0VOREEuQ0FMRU5EQVJTLkFERF9BX0NBTEVOREFSJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgIDxzcGFuICpuZ0lmPVwiY2FsZW5kYXIudXNlcklkXCI+e3sgJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5QRVJTT05BTF9DQUxFTkRBUicgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICA8c3BhbiAqbmdJZj1cImNhbGVuZGFyLnRlYW1JZFwiPlxuICAgICAgICB7eyAnSURFQV9BR0VOREEuQ0FMRU5EQVJTLlRFQU1fQ0FMRU5EQVInIHwgdHJhbnNsYXRlOiB7IHRlYW06IHRjLmdldCgndGVhbScpLm5hbWUgfSB9fVxuICAgICAgPC9zcGFuPlxuICAgIDwvaW9uLXRpdGxlPlxuICA8L2lvbi10b29sYmFyPlxuPC9pb24taGVhZGVyPlxuPGlvbi1jb250ZW50PlxuICA8IS0tIDFzdCBTVEVQIC0tPlxuICA8aW9uLWdyaWQgY2xhc3M9XCJpb24tcGFkZGluZyBjaG9pY2VHcmlkXCIgKm5nSWY9XCIhc2NvcGVJc1NldCgpXCI+XG4gICAgPGlvbi1yb3c+XG4gICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi10ZXh0LWNlbnRlclwiPlxuICAgICAgICA8aDE+e3sgJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5DUkVBVEVfUFJJVkFURV9PUl9URUFNJyB8IHRyYW5zbGF0ZSB9fTwvaDE+XG4gICAgICA8L2lvbi1jb2w+XG4gICAgPC9pb24tcm93PlxuICAgIDxpb24tcm93IGNsYXNzPVwiaW9uLWFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgPGlvbi1jb2wgY2xhc3M9XCJpb24tdGV4dC1jZW50ZXJcIiBbc2l6ZV09XCIxMlwiIFtzaXplU21dPVwiNlwiPlxuICAgICAgICA8aW9uLWNhcmQgW2J1dHRvbl09XCJ0cnVlXCIgKGNsaWNrKT1cImNhbGVuZGFyLnVzZXJJZCA9IG1lbWJlcnNoaXAudXNlcklkXCI+XG4gICAgICAgICAgPGlvbi1jYXJkLWhlYWRlcj5cbiAgICAgICAgICAgIDxpb24tY2FyZC10aXRsZT5cbiAgICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJwZXJzb25cIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgPC9pb24tY2FyZC10aXRsZT5cbiAgICAgICAgICA8L2lvbi1jYXJkLWhlYWRlcj5cbiAgICAgICAgICA8aW9uLWNhcmQtY29udGVudD5cbiAgICAgICAgICAgIDxoMT57eyAnSURFQV9BR0VOREEuQ0FMRU5EQVJTLlBFUlNPTkFMX0NBTEVOREFSJyB8IHRyYW5zbGF0ZSB9fTwvaDE+XG4gICAgICAgICAgICA8cD57eyAnSURFQV9BR0VOREEuQ0FMRU5EQVJTLlBFUlNPTkFMX0NBTEVOREFSX0hJTlQnIHwgdHJhbnNsYXRlIH19PC9wPlxuICAgICAgICAgIDwvaW9uLWNhcmQtY29udGVudD5cbiAgICAgICAgPC9pb24tY2FyZD5cbiAgICAgIDwvaW9uLWNvbD5cbiAgICAgIDxpb24tY29sIGNsYXNzPVwiaW9uLXRleHQtY2VudGVyXCIgW3NpemVdPVwiMTJcIiBbc2l6ZVNtXT1cIjZcIj5cbiAgICAgICAgPGlvbi1jYXJkIFtidXR0b25dPVwidHJ1ZVwiIChjbGljayk9XCJjYWxlbmRhci50ZWFtSWQgPSBtZW1iZXJzaGlwLnRlYW1JZFwiPlxuICAgICAgICAgIDxpb24tY2FyZC1oZWFkZXI+XG4gICAgICAgICAgICA8aW9uLWNhcmQtdGl0bGU+XG4gICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwicGVvcGxlXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgIDwvaW9uLWNhcmQtdGl0bGU+XG4gICAgICAgICAgPC9pb24tY2FyZC1oZWFkZXI+XG4gICAgICAgICAgPGlvbi1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICA8aDE+e3sgJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5URUFNX0NBTEVOREFSJyB8IHRyYW5zbGF0ZSB9fTwvaDE+XG4gICAgICAgICAgICA8cD57eyAnSURFQV9BR0VOREEuQ0FMRU5EQVJTLlRFQU1fQ0FMRU5EQVJfSElOVCcgfCB0cmFuc2xhdGUgfX08L3A+XG4gICAgICAgICAgPC9pb24tY2FyZC1jb250ZW50PlxuICAgICAgICA8L2lvbi1jYXJkPlxuICAgICAgPC9pb24tY29sPlxuICAgIDwvaW9uLXJvdz5cbiAgPC9pb24tZ3JpZD5cbiAgPCEtLSAybmQgU1RFUCAtLT5cbiAgPGlvbi1ncmlkIGNsYXNzPVwiaW9uLXBhZGRpbmcgY2hvaWNlR3JpZFwiICpuZ0lmPVwic2NvcGVJc1NldCgpXCI+XG4gICAgPGlvbi1yb3c+XG4gICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi10ZXh0LWNlbnRlclwiPlxuICAgICAgICA8aDE+e3sgJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5XSElDSF9FWFRFUk5BTF9TRVJWSUNFX1RPX0xJTksnIHwgdHJhbnNsYXRlIH19PC9oMT5cbiAgICAgICAgPHA+e3sgJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5XSElDSF9FWFRFUk5BTF9TRVJWSUNFX1RPX0xJTktfSElOVCcgfCB0cmFuc2xhdGUgfX08L3A+XG4gICAgICA8L2lvbi1jb2w+XG4gICAgPC9pb24tcm93PlxuICAgIDxpb24tcm93IGNsYXNzPVwiaW9uLWFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgPGlvbi1jb2wgY2xhc3M9XCJpb24tdGV4dC1jZW50ZXJcIiBbc2l6ZV09XCIxMlwiICpuZ0lmPVwiIW9ubHlFeHRlcm5hbENhbGVuZGFyc1wiPlxuICAgICAgICA8aW9uLWNhcmQgY2xhc3M9XCJzdGVwMlwiIFtidXR0b25dPVwidHJ1ZVwiIChjbGljayk9XCJzYXZlTmV3Q2FsZW5kYXIoKVwiPlxuICAgICAgICAgIDxpb24tY2FyZC1oZWFkZXI+XG4gICAgICAgICAgICA8aW9uLWNhcmQtdGl0bGU+XG4gICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwicmVtb3ZlXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgIDwvaW9uLWNhcmQtdGl0bGU+XG4gICAgICAgICAgPC9pb24tY2FyZC1oZWFkZXI+XG4gICAgICAgICAgPGlvbi1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICA8aDE+e3sgJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5ET05UX0xJTksnIHwgdHJhbnNsYXRlIH19PC9oMT5cbiAgICAgICAgICAgIDxwPnt7ICdJREVBX0FHRU5EQS5DQUxFTkRBUlMuRE9OVF9MSU5LX0hJTlQnIHwgdHJhbnNsYXRlIH19PC9wPlxuICAgICAgICAgIDwvaW9uLWNhcmQtY29udGVudD5cbiAgICAgICAgPC9pb24tY2FyZD5cbiAgICAgIDwvaW9uLWNvbD5cbiAgICAgIDxpb24tY29sIGNsYXNzPVwiaW9uLXRleHQtY2VudGVyXCIgKm5nRm9yPVwibGV0IHMgb2YgU09VUkNFU1wiIFtzaXplXT1cIjEyXCI+XG4gICAgICAgIDxpb24tY2FyZCBjbGFzcz1cInN0ZXAyXCIgW2J1dHRvbl09XCJ0cnVlXCIgKGNsaWNrKT1cInNhdmVOZXdDYWxlbmRhcihzKVwiPlxuICAgICAgICAgIDxpb24tY2FyZC1oZWFkZXI+XG4gICAgICAgICAgICA8aW9uLWNhcmQtdGl0bGU+XG4gICAgICAgICAgICAgIDxpb24taWNvbiBbbmFtZV09XCJjYWxlbmRhcnMuZ2V0U2VydmljZUljb24ocylcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgPC9pb24tY2FyZC10aXRsZT5cbiAgICAgICAgICA8L2lvbi1jYXJkLWhlYWRlcj5cbiAgICAgICAgICA8aW9uLWNhcmQtY29udGVudD5cbiAgICAgICAgICAgIDxoMT5cbiAgICAgICAgICAgICAge3sgJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5MSU5LX1RPJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICB7eyAnSURFQV9BR0VOREEuQ0FMRU5EQVJTLlNFUlZJQ0VTLicgKyBzIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L2gxPlxuICAgICAgICAgICAgPHA+e3sgJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5MSU5LX1RPX0hJTlQnIHwgdHJhbnNsYXRlIH19PC9wPlxuICAgICAgICAgIDwvaW9uLWNhcmQtY29udGVudD5cbiAgICAgICAgPC9pb24tY2FyZD5cbiAgICAgIDwvaW9uLWNvbD5cbiAgICA8L2lvbi1yb3c+XG4gIDwvaW9uLWdyaWQ+XG48L2lvbi1jb250ZW50PlxuIl19
@@ -0,0 +1,136 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import { IDEACalendarComponent } from './calendar.component';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "./calendars.service";
5
+ import * as i2 from "@ionic/angular";
6
+ import * as i3 from "@idea-ionic/common";
7
+ import * as i4 from "@angular/common";
8
+ export class IDEACalendarItemComponent {
9
+ constructor(calendars, alertCtrl, modalCtrl, message, loading, t) {
10
+ this.calendars = calendars;
11
+ this.alertCtrl = alertCtrl;
12
+ this.modalCtrl = modalCtrl;
13
+ this.message = message;
14
+ this.loading = loading;
15
+ this.t = t;
16
+ /**
17
+ * Report to parent components a change.
18
+ */
19
+ this.somethingChanged = new EventEmitter();
20
+ }
21
+ /**
22
+ * Open the modal to manage the calendar.
23
+ */
24
+ manageCalendar() {
25
+ if (this.disabled)
26
+ return;
27
+ this.modalCtrl
28
+ .create({
29
+ component: IDEACalendarComponent,
30
+ componentProps: {
31
+ calendar: this.calendar,
32
+ advancedPermissions: this.advancedPermissions,
33
+ hideColor: this.hideColor
34
+ }
35
+ })
36
+ .then(modal => {
37
+ modal.onDidDismiss().then(res => {
38
+ const cal = res.data;
39
+ // nothing changed
40
+ if (cal === undefined)
41
+ return;
42
+ // the calendar was deleted
43
+ else if (cal === null)
44
+ this.calendar = null;
45
+ // the calendar was updated
46
+ else
47
+ this.calendar.load(cal);
48
+ // report changes to parent components
49
+ this.somethingChanged.emit();
50
+ });
51
+ modal.present();
52
+ });
53
+ }
54
+ /**
55
+ * Continue the auth flow to link an external service and set an external calendar;
56
+ * otherwise, the calendar can be deleted.
57
+ */
58
+ linkExtCalendarOrDelete() {
59
+ if (this.disabled)
60
+ return;
61
+ // let the user pick an external calendar, in case the external service is linked
62
+ this.calendars
63
+ .chooseAndSetExternalCalendar(this.calendar)
64
+ .then(async (cal) => {
65
+ if (!cal)
66
+ return new Error('NO_EXTERNAL_CALENDAR_CHOSEN');
67
+ this.calendar.load(cal);
68
+ this.message.success('IDEA_AGENDA.CALENDARS.CALENDAR_LINKED');
69
+ // run a first sync for the linked external calendar
70
+ await this.loading.show(this.t._('IDEA_AGENDA.CALENDARS.FIRST_SYNC_MAY_TAKE_A_WHILE'));
71
+ this.calendars
72
+ .syncCalendar(this.calendar)
73
+ .then(() => this.message.success('IDEA_AGENDA.CALENDARS.FIRST_SYNC_COMPLETED'))
74
+ .catch(() => this.message.error('COMMON.OPERATION_FAILED'))
75
+ .finally(() => {
76
+ this.loading.hide();
77
+ // report changes to parent components
78
+ this.somethingChanged.emit();
79
+ });
80
+ })
81
+ .catch(() => {
82
+ // the external service isn't linked yet (we don't have a token): link or delete
83
+ this.alertCtrl
84
+ .create({
85
+ header: this.t._('IDEA_AGENDA.CALENDARS.CALENDAR_NOT_YET_LINKED'),
86
+ message: this.t._('IDEA_AGENDA.CALENDARS.DO_YOU_WANT_PROCEED_LINKING_OR_DELETE'),
87
+ buttons: [
88
+ {
89
+ text: this.t._('COMMON.DELETE'),
90
+ handler: async () => {
91
+ // request the calendar deletion
92
+ await this.loading.show();
93
+ this.calendars
94
+ .deleteCalendar(this.calendar)
95
+ .then(() => {
96
+ this.message.success('COMMON.OPERATION_COMPLETED');
97
+ // report changes to parent components
98
+ this.somethingChanged.emit();
99
+ })
100
+ .catch(() => this.message.error('COMMON.OPERATION_FAILED'))
101
+ .finally(() => this.loading.hide());
102
+ }
103
+ },
104
+ {
105
+ text: this.t._('IDEA_AGENDA.CALENDARS.LINK'),
106
+ handler: () =>
107
+ // try again to link the service
108
+ this.calendars
109
+ .linkExtService(this.calendar)
110
+ // if the service was successfully linked, go recursive to choose and set the external calendar
111
+ .then(() => this.linkExtCalendarOrDelete())
112
+ .catch(() => this.message.error('COMMON.OPERATION_FAILED'))
113
+ }
114
+ ]
115
+ })
116
+ .then(alert => alert.present());
117
+ });
118
+ }
119
+ }
120
+ IDEACalendarItemComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: IDEACalendarItemComponent, deps: [{ token: i1.IDEACalendarsService }, { token: i2.AlertController }, { token: i2.ModalController }, { token: i3.IDEAMessageService }, { token: i3.IDEALoadingService }, { token: i3.IDEATranslationsService }], target: i0.ɵɵFactoryTarget.Component });
121
+ IDEACalendarItemComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.1", type: IDEACalendarItemComponent, selector: "idea-calendar-item", inputs: { calendar: "calendar", disabled: "disabled", advancedPermissions: "advancedPermissions", hideColor: "hideColor" }, outputs: { somethingChanged: "somethingChanged" }, ngImport: i0, template: "<ion-item\n class=\"calendarItem\"\n *ngIf=\"calendar\"\n [button]=\"!disabled\"\n [title]=\"t._('IDEA_AGENDA.CALENDARS.EDIT_CALENDAR')\"\n (click)=\"calendar.external && !calendar.external.calendarId ? linkExtCalendarOrDelete() : manageCalendar()\"\n>\n <ion-avatar\n slot=\"start\"\n class=\"colorCircle\"\n *ngIf=\"!hideColor\"\n [style.background-color]=\"calendar.color\"\n ></ion-avatar>\n <ion-label>\n {{ calendar.name }}\n <p>\n <ion-text color=\"danger\" *ngIf=\"calendar.external && !calendar.external.calendarId\">\n {{ 'IDEA_AGENDA.CALENDARS.TAP_TO_CONFIGURE' | translate }}\n </ion-text>\n {{ calendar.description }}\n </p>\n </ion-label>\n <ion-icon\n slot=\"end\"\n color=\"danger\"\n name=\"flash-off\"\n *ngIf=\"calendar.external && !calendar.external.calendarId\"\n [title]=\"t._('IDEA_AGENDA.CALENDARS.CALENDAR_NOT_YET_LINKED_HINT')\"\n ></ion-icon>\n <ion-icon\n slot=\"end\"\n *ngIf=\"calendar.external?.service\"\n [name]=\"calendars.getServiceIcon(calendar.external.service)\"\n [title]=\"\n t._('IDEA_AGENDA.CALENDARS.LINKED_TO') + ' ' + t._('IDEA_AGENDA.CALENDARS.SERVICES.' + calendar.external.service)\n \"\n ></ion-icon>\n</ion-item>\n", styles: [".calendarItem ion-avatar.colorCircle{width:20px;height:20px;background-color:#555}\n"], components: [{ type: i2.IonItem, selector: "ion-item", inputs: ["button", "color", "counter", "detail", "detailIcon", "disabled", "download", "fill", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "shape", "target", "type"] }, { type: i2.IonAvatar, selector: "ion-avatar" }, { type: i2.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { type: i2.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { type: i2.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "translate": i3.IDEATranslatePipe } });
122
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: IDEACalendarItemComponent, decorators: [{
123
+ type: Component,
124
+ args: [{ selector: 'idea-calendar-item', template: "<ion-item\n class=\"calendarItem\"\n *ngIf=\"calendar\"\n [button]=\"!disabled\"\n [title]=\"t._('IDEA_AGENDA.CALENDARS.EDIT_CALENDAR')\"\n (click)=\"calendar.external && !calendar.external.calendarId ? linkExtCalendarOrDelete() : manageCalendar()\"\n>\n <ion-avatar\n slot=\"start\"\n class=\"colorCircle\"\n *ngIf=\"!hideColor\"\n [style.background-color]=\"calendar.color\"\n ></ion-avatar>\n <ion-label>\n {{ calendar.name }}\n <p>\n <ion-text color=\"danger\" *ngIf=\"calendar.external && !calendar.external.calendarId\">\n {{ 'IDEA_AGENDA.CALENDARS.TAP_TO_CONFIGURE' | translate }}\n </ion-text>\n {{ calendar.description }}\n </p>\n </ion-label>\n <ion-icon\n slot=\"end\"\n color=\"danger\"\n name=\"flash-off\"\n *ngIf=\"calendar.external && !calendar.external.calendarId\"\n [title]=\"t._('IDEA_AGENDA.CALENDARS.CALENDAR_NOT_YET_LINKED_HINT')\"\n ></ion-icon>\n <ion-icon\n slot=\"end\"\n *ngIf=\"calendar.external?.service\"\n [name]=\"calendars.getServiceIcon(calendar.external.service)\"\n [title]=\"\n t._('IDEA_AGENDA.CALENDARS.LINKED_TO') + ' ' + t._('IDEA_AGENDA.CALENDARS.SERVICES.' + calendar.external.service)\n \"\n ></ion-icon>\n</ion-item>\n", styles: [".calendarItem ion-avatar.colorCircle{width:20px;height:20px;background-color:#555}\n"] }]
125
+ }], ctorParameters: function () { return [{ type: i1.IDEACalendarsService }, { type: i2.AlertController }, { type: i2.ModalController }, { type: i3.IDEAMessageService }, { type: i3.IDEALoadingService }, { type: i3.IDEATranslationsService }]; }, propDecorators: { calendar: [{
126
+ type: Input
127
+ }], disabled: [{
128
+ type: Input
129
+ }], advancedPermissions: [{
130
+ type: Input
131
+ }], hideColor: [{
132
+ type: Input
133
+ }], somethingChanged: [{
134
+ type: Output
135
+ }] } });
136
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXJJdGVtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL21vZHVsZXMvYWdlbmRhL3NyYy9jYWxlbmRhckl0ZW0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vbW9kdWxlcy9hZ2VuZGEvc3JjL2NhbGVuZGFySXRlbS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBTXZFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDOzs7Ozs7QUFPN0QsTUFBTSxPQUFPLHlCQUF5QjtJQXNCcEMsWUFDUyxTQUErQixFQUMvQixTQUEwQixFQUMxQixTQUEwQixFQUMxQixPQUEyQixFQUMzQixPQUEyQixFQUMzQixDQUEwQjtRQUwxQixjQUFTLEdBQVQsU0FBUyxDQUFzQjtRQUMvQixjQUFTLEdBQVQsU0FBUyxDQUFpQjtRQUMxQixjQUFTLEdBQVQsU0FBUyxDQUFpQjtRQUMxQixZQUFPLEdBQVAsT0FBTyxDQUFvQjtRQUMzQixZQUFPLEdBQVAsT0FBTyxDQUFvQjtRQUMzQixNQUFDLEdBQUQsQ0FBQyxDQUF5QjtRQVhuQzs7V0FFRztRQUNjLHFCQUFnQixHQUFHLElBQUksWUFBWSxFQUFZLENBQUM7SUFTOUQsQ0FBQztJQUVKOztPQUVHO0lBQ0ksY0FBYztRQUNuQixJQUFJLElBQUksQ0FBQyxRQUFRO1lBQUUsT0FBTztRQUMxQixJQUFJLENBQUMsU0FBUzthQUNYLE1BQU0sQ0FBQztZQUNOLFNBQVMsRUFBRSxxQkFBcUI7WUFDaEMsY0FBYyxFQUFFO2dCQUNkLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtnQkFDdkIsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLG1CQUFtQjtnQkFDN0MsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO2FBQzFCO1NB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IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFsZXJ0Q29udHJvbGxlciwgTW9kYWxDb250cm9sbGVyIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHsgQ2FsZW5kYXIgfSBmcm9tICdpZGVhLXRvb2xib3gnO1xuaW1wb3J0IHsgSURFQUxvYWRpbmdTZXJ2aWNlLCBJREVBTWVzc2FnZVNlcnZpY2UsIElERUFUcmFuc2xhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnQGlkZWEtaW9uaWMvY29tbW9uJztcblxuaW1wb3J0IHsgSURFQUNhbGVuZGFyc1NlcnZpY2UgfSBmcm9tICcuL2NhbGVuZGFycy5zZXJ2aWNlJztcbmltcG9ydCB7IElERUFDYWxlbmRhckNvbXBvbmVudCB9IGZyb20gJy4vY2FsZW5kYXIuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaWRlYS1jYWxlbmRhci1pdGVtJyxcbiAgdGVtcGxhdGVVcmw6ICdjYWxlbmRhckl0ZW0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnY2FsZW5kYXJJdGVtLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgSURFQUNhbGVuZGFySXRlbUNvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBUaGUgY2FsZW5kYXIgdG8gc2hvdy5cbiAgICovXG4gIEBJbnB1dCgpIHB1YmxpYyBjYWxlbmRhcjogQ2FsZW5kYXI7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBjb21wb25lbnQgaXMgZGlzYWJsZWQuXG4gICAqL1xuICBASW5wdXQoKSBwdWJsaWMgZGlzYWJsZWQ6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBXaGV0aGVyIHdlIHdhbnQgdG8gZW5hYmxlIGFkdmFuY2VkIHBlcm1pc3Npb25zIChiYXNlZCBvbiB0aGUgbWVtYmVyc2hpcHMpIG9uIHRoZSBjYWxlbmRhci5cbiAgICovXG4gIEBJbnB1dCgpIHB1YmxpYyBhZHZhbmNlZFBlcm1pc3Npb25zOiBib29sZWFuO1xuICAvKipcbiAgICogV2hldGhlciB0aGUgY2FsZW5kYXIgY29sb3IgaXMgYW4gaW1wb3J0YW50IGRldGFpbCBvciBpdCBzaG91bGRuJ3QgYmUgc2hvd24uXG4gICAqL1xuICBASW5wdXQoKSBwdWJsaWMgaGlkZUNvbG9yOiBib29sZWFuO1xuICAvKipcbiAgICogUmVwb3J0IHRvIHBhcmVudCBjb21wb25lbnRzIGEgY2hhbmdlLlxuICAgKi9cbiAgQE91dHB1dCgpIHB1YmxpYyBzb21ldGhpbmdDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxDYWxlbmRhcj4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgY2FsZW5kYXJzOiBJREVBQ2FsZW5kYXJzU2VydmljZSxcbiAgICBwdWJsaWMgYWxlcnRDdHJsOiBBbGVydENvbnRyb2xsZXIsXG4gICAgcHVibGljIG1vZGFsQ3RybDogTW9kYWxDb250cm9sbGVyLFxuICAgIHB1YmxpYyBtZXNzYWdlOiBJREVBTWVzc2FnZVNlcnZpY2UsXG4gICAgcHVibGljIGxvYWRpbmc6IElERUFMb2FkaW5nU2VydmljZSxcbiAgICBwdWJsaWMgdDogSURFQVRyYW5zbGF0aW9uc1NlcnZpY2VcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBPcGVuIHRoZSBtb2RhbCB0byBtYW5hZ2UgdGhlIGNhbGVuZGFyLlxuICAgKi9cbiAgcHVibGljIG1hbmFnZUNhbGVuZGFyKCkge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSByZXR1cm47XG4gICAgdGhpcy5tb2RhbEN0cmxcbiAgICAgIC5jcmVhdGUoe1xuICAgICAgICBjb21wb25lbnQ6IElERUFDYWxlbmRhckNvbXBvbmVudCxcbiAgICAgICAgY29tcG9uZW50UHJvcHM6IHtcbiAgICAgICAgICBjYWxlbmRhcjogdGhpcy5jYWxlbmRhcixcbiAgICAgICAgICBhZHZhbmNlZFBlcm1pc3Npb25zOiB0aGlzLmFkdmFuY2VkUGVybWlzc2lvbnMsXG4gICAgICAgICAgaGlkZUNvbG9yOiB0aGlzLmhpZGVDb2xvclxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLnRoZW4obW9kYWwgPT4ge1xuICAgICAgICBtb2RhbC5vbkRpZERpc21pc3MoKS50aGVuKHJlcyA9PiB7XG4gICAgICAgICAgY29uc3QgY2FsID0gcmVzLmRhdGE7XG4gICAgICAgICAgLy8gbm90aGluZyBjaGFuZ2VkXG4gICAgICAgICAgaWYgKGNhbCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICAgICAgLy8gdGhlIGNhbGVuZGFyIHdhcyBkZWxldGVkXG4gICAgICAgICAgZWxzZSBpZiAoY2FsID09PSBudWxsKSB0aGlzLmNhbGVuZGFyID0gbnVsbDtcbiAgICAgICAgICAvLyB0aGUgY2FsZW5kYXIgd2FzIHVwZGF0ZWRcbiAgICAgICAgICBlbHNlIHRoaXMuY2FsZW5kYXIubG9hZChjYWwpO1xuICAgICAgICAgIC8vIHJlcG9ydCBjaGFuZ2VzIHRvIHBhcmVudCBjb21wb25lbnRzXG4gICAgICAgICAgdGhpcy5zb21ldGhpbmdDaGFuZ2VkLmVtaXQoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG1vZGFsLnByZXNlbnQoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnRpbnVlIHRoZSBhdXRoIGZsb3cgdG8gbGluayBhbiBleHRlcm5hbCBzZXJ2aWNlIGFuZCBzZXQgYW4gZXh0ZXJuYWwgY2FsZW5kYXI7XG4gICAqIG90aGVyd2lzZSwgdGhlIGNhbGVuZGFyIGNhbiBiZSBkZWxldGVkLlxuICAgKi9cbiAgcHVibGljIGxpbmtFeHRDYWxlbmRhck9yRGVsZXRlKCkge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSByZXR1cm47XG4gICAgLy8gbGV0IHRoZSB1c2VyIHBpY2sgYW4gZXh0ZXJuYWwgY2FsZW5kYXIsIGluIGNhc2UgdGhlIGV4dGVybmFsIHNlcnZpY2UgaXMgbGlua2VkXG4gICAgdGhpcy5jYWxlbmRhcnNcbiAgICAgIC5jaG9vc2VBbmRTZXRFeHRlcm5hbENhbGVuZGFyKHRoaXMuY2FsZW5kYXIpXG4gICAgICAudGhlbihhc3luYyBjYWwgPT4ge1xuICAgICAgICBpZiAoIWNhbCkgcmV0dXJuIG5ldyBFcnJvcignTk9fRVhURVJOQUxfQ0FMRU5EQVJfQ0hPU0VOJyk7XG4gICAgICAgIHRoaXMuY2FsZW5kYXIubG9hZChjYWwpO1xuICAgICAgICB0aGlzLm1lc3NhZ2Uuc3VjY2VzcygnSURFQV9BR0VOREEuQ0FMRU5EQVJTLkNBTEVOREFSX0xJTktFRCcpO1xuICAgICAgICAvLyBydW4gYSBmaXJzdCBzeW5jIGZvciB0aGUgbGlua2VkIGV4dGVybmFsIGNhbGVuZGFyXG4gICAgICAgIGF3YWl0IHRoaXMubG9hZGluZy5zaG93KHRoaXMudC5fKCdJREVBX0FHRU5EQS5DQUxFTkRBUlMuRklSU1RfU1lOQ19NQVlfVEFLRV9BX1dISUxFJykpO1xuICAgICAgICB0aGlzLmNhbGVuZGFyc1xuICAgICAgICAgIC5zeW5jQ2FsZW5kYXIodGhpcy5jYWxlbmRhcilcbiAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLm1lc3NhZ2Uuc3VjY2VzcygnSURFQV9BR0VOREEuQ0FMRU5EQVJTLkZJUlNUX1NZTkNfQ09NUExFVEVEJykpXG4gICAgICAgICAgLmNhdGNoKCgpID0+IHRoaXMubWVzc2FnZS5lcnJvcignQ09NTU9OLk9QRVJBVElPTl9GQUlMRUQnKSlcbiAgICAgICAgICAuZmluYWxseSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcuaGlkZSgpO1xuICAgICAgICAgICAgLy8gcmVwb3J0IGNoYW5nZXMgdG8gcGFyZW50IGNvbXBvbmVudHNcbiAgICAgICAgICAgIHRoaXMuc29tZXRoaW5nQ2hhbmdlZC5lbWl0KCk7XG4gICAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgLy8gdGhlIGV4dGVybmFsIHNlcnZpY2UgaXNuJ3QgbGlua2VkIHlldCAod2UgZG9uJ3QgaGF2ZSBhIHRva2VuKTogbGluayBvciBkZWxldGVcbiAgICAgICAgdGhpcy5hbGVydEN0cmxcbiAgICAgICAgICAuY3JlYXRlKHtcbiAgICAgICAgICAgIGhlYWRlcjogdGhpcy50Ll8oJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5DQUxFTkRBUl9OT1RfWUVUX0xJTktFRCcpLFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy50Ll8oJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5ET19ZT1VfV0FOVF9QUk9DRUVEX0xJTktJTkdfT1JfREVMRVRFJyksXG4gICAgICAgICAgICBidXR0b25zOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0ZXh0OiB0aGlzLnQuXygnQ09NTU9OLkRFTEVURScpLFxuICAgICAgICAgICAgICAgIGhhbmRsZXI6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgIC8vIHJlcXVlc3QgdGhlIGNhbGVuZGFyIGRlbGV0aW9uXG4gICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWRpbmcuc2hvdygpO1xuICAgICAgICAgICAgICAgICAgdGhpcy5jYWxlbmRhcnNcbiAgICAgICAgICAgICAgICAgICAgLmRlbGV0ZUNhbGVuZGFyKHRoaXMuY2FsZW5kYXIpXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2Uuc3VjY2VzcygnQ09NTU9OLk9QRVJBVElPTl9DT01QTEVURUQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZXBvcnQgY2hhbmdlcyB0byBwYXJlbnQgY29tcG9uZW50c1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc29tZXRoaW5nQ2hhbmdlZC5lbWl0KCk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5jYXRjaCgoKSA9PiB0aGlzLm1lc3NhZ2UuZXJyb3IoJ0NPTU1PTi5PUEVSQVRJT05fRkFJTEVEJykpXG4gICAgICAgICAgICAgICAgICAgIC5maW5hbGx5KCgpID0+IHRoaXMubG9hZGluZy5oaWRlKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRleHQ6IHRoaXMudC5fKCdJREVBX0FHRU5EQS5DQUxFTkRBUlMuTElOSycpLFxuICAgICAgICAgICAgICAgIGhhbmRsZXI6ICgpID0+XG4gICAgICAgICAgICAgICAgICAvLyB0cnkgYWdhaW4gdG8gbGluayB0aGUgc2VydmljZVxuICAgICAgICAgICAgICAgICAgdGhpcy5jYWxlbmRhcnNcbiAgICAgICAgICAgICAgICAgICAgLmxpbmtFeHRTZXJ2aWNlKHRoaXMuY2FsZW5kYXIpXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBzZXJ2aWNlIHdhcyBzdWNjZXNzZnVsbHkgbGlua2VkLCBnbyByZWN1cnNpdmUgdG8gY2hvb3NlIGFuZCBzZXQgdGhlIGV4dGVybmFsIGNhbGVuZGFyXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMubGlua0V4dENhbGVuZGFyT3JEZWxldGUoKSlcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKCgpID0+IHRoaXMubWVzc2FnZS5lcnJvcignQ09NTU9OLk9QRVJBVElPTl9GQUlMRUQnKSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICAgIH0pXG4gICAgICAgICAgLnRoZW4oYWxlcnQgPT4gYWxlcnQucHJlc2VudCgpKTtcbiAgICAgIH0pO1xuICB9XG59XG4iLCI8aW9uLWl0ZW1cbiAgY2xhc3M9XCJjYWxlbmRhckl0ZW1cIlxuICAqbmdJZj1cImNhbGVuZGFyXCJcbiAgW2J1dHRvbl09XCIhZGlzYWJsZWRcIlxuICBbdGl0bGVdPVwidC5fKCdJREVBX0FHRU5EQS5DQUxFTkRBUlMuRURJVF9DQUxFTkRBUicpXCJcbiAgKGNsaWNrKT1cImNhbGVuZGFyLmV4dGVybmFsICYmICFjYWxlbmRhci5leHRlcm5hbC5jYWxlbmRhcklkID8gbGlua0V4dENhbGVuZGFyT3JEZWxldGUoKSA6IG1hbmFnZUNhbGVuZGFyKClcIlxuPlxuICA8aW9uLWF2YXRhclxuICAgIHNsb3Q9XCJzdGFydFwiXG4gICAgY2xhc3M9XCJjb2xvckNpcmNsZVwiXG4gICAgKm5nSWY9XCIhaGlkZUNvbG9yXCJcbiAgICBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCJjYWxlbmRhci5jb2xvclwiXG4gID48L2lvbi1hdmF0YXI+XG4gIDxpb24tbGFiZWw+XG4gICAge3sgY2FsZW5kYXIubmFtZSB9fVxuICAgIDxwPlxuICAgICAgPGlvbi10ZXh0IGNvbG9yPVwiZGFuZ2VyXCIgKm5nSWY9XCJjYWxlbmRhci5leHRlcm5hbCAmJiAhY2FsZW5kYXIuZXh0ZXJuYWwuY2FsZW5kYXJJZFwiPlxuICAgICAgICB7eyAnSURFQV9BR0VOREEuQ0FMRU5EQVJTLlRBUF9UT19DT05GSUdVUkUnIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L2lvbi10ZXh0PlxuICAgICAge3sgY2FsZW5kYXIuZGVzY3JpcHRpb24gfX1cbiAgICA8L3A+XG4gIDwvaW9uLWxhYmVsPlxuICA8aW9uLWljb25cbiAgICBzbG90PVwiZW5kXCJcbiAgICBjb2xvcj1cImRhbmdlclwiXG4gICAgbmFtZT1cImZsYXNoLW9mZlwiXG4gICAgKm5nSWY9XCJjYWxlbmRhci5leHRlcm5hbCAmJiAhY2FsZW5kYXIuZXh0ZXJuYWwuY2FsZW5kYXJJZFwiXG4gICAgW3RpdGxlXT1cInQuXygnSURFQV9BR0VOREEuQ0FMRU5EQVJTLkNBTEVOREFSX05PVF9ZRVRfTElOS0VEX0hJTlQnKVwiXG4gID48L2lvbi1pY29uPlxuICA8aW9uLWljb25cbiAgICBzbG90PVwiZW5kXCJcbiAgICAqbmdJZj1cImNhbGVuZGFyLmV4dGVybmFsPy5zZXJ2aWNlXCJcbiAgICBbbmFtZV09XCJjYWxlbmRhcnMuZ2V0U2VydmljZUljb24oY2FsZW5kYXIuZXh0ZXJuYWwuc2VydmljZSlcIlxuICAgIFt0aXRsZV09XCJcbiAgICAgIHQuXygnSURFQV9BR0VOREEuQ0FMRU5EQVJTLkxJTktFRF9UTycpICsgJyAnICsgdC5fKCdJREVBX0FHRU5EQS5DQUxFTkRBUlMuU0VSVklDRVMuJyArIGNhbGVuZGFyLmV4dGVybmFsLnNlcnZpY2UpXG4gICAgXCJcbiAgPjwvaW9uLWljb24+XG48L2lvbi1pdGVtPlxuIl19