diff --git a/src/components/data-table/dialog-data-table-settings.ts b/src/components/data-table/dialog-data-table-settings.ts index 265abe0da0c5..1dfe8bbabf49 100644 --- a/src/components/data-table/dialog-data-table-settings.ts +++ b/src/components/data-table/dialog-data-table-settings.ts @@ -202,20 +202,53 @@ export class DialogDataTableSettings extends LitElement { const columns = this._sortedColumns( this._params.columns, this._columnOrder, - this._hiddenColumns + hidden ); if (!this._columnOrder) { this._columnOrder = columns.map((col) => col.key); } else { + const newOrder = this._columnOrder.filter((col) => col !== column); + + // Array.findLastIndex when supported or core-js polyfill + const findLastIndex = ( + arr: Array, + fn: (item: any, index: number, arr: Array) => boolean + ) => { + for (let i = arr.length - 1; i >= 0; i--) { + if (fn(arr[i], i, arr)) return i; + } + return -1; + }; + + let lastMoveable = findLastIndex( + newOrder, + (col) => + col !== column && + !hidden.includes(col) && + !this._params!.columns[col].main && + this._params!.columns[col].moveable !== false + ); + + if (lastMoveable === -1) { + lastMoveable = newOrder.length - 1; + } + columns.forEach((col) => { - if (!this._columnOrder!.includes(col.key)) { - this._columnOrder!.push(col.key); + if (!newOrder.includes(col.key)) { + if (col.moveable === false) { + newOrder.unshift(col.key); + } else { + newOrder.splice(lastMoveable + 1, 0, col.key); + } + if (col.defaultHidden) { hidden.push(col.key); } } }); + + this._columnOrder = newOrder; } this._hiddenColumns = hidden;