fix table styles for cost schedule module

This commit is contained in:
myoualid
2024-09-08 20:37:46 +01:00
parent 1c7b36f233
commit 2d7614622f
4 changed files with 318 additions and 260 deletions
@@ -1,172 +0,0 @@
:root {
--fontSize: 14px;
}
body {
margin: 0;
padding: 0;
}
.table-container {
margin-top: 1em;
overflow-x: auto;
position: relative;
}
#cost-items {
height: calc(100vh - var(--margin-small));
}
.table-scrollable-body {
max-height: 70vh;
overflow-y: auto;
display: block;
}
table {
width: 100%;
border-collapse: collapse;
user-select: none;
table-layout: fixed;
font-size: var(--fontSize);
}
thead {
position: sticky;
top: 0;
z-index: 1;
background-color: #727272;
font-size: larger;
}
tbody {
width: 100%;
}
td,
th {
padding: 0;
margin: 0;
border-left: 1px solid #ddd;
border-right: 1px solid #ddd;
text-align: center;
border-bottom: 0;
border-top: 0;
}
th {
border-bottom: 1px solid #ddd;
}
td {
align-items: center;
}
td,
th {
box-sizing: border-box; /* Include padding and border in the element's total width and height */
}
/* first td of a row, must be flex */
td:first-child {
display: flex;
align-items: center;
}
.nested {
display: none;
}
.expand-collapse {
cursor: pointer;
}
.caret-cell {
border: none;
background: none;
padding: 0;
}
input,
select {
background-color: var(--blender-button-background, var(--bg-color));
color: var(--blender-button-text, var(--text-color));
border-color: var(--blender-button-border, var(--border-color));
transition: filter 0.2s ease;
border-radius: 6px;
padding: 6px 8px;
font-size: 14px;
line-height: 20px;
transition: border-color 0.2s cubic-bezier(0.3, 0, 0.5, 1);
height: inherit;
margin-left: 0.5em;
margin-right: 0.5em;
font-size: var(--fontSize);
min-width: 50px; /* Minimum width to prevent it from becoming too small */
}
input:focus {
border-color: #28a745;
outline: none;
box-shadow: 0 0 0 3px #28a745;
}
#cost-items tr:hover,
.highlighted {
background-color: #ffb936;
color: black;
}
.highlight {
background-color: #ffb936;
color: black;
}
.cost-values-table {
width: 100%;
border-collapse: collapse;
}
.cost-values-table th,
.cost-values-table td {
border: 1px solid #ddd;
padding: 8px;
}
.cost-values-table th {
background-color: #444444;
text-align: center;
}
/* Responsive Styles */
@media (max-width: 768px) {
table {
font-size: 12px;
}
td,
th {
padding: 4px;
}
input {
padding: 2px;
font-size: 12px;
}
}
@media (max-width: 480px) {
table {
font-size: 10px;
}
td,
th {
padding: 2px;
}
input {
padding: 1px;
font-size: 10px;
}
}
@@ -1,18 +1,30 @@
@import url("./shared.css"); @import url("./shared.css");
@import url("./components/card.css"); @import url("./components/card.css");
@import url("./components/contextMenu.css"); @import url("./components/contextMenu.css");
@import url("./components/costTable.css");
@import url("./components/headerBar.css"); @import url("./components/headerBar.css");
:root {
--fontSize: 14px;
--background-color: #363636;
--button-background: #28a745;
--button-hover-background: #218838;
--scrollbar-track-color: #f1f1f1;
--scrollbar-thumb-color: #888;
--scrollbar-thumb-hover-color: #555;
}
body {
margin: 0;
padding: 0;
box-sizing: border-box;
}
.form-header { .form-header {
display: flex; display: flex;
justify-content: flex-start; justify-content: flex-start;
align-items: center; align-items: center;
margin-bottom: 10px; margin-bottom: 10px;
background-color: #363636; background-color: var(--background-color);
padding: 10px; padding: 10px;
/* trext size */ font-size: var(--fontSize);
font-size: 1.5em;
} }
span { span {
@@ -20,14 +32,12 @@ span {
} }
.floating-form { .floating-form {
height: 40vh;
width: 50vw; width: 50vw;
height: 50vh;
max-height: 80vh; max-height: 80vh;
height: auto;
position: absolute; position: absolute;
background-color: #363636; background-color: var(--background-color);
border: 1px solid black; border: 1px solid black;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
z-index: 9999; z-index: 9999;
cursor: move; cursor: move;
padding: 20px; padding: 20px;
@@ -36,8 +46,12 @@ span {
overflow-x: hidden; overflow-x: hidden;
} }
.floating-form table tr {
margin-bottom: 10px;
}
.action-button { .action-button {
background-color: #28a745; background-color: var(--button-background);
border: none; border: none;
color: #fff; color: #fff;
padding: 0.5em 1em; padding: 0.5em 1em;
@@ -52,7 +66,7 @@ span {
} }
.action-button:hover { .action-button:hover {
background-color: #218838; background-color: var(--button-hover-background);
} }
.close-button { .close-button {
@@ -66,7 +80,7 @@ span {
.settings-menu { .settings-menu {
display: none; display: none;
position: absolute; position: absolute;
background-color: #363636; background-color: var(--background-color);
border: 1px solid black; border: 1px solid black;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
z-index: 9999; z-index: 9999;
@@ -74,3 +88,210 @@ span {
padding: 20px; padding: 20px;
user-select: none; user-select: none;
} }
::-webkit-scrollbar {
width: 8px;
height: 8px;
}
::-webkit-scrollbar-track {
background: var(--scrollbar-track-color);
}
::-webkit-scrollbar-thumb {
background: var(--scrollbar-thumb-color);
border-radius: 4px;
}
::-webkit-scrollbar-thumb:hover {
background: var(--scrollbar-thumb-hover-color);
}
/* Firefox */
* {
scrollbar-width: thin;
scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-track-color);
}
/* Edge, IE */
* {
-ms-overflow-style: -ms-autohiding-scrollbar;
}
body {
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.table-container {
margin-top: 1em;
overflow-x: auto;
overflow-y: auto;
position: relative;
}
.floating-form .table-container {
height: 50%;
max-height: 50%;
}
#cost-items {
max-height: calc(100vh - var(--margin-small));
}
/* if id starts with cost-values-form */
[id^="cost-values-form"] table {
/* fixed */
max-height: 50%;
table-layout: fixed;
}
table {
width: 100%;
height: 100%;
border-collapse: collapse;
user-select: none;
font-size: var(--fontSize);
-webkit-font-smoothing: antialiased; /* Improve font rendering */
-moz-osx-font-smoothing: grayscale; /* Improve font rendering */
}
thead {
position: sticky;
top: 0;
z-index: 1;
background-color: #727272;
font-size: large;
}
tbody {
width: 100%;
height: 100%;
overflow: auto;
}
td,
th {
padding: 0;
margin: 0;
border-left: 1px solid #ddd;
border-right: 1px solid #ddd;
text-align: center;
border-bottom: 0;
border-top: 0;
}
th {
border-bottom: 1px solid #ddd;
}
td {
align-items: center;
}
/* first td of a row, must be flex */
td:first-child {
display: flex;
align-items: center;
}
.nested {
display: none;
}
.expand-collapse {
cursor: pointer;
}
.caret-cell {
border: none;
background: none;
padding: 0;
}
input,
select {
background-color: var(--blender-button-background, var(--bg-color));
color: var(--blender-button-text, var(--text-color));
border-color: var(--blender-button-border, var(--border-color));
transition: filter 0.2s ease;
border-radius: 6px;
padding: 6px 8px;
font-size: 14px;
line-height: 20px;
transition: border-color 0.2s cubic-bezier(0.3, 0, 0.5, 1);
margin-left: 0.5em;
margin-right: 0.5em;
font-size: var(--fontSize);
min-width: 50px; /* Minimum width to prevent it from becoming too small */
}
input:focus {
border-color: #28a745;
outline: none;
box-shadow: 0 0 0 3px #28a745;
color: #ddd;
}
#cost-items tr:hover,
.highlighted {
background-color: #28a74657;
}
.highlighted {
background-color: #28a74657;
}
.cost-values-table {
width: 100%;
border-collapse: collapse;
}
.cost-values-table th,
.cost-values-table td {
border: 1px solid #ddd;
padding: 8px;
}
.cost-values-table th {
background-color: #444444;
text-align: center;
}
/* Responsive Styles */
@media (max-width: 768px) {
table {
font-size: 12px;
}
td,
th {
padding: 2px;
font-size: 12px;
}
input {
padding: 2px;
font-size: 12px;
}
}
@media (max-width: 480px) {
table {
font-size: 10px;
}
td,
th {
padding: 2px;
}
input {
padding: 1px;
font-size: 10px;
}
}
form table {
max-height: 50%;
}
@@ -17,16 +17,15 @@ $(document).ready(function () {
icon: "fa-regular fa-eye-slash", icon: "fa-regular fa-eye-slash",
callback: (button) => { callback: (button) => {
CostUI.toggleSchedulesContainer(button); CostUI.toggleSchedulesContainer(button);
} },
}); });
CostUI.addRibbonButton({ CostUI.addRibbonButton({
text: "Settings", text: "Settings",
icon: "fas fa-cog", icon: "fas fa-cog",
callback: (button) => { callback: (button) => {
CostUI.toggleSettingsMenu(button); CostUI.toggleSettingsMenu(button);
} },
}); });
}); });
function connectSocket() { function connectSocket() {
@@ -86,7 +85,6 @@ function handleSelectedProducts(data) {
} }
function handlePredefinedTypes(data) { function handlePredefinedTypes(data) {
CostUI.enableAddingCostSchedule( CostUI.enableAddingCostSchedule(
data.data["predefined_types"], data.data["predefined_types"],
addCostSchedule addCostSchedule
@@ -29,7 +29,6 @@ export class CostUI {
const tr = document.createElement("tr"); const tr = document.createElement("tr");
thead.appendChild(tr); thead.appendChild(tr);
for (let i = 0; i < columnHeaders.length; i++) { for (let i = 0; i < columnHeaders.length; i++) {
const th = document.createElement("th"); const th = document.createElement("th");
th.textContent = columnHeaders[i]; th.textContent = columnHeaders[i];
@@ -73,7 +72,7 @@ export class CostUI {
document.head.appendChild(style); document.head.appendChild(style);
} }
static createContextMenu(callbacks) { static createContextMenu(callbacks) {
const contextMenu = document.createElement("div"); const contextMenu = document.createElement("div");
contextMenu.id = "context-menu"; contextMenu.id = "context-menu";
contextMenu.classList.add("context-menu"); contextMenu.classList.add("context-menu");
@@ -187,43 +186,55 @@ static createContextMenu(callbacks) {
function getColumnNames(tableId) { function getColumnNames(tableId) {
const table = document.getElementById(tableId); const table = document.getElementById(tableId);
const headerRow = table.querySelector("thead tr"); const headerRow = table.querySelector("thead tr");
return Array.from(headerRow.children).map(headerCell => headerCell.textContent.trim()); return Array.from(headerRow.children).map((headerCell) =>
headerCell.textContent.trim()
);
} }
// Add double-click event listener // Add double-click event listener
document.getElementById("cost-items").addEventListener("dblclick", function (event) { document
const targetRow = event.target.closest("tr"); .getElementById("cost-items")
const targetCell = event.target.closest("td"); .addEventListener("dblclick", function (event) {
if (targetRow && targetCell) { const targetRow = event.target.closest("tr");
const columnIndex = Array.from(targetRow.children).indexOf(targetCell); const targetCell = event.target.closest("td");
const costItemId = parseInt(targetRow.getAttribute("id")); if (targetRow && targetCell) {
const cellContent = targetCell.textContent; const columnIndex = Array.from(targetRow.children).indexOf(
targetCell
);
const costItemId = parseInt(targetRow.getAttribute("id"));
const cellContent = targetCell.textContent;
// Get column names from the table header // Get column names from the table header
const columnNames = getColumnNames("cost-items"); const columnNames = getColumnNames("cost-items");
const cellName = columnNames[columnIndex]; const cellName = columnNames[columnIndex];
console.log("Column Name: ", cellName); console.log("Column Name: ", cellName);
console.log("Content: ", cellContent); console.log("Content: ", cellContent);
// Implement different behaviors based on the column index // Implement different behaviors based on the column index
switch (columnIndex) { switch (columnIndex) {
case 0: case 0:
// Behavior for the first column // Behavior for the first column
callbacks.firstColumnDoubleClick ? callbacks.firstColumnDoubleClick(costItemId) : null; callbacks.firstColumnDoubleClick
break; ? callbacks.firstColumnDoubleClick(costItemId)
case 1: : null;
// Behavior for the second column break;
callbacks.secondColumnDoubleClick ? callbacks.secondColumnDoubleClick(costItemId) : null; case 1:
break; // Behavior for the second column
// Add more cases as needed for other columns callbacks.secondColumnDoubleClick
default: ? callbacks.secondColumnDoubleClick(costItemId)
// Default behavior : null;
callbacks.defaultDoubleClick ? callbacks.defaultDoubleClick(costItemId) : null; break;
break; // Add more cases as needed for other columns
default:
// Default behavior
callbacks.defaultDoubleClick
? callbacks.defaultDoubleClick(costItemId)
: null;
break;
}
} }
} });
});
} }
static deleteCostItemRow(targetRow, expandedState) { static deleteCostItemRow(targetRow, expandedState) {
@@ -719,7 +730,11 @@ static createContextMenu(callbacks) {
const cardBody = document.createElement("div"); const cardBody = document.createElement("div");
cardBody.classList.add("card-body"); cardBody.classList.add("card-body");
const cardTitle = CostUI.Text(title, "fa-solid fa-money-bill-wave", "large"); const cardTitle = CostUI.Text(
title,
"fa-solid fa-money-bill-wave",
"large"
);
cardTitle.classList.add("card-title"); cardTitle.classList.add("card-title");
const cardButton = document.createElement("button"); const cardButton = document.createElement("button");
@@ -805,12 +820,15 @@ static createContextMenu(callbacks) {
div.classList.add("table-container"); div.classList.add("table-container");
const table = document.createElement("table"); const table = document.createElement("table");
div.appendChild(table); div.appendChild(table);
table.classList.add(className); if (className !== "") {
table.classList.add(className);
}
table.id = id; table.id = id;
const headerRow = document.createElement("tr"); const headerRow = document.createElement("tr");
headers.forEach((headerText) => { headers.forEach((headerText) => {
const th = document.createElement("th"); const th = document.createElement("th");
th.style.position = "relative";
th.textContent = headerText; th.textContent = headerText;
headerRow.appendChild(th); headerRow.appendChild(th);
}); });
@@ -1212,7 +1230,7 @@ static createContextMenu(callbacks) {
{ textContent: "", style: { border: "none" } }, { textContent: "", style: { border: "none" } },
{ textContent: "", style: { border: "none" } }, { textContent: "", style: { border: "none" } },
{ textContent: "", style: { border: "none" } }, { textContent: "", style: { border: "none" } },
{ textContent: "Subtotal", colSpan: 4, style: { border: "none" } }, { textContent: "Subtotal", colSpan: 1, style: { border: "none" } },
{ textContent: quantitySums.count }, { textContent: quantitySums.count },
]; ];
@@ -1250,23 +1268,19 @@ static createContextMenu(callbacks) {
}) { }) {
if (products.length === 0) { if (products.length === 0) {
const noProductsMessage = document.createElement("p"); const noProductsMessage = document.createElement("p");
noProductsMessage.textContent = "Your Blender Selection is empty! Select objects first."; noProductsMessage.textContent =
"Your Blender Selection is empty! Select objects first.";
form.appendChild(noProductsMessage); form.appendChild(noProductsMessage);
return; return;
} }
const { tableContainer, table } = CostUI.addTable({ const { tableContainer, table } = CostUI.addTable({
headers: ["Step Id", "Class", "Name", "Type", "Count"], headers: ["Step Id", "Class", "Name", "Type", "Count"],
className: "product-table", className: "",
id: "cost-values-table-" + costItemId, id: "cost-values-table-" + costItemId,
}); });
form.appendChild(tableContainer); form.appendChild(tableContainer);
const scrollableBody = document.createElement("div");
scrollableBody.classList.add("table-scrollable-body");
const tbody = document.createElement("tbody"); const tbody = document.createElement("tbody");
scrollableBody.appendChild(tbody); table.appendChild(tbody);
table.appendChild(scrollableBody);
const quantityAssigned = CostUI.getAssinedQuantity(products, costItemId); const quantityAssigned = CostUI.getAssinedQuantity(products, costItemId);
const areProductsSameClass = products.every( const areProductsSameClass = products.every(
@@ -1395,16 +1409,13 @@ static createContextMenu(callbacks) {
}) { }) {
const { tableContainer, table } = CostUI.addTable({ const { tableContainer, table } = CostUI.addTable({
headers: ["Step Id", "Class", "Name", "Type", "Count"], headers: ["Step Id", "Class", "Name", "Type", "Count"],
className: "product-table", className: "",
id: "cost-values-table-" + costItemId, id: "cost-values-table-" + costItemId,
}); });
form.appendChild(tableContainer); form.appendChild(tableContainer);
const scrollableBody = document.createElement("div");
scrollableBody.classList.add("table-scrollable-body");
const tbody = document.createElement("tbody"); const tbody = document.createElement("tbody");
scrollableBody.appendChild(tbody); table.appendChild(tbody);
table.appendChild(scrollableBody);
let quantityAssigned = CostUI.getAssinedQuantity(products, costItemId); let quantityAssigned = CostUI.getAssinedQuantity(products, costItemId);
const shouldAddQto = quantityAssigned ? true : false; const shouldAddQto = quantityAssigned ? true : false;
@@ -1548,7 +1559,7 @@ static createContextMenu(callbacks) {
} }
static applyFontSizeToAllTables(fontSize) { static applyFontSizeToAllTables(fontSize) {
document.documentElement.style.setProperty('--fontSize', fontSize); document.documentElement.style.setProperty("--fontSize", fontSize);
} }
static applyColorToAllTables(color) { static applyColorToAllTables(color) {