From 4a229ea01af47f3e839238b313c45753a3f650d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9o=20David?= Date: Tue, 24 Dec 2024 15:20:29 +0100 Subject: [PATCH 1/3] #37 [KanbanCard] add: ticket kanban card --- class/kanban.class.php | 26 ++++++++++++++++++-------- css/digikanban.min.css | 2 +- css/scss/modules/_kanban.scss | 13 +++++++++++-- 3 files changed, 30 insertions(+), 11 deletions(-) diff --git a/class/kanban.class.php b/class/kanban.class.php index 1d89964..5726f4c 100644 --- a/class/kanban.class.php +++ b/class/kanban.class.php @@ -181,10 +181,13 @@ public function setCategories($categories) public function getObjectKanbanView($object, $objectMetadata) { global $langs; + $userAffected = new User($this->db); + $objectTitle = method_exists($object, 'getNomUrl') ? $object->getNomUrl(1) : $object->ref; $objectSubtitle = htmlspecialchars($object->label ?? ''); - $objectPicto = $object->picto; - $moreData = ''; + $moreFooterData = ''; + $moreBodyData = ''; + $moreHeaderData = ''; if ($object->element == 'project') { $object->getLinesArray($user); @@ -195,10 +198,16 @@ public function getObjectKanbanView($object, $objectMetadata) { } } $projectDate = dol_print_date($object->date ?? time(), 'day'); - $moreData = ' ' . $tasksCounter . ' '; + $moreFooterData = ' ' . $tasksCounter . ' '; $timeSpentInHoursAndMinutes = gmdate('H:i', $timeSpent); - $moreData .= ' ' . htmlspecialchars($timeSpentInHoursAndMinutes) . ' '; - $moreData .= ' ' . $projectDate . ''; + $moreFooterData .= ' ' . htmlspecialchars($timeSpentInHoursAndMinutes) . ' '; + $moreFooterData .= ' ' . $projectDate . ''; + } else if ($object->element == 'ticket') { + $moreHeaderData = $object->getLibStatut(1); + $moreFooterData = ' ' . dol_print_date($object->date_creation, 'day') . ''; + $userAffected->fetch($object->fk_user_assign); + $moreFooterData .= ' ' . $userAffected->getNomUrl(1) . ''; + $moreBodyData = '
' . $object->type_label . ''; } $nameField = $objectMetadata['name_field']; @@ -224,20 +233,21 @@ public function getObjectKanbanView($object, $objectMetadata) { '; - $return = '
'; $return .= '
'; if ($selected >= 0) { $return .= ''; } $return .= '
'; - $return .= '' . $objectTitle . ' ' . $actionsButton .''; + $return .= '' . $objectTitle . ' ' . $moreHeaderData . ''; + $return .= '' . $actionsButton .''; $return .= '
'; $return .= '
'; $return .= '' . $objectSubtitle . ''; + $return .= '' . $moreBodyData . ''; $return .= '
'; $return .= ''; $return .= '
'; $return .= '
'; diff --git a/css/digikanban.min.css b/css/digikanban.min.css index 2924a2e..4caeac8 100644 --- a/css/digikanban.min.css +++ b/css/digikanban.min.css @@ -1 +1 @@ -body{background-image:url("background.jpg");background-size:cover;background-position:center;background-attachment:fixed;font-family:Arial,sans-serif}.kanban-board{display:flex;justify-content:flex-start;margin-top:20px;gap:15px;padding:20px;height:80vh;width:80vw;overflow-x:auto}.kanban-column{background-color:#f4f4f4;border-radius:8px;padding:10px;width:30%;min-height:500px;max-height:600px;min-width:300px;overflow-y:auto;box-shadow:0 4px 8px rgba(0,0,0,.1)}.kanban-column-header{display:flex;align-items:center;justify-content:space-between;font-size:1.2em;font-weight:bold;padding:10px 15px;border-radius:8px;position:relative}.column-left{display:flex;align-items:center;gap:4px}.column-name{font-size:1em;font-weight:bold}.column-counter{background-color:rgba(0,0,0,.33);color:#d3d3d3;font-size:.9em;font-weight:bold;padding:2px 6px;border-radius:4px;line-height:1;margin-left:0}.actions-icon:hover{color:#ffdd57}.edit-icon{margin-left:10px;cursor:pointer;transition:color .3s}.column-name{display:inline-block;transition:color .3s}.kanban-column-body{margin-top:10px;padding:10px;border-radius:5px;min-height:400px;display:flex;flex-direction:column;gap:10px}.add-item{text-align:center;margin-top:10px;margin-bottom:0;height:50px}.add-item button{width:30px;height:30px;border:none;cursor:not-allowed}.add-item button i{margin:auto}.kanban-board{display:flex;justify-content:flex-start;margin-top:20px;gap:15px;padding:20px;height:80vh;width:80vw;overflow-x:auto;overflow-y:hidden}.kanban-board::-webkit-scrollbar{height:8px}.kanban-board::-webkit-scrollbar-thumb{background-color:#ccc;border-radius:4px}.kanban-board::-webkit-scrollbar-thumb:hover{background-color:#aaa}.kanban-add-column{flex-shrink:0;background-color:#f4f4f4;border-radius:8px;width:80px;height:80px;display:flex;justify-content:center;align-items:center;box-shadow:0 2px 4px rgba(0,0,0,.1);cursor:pointer;transition:background-color .3s,transform .2s}.kanban-add-column:hover{background-color:#e0e0e0;transform:scale(1.05)}.kanban-add-column .fas{font-size:24px;color:#999;transition:color .3s ease}.kanban-add-column:hover .fas{color:#666}.kanban-card{background-color:#fff;border-radius:8px;box-shadow:0 2px 6px rgba(0,0,0,.1);padding:10px 15px;cursor:grab;margin-bottom:10px;max-width:270px;justify-content:center;display:flex;flex-direction:column;font-family:Arial,sans-serif}.kanban-card-header{font-weight:bold;font-size:14px;color:#007bff;margin-bottom:5px}.kanban-card-header .kanban-card-ref{display:flex;align-items:center}.kanban-card-body{font-size:13px;color:#333;margin-bottom:10px}.kanban-card-subtitle{font-size:14px;font-weight:bold;color:#333}.kanban-card-footer{display:flex;justify-content:space-between;font-size:12px;color:#666;border-top:1px solid #eee;padding-top:5px}.kanban-card-footer .kanban-data{display:flex;align-items:center;gap:5px}.kanban-card-footer .kanban-data i{color:#666}.validate-button{margin-left:10px;padding:5px 10px;border:none;border-radius:5px;cursor:pointer;transition:background-color .3s ease}#fullscreen-toggle{top:10px;right:10px;width:100px;background-color:#333;color:#fff;padding:8px 12px;border-radius:5px;cursor:pointer;font-size:1em;z-index:1000}#kanban-board:fullscreen{display:flex;flex-wrap:nowrap;overflow-x:auto;width:100vw;height:100vh;padding:10px}#kanban-board:fullscreen .kanban-column-body{min-height:70vh}#kanban-board:fullscreen .kanban-column{min-width:280px;width:300px;max-height:90vh;overflow-y:auto;flex:0 0 auto}#kanban-board:fullscreen .kanban-card{max-width:100%;padding:15px;font-size:1em}#fullscreen-toggle:fullscreen{top:15px;right:15px}.dragging{cursor:grabbing !important}.actions-icon{color:#999;font-size:1.2em;cursor:pointer}.actions-icon:hover{color:#666}.column-menu{position:absolute;top:100%;right:0;background-color:#fff;box-shadow:0 2px 6px rgba(0,0,0,.15);border-radius:6px;padding:5px 0;z-index:1000;display:flex;flex-direction:column;min-width:150px}.column-menu.hidden{display:none}.card-menu{position:absolute;right:0;background-color:#fff;box-shadow:0 2px 6px rgba(0,0,0,.15);border-radius:6px;padding:5px 0;z-index:1000;display:flex;flex-direction:column;min-width:150px;transform:translateY(-8px)}.card-menu.hidden{display:none}.menu-item{padding:8px 12px;font-size:.9em;color:#333;cursor:pointer;display:flex;align-items:center;gap:8px}.menu-item:hover{background-color:#f9f9f9}.menu-item.delete{color:#e74c3c}.menu-item.delete:hover{background-color:#ffecec}.preview-photo{z-index:2100 !important}.dropdown-toggle::after{display:none}.favorite-photo{border:5px solid #0d8aff} \ No newline at end of file +body{background-image:url("background.jpg");background-size:cover;background-position:center;background-attachment:fixed;font-family:Arial,sans-serif}.kanban-board{display:flex;justify-content:flex-start;margin-top:20px;gap:15px;padding:20px;height:80vh;width:80vw;overflow-x:auto}.kanban-column{background-color:#f4f4f4;border-radius:8px;padding:10px;width:30%;min-height:500px;max-height:600px;min-width:300px;overflow-y:auto;box-shadow:0 4px 8px rgba(0,0,0,.1)}.kanban-column-header{display:flex;align-items:center;justify-content:space-between;font-size:1.2em;font-weight:bold;padding:10px 15px;border-radius:8px;position:relative}.column-left{display:flex;align-items:center;gap:4px}.column-name{font-size:1em;font-weight:bold}.column-counter{background-color:rgba(0,0,0,.33);color:#d3d3d3;font-size:.9em;font-weight:bold;padding:2px 6px;border-radius:4px;line-height:1;margin-left:0}.actions-icon:hover{color:#ffdd57}.edit-icon{margin-left:10px;cursor:pointer;transition:color .3s}.column-name{display:inline-block;transition:color .3s}.kanban-column-body{margin-top:10px;padding:10px;border-radius:5px;min-height:400px;display:flex;flex-direction:column;gap:10px}.add-item{text-align:center;margin-top:10px;margin-bottom:0;height:50px}.add-item button{width:30px;height:30px;border:none;cursor:not-allowed}.add-item button i{margin:auto}.kanban-board{display:flex;justify-content:flex-start;margin-top:20px;gap:15px;padding:20px;height:80vh;width:80vw;overflow-x:auto;overflow-y:hidden}.kanban-board::-webkit-scrollbar{height:8px}.kanban-board::-webkit-scrollbar-thumb{background-color:#ccc;border-radius:4px}.kanban-board::-webkit-scrollbar-thumb:hover{background-color:#aaa}.kanban-add-column{flex-shrink:0;background-color:#f4f4f4;border-radius:8px;width:80px;height:80px;display:flex;justify-content:center;align-items:center;box-shadow:0 2px 4px rgba(0,0,0,.1);cursor:pointer;transition:background-color .3s,transform .2s}.kanban-add-column:hover{background-color:#e0e0e0;transform:scale(1.05)}.kanban-add-column .fas{font-size:24px;color:#999;transition:color .3s ease}.kanban-add-column:hover .fas{color:#666}.kanban-card{background-color:#fff;border-radius:8px;box-shadow:0 2px 6px rgba(0,0,0,.1);padding:10px 15px;cursor:grab;margin-bottom:10px;max-width:270px;justify-content:center;display:flex;flex-direction:column;font-family:Arial,sans-serif}.kanban-card-header{font-weight:bold;font-size:14px;color:#007bff;margin-bottom:5px;display:flex;justify-content:space-between;align-items:center}.kanban-card-header .kanban-card-ref{display:inline-block;flex-grow:1}.kanban-card-header .kanban-card-action{display:inline-flex;justify-content:flex-end;margin-left:auto}.kanban-card-body{font-size:13px;color:#333;margin-bottom:10px}.kanban-card-subtitle{font-size:14px;font-weight:bold;color:#333}.kanban-card-footer{display:flex;justify-content:space-between;font-size:12px;color:#666;border-top:1px solid #eee;padding-top:5px}.kanban-card-footer .kanban-data{display:flex;align-items:center;gap:5px}.kanban-card-footer .kanban-data i{color:#666}.validate-button{margin-left:10px;padding:5px 10px;border:none;border-radius:5px;cursor:pointer;transition:background-color .3s ease}#fullscreen-toggle{top:10px;right:10px;width:100px;background-color:#333;color:#fff;padding:8px 12px;border-radius:5px;cursor:pointer;font-size:1em;z-index:1000}#kanban-board:fullscreen{display:flex;flex-wrap:nowrap;overflow-x:auto;width:100vw;height:100vh;padding:10px}#kanban-board:fullscreen .kanban-column-body{min-height:70vh}#kanban-board:fullscreen .kanban-column{min-width:280px;width:300px;max-height:90vh;overflow-y:auto;flex:0 0 auto}#kanban-board:fullscreen .kanban-card{max-width:100%;padding:15px;font-size:1em}#fullscreen-toggle:fullscreen{top:15px;right:15px}.dragging{cursor:grabbing !important}.actions-icon{color:#999;font-size:1.2em;cursor:pointer}.actions-icon:hover{color:#666}.column-menu{position:absolute;top:100%;right:0;background-color:#fff;box-shadow:0 2px 6px rgba(0,0,0,.15);border-radius:6px;padding:5px 0;z-index:1000;display:flex;flex-direction:column;min-width:150px}.column-menu.hidden{display:none}.card-menu{position:absolute;right:0;background-color:#fff;box-shadow:0 2px 6px rgba(0,0,0,.15);border-radius:6px;padding:5px 0;z-index:1000;display:flex;flex-direction:column;min-width:150px;transform:translateY(-8px)}.card-menu.hidden{display:none}.menu-item{padding:8px 12px;font-size:.9em;color:#333;cursor:pointer;display:flex;align-items:center;gap:8px}.menu-item:hover{background-color:#f9f9f9}.menu-item.delete{color:#e74c3c}.menu-item.delete:hover{background-color:#ffecec}.preview-photo{z-index:2100 !important}.dropdown-toggle::after{display:none}.favorite-photo{border:5px solid #0d8aff} \ No newline at end of file diff --git a/css/scss/modules/_kanban.scss b/css/scss/modules/_kanban.scss index 979e2f8..52d28b3 100644 --- a/css/scss/modules/_kanban.scss +++ b/css/scss/modules/_kanban.scss @@ -178,11 +178,20 @@ body { font-size: 14px; color: #007bff; margin-bottom: 5px; + display: flex; + justify-content: space-between; + align-items: center; } .kanban-card-header .kanban-card-ref { - display: flex; - align-items: center; + display: inline-block; + flex-grow: 1; +} + +.kanban-card-header .kanban-card-action { + display: inline-flex; + justify-content: flex-end; + margin-left: auto; } .kanban-card-body { From 0a8dc88c0660255b05f05780a223e2b2878a9d7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9o=20David?= Date: Tue, 24 Dec 2024 15:26:01 +0100 Subject: [PATCH 2/3] #37 [KanbanCard] add: propale kanban card --- class/kanban.class.php | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/class/kanban.class.php b/class/kanban.class.php index 5726f4c..0985d57 100644 --- a/class/kanban.class.php +++ b/class/kanban.class.php @@ -182,6 +182,7 @@ public function getObjectKanbanView($object, $objectMetadata) { global $langs; $userAffected = new User($this->db); + $projectAffected = new Project($this->db); $objectTitle = method_exists($object, 'getNomUrl') ? $object->getNomUrl(1) : $object->ref; $objectSubtitle = htmlspecialchars($object->label ?? ''); @@ -189,6 +190,20 @@ public function getObjectKanbanView($object, $objectMetadata) { $moreBodyData = ''; $moreHeaderData = ''; + $nameField = $objectMetadata['name_field']; + if (strstr($nameField, ',')) { + $nameFields = explode(', ', $nameField); + if (is_array($nameFields) && !empty($nameFields)) { + foreach ($nameFields as $subnameField) { + if ($subnameField != 'ref') { + $objectSubtitle .= $object->$subnameField . ' '; + } + } + } + } else { + $objectSubtitle = $object->$nameField; + } + if ($object->element == 'project') { $object->getLinesArray($user); $tasksCounter = is_array($object->lines) ? count($object->lines) : 0; @@ -208,21 +223,14 @@ public function getObjectKanbanView($object, $objectMetadata) { $userAffected->fetch($object->fk_user_assign); $moreFooterData .= ' ' . $userAffected->getNomUrl(1) . ''; $moreBodyData = '
' . $object->type_label . ''; + } else if ($object->element == 'propal') { + $moreHeaderData .= ' ' . $object->getLibStatut(2) . ''; + $projectAffected->fetch($object->fk_project); + $moreBodyData = '
' . $projectAffected->getNomUrl(1) . ''; + $moreFooterData = ' ' . dol_print_date($object->date_creation, 'day') . ''; + $moreFooterData .= ' ' . price($object->total_ht) . ''; } - $nameField = $objectMetadata['name_field']; - if (strstr($nameField, ',')) { - $nameFields = explode(', ', $nameField); - if (is_array($nameFields) && !empty($nameFields)) { - foreach ($nameFields as $subnameField) { - if ($subnameField != 'ref') { - $objectSubtitle .= $object->$subnameField . ' '; - } - } - } - } else { - $objectSubtitle = $object->$nameField; - } $selected = (empty($arraydata['selected']) ? 0 : $arraydata['selected']); $actionsButton = ' From 75203bd57e67cc4b3f92f898b0568c5a89d30a84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9o=20David?= Date: Tue, 24 Dec 2024 15:45:12 +0100 Subject: [PATCH 3/3] #37 [KanbanCard] add: thirdparty kanban card --- class/kanban.class.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/class/kanban.class.php b/class/kanban.class.php index 0985d57..4bc3382 100644 --- a/class/kanban.class.php +++ b/class/kanban.class.php @@ -213,12 +213,13 @@ public function getObjectKanbanView($object, $objectMetadata) { } } $projectDate = dol_print_date($object->date ?? time(), 'day'); + $moreHeaderData = $object->getLibStatut(2); $moreFooterData = ' ' . $tasksCounter . ' '; $timeSpentInHoursAndMinutes = gmdate('H:i', $timeSpent); $moreFooterData .= ' ' . htmlspecialchars($timeSpentInHoursAndMinutes) . ' '; $moreFooterData .= ' ' . $projectDate . ''; } else if ($object->element == 'ticket') { - $moreHeaderData = $object->getLibStatut(1); + $moreHeaderData = $object->getLibStatut(2); $moreFooterData = ' ' . dol_print_date($object->date_creation, 'day') . ''; $userAffected->fetch($object->fk_user_assign); $moreFooterData .= ' ' . $userAffected->getNomUrl(1) . ''; @@ -229,6 +230,10 @@ public function getObjectKanbanView($object, $objectMetadata) { $moreBodyData = '
' . $projectAffected->getNomUrl(1) . ''; $moreFooterData = ' ' . dol_print_date($object->date_creation, 'day') . ''; $moreFooterData .= ' ' . price($object->total_ht) . ''; + } else if ($object->element == 'societe') { + $moreHeaderData = $object->getLibStatut(2); + $moreFooterData .= ' ' . $object->email . ''; + $moreFooterData .= '
' . $object->phone . ''; }