Skip to content

Commit a7ff54a

Browse files
Merge pull request #321 from vais/db_ui_drawer_sections
feat: Add configurable drawer sections with custom order
2 parents f4d37b7 + 6dbf9d4 commit a7ff54a

File tree

4 files changed

+156
-35
lines changed

4 files changed

+156
-35
lines changed

autoload/db_ui/drawer.vim

Lines changed: 59 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -407,55 +407,34 @@ endfunction
407407

408408
function! s:drawer.add_db(db) abort
409409
let db_name = a:db.name
410+
410411
if !empty(a:db.conn_error)
411412
let db_name .= ' '.g:db_ui_icons.connection_error
412413
elseif !empty(a:db.conn)
413414
let db_name .= ' '.g:db_ui_icons.connection_ok
414415
endif
416+
415417
if self.show_details
416418
let db_name .= ' ('.a:db.scheme.' - '.a:db.source.')'
417419
endif
420+
418421
call self.add(db_name, 'toggle', 'db', self.get_toggle_icon('db', a:db), a:db.key_name, 0, { 'expanded': a:db.expanded })
419422
if !a:db.expanded
420423
return a:db
421424
endif
422425

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
426+
" Render sections based on g:db_ui_drawer_sections configuration
427+
for section in g:db_ui_drawer_sections
428+
if section ==# 'new_query'
429+
call self._render_new_query_section(a:db)
430+
elseif section ==# 'buffers' && !empty(a:db.buffers.list)
431+
call self._render_buffers_section(a:db)
432+
elseif section ==# 'saved_queries'
433+
call self._render_saved_queries_section(a:db)
434+
elseif section ==# 'schemas'
435+
call self._render_schemas_section(a:db)
434436
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
437+
endfor
459438
endfunction
460439

461440
function! s:drawer.render_tables(tables, db, path, level, schema) abort
@@ -719,6 +698,51 @@ function! s:drawer.get_buffer_name(db, buffer)
719698
return substitute(name, '^'.db_ui#utils#slug(a:db.name).'-', '', '')
720699
endfunction
721700

701+
function! s:drawer._render_new_query_section(db) abort
702+
call self.add('New query', 'open', 'query', g:db_ui_icons.new_query, a:db.key_name, 1)
703+
endfunction
704+
705+
function! s:drawer._render_buffers_section(db) abort
706+
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 })
707+
if a:db.buffers.expanded
708+
for buf in a:db.buffers.list
709+
let buflabel = self.get_buffer_name(a:db, buf)
710+
if self.dbui.is_tmp_location_buffer(a:db, buf)
711+
let buflabel .= ' *'
712+
endif
713+
call self.add(buflabel, 'open', 'buffer', g:db_ui_icons.buffers, a:db.key_name, 2, { 'file_path': buf })
714+
endfor
715+
endif
716+
endfunction
717+
718+
function! s:drawer._render_saved_queries_section(db) abort
719+
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 })
720+
if a:db.saved_queries.expanded
721+
for saved_query in a:db.saved_queries.list
722+
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 })
723+
endfor
724+
endif
725+
endfunction
726+
727+
function! s:drawer._render_schemas_section(db) abort
728+
if a:db.schema_support
729+
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 })
730+
if a:db.schemas.expanded
731+
for schema in a:db.schemas.list
732+
let schema_item = a:db.schemas.items[schema]
733+
let tables = schema_item.tables
734+
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 })
735+
if schema_item.expanded
736+
call self.render_tables(tables, a:db,'schemas->items->'.schema.'->tables->items', 3, schema)
737+
endif
738+
endfor
739+
endif
740+
else
741+
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 })
742+
call self.render_tables(a:db.tables, a:db, 'tables->items', 2, '')
743+
endif
744+
endfunction
745+
722746
function! s:drawer._is_schema_ignored(schema_name)
723747
for ignored_schema in g:db_ui_hide_schemas
724748
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

plugin/db_ui.vim

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ let g:db_ui_debug = get(g:, 'db_ui_debug', 0)
3333
let g:db_ui_hide_schemas = get(g:, 'db_ui_hide_schemas', [])
3434
let g:db_ui_bind_param_pattern = get(g: , 'db_ui_bind_param_pattern', ':\w\+')
3535
let g:db_ui_is_oracle_legacy = get(g:, 'db_ui_is_oracle_legacy', 0)
36+
let g:db_ui_drawer_sections = get(g:, 'db_ui_drawer_sections', ['new_query', 'buffers', 'saved_queries', 'schemas'])
37+
3638
let s:dbui_icons = get(g:, 'db_ui_icons', {})
3739
let s:expanded_icon = get(s:dbui_icons, 'expanded', '')
3840
let s:collapsed_icon = get(s:dbui_icons, 'collapsed', '')

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)