Skip to content

Commit

Permalink
In the columns view is now possible to change the ordering of column …
Browse files Browse the repository at this point in the history
…names. This overrides the settings.
  • Loading branch information
ernstc committed Jan 5, 2024
1 parent c9f51b8 commit 7d9f0b9
Show file tree
Hide file tree
Showing 5 changed files with 70 additions and 10 deletions.
7 changes: 6 additions & 1 deletion src/controllers/visualization.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ interface IOutgoingMessage {
objects?: DatabaseObject[];
objectsSchema?: string[];
columns?: DatabaseColumn[];
sortColumnNames?: string;
values?: DatabaseColumnValue[];
rows?: DatabaseTableRow[];
rowsColumnsName?: string[];
Expand Down Expand Up @@ -213,6 +214,9 @@ const updateViewModel = (viewModel: ViewModel, vmUpdates?: ViewModel) => {
case 'showRecordDetails':
viewModel.showRecordDetails = vmUpdates?.showRecordDetails;
break;
case 'sortColumnNames':
viewModel.sortColumnNames = vmUpdates?.sortColumnNames;
break;
case 'sortAscendingColumnValues':
viewModel.sortAscendingColumnValues = vmUpdates?.sortAscendingColumnValues;
break;
Expand Down Expand Up @@ -341,14 +345,15 @@ const loadObjects = async (connectionId: string, webview: azdata.DashboardWebvie
const loadColumns = async (connectionId: string, webview: azdata.DashboardWebview | vscode.Webview, viewModel: ViewModel) => {
const object = viewModel.selectedObject!;

viewModel.columns = await getMssqlDbColumns(connectionId, object);
viewModel.columns = await getMssqlDbColumns(connectionId, object, viewModel.sortColumnNames);
viewModel.values = undefined;
viewModel.selectedColumnIndex = undefined;
viewModel.selectedValueIndex = undefined;

postMessage(webview, {
status: Status.RenderingData,
columns: viewModel.columns,
sortColumnNames: viewModel.sortColumnNames,
object: object
});
};
Expand Down
2 changes: 2 additions & 0 deletions src/models/view.model.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ export class ViewModel {
selectTables?: boolean;
selectViews?: boolean;

sortColumnNames?: string;

sortAscendingColumnValues?: boolean;
sortAscendingColumnValuesCount?: boolean;

Expand Down
20 changes: 17 additions & 3 deletions src/repositories/mssql.repository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,8 @@ export const getMssqlDbObjects = async (

export const getMssqlDbColumns = async (
connectionId: string,
table: DatabaseObject
table: DatabaseObject,
sortColumnNames?: string
): Promise<DatabaseColumn[]> => {

if (table === undefined || table === null) {
Expand All @@ -143,6 +144,20 @@ export const getMssqlDbColumns = async (

const vscodeSettings = VscodeSettings.getInstance();

let sortingExpression = '';
if (sortColumnNames === 'ascending') {
sortingExpression = 'c.name';
}
else if (sortColumnNames === 'descending') {
sortingExpression = 'c.name DESC';
}
else {
sortingExpression = `
${vscodeSettings.columnsShowPrimaryKeyFirst ? 'is_primary_key desc,' : ''}
${vscodeSettings.columnsOrderAlphabetically ? 'c.name' : 'c.column_id'}
`;
}

let query = `
SELECT distinct
c.name
Expand Down Expand Up @@ -190,8 +205,7 @@ export const getMssqlDbColumns = async (
(o.name = N'${table.Name}')
and (schema_Name(o.schema_id) = N'${table.Schema}')
ORDER BY
${vscodeSettings.columnsShowPrimaryKeyFirst ? 'is_primary_key desc,' : ''}
${vscodeSettings.columnsOrderAlphabetically ? 'c.name' : 'c.column_id'}
${sortingExpression}
`;

let dbResult = await runQuery<DbColumnsResponse>(Provider.MSSQL, connectionId, query);
Expand Down
2 changes: 1 addition & 1 deletion src/web/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ <h2>
<h2>Columns <span id="columnsCount" class="count"></span></h2>
<div class="table">
<div class="table-header">
<div class="col1">Name</div>
<div class="col1 sortable">Name</div>
<div class="col2">Type</div>
</div>
<!--<div class="table-data">
Expand Down
49 changes: 44 additions & 5 deletions src/web/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,7 @@
hideLoading();
}
if (e.data.columns !== undefined) {
await renderColumns(e.data.columns);
await renderColumns(e.data.columns, undefined, e.data.sortColumnNames);
hideLoading();
}
if (e.data.values !== undefined) {
Expand Down Expand Up @@ -291,7 +291,7 @@
}

if (vm.columns !== undefined) {
await renderColumns(vm.columns, vm.selectedColumnIndex);
await renderColumns(vm.columns, vm.selectedColumnIndex, vm.sortColumnNames);
}

if (vm.values !== undefined) {
Expand Down Expand Up @@ -371,6 +371,26 @@
}


const sortingTypes = ['', 'ascending', 'descending'];

function setHeaderCircularSorting($header) {
let sort = $header.data('sort');
if (sort === undefined || sort === null || sortingTypes.indexOf(sort) < 0) {
sort = '';
$header.data('sort', sort);
}
$header.find('i').remove();
switch (sort) {
case 'ascending':
$header.append('<i class="ms-Icon ms-Icon--CaretSolidUp"></i>');
break;
case 'descending':
$header.append('<i class="ms-Icon ms-Icon--CaretSolidDown"></i>');
break;
}
}


function renderObjects(objects, selectedIndex) {
let tablesCount = objects.filter(o => o.ObjectType === 0).length;
let viewsCount = objects.filter(o => o.ObjectType === 1).length;
Expand Down Expand Up @@ -436,14 +456,15 @@
}


async function renderColumns(columns, selectedIndex) {
async function renderColumns(columns, selectedIndex, sortColumnNames) {
_columns = columns;
$columnsCount.innerText = _selectedObject !== undefined ? `(${columns.length})` : '';
let $table;
renderCollection(columns,
$('#columns .table'),
$table = $('#columns .table'),
() =>
$(`<div class="table-header">
<div class="col1">Name</div>
<div class="col1 sortable">Name</div>
<div class="col2">Type</div>
</div>`),
(column) =>
Expand All @@ -463,10 +484,28 @@
.click(columnClicked),
selectedIndex
);
setHeaderCircularSorting($table.find('.table-header .col1').data('sort', sortColumnNames).click(columnsHeaderNameClicked));
$btnCopyValues.hide();
}


function columnsHeaderNameClicked() {
let $this = $(this);
let sort = $this.data('sort') ?? '';
let sortIndex = sortingTypes.indexOf(sort);
sort = sortingTypes[(sortIndex + 1) % sortingTypes.length];
$this.data('sort', sort);
setHeaderCircularSorting($this);
showLoading();
updateViewModel({
'sortColumnNames': sort
});
sendMessage({
'command': 'loadColumns|loadRows'
});
}


function renderValues(values, column, selectedIndex, sortAscendingValues, sortAscendingValuesCount) {
$valuesCount.innerText = values && values.length ? `(${values.length})` : '';
let $table;
Expand Down

0 comments on commit 7d9f0b9

Please sign in to comment.