From 49a395c9e2a195db2ea7000974f70da7131741ee Mon Sep 17 00:00:00 2001
From: Alexandre <146840804+alex001x@users.noreply.github.com>
Date: Thu, 30 Oct 2025 18:22:36 +0100
Subject: [PATCH 1/3] feature/Add_Project_to_Devices.php
---
classes/ProjectMembership.class.php | 11 ++++++++
devices.php | 39 +++++++++++++++++++++++++++++
2 files changed, 50 insertions(+)
diff --git a/classes/ProjectMembership.class.php b/classes/ProjectMembership.class.php
index c9e3e878a..1a877be40 100644
--- a/classes/ProjectMembership.class.php
+++ b/classes/ProjectMembership.class.php
@@ -219,5 +219,16 @@ public static function RedactUser( $UserID ) {
return;
}
+
+ /**
+ * Remove all direct project associations for a specific Device
+ * Used before assigning a new project to the device.
+ */
+ public static function RemoveDeviceMemberships( $DeviceID ) {
+ global $dbh;
+
+ $st = $dbh->prepare("DELETE FROM fac_ProjectMembership WHERE MemberType='Device' AND MemberID=:id");
+ $st->execute(array(":id"=>$DeviceID));
+ }
}
?>
diff --git a/devices.php b/devices.php
index 26d2e822d..8867745db 100644
--- a/devices.php
+++ b/devices.php
@@ -682,6 +682,9 @@ function updatedevice($devid){
// Put the device rights back just in case we had someone try to inject them
$dev->Rights=$devrights;
+
+ // Capture selected project from POST (if any)
+ $selectedProjectID=(isset($_POST['ProjectID']))?intval($_POST['ProjectID']):0;
// Stupid Cabinet vs CabinetID
$dev->Cabinet=$_POST['CabinetID'];
// Checkboxes don't work quite like normal inputs
@@ -722,6 +725,11 @@ function updatedevice($devid){
}else{
$dev->UpdateDevice();
}
+ // Update Project association (remove existing, then add if selected)
+ ProjectMembership::RemoveDeviceMemberships($dev->DeviceID);
+ if($selectedProjectID>0){
+ ProjectMembership::addMember($selectedProjectID,$dev->DeviceID,'Device');
+ }
break;
case 'Delete':
$dev->DeleteDevice();
@@ -775,6 +783,15 @@ function updatedevice($devid){
$dev->CreateDevice();
$dev->SetTags($tagarray);
+ // Update Project association (remove existing, then add if selected)
+ ProjectMembership::RemoveDeviceMemberships($dev->DeviceID);
+ if(isset($_POST['ProjectID'])){
+ $selectedProjectID=intval($_POST['ProjectID']);
+ if($selectedProjectID>0){
+ ProjectMembership::addMember($selectedProjectID,$dev->DeviceID,'Device');
+ }
+ }
+
// We've, hopefully, successfully created a new device. Force them to the new device page.
header('Location: '.redirect("devices.php?DeviceID=$dev->DeviceID"));
exit;
@@ -811,6 +828,24 @@ function updatedevice($devid){
$taginsert="\t\ttags: {items: ".json_encode($tags)."},\n";
}
+ // Get existing project association for this device (direct membership only)
+ $CurrentProjectID = 0;
+ if ( $dev->DeviceID > 0 ) {
+ $st = $dbh->prepare("SELECT ProjectID FROM fac_ProjectMembership WHERE MemberType='Device' AND MemberID=:id ORDER BY ProjectID ASC");
+ $st->execute(array(":id"=>$dev->DeviceID));
+ if($row = $st->fetch(PDO::FETCH_NUM)){
+ $CurrentProjectID = intval($row[0]);
+ }
+ }
+
+ // Build project options for the Project select
+ $projectOptions = '';
+ $projList = Projects::getProjectList();
+ foreach($projList as $proj){
+ $selected = ($proj->ProjectID == $CurrentProjectID) ? ' selected' : '';
+ $projectOptions .= "\t\t\t\t\n";
+ }
+
// Since a device exists we're gonna need some additional info, but only if it's not a copy
if(!$copy){
// clearing errors for now
@@ -1836,6 +1871,10 @@ function setPreferredLayout() {
+
+
+
+
From 1f8ef1cf2ce5b2b25cff8055b189404b4bf3121e Mon Sep 17 00:00:00 2001
From: Alexandre <146840804+alex001x@users.noreply.github.com>
Date: Thu, 30 Oct 2025 18:56:59 +0100
Subject: [PATCH 2/3] feature/Add_Project_to_Devices.php
---
devices.php | 37 ++++++++++++++++++++-----------------
1 file changed, 20 insertions(+), 17 deletions(-)
diff --git a/devices.php b/devices.php
index 8867745db..6986c2b42 100644
--- a/devices.php
+++ b/devices.php
@@ -593,7 +593,8 @@ function updatedevice($devid){
$pwrCords=null;
$chassis="";
$copy = false;
- $copyerr=__("This device is a copy of an existing device. Remember to set the new location before saving.");
+$copyerr=__("This device is a copy of an existing device. Remember to set the new location before saving.");
+$CurrentProjectID = 0; // Default: no project selected for new devices
$childList=array();
// This page was called from somewhere so let's do stuff.
@@ -838,13 +839,7 @@ function updatedevice($devid){
}
}
- // Build project options for the Project select
- $projectOptions = '';
- $projList = Projects::getProjectList();
- foreach($projList as $proj){
- $selected = ($proj->ProjectID == $CurrentProjectID) ? ' selected' : '';
- $projectOptions .= "\t\t\t\t\n";
- }
+ // Build project options is now handled after this block to also fill on new devices
// Since a device exists we're gonna need some additional info, but only if it's not a copy
if(!$copy){
@@ -894,15 +889,23 @@ function updatedevice($devid){
}
$cab->CabinetID=$dev->Cabinet;
$cab->GetCabinet();
- }else{
- /*
- * Everything below here will get processed when no DeviceID is present
- * aka adding a new device
- */
-
- // sets install date to today when a new device is being created
- $dev->InstallDate=date("Y-m-d");
- }
+ }else{
+ /*
+ * Everything below here will get processed when no DeviceID is present
+ * aka adding a new device
+ */
+
+ // sets install date to today when a new device is being created
+ $dev->InstallDate=date("Y-m-d");
+ }
+
+ // Build project options for the Project select (always available)
+ $projectOptions = '';
+ $projList = Projects::getProjectList();
+ foreach($projList as $proj){
+ $selected = ($proj->ProjectID == $CurrentProjectID) ? ' selected' : '';
+ $projectOptions .= "\t\t\t\t\n";
+ }
// We don't want someone accidentally adding a chassis device inside of a chassis slot.
if($dev->ParentDevice>0){
From f2158771c77189af1b77a4aced4375173cc54f10 Mon Sep 17 00:00:00 2001
From: Alexandre <146840804+alex001x@users.noreply.github.com>
Date: Thu, 30 Oct 2025 19:04:04 +0100
Subject: [PATCH 3/3] feature/Add_Project_to_Devices.php
---
devices.php | 21 +++++++++++----------
1 file changed, 11 insertions(+), 10 deletions(-)
diff --git a/devices.php b/devices.php
index 6986c2b42..7892c30f7 100644
--- a/devices.php
+++ b/devices.php
@@ -2841,16 +2841,17 @@ function linkifyolog(){
});
});
- // Make the cabinet and template selections smart comboboxes if user can write
-
- $('#CabinetID').combobox();
- $('#TemplateID').combobox();
- $('select[name=ParentDevice]').combobox();
-
+ // Make the cabinet and template selections smart comboboxes if user can write
+
+ $('#projectid').combobox();
+ $('#CabinetID').combobox();
+ $('#TemplateID').combobox();
+ $('select[name=ParentDevice]').combobox();
+
// Hide this for now
$('#devicetype-limiter').parent('div').hide();