@thecodeblogs/blog 0.15.5 → 0.19.1

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 (70) hide show
  1. package/fesm2022/thecodeblogs-blog.mjs +2018 -0
  2. package/fesm2022/thecodeblogs-blog.mjs.map +1 -0
  3. package/lib/components/entry-creator/entry-creator.component.d.ts +1 -1
  4. package/lib/components/entry-renderer/entry-renderer.component.d.ts +1 -1
  5. package/lib/components/entry-renderer-wrapper/entry-renderer-wrapper.component.d.ts +1 -1
  6. package/lib/components/entry-selector-dialog/entry-selector-dialog.component.d.ts +1 -1
  7. package/lib/components/entry-summary/entry-summary.component.d.ts +1 -1
  8. package/lib/components/json-renderer/json-renderer.component.d.ts +1 -1
  9. package/lib/components/landing-page/landing-page.component.d.ts +1 -1
  10. package/lib/components/main/main.component.d.ts +1 -1
  11. package/lib/components/media-upload-modal/media-upload-modal.component.d.ts +4 -2
  12. package/lib/components/outline-view/outline-view.component.d.ts +1 -1
  13. package/lib/components/schedule-publish-dialog/schedule-publish-dialog.component.d.ts +1 -1
  14. package/lib/components/side-navigation/side-navigation.component.d.ts +1 -1
  15. package/lib/components/static-html/static-html.component.d.ts +1 -1
  16. package/lib/core.module.d.ts +38 -39
  17. package/lib/pipes/LinkyPipe.d.ts +1 -1
  18. package/lib/pipes/TimeAgoPipe.d.ts +1 -1
  19. package/package.json +22 -26
  20. package/esm2020/lib/components/entry-creator/entry-creator.component.mjs +0 -341
  21. package/esm2020/lib/components/entry-renderer/entry-renderer.component.mjs +0 -108
  22. package/esm2020/lib/components/entry-renderer-wrapper/entry-renderer-wrapper.component.mjs +0 -75
  23. package/esm2020/lib/components/entry-selector-dialog/entry-selector-dialog-data.mjs +0 -3
  24. package/esm2020/lib/components/entry-selector-dialog/entry-selector-dialog.component.mjs +0 -54
  25. package/esm2020/lib/components/entry-summary/entry-summary.component.mjs +0 -28
  26. package/esm2020/lib/components/json-renderer/json-renderer.component.mjs +0 -26
  27. package/esm2020/lib/components/landing-page/landing-page.component.mjs +0 -35
  28. package/esm2020/lib/components/main/main.component.mjs +0 -56
  29. package/esm2020/lib/components/media-upload-modal/media-upload-modal.component.mjs +0 -160
  30. package/esm2020/lib/components/outline-view/outline-view.component.mjs +0 -38
  31. package/esm2020/lib/components/schedule-publish-dialog/schedule-publish-dialog-data.mjs +0 -3
  32. package/esm2020/lib/components/schedule-publish-dialog/schedule-publish-dialog.component.mjs +0 -33
  33. package/esm2020/lib/components/side-navigation/side-navigation.component.mjs +0 -230
  34. package/esm2020/lib/components/static-html/static-html.component.mjs +0 -28
  35. package/esm2020/lib/core.module.mjs +0 -213
  36. package/esm2020/lib/data/base.mjs +0 -7
  37. package/esm2020/lib/data/content-type.mjs +0 -10
  38. package/esm2020/lib/data/content.mjs +0 -5
  39. package/esm2020/lib/data/core-event-type.enum.mjs +0 -7
  40. package/esm2020/lib/data/core-event.mjs +0 -7
  41. package/esm2020/lib/data/entry.mjs +0 -79
  42. package/esm2020/lib/data/guid.mjs +0 -12
  43. package/esm2020/lib/data/identity.mjs +0 -2
  44. package/esm2020/lib/data/list-response.mjs +0 -3
  45. package/esm2020/lib/data/section.mjs +0 -11
  46. package/esm2020/lib/data/tag.mjs +0 -7
  47. package/esm2020/lib/data/visitor-profile.mjs +0 -3
  48. package/esm2020/lib/pipes/LinkyPipe.mjs +0 -15
  49. package/esm2020/lib/pipes/TimeAgoPipe.mjs +0 -100
  50. package/esm2020/lib/routing/routes.mjs +0 -25
  51. package/esm2020/lib/services/analytics/interaction.service.mjs +0 -20
  52. package/esm2020/lib/services/analytics/view.service.mjs +0 -20
  53. package/esm2020/lib/services/comment.service.mjs +0 -28
  54. package/esm2020/lib/services/django-rest-framework-endpoint.service.mjs +0 -50
  55. package/esm2020/lib/services/entry.service.mjs +0 -106
  56. package/esm2020/lib/services/identity.service.mjs +0 -20
  57. package/esm2020/lib/services/interaction.mjs +0 -3
  58. package/esm2020/lib/services/prism.service.mjs +0 -39
  59. package/esm2020/lib/services/static-html.service.mjs +0 -22
  60. package/esm2020/lib/services/tag.service.mjs +0 -33
  61. package/esm2020/lib/services/upload.mjs +0 -3
  62. package/esm2020/lib/services/upload.service.mjs +0 -22
  63. package/esm2020/lib/services/view.mjs +0 -3
  64. package/esm2020/lib/services/visitor-profile.service.mjs +0 -35
  65. package/esm2020/public-api.mjs +0 -45
  66. package/esm2020/thecodeblogs-blog.mjs +0 -5
  67. package/fesm2015/thecodeblogs-blog.mjs +0 -1942
  68. package/fesm2015/thecodeblogs-blog.mjs.map +0 -1
  69. package/fesm2020/thecodeblogs-blog.mjs +0 -1936
  70. package/fesm2020/thecodeblogs-blog.mjs.map +0 -1
@@ -1,160 +0,0 @@
1
- import { Component, HostListener, Input } from '@angular/core';
2
- import { FileUploader } from 'ng2-file-upload';
3
- import { UploadService } from '../../services/upload.service';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "@angular/material/dialog";
6
- import * as i2 from "../../services/upload.service";
7
- import * as i3 from "@angular/common";
8
- import * as i4 from "@angular/material/button";
9
- import * as i5 from "@angular/material/divider";
10
- import * as i6 from "@fortawesome/angular-fontawesome";
11
- import * as i7 from "ng2-file-upload";
12
- export class MediaUploadModalComponent {
13
- static getCookie(name) {
14
- const ca = document.cookie.split(';');
15
- const caLen = ca.length;
16
- const cookieName = `${name}=`;
17
- let c;
18
- for (let i = 0; i < caLen; i += 1) {
19
- c = ca[i].replace(/^\s+/g, '');
20
- if (c.indexOf(cookieName) === 0) {
21
- return c.substring(cookieName.length, c.length);
22
- }
23
- }
24
- return '';
25
- }
26
- constructor(dialogRef, uploadService) {
27
- this.dialogRef = dialogRef;
28
- this.uploadService = uploadService;
29
- this.allowedMimeTypes = [
30
- 'image/jpeg',
31
- 'image/gif',
32
- 'image/png',
33
- 'image/jpg',
34
- 'video/mp4',
35
- 'video/webm',
36
- 'video/ogg',
37
- ];
38
- this.uploadUrlKey = 'path_to_file';
39
- this.uploading = false;
40
- }
41
- pollForCompletion() {
42
- this.uploadService.get(this.uploadId).subscribe((response) => {
43
- if (response.processed) {
44
- this.imgLink = response[this.uploadUrlKey];
45
- this.mimeType = response.mime_type;
46
- clearInterval(this.poller);
47
- this.poller = null;
48
- this.uploading = false;
49
- }
50
- });
51
- }
52
- ngOnInit() {
53
- this.uploader = new FileUploader({
54
- url: UploadService.upload_endpoint,
55
- itemAlias: 'file',
56
- authToken: '',
57
- headers: [
58
- { name: 'X-CSRFToken', value: MediaUploadModalComponent.getCookie('csrftoken') },
59
- ],
60
- additionalParameter: { csrf_token: MediaUploadModalComponent.getCookie('csrftoken') },
61
- removeAfterUpload: true,
62
- allowedMimeType: this.allowedMimeTypes,
63
- });
64
- this.uploader.onCompleteItem = (item, response) => {
65
- const responseObj = JSON.parse(response);
66
- this.uploadId = responseObj.id;
67
- this.poller = setInterval(this.pollForCompletion.bind(this), 2000);
68
- };
69
- this.uploader.onWhenAddingFileFailed = (item, filter, options) => {
70
- this.error = 'This file is not a supported mimetype.';
71
- this.uploading = false;
72
- };
73
- if (this.file) {
74
- this.uploader.addToQueue([this.file]);
75
- this.uploader.uploadAll();
76
- this.uploading = true;
77
- }
78
- }
79
- onFileSelected(e) {
80
- this.uploader.uploadAll();
81
- this.uploading = true;
82
- }
83
- buildHost(url) {
84
- return location.protocol + '//' + location.hostname + (location.port ? ':' + location.port : '') + url;
85
- }
86
- close() {
87
- this.dialogRef.close();
88
- }
89
- ngOnDestroy() {
90
- if (this.socketSub) {
91
- this.socketSub.complete();
92
- this.socketSub = null;
93
- }
94
- }
95
- blobToFile(theBlob, fileName) {
96
- // A Blob() is almost a File() - it's just missing the two properties below which we will add
97
- theBlob.lastModifiedDate = new Date();
98
- theBlob.name = fileName;
99
- return theBlob;
100
- }
101
- onPaste(e) {
102
- if (e instanceof ClipboardEvent) {
103
- const files = e.clipboardData.files;
104
- if (files) {
105
- if (files.length < 1) {
106
- // const items = e.clipboardData.items;
107
- // for(let i = 0; i < items.length; i++) {
108
- // const item = items[i];
109
- // item.getAsString((text) => {
110
- // try {
111
- // const url = new URL(text);
112
- // if(url) {
113
- // fetch(text)
114
- // .then(res => res.blob()) // Gets the response and returns it as a blob
115
- // .then(blob => {
116
- // const file = this.blobToFile(blob, 'web-created')
117
- // this.uploader.addToQueue([file])
118
- // this.uploader.uploadAll();
119
- // this.uploading = true;
120
- // });
121
- // }
122
- // } catch(e) {
123
- //
124
- // }
125
- // });
126
- // }
127
- }
128
- else if (files.length > 1) {
129
- console.log('Multiple files detected');
130
- }
131
- else {
132
- for (let i = 0; i < files.length; i++) {
133
- this.uploader.addToQueue([files[i]]);
134
- }
135
- this.uploader.uploadAll();
136
- this.uploading = true;
137
- }
138
- }
139
- else {
140
- console.log('Stuff not working');
141
- }
142
- }
143
- }
144
- }
145
- MediaUploadModalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.4", ngImport: i0, type: MediaUploadModalComponent, deps: [{ token: i1.MatDialogRef }, { token: i2.UploadService }], target: i0.ɵɵFactoryTarget.Component });
146
- MediaUploadModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.4", type: MediaUploadModalComponent, selector: "app-media-upload-modal", inputs: { allowedMimeTypes: "allowedMimeTypes", uploadUrlKey: "uploadUrlKey", file: "file" }, host: { listeners: { "document:paste": "onPaste($event)" } }, ngImport: i0, template: "<h1 mat-dialog-title>Upload an Image</h1>\n<!--<mat-radio-group aria-label=\"Select an option\">-->\n<!-- <mat-radio-button class=\"option\" value=\"unpublished\">Unpublished</mat-radio-button>-->\n<!-- <mat-radio-button class=\"option\" value=\"published\">Published</mat-radio-button>-->\n<!--</mat-radio-group>-->\n<mat-divider class=\"option-list-divider\"></mat-divider>\n<div mat-dialog-content>\n <div *ngIf=\"uploading\">\n <fa-icon [icon]=\"'spinner'\" [spin]=\"true\"></fa-icon>\n </div>\n <ng-container *ngIf=\"!imgLink && !uploading\">\n <h4>Select a File</h4>\n <div class=\"input-group\">\n <div class=\"form-group\">\n <!-- <label for=\"import_file\">Choose File</label>-->\n <input type=\"file\" id=\"import_file\"\n *ngIf=\"uploader.queue.length==0 && !uploading\"\n ng2FileSelect\n [uploader]=\"uploader\"\n (onFileSelected)=\"onFileSelected($event)\"\n >\n </div>\n </div>\n <br>\n <h3>Paste a File</h3>\n <p>You can use the paste command to paste any image here</p>\n </ng-container>\n <div *ngIf=\"imgLink\">\n <img *ngIf=\"imgLink\" [src]=\"imgLink\"/>\n </div>\n <div *ngIf=\"error\">\n <div class=\"alert alert-danger\">\n {{error}}\n </div>\n </div>\n</div>\n<div mat-dialog-actions>\n <button mat-button [disabled]=\"!imgLink || uploading\" (click)=\"close()\">Attach</button>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i5.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "component", type: i6.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "classes", "transform", "a11yRole"] }, { kind: "directive", type: i7.FileSelectDirective, selector: "[ng2FileSelect]", inputs: ["uploader"], outputs: ["onFileSelected"] }] });
147
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.4", ngImport: i0, type: MediaUploadModalComponent, decorators: [{
148
- type: Component,
149
- args: [{ selector: 'app-media-upload-modal', template: "<h1 mat-dialog-title>Upload an Image</h1>\n<!--<mat-radio-group aria-label=\"Select an option\">-->\n<!-- <mat-radio-button class=\"option\" value=\"unpublished\">Unpublished</mat-radio-button>-->\n<!-- <mat-radio-button class=\"option\" value=\"published\">Published</mat-radio-button>-->\n<!--</mat-radio-group>-->\n<mat-divider class=\"option-list-divider\"></mat-divider>\n<div mat-dialog-content>\n <div *ngIf=\"uploading\">\n <fa-icon [icon]=\"'spinner'\" [spin]=\"true\"></fa-icon>\n </div>\n <ng-container *ngIf=\"!imgLink && !uploading\">\n <h4>Select a File</h4>\n <div class=\"input-group\">\n <div class=\"form-group\">\n <!-- <label for=\"import_file\">Choose File</label>-->\n <input type=\"file\" id=\"import_file\"\n *ngIf=\"uploader.queue.length==0 && !uploading\"\n ng2FileSelect\n [uploader]=\"uploader\"\n (onFileSelected)=\"onFileSelected($event)\"\n >\n </div>\n </div>\n <br>\n <h3>Paste a File</h3>\n <p>You can use the paste command to paste any image here</p>\n </ng-container>\n <div *ngIf=\"imgLink\">\n <img *ngIf=\"imgLink\" [src]=\"imgLink\"/>\n </div>\n <div *ngIf=\"error\">\n <div class=\"alert alert-danger\">\n {{error}}\n </div>\n </div>\n</div>\n<div mat-dialog-actions>\n <button mat-button [disabled]=\"!imgLink || uploading\" (click)=\"close()\">Attach</button>\n</div>\n" }]
150
- }], ctorParameters: function () { return [{ type: i1.MatDialogRef }, { type: i2.UploadService }]; }, propDecorators: { allowedMimeTypes: [{
151
- type: Input
152
- }], uploadUrlKey: [{
153
- type: Input
154
- }], file: [{
155
- type: Input
156
- }], onPaste: [{
157
- type: HostListener,
158
- args: ['document:paste', ['$event']]
159
- }] } });
160
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVkaWEtdXBsb2FkLW1vZGFsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL2xpYi9jb21wb25lbnRzL21lZGlhLXVwbG9hZC1tb2RhbC9tZWRpYS11cGxvYWQtbW9kYWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZS9zcmMvbGliL2NvbXBvbmVudHMvbWVkaWEtdXBsb2FkLW1vZGFsL21lZGlhLXVwbG9hZC1tb2RhbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQW9CLE1BQU0sZUFBZSxDQUFDO0FBQ2hGLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUk3QyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sK0JBQStCLENBQUM7Ozs7Ozs7OztBQU81RCxNQUFNLE9BQU8seUJBQXlCO0lBeUJsQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQVk7UUFDekIsTUFBTSxFQUFFLEdBQWtCLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JELE1BQU0sS0FBSyxHQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUM7UUFDaEMsTUFBTSxVQUFVLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQztRQUM5QixJQUFJLENBQVMsQ0FBQztRQUVkLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUMvQixDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDL0IsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFB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QUE2RjtvQkFDN0Ysc0NBQXNDO29CQUN0Qyw0RUFBNEU7b0JBQzVFLDJEQUEyRDtvQkFDM0QscURBQXFEO29CQUNyRCxpREFBaUQ7b0JBQ2pELDBCQUEwQjtvQkFDMUIsZ0JBQWdCO29CQUNoQix1QkFBdUI7b0JBQ3ZCLEVBQUU7b0JBQ0YsWUFBWTtvQkFDWixVQUFVO29CQUNWLElBQUk7aUJBQ1A7cUJBQU0sSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDekIsT0FBTyxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO2lCQUMxQztxQkFBTTtvQkFDSCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTt3QkFDbkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3FCQUN4QztvQkFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO29CQUMxQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztpQkFDekI7YUFDSjtpQkFBTTtnQkFDSCxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLENBQUM7YUFDcEM7U0FDSjtJQUNMLENBQUM7O3NIQWpLUSx5QkFBeUI7MEdBQXpCLHlCQUF5QiwwTkNadEMsOGpEQXVDQTsyRkQzQmEseUJBQXlCO2tCQUxyQyxTQUFTOytCQUNJLHdCQUF3QjsrSEFNekIsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQVVHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBU0csSUFBSTtzQkFBWixLQUFLO2dCQXFHTixPQUFPO3NCQUROLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgSG9zdExpc3RlbmVyLCBJbnB1dCwgT25Jbml0LCBPbkRlc3Ryb3l9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtGaWxlVXBsb2FkZXJ9IGZyb20gJ25nMi1maWxlLXVwbG9hZCc7XG5pbXBvcnQge01hdERpYWxvZ1JlZn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcblxuaW1wb3J0IHtEamFuZ29SZXN0RnJhbWV3b3JrRW5kcG9pbnRTZXJ2aWNlfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kamFuZ28tcmVzdC1mcmFtZXdvcmstZW5kcG9pbnQuc2VydmljZSc7XG5pbXBvcnQge1VwbG9hZFNlcnZpY2V9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3VwbG9hZC5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdhcHAtbWVkaWEtdXBsb2FkLW1vZGFsJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vbWVkaWEtdXBsb2FkLW1vZGFsLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9tZWRpYS11cGxvYWQtbW9kYWwuY29tcG9uZW50LmNzcyddXG59KVxuZXhwb3J0IGNsYXNzIE1lZGlhVXBsb2FkTW9kYWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgICBASW5wdXQoKSBhbGxvd2VkTWltZVR5cGVzID0gW1xuICAgICAgICAgICAgICAgICdpbWFnZS9qcGVnJyxcbiAgICAgICAgICAgICAgICAnaW1hZ2UvZ2lmJyxcbiAgICAgICAgICAgICAgICAnaW1hZ2UvcG5nJyxcbiAgICAgICAgICAgICAgICAnaW1hZ2UvanBnJyxcbiAgICAgICAgICAgICAgICAndmlkZW8vbXA0JyxcbiAgICAgICAgICAgICAgICAndmlkZW8vd2VibScsXG4gICAgICAgICAgICAgICAgJ3ZpZGVvL29nZycsXG4gICAgXTtcblxuICAgIEBJbnB1dCgpIHVwbG9hZFVybEtleSA9ICdwYXRoX3RvX2ZpbGUnO1xuXG4gICAgaW1nTGluaztcbiAgICBtaW1lVHlwZTtcbiAgICBzb2NrZXRTdWI7XG4gICAgZXJyb3I7XG4gICAgcHVibGljIHVwbG9hZGVyOiBGaWxlVXBsb2FkZXI7XG4gICAgdXBsb2FkSWQ7XG4gICAgdXBsb2FkaW5nID0gZmFsc2U7XG4gICAgQElucHV0KCkgZmlsZTtcblxuICAgIHBvbGxlcjtcblxuICAgIHN0YXRpYyBnZXRDb29raWUobmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGNhOiBBcnJheTxzdHJpbmc+ID0gZG9jdW1lbnQuY29va2llLnNwbGl0KCc7Jyk7XG4gICAgICAgIGNvbnN0IGNhTGVuOiBudW1iZXIgPSBjYS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGNvb2tpZU5hbWUgPSBgJHtuYW1lfT1gO1xuICAgICAgICBsZXQgYzogc3RyaW5nO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2FMZW47IGkgKz0gMSkge1xuICAgICAgICAgICAgYyA9IGNhW2ldLnJlcGxhY2UoL15cXHMrL2csICcnKTtcbiAgICAgICAgICAgIGlmIChjLmluZGV4T2YoY29va2llTmFtZSkgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYy5zdWJzdHJpbmcoY29va2llTmFtZS5sZW5ndGgsIGMubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxNZWRpYVVwbG9hZE1vZGFsQ29tcG9uZW50PixcbiAgICAgICAgcHJpdmF0ZSB1cGxvYWRTZXJ2aWNlOiBVcGxvYWRTZXJ2aWNlXG4gICAgKSB7XG4gICAgfVxuXG5cbiAgICBwb2xsRm9yQ29tcGxldGlvbigpIHtcbiAgICAgICAgdGhpcy51cGxvYWRTZXJ2aWNlLmdldCh0aGlzLnVwbG9hZElkKS5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2UucHJvY2Vzc2VkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbWdMaW5rID0gcmVzcG9uc2VbdGhpcy51cGxvYWRVcmxLZXldO1xuICAgICAgICAgICAgICAgIHRoaXMubWltZVR5cGUgPSByZXNwb25zZS5taW1lX3R5cGU7XG4gICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnBvbGxlcik7XG4gICAgICAgICAgICAgICAgdGhpcy5wb2xsZXIgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG5cbiAgICAgICAgdGhpcy51cGxvYWRlciA9IG5ldyBGaWxlVXBsb2FkZXIoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdXJsOiBVcGxvYWRTZXJ2aWNlLnVwbG9hZF9lbmRwb2ludCxcbiAgICAgICAgICAgICAgICBpdGVtQWxpYXM6ICdmaWxlJyxcbiAgICAgICAgICAgICAgICBhdXRoVG9rZW46ICcnLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IFtcbiAgICAgICAgICAgICAgICAgICAge25hbWU6ICdYLUNTUkZUb2tlbicsIHZhbHVlOiBNZWRpYVVwbG9hZE1vZGFsQ29tcG9uZW50LmdldENvb2tpZSgnY3NyZnRva2VuJyl9LFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgYWRkaXRpb25hbFBhcmFtZXRlcjoge2NzcmZfdG9rZW46IE1lZGlhVXBsb2FkTW9kYWxDb21wb25lbnQuZ2V0Q29va2llKCdjc3JmdG9rZW4nKX0sXG4gICAgICAgICAgICAgICAgcmVtb3ZlQWZ0ZXJVcGxvYWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgYWxsb3dlZE1pbWVUeXBlOiB0aGlzLmFsbG93ZWRNaW1lVHlwZXMsXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy51cGxvYWRlci5vbkNvbXBsZXRlSXRlbSA9IChpdGVtLCByZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VPYmogPSBKU09OLnBhcnNlKHJlc3BvbnNlKTtcbiAgICAgICAgICAgIHRoaXMudXBsb2FkSWQgPSByZXNwb25zZU9iai5pZDtcbiAgICAgICAgICAgIHRoaXMucG9sbGVyID0gc2V0SW50ZXJ2YWwodGhpcy5wb2xsRm9yQ29tcGxldGlvbi5iaW5kKHRoaXMpLCAyMDAwKTtcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnVwbG9hZGVyLm9uV2hlbkFkZGluZ0ZpbGVGYWlsZWQgPSAoaXRlbSwgZmlsdGVyLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVycm9yID0gJ1RoaXMgZmlsZSBpcyBub3QgYSBzdXBwb3J0ZWQgbWltZXR5cGUuJztcbiAgICAgICAgICAgIHRoaXMudXBsb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHRoaXMuZmlsZSkge1xuICAgICAgICAgICAgdGhpcy51cGxvYWRlci5hZGRUb1F1ZXVlKFt0aGlzLmZpbGVdKTtcbiAgICAgICAgICAgIHRoaXMudXBsb2FkZXIudXBsb2FkQWxsKCk7XG4gICAgICAgICAgICB0aGlzLnVwbG9hZGluZyA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkZpbGVTZWxlY3RlZChlKSB7XG4gICAgICAgIHRoaXMudXBsb2FkZXIudXBsb2FkQWxsKCk7XG4gICAgICAgIHRoaXMudXBsb2FkaW5nID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBidWlsZEhvc3QodXJsKSB7XG4gICAgICAgIHJldHVybiBsb2NhdGlvbi5wcm90b2NvbCArICcvLycgKyBsb2NhdGlvbi5ob3N0bmFtZSArIChsb2NhdGlvbi5wb3J0ID8gJzonICsgbG9jYXRpb24ucG9ydCA6ICcnKSArIHVybDtcbiAgICB9XG5cbiAgICBjbG9zZSgpIHtcbiAgICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoKTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc29ja2V0U3ViKSB7XG4gICAgICAgICAgICB0aGlzLnNvY2tldFN1Yi5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgdGhpcy5zb2NrZXRTdWIgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYmxvYlRvRmlsZSh0aGVCbG9iLCBmaWxlTmFtZSkge1xuICAgICAgICAvLyBBIEJsb2IoKSBpcyBhbG1vc3QgYSBGaWxlKCkgLSBpdCdzIGp1c3QgbWlzc2luZyB0aGUgdHdvIHByb3BlcnRpZXMgYmVsb3cgd2hpY2ggd2Ugd2lsbCBhZGRcbiAgICAgICAgdGhlQmxvYi5sYXN0TW9kaWZpZWREYXRlID0gbmV3IERhdGUoKTtcbiAgICAgICAgdGhlQmxvYi5uYW1lID0gZmlsZU5hbWU7XG4gICAgICAgIHJldHVybiB0aGVCbG9iO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OnBhc3RlJywgWyckZXZlbnQnXSlcbiAgICBvblBhc3RlKGUpIHtcbiAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBDbGlwYm9hcmRFdmVudCkge1xuICAgICAgICAgICAgY29uc3QgZmlsZXMgPSBlLmNsaXBib2FyZERhdGEuZmlsZXM7XG4gICAgICAgICAgICBpZiAoZmlsZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoZmlsZXMubGVuZ3RoIDwgMSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zdCBpdGVtcyA9IGUuY2xpcGJvYXJkRGF0YS5pdGVtcztcbiAgICAgICAgICAgICAgICAgICAgLy8gZm9yKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBjb25zdCBpdGVtID0gaXRlbXNbaV07XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBpdGVtLmdldEFzU3RyaW5nKCh0ZXh0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCh0ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgaWYodXJsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICBmZXRjaCh0ZXh0KVxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIC50aGVuKHJlcyA9PiByZXMuYmxvYigpKSAvLyBHZXRzIHRoZSByZXNwb25zZSBhbmQgcmV0dXJucyBpdCBhcyBhIGJsb2JcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAudGhlbihibG9iID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZSA9IHRoaXMuYmxvYlRvRmlsZShibG9iLCAnd2ViLWNyZWF0ZWQnKVxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZGVyLmFkZFRvUXVldWUoW2ZpbGVdKVxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZGVyLnVwbG9hZEFsbCgpO1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlsZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnTXVsdGlwbGUgZmlsZXMgZGV0ZWN0ZWQnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZGVyLmFkZFRvUXVldWUoW2ZpbGVzW2ldXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGxvYWRlci51cGxvYWRBbGwoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGxvYWRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1N0dWZmIG5vdCB3b3JraW5nJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCI8aDEgbWF0LWRpYWxvZy10aXRsZT5VcGxvYWQgYW4gSW1hZ2U8L2gxPlxuPCEtLTxtYXQtcmFkaW8tZ3JvdXAgYXJpYS1sYWJlbD1cIlNlbGVjdCBhbiBvcHRpb25cIj4tLT5cbjwhLS0gICAgPG1hdC1yYWRpby1idXR0b24gY2xhc3M9XCJvcHRpb25cIiB2YWx1ZT1cInVucHVibGlzaGVkXCI+VW5wdWJsaXNoZWQ8L21hdC1yYWRpby1idXR0b24+LS0+XG48IS0tICAgIDxtYXQtcmFkaW8tYnV0dG9uIGNsYXNzPVwib3B0aW9uXCIgdmFsdWU9XCJwdWJsaXNoZWRcIj5QdWJsaXNoZWQ8L21hdC1yYWRpby1idXR0b24+LS0+XG48IS0tPC9tYXQtcmFkaW8tZ3JvdXA+LS0+XG48bWF0LWRpdmlkZXIgY2xhc3M9XCJvcHRpb24tbGlzdC1kaXZpZGVyXCI+PC9tYXQtZGl2aWRlcj5cbjxkaXYgbWF0LWRpYWxvZy1jb250ZW50PlxuICAgIDxkaXYgKm5nSWY9XCJ1cGxvYWRpbmdcIj5cbiAgICAgICAgPGZhLWljb24gW2ljb25dPVwiJ3NwaW5uZXInXCIgW3NwaW5dPVwidHJ1ZVwiPjwvZmEtaWNvbj5cbiAgICA8L2Rpdj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWltZ0xpbmsgJiYgIXVwbG9hZGluZ1wiPlxuICAgICAgICA8aDQ+U2VsZWN0IGEgRmlsZTwvaDQ+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJpbXBvcnRfZmlsZVwiPkNob29zZSBGaWxlPC9sYWJlbD4tLT5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImZpbGVcIiBpZD1cImltcG9ydF9maWxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJ1cGxvYWRlci5xdWV1ZS5sZW5ndGg9PTAgJiYgIXVwbG9hZGluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgIG5nMkZpbGVTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgW3VwbG9hZGVyXT1cInVwbG9hZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgKG9uRmlsZVNlbGVjdGVkKT1cIm9uRmlsZVNlbGVjdGVkKCRldmVudClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGJyPlxuICAgICAgICA8aDM+UGFzdGUgYSBGaWxlPC9oMz5cbiAgICAgICAgPHA+WW91IGNhbiB1c2UgdGhlIHBhc3RlIGNvbW1hbmQgdG8gcGFzdGUgYW55IGltYWdlIGhlcmU8L3A+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPGRpdiAqbmdJZj1cImltZ0xpbmtcIj5cbiAgICAgICAgPGltZyAqbmdJZj1cImltZ0xpbmtcIiBbc3JjXT1cImltZ0xpbmtcIi8+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdJZj1cImVycm9yXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1kYW5nZXJcIj5cbiAgICAgICAgICAgIHt7ZXJyb3J9fVxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuPGRpdiBtYXQtZGlhbG9nLWFjdGlvbnM+XG4gICAgPGJ1dHRvbiBtYXQtYnV0dG9uIFtkaXNhYmxlZF09XCIhaW1nTGluayB8fCB1cGxvYWRpbmdcIiAoY2xpY2spPVwiY2xvc2UoKVwiPkF0dGFjaDwvYnV0dG9uPlxuPC9kaXY+XG4iXX0=
@@ -1,38 +0,0 @@
1
- import { Component } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- import * as i1 from "../../services/entry.service";
4
- import * as i2 from "@angular/common";
5
- import * as i3 from "@angular/cdk/drag-drop";
6
- import * as i4 from "@angular/material/card";
7
- export class OutlineViewComponent {
8
- constructor(entryService) {
9
- this.entryService = entryService;
10
- this.Math = Math;
11
- }
12
- ngOnInit() {
13
- this.entryService.currentlyEditedEntry.subscribe((entry) => {
14
- this.entry = entry;
15
- });
16
- }
17
- sectionDrop(e) {
18
- const entry = this.entry;
19
- const diff = e.currentIndex - e.previousIndex;
20
- entry.sections[e.previousIndex].order = e.currentIndex * 10 + (diff > 0 ? 1 : -1);
21
- entry.sort();
22
- this.entryService.currentlyEditedEntry.next(this.entry);
23
- }
24
- contentDrop(e, section) {
25
- const entry = this.entry;
26
- const diff = e.currentIndex - e.previousIndex;
27
- section.contents[e.previousIndex].order = e.currentIndex * 10 + (diff > 0 ? 1 : -1);
28
- entry.sort();
29
- this.entryService.currentlyEditedEntry.next(this.entry);
30
- }
31
- }
32
- OutlineViewComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.4", ngImport: i0, type: OutlineViewComponent, deps: [{ token: i1.EntryService }], target: i0.ɵɵFactoryTarget.Component });
33
- OutlineViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.4", type: OutlineViewComponent, selector: "app-outline-view", ngImport: i0, template: "<div *ngIf=\"entry\" class=\"section outline\">\n <h1 *ngIf=\"entry?.sections?.length === 0\">Outline View</h1>\n <div cdkDropList class=\"sections\" (cdkDropListDropped)=\"sectionDrop($event)\">\n <mat-card class=\"card\" cdkDrag *ngFor=\"let section of entry.sections\">\n <h3>Section {{Math.ceil(section.order / 10) + 1}}</h3>\n {{section.subheading}}\n <div cdkDropList class=\"contents\" (cdkDropListDropped)=\"contentDrop($event, section)\">\n <h3>Contents for {{section.subheading}}</h3>\n <div class=\"content-card\" *ngFor=\"let content of section.contents\" cdkDrag>\n <div class=\"content\">{{content.value}}</div>\n <div class=\"content-placeholder\" *cdkDragPlaceholder></div>\n </div>\n </div>\n </mat-card>\n <div class=\"custom-placeholder\" *cdkDragPlaceholder></div>\n </div>\n</div>\n", styles: [".outline{padding:0 20px}.content{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}.card,.content-card{margin:4px;cursor:pointer}.content-card:not(:last-child){border-bottom:1px dotted #aaa}.custom-placeholder{background:#ccc;border:dotted 3px #999;transition:transform .25s cubic-bezier(0,0,.2,1);min-height:60px}.content-placeholder{background:#ccc;border:dotted 3px #999;transition:transform .25s cubic-bezier(0,0,.2,1);min-height:30px}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i3.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i3.CdkDragPlaceholder, selector: "ng-template[cdkDragPlaceholder]", inputs: ["data"] }, { kind: "component", type: i4.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }] });
34
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.4", ngImport: i0, type: OutlineViewComponent, decorators: [{
35
- type: Component,
36
- args: [{ selector: 'app-outline-view', template: "<div *ngIf=\"entry\" class=\"section outline\">\n <h1 *ngIf=\"entry?.sections?.length === 0\">Outline View</h1>\n <div cdkDropList class=\"sections\" (cdkDropListDropped)=\"sectionDrop($event)\">\n <mat-card class=\"card\" cdkDrag *ngFor=\"let section of entry.sections\">\n <h3>Section {{Math.ceil(section.order / 10) + 1}}</h3>\n {{section.subheading}}\n <div cdkDropList class=\"contents\" (cdkDropListDropped)=\"contentDrop($event, section)\">\n <h3>Contents for {{section.subheading}}</h3>\n <div class=\"content-card\" *ngFor=\"let content of section.contents\" cdkDrag>\n <div class=\"content\">{{content.value}}</div>\n <div class=\"content-placeholder\" *cdkDragPlaceholder></div>\n </div>\n </div>\n </mat-card>\n <div class=\"custom-placeholder\" *cdkDragPlaceholder></div>\n </div>\n</div>\n", styles: [".outline{padding:0 20px}.content{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}.card,.content-card{margin:4px;cursor:pointer}.content-card:not(:last-child){border-bottom:1px dotted #aaa}.custom-placeholder{background:#ccc;border:dotted 3px #999;transition:transform .25s cubic-bezier(0,0,.2,1);min-height:60px}.content-placeholder{background:#ccc;border:dotted 3px #999;transition:transform .25s cubic-bezier(0,0,.2,1);min-height:30px}\n"] }]
37
- }], ctorParameters: function () { return [{ type: i1.EntryService }]; } });
38
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0bGluZS12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL2xpYi9jb21wb25lbnRzL291dGxpbmUtdmlldy9vdXRsaW5lLXZpZXcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZS9zcmMvbGliL2NvbXBvbmVudHMvb3V0bGluZS12aWV3L291dGxpbmUtdmlldy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFnQixNQUFNLGVBQWUsQ0FBQzs7Ozs7O0FBVXZELE1BQU0sT0FBTyxvQkFBb0I7SUFLN0IsWUFDWSxZQUEwQjtRQUExQixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUh0QyxTQUFJLEdBQUcsSUFBSSxDQUFDO0lBS1osQ0FBQztJQUVELFFBQVE7UUFDSixJQUFJLENBQUMsWUFBWSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3ZELElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELFdBQVcsQ0FBQyxDQUFDO1FBQ1QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUN6QixNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxhQUFhLENBQUM7UUFDOUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxZQUFZLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xGLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNiLElBQUksQ0FBQyxZQUFZLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRUQsV0FBVyxDQUFDLENBQUMsRUFBRSxPQUFPO1FBQ2xCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDekIsTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsYUFBYSxDQUFDO1FBQzlDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsWUFBWSxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwRixLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDYixJQUFJLENBQUMsWUFBWSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUQsQ0FBQzs7aUhBOUJRLG9CQUFvQjtxR0FBcEIsb0JBQW9CLHdEQ1ZqQyxrOEJBaUJBOzJGRFBhLG9CQUFvQjtrQkFMaEMsU0FBUzsrQkFDSSxrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgSW5wdXQsIE9uSW5pdH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7RW50cnl9IGZyb20gJy4uLy4uL2RhdGEvZW50cnknO1xuaW1wb3J0IHtFbnRyeVNlcnZpY2V9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2VudHJ5LnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FwcC1vdXRsaW5lLXZpZXcnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9vdXRsaW5lLXZpZXcuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL291dGxpbmUtdmlldy5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIE91dGxpbmVWaWV3Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICAgIGVudHJ5OiBFbnRyeTtcbiAgICBNYXRoID0gTWF0aDtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGVudHJ5U2VydmljZTogRW50cnlTZXJ2aWNlXG4gICAgKSB7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuZW50cnlTZXJ2aWNlLmN1cnJlbnRseUVkaXRlZEVudHJ5LnN1YnNjcmliZSgoZW50cnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZW50cnkgPSBlbnRyeTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2VjdGlvbkRyb3AoZSkge1xuICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW50cnk7XG4gICAgICAgIGNvbnN0IGRpZmYgPSBlLmN1cnJlbnRJbmRleCAtIGUucHJldmlvdXNJbmRleDtcbiAgICAgICAgZW50cnkuc2VjdGlvbnNbZS5wcmV2aW91c0luZGV4XS5vcmRlciA9IGUuY3VycmVudEluZGV4ICogMTAgKyAoZGlmZiA+IDAgPyAxIDogLTEpO1xuICAgICAgICBlbnRyeS5zb3J0KCk7XG4gICAgICAgIHRoaXMuZW50cnlTZXJ2aWNlLmN1cnJlbnRseUVkaXRlZEVudHJ5Lm5leHQodGhpcy5lbnRyeSk7XG4gICAgfVxuXG4gICAgY29udGVudERyb3AoZSwgc2VjdGlvbikge1xuICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW50cnk7XG4gICAgICAgIGNvbnN0IGRpZmYgPSBlLmN1cnJlbnRJbmRleCAtIGUucHJldmlvdXNJbmRleDtcbiAgICAgICAgc2VjdGlvbi5jb250ZW50c1tlLnByZXZpb3VzSW5kZXhdLm9yZGVyID0gZS5jdXJyZW50SW5kZXggKiAxMCArIChkaWZmID4gMCA/IDEgOiAtMSk7XG4gICAgICAgIGVudHJ5LnNvcnQoKTtcbiAgICAgICAgdGhpcy5lbnRyeVNlcnZpY2UuY3VycmVudGx5RWRpdGVkRW50cnkubmV4dCh0aGlzLmVudHJ5KTtcbiAgICB9XG59XG4iLCI8ZGl2ICpuZ0lmPVwiZW50cnlcIiBjbGFzcz1cInNlY3Rpb24gb3V0bGluZVwiPlxuICAgIDxoMSAqbmdJZj1cImVudHJ5Py5zZWN0aW9ucz8ubGVuZ3RoID09PSAwXCI+T3V0bGluZSBWaWV3PC9oMT5cbiAgICA8ZGl2IGNka0Ryb3BMaXN0IGNsYXNzPVwic2VjdGlvbnNcIiAoY2RrRHJvcExpc3REcm9wcGVkKT1cInNlY3Rpb25Ecm9wKCRldmVudClcIj5cbiAgICAgICAgPG1hdC1jYXJkIGNsYXNzPVwiY2FyZFwiIGNka0RyYWcgKm5nRm9yPVwibGV0IHNlY3Rpb24gb2YgZW50cnkuc2VjdGlvbnNcIj5cbiAgICAgICAgICAgIDxoMz5TZWN0aW9uIHt7TWF0aC5jZWlsKHNlY3Rpb24ub3JkZXIgLyAxMCkgKyAxfX08L2gzPlxuICAgICAgICAgICAge3tzZWN0aW9uLnN1YmhlYWRpbmd9fVxuICAgICAgICAgICAgPGRpdiBjZGtEcm9wTGlzdCBjbGFzcz1cImNvbnRlbnRzXCIgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJjb250ZW50RHJvcCgkZXZlbnQsIHNlY3Rpb24pXCI+XG4gICAgICAgICAgICAgICAgPGgzPkNvbnRlbnRzIGZvciB7e3NlY3Rpb24uc3ViaGVhZGluZ319PC9oMz5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGVudC1jYXJkXCIgKm5nRm9yPVwibGV0IGNvbnRlbnQgb2Ygc2VjdGlvbi5jb250ZW50c1wiIGNka0RyYWc+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZW50XCI+e3tjb250ZW50LnZhbHVlfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnQtcGxhY2Vob2xkZXJcIiAqY2RrRHJhZ1BsYWNlaG9sZGVyPjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbWF0LWNhcmQ+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjdXN0b20tcGxhY2Vob2xkZXJcIiAqY2RrRHJhZ1BsYWNlaG9sZGVyPjwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG4iXX0=
@@ -1,3 +0,0 @@
1
- export class SchedulePublishDialogData {
2
- }
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZWR1bGUtcHVibGlzaC1kaWFsb2ctZGF0YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL2xpYi9jb21wb25lbnRzL3NjaGVkdWxlLXB1Ymxpc2gtZGlhbG9nL3NjaGVkdWxlLXB1Ymxpc2gtZGlhbG9nLWRhdGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxPQUFPLHlCQUF5QjtDQUNyQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBTY2hlZHVsZVB1Ymxpc2hEaWFsb2dEYXRhIHtcbn1cbiJdfQ==
@@ -1,33 +0,0 @@
1
- import { Component, Inject } from '@angular/core';
2
- import { MAT_DIALOG_DATA } from '@angular/material/dialog';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "@angular/material/dialog";
5
- import * as i2 from "@angular/material/button";
6
- import * as i3 from "@angular/material/input";
7
- import * as i4 from "@angular/material/form-field";
8
- import * as i5 from "@angular/material/datepicker";
9
- import * as i6 from "ngx-material-timepicker";
10
- import * as i7 from "./schedule-publish-dialog-data";
11
- export class SchedulePublishDialogComponent {
12
- constructor(dialogRef, data) {
13
- this.dialogRef = dialogRef;
14
- this.data = data;
15
- }
16
- ngOnInit() {
17
- }
18
- onNoClick() {
19
- }
20
- onYesClick() {
21
- this.dialogRef.close('test');
22
- }
23
- }
24
- SchedulePublishDialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.4", ngImport: i0, type: SchedulePublishDialogComponent, deps: [{ token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component });
25
- SchedulePublishDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.4", type: SchedulePublishDialogComponent, selector: "lib-schedule-publish-dialog", ngImport: i0, template: "<h1 mat-dialog-title>Select a Date and Time to Schedule This Post</h1>\n<!--<mat-radio-group aria-label=\"Select an option\">-->\n<!-- <mat-radio-button class=\"option\" value=\"unpublished\">Unpublished</mat-radio-button>-->\n<!-- <mat-radio-button class=\"option\" value=\"published\">Published</mat-radio-button>-->\n<!--</mat-radio-group>-->\n<p>Date</p>\n<mat-form-field appearance=\"fill\">\n <mat-label>Choose a date</mat-label>\n <input matInput [matDatepicker]=\"picker\">\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker #picker></mat-datepicker>\n</mat-form-field>\n<p>Time</p>\n<input [ngxTimepicker]=\"timepicker\" readonly>\n<ngx-material-timepicker #timepicker></ngx-material-timepicker>\n<div mat-dialog-actions>\n <button mat-button (click)=\"onNoClick()\">Cancel</button>\n <button mat-button (click)=\"onYesClick()\" cdkFocusInitial>Schedule Publish</button>\n</div>\n", styles: [""], dependencies: [{ kind: "component", type: i2.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "component", type: i5.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i5.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i5.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "component", type: i6.NgxMaterialTimepickerComponent, selector: "ngx-material-timepicker", inputs: ["ESC", "hoursOnly", "ngxMaterialTimepickerTheme", "format", "minutesGap", "cancelBtnTmpl", "editableHintTmpl", "confirmBtnTmpl", "enableKeyboardInput", "preventOverlayClick", "disableAnimation", "appendToInput", "defaultTime", "timepickerClass", "theme", "min", "max"], outputs: ["timeSet", "opened", "closed", "hourSelected", "timeChanged"] }, { kind: "directive", type: i6.TimepickerDirective, selector: "[ngxTimepicker]", inputs: ["format", "value", "min", "max", "ngxTimepicker", "disabled", "disableClick"] }] });
26
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.4", ngImport: i0, type: SchedulePublishDialogComponent, decorators: [{
27
- type: Component,
28
- args: [{ selector: 'lib-schedule-publish-dialog', template: "<h1 mat-dialog-title>Select a Date and Time to Schedule This Post</h1>\n<!--<mat-radio-group aria-label=\"Select an option\">-->\n<!-- <mat-radio-button class=\"option\" value=\"unpublished\">Unpublished</mat-radio-button>-->\n<!-- <mat-radio-button class=\"option\" value=\"published\">Published</mat-radio-button>-->\n<!--</mat-radio-group>-->\n<p>Date</p>\n<mat-form-field appearance=\"fill\">\n <mat-label>Choose a date</mat-label>\n <input matInput [matDatepicker]=\"picker\">\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker #picker></mat-datepicker>\n</mat-form-field>\n<p>Time</p>\n<input [ngxTimepicker]=\"timepicker\" readonly>\n<ngx-material-timepicker #timepicker></ngx-material-timepicker>\n<div mat-dialog-actions>\n <button mat-button (click)=\"onNoClick()\">Cancel</button>\n <button mat-button (click)=\"onYesClick()\" cdkFocusInitial>Schedule Publish</button>\n</div>\n" }]
29
- }], ctorParameters: function () { return [{ type: i1.MatDialogRef }, { type: i7.SchedulePublishDialogData, decorators: [{
30
- type: Inject,
31
- args: [MAT_DIALOG_DATA]
32
- }] }]; } });
33
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZWR1bGUtcHVibGlzaC1kaWFsb2cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZS9zcmMvbGliL2NvbXBvbmVudHMvc2NoZWR1bGUtcHVibGlzaC1kaWFsb2cvc2NoZWR1bGUtcHVibGlzaC1kaWFsb2cuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZS9zcmMvbGliL2NvbXBvbmVudHMvc2NoZWR1bGUtcHVibGlzaC1kaWFsb2cvc2NoZWR1bGUtcHVibGlzaC1kaWFsb2cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDMUQsT0FBTyxFQUFlLGVBQWUsRUFBQyxNQUFNLDBCQUEwQixDQUFDOzs7Ozs7Ozs7QUFRdkUsTUFBTSxPQUFPLDhCQUE4QjtJQUV2QyxZQUNXLFNBQXVELEVBQzlCLElBQStCO1FBRHhELGNBQVMsR0FBVCxTQUFTLENBQThDO1FBQzlCLFNBQUksR0FBSixJQUFJLENBQTJCO0lBQy9ELENBQUM7SUFFTCxRQUFRO0lBQ1IsQ0FBQztJQUVELFNBQVM7SUFDVCxDQUFDO0lBRUQsVUFBVTtRQUNOLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2pDLENBQUM7OzJIQWZRLDhCQUE4Qiw4Q0FJM0IsZUFBZTsrR0FKbEIsOEJBQThCLG1FQ1QzQyx1N0JBbUJBOzJGRFZhLDhCQUE4QjtrQkFMMUMsU0FBUzsrQkFDSSw2QkFBNkI7OzBCQVFsQyxNQUFNOzJCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEluamVjdCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge01hdERpYWxvZ1JlZiwgTUFUX0RJQUxPR19EQVRBfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHtTY2hlZHVsZVB1Ymxpc2hEaWFsb2dEYXRhfSBmcm9tICcuL3NjaGVkdWxlLXB1Ymxpc2gtZGlhbG9nLWRhdGEnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2xpYi1zY2hlZHVsZS1wdWJsaXNoLWRpYWxvZycsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3NjaGVkdWxlLXB1Ymxpc2gtZGlhbG9nLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9zY2hlZHVsZS1wdWJsaXNoLWRpYWxvZy5jb21wb25lbnQuY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgU2NoZWR1bGVQdWJsaXNoRGlhbG9nQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8U2NoZWR1bGVQdWJsaXNoRGlhbG9nQ29tcG9uZW50PixcbiAgICAgICAgQEluamVjdChNQVRfRElBTE9HX0RBVEEpIHB1YmxpYyBkYXRhOiBTY2hlZHVsZVB1Ymxpc2hEaWFsb2dEYXRhLFxuICAgICkgeyB9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB9XG5cbiAgICBvbk5vQ2xpY2soKTogdm9pZCB7XG4gICAgfVxuXG4gICAgb25ZZXNDbGljaygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoJ3Rlc3QnKTtcbiAgICB9XG59XG4iLCI8aDEgbWF0LWRpYWxvZy10aXRsZT5TZWxlY3QgYSBEYXRlIGFuZCBUaW1lIHRvIFNjaGVkdWxlIFRoaXMgUG9zdDwvaDE+XG48IS0tPG1hdC1yYWRpby1ncm91cCBhcmlhLWxhYmVsPVwiU2VsZWN0IGFuIG9wdGlvblwiPi0tPlxuPCEtLSAgICA8bWF0LXJhZGlvLWJ1dHRvbiBjbGFzcz1cIm9wdGlvblwiIHZhbHVlPVwidW5wdWJsaXNoZWRcIj5VbnB1Ymxpc2hlZDwvbWF0LXJhZGlvLWJ1dHRvbj4tLT5cbjwhLS0gICAgPG1hdC1yYWRpby1idXR0b24gY2xhc3M9XCJvcHRpb25cIiB2YWx1ZT1cInB1Ymxpc2hlZFwiPlB1Ymxpc2hlZDwvbWF0LXJhZGlvLWJ1dHRvbj4tLT5cbjwhLS08L21hdC1yYWRpby1ncm91cD4tLT5cbjxwPkRhdGU8L3A+XG48bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cImZpbGxcIj5cbiAgPG1hdC1sYWJlbD5DaG9vc2UgYSBkYXRlPC9tYXQtbGFiZWw+XG4gIDxpbnB1dCBtYXRJbnB1dCBbbWF0RGF0ZXBpY2tlcl09XCJwaWNrZXJcIj5cbiAgPG1hdC1kYXRlcGlja2VyLXRvZ2dsZSBtYXRTdWZmaXggW2Zvcl09XCJwaWNrZXJcIj48L21hdC1kYXRlcGlja2VyLXRvZ2dsZT5cbiAgPG1hdC1kYXRlcGlja2VyICNwaWNrZXI+PC9tYXQtZGF0ZXBpY2tlcj5cbjwvbWF0LWZvcm0tZmllbGQ+XG48cD5UaW1lPC9wPlxuPGlucHV0IFtuZ3hUaW1lcGlja2VyXT1cInRpbWVwaWNrZXJcIiByZWFkb25seT5cbjxuZ3gtbWF0ZXJpYWwtdGltZXBpY2tlciAjdGltZXBpY2tlcj48L25neC1tYXRlcmlhbC10aW1lcGlja2VyPlxuPGRpdiBtYXQtZGlhbG9nLWFjdGlvbnM+XG4gICAgPGJ1dHRvbiBtYXQtYnV0dG9uIChjbGljayk9XCJvbk5vQ2xpY2soKVwiPkNhbmNlbDwvYnV0dG9uPlxuICAgIDxidXR0b24gbWF0LWJ1dHRvbiAoY2xpY2spPVwib25ZZXNDbGljaygpXCIgY2RrRm9jdXNJbml0aWFsPlNjaGVkdWxlIFB1Ymxpc2g8L2J1dHRvbj5cbjwvZGl2PlxuIl19
@@ -1,230 +0,0 @@
1
- import { Component, EventEmitter, ViewChild } from '@angular/core';
2
- import { trigger, state, style, animate, transition } from '@angular/animations';
3
- import { FormControl } from '@angular/forms';
4
- import { filter } from 'lodash';
5
- import { map } from 'lodash';
6
- import { debounceTime } from 'rxjs/operators';
7
- import { Entry } from '../../data/entry';
8
- import * as i0 from "@angular/core";
9
- import * as i1 from "../../services/entry.service";
10
- import * as i2 from "@angular/router";
11
- import * as i3 from "../../services/identity.service";
12
- import * as i4 from "@angular/common";
13
- import * as i5 from "@angular/forms";
14
- import * as i6 from "@angular/material/input";
15
- import * as i7 from "@angular/material/form-field";
16
- import * as i8 from "@angular/material/list";
17
- import * as i9 from "@angular/material/progress-spinner";
18
- export class SideNavigationComponent {
19
- constructor(entryService, router, identityService, renderer) {
20
- this.entryService = entryService;
21
- this.router = router;
22
- this.identityService = identityService;
23
- this.renderer = renderer;
24
- this.state = 'out';
25
- this.response = null;
26
- this.debounceTimeout = 200;
27
- this.loading = true;
28
- this.entries = [];
29
- this.entriesByMonthAndYear = [];
30
- this.searchTerm = "";
31
- this.doSearch = new EventEmitter();
32
- this.searchControl = new FormControl('');
33
- }
34
- ngOnInit() {
35
- this.doSearch.pipe(debounceTime(this.debounceTimeout)).subscribe((result) => {
36
- this.searchEntries(result);
37
- });
38
- this.identityService.getMe().subscribe((identity) => {
39
- this.identity = identity;
40
- }, (err) => {
41
- this.identity = null;
42
- });
43
- this.getEntries();
44
- }
45
- getMore() {
46
- this.getEntriesWithUrl(this.response.next, false);
47
- }
48
- getEntriesWithUrl(url, wipe = true) {
49
- this.loading = true;
50
- this.entryService.getListByUrl(url).subscribe((response) => {
51
- this.response = response;
52
- this.entries = this.entries.concat(map(response.results, (result) => {
53
- return { id: result.id, entry: new Entry(result) };
54
- }));
55
- this.organizeEntries(wipe);
56
- });
57
- }
58
- organizeEntries(wipe = true) {
59
- if (wipe) {
60
- this.state = 'out';
61
- }
62
- let organizeEntriesFn = () => {
63
- if (wipe) {
64
- this.entriesByMonthAndYear = [];
65
- }
66
- let newEntries = JSON.parse(JSON.stringify(this.entriesByMonthAndYear));
67
- for (const entryWrapper of this.entries) {
68
- const entry = entryWrapper.entry;
69
- const create_date = new Date(entry.create_date);
70
- const month = create_date.getMonth();
71
- const year = create_date.getFullYear();
72
- const key = month + '/' + year;
73
- const sort_index = (year * 100) + month;
74
- const containers = filter(newEntries, (entryContainer) => entryContainer.month_year === key);
75
- if (containers.length > 0) {
76
- const container = containers[0];
77
- const entriesWithId = filter(container.entries, (e) => e.id === entryWrapper.entry.id);
78
- if (entriesWithId.length === 0) {
79
- container.entries.push(entry);
80
- }
81
- }
82
- else {
83
- const newContainer = { month_year: key, month_year_number: sort_index, entries: [entry] };
84
- newEntries.push(newContainer);
85
- }
86
- }
87
- newEntries.sort((entry_a, entry_b) => {
88
- return entry_a.month_year_number - entry_b.month_year_number;
89
- });
90
- newEntries.reverse();
91
- let setEntriesFn = () => {
92
- this.entriesByMonthAndYear = newEntries;
93
- this.loading = false;
94
- if (wipe) {
95
- this.state = 'in';
96
- }
97
- };
98
- setTimeout(setEntriesFn.bind(this), 400);
99
- };
100
- setTimeout(organizeEntriesFn.bind(this), 400);
101
- }
102
- getEntries() {
103
- this.loading = true;
104
- this.entryService.get().subscribe((response) => {
105
- this.response = response;
106
- this.entries = map(response.results, (result) => {
107
- return { id: result.id, entry: new Entry(result) };
108
- });
109
- this.organizeEntries();
110
- });
111
- }
112
- searchEntries(searchTerm) {
113
- let turnOnLoading = () => {
114
- this.loading = true;
115
- };
116
- setTimeout(turnOnLoading.bind(this), this.debounceTimeout + 100);
117
- if (searchTerm !== "") {
118
- this.entryService.search(searchTerm).subscribe((response) => {
119
- this.response = response;
120
- this.entries = map(response.results, (result) => {
121
- return { id: result.id, entry: new Entry(result) };
122
- });
123
- this.organizeEntries();
124
- });
125
- }
126
- else {
127
- this.getEntries();
128
- }
129
- }
130
- render() {
131
- }
132
- routeTo(entry) {
133
- if (!entry) {
134
- this.router.navigateByUrl('create(left-col:create//right-col:create)').then(() => {
135
- });
136
- }
137
- else {
138
- this.router.navigate(['/', 'blog', entry.slug]).then(() => {
139
- // Noop
140
- });
141
- }
142
- }
143
- getMonthAndYearFromKey(key) {
144
- let subheading = '';
145
- const parts = key.split('/');
146
- switch (Number(parts[0])) {
147
- case 0:
148
- subheading += 'January ';
149
- break;
150
- case 1:
151
- subheading += 'February ';
152
- break;
153
- case 2:
154
- subheading += 'March ';
155
- break;
156
- case 3:
157
- subheading += 'April ';
158
- break;
159
- case 4:
160
- subheading += 'May ';
161
- break;
162
- case 5:
163
- subheading += 'June ';
164
- break;
165
- case 6:
166
- subheading += 'July ';
167
- break;
168
- case 7:
169
- subheading += 'August ';
170
- break;
171
- case 8:
172
- subheading += 'September ';
173
- break;
174
- case 9:
175
- subheading += 'October ';
176
- break;
177
- case 10:
178
- subheading += 'November ';
179
- break;
180
- case 11:
181
- subheading += 'December ';
182
- break;
183
- default:
184
- subheading += 'January ';
185
- }
186
- subheading += parts[1];
187
- return subheading;
188
- }
189
- ngOnDestroy() {
190
- if (this.sourceSub) {
191
- this.sourceSub.unsubscribe();
192
- this.sourceSub = null;
193
- }
194
- }
195
- onSearchChange(searchValue) {
196
- this.doSearch.emit(searchValue);
197
- }
198
- }
199
- SideNavigationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.4", ngImport: i0, type: SideNavigationComponent, deps: [{ token: i1.EntryService }, { token: i2.Router }, { token: i3.IdentityService }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
200
- SideNavigationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.4", type: SideNavigationComponent, selector: "app-side-navigation", viewQueries: [{ propertyName: "divNav", first: true, predicate: ["navcontainer"], descendants: true }], ngImport: i0, template: "<div class=\"sidenav no-scrollbar\">\n <div style=\"margin-top: 20px;\">\n <mat-form-field style=\"width: 100%\">\n <mat-label>Search</mat-label>\n <input matInput [formControl]=\"searchControl\" (ngModelChange)=\"onSearchChange($event)\">\n </mat-form-field>\n </div>\n\n <div\n class=\"progress\"\n [hidden]=\"!loading\"\n >\n <mat-progress-spinner\n style=\"margin-left: 16px;\"\n [diameter]=20\n mode=\"indeterminate\"\n >\n </mat-progress-spinner>\n </div>\n\n <div #navcontainer class=\"navcontainer\"\n [@sideNavAnimation]=\"state\"\n >\n <mat-nav-list\n *ngFor=\"let container of entriesByMonthAndYear\"\n >\n <h3>{{getMonthAndYearFromKey(container.month_year)}}</h3>\n <a mat-list-item *ngFor=\"let entry of container.entries\" href=\"javascript:void(0)\" (click)=\"routeTo(entry)\">{{entry.title}}</a>\n </mat-nav-list>\n\n <a\n class=\"sidelink\"\n *ngIf=\"this?.response?.next && !loading\"\n (click)=\"getMore()\"\n href=\"javascript:void(0);\">More...</a>\n </div>\n <ng-container *ngIf=\"identity?.id === 1\">\n <h2>Misc</h2>\n\n <mat-nav-list>\n <a mat-list-item href=\"javascript:void(0);\" (click)=\"routeTo(null)\">Create</a>\n </mat-nav-list>\n </ng-container>\n <h3 *ngIf=\"identity\">Logged in as {{identity?.email}}</h3>\n</div>\n\n", styles: [".progress{position:absolute;top:100px;left:0}.sidelink{padding-left:16px}.sidenav{position:relative;max-height:calc(100vh - 100px)}@media screen and (max-height: 560px){.sidenav{max-height:100vh}}h2,h3{margin-left:10px;justify-content:right}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.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: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i6.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i7.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i7.MatLabel, selector: "mat-label" }, { kind: "component", type: i8.MatNavList, selector: "mat-nav-list", exportAs: ["matNavList"] }, { kind: "component", type: i8.MatListItem, selector: "mat-list-item, a[mat-list-item], button[mat-list-item]", inputs: ["activated"], exportAs: ["matListItem"] }, { kind: "component", type: i9.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }], animations: [
201
- trigger('sideNavAnimation', [
202
- state('in', style({ transform: 'translateX(0%)' })),
203
- state('out', style({ transform: 'translateX(110%)' })),
204
- transition('in => out', [
205
- animate('100ms ease-out', style({ transform: 'translateX(110%)' }))
206
- ]),
207
- transition('out => in', [
208
- animate('100ms ease-in', style({ transform: 'translateX(0%)' }))
209
- ])
210
- ]),
211
- ] });
212
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.4", ngImport: i0, type: SideNavigationComponent, decorators: [{
213
- type: Component,
214
- args: [{ selector: 'app-side-navigation', animations: [
215
- trigger('sideNavAnimation', [
216
- state('in', style({ transform: 'translateX(0%)' })),
217
- state('out', style({ transform: 'translateX(110%)' })),
218
- transition('in => out', [
219
- animate('100ms ease-out', style({ transform: 'translateX(110%)' }))
220
- ]),
221
- transition('out => in', [
222
- animate('100ms ease-in', style({ transform: 'translateX(0%)' }))
223
- ])
224
- ]),
225
- ], template: "<div class=\"sidenav no-scrollbar\">\n <div style=\"margin-top: 20px;\">\n <mat-form-field style=\"width: 100%\">\n <mat-label>Search</mat-label>\n <input matInput [formControl]=\"searchControl\" (ngModelChange)=\"onSearchChange($event)\">\n </mat-form-field>\n </div>\n\n <div\n class=\"progress\"\n [hidden]=\"!loading\"\n >\n <mat-progress-spinner\n style=\"margin-left: 16px;\"\n [diameter]=20\n mode=\"indeterminate\"\n >\n </mat-progress-spinner>\n </div>\n\n <div #navcontainer class=\"navcontainer\"\n [@sideNavAnimation]=\"state\"\n >\n <mat-nav-list\n *ngFor=\"let container of entriesByMonthAndYear\"\n >\n <h3>{{getMonthAndYearFromKey(container.month_year)}}</h3>\n <a mat-list-item *ngFor=\"let entry of container.entries\" href=\"javascript:void(0)\" (click)=\"routeTo(entry)\">{{entry.title}}</a>\n </mat-nav-list>\n\n <a\n class=\"sidelink\"\n *ngIf=\"this?.response?.next && !loading\"\n (click)=\"getMore()\"\n href=\"javascript:void(0);\">More...</a>\n </div>\n <ng-container *ngIf=\"identity?.id === 1\">\n <h2>Misc</h2>\n\n <mat-nav-list>\n <a mat-list-item href=\"javascript:void(0);\" (click)=\"routeTo(null)\">Create</a>\n </mat-nav-list>\n </ng-container>\n <h3 *ngIf=\"identity\">Logged in as {{identity?.email}}</h3>\n</div>\n\n", styles: [".progress{position:absolute;top:100px;left:0}.sidelink{padding-left:16px}.sidenav{position:relative;max-height:calc(100vh - 100px)}@media screen and (max-height: 560px){.sidenav{max-height:100vh}}h2,h3{margin-left:10px;justify-content:right}\n"] }]
226
- }], ctorParameters: function () { return [{ type: i1.EntryService }, { type: i2.Router }, { type: i3.IdentityService }, { type: i0.Renderer2 }]; }, propDecorators: { divNav: [{
227
- type: ViewChild,
228
- args: ['navcontainer', { static: false }]
229
- }] } });
230
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lkZS1uYXZpZ2F0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL2xpYi9jb21wb25lbnRzL3NpZGUtbmF2aWdhdGlvbi9zaWRlLW5hdmlnYXRpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZS9zcmMvbGliL2NvbXBvbmVudHMvc2lkZS1uYXZpZ2F0aW9uL3NpZGUtbmF2aWdhdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLFlBQVksRUFBeUMsU0FBUyxFQUFZLE1BQU0sZUFBZSxDQUFDO0FBQ25ILE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFakYsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDOUIsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUMzQixPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFNUMsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGtCQUFrQixDQUFDOzs7Ozs7Ozs7OztBQXdCdkMsTUFBTSxPQUFPLHVCQUF1QjtJQW9CbEMsWUFDVSxZQUEwQixFQUMxQixNQUFjLEVBQ2QsZUFBZ0MsRUFDaEMsUUFBbUI7UUFIbkIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUNoQyxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBdEI3QixVQUFLLEdBQWlCLEtBQUssQ0FBQztRQUs1QixhQUFRLEdBQXdCLElBQUksQ0FB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QUMsZUFBZSxFQUFFLEtBQUssQ0FBQyxFQUFDLFNBQVMsRUFBRSxnQkFBZ0IsRUFBQyxDQUFDLENBQUM7NkJBQy9ELENBQUM7eUJBQ0gsQ0FBQztxQkFDSDs4S0FvQjZDLE1BQU07c0JBQW5ELFNBQVM7dUJBQUMsY0FBYyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIEVsZW1lbnRSZWYsIFZpZXdDaGlsZCwgUmVuZGVyZXIyfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRyaWdnZXIsIHN0YXRlLCBzdHlsZSwgYW5pbWF0ZSwgdHJhbnNpdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xuaW1wb3J0IHtSb3V0ZXJ9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7ZmlsdGVyfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHttYXB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQge2RlYm91bmNlVGltZX0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQge0VudHJ5fSBmcm9tICcuLi8uLi9kYXRhL2VudHJ5JztcbmltcG9ydCB7SWRlbnRpdHl9IGZyb20gJy4uLy4uL2RhdGEvaWRlbnRpdHknO1xuaW1wb3J0IHtMaXN0UmVzcG9uc2V9IGZyb20gJy4uLy4uL2RhdGEvbGlzdC1yZXNwb25zZSc7XG5cbmltcG9ydCB7RW50cnlTZXJ2aWNlfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9lbnRyeS5zZXJ2aWNlJztcbmltcG9ydCB7SWRlbnRpdHlTZXJ2aWNlfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9pZGVudGl0eS5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXNpZGUtbmF2aWdhdGlvbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9zaWRlLW5hdmlnYXRpb24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zaWRlLW5hdmlnYXRpb24uY29tcG9uZW50LnNjc3MnXSxcbiAgYW5pbWF0aW9uczogW1xuICAgIHRyaWdnZXIoJ3NpZGVOYXZBbmltYXRpb24nLCBbXG4gICAgICBzdGF0ZSgnaW4nLCBzdHlsZSh7dHJhbnNmb3JtOiAndHJhbnNsYXRlWCgwJSknfSkpLFxuICAgICAgc3RhdGUoJ291dCcsIHN0eWxlKHt0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKDExMCUpJ30pKSxcbiAgICAgIHRyYW5zaXRpb24oJ2luID0+IG91dCcsIFtcbiAgICAgICAgYW5pbWF0ZSgnMTAwbXMgZWFzZS1vdXQnLCBzdHlsZSh7dHJhbnNmb3JtOiAndHJhbnNsYXRlWCgxMTAlKSd9KSlcbiAgICAgIF0pLFxuICAgICAgdHJhbnNpdGlvbignb3V0ID0+IGluJywgW1xuICAgICAgICBhbmltYXRlKCcxMDBtcyBlYXNlLWluJywgc3R5bGUoe3RyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoMCUpJ30pKVxuICAgICAgXSlcbiAgICBdKSxcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBTaWRlTmF2aWdhdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICBzdGF0ZTogJ2luJyB8ICdvdXQnID0gJ291dCc7XG5cbiAgc291cmNlU3ViO1xuICBpZGVudGl0eTogSWRlbnRpdHk7XG5cbiAgcmVzcG9uc2U6IExpc3RSZXNwb25zZTxFbnRyeT4gPSBudWxsO1xuICBkZWJvdW5jZVRpbWVvdXQgPSAyMDA7XG4gIGxvYWRpbmcgPSB0cnVlO1xuXG4gIGVudHJpZXM6IHtpZDogc3RyaW5nLCBlbnRyeTogRW50cnl9W10gPSBbXTtcbiAgZW50cmllc0J5TW9udGhBbmRZZWFyOiB7bW9udGhfeWVhcjogc3RyaW5nLCBtb250aF95ZWFyX251bWJlcjogbnVtYmVyLCBlbnRyaWVzOiBFbnRyeVtdfVtdID0gW107XG5cbiAgc2VhcmNoVGVybSA9IFwiXCI7XG5cbiAgZG9TZWFyY2g6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBWaWV3Q2hpbGQoJ25hdmNvbnRhaW5lcicsIHsgc3RhdGljOiBmYWxzZSB9KSBkaXZOYXY6IEVsZW1lbnRSZWY7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBlbnRyeVNlcnZpY2U6IEVudHJ5U2VydmljZSxcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgaWRlbnRpdHlTZXJ2aWNlOiBJZGVudGl0eVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICApIHtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuXG4gICAgdGhpcy5kb1NlYXJjaC5waXBlKGRlYm91bmNlVGltZSh0aGlzLmRlYm91bmNlVGltZW91dCkpLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICB0aGlzLnNlYXJjaEVudHJpZXMocmVzdWx0KTtcbiAgICB9KTtcblxuICAgIHRoaXMuaWRlbnRpdHlTZXJ2aWNlLmdldE1lKCkuc3Vic2NyaWJlKChpZGVudGl0eSkgPT4ge1xuICAgICAgdGhpcy5pZGVudGl0eSA9IGlkZW50aXR5O1xuICAgIH0sIChlcnIpID0+IHtcbiAgICAgICAgdGhpcy5pZGVudGl0eSA9IG51bGw7XG4gICAgICB9KTtcblxuICAgIHRoaXMuZ2V0RW50cmllcygpO1xuXG4gIH1cblxuICBnZXRNb3JlKCkge1xuICAgIHRoaXMuZ2V0RW50cmllc1dpdGhVcmwodGhpcy5yZXNwb25zZS5uZXh0LCBmYWxzZSk7XG4gIH1cblxuICBnZXRFbnRyaWVzV2l0aFVybCh1cmw6IHN0cmluZywgd2lwZSA9IHRydWUpIHtcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgIHRoaXMuZW50cnlTZXJ2aWNlLmdldExpc3RCeVVybCh1cmwpLnN1YnNjcmliZSgocmVzcG9uc2UpID0+IHtcbiAgICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTtcbiAgICAgIHRoaXMuZW50cmllcyA9IHRoaXMuZW50cmllcy5jb25jYXQoXG4gICAgICAgIG1hcCgocmVzcG9uc2UgYXMgYW55KS5yZXN1bHRzLCAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHsgaWQ6IHJlc3VsdC5pZCwgZW50cnk6IG5ldyBFbnRyeShyZXN1bHQpfTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICB0aGlzLm9yZ2FuaXplRW50cmllcyh3aXBlKTtcbiAgICB9KTtcbiAgfVxuXG4gIG9yZ2FuaXplRW50cmllcyh3aXBlID0gdHJ1ZSkge1xuICAgIGlmICh3aXBlKSB7XG4gICAgICB0aGlzLnN0YXRlID0gJ291dCc7XG4gICAgfVxuICAgIGxldCBvcmdhbml6ZUVudHJpZXNGbiA9ICgpID0+IHtcbiAgICAgIGlmKHdpcGUpIHtcbiAgICAgICAgdGhpcy5lbnRyaWVzQnlNb250aEFuZFllYXIgPSBbXTtcbiAgICAgIH1cbiAgICAgIGxldCBuZXdFbnRyaWVzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmVudHJpZXNCeU1vbnRoQW5kWWVhcikpO1xuICAgICAgZm9yIChjb25zdCBlbnRyeVdyYXBwZXIgb2YgdGhpcy5lbnRyaWVzKSB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gZW50cnlXcmFwcGVyLmVudHJ5O1xuICAgICAgICBjb25zdCBjcmVhdGVfZGF0ZSA9IG5ldyBEYXRlKGVudHJ5LmNyZWF0ZV9kYXRlKTtcbiAgICAgICAgY29uc3QgbW9udGggPSBjcmVhdGVfZGF0ZS5nZXRNb250aCgpO1xuICAgICAgICBjb25zdCB5ZWFyID0gY3JlYXRlX2RhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgY29uc3Qga2V5ID0gbW9udGggKyAnLycgKyB5ZWFyO1xuICAgICAgICBjb25zdCBzb3J0X2luZGV4ID0gKHllYXIgKiAxMDApICsgbW9udGg7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lcnMgPSBmaWx0ZXIobmV3RW50cmllcywgKGVudHJ5Q29udGFpbmVyKSA9PiBlbnRyeUNvbnRhaW5lci5tb250aF95ZWFyID09PSBrZXkpO1xuICAgICAgICBpZiAoY29udGFpbmVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgY29udGFpbmVyID0gY29udGFpbmVyc1swXTtcbiAgICAgICAgICBjb25zdCBlbnRyaWVzV2l0aElkID0gZmlsdGVyKGNvbnRhaW5lci5lbnRyaWVzLCAoZSkgPT4gZS5pZCA9PT0gZW50cnlXcmFwcGVyLmVudHJ5LmlkKTtcbiAgICAgICAgICBpZiAoZW50cmllc1dpdGhJZC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGNvbnRhaW5lci5lbnRyaWVzLnB1c2goZW50cnkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBuZXdDb250YWluZXIgPSB7bW9udGhfeWVhcjoga2V5LCBtb250aF95ZWFyX251bWJlcjogc29ydF9pbmRleCwgZW50cmllczogW2VudHJ5XX07XG4gICAgICAgICAgbmV3RW50cmllcy5wdXNoKG5ld0NvbnRhaW5lcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG5ld0VudHJpZXMuc29ydChcbiAgICAgICAgKGVudHJ5X2EsIGVudHJ5X2IpID0+IHtcbiAgICAgICAgICByZXR1cm4gZW50cnlfYS5tb250aF95ZWFyX251bWJlciAtIGVudHJ5X2IubW9udGhfeWVhcl9udW1iZXI7XG4gICAgICAgIH0pO1xuICAgICAgbmV3RW50cmllcy5yZXZlcnNlKCk7XG5cbiAgICAgIGxldCBzZXRFbnRyaWVzRm4gPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuZW50cmllc0J5TW9udGhBbmRZZWFyID0gbmV3RW50cmllcztcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIGlmICh3aXBlKSB7XG4gICAgICAgICAgdGhpcy5zdGF0ZSA9ICdpbic7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHNldFRpbWVvdXQoc2V0RW50cmllc0ZuLmJpbmQodGhpcyksIDQwMClcbiAgICB9XG4gICAgc2V0VGltZW91dChvcmdhbml6ZUVudHJpZXNGbi5iaW5kKHRoaXMpLCA0MDApXG4gIH1cblxuICBnZXRFbnRyaWVzKCkge1xuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgdGhpcy5lbnRyeVNlcnZpY2UuZ2V0KCkuc3Vic2NyaWJlKChyZXNwb25zZSkgPT4ge1xuICAgICAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlO1xuICAgICAgdGhpcy5lbnRyaWVzID0gbWFwKHJlc3BvbnNlLnJlc3VsdHMsIChyZXN1bHQpID0+IHtcbiAgICAgICAgcmV0dXJuIHsgaWQ6IHJlc3VsdC5pZCwgZW50cnk6IG5ldyBFbnRyeShyZXN1bHQpfTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5vcmdhbml6ZUVudHJpZXMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHNlYXJjaEVudHJpZXMoc2VhcmNoVGVybTogc3RyaW5nKSB7XG5cbiAgICBsZXQgdHVybk9uTG9hZGluZyA9ICgpID0+IHtcbiAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgfVxuICAgIHNldFRpbWVvdXQodHVybk9uTG9hZGluZy5iaW5kKHRoaXMpLCB0aGlzLmRlYm91bmNlVGltZW91dCArIDEwMCk7XG4gICAgaWYgKHNlYXJjaFRlcm0gIT09IFwiXCIpIHtcbiAgICAgIHRoaXMuZW50cnlTZXJ2aWNlLnNlYXJjaChzZWFyY2hUZXJtKS5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5lbnRyaWVzID0gbWFwKHJlc3BvbnNlLnJlc3VsdHMsIChyZXN1bHQpID0+IHtcbiAgICAgICAgICByZXR1cm4geyBpZDogcmVzdWx0LmlkLCBlbnRyeTogbmV3IEVudHJ5KHJlc3VsdCl9O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vcmdhbml6ZUVudHJpZXMoKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmdldEVudHJpZXMoKTtcbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gIH1cblxuICByb3V0ZVRvKGVudHJ5KSB7XG4gICAgaWYgKCFlbnRyeSkge1xuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybCgnY3JlYXRlKGxlZnQtY29sOmNyZWF0ZS8vcmlnaHQtY29sOmNyZWF0ZSknKS50aGVuKCgpID0+IHtcblxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnLycsICdibG9nJywgZW50cnkuc2x1Z10pLnRoZW4oKCkgPT4ge1xuICAgICAgICAvLyBOb29wXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBnZXRNb250aEFuZFllYXJGcm9tS2V5KGtleTogc3RyaW5nKSB7XG4gICAgbGV0IHN1YmhlYWRpbmcgPSAnJztcbiAgICBjb25zdCBwYXJ0cyA9IGtleS5zcGxpdCgnLycpO1xuXG4gICAgc3dpdGNoIChOdW1iZXIocGFydHNbMF0pKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIHN1YmhlYWRpbmcgKz0gJ0phbnVhcnkgJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDE6XG4gICAgICAgIHN1YmhlYWRpbmcgKz0gJ0ZlYnJ1YXJ5ICc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyOlxuICAgICAgICBzdWJoZWFkaW5nICs9ICdNYXJjaCAnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgc3ViaGVhZGluZyArPSAnQXByaWwgJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDQ6XG4gICAgICAgIHN1YmhlYWRpbmcgKz0gJ01heSAnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNTpcbiAgICAgICAgc3ViaGVhZGluZyArPSAnSnVuZSAnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNjpcbiAgICAgICAgc3ViaGVhZGluZyArPSAnSnVseSAnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNzpcbiAgICAgICAgc3ViaGVhZGluZyArPSAnQXVndXN0ICc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA4OlxuICAgICAgICBzdWJoZWFkaW5nICs9ICdTZXB0ZW1iZXIgJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDk6XG4gICAgICAgIHN1YmhlYWRpbmcgKz0gJ09jdG9iZXIgJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDEwOlxuICAgICAgICBzdWJoZWFkaW5nICs9ICdOb3ZlbWJlciAnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTE6XG4gICAgICAgIHN1YmhlYWRpbmcgKz0gJ0RlY2VtYmVyICc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgc3ViaGVhZGluZyArPSAnSmFudWFyeSAnO1xuICAgIH1cbiAgICBzdWJoZWFkaW5nICs9IHBhcnRzWzFdO1xuXG4gICAgcmV0dXJuIHN1YmhlYWRpbmc7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zb3VyY2VTdWIpIHtcbiAgICAgIHRoaXMuc291cmNlU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICB0aGlzLnNvdXJjZVN1YiA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgc2VhcmNoQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgnJyk7XG5cbiAgb25TZWFyY2hDaGFuZ2Uoc2VhcmNoVmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZG9TZWFyY2guZW1pdChzZWFyY2hWYWx1ZSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJzaWRlbmF2IG5vLXNjcm9sbGJhclwiPlxuICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMjBweDtcIj5cbiAgICA8bWF0LWZvcm0tZmllbGQgc3R5bGU9XCJ3aWR0aDogMTAwJVwiPlxuICAgICAgPG1hdC1sYWJlbD5TZWFyY2g8L21hdC1sYWJlbD5cbiAgICAgIDxpbnB1dCBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwic2VhcmNoQ29udHJvbFwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uU2VhcmNoQ2hhbmdlKCRldmVudClcIj5cbiAgICA8L21hdC1mb3JtLWZpZWxkPlxuICA8L2Rpdj5cblxuICA8ZGl2XG4gICAgY2xhc3M9XCJwcm9ncmVzc1wiXG4gICAgW2hpZGRlbl09XCIhbG9hZGluZ1wiXG4gID5cbiAgICA8bWF0LXByb2dyZXNzLXNwaW5uZXJcbiAgICAgIHN0eWxlPVwibWFyZ2luLWxlZnQ6IDE2cHg7XCJcbiAgICAgIFtkaWFtZXRlcl09MjBcbiAgICAgIG1vZGU9XCJpbmRldGVybWluYXRlXCJcbiAgICA+XG4gICAgPC9tYXQtcHJvZ3Jlc3Mtc3Bpbm5lcj5cbiAgPC9kaXY+XG5cbiAgPGRpdiAjbmF2Y29udGFpbmVyIGNsYXNzPVwibmF2Y29udGFpbmVyXCJcbiAgICBbQHNpZGVOYXZBbmltYXRpb25dPVwic3RhdGVcIlxuICA+XG4gICAgPG1hdC1uYXYtbGlzdFxuICAgICAgKm5nRm9yPVwibGV0IGNvbnRhaW5lciBvZiBlbnRyaWVzQnlNb250aEFuZFllYXJcIlxuICAgID5cbiAgICAgIDxoMz57e2dldE1vbnRoQW5kWWVhckZyb21LZXkoY29udGFpbmVyLm1vbnRoX3llYXIpfX08L2gzPlxuICAgICAgPGEgbWF0LWxpc3QtaXRlbSAqbmdGb3I9XCJsZXQgZW50cnkgb2YgY29udGFpbmVyLmVudHJpZXNcIiBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApXCIgKGNsaWNrKT1cInJvdXRlVG8oZW50cnkpXCI+e3tlbnRyeS50aXRsZX19PC9hPlxuICAgIDwvbWF0LW5hdi1saXN0PlxuXG4gICAgPGFcbiAgICAgIGNsYXNzPVwic2lkZWxpbmtcIlxuICAgICAgKm5nSWY9XCJ0aGlzPy5yZXNwb25zZT8ubmV4dCAmJiAhbG9hZGluZ1wiXG4gICAgICAoY2xpY2spPVwiZ2V0TW9yZSgpXCJcbiAgICAgIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMCk7XCI+TW9yZS4uLjwvYT5cbiAgPC9kaXY+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJpZGVudGl0eT8uaWQgPT09IDFcIj5cbiAgICA8aDI+TWlzYzwvaDI+XG5cbiAgICA8bWF0LW5hdi1saXN0PlxuICAgICAgPGEgbWF0LWxpc3QtaXRlbSBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApO1wiIChjbGljayk9XCJyb3V0ZVRvKG51bGwpXCI+Q3JlYXRlPC9hPlxuICAgIDwvbWF0LW5hdi1saXN0PlxuICA8L25nLWNvbnRhaW5lcj5cbiAgPGgzICpuZ0lmPVwiaWRlbnRpdHlcIj5Mb2dnZWQgaW4gYXMge3tpZGVudGl0eT8uZW1haWx9fTwvaDM+XG48L2Rpdj5cblxuIl19