script-development/kendo-report-tool
Laravel package for creating Kendo UI reports from Eloquent queries. Define reusable report schemas, apply filters, and output JSON or Blade views for Kendo Report Viewer. Streamlines data preparation and printable report generation.
KendoReports::submit($title, $description, $authorName, $files) — to push a report plus screenshots into a single central triage destination. That is the enabling primitive for a consistent "Report a problem" surface rather than each team inventing its own mailto/Slack/form path.201, done. There is no read/list/status/triage API, no attachments beyond images, no tagging or categorization field. So roadmap should treat "capture" as shippable now and "close the loop" (status back to reporter, dedupe, routing rules) as explicitly not-yet-supported — a decision point, not an assumption.swallow flag (REPORT_TOOL_SWALLOW=true) is a product lever, not just a config knob: false (default) means a failed report submission breaks the user-visible action and surfaces the error; true means the user never sees a failure and it's only written to the PHP error_log. Someone has to own choosing this per surface — a "Send feedback" button should almost certainly swallow-and-log; a report that is the actual point of the workflow should not.submit() is a synchronous multipart POST with configurable connect_timeout/timeout. That call sits inside a user request. This directly informs UX design (async job + "we'll send it" acknowledgement, or a spinner with a hard timeout) and the size/quantity limits you impose on files[].Adopt when all of the following hold:
{kendo_url}/api/projects/{project}/reports with a Bearer report:create token. It is not a general-purpose HTTP client.Http::withToken()->post() is arguably enough.files[] takes UploadedFile instances or local file paths, sent as multipart parts. No PDFs? (Actually, extension-based restrictions are not documented — assume images-by-convention, not enforced.)Look elsewhere or defer when:
submit() signature and config keys as likely to move.Also flag for engineering review before rollout: files[] accepting local file paths means the argument must never be built from unvalidated user input; and swallow=true routes failures to error_log, which is typically not a monitored channel — silent loss is the default outcome unless you add alerting.
To executives: We now have a small, standard piece of plumbing that lets any of our Laravel apps send a problem report — title, description, optional reporter name, screenshots — into one central triage tool. It removes the "every team wires up feedback differently" problem and keeps that data inside our own systems rather than a third-party vendor. It's deliberately minimal: submission only, roughly one function call, cheap to adopt. It is a v0.1.0 building block, not a finished feedback product — no delivery guarantees, no triage/status loop back to the reporter, and no automated redaction of sensitive content, so we should scope it to low-risk feedback surfaces first and budget follow-on work for reliability (retries/queueing) and data handling before we point it at anything regulated.
To engineering: Auto-discovered service provider, published config/report-tool.php, env-driven (REPORT_TOOL_URL, _PROJECT, _TOKEN, _CONNECT_TIMEOUT, _TIMEOUT, _SWALLOW). One public method: KendoReports::submit(string $title, string $description, ?string $authorName = null, array $files = []): ?array — synchronous multipart POST, Bearer report:create, returns the decoded 201 body. Non-201 or transport failure throws ReportSubmissionException with the status (0 for transport) unless swallow is on, in which case it logs to error_log and returns null. Timeouts floor to a sane default so a hung host can't block the caller indefinitely — but the call is still inline, so put it behind a job if it's on a hot path. Code quality signals are strong (PHPStan level max, Pint, Pest/Testbench, audit→format→phpstan→test CI, tag-push release), so the review surface is small and trustworthy — the work is in our call sites: validate anything feeding files[], never log the token, decide swallow per surface, and add alerting if we rely on swallow mode.
How can I help you explore Laravel packages today?