Skip to content

Commit 376285e

Browse files
authored
Merge pull request #1263 from itflow-org/develop
Develop to Master for 26.02 Release Take 2
2 parents 163aa30 + d1eeba6 commit 376285e

File tree

435 files changed

+12120
-8577
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

435 files changed

+12120
-8577
lines changed

.gitignore

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,6 @@ plugins/htmlpurifier/standalone/HTMLPurifier/DefinitionCache/Serializer/URI/*
3232
plugins/htmlpurifier/standalone/HTMLPurifier/DefinitionCache/Serializer/CSS/*
3333
!plugins/htmlpurifier/standalone/HTMLPurifier/DefinitionCache/Serializer/CSS/.gitkeep
3434
.vscode/settings.json
35-
xcustom/*
36-
!xcustom/readme.php
37-
post/xcustom
38-
!post/xcustom/readme.php
3935
admin/custom/*
4036
!admin/custom/readme.php
4137
agent/custom/*
@@ -53,5 +49,3 @@ setup/custom/*
5349
api/v1/custom/*
5450
!api/v1/custom/readme.php
5551
.zed
56-
57-

CHANGELOG.md

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,55 @@
22

33
This file documents all notable changes made to ITFlow.
44

5+
## [26.02] Stable Release
6+
### Bug Fixes
7+
- Mail Parser - Do not automatically send new ticket notifications to noreply/donotreply addresses.
8+
- Ticket: removed newline \n on Parsed emails.
9+
- Show Trips for everyone if accounting module is enabled.
10+
- Fix Invoice Exporting.
11+
- Fix Billable Column not sorting correctly in tickets.
12+
- Fix Login flow where user agent and client user exists and agent has MFA but will not let them continue.
13+
- Fix passing missing user_id var in client portal.
14+
- Fix Ticket Templates not auto filling when selected.
15+
- Fix Invoices not being sent to all billings contacts when manaully sent.
16+
- Fix Documents and Files not able to be bulk deleted.
17+
- Fix Role Archiving, can be archived as long as no users are assigned to the role.
18+
- Fix showing Powered By ITFlow visibility on the login screen when Whitelabel is enabled.
19+
- Missing username in audit log on successful login due to missing passed user_id to logging.
20+
- API: Fix updating all documents instead of the intended document.
21+
- Documents: Fix Document created at not showing the correct creation date of the master document.
22+
- Ticket: Fixed Using edit ticket modal agent was not able to be set.
23+
- Always check if a user is archived and or disabled instead of just during login.
24+
- Report: Fix Collected tax report not totalling all tax categories.
25+
26+
### New Features & Updates
27+
- Task Approval System for ticket tasks: Once an approval is requested, the task cannot be marked as complete until approved. Internal Approvals Any other technician, or Specific technician, Client Approvals Anyone (usually the requestor) Tech contacts Billing contacts.
28+
- Printable Invoice Packing Slips now available.
29+
- Drastic Performance Bump: Up to 50% faster queries accross the board and reduced server memory usage by 40% by switching Database Query method from mysqli_fetch_array to mysqli_fetch_assoc.
30+
- Added Connect to Microsoft 365 Button to mail settings.
31+
- OAUTH2 support for Microsoft 365 and Google Workspaces is now considered stable and working.
32+
- Favorites: Assets and Credentials now can be favorited singly or by Bulk action. Favorited items appear in the client overview now.
33+
- Files/Documents: Collapsable folders feature, collapsed by default with a button to expand all.
34+
- URL Keys and such are now set to a more manageable 32 Characters by default.
35+
- Various UI/UX Updates throughout the app, with focus oin ticket details, contact details modal etc.
36+
- Added Show Archived files and documents to the files section.
37+
- Added Bulk Archive and restore options to files and documents.
38+
- Rewrite of the Kanban Ticket view to match our procedural style of coding.
39+
- All options are available in TinyMCE now in Mobile mode.
40+
- Agent names appear now in Invoice History section.
41+
- Mail Parser: Support flowed text.
42+
- Assets: Keep Purchase reference when copying.
43+
- Assets: Add basic tracking history: Archiving, restoring, name changes, transferimg to new clients.
44+
- Mail Parser: NDR Parsing.
45+
- Allow SVG files in mail attachments.
46+
- Tickets: Use a more friendly time worked instead of 02:41:00 translates to 2h 41m.
47+
- Update wording on ticket to invoice item details.
48+
- Merge Tickets: Now wth a ticket merge dropdown list of tickets instead of a text field.
49+
- Role Permissions can now be set during role creation, update Permission UI to use radio buttons instead of select boxes.
50+
- Bump TinyMCE 8.2.2 to 8.3.2.
51+
- Bump PHPMailer from 7.0.1 to 7.0.2.
52+
- Bump Datatables from 2.3.4 to 2.3.7.
53+
554
## [25.12.1] Maint Release
655

756
### Major Changes

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
<br />
1717
<a href="https://demo.itflow.org"><strong>View demo</strong></a>
1818
<br />
19-
Username: <b>demo@demo</b> | Password: <b>demo</b>
19+
Username: <b>demo@demo.com</b> | Password: <b>demo</b>
2020
<br />
2121
<br />
2222
<a href="https://itflow.org/#about">About</a>
@@ -93,6 +93,7 @@ If you want to improve ITFlow, feel free to fork the repo and create a pull requ
9393
We’re incredibly grateful to the organizations and individuals who support the project - a big thank you to:
9494
- CompuMatter
9595
- F1 for HELP
96+
- digiBandit
9697
- JetBrains (PhpStorm)
9798

9899
## License

admin/ai_model.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@
5858
<tbody>
5959
<?php
6060

61-
while ($row = mysqli_fetch_array($sql)) {
61+
while ($row = mysqli_fetch_assoc($sql)) {
6262
$provider_id = intval($row['ai_provider_id']);
6363
$provider_name = nullable_htmlentities($row['ai_provider_name']);
6464
$model_id = intval($row['ai_model_id']);

admin/ai_provider.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@
4848
<tbody>
4949
<?php
5050

51-
while ($row = mysqli_fetch_array($sql)) {
51+
while ($row = mysqli_fetch_assoc($sql)) {
5252
$provider_id = intval($row['ai_provider_id']);
5353
$provider_name = nullable_htmlentities($row['ai_provider_name']);
5454
$url = nullable_htmlentities($row['ai_provider_api_url']);

admin/api_keys.php

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949
<div class="dropdown-menu">
5050
<button class="dropdown-item text-danger text-bold"
5151
type="submit" form="bulkActions" name="bulk_delete_api_keys">
52-
<i class="fas fa-fw fa-trash mr-2"></i>Revoke
52+
<i class="fas fa-fw fa-trash mr-2"></i>Delete
5353
</button>
5454
</div>
5555
</div>
@@ -105,7 +105,7 @@
105105
<tbody>
106106
<?php
107107

108-
while ($row = mysqli_fetch_array($sql)) {
108+
while ($row = mysqli_fetch_assoc($sql)) {
109109
$api_key_id = intval($row['api_key_id']);
110110
$api_key_name = nullable_htmlentities($row['api_key_name']);
111111
$api_key_secret = nullable_htmlentities("************" . substr($row['api_key_secret'], -4));
@@ -139,9 +139,16 @@
139139
<i class="fas fa-ellipsis-h"></i>
140140
</button>
141141
<div class="dropdown-menu">
142-
<a class="dropdown-item text-danger text-bold confirm-link" href="post.php?delete_api_key=<?php echo $api_key_id; ?>&csrf_token=<?php echo $_SESSION['csrf_token'] ?>">
143-
<i class="fas fa-fw fa-times mr-2"></i>Revoke
144-
</a>
142+
<?php if ($api_key_expire > date("Y-m-d H:i:s")) { ?>
143+
<a class="dropdown-item text-danger text-bold confirm-link" href="post.php?revoke_api_key=<?php echo $api_key_id; ?>&csrf_token=<?php echo $_SESSION['csrf_token'] ?>">
144+
<i class="fas fa-fw fa-times mr-2"></i>Revoke
145+
</a>
146+
<?php } ?>
147+
<?php if ($api_key_expire < date("Y-m-d H:i:s")) { ?>
148+
<a class="dropdown-item text-danger text-bold confirm-link" href="post.php?delete_api_key=<?php echo $api_key_id; ?>&csrf_token=<?php echo $_SESSION['csrf_token'] ?>">
149+
<i class="fas fa-fw fa-times mr-2"></i>Delete
150+
</a>
151+
<?php } ?>
145152
</div>
146153
</div>
147154
</td>
@@ -164,4 +171,3 @@
164171

165172
<?php
166173
require_once "../includes/footer.php";
167-

admin/app_log.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@
6666

6767
<?php
6868
$sql_types_filter = mysqli_query($mysqli, "SELECT DISTINCT app_log_type FROM app_logs ORDER BY app_log_type ASC");
69-
while ($row = mysqli_fetch_array($sql_types_filter)) {
69+
while ($row = mysqli_fetch_assoc($sql_types_filter)) {
7070
$log_type = nullable_htmlentities($row['app_log_type']);
7171
?>
7272
<option <?php if ($type_filter == $log_type) { echo "selected"; } ?>><?php echo $log_type; ?></option>
@@ -85,7 +85,7 @@
8585

8686
<?php
8787
$sql_categories_filter = mysqli_query($mysqli, "SELECT DISTINCT app_log_category FROM app_logs ORDER BY app_log_category ASC");
88-
while ($row = mysqli_fetch_array($sql_categories_filter)) {
88+
while ($row = mysqli_fetch_assoc($sql_categories_filter)) {
8989
$log_category = nullable_htmlentities($row['app_log_category']);
9090
?>
9191
<option <?php if ($category_filter == $log_category) { echo "selected"; } ?>><?php echo $log_category; ?></option>
@@ -141,7 +141,7 @@
141141
<tbody>
142142
<?php
143143

144-
while ($row = mysqli_fetch_array($sql)) {
144+
while ($row = mysqli_fetch_assoc($sql)) {
145145
$log_id = intval($row['app_log_id']);
146146
$log_type = nullable_htmlentities($row['app_log_type']);
147147
$log_category = nullable_htmlentities($row['app_log_category']);

admin/audit_log.php

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -80,15 +80,15 @@
8080
</div>
8181
</div>
8282
</div>
83-
83+
8484
<div class="col-sm-2">
8585
<div class="input-group mb-3 mb-md-0">
8686
<select class="form-control select2" name="client" onchange="this.form.submit()">
8787
<option value="">- All Clients -</option>
8888

8989
<?php
9090
$sql_clients_filter = mysqli_query($mysqli, "SELECT * FROM clients ORDER BY client_name ASC");
91-
while ($row = mysqli_fetch_array($sql_clients_filter)) {
91+
while ($row = mysqli_fetch_assoc($sql_clients_filter)) {
9292
$client_id = intval($row['client_id']);
9393
$client_name = nullable_htmlentities($row['client_name']);
9494
?>
@@ -108,7 +108,7 @@
108108

109109
<?php
110110
$sql_users_filter = mysqli_query($mysqli, "SELECT * FROM users ORDER BY user_name ASC");
111-
while ($row = mysqli_fetch_array($sql_users_filter)) {
111+
while ($row = mysqli_fetch_assoc($sql_users_filter)) {
112112
$user_id = intval($row['user_id']);
113113
$user_name = nullable_htmlentities($row['user_name']);
114114
?>
@@ -128,7 +128,7 @@
128128

129129
<?php
130130
$sql_types_filter = mysqli_query($mysqli, "SELECT DISTINCT log_type FROM logs ORDER BY log_type ASC");
131-
while ($row = mysqli_fetch_array($sql_types_filter)) {
131+
while ($row = mysqli_fetch_assoc($sql_types_filter)) {
132132
$log_type = nullable_htmlentities($row['log_type']);
133133
?>
134134
<option <?php if ($type_filter == $log_type) { echo "selected"; } ?>><?php echo $log_type; ?></option>
@@ -147,7 +147,7 @@
147147

148148
<?php
149149
$sql_actions_filter = mysqli_query($mysqli, "SELECT DISTINCT log_action FROM logs ORDER BY log_action ASC");
150-
while ($row = mysqli_fetch_array($sql_actions_filter)) {
150+
while ($row = mysqli_fetch_assoc($sql_actions_filter)) {
151151
$log_action = nullable_htmlentities($row['log_action']);
152152
?>
153153
<option <?php if ($action_filter == $log_action) { echo "selected"; } ?>><?php echo $log_action; ?></option>
@@ -225,7 +225,7 @@
225225
<tbody>
226226
<?php
227227

228-
while ($row = mysqli_fetch_array($sql)) {
228+
while ($row = mysqli_fetch_assoc($sql)) {
229229
$log_id = intval($row['log_id']);
230230
$log_type = nullable_htmlentities($row['log_type']);
231231
$log_action = nullable_htmlentities($row['log_action']);
@@ -280,4 +280,3 @@
280280

281281
<?php
282282
require_once "../includes/footer.php";
283-

admin/category.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ class="fas fa-fw fa-archive mr-2"></i>Archived</a>
111111
<tbody>
112112
<?php
113113

114-
while ($row = mysqli_fetch_array($sql)) {
114+
while ($row = mysqli_fetch_assoc($sql)) {
115115
$category_id = intval($row['category_id']);
116116
$category_name = nullable_htmlentities($row['category_name']);
117117
$category_color = nullable_htmlentities($row['category_color']);

admin/contract_template.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@
5959
</thead>
6060
<tbody>
6161
<?php
62-
while ($row = mysqli_fetch_array($sql)) {
62+
while ($row = mysqli_fetch_assoc($sql)) {
6363
$id = intval($row['contract_template_id']);
6464
$name = nullable_htmlentities($row['contract_template_name']);
6565
$type = nullable_htmlentities($row['contract_template_type']);

0 commit comments

Comments
 (0)