@rocketshow/designer 1.40.0 → 1.44.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 (191) hide show
  1. package/fesm2022/rocketshow-designer.mjs +1389 -1148
  2. package/fesm2022/rocketshow-designer.mjs.map +1 -1
  3. package/index.d.ts +1676 -5
  4. package/package.json +2 -4
  5. package/rocketshow-designer-1.44.0.tgz +0 -0
  6. package/esm2022/lib/array-sort-pipe.mjs +0 -30
  7. package/esm2022/lib/designer.component.mjs +0 -672
  8. package/esm2022/lib/designer.module.mjs +0 -186
  9. package/esm2022/lib/designer.service.mjs +0 -14
  10. package/esm2022/lib/dropzone/dropzone.component.mjs +0 -93
  11. package/esm2022/lib/effect/effect-curve/effect-curve.component.mjs +0 -577
  12. package/esm2022/lib/effect/effect-pan-tilt/effect-pan-tilt.component.mjs +0 -36
  13. package/esm2022/lib/effect/effect.component.mjs +0 -174
  14. package/esm2022/lib/error-dialog/error-dialog.component.mjs +0 -75
  15. package/esm2022/lib/fixture/fixture-capability/fixture-capability-channel/fixture-capability-channel.component.mjs +0 -370
  16. package/esm2022/lib/fixture/fixture-capability/fixture-capability-color/fixture-capability-color.component.mjs +0 -147
  17. package/esm2022/lib/fixture/fixture-capability/fixture-capability-color-wheel/fixture-capability-color-wheel.component.mjs +0 -213
  18. package/esm2022/lib/fixture/fixture-capability/fixture-capability-dimmer/fixture-capability-dimmer.component.mjs +0 -78
  19. package/esm2022/lib/fixture/fixture-capability/fixture-capability-pan-tilt/fixture-capability-pan-tilt.component.mjs +0 -119
  20. package/esm2022/lib/fixture/fixture-capability/fixture-capability.component.mjs +0 -191
  21. package/esm2022/lib/fixture/fixture-channel/fixture-channel.component.mjs +0 -162
  22. package/esm2022/lib/fixture/fixture-settings/fixture-settings-position/fixture-settings-position.component.mjs +0 -365
  23. package/esm2022/lib/fixture/fixture-settings/fixture-settings-stage/fixture-settings-stage.component.mjs +0 -151
  24. package/esm2022/lib/fixture/fixture-settings/fixture-settings.component.mjs +0 -46
  25. package/esm2022/lib/fixture/fixture.component.mjs +0 -148
  26. package/esm2022/lib/fixture-pool/fixture-pool-create-from-file/fixture-pool-create-from-file.component.mjs +0 -145
  27. package/esm2022/lib/fixture-pool/fixture-pool.component.mjs +0 -641
  28. package/esm2022/lib/intro/intro.component.mjs +0 -95
  29. package/esm2022/lib/master-dimmer/master-dimmer.component.mjs +0 -66
  30. package/esm2022/lib/models/cached-fixture-capability.mjs +0 -9
  31. package/esm2022/lib/models/cached-fixture-channel.mjs +0 -7
  32. package/esm2022/lib/models/cached-fixture.mjs +0 -6
  33. package/esm2022/lib/models/color.mjs +0 -8
  34. package/esm2022/lib/models/composition.mjs +0 -46
  35. package/esm2022/lib/models/effect-curve-profile-channel.mjs +0 -15
  36. package/esm2022/lib/models/effect-curve.mjs +0 -69
  37. package/esm2022/lib/models/effect-pan-tilt.mjs +0 -19
  38. package/esm2022/lib/models/effect.mjs +0 -12
  39. package/esm2022/lib/models/fixture-capability-value.mjs +0 -15
  40. package/esm2022/lib/models/fixture-capability.mjs +0 -127
  41. package/esm2022/lib/models/fixture-channel-value.mjs +0 -11
  42. package/esm2022/lib/models/fixture-channel.mjs +0 -24
  43. package/esm2022/lib/models/fixture-matrix-pixel-group-constraints.mjs +0 -27
  44. package/esm2022/lib/models/fixture-matrix-pixel-group.mjs +0 -12
  45. package/esm2022/lib/models/fixture-matrix.mjs +0 -25
  46. package/esm2022/lib/models/fixture-mode-channel.mjs +0 -26
  47. package/esm2022/lib/models/fixture-mode.mjs +0 -17
  48. package/esm2022/lib/models/fixture-physical.mjs +0 -14
  49. package/esm2022/lib/models/fixture-profile.mjs +0 -85
  50. package/esm2022/lib/models/fixture-wheel-slot.mjs +0 -26
  51. package/esm2022/lib/models/fixture-wheel.mjs +0 -15
  52. package/esm2022/lib/models/fixture.mjs +0 -40
  53. package/esm2022/lib/models/preset-fixture.mjs +0 -10
  54. package/esm2022/lib/models/preset-region-scene.mjs +0 -8
  55. package/esm2022/lib/models/preset.mjs +0 -65
  56. package/esm2022/lib/models/project.mjs +0 -78
  57. package/esm2022/lib/models/scene-playback-region.mjs +0 -11
  58. package/esm2022/lib/models/scene.mjs +0 -27
  59. package/esm2022/lib/preset/preset-settings/preset-settings.component.mjs +0 -194
  60. package/esm2022/lib/preset/preset.component.mjs +0 -131
  61. package/esm2022/lib/preview/models/color-changer-3d.mjs +0 -52
  62. package/esm2022/lib/preview/models/fixture-3d.mjs +0 -260
  63. package/esm2022/lib/preview/models/moving-head-3d.mjs +0 -115
  64. package/esm2022/lib/preview/preview.component.mjs +0 -216
  65. package/esm2022/lib/project/project-browser/project-browser.component.mjs +0 -143
  66. package/esm2022/lib/project/project-import/project-import.component.mjs +0 -107
  67. package/esm2022/lib/project/project-save/project-save.component.mjs +0 -178
  68. package/esm2022/lib/project/project-share/project-share.component.mjs +0 -71
  69. package/esm2022/lib/scene/scene-settings/scene-settings.component.mjs +0 -146
  70. package/esm2022/lib/scene/scene.component.mjs +0 -110
  71. package/esm2022/lib/services/animation.service.mjs +0 -16
  72. package/esm2022/lib/services/config.service.mjs +0 -28
  73. package/esm2022/lib/services/effect.service.mjs +0 -14
  74. package/esm2022/lib/services/error-dialog.service.mjs +0 -39
  75. package/esm2022/lib/services/fixture-pool.service.mjs +0 -30
  76. package/esm2022/lib/services/fixture.service.mjs +0 -699
  77. package/esm2022/lib/services/hotkey-target-exclude.service.mjs +0 -24
  78. package/esm2022/lib/services/intro.service.mjs +0 -140
  79. package/esm2022/lib/services/preset.service.mjs +0 -450
  80. package/esm2022/lib/services/preview-mesh.service.mjs +0 -57
  81. package/esm2022/lib/services/preview.service.mjs +0 -481
  82. package/esm2022/lib/services/project-load.service.mjs +0 -206
  83. package/esm2022/lib/services/project.service.mjs +0 -93
  84. package/esm2022/lib/services/scene.service.mjs +0 -164
  85. package/esm2022/lib/services/timeline.service.mjs +0 -726
  86. package/esm2022/lib/services/user-ensure-login.service.mjs +0 -38
  87. package/esm2022/lib/services/user.service.mjs +0 -89
  88. package/esm2022/lib/services/uuid.service.mjs +0 -23
  89. package/esm2022/lib/services/warning-dialog.service.mjs +0 -38
  90. package/esm2022/lib/timeline/composition-settings/composition-settings.component.mjs +0 -304
  91. package/esm2022/lib/timeline/timeline-grid/timeline-grid.component.mjs +0 -216
  92. package/esm2022/lib/timeline/timeline.component.mjs +0 -418
  93. package/esm2022/lib/user/user-login/user-login.component.mjs +0 -144
  94. package/esm2022/lib/user/user-register/user-register.component.mjs +0 -220
  95. package/esm2022/lib/wait-dialog/wait-dialog.component.mjs +0 -26
  96. package/esm2022/lib/warning-dialog/warning-dialog.component.mjs +0 -68
  97. package/esm2022/public_api.mjs +0 -7
  98. package/esm2022/rocketshow-designer.mjs +0 -5
  99. package/lib/array-sort-pipe.d.ts +0 -7
  100. package/lib/designer.component.d.ts +0 -73
  101. package/lib/designer.module.d.ts +0 -57
  102. package/lib/designer.service.d.ts +0 -6
  103. package/lib/dropzone/dropzone.component.d.ts +0 -24
  104. package/lib/effect/effect-curve/effect-curve.component.d.ts +0 -59
  105. package/lib/effect/effect-pan-tilt/effect-pan-tilt.component.d.ts +0 -15
  106. package/lib/effect/effect.component.d.ts +0 -22
  107. package/lib/error-dialog/error-dialog.component.d.ts +0 -17
  108. package/lib/fixture/fixture-capability/fixture-capability-channel/fixture-capability-channel.component.d.ts +0 -41
  109. package/lib/fixture/fixture-capability/fixture-capability-color/fixture-capability-color.component.d.ts +0 -26
  110. package/lib/fixture/fixture-capability/fixture-capability-color-wheel/fixture-capability-color-wheel.component.d.ts +0 -34
  111. package/lib/fixture/fixture-capability/fixture-capability-dimmer/fixture-capability-dimmer.component.d.ts +0 -15
  112. package/lib/fixture/fixture-capability/fixture-capability-pan-tilt/fixture-capability-pan-tilt.component.d.ts +0 -18
  113. package/lib/fixture/fixture-capability/fixture-capability.component.d.ts +0 -31
  114. package/lib/fixture/fixture-channel/fixture-channel.component.d.ts +0 -25
  115. package/lib/fixture/fixture-settings/fixture-settings-position/fixture-settings-position.component.d.ts +0 -32
  116. package/lib/fixture/fixture-settings/fixture-settings-stage/fixture-settings-stage.component.d.ts +0 -14
  117. package/lib/fixture/fixture-settings/fixture-settings.component.d.ts +0 -14
  118. package/lib/fixture/fixture.component.d.ts +0 -25
  119. package/lib/fixture-pool/fixture-pool-create-from-file/fixture-pool-create-from-file.component.d.ts +0 -28
  120. package/lib/fixture-pool/fixture-pool.component.d.ts +0 -62
  121. package/lib/intro/intro.component.d.ts +0 -11
  122. package/lib/master-dimmer/master-dimmer.component.d.ts +0 -15
  123. package/lib/models/cached-fixture-capability.d.ts +0 -11
  124. package/lib/models/cached-fixture-channel.d.ts +0 -11
  125. package/lib/models/cached-fixture.d.ts +0 -11
  126. package/lib/models/color.d.ts +0 -6
  127. package/lib/models/composition.d.ts +0 -19
  128. package/lib/models/effect-curve-profile-channel.d.ts +0 -5
  129. package/lib/models/effect-curve.d.ts +0 -15
  130. package/lib/models/effect-pan-tilt.d.ts +0 -6
  131. package/lib/models/effect.d.ts +0 -6
  132. package/lib/models/fixture-capability-value.d.ts +0 -10
  133. package/lib/models/fixture-capability.d.ts +0 -117
  134. package/lib/models/fixture-channel-value.d.ts +0 -6
  135. package/lib/models/fixture-channel.d.ts +0 -9
  136. package/lib/models/fixture-matrix-pixel-group-constraints.d.ts +0 -8
  137. package/lib/models/fixture-matrix-pixel-group.d.ts +0 -6
  138. package/lib/models/fixture-matrix.d.ts +0 -6
  139. package/lib/models/fixture-mode-channel.d.ts +0 -8
  140. package/lib/models/fixture-mode.d.ts +0 -8
  141. package/lib/models/fixture-physical.d.ts +0 -4
  142. package/lib/models/fixture-profile.d.ts +0 -39
  143. package/lib/models/fixture-wheel-slot.d.ts +0 -17
  144. package/lib/models/fixture-wheel.d.ts +0 -5
  145. package/lib/models/fixture.d.ts +0 -23
  146. package/lib/models/preset-fixture.d.ts +0 -5
  147. package/lib/models/preset-region-scene.d.ts +0 -9
  148. package/lib/models/preset.d.ts +0 -20
  149. package/lib/models/project.d.ts +0 -31
  150. package/lib/models/scene-playback-region.d.ts +0 -6
  151. package/lib/models/scene.d.ts +0 -11
  152. package/lib/preset/preset-settings/preset-settings.component.d.ts +0 -22
  153. package/lib/preset/preset.component.d.ts +0 -25
  154. package/lib/preview/models/color-changer-3d.d.ts +0 -16
  155. package/lib/preview/models/fixture-3d.d.ts +0 -38
  156. package/lib/preview/models/moving-head-3d.d.ts +0 -23
  157. package/lib/preview/preview.component.d.ts +0 -38
  158. package/lib/project/project-browser/project-browser.component.d.ts +0 -27
  159. package/lib/project/project-import/project-import.component.d.ts +0 -23
  160. package/lib/project/project-save/project-save.component.d.ts +0 -28
  161. package/lib/project/project-share/project-share.component.d.ts +0 -16
  162. package/lib/scene/scene-settings/scene-settings.component.d.ts +0 -20
  163. package/lib/scene/scene.component.d.ts +0 -22
  164. package/lib/services/animation.service.d.ts +0 -7
  165. package/lib/services/config.service.d.ts +0 -20
  166. package/lib/services/effect.service.d.ts +0 -8
  167. package/lib/services/error-dialog.service.d.ts +0 -12
  168. package/lib/services/fixture-pool.service.d.ts +0 -10
  169. package/lib/services/fixture.service.d.ts +0 -70
  170. package/lib/services/hotkey-target-exclude.service.d.ts +0 -7
  171. package/lib/services/intro.service.d.ts +0 -21
  172. package/lib/services/preset.service.d.ts +0 -64
  173. package/lib/services/preview-mesh.service.d.ts +0 -14
  174. package/lib/services/preview.service.d.ts +0 -42
  175. package/lib/services/project-load.service.d.ts +0 -36
  176. package/lib/services/project.service.d.ts +0 -26
  177. package/lib/services/scene.service.d.ts +0 -30
  178. package/lib/services/timeline.service.d.ts +0 -70
  179. package/lib/services/user-ensure-login.service.d.ts +0 -14
  180. package/lib/services/user.service.d.ts +0 -22
  181. package/lib/services/uuid.service.d.ts +0 -7
  182. package/lib/services/warning-dialog.service.d.ts +0 -12
  183. package/lib/timeline/composition-settings/composition-settings.component.d.ts +0 -48
  184. package/lib/timeline/timeline-grid/timeline-grid.component.d.ts +0 -22
  185. package/lib/timeline/timeline.component.d.ts +0 -50
  186. package/lib/user/user-login/user-login.component.d.ts +0 -21
  187. package/lib/user/user-register/user-register.component.d.ts +0 -26
  188. package/lib/wait-dialog/wait-dialog.component.d.ts +0 -8
  189. package/lib/warning-dialog/warning-dialog.component.d.ts +0 -16
  190. package/public_api.d.ts +0 -3
  191. package/rocketshow-designer-1.40.0.tgz +0 -0
@@ -1,38 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import { BsModalService } from 'ngx-bootstrap/modal';
3
- import { of, Subject } from 'rxjs';
4
- import { UserRegisterComponent } from '../user/user-register/user-register.component';
5
- import { ConfigService } from './config.service';
6
- import { UserService } from './user.service';
7
- import * as i0 from "@angular/core";
8
- import * as i1 from "./user.service";
9
- import * as i2 from "ngx-bootstrap/modal";
10
- import * as i3 from "./config.service";
11
- export class UserEnsureLoginService {
12
- constructor(userService, modalService, configService) {
13
- this.userService = userService;
14
- this.modalService = modalService;
15
- this.configService = configService;
16
- }
17
- // show the login form and log a user in, if required
18
- login() {
19
- if (this.userService.isLoggedIn()) {
20
- return of(null);
21
- }
22
- if (!this.configService.loginAvailable) {
23
- return of(null);
24
- }
25
- const subject = new Subject();
26
- this.modalService.show(UserRegisterComponent, { keyboard: true, ignoreBackdropClick: false, initialState: { subject } });
27
- return subject;
28
- }
29
- static { this.ɵfac = function UserEnsureLoginService_Factory(t) { return new (t || UserEnsureLoginService)(i0.ɵɵinject(i1.UserService), i0.ɵɵinject(i2.BsModalService), i0.ɵɵinject(i3.ConfigService)); }; }
30
- static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: UserEnsureLoginService, factory: UserEnsureLoginService.ɵfac, providedIn: 'root' }); }
31
- }
32
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(UserEnsureLoginService, [{
33
- type: Injectable,
34
- args: [{
35
- providedIn: 'root',
36
- }]
37
- }], () => [{ type: i1.UserService }, { type: i2.BsModalService }, { type: i3.ConfigService }], null); })();
38
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1lbnN1cmUtbG9naW4uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbmVyL3NyYy9saWIvc2VydmljZXMvdXNlci1lbnN1cmUtbG9naW4uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEVBQWMsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUN0RixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDakQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7OztBQUs3QyxNQUFNLE9BQU8sc0JBQXNCO0lBQ2pDLFlBQW9CLFdBQXdCLEVBQVUsWUFBNEIsRUFBVSxhQUE0QjtRQUFwRyxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUFVLGlCQUFZLEdBQVosWUFBWSxDQUFnQjtRQUFVLGtCQUFhLEdBQWIsYUFBYSxDQUFlO0lBQUcsQ0FBQztJQUU1SCxxREFBcUQ7SUFDckQsS0FBSztRQUNILElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDO1lBQ2xDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xCLENBQUM7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN2QyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQixDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUNwQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN6SCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO3VGQWhCVSxzQkFBc0I7dUVBQXRCLHNCQUFzQixXQUF0QixzQkFBc0IsbUJBRnJCLE1BQU07O2lGQUVQLHNCQUFzQjtjQUhsQyxVQUFVO2VBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCc01vZGFsU2VydmljZSB9IGZyb20gJ25neC1ib290c3RyYXAvbW9kYWwnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFVzZXJSZWdpc3RlckNvbXBvbmVudCB9IGZyb20gJy4uL3VzZXIvdXNlci1yZWdpc3Rlci91c2VyLXJlZ2lzdGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi9jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyBVc2VyU2VydmljZSB9IGZyb20gJy4vdXNlci5zZXJ2aWNlJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIFVzZXJFbnN1cmVMb2dpblNlcnZpY2Uge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHVzZXJTZXJ2aWNlOiBVc2VyU2VydmljZSwgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IEJzTW9kYWxTZXJ2aWNlLCBwcml2YXRlIGNvbmZpZ1NlcnZpY2U6IENvbmZpZ1NlcnZpY2UpIHt9XG5cbiAgLy8gc2hvdyB0aGUgbG9naW4gZm9ybSBhbmQgbG9nIGEgdXNlciBpbiwgaWYgcmVxdWlyZWRcbiAgbG9naW4oKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMudXNlclNlcnZpY2UuaXNMb2dnZWRJbigpKSB7XG4gICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmNvbmZpZ1NlcnZpY2UubG9naW5BdmFpbGFibGUpIHtcbiAgICAgIHJldHVybiBvZihudWxsKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdWJqZWN0ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICB0aGlzLm1vZGFsU2VydmljZS5zaG93KFVzZXJSZWdpc3RlckNvbXBvbmVudCwgeyBrZXlib2FyZDogdHJ1ZSwgaWdub3JlQmFja2Ryb3BDbGljazogZmFsc2UsIGluaXRpYWxTdGF0ZTogeyBzdWJqZWN0IH0gfSk7XG4gICAgcmV0dXJuIHN1YmplY3Q7XG4gIH1cbn1cbiJdfQ==
@@ -1,89 +0,0 @@
1
- import { HttpClient, HttpHeaders } from '@angular/common/http';
2
- import { Injectable } from '@angular/core';
3
- import { map } from 'rxjs/operators';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "@angular/common/http";
6
- export class UserService {
7
- constructor(http) {
8
- this.http = http;
9
- this.loadFromLocalStorage();
10
- }
11
- loadFromLocalStorage() {
12
- this.token = localStorage.getItem('token');
13
- this.tokenExpiration = undefined;
14
- if (localStorage.getItem('tokenExpiration')) {
15
- this.tokenExpiration = new Date(Date.parse(localStorage.getItem('tokenExpiration')));
16
- }
17
- this.username = localStorage.getItem('username');
18
- }
19
- // register a new user
20
- register(email, username, password) {
21
- return this.http.post('register?email=' + email + '&username=' + username + '&password=' + password, null);
22
- }
23
- // login a user in the api
24
- login(email, password) {
25
- return this.http.post('login?email=' + email + '&password=' + password, null).pipe(map((result) => {
26
- this.token = result.token;
27
- this.username = result.username;
28
- // the token expires one month from now
29
- this.tokenExpiration = new Date();
30
- this.tokenExpiration.setDate(this.tokenExpiration.getDate() + 30);
31
- // store to the local storage
32
- localStorage.setItem('token', this.token);
33
- localStorage.setItem('tokenExpiration', JSON.stringify(this.tokenExpiration));
34
- localStorage.setItem('username', this.username);
35
- this.loadFromLocalStorage();
36
- }));
37
- }
38
- logout() {
39
- localStorage.removeItem('token');
40
- localStorage.removeItem('tokenExpiration');
41
- localStorage.removeItem('username');
42
- this.loadFromLocalStorage();
43
- }
44
- isLoggedIn() {
45
- if (!this.token) {
46
- return false;
47
- }
48
- if (new Date() > this.tokenExpiration) {
49
- this.logout();
50
- return false;
51
- }
52
- return true;
53
- }
54
- getHeaders() {
55
- if (!this.isLoggedIn()) {
56
- return null;
57
- }
58
- let headers = new HttpHeaders();
59
- headers = headers.append('Authorization', this.token);
60
- return headers;
61
- }
62
- setAutoLoadProject(project) {
63
- localStorage.setItem('projectName', project.name);
64
- if (project.id) {
65
- localStorage.setItem('projectId', project.id.toString());
66
- }
67
- else {
68
- localStorage.removeItem('projectId');
69
- }
70
- }
71
- getAutoLoadProjectId() {
72
- if (!localStorage.getItem('projectId')) {
73
- return null;
74
- }
75
- return Number.parseInt(localStorage.getItem('projectId'), 10);
76
- }
77
- getAutoLoadProjectName() {
78
- return localStorage.getItem('projectName');
79
- }
80
- static { this.ɵfac = function UserService_Factory(t) { return new (t || UserService)(i0.ɵɵinject(i1.HttpClient)); }; }
81
- static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: UserService, factory: UserService.ɵfac, providedIn: 'root' }); }
82
- }
83
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(UserService, [{
84
- type: Injectable,
85
- args: [{
86
- providedIn: 'root',
87
- }]
88
- }], () => [{ type: i1.HttpClient }], null); })();
89
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGVzaWduZXIvc3JjL2xpYi9zZXJ2aWNlcy91c2VyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7O0FBTXJDLE1BQU0sT0FBTyxXQUFXO0lBTXRCLFlBQW9CLElBQWdCO1FBQWhCLFNBQUksR0FBSixJQUFJLENBQVk7UUFDbEMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVPLG9CQUFvQjtRQUMxQixJQUFJLENBQUMsS0FBSyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLGVBQWUsR0FBRyxTQUFTLENBQUM7UUFDakMsSUFBSSxZQUFZLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQztZQUM1QyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2RixDQUFDO1FBQ0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRCxzQkFBc0I7SUFDdEIsUUFBUSxDQUFDLEtBQWEsRUFBRSxRQUFnQixFQUFFLFFBQWdCO1FBQ3hELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxHQUFHLFlBQVksR0FBRyxRQUFRLEdBQUcsWUFBWSxH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T0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRCxzQkFBc0I7UUFDcEIsT0FBTyxZQUFZLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzdDLENBQUM7NEVBOUZVLFdBQVc7dUVBQVgsV0FBVyxXQUFYLFdBQVcsbUJBRlYsTUFBTTs7aUZBRVAsV0FBVztjQUh2QixVQUFVO2VBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwSGVhZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFByb2plY3QgfSBmcm9tICcuLi9tb2RlbHMvcHJvamVjdCc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBVc2VyU2VydmljZSB7XG4gIC8vIHRoZSBhdXRoZW50aWNhdGlvbiB0b2tlblxuICB0b2tlbjogc3RyaW5nO1xuICB0b2tlbkV4cGlyYXRpb246IERhdGU7XG4gIHVzZXJuYW1lOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50KSB7XG4gICAgdGhpcy5sb2FkRnJvbUxvY2FsU3RvcmFnZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkRnJvbUxvY2FsU3RvcmFnZSgpIHtcbiAgICB0aGlzLnRva2VuID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3Rva2VuJyk7XG4gICAgdGhpcy50b2tlbkV4cGlyYXRpb24gPSB1bmRlZmluZWQ7XG4gICAgaWYgKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0b2tlbkV4cGlyYXRpb24nKSkge1xuICAgICAgdGhpcy50b2tlbkV4cGlyYXRpb24gPSBuZXcgRGF0ZShEYXRlLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0b2tlbkV4cGlyYXRpb24nKSkpO1xuICAgIH1cbiAgICB0aGlzLnVzZXJuYW1lID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3VzZXJuYW1lJyk7XG4gIH1cblxuICAvLyByZWdpc3RlciBhIG5ldyB1c2VyXG4gIHJlZ2lzdGVyKGVtYWlsOiBzdHJpbmcsIHVzZXJuYW1lOiBzdHJpbmcsIHBhc3N3b3JkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdCgncmVnaXN0ZXI/ZW1haWw9JyArIGVtYWlsICsgJyZ1c2VybmFtZT0nICsgdXNlcm5hbWUgKyAnJnBhc3N3b3JkPScgKyBwYXNzd29yZCwgbnVsbCk7XG4gIH1cblxuICAvLyBsb2dpbiBhIHVzZXIgaW4gdGhlIGFwaVxuICBsb2dpbihlbWFpbDogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoJ2xvZ2luP2VtYWlsPScgKyBlbWFpbCArICcmcGFzc3dvcmQ9JyArIHBhc3N3b3JkLCBudWxsKS5waXBlKFxuICAgICAgbWFwKChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnRva2VuID0gcmVzdWx0LnRva2VuO1xuICAgICAgICB0aGlzLnVzZXJuYW1lID0gcmVzdWx0LnVzZXJuYW1lO1xuXG4gICAgICAgIC8vIHRoZSB0b2tlbiBleHBpcmVzIG9uZSBtb250aCBmcm9tIG5vd1xuICAgICAgICB0aGlzLnRva2VuRXhwaXJhdGlvbiA9IG5ldyBEYXRlKCk7XG4gICAgICAgIHRoaXMudG9rZW5FeHBpcmF0aW9uLnNldERhdGUodGhpcy50b2tlbkV4cGlyYXRpb24uZ2V0RGF0ZSgpICsgMzApO1xuXG4gICAgICAgIC8vIHN0b3JlIHRvIHRoZSBsb2NhbCBzdG9yYWdlXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd0b2tlbicsIHRoaXMudG9rZW4pO1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndG9rZW5FeHBpcmF0aW9uJywgSlNPTi5zdHJpbmdpZnkodGhpcy50b2tlbkV4cGlyYXRpb24pKTtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3VzZXJuYW1lJywgdGhpcy51c2VybmFtZSk7XG5cbiAgICAgICAgdGhpcy5sb2FkRnJvbUxvY2FsU3RvcmFnZSgpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgbG9nb3V0KCkge1xuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCd0b2tlbicpO1xuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCd0b2tlbkV4cGlyYXRpb24nKTtcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgndXNlcm5hbWUnKTtcblxuICAgIHRoaXMubG9hZEZyb21Mb2NhbFN0b3JhZ2UoKTtcbiAgfVxuXG4gIGlzTG9nZ2VkSW4oKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLnRva2VuKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKG5ldyBEYXRlKCkgPiB0aGlzLnRva2VuRXhwaXJhdGlvbikge1xuICAgICAgdGhpcy5sb2dvdXQoKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGdldEhlYWRlcnMoKTogSHR0cEhlYWRlcnMge1xuICAgIGlmICghdGhpcy5pc0xvZ2dlZEluKCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGxldCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCk7XG4gICAgaGVhZGVycyA9IGhlYWRlcnMuYXBwZW5kKCdBdXRob3JpemF0aW9uJywgdGhpcy50b2tlbik7XG4gICAgcmV0dXJuIGhlYWRlcnM7XG4gIH1cblxuICBzZXRBdXRvTG9hZFByb2plY3QocHJvamVjdDogUHJvamVjdCkge1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdwcm9qZWN0TmFtZScsIHByb2plY3QubmFtZSk7XG4gICAgaWYgKHByb2plY3QuaWQpIHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdwcm9qZWN0SWQnLCBwcm9qZWN0LmlkLnRvU3RyaW5nKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgncHJvamVjdElkJyk7XG4gICAgfVxuICB9XG5cbiAgZ2V0QXV0b0xvYWRQcm9qZWN0SWQoKTogbnVtYmVyIHtcbiAgICBpZiAoIWxvY2FsU3RvcmFnZS5nZXRJdGVtKCdwcm9qZWN0SWQnKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBOdW1iZXIucGFyc2VJbnQobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3Byb2plY3RJZCcpLCAxMCk7XG4gIH1cblxuICBnZXRBdXRvTG9hZFByb2plY3ROYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdwcm9qZWN0TmFtZScpO1xuICB9XG59XG4iXX0=
@@ -1,23 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- export class UuidService {
4
- constructor() { }
5
- getUuid() {
6
- return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
7
- // tslint:disable-next-line:no-bitwise
8
- const r = (Math.random() * 16) | 0;
9
- // tslint:disable-next-line:no-bitwise
10
- const v = c === 'x' ? r : (r & 0x3) | 0x8;
11
- return v.toString(16);
12
- });
13
- }
14
- static { this.ɵfac = function UuidService_Factory(t) { return new (t || UuidService)(); }; }
15
- static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: UuidService, factory: UuidService.ɵfac, providedIn: 'root' }); }
16
- }
17
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(UuidService, [{
18
- type: Injectable,
19
- args: [{
20
- providedIn: 'root',
21
- }]
22
- }], () => [], null); })();
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXVpZC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGVzaWduZXIvc3JjL2xpYi9zZXJ2aWNlcy91dWlkLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFLM0MsTUFBTSxPQUFPLFdBQVc7SUFDdEIsZ0JBQWUsQ0FBQztJQUVoQixPQUFPO1FBQ0wsT0FBTyxzQ0FBc0MsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDbkUsc0NBQXNDO1lBQ3RDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUVuQyxzQ0FBc0M7WUFDdEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7WUFFMUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3hCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs0RUFiVSxXQUFXO3VFQUFYLFdBQVcsV0FBWCxXQUFXLG1CQUZWLE1BQU07O2lGQUVQLFdBQVc7Y0FIdkIsVUFBVTtlQUFDO2dCQUNWLFVBQVUsRUFBRSxNQUFNO2FBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgVXVpZFNlcnZpY2Uge1xuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgZ2V0VXVpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIChjKSA9PiB7XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYml0d2lzZVxuICAgICAgY29uc3QgciA9IChNYXRoLnJhbmRvbSgpICogMTYpIHwgMDtcblxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWJpdHdpc2VcbiAgICAgIGNvbnN0IHYgPSBjID09PSAneCcgPyByIDogKHIgJiAweDMpIHwgMHg4O1xuXG4gICAgICByZXR1cm4gdi50b1N0cmluZygxNik7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -1,38 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import { TranslateService } from '@ngx-translate/core';
3
- import { BsModalService } from 'ngx-bootstrap/modal';
4
- import { map, mergeMap } from 'rxjs/operators';
5
- import { WarningDialogComponent } from '../warning-dialog/warning-dialog.component';
6
- import * as i0 from "@angular/core";
7
- import * as i1 from "ngx-bootstrap/modal";
8
- import * as i2 from "@ngx-translate/core";
9
- export class WarningDialogService {
10
- constructor(modalService, translateService) {
11
- this.modalService = modalService;
12
- this.translateService = translateService;
13
- }
14
- // Show a warning dialog and return true, when the user clicked OK
15
- show(message) {
16
- return this.translateService.get(message).pipe(map((result) => {
17
- return result;
18
- }), mergeMap((result) => {
19
- const fileDialog = this.modalService.show(WarningDialogComponent, { keyboard: false, ignoreBackdropClick: true });
20
- fileDialog.content.message = result;
21
- return fileDialog.content.onClose.pipe(map((warningResult) => {
22
- if (warningResult === 1) {
23
- return true;
24
- }
25
- return false;
26
- }));
27
- }));
28
- }
29
- static { this.ɵfac = function WarningDialogService_Factory(t) { return new (t || WarningDialogService)(i0.ɵɵinject(i1.BsModalService), i0.ɵɵinject(i2.TranslateService)); }; }
30
- static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: WarningDialogService, factory: WarningDialogService.ɵfac, providedIn: 'root' }); }
31
- }
32
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(WarningDialogService, [{
33
- type: Injectable,
34
- args: [{
35
- providedIn: 'root',
36
- }]
37
- }], () => [{ type: i1.BsModalService }, { type: i2.TranslateService }], null); })();
38
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FybmluZy1kaWFsb2cuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbmVyL3NyYy9saWIvc2VydmljZXMvd2FybmluZy1kaWFsb2cuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVyRCxPQUFPLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDOzs7O0FBS3BGLE1BQU0sT0FBTyxvQkFBb0I7SUFDL0IsWUFBb0IsWUFBNEIsRUFBVSxnQkFBa0M7UUFBeEUsaUJBQVksR0FBWixZQUFZLENBQWdCO1FBQVUscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtJQUFHLENBQUM7SUFFaEcsa0VBQWtFO0lBQ2xFLElBQUksQ0FBQyxPQUFlO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQzVDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ2IsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQyxDQUFDLEVBQ0YsUUFBUSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDbEIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLG1CQUFtQixFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDakgsVUFBVSxDQUFDLE9BQWtDLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztZQUVoRSxPQUFRLFVBQVUsQ0FBQyxPQUFrQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQ2hFLEdBQUcsQ0FBQyxDQUFDLGFBQWEsRUFBRSxFQUFFO2dCQUNwQixJQUFJLGFBQWEsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDeEIsT0FBTyxJQUFJLENBQUM7Z0JBQ2QsQ0FBQztnQkFFRCxPQUFPLEtBQUssQ0FBQztZQUNmLENBQUMsQ0FBQyxDQUNILENBQUM7UUFDSixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztxRkF4QlUsb0JBQW9CO3VFQUFwQixvQkFBb0IsV0FBcEIsb0JBQW9CLG1CQUZuQixNQUFNOztpRkFFUCxvQkFBb0I7Y0FIaEMsVUFBVTtlQUFDO2dCQUNWLFVBQVUsRUFBRSxNQUFNO2FBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgQnNNb2RhbFNlcnZpY2UgfSBmcm9tICduZ3gtYm9vdHN0cmFwL21vZGFsJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCwgbWVyZ2VNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBXYXJuaW5nRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi4vd2FybmluZy1kaWFsb2cvd2FybmluZy1kaWFsb2cuY29tcG9uZW50JztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIFdhcm5pbmdEaWFsb2dTZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBtb2RhbFNlcnZpY2U6IEJzTW9kYWxTZXJ2aWNlLCBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UpIHt9XG5cbiAgLy8gU2hvdyBhIHdhcm5pbmcgZGlhbG9nIGFuZCByZXR1cm4gdHJ1ZSwgd2hlbiB0aGUgdXNlciBjbGlja2VkIE9LXG4gIHNob3cobWVzc2FnZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlU2VydmljZS5nZXQobWVzc2FnZSkucGlwZShcbiAgICAgIG1hcCgocmVzdWx0KSA9PiB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9KSxcbiAgICAgIG1lcmdlTWFwKChyZXN1bHQpID0+IHtcbiAgICAgICAgY29uc3QgZmlsZURpYWxvZyA9IHRoaXMubW9kYWxTZXJ2aWNlLnNob3coV2FybmluZ0RpYWxvZ0NvbXBvbmVudCwgeyBrZXlib2FyZDogZmFsc2UsIGlnbm9yZUJhY2tkcm9wQ2xpY2s6IHRydWUgfSk7XG4gICAgICAgIChmaWxlRGlhbG9nLmNvbnRlbnQgYXMgV2FybmluZ0RpYWxvZ0NvbXBvbmVudCkubWVzc2FnZSA9IHJlc3VsdDtcblxuICAgICAgICByZXR1cm4gKGZpbGVEaWFsb2cuY29udGVudCBhcyBXYXJuaW5nRGlhbG9nQ29tcG9uZW50KS5vbkNsb3NlLnBpcGUoXG4gICAgICAgICAgbWFwKCh3YXJuaW5nUmVzdWx0KSA9PiB7XG4gICAgICAgICAgICBpZiAod2FybmluZ1Jlc3VsdCA9PT0gMSkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cbn1cbiJdfQ==
@@ -1,304 +0,0 @@
1
- import { HttpClient } from '@angular/common/http';
2
- import { Component, HostListener } from '@angular/core';
3
- import { TranslateService } from '@ngx-translate/core';
4
- import { BsModalRef } from 'ngx-bootstrap/modal';
5
- import { ToastrService } from 'ngx-toastr';
6
- import { Subject } from 'rxjs';
7
- import { map } from 'rxjs/operators';
8
- import { ConfigService } from '../../services/config.service';
9
- import { ProjectService } from '../../services/project.service';
10
- import { TimelineService } from '../../services/timeline.service';
11
- import { WarningDialogService } from '../../services/warning-dialog.service';
12
- import * as i0 from "@angular/core";
13
- import * as i1 from "ngx-bootstrap/modal";
14
- import * as i2 from "../../services/timeline.service";
15
- import * as i3 from "../../services/config.service";
16
- import * as i4 from "@ngx-translate/core";
17
- import * as i5 from "@angular/common/http";
18
- import * as i6 from "../../services/warning-dialog.service";
19
- import * as i7 from "ngx-toastr";
20
- import * as i8 from "../../services/project.service";
21
- import * as i9 from "@angular/common";
22
- import * as i10 from "@angular/forms";
23
- import * as i11 from "ngx-bootstrap/typeahead";
24
- import * as i12 from "../../dropzone/dropzone.component";
25
- import * as i13 from "../../array-sort-pipe";
26
- function CompositionSettingsComponent_div_22_div_4_Template(rf, ctx) { if (rf & 1) {
27
- i0.ɵɵelementStart(0, "div");
28
- i0.ɵɵtext(1);
29
- i0.ɵɵpipe(2, "translate");
30
- i0.ɵɵelementEnd();
31
- } if (rf & 2) {
32
- i0.ɵɵadvance();
33
- i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(2, 1, "designer.timeline.composition-no-file-selected"), " ");
34
- } }
35
- function CompositionSettingsComponent_div_22_div_5_Template(rf, ctx) { if (rf & 1) {
36
- i0.ɵɵelementStart(0, "div");
37
- i0.ɵɵtext(1);
38
- i0.ɵɵelementEnd();
39
- } if (rf & 2) {
40
- const ctx_r1 = i0.ɵɵnextContext(2);
41
- i0.ɵɵadvance();
42
- i0.ɵɵtextInterpolate1(" ", ctx_r1.composition.audioFileName, " ");
43
- } }
44
- function CompositionSettingsComponent_div_22_ul_6_Template(rf, ctx) { if (rf & 1) {
45
- i0.ɵɵelementStart(0, "ul", 30)(1, "li", 31)(2, "a", 32);
46
- i0.ɵɵelement(3, "i", 33);
47
- i0.ɵɵtext(4);
48
- i0.ɵɵpipe(5, "translate");
49
- i0.ɵɵelementEnd()();
50
- i0.ɵɵelementStart(6, "li", 31)(7, "a", 34);
51
- i0.ɵɵelement(8, "i", 35);
52
- i0.ɵɵtext(9);
53
- i0.ɵɵpipe(10, "translate");
54
- i0.ɵɵelementEnd()()();
55
- } if (rf & 2) {
56
- i0.ɵɵadvance(4);
57
- i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(5, 2, "designer.timeline.composition-file-upload"), " ");
58
- i0.ɵɵadvance(5);
59
- i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(10, 4, "designer.timeline.composition-file-library"), " ");
60
- } }
61
- function CompositionSettingsComponent_div_22_a_16_Template(rf, ctx) { if (rf & 1) {
62
- const _r3 = i0.ɵɵgetCurrentView();
63
- i0.ɵɵelementStart(0, "a", 36);
64
- i0.ɵɵlistener("click", function CompositionSettingsComponent_div_22_a_16_Template_a_click_0_listener() { const existingFile_r4 = i0.ɵɵrestoreView(_r3).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); ctx_r1.selectExistingFile(existingFile_r4); return i0.ɵɵresetView(false); });
65
- i0.ɵɵelementStart(1, "div", 15)(2, "div", 37);
66
- i0.ɵɵtext(3);
67
- i0.ɵɵelementEnd();
68
- i0.ɵɵelementStart(4, "div", 38);
69
- i0.ɵɵlistener("click", function CompositionSettingsComponent_div_22_a_16_Template_div_click_4_listener() { const existingFile_r4 = i0.ɵɵrestoreView(_r3).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); ctx_r1.deleteFile(existingFile_r4); return i0.ɵɵresetView(false); });
70
- i0.ɵɵelement(5, "i", 39);
71
- i0.ɵɵelementEnd()()();
72
- } if (rf & 2) {
73
- const existingFile_r4 = ctx.$implicit;
74
- const ctx_r1 = i0.ɵɵnextContext(2);
75
- i0.ɵɵclassProp("active", ctx_r1.composition.audioFileName == existingFile_r4);
76
- i0.ɵɵadvance(3);
77
- i0.ɵɵtextInterpolate1(" ", existingFile_r4, " ");
78
- } }
79
- function CompositionSettingsComponent_div_22_Template(rf, ctx) { if (rf & 1) {
80
- const _r1 = i0.ɵɵgetCurrentView();
81
- i0.ɵɵelementStart(0, "div", 15)(1, "div", 16)(2, "div", 17)(3, "div", 18);
82
- i0.ɵɵtemplate(4, CompositionSettingsComponent_div_22_div_4_Template, 3, 3, "div", 19)(5, CompositionSettingsComponent_div_22_div_5_Template, 2, 1, "div", 19);
83
- i0.ɵɵelementEnd()();
84
- i0.ɵɵtemplate(6, CompositionSettingsComponent_div_22_ul_6_Template, 11, 6, "ul", 20);
85
- i0.ɵɵelementStart(7, "div", 21)(8, "div", 22)(9, "app-dropzone", 23);
86
- i0.ɵɵlistener("error", function CompositionSettingsComponent_div_22_Template_app_dropzone_error_9_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onUploadError($event)); })("success", function CompositionSettingsComponent_div_22_Template_app_dropzone_success_9_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onUploadSuccess($event)); })("queuecomplete", function CompositionSettingsComponent_div_22_Template_app_dropzone_queuecomplete_9_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onQueueComplete($event)); })("addedfile", function CompositionSettingsComponent_div_22_Template_app_dropzone_addedfile_9_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onAddedFile($event)); });
87
- i0.ɵɵelementEnd()();
88
- i0.ɵɵelementStart(10, "div", 24)(11, "input", 25);
89
- i0.ɵɵpipe(12, "translate");
90
- i0.ɵɵlistener("input", function CompositionSettingsComponent_div_22_Template_input_input_11_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.filterExistingFiles($event.target.value)); });
91
- i0.ɵɵelementEnd();
92
- i0.ɵɵelementStart(13, "div", 26)(14, "div", 27)(15, "div", 28);
93
- i0.ɵɵtemplate(16, CompositionSettingsComponent_div_22_a_16_Template, 6, 3, "a", 29);
94
- i0.ɵɵpipe(17, "sort");
95
- i0.ɵɵelementEnd()()()()()()();
96
- } if (rf & 2) {
97
- const ctx_r1 = i0.ɵɵnextContext();
98
- i0.ɵɵadvance(4);
99
- i0.ɵɵproperty("ngIf", !ctx_r1.composition.audioFileName);
100
- i0.ɵɵadvance();
101
- i0.ɵɵproperty("ngIf", ctx_r1.composition.audioFileName);
102
- i0.ɵɵadvance();
103
- i0.ɵɵproperty("ngIf", ctx_r1.configService.enableMediaLibrary);
104
- i0.ɵɵadvance(3);
105
- i0.ɵɵproperty("url", ctx_r1.getDropzoneUrl())("acceptedFiles", "audio/*");
106
- i0.ɵɵadvance(2);
107
- i0.ɵɵpropertyInterpolate("placeholder", i0.ɵɵpipeBind1(12, 7, "designer.misc.search"));
108
- i0.ɵɵadvance(5);
109
- i0.ɵɵproperty("ngForOf", i0.ɵɵpipeBind2(17, 9, ctx_r1.filteredExistingFiles, "name"));
110
- } }
111
- export class CompositionSettingsComponent {
112
- constructor(bsModalRef, timelineService, configService, translateService, http, warningDialogService, toastrService, projectService) {
113
- this.bsModalRef = bsModalRef;
114
- this.timelineService = timelineService;
115
- this.configService = configService;
116
- this.translateService = translateService;
117
- this.http = http;
118
- this.warningDialogService = warningDialogService;
119
- this.toastrService = toastrService;
120
- this.projectService = projectService;
121
- this.existingCompositionNames = [];
122
- this.onClose = new Subject();
123
- this.existingFiles = [];
124
- this.filteredExistingFiles = [];
125
- this.uploading = false;
126
- }
127
- ngOnInit() {
128
- this.loadFiles();
129
- if (this.timelineService.externalCompositionsAvailable) {
130
- this.timelineService.getExternalCompositionNames().subscribe((compositionNames) => {
131
- this.existingCompositionNames = compositionNames;
132
- });
133
- }
134
- }
135
- getDropzoneUrl() {
136
- const projectId = this.projectService.project.id ? this.projectService.project.id : '';
137
- return 'file/upload?compositionUuid=' + this.composition.uuid + '&projectId=' + projectId;
138
- }
139
- ok() {
140
- this.onClose.next(1);
141
- this.bsModalRef.hide();
142
- }
143
- cancel() {
144
- this.onClose.next(2);
145
- this.bsModalRef.hide();
146
- }
147
- handleKeyboardEvent(event) {
148
- this.ok();
149
- }
150
- getNameFromFile(data) {
151
- return data.name;
152
- }
153
- loadFiles() {
154
- if (!this.configService.enableMediaLibrary) {
155
- return;
156
- }
157
- this.http
158
- .get('file/list')
159
- .pipe(map((response) => {
160
- this.existingFiles = [];
161
- for (const file of response) {
162
- // only load audio files
163
- if (file.audioFile) {
164
- this.existingFiles.push(this.getNameFromFile(file.audioFile));
165
- }
166
- }
167
- this.filterExistingFiles();
168
- }))
169
- .subscribe();
170
- }
171
- onUploadError(args) {
172
- const msg = 'designer.misc.toast-upload-error';
173
- const title = 'designer.misc.toast-upload-error-title';
174
- this.translateService.get([msg, title]).subscribe((result) => {
175
- this.toastrService.error(result[msg] + args[1], result[title], { timeOut: 0, extendedTimeOut: 0, enableHtml: true });
176
- // Hide the preview element
177
- args[0].previewElement.hidden = true;
178
- });
179
- }
180
- onUploadSuccess(args) {
181
- this.loadFiles();
182
- // allow to guess the bpm of the newly uploaded file
183
- this.composition.tempoGuessed = false;
184
- // hide the preview element
185
- args[0].previewElement.hidden = true;
186
- // select this file
187
- this.composition.audioFileName = args[0].name;
188
- if (this.configService.enableMediaLibrary) {
189
- // the file has been uploaded to the media library
190
- this.composition.audioFileInLibrary = true;
191
- }
192
- }
193
- onQueueComplete(args) {
194
- this.uploading = false;
195
- }
196
- onAddedFile(args) {
197
- this.uploading = true;
198
- }
199
- // Filter the existing files
200
- filterExistingFiles(searchValue) {
201
- if (!searchValue) {
202
- this.filteredExistingFiles = this.existingFiles;
203
- return;
204
- }
205
- this.filteredExistingFiles = [];
206
- for (const file of this.existingFiles) {
207
- if (file.toLowerCase().indexOf(searchValue.toLowerCase()) !== -1) {
208
- this.filteredExistingFiles.push(file);
209
- }
210
- }
211
- }
212
- selectExistingFile(existingFile) {
213
- this.composition.audioFileName = existingFile;
214
- // the file has been selected from the media library
215
- this.composition.audioFileInLibrary = true;
216
- }
217
- deleteFile(existingFile) {
218
- this.warningDialogService
219
- .show('designer.timeline.warning-delete-file')
220
- .pipe(map((result) => {
221
- if (result) {
222
- this.http
223
- .post('file/delete?name=' + existingFile + '&type=AUDIO', undefined)
224
- .pipe(map((response) => {
225
- this.loadFiles();
226
- }))
227
- .subscribe();
228
- }
229
- }))
230
- .subscribe();
231
- }
232
- static { this.ɵfac = function CompositionSettingsComponent_Factory(t) { return new (t || CompositionSettingsComponent)(i0.ɵɵdirectiveInject(i1.BsModalRef), i0.ɵɵdirectiveInject(i2.TimelineService), i0.ɵɵdirectiveInject(i3.ConfigService), i0.ɵɵdirectiveInject(i4.TranslateService), i0.ɵɵdirectiveInject(i5.HttpClient), i0.ɵɵdirectiveInject(i6.WarningDialogService), i0.ɵɵdirectiveInject(i7.ToastrService), i0.ɵɵdirectiveInject(i8.ProjectService)); }; }
233
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CompositionSettingsComponent, selectors: [["lib-app-composition-settings"]], hostBindings: function CompositionSettingsComponent_HostBindings(rf, ctx) { if (rf & 1) {
234
- i0.ɵɵlistener("keydown.enter", function CompositionSettingsComponent_keydown_enter_HostBindingHandler($event) { return ctx.handleKeyboardEvent($event); }, false, i0.ɵɵresolveDocument);
235
- } }, decls: 30, vars: 21, consts: [[1, "modal-header"], [1, "modal-title", "pull-left"], ["type", "button", "aria-label", "Close", 1, "close", "pull-right", 3, "click"], ["aria-hidden", "true"], [1, "modal-body"], [1, "form-group", "row"], [1, "col-lg-4", "col-form-label"], [1, "col-lg-8", "d-flex"], ["type", "text", 1, "form-control", 3, "ngModelChange", "ngModel", "typeahead"], [1, "custom-select", 3, "ngModelChange", "ngModel"], ["value", "audio"], ["class", "row", 4, "ngIf"], [1, "modal-footer"], ["href", "#", "role", "button", 1, "mr-3", "my-auto", 3, "click"], ["type", "button", 1, "btn", "btn-primary", 3, "click", "disabled"], [1, "row"], [1, "px-3", "w-100"], [1, "card", "border-secondary", "mb-3"], [1, "card-body"], [4, "ngIf"], ["class", "nav nav-tabs mb-3", "id", "myTab", "role", "tablist", 4, "ngIf"], ["id", "myTabContent", 1, "tab-content"], ["id", "upload", "role", "tabpanel", 1, "tab-pane", "fade", "show", "active"], [3, "error", "success", "queuecomplete", "addedfile", "url", "acceptedFiles"], ["id", "media-library", "role", "tabpanel", 1, "tab-pane", "fade"], ["type", "text", "id", "searchFileList", 1, "form-control", "input-block", "mb-3", 3, "input", "placeholder"], [1, "card", "border-secondary", 2, "height", "200px", "overflow-y", "scroll"], [1, "card-body", "p-0"], [1, "list-group", "list-group-flush"], ["class", "list-group-item", "href", "#", 3, "active", "click", 4, "ngFor", "ngForOf"], ["id", "myTab", "role", "tablist", 1, "nav", "nav-tabs", "mb-3"], [1, "nav-item"], ["id", "upload-tab", "data-toggle", "tab", "href", "#upload", "role", "tab", 1, "nav-link", "active"], ["aria-hidden", "true", 1, "fa", "fa-upload"], ["id", "media-library-tab", "data-toggle", "tab", "href", "#media-library", "role", "tab", 1, "nav-link"], ["aria-hidden", "true", 1, "fa", "fa-folder-o"], ["href", "#", 1, "list-group-item", 3, "click"], [1, "col-auto", "my-auto", "flex-grow", "text-break-word"], [1, "col-auto", "my-auto", "pl-0", "text-danger", "float-right", 3, "click"], ["aria-hidden", "true", 1, "fa", "fa-trash-o"]], template: function CompositionSettingsComponent_Template(rf, ctx) { if (rf & 1) {
236
- i0.ɵɵelementStart(0, "div", 0)(1, "h4", 1);
237
- i0.ɵɵtext(2);
238
- i0.ɵɵelementEnd();
239
- i0.ɵɵelementStart(3, "button", 2);
240
- i0.ɵɵlistener("click", function CompositionSettingsComponent_Template_button_click_3_listener() { return ctx.bsModalRef.hide(); });
241
- i0.ɵɵelementStart(4, "span", 3);
242
- i0.ɵɵtext(5, "\u00D7");
243
- i0.ɵɵelementEnd()()();
244
- i0.ɵɵelementStart(6, "div", 4)(7, "div", 5)(8, "label", 6);
245
- i0.ɵɵtext(9);
246
- i0.ɵɵpipe(10, "translate");
247
- i0.ɵɵelementEnd();
248
- i0.ɵɵelementStart(11, "div", 7)(12, "input", 8);
249
- i0.ɵɵlistener("ngModelChange", function CompositionSettingsComponent_Template_input_ngModelChange_12_listener($event) { return ctx.composition.name = $event; });
250
- i0.ɵɵelementEnd()()();
251
- i0.ɵɵelementStart(13, "div", 5)(14, "label", 6);
252
- i0.ɵɵtext(15);
253
- i0.ɵɵpipe(16, "translate");
254
- i0.ɵɵelementEnd();
255
- i0.ɵɵelementStart(17, "div", 7)(18, "select", 9);
256
- i0.ɵɵlistener("ngModelChange", function CompositionSettingsComponent_Template_select_ngModelChange_18_listener($event) { return ctx.composition.syncType = $event; });
257
- i0.ɵɵelementStart(19, "option", 10);
258
- i0.ɵɵtext(20);
259
- i0.ɵɵpipe(21, "translate");
260
- i0.ɵɵelementEnd()()()();
261
- i0.ɵɵtemplate(22, CompositionSettingsComponent_div_22_Template, 18, 12, "div", 11);
262
- i0.ɵɵelementEnd();
263
- i0.ɵɵelementStart(23, "div", 12)(24, "a", 13);
264
- i0.ɵɵlistener("click", function CompositionSettingsComponent_Template_a_click_24_listener() { ctx.cancel(); return false; });
265
- i0.ɵɵtext(25);
266
- i0.ɵɵpipe(26, "translate");
267
- i0.ɵɵelementEnd();
268
- i0.ɵɵelementStart(27, "button", 14);
269
- i0.ɵɵlistener("click", function CompositionSettingsComponent_Template_button_click_27_listener() { return ctx.ok(); });
270
- i0.ɵɵtext(28);
271
- i0.ɵɵpipe(29, "translate");
272
- i0.ɵɵelementEnd()();
273
- } if (rf & 2) {
274
- i0.ɵɵadvance(2);
275
- i0.ɵɵtextInterpolate(ctx.composition.name);
276
- i0.ɵɵadvance(7);
277
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(10, 11, "designer.timeline.composition-name"));
278
- i0.ɵɵadvance(3);
279
- i0.ɵɵproperty("ngModel", ctx.composition.name)("typeahead", ctx.existingCompositionNames);
280
- i0.ɵɵadvance(3);
281
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(16, 13, "designer.timeline.composition-sync-type"));
282
- i0.ɵɵadvance(3);
283
- i0.ɵɵproperty("ngModel", ctx.composition.syncType);
284
- i0.ɵɵadvance(2);
285
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(21, 15, "designer.timeline.composition-sync-type-audio"));
286
- i0.ɵɵadvance(2);
287
- i0.ɵɵproperty("ngIf", ctx.composition.syncType == "audio");
288
- i0.ɵɵadvance(3);
289
- i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(26, 17, "designer.misc.cancel"), " ");
290
- i0.ɵɵadvance(2);
291
- i0.ɵɵproperty("disabled", ctx.uploading);
292
- i0.ɵɵadvance();
293
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(29, 19, "designer.misc.ok"));
294
- } }, dependencies: [i9.NgForOf, i9.NgIf, i10.NgSelectOption, i10.ɵNgSelectMultipleOption, i10.DefaultValueAccessor, i10.SelectControlValueAccessor, i10.NgControlStatus, i10.NgModel, i11.TypeaheadDirective, i12.DropzoneComponent, i4.TranslatePipe, i13.ArraySortPipe] }); }
295
- }
296
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(CompositionSettingsComponent, [{
297
- type: Component,
298
- args: [{ selector: 'lib-app-composition-settings', template: "<div class=\"modal-header\">\n <h4 class=\"modal-title pull-left\">{{ composition.name }}</h4>\n <button type=\"button\" class=\"close pull-right\" aria-label=\"Close\" (click)=\"bsModalRef.hide()\">\n <span aria-hidden=\"true\">&times;</span>\n </button>\n</div>\n<div class=\"modal-body\">\n <div class=\"form-group row\">\n <label class=\"col-lg-4 col-form-label\">{{ 'designer.timeline.composition-name' | translate }}</label>\n <div class=\"col-lg-8 d-flex\">\n <input\n type=\"text\"\n class=\"form-control\"\n [ngModel]=\"composition.name\"\n (ngModelChange)=\"composition.name = $event\"\n [typeahead]=\"existingCompositionNames\"\n />\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-lg-4 col-form-label\">{{ 'designer.timeline.composition-sync-type' | translate }}</label>\n <div class=\"col-lg-8 d-flex\">\n <select class=\"custom-select\" [ngModel]=\"composition.syncType\" (ngModelChange)=\"composition.syncType = $event\">\n <!-- TODO -->\n <!-- <option value=\"none\">{{ 'designer.timeline.composition-sync-type-none' | translate }}</option> -->\n <option value=\"audio\">{{ 'designer.timeline.composition-sync-type-audio' | translate }}</option>\n </select>\n </div>\n </div>\n\n <div *ngIf=\"composition.syncType == 'audio'\" class=\"row\">\n <div class=\"px-3 w-100\">\n <!-- Selected file -->\n <div class=\"card border-secondary mb-3\">\n <div class=\"card-body\">\n <!-- No file selected -->\n <div *ngIf=\"!composition.audioFileName\">\n {{ 'designer.timeline.composition-no-file-selected' | translate }}\n </div>\n\n <!-- A file is selected -->\n <div *ngIf=\"composition.audioFileName\">\n {{ composition.audioFileName }}\n </div>\n </div>\n </div>\n\n <!-- Choose file -->\n <ul *ngIf=\"configService.enableMediaLibrary\" class=\"nav nav-tabs mb-3\" id=\"myTab\" role=\"tablist\">\n <li class=\"nav-item\">\n <a class=\"nav-link active\" id=\"upload-tab\" data-toggle=\"tab\" href=\"#upload\" role=\"tab\">\n <i class=\"fa fa-upload\" aria-hidden=\"true\"></i>\n {{ 'designer.timeline.composition-file-upload' | translate }}\n </a>\n </li>\n <li class=\"nav-item\">\n <a class=\"nav-link\" id=\"media-library-tab\" data-toggle=\"tab\" href=\"#media-library\" role=\"tab\">\n <i class=\"fa fa-folder-o\" aria-hidden=\"true\"></i>\n {{ 'designer.timeline.composition-file-library' | translate }}\n </a>\n </li>\n </ul>\n\n <div class=\"tab-content\" id=\"myTabContent\">\n <!-- Upload -->\n <div class=\"tab-pane fade show active\" id=\"upload\" role=\"tabpanel\">\n <app-dropzone\n [url]=\"getDropzoneUrl()\"\n [acceptedFiles]=\"'audio/*'\"\n (error)=\"onUploadError($event)\"\n (success)=\"onUploadSuccess($event)\"\n (queuecomplete)=\"onQueueComplete($event)\"\n (addedfile)=\"onAddedFile($event)\"\n ></app-dropzone>\n </div>\n\n <!-- Media library -->\n <div class=\"tab-pane fade\" id=\"media-library\" role=\"tabpanel\">\n <input\n type=\"text\"\n class=\"form-control input-block mb-3\"\n id=\"searchFileList\"\n placeholder=\"{{ 'designer.misc.search' | translate }}\"\n (input)=\"filterExistingFiles($event.target.value)\"\n />\n\n <div class=\"card border-secondary\" style=\"height: 200px; overflow-y: scroll\">\n <div class=\"card-body p-0\">\n <div class=\"list-group list-group-flush\">\n <a\n *ngFor=\"let existingFile of filteredExistingFiles | sort : 'name'\"\n class=\"list-group-item\"\n [class.active]=\"composition.audioFileName == existingFile\"\n href=\"#\"\n (click)=\"selectExistingFile(existingFile); (false)\"\n >\n <div class=\"row\">\n <div class=\"col-auto my-auto flex-grow text-break-word\">\n {{ existingFile }}\n </div>\n\n <div class=\"col-auto my-auto pl-0 text-danger float-right\" (click)=\"deleteFile(existingFile); (false)\">\n <i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </div>\n </div>\n </a>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n<div class=\"modal-footer\">\n <a class=\"mr-3 my-auto\" href=\"#\" role=\"button\" (click)=\"cancel(); (false)\">\n {{ 'designer.misc.cancel' | translate }}\n </a>\n <button [disabled]=\"uploading\" type=\"button\" class=\"btn btn-primary\" (click)=\"ok()\">{{ 'designer.misc.ok' | translate }}</button>\n</div>\n" }]
299
- }], () => [{ type: i1.BsModalRef }, { type: i2.TimelineService }, { type: i3.ConfigService }, { type: i4.TranslateService }, { type: i5.HttpClient }, { type: i6.WarningDialogService }, { type: i7.ToastrService }, { type: i8.ProjectService }], { handleKeyboardEvent: [{
300
- type: HostListener,
301
- args: ['document:keydown.enter', ['$event']]
302
- }] }); })();
303
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CompositionSettingsComponent, { className: "CompositionSettingsComponent" }); })();
304
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9zaXRpb24tc2V0dGluZ3MuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGVzaWduZXIvc3JjL2xpYi90aW1lbGluZS9jb21wb3NpdGlvbi1zZXR0aW5ncy9jb21wb3NpdGlvbi1zZXR0aW5ncy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXNpZ25lci9zcmMvbGliL3RpbWVsaW5lL2NvbXBvc2l0aW9uLXNldHRpbmdzL2NvbXBvc2l0aW9uLXNldHRpbmdzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNoRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFakQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUMzQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVyQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNsRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7OztJQ3lCbkUsMkJBQXdDO0lBQ3RDLFlBQ0Y7O0lBQUEsaUJBQU07O0lBREosY0FDRjtJQURFLHVHQUNGOzs7SUFHQSwyQkFBdUM7SUFD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LFNBQUcsS0FBSyxJQUFFO1lBQ3hFLGFBQ0Y7O1lBQUEsaUJBQUk7WUFDSixtQ0FBb0Y7WUFBZiwwR0FBUyxRQUFJLElBQUM7WUFBQyxhQUFvQzs7WUFDMUgsQUFEMEgsaUJBQVMsRUFDN0g7O1lBdkg4QixlQUFzQjtZQUF0QiwwQ0FBc0I7WUFPZixlQUFzRDtZQUF0RCxrRkFBc0Q7WUFLekYsZUFBNEI7WUFFNUIsQUFGQSw4Q0FBNEIsMkNBRVU7WUFNSCxlQUEyRDtZQUEzRCx1RkFBMkQ7WUFFbEUsZUFBZ0M7WUFBaEMsa0RBQWdDO1lBR3RDLGVBQWlFO1lBQWpFLDZGQUFpRTtZQUt2RixlQUFxQztZQUFyQywwREFBcUM7WUFzRnpDLGVBQ0Y7WUFERSwrRUFDRjtZQUNRLGVBQXNCO1lBQXRCLHdDQUFzQjtZQUFzRCxjQUFvQztZQUFwQyxnRUFBb0M7OztpRkRwRzdHLDRCQUE0QjtjQUx4QyxTQUFTOzJCQUNFLDhCQUE4Qjt5UEF1RHhDLG1CQUFtQjtrQkFEbEIsWUFBWTttQkFBQyx3QkFBd0IsRUFBRSxDQUFDLFFBQVEsQ0FBQzs7a0ZBbER2Qyw0QkFBNEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBIb3N0TGlzdGVuZXIsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgQnNNb2RhbFJlZiB9IGZyb20gJ25neC1ib290c3RyYXAvbW9kYWwnO1xuaW1wb3J0IHsgRHJvcHpvbmVDb25maWdJbnRlcmZhY2UgfSBmcm9tICduZ3gtZHJvcHpvbmUtd3JhcHBlcic7XG5pbXBvcnQgeyBUb2FzdHJTZXJ2aWNlIH0gZnJvbSAnbmd4LXRvYXN0cic7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBDb21wb3NpdGlvbiB9IGZyb20gJy4uLy4uL21vZGVscy9jb21wb3NpdGlvbic7XG5pbXBvcnQgeyBDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY29uZmlnLnNlcnZpY2UnO1xuaW1wb3J0IHsgUHJvamVjdFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9wcm9qZWN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgVGltZWxpbmVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdGltZWxpbmUuc2VydmljZSc7XG5pbXBvcnQgeyBXYXJuaW5nRGlhbG9nU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3dhcm5pbmctZGlhbG9nLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItYXBwLWNvbXBvc2l0aW9uLXNldHRpbmdzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NvbXBvc2l0aW9uLXNldHRpbmdzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY29tcG9zaXRpb24tc2V0dGluZ3MuY29tcG9uZW50LmNzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBDb21wb3NpdGlvblNldHRpbmdzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgY29tcG9zaXRpb246IENvbXBvc2l0aW9uO1xuICBleGlzdGluZ0NvbXBvc2l0aW9uTmFtZXM6IHN0cmluZ1tdID0gW107XG5cbiAgcHVibGljIG9uQ2xvc2U6IFN1YmplY3Q8bnVtYmVyPiA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgcHVibGljIGRyb3B6b25lQ29uZmlnOiBEcm9wem9uZUNvbmZpZ0ludGVyZmFjZTtcbiAgcHVibGljIHVwbG9hZE1lc3NhZ2U6IHN0cmluZztcblxuICBwdWJsaWMgZXhpc3RpbmdGaWxlczogc3RyaW5nW10gPSBbXTtcbiAgcHVibGljIGZpbHRlcmVkRXhpc3RpbmdGaWxlczogc3RyaW5nW10gPSBbXTtcblxuICBwdWJsaWMgdXBsb2FkaW5nID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGJzTW9kYWxSZWY6IEJzTW9kYWxSZWYsXG4gICAgcHJpdmF0ZSB0aW1lbGluZVNlcnZpY2U6IFRpbWVsaW5lU2VydmljZSxcbiAgICBwdWJsaWMgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZSxcbiAgICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxuICAgIHByaXZhdGUgd2FybmluZ0RpYWxvZ1NlcnZpY2U6IFdhcm5pbmdEaWFsb2dTZXJ2aWNlLFxuICAgIHByaXZhdGUgdG9hc3RyU2VydmljZTogVG9hc3RyU2VydmljZSxcbiAgICBwdWJsaWMgcHJvamVjdFNlcnZpY2U6IFByb2plY3RTZXJ2aWNlXG4gICkge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmxvYWRGaWxlcygpO1xuXG4gICAgaWYgKHRoaXMudGltZWxpbmVTZXJ2aWNlLmV4dGVybmFsQ29tcG9zaXRpb25zQXZhaWxhYmxlKSB7XG4gICAgICB0aGlzLnRpbWVsaW5lU2VydmljZS5nZXRFeHRlcm5hbENvbXBvc2l0aW9uTmFtZXMoKS5zdWJzY3JpYmUoKGNvbXBvc2l0aW9uTmFtZXMpID0+IHtcbiAgICAgICAgdGhpcy5leGlzdGluZ0NvbXBvc2l0aW9uTmFtZXMgPSBjb21wb3NpdGlvbk5hbWVzO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0RHJvcHpvbmVVcmwoKSB7XG4gICAgY29uc3QgcHJvamVjdElkID0gdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LmlkID8gdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LmlkIDogJyc7XG4gICAgcmV0dXJuICdmaWxlL3VwbG9hZD9jb21wb3NpdGlvblV1aWQ9JyArIHRoaXMuY29tcG9zaXRpb24udXVpZCArICcmcHJvamVjdElkPScgKyBwcm9qZWN0SWQ7XG4gIH1cblxuICBvaygpIHtcbiAgICB0aGlzLm9uQ2xvc2UubmV4dCgxKTtcbiAgICB0aGlzLmJzTW9kYWxSZWYuaGlkZSgpO1xuICB9XG5cbiAgY2FuY2VsKCkge1xuICAgIHRoaXMub25DbG9zZS5uZXh0KDIpO1xuICAgIHRoaXMuYnNNb2RhbFJlZi5oaWRlKCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXlkb3duLmVudGVyJywgWyckZXZlbnQnXSlcbiAgaGFuZGxlS2V5Ym9hcmRFdmVudChldmVudDogYW55KSB7XG4gICAgdGhpcy5vaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXROYW1lRnJvbUZpbGUoZGF0YTogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gZGF0YS5uYW1lO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkRmlsZXMoKSB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZ1NlcnZpY2UuZW5hYmxlTWVkaWFMaWJyYXJ5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5odHRwXG4gICAgICAuZ2V0KCdmaWxlL2xpc3QnKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgocmVzcG9uc2U6IG9iamVjdFtdKSA9PiB7XG4gICAgICAgICAgdGhpcy5leGlzdGluZ0ZpbGVzID0gW107XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgcmVzcG9uc2UpIHtcbiAgICAgICAgICAgIC8vIG9ubHkgbG9hZCBhdWRpbyBmaWxlc1xuICAgICAgICAgICAgaWYgKChmaWxlIGFzIGFueSkuYXVkaW9GaWxlKSB7XG4gICAgICAgICAgICAgIHRoaXMuZXhpc3RpbmdGaWxlcy5wdXNoKHRoaXMuZ2V0TmFtZUZyb21GaWxlKChmaWxlIGFzIGFueSkuYXVkaW9GaWxlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5maWx0ZXJFeGlzdGluZ0ZpbGVzKCk7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwdWJsaWMgb25VcGxvYWRFcnJvcihhcmdzOiBhbnkpIHtcbiAgICBjb25zdCBtc2cgPSAnZGVzaWduZXIubWlzYy50b2FzdC11cGxvYWQtZXJyb3InO1xuICAgIGNvbnN0IHRpdGxlID0gJ2Rlc2lnbmVyLm1pc2MudG9hc3QtdXBsb2FkLWVycm9yLXRpdGxlJztcbiAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuZ2V0KFttc2csIHRpdGxlXSkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgIHRoaXMudG9hc3RyU2VydmljZS5lcnJvcihyZXN1bHRbbXNnXSArIGFyZ3NbMV0sIHJlc3VsdFt0aXRsZV0sIHsgdGltZU91dDogMCwgZXh0ZW5kZWRUaW1lT3V0OiAwLCBlbmFibGVIdG1sOiB0cnVlIH0pO1xuICAgICAgLy8gSGlkZSB0aGUgcHJldmlldyBlbGVtZW50XG4gICAgICBhcmdzWzBdLnByZXZpZXdFbGVtZW50LmhpZGRlbiA9IHRydWU7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgb25VcGxvYWRTdWNjZXNzKGFyZ3M6IGFueSkge1xuICAgIHRoaXMubG9hZEZpbGVzKCk7XG5cbiAgICAvLyBhbGxvdyB0byBndWVzcyB0aGUgYnBtIG9mIHRoZSBuZXdseSB1cGxvYWRlZCBmaWxlXG4gICAgdGhpcy5jb21wb3NpdGlvbi50ZW1wb0d1ZXNzZWQgPSBmYWxzZTtcblxuICAgIC8vIGhpZGUgdGhlIHByZXZpZXcgZWxlbWVudFxuICAgIGFyZ3NbMF0ucHJldmlld0VsZW1lbnQuaGlkZGVuID0gdHJ1ZTtcblxuICAgIC8vIHNlbGVjdCB0aGlzIGZpbGVcbiAgICB0aGlzLmNvbXBvc2l0aW9uLmF1ZGlvRmlsZU5hbWUgPSBhcmdzWzBdLm5hbWU7XG5cbiAgICBpZiAodGhpcy5jb25maWdTZXJ2aWNlLmVuYWJsZU1lZGlhTGlicmFyeSkge1xuICAgICAgLy8gdGhlIGZpbGUgaGFzIGJlZW4gdXBsb2FkZWQgdG8gdGhlIG1lZGlhIGxpYnJhcnlcbiAgICAgIHRoaXMuY29tcG9zaXRpb24uYXVkaW9GaWxlSW5MaWJyYXJ5ID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25RdWV1ZUNvbXBsZXRlKGFyZ3M6IGFueSkge1xuICAgIHRoaXMudXBsb2FkaW5nID0gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgb25BZGRlZEZpbGUoYXJnczogYW55KSB7XG4gICAgdGhpcy51cGxvYWRpbmcgPSB0cnVlO1xuICB9XG5cbiAgLy8gRmlsdGVyIHRoZSBleGlzdGluZyBmaWxlc1xuICBmaWx0ZXJFeGlzdGluZ0ZpbGVzKHNlYXJjaFZhbHVlPzogc3RyaW5nKSB7XG4gICAgaWYgKCFzZWFyY2hWYWx1ZSkge1xuICAgICAgdGhpcy5maWx0ZXJlZEV4aXN0aW5nRmlsZXMgPSB0aGlzLmV4aXN0aW5nRmlsZXM7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5maWx0ZXJlZEV4aXN0aW5nRmlsZXMgPSBbXTtcblxuICAgIGZvciAoY29uc3QgZmlsZSBvZiB0aGlzLmV4aXN0aW5nRmlsZXMpIHtcbiAgICAgIGlmIChmaWxlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihzZWFyY2hWYWx1ZS50b0xvd2VyQ2FzZSgpKSAhPT0gLTEpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJlZEV4aXN0aW5nRmlsZXMucHVzaChmaWxlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzZWxlY3RFeGlzdGluZ0ZpbGUoZXhpc3RpbmdGaWxlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmNvbXBvc2l0aW9uLmF1ZGlvRmlsZU5hbWUgPSBleGlzdGluZ0ZpbGU7XG5cbiAgICAvLyB0aGUgZmlsZSBoYXMgYmVlbiBzZWxlY3RlZCBmcm9tIHRoZSBtZWRpYSBsaWJyYXJ5XG4gICAgdGhpcy5jb21wb3NpdGlvbi5hdWRpb0ZpbGVJbkxpYnJhcnkgPSB0cnVlO1xuICB9XG5cbiAgZGVsZXRlRmlsZShleGlzdGluZ0ZpbGU6IHN0cmluZykge1xuICAgIHRoaXMud2FybmluZ0RpYWxvZ1NlcnZpY2VcbiAgICAgIC5zaG93KCdkZXNpZ25lci50aW1lbGluZS53YXJuaW5nLWRlbGV0ZS1maWxlJylcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKHJlc3VsdCkgPT4ge1xuICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgIHRoaXMuaHR0cFxuICAgICAgICAgICAgICAucG9zdCgnZmlsZS9kZWxldGU/bmFtZT0nICsgZXhpc3RpbmdGaWxlICsgJyZ0eXBlPUFVRElPJywgdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBtYXAoKHJlc3BvbnNlOiBSZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkRmlsZXMoKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cbiAgPGg0IGNsYXNzPVwibW9kYWwtdGl0bGUgcHVsbC1sZWZ0XCI+e3sgY29tcG9zaXRpb24ubmFtZSB9fTwvaDQ+XG4gIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2xvc2UgcHVsbC1yaWdodFwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiIChjbGljayk9XCJic01vZGFsUmVmLmhpZGUoKVwiPlxuICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+XG4gIDwvYnV0dG9uPlxuPC9kaXY+XG48ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxuICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cbiAgICA8bGFiZWwgY2xhc3M9XCJjb2wtbGctNCBjb2wtZm9ybS1sYWJlbFwiPnt7ICdkZXNpZ25lci50aW1lbGluZS5jb21wb3NpdGlvbi1uYW1lJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgPGRpdiBjbGFzcz1cImNvbC1sZy04IGQtZmxleFwiPlxuICAgICAgPGlucHV0XG4gICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICBbbmdNb2RlbF09XCJjb21wb3NpdGlvbi5uYW1lXCJcbiAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY29tcG9zaXRpb24ubmFtZSA9ICRldmVudFwiXG4gICAgICAgIFt0eXBlYWhlYWRdPVwiZXhpc3RpbmdDb21wb3NpdGlvbk5hbWVzXCJcbiAgICAgIC8+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxuICAgIDxsYWJlbCBjbGFzcz1cImNvbC1sZy00IGNvbC1mb3JtLWxhYmVsXCI+e3sgJ2Rlc2lnbmVyLnRpbWVsaW5lLmNvbXBvc2l0aW9uLXN5bmMtdHlwZScgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgIDxkaXYgY2xhc3M9XCJjb2wtbGctOCBkLWZsZXhcIj5cbiAgICAgIDxzZWxlY3QgY2xhc3M9XCJjdXN0b20tc2VsZWN0XCIgW25nTW9kZWxdPVwiY29tcG9zaXRpb24uc3luY1R5cGVcIiAobmdNb2RlbENoYW5nZSk9XCJjb21wb3NpdGlvbi5zeW5jVHlwZSA9ICRldmVudFwiPlxuICAgICAgICA8IS0tIFRPRE8gLS0+XG4gICAgICAgIDwhLS0gPG9wdGlvbiB2YWx1ZT1cIm5vbmVcIj57eyAnZGVzaWduZXIudGltZWxpbmUuY29tcG9zaXRpb24tc3luYy10eXBlLW5vbmUnIHwgdHJhbnNsYXRlIH19PC9vcHRpb24+IC0tPlxuICAgICAgICA8b3B0aW9uIHZhbHVlPVwiYXVkaW9cIj57eyAnZGVzaWduZXIudGltZWxpbmUuY29tcG9zaXRpb24tc3luYy10eXBlLWF1ZGlvJyB8IHRyYW5zbGF0ZSB9fTwvb3B0aW9uPlxuICAgICAgPC9zZWxlY3Q+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgKm5nSWY9XCJjb21wb3NpdGlvbi5zeW5jVHlwZSA9PSAnYXVkaW8nXCIgY2xhc3M9XCJyb3dcIj5cbiAgICA8ZGl2IGNsYXNzPVwicHgtMyB3LTEwMFwiPlxuICAgICAgPCEtLSBTZWxlY3RlZCBmaWxlIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNhcmQgYm9yZGVyLXNlY29uZGFyeSBtYi0zXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHlcIj5cbiAgICAgICAgICA8IS0tIE5vIGZpbGUgc2VsZWN0ZWQgLS0+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cIiFjb21wb3NpdGlvbi5hdWRpb0ZpbGVOYW1lXCI+XG4gICAgICAgICAgICB7eyAnZGVzaWduZXIudGltZWxpbmUuY29tcG9zaXRpb24tbm8tZmlsZS1zZWxlY3RlZCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gQSBmaWxlIGlzIHNlbGVjdGVkIC0tPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb21wb3NpdGlvbi5hdWRpb0ZpbGVOYW1lXCI+XG4gICAgICAgICAgICB7eyBjb21wb3NpdGlvbi5hdWRpb0ZpbGVOYW1lIH19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gQ2hvb3NlIGZpbGUgLS0+XG4gICAgICA8dWwgKm5nSWY9XCJjb25maWdTZXJ2aWNlLmVuYWJsZU1lZGlhTGlicmFyeVwiIGNsYXNzPVwibmF2IG5hdi10YWJzIG1iLTNcIiBpZD1cIm15VGFiXCIgcm9sZT1cInRhYmxpc3RcIj5cbiAgICAgICAgPGxpIGNsYXNzPVwibmF2LWl0ZW1cIj5cbiAgICAgICAgICA8YSBjbGFzcz1cIm5hdi1saW5rIGFjdGl2ZVwiIGlkPVwidXBsb2FkLXRhYlwiIGRhdGEtdG9nZ2xlPVwidGFiXCIgaHJlZj1cIiN1cGxvYWRcIiByb2xlPVwidGFiXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXVwbG9hZFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgIHt7ICdkZXNpZ25lci50aW1lbGluZS5jb21wb3NpdGlvbi1maWxlLXVwbG9hZCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L2E+XG4gICAgICAgIDwvbGk+XG4gICAgICAgIDxsaSBjbGFzcz1cIm5hdi1pdGVtXCI+XG4gICAgICAgICAgPGEgY2xhc3M9XCJuYXYtbGlua1wiIGlkPVwibWVkaWEtbGlicmFyeS10YWJcIiBkYXRhLXRvZ2dsZT1cInRhYlwiIGhyZWY9XCIjbWVkaWEtbGlicmFyeVwiIHJvbGU9XCJ0YWJcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZm9sZGVyLW9cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICB7eyAnZGVzaWduZXIudGltZWxpbmUuY29tcG9zaXRpb24tZmlsZS1saWJyYXJ5JyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvYT5cbiAgICAgICAgPC9saT5cbiAgICAgIDwvdWw+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0YWItY29udGVudFwiIGlkPVwibXlUYWJDb250ZW50XCI+XG4gICAgICAgIDwhLS0gVXBsb2FkIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGFiLXBhbmUgZmFkZSBzaG93IGFjdGl2ZVwiIGlkPVwidXBsb2FkXCIgcm9sZT1cInRhYnBhbmVsXCI+XG4gICAgICAgICAgPGFwcC1kcm9wem9uZVxuICAgICAgICAgICAgW3VybF09XCJnZXREcm9wem9uZVVybCgpXCJcbiAgICAgICAgICAgIFthY2NlcHRlZEZpbGVzXT1cIidhdWRpby8qJ1wiXG4gICAgICAgICAgICAoZXJyb3IpPVwib25VcGxvYWRFcnJvcigkZXZlbnQpXCJcbiAgICAgICAgICAgIChzdWNjZXNzKT1cIm9uVXBsb2FkU3VjY2VzcygkZXZlbnQpXCJcbiAgICAgICAgICAgIChxdWV1ZWNvbXBsZXRlKT1cIm9uUXVldWVDb21wbGV0ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChhZGRlZGZpbGUpPVwib25BZGRlZEZpbGUoJGV2ZW50KVwiXG4gICAgICAgICAgPjwvYXBwLWRyb3B6b25lPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIE1lZGlhIGxpYnJhcnkgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0YWItcGFuZSBmYWRlXCIgaWQ9XCJtZWRpYS1saWJyYXJ5XCIgcm9sZT1cInRhYnBhbmVsXCI+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBpbnB1dC1ibG9jayBtYi0zXCJcbiAgICAgICAgICAgIGlkPVwic2VhcmNoRmlsZUxpc3RcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyAnZGVzaWduZXIubWlzYy5zZWFyY2gnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgIChpbnB1dCk9XCJmaWx0ZXJFeGlzdGluZ0ZpbGVzKCRldmVudC50YXJnZXQudmFsdWUpXCJcbiAgICAgICAgICAvPlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgYm9yZGVyLXNlY29uZGFyeVwiIHN0eWxlPVwiaGVpZ2h0OiAyMDBweDsgb3ZlcmZsb3cteTogc2Nyb2xsXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IHAtMFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlzdC1ncm91cCBsaXN0LWdyb3VwLWZsdXNoXCI+XG4gICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBleGlzdGluZ0ZpbGUgb2YgZmlsdGVyZWRFeGlzdGluZ0ZpbGVzIHwgc29ydCA6ICduYW1lJ1wiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbVwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImNvbXBvc2l0aW9uLmF1ZGlvRmlsZU5hbWUgPT0gZXhpc3RpbmdGaWxlXCJcbiAgICAgICAgICAgICAgICAgIGhyZWY9XCIjXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RFeGlzdGluZ0ZpbGUoZXhpc3RpbmdGaWxlKTsgKGZhbHNlKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWF1dG8gbXktYXV0byBmbGV4LWdyb3cgdGV4dC1icmVhay13b3JkXCI+XG4gICAgICAgICAgICAgICAgICAgICAge3sgZXhpc3RpbmdGaWxlIH19XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtYXV0byBteS1hdXRvIHBsLTAgdGV4dC1kYW5nZXIgZmxvYXQtcmlnaHRcIiAoY2xpY2spPVwiZGVsZXRlRmlsZShleGlzdGluZ0ZpbGUpOyAoZmFsc2UpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS10cmFzaC1vXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cbiAgPGEgY2xhc3M9XCJtci0zIG15LWF1dG9cIiBocmVmPVwiI1wiIHJvbGU9XCJidXR0b25cIiAoY2xpY2spPVwiY2FuY2VsKCk7IChmYWxzZSlcIj5cbiAgICB7eyAnZGVzaWduZXIubWlzYy5jYW5jZWwnIHwgdHJhbnNsYXRlIH19XG4gIDwvYT5cbiAgPGJ1dHRvbiBbZGlzYWJsZWRdPVwidXBsb2FkaW5nXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgKGNsaWNrKT1cIm9rKClcIj57eyAnZGVzaWduZXIubWlzYy5vaycgfCB0cmFuc2xhdGUgfX08L2J1dHRvbj5cbjwvZGl2PlxuIl19