1
1
import { Component , OnInit } from "@angular/core" ;
2
2
import { FaIconLibrary } from "@fortawesome/angular-fontawesome" ;
3
3
import { fas } from "@fortawesome/free-solid-svg-icons" ;
4
- import { IndenterViewModel } from "../../model/indenter.model" ;
4
+ import { IndenterViewModel , IndenterViewModelClass } from "../../model/indenter.model" ;
5
5
import { ApiClientService } from "../../services/api-client.service" ;
6
+ import { environment } from "../../../environments/environment" ;
7
+
8
+ export interface IndenterOptionGroups {
9
+ isExpanded : boolean ;
10
+ isIndentOptionsExpanded : boolean ;
11
+ isOutdentOptionsExpanded : boolean ;
12
+ isAlignmentOptionsExpanded : boolean ;
13
+ isCommentOptionsExpanded : boolean ;
14
+ isVerticalOptionsExpanded : boolean ;
15
+ isApiAboutBoxExpanded : boolean ;
16
+ }
6
17
7
18
@Component ( {
8
19
selector : 'app-indenter' ,
9
20
templateUrl : './indenter.component.html' ,
10
21
} )
11
- export class IndenterComponent implements OnInit {
22
+ export class IndenterComponent implements OnInit , IndenterOptionGroups {
12
23
private _model ! : IndenterViewModel ;
13
24
public wasCopied : boolean = false ;
25
+ public wasTemplateCopied : boolean = false ;
14
26
15
27
16
28
constructor ( fa : FaIconLibrary , private service : ApiClientService ) {
17
29
fa . addIconPacks ( fas ) ;
18
30
}
19
31
20
32
ngOnInit ( ) : void {
33
+ const localModel = localStorage . getItem ( 'indenter.model' ) ;
34
+ if ( localModel ) {
35
+ this . model = < IndenterViewModel > JSON . parse ( localModel ) ;
36
+ }
37
+
38
+ const localOptionGroups = localStorage . getItem ( 'indenter.options' ) ;
39
+ if ( localOptionGroups ) {
40
+ const optionGroups = < IndenterOptionGroups > JSON . parse ( localOptionGroups ) ;
41
+ this . isExpanded = optionGroups . isExpanded ;
42
+ this . isIndentOptionsExpanded = optionGroups . isIndentOptionsExpanded ;
43
+ this . isOutdentOptionsExpanded = optionGroups . isOutdentOptionsExpanded ;
44
+ this . isAlignmentOptionsExpanded = optionGroups . isAlignmentOptionsExpanded ;
45
+ this . isCommentOptionsExpanded = optionGroups . isCommentOptionsExpanded ;
46
+ this . isVerticalOptionsExpanded = optionGroups . isVerticalOptionsExpanded ;
47
+ this . isApiAboutBoxExpanded = optionGroups . isApiAboutBoxExpanded ;
48
+ }
49
+
50
+ this . isLocalStorageOK = localModel != null || localOptionGroups != null ;
51
+ if ( ! this . isLocalStorageOK ) {
52
+ this . getDefaults ( ) ;
53
+ }
54
+ }
55
+
56
+ public getDefaults ( ) : void {
21
57
this . service . getIndenterDefaults ( ) . subscribe ( model => {
22
- this . _model = model ;
58
+ this . model = model ;
23
59
} ) ;
24
60
}
25
61
26
- public isExpanded : boolean = false ;
27
- public isIndentOptionsExpanded : boolean = true ;
28
- public isOutdentOptionsExpanded : boolean = false ;
29
- public isAlignmentOptionsExpanded : boolean = false ;
30
- public isCommentOptionsExpanded : boolean = false ;
31
- public isVerticalOptionsExpanded : boolean = false ;
32
- public isApiAboutBoxExpanded : boolean = true ;
62
+ private _isExpanded : boolean = false ;
63
+ private _isIndentOptionsExpanded : boolean = true ;
64
+ private _isOutdentOptionsExpanded : boolean = false ;
65
+ private _isAlignmentOptionsExpanded : boolean = false ;
66
+ private _isCommentOptionsExpanded : boolean = false ;
67
+ private _isVerticalOptionsExpanded : boolean = false ;
68
+ private _isApiAboutBoxExpanded : boolean = false ;
33
69
34
70
public isIndenterBusy : boolean = false ;
71
+ public isLocalStorageOK : boolean = false ;
35
72
36
73
public get model ( ) : IndenterViewModel {
37
74
return this . _model ;
38
75
}
39
76
77
+ private set model ( value : IndenterViewModel ) {
78
+ this . _model = value ;
79
+ this . invalidateClipboard ( ) ;
80
+ if ( this . isLocalStorageOK ) {
81
+ localStorage . setItem ( 'indenter.model' , JSON . stringify ( this . model ) )
82
+ } ;
83
+ }
84
+
40
85
public get asJson ( ) : string {
41
- return JSON . stringify ( this . _model ) ;
86
+ const copy = new IndenterViewModelClass ( this . _model ) ;
87
+ copy . indentedCode = '' ;
88
+ return JSON . stringify ( copy ) ;
89
+ }
90
+
91
+ public get isExpanded ( ) : boolean {
92
+ return this . _isExpanded ;
93
+ }
94
+ public set isExpanded ( value : boolean ) {
95
+ this . _isExpanded = value ;
96
+ this . saveOptions ( ) ;
97
+ }
98
+ public get isIndentOptionsExpanded ( ) : boolean {
99
+ return this . _isIndentOptionsExpanded ;
100
+ }
101
+
102
+ public set isIndentOptionsExpanded ( value : boolean ) {
103
+ this . _isIndentOptionsExpanded = value ;
104
+ this . saveOptions ( ) ;
105
+ }
106
+ public get isCommentOptionsExpanded ( ) : boolean {
107
+ return this . _isCommentOptionsExpanded ;
108
+ }
109
+ public set isCommentOptionsExpanded ( value : boolean ) {
110
+ this . _isCommentOptionsExpanded = value ;
111
+ this . saveOptions ( ) ;
112
+ }
113
+ public get isVerticalOptionsExpanded ( ) : boolean {
114
+ return this . _isVerticalOptionsExpanded ;
115
+ }
116
+ public set isVerticalOptionsExpanded ( value : boolean ) {
117
+ this . _isVerticalOptionsExpanded = value ;
118
+ this . saveOptions ( ) ;
119
+ }
120
+
121
+ public get isApiAboutBoxExpanded ( ) : boolean {
122
+ return this . _isApiAboutBoxExpanded ;
123
+ }
124
+ public set isApiAboutBoxExpanded ( value : boolean ) {
125
+ this . _isApiAboutBoxExpanded = value ;
126
+ this . saveOptions ( ) ;
127
+ }
128
+
129
+ public get isOutdentOptionsExpanded ( ) : boolean {
130
+ return this . _isOutdentOptionsExpanded ;
131
+ }
132
+ public set isOutdentOptionsExpanded ( value : boolean ) {
133
+ this . _isOutdentOptionsExpanded = value ;
134
+ this . saveOptions ( ) ;
135
+ }
136
+ public get isAlignmentOptionsExpanded ( ) : boolean {
137
+ return this . _isAlignmentOptionsExpanded ;
138
+ }
139
+ public set isAlignmentOptionsExpanded ( value : boolean ) {
140
+ this . _isAlignmentOptionsExpanded = value ;
141
+ this . saveOptions ( ) ;
142
+ }
143
+
144
+ private get asOptionGroups ( ) : IndenterOptionGroups {
145
+ return {
146
+ isExpanded : this . isExpanded ,
147
+ isIndentOptionsExpanded : this . isIndentOptionsExpanded ,
148
+ isAlignmentOptionsExpanded : this . isAlignmentOptionsExpanded ,
149
+ isApiAboutBoxExpanded : this . isApiAboutBoxExpanded ,
150
+ isCommentOptionsExpanded : this . isCommentOptionsExpanded ,
151
+ isOutdentOptionsExpanded : this . isOutdentOptionsExpanded ,
152
+ isVerticalOptionsExpanded : this . isVerticalOptionsExpanded
153
+ } ;
154
+ }
155
+
156
+ private saveModel ( ) : void {
157
+ if ( this . isLocalStorageOK ) {
158
+ localStorage . setItem ( 'indenter.model' , JSON . stringify ( this . model ) ) ;
159
+ }
160
+ }
161
+ private saveOptions ( ) : void {
162
+ localStorage . setItem ( 'indenter.options' , JSON . stringify ( this . asOptionGroups ) ) ;
42
163
}
43
164
44
165
public indent ( ) : void {
@@ -47,19 +168,32 @@ export class IndenterComponent implements OnInit {
47
168
this . model . indentedCode = vm . indentedCode ;
48
169
this . model . code = vm . indentedCode ;
49
170
this . isIndenterBusy = false ;
50
- } ) ;
51
- }
52
171
53
- public clear ( ) : void {
54
- this . model . code = '' ;
172
+ this . invalidateClipboard ( ) ;
173
+ this . saveModel ( ) ;
174
+ this . saveOptions ( ) ;
175
+ } ) ;
55
176
}
56
177
57
178
public copy ( ) : void {
58
179
navigator . clipboard . writeText ( this . model . code ) . then ( e => this . wasCopied = true ) ;
59
180
}
181
+ public copyTemplate ( ) : void {
182
+ navigator . clipboard . writeText ( this . asJson ) . then ( e => this . wasTemplateCopied = true ) ;
183
+ }
184
+
185
+ private invalidateClipboard ( ) : void {
186
+ this . wasCopied = false ;
187
+ this . wasTemplateCopied = false ;
188
+ }
189
+
190
+ public get apiBaseUrl ( ) : string {
191
+ return environment . apiBaseUrl . replace ( 'https://' , '' ) ;
192
+ }
60
193
61
194
public onModelChanged ( code : string ) : void {
62
195
this . model . code = code ;
63
- this . wasCopied = false ;
196
+ this . invalidateClipboard ( ) ;
197
+ this . saveModel ( ) ;
64
198
}
65
199
}
0 commit comments