Move Attachments to Assignment in new ticket get rid of help texts in reply for attachments and update changelog

This commit is contained in:
johnnyq
2026-07-29 18:39:43 -04:00
parent 2395a3ee16
commit 729d22d19b
4 changed files with 37 additions and 16 deletions

View File

@@ -33,6 +33,12 @@ This file documents all notable changes made to ITFlow.
> Run `--update_db` after **every** ITFlow update from now on, not just this one — any release may
> contain database changes.
>
> On an install with a lot of ticket history the database update can take **a minute or more** —
> one step generates a guest URL key for every ticket that is missing one, row by row. Let it run
> to completion. If it is interrupted it resumes cleanly on the next run, but this is another
> reason not to attempt the update through the web interface, which is bound by PHP's execution
> time limit.
>
> **Back up your database before upgrading.**
- **A new cron job is required if you intend to use ticket SLAs.** `cron/ticket_sla.php` moves
@@ -79,6 +85,17 @@ This file documents all notable changes made to ITFlow.
onto every ticket the schedule raises - from the nightly cron run and from a forced run alike.
Clearing the template leaves the recurring ticket's own subject and details untouched. The
recurring ticket list shows which schedules carry a template and how many tasks it adds.
- **Recurring tickets now own their task list.** A linked ticket template fills the list in when
it is picked, but the list can then be edited per schedule, and it is those edits the run reads.
Existing schedules are backfilled from their template by the database update, so every recurring
ticket keeps raising exactly the tasks it raises today.
- **Agents can attach files to tickets from within the app**, both when raising a ticket and on a
reply. Attachments are emailed to the contact through the mail queue. A 10 MB ceiling applies to
each message as a whole; anything that does not fit stays on the ticket for the recipient to
download instead.
- Tasks can now be added and edited inline in the add-ticket and add-recurring-ticket modals.
- The older add-ticket modal has been retired — there is now a single add-ticket modal.
- Watchers have moved into the assignment section of the add-ticket modal.
- Added **ticket reply API endpoints** for creating and reading replies.
- Payments and Revenues have been combined into a single **Income** page, keeping all income in
one place, with CSV export. Revenue not tied to an invoice can still be added there; payments
@@ -164,6 +181,10 @@ This file documents all notable changes made to ITFlow.
and the confirmation message, reading an unrelated record's id in place of the name.
- Bulk-creating tickets from a template against multiple assets only added the template's tasks to
the first ticket, and dropped each task's completion estimate.
- Deleting a ticket template now unlinks it from any recurring ticket that referenced it, instead
of leaving the schedule pointing at a template that no longer exists.
- Fixed the asset section in the recurring ticket modal when opened outside a client, and project
selection when raising a ticket.
- Tickets raised by the nightly recurring schedule were created without a guest URL key, so the
"View ticket" link in reply and task-approval emails for those tickets could not be opened.
Cron now generates a key like every other path that raises a ticket, and existing tickets

View File

@@ -203,11 +203,6 @@ ob_start();
</div>
<?php } ?>
<div class="form-group">
<label><i class="fa fa-fw fa-paperclip mr-1"></i>Attachments</label>
<input type="file" class="form-control-file" name="attachments[]" multiple accept=".jpg, .jpeg, .gif, .png, .webp, .pdf, .txt, .md, .doc, .docx, .odt, .csv, .xls, .xlsx, .ods, .pptx, .odp, .zip, .tar, .gz, .xml, .msg, .json, .wav, .mp3, .ogg, .mov, .mp4, .av1, .ovpn">
</div>
</div>
<div class="tab-pane fade" id="pills-add-tasks">
@@ -302,6 +297,11 @@ ob_start();
</div>
</div>
<div class="form-group">
<label><i class="fa fa-fw fa-paperclip mr-1"></i>Attachments</label>
<input type="file" class="form-control-file" name="attachments[]" multiple accept=".jpg, .jpeg, .gif, .png, .webp, .pdf, .txt, .md, .doc, .docx, .odt, .csv, .xls, .xlsx, .ods, .pptx, .odp, .zip, .tar, .gz, .xml, .msg, .json, .wav, .mp3, .ogg, .mov, .mp4, .av1, .ovpn">
</div>
</div>
</div>

View File

@@ -315,12 +315,14 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
data-modal-url="modals/recurring_ticket/recurring_ticket_edit.php?id=<?= $recurring_ticket_id ?>">
<?= $recurring_ticket_subject ?>
</a>
<?php if ($recurring_ticket_template_name) { ?>
<span title="Template: <?= $recurring_ticket_template_name ?>"
<i class='fas fa-puzzle-piece text-secondary ml-1'></i>
</span>
<?php } ?>
<?php if ($recurring_ticket_task_count) { ?>
<span class="badge badge-secondary"
data-toggle="tooltip"
data-placement="top"
title="Adds <?= $recurring_ticket_task_count ?> task<?php if ($recurring_ticket_task_count != 1) { echo "s"; } ?> to each ticket raised<?php if ($recurring_ticket_template_name) { ?>, from template: <?= $recurring_ticket_template_name ?><?php } ?>">
<i class="fa fa-fw fa-tasks"></i><?= $recurring_ticket_task_count ?>
<span title="Adds <?= $recurring_ticket_task_count ?> Tasks">
<i class="fas fa-fw fa-tasks mr-1"></i><?= $recurring_ticket_task_count ?>
</span>
<?php } ?>
</td>

View File

@@ -599,8 +599,8 @@ if (isset($_GET['ticket_id'])) {
<a target='_blank' class='mr-1 ml-1' href='ticket_attachment.php?attachment_id=<?= $ticket_attachment_id; ?>&action=view'>[View]</a><a href='ticket_attachment.php?attachment_id=<?= $ticket_attachment_id; ?>'>[Download]</a><?php if (lookupUserPermission("module_support") >= 3) { ?><a class='confirm-link ml-1 text-danger' href='post.php?delete_ticket_attachment=<?= $ticket_attachment_id ?>&csrf_token=<?= $_SESSION['csrf_token'] ?>'>[Delete]</a><?php } ?>
</td>
</tr>
<?php
<?php
}
?>
</table>
@@ -643,9 +643,7 @@ if (isset($_GET['ticket_id'])) {
</div>
<div class="form-group">
<label class="text-muted small mb-1"><i class="fa fa-fw fa-paperclip mr-1"></i>Attachments</label>
<input type="file" class="form-control-file" name="attachments[]" multiple accept=".jpg, .jpeg, .gif, .png, .webp, .pdf, .txt, .md, .doc, .docx, .odt, .csv, .xls, .xlsx, .ods, .pptx, .odp, .zip, .tar, .gz, .xml, .msg, .json, .wav, .mp3, .ogg, .mov, .mp4, .av1, .ovpn">
<small class="form-text text-muted">Stored against this reply, or against the ticket itself if you submit without any text. A Public + Email reply sends them to the contact and any watchers.</small>
</div>
<div class="form-row">
@@ -839,8 +837,8 @@ if (isset($_GET['ticket_id'])) {
<a target='_blank' class='mr-1 ml-1' href='ticket_attachment.php?attachment_id=<?= $ticket_attachment_id; ?>&action=view'>[View]</a><a href='ticket_attachment.php?attachment_id=<?= $ticket_attachment_id; ?>'>[Download]</a><?php if (lookupUserPermission("module_support") >= 3) { ?><a class='confirm-link ml-1 text-danger' href='post.php?delete_ticket_attachment=<?= $ticket_attachment_id ?>&csrf_token=<?= $_SESSION['csrf_token'] ?>'>[Delete]</a><?php } ?>
</td>
</tr>
<?php
<?php
}
?>
</table>