diff --git a/src/gui/src/UI/Components/Table.js b/src/gui/src/UI/Components/Table.js deleted file mode 100644 index dcd5e0a6f..000000000 --- a/src/gui/src/UI/Components/Table.js +++ /dev/null @@ -1,103 +0,0 @@ -/** - * Copyright (C) 2024-present Puter Technologies Inc. - * - * This file is part of Puter. - * - * Puter is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - - -const Component = use('util.Component'); - -/** - * A table with a sticky header - */ -export default def(class Table extends Component { - static ID = 'ui.component.Table'; - - static PROPERTIES = { - headings: { value: [] }, - scale: { value: '2pt' }, - rows: { value: [] }, - } - - static CSS = /*css*/` - table { - box-sizing: border-box; - border-collapse: collapse; - width: 100%; - } - - thead th { - box-shadow: 0 1px 4px -2px rgba(0,0,0,0.2); - backdrop-filter: blur(2px); - position: sticky; - z-index: 100; - padding: - calc(10 * var(--scale)) - calc(2.5 * var(--scale)) - calc(5 * var(--scale)) - calc(2.5 * var(--scale)); - top: 0; - background-color: hsla(0, 0%, 100%, 0.8); - text-align: left; - border-bottom: 1px solid #e0e0e0; - } - - thead th:not(:last-of-type) { - /* we set borders on this span because */ - /* borders fly away from sticky headers */ - border-right: 1px solid #e0e0e0; - } - - tbody > * { - border-bottom: 1px solid #e0e0e0; - padding: 0 calc(2.5 * var(--scale)); - vertical-align: middle; - } - `; - - create_template ({ template }) { - $(template).html(` - - - - - - - -
- `); - } - - on_ready ({ listen }) { - listen('headings', headings => { - $(this.dom_).find('.headings') - .html(headings.map(heading => `${heading}`).join('')) - }); - - listen('scale', scale => { - $(this.dom_).css('--scale', scale); - }); - - listen('rows', rows => { - const tbody = $(this.dom_).find('tbody')[0]; - $(tbody).find('[slot=rows]').detach(); - for (const row of rows) { - row.setAttribute('slot', 'rows'); - row.attach(tbody); - } - }); - } -}); diff --git a/src/gui/src/UI/UIWindowTaskManager.js b/src/gui/src/UI/UIWindowTaskManager.js index 084165a85..2b877c85f 100644 --- a/src/gui/src/UI/UIWindowTaskManager.js +++ b/src/gui/src/UI/UIWindowTaskManager.js @@ -21,7 +21,6 @@ import UIAlert from "./UIAlert.js"; import UIContextMenu from "./UIContextMenu.js"; import { Component, defineComponent } from '../util/Component.js'; import UIComponentWindow from './UIComponentWindow.js'; -import Table from './Components/Table.js'; const end_process = async (uuid, force) => { const svc_process = globalThis.services.get('process'); @@ -78,49 +77,68 @@ class TaskManagerTable extends Component { border: 2px inset rgba(127, 127, 127, 0.3); overflow: auto; } + + table { + box-sizing: border-box; + border-collapse: collapse; + width: 100%; + } + + thead th { + box-shadow: 0 1px 4px -2px rgba(0,0,0,0.2); + backdrop-filter: blur(2px); + position: sticky; + z-index: 100; + padding: + calc(10 * var(--scale)) + calc(2.5 * var(--scale)) + calc(5 * var(--scale)) + calc(2.5 * var(--scale)); + top: 0; + background-color: hsla(0, 0%, 100%, 0.8); + text-align: left; + border-bottom: 1px solid #e0e0e0; + } + + thead th:not(:last-of-type) { + border-right: 1px solid #e0e0e0; + } + + tbody > tr > td { + border-bottom: 1px solid #e0e0e0; + padding: 0 calc(2.5 * var(--scale)); + vertical-align: middle; + } `; #svc_process = globalThis.services.get('process'); create_template ({ template }) { $(template).html(` -
+ + + + + + + + + + +
${i18n('taskmgr_header_name')}${i18n('taskmgr_header_type')}${i18n('taskmgr_header_status')}
`); } on_ready ({ listen }) { - this.table = new Table({ - headings: [ - i18n('taskmgr_header_name'), - i18n('taskmgr_header_type'), - i18n('taskmgr_header_status'), - ] - }); - this.table.attach(this.dom_.querySelector('.taskmgr-taskarea')); - listen('tasks', tasks => { const row_data = this.#iter_tasks(tasks, { indent_level: 0, is_last_item_stack: [] }); - const new_uuids = row_data.map(it => it.uuid); + const tbody = $(this.dom_).find('.taskmgr-taskarea'); + tbody.empty(); - const old_rows = this.table.get('rows'); - - const rows = []; for (const data of row_data) { - // Try to reuse old row - const old_row = old_rows.find(it => data.uuid === it.get('uuid')); - if (old_row) { - for (const property in data) { - old_row.set(property, data[property]); - } - rows.push(old_row); - continue; - } - - // Create a new row - rows.push(new TaskManagerRow(data)); + const row = new TaskManagerRow(data); + row.attach(tbody[0]); } - - this.table.set('rows', rows); }); }