@@ -21,6 +21,37 @@ const SEARCH_RESULTS_RENDERING_TYPE_DESCRIPTION = {
21
21
[ ESearchResultsRenderingTypes . LIST ] : 'List' ,
22
22
}
23
23
24
+ export enum ESearchColumnsTypes {
25
+ KEY = 'KEY' ,
26
+ SUMMARY = 'SUMMARY' ,
27
+ TYPE = 'TYPE' ,
28
+ CREATED = 'CREATED' ,
29
+ UPDATED = 'UPDATED' ,
30
+ REPORTER = 'REPORTER' ,
31
+ ASSIGNEE = 'ASSIGNEE' ,
32
+ PRIORITY = 'PRIORITY' ,
33
+ STATUS = 'STATUS' ,
34
+ CUSTOM = 'CUSTOM' ,
35
+ }
36
+ const SEARCH_COLUMNS_DESCRIPTION = {
37
+ [ ESearchColumnsTypes . KEY ] : 'Key' ,
38
+ [ ESearchColumnsTypes . SUMMARY ] : 'Summary' ,
39
+ [ ESearchColumnsTypes . TYPE ] : 'Type' ,
40
+ [ ESearchColumnsTypes . CREATED ] : 'Created' ,
41
+ [ ESearchColumnsTypes . UPDATED ] : 'Updated' ,
42
+ [ ESearchColumnsTypes . REPORTER ] : 'Reporter' ,
43
+ [ ESearchColumnsTypes . ASSIGNEE ] : 'Assignee' ,
44
+ [ ESearchColumnsTypes . PRIORITY ] : 'Priority' ,
45
+ [ ESearchColumnsTypes . STATUS ] : 'Status' ,
46
+ [ ESearchColumnsTypes . CUSTOM ] : 'Custom' ,
47
+ }
48
+
49
+ interface ISearchColumn {
50
+ type : ESearchColumnsTypes
51
+ compact : boolean
52
+ customField ?: string
53
+ }
54
+
24
55
export interface IJiraIssueSettings {
25
56
host : string
26
57
authenticationType : EAuthenticationTypes
@@ -31,8 +62,9 @@ export interface IJiraIssueSettings {
31
62
cacheTime : string
32
63
searchResultsLimit : number
33
64
statusColorCache : Record < string , string >
34
- searchResultsRenderingType : ESearchResultsRenderingTypes ,
35
- darkMode : boolean ,
65
+ searchResultsRenderingType : ESearchResultsRenderingTypes
66
+ darkMode : boolean
67
+ searchColumns : ISearchColumn [ ]
36
68
}
37
69
38
70
const DEFAULT_SETTINGS : IJiraIssueSettings = {
@@ -45,6 +77,17 @@ const DEFAULT_SETTINGS: IJiraIssueSettings = {
45
77
statusColorCache : { } ,
46
78
searchResultsRenderingType : ESearchResultsRenderingTypes . TABLE ,
47
79
darkMode : false ,
80
+ searchColumns : [
81
+ { type : ESearchColumnsTypes . KEY , compact : false } ,
82
+ { type : ESearchColumnsTypes . SUMMARY , compact : false } ,
83
+ { type : ESearchColumnsTypes . TYPE , compact : true } ,
84
+ { type : ESearchColumnsTypes . CREATED , compact : false } ,
85
+ { type : ESearchColumnsTypes . UPDATED , compact : false } ,
86
+ { type : ESearchColumnsTypes . REPORTER , compact : false } ,
87
+ { type : ESearchColumnsTypes . ASSIGNEE , compact : false } ,
88
+ { type : ESearchColumnsTypes . PRIORITY , compact : true } ,
89
+ { type : ESearchColumnsTypes . STATUS , compact : false } ,
90
+ ] ,
48
91
}
49
92
50
93
export class JiraIssueSettingsTab extends PluginSettingTab {
@@ -88,7 +131,7 @@ export class JiraIssueSettingsTab extends PluginSettingTab {
88
131
. addText ( text => text
89
132
. setPlaceholder ( 'Example: ' + DEFAULT_SETTINGS . host )
90
133
. setValue ( this . _data . host )
91
- . onChange ( async ( value ) => {
134
+ . onChange ( async value => {
92
135
this . _data . host = value
93
136
await this . saveSettings ( )
94
137
} ) )
@@ -98,7 +141,7 @@ export class JiraIssueSettingsTab extends PluginSettingTab {
98
141
. addDropdown ( dropdown => dropdown
99
142
. addOptions ( AUTHENTICATION_TYPE_DESCRIPTION )
100
143
. setValue ( this . _data . authenticationType )
101
- . onChange ( async ( value ) => {
144
+ . onChange ( async value => {
102
145
this . _data . authenticationType = value as EAuthenticationTypes
103
146
await this . saveSettings ( )
104
147
} ) )
@@ -108,7 +151,7 @@ export class JiraIssueSettingsTab extends PluginSettingTab {
108
151
. addText ( text => text
109
152
// .setPlaceholder('')
110
153
. setValue ( this . _data . username )
111
- . onChange ( async ( value ) => {
154
+ . onChange ( async value => {
112
155
this . _data . username = value
113
156
await this . saveSettings ( )
114
157
} ) )
@@ -118,7 +161,7 @@ export class JiraIssueSettingsTab extends PluginSettingTab {
118
161
. addText ( text => text
119
162
// .setPlaceholder('')
120
163
. setValue ( DEFAULT_SETTINGS . password )
121
- . onChange ( async ( value ) => {
164
+ . onChange ( async value => {
122
165
this . _data . password = value
123
166
await this . saveSettings ( )
124
167
} ) )
@@ -128,7 +171,7 @@ export class JiraIssueSettingsTab extends PluginSettingTab {
128
171
. addText ( text => text
129
172
// .setPlaceholder('')
130
173
. setValue ( this . _data . bareToken )
131
- . onChange ( async ( value ) => {
174
+ . onChange ( async value => {
132
175
this . _data . bareToken = value
133
176
await this . saveSettings ( )
134
177
} ) )
@@ -141,7 +184,7 @@ export class JiraIssueSettingsTab extends PluginSettingTab {
141
184
. addText ( text => text
142
185
. setPlaceholder ( 'Example: 15m, 24h, 5s' )
143
186
. setValue ( this . _data . cacheTime )
144
- . onChange ( async ( value ) => {
187
+ . onChange ( async value => {
145
188
this . _data . cacheTime = value
146
189
await this . saveSettings ( )
147
190
} ) )
@@ -154,7 +197,7 @@ export class JiraIssueSettingsTab extends PluginSettingTab {
154
197
. addDropdown ( dropdown => dropdown
155
198
. addOptions ( SEARCH_RESULTS_RENDERING_TYPE_DESCRIPTION )
156
199
. setValue ( this . _data . searchResultsRenderingType )
157
- . onChange ( async ( value ) => {
200
+ . onChange ( async value => {
158
201
this . _data . searchResultsRenderingType = value as ESearchResultsRenderingTypes
159
202
await this . saveSettings ( )
160
203
} ) )
@@ -164,21 +207,100 @@ export class JiraIssueSettingsTab extends PluginSettingTab {
164
207
. addText ( text => text
165
208
// .setPlaceholder('Insert a number')
166
209
. setValue ( this . _data . searchResultsLimit . toString ( ) )
167
- . onChange ( async ( value ) => {
210
+ . onChange ( async value => {
168
211
this . _data . searchResultsLimit = parseInt ( value ) || DEFAULT_SETTINGS . searchResultsLimit
169
212
await this . saveSettings ( )
170
213
} ) )
171
214
new Setting ( containerEl )
172
215
. setName ( 'Dark mode' )
173
216
// .setDesc('')
174
- . addToggle ( text => text
175
- // .setPlaceholder('Insert a number')
217
+ . addToggle ( toggle => toggle
176
218
. setValue ( this . _data . darkMode )
177
- . onChange ( async ( value ) => {
219
+ . onChange ( async value => {
178
220
this . _data . darkMode = value
179
221
await this . saveSettings ( )
180
222
} ) )
181
223
182
224
225
+ containerEl . createEl ( 'h2' , { text : 'Search columns' } )
226
+ const desc = document . createDocumentFragment ( )
227
+ desc . append (
228
+ "Columns to display in the jira-search table visualization." ,
229
+ )
230
+ new Setting ( containerEl ) . setDesc ( desc )
231
+ this . _data . searchColumns . forEach ( ( column , index ) => {
232
+ const setting = new Setting ( containerEl )
233
+ . addDropdown ( dropdown => dropdown
234
+ . addOptions ( SEARCH_COLUMNS_DESCRIPTION )
235
+ . setValue ( column . type )
236
+ . onChange ( async value => {
237
+ this . _data . searchColumns [ index ] . type = value as ESearchColumnsTypes
238
+ await this . saveSettings ( )
239
+ // Force refresh
240
+ this . display ( )
241
+ } ) . selectEl . addClass ( 'flex-grow-1' )
242
+ )
243
+
244
+ if ( column . type === ESearchColumnsTypes . CUSTOM ) {
245
+ setting . addText ( text => text
246
+ . setPlaceholder ( 'Custom field name' )
247
+ . setValue ( column . customField )
248
+ . onChange ( async value => {
249
+ this . _data . searchColumns [ index ] . customField = value
250
+ await this . saveSettings ( )
251
+ } ) . inputEl . addClass ( 'custom-field-text' )
252
+ )
253
+ }
254
+ setting . addExtraButton ( button => button
255
+ . setIcon ( this . _data . searchColumns [ index ] . compact ? 'compress-glyph' : 'enlarge-glyph' )
256
+ . setTooltip ( this . _data . searchColumns [ index ] . compact ? 'Compact' : 'Full width' )
257
+ . onClick ( async ( ) => {
258
+ this . _data . searchColumns [ index ] . compact = ! this . _data . searchColumns [ index ] . compact
259
+ await this . saveSettings ( )
260
+ // Force refresh
261
+ this . display ( )
262
+ } ) )
263
+ setting . addExtraButton ( button => button
264
+ . setIcon ( 'up-chevron-glyph' )
265
+ . setDisabled ( index === 0 )
266
+ . onClick ( async ( ) => {
267
+ const tmp = this . _data . searchColumns [ index ]
268
+ this . _data . searchColumns [ index ] = this . _data . searchColumns [ index - 1 ]
269
+ this . _data . searchColumns [ index - 1 ] = tmp
270
+ await this . saveSettings ( )
271
+ // Force refresh
272
+ this . display ( )
273
+ } ) )
274
+ setting . addExtraButton ( button => button
275
+ . setIcon ( 'down-chevron-glyph' )
276
+ . setDisabled ( index === this . _data . searchColumns . length - 1 )
277
+ . onClick ( async ( ) => {
278
+ const tmp = this . _data . searchColumns [ index ]
279
+ this . _data . searchColumns [ index ] = this . _data . searchColumns [ index + 1 ]
280
+ this . _data . searchColumns [ index + 1 ] = tmp
281
+ await this . saveSettings ( )
282
+ // Force refresh
283
+ this . display ( )
284
+ } ) )
285
+ setting . addExtraButton ( button => button
286
+ . setIcon ( 'cross' )
287
+ . onClick ( async ( ) => {
288
+ this . _data . searchColumns . splice ( index , 1 )
289
+ await this . saveSettings ( )
290
+ // Force refresh
291
+ this . display ( )
292
+ } ) )
293
+ setting . infoEl . remove ( )
294
+ } )
295
+ new Setting ( containerEl ) . addButton ( button => button
296
+ . setButtonText ( "Add Column" )
297
+ . setCta ( )
298
+ . onClick ( async value => {
299
+ this . _data . searchColumns . push ( { type : ESearchColumnsTypes . STATUS , compact : false } )
300
+ await this . saveSettings ( )
301
+ // Force refresh
302
+ this . display ( )
303
+ } )
304
+ )
183
305
}
184
306
}
0 commit comments