mediasfu-angular 1.0.2 → 2.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 (281) hide show
  1. package/README.md +678 -578
  2. package/dist/README.md +677 -578
  3. package/dist/fesm2022/mediasfu-angular.mjs +5551 -2944
  4. package/dist/fesm2022/mediasfu-angular.mjs.map +1 -1
  5. package/dist/lib/@types/types.d.ts +22 -1
  6. package/dist/lib/components/breakout-components/breakout-rooms-modal.component.d.ts +1 -0
  7. package/dist/lib/components/mediasfu-components/mediasfu-broadcast.component.d.ts +153 -61
  8. package/dist/lib/components/mediasfu-components/mediasfu-chat.component.d.ts +154 -66
  9. package/dist/lib/components/mediasfu-components/mediasfu-conference.component.d.ts +190 -76
  10. package/dist/lib/components/mediasfu-components/mediasfu-generic.component.d.ts +184 -70
  11. package/dist/lib/components/mediasfu-components/mediasfu-webinar.component.d.ts +192 -78
  12. package/dist/lib/components/menu-components/menu-modal/menu-modal.component.d.ts +6 -1
  13. package/dist/lib/components/menu-components/share-buttons-component/share-buttons-component.component.d.ts +5 -2
  14. package/dist/lib/components/misc-components/confirm-here-modal/confirm-here-modal.component.d.ts +4 -2
  15. package/dist/lib/components/misc-components/pre-join-page/pre-join-page.component.d.ts +71 -66
  16. package/dist/lib/components/misc-components/share-event-modal/share-event-modal.component.d.ts +5 -1
  17. package/dist/lib/consumers/connect-local-ips.service.d.ts +81 -0
  18. package/dist/lib/consumers/connect-send-transport-audio.service.d.ts +43 -11
  19. package/dist/lib/consumers/connect-send-transport-screen.service.d.ts +87 -46
  20. package/dist/lib/consumers/connect-send-transport-video.service.d.ts +89 -43
  21. package/dist/lib/consumers/connect-send-transport.service.d.ts +5 -1
  22. package/dist/lib/consumers/create-send-transport.service.d.ts +130 -40
  23. package/dist/lib/consumers/disconnect-send-transport-audio.service.d.ts +77 -40
  24. package/dist/lib/consumers/disconnect-send-transport-screen.service.d.ts +48 -14
  25. package/dist/lib/consumers/disconnect-send-transport-video.service.d.ts +81 -44
  26. package/dist/lib/consumers/get-piped-producers-alt.service.d.ts +5 -1
  27. package/dist/lib/consumers/receive-all-piped-transports.service.d.ts +5 -1
  28. package/dist/lib/consumers/resume-send-transport-audio.service.d.ts +54 -21
  29. package/dist/lib/consumers/stream-success-audio-switch.service.d.ts +124 -40
  30. package/dist/lib/consumers/trigger.service.d.ts +3 -0
  31. package/dist/lib/methods/exit-methods/confirm-exit.service.d.ts +5 -1
  32. package/dist/lib/methods/recording-methods/start-recording.service.d.ts +3 -0
  33. package/dist/lib/methods/recording-methods/stop-recording.service.d.ts +4 -1
  34. package/dist/lib/methods/recording-methods/update-recording.service.d.ts +3 -0
  35. package/dist/lib/methods/stream-methods/click-audio.service.d.ts +3 -0
  36. package/dist/lib/methods/utils/check-limits-and-make-request.service.d.ts +23 -0
  37. package/dist/lib/methods/utils/create-response-join-room.util.d.ts +33 -0
  38. package/dist/lib/methods/utils/create-room-on-media-sfu.service.d.ts +25 -0
  39. package/dist/lib/methods/utils/initial-values.util.d.ts +6 -0
  40. package/dist/lib/methods/utils/join-room-on-media-sfu.service.d.ts +52 -0
  41. package/dist/lib/methods/whiteboard-methods/capture-canvas-stream.service.d.ts +37 -20
  42. package/dist/lib/producers/producer-emits/join-local-room.service.d.ts +125 -0
  43. package/dist/lib/producers/socket-receive-methods/all-members-rest.service.d.ts +7 -2
  44. package/dist/lib/producers/socket-receive-methods/all-members.service.d.ts +7 -2
  45. package/dist/lib/producers/socket-receive-methods/disconnect-user-self.service.d.ts +5 -1
  46. package/dist/lib/sockets/socket-manager.service.d.ts +90 -0
  47. package/dist/public-api.d.ts +11 -1
  48. package/package.json +17 -20
  49. package/dist/esm2022/lib/@types/types.mjs +0 -2
  50. package/dist/esm2022/lib/components/background-components/background-modal/background-modal.component.mjs +0 -799
  51. package/dist/esm2022/lib/components/breakout-components/breakout-rooms-modal.component.mjs +0 -366
  52. package/dist/esm2022/lib/components/breakout-components/edit-room-modal/edit-room-modal.component.mjs +0 -143
  53. package/dist/esm2022/lib/components/breakout-components/room-list/room-list.component.mjs +0 -40
  54. package/dist/esm2022/lib/components/co-host-components/co-host-modal/co-host-modal.component.mjs +0 -245
  55. package/dist/esm2022/lib/components/display-components/alert-component/alert.component.component.mjs +0 -79
  56. package/dist/esm2022/lib/components/display-components/audio-card/audio-card.component.mjs +0 -356
  57. package/dist/esm2022/lib/components/display-components/audio-grid/audio-grid.component.mjs +0 -80
  58. package/dist/esm2022/lib/components/display-components/card-video-display/card-video-display.component.mjs +0 -129
  59. package/dist/esm2022/lib/components/display-components/control-buttons-alt-component/control-buttons-alt-component.component.mjs +0 -138
  60. package/dist/esm2022/lib/components/display-components/control-buttons-component/control-buttons-component.component.mjs +0 -231
  61. package/dist/esm2022/lib/components/display-components/control-buttons-component-touch/control-buttons-component-touch.component.mjs +0 -282
  62. package/dist/esm2022/lib/components/display-components/control-widgets/menu-participants-widget.component.mjs +0 -82
  63. package/dist/esm2022/lib/components/display-components/control-widgets/menu-record-widget.component.mjs +0 -65
  64. package/dist/esm2022/lib/components/display-components/control-widgets/menu-widget.component.mjs +0 -137
  65. package/dist/esm2022/lib/components/display-components/control-widgets/message-widget.component.mjs +0 -137
  66. package/dist/esm2022/lib/components/display-components/control-widgets/record-timer-widget.component.mjs +0 -51
  67. package/dist/esm2022/lib/components/display-components/control-widgets/screenshare-widget.component.mjs +0 -101
  68. package/dist/esm2022/lib/components/display-components/flexible-grid/flexible-grid.component.mjs +0 -151
  69. package/dist/esm2022/lib/components/display-components/flexible-video/flexible-video.component.mjs +0 -250
  70. package/dist/esm2022/lib/components/display-components/loading-modal/loading-modal.component.mjs +0 -102
  71. package/dist/esm2022/lib/components/display-components/main-aspect-component/main-aspect-component.component.mjs +0 -140
  72. package/dist/esm2022/lib/components/display-components/main-container-component/main-container-component.component.mjs +0 -131
  73. package/dist/esm2022/lib/components/display-components/main-grid-component/main-grid-component.component.mjs +0 -120
  74. package/dist/esm2022/lib/components/display-components/main-screen-component/main-screen-component.component.mjs +0 -201
  75. package/dist/esm2022/lib/components/display-components/meeting-progress-timer/meeting-progress-timer.component.mjs +0 -115
  76. package/dist/esm2022/lib/components/display-components/mini-audio/mini-audio.component.mjs +0 -319
  77. package/dist/esm2022/lib/components/display-components/mini-card/mini-card.component.mjs +0 -161
  78. package/dist/esm2022/lib/components/display-components/mini-card-audio/mini-card-audio.component.mjs +0 -230
  79. package/dist/esm2022/lib/components/display-components/other-grid-component/other-grid-component.component.mjs +0 -126
  80. package/dist/esm2022/lib/components/display-components/pagination/pagination.component.mjs +0 -334
  81. package/dist/esm2022/lib/components/display-components/sub-aspect-component/sub-aspect-component.component.mjs +0 -112
  82. package/dist/esm2022/lib/components/display-components/video-card/video-card.component.mjs +0 -392
  83. package/dist/esm2022/lib/components/display-settings-components/display-settings-modal.component.mjs +0 -106
  84. package/dist/esm2022/lib/components/event-settings-components/event-settings-modal/event-settings-modal.component.mjs +0 -199
  85. package/dist/esm2022/lib/components/exit-components/confirm-exit-modal/confirm-exit-modal.component.mjs +0 -132
  86. package/dist/esm2022/lib/components/media-settings-components/media-settings-modal/media-settings-modal.component.mjs +0 -220
  87. package/dist/esm2022/lib/components/mediasfu-components/mediasfu-broadcast.component.mjs +0 -4238
  88. package/dist/esm2022/lib/components/mediasfu-components/mediasfu-chat.component.mjs +0 -3754
  89. package/dist/esm2022/lib/components/mediasfu-components/mediasfu-conference.component.mjs +0 -5071
  90. package/dist/esm2022/lib/components/mediasfu-components/mediasfu-generic.component.mjs +0 -5380
  91. package/dist/esm2022/lib/components/mediasfu-components/mediasfu-webinar.component.mjs +0 -5068
  92. package/dist/esm2022/lib/components/menu-components/custom-buttons/custom-buttons.component.mjs +0 -83
  93. package/dist/esm2022/lib/components/menu-components/meeting-id-component/meeting-id-component.component.mjs +0 -27
  94. package/dist/esm2022/lib/components/menu-components/meeting-passcode-component/meeting-passcode-component.component.mjs +0 -27
  95. package/dist/esm2022/lib/components/menu-components/menu-modal/menu-modal.component.mjs +0 -125
  96. package/dist/esm2022/lib/components/menu-components/share-buttons-component/share-buttons-component.component.mjs +0 -106
  97. package/dist/esm2022/lib/components/message-components/message-panel/message-panel.component.mjs +0 -228
  98. package/dist/esm2022/lib/components/message-components/messages-modal/messages-modal.component.mjs +0 -277
  99. package/dist/esm2022/lib/components/misc-components/confirm-here-modal/confirm-here-modal.component.mjs +0 -130
  100. package/dist/esm2022/lib/components/misc-components/pre-join-page/pre-join-page.component.mjs +0 -343
  101. package/dist/esm2022/lib/components/misc-components/share-event-modal/share-event-modal.component.mjs +0 -127
  102. package/dist/esm2022/lib/components/misc-components/welcome-page/welcome-page.component.mjs +0 -241
  103. package/dist/esm2022/lib/components/participants-components/participant-list/participant-list.component.mjs +0 -82
  104. package/dist/esm2022/lib/components/participants-components/participant-list-item/participant-list-item.component.mjs +0 -139
  105. package/dist/esm2022/lib/components/participants-components/participant-list-others/participant-list-others.component.mjs +0 -40
  106. package/dist/esm2022/lib/components/participants-components/participant-list-others-item/participant-list-others-item.component.mjs +0 -60
  107. package/dist/esm2022/lib/components/participants-components/participants-modal/participants-modal.component.mjs +0 -124
  108. package/dist/esm2022/lib/components/polls-components/poll-modal/poll-modal.component.mjs +0 -201
  109. package/dist/esm2022/lib/components/recording-components/advanced-panel-component/advanced-panel-components.component.mjs +0 -92
  110. package/dist/esm2022/lib/components/recording-components/recording-modal/recording-modal.component.mjs +0 -133
  111. package/dist/esm2022/lib/components/recording-components/standard-panel-component/standard-panel-component.component.mjs +0 -90
  112. package/dist/esm2022/lib/components/requests-components/render-request-component/render-request-component.component.mjs +0 -81
  113. package/dist/esm2022/lib/components/requests-components/requests-modal/requests-modal.component.mjs +0 -147
  114. package/dist/esm2022/lib/components/screenboard-components/screenboard/screenboard.component.mjs +0 -627
  115. package/dist/esm2022/lib/components/screenboard-components/screenboard-modal/screenboard-modal.component.mjs +0 -391
  116. package/dist/esm2022/lib/components/waiting-components/waiting-room-modal.component.mjs +0 -201
  117. package/dist/esm2022/lib/components/whiteboard-components/configure-whiteboard-modal/configure-whiteboard-modal.component.mjs +0 -286
  118. package/dist/esm2022/lib/components/whiteboard-components/whiteboard/whiteboard.component.mjs +0 -1833
  119. package/dist/esm2022/lib/consumers/add-videos-grid.service.mjs +0 -345
  120. package/dist/esm2022/lib/consumers/auto-adjust.service.mjs +0 -109
  121. package/dist/esm2022/lib/consumers/calculate-rows-and-columns.service.mjs +0 -60
  122. package/dist/esm2022/lib/consumers/change-vids.service.mjs +0 -551
  123. package/dist/esm2022/lib/consumers/check-grid.service.mjs +0 -93
  124. package/dist/esm2022/lib/consumers/check-permission.service.mjs +0 -105
  125. package/dist/esm2022/lib/consumers/check-screen-share.service.mjs +0 -106
  126. package/dist/esm2022/lib/consumers/close-and-resize.service.mjs +0 -331
  127. package/dist/esm2022/lib/consumers/compare-active-names.service.mjs +0 -106
  128. package/dist/esm2022/lib/consumers/compare-screen-states.service.mjs +0 -98
  129. package/dist/esm2022/lib/consumers/connect-ips.service.mjs +0 -154
  130. package/dist/esm2022/lib/consumers/connect-recv-transport.service.mjs +0 -146
  131. package/dist/esm2022/lib/consumers/connect-send-transport-audio.service.mjs +0 -84
  132. package/dist/esm2022/lib/consumers/connect-send-transport-screen.service.mjs +0 -102
  133. package/dist/esm2022/lib/consumers/connect-send-transport-video.service.mjs +0 -99
  134. package/dist/esm2022/lib/consumers/connect-send-transport.service.mjs +0 -140
  135. package/dist/esm2022/lib/consumers/consumer-resume.service.mjs +0 -368
  136. package/dist/esm2022/lib/consumers/control-media.service.mjs +0 -113
  137. package/dist/esm2022/lib/consumers/create-send-transport.service.mjs +0 -172
  138. package/dist/esm2022/lib/consumers/disconnect-send-transport-audio.service.mjs +0 -108
  139. package/dist/esm2022/lib/consumers/disconnect-send-transport-screen.service.mjs +0 -84
  140. package/dist/esm2022/lib/consumers/disconnect-send-transport-video.service.mjs +0 -101
  141. package/dist/esm2022/lib/consumers/disp-streams.service.mjs +0 -513
  142. package/dist/esm2022/lib/consumers/generate-page-content.service.mjs +0 -106
  143. package/dist/esm2022/lib/consumers/get-estimate.service.mjs +0 -120
  144. package/dist/esm2022/lib/consumers/get-piped-producers-alt.service.mjs +0 -82
  145. package/dist/esm2022/lib/consumers/get-producers-piped.service.mjs +0 -79
  146. package/dist/esm2022/lib/consumers/get-videos.service.mjs +0 -91
  147. package/dist/esm2022/lib/consumers/mix-streams.service.mjs +0 -95
  148. package/dist/esm2022/lib/consumers/on-screen-changes.service.mjs +0 -103
  149. package/dist/esm2022/lib/consumers/prepopulate-user-media.service.mjs +0 -541
  150. package/dist/esm2022/lib/consumers/process-consumer-transports-audio.service.mjs +0 -101
  151. package/dist/esm2022/lib/consumers/process-consumer-transports.service.mjs +0 -128
  152. package/dist/esm2022/lib/consumers/re-port.service.mjs +0 -114
  153. package/dist/esm2022/lib/consumers/re-update-inter.service.mjs +0 -239
  154. package/dist/esm2022/lib/consumers/readjust.service.mjs +0 -173
  155. package/dist/esm2022/lib/consumers/receive-all-piped-transports.service.mjs +0 -87
  156. package/dist/esm2022/lib/consumers/receive-room-messages.service.mjs +0 -69
  157. package/dist/esm2022/lib/consumers/reorder-streams.service.mjs +0 -239
  158. package/dist/esm2022/lib/consumers/request-screen-share.service.mjs +0 -101
  159. package/dist/esm2022/lib/consumers/resume-pause-audio-streams.service.mjs +0 -150
  160. package/dist/esm2022/lib/consumers/resume-pause-streams.service.mjs +0 -103
  161. package/dist/esm2022/lib/consumers/resume-send-transport-audio.service.mjs +0 -91
  162. package/dist/esm2022/lib/consumers/signal-new-consumer-transport.service.mjs +0 -136
  163. package/dist/esm2022/lib/consumers/socket-receive-methods/join-consume-room.service.mjs +0 -96
  164. package/dist/esm2022/lib/consumers/socket-receive-methods/new-pipe-producer.service.mjs +0 -100
  165. package/dist/esm2022/lib/consumers/socket-receive-methods/producer-closed.service.mjs +0 -78
  166. package/dist/esm2022/lib/consumers/start-share-screen.service.mjs +0 -120
  167. package/dist/esm2022/lib/consumers/stop-share-screen.service.mjs +0 -175
  168. package/dist/esm2022/lib/consumers/stream-success-audio-switch.service.mjs +0 -185
  169. package/dist/esm2022/lib/consumers/stream-success-audio.service.mjs +0 -210
  170. package/dist/esm2022/lib/consumers/stream-success-screen.service.mjs +0 -193
  171. package/dist/esm2022/lib/consumers/stream-success-video.service.mjs +0 -260
  172. package/dist/esm2022/lib/consumers/switch-user-audio.service.mjs +0 -120
  173. package/dist/esm2022/lib/consumers/switch-user-video-alt.service.mjs +0 -260
  174. package/dist/esm2022/lib/consumers/switch-user-video.service.mjs +0 -172
  175. package/dist/esm2022/lib/consumers/trigger.service.mjs +0 -210
  176. package/dist/esm2022/lib/consumers/update-mini-cards-grid.service.mjs +0 -135
  177. package/dist/esm2022/lib/consumers/update-participant-audio-decibels.service.mjs +0 -84
  178. package/dist/esm2022/lib/methods/background-methods/launch-background.service.mjs +0 -48
  179. package/dist/esm2022/lib/methods/breakout-room-methods/breakout-room-updated.service.mjs +0 -183
  180. package/dist/esm2022/lib/methods/breakout-room-methods/launch-breakout-rooms.service.mjs +0 -46
  181. package/dist/esm2022/lib/methods/co-host-methods/launch-co-host.service.mjs +0 -46
  182. package/dist/esm2022/lib/methods/co-host-methods/modify-co-host-settings.service.mjs +0 -104
  183. package/dist/esm2022/lib/methods/display-settings-methods/launch-display-settings.service.mjs +0 -46
  184. package/dist/esm2022/lib/methods/display-settings-methods/modify-display-settings.service.mjs +0 -194
  185. package/dist/esm2022/lib/methods/exit-methods/confirm-exit.service.mjs +0 -52
  186. package/dist/esm2022/lib/methods/exit-methods/launch-confirm-exit.service.mjs +0 -42
  187. package/dist/esm2022/lib/methods/media-settings-methods/launch-media-settings.service.mjs +0 -85
  188. package/dist/esm2022/lib/methods/menu-methods/launch-menu-modal.service.mjs +0 -44
  189. package/dist/esm2022/lib/methods/message-methods/launch-messages.service.mjs +0 -45
  190. package/dist/esm2022/lib/methods/message-methods/send-message.service.mjs +0 -143
  191. package/dist/esm2022/lib/methods/participants-methods/launch-participants.service.mjs +0 -47
  192. package/dist/esm2022/lib/methods/participants-methods/message-participants.service.mjs +0 -98
  193. package/dist/esm2022/lib/methods/participants-methods/mute-participants.service.mjs +0 -96
  194. package/dist/esm2022/lib/methods/participants-methods/remove-participants.service.mjs +0 -107
  195. package/dist/esm2022/lib/methods/polls-methods/handle-create-poll.service.mjs +0 -75
  196. package/dist/esm2022/lib/methods/polls-methods/handle-end-poll.service.mjs +0 -72
  197. package/dist/esm2022/lib/methods/polls-methods/handle-vote-poll.service.mjs +0 -83
  198. package/dist/esm2022/lib/methods/polls-methods/launch-poll.service.mjs +0 -43
  199. package/dist/esm2022/lib/methods/polls-methods/poll-updated.service.mjs +0 -95
  200. package/dist/esm2022/lib/methods/recording-methods/check-pause-state.service.mjs +0 -69
  201. package/dist/esm2022/lib/methods/recording-methods/check-resume-state.service.mjs +0 -56
  202. package/dist/esm2022/lib/methods/recording-methods/confirm-recording.service.mjs +0 -278
  203. package/dist/esm2022/lib/methods/recording-methods/launch-recording.service.mjs +0 -125
  204. package/dist/esm2022/lib/methods/recording-methods/record-pause-timer.service.mjs +0 -67
  205. package/dist/esm2022/lib/methods/recording-methods/record-resume-timer.service.mjs +0 -130
  206. package/dist/esm2022/lib/methods/recording-methods/record-start-timer.service.mjs +0 -134
  207. package/dist/esm2022/lib/methods/recording-methods/record-update-timer.service.mjs +0 -80
  208. package/dist/esm2022/lib/methods/recording-methods/start-recording.service.mjs +0 -197
  209. package/dist/esm2022/lib/methods/recording-methods/stop-recording.service.mjs +0 -112
  210. package/dist/esm2022/lib/methods/recording-methods/update-recording.service.mjs +0 -272
  211. package/dist/esm2022/lib/methods/requests-methods/launch-requests.service.mjs +0 -51
  212. package/dist/esm2022/lib/methods/requests-methods/respond-to-requests.service.mjs +0 -84
  213. package/dist/esm2022/lib/methods/settings-methods/launch-settings.service.mjs +0 -51
  214. package/dist/esm2022/lib/methods/settings-methods/modify-settings.service.mjs +0 -109
  215. package/dist/esm2022/lib/methods/stream-methods/click-audio.service.mjs +0 -275
  216. package/dist/esm2022/lib/methods/stream-methods/click-chat.service.mjs +0 -75
  217. package/dist/esm2022/lib/methods/stream-methods/click-screen-share.service.mjs +0 -178
  218. package/dist/esm2022/lib/methods/stream-methods/click-video.service.mjs +0 -271
  219. package/dist/esm2022/lib/methods/stream-methods/switch-audio.service.mjs +0 -80
  220. package/dist/esm2022/lib/methods/stream-methods/switch-video-alt.service.mjs +0 -116
  221. package/dist/esm2022/lib/methods/stream-methods/switch-video.service.mjs +0 -132
  222. package/dist/esm2022/lib/methods/utils/format-number.service.mjs +0 -57
  223. package/dist/esm2022/lib/methods/utils/generate-random-messages.service.mjs +0 -120
  224. package/dist/esm2022/lib/methods/utils/generate-random-participants.service.mjs +0 -126
  225. package/dist/esm2022/lib/methods/utils/generate-random-polls.service.mjs +0 -78
  226. package/dist/esm2022/lib/methods/utils/generate-random-request-list.service.mjs +0 -90
  227. package/dist/esm2022/lib/methods/utils/generate-random-waiting-room-list.service.mjs +0 -59
  228. package/dist/esm2022/lib/methods/utils/get-modal-position.util.mjs +0 -32
  229. package/dist/esm2022/lib/methods/utils/get-overlay-position.util.mjs +0 -31
  230. package/dist/esm2022/lib/methods/utils/initial-values.util.mjs +0 -379
  231. package/dist/esm2022/lib/methods/utils/meeting-timer/start-meeting-progress-timer.service.mjs +0 -96
  232. package/dist/esm2022/lib/methods/utils/mini-audio-player/mini-audio-player.component.mjs +0 -315
  233. package/dist/esm2022/lib/methods/utils/producer/a-params.service.mjs +0 -58
  234. package/dist/esm2022/lib/methods/utils/producer/h-params.service.mjs +0 -87
  235. package/dist/esm2022/lib/methods/utils/producer/screen-params.service.mjs +0 -61
  236. package/dist/esm2022/lib/methods/utils/producer/v-params.service.mjs +0 -87
  237. package/dist/esm2022/lib/methods/utils/producer/video-capture-constraints.service.mjs +0 -84
  238. package/dist/esm2022/lib/methods/utils/sleep.util.mjs +0 -17
  239. package/dist/esm2022/lib/methods/utils/sound-player.service.mjs +0 -63
  240. package/dist/esm2022/lib/methods/utils/validate-alphanumeric.service.mjs +0 -49
  241. package/dist/esm2022/lib/methods/waiting-methods/launch-waiting.service.mjs +0 -41
  242. package/dist/esm2022/lib/methods/waiting-methods/respond-to-waiting.service.mjs +0 -69
  243. package/dist/esm2022/lib/methods/whiteboard-methods/capture-canvas-stream.service.mjs +0 -98
  244. package/dist/esm2022/lib/methods/whiteboard-methods/launch-configure-whiteboard.service.mjs +0 -44
  245. package/dist/esm2022/lib/producer-client/producer-client-emits/create-device-client.service.mjs +0 -74
  246. package/dist/esm2022/lib/producer-client/producer-client-emits/join-room-client.service.mjs +0 -96
  247. package/dist/esm2022/lib/producer-client/producer-client-emits/update-room-parameters-client.service.mjs +0 -276
  248. package/dist/esm2022/lib/producers/producer-emits/join-con-room.service.mjs +0 -152
  249. package/dist/esm2022/lib/producers/producer-emits/join-room.service.mjs +0 -152
  250. package/dist/esm2022/lib/producers/socket-receive-methods/all-members-rest.service.mjs +0 -228
  251. package/dist/esm2022/lib/producers/socket-receive-methods/all-members.service.mjs +0 -218
  252. package/dist/esm2022/lib/producers/socket-receive-methods/all-waiting-room-members.service.mjs +0 -57
  253. package/dist/esm2022/lib/producers/socket-receive-methods/ban-participant.service.mjs +0 -76
  254. package/dist/esm2022/lib/producers/socket-receive-methods/control-media-host.service.mjs +0 -183
  255. package/dist/esm2022/lib/producers/socket-receive-methods/disconnect-user-self.service.mjs +0 -50
  256. package/dist/esm2022/lib/producers/socket-receive-methods/disconnect.service.mjs +0 -64
  257. package/dist/esm2022/lib/producers/socket-receive-methods/get-domains.service.mjs +0 -78
  258. package/dist/esm2022/lib/producers/socket-receive-methods/host-request-response.service.mjs +0 -150
  259. package/dist/esm2022/lib/producers/socket-receive-methods/meeting-ended.service.mjs +0 -73
  260. package/dist/esm2022/lib/producers/socket-receive-methods/meeting-still-there.service.mjs +0 -47
  261. package/dist/esm2022/lib/producers/socket-receive-methods/meeting-time-remaining.service.mjs +0 -63
  262. package/dist/esm2022/lib/producers/socket-receive-methods/participant-requested.service.mjs +0 -63
  263. package/dist/esm2022/lib/producers/socket-receive-methods/person-joined.service.mjs +0 -54
  264. package/dist/esm2022/lib/producers/socket-receive-methods/producer-media-closed.service.mjs +0 -129
  265. package/dist/esm2022/lib/producers/socket-receive-methods/producer-media-paused.service.mjs +0 -152
  266. package/dist/esm2022/lib/producers/socket-receive-methods/producer-media-resumed.service.mjs +0 -99
  267. package/dist/esm2022/lib/producers/socket-receive-methods/re-initiate-recording.service.mjs +0 -67
  268. package/dist/esm2022/lib/producers/socket-receive-methods/receive-message.service.mjs +0 -134
  269. package/dist/esm2022/lib/producers/socket-receive-methods/recording-notice.service.mjs +0 -233
  270. package/dist/esm2022/lib/producers/socket-receive-methods/room-record-params.service.mjs +0 -121
  271. package/dist/esm2022/lib/producers/socket-receive-methods/screen-producer-id.service.mjs +0 -86
  272. package/dist/esm2022/lib/producers/socket-receive-methods/start-records.service.mjs +0 -60
  273. package/dist/esm2022/lib/producers/socket-receive-methods/stopped-recording.service.mjs +0 -62
  274. package/dist/esm2022/lib/producers/socket-receive-methods/time-left-recording.service.mjs +0 -57
  275. package/dist/esm2022/lib/producers/socket-receive-methods/update-consuming-domains.service.mjs +0 -105
  276. package/dist/esm2022/lib/producers/socket-receive-methods/update-media-settings.service.mjs +0 -66
  277. package/dist/esm2022/lib/producers/socket-receive-methods/updated-co-host.service.mjs +0 -96
  278. package/dist/esm2022/lib/producers/socket-receive-methods/user-waiting.service.mjs +0 -52
  279. package/dist/esm2022/lib/sockets/socket-manager.service.mjs +0 -113
  280. package/dist/esm2022/mediasfu-angular.mjs +0 -5
  281. package/dist/esm2022/public-api.mjs +0 -187
@@ -1,201 +0,0 @@
1
- /* eslint-disable @typescript-eslint/no-empty-function */
2
- import { Component, Input } from '@angular/core';
3
- import { CommonModule } from '@angular/common';
4
- import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
5
- import { faTimes } from '@fortawesome/free-solid-svg-icons';
6
- import { FormsModule } from '@angular/forms';
7
- import * as i0 from "@angular/core";
8
- import * as i1 from "@angular/common";
9
- import * as i2 from "@fortawesome/angular-fontawesome";
10
- import * as i3 from "@angular/forms";
11
- /**
12
- * Component for displaying a poll modal, allowing users to create, vote, and end polls within a session.
13
- *
14
- * @component
15
- * @selector app-poll-modal
16
- * @standalone true
17
- * @templateUrl ./poll-modal.component.html
18
- * @styleUrls ['./poll-modal.component.css']
19
- * @imports [CommonModule, FontAwesomeModule, FormsModule]
20
- *
21
- * @example
22
- * ```html
23
- * <app-poll-modal
24
- * [isPollModalVisible]="true"
25
- * [onClose]="closeModalFunction"
26
- * [member]="currentMember"
27
- * [islevel]="'2'"
28
- * [polls]="pollList"
29
- * [poll]="selectedPoll"
30
- * [socket]="socketInstance"
31
- * [roomName]="'exampleRoom'"
32
- * [handleCreatePoll]="createPollFunction"
33
- * [handleEndPoll]="endPollFunction"
34
- * [handleVotePoll]="votePollFunction"
35
- * ></app-poll-modal>
36
- * ```
37
- */
38
- export class PollModal {
39
- isPollModalVisible = false;
40
- onClose;
41
- position = 'topRight';
42
- backgroundColor = '#f5f5f5';
43
- member = '';
44
- islevel = '';
45
- polls = [];
46
- poll = null;
47
- socket = {};
48
- roomName = '';
49
- showAlert = () => { };
50
- updateIsPollModalVisible = () => { };
51
- handleCreatePoll;
52
- handleEndPoll;
53
- handleVotePoll;
54
- faTimes = faTimes;
55
- newPoll = { question: '', type: '', options: [] };
56
- screenWidth = window.innerWidth;
57
- modalWidth = this.screenWidth > 500 ? 350 : 0.7 * this.screenWidth;
58
- ngOnInit() {
59
- this.renderPolls();
60
- }
61
- ngOnChanges(changes) {
62
- if (changes['isPollModalVisible']) {
63
- this.renderPolls();
64
- }
65
- }
66
- renderPolls = () => {
67
- let activePollCount = 0;
68
- this.polls &&
69
- this.polls.forEach((polled) => {
70
- if (polled.status === 'active' && this.poll && polled.id === this.poll.id) {
71
- activePollCount++;
72
- }
73
- });
74
- if (this.islevel == '2' && activePollCount === 0) {
75
- if (this.poll && this.poll.status === 'active') {
76
- this.poll.status = 'inactive';
77
- }
78
- }
79
- };
80
- calculatePercentage(votes, optionIndex) {
81
- const totalVotes = votes.reduce((a, b) => a + b, 0);
82
- return totalVotes > 0 ? parseFloat(((votes[optionIndex] / totalVotes) * 100).toFixed(2)) : 0;
83
- }
84
- handlePollTypeChange(event) {
85
- const type = event.target.value;
86
- let options = [];
87
- switch (type) {
88
- case 'trueFalse':
89
- options = ['True', 'False'];
90
- break;
91
- case 'yesNo':
92
- options = ['Yes', 'No'];
93
- break;
94
- case 'custom':
95
- options = ['', '', '', '', '']; // Preload 5 empty options
96
- break;
97
- default:
98
- options = [];
99
- break;
100
- }
101
- this.newPoll = { ...this.newPoll, type, options };
102
- }
103
- async validateAndCreatePoll() {
104
- // Remove empty options before creating the poll
105
- this.newPoll.options = this.newPoll.options.filter((option) => option.trim() !== '');
106
- // Ensure there's at least one valid option
107
- if (this.newPoll.options.length > 0) {
108
- await this.handleCreatePoll({
109
- poll: this.newPoll,
110
- socket: this.socket,
111
- roomName: this.roomName,
112
- showAlert: this.showAlert,
113
- updateIsPollModalVisible: this.updateIsPollModalVisible,
114
- });
115
- }
116
- }
117
- handledVotePoll(pollId, optionIndex) {
118
- this.handleVotePoll({
119
- pollId,
120
- optionIndex,
121
- socket: this.socket,
122
- member: this.member,
123
- roomName: this.roomName,
124
- showAlert: this.showAlert,
125
- updateIsPollModalVisible: this.updateIsPollModalVisible,
126
- });
127
- }
128
- handledEndPoll(pollId) {
129
- this.handleEndPoll({
130
- pollId,
131
- socket: this.socket,
132
- roomName: this.roomName,
133
- showAlert: this.showAlert,
134
- updateIsPollModalVisible: this.updateIsPollModalVisible,
135
- });
136
- }
137
- get modalContainerStyle() {
138
- return {
139
- position: 'fixed',
140
- top: 0,
141
- left: 0,
142
- width: '100%',
143
- height: '100%',
144
- backgroundColor: 'rgba(0, 0, 0, 0.5)',
145
- display: this.isPollModalVisible ? 'block' : 'none',
146
- zIndex: 999,
147
- };
148
- }
149
- get modalContentStyle() {
150
- return {
151
- position: 'fixed',
152
- backgroundColor: this.backgroundColor,
153
- borderRadius: '10px',
154
- padding: '10px',
155
- width: `${this.modalWidth}px`,
156
- maxHeight: '75%',
157
- overflowY: 'auto',
158
- top: this.position.includes('top') ? '10px' : 'auto',
159
- bottom: this.position.includes('bottom') ? '10px' : 'auto',
160
- left: this.position.includes('Left') ? '10px' : 'auto',
161
- right: this.position.includes('Right') ? '10px' : 'auto',
162
- };
163
- }
164
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: PollModal, deps: [], target: i0.ɵɵFactoryTarget.Component });
165
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.8", type: PollModal, isStandalone: true, selector: "app-poll-modal", inputs: { isPollModalVisible: "isPollModalVisible", onClose: "onClose", position: "position", backgroundColor: "backgroundColor", member: "member", islevel: "islevel", polls: "polls", poll: "poll", socket: "socket", roomName: "roomName", showAlert: "showAlert", updateIsPollModalVisible: "updateIsPollModalVisible", handleCreatePoll: "handleCreatePoll", handleEndPoll: "handleEndPoll", handleVotePoll: "handleVotePoll" }, usesOnChanges: true, ngImport: i0, template: "<div [ngStyle]=\"modalContainerStyle\">\r\n <div [ngStyle]=\"modalContentStyle\">\r\n <div class=\"modal-header\">\r\n <h2>Polls</h2>\r\n <button (click)=\"onClose()\" class=\"close-button\">\r\n <fa-icon [icon]=\"faTimes\"></fa-icon>\r\n </button>\r\n </div>\r\n <hr />\r\n <div class=\"modal-body\">\r\n <!-- Previous Polls Section -->\r\n <div *ngIf=\"islevel === '2'\">\r\n <div class=\"previous-polls\">\r\n <h5>Previous Polls</h5>\r\n <div *ngIf=\"polls.length === 0\">No polls available</div>\r\n\r\n <!-- Using ng-container to avoid multiple structural directives on the same element -->\r\n <ng-container *ngFor=\"let polled of polls\">\r\n <div\r\n *ngIf=\"!poll || polled.id !== poll.id || poll.status !== 'active'\"\r\n class=\"poll\"\r\n >\r\n <h6>Question:</h6>\r\n <textarea\r\n class=\"form-control\"\r\n rows=\"3\"\r\n [disabled]=\"true\"\r\n [value]=\"polled.question\"\r\n ></textarea>\r\n <br />\r\n <h6>Options:</h6>\r\n <div *ngFor=\"let option of polled.options; let i = index\">\r\n {{ option }}: {{ polled.votes[i] }} votes ({{\r\n calculatePercentage(polled.votes, i)\r\n }}%)\r\n </div>\r\n <!-- End Poll Button (if poll is active) -->\r\n <button\r\n *ngIf=\"polled.status === 'active'\"\r\n class=\"btn btn-danger\"\r\n (click)=\"handledEndPoll(polled.id)\"\r\n >\r\n End Poll\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <hr />\r\n\r\n <!-- Create Poll Section -->\r\n <div class=\"create-poll\">\r\n <h5>Create a New Poll</h5>\r\n <form (ngSubmit)=\"validateAndCreatePoll()\">\r\n <div class=\"form-group\">\r\n <label for=\"pollQuestion\">Poll Question</label>\r\n <textarea\r\n class=\"form-control\"\r\n id=\"pollQuestion\"\r\n rows=\"3\"\r\n maxLength=\"300\"\r\n required\r\n [(ngModel)]=\"newPoll.question\"\r\n name=\"question\"\r\n ></textarea>\r\n </div>\r\n <div class=\"form-group\">\r\n <label for=\"pollType\">Select Poll Answer Type</label>\r\n <select\r\n class=\"form-control\"\r\n id=\"pollType\"\r\n required\r\n (change)=\"handlePollTypeChange($event)\"\r\n [(ngModel)]=\"newPoll.type\"\r\n name=\"type\"\r\n >\r\n <option value=\"\">Choose...</option>\r\n <option value=\"trueFalse\">True/False</option>\r\n <option value=\"yesNo\">Yes/No</option>\r\n <option value=\"custom\">Custom</option>\r\n </select>\r\n </div>\r\n\r\n <!-- Render Poll Options -->\r\n <div\r\n *ngIf=\"newPoll.type === 'trueFalse' || newPoll.type === 'yesNo'\"\r\n >\r\n <div\r\n *ngFor=\"let option of newPoll.options; let i = index\"\r\n class=\"form-check\"\r\n >\r\n <input\r\n class=\"form-check-input\"\r\n type=\"radio\"\r\n name=\"pollOption\"\r\n [value]=\"option.toLowerCase()\"\r\n [id]=\"'option' + option\"\r\n />\r\n <label class=\"form-check-label\" [for]=\"'option' + option\">{{\r\n option\r\n }}</label>\r\n </div>\r\n </div>\r\n <div *ngIf=\"newPoll.type === 'custom'\">\r\n <div\r\n *ngFor=\"let option of newPoll.options; let i = index\"\r\n class=\"form-group\"\r\n >\r\n <input\r\n type=\"text\"\r\n class=\"form-control\"\r\n placeholder=\"Option {{ i + 1 }}\"\r\n maxLength=\"50\"\r\n [(ngModel)]=\"newPoll.options[i]\"\r\n name=\"option{{ i }}\"\r\n />\r\n </div>\r\n </div>\r\n <button type=\"submit\" class=\"btn btn-primary\">Create Poll</button>\r\n </form>\r\n </div>\r\n <hr />\r\n </div>\r\n\r\n <!-- Current Poll Section -->\r\n <div class=\"current-poll\">\r\n <h5>Current Poll</h5>\r\n <div *ngIf=\"poll && poll.status === 'active'\">\r\n <h6>Question:</h6>\r\n <textarea\r\n class=\"form-control\"\r\n rows=\"3\"\r\n [disabled]=\"true\"\r\n [value]=\"poll.question\"\r\n ></textarea>\r\n <h6>Options:</h6>\r\n <div\r\n *ngFor=\"let option of poll.options; let i = index\"\r\n class=\"form-check\"\r\n >\r\n <input\r\n class=\"form-check-input\"\r\n type=\"radio\"\r\n name=\"pollOption\"\r\n [value]=\"i\"\r\n id=\"pollOption{{ i }}\"\r\n [checked]=\"poll.voters?.[member] === i\"\r\n (change)=\"handledVotePoll(poll.id, i)\"\r\n />\r\n <label class=\"form-check-label\" [for]=\"'pollOption' + i\">{{\r\n option\r\n }}</label>\r\n </div>\r\n <button\r\n *ngIf=\"poll.status === 'active' && islevel === '2'\"\r\n class=\"btn btn-danger\"\r\n (click)=\"handledEndPoll(poll.id)\"\r\n >\r\n End Poll\r\n </button>\r\n </div>\r\n <div *ngIf=\"!poll || poll.status !== 'active'\">\r\n <hr />\r\n No active poll\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".modal-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:15px}.modal-body{display:flex;flex-direction:column;gap:10px}.previous-polls,.create-poll,.current-poll{overflow-y:auto;max-height:20%}.poll{margin-bottom:15px}.close-button{border:none;background:none;cursor:pointer}.form-group{max-width:80%;overflow-x:auto}textarea.form-control{resize:none}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FontAwesomeModule }, { kind: "component", type: i2.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }] });
166
- }
167
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: PollModal, decorators: [{
168
- type: Component,
169
- args: [{ selector: 'app-poll-modal', standalone: true, imports: [CommonModule, FontAwesomeModule, FormsModule], template: "<div [ngStyle]=\"modalContainerStyle\">\r\n <div [ngStyle]=\"modalContentStyle\">\r\n <div class=\"modal-header\">\r\n <h2>Polls</h2>\r\n <button (click)=\"onClose()\" class=\"close-button\">\r\n <fa-icon [icon]=\"faTimes\"></fa-icon>\r\n </button>\r\n </div>\r\n <hr />\r\n <div class=\"modal-body\">\r\n <!-- Previous Polls Section -->\r\n <div *ngIf=\"islevel === '2'\">\r\n <div class=\"previous-polls\">\r\n <h5>Previous Polls</h5>\r\n <div *ngIf=\"polls.length === 0\">No polls available</div>\r\n\r\n <!-- Using ng-container to avoid multiple structural directives on the same element -->\r\n <ng-container *ngFor=\"let polled of polls\">\r\n <div\r\n *ngIf=\"!poll || polled.id !== poll.id || poll.status !== 'active'\"\r\n class=\"poll\"\r\n >\r\n <h6>Question:</h6>\r\n <textarea\r\n class=\"form-control\"\r\n rows=\"3\"\r\n [disabled]=\"true\"\r\n [value]=\"polled.question\"\r\n ></textarea>\r\n <br />\r\n <h6>Options:</h6>\r\n <div *ngFor=\"let option of polled.options; let i = index\">\r\n {{ option }}: {{ polled.votes[i] }} votes ({{\r\n calculatePercentage(polled.votes, i)\r\n }}%)\r\n </div>\r\n <!-- End Poll Button (if poll is active) -->\r\n <button\r\n *ngIf=\"polled.status === 'active'\"\r\n class=\"btn btn-danger\"\r\n (click)=\"handledEndPoll(polled.id)\"\r\n >\r\n End Poll\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <hr />\r\n\r\n <!-- Create Poll Section -->\r\n <div class=\"create-poll\">\r\n <h5>Create a New Poll</h5>\r\n <form (ngSubmit)=\"validateAndCreatePoll()\">\r\n <div class=\"form-group\">\r\n <label for=\"pollQuestion\">Poll Question</label>\r\n <textarea\r\n class=\"form-control\"\r\n id=\"pollQuestion\"\r\n rows=\"3\"\r\n maxLength=\"300\"\r\n required\r\n [(ngModel)]=\"newPoll.question\"\r\n name=\"question\"\r\n ></textarea>\r\n </div>\r\n <div class=\"form-group\">\r\n <label for=\"pollType\">Select Poll Answer Type</label>\r\n <select\r\n class=\"form-control\"\r\n id=\"pollType\"\r\n required\r\n (change)=\"handlePollTypeChange($event)\"\r\n [(ngModel)]=\"newPoll.type\"\r\n name=\"type\"\r\n >\r\n <option value=\"\">Choose...</option>\r\n <option value=\"trueFalse\">True/False</option>\r\n <option value=\"yesNo\">Yes/No</option>\r\n <option value=\"custom\">Custom</option>\r\n </select>\r\n </div>\r\n\r\n <!-- Render Poll Options -->\r\n <div\r\n *ngIf=\"newPoll.type === 'trueFalse' || newPoll.type === 'yesNo'\"\r\n >\r\n <div\r\n *ngFor=\"let option of newPoll.options; let i = index\"\r\n class=\"form-check\"\r\n >\r\n <input\r\n class=\"form-check-input\"\r\n type=\"radio\"\r\n name=\"pollOption\"\r\n [value]=\"option.toLowerCase()\"\r\n [id]=\"'option' + option\"\r\n />\r\n <label class=\"form-check-label\" [for]=\"'option' + option\">{{\r\n option\r\n }}</label>\r\n </div>\r\n </div>\r\n <div *ngIf=\"newPoll.type === 'custom'\">\r\n <div\r\n *ngFor=\"let option of newPoll.options; let i = index\"\r\n class=\"form-group\"\r\n >\r\n <input\r\n type=\"text\"\r\n class=\"form-control\"\r\n placeholder=\"Option {{ i + 1 }}\"\r\n maxLength=\"50\"\r\n [(ngModel)]=\"newPoll.options[i]\"\r\n name=\"option{{ i }}\"\r\n />\r\n </div>\r\n </div>\r\n <button type=\"submit\" class=\"btn btn-primary\">Create Poll</button>\r\n </form>\r\n </div>\r\n <hr />\r\n </div>\r\n\r\n <!-- Current Poll Section -->\r\n <div class=\"current-poll\">\r\n <h5>Current Poll</h5>\r\n <div *ngIf=\"poll && poll.status === 'active'\">\r\n <h6>Question:</h6>\r\n <textarea\r\n class=\"form-control\"\r\n rows=\"3\"\r\n [disabled]=\"true\"\r\n [value]=\"poll.question\"\r\n ></textarea>\r\n <h6>Options:</h6>\r\n <div\r\n *ngFor=\"let option of poll.options; let i = index\"\r\n class=\"form-check\"\r\n >\r\n <input\r\n class=\"form-check-input\"\r\n type=\"radio\"\r\n name=\"pollOption\"\r\n [value]=\"i\"\r\n id=\"pollOption{{ i }}\"\r\n [checked]=\"poll.voters?.[member] === i\"\r\n (change)=\"handledVotePoll(poll.id, i)\"\r\n />\r\n <label class=\"form-check-label\" [for]=\"'pollOption' + i\">{{\r\n option\r\n }}</label>\r\n </div>\r\n <button\r\n *ngIf=\"poll.status === 'active' && islevel === '2'\"\r\n class=\"btn btn-danger\"\r\n (click)=\"handledEndPoll(poll.id)\"\r\n >\r\n End Poll\r\n </button>\r\n </div>\r\n <div *ngIf=\"!poll || poll.status !== 'active'\">\r\n <hr />\r\n No active poll\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".modal-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:15px}.modal-body{display:flex;flex-direction:column;gap:10px}.previous-polls,.create-poll,.current-poll{overflow-y:auto;max-height:20%}.poll{margin-bottom:15px}.close-button{border:none;background:none;cursor:pointer}.form-group{max-width:80%;overflow-x:auto}textarea.form-control{resize:none}\n"] }]
170
- }], propDecorators: { isPollModalVisible: [{
171
- type: Input
172
- }], onClose: [{
173
- type: Input
174
- }], position: [{
175
- type: Input
176
- }], backgroundColor: [{
177
- type: Input
178
- }], member: [{
179
- type: Input
180
- }], islevel: [{
181
- type: Input
182
- }], polls: [{
183
- type: Input
184
- }], poll: [{
185
- type: Input
186
- }], socket: [{
187
- type: Input
188
- }], roomName: [{
189
- type: Input
190
- }], showAlert: [{
191
- type: Input
192
- }], updateIsPollModalVisible: [{
193
- type: Input
194
- }], handleCreatePoll: [{
195
- type: Input
196
- }], handleEndPoll: [{
197
- type: Input
198
- }], handleVotePoll: [{
199
- type: Input
200
- }] } });
201
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9sbC1tb2RhbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tZWRpYXNmdS1hbmd1bGFyL3NyYy9saWIvY29tcG9uZW50cy9wb2xscy1jb21wb25lbnRzL3BvbGwtbW9kYWwvcG9sbC1tb2RhbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tZWRpYXNmdS1hbmd1bGFyL3NyYy9saWIvY29tcG9uZW50cy9wb2xscy1jb21wb25lbnRzL3BvbGwtbW9kYWwvcG9sbC1tb2RhbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx5REFBeUQ7QUFDekQsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQW9DLE1BQU0sZUFBZSxDQUFDO0FBQ25GLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDNUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7OztBQStCN0M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMEJHO0FBVUgsTUFBTSxPQUFPLFNBQVM7SUFDWCxrQkFBa0IsR0FBRyxLQUFLLENBQUM7SUFDM0IsT0FBTyxDQUFjO0lBQ3JCLFFBQVEsR0FBRyxVQUFVLENBQUM7SUFDdEIsZUFBZSxHQUFHLFNBQVMsQ0FBQztJQUM1QixNQUFNLEdBQUcsRUFBRSxDQUFDO0lBQ1osT0FBTyxHQUFHLEVBQUUsQ0FBQztJQUNiLEtBQUssR0FBVyxFQUFFLENBQUM7SUFDbkIsSUFBSSxHQUFnQixJQUFJLENBQUM7SUFDekIsTUFBTSxHQUFXLEVBQVksQ0FBQztJQUM5QixRQUFRLEdBQUcsRUFBRSxDQUFDO0lBQ2QsU0FBUyxH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LENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNO1lBQ3RELEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNO1NBQ3pELENBQUM7SUFDSixDQUFDO3VHQTlJVSxTQUFTOzJGQUFULFNBQVMscWdCQ3hFdEIscWtNQXdLQSwwYkRwR1ksWUFBWSxvVkFBRSxpQkFBaUIsNFBBQUUsV0FBVzs7MkZBSTNDLFNBQVM7a0JBUHJCLFNBQVM7K0JBQ0UsZ0JBQWdCLGNBQ2QsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLGlCQUFpQixFQUFFLFdBQVcsQ0FBQzs4QkFLOUMsa0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csd0JBQXdCO3NCQUFoQyxLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb24gKi9cbmltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRm9udEF3ZXNvbWVNb2R1bGUgfSBmcm9tICdAZm9ydGF3ZXNvbWUvYW5ndWxhci1mb250YXdlc29tZSc7XG5pbXBvcnQgeyBmYVRpbWVzIH0gZnJvbSAnQGZvcnRhd2Vzb21lL2ZyZWUtc29saWQtc3ZnLWljb25zJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU29ja2V0IH0gZnJvbSAnc29ja2V0LmlvLWNsaWVudCc7XG5pbXBvcnQge1xuICBQb2xsLFxuICBTaG93QWxlcnQsXG4gIEhhbmRsZUNyZWF0ZVBvbGxUeXBlLFxuICBIYW5kbGVFbmRQb2xsVHlwZSxcbiAgSGFuZGxlVm90ZVBvbGxUeXBlLFxufSBmcm9tICcuLi8uLi8uLi9AdHlwZXMvdHlwZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBvbGxNb2RhbE9wdGlvbnMge1xuICBpc1BvbGxNb2RhbFZpc2libGU6IGJvb2xlYW47XG4gIG9uQ2xvc2U6ICgpID0+IHZvaWQ7XG4gIHBvc2l0aW9uPzogc3RyaW5nO1xuICBiYWNrZ3JvdW5kQ29sb3I/OiBzdHJpbmc7XG4gIG1lbWJlcjogc3RyaW5nO1xuICBpc2xldmVsOiBzdHJpbmc7XG4gIHBvbGxzOiBQb2xsW107XG4gIHBvbGw6IFBvbGwgfCBudWxsO1xuICBzb2NrZXQ6IFNvY2tldDtcbiAgcm9vbU5hbWU6IHN0cmluZztcbiAgc2hvd0FsZXJ0PzogU2hvd0FsZXJ0O1xuICB1cGRhdGVJc1BvbGxNb2RhbFZpc2libGU6IChpc1Zpc2libGU6IGJvb2xlYW4pID0+IHZvaWQ7XG5cbiAgaGFuZGxlQ3JlYXRlUG9sbDogSGFuZGxlQ3JlYXRlUG9sbFR5cGU7XG4gIGhhbmRsZUVuZFBvbGw6IEhhbmRsZUVuZFBvbGxUeXBlO1xuICBoYW5kbGVWb3RlUG9sbDogSGFuZGxlVm90ZVBvbGxUeXBlO1xufVxuXG5leHBvcnQgdHlwZSBQb2xsTW9kYWxUeXBlID0gKG9wdGlvbnM6IFBvbGxNb2RhbE9wdGlvbnMpID0+IEhUTUxFbGVtZW50O1xuXG4vKipcbiAqIENvbXBvbmVudCBmb3IgZGlzcGxheWluZyBhIHBvbGwgbW9kYWwsIGFsbG93aW5nIHVzZXJzIHRvIGNyZWF0ZSwgdm90ZSwgYW5kIGVuZCBwb2xscyB3aXRoaW4gYSBzZXNzaW9uLlxuICpcbiAqIEBjb21wb25lbnRcbiAqIEBzZWxlY3RvciBhcHAtcG9sbC1tb2RhbFxuICogQHN0YW5kYWxvbmUgdHJ1ZVxuICogQHRlbXBsYXRlVXJsIC4vcG9sbC1tb2RhbC5jb21wb25lbnQuaHRtbFxuICogQHN0eWxlVXJscyBbJy4vcG9sbC1tb2RhbC5jb21wb25lbnQuY3NzJ11cbiAqIEBpbXBvcnRzIFtDb21tb25Nb2R1bGUsIEZvbnRBd2Vzb21lTW9kdWxlLCBGb3Jtc01vZHVsZV1cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgaHRtbFxuICogPGFwcC1wb2xsLW1vZGFsXG4gKiAgIFtpc1BvbGxNb2RhbFZpc2libGVdPVwidHJ1ZVwiXG4gKiAgIFtvbkNsb3NlXT1cImNsb3NlTW9kYWxGdW5jdGlvblwiXG4gKiAgIFttZW1iZXJdPVwiY3VycmVudE1lbWJlclwiXG4gKiAgIFtpc2xldmVsXT1cIicyJ1wiXG4gKiAgIFtwb2xsc109XCJwb2xsTGlzdFwiXG4gKiAgIFtwb2xsXT1cInNlbGVjdGVkUG9sbFwiXG4gKiAgIFtzb2NrZXRdPVwic29ja2V0SW5zdGFuY2VcIlxuICogICBbcm9vbU5hbWVdPVwiJ2V4YW1wbGVSb29tJ1wiXG4gKiAgIFtoYW5kbGVDcmVhdGVQb2xsXT1cImNyZWF0ZVBvbGxGdW5jdGlvblwiXG4gKiAgIFtoYW5kbGVFbmRQb2xsXT1cImVuZFBvbGxGdW5jdGlvblwiXG4gKiAgIFtoYW5kbGVWb3RlUG9sbF09XCJ2b3RlUG9sbEZ1bmN0aW9uXCJcbiAqID48L2FwcC1wb2xsLW1vZGFsPlxuICogYGBgXG4gKi9cblxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtcG9sbC1tb2RhbCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvbnRBd2Vzb21lTW9kdWxlLCBGb3Jtc01vZHVsZV0sXG4gIHRlbXBsYXRlVXJsOiAnLi9wb2xsLW1vZGFsLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcG9sbC1tb2RhbC5jb21wb25lbnQuY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFBvbGxNb2RhbCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgaXNQb2xsTW9kYWxWaXNpYmxlID0gZmFsc2U7XG4gIEBJbnB1dCgpIG9uQ2xvc2UhOiAoKSA9PiB2b2lkO1xuICBASW5wdXQoKSBwb3NpdGlvbiA9ICd0b3BSaWdodCc7XG4gIEBJbnB1dCgpIGJhY2tncm91bmRDb2xvciA9ICcjZjVmNWY1JztcbiAgQElucHV0KCkgbWVtYmVyID0gJyc7XG4gIEBJbnB1dCgpIGlzbGV2ZWwgPSAnJztcbiAgQElucHV0KCkgcG9sbHM6IFBvbGxbXSA9IFtdO1xuICBASW5wdXQoKSBwb2xsOiBQb2xsIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIHNvY2tldDogU29ja2V0ID0ge30gYXMgU29ja2V0O1xuICBASW5wdXQoKSByb29tTmFtZSA9ICcnO1xuICBASW5wdXQoKSBzaG93QWxlcnQ6IFNob3dBbGVydCA9ICgpID0+IHt9O1xuICBASW5wdXQoKSB1cGRhdGVJc1BvbGxNb2RhbFZpc2libGU6IChpc1Zpc2libGU6IGJvb2xlYW4pID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgQElucHV0KCkgaGFuZGxlQ3JlYXRlUG9sbCE6IEhhbmRsZUNyZWF0ZVBvbGxUeXBlO1xuICBASW5wdXQoKSBoYW5kbGVFbmRQb2xsITogSGFuZGxlRW5kUG9sbFR5cGU7XG4gIEBJbnB1dCgpIGhhbmRsZVZvdGVQb2xsITogSGFuZGxlVm90ZVBvbGxUeXBlO1xuXG4gIGZhVGltZXMgPSBmYVRpbWVzO1xuICBuZXdQb2xsOiBhbnkgPSB7IHF1ZXN0aW9uOiAnJywgdHlwZTogJycsIG9wdGlvbnM6IFtdIH07XG5cbiAgc2NyZWVuV2lkdGg6IG51bWJlciA9IHdpbmRvdy5pbm5lcldpZHRoO1xuICBtb2RhbFdpZHRoOiBudW1iZXIgPSB0aGlzLnNjcmVlbldpZHRoID4gNTAwID8gMzUwIDogMC43ICogdGhpcy5zY3JlZW5XaWR0aDtcblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnJlbmRlclBvbGxzKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgaWYgKGNoYW5nZXNbJ2lzUG9sbE1vZGFsVmlzaWJsZSddKSB7XG4gICAgICB0aGlzLnJlbmRlclBvbGxzKCk7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyUG9sbHMgPSAoKSA9PiB7XG4gICAgbGV0IGFjdGl2ZVBvbGxDb3VudCA9IDA7XG5cbiAgICB0aGlzLnBvbGxzICYmXG4gICAgICB0aGlzLnBvbGxzLmZvckVhY2goKHBvbGxlZDogYW55KSA9PiB7XG4gICAgICAgIGlmIChwb2xsZWQuc3RhdHVzID09PSAnYWN0aXZlJyAmJiB0aGlzLnBvbGwgJiYgcG9sbGVkLmlkID09PSB0aGlzLnBvbGwuaWQpIHtcbiAgICAgICAgICBhY3RpdmVQb2xsQ291bnQrKztcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICBpZiAodGhpcy5pc2xldmVsID09ICcyJyAmJiBhY3RpdmVQb2xsQ291bnQgPT09IDApIHtcbiAgICAgIGlmICh0aGlzLnBvbGwgJiYgdGhpcy5wb2xsLnN0YXR1cyA9PT0gJ2FjdGl2ZScpIHtcbiAgICAgICAgdGhpcy5wb2xsLnN0YXR1cyA9ICdpbmFjdGl2ZSc7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIGNhbGN1bGF0ZVBlcmNlbnRhZ2Uodm90ZXM6IG51bWJlcltdLCBvcHRpb25JbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCB0b3RhbFZvdGVzID0gdm90ZXMucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCk7XG4gICAgcmV0dXJuIHRvdGFsVm90ZXMgPiAwID8gcGFyc2VGbG9hdCgoKHZvdGVzW29wdGlvbkluZGV4XSAvIHRvdGFsVm90ZXMpICogMTAwKS50b0ZpeGVkKDIpKSA6IDA7XG4gIH1cblxuICBoYW5kbGVQb2xsVHlwZUNoYW5nZShldmVudDogYW55KSB7XG4gICAgY29uc3QgdHlwZSA9IGV2ZW50LnRhcmdldC52YWx1ZTtcbiAgICBsZXQgb3B0aW9uczogc3RyaW5nW10gPSBbXTtcblxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAndHJ1ZUZhbHNlJzpcbiAgICAgICAgb3B0aW9ucyA9IFsnVHJ1ZScsICdGYWxzZSddO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3llc05vJzpcbiAgICAgICAgb3B0aW9ucyA9IFsnWWVzJywgJ05vJ107XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnY3VzdG9tJzpcbiAgICAgICAgb3B0aW9ucyA9IFsnJywgJycsICcnLCAnJywgJyddOyAvLyBQcmVsb2FkIDUgZW1wdHkgb3B0aW9uc1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIG9wdGlvbnMgPSBbXTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgdGhpcy5uZXdQb2xsID0geyAuLi50aGlzLm5ld1BvbGwsIHR5cGUsIG9wdGlvbnMgfTtcbiAgfVxuXG4gIGFzeW5jIHZhbGlkYXRlQW5kQ3JlYXRlUG9sbCgpIHtcbiAgICAvLyBSZW1vdmUgZW1wdHkgb3B0aW9ucyBiZWZvcmUgY3JlYXRpbmcgdGhlIHBvbGxcbiAgICB0aGlzLm5ld1BvbGwub3B0aW9ucyA9IHRoaXMubmV3UG9sbC5vcHRpb25zLmZpbHRlcigob3B0aW9uOiBzdHJpbmcpID0+IG9wdGlvbi50cmltKCkgIT09ICcnKTtcblxuICAgIC8vIEVuc3VyZSB0aGVyZSdzIGF0IGxlYXN0IG9uZSB2YWxpZCBvcHRpb25cbiAgICBpZiAodGhpcy5uZXdQb2xsLm9wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVDcmVhdGVQb2xsKHtcbiAgICAgICAgcG9sbDogdGhpcy5uZXdQb2xsLFxuICAgICAgICBzb2NrZXQ6IHRoaXMuc29ja2V0LFxuICAgICAgICByb29tTmFtZTogdGhpcy5yb29tTmFtZSxcbiAgICAgICAgc2hvd0FsZXJ0OiB0aGlzLnNob3dBbGVydCxcbiAgICAgICAgdXBkYXRlSXNQb2xsTW9kYWxWaXNpYmxlOiB0aGlzLnVwZGF0ZUlzUG9sbE1vZGFsVmlzaWJsZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZWRWb3RlUG9sbChwb2xsSWQ6IHN0cmluZywgb3B0aW9uSW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMuaGFuZGxlVm90ZVBvbGwoe1xuICAgICAgcG9sbElkLFxuICAgICAgb3B0aW9uSW5kZXgsXG4gICAgICBzb2NrZXQ6IHRoaXMuc29ja2V0LFxuICAgICAgbWVtYmVyOiB0aGlzLm1lbWJlcixcbiAgICAgIHJvb21OYW1lOiB0aGlzLnJvb21OYW1lLFxuICAgICAgc2hvd0FsZXJ0OiB0aGlzLnNob3dBbGVydCxcbiAgICAgIHVwZGF0ZUlzUG9sbE1vZGFsVmlzaWJsZTogdGhpcy51cGRhdGVJc1BvbGxNb2RhbFZpc2libGUsXG4gICAgfSk7XG4gIH1cblxuICBoYW5kbGVkRW5kUG9sbChwb2xsSWQ6IHN0cmluZykge1xuICAgIHRoaXMuaGFuZGxlRW5kUG9sbCh7XG4gICAgICBwb2xsSWQsXG4gICAgICBzb2NrZXQ6IHRoaXMuc29ja2V0LFxuICAgICAgcm9vbU5hbWU6IHRoaXMucm9vbU5hbWUsXG4gICAgICBzaG93QWxlcnQ6IHRoaXMuc2hvd0FsZXJ0LFxuICAgICAgdXBkYXRlSXNQb2xsTW9kYWxWaXNpYmxlOiB0aGlzLnVwZGF0ZUlzUG9sbE1vZGFsVmlzaWJsZSxcbiAgICB9KTtcbiAgfVxuXG4gIGdldCBtb2RhbENvbnRhaW5lclN0eWxlKCkge1xuICAgIHJldHVybiB7XG4gICAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICAgIHRvcDogMCxcbiAgICAgIGxlZnQ6IDAsXG4gICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6ICdyZ2JhKDAsIDAsIDAsIDAuNSknLFxuICAgICAgZGlzcGxheTogdGhpcy5pc1BvbGxNb2RhbFZpc2libGUgPyAnYmxvY2snIDogJ25vbmUnLFxuICAgICAgekluZGV4OiA5OTksXG4gICAgfTtcbiAgfVxuXG4gIGdldCBtb2RhbENvbnRlbnRTdHlsZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcG9zaXRpb246ICdmaXhlZCcsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoaXMuYmFja2dyb3VuZENvbG9yLFxuICAgICAgYm9yZGVyUmFkaXVzOiAnMTBweCcsXG4gICAgICBwYWRkaW5nOiAnMTBweCcsXG4gICAgICB3aWR0aDogYCR7dGhpcy5tb2RhbFdpZHRofXB4YCxcbiAgICAgIG1heEhlaWdodDogJzc1JScsXG4gICAgICBvdmVyZmxvd1k6ICdhdXRvJyxcbiAgICAgIHRvcDogdGhpcy5wb3NpdGlvbi5pbmNsdWRlcygndG9wJykgPyAnMTBweCcgOiAnYXV0bycsXG4gICAgICBib3R0b206IHRoaXMucG9zaXRpb24uaW5jbHVkZXMoJ2JvdHRvbScpID8gJzEwcHgnIDogJ2F1dG8nLFxuICAgICAgbGVmdDogdGhpcy5wb3NpdGlvbi5pbmNsdWRlcygnTGVmdCcpID8gJzEwcHgnIDogJ2F1dG8nLFxuICAgICAgcmlnaHQ6IHRoaXMucG9zaXRpb24uaW5jbHVkZXMoJ1JpZ2h0JykgPyAnMTBweCcgOiAnYXV0bycsXG4gICAgfTtcbiAgfVxufVxuIiwiPGRpdiBbbmdTdHlsZV09XCJtb2RhbENvbnRhaW5lclN0eWxlXCI+XHJcbiAgPGRpdiBbbmdTdHlsZV09XCJtb2RhbENvbnRlbnRTdHlsZVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG4gICAgICA8aDI+UG9sbHM8L2gyPlxyXG4gICAgICA8YnV0dG9uIChjbGljayk9XCJvbkNsb3NlKClcIiBjbGFzcz1cImNsb3NlLWJ1dHRvblwiPlxyXG4gICAgICAgIDxmYS1pY29uIFtpY29uXT1cImZhVGltZXNcIj48L2ZhLWljb24+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8aHIgLz5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XHJcbiAgICAgIDwhLS0gUHJldmlvdXMgUG9sbHMgU2VjdGlvbiAtLT5cclxuICAgICAgPGRpdiAqbmdJZj1cImlzbGV2ZWwgPT09ICcyJ1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwcmV2aW91cy1wb2xsc1wiPlxyXG4gICAgICAgICAgPGg1PlByZXZpb3VzIFBvbGxzPC9oNT5cclxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJwb2xscy5sZW5ndGggPT09IDBcIj5ObyBwb2xscyBhdmFpbGFibGU8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8IS0tIFVzaW5nIG5nLWNvbnRhaW5lciB0byBhdm9pZCBtdWx0aXBsZSBzdHJ1Y3R1cmFsIGRpcmVjdGl2ZXMgb24gdGhlIHNhbWUgZWxlbWVudCAtLT5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHBvbGxlZCBvZiBwb2xsc1wiPlxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgKm5nSWY9XCIhcG9sbCB8fCBwb2xsZWQuaWQgIT09IHBvbGwuaWQgfHwgcG9sbC5zdGF0dXMgIT09ICdhY3RpdmUnXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cInBvbGxcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPGg2PlF1ZXN0aW9uOjwvaDY+XHJcbiAgICAgICAgICAgICAgPHRleHRhcmVhXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXHJcbiAgICAgICAgICAgICAgICByb3dzPVwiM1wiXHJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwicG9sbGVkLnF1ZXN0aW9uXCJcclxuICAgICAgICAgICAgICA+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICA8YnIgLz5cclxuICAgICAgICAgICAgICA8aDY+T3B0aW9uczo8L2g2PlxyXG4gICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBwb2xsZWQub3B0aW9uczsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgICAgICAgICAge3sgb3B0aW9uIH19OiB7eyBwb2xsZWQudm90ZXNbaV0gfX0gdm90ZXMgKHt7XHJcbiAgICAgICAgICAgICAgICAgIGNhbGN1bGF0ZVBlcmNlbnRhZ2UocG9sbGVkLnZvdGVzLCBpKVxyXG4gICAgICAgICAgICAgICAgfX0lKVxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwhLS0gRW5kIFBvbGwgQnV0dG9uIChpZiBwb2xsIGlzIGFjdGl2ZSkgLS0+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJwb2xsZWQuc3RhdHVzID09PSAnYWN0aXZlJ1wiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tZGFuZ2VyXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVkRW5kUG9sbChwb2xsZWQuaWQpXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICBFbmQgUG9sbFxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxociAvPlxyXG5cclxuICAgICAgICA8IS0tIENyZWF0ZSBQb2xsIFNlY3Rpb24gLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNyZWF0ZS1wb2xsXCI+XHJcbiAgICAgICAgICA8aDU+Q3JlYXRlIGEgTmV3IFBvbGw8L2g1PlxyXG4gICAgICAgICAgPGZvcm0gKG5nU3VibWl0KT1cInZhbGlkYXRlQW5kQ3JlYXRlUG9sbCgpXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInBvbGxRdWVzdGlvblwiPlBvbGwgUXVlc3Rpb248L2xhYmVsPlxyXG4gICAgICAgICAgICAgIDx0ZXh0YXJlYVxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxyXG4gICAgICAgICAgICAgICAgaWQ9XCJwb2xsUXVlc3Rpb25cIlxyXG4gICAgICAgICAgICAgICAgcm93cz1cIjNcIlxyXG4gICAgICAgICAgICAgICAgbWF4TGVuZ3RoPVwiMzAwXCJcclxuICAgICAgICAgICAgICAgIHJlcXVpcmVkXHJcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm5ld1BvbGwucXVlc3Rpb25cIlxyXG4gICAgICAgICAgICAgICAgbmFtZT1cInF1ZXN0aW9uXCJcclxuICAgICAgICAgICAgICA+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInBvbGxUeXBlXCI+U2VsZWN0IFBvbGwgQW5zd2VyIFR5cGU8L2xhYmVsPlxyXG4gICAgICAgICAgICAgIDxzZWxlY3RcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcclxuICAgICAgICAgICAgICAgIGlkPVwicG9sbFR5cGVcIlxyXG4gICAgICAgICAgICAgICAgcmVxdWlyZWRcclxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiaGFuZGxlUG9sbFR5cGVDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm5ld1BvbGwudHlwZVwiXHJcbiAgICAgICAgICAgICAgICBuYW1lPVwidHlwZVwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPkNob29zZS4uLjwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInRydWVGYWxzZVwiPlRydWUvRmFsc2U8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ5ZXNOb1wiPlllcy9Obzwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImN1c3RvbVwiPkN1c3RvbTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gUmVuZGVyIFBvbGwgT3B0aW9ucyAtLT5cclxuICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICpuZ0lmPVwibmV3UG9sbC50eXBlID09PSAndHJ1ZUZhbHNlJyB8fCBuZXdQb2xsLnR5cGUgPT09ICd5ZXNObydcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBuZXdQb2xsLm9wdGlvbnM7IGxldCBpID0gaW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNoZWNrXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCJcclxuICAgICAgICAgICAgICAgICAgdHlwZT1cInJhZGlvXCJcclxuICAgICAgICAgICAgICAgICAgbmFtZT1cInBvbGxPcHRpb25cIlxyXG4gICAgICAgICAgICAgICAgICBbdmFsdWVdPVwib3B0aW9uLnRvTG93ZXJDYXNlKClcIlxyXG4gICAgICAgICAgICAgICAgICBbaWRdPVwiJ29wdGlvbicgKyBvcHRpb25cIlxyXG4gICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBbZm9yXT1cIidvcHRpb24nICsgb3B0aW9uXCI+e3tcclxuICAgICAgICAgICAgICAgICAgb3B0aW9uXHJcbiAgICAgICAgICAgICAgICB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwibmV3UG9sbC50eXBlID09PSAnY3VzdG9tJ1wiPlxyXG4gICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgbmV3UG9sbC5vcHRpb25zOyBsZXQgaSA9IGluZGV4XCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1ncm91cFwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxyXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIk9wdGlvbiB7eyBpICsgMSB9fVwiXHJcbiAgICAgICAgICAgICAgICAgIG1heExlbmd0aD1cIjUwXCJcclxuICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJuZXdQb2xsLm9wdGlvbnNbaV1cIlxyXG4gICAgICAgICAgICAgICAgICBuYW1lPVwib3B0aW9ue3sgaSB9fVwiXHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIj5DcmVhdGUgUG9sbDwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9mb3JtPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxociAvPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwhLS0gQ3VycmVudCBQb2xsIFNlY3Rpb24gLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjdXJyZW50LXBvbGxcIj5cclxuICAgICAgICA8aDU+Q3VycmVudCBQb2xsPC9oNT5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwicG9sbCAmJiBwb2xsLnN0YXR1cyA9PT0gJ2FjdGl2ZSdcIj5cclxuICAgICAgICAgIDxoNj5RdWVzdGlvbjo8L2g2PlxyXG4gICAgICAgICAgPHRleHRhcmVhXHJcbiAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcclxuICAgICAgICAgICAgcm93cz1cIjNcIlxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJwb2xsLnF1ZXN0aW9uXCJcclxuICAgICAgICAgID48L3RleHRhcmVhPlxyXG4gICAgICAgICAgPGg2Pk9wdGlvbnM6PC9oNj5cclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBwb2xsLm9wdGlvbnM7IGxldCBpID0gaW5kZXhcIlxyXG4gICAgICAgICAgICBjbGFzcz1cImZvcm0tY2hlY2tcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIlxyXG4gICAgICAgICAgICAgIHR5cGU9XCJyYWRpb1wiXHJcbiAgICAgICAgICAgICAgbmFtZT1cInBvbGxPcHRpb25cIlxyXG4gICAgICAgICAgICAgIFt2YWx1ZV09XCJpXCJcclxuICAgICAgICAgICAgICBpZD1cInBvbGxPcHRpb257eyBpIH19XCJcclxuICAgICAgICAgICAgICBbY2hlY2tlZF09XCJwb2xsLnZvdGVycz8uW21lbWJlcl0gPT09IGlcIlxyXG4gICAgICAgICAgICAgIChjaGFuZ2UpPVwiaGFuZGxlZFZvdGVQb2xsKHBvbGwuaWQsIGkpXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIFtmb3JdPVwiJ3BvbGxPcHRpb24nICsgaVwiPnt7XHJcbiAgICAgICAgICAgICAgb3B0aW9uXHJcbiAgICAgICAgICAgIH19PC9sYWJlbD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAqbmdJZj1cInBvbGwuc3RhdHVzID09PSAnYWN0aXZlJyAmJiBpc2xldmVsID09PSAnMidcIlxyXG4gICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tZGFuZ2VyXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZWRFbmRQb2xsKHBvbGwuaWQpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgRW5kIFBvbGxcclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCIhcG9sbCB8fCBwb2xsLnN0YXR1cyAhPT0gJ2FjdGl2ZSdcIj5cclxuICAgICAgICAgIDxociAvPlxyXG4gICAgICAgICAgTm8gYWN0aXZlIHBvbGxcclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==
@@ -1,92 +0,0 @@
1
- import { Component, Input } from '@angular/core';
2
- import { CommonModule } from '@angular/common';
3
- import { FormsModule } from '@angular/forms';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "@angular/common";
6
- import * as i2 from "@angular/forms";
7
- /**
8
- * Component for configuring advanced recording options in a MediaSFU session.
9
- *
10
- * @component
11
- * @selector app-advanced-panel-component
12
- * @standalone true
13
- * @templateUrl ./advanced-panel-component.component.html
14
- * @styleUrls ['./advanced-panel-component.component.css']
15
- * @imports [CommonModule, FormsModule]
16
- *
17
- * @example
18
- * ```html
19
- * <app-advanced-panel-component [parameters]="advancedPanelOptions"></app-advanced-panel-component>
20
- * ```
21
- */
22
- export class AdvancedPanelComponent {
23
- parameters = {};
24
- selectedOrientationVideo;
25
- selectedRecordingNameTags;
26
- selectedRecordingVideoType;
27
- selectedRecordingDisplayType;
28
- showBackgroundColorModal = false;
29
- showNameTagsColorModal = false;
30
- selectedColorType = '';
31
- recordingText;
32
- customText;
33
- recordingPosition;
34
- ngOnInit() {
35
- this.selectedOrientationVideo = this.parameters?.recordingOrientationVideo ?? '';
36
- this.selectedRecordingNameTags = this.parameters?.recordingNameTags ?? false;
37
- this.selectedRecordingVideoType = this.parameters?.recordingVideoType ?? '';
38
- this.selectedRecordingDisplayType = this.parameters?.recordingDisplayType ?? 'media';
39
- this.recordingText = this.parameters?.recordingAddText ?? false;
40
- this.customText = this.parameters?.recordingCustomText ?? '';
41
- this.recordingPosition = this.parameters?.recordingCustomTextPosition ?? '';
42
- }
43
- ngOnChanges(changes) {
44
- if (changes['parameters']) {
45
- this.parameters = changes['parameters'].currentValue;
46
- this.selectedOrientationVideo = this.parameters.recordingOrientationVideo;
47
- this.selectedRecordingNameTags = this.parameters.recordingNameTags;
48
- this.selectedRecordingVideoType = this.parameters.recordingVideoType;
49
- this.selectedRecordingDisplayType = this.parameters.recordingDisplayType;
50
- this.recordingText = this.parameters.recordingAddText;
51
- this.customText = this.parameters.recordingCustomText;
52
- this.recordingPosition = this.parameters.recordingCustomTextPosition;
53
- }
54
- }
55
- validateTextInput(input) {
56
- const regex = /^[a-zA-Z0-9\s]{1,40}$/;
57
- return regex.test(input);
58
- }
59
- handleTextChange(value) {
60
- this.recordingText = value;
61
- this.parameters.updateRecordingAddText(value);
62
- }
63
- onChangeTextHandler(text) {
64
- if (text && text.length > 0 && !this.validateTextInput(text)) {
65
- return;
66
- }
67
- this.parameters.updateRecordingCustomText(text);
68
- this.customText = text;
69
- }
70
- handleColorChange(selectedColor, event) {
71
- const input = event.target;
72
- const color = input.value;
73
- if (selectedColor === 'backgroundColor') {
74
- this.parameters.updateRecordingBackgroundColor(color);
75
- }
76
- else if (selectedColor === 'customTextColor') {
77
- this.parameters.updateRecordingCustomTextColor(color);
78
- }
79
- else if (selectedColor === 'nameTagsColor') {
80
- this.parameters.updateRecordingNameTagsColor(color);
81
- }
82
- }
83
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: AdvancedPanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
84
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.8", type: AdvancedPanelComponent, isStandalone: true, selector: "app-advanced-panel-component", inputs: { parameters: "parameters" }, usesOnChanges: true, ngImport: i0, template: "<div>\r\n <!-- Video Type -->\r\n <div>\r\n <label class=\"label\">Video Type:</label>\r\n <select [(ngModel)]=\"selectedRecordingVideoType\" (change)=\"parameters.updateRecordingVideoType(selectedRecordingVideoType)\">\r\n <option value=\"fullDisplay\">Full Display (no background)</option>\r\n <option value=\"bestDisplay\">Full Video</option>\r\n <option value=\"all\">All</option>\r\n </select>\r\n </div>\r\n <hr />\r\n\r\n <!-- Display Type -->\r\n <div *ngIf=\"parameters.eventType !== 'broadcast'\">\r\n <label class=\"label\">Display Type:</label>\r\n <select [(ngModel)]=\"selectedRecordingDisplayType\" (change)=\"parameters.updateRecordingDisplayType(selectedRecordingDisplayType)\">\r\n <option value=\"video\">Only Video Participants</option>\r\n <option value=\"videoOpt\">Only Video Participants (optimized)</option>\r\n <option value=\"media\">Participants with media</option>\r\n <option value=\"all\">All Participants</option>\r\n </select>\r\n </div>\r\n <hr />\r\n\r\n <!-- Background Color -->\r\n <div>\r\n <label class=\"label\">Background Color:</label>\r\n <div class=\"color-preview\" [ngStyle]=\"{'background-color': parameters.recordingBackgroundColor}\">\r\n {{ parameters.recordingBackgroundColor }}\r\n </div>\r\n <input type=\"color\" [(ngModel)]=\"parameters.recordingBackgroundColor\" (change)=\"handleColorChange('backgroundColor', $event)\" />\r\n <span class=\"label\">Click to select color</span>\r\n </div>\r\n <hr />\r\n\r\n <!-- Add Text -->\r\n <div>\r\n <label class=\"label\">Add Text:</label>\r\n <select [(ngModel)]=\"recordingText\" (change)=\"handleTextChange(recordingText)\">\r\n <option [ngValue]=\"true\">True</option>\r\n <option [ngValue]=\"false\">False</option>\r\n </select>\r\n </div>\r\n <hr />\r\n\r\n <!-- Custom Text -->\r\n <div *ngIf=\"recordingText\">\r\n <label class=\"label\">Custom Text:</label>\r\n <input type=\"text\" [(ngModel)]=\"customText\" (input)=\"onChangeTextHandler(customText)\" />\r\n <hr />\r\n </div>\r\n\r\n <!-- Custom Text Position -->\r\n <div *ngIf=\"recordingText\">\r\n <label class=\"label\">Custom Text Position:</label>\r\n <select [(ngModel)]=\"recordingPosition\" (change)=\"parameters.updateRecordingCustomTextPosition(recordingPosition)\">\r\n <option value=\"top\">Top</option>\r\n <option value=\"middle\">Middle</option>\r\n <option value=\"bottom\">Bottom</option>\r\n </select>\r\n <hr />\r\n </div>\r\n\r\n <!-- Custom Text Color -->\r\n <div *ngIf=\"recordingText\">\r\n <label class=\"label\">Custom Text Color:</label>\r\n <div class=\"color-preview\" [ngStyle]=\"{'background-color': parameters.recordingCustomTextColor}\">\r\n {{ parameters.recordingCustomTextColor }}\r\n </div>\r\n <input type=\"color\" [(ngModel)]=\"parameters.recordingCustomTextColor\" (change)=\"handleColorChange('customTextColor', $event)\" />\r\n <span class=\"label\">Click to select color</span>\r\n <hr />\r\n </div>\r\n\r\n <!-- Add Name Tags -->\r\n <div>\r\n <label class=\"label\">Add Name Tags:</label>\r\n <select [(ngModel)]=\"selectedRecordingNameTags\" (change)=\"parameters.updateRecordingNameTags(selectedRecordingNameTags)\">\r\n <option [ngValue]=\"true\">True</option>\r\n <option [ngValue]=\"false\">False</option>\r\n </select>\r\n </div>\r\n <hr />\r\n\r\n <!-- Name Tags Color -->\r\n <div>\r\n <label class=\"label\">Name Tags Color:</label>\r\n <div class=\"color-preview\" [ngStyle]=\"{'background-color': parameters.recordingNameTagsColor}\">\r\n {{ parameters.recordingNameTagsColor }}\r\n </div>\r\n <input type=\"color\" [(ngModel)]=\"parameters.recordingNameTagsColor\" (change)=\"handleColorChange('nameTagsColor', $event)\" />\r\n <span class=\"label\">Click to select color</span>\r\n </div>\r\n <hr />\r\n\r\n <!-- Orientation (Video) -->\r\n <div>\r\n <label class=\"label\">Orientation (Video):</label>\r\n <select [(ngModel)]=\"selectedOrientationVideo\" (change)=\"parameters.updateRecordingOrientationVideo(selectedOrientationVideo)\">\r\n <option value=\"landscape\">Landscape</option>\r\n <option value=\"portrait\">Portrait</option>\r\n <option value=\"all\">All</option>\r\n </select>\r\n </div>\r\n <hr />\r\n</div>\r\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
85
- }
86
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: AdvancedPanelComponent, decorators: [{
87
- type: Component,
88
- args: [{ selector: 'app-advanced-panel-component', standalone: true, imports: [CommonModule, FormsModule], template: "<div>\r\n <!-- Video Type -->\r\n <div>\r\n <label class=\"label\">Video Type:</label>\r\n <select [(ngModel)]=\"selectedRecordingVideoType\" (change)=\"parameters.updateRecordingVideoType(selectedRecordingVideoType)\">\r\n <option value=\"fullDisplay\">Full Display (no background)</option>\r\n <option value=\"bestDisplay\">Full Video</option>\r\n <option value=\"all\">All</option>\r\n </select>\r\n </div>\r\n <hr />\r\n\r\n <!-- Display Type -->\r\n <div *ngIf=\"parameters.eventType !== 'broadcast'\">\r\n <label class=\"label\">Display Type:</label>\r\n <select [(ngModel)]=\"selectedRecordingDisplayType\" (change)=\"parameters.updateRecordingDisplayType(selectedRecordingDisplayType)\">\r\n <option value=\"video\">Only Video Participants</option>\r\n <option value=\"videoOpt\">Only Video Participants (optimized)</option>\r\n <option value=\"media\">Participants with media</option>\r\n <option value=\"all\">All Participants</option>\r\n </select>\r\n </div>\r\n <hr />\r\n\r\n <!-- Background Color -->\r\n <div>\r\n <label class=\"label\">Background Color:</label>\r\n <div class=\"color-preview\" [ngStyle]=\"{'background-color': parameters.recordingBackgroundColor}\">\r\n {{ parameters.recordingBackgroundColor }}\r\n </div>\r\n <input type=\"color\" [(ngModel)]=\"parameters.recordingBackgroundColor\" (change)=\"handleColorChange('backgroundColor', $event)\" />\r\n <span class=\"label\">Click to select color</span>\r\n </div>\r\n <hr />\r\n\r\n <!-- Add Text -->\r\n <div>\r\n <label class=\"label\">Add Text:</label>\r\n <select [(ngModel)]=\"recordingText\" (change)=\"handleTextChange(recordingText)\">\r\n <option [ngValue]=\"true\">True</option>\r\n <option [ngValue]=\"false\">False</option>\r\n </select>\r\n </div>\r\n <hr />\r\n\r\n <!-- Custom Text -->\r\n <div *ngIf=\"recordingText\">\r\n <label class=\"label\">Custom Text:</label>\r\n <input type=\"text\" [(ngModel)]=\"customText\" (input)=\"onChangeTextHandler(customText)\" />\r\n <hr />\r\n </div>\r\n\r\n <!-- Custom Text Position -->\r\n <div *ngIf=\"recordingText\">\r\n <label class=\"label\">Custom Text Position:</label>\r\n <select [(ngModel)]=\"recordingPosition\" (change)=\"parameters.updateRecordingCustomTextPosition(recordingPosition)\">\r\n <option value=\"top\">Top</option>\r\n <option value=\"middle\">Middle</option>\r\n <option value=\"bottom\">Bottom</option>\r\n </select>\r\n <hr />\r\n </div>\r\n\r\n <!-- Custom Text Color -->\r\n <div *ngIf=\"recordingText\">\r\n <label class=\"label\">Custom Text Color:</label>\r\n <div class=\"color-preview\" [ngStyle]=\"{'background-color': parameters.recordingCustomTextColor}\">\r\n {{ parameters.recordingCustomTextColor }}\r\n </div>\r\n <input type=\"color\" [(ngModel)]=\"parameters.recordingCustomTextColor\" (change)=\"handleColorChange('customTextColor', $event)\" />\r\n <span class=\"label\">Click to select color</span>\r\n <hr />\r\n </div>\r\n\r\n <!-- Add Name Tags -->\r\n <div>\r\n <label class=\"label\">Add Name Tags:</label>\r\n <select [(ngModel)]=\"selectedRecordingNameTags\" (change)=\"parameters.updateRecordingNameTags(selectedRecordingNameTags)\">\r\n <option [ngValue]=\"true\">True</option>\r\n <option [ngValue]=\"false\">False</option>\r\n </select>\r\n </div>\r\n <hr />\r\n\r\n <!-- Name Tags Color -->\r\n <div>\r\n <label class=\"label\">Name Tags Color:</label>\r\n <div class=\"color-preview\" [ngStyle]=\"{'background-color': parameters.recordingNameTagsColor}\">\r\n {{ parameters.recordingNameTagsColor }}\r\n </div>\r\n <input type=\"color\" [(ngModel)]=\"parameters.recordingNameTagsColor\" (change)=\"handleColorChange('nameTagsColor', $event)\" />\r\n <span class=\"label\">Click to select color</span>\r\n </div>\r\n <hr />\r\n\r\n <!-- Orientation (Video) -->\r\n <div>\r\n <label class=\"label\">Orientation (Video):</label>\r\n <select [(ngModel)]=\"selectedOrientationVideo\" (change)=\"parameters.updateRecordingOrientationVideo(selectedOrientationVideo)\">\r\n <option value=\"landscape\">Landscape</option>\r\n <option value=\"portrait\">Portrait</option>\r\n <option value=\"all\">All</option>\r\n </select>\r\n </div>\r\n <hr />\r\n</div>\r\n" }]
89
- }], propDecorators: { parameters: [{
90
- type: Input
91
- }] } });
92
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2YW5jZWQtcGFuZWwtY29tcG9uZW50cy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tZWRpYXNmdS1hbmd1bGFyL3NyYy9saWIvY29tcG9uZW50cy9yZWNvcmRpbmctY29tcG9uZW50cy9hZHZhbmNlZC1wYW5lbC1jb21wb25lbnQvYWR2YW5jZWQtcGFuZWwtY29tcG9uZW50cy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tZWRpYXNmdS1hbmd1bGFyL3NyYy9saWIvY29tcG9uZW50cy9yZWNvcmRpbmctY29tcG9uZW50cy9hZHZhbmNlZC1wYW5lbC1jb21wb25lbnQvYWR2YW5jZWQtcGFuZWwtY29tcG9uZW50LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFvQyxNQUFNLGVBQWUsQ0FBQztBQUNuRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7O0FBNkI3Qzs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQVVILE1BQU0sT0FBTyxzQkFBc0I7SUFDeEIsVUFBVSxHQUE0QixFQUE2QixDQUFDO0lBRTdFLHdCQUF3QixDQUFVO0lBQ2xDLHlCQUF5QixDQUFXO0lBQ3BDLDBCQUEwQixDQUFVO0lBQ3BDLDRCQUE0QixDQUE2QjtJQUN6RCx3QkFBd0IsR0FBRyxLQUFLLENBQUM7SUFDakMsc0JBQXNCLEdBQUcsS0FBSyxDQUFDO0lBQy9CLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztJQUN2QixhQUFhLENBQVc7SUFDeEIsVUFBVSxDQUFVO0lBQ3BCLGlCQUFpQixDQUFVO0lBRTNCLFFBQVE7UUFDTixJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSx5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O2FBQU0sSUFBSSxhQUFhLEtBQUssZUFBZSxFQUFFLENBQUM7WUFDN0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyw0QkFBNEIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0RCxDQUFDO0lBQ0gsQ0FBQzt1R0FqRVUsc0JBQXNCOzJGQUF0QixzQkFBc0IsbUpDdkRuQyxreklBMEdBLHlERHJEWSxZQUFZLHVOQUFFLFdBQVc7OzJGQUV4QixzQkFBc0I7a0JBUGxDLFNBQVM7K0JBQ0UsOEJBQThCLGNBQzVCLElBQUksV0FHUCxDQUFDLFlBQVksRUFBRSxXQUFXLENBQUM7OEJBRzNCLFVBQVU7c0JBQWxCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRXZlbnRUeXBlIH0gZnJvbSAnLi4vLi4vLi4vQHR5cGVzL3R5cGVzJztcblxuZXhwb3J0IGludGVyZmFjZSBBZHZhbmNlZFBhbmVsUGFyYW1ldGVycyB7XG4gIHJlY29yZGluZ09yaWVudGF0aW9uVmlkZW86IHN0cmluZztcbiAgcmVjb3JkaW5nTmFtZVRhZ3M6IGJvb2xlYW47XG4gIHJlY29yZGluZ1ZpZGVvVHlwZTogc3RyaW5nO1xuICByZWNvcmRpbmdEaXNwbGF5VHlwZTogJ3ZpZGVvJyB8ICdtZWRpYScgfCAnYWxsJztcbiAgcmVjb3JkaW5nQWRkVGV4dDogYm9vbGVhbjtcbiAgcmVjb3JkaW5nQ3VzdG9tVGV4dDogc3RyaW5nO1xuICByZWNvcmRpbmdDdXN0b21UZXh0UG9zaXRpb246IHN0cmluZztcbiAgcmVjb3JkaW5nQmFja2dyb3VuZENvbG9yOiBzdHJpbmc7XG4gIHJlY29yZGluZ0N1c3RvbVRleHRDb2xvcjogc3RyaW5nO1xuICByZWNvcmRpbmdOYW1lVGFnc0NvbG9yOiBzdHJpbmc7XG4gIHVwZGF0ZVJlY29yZGluZ09yaWVudGF0aW9uVmlkZW86IChvcmllbnRhdGlvbjogc3RyaW5nKSA9PiB2b2lkO1xuICB1cGRhdGVSZWNvcmRpbmdOYW1lVGFnczogKG5hbWVUYWdzOiBib29sZWFuKSA9PiB2b2lkO1xuICB1cGRhdGVSZWNvcmRpbmdWaWRlb1R5cGU6ICh2aWRlb1R5cGU6IHN0cmluZykgPT4gdm9pZDtcbiAgdXBkYXRlUmVjb3JkaW5nRGlzcGxheVR5cGU6IChkaXNwbGF5VHlwZTogJ3ZpZGVvJyB8ICdtZWRpYScgfCAnYWxsJykgPT4gdm9pZDtcbiAgdXBkYXRlUmVjb3JkaW5nQWRkVGV4dDogKGFkZFRleHQ6IGJvb2xlYW4pID0+IHZvaWQ7XG4gIHVwZGF0ZVJlY29yZGluZ0N1c3RvbVRleHQ6IChjdXN0b21UZXh0OiBzdHJpbmcpID0+IHZvaWQ7XG4gIHVwZGF0ZVJlY29yZGluZ0N1c3RvbVRleHRQb3NpdGlvbjogKHBvc2l0aW9uOiBzdHJpbmcpID0+IHZvaWQ7XG4gIHVwZGF0ZVJlY29yZGluZ0JhY2tncm91bmRDb2xvcjogKGNvbG9yOiBzdHJpbmcpID0+IHZvaWQ7XG4gIHVwZGF0ZVJlY29yZGluZ0N1c3RvbVRleHRDb2xvcjogKGNvbG9yOiBzdHJpbmcpID0+IHZvaWQ7XG4gIHVwZGF0ZVJlY29yZGluZ05hbWVUYWdzQ29sb3I6IChjb2xvcjogc3RyaW5nKSA9PiB2b2lkO1xuICBldmVudFR5cGU6IEV2ZW50VHlwZTtcbn1cblxuZXhwb3J0IHR5cGUgQWR2YW5jZWRQYW5lbFR5cGUgPSAob3B0aW9uczogQWR2YW5jZWRQYW5lbFBhcmFtZXRlcnMpID0+IEhUTUxFbGVtZW50O1xuXG4vKipcbiAqIENvbXBvbmVudCBmb3IgY29uZmlndXJpbmcgYWR2YW5jZWQgcmVjb3JkaW5nIG9wdGlvbnMgaW4gYSBNZWRpYVNGVSBzZXNzaW9uLlxuICpcbiAqIEBjb21wb25lbnRcbiAqIEBzZWxlY3RvciBhcHAtYWR2YW5jZWQtcGFuZWwtY29tcG9uZW50XG4gKiBAc3RhbmRhbG9uZSB0cnVlXG4gKiBAdGVtcGxhdGVVcmwgLi9hZHZhbmNlZC1wYW5lbC1jb21wb25lbnQuY29tcG9uZW50Lmh0bWxcbiAqIEBzdHlsZVVybHMgWycuL2FkdmFuY2VkLXBhbmVsLWNvbXBvbmVudC5jb21wb25lbnQuY3NzJ11cbiAqIEBpbXBvcnRzIFtDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlXVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBodG1sXG4gKiA8YXBwLWFkdmFuY2VkLXBhbmVsLWNvbXBvbmVudCBbcGFyYW1ldGVyc109XCJhZHZhbmNlZFBhbmVsT3B0aW9uc1wiPjwvYXBwLWFkdmFuY2VkLXBhbmVsLWNvbXBvbmVudD5cbiAqIGBgYFxuICovXG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWFkdmFuY2VkLXBhbmVsLWNvbXBvbmVudCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHRlbXBsYXRlVXJsOiAnLi9hZHZhbmNlZC1wYW5lbC1jb21wb25lbnQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9hZHZhbmNlZC1wYW5lbC1jb21wb25lbnQuY29tcG9uZW50LmNzcyddLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZV0sXG59KVxuZXhwb3J0IGNsYXNzIEFkdmFuY2VkUGFuZWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIHBhcmFtZXRlcnM6IEFkdmFuY2VkUGFuZWxQYXJhbWV0ZXJzID0ge30gYXMgQWR2YW5jZWRQYW5lbFBhcmFtZXRlcnM7XG5cbiAgc2VsZWN0ZWRPcmllbnRhdGlvblZpZGVvITogc3RyaW5nO1xuICBzZWxlY3RlZFJlY29yZGluZ05hbWVUYWdzITogYm9vbGVhbjtcbiAgc2VsZWN0ZWRSZWNvcmRpbmdWaWRlb1R5cGUhOiBzdHJpbmc7XG4gIHNlbGVjdGVkUmVjb3JkaW5nRGlzcGxheVR5cGUhOiAndmlkZW8nIHwgJ21lZGlhJyB8ICdhbGwnO1xuICBzaG93QmFja2dyb3VuZENvbG9yTW9kYWwgPSBmYWxzZTtcbiAgc2hvd05hbWVUYWdzQ29sb3JNb2RhbCA9IGZhbHNlO1xuICBzZWxlY3RlZENvbG9yVHlwZSA9ICcnO1xuICByZWNvcmRpbmdUZXh0ITogYm9vbGVhbjtcbiAgY3VzdG9tVGV4dCE6IHN0cmluZztcbiAgcmVjb3JkaW5nUG9zaXRpb24hOiBzdHJpbmc7XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5zZWxlY3RlZE9yaWVudGF0aW9uVmlkZW8gPSB0aGlzLnBhcmFtZXRlcnM/LnJlY29yZGluZ09yaWVudGF0aW9uVmlkZW8gPz8gJyc7XG4gICAgdGhpcy5zZWxlY3RlZFJlY29yZGluZ05hbWVUYWdzID0gdGhpcy5wYXJhbWV0ZXJzPy5yZWNvcmRpbmdOYW1lVGFncyA/PyBmYWxzZTtcbiAgICB0aGlzLnNlbGVjdGVkUmVjb3JkaW5nVmlkZW9UeXBlID0gdGhpcy5wYXJhbWV0ZXJzPy5yZWNvcmRpbmdWaWRlb1R5cGUgPz8gJyc7XG4gICAgdGhpcy5zZWxlY3RlZFJlY29yZGluZ0Rpc3BsYXlUeXBlID0gdGhpcy5wYXJhbWV0ZXJzPy5yZWNvcmRpbmdEaXNwbGF5VHlwZSA/PyAnbWVkaWEnO1xuICAgIHRoaXMucmVjb3JkaW5nVGV4dCA9IHRoaXMucGFyYW1ldGVycz8ucmVjb3JkaW5nQWRkVGV4dCA/PyBmYWxzZTtcbiAgICB0aGlzLmN1c3RvbVRleHQgPSB0aGlzLnBhcmFtZXRlcnM/LnJlY29yZGluZ0N1c3RvbVRleHQgPz8gJyc7XG4gICAgdGhpcy5yZWNvcmRpbmdQb3NpdGlvbiA9IHRoaXMucGFyYW1ldGVycz8ucmVjb3JkaW5nQ3VzdG9tVGV4dFBvc2l0aW9uID8/ICcnO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzWydwYXJhbWV0ZXJzJ10pIHtcbiAgICAgIHRoaXMucGFyYW1ldGVycyA9IGNoYW5nZXNbJ3BhcmFtZXRlcnMnXS5jdXJyZW50VmFsdWU7XG4gICAgICB0aGlzLnNlbGVjdGVkT3JpZW50YXRpb25WaWRlbyA9IHRoaXMucGFyYW1ldGVycy5yZWNvcmRpbmdPcmllbnRhdGlvblZpZGVvO1xuICAgICAgdGhpcy5zZWxlY3RlZFJlY29yZGluZ05hbWVUYWdzID0gdGhpcy5wYXJhbWV0ZXJzLnJlY29yZGluZ05hbWVUYWdzO1xuICAgICAgdGhpcy5zZWxlY3RlZFJlY29yZGluZ1ZpZGVvVHlwZSA9IHRoaXMucGFyYW1ldGVycy5yZWNvcmRpbmdWaWRlb1R5cGU7XG4gICAgICB0aGlzLnNlbGVjdGVkUmVjb3JkaW5nRGlzcGxheVR5cGUgPSB0aGlzLnBhcmFtZXRlcnMucmVjb3JkaW5nRGlzcGxheVR5cGU7XG4gICAgICB0aGlzLnJlY29yZGluZ1RleHQgPSB0aGlzLnBhcmFtZXRlcnMucmVjb3JkaW5nQWRkVGV4dDtcbiAgICAgIHRoaXMuY3VzdG9tVGV4dCA9IHRoaXMucGFyYW1ldGVycy5yZWNvcmRpbmdDdXN0b21UZXh0O1xuICAgICAgdGhpcy5yZWNvcmRpbmdQb3NpdGlvbiA9IHRoaXMucGFyYW1ldGVycy5yZWNvcmRpbmdDdXN0b21UZXh0UG9zaXRpb247XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGVUZXh0SW5wdXQoaW5wdXQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHJlZ2V4ID0gL15bYS16QS1aMC05XFxzXXsxLDQwfSQvO1xuICAgIHJldHVybiByZWdleC50ZXN0KGlucHV0KTtcbiAgfVxuXG4gIGhhbmRsZVRleHRDaGFuZ2UodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnJlY29yZGluZ1RleHQgPSB2YWx1ZTtcbiAgICB0aGlzLnBhcmFtZXRlcnMudXBkYXRlUmVjb3JkaW5nQWRkVGV4dCh2YWx1ZSk7XG4gIH1cblxuICBvbkNoYW5nZVRleHRIYW5kbGVyKHRleHQ6IHN0cmluZykge1xuICAgIGlmICh0ZXh0ICYmIHRleHQubGVuZ3RoID4gMCAmJiAhdGhpcy52YWxpZGF0ZVRleHRJbnB1dCh0ZXh0KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnBhcmFtZXRlcnMudXBkYXRlUmVjb3JkaW5nQ3VzdG9tVGV4dCh0ZXh0KTtcbiAgICB0aGlzLmN1c3RvbVRleHQgPSB0ZXh0O1xuICB9XG5cbiAgaGFuZGxlQ29sb3JDaGFuZ2Uoc2VsZWN0ZWRDb2xvcjogc3RyaW5nLCBldmVudDogRXZlbnQpIHtcbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIGNvbnN0IGNvbG9yID0gaW5wdXQudmFsdWU7XG4gICAgaWYgKHNlbGVjdGVkQ29sb3IgPT09ICdiYWNrZ3JvdW5kQ29sb3InKSB7XG4gICAgICB0aGlzLnBhcmFtZXRlcnMudXBkYXRlUmVjb3JkaW5nQmFja2dyb3VuZENvbG9yKGNvbG9yKTtcbiAgICB9IGVsc2UgaWYgKHNlbGVjdGVkQ29sb3IgPT09ICdjdXN0b21UZXh0Q29sb3InKSB7XG4gICAgICB0aGlzLnBhcmFtZXRlcnMudXBkYXRlUmVjb3JkaW5nQ3VzdG9tVGV4dENvbG9yKGNvbG9yKTtcbiAgICB9IGVsc2UgaWYgKHNlbGVjdGVkQ29sb3IgPT09ICduYW1lVGFnc0NvbG9yJykge1xuICAgICAgdGhpcy5wYXJhbWV0ZXJzLnVwZGF0ZVJlY29yZGluZ05hbWVUYWdzQ29sb3IoY29sb3IpO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdj5cclxuICA8IS0tIFZpZGVvIFR5cGUgLS0+XHJcbiAgPGRpdj5cclxuICAgIDxsYWJlbCBjbGFzcz1cImxhYmVsXCI+VmlkZW8gVHlwZTo8L2xhYmVsPlxyXG4gICAgPHNlbGVjdCBbKG5nTW9kZWwpXT1cInNlbGVjdGVkUmVjb3JkaW5nVmlkZW9UeXBlXCIgKGNoYW5nZSk9XCJwYXJhbWV0ZXJzLnVwZGF0ZVJlY29yZGluZ1ZpZGVvVHlwZShzZWxlY3RlZFJlY29yZGluZ1ZpZGVvVHlwZSlcIj5cclxuICAgICAgPG9wdGlvbiB2YWx1ZT1cImZ1bGxEaXNwbGF5XCI+RnVsbCBEaXNwbGF5IChubyBiYWNrZ3JvdW5kKTwvb3B0aW9uPlxyXG4gICAgICA8b3B0aW9uIHZhbHVlPVwiYmVzdERpc3BsYXlcIj5GdWxsIFZpZGVvPC9vcHRpb24+XHJcbiAgICAgIDxvcHRpb24gdmFsdWU9XCJhbGxcIj5BbGw8L29wdGlvbj5cclxuICAgIDwvc2VsZWN0PlxyXG4gIDwvZGl2PlxyXG4gIDxociAvPlxyXG5cclxuICA8IS0tIERpc3BsYXkgVHlwZSAtLT5cclxuICA8ZGl2ICpuZ0lmPVwicGFyYW1ldGVycy5ldmVudFR5cGUgIT09ICdicm9hZGNhc3QnXCI+XHJcbiAgICA8bGFiZWwgY2xhc3M9XCJsYWJlbFwiPkRpc3BsYXkgVHlwZTo8L2xhYmVsPlxyXG4gICAgPHNlbGVjdCBbKG5nTW9kZWwpXT1cInNlbGVjdGVkUmVjb3JkaW5nRGlzcGxheVR5cGVcIiAoY2hhbmdlKT1cInBhcmFtZXRlcnMudXBkYXRlUmVjb3JkaW5nRGlzcGxheVR5cGUoc2VsZWN0ZWRSZWNvcmRpbmdEaXNwbGF5VHlwZSlcIj5cclxuICAgICAgPG9wdGlvbiB2YWx1ZT1cInZpZGVvXCI+T25seSBWaWRlbyBQYXJ0aWNpcGFudHM8L29wdGlvbj5cclxuICAgICAgPG9wdGlvbiB2YWx1ZT1cInZpZGVvT3B0XCI+T25seSBWaWRlbyBQYXJ0aWNpcGFudHMgKG9wdGltaXplZCk8L29wdGlvbj5cclxuICAgICAgPG9wdGlvbiB2YWx1ZT1cIm1lZGlhXCI+UGFydGljaXBhbnRzIHdpdGggbWVkaWE8L29wdGlvbj5cclxuICAgICAgPG9wdGlvbiB2YWx1ZT1cImFsbFwiPkFsbCBQYXJ0aWNpcGFudHM8L29wdGlvbj5cclxuICAgIDwvc2VsZWN0PlxyXG4gIDwvZGl2PlxyXG4gIDxociAvPlxyXG5cclxuICA8IS0tIEJhY2tncm91bmQgQ29sb3IgLS0+XHJcbiAgPGRpdj5cclxuICAgIDxsYWJlbCBjbGFzcz1cImxhYmVsXCI+QmFja2dyb3VuZCBDb2xvcjo8L2xhYmVsPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbG9yLXByZXZpZXdcIiBbbmdTdHlsZV09XCJ7J2JhY2tncm91bmQtY29sb3InOiBwYXJhbWV0ZXJzLnJlY29yZGluZ0JhY2tncm91bmRDb2xvcn1cIj5cclxuICAgICAge3sgcGFyYW1ldGVycy5yZWNvcmRpbmdCYWNrZ3JvdW5kQ29sb3IgfX1cclxuICAgIDwvZGl2PlxyXG4gICAgPGlucHV0IHR5cGU9XCJjb2xvclwiIFsobmdNb2RlbCldPVwicGFyYW1ldGVycy5yZWNvcmRpbmdCYWNrZ3JvdW5kQ29sb3JcIiAoY2hhbmdlKT1cImhhbmRsZUNvbG9yQ2hhbmdlKCdiYWNrZ3JvdW5kQ29sb3InLCAkZXZlbnQpXCIgLz5cclxuICAgIDxzcGFuIGNsYXNzPVwibGFiZWxcIj5DbGljayB0byBzZWxlY3QgY29sb3I8L3NwYW4+XHJcbiAgPC9kaXY+XHJcbiAgPGhyIC8+XHJcblxyXG4gIDwhLS0gQWRkIFRleHQgLS0+XHJcbiAgPGRpdj5cclxuICAgIDxsYWJlbCBjbGFzcz1cImxhYmVsXCI+QWRkIFRleHQ6PC9sYWJlbD5cclxuICAgIDxzZWxlY3QgWyhuZ01vZGVsKV09XCJyZWNvcmRpbmdUZXh0XCIgKGNoYW5nZSk9XCJoYW5kbGVUZXh0Q2hhbmdlKHJlY29yZGluZ1RleHQpXCI+XHJcbiAgICAgIDxvcHRpb24gW25nVmFsdWVdPVwidHJ1ZVwiPlRydWU8L29wdGlvbj5cclxuICAgICAgPG9wdGlvbiBbbmdWYWx1ZV09XCJmYWxzZVwiPkZhbHNlPC9vcHRpb24+XHJcbiAgICA8L3NlbGVjdD5cclxuICA8L2Rpdj5cclxuICA8aHIgLz5cclxuXHJcbiAgPCEtLSBDdXN0b20gVGV4dCAtLT5cclxuICA8ZGl2ICpuZ0lmPVwicmVjb3JkaW5nVGV4dFwiPlxyXG4gICAgPGxhYmVsIGNsYXNzPVwibGFiZWxcIj5DdXN0b20gVGV4dDo8L2xhYmVsPlxyXG4gICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJjdXN0b21UZXh0XCIgKGlucHV0KT1cIm9uQ2hhbmdlVGV4dEhhbmRsZXIoY3VzdG9tVGV4dClcIiAvPlxyXG4gICAgPGhyIC8+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDwhLS0gQ3VzdG9tIFRleHQgUG9zaXRpb24gLS0+XHJcbiAgPGRpdiAqbmdJZj1cInJlY29yZGluZ1RleHRcIj5cclxuICAgIDxsYWJlbCBjbGFzcz1cImxhYmVsXCI+Q3VzdG9tIFRleHQgUG9zaXRpb246PC9sYWJlbD5cclxuICAgIDxzZWxlY3QgWyhuZ01vZGVsKV09XCJyZWNvcmRpbmdQb3NpdGlvblwiIChjaGFuZ2UpPVwicGFyYW1ldGVycy51cGRhdGVSZWNvcmRpbmdDdXN0b21UZXh0UG9zaXRpb24ocmVjb3JkaW5nUG9zaXRpb24pXCI+XHJcbiAgICAgIDxvcHRpb24gdmFsdWU9XCJ0b3BcIj5Ub3A8L29wdGlvbj5cclxuICAgICAgPG9wdGlvbiB2YWx1ZT1cIm1pZGRsZVwiPk1pZGRsZTwvb3B0aW9uPlxyXG4gICAgICA8b3B0aW9uIHZhbHVlPVwiYm90dG9tXCI+Qm90dG9tPC9vcHRpb24+XHJcbiAgICA8L3NlbGVjdD5cclxuICAgIDxociAvPlxyXG4gIDwvZGl2PlxyXG5cclxuICA8IS0tIEN1c3RvbSBUZXh0IENvbG9yIC0tPlxyXG4gIDxkaXYgKm5nSWY9XCJyZWNvcmRpbmdUZXh0XCI+XHJcbiAgICA8bGFiZWwgY2xhc3M9XCJsYWJlbFwiPkN1c3RvbSBUZXh0IENvbG9yOjwvbGFiZWw+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sb3ItcHJldmlld1wiIFtuZ1N0eWxlXT1cInsnYmFja2dyb3VuZC1jb2xvcic6IHBhcmFtZXRlcnMucmVjb3JkaW5nQ3VzdG9tVGV4dENvbG9yfVwiPlxyXG4gICAgICB7eyBwYXJhbWV0ZXJzLnJlY29yZGluZ0N1c3RvbVRleHRDb2xvciB9fVxyXG4gICAgPC9kaXY+XHJcbiAgICA8aW5wdXQgdHlwZT1cImNvbG9yXCIgWyhuZ01vZGVsKV09XCJwYXJhbWV0ZXJzLnJlY29yZGluZ0N1c3RvbVRleHRDb2xvclwiIChjaGFuZ2UpPVwiaGFuZGxlQ29sb3JDaGFuZ2UoJ2N1c3RvbVRleHRDb2xvcicsICRldmVudClcIiAvPlxyXG4gICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPkNsaWNrIHRvIHNlbGVjdCBjb2xvcjwvc3Bhbj5cclxuICAgIDxociAvPlxyXG4gIDwvZGl2PlxyXG5cclxuICA8IS0tIEFkZCBOYW1lIFRhZ3MgLS0+XHJcbiAgPGRpdj5cclxuICAgIDxsYWJlbCBjbGFzcz1cImxhYmVsXCI+QWRkIE5hbWUgVGFnczo8L2xhYmVsPlxyXG4gICAgPHNlbGVjdCBbKG5nTW9kZWwpXT1cInNlbGVjdGVkUmVjb3JkaW5nTmFtZVRhZ3NcIiAoY2hhbmdlKT1cInBhcmFtZXRlcnMudXBkYXRlUmVjb3JkaW5nTmFtZVRhZ3Moc2VsZWN0ZWRSZWNvcmRpbmdOYW1lVGFncylcIj5cclxuICAgICAgPG9wdGlvbiBbbmdWYWx1ZV09XCJ0cnVlXCI+VHJ1ZTwvb3B0aW9uPlxyXG4gICAgICA8b3B0aW9uIFtuZ1ZhbHVlXT1cImZhbHNlXCI+RmFsc2U8L29wdGlvbj5cclxuICAgIDwvc2VsZWN0PlxyXG4gIDwvZGl2PlxyXG4gIDxociAvPlxyXG5cclxuICA8IS0tIE5hbWUgVGFncyBDb2xvciAtLT5cclxuICA8ZGl2PlxyXG4gICAgPGxhYmVsIGNsYXNzPVwibGFiZWxcIj5OYW1lIFRhZ3MgQ29sb3I6PC9sYWJlbD5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2xvci1wcmV2aWV3XCIgW25nU3R5bGVdPVwieydiYWNrZ3JvdW5kLWNvbG9yJzogcGFyYW1ldGVycy5yZWNvcmRpbmdOYW1lVGFnc0NvbG9yfVwiPlxyXG4gICAgICB7eyBwYXJhbWV0ZXJzLnJlY29yZGluZ05hbWVUYWdzQ29sb3IgfX1cclxuICAgIDwvZGl2PlxyXG4gICAgPGlucHV0IHR5cGU9XCJjb2xvclwiIFsobmdNb2RlbCldPVwicGFyYW1ldGVycy5yZWNvcmRpbmdOYW1lVGFnc0NvbG9yXCIgKGNoYW5nZSk9XCJoYW5kbGVDb2xvckNoYW5nZSgnbmFtZVRhZ3NDb2xvcicsICRldmVudClcIiAvPlxyXG4gICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPkNsaWNrIHRvIHNlbGVjdCBjb2xvcjwvc3Bhbj5cclxuICA8L2Rpdj5cclxuICA8aHIgLz5cclxuXHJcbiAgPCEtLSBPcmllbnRhdGlvbiAoVmlkZW8pIC0tPlxyXG4gIDxkaXY+XHJcbiAgICA8bGFiZWwgY2xhc3M9XCJsYWJlbFwiPk9yaWVudGF0aW9uIChWaWRlbyk6PC9sYWJlbD5cclxuICAgIDxzZWxlY3QgWyhuZ01vZGVsKV09XCJzZWxlY3RlZE9yaWVudGF0aW9uVmlkZW9cIiAoY2hhbmdlKT1cInBhcmFtZXRlcnMudXBkYXRlUmVjb3JkaW5nT3JpZW50YXRpb25WaWRlbyhzZWxlY3RlZE9yaWVudGF0aW9uVmlkZW8pXCI+XHJcbiAgICAgIDxvcHRpb24gdmFsdWU9XCJsYW5kc2NhcGVcIj5MYW5kc2NhcGU8L29wdGlvbj5cclxuICAgICAgPG9wdGlvbiB2YWx1ZT1cInBvcnRyYWl0XCI+UG9ydHJhaXQ8L29wdGlvbj5cclxuICAgICAgPG9wdGlvbiB2YWx1ZT1cImFsbFwiPkFsbDwvb3B0aW9uPlxyXG4gICAgPC9zZWxlY3Q+XHJcbiAgPC9kaXY+XHJcbiAgPGhyIC8+XHJcbjwvZGl2PlxyXG4iXX0=
@@ -1,133 +0,0 @@
1
- import { Component, Input } from '@angular/core';
2
- import { CommonModule } from '@angular/common';
3
- import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
4
- import { faTimes, faCheck, faPlay } from '@fortawesome/free-solid-svg-icons';
5
- import { StandardPanelComponent } from '../standard-panel-component/standard-panel-component.component';
6
- import { AdvancedPanelComponent } from '../advanced-panel-component/advanced-panel-components.component';
7
- import * as i0 from "@angular/core";
8
- import * as i1 from "@angular/common";
9
- import * as i2 from "@fortawesome/angular-fontawesome";
10
- /**
11
- * Component representing a recording modal.
12
- *
13
- * @selector app-recording-modal
14
- * @standalone true
15
- * @imports CommonModule, FontAwesomeModule, StandardPanelComponent, AdvancedPanelComponent
16
- * @templateUrl ./recording-modal.component.html
17
- * @styleUrls ./recording-modal.component.css
18
- *
19
- * @class RecordingModal
20
- * @implements OnChanges
21
- *
22
- * @property {boolean} isRecordingModalVisible - Determines if the recording modal is visible.
23
- * @property {() => void} onClose - Callback function to close the modal.
24
- * @property {string} backgroundColor - Background color of the modal.
25
- * @property {string} position - Position of the modal on the screen.
26
- * @property {(options: ConfirmRecordingOptions) => void} confirmRecording - Callback function to confirm recording.
27
- * @property {(options: StartRecordingOptions) => void} startRecording - Callback function to start recording.
28
- * @property {RecordingModalParameters} parameters - Parameters for the recording modal.
29
- *
30
- * @property {IconDefinition} faTimes - FontAwesome icon for times (close).
31
- * @property {IconDefinition} faCheck - FontAwesome icon for check (confirm).
32
- * @property {IconDefinition} faPlay - FontAwesome icon for play (start).
33
- *
34
- * @method modalContainerStyle - Returns the style object for the modal container.
35
- * @method modalContentStyle - Returns the style object for the modal content.
36
- * @method ngOnChanges - Lifecycle hook that is called when any data-bound property of a directive changes.
37
- * @method confirm - Calls the confirmRecording callback with the current parameters.
38
- * @method start - Calls the startRecording callback with the current parameters.
39
- * @example
40
- * ```html
41
- * <app-recording-modal
42
- * [isRecordingModalVisible]="true"
43
- * [onClose]="closeRecordingModal"
44
- * [backgroundColor]="'#83c0e9'"
45
- * [position]="'bottomRight'"
46
- * [confirmRecording]="confirmRecording"
47
- * [startRecording]="startRecording"
48
- * [parameters]="recordingModalParams"
49
- * ></app-recording-modal>
50
- * ```
51
- */
52
- export class RecordingModal {
53
- isRecordingModalVisible = false;
54
- onClose;
55
- backgroundColor = '#83c0e9';
56
- position = 'bottomRight';
57
- confirmRecording;
58
- startRecording;
59
- parameters = {};
60
- faTimes = faTimes;
61
- faCheck = faCheck;
62
- faPlay = faPlay;
63
- get modalContainerStyle() {
64
- return {
65
- position: 'fixed',
66
- top: 0,
67
- left: 0,
68
- width: '100%',
69
- height: '100%',
70
- backgroundColor: 'rgba(0, 0, 0, 0.5)',
71
- display: this.isRecordingModalVisible ? 'block' : 'none',
72
- zIndex: 999,
73
- };
74
- }
75
- get modalContentStyle() {
76
- const screenWidth = window.innerWidth;
77
- let modalWidth = 0.8 * screenWidth;
78
- if (modalWidth > 350) {
79
- modalWidth = 350;
80
- }
81
- return {
82
- position: 'fixed',
83
- backgroundColor: this.backgroundColor,
84
- borderRadius: '10px',
85
- padding: '10px',
86
- width: `${modalWidth}px`,
87
- maxHeight: '85%',
88
- overflowY: 'auto',
89
- top: this.position.includes('top') ? '10px' : 'auto',
90
- bottom: this.position.includes('bottom') ? '10px' : 'auto',
91
- left: this.position.includes('Left') ? '10px' : 'auto',
92
- right: this.position.includes('Right') ? '10px' : 'auto',
93
- };
94
- }
95
- ngOnChanges(changes) {
96
- if (changes['isRecordingModalVisible']) {
97
- if (this.parameters) {
98
- this.parameters = this.parameters.getUpdatedAllParams();
99
- }
100
- }
101
- }
102
- confirm() {
103
- this.confirmRecording({
104
- parameters: { ...this.parameters },
105
- });
106
- }
107
- start() {
108
- this.startRecording({
109
- parameters: { ...this.parameters },
110
- });
111
- }
112
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: RecordingModal, deps: [], target: i0.ɵɵFactoryTarget.Component });
113
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.8", type: RecordingModal, isStandalone: true, selector: "app-recording-modal", inputs: { isRecordingModalVisible: "isRecordingModalVisible", onClose: "onClose", backgroundColor: "backgroundColor", position: "position", confirmRecording: "confirmRecording", startRecording: "startRecording", parameters: "parameters" }, usesOnChanges: true, ngImport: i0, template: "<div [ngStyle]=\"modalContainerStyle\">\r\n <div [ngStyle]=\"modalContentStyle\">\r\n <div style=\"display: flex; flex-direction: column;\">\r\n <div style=\"display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px;\">\r\n <h2 style=\"font-size: x-large; font-weight: bold; color: black;\">\r\n Recording Settings\r\n </h2>\r\n <button (click)=\"onClose()\" style=\"border: none; background: none; cursor: pointer;\">\r\n <fa-icon [icon]=\"faTimes\" size=\"xl\" style=\"font-size: 20px; color: black;\"></fa-icon>\r\n </button>\r\n </div>\r\n <hr style=\"height: 1px; background-color: black; margin: 5px 0;\" />\r\n <div style=\"flex: 1;\">\r\n <div style=\"overflow-y: auto; max-height: calc(100% - 120px); padding: 0;\">\r\n <div style=\"margin: 0; padding: 0;\">\r\n <app-standard-panel-component [parameters]=\"parameters\"></app-standard-panel-component>\r\n <app-advanced-panel-component [parameters]=\"parameters\"></app-advanced-panel-component>\r\n </div>\r\n </div>\r\n <div style=\"height: 1px; background-color: white; \"></div>\r\n <div style=\"display: flex; justify-content: space-between; margin-top: 20px;\">\r\n <button\r\n (click)=\"confirm()\"\r\n style=\"flex: 1; padding: 5px; border-radius: 5px; justify-content: center; align-items: center; margin: 0 10px; background: #4CAF50; cursor: pointer;\">\r\n <span style=\"color: black; font-size: 14px;\">Confirm</span>\r\n </button>\r\n <button *ngIf=\"!parameters.recordPaused\"\r\n (click)=\"start()\"\r\n style=\"flex: 1; padding: 5px; border-radius: 5px; justify-content: center; align-items: center; margin: 0 10px; background: #f44336; cursor: pointer;\">\r\n <span style=\"color: black; font-size: 14px;\">Start <fa-icon [icon]=\"faPlay\"></fa-icon></span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FontAwesomeModule }, { kind: "component", type: i2.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"] }, { kind: "component", type: StandardPanelComponent, selector: "app-standard-panel-component", inputs: ["parameters"] }, { kind: "component", type: AdvancedPanelComponent, selector: "app-advanced-panel-component", inputs: ["parameters"] }] });
114
- }
115
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: RecordingModal, decorators: [{
116
- type: Component,
117
- args: [{ selector: 'app-recording-modal', standalone: true, imports: [CommonModule, FontAwesomeModule, StandardPanelComponent, AdvancedPanelComponent], template: "<div [ngStyle]=\"modalContainerStyle\">\r\n <div [ngStyle]=\"modalContentStyle\">\r\n <div style=\"display: flex; flex-direction: column;\">\r\n <div style=\"display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px;\">\r\n <h2 style=\"font-size: x-large; font-weight: bold; color: black;\">\r\n Recording Settings\r\n </h2>\r\n <button (click)=\"onClose()\" style=\"border: none; background: none; cursor: pointer;\">\r\n <fa-icon [icon]=\"faTimes\" size=\"xl\" style=\"font-size: 20px; color: black;\"></fa-icon>\r\n </button>\r\n </div>\r\n <hr style=\"height: 1px; background-color: black; margin: 5px 0;\" />\r\n <div style=\"flex: 1;\">\r\n <div style=\"overflow-y: auto; max-height: calc(100% - 120px); padding: 0;\">\r\n <div style=\"margin: 0; padding: 0;\">\r\n <app-standard-panel-component [parameters]=\"parameters\"></app-standard-panel-component>\r\n <app-advanced-panel-component [parameters]=\"parameters\"></app-advanced-panel-component>\r\n </div>\r\n </div>\r\n <div style=\"height: 1px; background-color: white; \"></div>\r\n <div style=\"display: flex; justify-content: space-between; margin-top: 20px;\">\r\n <button\r\n (click)=\"confirm()\"\r\n style=\"flex: 1; padding: 5px; border-radius: 5px; justify-content: center; align-items: center; margin: 0 10px; background: #4CAF50; cursor: pointer;\">\r\n <span style=\"color: black; font-size: 14px;\">Confirm</span>\r\n </button>\r\n <button *ngIf=\"!parameters.recordPaused\"\r\n (click)=\"start()\"\r\n style=\"flex: 1; padding: 5px; border-radius: 5px; justify-content: center; align-items: center; margin: 0 10px; background: #f44336; cursor: pointer;\">\r\n <span style=\"color: black; font-size: 14px;\">Start <fa-icon [icon]=\"faPlay\"></fa-icon></span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n" }]
118
- }], propDecorators: { isRecordingModalVisible: [{
119
- type: Input
120
- }], onClose: [{
121
- type: Input
122
- }], backgroundColor: [{
123
- type: Input
124
- }], position: [{
125
- type: Input
126
- }], confirmRecording: [{
127
- type: Input
128
- }], startRecording: [{
129
- type: Input
130
- }], parameters: [{
131
- type: Input
132
- }] } });
133
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkaW5nLW1vZGFsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL21lZGlhc2Z1LWFuZ3VsYXIvc3JjL2xpYi9jb21wb25lbnRzL3JlY29yZGluZy1jb21wb25lbnRzL3JlY29yZGluZy1tb2RhbC9yZWNvcmRpbmctbW9kYWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbWVkaWFzZnUtYW5ndWxhci9zcmMvbGliL2NvbXBvbmVudHMvcmVjb3JkaW5nLWNvbXBvbmVudHMvcmVjb3JkaW5nLW1vZGFsL3JlY29yZGluZy1tb2RhbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBNEIsTUFBTSxlQUFlLENBQUM7QUFDM0UsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGdFQUFnRSxDQUFDO0FBQ3hHLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGlFQUFpRSxDQUFDOzs7O0FBNkR6Rzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F5Q0c7QUFRSCxNQUFNLE9BQU8sY0FBYztJQUNoQix1QkFBdUIsR0FBRyxLQUFLLENBQUM7SUFDaEMsT0FBTyxDQUFjO0lBQ3JCLGVBQWUsR0FBRyxTQUFTLENBQUM7SUFDNUIsUUFBUSxHQUFHLGFBQWEsQ0FBQztJQUN6QixnQkFBZ0IsQ0FBOEM7SUFDOUQsY0FBYyxDQUE0QztJQUMxRCxVQUFVLEdBQTZCLEVBQThCLENBQUM7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RyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRm9udEF3ZXNvbWVNb2R1bGUgfSBmcm9tICdAZm9ydGF3ZXNvbWUvYW5ndWxhci1mb250YXdlc29tZSc7XG5pbXBvcnQgeyBmYVRpbWVzLCBmYUNoZWNrLCBmYVBsYXkgfSBmcm9tICdAZm9ydGF3ZXNvbWUvZnJlZS1zb2xpZC1zdmctaWNvbnMnO1xuaW1wb3J0IHsgU3RhbmRhcmRQYW5lbENvbXBvbmVudCB9IGZyb20gJy4uL3N0YW5kYXJkLXBhbmVsLWNvbXBvbmVudC9zdGFuZGFyZC1wYW5lbC1jb21wb25lbnQuY29tcG9uZW50JztcbmltcG9ydCB7IEFkdmFuY2VkUGFuZWxDb21wb25lbnQgfSBmcm9tICcuLi9hZHZhbmNlZC1wYW5lbC1jb21wb25lbnQvYWR2YW5jZWQtcGFuZWwtY29tcG9uZW50cy5jb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgRXZlbnRUeXBlLFxuICBDb25maXJtUmVjb3JkaW5nUGFyYW1ldGVycyxcbiAgU3RhcnRSZWNvcmRpbmdQYXJhbWV0ZXJzLFxuICBDb25maXJtUmVjb3JkaW5nT3B0aW9ucyxcbiAgU3RhcnRSZWNvcmRpbmdPcHRpb25zLFxufSBmcm9tICcuLi8uLi8uLi9AdHlwZXMvdHlwZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlY29yZGluZ01vZGFsUGFyYW1ldGVyc1xuICBleHRlbmRzIENvbmZpcm1SZWNvcmRpbmdQYXJhbWV0ZXJzLFxuICAgIFN0YXJ0UmVjb3JkaW5nUGFyYW1ldGVycyB7XG4gIHJlY29yZFBhdXNlZDogYm9vbGVhbjtcbiAgcmVjb3JkaW5nVmlkZW9UeXBlOiBzdHJpbmc7XG4gIHJlY29yZGluZ0Rpc3BsYXlUeXBlOiAndmlkZW8nIHwgJ21lZGlhJyB8ICdhbGwnO1xuICByZWNvcmRpbmdCYWNrZ3JvdW5kQ29sb3I6IHN0cmluZztcbiAgcmVjb3JkaW5nTmFtZVRhZ3NDb2xvcjogc3RyaW5nO1xuICByZWNvcmRpbmdPcmllbnRhdGlvblZpZGVvOiBzdHJpbmc7XG4gIHJlY29yZGluZ05hbWVUYWdzOiBib29sZWFuO1xuICByZWNvcmRpbmdBZGRUZXh0OiBib29sZWFuO1xuICByZWNvcmRpbmdDdXN0b21UZXh0OiBzdHJpbmc7XG4gIHJlY29yZGluZ0N1c3RvbVRleHRQb3NpdGlvbjogc3RyaW5nO1xuICByZWNvcmRpbmdDdXN0b21UZXh0Q29sb3I6IHN0cmluZztcbiAgcmVjb3JkaW5nTWVkaWFPcHRpb25zOiBzdHJpbmc7XG4gIHJlY29yZGluZ0F1ZGlvT3B0aW9uczogc3RyaW5nO1xuICByZWNvcmRpbmdWaWRlb09wdGlvbnM6IHN0cmluZztcbiAgcmVjb3JkaW5nQWRkSExTOiBib29sZWFuO1xuICBldmVudFR5cGU6IEV2ZW50VHlwZTtcbiAgdXBkYXRlUmVjb3JkaW5nVmlkZW9UeXBlOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZDtcbiAgdXBkYXRlUmVjb3JkaW5nRGlzcGxheVR5cGU6ICh2YWx1ZTogJ3ZpZGVvJyB8ICdtZWRpYScgfCAnYWxsJykgPT4gdm9pZDtcbiAgdXBkYXRlUmVjb3JkaW5nQmFja2dyb3VuZENvbG9yOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZDtcbiAgdXBkYXRlUmVjb3JkaW5nTmFtZVRhZ3NDb2xvcjogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWQ7XG4gIHVwZGF0ZVJlY29yZGluZ09yaWVudGF0aW9uVmlkZW86ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkO1xuICB1cGRhdGVSZWNvcmRpbmdOYW1lVGFnczogKHZhbHVlOiBib29sZWFuKSA9PiB2b2lkO1xuICB1cGRhdGVSZWNvcmRpbmdBZGRUZXh0OiAodmFsdWU6IGJvb2xlYW4pID0+IHZvaWQ7XG4gIHVwZGF0ZVJlY29yZGluZ0N1c3RvbVRleHQ6ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkO1xuICB1cGRhdGVSZWNvcmRpbmdDdXN0b21UZXh0UG9zaXRpb246ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkO1xuICB1cGRhdGVSZWNvcmRpbmdDdXN0b21UZXh0Q29sb3I6ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkO1xuICB1cGRhdGVSZWNvcmRpbmdNZWRpYU9wdGlvbnM6ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkO1xuICB1cGRhdGVSZWNvcmRpbmdBdWRpb09wdGlvbnM6ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkO1xuICB1cGRhdGVSZWNvcmRpbmdWaWRlb09wdGlvbnM6ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkO1xuICB1cGRhdGVSZWNvcmRpbmdBZGRITFM6ICh2YWx1ZTogYm9vbGVhbikgPT4gdm9pZDtcblxuICAvLyBtZWRpYXNmdSBmdW5jdGlvbnNcbiAgZ2V0VXBkYXRlZEFsbFBhcmFtczogKCkgPT4gUmVjb3JkaW5nTW9kYWxQYXJhbWV0ZXJzO1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVjb3JkaW5nTW9kYWxPcHRpb25zIHtcbiAgaXNSZWNvcmRpbmdNb2RhbFZpc2libGU6IGJvb2xlYW47XG4gIG9uQ2xvc2U6ICgpID0+IHZvaWQ7XG4gIGJhY2tncm91bmRDb2xvcjogc3RyaW5nO1xuICBwb3NpdGlvbjogc3RyaW5nO1xuXG4gIGNvbmZpcm1SZWNvcmRpbmc6IChvcHRpb25zOiBDb25maXJtUmVjb3JkaW5nT3B0aW9ucykgPT4gdm9pZDtcbiAgc3RhcnRSZWNvcmRpbmc6IChvcHRpb25zOiBTdGFydFJlY29yZGluZ09wdGlvbnMpID0+IHZvaWQ7XG4gIHBhcmFtZXRlcnM6IFJlY29yZGluZ01vZGFsUGFyYW1ldGVycztcbn1cblxuZXhwb3J0IHR5cGUgUmVjb3JkaW5nTW9kYWxUeXBlID0gKG9wdGlvbnM6IFJlY29yZGluZ01vZGFsT3B0aW9ucykgPT4gSFRNTEVsZW1lbnQ7XG5cbi8qKlxuICogQ29tcG9uZW50IHJlcHJlc2VudGluZyBhIHJlY29yZGluZyBtb2RhbC5cbiAqXG4gKiBAc2VsZWN0b3IgYXBwLXJlY29yZGluZy1tb2RhbFxuICogQHN0YW5kYWxvbmUgdHJ1ZVxuICogQGltcG9ydHMgQ29tbW9uTW9kdWxlLCBGb250QXdlc29tZU1vZHVsZSwgU3RhbmRhcmRQYW5lbENvbXBvbmVudCwgQWR2YW5jZWRQYW5lbENvbXBvbmVudFxuICogQHRlbXBsYXRlVXJsIC4vcmVjb3JkaW5nLW1vZGFsLmNvbXBvbmVudC5odG1sXG4gKiBAc3R5bGVVcmxzIC4vcmVjb3JkaW5nLW1vZGFsLmNvbXBvbmVudC5jc3NcbiAqXG4gKiBAY2xhc3MgUmVjb3JkaW5nTW9kYWxcbiAqIEBpbXBsZW1lbnRzIE9uQ2hhbmdlc1xuICpcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaXNSZWNvcmRpbmdNb2RhbFZpc2libGUgLSBEZXRlcm1pbmVzIGlmIHRoZSByZWNvcmRpbmcgbW9kYWwgaXMgdmlzaWJsZS5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gdm9pZH0gb25DbG9zZSAtIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGNsb3NlIHRoZSBtb2RhbC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBiYWNrZ3JvdW5kQ29sb3IgLSBCYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSBtb2RhbC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwb3NpdGlvbiAtIFBvc2l0aW9uIG9mIHRoZSBtb2RhbCBvbiB0aGUgc2NyZWVuLlxuICogQHByb3BlcnR5IHsob3B0aW9uczogQ29uZmlybVJlY29yZGluZ09wdGlvbnMpID0+IHZvaWR9IGNvbmZpcm1SZWNvcmRpbmcgLSBDYWxsYmFjayBmdW5jdGlvbiB0byBjb25maXJtIHJlY29yZGluZy5cbiAqIEBwcm9wZXJ0eSB7KG9wdGlvbnM6IFN0YXJ0UmVjb3JkaW5nT3B0aW9ucykgPT4gdm9pZH0gc3RhcnRSZWNvcmRpbmcgLSBDYWxsYmFjayBmdW5jdGlvbiB0byBzdGFydCByZWNvcmRpbmcuXG4gKiBAcHJvcGVydHkge1JlY29yZGluZ01vZGFsUGFyYW1ldGVyc30gcGFyYW1ldGVycyAtIFBhcmFtZXRlcnMgZm9yIHRoZSByZWNvcmRpbmcgbW9kYWwuXG4gKlxuICogQHByb3BlcnR5IHtJY29uRGVmaW5pdGlvbn0gZmFUaW1lcyAtIEZvbnRBd2Vzb21lIGljb24gZm9yIHRpbWVzIChjbG9zZSkuXG4gKiBAcHJvcGVydHkge0ljb25EZWZpbml0aW9ufSBmYUNoZWNrIC0gRm9udEF3ZXNvbWUgaWNvbiBmb3IgY2hlY2sgKGNvbmZpcm0pLlxuICogQHByb3BlcnR5IHtJY29uRGVmaW5pdGlvbn0gZmFQbGF5IC0gRm9udEF3ZXNvbWUgaWNvbiBmb3IgcGxheSAoc3RhcnQpLlxuICpcbiAqIEBtZXRob2QgbW9kYWxDb250YWluZXJTdHlsZSAtIFJldHVybnMgdGhlIHN0eWxlIG9iamVjdCBmb3IgdGhlIG1vZGFsIGNvbnRhaW5lci5cbiAqIEBtZXRob2QgbW9kYWxDb250ZW50U3R5bGUgLSBSZXR1cm5zIHRoZSBzdHlsZSBvYmplY3QgZm9yIHRoZSBtb2RhbCBjb250ZW50LlxuICogQG1ldGhvZCBuZ09uQ2hhbmdlcyAtIExpZmVjeWNsZSBob29rIHRoYXQgaXMgY2FsbGVkIHdoZW4gYW55IGRhdGEtYm91bmQgcHJvcGVydHkgb2YgYSBkaXJlY3RpdmUgY2hhbmdlcy5cbiAqIEBtZXRob2QgY29uZmlybSAtIENhbGxzIHRoZSBjb25maXJtUmVjb3JkaW5nIGNhbGxiYWNrIHdpdGggdGhlIGN1cnJlbnQgcGFyYW1ldGVycy5cbiAqIEBtZXRob2Qgc3RhcnQgLSBDYWxscyB0aGUgc3RhcnRSZWNvcmRpbmcgY2FsbGJhY2sgd2l0aCB0aGUgY3VycmVudCBwYXJhbWV0ZXJzLlxuICogQGV4YW1wbGVcbiAqIGBgYGh0bWxcbiAqIDxhcHAtcmVjb3JkaW5nLW1vZGFsXG4gKiAgIFtpc1JlY29yZGluZ01vZGFsVmlzaWJsZV09XCJ0cnVlXCJcbiAqICAgW29uQ2xvc2VdPVwiY2xvc2VSZWNvcmRpbmdNb2RhbFwiXG4gKiAgIFtiYWNrZ3JvdW5kQ29sb3JdPVwiJyM4M2MwZTknXCJcbiAqICAgW3Bvc2l0aW9uXT1cIidib3R0b21SaWdodCdcIlxuICogICBbY29uZmlybVJlY29yZGluZ109XCJjb25maXJtUmVjb3JkaW5nXCJcbiAqICAgW3N0YXJ0UmVjb3JkaW5nXT1cInN0YXJ0UmVjb3JkaW5nXCJcbiAqICAgW3BhcmFtZXRlcnNdPVwicmVjb3JkaW5nTW9kYWxQYXJhbXNcIlxuICogPjwvYXBwLXJlY29yZGluZy1tb2RhbD5cbiAqIGBgYFxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtcmVjb3JkaW5nLW1vZGFsJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9udEF3ZXNvbWVNb2R1bGUsIFN0YW5kYXJkUGFuZWxDb21wb25lbnQsIEFkdmFuY2VkUGFuZWxDb21wb25lbnRdLFxuICB0ZW1wbGF0ZVVybDogJy4vcmVjb3JkaW5nLW1vZGFsLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcmVjb3JkaW5nLW1vZGFsLmNvbXBvbmVudC5jc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgUmVjb3JkaW5nTW9kYWwgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBpc1JlY29yZGluZ01vZGFsVmlzaWJsZSA9IGZhbHNlO1xuICBASW5wdXQoKSBvbkNsb3NlITogKCkgPT4gdm9pZDtcbiAgQElucHV0KCkgYmFja2dyb3VuZENvbG9yID0gJyM4M2MwZTknO1xuICBASW5wdXQoKSBwb3NpdGlvbiA9ICdib3R0b21SaWdodCc7XG4gIEBJbnB1dCgpIGNvbmZpcm1SZWNvcmRpbmchOiAob3B0aW9uczogQ29uZmlybVJlY29yZGluZ09wdGlvbnMpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIHN0YXJ0UmVjb3JkaW5nITogKG9wdGlvbnM6IFN0YXJ0UmVjb3JkaW5nT3B0aW9ucykgPT4gdm9pZDtcbiAgQElucHV0KCkgcGFyYW1ldGVyczogUmVjb3JkaW5nTW9kYWxQYXJhbWV0ZXJzID0ge30gYXMgUmVjb3JkaW5nTW9kYWxQYXJhbWV0ZXJzO1xuXG4gIGZhVGltZXMgPSBmYVRpbWVzO1xuICBmYUNoZWNrID0gZmFDaGVjaztcbiAgZmFQbGF5ID0gZmFQbGF5O1xuXG4gIGdldCBtb2RhbENvbnRhaW5lclN0eWxlKCkge1xuICAgIHJldHVybiB7XG4gICAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICAgIHRvcDogMCxcbiAgICAgIGxlZnQ6IDAsXG4gICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6ICdyZ2JhKDAsIDAsIDAsIDAuNSknLFxuICAgICAgZGlzcGxheTogdGhpcy5pc1JlY29yZGluZ01vZGFsVmlzaWJsZSA/ICdibG9jaycgOiAnbm9uZScsXG4gICAgICB6SW5kZXg6IDk5OSxcbiAgICB9O1xuICB9XG5cbiAgZ2V0IG1vZGFsQ29udGVudFN0eWxlKCkge1xuICAgIGNvbnN0IHNjcmVlbldpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XG4gICAgbGV0IG1vZGFsV2lkdGggPSAwLjggKiBzY3JlZW5XaWR0aDtcbiAgICBpZiAobW9kYWxXaWR0aCA+IDM1MCkge1xuICAgICAgbW9kYWxXaWR0aCA9IDM1MDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHBvc2l0aW9uOiAnZml4ZWQnLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGlzLmJhY2tncm91bmRDb2xvcixcbiAgICAgIGJvcmRlclJhZGl1czogJzEwcHgnLFxuICAgICAgcGFkZGluZzogJzEwcHgnLFxuICAgICAgd2lkdGg6IGAke21vZGFsV2lkdGh9cHhgLFxuICAgICAgbWF4SGVpZ2h0OiAnODUlJyxcbiAgICAgIG92ZXJmbG93WTogJ2F1dG8nLFxuICAgICAgdG9wOiB0aGlzLnBvc2l0aW9uLmluY2x1ZGVzKCd0b3AnKSA/ICcxMHB4JyA6ICdhdXRvJyxcbiAgICAgIGJvdHRvbTogdGhpcy5wb3NpdGlvbi5pbmNsdWRlcygnYm90dG9tJykgPyAnMTBweCcgOiAnYXV0bycsXG4gICAgICBsZWZ0OiB0aGlzLnBvc2l0aW9uLmluY2x1ZGVzKCdMZWZ0JykgPyAnMTBweCcgOiAnYXV0bycsXG4gICAgICByaWdodDogdGhpcy5wb3NpdGlvbi5pbmNsdWRlcygnUmlnaHQnKSA/ICcxMHB4JyA6ICdhdXRvJyxcbiAgICB9O1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzWydpc1JlY29yZGluZ01vZGFsVmlzaWJsZSddKSB7XG4gICAgICBpZiAodGhpcy5wYXJhbWV0ZXJzKSB7XG4gICAgICAgIHRoaXMucGFyYW1ldGVycyA9IHRoaXMucGFyYW1ldGVycy5nZXRVcGRhdGVkQWxsUGFyYW1zKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uZmlybSgpIHtcbiAgICB0aGlzLmNvbmZpcm1SZWNvcmRpbmcoe1xuICAgICAgcGFyYW1ldGVyczogeyAuLi50aGlzLnBhcmFtZXRlcnMgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXJ0KCkge1xuICAgIHRoaXMuc3RhcnRSZWNvcmRpbmcoe1xuICAgICAgcGFyYW1ldGVyczogeyAuLi50aGlzLnBhcmFtZXRlcnMgfSxcbiAgICB9KTtcbiAgfVxufVxuIiwiPGRpdiBbbmdTdHlsZV09XCJtb2RhbENvbnRhaW5lclN0eWxlXCI+XHJcbiAgPGRpdiBbbmdTdHlsZV09XCJtb2RhbENvbnRlbnRTdHlsZVwiPlxyXG4gICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XCI+XHJcbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IGFsaWduLWl0ZW1zOiBjZW50ZXI7IG1hcmdpbi1ib3R0b206IDE1cHg7XCI+XHJcbiAgICAgICAgPGgyIHN0eWxlPVwiZm9udC1zaXplOiB4LWxhcmdlOyBmb250LXdlaWdodDogYm9sZDsgY29sb3I6IGJsYWNrO1wiPlxyXG4gICAgICAgICAgUmVjb3JkaW5nIFNldHRpbmdzXHJcbiAgICAgICAgPC9oMj5cclxuICAgICAgICA8YnV0dG9uIChjbGljayk9XCJvbkNsb3NlKClcIiBzdHlsZT1cImJvcmRlcjogbm9uZTsgYmFja2dyb3VuZDogbm9uZTsgY3Vyc29yOiBwb2ludGVyO1wiPlxyXG4gICAgICAgICAgPGZhLWljb24gW2ljb25dPVwiZmFUaW1lc1wiIHNpemU9XCJ4bFwiIHN0eWxlPVwiZm9udC1zaXplOiAyMHB4OyBjb2xvcjogYmxhY2s7XCI+PC9mYS1pY29uPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGhyIHN0eWxlPVwiaGVpZ2h0OiAxcHg7IGJhY2tncm91bmQtY29sb3I6IGJsYWNrOyBtYXJnaW46IDVweCAwO1wiIC8+XHJcbiAgICAgIDxkaXYgc3R5bGU9XCJmbGV4OiAxO1wiPlxyXG4gICAgICAgIDxkaXYgc3R5bGU9XCJvdmVyZmxvdy15OiBhdXRvOyBtYXgtaGVpZ2h0OiBjYWxjKDEwMCUgLSAxMjBweCk7IHBhZGRpbmc6IDA7XCI+XHJcbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luOiAwOyBwYWRkaW5nOiAwO1wiPlxyXG4gICAgICAgICAgICA8YXBwLXN0YW5kYXJkLXBhbmVsLWNvbXBvbmVudCBbcGFyYW1ldGVyc109XCJwYXJhbWV0ZXJzXCI+PC9hcHAtc3RhbmRhcmQtcGFuZWwtY29tcG9uZW50PlxyXG4gICAgICAgICAgICA8YXBwLWFkdmFuY2VkLXBhbmVsLWNvbXBvbmVudCBbcGFyYW1ldGVyc109XCJwYXJhbWV0ZXJzXCI+PC9hcHAtYWR2YW5jZWQtcGFuZWwtY29tcG9uZW50PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBzdHlsZT1cImhlaWdodDogMXB4OyBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsgXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgbWFyZ2luLXRvcDogMjBweDtcIj5cclxuICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgKGNsaWNrKT1cImNvbmZpcm0oKVwiXHJcbiAgICAgICAgICAgIHN0eWxlPVwiZmxleDogMTsgcGFkZGluZzogNXB4OyBib3JkZXItcmFkaXVzOiA1cHg7IGp1c3RpZnktY29udGVudDogY2VudGVyOyBhbGlnbi1pdGVtczogY2VudGVyOyBtYXJnaW46IDAgMTBweDsgYmFja2dyb3VuZDogIzRDQUY1MDsgY3Vyc29yOiBwb2ludGVyO1wiPlxyXG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiBibGFjazsgZm9udC1zaXplOiAxNHB4O1wiPkNvbmZpcm08L3NwYW4+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhcGFyYW1ldGVycy5yZWNvcmRQYXVzZWRcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwic3RhcnQoKVwiXHJcbiAgICAgICAgICAgIHN0eWxlPVwiZmxleDogMTsgcGFkZGluZzogNXB4OyBib3JkZXItcmFkaXVzOiA1cHg7IGp1c3RpZnktY29udGVudDogY2VudGVyOyBhbGlnbi1pdGVtczogY2VudGVyOyBtYXJnaW46IDAgMTBweDsgYmFja2dyb3VuZDogI2Y0NDMzNjsgY3Vyc29yOiBwb2ludGVyO1wiPlxyXG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiBibGFjazsgZm9udC1zaXplOiAxNHB4O1wiPlN0YXJ0IDxmYS1pY29uIFtpY29uXT1cImZhUGxheVwiPjwvZmEtaWNvbj48L3NwYW4+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==