diff --git a/.gitignore b/.gitignore index c70c3cf8..1dc7ee4b 100644 --- a/.gitignore +++ b/.gitignore @@ -26,3 +26,4 @@ xcustom/* !xcustom/readme.php post/xcustom !post/xcustom/readme.php +.zed diff --git a/CHANGELOG.md b/CHANGELOG.md index 385e5534..c723cb0e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,30 @@ This file documents all notable changes made to ITFlow. +## [25.02.1] +### Fixed +- Resolved broken links in the client overview, project and client listings, and rack details. +- Corrected asset transfer functionality to clients. +- Fixed the ticket scheduling redirect. +- Corrected the ticket link in the Scheduled Ticket Agent Notification email. +- Addressed issues with credentials and ticket actions in the Contact Detail Modal. +- Fixed text wrapping in notifications. +- Adjusted notifications so that they are sorted with the newest first. +- Fixed drag-and-drop functionality for tickets in the Kanban view on mobile devices. +- Resolved a weird issue with TinyMCE that prevented using links referencing your ITFlow instance url. +- Corrected image orientation issues during upload and the preview optimization process. + +### Added / Changed +- Introduced entity link indicator icons and counts in the contacts and credentials section. +- Implemented a fade animation for the new AJAX modal. +- Removed the Client Overview Expire Day Select and replaced it with simplified 1, 7, or 45-day options. +- Added the ability to link and unlink entities within asset details. +- Introduced quick tag/category creation across the app. +- Added a Vendor Quick Details Modal. +- Enabled vendor linking and added a License Purchase Reference in the Software Licenses section. +- Added download original, optimized and thumbnail option for images. +- Added Paid status to the top corner of Invoice PDFs + ## [25.02] ### Fixed - Migrated several reports to the new permissions/roles system diff --git a/admin_settings_notification.php b/admin_settings_notification.php index 1abc0982..05f326f8 100644 --- a/admin_settings_notification.php +++ b/admin_settings_notification.php @@ -37,7 +37,7 @@ require_once "includes/inc_all_admin.php";
Domain Expiration Notice
- (This setting triggers a notification when a domain is approaching its expiration date, specifically at 1, 7, 14, 30 and 90 days prior to expiry.) + (This setting triggers a notification when a domain is approaching its expiration date, specifically at 1, 7 and 45 days prior to expiry.) @@ -54,7 +54,7 @@ require_once "includes/inc_all_admin.php";
Certificate Expiration Notice
- (This setting triggers a notification when a certificate is approaching its expiration date, specifically at 1, 7, 14, 30 and 90 days prior to expiry.) + (This setting triggers a notification when a certificate is approaching its expiration date, specifically at 1, 7 and 45 days prior to expiry.) @@ -67,7 +67,7 @@ require_once "includes/inc_all_admin.php";
Asset Warranty Expiration Notice
- (This setting triggers a notification when an asset is approaching its expiration date, specifically at 1, 7, 14, 30 and 90 days prior to expiry.) + (This setting triggers a notification when an asset is approaching its expiration date, specifically at 1, 7 and 45 days prior to expiry.) diff --git a/ajax/ajax_asset_details.php b/ajax/ajax_asset_details.php index 20ef5c29..21ff47a2 100644 --- a/ajax/ajax_asset_details.php +++ b/ajax/ajax_asset_details.php @@ -121,9 +121,7 @@ $sql_related_credentials = mysqli_query($mysqli, " logins.login_note, logins.login_important, logins.login_contact_id, - logins.login_vendor_id, - logins.login_asset_id, - logins.login_software_id + logins.login_asset_id FROM logins LEFT JOIN login_tags ON login_tags.login_id = logins.login_id LEFT JOIN tags ON tags.tag_id = login_tags.tag_id @@ -474,9 +472,7 @@ ob_start(); $login_note = nullable_htmlentities($row['login_note']); $login_important = intval($row['login_important']); $login_contact_id = intval($row['login_contact_id']); - $login_vendor_id = intval($row['login_vendor_id']); $login_asset_id = intval($row['login_asset_id']); - $login_software_id = intval($row['login_software_id']); // Tags $login_tag_name_display_array = array(); @@ -852,7 +848,11 @@ ob_start(); diff --git a/ajax/ajax_category_add.php b/ajax/ajax_category_add.php new file mode 100644 index 00000000..a5b7481d --- /dev/null +++ b/ajax/ajax_category_add.php @@ -0,0 +1,43 @@ + + + +
+ + + + +
+ + +
+ +
@@ -157,6 +165,15 @@ ob_start(); +
+ +
diff --git a/ajax/ajax_contact_details.php b/ajax/ajax_contact_details.php index e081abb3..67cdeac1 100644 --- a/ajax/ajax_contact_details.php +++ b/ajax/ajax_contact_details.php @@ -402,7 +402,7 @@ ob_start(); -
+
@@ -446,9 +446,7 @@ ob_start(); $login_note = nullable_htmlentities($row['login_note']); $login_important = intval($row['login_important']); $login_contact_id = intval($row['login_contact_id']); - $login_vendor_id = intval($row['login_vendor_id']); $login_asset_id = intval($row['login_asset_id']); - $login_software_id = intval($row['login_software_id']); // Tags $login_tag_name_display_array = array(); @@ -499,7 +497,7 @@ ob_start(); -
+
@@ -848,7 +846,13 @@ ob_start(); diff --git a/ajax/ajax_contact_edit.php b/ajax/ajax_contact_edit.php index 99ea1823..768a6081 100644 --- a/ajax/ajax_contact_edit.php +++ b/ajax/ajax_contact_edit.php @@ -311,6 +311,15 @@ ob_start(); +
+ +
diff --git a/ajax/ajax_credential_edit.php b/ajax/ajax_credential_edit.php index 1bbd9b29..c6b50da8 100644 --- a/ajax/ajax_credential_edit.php +++ b/ajax/ajax_credential_edit.php @@ -21,9 +21,7 @@ $login_created_at = nullable_htmlentities($row['login_created_at']); $login_archived_at = nullable_htmlentities($row['login_archived_at']); $login_important = intval($row['login_important']); $login_contact_id = intval($row['login_contact_id']); -$login_vendor_id = intval($row['login_vendor_id']); $login_asset_id = intval($row['login_asset_id']); -$login_software_id = intval($row['login_software_id']); // Tags $login_tag_id_array = array(); @@ -189,28 +187,6 @@ ob_start(); -
- -
-
- -
- -
-
-
@@ -240,28 +216,6 @@ ob_start();
-
- -
-
- -
- -
-
-
@@ -288,6 +242,15 @@ ob_start(); +
+ +
diff --git a/ajax/ajax_credential_view.php b/ajax/ajax_credential_view.php new file mode 100644 index 00000000..96dfd392 --- /dev/null +++ b/ajax/ajax_credential_view.php @@ -0,0 +1,94 @@ +Hover.."; +} +$login_note = nullable_htmlentities($row['login_note']); +$login_created_at = nullable_htmlentities($row['login_created_at']); + +// Generate the HTML form content using output buffering. +ob_start(); +?> + + + + + + + +
- +
@@ -176,7 +181,12 @@ ob_start(); ?>
- +
diff --git a/ajax/ajax_invoice_edit.php b/ajax/ajax_invoice_edit.php index 87530848..d6a804f3 100644 --- a/ajax/ajax_invoice_edit.php +++ b/ajax/ajax_invoice_edit.php @@ -77,7 +77,12 @@ ob_start(); ?>
- +
diff --git a/ajax/ajax_location_edit.php b/ajax/ajax_location_edit.php index da39bb38..e97ba887 100644 --- a/ajax/ajax_location_edit.php +++ b/ajax/ajax_location_edit.php @@ -254,6 +254,15 @@ ob_start(); +
+ +
diff --git a/ajax/ajax_notifications.php b/ajax/ajax_notifications.php index 1dd53356..02ebac3b 100644 --- a/ajax/ajax_notifications.php +++ b/ajax/ajax_notifications.php @@ -1,11 +1,13 @@ - + $notification_id = intval($row["notification_id"]); + $notification_type = nullable_htmlentities($row["notification_type"]); + $notification_details = nullable_htmlentities($row["notification"]); + $notification_action = nullable_htmlentities( + $row["notification_action"] + ); + $notification_timestamp_formated = date( + "M d g:ia", + strtotime($row["notification_timestamp"]) + ); + $notification_client_id = intval($row["notification_client_id"]); + if (empty($notification_action)) { + $notification_action = "#"; + } + ?> -
@@ -46,14 +53,11 @@ ob_start();
- +
- +

No Notifications

@@ -62,7 +66,9 @@ ob_start();
-
- +
diff --git a/ajax/ajax_quote_edit.php b/ajax/ajax_quote_edit.php index a94f392f..51c7c8bd 100644 --- a/ajax/ajax_quote_edit.php +++ b/ajax/ajax_quote_edit.php @@ -73,7 +73,12 @@ ob_start();
- +
diff --git a/ajax/ajax_recurring_expense_edit.php b/ajax/ajax_recurring_expense_edit.php index 7d461ce6..3b857d01 100644 --- a/ajax/ajax_recurring_expense_edit.php +++ b/ajax/ajax_recurring_expense_edit.php @@ -214,7 +214,12 @@ ob_start(); ?>
- +
diff --git a/ajax/ajax_recurring_invoice_edit.php b/ajax/ajax_recurring_invoice_edit.php index 7d454b20..e0ab9d56 100644 --- a/ajax/ajax_recurring_invoice_edit.php +++ b/ajax/ajax_recurring_invoice_edit.php @@ -88,7 +88,12 @@ ob_start(); ?>
- +
diff --git a/ajax/ajax_revenue_edit.php b/ajax/ajax_revenue_edit.php index 11998bdd..593bb6ff 100644 --- a/ajax/ajax_revenue_edit.php +++ b/ajax/ajax_revenue_edit.php @@ -125,7 +125,12 @@ ob_start(); ?>
- +
diff --git a/ajax/ajax_service_details.php b/ajax/ajax_service_details.php index 46bf9f1a..22c9f011 100644 --- a/ajax/ajax_service_details.php +++ b/ajax/ajax_service_details.php @@ -275,7 +275,16 @@ ob_start(); @@ -379,7 +388,15 @@ ob_start(); mysqli_data_seek($sql_docs, 0); while ($row = mysqli_fetch_array($sql_docs)) { - echo "
  • $row[document_name]
  • "; + $document_id = intval($row['document_id']); + $document_name = nullable_htmlentities($row['document_name']); + echo "
  • + $document_name + +
  • "; } ?> diff --git a/ajax/ajax_software_edit.php b/ajax/ajax_software_edit.php index d9a06b1d..7aa7d523 100644 --- a/ajax/ajax_software_edit.php +++ b/ajax/ajax_software_edit.php @@ -14,10 +14,12 @@ $software_type = nullable_htmlentities($row['software_type']); $software_license_type = nullable_htmlentities($row['software_license_type']); $software_key = nullable_htmlentities($row['software_key']); $software_seats = nullable_htmlentities($row['software_seats']); +$software_purchase_reference = nullable_htmlentities($row['software_purchase_reference']); $software_purchase = nullable_htmlentities($row['software_purchase']); $software_expire = nullable_htmlentities($row['software_expire']); $software_notes = nullable_htmlentities($row['software_notes']); $software_created_at = nullable_htmlentities($row['software_created_at']); +$software_vendor_id = intval($row['software_vendor_id']); $client_id = intval($row['software_client_id']); $seat_count = 0; @@ -107,6 +109,28 @@ ob_start(); +
    + +
    +
    + +
    + +
    +
    +
    @@ -160,6 +184,16 @@ ob_start();
    +
    + +
    +
    + +
    + +
    +
    +
    diff --git a/ajax/ajax_tag_add.php b/ajax/ajax_tag_add.php new file mode 100644 index 00000000..05ef73fa --- /dev/null +++ b/ajax/ajax_tag_add.php @@ -0,0 +1,49 @@ + + + + + + + + +
    + + + + + + +
    + +
    diff --git a/ajax/ajax_vendor_details.php b/ajax/ajax_vendor_details.php new file mode 100644 index 00000000..eac971fe --- /dev/null +++ b/ajax/ajax_vendor_details.php @@ -0,0 +1,89 @@ + + + + + + + + @@ -701,6 +709,8 @@ if (isset($_GET['asset_id'])) { } $contact_licenses = implode(',', $contact_licenses_array); + $linked_software[] = $software_id; + ?> + - + @@ -861,10 +874,16 @@ if (isset($_GET['asset_id'])) { $file_icon = "file"; } $file_created_at = nullable_htmlentities($row['file_created_at']); + + $linked_files[] = $file_id; + ?> + +
    "> +
    +

    Linked Services

    +
    + +
    +
    +
    +
    +
    Type License Type SeatsAction
    @@ -715,6 +725,9 @@ if (isset($_GET['asset_id'])) { + +
    Name UploadedAction
    " target="_blank" >$file_description"; ?> + +
    + + + + + + + + + + + + + + + + + + + + + +
    ServiceCategoryImportanceAction
    +
    +
    +
    + +
    +
    +
    +
    + @@ -1101,4 +1178,11 @@ require_once "modals/asset_interface_import_modal.php"; require_once "modals/asset_interface_export_modal.php"; require_once "modals/ticket_add_modal.php"; require_once "modals/recurring_ticket_add_modal.php"; + +require_once "modals/asset_link_software_modal.php"; +require_once "modals/asset_link_credential_modal.php"; +require_once "modals/asset_link_service_modal.php"; +require_once "modals/asset_link_document_modal.php"; +require_once "modals/asset_link_file_modal.php"; + require_once "includes/footer.php"; diff --git a/client_document_details.php b/client_document_details.php index ce3d29ba..6a534232 100644 --- a/client_document_details.php +++ b/client_document_details.php @@ -340,7 +340,12 @@ $page_title = $row['document_name']; ?>
    - + + + diff --git a/client_files.php b/client_files.php index 3898c829..549f7bcf 100644 --- a/client_files.php +++ b/client_files.php @@ -345,7 +345,7 @@ while ($folder_id > 0) {
    - " alt=""> + " alt="">
    @@ -356,8 +356,18 @@ while ($folder_id > 0) {