Skip to content

Commit 31cd668

Browse files
committed
feat: Add configurable drawer sections with custom order
1 parent 65454e2 commit 31cd668

File tree

3 files changed

+159
-35
lines changed

3 files changed

+159
-35
lines changed

autoload/db_ui/drawer.vim

Lines changed: 64 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@ function db_ui#drawer#get()
99
return s:drawer_instance
1010
endfunction
1111

12+
" Default drawer sections and their order
13+
if !exists('g:db_ui_drawer_sections')
14+
let g:db_ui_drawer_sections = ['new_query', 'buffers', 'saved_queries', 'schemas']
15+
endif
16+
1217
function! s:drawer.new(dbui) abort
1318
let instance = copy(self)
1419
let instance.dbui = a:dbui
@@ -407,55 +412,34 @@ endfunction
407412

408413
function! s:drawer.add_db(db) abort
409414
let db_name = a:db.name
415+
410416
if !empty(a:db.conn_error)
411417
let db_name .= ' '.g:db_ui_icons.connection_error
412418
elseif !empty(a:db.conn)
413419
let db_name .= ' '.g:db_ui_icons.connection_ok
414420
endif
421+
415422
if self.show_details
416423
let db_name .= ' ('.a:db.scheme.' - '.a:db.source.')'
417424
endif
425+
418426
call self.add(db_name, 'toggle', 'db', self.get_toggle_icon('db', a:db), a:db.key_name, 0, { 'expanded': a:db.expanded })
419427
if !a:db.expanded
420428
return a:db
421429
endif
422430

423-
call self.add('New query', 'open', 'query', g:db_ui_icons.new_query, a:db.key_name, 1)
424-
if !empty(a:db.buffers.list)
425-
call self.add('Buffers ('.len(a:db.buffers.list).')', 'toggle', 'buffers', self.get_toggle_icon('buffers', a:db.buffers), a:db.key_name, 1, { 'expanded': a:db.buffers.expanded })
426-
if a:db.buffers.expanded
427-
for buf in a:db.buffers.list
428-
let buflabel = self.get_buffer_name(a:db, buf)
429-
if self.dbui.is_tmp_location_buffer(a:db, buf)
430-
let buflabel .= ' *'
431-
endif
432-
call self.add(buflabel, 'open', 'buffer', g:db_ui_icons.buffers, a:db.key_name, 2, { 'file_path': buf })
433-
endfor
431+
" Render sections based on g:db_ui_drawer_sections configuration
432+
for section in g:db_ui_drawer_sections
433+
if section ==# 'new_query'
434+
call self._render_new_query_section(a:db)
435+
elseif section ==# 'buffers' && !empty(a:db.buffers.list)
436+
call self._render_buffers_section(a:db)
437+
elseif section ==# 'saved_queries'
438+
call self._render_saved_queries_section(a:db)
439+
elseif section ==# 'schemas'
440+
call self._render_schemas_section(a:db)
434441
endif
435-
endif
436-
call self.add('Saved queries ('.len(a:db.saved_queries.list).')', 'toggle', 'saved_queries', self.get_toggle_icon('saved_queries', a:db.saved_queries), a:db.key_name, 1, { 'expanded': a:db.saved_queries.expanded })
437-
if a:db.saved_queries.expanded
438-
for saved_query in a:db.saved_queries.list
439-
call self.add(fnamemodify(saved_query, ':t'), 'open', 'buffer', g:db_ui_icons.saved_query, a:db.key_name, 2, { 'file_path': saved_query, 'saved': 1 })
440-
endfor
441-
endif
442-
443-
if a:db.schema_support
444-
call self.add('Schemas ('.len(a:db.schemas.items).')', 'toggle', 'schemas', self.get_toggle_icon('schemas', a:db.schemas), a:db.key_name, 1, { 'expanded': a:db.schemas.expanded })
445-
if a:db.schemas.expanded
446-
for schema in a:db.schemas.list
447-
let schema_item = a:db.schemas.items[schema]
448-
let tables = schema_item.tables
449-
call self.add(schema.' ('.len(tables.items).')', 'toggle', 'schemas->items->'.schema, self.get_toggle_icon('schema', schema_item), a:db.key_name, 2, { 'expanded': schema_item.expanded })
450-
if schema_item.expanded
451-
call self.render_tables(tables, a:db,'schemas->items->'.schema.'->tables->items', 3, schema)
452-
endif
453-
endfor
454-
endif
455-
else
456-
call self.add('Tables ('.len(a:db.tables.items).')', 'toggle', 'tables', self.get_toggle_icon('tables', a:db.tables), a:db.key_name, 1, { 'expanded': a:db.tables.expanded })
457-
call self.render_tables(a:db.tables, a:db, 'tables->items', 2, '')
458-
endif
442+
endfor
459443
endfunction
460444

461445
function! s:drawer.render_tables(tables, db, path, level, schema) abort
@@ -719,6 +703,51 @@ function! s:drawer.get_buffer_name(db, buffer)
719703
return substitute(name, '^'.db_ui#utils#slug(a:db.name).'-', '', '')
720704
endfunction
721705

706+
function! s:drawer._render_new_query_section(db) abort
707+
call self.add('New query', 'open', 'query', g:db_ui_icons.new_query, a:db.key_name, 1)
708+
endfunction
709+
710+
function! s:drawer._render_buffers_section(db) abort
711+
call self.add('Buffers ('.len(a:db.buffers.list).')', 'toggle', 'buffers', self.get_toggle_icon('buffers', a:db.buffers), a:db.key_name, 1, { 'expanded': a:db.buffers.expanded })
712+
if a:db.buffers.expanded
713+
for buf in a:db.buffers.list
714+
let buflabel = self.get_buffer_name(a:db, buf)
715+
if self.dbui.is_tmp_location_buffer(a:db, buf)
716+
let buflabel .= ' *'
717+
endif
718+
call self.add(buflabel, 'open', 'buffer', g:db_ui_icons.buffers, a:db.key_name, 2, { 'file_path': buf })
719+
endfor
720+
endif
721+
endfunction
722+
723+
function! s:drawer._render_saved_queries_section(db) abort
724+
call self.add('Saved queries ('.len(a:db.saved_queries.list).')', 'toggle', 'saved_queries', self.get_toggle_icon('saved_queries', a:db.saved_queries), a:db.key_name, 1, { 'expanded': a:db.saved_queries.expanded })
725+
if a:db.saved_queries.expanded
726+
for saved_query in a:db.saved_queries.list
727+
call self.add(fnamemodify(saved_query, ':t'), 'open', 'buffer', g:db_ui_icons.saved_query, a:db.key_name, 2, { 'file_path': saved_query, 'saved': 1 })
728+
endfor
729+
endif
730+
endfunction
731+
732+
function! s:drawer._render_schemas_section(db) abort
733+
if a:db.schema_support
734+
call self.add('Schemas ('.len(a:db.schemas.items).')', 'toggle', 'schemas', self.get_toggle_icon('schemas', a:db.schemas), a:db.key_name, 1, { 'expanded': a:db.schemas.expanded })
735+
if a:db.schemas.expanded
736+
for schema in a:db.schemas.list
737+
let schema_item = a:db.schemas.items[schema]
738+
let tables = schema_item.tables
739+
call self.add(schema.' ('.len(tables.items).')', 'toggle', 'schemas->items->'.schema, self.get_toggle_icon('schema', schema_item), a:db.key_name, 2, { 'expanded': schema_item.expanded })
740+
if schema_item.expanded
741+
call self.render_tables(tables, a:db,'schemas->items->'.schema.'->tables->items', 3, schema)
742+
endif
743+
endfor
744+
endif
745+
else
746+
call self.add('Tables ('.len(a:db.tables.items).')', 'toggle', 'tables', self.get_toggle_icon('tables', a:db.tables), a:db.key_name, 1, { 'expanded': a:db.tables.expanded })
747+
call self.render_tables(a:db.tables, a:db, 'tables->items', 2, '')
748+
endif
749+
endfunction
750+
722751
function! s:drawer._is_schema_ignored(schema_name)
723752
for ignored_schema in g:db_ui_hide_schemas
724753
if match(a:schema_name, ignored_schema) > -1

doc/dadbod-ui.txt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -876,6 +876,19 @@ g:Db_ui_table_name_sorter
876876

877877
Default value: `0`
878878

879+
*g:db_ui_drawer_sections*
880+
g:db_ui_drawer_sections
881+
This value defines which sections appear in the drawer and in
882+
what order. Available sections are: 'new_query', 'buffers',
883+
'saved_queries', and 'schemas'. If not set, all sections
884+
are shown in the default order.
885+
886+
Example to only show schemas/tables and new query:
887+
>
888+
let g:db_ui_drawer_sections = ['schemas', 'new_query']
889+
<
890+
Default value: `['new_query', 'buffers', 'saved_queries', 'schemas']`
891+
879892
*g:db_ui_default_query*
880893
g:db_ui_default_query (DEPRECATED)
881894
This value was intially used as a default value for the table

test/test-drawer-sections.vim

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
let s:suite = themis#suite('Drawer sections')
2+
let s:expect = themis#helper('expect')
3+
4+
function! s:suite.before() abort
5+
call SetupTestDbs()
6+
endfunction
7+
8+
function! s:suite.after() abort
9+
call Cleanup()
10+
endfunction
11+
12+
function! s:suite.should_show_default_sections() abort
13+
:DBUI
14+
call s:expect(&filetype).to_equal('dbui')
15+
normal o
16+
call s:expect(getline(1, '$')).to_equal([
17+
\ '▾ dadbod_ui_test '.g:db_ui_icons.connection_ok,
18+
\ ' + New query',
19+
\ ' ▸ Saved queries (0)',
20+
\ ' ▸ Tables (2)',
21+
\ '▸ dadbod_ui_testing',
22+
\ ])
23+
normal o
24+
endfunction
25+
26+
function! s:suite.should_show_only_schemas_section() abort
27+
call SetOptionVariable('db_ui_drawer_sections', ['schemas'])
28+
:DBUI
29+
call s:expect(&filetype).to_equal('dbui')
30+
normal o
31+
call s:expect(getline(1, '$')).to_equal([
32+
\ '▾ dadbod_ui_test '.g:db_ui_icons.connection_ok,
33+
\ ' ▸ Tables (2)',
34+
\ '▸ dadbod_ui_testing',
35+
\ ])
36+
normal o
37+
call UnsetOptionVariable('db_ui_drawer_sections')
38+
endfunction
39+
40+
function! s:suite.should_show_only_saved_queries_section() abort
41+
call SetOptionVariable('db_ui_drawer_sections', ['saved_queries'])
42+
:DBUI
43+
call s:expect(&filetype).to_equal('dbui')
44+
normal o
45+
call s:expect(getline(1, '$')).to_equal([
46+
\ '▾ dadbod_ui_test '.g:db_ui_icons.connection_ok,
47+
\ ' ▸ Saved queries (0)',
48+
\ '▸ dadbod_ui_testing',
49+
\ ])
50+
normal o
51+
call UnsetOptionVariable('db_ui_drawer_sections')
52+
endfunction
53+
54+
function! s:suite.should_show_only_new_query_section() abort
55+
call SetOptionVariable('db_ui_drawer_sections', ['new_query'])
56+
:DBUI
57+
call s:expect(&filetype).to_equal('dbui')
58+
normal o
59+
call s:expect(getline(1, '$')).to_equal([
60+
\ '▾ dadbod_ui_test '.g:db_ui_icons.connection_ok,
61+
\ ' + New query',
62+
\ '▸ dadbod_ui_testing',
63+
\ ])
64+
normal o
65+
call UnsetOptionVariable('db_ui_drawer_sections')
66+
endfunction
67+
68+
function! s:suite.should_show_custom_section_order() abort
69+
call SetOptionVariable('db_ui_drawer_sections', ['schemas', 'new_query', 'saved_queries'])
70+
:DBUI
71+
call s:expect(&filetype).to_equal('dbui')
72+
normal o
73+
call s:expect(getline(1, '$')).to_equal([
74+
\ '▾ dadbod_ui_test '.g:db_ui_icons.connection_ok,
75+
\ ' ▸ Tables (2)',
76+
\ ' + New query',
77+
\ ' ▸ Saved queries (0)',
78+
\ '▸ dadbod_ui_testing',
79+
\ ])
80+
normal o
81+
call UnsetOptionVariable('db_ui_drawer_sections')
82+
endfunction

0 commit comments

Comments
 (0)