@rolatech/angular-components 17.2.8

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 (62) hide show
  1. package/README.md +7 -0
  2. package/esm2022/index.mjs +26 -0
  3. package/esm2022/lib/angular-components.module.mjs +16 -0
  4. package/esm2022/lib/app-container/app-container.component.mjs +12 -0
  5. package/esm2022/lib/app-container-content/app-container-content.component.mjs +13 -0
  6. package/esm2022/lib/app-drawer/app-drawer.component.mjs +107 -0
  7. package/esm2022/lib/app-footer/app-footer.component.mjs +28 -0
  8. package/esm2022/lib/app-layout/app-layout.component.mjs +76 -0
  9. package/esm2022/lib/app-page/app-page.component.mjs +20 -0
  10. package/esm2022/lib/base.component.mjs +15 -0
  11. package/esm2022/lib/confirmation-dialog/confirmation-dialog.component.mjs +19 -0
  12. package/esm2022/lib/console-layout/console-layout.component.mjs +12 -0
  13. package/esm2022/lib/folder/folder.component.mjs +11 -0
  14. package/esm2022/lib/loading-spinner/loading-spinner.component.mjs +33 -0
  15. package/esm2022/lib/material.module.mjs +238 -0
  16. package/esm2022/lib/media-list/media-list.component.mjs +34 -0
  17. package/esm2022/lib/media-list-item/media-list-item.component.mjs +36 -0
  18. package/esm2022/lib/media-preview-dialog/media-preview-dialog.component.mjs +51 -0
  19. package/esm2022/lib/media-upload/media-upload.component.mjs +71 -0
  20. package/esm2022/lib/media-upload-dialog/media-upload-dialog.component.mjs +91 -0
  21. package/esm2022/lib/menu-user/menu-user.component.mjs +21 -0
  22. package/esm2022/lib/not-found/not-found.component.mjs +31 -0
  23. package/esm2022/lib/spacer/spacer.component.mjs +13 -0
  24. package/esm2022/lib/storage-bucket-create/storage-bucket-create.component.mjs +27 -0
  25. package/esm2022/lib/storage-file-upload/storage-file-upload.component.mjs +47 -0
  26. package/esm2022/lib/storage-folder-create/storage-folder-create.component.mjs +32 -0
  27. package/esm2022/lib/topbar/topbar.component.mjs +73 -0
  28. package/esm2022/lib/topbar-avatar-menu/topbar-avatar-menu.component.mjs +37 -0
  29. package/esm2022/lib/wechat-connect-dialog/wechat-connect-dialog.component.mjs +37 -0
  30. package/esm2022/rolatech-angular-components.mjs +5 -0
  31. package/fesm2022/rolatech-angular-components.mjs +1059 -0
  32. package/fesm2022/rolatech-angular-components.mjs.map +1 -0
  33. package/index.d.ts +25 -0
  34. package/lib/angular-components.module.d.ts +7 -0
  35. package/lib/app-container/app-container.component.d.ts +5 -0
  36. package/lib/app-container-content/app-container-content.component.d.ts +5 -0
  37. package/lib/app-drawer/app-drawer.component.d.ts +39 -0
  38. package/lib/app-footer/app-footer.component.d.ts +10 -0
  39. package/lib/app-layout/app-layout.component.d.ts +18 -0
  40. package/lib/app-page/app-page.component.d.ts +7 -0
  41. package/lib/base.component.d.ts +13 -0
  42. package/lib/confirmation-dialog/confirmation-dialog.component.d.ts +13 -0
  43. package/lib/console-layout/console-layout.component.d.ts +5 -0
  44. package/lib/folder/folder.component.d.ts +5 -0
  45. package/lib/loading-spinner/loading-spinner.component.d.ts +16 -0
  46. package/lib/material.module.d.ts +50 -0
  47. package/lib/media-list/media-list.component.d.ts +14 -0
  48. package/lib/media-list-item/media-list-item.component.d.ts +16 -0
  49. package/lib/media-preview-dialog/media-preview-dialog.component.d.ts +18 -0
  50. package/lib/media-upload/media-upload.component.d.ts +19 -0
  51. package/lib/media-upload-dialog/media-upload-dialog.component.d.ts +32 -0
  52. package/lib/menu-user/menu-user.component.d.ts +13 -0
  53. package/lib/not-found/not-found.component.d.ts +11 -0
  54. package/lib/spacer/spacer.component.d.ts +8 -0
  55. package/lib/storage-bucket-create/storage-bucket-create.component.d.ts +10 -0
  56. package/lib/storage-file-upload/storage-file-upload.component.d.ts +17 -0
  57. package/lib/storage-folder-create/storage-folder-create.component.d.ts +11 -0
  58. package/lib/topbar/topbar.component.d.ts +23 -0
  59. package/lib/topbar-avatar-menu/topbar-avatar-menu.component.d.ts +10 -0
  60. package/lib/wechat-connect-dialog/wechat-connect-dialog.component.d.ts +16 -0
  61. package/package.json +31 -0
  62. package/themes/_default.scss +1 -0
@@ -0,0 +1,1059 @@
1
+ import * as i0 from '@angular/core';
2
+ import { Component, EventEmitter, inject, ElementRef, Renderer2, PLATFORM_ID, ViewEncapsulation, HostBinding, Input, Output, viewChild, ViewChild, ContentChild, Inject, NgModule, ChangeDetectorRef, HostListener } from '@angular/core';
3
+ import * as i1 from '@angular/common';
4
+ import { CommonModule, isPlatformBrowser, NgClass } from '@angular/common';
5
+ import { MatSidenavModule, MatSidenav } from '@angular/material/sidenav';
6
+ import { MatNavList, MatListModule } from '@angular/material/list';
7
+ import * as i2$1 from '@angular/material/icon';
8
+ import { MatIcon, MatIconModule } from '@angular/material/icon';
9
+ import * as i1$5 from '@angular/router';
10
+ import { RouterLink, RouterLinkActive, RouterOutlet, RouterEvent, NavigationEnd, ActivatedRoute, Router } from '@angular/router';
11
+ import * as i1$1 from '@angular/material/button';
12
+ import { MatButtonModule, MatButton } from '@angular/material/button';
13
+ import { BreakpointObserver, Breakpoints, LayoutModule } from '@angular/cdk/layout';
14
+ import { map, shareReplay, filter } from 'rxjs';
15
+ import { APP_CONFIG, AngularCommonModule } from '@rolatech/angular-common';
16
+ import * as i2 from '@angular/material/menu';
17
+ import { MatMenuModule } from '@angular/material/menu';
18
+ import * as i1$2 from '@angular/material/dialog';
19
+ import { MAT_DIALOG_DATA, MatDialogModule, MatDialog, MatDialogRef, MatDialogContent, MatDialogActions, MatDialogClose, MatDialogTitle } from '@angular/material/dialog';
20
+ import * as i3 from '@angular/material/divider';
21
+ import { MatDividerModule } from '@angular/material/divider';
22
+ import { A11yModule } from '@angular/cdk/a11y';
23
+ import { ClipboardModule } from '@angular/cdk/clipboard';
24
+ import { DragDropModule } from '@angular/cdk/drag-drop';
25
+ import { PortalModule } from '@angular/cdk/portal';
26
+ import { ScrollingModule } from '@angular/cdk/scrolling';
27
+ import { CdkStepperModule } from '@angular/cdk/stepper';
28
+ import { CdkTableModule } from '@angular/cdk/table';
29
+ import { CdkTreeModule } from '@angular/cdk/tree';
30
+ import { MatAutocompleteModule } from '@angular/material/autocomplete';
31
+ import { MatBadgeModule } from '@angular/material/badge';
32
+ import { MatBottomSheetModule } from '@angular/material/bottom-sheet';
33
+ import { MatButtonToggleModule } from '@angular/material/button-toggle';
34
+ import { MatCardModule } from '@angular/material/card';
35
+ import * as i4 from '@angular/material/checkbox';
36
+ import { MatCheckboxModule } from '@angular/material/checkbox';
37
+ import { MatChipsModule } from '@angular/material/chips';
38
+ import { MatNativeDateModule, MatRippleModule } from '@angular/material/core';
39
+ import { MatDatepickerModule } from '@angular/material/datepicker';
40
+ import { MatExpansionModule } from '@angular/material/expansion';
41
+ import * as i1$3 from '@angular/material/form-field';
42
+ import { MatFormFieldModule } from '@angular/material/form-field';
43
+ import { MatGridListModule } from '@angular/material/grid-list';
44
+ import * as i2$2 from '@angular/material/input';
45
+ import { MatInputModule } from '@angular/material/input';
46
+ import { MatPaginatorModule } from '@angular/material/paginator';
47
+ import * as i1$4 from '@angular/material/progress-bar';
48
+ import { MatProgressBarModule } from '@angular/material/progress-bar';
49
+ import * as i4$1 from '@angular/material/progress-spinner';
50
+ import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
51
+ import { MatRadioModule } from '@angular/material/radio';
52
+ import { MatSelectModule } from '@angular/material/select';
53
+ import { MatSlideToggleModule } from '@angular/material/slide-toggle';
54
+ import { MatSliderModule } from '@angular/material/slider';
55
+ import { MatSnackBarModule } from '@angular/material/snack-bar';
56
+ import { MatSortModule } from '@angular/material/sort';
57
+ import { MatStepperModule } from '@angular/material/stepper';
58
+ import { MatTableModule } from '@angular/material/table';
59
+ import { MatTabsModule } from '@angular/material/tabs';
60
+ import { MatToolbarModule } from '@angular/material/toolbar';
61
+ import { MatTooltipModule } from '@angular/material/tooltip';
62
+ import { MatTreeModule } from '@angular/material/tree';
63
+ import * as i2$3 from '@rolatech/angular-services';
64
+ import { LoadingService, DialogService, SnackBarService } from '@rolatech/angular-services';
65
+ import * as i3$1 from '@angular/forms';
66
+ import { FormsModule } from '@angular/forms';
67
+ import { DomSanitizer, Title } from '@angular/platform-browser';
68
+
69
+ class AppContainerComponent {
70
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: AppContainerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
71
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.2.4", type: AppContainerComponent, isStandalone: true, selector: "rolatech-app-container", ngImport: i0, template: "<div>\n <ng-content></ng-content>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }] });
72
+ }
73
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: AppContainerComponent, decorators: [{
74
+ type: Component,
75
+ args: [{ selector: 'rolatech-app-container', standalone: true, imports: [CommonModule], template: "<div>\n <ng-content></ng-content>\n</div>\n" }]
76
+ }] });
77
+
78
+ class AppContainerContentComponent {
79
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: AppContainerContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
80
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.2.4", type: AppContainerContentComponent, isStandalone: true, selector: "rolatech-app-container-content", ngImport: i0, template: "<div>\n <ng-content></ng-content>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatSidenavModule }] });
81
+ }
82
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: AppContainerContentComponent, decorators: [{
83
+ type: Component,
84
+ args: [{ selector: 'rolatech-app-container-content', standalone: true, imports: [CommonModule, MatSidenavModule], template: "<div>\n <ng-content></ng-content>\n</div>\n" }]
85
+ }] });
86
+
87
+ class TopbarComponent {
88
+ hostId = 'rolatech-topbar';
89
+ hasClass = true;
90
+ title = '';
91
+ subtitle = '';
92
+ persistent = false;
93
+ toggle = new EventEmitter();
94
+ el = inject(ElementRef);
95
+ renderer = inject(Renderer2);
96
+ platformId = inject(PLATFORM_ID);
97
+ breakpointObserver = inject(BreakpointObserver);
98
+ isHandset$;
99
+ constructor() {
100
+ this.isHandset$ = this.breakpointObserver.observe([Breakpoints.Small, Breakpoints.HandsetPortrait]).pipe(map((result) => result.matches), shareReplay());
101
+ }
102
+ ngOnInit() {
103
+ this.setMenuIconVisible();
104
+ }
105
+ setMenuIconVisible() {
106
+ if (this.persistent) {
107
+ return;
108
+ }
109
+ if (isPlatformBrowser(this.platformId)) {
110
+ this.breakpointObserver
111
+ .observe(Breakpoints.Handset)
112
+ .pipe(map((result) => result.matches))
113
+ .subscribe({
114
+ next: (res) => {
115
+ if (res) {
116
+ this.renderer.removeAttribute(this.el.nativeElement, 'persistent');
117
+ }
118
+ else {
119
+ this.renderer.setAttribute(this.el.nativeElement, 'persistent', '');
120
+ }
121
+ },
122
+ });
123
+ }
124
+ }
125
+ onToggle() {
126
+ this.toggle.emit();
127
+ }
128
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: TopbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
129
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.2.4", type: TopbarComponent, isStandalone: true, selector: "rolatech-topbar", inputs: { title: "title", subtitle: "subtitle", persistent: "persistent" }, outputs: { toggle: "toggle" }, host: { properties: { "id": "this.hostId", "class.rolatech-topbar": "this.hasClass" } }, ngImport: i0, template: "<div class=\"h-14 sm:h-16 px-4 flex items-center\">\n @if (persistent || (isHandset$ | async)) {\n <button id=\"topbar-menu-button\" mat-icon-button class=\"flex\" onclick=\"this.blur()\" (click)=\"onToggle()\">\n <mat-icon>menu</mat-icon>\n </button>\n }\n\n <div class=\"cursor-pointer\" routerLink=\"/\">\n <div class=\"text-black text-lg sm:text-xl font-bold\">\n <span class=\"text-orange-600\">{{ title }}</span>\n <span>{{ subtitle }}</span>\n </div>\n </div>\n <ng-content></ng-content>\n</div>\n", styles: ["rolatech-topbar{position:fixed;top:0;width:100%;z-index:2020;transform:translateY(0);transition:transform .3s ease;background:var(--rolatech-topbar-background-color, #fff);color:var(--rolatech-topbar-color, #000)}rolatech-topbar:not(:has(#topbar-menu-button)){padding-left:16px}rolatech-app-layout rolatech-app-drawer[persistent][opened]~rolatech-topbar{margin-left:256px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1$1.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], encapsulation: i0.ViewEncapsulation.None });
130
+ }
131
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: TopbarComponent, decorators: [{
132
+ type: Component,
133
+ args: [{ selector: 'rolatech-topbar', standalone: true, imports: [CommonModule, RouterLink, MatButtonModule, MatIcon], encapsulation: ViewEncapsulation.None, template: "<div class=\"h-14 sm:h-16 px-4 flex items-center\">\n @if (persistent || (isHandset$ | async)) {\n <button id=\"topbar-menu-button\" mat-icon-button class=\"flex\" onclick=\"this.blur()\" (click)=\"onToggle()\">\n <mat-icon>menu</mat-icon>\n </button>\n }\n\n <div class=\"cursor-pointer\" routerLink=\"/\">\n <div class=\"text-black text-lg sm:text-xl font-bold\">\n <span class=\"text-orange-600\">{{ title }}</span>\n <span>{{ subtitle }}</span>\n </div>\n </div>\n <ng-content></ng-content>\n</div>\n", styles: ["rolatech-topbar{position:fixed;top:0;width:100%;z-index:2020;transform:translateY(0);transition:transform .3s ease;background:var(--rolatech-topbar-background-color, #fff);color:var(--rolatech-topbar-color, #000)}rolatech-topbar:not(:has(#topbar-menu-button)){padding-left:16px}rolatech-app-layout rolatech-app-drawer[persistent][opened]~rolatech-topbar{margin-left:256px}\n"] }]
134
+ }], ctorParameters: () => [], propDecorators: { hostId: [{
135
+ type: HostBinding,
136
+ args: ['id']
137
+ }], hasClass: [{
138
+ type: HostBinding,
139
+ args: ['class.rolatech-topbar']
140
+ }], title: [{
141
+ type: Input
142
+ }], subtitle: [{
143
+ type: Input
144
+ }], persistent: [{
145
+ type: Input
146
+ }], toggle: [{
147
+ type: Output
148
+ }] } });
149
+
150
+ class AppDrawerComponent {
151
+ opened = false;
152
+ links = [];
153
+ title = '';
154
+ subtitle = '';
155
+ persistent = false;
156
+ hostId = 'rolatech-app-drawer';
157
+ hasClass = true;
158
+ duration = '200ms';
159
+ el = inject(ElementRef);
160
+ renderer = inject(Renderer2);
161
+ platformId = inject(PLATFORM_ID);
162
+ breakpointObserver = inject(BreakpointObserver);
163
+ guideEl = viewChild('guide');
164
+ content = viewChild('content');
165
+ scrimEl = viewChild('scrim');
166
+ headerEl = viewChild('header');
167
+ isHandset$;
168
+ isMobile = false;
169
+ isPersistent = true;
170
+ completed = false;
171
+ open() {
172
+ this.opened = true;
173
+ this.renderer.setAttribute(this.el.nativeElement, 'opened', '');
174
+ this.renderer.setAttribute(this.content()?.nativeElement, 'opened', '');
175
+ if (this.isMobile) {
176
+ this.renderer.addClass(this.scrimEl()?.nativeElement, 'visible');
177
+ }
178
+ }
179
+ close() {
180
+ this.opened = false;
181
+ this.renderer.removeAttribute(this.el.nativeElement, 'opened');
182
+ this.renderer.removeAttribute(this.content()?.nativeElement, 'opened');
183
+ if (this.isMobile) {
184
+ this.renderer.removeClass(this.scrimEl()?.nativeElement, 'visible');
185
+ }
186
+ }
187
+ toggle() {
188
+ this.opened ? this.close() : this.open();
189
+ }
190
+ ngOnInit() {
191
+ if (isPlatformBrowser(this.platformId)) {
192
+ this.completed = false;
193
+ this.isHandset$ = this.breakpointObserver.observe(Breakpoints.Handset).pipe(map((result) => result.matches));
194
+ this.isHandset$.subscribe({
195
+ next: (res) => {
196
+ this.opened = !res;
197
+ this.isMobile = res;
198
+ this.isPersistent = !res;
199
+ if (res) {
200
+ if (this.persistent) {
201
+ this.renderer.removeAttribute(this.el.nativeElement, 'persistent');
202
+ this.renderer.removeAttribute(this.headerEl()?.nativeElement, 'hidden', '');
203
+ this.renderer.removeAttribute(this.el.nativeElement, 'opened');
204
+ this.renderer.removeAttribute(this.content()?.nativeElement, 'opened');
205
+ }
206
+ }
207
+ else {
208
+ if (this.persistent) {
209
+ this.renderer.setAttribute(this.el.nativeElement, 'persistent', '');
210
+ this.renderer.setAttribute(this.headerEl()?.nativeElement, 'hidden', '');
211
+ this.renderer.setAttribute(this.el.nativeElement, 'opened', '');
212
+ this.renderer.setAttribute(this.content()?.nativeElement, 'opened', '');
213
+ }
214
+ }
215
+ this.completed = true;
216
+ },
217
+ });
218
+ }
219
+ }
220
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: AppDrawerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
221
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.2.4", type: AppDrawerComponent, isStandalone: true, selector: "rolatech-app-drawer", inputs: { opened: "opened", links: "links", title: "title", subtitle: "subtitle", persistent: "persistent" }, host: { properties: { "id": "this.hostId", "class.rolatech-app-drawer": "this.hasClass", "style.transition-duration": "this.duration" } }, viewQueries: [{ propertyName: "guideEl", first: true, predicate: ["guide"], descendants: true, isSignal: true }, { propertyName: "content", first: true, predicate: ["content"], descendants: true, isSignal: true }, { propertyName: "scrimEl", first: true, predicate: ["scrim"], descendants: true, isSignal: true }, { propertyName: "headerEl", first: true, predicate: ["header"], descendants: true, isSignal: true }], ngImport: i0, template: "<div id=\"scrim\" #scrim class=\"tp-yt-app-drawer\" (click)=\"close()\" style=\"transition-duration: 200ms\"></div>\n<div id=\"contentContainer\" #content class=\"tp-yt-app-drawer\" style=\"transition-duration: 200ms\">\n <div id=\"guide-wrapper\">\n <div id=\"guide-spacer\"></div>\n <div id=\"guide-content\">\n <div id=\"header\" #header class=\"flex pl-4 h-14 items-center\">\n <button id=\"drawer-menu-button\" #menuButton mat-icon-button class=\"flex\" (click)=\"this.toggle()\" onclick=\"this.blur()\">\n <mat-icon>menu</mat-icon>\n </button>\n <div class=\"text-black text-lg sm:text-xl font-bold\" routerLink=\"/\">\n <span class=\"text-orange-600\">{{ title }}</span>\n <span>{{ subtitle }}</span>\n </div>\n </div>\n <div id=\"guide-inner-content\" class=\"flex flex-col ytd-app\">\n @if (completed) {\n <div class=\"flex px-2 flex-col gap-2\">\n @for (item of links; track $index) {\n @if (item.openinView) {\n <a\n class=\"flex p-2 hover:bg-gray-100 min-h-11\"\n [href]=\"item.link\"\n target=\"_blank\"\n (click)=\"this.isPersistent ? '' : this.close()\"\n >\n <div class=\"flex justify-between items-center w-full\">\n <div class=\"flex justify-start\">\n @if (item.icon) {\n <mat-icon class=\"ml-3\">{{ item.icon }}</mat-icon>\n }\n <div class=\"flex flex-col ml-3\">\n <span>{{ item.title }}</span>\n <span class=\"text-sm\">{{ item.subtitle }}</span>\n </div>\n </div>\n <mat-icon class=\"scale-90\">open_in_new</mat-icon>\n </div>\n </a>\n } @else {\n <a\n class=\"flex p-2 hover:bg-gray-100 min-h-11\"\n [routerLink]=\"item.link\"\n (click)=\"this.isPersistent ? '' : this.close()\"\n routerLinkActive=\"active\"\n [routerLinkActiveOptions]=\"{ exact: true }\"\n >\n <div class=\"flex justify-between items-center w-full\">\n <div class=\"flex justify-start\">\n @if (item.icon) {\n <mat-icon class=\"ml-3\">{{ item.icon }}</mat-icon>\n }\n <div class=\"flex flex-col ml-3\">\n <span>{{ item.title }}</span>\n <span class=\"text-sm\">{{ item.subtitle }}</span>\n </div>\n </div>\n </div>\n </a>\n }\n }\n </div>\n }\n </div>\n </div>\n </div>\n</div>\n", styles: ["rolatech-app-drawer{position:fixed;z-index:1;inset:-120px 0;visibility:hidden;transition-property:visibility}rolatech-app-drawer[opened]{visibility:visible}rolatech-app-drawer:not(:has(#drawer-menu-button)){padding-left:16px}[hidden]{display:none!important}#contentContainer.tp-yt-app-drawer{position:absolute;top:0;bottom:0;left:0;width:var(--app-drawer-width, 256px);padding:var(--app-drawer-content-padding, 120px 0);transition-property:-webkit-transform;transition-property:transform;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);background-color:#fff;background-color:var(--app-drawer-content-container-background-color, white)}#contentContainer.tp-yt-app-drawer[opened]{-webkit-transform:translate3d(0,0,0);transform:translateZ(0)}#guide-inner-content.ytd-app{overflow:hidden;flex:1;flex-basis:.000000001px;overflow-y:auto;scrollbar-color:transparent transparent;scrollbar-width:thin}#scrim.tp-yt-app-drawer{position:absolute;inset:0;transition-property:opacity;-webkit-transform:translateZ(0);transform:translateZ(0);opacity:0;background:var(--app-drawer-scrim-background, rgba(0, 0, 0, .5))}#scrim.visible.tp-yt-app-drawer{opacity:1}rolatech-app-drawer[persistent]{width:var(--app-drawer-width, 256px)}#guide-spacer{margin-top:var(--ytd-masthead-height, 64px)}rolatech-app-drawer:not([persistent]) #guide-spacer{display:none}rolatech-app-drawer:not([persistent]){z-index:2030}.active{background-color:#0000000d;border-radius:8px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1$1.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }], encapsulation: i0.ViewEncapsulation.None });
222
+ }
223
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: AppDrawerComponent, decorators: [{
224
+ type: Component,
225
+ args: [{ selector: 'rolatech-app-drawer', standalone: true, imports: [CommonModule, MatNavList, MatIcon, RouterLink, RouterLinkActive, MatButton, MatButtonModule], encapsulation: ViewEncapsulation.None, template: "<div id=\"scrim\" #scrim class=\"tp-yt-app-drawer\" (click)=\"close()\" style=\"transition-duration: 200ms\"></div>\n<div id=\"contentContainer\" #content class=\"tp-yt-app-drawer\" style=\"transition-duration: 200ms\">\n <div id=\"guide-wrapper\">\n <div id=\"guide-spacer\"></div>\n <div id=\"guide-content\">\n <div id=\"header\" #header class=\"flex pl-4 h-14 items-center\">\n <button id=\"drawer-menu-button\" #menuButton mat-icon-button class=\"flex\" (click)=\"this.toggle()\" onclick=\"this.blur()\">\n <mat-icon>menu</mat-icon>\n </button>\n <div class=\"text-black text-lg sm:text-xl font-bold\" routerLink=\"/\">\n <span class=\"text-orange-600\">{{ title }}</span>\n <span>{{ subtitle }}</span>\n </div>\n </div>\n <div id=\"guide-inner-content\" class=\"flex flex-col ytd-app\">\n @if (completed) {\n <div class=\"flex px-2 flex-col gap-2\">\n @for (item of links; track $index) {\n @if (item.openinView) {\n <a\n class=\"flex p-2 hover:bg-gray-100 min-h-11\"\n [href]=\"item.link\"\n target=\"_blank\"\n (click)=\"this.isPersistent ? '' : this.close()\"\n >\n <div class=\"flex justify-between items-center w-full\">\n <div class=\"flex justify-start\">\n @if (item.icon) {\n <mat-icon class=\"ml-3\">{{ item.icon }}</mat-icon>\n }\n <div class=\"flex flex-col ml-3\">\n <span>{{ item.title }}</span>\n <span class=\"text-sm\">{{ item.subtitle }}</span>\n </div>\n </div>\n <mat-icon class=\"scale-90\">open_in_new</mat-icon>\n </div>\n </a>\n } @else {\n <a\n class=\"flex p-2 hover:bg-gray-100 min-h-11\"\n [routerLink]=\"item.link\"\n (click)=\"this.isPersistent ? '' : this.close()\"\n routerLinkActive=\"active\"\n [routerLinkActiveOptions]=\"{ exact: true }\"\n >\n <div class=\"flex justify-between items-center w-full\">\n <div class=\"flex justify-start\">\n @if (item.icon) {\n <mat-icon class=\"ml-3\">{{ item.icon }}</mat-icon>\n }\n <div class=\"flex flex-col ml-3\">\n <span>{{ item.title }}</span>\n <span class=\"text-sm\">{{ item.subtitle }}</span>\n </div>\n </div>\n </div>\n </a>\n }\n }\n </div>\n }\n </div>\n </div>\n </div>\n</div>\n", styles: ["rolatech-app-drawer{position:fixed;z-index:1;inset:-120px 0;visibility:hidden;transition-property:visibility}rolatech-app-drawer[opened]{visibility:visible}rolatech-app-drawer:not(:has(#drawer-menu-button)){padding-left:16px}[hidden]{display:none!important}#contentContainer.tp-yt-app-drawer{position:absolute;top:0;bottom:0;left:0;width:var(--app-drawer-width, 256px);padding:var(--app-drawer-content-padding, 120px 0);transition-property:-webkit-transform;transition-property:transform;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);background-color:#fff;background-color:var(--app-drawer-content-container-background-color, white)}#contentContainer.tp-yt-app-drawer[opened]{-webkit-transform:translate3d(0,0,0);transform:translateZ(0)}#guide-inner-content.ytd-app{overflow:hidden;flex:1;flex-basis:.000000001px;overflow-y:auto;scrollbar-color:transparent transparent;scrollbar-width:thin}#scrim.tp-yt-app-drawer{position:absolute;inset:0;transition-property:opacity;-webkit-transform:translateZ(0);transform:translateZ(0);opacity:0;background:var(--app-drawer-scrim-background, rgba(0, 0, 0, .5))}#scrim.visible.tp-yt-app-drawer{opacity:1}rolatech-app-drawer[persistent]{width:var(--app-drawer-width, 256px)}#guide-spacer{margin-top:var(--ytd-masthead-height, 64px)}rolatech-app-drawer:not([persistent]) #guide-spacer{display:none}rolatech-app-drawer:not([persistent]){z-index:2030}.active{background-color:#0000000d;border-radius:8px}\n"] }]
226
+ }], propDecorators: { opened: [{
227
+ type: Input
228
+ }], links: [{
229
+ type: Input
230
+ }], title: [{
231
+ type: Input
232
+ }], subtitle: [{
233
+ type: Input
234
+ }], persistent: [{
235
+ type: Input
236
+ }], hostId: [{
237
+ type: HostBinding,
238
+ args: ['id']
239
+ }], hasClass: [{
240
+ type: HostBinding,
241
+ args: ['class.rolatech-app-drawer']
242
+ }], duration: [{
243
+ type: HostBinding,
244
+ args: ['style.transition-duration']
245
+ }] } });
246
+
247
+ class AppLayoutComponent {
248
+ hostId = 'rolatech-app-layout';
249
+ hasClass = true;
250
+ scrimEl = viewChild('rolatech-app-drawer');
251
+ appDrawer = viewChild('rolatech-app-drawer');
252
+ myElement;
253
+ targetElement;
254
+ el = inject(ElementRef);
255
+ renderer = inject(Renderer2);
256
+ platformId = inject(PLATFORM_ID);
257
+ breakpointObserver = inject(BreakpointObserver);
258
+ ngOnInit() {
259
+ if (isPlatformBrowser(this.platformId)) {
260
+ this.breakpointObserver
261
+ .observe(Breakpoints.Handset)
262
+ .pipe(map((result) => result.matches))
263
+ .subscribe({
264
+ next: (res) => {
265
+ if (res) {
266
+ this.renderer.removeAttribute(this.el.nativeElement, 'persistent');
267
+ }
268
+ else {
269
+ this.renderer.setAttribute(this.el.nativeElement, 'persistent', '');
270
+ }
271
+ },
272
+ });
273
+ }
274
+ }
275
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: AppLayoutComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
276
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "17.2.4", type: AppLayoutComponent, isStandalone: true, selector: "rolatech-app-layout", host: { properties: { "id": "this.hostId", "class.rolatech-app-layout": "this.hasClass" } }, queries: [{ propertyName: "targetElement", first: true, predicate: ["rolatech-app-drawer"], descendants: true }], viewQueries: [{ propertyName: "scrimEl", first: true, predicate: ["rolatech-app-drawer"], descendants: true, isSignal: true }, { propertyName: "appDrawer", first: true, predicate: ["rolatech-app-drawer"], descendants: true, isSignal: true }, { propertyName: "myElement", first: true, predicate: ["rolatech-app-drawer"], descendants: true, static: true }], ngImport: i0, template: "<ng-content select=\"rolatech-topbar\"></ng-content>\n<ng-content select=\"rolatech-app-drawer\"></ng-content>\n<ng-content select=\"rolatech-app-page\"></ng-content>\n<ng-content select=\"rolatech-app-footer\"></ng-content>\n", styles: ["rolatech-app-layout rolatech-app-drawer[persistent][opened]~rolatech-app-page{margin-left:256px}rolatech-app-page{display:block;padding-top:64px;transition-duration:.4s;transition-timing-function:cubic-bezier(.25,.8,.25,1);transition-property:transform,margin-left,margin-right}rolatech-app-page[mini-guide-visible] .content{margin-left:72px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatListModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: MatSidenavModule }], encapsulation: i0.ViewEncapsulation.None });
277
+ }
278
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: AppLayoutComponent, decorators: [{
279
+ type: Component,
280
+ args: [{ selector: 'rolatech-app-layout', standalone: true, imports: [
281
+ CommonModule,
282
+ RouterLink,
283
+ RouterOutlet,
284
+ AppContainerComponent,
285
+ AppContainerContentComponent,
286
+ MatListModule,
287
+ MatNavList,
288
+ MatSidenav,
289
+ MatButtonModule,
290
+ MatIconModule,
291
+ MatSidenavModule,
292
+ TopbarComponent,
293
+ AppDrawerComponent,
294
+ ], encapsulation: ViewEncapsulation.None, template: "<ng-content select=\"rolatech-topbar\"></ng-content>\n<ng-content select=\"rolatech-app-drawer\"></ng-content>\n<ng-content select=\"rolatech-app-page\"></ng-content>\n<ng-content select=\"rolatech-app-footer\"></ng-content>\n", styles: ["rolatech-app-layout rolatech-app-drawer[persistent][opened]~rolatech-app-page{margin-left:256px}rolatech-app-page{display:block;padding-top:64px;transition-duration:.4s;transition-timing-function:cubic-bezier(.25,.8,.25,1);transition-property:transform,margin-left,margin-right}rolatech-app-page[mini-guide-visible] .content{margin-left:72px}\n"] }]
295
+ }], propDecorators: { hostId: [{
296
+ type: HostBinding,
297
+ args: ['id']
298
+ }], hasClass: [{
299
+ type: HostBinding,
300
+ args: ['class.rolatech-app-layout']
301
+ }], myElement: [{
302
+ type: ViewChild,
303
+ args: ['rolatech-app-drawer', { static: true }]
304
+ }], targetElement: [{
305
+ type: ContentChild,
306
+ args: ['rolatech-app-drawer']
307
+ }] } });
308
+
309
+ class AppPageComponent {
310
+ hostId = 'rolatech-app-page';
311
+ hasClass = true;
312
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: AppPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
313
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.2.4", type: AppPageComponent, isStandalone: true, selector: "rolatech-app-page", host: { properties: { "id": "this.hostId", "class.rolatech-app-page": "this.hasClass" } }, ngImport: i0, template: "<ng-content></ng-content>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }], encapsulation: i0.ViewEncapsulation.None });
314
+ }
315
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: AppPageComponent, decorators: [{
316
+ type: Component,
317
+ args: [{ selector: 'rolatech-app-page', standalone: true, imports: [CommonModule], encapsulation: ViewEncapsulation.None, template: "<ng-content></ng-content>\n" }]
318
+ }], propDecorators: { hostId: [{
319
+ type: HostBinding,
320
+ args: ['id']
321
+ }], hasClass: [{
322
+ type: HostBinding,
323
+ args: ['class.rolatech-app-page']
324
+ }] } });
325
+
326
+ class AppFooterComponent {
327
+ hostId = 'rolatech-app-footer';
328
+ hasClass = true;
329
+ config = inject(APP_CONFIG);
330
+ title = '';
331
+ copyright = '';
332
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: AppFooterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
333
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.2.4", type: AppFooterComponent, isStandalone: true, selector: "rolatech-app-footer", inputs: { title: "title", copyright: "copyright" }, host: { properties: { "id": "this.hostId", "class.rolatech-app-footer": "this.hasClass" } }, ngImport: i0, template: "<div class=\"bg-gray-100 text-black flex flex-col justify-between px-5 sm:px-16 py-6\">\n <div class=\"flex flex-col sm:flex-row sm:gap-10 gap-3 py-3\">\n <ng-content></ng-content>\n </div>\n <div class=\"flex justify-between mt-6\">\n <div class=\"cursor-pointer\">\n <a href=\"/\" target=\"_blank\" class=\"text-lg font-bold\">{{ title }}</a>\n </div>\n <span class=\"text-sm font-thin\">\u00A9{{ copyright }}</span>\n </div>\n</div>\n", styles: [".rolatech-app-footer{position:fixed;bottom:0;width:100%;z-index:2020;transform:translateY(0);transition:transform .3s ease}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], encapsulation: i0.ViewEncapsulation.None });
334
+ }
335
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: AppFooterComponent, decorators: [{
336
+ type: Component,
337
+ args: [{ selector: 'rolatech-app-footer', standalone: true, imports: [CommonModule], encapsulation: ViewEncapsulation.None, template: "<div class=\"bg-gray-100 text-black flex flex-col justify-between px-5 sm:px-16 py-6\">\n <div class=\"flex flex-col sm:flex-row sm:gap-10 gap-3 py-3\">\n <ng-content></ng-content>\n </div>\n <div class=\"flex justify-between mt-6\">\n <div class=\"cursor-pointer\">\n <a href=\"/\" target=\"_blank\" class=\"text-lg font-bold\">{{ title }}</a>\n </div>\n <span class=\"text-sm font-thin\">\u00A9{{ copyright }}</span>\n </div>\n</div>\n", styles: [".rolatech-app-footer{position:fixed;bottom:0;width:100%;z-index:2020;transform:translateY(0);transition:transform .3s ease}\n"] }]
338
+ }], propDecorators: { hostId: [{
339
+ type: HostBinding,
340
+ args: ['id']
341
+ }], hasClass: [{
342
+ type: HostBinding,
343
+ args: ['class.rolatech-app-footer']
344
+ }], title: [{
345
+ type: Input
346
+ }], copyright: [{
347
+ type: Input
348
+ }] } });
349
+
350
+ class ConsoleLayoutComponent {
351
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: ConsoleLayoutComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
352
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.2.4", type: ConsoleLayoutComponent, isStandalone: true, selector: "rolatech-console-layout", ngImport: i0, template: "<p>console-layout works!</p>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }] });
353
+ }
354
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: ConsoleLayoutComponent, decorators: [{
355
+ type: Component,
356
+ args: [{ selector: 'rolatech-console-layout', standalone: true, imports: [CommonModule], template: "<p>console-layout works!</p>\n" }]
357
+ }] });
358
+
359
+ class MenuUserComponent {
360
+ user;
361
+ myaccountUrl = '';
362
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: MenuUserComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
363
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.2.4", type: MenuUserComponent, isStandalone: true, selector: "rolatech-menu-user", inputs: { user: "user", myaccountUrl: "myaccountUrl" }, ngImport: i0, template: "<div class=\"min-w-[256px]\">\n <div class=\"px-6 py-3\">\n <div class=\"flex flex-row items-center\">\n <div class=\"mr-3 w-14 h-14 rounded-full bg-orange-600\">\n @if (user?.avatar) {\n <img [src]=\"user.avatar\" class=\"w-14 h-14 object-cover rounded-full\" />\n }\n </div>\n <div class=\"flex flex-col\">\n <div>\n <div class=\"text-lg font-bold\">{{ user?.name }}</div>\n <div class=\"formated-string\">\n <span>&#64;{{ user?.username }}</span>\n </div>\n </div>\n </div>\n </div>\n <!-- <div class=\"flex\">\n <a\n [href]=\"myaccountUrl\"\n target=\"_blank\"\n class=\"text-sm my-2 p-1 px-6 ml-24 rounded border border-gray-300 hover:bg-gray-200\"\n >\u7528\u6237\u4E2D\u5FC3</a\n >\n </div> -->\n </div>\n <div class=\"flex justify-between items-center\">\n <a mat-menu-item [href]=\"myaccountUrl\" target=\"_blank\" class=\"px-6\">\n <span class=\"flex justify-between items-center\">\n <span class=\"pl-2\"> \u7528\u6237\u4E2D\u5FC3 </span>\n <span class=\"flex\"> <mat-icon>open_in_new</mat-icon></span>\n </span>\n </a>\n </div>\n</div>\n", styles: [".formated-string{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,sans-serif}\n"], dependencies: [{ kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i2.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] });
364
+ }
365
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: MenuUserComponent, decorators: [{
366
+ type: Component,
367
+ args: [{ standalone: true, imports: [MatMenuModule, MatIconModule], selector: 'rolatech-menu-user', template: "<div class=\"min-w-[256px]\">\n <div class=\"px-6 py-3\">\n <div class=\"flex flex-row items-center\">\n <div class=\"mr-3 w-14 h-14 rounded-full bg-orange-600\">\n @if (user?.avatar) {\n <img [src]=\"user.avatar\" class=\"w-14 h-14 object-cover rounded-full\" />\n }\n </div>\n <div class=\"flex flex-col\">\n <div>\n <div class=\"text-lg font-bold\">{{ user?.name }}</div>\n <div class=\"formated-string\">\n <span>&#64;{{ user?.username }}</span>\n </div>\n </div>\n </div>\n </div>\n <!-- <div class=\"flex\">\n <a\n [href]=\"myaccountUrl\"\n target=\"_blank\"\n class=\"text-sm my-2 p-1 px-6 ml-24 rounded border border-gray-300 hover:bg-gray-200\"\n >\u7528\u6237\u4E2D\u5FC3</a\n >\n </div> -->\n </div>\n <div class=\"flex justify-between items-center\">\n <a mat-menu-item [href]=\"myaccountUrl\" target=\"_blank\" class=\"px-6\">\n <span class=\"flex justify-between items-center\">\n <span class=\"pl-2\"> \u7528\u6237\u4E2D\u5FC3 </span>\n <span class=\"flex\"> <mat-icon>open_in_new</mat-icon></span>\n </span>\n </a>\n </div>\n</div>\n", styles: [".formated-string{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,sans-serif}\n"] }]
368
+ }], propDecorators: { user: [{
369
+ type: Input
370
+ }], myaccountUrl: [{
371
+ type: Input
372
+ }] } });
373
+
374
+ class TopbarAvatarMenuComponent {
375
+ environment = inject(APP_CONFIG);
376
+ platformId = inject(PLATFORM_ID);
377
+ menu;
378
+ user;
379
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: TopbarAvatarMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
380
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.2.4", type: TopbarAvatarMenuComponent, isStandalone: true, selector: "rolatech-topbar-avatar-menu", inputs: { menu: "menu", user: "user" }, ngImport: i0, template: "<div>\n @if (user) {\n <div class=\"flex\">\n <a\n class=\"flex justify-center items-center rounded-full overflow-hidden cursor-pointer hover:outline-gray-200 outline outline-transparent outline-4\"\n [matMenuTriggerFor]=\"menu\"\n >\n <div class=\"bg-orange-600 w-9 h-9\">\n @if (user.avatar) {\n <img class=\"w-9 h-9 object-cover\" [src]=\"user.avatar\" />\n }\n </div>\n </a>\n </div>\n }\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatSidenavModule }, { kind: "ngmodule", type: MatListModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: MatMenuModule }, { kind: "directive", type: i2.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }] });
381
+ }
382
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: TopbarAvatarMenuComponent, decorators: [{
383
+ type: Component,
384
+ args: [{ selector: 'rolatech-topbar-avatar-menu', standalone: true, imports: [
385
+ CommonModule,
386
+ MatSidenavModule,
387
+ RouterLink,
388
+ MatListModule,
389
+ MatIconModule,
390
+ MatMenuModule,
391
+ RouterOutlet,
392
+ MenuUserComponent,
393
+ ], template: "<div>\n @if (user) {\n <div class=\"flex\">\n <a\n class=\"flex justify-center items-center rounded-full overflow-hidden cursor-pointer hover:outline-gray-200 outline outline-transparent outline-4\"\n [matMenuTriggerFor]=\"menu\"\n >\n <div class=\"bg-orange-600 w-9 h-9\">\n @if (user.avatar) {\n <img class=\"w-9 h-9 object-cover\" [src]=\"user.avatar\" />\n }\n </div>\n </a>\n </div>\n }\n</div>\n" }]
394
+ }], propDecorators: { menu: [{
395
+ type: Input
396
+ }], user: [{
397
+ type: Input
398
+ }] } });
399
+
400
+ class FolderComponent {
401
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: FolderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
402
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.2.4", type: FolderComponent, isStandalone: true, selector: "rolatech-folder", ngImport: i0, template: "<div></div>\n", styles: [""] });
403
+ }
404
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: FolderComponent, decorators: [{
405
+ type: Component,
406
+ args: [{ selector: 'rolatech-folder', standalone: true, template: "<div></div>\n" }]
407
+ }] });
408
+
409
+ class MediaPreviewDialogComponent {
410
+ data;
411
+ dialogRef;
412
+ selected;
413
+ index = 0;
414
+ prevDisabled = false;
415
+ nextDisabled = false;
416
+ constructor(data, dialogRef) {
417
+ this.data = data;
418
+ this.dialogRef = dialogRef;
419
+ this.data.title = '图片预览';
420
+ }
421
+ ngOnInit() {
422
+ this.selected = this.data.selected;
423
+ this.prevDisabled = this.selected === 0;
424
+ this.nextDisabled = this.selected === this.data.media.length - 1;
425
+ }
426
+ close() {
427
+ this.dialogRef.close();
428
+ }
429
+ prev() {
430
+ this.selected--;
431
+ this.prevDisabled = this.selected === 0;
432
+ this.nextDisabled = this.selected === this.data.media.length - 1;
433
+ }
434
+ next() {
435
+ this.selected++;
436
+ this.prevDisabled = this.selected === 0;
437
+ this.nextDisabled = this.selected === this.data.media.length - 1;
438
+ }
439
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: MediaPreviewDialogComponent, deps: [{ token: MAT_DIALOG_DATA }, { token: i1$2.MatDialogRef }], target: i0.ɵɵFactoryTarget.Component });
440
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.2.4", type: MediaPreviewDialogComponent, isStandalone: true, selector: "rolatech-media-preview-dialog", ngImport: i0, template: "<div class=\"flex flex-col h-full overflow-hidden\">\n <div class=\"h-16 flex justify-between items-center px-5\">\n @if (data.title) {\n <div class=\"text-md font-medium\">{{ data.title }}</div>\n }\n <div class=\"cursor-pointer\" (click)=\"close()\">\n <mat-icon fontIcon=\"close\"></mat-icon>\n </div>\n </div>\n <mat-divider></mat-divider>\n <div class=\"flex-1 overflow-hidden overflow-y-auto\">\n <div class=\"p-3 flex justify-center items-center\">\n <img class=\"object-cover\" [src]=\"data.media[selected].url\" />\n </div>\n </div>\n <mat-divider></mat-divider>\n <div class=\"h-16 flex justify-between items-center px-5\">\n <button mat-flat-button [disabled]=\"prevDisabled\" (click)=\"prev()\">Prev</button>\n <div>{{ selected + 1 }} / {{ data.media.length }}</div>\n <button mat-flat-button [disabled]=\"nextDisabled\" (click)=\"next()\">Next</button>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatDividerModule }, { kind: "component", type: i3.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1$1.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }] });
441
+ }
442
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: MediaPreviewDialogComponent, decorators: [{
443
+ type: Component,
444
+ args: [{ selector: 'rolatech-media-preview-dialog', standalone: true, imports: [MatIconModule, MatDividerModule, MatButtonModule], template: "<div class=\"flex flex-col h-full overflow-hidden\">\n <div class=\"h-16 flex justify-between items-center px-5\">\n @if (data.title) {\n <div class=\"text-md font-medium\">{{ data.title }}</div>\n }\n <div class=\"cursor-pointer\" (click)=\"close()\">\n <mat-icon fontIcon=\"close\"></mat-icon>\n </div>\n </div>\n <mat-divider></mat-divider>\n <div class=\"flex-1 overflow-hidden overflow-y-auto\">\n <div class=\"p-3 flex justify-center items-center\">\n <img class=\"object-cover\" [src]=\"data.media[selected].url\" />\n </div>\n </div>\n <mat-divider></mat-divider>\n <div class=\"h-16 flex justify-between items-center px-5\">\n <button mat-flat-button [disabled]=\"prevDisabled\" (click)=\"prev()\">Prev</button>\n <div>{{ selected + 1 }} / {{ data.media.length }}</div>\n <button mat-flat-button [disabled]=\"nextDisabled\" (click)=\"next()\">Next</button>\n </div>\n</div>\n" }]
445
+ }], ctorParameters: () => [{ type: undefined, decorators: [{
446
+ type: Inject,
447
+ args: [MAT_DIALOG_DATA]
448
+ }] }, { type: i1$2.MatDialogRef }] });
449
+
450
+ const MAT_MODULE = [
451
+ A11yModule,
452
+ ClipboardModule,
453
+ CdkStepperModule,
454
+ CdkTableModule,
455
+ CdkTreeModule,
456
+ DragDropModule,
457
+ LayoutModule,
458
+ MatAutocompleteModule,
459
+ MatBadgeModule,
460
+ MatBottomSheetModule,
461
+ MatButtonModule,
462
+ MatButtonToggleModule,
463
+ MatCardModule,
464
+ MatCheckboxModule,
465
+ MatChipsModule,
466
+ MatStepperModule,
467
+ MatDatepickerModule,
468
+ MatDialogModule,
469
+ MatDividerModule,
470
+ MatExpansionModule,
471
+ MatGridListModule,
472
+ MatIconModule,
473
+ MatFormFieldModule,
474
+ MatInputModule,
475
+ MatListModule,
476
+ MatMenuModule,
477
+ MatNativeDateModule,
478
+ MatPaginatorModule,
479
+ MatProgressBarModule,
480
+ MatProgressSpinnerModule,
481
+ MatRadioModule,
482
+ MatRippleModule,
483
+ MatSelectModule,
484
+ MatSidenavModule,
485
+ MatSliderModule,
486
+ MatSlideToggleModule,
487
+ MatSnackBarModule,
488
+ MatSortModule,
489
+ MatTableModule,
490
+ MatTabsModule,
491
+ MatToolbarModule,
492
+ MatTooltipModule,
493
+ MatTreeModule,
494
+ PortalModule,
495
+ ScrollingModule,
496
+ ];
497
+ class MaterialModule {
498
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: MaterialModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
499
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.2.4", ngImport: i0, type: MaterialModule, imports: [A11yModule,
500
+ ClipboardModule,
501
+ CdkStepperModule,
502
+ CdkTableModule,
503
+ CdkTreeModule,
504
+ DragDropModule,
505
+ LayoutModule,
506
+ MatAutocompleteModule,
507
+ MatBadgeModule,
508
+ MatBottomSheetModule,
509
+ MatButtonModule,
510
+ MatButtonToggleModule,
511
+ MatCardModule,
512
+ MatCheckboxModule,
513
+ MatChipsModule,
514
+ MatStepperModule,
515
+ MatDatepickerModule,
516
+ MatDialogModule,
517
+ MatDividerModule,
518
+ MatExpansionModule,
519
+ MatGridListModule,
520
+ MatIconModule,
521
+ MatFormFieldModule,
522
+ MatInputModule,
523
+ MatListModule,
524
+ MatMenuModule,
525
+ MatNativeDateModule,
526
+ MatPaginatorModule,
527
+ MatProgressBarModule,
528
+ MatProgressSpinnerModule,
529
+ MatRadioModule,
530
+ MatRippleModule,
531
+ MatSelectModule,
532
+ MatSidenavModule,
533
+ MatSliderModule,
534
+ MatSlideToggleModule,
535
+ MatSnackBarModule,
536
+ MatSortModule,
537
+ MatTableModule,
538
+ MatTabsModule,
539
+ MatToolbarModule,
540
+ MatTooltipModule,
541
+ MatTreeModule,
542
+ PortalModule,
543
+ ScrollingModule], exports: [A11yModule,
544
+ ClipboardModule,
545
+ CdkStepperModule,
546
+ CdkTableModule,
547
+ CdkTreeModule,
548
+ DragDropModule,
549
+ LayoutModule,
550
+ MatAutocompleteModule,
551
+ MatBadgeModule,
552
+ MatBottomSheetModule,
553
+ MatButtonModule,
554
+ MatButtonToggleModule,
555
+ MatCardModule,
556
+ MatCheckboxModule,
557
+ MatChipsModule,
558
+ MatStepperModule,
559
+ MatDatepickerModule,
560
+ MatDialogModule,
561
+ MatDividerModule,
562
+ MatExpansionModule,
563
+ MatGridListModule,
564
+ MatIconModule,
565
+ MatFormFieldModule,
566
+ MatInputModule,
567
+ MatListModule,
568
+ MatMenuModule,
569
+ MatNativeDateModule,
570
+ MatPaginatorModule,
571
+ MatProgressBarModule,
572
+ MatProgressSpinnerModule,
573
+ MatRadioModule,
574
+ MatRippleModule,
575
+ MatSelectModule,
576
+ MatSidenavModule,
577
+ MatSliderModule,
578
+ MatSlideToggleModule,
579
+ MatSnackBarModule,
580
+ MatSortModule,
581
+ MatTableModule,
582
+ MatTabsModule,
583
+ MatToolbarModule,
584
+ MatTooltipModule,
585
+ MatTreeModule,
586
+ PortalModule,
587
+ ScrollingModule] });
588
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: MaterialModule, imports: [MAT_MODULE, A11yModule,
589
+ ClipboardModule,
590
+ CdkStepperModule,
591
+ CdkTableModule,
592
+ CdkTreeModule,
593
+ DragDropModule,
594
+ LayoutModule,
595
+ MatAutocompleteModule,
596
+ MatBadgeModule,
597
+ MatBottomSheetModule,
598
+ MatButtonModule,
599
+ MatButtonToggleModule,
600
+ MatCardModule,
601
+ MatCheckboxModule,
602
+ MatChipsModule,
603
+ MatStepperModule,
604
+ MatDatepickerModule,
605
+ MatDialogModule,
606
+ MatDividerModule,
607
+ MatExpansionModule,
608
+ MatGridListModule,
609
+ MatIconModule,
610
+ MatFormFieldModule,
611
+ MatInputModule,
612
+ MatListModule,
613
+ MatMenuModule,
614
+ MatNativeDateModule,
615
+ MatPaginatorModule,
616
+ MatProgressBarModule,
617
+ MatProgressSpinnerModule,
618
+ MatRadioModule,
619
+ MatRippleModule,
620
+ MatSelectModule,
621
+ MatSidenavModule,
622
+ MatSliderModule,
623
+ MatSlideToggleModule,
624
+ MatSnackBarModule,
625
+ MatSortModule,
626
+ MatTableModule,
627
+ MatTabsModule,
628
+ MatToolbarModule,
629
+ MatTooltipModule,
630
+ MatTreeModule,
631
+ PortalModule,
632
+ ScrollingModule] });
633
+ }
634
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: MaterialModule, decorators: [{
635
+ type: NgModule,
636
+ args: [{
637
+ imports: [...MAT_MODULE],
638
+ exports: [...MAT_MODULE],
639
+ }]
640
+ }] });
641
+
642
+ class AngularComponentsModule {
643
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: AngularComponentsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
644
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.2.4", ngImport: i0, type: AngularComponentsModule, imports: [MaterialModule], exports: [MaterialModule] });
645
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: AngularComponentsModule, imports: [MaterialModule, MaterialModule] });
646
+ }
647
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: AngularComponentsModule, decorators: [{
648
+ type: NgModule,
649
+ args: [{
650
+ imports: [MaterialModule],
651
+ exports: [MaterialModule],
652
+ }]
653
+ }] });
654
+
655
+ class LoadingSpinnerComponent {
656
+ title = '';
657
+ isLoading;
658
+ loadingSubscription;
659
+ loadingService = inject(LoadingService);
660
+ _elmRef = inject(ElementRef);
661
+ _changeDetectorRef = inject(ChangeDetectorRef);
662
+ ngAfterViewInit() {
663
+ // this.isLoading = true;
664
+ this._elmRef.nativeElement.style.display = 'none';
665
+ this.loadingSubscription = this.loadingService.loading$.pipe().subscribe((status) => {
666
+ this._elmRef.nativeElement.style.display = status ? 'block' : 'none';
667
+ this._changeDetectorRef.detectChanges();
668
+ this.isLoading = status;
669
+ });
670
+ }
671
+ ngOnDestroy() {
672
+ if (this.loadingSubscription)
673
+ this.loadingSubscription.unsubscribe();
674
+ }
675
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: LoadingSpinnerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
676
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.2.4", type: LoadingSpinnerComponent, isStandalone: true, selector: "rolatech-loading-spinner", inputs: { title: "title" }, ngImport: i0, template: "<div class=\"spinner-container flex flex-col\">\n <div class=\"sk-fading-circle\">\n <div class=\"sk-circle1 sk-circle\"></div>\n <div class=\"sk-circle2 sk-circle\"></div>\n <div class=\"sk-circle3 sk-circle\"></div>\n <div class=\"sk-circle4 sk-circle\"></div>\n <div class=\"sk-circle5 sk-circle\"></div>\n <div class=\"sk-circle6 sk-circle\"></div>\n <div class=\"sk-circle7 sk-circle\"></div>\n <div class=\"sk-circle8 sk-circle\"></div>\n <div class=\"sk-circle9 sk-circle\"></div>\n <div class=\"sk-circle10 sk-circle\"></div>\n <div class=\"sk-circle11 sk-circle\"></div>\n <div class=\"sk-circle12 sk-circle\"></div>\n </div>\n <div class=\"text-lg font-bold text-center\">{{ title }}</div>\n</div>\n", styles: [".spinner-container{display:flex;justify-content:center}.sk-fading-circle{margin:12px auto;width:40px;height:40px;position:relative}.sk-fading-circle .sk-circle{width:100%;height:100%;position:absolute;left:0;top:0}.sk-fading-circle .sk-circle:before{content:\"\";display:block;margin:0 auto;width:12%;height:15%;background-color:#333;border-radius:100%;-webkit-animation:sk-circleFadeDelay 1.2s infinite ease-in-out both;animation:sk-circleFadeDelay 1.2s infinite ease-in-out both}.sk-fading-circle .sk-circle2{-webkit-transform:rotate(30deg);-ms-transform:rotate(30deg);transform:rotate(30deg)}.sk-fading-circle .sk-circle3{-webkit-transform:rotate(60deg);-ms-transform:rotate(60deg);transform:rotate(60deg)}.sk-fading-circle .sk-circle4{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.sk-fading-circle .sk-circle5{-webkit-transform:rotate(120deg);-ms-transform:rotate(120deg);transform:rotate(120deg)}.sk-fading-circle .sk-circle6{-webkit-transform:rotate(150deg);-ms-transform:rotate(150deg);transform:rotate(150deg)}.sk-fading-circle .sk-circle7{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.sk-fading-circle .sk-circle8{-webkit-transform:rotate(210deg);-ms-transform:rotate(210deg);transform:rotate(210deg)}.sk-fading-circle .sk-circle9{-webkit-transform:rotate(240deg);-ms-transform:rotate(240deg);transform:rotate(240deg)}.sk-fading-circle .sk-circle10{-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.sk-fading-circle .sk-circle11{-webkit-transform:rotate(300deg);-ms-transform:rotate(300deg);transform:rotate(300deg)}.sk-fading-circle .sk-circle12{-webkit-transform:rotate(330deg);-ms-transform:rotate(330deg);transform:rotate(330deg)}.sk-fading-circle .sk-circle2:before{-webkit-animation-delay:-1.1s;animation-delay:-1.1s}.sk-fading-circle .sk-circle3:before{-webkit-animation-delay:-1s;animation-delay:-1s}.sk-fading-circle .sk-circle4:before{-webkit-animation-delay:-.9s;animation-delay:-.9s}.sk-fading-circle .sk-circle5:before{-webkit-animation-delay:-.8s;animation-delay:-.8s}.sk-fading-circle .sk-circle6:before{-webkit-animation-delay:-.7s;animation-delay:-.7s}.sk-fading-circle .sk-circle7:before{-webkit-animation-delay:-.6s;animation-delay:-.6s}.sk-fading-circle .sk-circle8:before{-webkit-animation-delay:-.5s;animation-delay:-.5s}.sk-fading-circle .sk-circle9:before{-webkit-animation-delay:-.4s;animation-delay:-.4s}.sk-fading-circle .sk-circle10:before{-webkit-animation-delay:-.3s;animation-delay:-.3s}.sk-fading-circle .sk-circle11:before{-webkit-animation-delay:-.2s;animation-delay:-.2s}.sk-fading-circle .sk-circle12:before{-webkit-animation-delay:-.1s;animation-delay:-.1s}@-webkit-keyframes sk-circleFadeDelay{0%,39%,to{opacity:0}40%{opacity:1}}@keyframes sk-circleFadeDelay{0%,39%,to{opacity:0}40%{opacity:1}}\n"] });
677
+ }
678
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: LoadingSpinnerComponent, decorators: [{
679
+ type: Component,
680
+ args: [{ selector: 'rolatech-loading-spinner', standalone: true, template: "<div class=\"spinner-container flex flex-col\">\n <div class=\"sk-fading-circle\">\n <div class=\"sk-circle1 sk-circle\"></div>\n <div class=\"sk-circle2 sk-circle\"></div>\n <div class=\"sk-circle3 sk-circle\"></div>\n <div class=\"sk-circle4 sk-circle\"></div>\n <div class=\"sk-circle5 sk-circle\"></div>\n <div class=\"sk-circle6 sk-circle\"></div>\n <div class=\"sk-circle7 sk-circle\"></div>\n <div class=\"sk-circle8 sk-circle\"></div>\n <div class=\"sk-circle9 sk-circle\"></div>\n <div class=\"sk-circle10 sk-circle\"></div>\n <div class=\"sk-circle11 sk-circle\"></div>\n <div class=\"sk-circle12 sk-circle\"></div>\n </div>\n <div class=\"text-lg font-bold text-center\">{{ title }}</div>\n</div>\n", styles: [".spinner-container{display:flex;justify-content:center}.sk-fading-circle{margin:12px auto;width:40px;height:40px;position:relative}.sk-fading-circle .sk-circle{width:100%;height:100%;position:absolute;left:0;top:0}.sk-fading-circle .sk-circle:before{content:\"\";display:block;margin:0 auto;width:12%;height:15%;background-color:#333;border-radius:100%;-webkit-animation:sk-circleFadeDelay 1.2s infinite ease-in-out both;animation:sk-circleFadeDelay 1.2s infinite ease-in-out both}.sk-fading-circle .sk-circle2{-webkit-transform:rotate(30deg);-ms-transform:rotate(30deg);transform:rotate(30deg)}.sk-fading-circle .sk-circle3{-webkit-transform:rotate(60deg);-ms-transform:rotate(60deg);transform:rotate(60deg)}.sk-fading-circle .sk-circle4{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.sk-fading-circle .sk-circle5{-webkit-transform:rotate(120deg);-ms-transform:rotate(120deg);transform:rotate(120deg)}.sk-fading-circle .sk-circle6{-webkit-transform:rotate(150deg);-ms-transform:rotate(150deg);transform:rotate(150deg)}.sk-fading-circle .sk-circle7{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.sk-fading-circle .sk-circle8{-webkit-transform:rotate(210deg);-ms-transform:rotate(210deg);transform:rotate(210deg)}.sk-fading-circle .sk-circle9{-webkit-transform:rotate(240deg);-ms-transform:rotate(240deg);transform:rotate(240deg)}.sk-fading-circle .sk-circle10{-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.sk-fading-circle .sk-circle11{-webkit-transform:rotate(300deg);-ms-transform:rotate(300deg);transform:rotate(300deg)}.sk-fading-circle .sk-circle12{-webkit-transform:rotate(330deg);-ms-transform:rotate(330deg);transform:rotate(330deg)}.sk-fading-circle .sk-circle2:before{-webkit-animation-delay:-1.1s;animation-delay:-1.1s}.sk-fading-circle .sk-circle3:before{-webkit-animation-delay:-1s;animation-delay:-1s}.sk-fading-circle .sk-circle4:before{-webkit-animation-delay:-.9s;animation-delay:-.9s}.sk-fading-circle .sk-circle5:before{-webkit-animation-delay:-.8s;animation-delay:-.8s}.sk-fading-circle .sk-circle6:before{-webkit-animation-delay:-.7s;animation-delay:-.7s}.sk-fading-circle .sk-circle7:before{-webkit-animation-delay:-.6s;animation-delay:-.6s}.sk-fading-circle .sk-circle8:before{-webkit-animation-delay:-.5s;animation-delay:-.5s}.sk-fading-circle .sk-circle9:before{-webkit-animation-delay:-.4s;animation-delay:-.4s}.sk-fading-circle .sk-circle10:before{-webkit-animation-delay:-.3s;animation-delay:-.3s}.sk-fading-circle .sk-circle11:before{-webkit-animation-delay:-.2s;animation-delay:-.2s}.sk-fading-circle .sk-circle12:before{-webkit-animation-delay:-.1s;animation-delay:-.1s}@-webkit-keyframes sk-circleFadeDelay{0%,39%,to{opacity:0}40%{opacity:1}}@keyframes sk-circleFadeDelay{0%,39%,to{opacity:0}40%{opacity:1}}\n"] }]
681
+ }], propDecorators: { title: [{
682
+ type: Input
683
+ }] } });
684
+
685
+ class MediaUploadComponent {
686
+ title = '上传图片';
687
+ subtitle = '文件大小';
688
+ description = '不能超过5MB';
689
+ isUploading = false;
690
+ mediaItemClick = new EventEmitter();
691
+ upload = new EventEmitter();
692
+ media = [];
693
+ dialog = inject(MatDialog);
694
+ onMediaItemClick(item) {
695
+ this.mediaItemClick.emit(item);
696
+ }
697
+ onMediaClick(i) {
698
+ const dialogRef = this.dialog.open(MediaPreviewDialogComponent, {
699
+ maxWidth: '80vw',
700
+ maxHeight: '80vh',
701
+ height: '80%',
702
+ width: '80%',
703
+ panelClass: 'full-screen-modal',
704
+ data: {
705
+ media: this.media,
706
+ selected: i,
707
+ },
708
+ });
709
+ dialogRef.afterClosed().subscribe((result) => { });
710
+ }
711
+ onUpload(event) {
712
+ const file = event.target.files[0];
713
+ if (file) {
714
+ const reader = new FileReader();
715
+ reader.readAsDataURL(file);
716
+ reader.onload = () => {
717
+ this.media.push({
718
+ url: reader.result,
719
+ alt: 'upload image',
720
+ });
721
+ const formData = new FormData();
722
+ formData.append('file', file);
723
+ this.upload.emit(formData);
724
+ };
725
+ }
726
+ }
727
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: MediaUploadComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
728
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.2.4", type: MediaUploadComponent, isStandalone: true, selector: "rolatech-media-upload", inputs: { title: "title", subtitle: "subtitle", description: "description", isUploading: "isUploading" }, outputs: { mediaItemClick: "mediaItemClick", upload: "upload" }, ngImport: i0, template: "<div class=\"bg-gray-100 rounded p-6 min-h-[320px] flex items-center justify-center\">\n @if (isUploading) {\n <div class=\"flex flex-col items-center justify-center\">\n <div class=\"p-3\">\n <mat-icon>upload</mat-icon>\n </div>\n <div class=\"flex flex-col items-center justify-center\">\n <div class=\"font-lg font-bold py-3\">{{ title }}</div>\n <div class=\"font-sm text-gray-400\">{{ subtitle }}</div>\n <div class=\"font-sm text-gray-400\">{{ description }}</div>\n </div>\n <div class=\"py-2\">\n <input style=\"display: none\" type=\"file\" (change)=\"onUpload($event)\" #fileInput />\n <button mat-flat-button color=\"primary\" (click)=\"fileInput.click()\">\u4E0A\u4F20\u56FE\u7247</button>\n </div>\n </div>\n } @else {\n <rolatech-loading-spinner title=\"\u4E0A\u4F20\u4E2D\"></rolatech-loading-spinner>\n }\n</div>\n<div class=\"flex flex-row\">\n @for (media of media; track $index) {\n <div (click)=\"onMediaClick($index)\" class=\"inline-flex flex-row mt-3 mr-3 cursor-pointer rounded-md\">\n <img class=\"rounded-md aspect-video object-cover w-32\" [src]=\"media.url\" />\n </div>\n }\n</div>\n", styles: [".mat-icon{transform:scale(2)}\n"], dependencies: [{ kind: "ngmodule", type: AngularCommonModule }, { kind: "ngmodule", type: AngularComponentsModule }, { kind: "component", type: i1$1.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i2$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: LoadingSpinnerComponent, selector: "rolatech-loading-spinner", inputs: ["title"] }] });
729
+ }
730
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: MediaUploadComponent, decorators: [{
731
+ type: Component,
732
+ args: [{ standalone: true, imports: [AngularCommonModule, AngularComponentsModule, LoadingSpinnerComponent], selector: 'rolatech-media-upload', template: "<div class=\"bg-gray-100 rounded p-6 min-h-[320px] flex items-center justify-center\">\n @if (isUploading) {\n <div class=\"flex flex-col items-center justify-center\">\n <div class=\"p-3\">\n <mat-icon>upload</mat-icon>\n </div>\n <div class=\"flex flex-col items-center justify-center\">\n <div class=\"font-lg font-bold py-3\">{{ title }}</div>\n <div class=\"font-sm text-gray-400\">{{ subtitle }}</div>\n <div class=\"font-sm text-gray-400\">{{ description }}</div>\n </div>\n <div class=\"py-2\">\n <input style=\"display: none\" type=\"file\" (change)=\"onUpload($event)\" #fileInput />\n <button mat-flat-button color=\"primary\" (click)=\"fileInput.click()\">\u4E0A\u4F20\u56FE\u7247</button>\n </div>\n </div>\n } @else {\n <rolatech-loading-spinner title=\"\u4E0A\u4F20\u4E2D\"></rolatech-loading-spinner>\n }\n</div>\n<div class=\"flex flex-row\">\n @for (media of media; track $index) {\n <div (click)=\"onMediaClick($index)\" class=\"inline-flex flex-row mt-3 mr-3 cursor-pointer rounded-md\">\n <img class=\"rounded-md aspect-video object-cover w-32\" [src]=\"media.url\" />\n </div>\n }\n</div>\n", styles: [".mat-icon{transform:scale(2)}\n"] }]
733
+ }], propDecorators: { title: [{
734
+ type: Input
735
+ }], subtitle: [{
736
+ type: Input
737
+ }], description: [{
738
+ type: Input
739
+ }], isUploading: [{
740
+ type: Input
741
+ }], mediaItemClick: [{
742
+ type: Output
743
+ }], upload: [{
744
+ type: Output
745
+ }] } });
746
+
747
+ class StorageBucketCreateComponent {
748
+ name;
749
+ output = new EventEmitter();
750
+ ngOnInit() { }
751
+ ngDoCheck() {
752
+ this.output.emit(this.name);
753
+ }
754
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: StorageBucketCreateComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
755
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.2.4", type: StorageBucketCreateComponent, isStandalone: true, selector: "rolatech-storage-bucket-create", inputs: { name: "name" }, outputs: { output: "output" }, ngImport: i0, template: "<div>\n <mat-form-field>\n <mat-label>\u540D\u79F0</mat-label>\n <input matInput placeholder=\"\u8F93\u5165\u540D\u79F0\" [(ngModel)]=\"name\" />\n </mat-form-field>\n</div>\n", styles: ["mat-form-field{width:100%}\n"], dependencies: [{ kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i1$3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i1$3.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i2$2.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: "ngmodule", type: FormsModule }, { kind: "directive", type: i3$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
756
+ }
757
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: StorageBucketCreateComponent, decorators: [{
758
+ type: Component,
759
+ args: [{ selector: 'rolatech-storage-bucket-create', standalone: true, imports: [MatFormFieldModule, MatInputModule, FormsModule], template: "<div>\n <mat-form-field>\n <mat-label>\u540D\u79F0</mat-label>\n <input matInput placeholder=\"\u8F93\u5165\u540D\u79F0\" [(ngModel)]=\"name\" />\n </mat-form-field>\n</div>\n", styles: ["mat-form-field{width:100%}\n"] }]
760
+ }], propDecorators: { name: [{
761
+ type: Input
762
+ }], output: [{
763
+ type: Output
764
+ }] } });
765
+
766
+ class StorageFileUploadComponent {
767
+ title;
768
+ output = new EventEmitter();
769
+ fileData;
770
+ progressInfos = [];
771
+ isFinished = false;
772
+ isUploaded = false;
773
+ file;
774
+ ngOnInit() { }
775
+ ngDoCheck() {
776
+ this.output.emit({
777
+ title: this.title,
778
+ file: this.file,
779
+ });
780
+ }
781
+ selectFiles(event) {
782
+ this.isFinished = false;
783
+ this.file = event.target.files[0];
784
+ event.target.value = '';
785
+ }
786
+ removeFile() {
787
+ this.file = null;
788
+ }
789
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: StorageFileUploadComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
790
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.2.4", type: StorageFileUploadComponent, isStandalone: true, selector: "rolatech-storage-file-upload", inputs: { title: "title" }, outputs: { output: "output" }, ngImport: i0, template: "<div>\n <mat-form-field>\n <mat-label>\u6807\u9898</mat-label>\n <input matInput placeholder=\"\u8F93\u5165\u6807\u9898\" [(ngModel)]=\"title\" />\n </mat-form-field>\n\n <div class=\"mt-2\">\n <input #fileInput class=\"hidden\" type=\"file\" (change)=\"selectFiles($event)\" />\n <button mat-raised-button (click)=\"fileInput.click()\">\u9009\u62E9\u6587\u4EF6</button>\n </div>\n @if (file) {\n <div class=\"p-2 flex justify-between items-center\">\n <div>{{ file.name }}</div>\n <button matSuffix mat-icon-button (click)=\"removeFile()\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n }\n</div>\n", styles: ["mat-form-field{width:100%}\n"], dependencies: [{ kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i1$3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i1$3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i1$3.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i2$2.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: "ngmodule", type: FormsModule }, { kind: "directive", type: i3$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1$1.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i1$1.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] });
791
+ }
792
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: StorageFileUploadComponent, decorators: [{
793
+ type: Component,
794
+ args: [{ selector: 'rolatech-storage-file-upload', standalone: true, imports: [MatFormFieldModule, MatInputModule, FormsModule, MatButtonModule, MatIconModule], template: "<div>\n <mat-form-field>\n <mat-label>\u6807\u9898</mat-label>\n <input matInput placeholder=\"\u8F93\u5165\u6807\u9898\" [(ngModel)]=\"title\" />\n </mat-form-field>\n\n <div class=\"mt-2\">\n <input #fileInput class=\"hidden\" type=\"file\" (change)=\"selectFiles($event)\" />\n <button mat-raised-button (click)=\"fileInput.click()\">\u9009\u62E9\u6587\u4EF6</button>\n </div>\n @if (file) {\n <div class=\"p-2 flex justify-between items-center\">\n <div>{{ file.name }}</div>\n <button matSuffix mat-icon-button (click)=\"removeFile()\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n }\n</div>\n", styles: ["mat-form-field{width:100%}\n"] }]
795
+ }], propDecorators: { title: [{
796
+ type: Input
797
+ }], output: [{
798
+ type: Output
799
+ }] } });
800
+
801
+ class StorageFolderCreateComponent {
802
+ name;
803
+ isPublic = true;
804
+ output = new EventEmitter();
805
+ ngOnInit() { }
806
+ ngDoCheck() {
807
+ this.output.emit({ name: this.name, isPublic: this.isPublic });
808
+ }
809
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: StorageFolderCreateComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
810
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.2.4", type: StorageFolderCreateComponent, isStandalone: true, selector: "rolatech-storage-folder-create", inputs: { name: "name", isPublic: "isPublic" }, outputs: { output: "output" }, ngImport: i0, template: "<div>\n <mat-form-field>\n <mat-label>\u540D\u79F0</mat-label>\n <input matInput placeholder=\"\u8F93\u5165\u540D\u79F0\" [(ngModel)]=\"name\" />\n </mat-form-field>\n <div class=\"flex flex-col\">\n <mat-checkbox class=\"example-margin\" [(ngModel)]=\"isPublic\">\u516C\u5F00\u8D44\u6E90</mat-checkbox>\n <span class=\"text-sm text-gray-500 ml-2 mt-1\">\u6587\u4EF6\u5939\u4E3A\u56FE\u7247\u5185\u5BB9\u65F6, \u8BF7\u53D6\u6D88\u52FE\u9009\u6B64\u9879</span>\n </div>\n</div>\n", styles: ["mat-form-field{width:100%}\n"], dependencies: [{ kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i1$3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i1$3.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i2$2.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: "ngmodule", type: FormsModule }, { kind: "directive", type: i3$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i4.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }] });
811
+ }
812
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: StorageFolderCreateComponent, decorators: [{
813
+ type: Component,
814
+ args: [{ selector: 'rolatech-storage-folder-create', standalone: true, imports: [MatFormFieldModule, MatInputModule, FormsModule, MatCheckboxModule], template: "<div>\n <mat-form-field>\n <mat-label>\u540D\u79F0</mat-label>\n <input matInput placeholder=\"\u8F93\u5165\u540D\u79F0\" [(ngModel)]=\"name\" />\n </mat-form-field>\n <div class=\"flex flex-col\">\n <mat-checkbox class=\"example-margin\" [(ngModel)]=\"isPublic\">\u516C\u5F00\u8D44\u6E90</mat-checkbox>\n <span class=\"text-sm text-gray-500 ml-2 mt-1\">\u6587\u4EF6\u5939\u4E3A\u56FE\u7247\u5185\u5BB9\u65F6, \u8BF7\u53D6\u6D88\u52FE\u9009\u6B64\u9879</span>\n </div>\n</div>\n", styles: ["mat-form-field{width:100%}\n"] }]
815
+ }], propDecorators: { name: [{
816
+ type: Input
817
+ }], isPublic: [{
818
+ type: Input
819
+ }], output: [{
820
+ type: Output
821
+ }] } });
822
+
823
+ class WechatConnectDialogComponent {
824
+ dialogRef = inject(MatDialogRef);
825
+ environment = inject(APP_CONFIG);
826
+ data = inject(MAT_DIALOG_DATA);
827
+ urlSafe;
828
+ sanitizer = inject(DomSanitizer);
829
+ baseUrl = 'https://open.weixin.qq.com/connect/qrconnect';
830
+ constructor() {
831
+ const href = 'https://cloudcache.tencent-cloud.com/open_proj/proj_qcloud_v2/gateway/login-regist/css/link-wx-login.css';
832
+ const encodedURI = encodeURI(this.data.redirect_uri);
833
+ const src = `${this.baseUrl}?appid=${this.data.appid}&response_type=code&self_redirect=true&scope=snsapi_login&href=${href}&redirect_uri=${encodedURI}&state=${this.data.state}#wechat_redirect`;
834
+ this.urlSafe = this.sanitizer.bypassSecurityTrustResourceUrl(src);
835
+ }
836
+ onNoClick() {
837
+ this.dialogRef.close();
838
+ }
839
+ onLogin(event) {
840
+ if (event.origin === this.environment.accountsUrl && event.data.code === 200) {
841
+ this.dialogRef.close();
842
+ }
843
+ }
844
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: WechatConnectDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
845
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.2.4", type: WechatConnectDialogComponent, isStandalone: true, selector: "rolatech-wechat-connect-dialog", host: { listeners: { "window:message": "onLogin($event)" } }, ngImport: i0, template: "<div class=\"flex flex-col p-3\">\n <div class=\"text-xl font-bold\">\u626B\u7801\u7ED1\u5B9A\u5FAE\u4FE1\uFF0C\u63D0\u5347\u8D26\u53F7\u5B89\u5168\u548C\u4F7F\u7528\u4FBF\u5229\u6027</div>\n <div class=\"w-[190px] h-[190px]\">\n <iframe [src]=\"urlSafe\" class=\"w-full h-full inline\" scrolling=\"no\" frameBorder=\"no\"></iframe>\n <div></div>\n </div>\n</div>\n", styles: ["*{margin:0;padding:0}.normalPanel .panelContent{width:188px;height:188px}.normalPanel .wrp_code{position:relative;width:188px;height:188px;margin:0}.impowerBox .title,.normalPanel .info{display:none}.impowerBox .qrcode{margin-top:0;border:0;width:188px;height:188px}#MAXIM{content:\"veg20170418191511\"}mat-mdc-dialog-content mdc-dialog__content{padding:0}\n"] });
846
+ }
847
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: WechatConnectDialogComponent, decorators: [{
848
+ type: Component,
849
+ args: [{ selector: 'rolatech-wechat-connect-dialog', standalone: true, template: "<div class=\"flex flex-col p-3\">\n <div class=\"text-xl font-bold\">\u626B\u7801\u7ED1\u5B9A\u5FAE\u4FE1\uFF0C\u63D0\u5347\u8D26\u53F7\u5B89\u5168\u548C\u4F7F\u7528\u4FBF\u5229\u6027</div>\n <div class=\"w-[190px] h-[190px]\">\n <iframe [src]=\"urlSafe\" class=\"w-full h-full inline\" scrolling=\"no\" frameBorder=\"no\"></iframe>\n <div></div>\n </div>\n</div>\n", styles: ["*{margin:0;padding:0}.normalPanel .panelContent{width:188px;height:188px}.normalPanel .wrp_code{position:relative;width:188px;height:188px;margin:0}.impowerBox .title,.normalPanel .info{display:none}.impowerBox .qrcode{margin-top:0;border:0;width:188px;height:188px}#MAXIM{content:\"veg20170418191511\"}mat-mdc-dialog-content mdc-dialog__content{padding:0}\n"] }]
850
+ }], ctorParameters: () => [], propDecorators: { onLogin: [{
851
+ type: HostListener,
852
+ args: ['window:message', ['$event']]
853
+ }] } });
854
+
855
+ class MediaUploadDialogComponent {
856
+ dialogRef;
857
+ data;
858
+ mediaService;
859
+ fileData;
860
+ progressInfos = [];
861
+ media = [];
862
+ preMedia = [];
863
+ isFinished = false;
864
+ isUploaded = false;
865
+ constructor(dialogRef, data, mediaService) {
866
+ this.dialogRef = dialogRef;
867
+ this.data = data;
868
+ this.mediaService = mediaService;
869
+ }
870
+ ngOnInit() { }
871
+ selectFiles(event) {
872
+ this.isFinished = false;
873
+ for (const file of event.target.files) {
874
+ this.addImage(file);
875
+ }
876
+ event.target.value = '';
877
+ }
878
+ addImage(file) {
879
+ const reader = new FileReader();
880
+ reader.readAsDataURL(file);
881
+ reader.onload = () => {
882
+ this.preMedia.push({
883
+ url: reader.result,
884
+ alt: 'upload image',
885
+ isUploading: false,
886
+ isUploaded: false,
887
+ file: file,
888
+ });
889
+ };
890
+ reader.onerror = (error) => { };
891
+ }
892
+ removeImage(index) {
893
+ this.preMedia.splice(index, 1);
894
+ }
895
+ uploadFiles() {
896
+ for (let i = 0; i < this.preMedia.length; i++) {
897
+ if (!this.preMedia[i].isUploaded) {
898
+ this.upload(i, this.preMedia[i].file);
899
+ }
900
+ }
901
+ }
902
+ upload(idx, file) {
903
+ this.progressInfos[idx] = { value: 0, fileName: file.name };
904
+ const formData = new FormData();
905
+ formData.append('file', file);
906
+ this.preMedia[idx].isUploading = true;
907
+ formData.append('groupId', this.data.groupId);
908
+ this.mediaService.uploadAndSave(formData).subscribe({
909
+ next: (res) => {
910
+ this.media.push(res.data);
911
+ this.preMedia[idx].isUploading = false;
912
+ this.preMedia[idx].isUploaded = true;
913
+ this.progressInfos[idx].value = 100;
914
+ const tmp = this.progressInfos.filter((item) => item.value !== 100);
915
+ if (tmp.length <= 0) {
916
+ this.isFinished = true;
917
+ }
918
+ },
919
+ error: (error) => {
920
+ this.progressInfos[idx].value = 0;
921
+ },
922
+ });
923
+ }
924
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: MediaUploadDialogComponent, deps: [{ token: i1$2.MatDialogRef }, { token: MAT_DIALOG_DATA }, { token: i2$3.MediaService }], target: i0.ɵɵFactoryTarget.Component });
925
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.2.4", type: MediaUploadDialogComponent, isStandalone: true, selector: "rolatech-media-upload-dialog", ngImport: i0, template: "<mat-dialog-content>\n <div class=\"border-dashed border-2 border-gray-400 py-12 flex flex-col justify-center items-center\">\n <input #fileInput multiple class=\"hidden\" type=\"file\" (change)=\"selectFiles($event)\" />\n <button mat-button (click)=\"fileInput.click()\">\u4E0A\u4F20\u56FE\u7247</button>\n </div>\n <div class=\"mt-4\">\n <h2 class=\"\">\u9884\u89C8</h2>\n <div>\n <ul id=\"gallery\" class=\"flex flex-1 flex-wrap -m-1\">\n @for (item of preMedia; track item.url; let i = $index) {\n <li class=\"block p-1 w-1/2 sm:w-1/3 md:w-1/4 lg:w-1/6 xl:w-1/8 h-24\">\n <article\n tabindex=\"0\"\n [ngClass]=\"item.isUploading ? 'isUploading' : ''\"\n class=\"group hasImage w-full h-full rounded-md focus:outline-none focus:shadow-outline bg-gray-100 cursor-pointer relative text-transparent hover:text-white shadow-sm\"\n >\n <img [src]=\"item.url\" class=\"img-preview w-full h-full sticky object-cover rounded-md bg-fixed\" />\n <section class=\"flex flex-col rounded-md text-xs break-words w-full h-full z-20 absolute top-0 py-2 px-3\">\n @if (item.isUploading) {\n <div class=\"flex justify-center items-center w-full h-full\">\n <mat-spinner color=\"white\" diameter=\"28\"></mat-spinner>\n </div>\n } @else {\n <div class=\"flex\">\n <button (click)=\"removeImage(i)\" class=\"delete ml-auto focus:outline-none hover:bg-gray-300 p-1 rounded-md\">\n <svg\n class=\"pointer-events-none fill-current w-4 h-4 ml-auto\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n >\n <path\n class=\"pointer-events-none\"\n d=\"M3 6l3 18h12l3-18h-18zm19-4v2h-20v-2h5.711c.9 0 1.631-1.099 1.631-2h5.316c0 .901.73 2 1.631 2h5.711z\"\n />\n </svg>\n </button>\n </div>\n }\n </section>\n </article>\n </li>\n }\n </ul>\n </div>\n @if (preMedia.length <= 0) {\n <div class=\"flex flex-1 flex-wrap\">\n <div class=\"h-full w-full text-center flex flex-col justify-center items-center py-6\">\n <span class=\"text-small text-gray-500\">No files selected</span>\n </div>\n </div>\n }\n </div>\n</mat-dialog-content>\n<mat-dialog-actions align=\"end\">\n <button mat-button mat-dialog-close>\u53D6\u6D88</button>\n @if (preMedia.length <= 0) {\n <button mat-button>\u7B49\u5F85\u9009\u62E9</button>\n }\n @if (!isFinished && preMedia.length > 0) {\n <button mat-button (click)=\"uploadFiles()\">\u7ACB\u523B\u4E0A\u4F20</button>\n }\n @if (isFinished) {\n <button mat-button [mat-dialog-close]=\"media\">\u5B8C\u6210</button>\n }\n</mat-dialog-actions>\n", styles: [".hasImage:hover section{background-color:#05050566}.hasImage:hover button:hover{background:#05050573}.isUploading section{background-color:#05050566}\n"], dependencies: [{ kind: "directive", type: MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1$1.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i4$1.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "directive", type: MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }] });
926
+ }
927
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: MediaUploadDialogComponent, decorators: [{
928
+ type: Component,
929
+ args: [{ selector: 'rolatech-media-upload-dialog', standalone: true, imports: [MatDialogContent, MatButtonModule, NgClass, MatProgressSpinnerModule, MatDialogActions, MatDialogClose], template: "<mat-dialog-content>\n <div class=\"border-dashed border-2 border-gray-400 py-12 flex flex-col justify-center items-center\">\n <input #fileInput multiple class=\"hidden\" type=\"file\" (change)=\"selectFiles($event)\" />\n <button mat-button (click)=\"fileInput.click()\">\u4E0A\u4F20\u56FE\u7247</button>\n </div>\n <div class=\"mt-4\">\n <h2 class=\"\">\u9884\u89C8</h2>\n <div>\n <ul id=\"gallery\" class=\"flex flex-1 flex-wrap -m-1\">\n @for (item of preMedia; track item.url; let i = $index) {\n <li class=\"block p-1 w-1/2 sm:w-1/3 md:w-1/4 lg:w-1/6 xl:w-1/8 h-24\">\n <article\n tabindex=\"0\"\n [ngClass]=\"item.isUploading ? 'isUploading' : ''\"\n class=\"group hasImage w-full h-full rounded-md focus:outline-none focus:shadow-outline bg-gray-100 cursor-pointer relative text-transparent hover:text-white shadow-sm\"\n >\n <img [src]=\"item.url\" class=\"img-preview w-full h-full sticky object-cover rounded-md bg-fixed\" />\n <section class=\"flex flex-col rounded-md text-xs break-words w-full h-full z-20 absolute top-0 py-2 px-3\">\n @if (item.isUploading) {\n <div class=\"flex justify-center items-center w-full h-full\">\n <mat-spinner color=\"white\" diameter=\"28\"></mat-spinner>\n </div>\n } @else {\n <div class=\"flex\">\n <button (click)=\"removeImage(i)\" class=\"delete ml-auto focus:outline-none hover:bg-gray-300 p-1 rounded-md\">\n <svg\n class=\"pointer-events-none fill-current w-4 h-4 ml-auto\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n >\n <path\n class=\"pointer-events-none\"\n d=\"M3 6l3 18h12l3-18h-18zm19-4v2h-20v-2h5.711c.9 0 1.631-1.099 1.631-2h5.316c0 .901.73 2 1.631 2h5.711z\"\n />\n </svg>\n </button>\n </div>\n }\n </section>\n </article>\n </li>\n }\n </ul>\n </div>\n @if (preMedia.length <= 0) {\n <div class=\"flex flex-1 flex-wrap\">\n <div class=\"h-full w-full text-center flex flex-col justify-center items-center py-6\">\n <span class=\"text-small text-gray-500\">No files selected</span>\n </div>\n </div>\n }\n </div>\n</mat-dialog-content>\n<mat-dialog-actions align=\"end\">\n <button mat-button mat-dialog-close>\u53D6\u6D88</button>\n @if (preMedia.length <= 0) {\n <button mat-button>\u7B49\u5F85\u9009\u62E9</button>\n }\n @if (!isFinished && preMedia.length > 0) {\n <button mat-button (click)=\"uploadFiles()\">\u7ACB\u523B\u4E0A\u4F20</button>\n }\n @if (isFinished) {\n <button mat-button [mat-dialog-close]=\"media\">\u5B8C\u6210</button>\n }\n</mat-dialog-actions>\n", styles: [".hasImage:hover section{background-color:#05050566}.hasImage:hover button:hover{background:#05050573}.isUploading section{background-color:#05050566}\n"] }]
930
+ }], ctorParameters: () => [{ type: i1$2.MatDialogRef }, { type: undefined, decorators: [{
931
+ type: Inject,
932
+ args: [MAT_DIALOG_DATA]
933
+ }] }, { type: i2$3.MediaService }] });
934
+
935
+ class SpacerComponent {
936
+ constructor() { }
937
+ ngOnInit() { }
938
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: SpacerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
939
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.2.4", type: SpacerComponent, isStandalone: true, selector: "rolatech-spacer", ngImport: i0, template: "<span class=\"app-spacer\"></span>\n", styles: [":host{flex:1 1 auto}.app-spacer{flex:1 1 auto}\n"] });
940
+ }
941
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: SpacerComponent, decorators: [{
942
+ type: Component,
943
+ args: [{ selector: 'rolatech-spacer', standalone: true, template: "<span class=\"app-spacer\"></span>\n", styles: [":host{flex:1 1 auto}.app-spacer{flex:1 1 auto}\n"] }]
944
+ }], ctorParameters: () => [] });
945
+
946
+ class MediaListComponent {
947
+ isUploading;
948
+ media = [];
949
+ showAdd = true;
950
+ mediaItemClick = new EventEmitter();
951
+ upload = new EventEmitter();
952
+ onMediaItemClick(item) {
953
+ this.mediaItemClick.emit(item);
954
+ }
955
+ onUpload(event) {
956
+ this.upload.emit(event);
957
+ }
958
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: MediaListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
959
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.2.4", type: MediaListComponent, isStandalone: true, selector: "rolatech-media-list", inputs: { isUploading: "isUploading", media: "media", showAdd: "showAdd" }, outputs: { mediaItemClick: "mediaItemClick", upload: "upload" }, ngImport: i0, template: "<div class=\"flex flex-row flex-wrap box-border items-center\">\n <div class=\"progress-bar\">\n @if (isUploading) {\n <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar>\n }\n </div>\n <div class=\"flex flex-row flex-wrap box-border items-center gap-2\">\n <ng-content></ng-content>\n <div>\n <input style=\"display: none\" type=\"file\" accept=\"image/*, video/*\" (change)=\"onUpload($event)\" #fileInput />\n @if (showAdd) {\n <div class=\"add-button\">\n <img (click)=\"fileInput.click()\" class=\"tile-media\" src=\"assets/images/baseline_add_black_48dp.png\" alt=\"add image\" />\n </div>\n }\n </div>\n </div>\n</div>\n", styles: [".progress-bar{display:block;min-height:6px;width:100%;padding:4px 0}.add-button{cursor:pointer;position:relative;box-sizing:border-box;padding:2px}.tile-media{height:80px;width:80px;object-fit:contain;cursor:pointer;padding:6px;position:relative;box-sizing:border-box}app-media-list-item:before{border-radius:12px}\n"], dependencies: [{ kind: "ngmodule", type: MatProgressBarModule }, { kind: "component", type: i1$4.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }] });
960
+ }
961
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: MediaListComponent, decorators: [{
962
+ type: Component,
963
+ args: [{ selector: 'rolatech-media-list', standalone: true, imports: [MatProgressBarModule], template: "<div class=\"flex flex-row flex-wrap box-border items-center\">\n <div class=\"progress-bar\">\n @if (isUploading) {\n <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar>\n }\n </div>\n <div class=\"flex flex-row flex-wrap box-border items-center gap-2\">\n <ng-content></ng-content>\n <div>\n <input style=\"display: none\" type=\"file\" accept=\"image/*, video/*\" (change)=\"onUpload($event)\" #fileInput />\n @if (showAdd) {\n <div class=\"add-button\">\n <img (click)=\"fileInput.click()\" class=\"tile-media\" src=\"assets/images/baseline_add_black_48dp.png\" alt=\"add image\" />\n </div>\n }\n </div>\n </div>\n</div>\n", styles: [".progress-bar{display:block;min-height:6px;width:100%;padding:4px 0}.add-button{cursor:pointer;position:relative;box-sizing:border-box;padding:2px}.tile-media{height:80px;width:80px;object-fit:contain;cursor:pointer;padding:6px;position:relative;box-sizing:border-box}app-media-list-item:before{border-radius:12px}\n"] }]
964
+ }], propDecorators: { isUploading: [{
965
+ type: Input
966
+ }], media: [{
967
+ type: Input
968
+ }], showAdd: [{
969
+ type: Input
970
+ }], mediaItemClick: [{
971
+ type: Output
972
+ }], upload: [{
973
+ type: Output
974
+ }] } });
975
+
976
+ class MediaListItemComponent {
977
+ media;
978
+ uploadProgress = 0;
979
+ mediaItemClick = new EventEmitter();
980
+ // @Output() deleteMedia = new EventEmitter<{ id: string; media: Media }>();
981
+ deleteMedia = new EventEmitter();
982
+ onMediaItemClick(event) {
983
+ this.mediaItemClick.emit(event);
984
+ }
985
+ onDeleteMedia(media) {
986
+ this.deleteMedia.emit(media);
987
+ }
988
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: MediaListItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
989
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.2.4", type: MediaListItemComponent, isStandalone: true, selector: "rolatech-media-list-item", inputs: { media: "media", uploadProgress: "uploadProgress" }, outputs: { mediaItemClick: "mediaItemClick", deleteMedia: "deleteMedia" }, ngImport: i0, template: "<div\n class=\"media-list-item relative hasImage focus:outline-none focus:shadow-outline bg-gray-100 cursor-pointer text-transparent hover:text-white shadow-sm\"\n>\n <div class=\"absolute z-30 right-0\">\n <div class=\"flex-1\"></div>\n <div>\n <button mat-icon-button [matMenuTriggerFor]=\"beforeMenu\" class=\"ml-auto focus:outline-none hover:bg-gray-300 p-1\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #beforeMenu=\"matMenu\" xPosition=\"before\">\n <button mat-menu-item (click)=\"onDeleteMedia(media)\">\n <span>\u5220\u9664</span>\n </button>\n </mat-menu>\n </div>\n </div>\n <div id=\"thumbnail\" class=\"thumbnail\">\n <img class=\"tile-media\" (click)=\"onMediaItemClick(media)\" [src]=\"media.url\" [alt]=\"media.alt\" />\n </div>\n <section\n (click)=\"onMediaItemClick(media)\"\n class=\"flex flex-col text-xs break-words w-full h-full z-20 absolute top-0\"\n ></section>\n</div>\n", styles: [".media-list-item{cursor:pointer;box-sizing:border-box;height:128px;width:228px;display:inline-block;display:block;position:relative;flex:none}.tile-media{height:100%;width:100%;object-fit:cover;display:inline-block;background-color:transparent}#thumbnail.thumbnail{height:100%;position:relative;margin-left:auto;margin-right:auto;overflow:hidden;display:block;position:absolute;border-radius:8px;inset:0}.hasImage:hover section{background-color:#05050566}.hasImage:hover button:hover{background:#05050573}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1$1.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i2.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i2.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i2.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] });
990
+ }
991
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: MediaListItemComponent, decorators: [{
992
+ type: Component,
993
+ args: [{ selector: 'rolatech-media-list-item', standalone: true, imports: [MatButtonModule, MatMenuModule, MatIconModule], template: "<div\n class=\"media-list-item relative hasImage focus:outline-none focus:shadow-outline bg-gray-100 cursor-pointer text-transparent hover:text-white shadow-sm\"\n>\n <div class=\"absolute z-30 right-0\">\n <div class=\"flex-1\"></div>\n <div>\n <button mat-icon-button [matMenuTriggerFor]=\"beforeMenu\" class=\"ml-auto focus:outline-none hover:bg-gray-300 p-1\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #beforeMenu=\"matMenu\" xPosition=\"before\">\n <button mat-menu-item (click)=\"onDeleteMedia(media)\">\n <span>\u5220\u9664</span>\n </button>\n </mat-menu>\n </div>\n </div>\n <div id=\"thumbnail\" class=\"thumbnail\">\n <img class=\"tile-media\" (click)=\"onMediaItemClick(media)\" [src]=\"media.url\" [alt]=\"media.alt\" />\n </div>\n <section\n (click)=\"onMediaItemClick(media)\"\n class=\"flex flex-col text-xs break-words w-full h-full z-20 absolute top-0\"\n ></section>\n</div>\n", styles: [".media-list-item{cursor:pointer;box-sizing:border-box;height:128px;width:228px;display:inline-block;display:block;position:relative;flex:none}.tile-media{height:100%;width:100%;object-fit:cover;display:inline-block;background-color:transparent}#thumbnail.thumbnail{height:100%;position:relative;margin-left:auto;margin-right:auto;overflow:hidden;display:block;position:absolute;border-radius:8px;inset:0}.hasImage:hover section{background-color:#05050566}.hasImage:hover button:hover{background:#05050573}\n"] }]
994
+ }], propDecorators: { media: [{
995
+ type: Input
996
+ }], uploadProgress: [{
997
+ type: Input
998
+ }], mediaItemClick: [{
999
+ type: Output
1000
+ }], deleteMedia: [{
1001
+ type: Output
1002
+ }] } });
1003
+
1004
+ class NotFoundComponent {
1005
+ router;
1006
+ url;
1007
+ constructor(router) {
1008
+ this.router = router;
1009
+ router.events.pipe(filter((e) => e instanceof RouterEvent)).subscribe((e) => {
1010
+ if (e instanceof NavigationEnd) {
1011
+ this.url = e.url;
1012
+ }
1013
+ });
1014
+ }
1015
+ ngOnInit() {
1016
+ this.router.events.pipe(filter((e) => e instanceof RouterEvent)).subscribe((e) => {
1017
+ if (e instanceof NavigationEnd) {
1018
+ this.url = e.url;
1019
+ }
1020
+ });
1021
+ }
1022
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: NotFoundComponent, deps: [{ token: i1$5.Router }], target: i0.ɵɵFactoryTarget.Component });
1023
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.2.4", type: NotFoundComponent, isStandalone: true, selector: "rolatech-not-found", ngImport: i0, template: "<div class=\"not-found-content\">\n <p>\n <b>404.</b>\n <ins>That\u2019s an error.</ins>\n </p>\n <p>\n The requested URL <code>{{ url }}</code> not found on this server.\n </p>\n <a href=\"/\">return home</a>\n</div>\n", styles: [":host{margin:7% auto 0;max-width:390px;min-height:180px;padding:30px 0 15px}p{margin:11px 0 22px;overflow:hidden}ins{color:#777;text-decoration:none}.not-found-content{margin:7% auto 0;max-width:390px;min-height:180px;padding:30px 0 15px}\n"] });
1024
+ }
1025
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: NotFoundComponent, decorators: [{
1026
+ type: Component,
1027
+ args: [{ selector: 'rolatech-not-found', standalone: true, template: "<div class=\"not-found-content\">\n <p>\n <b>404.</b>\n <ins>That\u2019s an error.</ins>\n </p>\n <p>\n The requested URL <code>{{ url }}</code> not found on this server.\n </p>\n <a href=\"/\">return home</a>\n</div>\n", styles: [":host{margin:7% auto 0;max-width:390px;min-height:180px;padding:30px 0 15px}p{margin:11px 0 22px;overflow:hidden}ins{color:#777;text-decoration:none}.not-found-content{margin:7% auto 0;max-width:390px;min-height:180px;padding:30px 0 15px}\n"] }]
1028
+ }], ctorParameters: () => [{ type: i1$5.Router }] });
1029
+
1030
+ class ConfirmationDialogComponent {
1031
+ data = inject(MAT_DIALOG_DATA);
1032
+ dialogRef;
1033
+ onNoClick() {
1034
+ this.dialogRef.close();
1035
+ }
1036
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: ConfirmationDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1037
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.2.4", type: ConfirmationDialogComponent, isStandalone: true, selector: "rolatech-confirmation-dialog", ngImport: i0, template: "@if (data.title) {\n <h2 mat-dialog-title>{{ data.title }}</h2>\n}\n<div mat-dialog-content>\n {{ data.message }}\n</div>\n<div mat-dialog-actions align=\"end\">\n <button mat-button mat-dialog-close>\u53D6\u6D88</button>\n <button mat-button [mat-dialog-close]=\"true\" cdkFocusInitial>\u786E\u5B9A</button>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1$1.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "directive", type: MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }] });
1038
+ }
1039
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: ConfirmationDialogComponent, decorators: [{
1040
+ type: Component,
1041
+ args: [{ selector: 'rolatech-confirmation-dialog', standalone: true, imports: [MatDialogTitle, MatDialogContent, MatDialogActions, MatButtonModule, MatDialogClose], template: "@if (data.title) {\n <h2 mat-dialog-title>{{ data.title }}</h2>\n}\n<div mat-dialog-content>\n {{ data.message }}\n</div>\n<div mat-dialog-actions align=\"end\">\n <button mat-button mat-dialog-close>\u53D6\u6D88</button>\n <button mat-button [mat-dialog-close]=\"true\" cdkFocusInitial>\u786E\u5B9A</button>\n</div>\n" }]
1042
+ }] });
1043
+
1044
+ class BaseComponent {
1045
+ route = inject(ActivatedRoute);
1046
+ router = inject(Router);
1047
+ id = this.route.snapshot.params['id'];
1048
+ dialogService = inject(DialogService);
1049
+ dialog = inject(MatDialog);
1050
+ snackBarService = inject(SnackBarService);
1051
+ titleService = inject(Title);
1052
+ }
1053
+
1054
+ /**
1055
+ * Generated bundle index. Do not edit.
1056
+ */
1057
+
1058
+ export { AngularComponentsModule, AppDrawerComponent, AppFooterComponent, AppLayoutComponent, AppPageComponent, BaseComponent, ConfirmationDialogComponent, ConsoleLayoutComponent, FolderComponent, LoadingSpinnerComponent, MaterialModule, MediaListComponent, MediaListItemComponent, MediaPreviewDialogComponent, MediaUploadComponent, MediaUploadDialogComponent, MenuUserComponent, NotFoundComponent, SpacerComponent, StorageBucketCreateComponent, StorageFileUploadComponent, StorageFolderCreateComponent, TopbarAvatarMenuComponent, TopbarComponent, WechatConnectDialogComponent };
1059
+ //# sourceMappingURL=rolatech-angular-components.mjs.map