Skip to content

Commit d500ad8

Browse files
committed
Search column select settings #4
1 parent a23ac93 commit d500ad8

File tree

2 files changed

+146
-13
lines changed

2 files changed

+146
-13
lines changed

src/settings.ts

+135-13
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,37 @@ const SEARCH_RESULTS_RENDERING_TYPE_DESCRIPTION = {
2121
[ESearchResultsRenderingTypes.LIST]: 'List',
2222
}
2323

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+
2455
export interface IJiraIssueSettings {
2556
host: string
2657
authenticationType: EAuthenticationTypes
@@ -31,8 +62,9 @@ export interface IJiraIssueSettings {
3162
cacheTime: string
3263
searchResultsLimit: number
3364
statusColorCache: Record<string, string>
34-
searchResultsRenderingType: ESearchResultsRenderingTypes,
35-
darkMode: boolean,
65+
searchResultsRenderingType: ESearchResultsRenderingTypes
66+
darkMode: boolean
67+
searchColumns: ISearchColumn[]
3668
}
3769

3870
const DEFAULT_SETTINGS: IJiraIssueSettings = {
@@ -45,6 +77,17 @@ const DEFAULT_SETTINGS: IJiraIssueSettings = {
4577
statusColorCache: {},
4678
searchResultsRenderingType: ESearchResultsRenderingTypes.TABLE,
4779
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+
],
4891
}
4992

5093
export class JiraIssueSettingsTab extends PluginSettingTab {
@@ -88,7 +131,7 @@ export class JiraIssueSettingsTab extends PluginSettingTab {
88131
.addText(text => text
89132
.setPlaceholder('Example: ' + DEFAULT_SETTINGS.host)
90133
.setValue(this._data.host)
91-
.onChange(async (value) => {
134+
.onChange(async value => {
92135
this._data.host = value
93136
await this.saveSettings()
94137
}))
@@ -98,7 +141,7 @@ export class JiraIssueSettingsTab extends PluginSettingTab {
98141
.addDropdown(dropdown => dropdown
99142
.addOptions(AUTHENTICATION_TYPE_DESCRIPTION)
100143
.setValue(this._data.authenticationType)
101-
.onChange(async (value) => {
144+
.onChange(async value => {
102145
this._data.authenticationType = value as EAuthenticationTypes
103146
await this.saveSettings()
104147
}))
@@ -108,7 +151,7 @@ export class JiraIssueSettingsTab extends PluginSettingTab {
108151
.addText(text => text
109152
// .setPlaceholder('')
110153
.setValue(this._data.username)
111-
.onChange(async (value) => {
154+
.onChange(async value => {
112155
this._data.username = value
113156
await this.saveSettings()
114157
}))
@@ -118,7 +161,7 @@ export class JiraIssueSettingsTab extends PluginSettingTab {
118161
.addText(text => text
119162
// .setPlaceholder('')
120163
.setValue(DEFAULT_SETTINGS.password)
121-
.onChange(async (value) => {
164+
.onChange(async value => {
122165
this._data.password = value
123166
await this.saveSettings()
124167
}))
@@ -128,7 +171,7 @@ export class JiraIssueSettingsTab extends PluginSettingTab {
128171
.addText(text => text
129172
// .setPlaceholder('')
130173
.setValue(this._data.bareToken)
131-
.onChange(async (value) => {
174+
.onChange(async value => {
132175
this._data.bareToken = value
133176
await this.saveSettings()
134177
}))
@@ -141,7 +184,7 @@ export class JiraIssueSettingsTab extends PluginSettingTab {
141184
.addText(text => text
142185
.setPlaceholder('Example: 15m, 24h, 5s')
143186
.setValue(this._data.cacheTime)
144-
.onChange(async (value) => {
187+
.onChange(async value => {
145188
this._data.cacheTime = value
146189
await this.saveSettings()
147190
}))
@@ -154,7 +197,7 @@ export class JiraIssueSettingsTab extends PluginSettingTab {
154197
.addDropdown(dropdown => dropdown
155198
.addOptions(SEARCH_RESULTS_RENDERING_TYPE_DESCRIPTION)
156199
.setValue(this._data.searchResultsRenderingType)
157-
.onChange(async (value) => {
200+
.onChange(async value => {
158201
this._data.searchResultsRenderingType = value as ESearchResultsRenderingTypes
159202
await this.saveSettings()
160203
}))
@@ -164,21 +207,100 @@ export class JiraIssueSettingsTab extends PluginSettingTab {
164207
.addText(text => text
165208
// .setPlaceholder('Insert a number')
166209
.setValue(this._data.searchResultsLimit.toString())
167-
.onChange(async (value) => {
210+
.onChange(async value => {
168211
this._data.searchResultsLimit = parseInt(value) || DEFAULT_SETTINGS.searchResultsLimit
169212
await this.saveSettings()
170213
}))
171214
new Setting(containerEl)
172215
.setName('Dark mode')
173216
// .setDesc('')
174-
.addToggle(text => text
175-
// .setPlaceholder('Insert a number')
217+
.addToggle(toggle => toggle
176218
.setValue(this._data.darkMode)
177-
.onChange(async (value) => {
219+
.onChange(async value => {
178220
this._data.darkMode = value
179221
await this.saveSettings()
180222
}))
181223

182224

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+
)
183305
}
184306
}

styles.css

+11
Original file line numberDiff line numberDiff line change
@@ -315,3 +315,14 @@ th {
315315
.jira-issue-container .table.is-hoverable.is-dark tbody tr:not(.is-selected):hover {
316316
background-color: #141414;
317317
}
318+
319+
/* Settings */
320+
.setting-item-control select.flex-grow-1 {
321+
flex-grow: 1;
322+
max-width: none;
323+
}
324+
.setting-item-control input[type='text'].custom-field-text {
325+
margin-left: 10px;
326+
height: 2.5em;
327+
border-radius: 8px;
328+
}

0 commit comments

Comments
 (0)