Full Code of devaslanphp/help-desk for AI

master 120a8c8340d0 cached
340 files
2.6 MB
703.5k tokens
1091 symbols
1 requests
Download .txt
Showing preview only (2,813K chars total). Download the full file or copy to clipboard to get everything.
Repository: devaslanphp/help-desk
Branch: master
Commit: 120a8c8340d0
Files: 340
Total size: 2.6 MB

Directory structure:
gitextract_82am4k6c/

├── .editorconfig
├── .gitattributes
├── .github/
│   ├── FUNDING.yml
│   └── ISSUE_TEMPLATE/
│       ├── bug_report.md
│       └── feature_request.md
├── .gitignore
├── CODE_OF_CONDUCT.md
├── LICENSE.md
├── Procfile
├── README.md
├── SECURITY.md
├── app/
│   ├── Console/
│   │   └── Kernel.php
│   ├── Core/
│   │   ├── CrudDialogHelper.php
│   │   ├── HasLogsActivity.php
│   │   └── LogsActivity.php
│   ├── Exceptions/
│   │   └── Handler.php
│   ├── Http/
│   │   ├── Controllers/
│   │   │   ├── Auth/
│   │   │   │   └── LogoutController.php
│   │   │   ├── Controller.php
│   │   │   └── TicketNumberController.php
│   │   ├── Kernel.php
│   │   ├── Livewire/
│   │   │   ├── Administration/
│   │   │   │   ├── ActivityLogs.php
│   │   │   │   ├── Companies.php
│   │   │   │   ├── CompaniesDialog.php
│   │   │   │   ├── Roles.php
│   │   │   │   ├── RolesDialog.php
│   │   │   │   ├── TicketPriorities.php
│   │   │   │   ├── TicketPrioritiesDialog.php
│   │   │   │   ├── TicketStatuses.php
│   │   │   │   ├── TicketStatusesDialog.php
│   │   │   │   ├── TicketTypes.php
│   │   │   │   ├── TicketTypesDialog.php
│   │   │   │   ├── Users.php
│   │   │   │   └── UsersDialog.php
│   │   │   ├── Analytics.php
│   │   │   ├── Auth/
│   │   │   │   ├── ActivateAccount.php
│   │   │   │   ├── ForgotPassword.php
│   │   │   │   ├── Login.php
│   │   │   │   └── RecoverPassword.php
│   │   │   ├── Chat.php
│   │   │   ├── Kanban.php
│   │   │   ├── MyNotifications.php
│   │   │   ├── MyProfile.php
│   │   │   ├── Projects.php
│   │   │   ├── ProjectsDialog.php
│   │   │   ├── TicketDetails/
│   │   │   │   ├── Content.php
│   │   │   │   ├── Priority.php
│   │   │   │   ├── Responsible.php
│   │   │   │   ├── Status.php
│   │   │   │   ├── Title.php
│   │   │   │   └── Type.php
│   │   │   ├── TicketDetails.php
│   │   │   ├── TicketDetailsComments.php
│   │   │   ├── TicketDetailsCommentsContent.php
│   │   │   ├── Tickets.php
│   │   │   └── TicketsDialog.php
│   │   └── Middleware/
│   │       ├── Authenticate.php
│   │       ├── CanAccessTicket.php
│   │       ├── EncryptCookies.php
│   │       ├── LocaleMiddleware.php
│   │       ├── PreventRequestsDuringMaintenance.php
│   │       ├── RedirectIfAuthenticated.php
│   │       ├── TrimStrings.php
│   │       ├── TrustHosts.php
│   │       ├── TrustProxies.php
│   │       ├── ValidateSignature.php
│   │       └── VerifyCsrfToken.php
│   ├── Jobs/
│   │   ├── CommentCreatedJob.php
│   │   ├── TicketCreatedJob.php
│   │   └── TicketUpdatedJob.php
│   ├── Models/
│   │   ├── Chat.php
│   │   ├── Comment.php
│   │   ├── Company.php
│   │   ├── CompanyUser.php
│   │   ├── FavoriteProject.php
│   │   ├── Icon.php
│   │   ├── Project.php
│   │   ├── Ticket.php
│   │   ├── TicketPriority.php
│   │   ├── TicketStatus.php
│   │   ├── TicketType.php
│   │   └── User.php
│   ├── Notifications/
│   │   ├── CommentCreateNotification.php
│   │   ├── TicketCreatedNotification.php
│   │   ├── TicketUpdatedNotification.php
│   │   ├── UserActivatedNotification.php
│   │   └── UserCreatedNotification.php
│   ├── Providers/
│   │   ├── AppServiceProvider.php
│   │   ├── AuthServiceProvider.php
│   │   ├── BroadcastServiceProvider.php
│   │   ├── EventServiceProvider.php
│   │   └── RouteServiceProvider.php
│   ├── Tables/
│   │   └── Columns/
│   │       └── UserColumn.php
│   ├── View/
│   │   └── Components/
│   │       ├── BaseLayout.php
│   │       ├── GuestLayout.php
│   │       ├── Layout.php
│   │       ├── MainMenu.php
│   │       ├── NotificationType.php
│   │       ├── PrioritySpan.php
│   │       ├── RoleSpan.php
│   │       ├── StatusSpan.php
│   │       ├── TypeSpan.php
│   │       └── UserAvatar.php
│   └── helpers.php
├── artisan
├── bootstrap/
│   ├── app.php
│   └── cache/
│       └── .gitignore
├── composer.json
├── config/
│   ├── activitylog.php
│   ├── app.php
│   ├── auth.php
│   ├── broadcasting.php
│   ├── cache.php
│   ├── cors.php
│   ├── database.php
│   ├── filament-avatar.php
│   ├── filament-kanban-board.php
│   ├── filament.php
│   ├── filesystems.php
│   ├── hashing.php
│   ├── larabug.php
│   ├── laravel-translatable-string-exporter.php
│   ├── logging.php
│   ├── mail.php
│   ├── permission.php
│   ├── queue.php
│   ├── sanctum.php
│   ├── services.php
│   ├── session.php
│   ├── system.php
│   ├── tables.php
│   └── view.php
├── database/
│   ├── .gitignore
│   ├── factories/
│   │   └── UserFactory.php
│   ├── help_desk.pgsql.sql
│   ├── help_desk.sql
│   ├── migrations/
│   │   ├── 2014_10_12_000000_create_users_table.php
│   │   ├── 2014_10_12_100000_create_password_resets_table.php
│   │   ├── 2019_08_19_000000_create_failed_jobs_table.php
│   │   ├── 2019_12_14_000001_create_personal_access_tokens_table.php
│   │   ├── 2022_09_08_094911_create_icons_table.php
│   │   ├── 2022_09_09_220749_create_tickets_table.php
│   │   ├── 2022_09_10_205032_create_projects_table.php
│   │   ├── 2022_09_10_205612_create_user_projects_table.php
│   │   ├── 2022_09_10_205915_add_project_to_tickets.php
│   │   ├── 2022_09_10_220736_add_role_to_users.php
│   │   ├── 2022_09_11_142205_add_register_token_to_users.php
│   │   ├── 2022_09_11_153059_add_soft_deletes_to_users.php
│   │   ├── 2022_09_11_163751_create_favorite_projects_table.php
│   │   ├── 2022_09_11_202013_add_type_to_tickets.php
│   │   ├── 2022_09_12_090928_create_comments_table.php
│   │   ├── 2022_09_12_095043_create_jobs_table.php
│   │   ├── 2022_09_14_175349_create_notifications_table.php
│   │   ├── 2022_09_15_142643_add_local_to_user.php
│   │   ├── 2022_09_19_095513_create_ticket_statuses_table.php
│   │   ├── 2022_09_19_111627_create_ticket_priorities_table.php
│   │   ├── 2022_09_19_111633_create_ticket_types_table.php
│   │   ├── 2022_09_19_122813_add_slug_to_ticket_statuses.php
│   │   ├── 2022_09_19_122821_add_slug_to_ticket_types.php
│   │   ├── 2022_09_19_122828_add_slug_to_ticket_priorities.php
│   │   ├── 2022_09_19_143232_add_ticket_prefix_to_projects.php
│   │   ├── 2022_09_19_144042_add_number_to_tickets.php
│   │   ├── 2022_09_19_181148_create_activity_log_table.php
│   │   ├── 2022_09_19_181149_add_event_column_to_activity_log_table.php
│   │   ├── 2022_09_19_181150_add_batch_uuid_column_to_activity_log_table.php
│   │   ├── 2022_09_19_181611_drop_user_projects.php
│   │   ├── 2022_09_19_212320_create_chats_table.php
│   │   ├── 2022_09_24_230950_create_companies_table.php
│   │   ├── 2022_09_25_154331_create_permission_tables.php
│   │   ├── 2022_09_25_163436_remove_role_from_users.php
│   │   ├── 2022_09_25_165452_create_company_users_table.php
│   │   └── 2022_09_30_133603_add_company_id_to_projects.php
│   └── seeders/
│       ├── DatabaseSeeder.php
│       ├── FontAwesomeFreeSeeder.php
│       └── PermissionsSeeder.php
├── docker-compose.yml
├── docs/
│   ├── .nojekyll
│   ├── README.md
│   ├── _sidebar.md
│   ├── changelog.md
│   ├── configuration.md
│   ├── getting-started.md
│   ├── index.html
│   ├── permissions.md
│   └── screenshots.md
├── lang/
│   ├── en/
│   │   ├── auth.php
│   │   ├── pagination.php
│   │   ├── passwords.php
│   │   └── validation.php
│   ├── fr/
│   │   ├── auth.php
│   │   ├── pagination.php
│   │   ├── passwords.php
│   │   └── validation.php
│   └── fr.json
├── package.json
├── phpunit.xml
├── postcss.config.js
├── public/
│   ├── .htaccess
│   ├── index.php
│   ├── robots.txt
│   └── vendor/
│       └── filament-forms-tinyeditor/
│           └── tinymce/
│               ├── langs/
│               │   ├── README.md
│               │   ├── ar.js
│               │   ├── ca.js
│               │   ├── cs.js
│               │   ├── cs_CZ.js
│               │   ├── cy.js
│               │   ├── da.js
│               │   ├── de.js
│               │   ├── es_419.js
│               │   ├── fa.js
│               │   ├── fi.js
│               │   ├── fr_FR.js
│               │   ├── he_IL.js
│               │   ├── hr.js
│               │   ├── hu_HU.js
│               │   ├── id.js
│               │   ├── it_IT.js
│               │   ├── ja.js
│               │   ├── kab.js
│               │   ├── nb_NO.js
│               │   ├── nl.js
│               │   ├── nl_BE.js
│               │   ├── pl.js
│               │   ├── pt_BR.js
│               │   ├── pt_PT.js
│               │   ├── ro.js
│               │   ├── ru.js
│               │   ├── ru_RU.js
│               │   ├── sk.js
│               │   ├── sl.js
│               │   ├── sq.js
│               │   ├── sv_SE.js
│               │   ├── ta.js
│               │   ├── ta_IN.js
│               │   ├── th_TH.js
│               │   ├── tr.js
│               │   ├── tr_TR.js
│               │   ├── ug.js
│               │   ├── zh_CN.js
│               │   └── zh_TW.js
│               ├── license.txt
│               ├── plugins/
│               │   └── emoticons/
│               │       └── js/
│               │           ├── emojiimages.js
│               │           └── emojis.js
│               ├── skins/
│               │   └── ui/
│               │       ├── dark/
│               │       │   ├── content.css
│               │       │   ├── content.inline.css
│               │       │   ├── content.mobile.css
│               │       │   ├── skin.css
│               │       │   └── skin.mobile.css
│               │       └── light/
│               │           ├── content.css
│               │           ├── content.inline.css
│               │           ├── content.mobile.css
│               │           ├── skin.css
│               │           └── skin.mobile.css
│               └── tinymce.d.ts
├── resources/
│   ├── css/
│   │   ├── app.scss
│   │   └── media-queries.scss
│   ├── js/
│   │   ├── app.js
│   │   └── bootstrap.js
│   └── views/
│       ├── administration/
│       │   ├── activity-logs.blade.php
│       │   ├── companies.blade.php
│       │   ├── roles.blade.php
│       │   ├── ticket-priorities.blade.php
│       │   ├── ticket-statuses.blade.php
│       │   ├── ticket-types.blade.php
│       │   └── users.blade.php
│       ├── analytics.blade.php
│       ├── auth/
│       │   ├── activate-account.blade.php
│       │   ├── forgot-password.blade.php
│       │   ├── login.blade.php
│       │   └── recover-password.blade.php
│       ├── components/
│       │   ├── base-layout.blade.php
│       │   ├── guest-layout.blade.php
│       │   ├── layout.blade.php
│       │   ├── main-menu.blade.php
│       │   ├── notification-type.blade.php
│       │   ├── priority-span.blade.php
│       │   ├── role-span.blade.php
│       │   ├── status-span.blade.php
│       │   ├── type-span.blade.php
│       │   └── user-avatar.blade.php
│       ├── kanban.blade.php
│       ├── livewire/
│       │   ├── administration/
│       │   │   ├── activity-logs.blade.php
│       │   │   ├── companies-dialog.blade.php
│       │   │   ├── companies.blade.php
│       │   │   ├── roles-dialog.blade.php
│       │   │   ├── roles.blade.php
│       │   │   ├── ticket-priorities-dialog.blade.php
│       │   │   ├── ticket-priorities.blade.php
│       │   │   ├── ticket-statuses-dialog.blade.php
│       │   │   ├── ticket-statuses.blade.php
│       │   │   ├── ticket-types-dialog.blade.php
│       │   │   ├── ticket-types.blade.php
│       │   │   ├── users-dialog.blade.php
│       │   │   └── users.blade.php
│       │   ├── analytics.blade.php
│       │   ├── auth/
│       │   │   ├── activate-account.blade.php
│       │   │   ├── forgot-password.blade.php
│       │   │   ├── login.blade.php
│       │   │   └── recover-password.blade.php
│       │   ├── chat.blade.php
│       │   ├── my-notifications.blade.php
│       │   ├── my-profile.blade.php
│       │   ├── projects-dialog.blade.php
│       │   ├── projects.blade.php
│       │   ├── ticket-details/
│       │   │   ├── content.blade.php
│       │   │   ├── priority.blade.php
│       │   │   ├── responsible.blade.php
│       │   │   ├── status.blade.php
│       │   │   ├── title.blade.php
│       │   │   └── type.blade.php
│       │   ├── ticket-details-comments-content.blade.php
│       │   ├── ticket-details-comments.blade.php
│       │   ├── ticket-details.blade.php
│       │   ├── tickets-dialog.blade.php
│       │   └── tickets.blade.php
│       ├── my-profile.blade.php
│       ├── notifications.blade.php
│       ├── tables/
│       │   └── columns/
│       │       └── user-column.blade.php
│       ├── ticket-details.blade.php
│       ├── tickets.blade.php
│       ├── vendor/
│       │   ├── filament-kanban-board/
│       │   │   ├── .gitkeep
│       │   │   └── kanban-header.blade.php
│       │   └── pagination/
│       │       └── tailwind.blade.php
│       └── welcome.blade.php
├── routes/
│   ├── api.php
│   ├── channels.php
│   ├── console.php
│   └── web.php
├── storage/
│   ├── app/
│   │   └── .gitignore
│   ├── framework/
│   │   ├── .gitignore
│   │   ├── cache/
│   │   │   └── .gitignore
│   │   ├── sessions/
│   │   │   └── .gitignore
│   │   ├── testing/
│   │   │   └── .gitignore
│   │   └── views/
│   │       └── .gitignore
│   └── logs/
│       └── .gitignore
├── tailwind.config.js
├── tests/
│   ├── CreatesApplication.php
│   ├── Feature/
│   │   └── ExampleTest.php
│   ├── TestCase.php
│   └── Unit/
│       └── ExampleTest.php
└── vite.config.js

================================================
FILE CONTENTS
================================================

================================================
FILE: .editorconfig
================================================
root = true

[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
indent_style = space
indent_size = 4
trim_trailing_whitespace = true

[*.md]
trim_trailing_whitespace = false

[*.{yml,yaml}]
indent_size = 2

[docker-compose.yml]
indent_size = 4


================================================
FILE: .gitattributes
================================================
* text=auto

*.blade.php diff=html
*.css diff=css
*.html diff=html
*.md diff=markdown
*.php diff=php

/.github export-ignore
CHANGELOG.md export-ignore
.styleci.yml export-ignore

resources/* linguist-vendored=true
*.scss liguist-vendored=true
*.css liguist-vendored=true
*.js liguist-vendored=true
public/* linguist-vendored=true
public/docs/* linguist-documentation=true


================================================
FILE: .github/FUNDING.yml
================================================
github: [heloufir]


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: ''
assignees: ''

---

**Describe the bug**
A clear and concise description of what the bug is.

**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error

**Expected behavior**
A clear and concise description of what you expected to happen.

**Screenshots**
If applicable, add screenshots to help explain your problem.

**Desktop (please complete the following information):**
 - OS: [e.g. iOS]
 - Browser [e.g. chrome, safari]
 - Version [e.g. 22]

**Smartphone (please complete the following information):**
 - Device: [e.g. iPhone6]
 - OS: [e.g. iOS8.1]
 - Browser [e.g. stock browser, safari]
 - Version [e.g. 22]

**Additional context**
Add any other context about the problem here.


================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: ''
assignees: ''

---

**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]

**Describe the solution you'd like**
A clear and concise description of what you want to happen.

**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.

**Additional context**
Add any other context or screenshots about the feature request here.


================================================
FILE: .gitignore
================================================
/node_modules
/public/build
/public/hot
/public/storage
/storage/*.key
/vendor
.env
.env.backup
.phpunit.result.cache
Homestead.json
Homestead.yaml
auth.json
npm-debug.log
yarn-error.log
/.idea
/.vscode


================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Contributor Covenant Code of Conduct

## Our Pledge

We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, religion, or sexual identity
and orientation.

We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.

## Our Standards

Examples of behavior that contributes to a positive environment for our
community include:

* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes,
  and learning from the experience
* Focusing on what is best not just for us as individuals, but for the
  overall community

Examples of unacceptable behavior include:

* The use of sexualized language or imagery, and sexual attention or
  advances of any kind
* Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or email
  address, without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a
  professional setting

## Enforcement Responsibilities

Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.

Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.

## Scope

This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.

## Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
.
All complaints will be reviewed and investigated promptly and fairly.

All community leaders are obligated to respect the privacy and security of the
reporter of any incident.

## Enforcement Guidelines

Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:

### 1. Correction

**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.

**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.

### 2. Warning

**Community Impact**: A violation through a single incident or series
of actions.

**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or
permanent ban.

### 3. Temporary Ban

**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.

**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.

### 4. Permanent Ban

**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior,  harassment of an
individual, or aggression toward or disparagement of classes of individuals.

**Consequence**: A permanent ban from any sort of public interaction within
the community.

## Attribution

This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.0, available at
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.

Community Impact Guidelines were inspired by [Mozilla's code of conduct
enforcement ladder](https://github.com/mozilla/diversity).

[homepage]: https://www.contributor-covenant.org

For answers to common questions about this code of conduct, see the FAQ at
https://www.contributor-covenant.org/faq. Translations are available at
https://www.contributor-covenant.org/translations.


================================================
FILE: LICENSE.md
================================================
The MIT License (MIT)

Copyright (c) shuvroroy <shuvro.nsu.cse@gmail.com>

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.


================================================
FILE: Procfile
================================================
web: vendor/bin/heroku-php-apache2 public/


================================================
FILE: README.md
================================================
# Help Desk

<p align="center">
    <a href="https://laravel.com"><img alt="Laravel v9.x" src="https://img.shields.io/badge/Laravel-v9.x-FF2D20?style=for-the-badge&logo=laravel"></a>
    <a href="https://laravel-livewire.com"><img alt="Livewire v2.x" src="https://img.shields.io/badge/Livewire-v2.x-FB70A9?style=for-the-badge"></a>
    <a href="https://filamentphp.com/"><img alt="Filament v2.x" src="https://img.shields.io/badge/Filament-v2.x-e9b228?style=for-the-badge"></a>
    <a href="https://php.net"><img alt="PHP 8.0" src="https://img.shields.io/badge/PHP-8.0-777BB4?style=for-the-badge&logo=php"></a>
    <br/>
    <a href="https://github.com/devaslanphp/help-desk/releases/">
        <img src="https://img.shields.io/github/tag/devaslanphp/help-desk?include_prereleases=&sort=semver&color=blue&style=for-the-badge" alt="GitHub tag">
    </a>
    <a href="#license">
        <img src="https://img.shields.io/badge/License-MIT-blue?style=for-the-badge" alt="License">
    </a>
    <a href="https://github.com/devaslanphp/help-desk/issues">
        <img src="https://img.shields.io/github/issues/devaslanphp/help-desk?style=for-the-badge" alt="issues - help-desk">
    </a>
    <br/>
    <a href="https://devaslanphp.github.io/help-desk/" title="Go to project documentation">
        <img src="https://img.shields.io/badge/view-Documentation-blue?style=for-the-badge" alt="view - Documentation">
    </a>
    <br/>
    <a href="https://deepscan.io/dashboard#view=project&tid=19327&pid=22721&bid=673739">
        <img src="https://deepscan.io/api/teams/19327/projects/22721/branches/673739/badge/grade.svg?style=for-the-badge" alt="DeepScan grade">
    </a>
</p>

Help Desk is a Laravel based project, that let you manage your support tickets and communicate with your customers, with
a beautiful and simple to use platform.

Help Desk is based on the latest version of Laravel and any other Open Source packages and technologies.

<hr/>

# Version 2

Take a look to the a newer version containing the same options and more:

[https://github.com/devaslanphp/project-management](https://github.com/devaslanphp/project-management)

<hr/>

[![SonarCloud](https://sonarcloud.io/images/project_badges/sonarcloud-white.svg)](https://sonarcloud.io/summary/new_code?id=devaslanphp_help-desk)

Below are the analyzes reported by SonarCloud. 

> This project has just started so don't be afraid if there are big numbers :satisfied:

[![Security Rating](https://sonarcloud.io/api/project_badges/measure?project=devaslanphp_help-desk&metric=security_rating)](https://sonarcloud.io/summary/new_code?id=devaslanphp_help-desk)
[![Bugs](https://sonarcloud.io/api/project_badges/measure?project=devaslanphp_help-desk&metric=bugs)](https://sonarcloud.io/summary/new_code?id=devaslanphp_help-desk)
[![Vulnerabilities](https://sonarcloud.io/api/project_badges/measure?project=devaslanphp_help-desk&metric=vulnerabilities)](https://sonarcloud.io/summary/new_code?id=devaslanphp_help-desk)
[![Duplicated Lines (%)](https://sonarcloud.io/api/project_badges/measure?project=devaslanphp_help-desk&metric=duplicated_lines_density)](https://sonarcloud.io/summary/new_code?id=devaslanphp_help-desk)
[![Reliability Rating](https://sonarcloud.io/api/project_badges/measure?project=devaslanphp_help-desk&metric=reliability_rating)](https://sonarcloud.io/summary/new_code?id=devaslanphp_help-desk)
[![Technical Debt](https://sonarcloud.io/api/project_badges/measure?project=devaslanphp_help-desk&metric=sqale_index)](https://sonarcloud.io/summary/new_code?id=devaslanphp_help-desk)
[![Lines of Code](https://sonarcloud.io/api/project_badges/measure?project=devaslanphp_help-desk&metric=ncloc)](https://sonarcloud.io/summary/new_code?id=devaslanphp_help-desk)
[![Code Smells](https://sonarcloud.io/api/project_badges/measure?project=devaslanphp_help-desk&metric=code_smells)](https://sonarcloud.io/summary/new_code?id=devaslanphp_help-desk)
[![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=devaslanphp_help-desk&metric=sqale_rating)](https://sonarcloud.io/summary/new_code?id=devaslanphp_help-desk)

<hr/>

## Screenshots
<div>
    <img src="github-contents/1.png" width="20%"></img> 
    <img src="github-contents/2.png" width="20%"></img> 
    <img src="github-contents/3.png" width="20%"></img> 
    <img src="github-contents/4.png" width="20%"></img> 
    <img src="github-contents/5.png" width="20%"></img> 
    <img src="github-contents/6.png" width="20%"></img> 
    <img src="github-contents/7.png" width="20%"></img> 
    <img src="github-contents/8.png" width="20%"></img> 
    <img src="github-contents/9.png" width="20%"></img> 
    <img src="github-contents/10.png" width="20%"></img> 
    <img src="github-contents/11.png" width="20%"></img> 
    <img src="github-contents/12.png" width="20%"></img> 
    <img src="github-contents/13.png" width="20%"></img> 
    <img src="github-contents/14.png" width="20%"></img> 
    <img src="github-contents/15.png" width="20%"></img> 
    <img src="github-contents/16.png" width="20%"></img> 
    <img src="github-contents/17.png" width="20%"></img> 
    <img src="github-contents/18.png" width="20%"></img> 
    <img src="github-contents/19.png" width="20%"></img> 
    <img src="github-contents/20.png" width="20%"></img> 
    <img src="github-contents/21.png" width="20%"></img> 
    <img src="github-contents/22.png" width="20%"></img> 
    <img src="github-contents/23.png" width="20%"></img> 
</div>

## Online demo

You can check our online demo here: [Online demo](http://helpdesk.devaslan.com/)

> **Use the following accounts to access demo:**
> 
> *Important: The save / delete users functions are disabled only in demo instance*
>
> **Administrator**
> - Email: darkvador@gmail.com
> - Password: secret
>
> **Customer**
> - Email: janedoe@gmail.com
> - Password: secret
>
> **Employee**
> - Email: johndoe@gmail.com
> - Password: secret

## Documentation

You can find a full documentation here: [Documentation](https://devaslanphp.github.io/help-desk/)

## Work in progress

We are always working to make Help Desk a better application, to have more information about tasks and features in progress, you can see the [Help Desk project](https://github.com/orgs/devaslanphp/projects/1).

## Credits

- [All Contributors](https://github.com/devaslanphp/help-desk/graphs/contributors)

## License

The MIT License (MIT). Please see [License File](LICENSE.md) for more information.

## Support us

<a href="https://www.buymeacoffee.com/heloufir" target="_blank"><img src="https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png" alt="Buy Me A Coffee" style="height: 41px !important;width: 174px !important;box-shadow: 0px 3px 2px 0px rgba(190, 190, 190, 0.5) !important;-webkit-box-shadow: 0px 3px 2px 0px rgba(190, 190, 190, 0.5) !important;" ></a>


================================================
FILE: SECURITY.md
================================================
# Security Policy

## Supported Versions

| Version | Supported |
| ------- | ------------------ |
| 1.x | :white_check_mark: |

## Reporting a Vulnerability

If you discover a security vulnerability within Help Desk application, please email me via [eloufirhatim@gmail.com](mailto:eloufirhatim@gmail.com). All security vulnerabilities will be promptly addressed.


================================================
FILE: app/Console/Kernel.php
================================================
<?php

namespace App\Console;

use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;

class Kernel extends ConsoleKernel
{
    /**
     * Define the application's command schedule.
     *
     * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
     * @return void
     */
    protected function schedule(Schedule $schedule)
    {
        // $schedule->command('inspire')->hourly();
    }

    /**
     * Register the commands for the application.
     *
     * @return void
     */
    protected function commands()
    {
        $this->load(__DIR__.'/Commands');

        require base_path('routes/console.php');
    }
}


================================================
FILE: app/Core/CrudDialogHelper.php
================================================
<?php

namespace App\Core;

use Exception;
use Filament\Notifications\Actions\Action;
use Filament\Notifications\Notification;

trait CrudDialogHelper
{

    public bool $deleteConfirmationOpened = false;

    /**
     * Delete confirmation function
     *
     * @param string $title
     * @param string $body
     * @param string $deleteEvent
     * @param string $cancelEvent
     * @return void
     * @throws Exception
     */
    public function deleteConfirmation(string $title, string $body, string $deleteEvent, string $cancelEvent): void
    {
        $this->deleteConfirmationOpened = true;
        Notification::make()
            ->warning()
            ->title($title)
            ->body($body)
            ->actions([
                Action::make('confirm')
                    ->label(__('Confirm'))
                    ->color('danger')
                    ->button()
                    ->close()
                    ->emit($deleteEvent),
                Action::make('cancel')
                    ->label(__('Cancel'))
                    ->close()
                    ->emit($cancelEvent)
            ])
            ->persistent()
            ->send();
    }

}


================================================
FILE: app/Core/HasLogsActivity.php
================================================
<?php

namespace App\Core;

interface HasLogsActivity
{

    public function __toString(): string;

    public function activityLogLink(): string;

}


================================================
FILE: app/Core/LogsActivity.php
================================================
<?php

namespace App\Core;

use Illuminate\Support\HtmlString;
use Spatie\Activitylog\LogOptions;
use Spatie\Activitylog\Traits\LogsActivity as BaseLogsActivity;

trait LogsActivity
{

    use BaseLogsActivity;

    /**
     * Activity log options definition
     *
     * @return LogOptions
     */
    public function getActivitylogOptions(): LogOptions
    {
        return LogOptions::defaults()
            ->logOnly($this->getFillable())
            ->setDescriptionForEvent(fn(string $eventName) => new HtmlString(
                '<div class="flex flex-col gap-1">'
                . (auth()->user()->name ?? '')
                . " "
                . $eventName
                . " "
                . $this->fromCamelCase((new \ReflectionClass($this))->getShortName())
                . " "
                . $this
                . ' <a class="text-primary-500 hover:underline hover:cursor-pointer"
                        target="_blank"
                        href="' . $this->activityLogLink() . '">
                        ' . __('See details')
                . '</a>'
                . '</div>'
            ));
    }

    /**
     * Transform a camel case to normal case
     *
     * @param $input
     * @return string
     */
    private function fromCamelCase($input)
    {
        $pattern = '!([A-Z][A-Z0-9]*(?=$|[A-Z][a-z0-9])|[A-Za-z][a-z0-9]+)!';
        preg_match_all($pattern, $input, $matches);
        $ret = $matches[0];
        foreach ($ret as &$match) {
            $match = $match == strtoupper($match) ?
                strtolower($match) :
                lcfirst($match);
        }
        return implode(' ', $ret);
    }

}


================================================
FILE: app/Exceptions/Handler.php
================================================
<?php

namespace App\Exceptions;

use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Throwable;

class Handler extends ExceptionHandler
{
    /**
     * A list of exception types with their corresponding custom log levels.
     *
     * @var array<class-string<\Throwable>, \Psr\Log\LogLevel::*>
     */
    protected $levels = [
        //
    ];

    /**
     * A list of the exception types that are not reported.
     *
     * @var array<int, class-string<\Throwable>>
     */
    protected $dontReport = [
        //
    ];

    /**
     * A list of the inputs that are never flashed to the session on validation exceptions.
     *
     * @var array<int, string>
     */
    protected $dontFlash = [
        'current_password',
        'password',
        'password_confirmation',
    ];

    /**
     * Register the exception handling callbacks for the application.
     *
     * @return void
     */
    public function register()
    {
        $this->reportable(function (Throwable $e) {
            //
        });
    }
}


================================================
FILE: app/Http/Controllers/Auth/LogoutController.php
================================================
<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class LogoutController extends Controller
{

    public function __invoke(Request $request)
    {
        Auth::logout();
        $request->session()->regenerateToken();
        return redirect('/');
    }

}


================================================
FILE: app/Http/Controllers/Controller.php
================================================
<?php

namespace App\Http\Controllers;

use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Routing\Controller as BaseController;

class Controller extends BaseController
{
    use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
}


================================================
FILE: app/Http/Controllers/TicketNumberController.php
================================================
<?php

namespace App\Http\Controllers;

use App\Models\Ticket;
use Illuminate\Http\RedirectResponse;
use Illuminate\Support\Str;

class TicketNumberController extends Controller
{

    /**
     * Redirect to a ticket based on it's number
     *
     * @param string $number
     * @return RedirectResponse|void
     */
    public function __invoke(string $number)
    {
        $ticketPrefix = substr($number, 0, 4);
        $ticketNumber = str_replace($ticketPrefix, "", $number);
        $ticket = Ticket::where('number', $ticketNumber)
            ->whereHas('project', fn($query) => $query->where('ticket_prefix', $ticketPrefix))
            ->first();
        if ($ticket) {
            return redirect()->route('tickets.details', [
                'ticket' => $ticket,
                'slug' => Str::slug($ticket->title)
            ]);
        } else {
            abort(404);
        }
    }

}


================================================
FILE: app/Http/Kernel.php
================================================
<?php

namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
    /**
     * The application's global HTTP middleware stack.
     *
     * These middleware are run during every request to your application.
     *
     * @var array<int, class-string|string>
     */
    protected $middleware = [
        // \App\Http\Middleware\TrustHosts::class,
        \App\Http\Middleware\TrustProxies::class,
        \Illuminate\Http\Middleware\HandleCors::class,
        \App\Http\Middleware\PreventRequestsDuringMaintenance::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
    ];

    /**
     * The application's route middleware groups.
     *
     * @var array<string, array<int, class-string|string>>
     */
    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],

        'api' => [
            // \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
            'throttle:api',
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],
    ];

    /**
     * The application's route middleware.
     *
     * These middleware may be assigned to groups or used individually.
     *
     * @var array<string, class-string|string>
     */
    protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'auth.session' => \Illuminate\Session\Middleware\AuthenticateSession::class,
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
        'signed' => \App\Http\Middleware\ValidateSignature::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
        'can_access_ticket' => \App\Http\Middleware\CanAccessTicket::class,
        'set_locale' => \App\Http\Middleware\LocaleMiddleware::class,
    ];
}


================================================
FILE: app/Http/Livewire/Administration/ActivityLogs.php
================================================
<?php

namespace App\Http\Livewire\Administration;

use App\Models\TicketPriority;
use Filament\Forms\Components\Grid;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Concerns\InteractsWithForms;
use Filament\Forms\Contracts\HasForms;
use Livewire\Component;
use Spatie\Activitylog\Models\Activity;

class ActivityLogs extends Component implements HasForms
{
    use InteractsWithForms;

    public $search;

    public function mount(): void
    {
        $this->form->fill();
    }

    public function render()
    {
        $query = Activity::query();
        $query->orderby('created_at', 'desc');
        if ($this->search) {
            $query->where('description', 'like', '%' . $this->search . '%');
        }
        $logs = $query->paginate();
        return view('livewire.administration.activity-logs', compact('logs'));
    }

    /**
     * Form schema definition
     *
     * @return array
     */
    protected function getFormSchema(): array
    {
        return [
            Grid::make(1)
                ->schema([
                    TextInput::make('search')
                        ->label(__('Search for activity logs'))
                        ->disableLabel()
                        ->type('search')
                        ->placeholder(__('Search for activity logs')),
                ]),
        ];
    }

    /**
     * Search for activity logs
     *
     * @return void
     */
    public function search(): void
    {
        $data = $this->form->getState();
        $this->search = $data['search'] ?? null;
    }

}


================================================
FILE: app/Http/Livewire/Administration/Companies.php
================================================
<?php

namespace App\Http\Livewire\Administration;

use App\Models\Company;
use App\Tables\Columns\UserColumn;
use Carbon\Carbon;
use Filament\Tables\Actions\Action;
use Filament\Tables\Columns\BooleanColumn;
use Filament\Tables\Columns\ImageColumn;
use Filament\Tables\Columns\TagsColumn;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Concerns\InteractsWithTable;
use Filament\Tables\Contracts\HasTable;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Relations\Relation;
use Illuminate\Support\HtmlString;
use Livewire\Component;
use Maatwebsite\Excel\Excel;
use pxlrbt\FilamentExcel\Actions\Tables\ExportAction;
use pxlrbt\FilamentExcel\Columns\Column;
use pxlrbt\FilamentExcel\Exports\ExcelExport;

class Companies extends Component implements HasTable
{
    use InteractsWithTable;

    public $selectedCompany;

    protected $listeners = ['companySaved', 'companyDeleted'];

    public function render()
    {
        return view('livewire.administration.companies');
    }

    /**
     * Table query definition
     *
     * @return Builder|Relation
     */
    protected function getTableQuery(): Builder|Relation
    {
        $query = Company::query();
        if (auth()->user()->can('View own companies') && !auth()->user()->can('View all companies')) {
            $query->where('responsible_id', auth()->user()->id);
        } elseif (!auth()->user()->can('View all companies')) {
            // Get empty list
            $query->whereNull('id');
        }
        return $query;
    }

    /**
     * Table definition
     *
     * @return array
     */
    protected function getTableColumns(): array
    {
        return [
            ImageColumn::make('logo')
                ->label(__('Logo'))
                ->height(30),

            TextColumn::make('name')
                ->label(__('Company name'))
                ->searchable()
                ->sortable(),

            UserColumn::make('responsible')
                ->label(__('Responsible'))
                ->searchable()
                ->sortable(),

            BooleanColumn::make('is_disabled')
                ->label(__('Company activated'))
                ->trueIcon('heroicon-o-x-circle')
                ->falseIcon('heroicon-o-check-circle')
                ->trueColor('danger')
                ->falseColor('success')
                ->searchable()
                ->sortable(),

            TagsColumn::make('users.name')
                ->label(__('Company users'))
                ->limit(1)
                ->searchable()
                ->sortable(),

            TextColumn::make('created_at')
                ->label(__('Created at'))
                ->sortable()
                ->searchable()
                ->dateTime(),
        ];
    }

    /**
     * Table actions definition
     *
     * @return array
     */
    protected function getTableActions(): array
    {
        return [
            Action::make('edit')
                ->icon('heroicon-o-pencil')
                ->link()
                ->label(__('Edit company'))
                ->visible(fn () => auth()->user()->can('Update companies'))
                ->action(fn(Company $record) => $this->updateCompany($record->id))
        ];
    }

    /**
     * Table header actions definition
     *
     * @return array
     */
    protected function getTableHeaderActions(): array
    {
        return [
            ExportAction::make()
                ->label(__('Export'))
                ->color('success')
                ->icon('heroicon-o-document-download')
                ->exports([
                    ExcelExport::make()
                        ->askForWriterType()
                        ->withFilename('companies-export')
                        ->withColumns([
                            Column::make('name')
                                ->heading(__('Company name')),
                            Column::make('responsible.name')
                                ->heading(__('Responsible')),
                            Column::make('is_disabled')
                                ->heading(__('Company activated'))
                                ->formatStateUsing(fn (bool $state) => $state ? __('No') : __('Yes')),
                            Column::make('users')
                                ->heading(__('Company users'))
                                ->formatStateUsing(fn (Company $record) => $record->users->pluck('name')->join(', ')),
                            Column::make('created_at')
                                ->heading(__('Created at'))
                                ->formatStateUsing(fn (Carbon $state) => $state->format(__('Y-m-d g:i A'))),
                        ])
                ])
        ];
    }

    /**
     * Table default sort column definition
     *
     * @return string|null
     */
    protected function getDefaultTableSortColumn(): ?string
    {
        return 'created_at';
    }

    /**
     * Table default sort direction definition
     *
     * @return string|null
     */
    protected function getDefaultTableSortDirection(): ?string
    {
        return 'desc';
    }

    /**
     * Show update company dialog
     *
     * @param $id
     * @return void
     */
    public function updateCompany($id)
    {
        $this->selectedCompany = Company::find($id);
        $this->dispatchBrowserEvent('toggleCompanyModal');
    }

    /**
     * Show create company dialog
     *
     * @return void
     */
    public function createCompany()
    {
        $this->selectedCompany = new Company();
        $this->dispatchBrowserEvent('toggleCompanyModal');
    }

    /**
     * Cancel and close company create / update dialog
     *
     * @return void
     */
    public function cancelCompany()
    {
        $this->selectedCompany = null;
        $this->dispatchBrowserEvent('toggleCompanyModal');
    }

    /**
     * Event launched after a company is created / updated
     *
     * @return void
     */
    public function companySaved()
    {
        $this->cancelCompany();
    }

    /**
     * Event launched after a company is deleted
     *
     * @return void
     */
    public function companyDeleted()
    {
        $this->companySaved();
    }
}


================================================
FILE: app/Http/Livewire/Administration/CompaniesDialog.php
================================================
<?php

namespace App\Http\Livewire\Administration;

use App\Core\CrudDialogHelper;
use App\Models\CompanyUser;
use App\Models\Icon;
use App\Models\Company;
use App\Models\User;
use Filament\Forms\Components\CheckboxList;
use Filament\Forms\Components\ColorPicker;
use Filament\Forms\Components\FileUpload;
use Filament\Forms\Components\Grid;
use Filament\Forms\Components\MultiSelect;
use Filament\Forms\Components\RichEditor;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Components\Toggle;
use Filament\Forms\Concerns\InteractsWithForms;
use Filament\Forms\Contracts\HasForms;
use Filament\Notifications\Actions\Action;
use Filament\Notifications\Notification;
use Illuminate\Support\HtmlString;
use Illuminate\Support\Str;
use Illuminate\Validation\Rules\Unique;
use Livewire\Component;
use Livewire\WithFileUploads;

class CompaniesDialog extends Component implements HasForms
{
    use WithFileUploads, InteractsWithForms;
    use CrudDialogHelper;

    public Company $company;

    protected $listeners = ['doDeleteCompany', 'cancelDeleteCompany'];

    public function mount(): void
    {
        $this->form->fill([
            'name' => $this->company->name,
            'logo' => $this->company->logo,
            'description' => $this->company->description,
            'is_disabled' => $this->company->is_disabled,
            'responsible_id' => $this->company->responsible_id,
            'users' => $this->company->users->pluck('id')->toArray()
        ]);
    }


    public function render()
    {
        return view('livewire.administration.companies-dialog');
    }

    /**
     * Form schema definition
     *
     * @return array
     */
    protected function getFormSchema(): array
    {
        return [

            Grid::make(5)
                ->schema([

                    Grid::make(1)
                        ->columnSpan(2)
                        ->schema([
                            FileUpload::make('logo')
                                ->image()
                                ->maxSize(10240)
                                ->label(__('Logo')),
                        ]),

                    Grid::make(1)
                        ->columnSpan(3)
                        ->schema([

                            TextInput::make('name')
                                ->label(__('Company name'))
                                ->maxLength(255)
                                ->unique(
                                    table: Company::class,
                                    column: 'name',
                                    ignorable: fn() => $this->company,
                                    callback: fn (Unique $rule) => $rule->withoutTrashed()
                                )
                                ->required(),

                            Select::make('responsible_id')
                                ->label(__('Responsible'))
                                ->searchable()
                                ->required()
                                ->options(User::all()->pluck('name', 'id')->toArray()),
                        ]),

                ]),

            RichEditor::make('description')
                ->label(__('Description'))
                ->fileAttachmentsDisk(config('filesystems.default'))
                ->fileAttachmentsDirectory('companies')
                ->fileAttachmentsVisibility('private'),

            Toggle::make('is_disabled')
                ->label(__('Disable access to this company')),

            MultiSelect::make('users')
                ->label(__('Company users'))
                ->options(User::all()->pluck('name', 'id')->toArray())
        ];
    }

    /**
     * Create / Update the company
     *
     * @return void
     */
    public function save(): void
    {
        $data = $this->form->getState();
        if (!$this->company?->id) {
            $company = Company::create([
                'name' => $data['name'],
                'logo' => $data['logo'] ?? null,
                'description' => $data['description'] ?? null,
                'is_disabled' => $data['is_disabled'] ?? false,
                'responsible_id' => $data['responsible_id'],
            ]);
            foreach ($data['users'] as $user) {
                CompanyUser::create([
                    'company_id' => $company->id,
                    'user_id' => $user
                ]);
            }
            Notification::make()
                ->success()
                ->title(__('Company created'))
                ->body(__('The company has been created'))
                ->send();
        } else {
            $this->company->name = $data['name'];
            $this->company->description = $data['description'];
            $this->company->logo = $data['logo'];
            $this->company->is_disabled = $data['is_disabled'];
            $this->company->responsible_id = $data['responsible_id'];
            $this->company->save();
            CompanyUser::where('company_id', $this->company->id)->delete();
            foreach ($data['users'] as $user) {
                CompanyUser::create([
                    'company_id' => $this->company->id,
                    'user_id' => $user
                ]);
            }
            Notification::make()
                ->success()
                ->title(__('Company updated'))
                ->body(__("The company's details has been updated"))
                ->send();
        }
        $this->emit('companySaved');
    }

    /**
     * Delete an existing company
     *
     * @return void
     */
    public function doDeleteCompany(): void
    {
        $this->company->delete();
        $this->deleteConfirmationOpened = false;
        $this->emit('companyDeleted');
        Notification::make()
            ->success()
            ->title(__('Company deleted'))
            ->body(__('The company has been deleted'))
            ->send();
    }

    /**
     * Cancel the deletion of a company
     *
     * @return void
     */
    public function cancelDeleteCompany(): void
    {
        $this->deleteConfirmationOpened = false;
    }

    /**
     * Show the delete company confirmation dialog
     *
     * @return void
     * @throws \Exception
     */
    public function deleteCompany(): void
    {
        $this->deleteConfirmation(
            __('Company deletion'),
            __('Are you sure you want to delete this company?'),
            'doDeleteCompany',
            'cancelDeleteCompany'
        );
    }
}


================================================
FILE: app/Http/Livewire/Administration/Roles.php
================================================
<?php

namespace App\Http\Livewire\Administration;

use App\Models\Company;
use Carbon\Carbon;
use Filament\Notifications\Notification;
use Filament\Tables\Actions\Action;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Concerns\InteractsWithTable;
use Filament\Tables\Contracts\HasTable;
use Filament\Tables\Filters\SelectFilter;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Relations\Relation;
use Livewire\Component;
use pxlrbt\FilamentExcel\Actions\Tables\ExportAction;
use pxlrbt\FilamentExcel\Columns\Column;
use pxlrbt\FilamentExcel\Exports\ExcelExport;
use Spatie\Permission\Models\Role;

class Roles extends Component implements HasTable
{
    use InteractsWithTable;

    public $selectedRole;

    protected $listeners = ['roleSaved', 'roleDeleted'];

    public function render()
    {
        return view('livewire.administration.roles');
    }

    /**
     * Table query definition
     *
     * @return Builder|Relation
     */
    protected function getTableQuery(): Builder|Relation
    {
        $query = Role::query();
        $query->orderBy('created_at', 'desc');
        return $query;
    }

    /**
     * Table definition
     *
     * @return array
     */
    protected function getTableColumns(): array
    {
        return [
            TextColumn::make('name')
                ->label(__('Role name'))
                ->searchable()
                ->sortable(),

            TextColumn::make('created_at')
                ->label(__('Created at'))
                ->sortable()
                ->searchable()
                ->dateTime(),
        ];
    }

    /**
     * Table actions definition
     *
     * @return array
     */
    protected function getTableActions(): array
    {
        return [
            Action::make('edit')
                ->icon('heroicon-o-pencil')
                ->link()
                ->label(__('Edit role'))
                ->visible(fn () => auth()->user()->can('Update user roles'))
                ->action(fn(Role $record) => $this->updateRole($record->id))
        ];
    }

    /**
     * Table header actions definition
     *
     * @return array
     */
    protected function getTableHeaderActions(): array
    {
        return [
            ExportAction::make()
                ->label(__('Export'))
                ->color('success')
                ->icon('heroicon-o-document-download')
                ->exports([
                    ExcelExport::make()
                        ->askForWriterType()
                        ->withFilename('user-roles-export')
                        ->withColumns([
                            Column::make('name')
                                ->heading(__('Role name')),
                            Column::make('permissions')
                                ->heading(__('Permissions'))
                                ->formatStateUsing(
                                    fn (Role $record) => $record->permissions->pluck('name')->join(', ')
                                ),
                            Column::make('created_at')
                                ->heading(__('Created at'))
                                ->formatStateUsing(fn (Carbon $state) => $state->format(__('Y-m-d g:i A'))),
                        ])
                ])
        ];
    }

    /**
     * Table default sort column definition
     *
     * @return string|null
     */
    protected function getDefaultTableSortColumn(): ?string
    {
        return 'created_at';
    }

    /**
     * Table default sort direction definition
     *
     * @return string|null
     */
    protected function getDefaultTableSortDirection(): ?string
    {
        return 'desc';
    }

    /**
     * Show update role dialog
     *
     * @param $id
     * @return void
     */
    public function updateRole($id)
    {
        $this->selectedRole = Role::find($id);
        $this->dispatchBrowserEvent('toggleRoleModal');
    }

    /**
     * Show create role dialog
     *
     * @return void
     */
    public function createRole()
    {
        $this->selectedRole = new Role();
        $this->dispatchBrowserEvent('toggleRoleModal');
    }

    /**
     * Cancel and close role create / update dialog
     *
     * @return void
     */
    public function cancelRole()
    {
        $this->selectedRole = null;
        $this->dispatchBrowserEvent('toggleRoleModal');
    }

    /**
     * Event launched after a role is created / updated
     *
     * @return void
     */
    public function roleSaved()
    {
        $this->cancelRole();
    }

    /**
     * Event launched after a role is deleted
     *
     * @return void
     */
    public function roleDeleted()
    {
        $this->roleSaved();
    }
}


================================================
FILE: app/Http/Livewire/Administration/RolesDialog.php
================================================
<?php

namespace App\Http\Livewire\Administration;

use App\Core\CrudDialogHelper;
use Filament\Forms\Components\CheckboxList;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Concerns\InteractsWithForms;
use Filament\Forms\Contracts\HasForms;
use Filament\Notifications\Notification;
use Illuminate\Support\HtmlString;
use Livewire\Component;
use Spatie\Permission\Models\Permission;
use Spatie\Permission\Models\Role;

class RolesDialog extends Component implements HasForms
{
    use InteractsWithForms;
    use CrudDialogHelper;

    public Role $role;

    protected $listeners = ['doDeleteRole', 'cancelDeleteRole'];

    public array $permissions;

    public function mount(): void
    {
        $this->form->fill([
            'name' => $this->role->name,
            'permissions' => $this->role->permissions->pluck('id')->toArray(),
        ]);
    }


    public function render()
    {
        return view('livewire.administration.roles-dialog');
    }

    /**
     * Form schema definition
     *
     * @return array
     */
    protected function getFormSchema(): array
    {
        return [
            TextInput::make('name')
                ->label(__('Role name'))
                ->maxLength(255)
                ->required(),

            CheckboxList::make('permissions')
                ->label(__('Permissions'))
                ->hint(new HtmlString('
                    <div class="w-full flex items-center gap-2">
                        <button type="button"
                            class="text-xs text-primary-500 hover:text-primary-600 hover:underline"
                            wire:click="assignAllPermissions">
                            ' . __('Assign all permissions') . '
                        </button>
                        <span class="text-xs text-gray-300">|</span>
                        <button type="button"
                            class="text-xs text-primary-500 hover:text-primary-600 hover:underline"
                            wire:click="removeAllPermissions">
                            ' . __('Remove all permissions') . '
                        </button>
                    </div>
                '))
                ->columns(3)
                ->options(Permission::orderBy('name')->get()->pluck('name', 'id')->toArray())
        ];
    }

    /**
     * Assign all permissions
     *
     * @return void
     */
    public function assignAllPermissions(): void
    {
        $this->permissions = Permission::all()->pluck('id')->toArray();
    }

    /**
     * Remove all assigned permissions
     *
     * @return void
     */
    public function removeAllPermissions(): void
    {
        $this->permissions = [];
    }

    /**
     * Create / Update the role
     *
     * @return void
     */
    public function save(): void
    {
        $data = $this->form->getState();
        if (!$this->role?->id) {
            $role = Role::create(['name' => $data['name']]);
            $role->syncPermissions($this->permissions);
            Notification::make()
                ->success()
                ->title(__('Role created'))
                ->body(__('The user role has been created'))
                ->send();
        } else {
            $this->role->name = $data['name'];
            $this->role->save();
            $this->role->syncPermissions($this->permissions);
            Notification::make()
                ->success()
                ->title(__('Role updated'))
                ->body(__('The role\'s details has been updated'))
                ->send();
        }
        $this->emit('roleSaved');
    }

    /**
     * Delete an existing role
     *
     * @return void
     */
    public function doDeleteRole(): void
    {
        $this->role->delete();
        $this->deleteConfirmationOpened = false;
        $this->emit('roleDeleted');
        Notification::make()
            ->success()
            ->title(__('Role deleted'))
            ->body(__('The role has been deleted'))
            ->send();
    }

    /**
     * Cancel the deletion of a role
     *
     * @return void
     */
    public function cancelDeleteRole(): void
    {
        $this->deleteConfirmationOpened = false;
    }

    /**
     * Show the delete role confirmation dialog
     *
     * @return void
     * @throws \Exception
     */
    public function deleteRole(): void
    {
        $this->deleteConfirmation(
            __('Role deletion'),
            __('Are you sure you want to delete this role?'),
            'doDeleteRole',
            'cancelDeleteRole'
        );
    }
}


================================================
FILE: app/Http/Livewire/Administration/TicketPriorities.php
================================================
<?php

namespace App\Http\Livewire\Administration;

use App\Models\TicketPriority;
use App\Models\User;
use Carbon\Carbon;
use Filament\Tables\Actions\Action;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Concerns\InteractsWithTable;
use Filament\Tables\Contracts\HasTable;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Relations\Relation;
use Illuminate\Support\HtmlString;
use Livewire\Component;
use pxlrbt\FilamentExcel\Actions\Tables\ExportAction;
use pxlrbt\FilamentExcel\Columns\Column;
use pxlrbt\FilamentExcel\Exports\ExcelExport;

class TicketPriorities extends Component implements HasTable
{
    use InteractsWithTable;

    public $selectedPriority;

    protected $listeners = ['prioritySaved', 'priorityDeleted'];

    public function render()
    {
        return view('livewire.administration.ticket-priorities');
    }

    /**
     * Table query definition
     *
     * @return Builder|Relation
     */
    protected function getTableQuery(): Builder|Relation
    {
        return TicketPriority::query();
    }

    /**
     * Table definition
     *
     * @return array
     */
    protected function getTableColumns(): array
    {
        return [
            TextColumn::make('title')
                ->label(__('Title'))
                ->searchable()
                ->sortable()
                ->formatStateUsing(fn(TicketPriority $record) => new HtmlString('
                    <span
                        class="px-2 py-1 rounded-full text-sm flex items-center gap-2"
                        style="color: ' . $record->text_color . '; background-color: ' . $record->bg_color . '"
                    >
                    <i class="fa ' . $record->icon . '"></i>' . $record->title . '
                    </span>
                ')),

            TextColumn::make('created_at')
                ->label(__('Created at'))
                ->sortable()
                ->searchable()
                ->dateTime(),
        ];
    }

    /**
     * Table actions definition
     *
     * @return array
     */
    protected function getTableActions(): array
    {
        return [
            Action::make('edit')
                ->icon('heroicon-o-pencil')
                ->link()
                ->label(__('Edit priority'))
                ->action(fn(TicketPriority $record) => $this->updatePriority($record->id))
        ];
    }

    /**
     * Table header actions definition
     *
     * @return array
     */
    protected function getTableHeaderActions(): array
    {
        return [
            ExportAction::make()
                ->label(__('Export'))
                ->color('success')
                ->icon('heroicon-o-document-download')
                ->exports([
                    ExcelExport::make()
                        ->askForWriterType()
                        ->withFilename('ticket-priorities-export')
                        ->withColumns([
                            Column::make('title')
                                ->heading(__('Title')),
                            Column::make('created_at')
                                ->heading(__('Created at'))
                                ->formatStateUsing(fn(Carbon $state) => $state->format(__('Y-m-d g:i A'))),
                        ])
                ])
        ];
    }

    /**
     * Table default sort column definition
     *
     * @return string|null
     */
    protected function getDefaultTableSortColumn(): ?string
    {
        return 'created_at';
    }

    /**
     * Table default sort direction definition
     *
     * @return string|null
     */
    protected function getDefaultTableSortDirection(): ?string
    {
        return 'desc';
    }

    /**
     * Show update priority dialog
     *
     * @param $id
     * @return void
     */
    public function updatePriority($id)
    {
        $this->selectedPriority = TicketPriority::find($id);
        $this->dispatchBrowserEvent('togglePriorityModal');
    }

    /**
     * Show create priority dialog
     *
     * @return void
     */
    public function createPriority()
    {
        $this->selectedPriority = new TicketPriority();
        $this->dispatchBrowserEvent('togglePriorityModal');
    }

    /**
     * Cancel and close priority create / update dialog
     *
     * @return void
     */
    public function cancelPriority()
    {
        $this->selectedPriority = null;
        $this->dispatchBrowserEvent('togglePriorityModal');
    }

    /**
     * Event launched after a priority is created / updated
     *
     * @return void
     */
    public function prioritySaved()
    {
        $this->cancelPriority();
    }

    /**
     * Event launched after a priority is deleted
     *
     * @return void
     */
    public function priorityDeleted()
    {
        $this->prioritySaved();
    }
}


================================================
FILE: app/Http/Livewire/Administration/TicketPrioritiesDialog.php
================================================
<?php

namespace App\Http\Livewire\Administration;

use App\Core\CrudDialogHelper;
use App\Models\Icon;
use App\Models\TicketPriority;
use Closure;
use Filament\Forms\Components\ColorPicker;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Concerns\InteractsWithForms;
use Filament\Forms\Contracts\HasForms;
use Filament\Notifications\Actions\Action;
use Filament\Notifications\Notification;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\HtmlString;
use Illuminate\Support\Str;
use Illuminate\Validation\Rules\Unique;
use Livewire\Component;

class TicketPrioritiesDialog extends Component implements HasForms
{
    use InteractsWithForms;
    use CrudDialogHelper;

    public TicketPriority $priority;

    protected $listeners = ['doDeletePriority', 'cancelDeletePriority'];

    public function mount(): void
    {
        $this->form->fill([
            'title' => $this->priority->title,
            'text_color' => $this->priority->text_color,
            'bg_color' => $this->priority->bg_color,
            'icon' => $this->priority->icon,
        ]);
    }


    public function render()
    {
        return view('livewire.administration.ticket-priorities-dialog');
    }

    /**
     * Form schema definition
     *
     * @return array
     */
    protected function getFormSchema(): array
    {
        return [
            TextInput::make('title')
                ->label(__('Title'))
                ->maxLength(255)
                ->unique(
                    table: TicketPriority::class,
                    column: 'title',
                    ignorable: fn () => $this->priority,
                    callback: function (Unique $rule)
                    {
                        return $rule->withoutTrashed();
                    }
                )
                ->required(),

            ColorPicker::make('text_color')
                ->label(__('Text color'))
                ->required(),

            ColorPicker::make('bg_color')
                ->label(__('Background color'))
                ->required(),

            Select::make('icon')
                ->label(__('Icon'))
                ->reactive()
                ->searchable()
                ->required()
                ->getSearchResultsUsing(
                    fn (string $search) =>
                        Icon::where('icon', 'like', "%{$search}%")
                            ->limit(50)
                            ->pluck('icon', 'icon')
                )
                ->getOptionLabelUsing(fn ($value): ?string => Icon::where('icon', $value)->first()?->icon)
                ->hint(
                    fn (Closure $get) =>
                        $get('icon') ?
                            new HtmlString(
                                __('Selected icon:')
                                . ' <i class="fa fa-2x '
                                . $get('icon')
                                . '"></i>'
                            )
                            :
                            ''
                )
                ->helperText(
                    new HtmlString(
                        __("Check the <a href='https://fontawesome.com/icons'
                                    target='_blank' class='text-blue-500 underline'>
                                    fontawesome icons here
                                </a> to choose your right icon"
                        )
                    )
                ),
        ];
    }

    /**
     * Create / Update the priority
     *
     * @return void
     */
    public function save(): void
    {
        $data = $this->form->getState();
        if (!$this->priority?->id) {
            TicketPriority::create([
                'title' => $data['title'],
                'text_color' => $data['text_color'],
                'bg_color' => $data['bg_color'],
                'icon' => $data['icon'],
                'slug' => Str::slug($data['title'], '_')
            ]);
            Notification::make()
                ->success()
                ->title(__('Priority created'))
                ->body(__('The priority has been created'))
                ->send();
        } else {
            $this->priority->title = $data['title'];
            $this->priority->text_color = $data['text_color'];
            $this->priority->bg_color = $data['bg_color'];
            $this->priority->icon = $data['icon'];
            $this->priority->save();
            Notification::make()
                ->success()
                ->title(__('Priority updated'))
                ->body(__('The priority\'s details has been updated'))
                ->send();
        }
        $this->emit('prioritySaved');
    }

    /**
     * Delete an existing priority
     *
     * @return void
     */
    public function doDeletePriority(): void
    {
        $this->priority->delete();
        $this->deleteConfirmationOpened = false;
        $this->emit('priorityDeleted');
        Notification::make()
            ->success()
            ->title(__('Priority deleted'))
            ->body(__('The priority has been deleted'))
            ->send();
    }

    /**
     * Cancel the deletion of a priority
     *
     * @return void
     */
    public function cancelDeletePriority(): void
    {
        $this->deleteConfirmationOpened = false;
    }

    /**
     * Show the delete priority confirmation dialog
     *
     * @return void
     * @throws \Exception
     */
    public function deletePriority(): void
    {
        $this->deleteConfirmation(
            __('Priority deletion'),
            __('Are you sure you want to delete this priority?'),
            'doDeletePriority',
            'cancelDeletePriority'
        );
    }
}


================================================
FILE: app/Http/Livewire/Administration/TicketStatuses.php
================================================
<?php

namespace App\Http\Livewire\Administration;

use App\Models\TicketStatus;
use Carbon\Carbon;
use Filament\Tables\Actions\Action;
use Filament\Tables\Columns\BooleanColumn;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Concerns\InteractsWithTable;
use Filament\Tables\Contracts\HasTable;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Relations\Relation;
use Illuminate\Support\HtmlString;
use Livewire\Component;
use pxlrbt\FilamentExcel\Actions\Tables\ExportAction;
use pxlrbt\FilamentExcel\Columns\Column;
use pxlrbt\FilamentExcel\Exports\ExcelExport;

class TicketStatuses extends Component implements HasTable
{
    use InteractsWithTable;

    public $selectedStatus;

    protected $listeners = ['statusSaved', 'statusDeleted'];

    public function render()
    {
        return view('livewire.administration.ticket-statuses');
    }

    /**
     * Table query definition
     *
     * @return Builder|Relation
     */
    protected function getTableQuery(): Builder|Relation
    {
        return TicketStatus::query();
    }

    /**
     * Table definition
     *
     * @return array
     */
    protected function getTableColumns(): array
    {
        return [
            TextColumn::make('title')
                ->label(__('Title'))
                ->searchable()
                ->sortable()
                ->formatStateUsing(fn(TicketStatus $record) => new HtmlString('
                    <span class="px-2 py-1 rounded-full text-sm"
                        style="color: ' . $record->text_color . '; background-color: ' . $record->bg_color . '">
                            ' . $record->title . '
                        </span>
                ')),

            BooleanColumn::make('default')
                ->label(__('Default status'))
                ->sortable()
                ->searchable(),

            TextColumn::make('created_at')
                ->label(__('Created at'))
                ->sortable()
                ->searchable()
                ->dateTime(),
        ];
    }

    /**
     * Table actions definition
     *
     * @return array
     */
    protected function getTableActions(): array
    {
        return [
            Action::make('edit')
                ->icon('heroicon-o-pencil')
                ->link()
                ->label(__('Edit status'))
                ->action(fn(TicketStatus $record) => $this->updateStatus($record->id))
        ];
    }

    /**
     * Table header actions definition
     *
     * @return array
     */
    protected function getTableHeaderActions(): array
    {
        return [
            ExportAction::make()
                ->label(__('Export'))
                ->color('success')
                ->icon('heroicon-o-document-download')
                ->exports([
                    ExcelExport::make()
                        ->askForWriterType()
                        ->withFilename('ticket-statuses-export')
                        ->withColumns([
                            Column::make('title')
                                ->heading(__('Title')),
                            Column::make('created_at')
                                ->heading(__('Created at'))
                                ->formatStateUsing(fn(Carbon $state) => $state->format(__('Y-m-d g:i A'))),
                        ])
                ])
        ];
    }

    /**
     * Table default sort column definition
     *
     * @return string|null
     */
    protected function getDefaultTableSortColumn(): ?string
    {
        return 'created_at';
    }

    /**
     * Table default sort direction definition
     *
     * @return string|null
     */
    protected function getDefaultTableSortDirection(): ?string
    {
        return 'desc';
    }

    /**
     * Show update status dialog
     *
     * @param $id
     * @return void
     */
    public function updateStatus($id)
    {
        $this->selectedStatus = TicketStatus::find($id);
        $this->dispatchBrowserEvent('toggleStatusModal');
    }

    /**
     * Show create status dialog
     *
     * @return void
     */
    public function createStatus()
    {
        $this->selectedStatus = new TicketStatus();
        $this->dispatchBrowserEvent('toggleStatusModal');
    }

    /**
     * Cancel and close status create / update dialog
     *
     * @return void
     */
    public function cancelStatus()
    {
        $this->selectedStatus = null;
        $this->dispatchBrowserEvent('toggleStatusModal');
    }

    /**
     * Event launched after a status is created / updated
     *
     * @return void
     */
    public function statusSaved()
    {
        $this->cancelStatus();
    }

    /**
     * Event launched after a status is deleted
     *
     * @return void
     */
    public function statusDeleted()
    {
        $this->statusSaved();
    }
}


================================================
FILE: app/Http/Livewire/Administration/TicketStatusesDialog.php
================================================
<?php

namespace App\Http\Livewire\Administration;

use App\Core\CrudDialogHelper;
use App\Models\TicketStatus;
use Filament\Forms\Components\Checkbox;
use Filament\Forms\Components\ColorPicker;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Concerns\InteractsWithForms;
use Filament\Forms\Contracts\HasForms;
use Filament\Notifications\Actions\Action;
use Filament\Notifications\Notification;
use Illuminate\Support\Str;
use Illuminate\Validation\Rules\Unique;
use Livewire\Component;

class TicketStatusesDialog extends Component implements HasForms
{
    use InteractsWithForms;
    use CrudDialogHelper;

    public TicketStatus $status;

    protected $listeners = ['doDeleteStatus', 'cancelDeleteStatus'];

    public function mount(): void
    {
        $this->form->fill([
            'title' => $this->status->title,
            'text_color' => $this->status->text_color,
            'bg_color' => $this->status->bg_color,
            'default' => $this->status->default,
        ]);
    }


    public function render()
    {
        return view('livewire.administration.ticket-statuses-dialog');
    }

    /**
     * Form schema definition
     *
     * @return array
     */
    protected function getFormSchema(): array
    {
        return [
            TextInput::make('title')
                ->label(__('Title'))
                ->maxLength(255)
                ->unique(
                    table: TicketStatus::class,
                    column: 'title',
                    ignorable: fn() => $this->status,
                    callback: function (Unique $rule) {
                        return $rule->withoutTrashed();
                    }
                )
                ->required(),

            ColorPicker::make('text_color')
                ->label(__('Text color'))
                ->required(),

            ColorPicker::make('bg_color')
                ->label(__('Background color'))
                ->required(),

            Checkbox::make('default')
                ->label(__('Default status'))
                ->helperText(__('Check this box if this status should be assigned by default to new tickets')),
        ];
    }

    /**
     * Create / Update the status
     *
     * @return void
     */
    public function save(): void
    {
        $data = $this->form->getState();
        if (!$this->status?->id) {
            $status = TicketStatus::create([
                'title' => $data['title'],
                'text_color' => $data['text_color'],
                'bg_color' => $data['bg_color'],
                'default' => $data['default'],
                'slug' => Str::slug($data['title'], '_')
            ]);
            Notification::make()
                ->success()
                ->title(__('Status created'))
                ->body(__('The status has been created'))
                ->send();
            if ($status->default) {
                TicketStatus::where('id', '<>', $status->id)->update(['default' => false]);
            }
        } else {
            $this->status->title = $data['title'];
            $this->status->text_color = $data['text_color'];
            $this->status->bg_color = $data['bg_color'];
            $this->status->default = $data['default'];
            $this->status->save();
            Notification::make()
                ->success()
                ->title(__('Status updated'))
                ->body(__('The status\'s details has been updated'))
                ->send();
            TicketStatus::where('id', '<>', $this->status->id)->update(['default' => false]);
        }
        if (TicketStatus::where('default', true)->count() === 0) {
            $first = TicketStatus::first();
            $first->default = true;
            $first->save();
        }
        $this->emit('statusSaved');
    }

    /**
     * Delete an existing status
     *
     * @return void
     */
    public function doDeleteStatus(): void
    {
        $this->status->delete();
        $this->deleteConfirmationOpened = false;
        $this->emit('statusDeleted');
        Notification::make()
            ->success()
            ->title(__('Status deleted'))
            ->body(__('The status has been deleted'))
            ->send();
    }

    /**
     * Cancel the deletion of a status
     *
     * @return void
     */
    public function cancelDeleteStatus(): void
    {
        $this->deleteConfirmationOpened = false;
    }

    /**
     * Show the delete status confirmation dialog
     *
     * @return void
     * @throws \Exception
     */
    public function deleteStatus(): void
    {
        $this->deleteConfirmation(
            __('Status deletion'),
            __('Are you sure you want to delete this status?'),
            'doDeleteStatus',
            'cancelDeleteStatus'
        );
    }
}


================================================
FILE: app/Http/Livewire/Administration/TicketTypes.php
================================================
<?php

namespace App\Http\Livewire\Administration;

use App\Models\TicketType;
use Carbon\Carbon;
use Filament\Tables\Actions\Action;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Concerns\InteractsWithTable;
use Filament\Tables\Contracts\HasTable;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Relations\Relation;
use Illuminate\Support\HtmlString;
use Livewire\Component;
use pxlrbt\FilamentExcel\Actions\Tables\ExportAction;
use pxlrbt\FilamentExcel\Columns\Column;
use pxlrbt\FilamentExcel\Exports\ExcelExport;

class TicketTypes extends Component implements HasTable
{
    use InteractsWithTable;

    public $selectedType;

    protected $listeners = ['typeSaved', 'typeDeleted'];

    public function render()
    {
        return view('livewire.administration.ticket-types');
    }

    /**
     * Table query definition
     *
     * @return Builder|Relation
     */
    protected function getTableQuery(): Builder|Relation
    {
        return TicketType::query();
    }

    /**
     * Table definition
     *
     * @return array
     */
    protected function getTableColumns(): array
    {
        return [
            TextColumn::make('title')
                ->label(__('Title'))
                ->searchable()
                ->sortable()
                ->formatStateUsing(fn(TicketType $record) => new HtmlString('
                    <span
                        class="px-2 py-1 rounded-full text-sm flex items-center gap-2"
                        style="color: ' . $record->text_color . '; background-color: ' . $record->bg_color . '"
                    >
                    <i class="fa ' . $record->icon . '"></i>' . $record->title . '
                    </span>
                ')),

            TextColumn::make('created_at')
                ->label(__('Created at'))
                ->sortable()
                ->searchable()
                ->dateTime(),
        ];
    }

    /**
     * Table actions definition
     *
     * @return array
     */
    protected function getTableActions(): array
    {
        return [
            Action::make('edit')
                ->icon('heroicon-o-pencil')
                ->link()
                ->label(__('Edit type'))
                ->action(fn(TicketType $record) => $this->updateType($record->id))
        ];
    }

    /**
     * Table header actions definition
     *
     * @return array
     */
    protected function getTableHeaderActions(): array
    {
        return [
            ExportAction::make()
                ->label(__('Export'))
                ->color('success')
                ->icon('heroicon-o-document-download')
                ->exports([
                    ExcelExport::make()
                        ->askForWriterType()
                        ->withFilename('ticket-types-export')
                        ->withColumns([
                            Column::make('title')
                                ->heading(__('Title')),
                            Column::make('created_at')
                                ->heading(__('Created at'))
                                ->formatStateUsing(fn(Carbon $state) => $state->format(__('Y-m-d g:i A'))),
                        ])
                ])
        ];
    }

    /**
     * Table default sort column definition
     *
     * @return string|null
     */
    protected function getDefaultTableSortColumn(): ?string
    {
        return 'created_at';
    }

    /**
     * Table default sort direction definition
     *
     * @return string|null
     */
    protected function getDefaultTableSortDirection(): ?string
    {
        return 'desc';
    }

    /**
     * Show update type dialog
     *
     * @param $id
     * @return void
     */
    public function updateType($id)
    {
        $this->selectedType = TicketType::find($id);
        $this->dispatchBrowserEvent('toggleTypeModal');
    }

    /**
     * Show create type dialog
     *
     * @return void
     */
    public function createType()
    {
        $this->selectedType = new TicketType();
        $this->dispatchBrowserEvent('toggleTypeModal');
    }

    /**
     * Cancel and close type create / update dialog
     *
     * @return void
     */
    public function cancelType()
    {
        $this->selectedType = null;
        $this->dispatchBrowserEvent('toggleTypeModal');
    }

    /**
     * Event launched after a type is created / updated
     *
     * @return void
     */
    public function typeSaved()
    {
        $this->cancelType();
    }

    /**
     * Event launched after a type is deleted
     *
     * @return void
     */
    public function typeDeleted()
    {
        $this->typeSaved();
    }
}



================================================
FILE: app/Http/Livewire/Administration/TicketTypesDialog.php
================================================
<?php

namespace App\Http\Livewire\Administration;

use App\Core\CrudDialogHelper;
use App\Models\Icon;
use App\Models\TicketType;
use Closure;
use Filament\Forms\Components\ColorPicker;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Concerns\InteractsWithForms;
use Filament\Forms\Contracts\HasForms;
use Filament\Notifications\Notification;
use Illuminate\Support\HtmlString;
use Illuminate\Support\Str;
use Illuminate\Validation\Rules\Unique;
use Livewire\Component;

class TicketTypesDialog extends Component implements HasForms
{
    use InteractsWithForms;
    use CrudDialogHelper;

    public TicketType $type;

    protected $listeners = ['doDeleteType', 'cancelDeleteType'];

    public function mount(): void
    {
        $this->form->fill([
            'title' => $this->type->title,
            'text_color' => $this->type->text_color,
            'bg_color' => $this->type->bg_color,
            'icon' => $this->type->icon,
        ]);
    }


    public function render()
    {
        return view('livewire.administration.ticket-types-dialog');
    }

    /**
     * Form schema definition
     *
     * @return array
     */
    protected function getFormSchema(): array
    {
        return [
            TextInput::make('title')
                ->label(__('Title'))
                ->maxLength(255)
                ->unique(
                    table: TicketType::class,
                    column: 'title',
                    ignorable: fn() => $this->type,
                    callback: function (Unique $rule) {
                        return $rule->withoutTrashed();
                    }
                )
                ->required(),

            ColorPicker::make('text_color')
                ->label(__('Text color'))
                ->required(),

            ColorPicker::make('bg_color')
                ->label(__('Background color'))
                ->required(),

            Select::make('icon')
                ->label(__('Icon'))
                ->reactive()
                ->searchable()
                ->required()
                ->getSearchResultsUsing(
                    fn(string $search) => Icon::where('icon', 'like', "%{$search}%")
                        ->limit(50)
                        ->pluck('icon', 'icon')
                )
                ->getOptionLabelUsing(fn($value): ?string => Icon::where('icon', $value)->first()?->icon)
                ->hint(
                    fn(Closure $get) => $get('icon') ?
                        new HtmlString(
                            __('Selected icon:') . ' <i class="fa fa-2x ' . $get('icon') . '"></i>')
                        :
                        ''
                )
                ->helperText(
                    new HtmlString(
                        __(
                            "Check the <a href='https://fontawesome.com/icons'
                                    target='_blank' class='text-blue-500 underline'>
                                    fontawesome icons here
                                 </a> to choose your right icon"))),
        ];
    }

    /**
     * Create / Update the type
     *
     * @return void
     */
    public function save(): void
    {
        $data = $this->form->getState();
        if (!$this->type?->id) {
            TicketType::create([
                'title' => $data['title'],
                'text_color' => $data['text_color'],
                'bg_color' => $data['bg_color'],
                'icon' => $data['icon'],
                'slug' => Str::slug($data['title'], '_')
            ]);
            Notification::make()
                ->success()
                ->title(__('Type created'))
                ->body(__('The type has been created'))
                ->send();
        } else {
            $this->type->title = $data['title'];
            $this->type->text_color = $data['text_color'];
            $this->type->bg_color = $data['bg_color'];
            $this->type->icon = $data['icon'];
            $this->type->save();
            Notification::make()
                ->success()
                ->title(__('Type updated'))
                ->body(__('The type\'s details has been updated'))
                ->send();
        }
        $this->emit('typeSaved');
    }

    /**
     * Delete an existing type
     *
     * @return void
     */
    public function doDeleteType(): void
    {
        $this->type->delete();
        $this->deleteConfirmationOpened = false;
        $this->emit('typeDeleted');
        Notification::make()
            ->success()
            ->title(__('Type deleted'))
            ->body(__('The type has been deleted'))
            ->send();
    }

    /**
     * Cancel the deletion of a type
     *
     * @return void
     */
    public function cancelDeleteType(): void
    {
        $this->deleteConfirmationOpened = false;
    }

    /**
     * Show the delete type confirmation dialog
     *
     * @return void
     * @throws \Exception
     */
    public function deleteType(): void
    {
        $this->deleteConfirmation(
            __('Type deletion'),
            __('Are you sure you want to delete this type?'),
            'doDeleteType',
            'cancelDeleteType'
        );
    }
}


================================================
FILE: app/Http/Livewire/Administration/Users.php
================================================
<?php

namespace App\Http\Livewire\Administration;

use App\Models\User;
use App\Notifications\UserCreatedNotification;
use Carbon\Carbon;
use Filament\Notifications\Notification;
use Filament\Tables\Actions\Action;
use Filament\Tables\Columns\BooleanColumn;
use Filament\Tables\Columns\TagsColumn;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Concerns\InteractsWithTable;
use Filament\Tables\Contracts\HasTable;
use Filament\Tables\Filters\SelectFilter;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Relations\Relation;
use Livewire\Component;
use pxlrbt\FilamentExcel\Actions\Tables\ExportAction;
use pxlrbt\FilamentExcel\Columns\Column;
use pxlrbt\FilamentExcel\Exports\ExcelExport;

class Users extends Component implements HasTable
{
    use InteractsWithTable;

    public $selectedUser;

    protected $listeners = ['userSaved', 'userDeleted'];

    public function render()
    {
        return view('livewire.administration.users');
    }

    /**
     * Table query definition
     *
     * @return Builder|Relation
     */
    protected function getTableQuery(): Builder|Relation
    {
        $query = User::query();
        if (auth()->user()->can('View company users') && !auth()->user()->can('View all users')) {
            $query->whereHas(
                'companies',
                fn($query) => $query->whereIn(
                    'companies.id',
                    auth()->user()->ownCompanies->pluck('id')->toArray()
                )
            );
        } elseif (!auth()->user()->can('View all users')) {
            // Get empty list
            $query->whereNull('id');
        }
        return $query;
    }

    /**
     * Table definition
     *
     * @return array
     */
    protected function getTableColumns(): array
    {
        return [
            TextColumn::make('name')
                ->label(__('Full name'))
                ->searchable()
                ->sortable(),

            BooleanColumn::make('isAccountActivated')
                ->label(__('Account activated')),

            TagsColumn::make('roles.name')
                ->label(__('User roles'))
                ->limit(1)
                ->visible(fn() => auth()->user()->can('Assign permissions'))
                ->searchable()
                ->sortable(),

            TagsColumn::make('companies.name')
                ->label(__('Companies'))
                ->limit(1)
                ->searchable()
                ->sortable(),

            TextColumn::make('created_at')
                ->label(__('Created at'))
                ->sortable()
                ->searchable()
                ->dateTime(),
        ];
    }

    /**
     * Table actions definition
     *
     * @return array
     */
    protected function getTableActions(): array
    {
        return [
            Action::make('resend_email_registration')
                ->icon('heroicon-o-at-symbol')
                ->link()
                ->color('warning')
                ->label(__('Resend activation email'))
                ->visible(fn(User $record) => $record->register_token && auth()->user()->can('Update users'))
                ->action(fn(User $record) => $this->resendActivationEmail($record->id)),

            Action::make('edit')
                ->icon('heroicon-o-pencil')
                ->link()
                ->label(__('Edit user'))
                ->visible(fn() => auth()->user()->can('Update users'))
                ->action(fn(User $record) => $this->updateUser($record->id))
        ];
    }

    /**
     * Table header actions definition
     *
     * @return array
     */
    protected function getTableHeaderActions(): array
    {
        return [
            ExportAction::make()
                ->label(__('Export'))
                ->color('success')
                ->icon('heroicon-o-document-download')
                ->exports([
                    ExcelExport::make()
                        ->askForWriterType()
                        ->withFilename('users-export')
                        ->withColumns([
                            Column::make('name')
                                ->heading(__('Full name')),
                            Column::make('companies')
                                ->heading(__('Companies'))
                                ->formatStateUsing(
                                    fn(User $record) => $record->companies->pluck('name')->join(', ')
                                ),
                            Column::make('roles')
                                ->heading(__('User roles'))
                                ->formatStateUsing(
                                    fn(User $record) => $record->roles->pluck('name')->join(', ')
                                ),
                            Column::make('created_at')
                                ->heading(__('Created at'))
                                ->formatStateUsing(fn(Carbon $state) => $state->format(__('Y-m-d g:i A'))),
                        ])
                ])
        ];
    }

    /**
     * Table default sort column definition
     *
     * @return string|null
     */
    protected function getDefaultTableSortColumn(): ?string
    {
        return 'created_at';
    }

    /**
     * Table default sort direction definition
     *
     * @return string|null
     */
    protected function getDefaultTableSortDirection(): ?string
    {
        return 'desc';
    }

    /**
     * Table filters definition
     *
     * @return array
     */
    protected function getTableFilters(): array
    {
        return [
            SelectFilter::make('isAccountActivated')
                ->label(__('Account activated'))
                ->placeholder(__('All users'))
                ->options([
                    'yes' => __('Yes'),
                    'no' => __('No'),
                ])
                ->query(function ($state, $query) {
                    if ($state['value'] === 'yes') {
                        $query->whereNull('register_token');
                    }
                    if ($state['value'] === 'no') {
                        $query->whereNotNull('register_token');
                    }
                })
        ];
    }

    /**
     * Show update user dialog
     *
     * @param $id
     * @return void
     */
    public function updateUser($id)
    {
        $this->selectedUser = User::find($id);
        $this->dispatchBrowserEvent('toggleUserModal');
    }

    /**
     * Show create user dialog
     *
     * @return void
     */
    public function createUser()
    {
        $this->selectedUser = new User();
        $this->dispatchBrowserEvent('toggleUserModal');
    }

    /**
     * Cancel and close user create / update dialog
     *
     * @return void
     */
    public function cancelUser()
    {
        $this->selectedUser = null;
        $this->dispatchBrowserEvent('toggleUserModal');
    }

    /**
     * Event launched after a user is created / updated
     *
     * @return void
     */
    public function userSaved()
    {
        $this->cancelUser();
    }

    /**
     * Event launched after a user is deleted
     *
     * @return void
     */
    public function userDeleted()
    {
        $this->userSaved();
    }

    /**
     * Resend the account activation email to a specific user
     *
     * @param int $userId
     * @return void
     */
    public function resendActivationEmail(int $userId)
    {
        $user = User::find($userId);
        if ($user->register_token) {
            $user->notify(new UserCreatedNotification($user));
            Notification::make()
                ->success()
                ->title(__('Success'))
                ->body(__('An email has been sent to the user'))
                ->send();
        }
    }
}


================================================
FILE: app/Http/Livewire/Administration/UsersDialog.php
================================================
<?php

namespace App\Http\Livewire\Administration;

use App\Core\CrudDialogHelper;
use App\Models\CompanyUser;
use App\Models\User;
use App\Notifications\UserCreatedNotification;
use Closure;
use Filament\Forms\Components\CheckboxList;
use Filament\Forms\Components\Grid;
use Filament\Forms\Components\Radio;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Concerns\InteractsWithForms;
use Filament\Forms\Contracts\HasForms;
use Filament\Notifications\Actions\Action;
use Filament\Notifications\Notification;
use Illuminate\Support\HtmlString;
use Livewire\Component;
use Ramsey\Uuid\Uuid;
use Spatie\Permission\Models\Permission;
use Spatie\Permission\Models\Role;

class UsersDialog extends Component implements HasForms
{
    use InteractsWithForms;
    use CrudDialogHelper;

    public User $user;

    protected $listeners = ['doDeleteUser', 'cancelDeleteUser'];

    public array $roles;

    public function mount(): void
    {
        $this->form->fill([
            'name' => $this->user->name,
            'email' => $this->user->email,
            'locale' => $this->user->locale ?? config('app.locale'),
            'roles' => $this->user->roles->pluck('id')->toArray(),
        ]);
    }


    public function render()
    {
        return view('livewire.administration.users-dialog');
    }

    /**
     * Form schema definition
     *
     * @return array
     */
    protected function getFormSchema(): array
    {
        return [
            Grid::make()
                ->schema([
                    TextInput::make('name')
                        ->label(__('Full name'))
                        ->maxLength(255)
                        ->required(),

                    TextInput::make('email')
                        ->label(__('Email address'))
                        ->email()
                        ->unique(
                            table: User::class,
                            column: 'email',
                            ignorable: fn() => $this->user->id ? $this->user : null
                        )
                        ->required(),
                ]),

            Grid::make(2)
                ->schema([
                    Radio::make('locale')
                        ->label(__('Default language'))
                        ->options(locales())
                        ->columnSpan(2)
                        ->required(),

                    Select::make('company')
                        ->label(__('Company'))
                        ->columnSpan(1)
                        ->visible(
                            fn() => !$this->user?->id
                                && (
                                    auth()->user()->can('View own companies')
                                    && !auth()->user()->can('View all companies')
                                )
                        )
                        ->options(fn() => auth()->user()->ownCompanies->pluck('name', 'id')->toArray()),
                ]),

            CheckboxList::make('roles')
                ->label(__('User roles'))
                ->hint(new HtmlString('
                    <div class="w-full flex items-center gap-2">
                        <button type="button"
                            class="text-xs text-primary-500 hover:text-primary-600 hover:underline"
                            wire:click="assignAllRoles">
                            ' . __('Assign all roles') . '
                        </button>
                        <span class="text-xs text-gray-300">|</span>
                        <button type="button"
                            class="text-xs text-primary-500 hover:text-primary-600 hover:underline"
                            wire:click="removeAllRoles">
                            ' . __('Remove all roles') . '
                        </button>
                    </div>
                '))
                ->options(Role::orderBy('name')->get()->pluck('name', 'id')->toArray())
        ];
    }

    /**
     * Assign all permissions
     *
     * @return void
     */
    public function assignAllRoles(): void
    {
        $this->roles = Role::all()->pluck('id')->toArray();
    }

    /**
     * Remove all assigned permissions
     *
     * @return void
     */
    public function removeAllRoles(): void
    {
        $this->roles = [];
    }

    /**
     * Create / Update the user
     *
     * @return void
     */
    public function save(): void
    {
        $data = $this->form->getState();
        if (!$this->user?->id) {
            $user = User::create([
                'name' => $data['name'],
                'email' => $data['email'],
                'locale' => $data['locale'],
                'password' => bcrypt(uniqid()),
                'register_token' => Uuid::uuid4()->toString()
            ]);
            $user->syncRoles($this->roles);
            $user->notify(new UserCreatedNotification($user));
            Notification::make()
                ->success()
                ->title(__('User created'))
                ->body(__('An email has been sent to the user'))
                ->send();
            if (isset($data['company'])) {
                CompanyUser::create([
                    'user_id' => $user->id,
                    'company_id' => $data['company']
                ]);
            }
        } else {
            $this->user->name = $data['name'];
            $this->user->email = $data['email'];
            $this->user->locale = $data['locale'];
            $this->user->save();
            $this->user->syncRoles($this->roles);
            Notification::make()
                ->success()
                ->title(__('User updated'))
                ->body(__('The user\'s details has been updated'))
                ->send();

            if ($this->user->id == auth()->user()->id) {
                session()->put('locale', $this->user->locale);
            }
            if (isset($data['company'])) {
                CompanyUser::create([
                    'user_id' => $this->user->id,
                    'company_id' => $data['company']
                ]);
            }
        }
        $this->emit('userSaved');
    }

    /**
     * Delete an existing user
     *
     * @return void
     */
    public function doDeleteUser(): void
    {
        $this->user->delete();
        $this->deleteConfirmationOpened = false;
        $this->emit('userDeleted');
        Notification::make()
            ->success()
            ->title(__('User deleted'))
            ->body(__('The user has been deleted'))
            ->send();
    }

    /**
     * Cancel the deletion of a user
     *
     * @return void
     */
    public function cancelDeleteUser(): void
    {
        $this->deleteConfirmationOpened = false;
    }

    /**
     * Show the delete user confirmation dialog
     *
     * @return void
     * @throws \Exception
     */
    public function deleteUser(): void
    {
        $this->deleteConfirmation(
            __('User deletion'),
            __('Are you sure you want to delete this user?'),
            'doDeleteUser',
            'cancelDeleteUser'
        );
    }
}


================================================
FILE: app/Http/Livewire/Analytics.php
================================================
<?php

namespace App\Http\Livewire;

use App\Models\Project;
use App\Models\Ticket;
use App\Models\TicketStatus;
use Livewire\Component;

class Analytics extends Component
{
    public $assignedTickets;
    public $notAssignedTickets;
    public $ticketsAssignments;
    public $ticketsByStatuses;

    public function mount(): void
    {
        $this->loadAssignedTickets();
        $this->loadNotAssignedTickets();
        $this->loadTicketsAssignments();
        $this->loadTicketsByStatuses();
    }

    public function render()
    {
        return view('livewire.analytics');
    }

    /**
     * Load authenticated user assigned tickets
     *
     * @return void
     */
    private function loadAssignedTickets(): void
    {
        $this->assignedTickets = Ticket::where('responsible_id', auth()->user()->id)->get();
    }

    /**
     * Load not assigned tickets
     *
     * @return void
     */
    private function loadNotAssignedTickets(): void
    {
        $this->notAssignedTickets = Ticket::whereNull('responsible_id')->get();
    }

    /**
     * Load tickets assignements
     *
     * @return void
     */
    private function loadTicketsAssignments(): void
    {
        $query = Ticket::query();
        if (auth()->user()->can('View own tickets') && !auth()->user()->can('View all tickets')) {
            $query->where(function ($query) {
                $query->where('owner_id', auth()->user()->id)
                    ->orWhere('responsible_id', auth()->user()->id);
            });
        }
        $tickets = $query->get()->groupBy('responsible_id')->sort(function ($a, $b) {
            return ($a->first()->responsible_id ?? 0) > ($b->first()->responsibe_id ?? 0);
        });
        $this->ticketsAssignments = [];
        foreach ($tickets as $ticket) {
            $this->ticketsAssignments[$ticket->first()->responsible?->name ?? __('Unassigned')] = $ticket->count();
        }
    }

    /**
     * Load tickets by statuses
     *
     * @return void
     */
    private function loadTicketsByStatuses(): void
    {
        $query = Ticket::query();
        if (auth()->user()->can('View own tickets') && !auth()->user()->can('View all tickets')) {
            $query->where(function ($query) {
                $query->where('owner_id', auth()->user()->id)
                    ->orWhere('responsible_id', auth()->user()->id);
            });
        }
        $tickets = $query->get()->groupBy('status');
        $this->ticketsByStatuses = [];
        $statuses = TicketStatus::all();
        foreach ($tickets as $ticket) {
            $status = $statuses->where('slug', $ticket->first()->status)->first();
            if ($status) {
                $this->ticketsByStatuses[$status->title] = $ticket->count();
            }
        }
    }
}


================================================
FILE: app/Http/Livewire/Auth/ActivateAccount.php
================================================
<?php

namespace App\Http\Livewire\Auth;

use App\Models\User;
use App\Notifications\UserActivatedNotification;
use Filament\Forms\Concerns\InteractsWithForms;
use Filament\Forms\Contracts\HasForms;
use Illuminate\Support\Facades\Auth;
use Livewire\Component;
use Phpsa\FilamentPasswordReveal\Password;

class ActivateAccount extends Component implements HasForms
{
    use InteractsWithForms;

    public User $user;

    public function mount(): void
    {
        $this->form->fill();
    }

    public function render()
    {
        return view('livewire.auth.activate-account');
    }

    /**
     * Form schema definition
     *
     * @return array
     */
    protected function getFormSchema(): array
    {
        return [
            Password::make('password')
                ->label(__('Choose a password'))
                ->disableLabel()
                ->placeholder(__('Choose a password'))
                ->required()
                ->rule('confirmed'),

            Password::make('password_confirmation')
                ->label(__('Confirm your password'))
                ->disableLabel()
                ->placeholder(__('Confirm your password'))
                ->required()
                ->dehydrated(false),
        ];
    }

    /**
     * Activate the user's account
     *
     * @return void
     */
    public function activate(): void
    {
        $data = $this->form->getState();
        $this->user->password = bcrypt($data['password']);
        $this->user->register_token = null;
        $this->user->save();
        $this->user->notify(new UserActivatedNotification());
        Auth::login($this->user);
        session()->put('locale', $this->user->locale);
        redirect()->to(route('home'));
    }
}


================================================
FILE: app/Http/Livewire/Auth/ForgotPassword.php
================================================
<?php

namespace App\Http\Livewire\Auth;

use App\Models\User;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Concerns\InteractsWithForms;
use Filament\Forms\Contracts\HasForms;
use Filament\Notifications\Notification;
use Illuminate\Validation\ValidationException;
use Livewire\Component;
use Illuminate\Support\Facades\Password as PasswordFacade;

class ForgotPassword extends Component implements HasForms
{
    use InteractsWithForms;

    public function mount()
    {
        $this->form->fill([]);
    }

    public function render()
    {
        return view('livewire.auth.forgot-password');
    }

    /**
     * Form schema definition
     *
     * @return array
     */
    protected function getFormSchema(): array
    {
        return [
            TextInput::make('email')
                ->label(__('Email address'))
                ->disableLabel()
                ->placeholder(__('Email address'))
                ->email()
                ->exists(table: User::class, column: 'email')
                ->required(),
        ];
    }

    /**
     * Forgot password main function
     *
     * @return void
     * @throws ValidationException
     */
    public function forgotPassword(): void
    {
        $data = $this->form->getState();
        $status = PasswordFacade::sendResetLink([
            'email' => $data['email']
        ]);
        if ($status === PasswordFacade::RESET_LINK_SENT) {
            Notification::make()
                ->success()
                ->title(__('Success'))
                ->body(__('A password recovery email has been sent'))
                ->send();
            $this->form->fill();
        } else {
            throw ValidationException::withMessages([
                'email' => __('These credentials do not match our records.'),
            ]);
        }
    }
}


================================================
FILE: app/Http/Livewire/Auth/Login.php
================================================
<?php

namespace App\Http\Livewire\Auth;

use DanHarrin\LivewireRateLimiting\Exceptions\TooManyRequestsException;
use DanHarrin\LivewireRateLimiting\WithRateLimiting;
use Filament\Forms\Components\Checkbox;
use Filament\Forms\Components\Grid;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Concerns\InteractsWithForms;
use Filament\Forms\Contracts\HasForms;
use Filament\Notifications\Notification;
use Illuminate\Support\Facades\Auth;
use Illuminate\Validation\ValidationException;
use Livewire\Component;
use Phpsa\FilamentPasswordReveal\Password;

class Login extends Component implements HasForms
{
    use InteractsWithForms;
    use WithRateLimiting;

    public function mount()
    {
        $this->form->fill([
            'email' => null,
            'password' => null,
            'remember' => false
        ]);
    }

    public function render()
    {
        if (session()->get('password_reset')) {
            Notification::make()
                ->success()
                ->title(__('Success'))
                ->body(__('Your password is now updated'))
                ->send();
        }
        return view('livewire.auth.login');
    }

    /**
     * Form schema definition
     *
     * @return array
     */
    protected function getFormSchema(): array
    {
        return [
            TextInput::make('email')
                ->label(__('Email address'))
                ->email()
                ->disableLabel()
                ->placeholder(__('Email address'))
                ->required(),

            Password::make('password')
                ->label(__('Password'))
                ->disableLabel()
                ->placeholder(__('Password'))
                ->required(),

            Checkbox::make('remember')
                ->label(__('Remember me')),
        ];
    }

    /**
     * Login the user main function
     *
     * @return void
     * @throws ValidationException
     */
    public function login(): void
    {
        try {
            $this->rateLimit(5);
        } catch (TooManyRequestsException $exception) {
            throw ValidationException::withMessages([
                'email' => __('Too many login attempts. Please try again in :seconds seconds.', [
                    'seconds' => $exception->secondsUntilAvailable
                ])
            ]);
        }

        $data = $this->form->getState();
        if (!Auth::attempt([
            'email' => $data['email'],
            'password' => $data['password'],
        ], $data['remember'])) {
            throw ValidationException::withMessages([
                'email' => __('These credentials do not match our records.'),
            ]);
        }

        session()->put('locale', auth()->user()->locale);
        redirect()->to(route('home'));

    }
}


================================================
FILE: app/Http/Livewire/Auth/RecoverPassword.php
================================================
<?php

namespace App\Http\Livewire\Auth;

use App\Models\User;
use Filament\Forms\Components\Checkbox;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Concerns\InteractsWithForms;
use Filament\Forms\Contracts\HasForms;
use Filament\Notifications\Notification;
use Illuminate\Auth\Events\PasswordReset;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;
use Illuminate\Validation\ValidationException;
use Livewire\Component;
use Phpsa\FilamentPasswordReveal\Password;
use Illuminate\Support\Facades\Password as PasswordFacade;

class RecoverPassword extends Component implements HasForms
{
    use InteractsWithForms;

    public $token;

    public function mount(string $token)
    {
        $this->token = $token;
        $this->form->fill([
            'email' => request()->get('email') ?? null,
            'password' => null,
            'password_confirmation' => null
        ]);
    }

    public function render()
    {
        return view('livewire.auth.recover-password');
    }

    /**
     * Form schema definition
     *
     * @return array
     */
    protected function getFormSchema(): array
    {
        return [
            TextInput::make('email')
                ->label(__('Email address'))
                ->disableLabel()
                ->placeholder(__('Email address'))
                ->email()
                ->exists(table: User::class, column: 'email')
                ->required(),

            Password::make('password')
                ->label(__('New password'))
                ->rule('confirmed')
                ->disableLabel()
                ->placeholder(__('New password'))
                ->required(),

            Password::make('password_confirmation')
                ->label(__('Password confirmation'))
                ->disableLabel()
                ->placeholder(__('Password confirmation'))
                ->required(),
        ];
    }

    /**
     * Recover a password main function
     *
     * @return void
     * @throws ValidationException
     */
    public function recoverPassword(): void
    {
        $data = $this->form->getState();

        $status = PasswordFacade::reset([
            'email' => $data['email'],
            'password' => $data['password'],
            'password_confirmation' => $data['password_confirmation'],
            'token' => $this->token
        ], function ($user, $password) {
            $user->forceFill([
                'password' => Hash::make($password)
            ])->setRememberToken(Str::random(60));
            $user->save();
            event(new PasswordReset($user));
        });

        if ($status === PasswordFacade::PASSWORD_RESET) {
            session()->flash('password_reset', true);
            redirect()->to(route('auth.login'));
        } else {
            throw ValidationException::withMessages([
                'email' => __('These credentials do not match our records.'),
            ]);
        }
    }
}


================================================
FILE: app/Http/Livewire/Chat.php
================================================
<?php

namespace App\Http\Livewire;

use App\Models\Chat as Model;
use App\Models\Ticket;
use Filament\Forms\Components\RichEditor;
use Filament\Forms\Concerns\InteractsWithForms;
use Filament\Forms\Contracts\HasForms;
use Livewire\Component;

class Chat extends Component implements HasForms
{
    use InteractsWithForms;

    public Ticket $ticket;

    public function mount(): void
    {
        $this->form->fill();
    }

    public function render()
    {
        $messages = Model::where('ticket_id', $this->ticket->id)->get();
        return view('livewire.chat', compact('messages'));
    }

    /**
     * Form schema definition
     *
     * @return array
     */
    protected function getFormSchema(): array
    {
        return [
            RichEditor::make('message')
                ->label(__('Type a message..'))
                ->disableLabel()
                ->placeholder(__('Type a message..'))
                ->required()
                ->fileAttachmentsDisk(config('filesystems.default'))
                ->fileAttachmentsDirectory('chat')
                ->fileAttachmentsVisibility('private'),
        ];
    }

    /**
     * Send a message
     *
     * @return void
     */
    public function send(): void
    {
        $data = $this->form->getState();
        Model::create([
            'message' => $data['message'],
            'user_id' => auth()->user()->id,
            'ticket_id' => $this->ticket->id
        ]);
        $this->form->fill();
    }
}


================================================
FILE: app/Http/Livewire/Kanban.php
================================================
<?php

namespace App\Http\Livewire;

use App\Jobs\TicketUpdatedJob;
use App\Models\Ticket;
use App\Models\TicketPriority;
use App\Models\TicketType;
use Filament\Notifications\Notification;
use Illuminate\Support\Collection;
use Illuminate\Support\HtmlString;
use Illuminate\Support\Str;
use InvadersXX\FilamentKanbanBoard\Pages\FilamentKanbanBoard;

class Kanban extends FilamentKanbanBoard
{
    protected static ?string $title = '';
    public bool $sortable = true;
    public bool $sortableBetweenStatuses = true;
    public bool $recordClickEnabled = true;

    /**
     * Statuses list Definition
     *
     * @return Collection
     */
    protected function statuses(): Collection
    {
        return collect(statuses_list_for_kanban());
    }

    /**
     * Records list definitino
     *
     * @return Collection
     */
    protected function records(): Collection
    {
        $query = Ticket::query();
        $query->withCount('comments');
        if (auth()->user()->can('View own tickets') && !auth()->user()->can('View all tickets')) {
            $query->where(function ($query) {
                $query->where('owner_id', auth()->user()->id)
                    ->orWhere('responsible_id', auth()->user()->id)
                    ->orWhereHas('project', function ($query) {
                        $query->whereHas('company', function ($query) {
                            $query->whereIn('companies.id', auth()->user()->ownCompanies->pluck('id')->toArray());
                        });
                    });
            });
        }
        return $query->get()
            ->map(function (Ticket $ticket) {
                $priority = TicketPriority::where('slug', $ticket->priority)->withTrashed()->first();
                $type = TicketType::where('slug', $ticket->type)->withTrashed()->first();
                return [
                    'id' => $ticket->id,
                    'title' => new HtmlString('
                        <div class="w-full flex flex-col space-y-3">
                            <div class="w-full flex items-center gap-2">
                                ' . ($type ? '
                                    <div title="' . $type['title'] . '"
                                        class="text-xs rounded-full w-6 h-6 flex items-center
                                            justify-center text-center"
                                        style="color: ' . $type->text_color . ';
                                            background-color: ' . $type->bg_color . ';"
                                        >
                                        <i class="fa ' . $type['icon'] . '"></i>
                                    </div>
                                ' : '') . '
                                ' . ($priority ? '
                                    <div title="' . $priority['title'] . '"
                                        class="text-xs rounded-full w-6 h-6 flex items-center
                                            justify-center text-center"
                                        style="
                                            color: ' . $priority->text_color . ';
                                            background-color: ' . $priority->bg_color . ';
                                        "
                                        >
                                        <i class="fa ' . $priority['icon'] . '"></i>
                                    </div>
                                ' : '') . '
                                <span class="text-sm font-normal"
                                    title="' . $ticket->title . '">
                                    ' . Str::limit($ticket->title, 15) . '
                                </span>
                            </div>
                            <div class="w-full text-xs font-light">
                                ' . Str::limit(htmlspecialchars(strip_tags($ticket->content))) . '
                            </div>
                            <div class="w-full flex items-center space-x-4">
                                <div class="flex items-center gap-1">
                                    ' .
                                        ($ticket->responsible ? '
                                            <img src="' . $ticket->responsible->avatar_url . '"
                                                alt="' . $ticket->responsible->name . '"
                                                class="rounded-full shadow"
                                                style="width: 20px; height: 20px;"
                                            />
                                            <span class="font-light text-xs">' . $ticket->responsible->name . '</span>
                                        ' : '<span class="text-xs font-normal text-gray-400">
                                                ' . __('Not assigned yet!') .
                                            '</span>')
                        . '
                                </div>
                                <div class="flex items-center gap-1 text-xs text-gray-500">
                                    ' . $ticket->comments_count . '
                                    <i class="fa fa-comment-o"></i>
                                </div>
                            </div>
                        </div>
                    '),
                    'status' => $ticket->status,
                ];
            });
    }

    /**
     * Customizing kanban board styles
     *
     * @return string[]
     */
    protected function styles(): array
    {
        return [
            'wrapper' => 'w-full h-full flex space-x-4 overflow-x-auto',
            'kanbanWrapper' => 'h-full flex-1',
            'kanban' => 'border border-gray-150 flex flex-col h-full rounded',
            'kanbanHeader' => 'px-3 py-3 font-bold text-xs w-full border-b border-gray-150',
            'kanbanFooter' => '',
            'kanbanRecords' => 'space-y-4 p-3 flex-1 overflow-y-auto w-64',
            'record' => 'bg-white dark:bg-gray-800 p-4 border border-gray-150 rounded
                        cursor-pointer w-62 hover:bg-gray-50 hover:shadow-lg',
            'recordContent' => 'w-full',
        ];
    }

    /**
     * Event launched when the record status is changed
     *
     * @param $recordId
     * @param $statusId
     * @param $fromOrderedIds
     * @param $toOrderedIds
     * @return void
     */
    public function onStatusChanged($recordId, $statusId, $fromOrderedIds, $toOrderedIds): void
    {
        $ticket = Ticket::find($recordId);
        if (
            (
                auth()->user()->can('Update all tickets')
                || (
                    auth()->user()->can('Update own tickets')
                    && (
                        $ticket->owner_id === auth()->user()
                        || $ticket->responsible_id === auth()->user()->id)
                )
            )
            && auth()->user()->can('Change status tickets')
        ) {
            $before = __(config('system.statuses.' . $ticket->status . '.title')) ?? '-';
            $ticket->status = $statusId;
            $ticket->save();
            Notification::make()
                ->success()
                ->title(__('Status updated'))
                ->body(__('The ticket status has been successfully updated'))
                ->send();
            TicketUpdatedJob::dispatch(
                $ticket,
                __('Status'),
                $before,
                __(config('system.statuses.' . $ticket->status . '.title') ?? '-'),
                auth()->user()
            );
        } else {
            Notification::make()
                ->success()
                ->title(__('Oops!'))
                ->body(__("You don't have permissions to change this ticket status"))
                ->send();
        }
    }

    /**
     * Event launched when the record is clicked
     *
     * @param $recordId
     * @return void
     */
    public function onRecordClick($recordId): void
    {
        $ticket = Ticket::find($recordId);
        $url = route('tickets.details', ['ticket' => $ticket, 'slug' => Str::slug($ticket->title)]);
        $this->dispatchBrowserEvent('open-ticket', ['url' => $url]);
    }
}


================================================
FILE: app/Http/Livewire/MyNotifications.php
================================================
<?php

namespace App\Http\Livewire;

use Filament\Notifications\Notification;
use Livewire\Component;

class MyNotifications extends Component
{

    public function render()
    {
        $notifications = auth()->user()->notifications()->orderBy('created_at', 'desc')->paginate();
        return view('livewire.my-notifications', compact('notifications'));
    }

    /**
     * Mark a notification as read
     *
     * @param string $notification
     * @return void
     */
    public function markRead(string $notification): void
    {
        auth()->user()->notifications()->where('id', $notification)->update([
            'read_at' => now()
        ]);
        Notification::make()
            ->success()
            ->title(__('Notification updated'))
            ->body(__('The notification is now marked as read'))
            ->send();
    }

    /**
     * Mark all unread notifications as read
     *
     * @return void
     */
    public function markAllRead(): void
    {
        auth()->user()->unreadNotifications()->update(['read_at' => now()]);
        Notification::make()
            ->success()
            ->title(__('Notifications updated'))
            ->body(__('All unread notifications is marked as read'))
            ->send();
    }
}


================================================
FILE: app/Http/Livewire/MyProfile.php
================================================
<?php

namespace App\Http\Livewire;

use App\Models\User;
use Filament\Forms\Components\Grid;
use Filament\Forms\Components\Radio;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Concerns\InteractsWithForms;
use Filament\Forms\Contracts\HasForms;
use Filament\Notifications\Notification;
use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Support\Facades\Hash;
use Illuminate\Validation\ValidationException;
use Livewire\Component;
use Phpsa\FilamentPasswordReveal\Password;
use Closure;

class MyProfile extends Component implements HasForms
{
    use InteractsWithForms;

    public User|Authenticatable|null $user;

    public function mount(): void
    {
        $this->initProfile();
    }

    public function render()
    {
        return view('livewire.my-profile');
    }

    /**
     * Initialize form data
     *
     * @return void
     */
    private function initProfile(): void
    {
        $this->user = User::where('id', auth()->user()->id)->first();
        $this->form->fill([
            'name' => $this->user->name,
            'email' => $this->user->email,
            'locale' => $this->user->locale,
        ]);
        if (session()->has('profile_updated')) {
            Notification::make()
                ->success()
                ->title(__('Profile updated'))
                ->body(__('Your account details has been updated'))
                ->send();
        }
    }

    /**
     * Form schema definiation
     *
     * @return array
     */
    protected function getFormSchema(): array
    {
        return [
            TextInput::make('name')
                ->label(__('Full name'))
                ->maxLength(255)
                ->required(),

            TextInput::make('email')
                ->label(__('Email address'))
                ->email()
                ->unique(table: User::class, column: 'email', ignorable: fn() => $this->user->id ? $this->user : null)
                ->required(),

            Password::make('current_password')
                ->label(__('Current password'))
                ->required(),

            Grid::make()
                ->schema([
                    Password::make('new_password')
                        ->label(__('New password'))
                        ->rule('confirmed'),

                    Password::make('new_password_confirmation')
                        ->label(__('Password confirmation'))
                        ->dehydrated(false),
                ]),

            Grid::make(1)
                ->schema([
                    Radio::make('locale')
                        ->label(__('Default language'))
                        ->options(locales())
                        ->required()
                ]),
        ];
    }

    public function save(): void
    {
        $data = $this->form->getState();
        if (Hash::check($data['current_password'], $this->user->password)) {
            $this->user->name = $data['name'];
            $this->user->email = $data['email'];
            $this->user->locale = $data['locale'];
            if ($data['new_password']) {
                $this->user->password = bcrypt($data['new_password']);
            }
            $this->user->save();
            session()->put('locale', $this->user->locale);
            session()->flash('profile_updated', true);
            redirect()->to(route('my-profile'));
        } else {
            throw ValidationException::withMessages([
                'current_password' => __('The password entered is incorrect.')
            ]);
        }
    }
}


================================================
FILE: app/Http/Livewire/Projects.php
================================================
<?php

namespace App\Http\Livewire;

use App\Models\FavoriteProject;
use App\Models\Project;
use App\Tables\Columns\UserColumn;
use Carbon\Carbon;
use Exception;
use Filament\Notifications\Notification;
use Filament\Tables\Actions\Action;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Concerns\InteractsWithTable;
use Filament\Tables\Contracts\HasTable;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Relations\Relation;
use Illuminate\Support\HtmlString;
use Illuminate\Support\Str;
use Livewire\Component;
use Maatwebsite\Excel\Excel;
use pxlrbt\FilamentExcel\Actions\Tables\ExportAction;
use pxlrbt\FilamentExcel\Columns\Column;
use pxlrbt\FilamentExcel\Exports\ExcelExport;

class Projects extends Component implements HasTable
{
    use InteractsWithTable;

    public $selectedProject;

    protected $listeners = ['projectSaved', 'projectDeleted'];

    public function render()
    {
        return view('livewire.projects');
    }

    /**
     * Table query definition
     *
     * @return Builder|Relation
     */
    protected function getTableQuery(): Builder|Relation
    {
        $query = Project::query();
        $query->withCount('tickets');
        if (auth()->user()->can('View own projects') && !auth()->user()->can('View all projects')) {
            $query->where(function ($query) {
                $query->where('owner_id', auth()->user()->id)
                    ->orWhereHas('tickets', function ($query) {
                        $query->where('responsible_id', auth()->user()->id);
                    });
            });
        }
        return $query;
    }

    /**
     * Table definition
     *
     * @return array
     */
    protected function getTableColumns(): array
    {
        return [
            TextColumn::make('make_favorite')
                ->label('')
                ->formatStateUsing(function (Project $record) {
                    $btnClass = $record->favoriteUsers()
                        ->where('user_id', auth()->user()->id)
                        ->count() ? 'text-warning-500' : 'text-gray-500';
                    $iconClass = $record->favoriteUsers()
                        ->where('user_id', auth()->user()->id)
                        ->count() ? 'fa-star' : 'fa-star-o';
                    return new HtmlString('
                        <button wire:click="toggleFavoriteProject(' . $record->id . ')"
                                type="button"
                                class="' . $btnClass . '"
                            >
                            <i class="fa ' . $iconClass . '"></i>
                        </button>
                    ');
                }),

            TextColumn::make('name')
                ->label(__('Project name'))
                ->searchable()
                ->sortable(),

            TextColumn::make('description')
                ->label(__('Description'))
                ->searchable()
                ->sortable()
                ->formatStateUsing(
                    fn(string|null $state) => Str::limit(htmlspecialchars(strip_tags($state ?? '')), 50)
                ),

            UserColumn::make('owner')
                ->label(__('Owner')),

            TextColumn::make('company.name')
                ->label(__('Company'))
                ->sortable()
                ->searchable(),

            TextColumn::make('tickets_count')
                ->label(__('Tickets'))
                ->sortable(),

            TextColumn::make('created_at')
                ->label(__('Created at'))
                ->sortable()
                ->searchable()
                ->dateTime(),
        ];
    }

    /**
     * Table actions definition
     *
     * @return array
     * @throws Exception
     */
    protected function getTableActions(): array
    {
        return [
            Action::make('edit')
                ->icon('heroicon-o-pencil')
                ->link()
                ->label(__('Edit project'))
                ->action(fn(Project $record) => $this->updateProject($record->id))
        ];
    }

    /**
     * Table header actions definition
     *
     * @return array
     */
    protected function getTableHeaderActions(): array
    {
        return [
            ExportAction::make()
                ->label(__('Export'))
                ->color('success')
                ->icon('heroicon-o-document-download')
                ->exports([
                    ExcelExport::make()
                        ->askForWriterType()
                        ->withFilename('projects-export')
                        ->withColumns([
                            Column::make('name')
                                ->heading(__('Project name')),
                            Column::make('owner.name')
                                ->heading(__('Owner')),
                            Column::make('company.name')
                                ->heading(__('Company')),
                            Column::make('created_at')
                                ->heading(__('Created at'))
                                ->formatStateUsing(fn (Carbon $state) => $state->format(__('Y-m-d g:i A'))),
                        ])
            ])
        ];
    }

    /**
     * Table default sort column definition
     *
     * @return string|null
     */
    protected function getDefaultTableSortColumn(): ?string
    {
        return 'created_at';
    }

    /**
     * Table default sort direction definition
     *
     * @return string|null
     */
    protected function getDefaultTableSortDirection(): ?string
    {
        return 'desc';
    }

    /**
     * Show update project dialog
     *
     * @param $id
     * @return void
     */
    public function updateProject($id)
    {
        $this->selectedProject = Project::find($id);
        $this->dispatchBrowserEvent('toggleProjectModal');
    }

    /**
     * Show create project dialog
     *
     * @return void
     */
    public function createProject()
    {
        $this->selectedProject = new Project();
        $this->dispatchBrowserEvent('toggleProjectModal');
    }

    /**
     * Cancel and close project create / update dialog
     *
     * @return void
     */
    public function cancelProject()
    {
        $this->selectedProject = null;
        $this->dispatchBrowserEvent('toggleProjectModal');
    }

    /**
     * Event launched after a project is created / updated
     *
     * @return void
     */
    public function projectSaved()
    {
        $this->cancelProject();
    }

    /**
     * Event launched after a project is deleted
     *
     * @return void
     */
    public function projectDeleted()
    {
        $this->projectSaved();
    }

    /**
     * Add / Remove project from authenticated user favorite projects
     *
     * @param int $projectId
     * @return void
     */
    public function toggleFavoriteProject(int $projectId)
    {
        $project = Project::find($projectId);
        if (FavoriteProject::where('user_id', auth()->user()->id)->where('project_id', $project->id)->count()) {
            FavoriteProject::where('user_id', auth()->user()->id)->where('project_id', $project->id)->delete();
            Notification::make()
                ->success()
                ->title(__('Favorite removed'))
                ->body(__('The project has been successfully remove from your favorite projects'))
                ->send();
        } else {
            FavoriteProject::create([
                'user_id' => auth()->user()->id,
                'project_id' => $project->id
            ]);
            Notification::make()
                ->success()
                ->title(__('Favorite added'))
                ->body(__('The project has been successfully added to your favorite projects'))
                ->send();
        }
    }
}


================================================
FILE: app/Http/Livewire/ProjectsDialog.php
================================================
<?php

namespace App\Http\Livewire;

use App\Core\CrudDialogHelper;
use App\Models\Company;
use App\Models\Project;
use App\Models\User;
use App\Notifications\ProjectCreatedNotification;
use Closure;
use Filament\Forms\Components\Grid;
use Filament\Forms\Components\RichEditor;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Concerns\InteractsWithForms;
use Filament\Forms\Contracts\HasForms;
use Filament\Notifications\Notification;
use Livewire\Component;

class ProjectsDialog extends Component implements HasForms
{
    use InteractsWithForms;
    use CrudDialogHelper;

    public Project $project;

    protected $listeners = ['doDeleteProject', 'cancelDeleteProject'];

    public function mount(): void
    {
        $this->form->fill([
            'name' => $this->project->name,
            'ticket_prefix' => $this->project->ticket_prefix,
            'description' => $this->project->description,
            'owner_id' => $this->project->owner_id ?? auth()->user()->id,
            'company_id' => $this->project->company_id
        ]);
    }

    public function render()
    {
        return view('livewire.projects-dialog');
    }

    /**
     * Form schema definition
     *
     * @return array
     */
    protected function getFormSchema(): array
    {
        return [
            Grid::make()
                ->schema([
                    Select::make('owner_id')
                        ->label(__('Owner'))
                        ->required()
                        ->searchable()
                        ->reactive()
                        ->options(function () {
                            $query = User::query();
                            if (auth()->user()->can('View company users') && !auth()->user()->can('View all users')) {
                                $query->whereHas(
                                    'companies',
                                    fn($query) => $query->whereIn(
                                        'companies.id',
                                        auth()->user()->ownCompanies->pluck('id')->toArray()
                                    )
                                )->orWhere('id', auth()->user()->id);
                            }
                            return $query->get()->pluck('name', 'id')->toArray();
                        }),

                    Select::make('company_id')
                        ->label(__('Company'))
                        ->searchable()
                        ->options(function (Closure $get) {
                            $query = Company::query();
                            if ($get('owner_id')) {
                                $query->where('responsible_id', $get('owner_id'));
                            } elseif (auth()->user()->can('View own companies')) {
                                $query->where('responsible_id', auth()->user()->id);
                            }
                            return $query->get()->pluck('name', 'id')->toArray();
                        }),
                ]),

            Grid::make(3)
                ->schema([
                    TextInput::make('ticket_prefix')
                        ->label(__('Ticket prefix'))
                        ->minLength(4)
                        ->maxLength(4)
                        ->columnSpan(1)
                        ->helperText(__('Used to generate tickets numbers'))
                        ->required(),

                    TextInput::make('name')
                        ->label(__('Full name'))
                        ->maxLength(255)
                        ->columnSpan(2)
                        ->required(),
                ]),

            RichEditor::make('description')
                ->label(__('Description'))
                ->fileAttachmentsDisk(config('filesystems.default'))
                ->fileAttachmentsDirectory('projects')
                ->fileAttachmentsVisibility('private'),
        ];
    }

    /**
     * Create / Update the project
     *
     * @return void
     */
    public function save(): void
    {
        $data = $this->form->getState();
        if (!$this->project?->id) {
            Project::create([
                'name' => $data['name'],
                'description' => $data['description'],
                'owner_id' => $data['owner_id'],
                'ticket_prefix' => $data['ticket_prefix'],
                'company_id' => $data['company_id'],
            ]);
            Notification::make()
                ->success()
                ->title(__('Project created'))
                ->body(__('The project has been successfully created'))
                ->send();
        } else {
            $this->project->name = $data['name'];
            $this->project->description = $data['description'];
            $this->project->owner_id = $data['owner_id'];
            $this->project->company_id = $data['company_id'];
            $this->project->ticket_prefix = $data['ticket_prefix'];
            $this->project->save();
            Notification::make()
                ->success()
                ->title(__('Project updated'))
                ->body(__('The project\'s details has been updated'))
                ->send();
        }
        $this->emit('projectSaved');
    }

    /**
     * Delete an existing project
     *
     * @return void
     */
    public function doDeleteProject(): void
    {
        $this->project->delete();
        $this->deleteConfirmationOpened = false;
        $this->emit('projectDeleted');
        Notification::make()
            ->success()
            ->title(__('Project deleted'))
            ->body(__('The project has been deleted'))
            ->send();
    }

    /**
     * Cancel the deletion of a project
     *
     * @return void
     */
    public function cancelDeleteProject(): void
    {
        $this->deleteConfirmationOpened = false;
    }

    /**
     * Show the delete project confirmation dialog
     *
     * @return void
     * @throws \Exception
     */
    public function deleteProject(): void
    {
        $this->deleteConfirmation(
            __('Project deletion'),
            __('Are you sure you want to delete this project?'),
            'doDeleteProject',
            'cancelDeleteProject'
        );
    }
}


================================================
FILE: app/Http/Livewire/TicketDetails/Content.php
================================================
<?php

namespace App\Http\Livewire\TicketDetails;

use App\Jobs\TicketUpdatedJob;
use App\Models\Ticket;
use Filament\Forms\Components\RichEditor;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Concerns\InteractsWithForms;
use Filament\Forms\Contracts\HasForms;
use Filament\Notifications\Notification;
use Livewire\Component;

class Content extends Component implements HasForms
{
    use InteractsWithForms;

    public Ticket $ticket;
    public bool $updating = false;

    public function mount(): void
    {
        $this->form->fill([
            'content' => $this->ticket->content
        ]);
    }

    public function render()
    {
        return view('livewire.ticket-details.content');
    }

    /**
     * Form schema definition
     *
     * @return array
     */
    protected function getFormSchema(): array
    {
        return [
            RichEditor::make('content')
                ->label(__('Content'))
                ->disableLabel()
                ->placeholder(__('Content'))
                ->fileAttachmentsDisk(config('filesystems.default'))
                ->fileAttachmentsDirectory('tickets')
                ->fileAttachmentsVisibility('private'),
        ];
    }

    /**
     * Enable updating
     *
     * @return void
     */
    public function update(): void
    {
        $this->updating = true;
    }

    /**
     * Save main function
     *
     * @return void
     */
    public function save(): void
    {
        $data = $this->form->getState();
        $before = $this->ticket->content;
        $this->ticket->content = $data['content'];
        $this->ticket->save();
        Notification::make()
            ->success()
            ->title(__('Content updated'))
            ->body(__('The ticket content has been successfully updated'))
            ->send();
        $this->form->fill([
            'content' => $this->ticket->content
        ]);
        $this->updating = false;
        $this->emit('ticketSaved');
        TicketUpdatedJob::dispatch(
            $this->ticket,
            __('Content'),
            htmlspecialchars(strip_tags($before)),
            htmlspecialchars(strip_tags($this->ticket->content)),
            auth()->user()
        );
    }
}


================================================
FILE: app/Http/Livewire/TicketDetails/Priority.php
================================================
<?php

namespace App\Http\Livewire\TicketDetails;

use App\Jobs\TicketUpdatedJob;
use App\Models\Ticket;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Concerns\InteractsWithForms;
use Filament\Forms\Contracts\HasForms;
use Filament\Notifications\Notification;
use Livewire\Component;

class Priority extends Component implements HasForms
{
    use InteractsWithForms;

    public Ticket $ticket;
    public bool $updating = false;

    public function mount(): void
    {
        $this->form->fill([
            'priority' => $this->ticket->priority
        ]);
    }

    public function render()
    {
        return view('livewire.ticket-details.priority');
    }

    /**
     * Form schema definition
     *
     * @return array
     */
    protected function getFormSchema(): array
    {
        return [
            Select::make('priority')
                ->label(__('Priority'))
                ->required()
                ->searchable()
                ->disableLabel()
                ->placeholder(__('Priority'))
                ->options(priorities_list()),
        ];
    }

    /**
     * Enable updating
     *
     * @return void
     */
    public function update(): void
    {
        $this->updating = true;
    }

    /**
     * Save main function
     *
     * @return void
     */
    public function save(): void
    {
        $data = $this->form->getState();
        $before = __(config('system.priorities.' . $this->ticket->priority . '.title')) ?? '-';
        $this->ticket->priority = $data['priority'];
        $this->ticket->save();
        Notification::make()
            ->success()
            ->title(__('Priority updated'))
            ->body(__('The ticket priority has been successfully updated'))
            ->send();
        $this->form->fill([
            'priority' => $this->ticket->priority
        ]);
        $this->updating = false;
        $this->emit('ticketSaved');
        TicketUpdatedJob::dispatch(
            $this->ticket,
            __('Priority'),
            $before,
            __(config('system.priorities.' . $this->ticket->priority . '.title') ?? '-'),
            auth()->user()
        );
    }
}


================================================
FILE: app/Http/Livewire/TicketDetails/Responsible.php
================================================
<?php

namespace App\Http\Livewire\TicketDetails;

use App\Jobs\TicketUpdatedJob;
use App\Models\Ticket;
use App\Models\User;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Concerns\InteractsWithForms;
use Filament\Forms\Contracts\HasForms;
use Filament\Notifications\Notification;
use Livewire\Component;

class Responsible extends Component implements HasForms
{
    use InteractsWithForms;

    public Ticket $ticket;
    public bool $updating = false;

    public function mount(): void
    {
        $this->form->fill([
            'responsible_id' => $this->ticket->responsible_id
        ]);
    }

    public function render()
    {
        return view('livewire.ticket-details.responsible');
    }

    /**
     * Form schema definition
     *
     * @return array
     */
    protected function getFormSchema(): array
    {
        return [
            Select::make('responsible_id')
                ->label(__('Responsible'))
                ->disableLabel()
                ->placeholder(__('Responsible'))
                ->options(User::all()->pluck('name', 'id')->toArray())
                ->required()
        ];
    }

    /**
     * Enable updating
     *
     * @return void
     */
    public function update(): void
    {
        $this->updating = true;
    }

    /**
     * Save main function
     *
     * @return void
     */
    public function save(): void
    {
        $data = $this->form->getState();
        $before = $this->ticket->responsible?->name ?? '-';
        $this->ticket->responsible_id = $data['responsible_id'];
        $this->ticket->save();
        Notification::make()
            ->success()
            ->title(__('Responsible updated'))
            ->body(__('The ticket responsible has been successfully updated'))
            ->send();
        $this->form->fill([
            'responsible_id' => $this->ticket->responsible_id
        ]);
        $this->updating = false;
        $this->ticket = $this->ticket->refresh();
        $this->emit('ticketSaved');
        TicketUpdatedJob::dispatch(
            $this->ticket,
            __('Responsible'),
            $before,
            ($this->ticket->responsible?->name ?? '-'),
            auth()->user()
        );
    }

    /**
     * Assign ticket to the authenticated user
     *
     * @return void
     */
    public function assignToMe(): void
    {
        $this->form->fill([
            'responsible_id' => auth()->user()->id
        ]);
        $this->save();
    }
}


================================================
FILE: app/Http/Livewire/TicketDetails/Status.php
================================================
<?php

namespace App\Http\Livewire\TicketDetails;

use App\Jobs\TicketUpdatedJob;
use App\Models\Ticket;
use Filament\Forms\Components\Select;
use Filament\Forms\Concerns\InteractsWithForms;
use Filament\Forms\Contracts\HasForms;
use Filament\Notifications\Notification;
use Livewire\Component;

class Status extends Component implements HasForms
{
    use InteractsWithForms;

    public Ticket $ticket;
    public bool $updating = false;

    public function mount(): void
    {
        $this->form->fill([
            'status' => $this->ticket->status
        ]);
    }

    public function render()
    {
        return view('livewire.ticket-details.status');
    }

    /**
     * Form schema definition
     *
     * @return array
     */
    protected function getFormSchema(): array
    {
        return [
            Select::make('status')
                ->label(__('Status'))
                ->disableLabel()
                ->placeholder(__('Status'))
                ->required()
                ->searchable()
                ->options(statuses_list()),
        ];
    }

    /**
     * Enable updating
     *
     * @return void
     */
    public function update(): void
    {
        $this->updating = true;
    }

    /**
     * Save main function
     *
     * @return void
     */
    public function save(): void
    {
        $data = $this->form->getState();
        $before = __(config('system.statuses.' . $this->ticket->status . '.title')) ?? '-';
        $this->ticket->status = $data['status'];
        $this->ticket->save();
        Notification::make()
            ->success()
            ->title(__('Status updated'))
            ->body(__('The ticket status has been successfully updated'))
            ->send();
        $this->form->fill([
            'status' => $this->ticket->status
        ]);
        $this->updating = false;
        $this->emit('ticketSaved');
        TicketUpdatedJob::dispatch(
            $this->ticket,
            __('Status'),
            $before,
            __(config('system.statuses.' . $this->ticket->status . '.title') ?? '-'),
            auth()->user()
        );
    }
}


================================================
FILE: app/Http/Livewire/TicketDetails/Title.php
================================================
<?php

namespace App\Http\Livewire\TicketDetails;

use App\Jobs\TicketUpdatedJob;
use App\Models\Ticket;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Concerns\InteractsWithForms;
use Filament\Forms\Contracts\HasForms;
use Filament\Notifications\Notification;
use Livewire\Component;

class Title extends Component implements HasForms
{
    use InteractsWithForms;

    public Ticket $ticket;
    public bool $updating = false;

    public function mount(): void
    {
        $this->form->fill([
            'title' => $this->ticket->title
        ]);
    }

    public function render()
    {
        return view('livewire.ticket-details.title');
    }

    /**
     * Form schema definition
     *
     * @return array
     */
    protected function getFormSchema(): array
    {
        return [
            TextInput::make('title')
                ->label(__('Title'))
                ->disableLabel()
                ->placeholder(__('Title'))
                ->maxLength(255)
                ->required()
        ];
    }

    /**
     * Enable updating
     *
     * @return void
     */
    public function update(): void
    {
        $this->updating = true;
    }

    /**
     * Save main function
     *
     * @return void
     */
    public function save(): void
    {
        $data = $this->form->getState();
        $before = $this->ticket->title;
        $this->ticket->title = $data['title'];
        $this->ticket->save();
        Notification::make()
            ->success()
            ->title(__('Title updated'))
            ->body(__('The ticket title has been successfully updated'))
            ->send();
        $this->form->fill([
            'title' => $this->ticket->title
        ]);
        $this->updating = false;
        $this->emit('ticketSaved');
        TicketUpdatedJob::dispatch($this->ticket, __('Title'), $before, $this->ticket->title, auth()->user());
    }
}


================================================
FILE: app/Http/Livewire/TicketDetails/Type.php
================================================
<?php

namespace App\Http\Livewire\TicketDetails;

use App\Jobs\TicketUpdatedJob;
use App\Models\Ticket;
use Filament\Forms\Components\Select;
use Filament\Forms\Concerns\InteractsWithForms;
use Filament\Forms\Contracts\HasForms;
use Filament\Notifications\Notification;
use Livewire\Component;

class Type extends Component implements HasForms
{
    use InteractsWithForms;

    public Ticket $ticket;
    public bool $updating = false;

    public function mount(): void
    {
        $this->form->fill([
            'type' => $this->ticket->type
        ]);
    }

    public function render()
    {
        return view('livewire.ticket-details.type');
    }

    /**
     * Form schema definition
     *
     * @return array
     */
    protected function getFormSchema(): array
    {
        return [
            Select::make('type')
                ->label(__('Type'))
                ->disableLabel()
                ->placeholder(__('Type'))
                ->required()
                ->searchable()
                ->options(types_list()),
        ];
    }

    /**
     * Enable updating
     *
     * @return void
     */
    public function update(): void
    {
        $this->updating = true;
    }

    /**
     * Save main function
     *
     * @return void
     */
    public function save(): void
    {
        $data = $this->form->getState();
        $before = __(config('system.types.' . $this->ticket->type . '.title')) ?? '-';
        $this->ticket->type = $data['type'];
        $this->ticket->save();
        Notification::make()
            ->success()
            ->title(__('Type updated'))
            ->body(__('The ticket type has been successfully updated'))
            ->send();
        $this->form->fill([
            'type' => $this->ticket->type
        ]);
        $this->updating = false;
        $this->emit('ticketSaved');
        TicketUpdatedJob::dispatch(
            $this->ticket,
            __('Type'),
            $before,
            __(config('system.types.' . $this->ticket->type . '.title') ?? '-'),
            auth()->user()
        );
    }
}


================================================
FILE: app/Http/Livewire/TicketDetails.php
================================================
<?php

namespace App\Http\Livewire;

use App\Models\Ticket;
use Filament\Notifications\Notification;
use Livewire\Component;

class TicketDetails extends Component
{
    public Ticket $ticket;
    public $menu;
    public $activeMenu;

    protected $listeners = ['ticketSaved'];

    public function mount(): void
    {
        $this->menu = [
            'Comments',
            'Chat',
        ];
        $this->activeMenu = $this->menu[0];
    }

    public function render()
    {
        return view('livewire.ticket-details');
    }

    /**
     * Change a menu (tab)
     *
     * @param $item
     * @return void
     */
    public function selectMenu($item)
    {
        $this->activeMenu = $item;
        $this->dispatchBrowserEvent('initMagnificPopupOnTicketComments');
    }

    /**
     * Event launched after the ticket is updated
     *
     * @return void
     */
    public function ticketSaved(): void
    {
        $this->ticket = $this->ticket->refresh();
    }

    /**
     * Copy a ticket url
     *
     * @param int $ticketId
     * @return void
     */
    public function copyTicketUrl(int $ticketId): void
    {
        $ticket = Ticket::where('id', $ticketId)->first();
        Notification::make()
            ->success()
            ->title(__('Ticket url copied'))
            ->body(__('The ticket url successfully copied to your clipboard'))
            ->send();
        $this->dispatchBrowserEvent('ticketUrlCopied', [
            'url' => route('tickets.number', [
                'number' => $ticket->ticket_number
            ])
        ]);
    }
}


================================================
FILE: app/Http/Livewire/TicketDetailsComments.php
================================================
<?php

namespace App\Http\Livewire;

use App\Jobs\CommentCreatedJob;
use App\Jobs\TicketCreatedJob;
use App\Models\Comment;
use App\Models\Ticket;
use Filament\Forms\Components\RichEditor;
use Filament\Forms\Concerns\InteractsWithForms;
use Filament\Forms\Contracts\HasForms;
use Filament\Notifications\Actions\Action;
use Filament\Notifications\Notification;
use Livewire\Component;

class TicketDetailsComments extends Component implements HasForms
{
    use InteractsWithForms;

    public Ticket $ticket;
    public bool $deleteConfirmationOpened = false;

    protected $listeners = ['commentCreated', 'commentDeleted', 'commentSaved'];

    public function mount(): void
    {
        $this->form->fill();
    }

    public function render()
    {
        return view('livewire.ticket-details-comments');
    }

    /**
     * Form schema definition
     *
     * @return array
     */
    protected function getFormSchema(): array
    {
        return [
            RichEditor::make('content')
                ->label(__('Type a new comment...'))
                ->disableLabel()
                ->placeholder(__('Type a new comment...'))
                ->required()
                ->fileAttachmentsDisk(config('filesystems.default'))
                ->fileAttachmentsDirectory('comments')
                ->fileAttachmentsVisibility('private'),
        ];
    }

    /**
     * Event launched after a comment is deleted
     *
     * @return void
     */
    public function commentDeleted(): void
    {
        $this->commentCreated();
    }

    /**
     * Event launched after a comment is created
     *
     * @return void
     */
    public function commentCreated(): void
    {
        $this->ticket = $this->ticket->refresh();
    }

    /**
     * Event launched after a comment is updated
     *
     * @return void
     */
    public function commentSaved(): void
    {
        $this->commentCreated();
    }

    /**
     * Comment main function
     *
     * @return void
     */
    public function comment(): void
    {
        $data = $this->form->getState();
        $comment = Comment::create([
            'content' => $data['content'],
            'owner_id' => auth()->user()->id,
            'ticket_id' => $this->ticket->id
        ]);
        Notification::make()
            ->success()
            ->title(__('Comment created'))
            ->body(__('Your comment has been successfully added to the ticket'))
            ->send();
        $this->form->fill();
        $this->emit('commentCreated');
        CommentCreatedJob::dispatch($comment);
    }
}


================================================
FILE: app/Http/Livewire/TicketDetailsCommentsContent.php
================================================
<?php

namespace App\Http\Livewire;

use App\Jobs\CommentCreatedJob;
use App\Models\Comment;
use App\Models\Ticket;
use Filament\Forms\Components\RichEditor;
use Filament\Forms\Concerns\InteractsWithForms;
use Filament\Forms\Contracts\HasForms;
use Filament\Notifications\Actions\Action;
use Filament\Notifications\Notification;
use Livewire\Component;

class TicketDetailsCommentsContent extends Component implements HasForms
{
    use InteractsWithForms;

    public Comment|null $selectedComment;
    public Ticket $ticket;
    public bool $updating = false;
    public bool $deleteConfirmationOpened = false;

    protected $listeners = [
        'doDeleteComment',
        'cancelDeleteComment',
        'commentCreated',
        'commentDeleted',
        'commentSaved'
    ];

    public function mount(): void
    {
        $this->selectedComment = null;
        $this->form->fill([
            'content' => $this->selectedComment?->content
        ]);
    }

    public function render()
    {
        return view('livewire.ticket-details-comments-content');
    }

    /**
     * Form schema definition
     *
     * @return array
     */
    protected function getFormSchema(): array
    {
        return [
            RichEditor::make('content')
                ->label(__('Update your comment...'))
                ->disableLabel()
                ->placeholder(__('Update your comment...'))
                ->required()
                ->fileAttachmentsDisk(config('filesystems.default'))
                ->fileAttachmentsDirectory('comments')
                ->fileAttachmentsVisibility('private'),
        ];
    }

    /**
     * Launch the update function
     *
     * @param int $comment
     * @return void
     */
    public function updateComment(int $comment): void
    {
        $this->selectedComment = Comment::where('id', $comment)->first();
        $this->form->fill([
            'content' => $this->selectedComment->content
        ]);
        $this->updating = true;
    }

    /**
     * Comment main function
     *
     * @return void
     */
    public function save(): void
    {
        $data = $this->form->getState();
        $this->selectedComment->content = $data['content'];
        $this->selectedComment->save();
        $this->form->fill([
            'content' => $this->selectedComment->content
        ]);
        $this->emit('commentSaved');
        $this->updating = false;
        Notification::make()
            ->success()
            ->title(__('Comment updated'))
            ->body(__('The comment has been updated'))
            ->send();
    }

    /**
     * Delete an existing comment
     *
     * @param int $commentId
     * @return void
     */
    public function doDeleteComment(int $commentId): void
    {
        if ($commentId === $this->selectedComment->id) {
            $this->selectedComment->delete();
            $this->deleteConfirmationOpened = false;
            $this->emit('commentDeleted');
            Notification::make()
                ->success()
                ->title(__('Comment deleted'))
                ->body(__('The comment has been deleted'))
                ->send();
        }
    }

    /**
     * Cancel the deletion of a comment
     *
     * @return void
     */
    public function cancelDeleteComment(): void
    {
        $this->deleteConfirmationOpened = false;
    }

    /**
     * Show the delete comment confirmation dialog
     *
     * @param Comment $comment
     * @return void
     * @throws \Exception
     */
    public function deleteComment(Comment $comment): void
    {
        $this->selectedComment = $comment;
        $this->deleteConfirmationOpened = true;
        Notification::make()
            ->warning()
            ->title(__('Comment deletion'))
            ->body(__('Are you sure you want to delete this comment?'))
            ->actions([
                Action::make('confirm')
                    ->label(__('Confirm'))
                    ->color('danger')
                    ->button()
                    ->close()
                    ->emit('doDeleteComment', ['comment' => $comment->id]),
                Action::make('cancel')
                    ->label(__('Cancel'))
                    ->close()
                    ->emit('cancelDeleteComment')
            ])
            ->persistent()
            ->send();
    }

    /**
     * Event launched after a comment is deleted
     *
     * @return void
     */
    public function commentDeleted(): void
    {
        $this->commentCreated();
    }

    /**
     * Event launched after a comment is created
     *
     * @return void
     */
    public function commentCreated(): void
    {
        $this->ticket = $this->ticket->refresh();
    }

    /**
     * Event launched after a comment is updated
     *
     * @return void
     */
    public function commentSaved(): void
    {
        $this->commentCreated();
    }
}


================================================
FILE: app/Http/Livewire/Tickets.php
================================================
<?php

namespace App\Http\Livewire;

use App\Models\Project;
use App\Models\Ticket;
use App\Models\User;
use Filament\Forms\Components\Grid;
use Filament\Forms\Components\MultiSelect;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Concerns\InteractsWithForms;
use Filament\Forms\Contracts\HasForms;
use Filament\Notifications\Notification;
use Livewire\Component;

class Tickets extends Component implements HasForms
{
    use InteractsWithForms;

    public $menu;
    public $activeMenu;
    public $search;
    public $projects;
    public $priorities;
    public $statuses;
    public $types;
    public $responsible;
    public $selectedTicket;

    protected $listeners = ['ticketSaved', 'ticketDeleted'];

    public function mount()
    {
        $this->menu = [
            'All tickets',
            'Unassigned',
            'Assigned to me',
            'Created by me',
        ];
        $this->activeMenu = $this->menu[0];
        $data = [];
        if (request()->get('project')) {
            $data['projects'] = [request()->get('project')];
        }
        $this->form->fill($data);
    }

    public function render()
    {
        $query = Ticket::query();
        $query->withCount('comments');
        if (auth()->user()->can('View own tickets') && !auth()->user()->can('View all tickets')) {
            $query->where(function ($query) {
                $query->where('owner_id', auth()->user()->id)
                    ->orWhere('responsible_id', auth()->user()->id)
                    ->orWhereHas('project', function ($query) {
                        $query->whereHas('company', function ($query) {
                            $query->whereIn('companies.id', auth()->user()->ownCompanies->pluck('id')->toArray());
                        });
                    });
            });
        }
        if ($this->activeMenu === 'Unassigned') {
            $query->whereNull('responsible_id');
        }
        if ($this->activeMenu === 'Assigned to me') {
            $query->where('responsible_id', auth()->user()->id);
        }
        if ($this->activeMenu === 'Created by me') {
            $query->where('owner_id', auth()->user()->id);
        }
        if ($this->search) {
            $query->where(function ($query) {
                $query->where('title', 'like', '%' . $this->search . '%')
                    ->orWhere('content', 'like', '%' . $this->search . '%');
            });
        }
        if ($this->projects && sizeof($this->projects)) {
            $query->whereIn('project_id', $this->projects);
        }
        if ($this->priorities && sizeof($this->priorities)) {
            $query->whereIn('priority', $this->priorities);
        }
        if ($this->statuses && sizeof($this->statuses)) {
            $query->whereIn('status', $this->statuses);
        }
        if ($this->types && sizeof($this->types)) {
            $query->whereIn('type', $this->types);
        }
        if ($this->statuses && sizeof($this->responsible)) {
            $query->whereIn('responsible_id', $this->responsible);
        }
        $tickets = $query->paginate();
        return view('livewire.tickets', compact('tickets'));
    }

    /**
     * Change a menu (tab)
     *
     * @param $item
     * @return void
     */
    public function selectMenu($item)
    {
        $this->activeMenu = $item;
        $this->search();
    }

    /**
     * Form schema definition
     *
     * @return array
     */
    protected function getFormSchema(): array
    {
        return [
            Grid::make(6)
                ->schema([
                    MultiSelect::make('projects')
                        ->label(__('Project'))
                        ->disableLabel()
                        ->searchable()
                        ->placeholder(__('Project'))
                        ->options(function () {
                            $query = Project::query();
                            if (auth()->user()->can('View own projects') && !auth()->user()->can('View all projects')) {
                                $query->where('owner_id', auth()->user()->id);
                            }
                            return $query->get()->pluck('name', 'id');
                        }),

                    MultiSelect::make('priorities')
                        ->label(__('Priorities'))
                        ->disableLabel()
                        ->searchable()
                        ->placeholder(__('Priorities'))
                        ->options(priorities_list()),

                    MultiSelect::make('statuses')
                        ->label(__('Statuses'))
                        ->disableLabel()
                        ->searchable()
                        ->placeholder(__('Statuses'))
                        ->options(statuses_list()),

                    MultiSelect::make('types')
                        ->label(__('Types'))
                        ->disableLabel()
                        ->searchable()
                        ->placeholder(__('Types'))
                        ->options(types_list()),

                    MultiSelect::make('responsible')
                        ->label(__('Responsible'))
                        ->disableLabel()
                        ->searchable()
                        ->placeholder(__('Responsible'))
                        ->options(User::all()->pluck('name', 'id')),

                    TextInput::make('search')
                        ->label(__('Search for tickets'))
                        ->disableLabel()
                        ->type('search')
                        ->placeholder(__('Search for tickets'))
                ]),
        ];
    }

    /**
     * Search for tickets
     *
     * @return void
     */
    public function search(): void
    {
        $data = $this->form->getState();
        $this->search = $data['search'] ?? null;
        $this->projects = $data['projects'] ?? null;
        $this->priorities = $data['priorities'] ?? null;
        $this->statuses = $data['statuses'] ?? null;
        $this->types = $data['types'] ?? null;
        $this->responsible = $data['responsible'] ?? null;
    }

    public function resetFilters(): void
    {
        $this->search = null;
        $this->projects = null;
        $this->priorities = null;
        $this->statuses = null;
        $this->types = null;
        $this->responsible = null;
    }

    /**
     * Show create ticket dialog
     *
     * @return void
     */
    public function createTicket()
    {
        $this->selectedTicket = new Ticket();
        $this->dispatchBrowserEvent('toggleTicketModal');
    }

    /**
     * Cancel and close ticket create / update dialog
     *
     * @return void
     */
    public function cancelTicket()
    {
        $this->selectedTicket = null;
        $this->dispatchBrowserEvent('toggleTicketModal');
    }

    /**
     * Event launched after a ticket is created / updated
     *
     * @return void
     */
    public function ticketSaved()
    {
        $this->search();
        $this->cancelTicket();
    }

    /**
     * Event launched after a ticket is deleted
     *
     * @return void
     */
    public function ticketDeleted()
    {
        $this->ticketSaved();
    }

    /**
     * Copy a ticket url
     *
     * @param int $ticketId
     * @return void
     */
    public function copyTicketUrl(int $ticketId): void
    {
        $ticket = Ticket::where('id', $ticketId)->first();
        Notification::make()
            ->success()
            ->title(__('Ticket url copied'))
            ->body(__('The ticket url successfully copied to your clipboard'))
            ->send();
        $this->dispatchBrowserEvent('ticketUrlCopied', [
            'url' => route('tickets.number', [
                'number' => $ticket->ticket_number
            ])
        ]);
    }
}


================================================
FILE: app/Http/Livewire/TicketsDialog.php
================================================
<?php

namespace App\Http\Livewire;

use App\Jobs\TicketCreatedJob;
use App\Models\Project;
use App\Models\Ticket;
use Filament\Forms\Components\Grid;
use Filament\Forms\Components\RichEditor;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Concerns\InteractsWithForms;
use Filament\Forms\Contracts\HasForms;
use Filament\Notifications\Actions\Action;
use Filament\Notifications\Notification;
use Illuminate\Support\Str;
use Livewire\Component;

class TicketsDialog extends Component implements HasForms
{
    use InteractsWithForms;

    public Ticket $ticket;

    public function mount(): void
    {
        $this->form->fill([
            'title' => $this->ticket->title,
            'content' => $this->ticket->content,
            'priority' => $this->ticket->priority,
            'project_id' => $this->ticket->project_id,
        ]);
    }

    public function render()
    {
        return view('livewire.tickets-dialog');
    }

    /**
     * Form schema definition
     *
     * @return array
     */
    protected function getFormSchema(): array
    {
        return [

            Select::make('project_id')
                ->label(__('Project'))
                ->required()
                ->searchable()
                ->options(function () {
                    $query = Project::query();
                    if (auth()->user()->can('View own projects') && !auth()->user()->can('View all projects')) {
                        $query->where('owner_id', auth()->user()->id);
                    }
                    return $query->get()->pluck('name', 'id');
                }),

            Grid::make()
                ->schema([

                    Select::make('type')
                        ->label(__('Type'))
                        ->required()
                        ->searchable()
                        ->options(types_list()),

                    Select::make('priority')
                        ->label(__('Priority'))
                        ->required()
                        ->searchable()
                        ->options(priorities_list()),

                ]),

            TextInput::make('title')
                ->label(__('Ticket title'))
                ->maxLength(255)
                ->required(),

            RichEditor::make('content')
                ->label(__('Content'))
                ->required()
                ->fileAttachmentsDisk(config('filesystems.default'))
                ->fileAttachmentsDirectory('tickets')
                ->fileAttachmentsVisibility('private'),
        ];
    }

    /**
     * Create / Update the ticket
     *
     * @return void
     */
    public function save(): void
    {
        $data = $this->form->getState();
        $ticket = Ticket::create([
            'project_id' => $data['project_id'],
            'title' => $data['title'],
            'content' => $data['content'],
            'owner_id' => auth()->user()->id,
            'priority' => $data['priority'],
            'type' => $data['type'],
            'status' => default_ticket_status()
        ]);
        Notification::make()
            ->success()
            ->title(__('Ticket created'))
            ->body(__('The ticket has been successfully created'))
            ->actions([
                Action::make('redirect')
                    ->label(__('See details'))
                    ->color('success')
                    ->button()
                    ->close()
                    ->url(fn() => route('tickets.details', [
                        'ticket' => $ticket,
                        'slug' => Str::slug($ticket->title)
                    ]))
            ])
            ->send();
        $this->emit('ticketSaved');
        TicketCreatedJob::dispatch($ticket);
    }
}


================================================
FILE: app/Http/Middleware/Authenticate.php
================================================
<?php

namespace App\Http\Middleware;

use Illuminate\Auth\Middleware\Authenticate as Middleware;

class Authenticate extends Middleware
{
    /**
     * Get the path the user should be redirected to when they are not authenticated.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return string|null
     */
    protected function redirectTo($request)
    {
        if (! $request->expectsJson()) {
            return route('auth.login');
        }
    }
}


================================================
FILE: app/Http/Middleware/CanAccessTicket.php
================================================
<?php

namespace App\Http\Middleware;

use App\Models\Ticket;
use Closure;
use Illuminate\Http\Request;

class CanAccessTicket
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse)  $next
     * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
     */
    public function handle(Request $request, Closure $next)
    {
        $ticket = $request->route('ticket');
        if (!(
            auth()->user()->can('View all tickets')
            ||
            (
                auth()->user()->can('View own tickets')
                && in_array(auth()->user()->id, [$ticket->owner_id, $ticket->responsible_id])
            )
        )) {
            return redirect()->to(route('tickets'));
        }
        return $next($request);
    }
}


================================================
FILE: app/Http/Middleware/EncryptCookies.php
================================================
<?php

namespace App\Http\Middleware;

use Illuminate\Cookie\Middleware\EncryptCookies as Middleware;

class EncryptCookies extends Middleware
{
    /**
     * The names of the cookies that should not be encrypted.
     *
     * @var array<int, string>
     */
    protected $except = [
        //
    ];
}


================================================
FILE: app/Http/Middleware/LocaleMiddleware.php
================================================
<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class LocaleMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param \Illuminate\Http\Request $request
     * @param \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse)  $next
     * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
     */
    public function handle(Request $request, Closure $next)
    {
        $locale = config('app.locale');
        if (
            session()->has('locale')
            && in_array(session()->get('locale'), array_keys(config('system.locales')))
        ) {
            $locale = session()->get('locale');
        } elseif (
            auth()->user()?->locale
            && in_array(auth()->user()?->locale, array_keys(config('system.locales')))
        ) {
            $locale = auth()->user()?->locale;
        }
        app()->setLocale($locale);
        return $next($request);
    }
}


================================================
FILE: app/Http/Middleware/PreventRequestsDuringMaintenance.php
================================================
<?php

namespace App\Http\Middleware;

use Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance as Middleware;

class PreventRequestsDuringMaintenance extends Middleware
{
    /**
     * The URIs that should be reachable while maintenance mode is enabled.
     *
     * @var array<int, string>
     */
    protected $except = [
        //
    ];
}


================================================
FILE: app/Http/Middleware/RedirectIfAuthenticated.php
================================================
<?php

namespace App\Http\Middleware;

use App\Providers\RouteServiceProvider;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class RedirectIfAuthenticated
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse)  $next
     * @param  string|null  ...$guards
     * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
     */
    public function handle(Request $request, Closure $next, ...$guards)
    {
        $guards = empty($guards) ? [null] : $guards;

        foreach ($guards as $guard) {
            if (Auth::guard($guard)->check()) {
                return redirect(RouteServiceProvider::HOME);
            }
        }

        return $next($request);
    }
}


================================================
FILE: app/Http/Middleware/TrimStrings.php
================================================
<?php

namespace App\Http\Middleware;

use Illuminate\Foundation\Http\Middleware\TrimStrings as Middleware;

class TrimStrings extends Middleware
{
    /**
     * The names of the attributes that should not be trimmed.
     *
     * @var array<int, string>
     */
    protected $except = [
        'current_password',
        'password',
        'password_confirmation',
    ];
}


================================================
FILE: app/Http/Middleware/TrustHosts.php
================================================
<?php

namespace App\Http\Middleware;

use Illuminate\Http\Middleware\TrustHosts as Middleware;

class TrustHosts extends Middleware
{
    /**
     * Get the host patterns that should be trusted.
     *
     * @return array<int, string|null>
     */
    public function hosts()
    {
        return [
            $this->allSubdomainsOfApplicationUrl(),
        ];
    }
}


================================================
FILE: app/Http/Middleware/TrustProxies.php
================================================
<?php

namespace App\Http\Middleware;

use Illuminate\Http\Middleware\TrustProxies as Middleware;
use Illuminate\Http\Request;

class TrustProxies extends Middleware
{
    /**
     * The trusted proxies for this application.
     *
     * @var array<int, string>|string|null
     */
    protected $proxies;

    /**
     * The headers that should be used to detect proxies.
     *
     * @var int
     */
    protected $headers =
        Request::HEADER_X_FORWARDED_FOR |
        Request::HEADER_X_FORWARDED_HOST |
        Request::HEADER_X_FORWARDED_PORT |
        Request::HEADER_X_FORWARDED_PROTO |
        Request::HEADER_X_FORWARDED_AWS_ELB;
}


================================================
FILE: app/Http/Middleware/ValidateSignature.php
================================================
<?php

namespace App\Http\Middleware;

use Illuminate\Routing\Middleware\ValidateSignature as Middleware;

class ValidateSignature extends Middleware
{
    /**
     * The names of the query string parameters that should be ignored.
     *
     * @var array<int, string>
     */
    protected $except = [
        // 'fbclid',
        // 'utm_campaign',
        // 'utm_content',
        // 'utm_medium',
        // 'utm_source',
        // 'utm_term',
    ];
}


================================================
FILE: app/Http/Middleware/VerifyCsrfToken.php
================================================
<?php

namespace App\Http\Middleware;

use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;

class VerifyCsrfToken extends Middleware
{
    /**
     * The URIs that should be excluded from CSRF verification.
     *
     * @var array<int, string>
     */
    protected $except = [
        //
    ];
}


================================================
FILE: app/Jobs/CommentCreatedJob.php
================================================
<?php

namespace App\Jobs;

use App\Models\Comment;
use App\Models\User;
use App\Notifications\CommentCreateNotification;
use App\Notifications\TicketCreatedNotification;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;

class CommentCreatedJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    private Comment $comment;

    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct(Comment $comment)
    {
        $this->comment = $comment;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        $users = User::whereNull('register_token')->get();
        foreach ($users as $user) {
            if (
                (auth()->user()->can('View all tickets') && $this->comment->owner_id !== $user->id)
                ||
                (
                    auth()->user()->can('View own tickets')
                    && (
                        $this->comment->ticket->owner_id === $user->id
                        || $this->comment->ticket->responsible_id === $user->id
                    )
                    && $this->comment->owner_id !== $user->id)
            ) {
                $user->notify(new CommentCreateNotification($this->comment, $user));
            }
        }
    }
}


================================================
FILE: app/Jobs/TicketCreatedJob.php
================================================
<?php

namespace App\Jobs;

use App\Models\Ticket;
use App\Models\User;
use App\Notifications\TicketCreatedNotification;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;

class TicketCreatedJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    private Ticket $ticket;

    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct(Ticket $ticket)
    {
        $this->ticket = $ticket;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        $users = User::whereNull('register_token')->get();
        foreach ($users as $user) {
            if (auth()->user()->can('View all tickets') && $this->ticket->owner_id !== $user->id) {
                $user->notify(new TicketCreatedNotification($this->ticket, $user));
            }
        }
    }
}


================================================
FILE: app/Jobs/TicketUpdatedJob.php
================================================
<?php

namespace App\Jobs;

use App\Models\Ticket;
use App\Models\User;
use App\Notifications\CommentCreateNotification;
use App\Notifications\TicketUpdatedNotification;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;

class TicketUpdatedJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    private Ticket $ticket;
    private string $field;
    private string $before;
    private string $after;
    private User|Authenticatable $user;

    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct(
        Ticket $ticket,
        string $field,
        string $before,
        string $after,
        User|Authenticatable $user
    )
    {
        $this->ticket = $ticket;
        $this->field = $field;
        $this->before = $before;
        $this->after = $after;
        $this->user = $user;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        if ($this->before !== $this->after) {
            $users = User::whereNull('register_token')->where('id', '<>', $this->user->id)->get();
            foreach ($users as $u) {
                if (
                    (
                        auth()->user()->can('View all tickets')
                        && $this->ticket->owner_id !== $u->id
                    )
                    ||
                    (
                        auth()->user()->can('View own tickets')
                        && (
                            $this->ticket->owner_id === $u->id
                            || $this->ticket->responsible_id === $u->id
                        )
                        && $this->ticket->owner_id !== $u->id
                    )
                ) {
                    $u->notify(
                        new TicketUpdatedNotification(
                            $this->ticket,
                            $this->field,
                            $this->before,
                            $this->after,
                            $this->user
                        )
                    );
                }
            }
        }
    }
}


================================================
FILE: app/Models/Chat.php
================================================
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;

class Chat extends Model
{
    use HasFactory, SoftDeletes;

    protected $fillable = [
        'message',
        'ticket_id',
        'user_id'
    ];

    protected static function boot()
    {
        parent::boot();
        static::addGlobalScope('order', function (Builder $builder) {
            $builder->orderBy('created_at', 'desc');
        });
    }

    public function ticket(): BelongsTo
    {
        return $this->belongsTo(Ticket::class);
    }

    public function user(): BelongsTo
    {
        return $this->belongsTo(User::class);
    }
}


================================================
FILE: app/Models/Comment.php
================================================
<?php

namespace App\Models;

use App\Core\HasLogsActivity;
use App\Core\LogsActivity;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;

class Comment extends Model implements HasLogsActivity
{
    use HasFactory, SoftDeletes, LogsActivity;

    protected $fillable = [
        'owner_id',
        'ticket_id',
        'content'
    ];

    protected static function boot()
    {
        parent::boot();
        static::addGlobalScope('order', function (Builder $builder) {
            $builder->orderBy('created_at', 'desc');
        });
    }

    public function owner(): BelongsTo
    {
        return $this->belongsTo(User::class, 'owner_id')->withTrashed();
    }

    public function ticket(): BelongsTo
    {
        return $this->belongsTo(Ticket::class);
    }

    public function __toString(): string
    {
        return $this->content;
    }

    public function activityLogLink(): string
    {
        return route('tickets.number', $this->ticket->ticket_number);
    }
}


================================================
FILE: app/Models/Company.php
================================================
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Database\Eloquent\SoftDeletes;

class Company extends Model
{
    use HasFactory, SoftDeletes;

    protected $fillable = [
        'name',
        'logo',
        'description',
        'is_disabled',
        'responsible_id'
    ];

    public function responsible(): BelongsTo
    {
        return $this->belongsTo(User::class, 'responsible_id');
    }

    public function users(): BelongsToMany
    {
        return $this->belongsToMany(User::class, 'company_users', 'company_id', 'user_id');
    }
}


================================================
FILE: app/Models/CompanyUser.php
================================================
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;

class CompanyUser extends Model
{
    use HasFactory;

    protected $fillable = [
        'user_id',
        'company_id'
    ];

    public function user(): BelongsTo
    {
        return $this->belongsTo(User::class);
    }

    public function company(): BelongsTo
    {
        return $this->belongsTo(Company::class);
    }
}


================================================
FILE: app/Models/FavoriteProject.php
================================================
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;

class FavoriteProject extends Model
{
    use HasFactory;

    protected $fillable = [
        'user_id',
        'project_id',
    ];

    public function user(): BelongsTo
    {
        return $this->belongsTo(User::class);
    }

    public function project(): BelongsTo
    {
        return $this->belongsTo(Project::class);
    }
}


================================================
FILE: app/Models/Icon.php
================================================
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Icon extends Model
{
    use HasFactory;

    protected $fillable = [
        'icon'
    ];
}


================================================
FILE: app/Models/Project.php
================================================
<?php

namespace App\Models;

use App\Core\HasLogsActivity;
use App\Core\LogsActivity;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\SoftDeletes;

class Project extends Model implements HasLogsActivity
{
    use HasFactory, SoftDeletes, LogsActivity;

    protected $fillable = [
        'name',
        'description',
        'owner_id',
        'ticket_prefix',
        'company_id'
    ];

    protected static function boot()
    {
        parent::boot();
        static::addGlobalScope('order', function (Builder $builder) {
            $builder->orderBy('created_at', 'desc');
        });
    }

    public function owner(): BelongsTo
    {
        return $this->belongsTo(User::class, 'owner_id')->withTrashed();
    }

    public function company(): BelongsTo
    {
        return $this->belongsTo(Company::class);
    }

    public function tickets(): HasMany
    {
        return $this->hasMany(Ticket::class);
    }

    public function favoriteUsers(): BelongsToMany
    {
        $query = $this->belongsToMany(User::class, 'favorite_projects', 'project_id', 'user_id');
        if (auth()->user()->can('View own projects') && !auth()->user()->can('View all projects')) {
            $query->where('user_id', auth()->user()->id);
        }
        return $query;
    }

    public function __toString(): string
    {
        return $this->name;
    }

    public function activityLogLink(): string
    {
        return route('home');
    }
}


================================================
FILE: app/Models/Ticket.php
================================================
<?php

namespace App\Models;

use App\Core\HasLogsActivity;
use App\Core\LogsActivity;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\HasOne;
use Illuminate\Database\Eloquent\SoftDeletes;

class Ticket extends Model implements HasLogsActivity
{
    use HasFactory, SoftDeletes, LogsActivity;

    protected $fillable = [
        'title',
        'content',
        'status',
        'priority',
        'type',
        'owner_id',
        'responsible_id',
        'project_id',
        'number',
    ];

    protected $appends = [
        'ticket_number'
    ];

    protected static function boot()
    {
        parent::boot();
        static::addGlobalScope('order', function (Builder $builder) {
            $builder->orderBy('created_at', 'desc');
        });
        static::creating(function (Ticket $ticket) {
            $ticket->number = str_pad(
                Ticket::where('project_id', $ticket->project_id)
                        ->withTrashed()
                        ->count() + 1,
                4,
                '0',
                STR_PAD_LEFT
            );
        });
    }

    public function owner(): BelongsTo
    {
        return $this->belongsTo(User::class, 'owner_id')->withTrashed();
    }

    public function responsible(): BelongsTo
    {
        return $this->belongsTo(User::class, 'responsible_id')->withTrashed();
    }

    public function project(): BelongsTo
    {
        return $this->belongsTo(Project::class)->withTrashed();
    }

    public function comments(): HasMany
    {
        return $this->hasMany(Comment::class);
    }

    public function ticketNumber(): Attribute
    {
        return new Attribute(
            get: fn() => $this->project?->ticket_prefix . '' . $this->number
        );
    }

    public function __toString(): string
    {
        return $this->title;
    }

    public function activityLogLink(): string
    {
        return route('tickets.number', $this->ticket_number);
    }

    public function chat(): HasOne
    {
        return $this->hasOne(Chat::class);
    }

}


================================================
FILE: app/Models/TicketPriority.php
================================================
<?php

namespace App\Models;

use App\Core\HasLogsActivity;
use App\Core\LogsActivity;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class TicketPriority extends Model implements HasLogsActivity
{
    use HasFactory, SoftDeletes, LogsActivity;

    protected $fillable = [
        'title',
        'text_color',
        'bg_color',
        'icon',
        'slug'
    ];

    public function __toString(): string
    {
        return $this->title;
    }

    public function activityLogLink(): string
    {
        return route('administration.ticket
Download .txt
gitextract_82am4k6c/

├── .editorconfig
├── .gitattributes
├── .github/
│   ├── FUNDING.yml
│   └── ISSUE_TEMPLATE/
│       ├── bug_report.md
│       └── feature_request.md
├── .gitignore
├── CODE_OF_CONDUCT.md
├── LICENSE.md
├── Procfile
├── README.md
├── SECURITY.md
├── app/
│   ├── Console/
│   │   └── Kernel.php
│   ├── Core/
│   │   ├── CrudDialogHelper.php
│   │   ├── HasLogsActivity.php
│   │   └── LogsActivity.php
│   ├── Exceptions/
│   │   └── Handler.php
│   ├── Http/
│   │   ├── Controllers/
│   │   │   ├── Auth/
│   │   │   │   └── LogoutController.php
│   │   │   ├── Controller.php
│   │   │   └── TicketNumberController.php
│   │   ├── Kernel.php
│   │   ├── Livewire/
│   │   │   ├── Administration/
│   │   │   │   ├── ActivityLogs.php
│   │   │   │   ├── Companies.php
│   │   │   │   ├── CompaniesDialog.php
│   │   │   │   ├── Roles.php
│   │   │   │   ├── RolesDialog.php
│   │   │   │   ├── TicketPriorities.php
│   │   │   │   ├── TicketPrioritiesDialog.php
│   │   │   │   ├── TicketStatuses.php
│   │   │   │   ├── TicketStatusesDialog.php
│   │   │   │   ├── TicketTypes.php
│   │   │   │   ├── TicketTypesDialog.php
│   │   │   │   ├── Users.php
│   │   │   │   └── UsersDialog.php
│   │   │   ├── Analytics.php
│   │   │   ├── Auth/
│   │   │   │   ├── ActivateAccount.php
│   │   │   │   ├── ForgotPassword.php
│   │   │   │   ├── Login.php
│   │   │   │   └── RecoverPassword.php
│   │   │   ├── Chat.php
│   │   │   ├── Kanban.php
│   │   │   ├── MyNotifications.php
│   │   │   ├── MyProfile.php
│   │   │   ├── Projects.php
│   │   │   ├── ProjectsDialog.php
│   │   │   ├── TicketDetails/
│   │   │   │   ├── Content.php
│   │   │   │   ├── Priority.php
│   │   │   │   ├── Responsible.php
│   │   │   │   ├── Status.php
│   │   │   │   ├── Title.php
│   │   │   │   └── Type.php
│   │   │   ├── TicketDetails.php
│   │   │   ├── TicketDetailsComments.php
│   │   │   ├── TicketDetailsCommentsContent.php
│   │   │   ├── Tickets.php
│   │   │   └── TicketsDialog.php
│   │   └── Middleware/
│   │       ├── Authenticate.php
│   │       ├── CanAccessTicket.php
│   │       ├── EncryptCookies.php
│   │       ├── LocaleMiddleware.php
│   │       ├── PreventRequestsDuringMaintenance.php
│   │       ├── RedirectIfAuthenticated.php
│   │       ├── TrimStrings.php
│   │       ├── TrustHosts.php
│   │       ├── TrustProxies.php
│   │       ├── ValidateSignature.php
│   │       └── VerifyCsrfToken.php
│   ├── Jobs/
│   │   ├── CommentCreatedJob.php
│   │   ├── TicketCreatedJob.php
│   │   └── TicketUpdatedJob.php
│   ├── Models/
│   │   ├── Chat.php
│   │   ├── Comment.php
│   │   ├── Company.php
│   │   ├── CompanyUser.php
│   │   ├── FavoriteProject.php
│   │   ├── Icon.php
│   │   ├── Project.php
│   │   ├── Ticket.php
│   │   ├── TicketPriority.php
│   │   ├── TicketStatus.php
│   │   ├── TicketType.php
│   │   └── User.php
│   ├── Notifications/
│   │   ├── CommentCreateNotification.php
│   │   ├── TicketCreatedNotification.php
│   │   ├── TicketUpdatedNotification.php
│   │   ├── UserActivatedNotification.php
│   │   └── UserCreatedNotification.php
│   ├── Providers/
│   │   ├── AppServiceProvider.php
│   │   ├── AuthServiceProvider.php
│   │   ├── BroadcastServiceProvider.php
│   │   ├── EventServiceProvider.php
│   │   └── RouteServiceProvider.php
│   ├── Tables/
│   │   └── Columns/
│   │       └── UserColumn.php
│   ├── View/
│   │   └── Components/
│   │       ├── BaseLayout.php
│   │       ├── GuestLayout.php
│   │       ├── Layout.php
│   │       ├── MainMenu.php
│   │       ├── NotificationType.php
│   │       ├── PrioritySpan.php
│   │       ├── RoleSpan.php
│   │       ├── StatusSpan.php
│   │       ├── TypeSpan.php
│   │       └── UserAvatar.php
│   └── helpers.php
├── artisan
├── bootstrap/
│   ├── app.php
│   └── cache/
│       └── .gitignore
├── composer.json
├── config/
│   ├── activitylog.php
│   ├── app.php
│   ├── auth.php
│   ├── broadcasting.php
│   ├── cache.php
│   ├── cors.php
│   ├── database.php
│   ├── filament-avatar.php
│   ├── filament-kanban-board.php
│   ├── filament.php
│   ├── filesystems.php
│   ├── hashing.php
│   ├── larabug.php
│   ├── laravel-translatable-string-exporter.php
│   ├── logging.php
│   ├── mail.php
│   ├── permission.php
│   ├── queue.php
│   ├── sanctum.php
│   ├── services.php
│   ├── session.php
│   ├── system.php
│   ├── tables.php
│   └── view.php
├── database/
│   ├── .gitignore
│   ├── factories/
│   │   └── UserFactory.php
│   ├── help_desk.pgsql.sql
│   ├── help_desk.sql
│   ├── migrations/
│   │   ├── 2014_10_12_000000_create_users_table.php
│   │   ├── 2014_10_12_100000_create_password_resets_table.php
│   │   ├── 2019_08_19_000000_create_failed_jobs_table.php
│   │   ├── 2019_12_14_000001_create_personal_access_tokens_table.php
│   │   ├── 2022_09_08_094911_create_icons_table.php
│   │   ├── 2022_09_09_220749_create_tickets_table.php
│   │   ├── 2022_09_10_205032_create_projects_table.php
│   │   ├── 2022_09_10_205612_create_user_projects_table.php
│   │   ├── 2022_09_10_205915_add_project_to_tickets.php
│   │   ├── 2022_09_10_220736_add_role_to_users.php
│   │   ├── 2022_09_11_142205_add_register_token_to_users.php
│   │   ├── 2022_09_11_153059_add_soft_deletes_to_users.php
│   │   ├── 2022_09_11_163751_create_favorite_projects_table.php
│   │   ├── 2022_09_11_202013_add_type_to_tickets.php
│   │   ├── 2022_09_12_090928_create_comments_table.php
│   │   ├── 2022_09_12_095043_create_jobs_table.php
│   │   ├── 2022_09_14_175349_create_notifications_table.php
│   │   ├── 2022_09_15_142643_add_local_to_user.php
│   │   ├── 2022_09_19_095513_create_ticket_statuses_table.php
│   │   ├── 2022_09_19_111627_create_ticket_priorities_table.php
│   │   ├── 2022_09_19_111633_create_ticket_types_table.php
│   │   ├── 2022_09_19_122813_add_slug_to_ticket_statuses.php
│   │   ├── 2022_09_19_122821_add_slug_to_ticket_types.php
│   │   ├── 2022_09_19_122828_add_slug_to_ticket_priorities.php
│   │   ├── 2022_09_19_143232_add_ticket_prefix_to_projects.php
│   │   ├── 2022_09_19_144042_add_number_to_tickets.php
│   │   ├── 2022_09_19_181148_create_activity_log_table.php
│   │   ├── 2022_09_19_181149_add_event_column_to_activity_log_table.php
│   │   ├── 2022_09_19_181150_add_batch_uuid_column_to_activity_log_table.php
│   │   ├── 2022_09_19_181611_drop_user_projects.php
│   │   ├── 2022_09_19_212320_create_chats_table.php
│   │   ├── 2022_09_24_230950_create_companies_table.php
│   │   ├── 2022_09_25_154331_create_permission_tables.php
│   │   ├── 2022_09_25_163436_remove_role_from_users.php
│   │   ├── 2022_09_25_165452_create_company_users_table.php
│   │   └── 2022_09_30_133603_add_company_id_to_projects.php
│   └── seeders/
│       ├── DatabaseSeeder.php
│       ├── FontAwesomeFreeSeeder.php
│       └── PermissionsSeeder.php
├── docker-compose.yml
├── docs/
│   ├── .nojekyll
│   ├── README.md
│   ├── _sidebar.md
│   ├── changelog.md
│   ├── configuration.md
│   ├── getting-started.md
│   ├── index.html
│   ├── permissions.md
│   └── screenshots.md
├── lang/
│   ├── en/
│   │   ├── auth.php
│   │   ├── pagination.php
│   │   ├── passwords.php
│   │   └── validation.php
│   ├── fr/
│   │   ├── auth.php
│   │   ├── pagination.php
│   │   ├── passwords.php
│   │   └── validation.php
│   └── fr.json
├── package.json
├── phpunit.xml
├── postcss.config.js
├── public/
│   ├── .htaccess
│   ├── index.php
│   ├── robots.txt
│   └── vendor/
│       └── filament-forms-tinyeditor/
│           └── tinymce/
│               ├── langs/
│               │   ├── README.md
│               │   ├── ar.js
│               │   ├── ca.js
│               │   ├── cs.js
│               │   ├── cs_CZ.js
│               │   ├── cy.js
│               │   ├── da.js
│               │   ├── de.js
│               │   ├── es_419.js
│               │   ├── fa.js
│               │   ├── fi.js
│               │   ├── fr_FR.js
│               │   ├── he_IL.js
│               │   ├── hr.js
│               │   ├── hu_HU.js
│               │   ├── id.js
│               │   ├── it_IT.js
│               │   ├── ja.js
│               │   ├── kab.js
│               │   ├── nb_NO.js
│               │   ├── nl.js
│               │   ├── nl_BE.js
│               │   ├── pl.js
│               │   ├── pt_BR.js
│               │   ├── pt_PT.js
│               │   ├── ro.js
│               │   ├── ru.js
│               │   ├── ru_RU.js
│               │   ├── sk.js
│               │   ├── sl.js
│               │   ├── sq.js
│               │   ├── sv_SE.js
│               │   ├── ta.js
│               │   ├── ta_IN.js
│               │   ├── th_TH.js
│               │   ├── tr.js
│               │   ├── tr_TR.js
│               │   ├── ug.js
│               │   ├── zh_CN.js
│               │   └── zh_TW.js
│               ├── license.txt
│               ├── plugins/
│               │   └── emoticons/
│               │       └── js/
│               │           ├── emojiimages.js
│               │           └── emojis.js
│               ├── skins/
│               │   └── ui/
│               │       ├── dark/
│               │       │   ├── content.css
│               │       │   ├── content.inline.css
│               │       │   ├── content.mobile.css
│               │       │   ├── skin.css
│               │       │   └── skin.mobile.css
│               │       └── light/
│               │           ├── content.css
│               │           ├── content.inline.css
│               │           ├── content.mobile.css
│               │           ├── skin.css
│               │           └── skin.mobile.css
│               └── tinymce.d.ts
├── resources/
│   ├── css/
│   │   ├── app.scss
│   │   └── media-queries.scss
│   ├── js/
│   │   ├── app.js
│   │   └── bootstrap.js
│   └── views/
│       ├── administration/
│       │   ├── activity-logs.blade.php
│       │   ├── companies.blade.php
│       │   ├── roles.blade.php
│       │   ├── ticket-priorities.blade.php
│       │   ├── ticket-statuses.blade.php
│       │   ├── ticket-types.blade.php
│       │   └── users.blade.php
│       ├── analytics.blade.php
│       ├── auth/
│       │   ├── activate-account.blade.php
│       │   ├── forgot-password.blade.php
│       │   ├── login.blade.php
│       │   └── recover-password.blade.php
│       ├── components/
│       │   ├── base-layout.blade.php
│       │   ├── guest-layout.blade.php
│       │   ├── layout.blade.php
│       │   ├── main-menu.blade.php
│       │   ├── notification-type.blade.php
│       │   ├── priority-span.blade.php
│       │   ├── role-span.blade.php
│       │   ├── status-span.blade.php
│       │   ├── type-span.blade.php
│       │   └── user-avatar.blade.php
│       ├── kanban.blade.php
│       ├── livewire/
│       │   ├── administration/
│       │   │   ├── activity-logs.blade.php
│       │   │   ├── companies-dialog.blade.php
│       │   │   ├── companies.blade.php
│       │   │   ├── roles-dialog.blade.php
│       │   │   ├── roles.blade.php
│       │   │   ├── ticket-priorities-dialog.blade.php
│       │   │   ├── ticket-priorities.blade.php
│       │   │   ├── ticket-statuses-dialog.blade.php
│       │   │   ├── ticket-statuses.blade.php
│       │   │   ├── ticket-types-dialog.blade.php
│       │   │   ├── ticket-types.blade.php
│       │   │   ├── users-dialog.blade.php
│       │   │   └── users.blade.php
│       │   ├── analytics.blade.php
│       │   ├── auth/
│       │   │   ├── activate-account.blade.php
│       │   │   ├── forgot-password.blade.php
│       │   │   ├── login.blade.php
│       │   │   └── recover-password.blade.php
│       │   ├── chat.blade.php
│       │   ├── my-notifications.blade.php
│       │   ├── my-profile.blade.php
│       │   ├── projects-dialog.blade.php
│       │   ├── projects.blade.php
│       │   ├── ticket-details/
│       │   │   ├── content.blade.php
│       │   │   ├── priority.blade.php
│       │   │   ├── responsible.blade.php
│       │   │   ├── status.blade.php
│       │   │   ├── title.blade.php
│       │   │   └── type.blade.php
│       │   ├── ticket-details-comments-content.blade.php
│       │   ├── ticket-details-comments.blade.php
│       │   ├── ticket-details.blade.php
│       │   ├── tickets-dialog.blade.php
│       │   └── tickets.blade.php
│       ├── my-profile.blade.php
│       ├── notifications.blade.php
│       ├── tables/
│       │   └── columns/
│       │       └── user-column.blade.php
│       ├── ticket-details.blade.php
│       ├── tickets.blade.php
│       ├── vendor/
│       │   ├── filament-kanban-board/
│       │   │   ├── .gitkeep
│       │   │   └── kanban-header.blade.php
│       │   └── pagination/
│       │       └── tailwind.blade.php
│       └── welcome.blade.php
├── routes/
│   ├── api.php
│   ├── channels.php
│   ├── console.php
│   └── web.php
├── storage/
│   ├── app/
│   │   └── .gitignore
│   ├── framework/
│   │   ├── .gitignore
│   │   ├── cache/
│   │   │   └── .gitignore
│   │   ├── sessions/
│   │   │   └── .gitignore
│   │   ├── testing/
│   │   │   └── .gitignore
│   │   └── views/
│   │       └── .gitignore
│   └── logs/
│       └── .gitignore
├── tailwind.config.js
├── tests/
│   ├── CreatesApplication.php
│   ├── Feature/
│   │   └── ExampleTest.php
│   ├── TestCase.php
│   └── Unit/
│       └── ExampleTest.php
└── vite.config.js
Download .txt
SYMBOL INDEX (1091 symbols across 137 files)

FILE: app/Console/Kernel.php
  class Kernel (line 8) | class Kernel extends ConsoleKernel
    method schedule (line 16) | protected function schedule(Schedule $schedule)
    method commands (line 26) | protected function commands()

FILE: app/Core/CrudDialogHelper.php
  type CrudDialogHelper (line 9) | trait CrudDialogHelper
    method deleteConfirmation (line 24) | public function deleteConfirmation(string $title, string $body, string...

FILE: app/Core/HasLogsActivity.php
  type HasLogsActivity (line 5) | interface HasLogsActivity
    method __toString (line 8) | public function __toString(): string;
    method activityLogLink (line 10) | public function activityLogLink(): string;

FILE: app/Core/LogsActivity.php
  type LogsActivity (line 9) | trait LogsActivity
    method getActivitylogOptions (line 19) | public function getActivitylogOptions(): LogOptions
    method fromCamelCase (line 47) | private function fromCamelCase($input)

FILE: app/Exceptions/Handler.php
  class Handler (line 8) | class Handler extends ExceptionHandler
    method register (line 44) | public function register()

FILE: app/Http/Controllers/Auth/LogoutController.php
  class LogoutController (line 9) | class LogoutController extends Controller
    method __invoke (line 12) | public function __invoke(Request $request)

FILE: app/Http/Controllers/Controller.php
  class Controller (line 10) | class Controller extends BaseController

FILE: app/Http/Controllers/TicketNumberController.php
  class TicketNumberController (line 9) | class TicketNumberController extends Controller
    method __invoke (line 18) | public function __invoke(string $number)

FILE: app/Http/Kernel.php
  class Kernel (line 7) | class Kernel extends HttpKernel

FILE: app/Http/Livewire/Administration/ActivityLogs.php
  class ActivityLogs (line 13) | class ActivityLogs extends Component implements HasForms
    method mount (line 19) | public function mount(): void
    method render (line 24) | public function render()
    method getFormSchema (line 40) | protected function getFormSchema(): array
    method search (line 59) | public function search(): void

FILE: app/Http/Livewire/Administration/Companies.php
  class Companies (line 24) | class Companies extends Component implements HasTable
    method render (line 32) | public function render()
    method getTableQuery (line 42) | protected function getTableQuery(): Builder|Relation
    method getTableColumns (line 59) | protected function getTableColumns(): array
    method getTableActions (line 104) | protected function getTableActions(): array
    method getTableHeaderActions (line 121) | protected function getTableHeaderActions(): array
    method getDefaultTableSortColumn (line 156) | protected function getDefaultTableSortColumn(): ?string
    method getDefaultTableSortDirection (line 166) | protected function getDefaultTableSortDirection(): ?string
    method updateCompany (line 177) | public function updateCompany($id)
    method createCompany (line 188) | public function createCompany()
    method cancelCompany (line 199) | public function cancelCompany()
    method companySaved (line 210) | public function companySaved()
    method companyDeleted (line 220) | public function companyDeleted()

FILE: app/Http/Livewire/Administration/CompaniesDialog.php
  class CompaniesDialog (line 29) | class CompaniesDialog extends Component implements HasForms
    method mount (line 38) | public function mount(): void
    method render (line 51) | public function render()
    method getFormSchema (line 61) | protected function getFormSchema(): array
    method save (line 121) | public function save(): void
    method doDeleteCompany (line 171) | public function doDeleteCompany(): void
    method cancelDeleteCompany (line 188) | public function cancelDeleteCompany(): void
    method deleteCompany (line 199) | public function deleteCompany(): void

FILE: app/Http/Livewire/Administration/Roles.php
  class Roles (line 21) | class Roles extends Component implements HasTable
    method render (line 29) | public function render()
    method getTableQuery (line 39) | protected function getTableQuery(): Builder|Relation
    method getTableColumns (line 51) | protected function getTableColumns(): array
    method getTableActions (line 72) | protected function getTableActions(): array
    method getTableHeaderActions (line 89) | protected function getTableHeaderActions(): array
    method getDefaultTableSortColumn (line 121) | protected function getDefaultTableSortColumn(): ?string
    method getDefaultTableSortDirection (line 131) | protected function getDefaultTableSortDirection(): ?string
    method updateRole (line 142) | public function updateRole($id)
    method createRole (line 153) | public function createRole()
    method cancelRole (line 164) | public function cancelRole()
    method roleSaved (line 175) | public function roleSaved()
    method roleDeleted (line 185) | public function roleDeleted()

FILE: app/Http/Livewire/Administration/RolesDialog.php
  class RolesDialog (line 16) | class RolesDialog extends Component implements HasForms
    method mount (line 27) | public function mount(): void
    method render (line 36) | public function render()
    method getFormSchema (line 46) | protected function getFormSchema(): array
    method assignAllPermissions (line 81) | public function assignAllPermissions(): void
    method removeAllPermissions (line 91) | public function removeAllPermissions(): void
    method save (line 101) | public function save(): void
    method doDeleteRole (line 130) | public function doDeleteRole(): void
    method cancelDeleteRole (line 147) | public function cancelDeleteRole(): void
    method deleteRole (line 158) | public function deleteRole(): void

FILE: app/Http/Livewire/Administration/TicketPriorities.php
  class TicketPriorities (line 20) | class TicketPriorities extends Component implements HasTable
    method render (line 28) | public function render()
    method getTableQuery (line 38) | protected function getTableQuery(): Builder|Relation
    method getTableColumns (line 48) | protected function getTableColumns(): array
    method getTableActions (line 77) | protected function getTableActions(): array
    method getTableHeaderActions (line 93) | protected function getTableHeaderActions(): array
    method getDefaultTableSortColumn (line 120) | protected function getDefaultTableSortColumn(): ?string
    method getDefaultTableSortDirection (line 130) | protected function getDefaultTableSortDirection(): ?string
    method updatePriority (line 141) | public function updatePriority($id)
    method createPriority (line 152) | public function createPriority()
    method cancelPriority (line 163) | public function cancelPriority()
    method prioritySaved (line 174) | public function prioritySaved()
    method priorityDeleted (line 184) | public function priorityDeleted()

FILE: app/Http/Livewire/Administration/TicketPrioritiesDialog.php
  class TicketPrioritiesDialog (line 22) | class TicketPrioritiesDialog extends Component implements HasForms
    method mount (line 31) | public function mount(): void
    method render (line 42) | public function render()
    method getFormSchema (line 52) | protected function getFormSchema(): array
    method save (line 118) | public function save(): void
    method doDeletePriority (line 154) | public function doDeletePriority(): void
    method cancelDeletePriority (line 171) | public function cancelDeletePriority(): void
    method deletePriority (line 182) | public function deletePriority(): void

FILE: app/Http/Livewire/Administration/TicketStatuses.php
  class TicketStatuses (line 20) | class TicketStatuses extends Component implements HasTable
    method render (line 28) | public function render()
    method getTableQuery (line 38) | protected function getTableQuery(): Builder|Relation
    method getTableColumns (line 48) | protected function getTableColumns(): array
    method getTableActions (line 80) | protected function getTableActions(): array
    method getTableHeaderActions (line 96) | protected function getTableHeaderActions(): array
    method getDefaultTableSortColumn (line 123) | protected function getDefaultTableSortColumn(): ?string
    method getDefaultTableSortDirection (line 133) | protected function getDefaultTableSortDirection(): ?string
    method updateStatus (line 144) | public function updateStatus($id)
    method createStatus (line 155) | public function createStatus()
    method cancelStatus (line 166) | public function cancelStatus()
    method statusSaved (line 177) | public function statusSaved()
    method statusDeleted (line 187) | public function statusDeleted()

FILE: app/Http/Livewire/Administration/TicketStatusesDialog.php
  class TicketStatusesDialog (line 18) | class TicketStatusesDialog extends Component implements HasForms
    method mount (line 27) | public function mount(): void
    method render (line 38) | public function render()
    method getFormSchema (line 48) | protected function getFormSchema(): array
    method save (line 83) | public function save(): void
    method doDeleteStatus (line 128) | public function doDeleteStatus(): void
    method cancelDeleteStatus (line 145) | public function cancelDeleteStatus(): void
    method deleteStatus (line 156) | public function deleteStatus(): void

FILE: app/Http/Livewire/Administration/TicketTypes.php
  class TicketTypes (line 19) | class TicketTypes extends Component implements HasTable
    method render (line 27) | public function render()
    method getTableQuery (line 37) | protected function getTableQuery(): Builder|Relation
    method getTableColumns (line 47) | protected function getTableColumns(): array
    method getTableActions (line 76) | protected function getTableActions(): array
    method getTableHeaderActions (line 92) | protected function getTableHeaderActions(): array
    method getDefaultTableSortColumn (line 119) | protected function getDefaultTableSortColumn(): ?string
    method getDefaultTableSortDirection (line 129) | protected function getDefaultTableSortDirection(): ?string
    method updateType (line 140) | public function updateType($id)
    method createType (line 151) | public function createType()
    method cancelType (line 162) | public function cancelType()
    method typeSaved (line 173) | public function typeSaved()
    method typeDeleted (line 183) | public function typeDeleted()

FILE: app/Http/Livewire/Administration/TicketTypesDialog.php
  class TicketTypesDialog (line 20) | class TicketTypesDialog extends Component implements HasForms
    method mount (line 29) | public function mount(): void
    method render (line 40) | public function render()
    method getFormSchema (line 50) | protected function getFormSchema(): array
    method save (line 107) | public function save(): void
    method doDeleteType (line 143) | public function doDeleteType(): void
    method cancelDeleteType (line 160) | public function cancelDeleteType(): void
    method deleteType (line 171) | public function deleteType(): void

FILE: app/Http/Livewire/Administration/Users.php
  class Users (line 23) | class Users extends Component implements HasTable
    method render (line 31) | public function render()
    method getTableQuery (line 41) | protected function getTableQuery(): Builder|Relation
    method getTableColumns (line 64) | protected function getTableColumns(): array
    method getTableActions (line 101) | protected function getTableActions(): array
    method getTableHeaderActions (line 126) | protected function getTableHeaderActions(): array
    method getDefaultTableSortColumn (line 163) | protected function getDefaultTableSortColumn(): ?string
    method getDefaultTableSortDirection (line 173) | protected function getDefaultTableSortDirection(): ?string
    method getTableFilters (line 183) | protected function getTableFilters(): array
    method updateUser (line 210) | public function updateUser($id)
    method createUser (line 221) | public function createUser()
    method cancelUser (line 232) | public function cancelUser()
    method userSaved (line 243) | public function userSaved()
    method userDeleted (line 253) | public function userDeleted()
    method resendActivationEmail (line 264) | public function resendActivationEmail(int $userId)

FILE: app/Http/Livewire/Administration/UsersDialog.php
  class UsersDialog (line 25) | class UsersDialog extends Component implements HasForms
    method mount (line 36) | public function mount(): void
    method render (line 47) | public function render()
    method getFormSchema (line 57) | protected function getFormSchema(): array
    method assignAllRoles (line 125) | public function assignAllRoles(): void
    method removeAllRoles (line 135) | public function removeAllRoles(): void
    method save (line 145) | public function save(): void
    method doDeleteUser (line 199) | public function doDeleteUser(): void
    method cancelDeleteUser (line 216) | public function cancelDeleteUser(): void
    method deleteUser (line 227) | public function deleteUser(): void

FILE: app/Http/Livewire/Analytics.php
  class Analytics (line 10) | class Analytics extends Component
    method mount (line 17) | public function mount(): void
    method render (line 25) | public function render()
    method loadAssignedTickets (line 35) | private function loadAssignedTickets(): void
    method loadNotAssignedTickets (line 45) | private function loadNotAssignedTickets(): void
    method loadTicketsAssignments (line 55) | private function loadTicketsAssignments(): void
    method loadTicketsByStatuses (line 78) | private function loadTicketsByStatuses(): void

FILE: app/Http/Livewire/Auth/ActivateAccount.php
  class ActivateAccount (line 13) | class ActivateAccount extends Component implements HasForms
    method mount (line 19) | public function mount(): void
    method render (line 24) | public function render()
    method getFormSchema (line 34) | protected function getFormSchema(): array
    method activate (line 58) | public function activate(): void

FILE: app/Http/Livewire/Auth/ForgotPassword.php
  class ForgotPassword (line 14) | class ForgotPassword extends Component implements HasForms
    method mount (line 18) | public function mount()
    method render (line 23) | public function render()
    method getFormSchema (line 33) | protected function getFormSchema(): array
    method forgotPassword (line 52) | public function forgotPassword(): void

FILE: app/Http/Livewire/Auth/Login.php
  class Login (line 18) | class Login extends Component implements HasForms
    method mount (line 23) | public function mount()
    method render (line 32) | public function render()
    method getFormSchema (line 49) | protected function getFormSchema(): array
    method login (line 76) | public function login(): void

FILE: app/Http/Livewire/Auth/RecoverPassword.php
  class RecoverPassword (line 20) | class RecoverPassword extends Component implements HasForms
    method mount (line 26) | public function mount(string $token)
    method render (line 36) | public function render()
    method getFormSchema (line 46) | protected function getFormSchema(): array
    method recoverPassword (line 78) | public function recoverPassword(): void

FILE: app/Http/Livewire/Chat.php
  class Chat (line 12) | class Chat extends Component implements HasForms
    method mount (line 18) | public function mount(): void
    method render (line 23) | public function render()
    method getFormSchema (line 34) | protected function getFormSchema(): array
    method send (line 53) | public function send(): void

FILE: app/Http/Livewire/Kanban.php
  class Kanban (line 15) | class Kanban extends FilamentKanbanBoard
    method statuses (line 27) | protected function statuses(): Collection
    method records (line 37) | protected function records(): Collection
    method styles (line 123) | protected function styles(): array
    method onStatusChanged (line 147) | public function onStatusChanged($recordId, $statusId, $fromOrderedIds,...
    method onRecordClick (line 192) | public function onRecordClick($recordId): void

FILE: app/Http/Livewire/MyNotifications.php
  class MyNotifications (line 8) | class MyNotifications extends Component
    method render (line 11) | public function render()
    method markRead (line 23) | public function markRead(string $notification): void
    method markAllRead (line 40) | public function markAllRead(): void

FILE: app/Http/Livewire/MyProfile.php
  class MyProfile (line 20) | class MyProfile extends Component implements HasForms
    method mount (line 26) | public function mount(): void
    method render (line 31) | public function render()
    method initProfile (line 41) | private function initProfile(): void
    method getFormSchema (line 63) | protected function getFormSchema(): array
    method save (line 102) | public function save(): void

FILE: app/Http/Livewire/Projects.php
  class Projects (line 25) | class Projects extends Component implements HasTable
    method render (line 33) | public function render()
    method getTableQuery (line 43) | protected function getTableQuery(): Builder|Relation
    method getTableColumns (line 63) | protected function getTableColumns(): array
    method getTableActions (line 124) | protected function getTableActions(): array
    method getTableHeaderActions (line 140) | protected function getTableHeaderActions(): array
    method getDefaultTableSortColumn (line 171) | protected function getDefaultTableSortColumn(): ?string
    method getDefaultTableSortDirection (line 181) | protected function getDefaultTableSortDirection(): ?string
    method updateProject (line 192) | public function updateProject($id)
    method createProject (line 203) | public function createProject()
    method cancelProject (line 214) | public function cancelProject()
    method projectSaved (line 225) | public function projectSaved()
    method projectDeleted (line 235) | public function projectDeleted()
    method toggleFavoriteProject (line 246) | public function toggleFavoriteProject(int $projectId)

FILE: app/Http/Livewire/ProjectsDialog.php
  class ProjectsDialog (line 20) | class ProjectsDialog extends Component implements HasForms
    method mount (line 29) | public function mount(): void
    method render (line 40) | public function render()
    method getFormSchema (line 50) | protected function getFormSchema(): array
    method save (line 118) | public function save(): void
    method doDeleteProject (line 155) | public function doDeleteProject(): void
    method cancelDeleteProject (line 172) | public function cancelDeleteProject(): void
    method deleteProject (line 183) | public function deleteProject(): void

FILE: app/Http/Livewire/TicketDetails.php
  class TicketDetails (line 9) | class TicketDetails extends Component
    method mount (line 17) | public function mount(): void
    method render (line 26) | public function render()
    method selectMenu (line 37) | public function selectMenu($item)
    method ticketSaved (line 48) | public function ticketSaved(): void
    method copyTicketUrl (line 59) | public function copyTicketUrl(int $ticketId): void

FILE: app/Http/Livewire/TicketDetails/Content.php
  class Content (line 14) | class Content extends Component implements HasForms
    method mount (line 21) | public function mount(): void
    method render (line 28) | public function render()
    method getFormSchema (line 38) | protected function getFormSchema(): array
    method update (line 56) | public function update(): void
    method save (line 66) | public function save(): void

FILE: app/Http/Livewire/TicketDetails/Priority.php
  class Priority (line 14) | class Priority extends Component implements HasForms
    method mount (line 21) | public function mount(): void
    method render (line 28) | public function render()
    method getFormSchema (line 38) | protected function getFormSchema(): array
    method update (line 56) | public function update(): void
    method save (line 66) | public function save(): void

FILE: app/Http/Livewire/TicketDetails/Responsible.php
  class Responsible (line 15) | class Responsible extends Component implements HasForms
    method mount (line 22) | public function mount(): void
    method render (line 29) | public function render()
    method getFormSchema (line 39) | protected function getFormSchema(): array
    method update (line 56) | public function update(): void
    method save (line 66) | public function save(): void
    method assignToMe (line 97) | public function assignToMe(): void

FILE: app/Http/Livewire/TicketDetails/Status.php
  class Status (line 13) | class Status extends Component implements HasForms
    method mount (line 20) | public function mount(): void
    method render (line 27) | public function render()
    method getFormSchema (line 37) | protected function getFormSchema(): array
    method update (line 55) | public function update(): void
    method save (line 65) | public function save(): void

FILE: app/Http/Livewire/TicketDetails/Title.php
  class Title (line 13) | class Title extends Component implements HasForms
    method mount (line 20) | public function mount(): void
    method render (line 27) | public function render()
    method getFormSchema (line 37) | protected function getFormSchema(): array
    method update (line 54) | public function update(): void
    method save (line 64) | public function save(): void

FILE: app/Http/Livewire/TicketDetails/Type.php
  class Type (line 13) | class Type extends Component implements HasForms
    method mount (line 20) | public function mount(): void
    method render (line 27) | public function render()
    method getFormSchema (line 37) | protected function getFormSchema(): array
    method update (line 55) | public function update(): void
    method save (line 65) | public function save(): void

FILE: app/Http/Livewire/TicketDetailsComments.php
  class TicketDetailsComments (line 16) | class TicketDetailsComments extends Component implements HasForms
    method mount (line 25) | public function mount(): void
    method render (line 30) | public function render()
    method getFormSchema (line 40) | protected function getFormSchema(): array
    method commentDeleted (line 59) | public function commentDeleted(): void
    method commentCreated (line 69) | public function commentCreated(): void
    method commentSaved (line 79) | public function commentSaved(): void
    method comment (line 89) | public function comment(): void

FILE: app/Http/Livewire/TicketDetailsCommentsContent.php
  class TicketDetailsCommentsContent (line 15) | class TicketDetailsCommentsContent extends Component implements HasForms
    method mount (line 32) | public function mount(): void
    method render (line 40) | public function render()
    method getFormSchema (line 50) | protected function getFormSchema(): array
    method updateComment (line 70) | public function updateComment(int $comment): void
    method save (line 84) | public function save(): void
    method doDeleteComment (line 107) | public function doDeleteComment(int $commentId): void
    method cancelDeleteComment (line 126) | public function cancelDeleteComment(): void
    method deleteComment (line 138) | public function deleteComment(Comment $comment): void
    method commentDeleted (line 167) | public function commentDeleted(): void
    method commentCreated (line 177) | public function commentCreated(): void
    method commentSaved (line 187) | public function commentSaved(): void

FILE: app/Http/Livewire/Tickets.php
  class Tickets (line 16) | class Tickets extends Component implements HasForms
    method mount (line 32) | public function mount()
    method render (line 48) | public function render()
    method selectMenu (line 103) | public function selectMenu($item)
    method getFormSchema (line 114) | protected function getFormSchema(): array
    method search (line 174) | public function search(): void
    method resetFilters (line 185) | public function resetFilters(): void
    method createTicket (line 200) | public function createTicket()
    method cancelTicket (line 211) | public function cancelTicket()
    method ticketSaved (line 222) | public function ticketSaved()
    method ticketDeleted (line 233) | public function ticketDeleted()
    method copyTicketUrl (line 244) | public function copyTicketUrl(int $ticketId): void

FILE: app/Http/Livewire/TicketsDialog.php
  class TicketsDialog (line 19) | class TicketsDialog extends Component implements HasForms
    method mount (line 25) | public function mount(): void
    method render (line 35) | public function render()
    method getFormSchema (line 45) | protected function getFormSchema(): array
    method save (line 97) | public function save(): void

FILE: app/Http/Middleware/Authenticate.php
  class Authenticate (line 7) | class Authenticate extends Middleware
    method redirectTo (line 15) | protected function redirectTo($request)

FILE: app/Http/Middleware/CanAccessTicket.php
  class CanAccessTicket (line 9) | class CanAccessTicket
    method handle (line 18) | public function handle(Request $request, Closure $next)

FILE: app/Http/Middleware/EncryptCookies.php
  class EncryptCookies (line 7) | class EncryptCookies extends Middleware

FILE: app/Http/Middleware/LocaleMiddleware.php
  class LocaleMiddleware (line 8) | class LocaleMiddleware
    method handle (line 17) | public function handle(Request $request, Closure $next)

FILE: app/Http/Middleware/PreventRequestsDuringMaintenance.php
  class PreventRequestsDuringMaintenance (line 7) | class PreventRequestsDuringMaintenance extends Middleware

FILE: app/Http/Middleware/RedirectIfAuthenticated.php
  class RedirectIfAuthenticated (line 10) | class RedirectIfAuthenticated
    method handle (line 20) | public function handle(Request $request, Closure $next, ...$guards)

FILE: app/Http/Middleware/TrimStrings.php
  class TrimStrings (line 7) | class TrimStrings extends Middleware

FILE: app/Http/Middleware/TrustHosts.php
  class TrustHosts (line 7) | class TrustHosts extends Middleware
    method hosts (line 14) | public function hosts()

FILE: app/Http/Middleware/TrustProxies.php
  class TrustProxies (line 8) | class TrustProxies extends Middleware

FILE: app/Http/Middleware/ValidateSignature.php
  class ValidateSignature (line 7) | class ValidateSignature extends Middleware

FILE: app/Http/Middleware/VerifyCsrfToken.php
  class VerifyCsrfToken (line 7) | class VerifyCsrfToken extends Middleware

FILE: app/Jobs/CommentCreatedJob.php
  class CommentCreatedJob (line 16) | class CommentCreatedJob implements ShouldQueue
    method __construct (line 27) | public function __construct(Comment $comment)
    method handle (line 37) | public function handle()

FILE: app/Jobs/TicketCreatedJob.php
  class TicketCreatedJob (line 15) | class TicketCreatedJob implements ShouldQueue
    method __construct (line 26) | public function __construct(Ticket $ticket)
    method handle (line 36) | public function handle()

FILE: app/Jobs/TicketUpdatedJob.php
  class TicketUpdatedJob (line 17) | class TicketUpdatedJob implements ShouldQueue
    method __construct (line 32) | public function __construct(
    method handle (line 52) | public function handle()

FILE: app/Models/Chat.php
  class Chat (line 11) | class Chat extends Model
    method boot (line 21) | protected static function boot()
    method ticket (line 29) | public function ticket(): BelongsTo
    method user (line 34) | public function user(): BelongsTo

FILE: app/Models/Comment.php
  class Comment (line 13) | class Comment extends Model implements HasLogsActivity
    method boot (line 23) | protected static function boot()
    method owner (line 31) | public function owner(): BelongsTo
    method ticket (line 36) | public function ticket(): BelongsTo
    method __toString (line 41) | public function __toString(): string
    method activityLogLink (line 46) | public function activityLogLink(): string

FILE: app/Models/Company.php
  class Company (line 11) | class Company extends Model
    method responsible (line 23) | public function responsible(): BelongsTo
    method users (line 28) | public function users(): BelongsToMany

FILE: app/Models/CompanyUser.php
  class CompanyUser (line 9) | class CompanyUser extends Model
    method user (line 18) | public function user(): BelongsTo
    method company (line 23) | public function company(): BelongsTo

FILE: app/Models/FavoriteProject.php
  class FavoriteProject (line 9) | class FavoriteProject extends Model
    method user (line 18) | public function user(): BelongsTo
    method project (line 23) | public function project(): BelongsTo

FILE: app/Models/Icon.php
  class Icon (line 8) | class Icon extends Model

FILE: app/Models/Project.php
  class Project (line 15) | class Project extends Model implements HasLogsActivity
    method boot (line 27) | protected static function boot()
    method owner (line 35) | public function owner(): BelongsTo
    method company (line 40) | public function company(): BelongsTo
    method tickets (line 45) | public function tickets(): HasMany
    method favoriteUsers (line 50) | public function favoriteUsers(): BelongsToMany
    method __toString (line 59) | public function __toString(): string
    method activityLogLink (line 64) | public function activityLogLink(): string

FILE: app/Models/Ticket.php
  class Ticket (line 16) | class Ticket extends Model implements HasLogsActivity
    method boot (line 36) | protected static function boot()
    method owner (line 54) | public function owner(): BelongsTo
    method responsible (line 59) | public function responsible(): BelongsTo
    method project (line 64) | public function project(): BelongsTo
    method comments (line 69) | public function comments(): HasMany
    method ticketNumber (line 74) | public function ticketNumber(): Attribute
    method __toString (line 81) | public function __toString(): string
    method activityLogLink (line 86) | public function activityLogLink(): string
    method chat (line 91) | public function chat(): HasOne

FILE: app/Models/TicketPriority.php
  class TicketPriority (line 11) | class TicketPriority extends Model implements HasLogsActivity
    method __toString (line 23) | public function __toString(): string
    method activityLogLink (line 28) | public function activityLogLink(): string

FILE: app/Models/TicketStatus.php
  class TicketStatus (line 11) | class TicketStatus extends Model implements HasLogsActivity
    method __toString (line 23) | public function __toString(): string
    method activityLogLink (line 28) | public function activityLogLink(): string

FILE: app/Models/TicketType.php
  class TicketType (line 11) | class TicketType extends Model implements HasLogsActivity
    method __toString (line 23) | public function __toString(): string
    method activityLogLink (line 28) | public function activityLogLink(): string

FILE: app/Models/User.php
  class User (line 20) | class User extends Authenticatable implements HasLogsActivity
    method boot (line 56) | protected static function boot()
    method projects (line 64) | public function projects(): HasMany
    method tickets (line 69) | public function tickets(): HasMany
    method assignedTickets (line 74) | public function assignedTickets(): HasMany
    method favoriteProjects (line 79) | public function favoriteProjects(): BelongsToMany
    method comments (line 88) | public function comments(): HasMany
    method __toString (line 93) | public function __toString(): string
    method activityLogLink (line 98) | public function activityLogLink(): string
    method isAccountActivated (line 103) | public function isAccountActivated(): Attribute
    method ownCompanies (line 110) | public function ownCompanies(): HasMany
    method companies (line 115) | public function companies(): BelongsToMany

FILE: app/Notifications/CommentCreateNotification.php
  class CommentCreateNotification (line 14) | class CommentCreateNotification extends Notification implements ShouldQueue
    method __construct (line 26) | public function __construct(Comment $comment, User $user)
    method via (line 38) | public function via($notifiable)
    method toMail (line 49) | public function toMail($notifiable)
    method toArray (line 76) | public function toArray($notifiable)

FILE: app/Notifications/TicketCreatedNotification.php
  class TicketCreatedNotification (line 13) | class TicketCreatedNotification extends Notification implements ShouldQueue
    method __construct (line 25) | public function __construct(Ticket $ticket, User $user)
    method via (line 37) | public function via($notifiable)
    method toMail (line 48) | public function toMail($notifiable)
    method toArray (line 83) | public function toArray($notifiable)

FILE: app/Notifications/TicketUpdatedNotification.php
  class TicketUpdatedNotification (line 13) | class TicketUpdatedNotification extends Notification implements ShouldQueue
    method __construct (line 28) | public function __construct(Ticket $ticket, string $field, string $bef...
    method via (line 43) | public function via($notifiable)
    method toMail (line 54) | public function toMail($notifiable)
    method toArray (line 83) | public function toArray($notifiable)

FILE: app/Notifications/UserActivatedNotification.php
  class UserActivatedNotification (line 10) | class UserActivatedNotification extends Notification implements ShouldQueue
    method __construct (line 19) | public function __construct()
    method via (line 30) | public function via($notifiable)
    method toMail (line 41) | public function toMail($notifiable)
    method toArray (line 63) | public function toArray($notifiable)

FILE: app/Notifications/UserCreatedNotification.php
  class UserCreatedNotification (line 11) | class UserCreatedNotification extends Notification implements ShouldQueue
    method __construct (line 22) | public function __construct(User $user)
    method via (line 33) | public function via($notifiable)
    method toMail (line 44) | public function toMail($notifiable)
    method toArray (line 70) | public function toArray($notifiable)

FILE: app/Providers/AppServiceProvider.php
  class AppServiceProvider (line 8) | class AppServiceProvider extends ServiceProvider
    method register (line 15) | public function register()
    method boot (line 25) | public function boot()

FILE: app/Providers/AuthServiceProvider.php
  class AuthServiceProvider (line 7) | class AuthServiceProvider extends ServiceProvider
    method boot (line 23) | public function boot()

FILE: app/Providers/BroadcastServiceProvider.php
  class BroadcastServiceProvider (line 8) | class BroadcastServiceProvider extends ServiceProvider
    method boot (line 15) | public function boot()

FILE: app/Providers/EventServiceProvider.php
  class EventServiceProvider (line 10) | class EventServiceProvider extends ServiceProvider
    method boot (line 28) | public function boot()
    method shouldDiscoverEvents (line 38) | public function shouldDiscoverEvents()

FILE: app/Providers/RouteServiceProvider.php
  class RouteServiceProvider (line 11) | class RouteServiceProvider extends ServiceProvider
    method boot (line 27) | public function boot()
    method configureRateLimiting (line 46) | protected function configureRateLimiting()

FILE: app/Tables/Columns/UserColumn.php
  class UserColumn (line 7) | class UserColumn extends Column

FILE: app/View/Components/BaseLayout.php
  class BaseLayout (line 7) | class BaseLayout extends Component
    method __construct (line 14) | public function __construct()
    method render (line 24) | public function render()

FILE: app/View/Components/GuestLayout.php
  class GuestLayout (line 7) | class GuestLayout extends Component
    method __construct (line 14) | public function __construct()
    method render (line 24) | public function render()

FILE: app/View/Components/Layout.php
  class Layout (line 7) | class Layout extends Component
    method __construct (line 14) | public function __construct()
    method render (line 24) | public function render()

FILE: app/View/Components/MainMenu.php
  class MainMenu (line 7) | class MainMenu extends Component
    method __construct (line 17) | public function __construct()
    method render (line 27) | public function render()

FILE: app/View/Components/NotificationType.php
  class NotificationType (line 7) | class NotificationType extends Component
    method __construct (line 16) | public function __construct($notification)
    method render (line 26) | public function render()

FILE: app/View/Components/PrioritySpan.php
  class PrioritySpan (line 8) | class PrioritySpan extends Component
    method __construct (line 17) | public function __construct($priority)
    method render (line 27) | public function render()

FILE: app/View/Components/RoleSpan.php
  class RoleSpan (line 7) | class RoleSpan extends Component
    method __construct (line 16) | public function __construct($role)
    method render (line 26) | public function render()

FILE: app/View/Components/StatusSpan.php
  class StatusSpan (line 8) | class StatusSpan extends Component
    method __construct (line 17) | public function __construct($status)
    method render (line 27) | public function render()

FILE: app/View/Components/TypeSpan.php
  class TypeSpan (line 8) | class TypeSpan extends Component
    method __construct (line 18) | public function __construct($type, $min = false)
    method render (line 29) | public function render()

FILE: app/View/Components/UserAvatar.php
  class UserAvatar (line 7) | class UserAvatar extends Component
    method __construct (line 18) | public function __construct($user, $size = 40)
    method render (line 29) | public function render()

FILE: app/helpers.php
  function statuses_list (line 15) | function statuses_list(): array
  function statuses_list_for_kanban (line 27) | function statuses_list_for_kanban(): array
  function priorities_list (line 44) | function priorities_list(): array
  function default_ticket_status (line 56) | function default_ticket_status(): string|null
  function types_list (line 71) | function types_list(): array
  function locales (line 83) | function locales(): array

FILE: database/factories/UserFactory.php
  class UserFactory (line 11) | class UserFactory extends Factory
    method definition (line 18) | public function definition()
    method unverified (line 34) | public function unverified()

FILE: database/migrations/2014_10_12_000000_create_users_table.php
  method up (line 14) | public function up()
  method down (line 32) | public function down()

FILE: database/migrations/2014_10_12_100000_create_password_resets_table.php
  method up (line 14) | public function up()
  method down (line 28) | public function down()

FILE: database/migrations/2019_08_19_000000_create_failed_jobs_table.php
  method up (line 14) | public function up()
  method down (line 32) | public function down()

FILE: database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php
  method up (line 14) | public function up()
  method down (line 33) | public function down()

FILE: database/migrations/2022_09_08_094911_create_icons_table.php
  method up (line 14) | public function up()
  method down (line 28) | public function down()

FILE: database/migrations/2022_09_09_220749_create_tickets_table.php
  method up (line 14) | public function up()
  method down (line 34) | public function down()

FILE: database/migrations/2022_09_10_205032_create_projects_table.php
  method up (line 13) | public function up()
  method down (line 30) | public function down()

FILE: database/migrations/2022_09_10_205612_create_user_projects_table.php
  method up (line 14) | public function up()
  method down (line 30) | public function down()

FILE: database/migrations/2022_09_10_205915_add_project_to_tickets.php
  method up (line 14) | public function up()
  method down (line 26) | public function down()

FILE: database/migrations/2022_09_10_220736_add_role_to_users.php
  method up (line 14) | public function up()
  method down (line 26) | public function down()

FILE: database/migrations/2022_09_11_142205_add_register_token_to_users.php
  method up (line 14) | public function up()
  method down (line 26) | public function down()

FILE: database/migrations/2022_09_11_153059_add_soft_deletes_to_users.php
  method up (line 14) | public function up()
  method down (line 26) | public function down()

FILE: database/migrations/2022_09_11_163751_create_favorite_projects_table.php
  method up (line 14) | public function up()
  method down (line 29) | public function down()

FILE: database/migrations/2022_09_11_202013_add_type_to_tickets.php
  method up (line 14) | public function up()
  method down (line 26) | public function down()

FILE: database/migrations/2022_09_12_090928_create_comments_table.php
  method up (line 14) | public function up()
  method down (line 31) | public function down()

FILE: database/migrations/2022_09_12_095043_create_jobs_table.php
  method up (line 14) | public function up()
  method down (line 32) | public function down()

FILE: database/migrations/2022_09_14_175349_create_notifications_table.php
  method up (line 14) | public function up()
  method down (line 31) | public function down()

FILE: database/migrations/2022_09_15_142643_add_local_to_user.php
  method up (line 14) | public function up()
  method down (line 26) | public function down()

FILE: database/migrations/2022_09_19_095513_create_ticket_statuses_table.php
  method up (line 13) | public function up()
  method down (line 31) | public function down()

FILE: database/migrations/2022_09_19_111627_create_ticket_priorities_table.php
  method up (line 14) | public function up()
  method down (line 32) | public function down()

FILE: database/migrations/2022_09_19_111633_create_ticket_types_table.php
  method up (line 14) | public function up()
  method down (line 32) | public function down()

FILE: database/migrations/2022_09_19_122813_add_slug_to_ticket_statuses.php
  method up (line 14) | public function up()
  method down (line 26) | public function down()

FILE: database/migrations/2022_09_19_122821_add_slug_to_ticket_types.php
  method up (line 14) | public function up()
  method down (line 26) | public function down()

FILE: database/migrations/2022_09_19_122828_add_slug_to_ticket_priorities.php
  method up (line 14) | public function up()
  method down (line 26) | public function down()

FILE: database/migrations/2022_09_19_143232_add_ticket_prefix_to_projects.php
  method up (line 13) | public function up()
  method down (line 25) | public function down()

FILE: database/migrations/2022_09_19_144042_add_number_to_tickets.php
  method up (line 13) | public function up()
  method down (line 25) | public function down()

FILE: database/migrations/2022_09_19_181148_create_activity_log_table.php
  class CreateActivityLogTable (line 7) | class CreateActivityLogTable extends Migration
    method up (line 9) | public function up()
    method down (line 23) | public function down()

FILE: database/migrations/2022_09_19_181149_add_event_column_to_activity_log_table.php
  class AddEventColumnToActivityLogTable (line 7) | class AddEventColumnToActivityLogTable extends Migration
    method up (line 9) | public function up()
    method down (line 16) | public function down()

FILE: database/migrations/2022_09_19_181150_add_batch_uuid_column_to_activity_log_table.php
  class AddBatchUuidColumnToActivityLogTable (line 7) | class AddBatchUuidColumnToActivityLogTable extends Migration
    method up (line 9) | public function up()
    method down (line 16) | public function down()

FILE: database/migrations/2022_09_19_181611_drop_user_projects.php
  method up (line 13) | public function up()
  method down (line 23) | public function down()

FILE: database/migrations/2022_09_19_212320_create_chats_table.php
  method up (line 13) | public function up()
  method down (line 30) | public function down()

FILE: database/migrations/2022_09_24_230950_create_companies_table.php
  method up (line 14) | public function up()
  method down (line 33) | public function down()

FILE: database/migrations/2022_09_25_154331_create_permission_tables.php
  class CreatePermissionTables (line 8) | class CreatePermissionTables extends Migration
    method up (line 15) | public function up()
    method down (line 127) | public function down()

FILE: database/migrations/2022_09_25_163436_remove_role_from_users.php
  method up (line 14) | public function up()
  method down (line 26) | public function down()

FILE: database/migrations/2022_09_25_165452_create_company_users_table.php
  method up (line 14) | public function up()
  method down (line 29) | public function down()

FILE: database/migrations/2022_09_30_133603_add_company_id_to_projects.php
  method up (line 13) | public function up()
  method down (line 25) | public function down()

FILE: database/seeders/DatabaseSeeder.php
  class DatabaseSeeder (line 8) | class DatabaseSeeder extends Seeder
    method run (line 15) | public function run()

FILE: database/seeders/FontAwesomeFreeSeeder.php
  class FontAwesomeFreeSeeder (line 8) | class FontAwesomeFreeSeeder extends Seeder
    method run (line 1476) | public function run()

FILE: database/seeders/PermissionsSeeder.php
  class PermissionsSeeder (line 9) | class PermissionsSeeder extends Seeder
    method run (line 57) | public function run()

FILE: public/vendor/filament-forms-tinyeditor/tinymce/tinymce.d.ts
  type StringPathBookmark (line 1) | interface StringPathBookmark {
  type RangeBookmark (line 5) | interface RangeBookmark {
  type IdBookmark (line 8) | interface IdBookmark {
  type IndexBookmark (line 12) | interface IndexBookmark {
  type PathBookmark (line 16) | interface PathBookmark {
  type Bookmark (line 21) | type Bookmark = StringPathBookmark | RangeBookmark | IdBookmark | IndexB...
  type NormalizedEvent (line 22) | type NormalizedEvent<E, T = any> = E & {
  type MappedEvent (line 32) | type MappedEvent<T, K extends string> = K extends keyof T ? T[K] : any;
  type NativeEventMap (line 33) | interface NativeEventMap {
  type EditorEvent (line 75) | type EditorEvent<T> = NormalizedEvent<T>;
  type EventDispatcherSettings (line 76) | interface EventDispatcherSettings {
  type EventDispatcherConstructor (line 81) | interface EventDispatcherConstructor<T extends NativeEventMap> {
  class EventDispatcher (line 86) | class EventDispatcher<T> {
  type UndoLevelType (line 99) | const enum UndoLevelType {
  type UndoLevel (line 103) | interface UndoLevel {
  type UndoManager (line 110) | interface UndoManager {
  type ArrayCallback$1 (line 125) | type ArrayCallback$1<T, R> = (x: T, i: number, xs: ReadonlyArray<T>) => R;
  type ObjCallback$1 (line 126) | type ObjCallback$1<T, R> = (value: T, key: string, obj: Record<string, T...
  type ArrayCallback (line 127) | type ArrayCallback<T, R> = ArrayCallback$1<T, R>;
  type ObjCallback (line 128) | type ObjCallback<T, R> = ObjCallback$1<T, R>;
  type Tools (line 129) | interface Tools {
  type EventUtilsCallback (line 157) | type EventUtilsCallback<T> = (event: EventUtilsEvent<T>) => void;
  type EventUtilsEvent (line 158) | type EventUtilsEvent<T> = NormalizedEvent<T> & {
  type EventUtilsConstructor (line 161) | interface EventUtilsConstructor {
  class EventUtils (line 166) | class EventUtils {
  type DomQuerySelector (line 187) | type DomQuerySelector<T extends Node> = string | T | T[] | DomQuery<T>;
  type DomQueryInitSelector (line 188) | type DomQueryInitSelector<T extends Node> = DomQuerySelector<T> | Window;
  type Hook (line 189) | interface Hook {
  type DomQueryConstructor (line 193) | interface DomQueryConstructor {
  type DomQuery (line 232) | interface DomQuery<T extends Node = Node> extends ArrayLike<T> {
  type SchemaType (line 304) | type SchemaType = 'html4' | 'html5' | 'html5-strict';
  type SchemaSettings (line 305) | interface SchemaSettings {
  type Attribute (line 327) | interface Attribute {
  type DefaultAttribute (line 333) | interface DefaultAttribute {
  type AttributePattern (line 337) | interface AttributePattern {
  type ElementRule (line 344) | interface ElementRule {
  type SchemaElement (line 355) | interface SchemaElement extends ElementRule {
  type SchemaMap (line 360) | interface SchemaMap {
  type SchemaRegExpMap (line 363) | interface SchemaRegExpMap {
  type Schema (line 366) | interface Schema {
  type Attributes$1 (line 391) | type Attributes$1 = Array<{
  type AstNodeConstructor (line 397) | interface AstNodeConstructor {
  class AstNode (line 402) | class AstNode {
  type Content (line 433) | type Content = string | AstNode;
  type ContentFormat (line 434) | type ContentFormat = 'raw' | 'text' | 'html' | 'tree';
  type GetContentArgs (line 435) | interface GetContentArgs {
  type SetContentArgs (line 443) | interface SetContentArgs {
  type BlobInfoData (line 450) | interface BlobInfoData {
  type BlobInfo (line 459) | interface BlobInfo {
  type BlobCache (line 468) | interface BlobCache {
  type NotificationManagerImpl (line 478) | interface NotificationManagerImpl {
  type NotificationSpec (line 484) | interface NotificationSpec {
  type NotificationApi (line 492) | interface NotificationApi {
  type NotificationManager (line 503) | interface NotificationManager {
  type UploadFailureOptions (line 508) | interface UploadFailureOptions {
  type UploadHandler (line 511) | type UploadHandler = (blobInfo: BlobInfo, success: (url: string) => void...
  type UploadResult$2 (line 512) | interface UploadResult$2 {
  type RangeLikeObject (line 521) | interface RangeLikeObject {
  type ApplyFormat (line 527) | type ApplyFormat = BlockFormat | InlineFormat | SelectorFormat;
  type RemoveFormat (line 528) | type RemoveFormat = RemoveBlockFormat | RemoveInlineFormat | RemoveSelec...
  type Format (line 529) | type Format = ApplyFormat | RemoveFormat;
  type Formats (line 530) | type Formats = Record<string, Format | Format[]>;
  type FormatAttrOrStyleValue (line 531) | type FormatAttrOrStyleValue = string | ((vars?: FormatVars) => string);
  type FormatVars (line 532) | type FormatVars = Record<string, string | null>;
  type BaseFormat (line 533) | interface BaseFormat<T> {
  type Block (line 549) | interface Block {
  type Inline (line 554) | interface Inline {
  type Selector (line 557) | interface Selector {
  type CommonFormat (line 561) | interface CommonFormat<T> extends BaseFormat<T> {
  type BlockFormat (line 572) | interface BlockFormat extends Block, CommonFormat<BlockFormat> {
  type InlineFormat (line 574) | interface InlineFormat extends Inline, CommonFormat<InlineFormat> {
  type SelectorFormat (line 576) | interface SelectorFormat extends Selector, CommonFormat<SelectorFormat> {
  type CommonRemoveFormat (line 578) | interface CommonRemoveFormat<T> extends BaseFormat<T> {
  type RemoveBlockFormat (line 582) | interface RemoveBlockFormat extends Block, CommonRemoveFormat<RemoveBloc...
  type RemoveInlineFormat (line 584) | interface RemoveInlineFormat extends Inline, CommonRemoveFormat<RemoveIn...
  type RemoveSelectorFormat (line 586) | interface RemoveSelectorFormat extends Selector, CommonRemoveFormat<Remo...
  type Format_d_Formats (line 588) | type Format_d_Formats = Formats;
  type Format_d_Format (line 589) | type Format_d_Format = Format;
  type Format_d_ApplyFormat (line 590) | type Format_d_ApplyFormat = ApplyFormat;
  type Format_d_BlockFormat (line 591) | type Format_d_BlockFormat = BlockFormat;
  type Format_d_InlineFormat (line 592) | type Format_d_InlineFormat = InlineFormat;
  type Format_d_SelectorFormat (line 593) | type Format_d_SelectorFormat = SelectorFormat;
  type Format_d_RemoveFormat (line 594) | type Format_d_RemoveFormat = RemoveFormat;
  type Format_d_RemoveBlockFormat (line 595) | type Format_d_RemoveBlockFormat = RemoveBlockFormat;
  type Format_d_RemoveInlineFormat (line 596) | type Format_d_RemoveInlineFormat = RemoveInlineFormat;
  type Format_d_RemoveSelectorFormat (line 597) | type Format_d_RemoveSelectorFormat = RemoveSelectorFormat;
  type StyleFormat (line 601) | type StyleFormat = BlockStyleFormat | InlineStyleFormat | SelectorStyleF...
  type AllowedFormat (line 602) | type AllowedFormat = Separator | FormatReference | StyleFormat | NestedF...
  type Separator (line 603) | interface Separator {
  type FormatReference (line 606) | interface FormatReference {
  type NestedFormatting (line 611) | interface NestedFormatting {
  type CommonStyleFormat (line 615) | interface CommonStyleFormat {
  type BlockStyleFormat (line 620) | interface BlockStyleFormat extends BlockFormat, CommonStyleFormat {
  type InlineStyleFormat (line 622) | interface InlineStyleFormat extends InlineFormat, CommonStyleFormat {
  type SelectorStyleFormat (line 624) | interface SelectorStyleFormat extends SelectorFormat, CommonStyleFormat {
  type AlertBannerSpec (line 626) | interface AlertBannerSpec {
  type ButtonSpec (line 633) | interface ButtonSpec {
  type CheckboxSpec (line 642) | interface CheckboxSpec {
  type FormComponentSpec (line 648) | interface FormComponentSpec {
  type FormComponentWithLabelSpec (line 652) | interface FormComponentWithLabelSpec extends FormComponentSpec {
  type CollectionSpec (line 655) | interface CollectionSpec extends FormComponentWithLabelSpec {
  type ColorInputSpec (line 658) | interface ColorInputSpec extends FormComponentWithLabelSpec {
  type ColorPickerSpec (line 661) | interface ColorPickerSpec extends FormComponentWithLabelSpec {
  type CustomEditorInit (line 664) | interface CustomEditorInit {
  type CustomEditorInitFn (line 669) | type CustomEditorInitFn = (elm: HTMLElement, settings: any) => Promise<C...
  type CustomEditorOldSpec (line 670) | interface CustomEditorOldSpec extends FormComponentSpec {
  type CustomEditorNewSpec (line 675) | interface CustomEditorNewSpec extends FormComponentSpec {
  type CustomEditorSpec (line 682) | type CustomEditorSpec = CustomEditorOldSpec | CustomEditorNewSpec;
  type DropZoneSpec (line 683) | interface DropZoneSpec extends FormComponentWithLabelSpec {
  type GridSpec (line 686) | interface GridSpec {
  type HtmlPanelSpec (line 691) | interface HtmlPanelSpec {
  type IframeSpec (line 696) | interface IframeSpec extends FormComponentWithLabelSpec {
  type ImageToolsState (line 700) | interface ImageToolsState {
  type ImageToolsSpec (line 704) | interface ImageToolsSpec extends FormComponentWithLabelSpec {
  type InputSpec (line 708) | interface InputSpec extends FormComponentWithLabelSpec {
  type LabelSpec (line 715) | interface LabelSpec {
  type ListBoxSingleItemSpec (line 720) | interface ListBoxSingleItemSpec {
  type ListBoxNestedItemSpec (line 724) | interface ListBoxNestedItemSpec {
  type ListBoxItemSpec (line 728) | type ListBoxItemSpec = ListBoxNestedItemSpec | ListBoxSingleItemSpec;
  type ListBoxSpec (line 729) | interface ListBoxSpec extends FormComponentWithLabelSpec {
  type PanelSpec (line 734) | interface PanelSpec {
  type SelectBoxItemSpec (line 739) | interface SelectBoxItemSpec {
  type SelectBoxSpec (line 743) | interface SelectBoxSpec extends FormComponentWithLabelSpec {
  type SizeInputSpec (line 749) | interface SizeInputSpec extends FormComponentWithLabelSpec {
  type TableSpec (line 754) | interface TableSpec {
  type TextAreaSpec (line 759) | interface TextAreaSpec extends FormComponentWithLabelSpec {
  type UrlInputSpec (line 765) | interface UrlInputSpec extends FormComponentWithLabelSpec {
  type BodyComponentSpec (line 770) | type BodyComponentSpec = BarSpec | ButtonSpec | CheckboxSpec | TextAreaS...
  type BarSpec (line 771) | interface BarSpec {
  type CommonMenuItemSpec (line 775) | interface CommonMenuItemSpec {
  type CommonMenuItemInstanceApi (line 782) | interface CommonMenuItemInstanceApi {
  type DialogToggleMenuItemSpec (line 786) | interface DialogToggleMenuItemSpec extends CommonMenuItemSpec {
  type DialogFooterMenuButtonItemSpec (line 790) | type DialogFooterMenuButtonItemSpec = DialogToggleMenuItemSpec;
  type BaseDialogFooterButtonSpec (line 791) | interface BaseDialogFooterButtonSpec {
  type DialogFooterNormalButtonSpec (line 798) | interface DialogFooterNormalButtonSpec extends BaseDialogFooterButtonSpec {
  type DialogFooterMenuButtonSpec (line 802) | interface DialogFooterMenuButtonSpec extends BaseDialogFooterButtonSpec {
  type DialogFooterButtonSpec (line 809) | type DialogFooterButtonSpec = DialogFooterNormalButtonSpec | DialogFoote...
  type TabSpec (line 810) | interface TabSpec {
  type TabPanelSpec (line 815) | interface TabPanelSpec {
  type DialogDataItem (line 819) | type DialogDataItem = any;
  type DialogData (line 820) | type DialogData = Record<string, DialogDataItem>;
  type DialogInstanceApi (line 821) | interface DialogInstanceApi<T extends DialogData> {
  type DialogActionDetails (line 833) | interface DialogActionDetails {
  type DialogChangeDetails (line 837) | interface DialogChangeDetails<T> {
  type DialogTabChangeDetails (line 840) | interface DialogTabChangeDetails {
  type DialogActionHandler (line 844) | type DialogActionHandler<T> = (api: DialogInstanceApi<T>, details: Dialo...
  type DialogChangeHandler (line 845) | type DialogChangeHandler<T> = (api: DialogInstanceApi<T>, details: Dialo...
  type DialogSubmitHandler (line 846) | type DialogSubmitHandler<T> = (api: DialogInstanceApi<T>) => void;
  type DialogCloseHandler (line 847) | type DialogCloseHandler = () => void;
  type DialogCancelHandler (line 848) | type DialogCancelHandler<T> = (api: DialogInstanceApi<T>) => void;
  type DialogTabChangeHandler (line 849) | type DialogTabChangeHandler<T> = (api: DialogInstanceApi<T>, details: Di...
  type DialogSize (line 850) | type DialogSize = 'normal' | 'medium' | 'large';
  type DialogSpec (line 851) | interface DialogSpec<T extends DialogData> {
  type UrlDialogInstanceApi (line 864) | interface UrlDialogInstanceApi {
  type UrlDialogActionDetails (line 870) | interface UrlDialogActionDetails {
  type UrlDialogMessage (line 874) | interface UrlDialogMessage {
  type UrlDialogActionHandler (line 878) | type UrlDialogActionHandler = (api: UrlDialogInstanceApi, actions: UrlDi...
  type UrlDialogCloseHandler (line 879) | type UrlDialogCloseHandler = () => void;
  type UrlDialogCancelHandler (line 880) | type UrlDialogCancelHandler = (api: UrlDialogInstanceApi) => void;
  type UrlDialogMessageHandler (line 881) | type UrlDialogMessageHandler = (api: UrlDialogInstanceApi, message: UrlD...
  type UrlDialogFooterButtonSpec (line 882) | interface UrlDialogFooterButtonSpec extends DialogFooterNormalButtonSpec {
  type UrlDialogSpec (line 885) | interface UrlDialogSpec {
  type CardContainerDirection (line 896) | type CardContainerDirection = 'vertical' | 'horizontal';
  type CardContainerAlign (line 897) | type CardContainerAlign = 'left' | 'right';
  type CardContainerValign (line 898) | type CardContainerValign = 'top' | 'middle' | 'bottom';
  type CardContainerSpec (line 899) | interface CardContainerSpec {
  type CardImageSpec (line 906) | interface CardImageSpec {
  type CardTextSpec (line 912) | interface CardTextSpec {
  type CardItemSpec (line 918) | type CardItemSpec = CardContainerSpec | CardImageSpec | CardTextSpec;
  type CardMenuItemInstanceApi (line 919) | interface CardMenuItemInstanceApi extends CommonMenuItemInstanceApi {
  type CardMenuItemSpec (line 921) | interface CardMenuItemSpec extends Omit<CommonMenuItemSpec, 'text' | 'sh...
  type SeparatorMenuItemSpec (line 928) | interface SeparatorMenuItemSpec {
  type ColumnTypes$1 (line 932) | type ColumnTypes$1 = number | 'auto';
  type SeparatorItemSpec (line 933) | type SeparatorItemSpec = SeparatorMenuItemSpec;
  type AutocompleterItemSpec (line 934) | interface AutocompleterItemSpec {
  type AutocompleterContents (line 941) | type AutocompleterContents = SeparatorItemSpec | AutocompleterItemSpec |...
  type AutocompleterSpec (line 942) | interface AutocompleterSpec {
  type AutocompleterInstanceApi (line 953) | interface AutocompleterInstanceApi {
  type ContextPosition (line 957) | type ContextPosition = 'node' | 'selection' | 'line';
  type ContextScope (line 958) | type ContextScope = 'node' | 'editor';
  type ContextBarSpec (line 959) | interface ContextBarSpec {
  type BaseToolbarButtonSpec (line 964) | interface BaseToolbarButtonSpec<I extends BaseToolbarButtonInstanceApi> {
  type BaseToolbarButtonInstanceApi (line 971) | interface BaseToolbarButtonInstanceApi {
  type ToolbarButtonSpec (line 975) | interface ToolbarButtonSpec extends BaseToolbarButtonSpec<ToolbarButtonI...
  type ToolbarButtonInstanceApi (line 979) | interface ToolbarButtonInstanceApi extends BaseToolbarButtonInstanceApi {
  type BaseToolbarToggleButtonSpec (line 981) | interface BaseToolbarToggleButtonSpec<I extends BaseToolbarButtonInstanc...
  type BaseToolbarToggleButtonInstanceApi (line 984) | interface BaseToolbarToggleButtonInstanceApi extends BaseToolbarButtonIn...
  type ToolbarToggleButtonSpec (line 988) | interface ToolbarToggleButtonSpec extends BaseToolbarToggleButtonSpec<To...
  type ToolbarToggleButtonInstanceApi (line 992) | interface ToolbarToggleButtonInstanceApi extends BaseToolbarToggleButton...
  type ContextFormLaunchButtonApi (line 994) | interface ContextFormLaunchButtonApi extends BaseToolbarButtonSpec<BaseT...
  type ContextFormLaunchToggleButtonSpec (line 997) | interface ContextFormLaunchToggleButtonSpec extends BaseToolbarToggleBut...
  type ContextFormButtonInstanceApi (line 1000) | interface ContextFormButtonInstanceApi extends BaseToolbarButtonInstance...
  type ContextFormToggleButtonInstanceApi (line 1002) | interface ContextFormToggleButtonInstanceApi extends BaseToolbarToggleBu...
  type ContextFormButtonSpec (line 1004) | interface ContextFormButtonSpec extends BaseToolbarButtonSpec<ContextFor...
  type ContextFormToggleButtonSpec (line 1009) | interface ContextFormToggleButtonSpec extends BaseToolbarToggleButtonSpe...
  type ContextFormInstanceApi (line 1014) | interface ContextFormInstanceApi {
  type ContextFormSpec (line 1018) | interface ContextFormSpec extends ContextBarSpec {
  type ContextToolbarSpec (line 1025) | interface ContextToolbarSpec extends ContextBarSpec {
  type ChoiceMenuItemSpec (line 1029) | interface ChoiceMenuItemSpec extends CommonMenuItemSpec {
  type ChoiceMenuItemInstanceApi (line 1033) | interface ChoiceMenuItemInstanceApi extends CommonMenuItemInstanceApi {
  type ContextMenuItem (line 1037) | interface ContextMenuItem extends CommonMenuItemSpec {
  type ContextSubMenu (line 1043) | interface ContextSubMenu extends CommonMenuItemSpec {
  type ContextMenuContents (line 1049) | type ContextMenuContents = string | ContextMenuItem | SeparatorMenuItemS...
  type ContextMenuApi (line 1050) | interface ContextMenuApi {
  type FancyActionArgsMap (line 1053) | interface FancyActionArgsMap {
  type BaseFancyMenuItemSpec (line 1062) | interface BaseFancyMenuItemSpec<T extends keyof FancyActionArgsMap> {
  type InsertTableMenuItemSpec (line 1068) | interface InsertTableMenuItemSpec extends BaseFancyMenuItemSpec<'insertt...
  type ColorSwatchMenuItemSpec (line 1072) | interface ColorSwatchMenuItemSpec extends BaseFancyMenuItemSpec<'colorsw...
  type FancyMenuItemSpec (line 1079) | type FancyMenuItemSpec = InsertTableMenuItemSpec | ColorSwatchMenuItemSpec;
  type MenuItemSpec (line 1080) | interface MenuItemSpec extends CommonMenuItemSpec {
  type MenuItemInstanceApi (line 1086) | interface MenuItemInstanceApi extends CommonMenuItemInstanceApi {
  type NestedMenuItemContents (line 1088) | type NestedMenuItemContents = string | MenuItemSpec | NestedMenuItemSpec...
  type NestedMenuItemSpec (line 1089) | interface NestedMenuItemSpec extends CommonMenuItemSpec {
  type NestedMenuItemInstanceApi (line 1095) | interface NestedMenuItemInstanceApi extends CommonMenuItemInstanceApi {
  type ToggleMenuItemSpec (line 1097) | interface ToggleMenuItemSpec extends CommonMenuItemSpec {
  type ToggleMenuItemInstanceApi (line 1104) | interface ToggleMenuItemInstanceApi extends CommonMenuItemInstanceApi {
  type PublicDialog_d_AlertBannerSpec (line 1108) | type PublicDialog_d_AlertBannerSpec = AlertBannerSpec;
  type PublicDialog_d_BarSpec (line 1109) | type PublicDialog_d_BarSpec = BarSpec;
  type PublicDialog_d_BodyComponentSpec (line 1110) | type PublicDialog_d_BodyComponentSpec = BodyComponentSpec;
  type PublicDialog_d_ButtonSpec (line 1111) | type PublicDialog_d_ButtonSpec = ButtonSpec;
  type PublicDialog_d_CheckboxSpec (line 1112) | type PublicDialog_d_CheckboxSpec = CheckboxSpec;
  type PublicDialog_d_CollectionSpec (line 1113) | type PublicDialog_d_CollectionSpec = CollectionSpec;
  type PublicDialog_d_ColorInputSpec (line 1114) | type PublicDialog_d_ColorInputSpec = ColorInputSpec;
  type PublicDialog_d_ColorPickerSpec (line 1115) | type PublicDialog_d_ColorPickerSpec = ColorPickerSpec;
  type PublicDialog_d_CustomEditorSpec (line 1116) | type PublicDialog_d_CustomEditorSpec = CustomEditorSpec;
  type PublicDialog_d_CustomEditorInit (line 1117) | type PublicDialog_d_CustomEditorInit = CustomEditorInit;
  type PublicDialog_d_CustomEditorInitFn (line 1118) | type PublicDialog_d_CustomEditorInitFn = CustomEditorInitFn;
  type PublicDialog_d_DialogData (line 1119) | type PublicDialog_d_DialogData = DialogData;
  type PublicDialog_d_DialogSize (line 1120) | type PublicDialog_d_DialogSize = DialogSize;
  type PublicDialog_d_DialogSpec (line 1121) | type PublicDialog_d_DialogSpec<_0> = DialogSpec<_0>;
  type PublicDialog_d_DialogInstanceApi (line 1122) | type PublicDialog_d_DialogInstanceApi<_0> = DialogInstanceApi<_0>;
  type PublicDialog_d_DialogFooterButtonSpec (line 1123) | type PublicDialog_d_DialogFooterButtonSpec = DialogFooterButtonSpec;
  type PublicDialog_d_DialogActionDetails (line 1124) | type PublicDialog_d_DialogActionDetails = DialogActionDetails;
  type PublicDialog_d_DialogChangeDetails (line 1125) | type PublicDialog_d_DialogChangeDetails<_0> = DialogChangeDetails<_0>;
  type PublicDialog_d_DialogTabChangeDetails (line 1126) | type PublicDialog_d_DialogTabChangeDetails = DialogTabChangeDetails;
  type PublicDialog_d_DropZoneSpec (line 1127) | type PublicDialog_d_DropZoneSpec = DropZoneSpec;
  type PublicDialog_d_GridSpec (line 1128) | type PublicDialog_d_GridSpec = GridSpec;
  type PublicDialog_d_HtmlPanelSpec (line 1129) | type PublicDialog_d_HtmlPanelSpec = HtmlPanelSpec;
  type PublicDialog_d_IframeSpec (line 1130) | type PublicDialog_d_IframeSpec = IframeSpec;
  type PublicDialog_d_ImageToolsSpec (line 1131) | type PublicDialog_d_ImageToolsSpec = ImageToolsSpec;
  type PublicDialog_d_InputSpec (line 1132) | type PublicDialog_d_InputSpec = InputSpec;
  type PublicDialog_d_LabelSpec (line 1133) | type PublicDialog_d_LabelSpec = LabelSpec;
  type PublicDialog_d_ListBoxSpec (line 1134) | type PublicDialog_d_ListBoxSpec = ListBoxSpec;
  type PublicDialog_d_ListBoxItemSpec (line 1135) | type PublicDialog_d_ListBoxItemSpec = ListBoxItemSpec;
  type PublicDialog_d_ListBoxNestedItemSpec (line 1136) | type PublicDialog_d_ListBoxNestedItemSpec = ListBoxNestedItemSpec;
  type PublicDialog_d_ListBoxSingleItemSpec (line 1137) | type PublicDialog_d_ListBoxSingleItemSpec = ListBoxSingleItemSpec;
  type PublicDialog_d_PanelSpec (line 1138) | type PublicDialog_d_PanelSpec = PanelSpec;
  type PublicDialog_d_SelectBoxSpec (line 1139) | type PublicDialog_d_SelectBoxSpec = SelectBoxSpec;
  type PublicDialog_d_SelectBoxItemSpec (line 1140) | type PublicDialog_d_SelectBoxItemSpec = SelectBoxItemSpec;
  type PublicDialog_d_SizeInputSpec (line 1141) | type PublicDialog_d_SizeInputSpec = SizeInputSpec;
  type PublicDialog_d_TableSpec (line 1142) | type PublicDialog_d_TableSpec = TableSpec;
  type PublicDialog_d_TabSpec (line 1143) | type PublicDialog_d_TabSpec = TabSpec;
  type PublicDialog_d_TabPanelSpec (line 1144) | type PublicDialog_d_TabPanelSpec = TabPanelSpec;
  type PublicDialog_d_TextAreaSpec (line 1145) | type PublicDialog_d_TextAreaSpec = TextAreaSpec;
  type PublicDialog_d_UrlInputSpec (line 1146) | type PublicDialog_d_UrlInputSpec = UrlInputSpec;
  type PublicDialog_d_UrlDialogSpec (line 1147) | type PublicDialog_d_UrlDialogSpec = UrlDialogSpec;
  type PublicDialog_d_UrlDialogFooterButtonSpec (line 1148) | type PublicDialog_d_UrlDialogFooterButtonSpec = UrlDialogFooterButtonSpec;
  type PublicDialog_d_UrlDialogInstanceApi (line 1149) | type PublicDialog_d_UrlDialogInstanceApi = UrlDialogInstanceApi;
  type PublicDialog_d_UrlDialogActionDetails (line 1150) | type PublicDialog_d_UrlDialogActionDetails = UrlDialogActionDetails;
  type PublicDialog_d_UrlDialogMessage (line 1151) | type PublicDialog_d_UrlDialogMessage = UrlDialogMessage;
  type PublicInlineContent_d_AutocompleterSpec (line 1155) | type PublicInlineContent_d_AutocompleterSpec = AutocompleterSpec;
  type PublicInlineContent_d_AutocompleterItemSpec (line 1156) | type PublicInlineContent_d_AutocompleterItemSpec = AutocompleterItemSpec;
  type PublicInlineContent_d_AutocompleterContents (line 1157) | type PublicInlineContent_d_AutocompleterContents = AutocompleterContents;
  type PublicInlineContent_d_AutocompleterInstanceApi (line 1158) | type PublicInlineContent_d_AutocompleterInstanceApi = AutocompleterInsta...
  type PublicInlineContent_d_ContextPosition (line 1159) | type PublicInlineContent_d_ContextPosition = ContextPosition;
  type PublicInlineContent_d_ContextScope (line 1160) | type PublicInlineContent_d_ContextScope = ContextScope;
  type PublicInlineContent_d_ContextFormSpec (line 1161) | type PublicInlineContent_d_ContextFormSpec = ContextFormSpec;
  type PublicInlineContent_d_ContextFormInstanceApi (line 1162) | type PublicInlineContent_d_ContextFormInstanceApi = ContextFormInstanceApi;
  type PublicInlineContent_d_ContextFormButtonSpec (line 1163) | type PublicInlineContent_d_ContextFormButtonSpec = ContextFormButtonSpec;
  type PublicInlineContent_d_ContextFormButtonInstanceApi (line 1164) | type PublicInlineContent_d_ContextFormButtonInstanceApi = ContextFormBut...
  type PublicInlineContent_d_ContextFormToggleButtonSpec (line 1165) | type PublicInlineContent_d_ContextFormToggleButtonSpec = ContextFormTogg...
  type PublicInlineContent_d_ContextFormToggleButtonInstanceApi (line 1166) | type PublicInlineContent_d_ContextFormToggleButtonInstanceApi = ContextF...
  type PublicInlineContent_d_ContextToolbarSpec (line 1167) | type PublicInlineContent_d_ContextToolbarSpec = ContextToolbarSpec;
  type PublicInlineContent_d_SeparatorItemSpec (line 1168) | type PublicInlineContent_d_SeparatorItemSpec = SeparatorItemSpec;
  type PublicMenu_d_MenuItemSpec (line 1172) | type PublicMenu_d_MenuItemSpec = MenuItemSpec;
  type PublicMenu_d_MenuItemInstanceApi (line 1173) | type PublicMenu_d_MenuItemInstanceApi = MenuItemInstanceApi;
  type PublicMenu_d_NestedMenuItemContents (line 1174) | type PublicMenu_d_NestedMenuItemContents = NestedMenuItemContents;
  type PublicMenu_d_NestedMenuItemSpec (line 1175) | type PublicMenu_d_NestedMenuItemSpec = NestedMenuItemSpec;
  type PublicMenu_d_NestedMenuItemInstanceApi (line 1176) | type PublicMenu_d_NestedMenuItemInstanceApi = NestedMenuItemInstanceApi;
  type PublicMenu_d_FancyMenuItemSpec (line 1177) | type PublicMenu_d_FancyMenuItemSpec = FancyMenuItemSpec;
  type PublicMenu_d_ColorSwatchMenuItemSpec (line 1178) | type PublicMenu_d_ColorSwatchMenuItemSpec = ColorSwatchMenuItemSpec;
  type PublicMenu_d_InsertTableMenuItemSpec (line 1179) | type PublicMenu_d_InsertTableMenuItemSpec = InsertTableMenuItemSpec;
  type PublicMenu_d_ToggleMenuItemSpec (line 1180) | type PublicMenu_d_ToggleMenuItemSpec = ToggleMenuItemSpec;
  type PublicMenu_d_ToggleMenuItemInstanceApi (line 1181) | type PublicMenu_d_ToggleMenuItemInstanceApi = ToggleMenuItemInstanceApi;
  type PublicMenu_d_ChoiceMenuItemSpec (line 1182) | type PublicMenu_d_ChoiceMenuItemSpec = ChoiceMenuItemSpec;
  type PublicMenu_d_ChoiceMenuItemInstanceApi (line 1183) | type PublicMenu_d_ChoiceMenuItemInstanceApi = ChoiceMenuItemInstanceApi;
  type PublicMenu_d_SeparatorMenuItemSpec (line 1184) | type PublicMenu_d_SeparatorMenuItemSpec = SeparatorMenuItemSpec;
  type PublicMenu_d_ContextMenuApi (line 1185) | type PublicMenu_d_ContextMenuApi = ContextMenuApi;
  type PublicMenu_d_ContextMenuContents (line 1186) | type PublicMenu_d_ContextMenuContents = ContextMenuContents;
  type PublicMenu_d_ContextMenuItem (line 1187) | type PublicMenu_d_ContextMenuItem = ContextMenuItem;
  type PublicMenu_d_ContextSubMenu (line 1188) | type PublicMenu_d_ContextSubMenu = ContextSubMenu;
  type PublicMenu_d_CardMenuItemSpec (line 1189) | type PublicMenu_d_CardMenuItemSpec = CardMenuItemSpec;
  type PublicMenu_d_CardMenuItemInstanceApi (line 1190) | type PublicMenu_d_CardMenuItemInstanceApi = CardMenuItemInstanceApi;
  type PublicMenu_d_CardItemSpec (line 1191) | type PublicMenu_d_CardItemSpec = CardItemSpec;
  type PublicMenu_d_CardContainerSpec (line 1192) | type PublicMenu_d_CardContainerSpec = CardContainerSpec;
  type PublicMenu_d_CardImageSpec (line 1193) | type PublicMenu_d_CardImageSpec = CardImageSpec;
  type PublicMenu_d_CardTextSpec (line 1194) | type PublicMenu_d_CardTextSpec = CardTextSpec;
  type SidebarInstanceApi (line 1198) | interface SidebarInstanceApi {
  type SidebarSpec (line 1201) | interface SidebarSpec {
  type PublicSidebar_d_SidebarSpec (line 1208) | type PublicSidebar_d_SidebarSpec = SidebarSpec;
  type PublicSidebar_d_SidebarInstanceApi (line 1209) | type PublicSidebar_d_SidebarInstanceApi = SidebarInstanceApi;
  type ToolbarGroupSetting (line 1213) | interface ToolbarGroupSetting {
  type ToolbarConfig (line 1217) | type ToolbarConfig = string | ToolbarGroupSetting[];
  type GroupToolbarButtonInstanceApi (line 1218) | interface GroupToolbarButtonInstanceApi extends BaseToolbarButtonInstanc...
  type GroupToolbarButtonSpec (line 1220) | interface GroupToolbarButtonSpec extends BaseToolbarButtonSpec<GroupTool...
  type MenuButtonItemTypes (line 1224) | type MenuButtonItemTypes = NestedMenuItemContents;
  type SuccessCallback$1 (line 1225) | type SuccessCallback$1 = (menu: string | MenuButtonItemTypes[]) => void;
  type BaseMenuButtonSpec (line 1226) | interface BaseMenuButtonSpec {
  type BaseMenuButtonInstanceApi (line 1233) | interface BaseMenuButtonInstanceApi {
  type ToolbarMenuButtonSpec (line 1239) | interface ToolbarMenuButtonSpec extends BaseMenuButtonSpec {
  type ToolbarMenuButtonInstanceApi (line 1243) | interface ToolbarMenuButtonInstanceApi extends BaseMenuButtonInstanceApi {
  type ToolbarSplitButtonItemTypes (line 1245) | type ToolbarSplitButtonItemTypes = ChoiceMenuItemSpec | SeparatorMenuIte...
  type SuccessCallback (line 1246) | type SuccessCallback = (menu: ToolbarSplitButtonItemTypes[]) => void;
  type SelectPredicate (line 1247) | type SelectPredicate = (value: string) => boolean;
  type PresetTypes (line 1248) | type PresetTypes = 'color' | 'normal' | 'listpreview';
  type ColumnTypes (line 1249) | type ColumnTypes = number | 'auto';
  type ToolbarSplitButtonSpec (line 1250) | interface ToolbarSplitButtonSpec {
  type ToolbarSplitButtonInstanceApi (line 1263) | interface ToolbarSplitButtonInstanceApi {
  type PublicToolbar_d_ToolbarButtonSpec (line 1271) | type PublicToolbar_d_ToolbarButtonSpec = ToolbarButtonSpec;
  type PublicToolbar_d_ToolbarButtonInstanceApi (line 1272) | type PublicToolbar_d_ToolbarButtonInstanceApi = ToolbarButtonInstanceApi;
  type PublicToolbar_d_ToolbarSplitButtonSpec (line 1273) | type PublicToolbar_d_ToolbarSplitButtonSpec = ToolbarSplitButtonSpec;
  type PublicToolbar_d_ToolbarSplitButtonInstanceApi (line 1274) | type PublicToolbar_d_ToolbarSplitButtonInstanceApi = ToolbarSplitButtonI...
  type PublicToolbar_d_ToolbarMenuButtonSpec (line 1275) | type PublicToolbar_d_ToolbarMenuButtonSpec = ToolbarMenuButtonSpec;
  type PublicToolbar_d_ToolbarMenuButtonInstanceApi (line 1276) | type PublicToolbar_d_ToolbarMenuButtonInstanceApi = ToolbarMenuButtonIns...
  type PublicToolbar_d_ToolbarToggleButtonSpec (line 1277) | type PublicToolbar_d_ToolbarToggleButtonSpec = ToolbarToggleButtonSpec;
  type PublicToolbar_d_ToolbarToggleButtonInstanceApi (line 1278) | type PublicToolbar_d_ToolbarToggleButtonInstanceApi = ToolbarToggleButto...
  type PublicToolbar_d_GroupToolbarButtonSpec (line 1279) | type PublicToolbar_d_GroupToolbarButtonSpec = GroupToolbarButtonSpec;
  type PublicToolbar_d_GroupToolbarButtonInstanceApi (line 1280) | type PublicToolbar_d_GroupToolbarButtonInstanceApi = GroupToolbarButtonI...
  type Registry$1 (line 1284) | interface Registry$1 {
  type StyleSheetLoaderSettings (line 1309) | interface StyleSheetLoaderSettings {
  type StyleSheetLoader (line 1314) | interface StyleSheetLoader {
  type Registry (line 1321) | type Registry = Registry$1;
  type EditorUiApi (line 1322) | interface EditorUiApi {
  type EditorUi (line 1329) | interface EditorUi extends EditorUiApi {
  type Ui_d_Registry (line 1333) | type Ui_d_Registry = Registry;
  type Ui_d_EditorUiApi (line 1334) | type Ui_d_EditorUiApi = EditorUiApi;
  type Ui_d_EditorUi (line 1335) | type Ui_d_EditorUi = EditorUi;
  type EntityEncoding (line 1339) | type EntityEncoding = 'named' | 'numeric' | 'raw' | 'named,numeric' | 'n...
  type ContentLanguage (line 1340) | interface ContentLanguage {
  type ThemeInitFunc (line 1345) | type ThemeInitFunc = (editor: Editor, elm: HTMLElement) => {
  type SetupCallback (line 1352) | type SetupCallback = (editor: Editor) => void;
  type FilePickerCallback (line 1353) | type FilePickerCallback = (callback: Function, value: any, meta: Record<...
  type FilePickerValidationStatus (line 1354) | type FilePickerValidationStatus = 'valid' | 'unknown' | 'invalid' | 'none';
  type FilePickerValidationCallback (line 1355) | type FilePickerValidationCallback = (info: {
  type URLConverter (line 1362) | type URLConverter = (url: string, name: string, elm?: HTMLElement) => st...
  type URLConverterCallback (line 1363) | type URLConverterCallback = (url: string, node: Node, on_save: boolean, ...
  type ToolbarGroup (line 1364) | interface ToolbarGroup {
  type ToolbarMode (line 1368) | type ToolbarMode = 'floating' | 'sliding' | 'scrolling' | 'wrap';
  type BaseEditorSettings (line 1369) | interface BaseEditorSettings {
  type RawEditorSettings (line 1555) | interface RawEditorSettings extends BaseEditorSettings {
  type EditorSettings (line 1560) | interface EditorSettings extends BaseEditorSettings {
  type ParamTypeMap (line 1564) | interface ParamTypeMap {
  type BlobInfoImagePair (line 1572) | interface BlobInfoImagePair {
  class NodeChange (line 1576) | class NodeChange {
  type SelectionOverrides (line 1583) | interface SelectionOverrides {
  type Quirks (line 1589) | interface Quirks {
  type DecoratorData (line 1593) | type DecoratorData = Record<string, any>;
  type Decorator (line 1594) | type Decorator = (uid: string, data: DecoratorData) => {
  type AnnotationListener (line 1598) | type AnnotationListener = (state: boolean, name: string, data?: {
  type AnnotationListenerApi (line 1602) | type AnnotationListenerApi = AnnotationListener;
  type AnnotatorSettings (line 1603) | interface AnnotatorSettings {
  type Annotator (line 1607) | interface Annotator {
  type GeomRect (line 1614) | interface GeomRect {
  type Rect (line 1620) | interface Rect {
  type StyleMap (line 1629) | interface StyleMap {
  type StylesSettings (line 1632) | interface StylesSettings {
  type Styles (line 1638) | interface Styles {
  type DOMUtilsSettings (line 1643) | interface DOMUtilsSettings {
  type Target (line 1657) | type Target = Node | Window;
  type RunArguments (line 1658) | type RunArguments<T extends Node = Node> = string | T | Array<string | T>;
  type BoundEvent (line 1659) | type BoundEvent = [
  type Callback (line 1665) | type Callback<K extends string> = EventUtilsCallback<MappedEvent<HTMLEle...
  type DOMUtils (line 1666) | interface DOMUtils {
  type ClientRect (line 1789) | interface ClientRect {
  type GetSelectionContentArgs (line 1797) | interface GetSelectionContentArgs extends GetContentArgs {
  type SelectionSetContentArgs (line 1801) | interface SelectionSetContentArgs extends SetContentArgs {
  type BookmarkManager (line 1804) | interface BookmarkManager {
  type ControlSelection (line 1808) | interface ControlSelection {
  type ParserArgs (line 1815) | interface ParserArgs {
  type ParserFilterCallback (line 1825) | type ParserFilterCallback = (nodes: AstNode[], name: string, args: Parse...
  type ParserFilter (line 1826) | interface ParserFilter {
  type DomParserSettings (line 1830) | interface DomParserSettings {
  type DomParser (line 1852) | interface DomParser {
  type WriterSettings (line 1861) | interface WriterSettings {
  type Attributes (line 1869) | type Attributes = Array<{
  type Writer (line 1873) | interface Writer {
  type HtmlSerializerSettings (line 1884) | interface HtmlSerializerSettings extends WriterSettings {
  type HtmlSerializer (line 1888) | interface HtmlSerializer {
  type DomSerializerSettings (line 1891) | interface DomSerializerSettings extends DomParserSettings, WriterSetting...
  type DomSerializerImpl (line 1895) | interface DomSerializerImpl {
  type DomSerializer (line 1912) | interface DomSerializer extends DomSerializerImpl {
  type EditorSelection (line 1914) | interface EditorSelection {
  type EditorCommandCallback (line 1965) | type EditorCommandCallback = (ui: boolean, value: any, args: any) => void;
  type EditorCommandsCallback (line 1966) | type EditorCommandsCallback = (command: string, ui: boolean, value: any,...
  type Commands (line 1967) | interface Commands {
  type EditorCommandsConstructor (line 1972) | interface EditorCommandsConstructor {
  class EditorCommands (line 1976) | class EditorCommands {
  type WindowParams (line 1998) | interface WindowParams {
  type InstanceApi (line 2002) | type InstanceApi<T> = UrlDialogInstanceApi | DialogInstanceApi<T>;
  type WindowManagerImpl (line 2003) | interface WindowManagerImpl {
  type WindowManager (line 2010) | interface WindowManager {
  type ExecCommandEvent (line 2017) | interface ExecCommandEvent {
  type GetContentEvent (line 2022) | type GetContentEvent = GetContentArgs & {
  type SetContentEvent (line 2027) | type SetContentEvent = SetContentArgs & {
  type NewBlockEvent (line 2032) | interface NewBlockEvent {
  type NodeChangeEvent (line 2035) | interface NodeChangeEvent {
  type FormatEvent (line 2041) | interface FormatEvent {
  type ObjectResizeEvent (line 2046) | interface ObjectResizeEvent {
  type ObjectSelectedEvent (line 2052) | interface ObjectSelectedEvent {
  type ScrollIntoViewEvent (line 2056) | interface ScrollIntoViewEvent {
  type SetSelectionRangeEvent (line 2060) | interface SetSelectionRangeEvent {
  type ShowCaretEvent (line 2064) | interface ShowCaretEvent {
  type SwitchModeEvent (line 2069) | interface SwitchModeEvent {
  type AddUndoEvent (line 2072) | interface AddUndoEvent {
  type UndoRedoEvent (line 2077) | interface UndoRedoEvent {
  type WindowEvent (line 2080) | interface WindowEvent<T extends DialogData> {
  type ProgressStateEvent (line 2083) | interface ProgressStateEvent {
  type AfterProgressStateEvent (line 2087) | interface AfterProgressStateEvent {
  type PlaceholderToggleEvent (line 2090) | interface PlaceholderToggleEvent {
  type LoadErrorEvent (line 2093) | interface LoadErrorEvent {
  type PreProcessEvent (line 2096) | interface PreProcessEvent extends ParserArgs {
  type PostProcessEvent (line 2099) | interface PostProcessEvent extends ParserArgs {
  type EditorEventMap (line 2102) | interface EditorEventMap extends Omit<NativeEventMap, 'blur' | 'focus'> {
  type EditorManagerEventMap (line 2174) | interface EditorManagerEventMap {
  type EventTypes_d_ExecCommandEvent (line 2185) | type EventTypes_d_ExecCommandEvent = ExecCommandEvent;
  type EventTypes_d_GetContentEvent (line 2186) | type EventTypes_d_GetContentEvent = GetContentEvent;
  type EventTypes_d_SetContentEvent (line 2187) | type EventTypes_d_SetContentEvent = SetContentEvent;
  type EventTypes_d_NewBlockEvent (line 2188) | type EventTypes_d_NewBlockEvent = NewBlockEvent;
  type EventTypes_d_NodeChangeEvent (line 2189) | type EventTypes_d_NodeChangeEvent = NodeChangeEvent;
  type EventTypes_d_FormatEvent (line 2190) | type EventTypes_d_FormatEvent = FormatEvent;
  type EventTypes_d_ObjectResizeEvent (line 2191) | type EventTypes_d_ObjectResizeEvent = ObjectResizeEvent;
  type EventTypes_d_ObjectSelectedEvent (line 2192) | type EventTypes_d_ObjectSelectedEvent = ObjectSelectedEvent;
  type EventTypes_d_ScrollIntoViewEvent (line 2193) | type EventTypes_d_ScrollIntoViewEvent = ScrollIntoViewEvent;
  type EventTypes_d_SetSelectionRangeEvent (line 2194) | type EventTypes_d_SetSelectionRangeEvent = SetSelectionRangeEvent;
  type EventTypes_d_ShowCaretEvent (line 2195) | type EventTypes_d_ShowCaretEvent = ShowCaretEvent;
  type EventTypes_d_SwitchModeEvent (line 2196) | type EventTypes_d_SwitchModeEvent = SwitchModeEvent;
  type EventTypes_d_AddUndoEvent (line 2197) | type EventTypes_d_AddUndoEvent = AddUndoEvent;
  type EventTypes_d_UndoRedoEvent (line 2198) | type EventTypes_d_UndoRedoEvent = UndoRedoEvent;
  type EventTypes_d_WindowEvent (line 2199) | type EventTypes_d_WindowEvent<_0> = WindowEvent<_0>;
  type EventTypes_d_ProgressStateEvent (line 2200) | type EventTypes_d_ProgressStateEvent = ProgressStateEvent;
  type EventTypes_d_AfterProgressStateEvent (line 2201) | type EventTypes_d_AfterProgressStateEvent = AfterProgressStateEvent;
  type EventTypes_d_PlaceholderToggleEvent (line 2202) | type EventTypes_d_PlaceholderToggleEvent = PlaceholderToggleEvent;
  type EventTypes_d_LoadErrorEvent (line 2203) | type EventTypes_d_LoadErrorEvent = LoadErrorEvent;
  type EventTypes_d_PreProcessEvent (line 2204) | type EventTypes_d_PreProcessEvent = PreProcessEvent;
  type EventTypes_d_PostProcessEvent (line 2205) | type EventTypes_d_PostProcessEvent = PostProcessEvent;
  type EventTypes_d_EditorEventMap (line 2206) | type EventTypes_d_EditorEventMap = EditorEventMap;
  type EventTypes_d_EditorManagerEventMap (line 2207) | type EventTypes_d_EditorManagerEventMap = EditorManagerEventMap;
  type RawString (line 2211) | interface RawString {
  type Primitive (line 2214) | type Primitive = string | number | boolean | Record<string | number, any...
  type TokenisedString (line 2215) | type TokenisedString = [
  type Untranslated (line 2219) | type Untranslated = Primitive | TokenisedString | RawString;
  type TranslatedString (line 2220) | type TranslatedString = string;
  type I18n (line 2221) | interface I18n {
  type Observable (line 2230) | interface Observable<T> {
  type URISettings (line 2237) | interface URISettings {
  type URIConstructor (line 2240) | interface URIConstructor {
  type SafeUriOptions (line 2254) | interface SafeUriOptions {
  class URI (line 2259) | class URI {
  type EditorManager (line 2295) | interface EditorManager extends Observable<EditorManagerEventMap> {
  type EditorObservable (line 2326) | interface EditorObservable extends Observable<EditorEventMap> {
  type UploadResult$1 (line 2331) | interface UploadResult$1 {
  type UploadCallback (line 2337) | type UploadCallback = (results: UploadResult$1[]) => void;
  type EditorUpload (line 2338) | interface EditorUpload {
  type FormatChangeCallback (line 2346) | type FormatChangeCallback = (state: boolean, data: {
  type FormatRegistry (line 2351) | interface FormatRegistry {
  type Formatter (line 2360) | interface Formatter extends FormatRegistry {
  type EditorMode (line 2374) | interface EditorMode {
  type EditorModeApi (line 2380) | interface EditorModeApi {
  type Plugin (line 2385) | interface Plugin {
  type PluginManager (line 2392) | type PluginManager = AddOnManager<Plugin>;
  type ShortcutsConstructor (line 2393) | interface ShortcutsConstructor {
  type CommandFunc (line 2397) | type CommandFunc = string | [
  class Shortcuts (line 2402) | class Shortcuts {
  type Theme (line 2416) | interface Theme {
  type ThemeManager (line 2430) | type ThemeManager = AddOnManager<Theme>;
  type EditorConstructor (line 2431) | interface EditorConstructor {
  class Editor (line 2435) | class Editor implements EditorObservable {
  type UrlObject (line 2568) | interface UrlObject {
  type WaitState (line 2573) | type WaitState = 'added' | 'loaded';
  type AddOnCallback (line 2574) | type AddOnCallback<T> = (editor: Editor, url: string, $?: DomQueryConstr...
  type AddOnConstructor (line 2575) | type AddOnConstructor<T> = new (editor: Editor, url: string, $?: DomQuer...
  type AddOnManager (line 2576) | interface AddOnManager<T> {
  type RangeUtils (line 2598) | interface RangeUtils {
  type ScriptLoaderSettings (line 2603) | interface ScriptLoaderSettings {
  type ScriptLoaderConstructor (line 2606) | interface ScriptLoaderConstructor {
  class ScriptLoader (line 2611) | class ScriptLoader {
  type TextProcessCallback (line 2630) | type TextProcessCallback = (node: Text, offset: number, text: string) =>...
  type Spot (line 2631) | interface Spot {
  type TextSeeker (line 2635) | interface TextSeeker {
  type DomTreeWalkerConstructor (line 2639) | interface DomTreeWalkerConstructor {
  class DomTreeWalker (line 2643) | class DomTreeWalker {
  type Version (line 2654) | interface Version {
  type Env (line 2658) | interface Env {
  type FocusManager (line 2711) | interface FocusManager {
  type EntitiesMap (line 2714) | interface EntitiesMap {
  type Entities (line 2717) | interface Entities {
  type AttrList (line 2725) | type AttrList = Array<{
  type SaxParserSettings (line 2731) | interface SaxParserSettings {
  type ParserFormat (line 2750) | type ParserFormat = 'html' | 'xhtml' | 'xml';
  type SaxParser (line 2751) | interface SaxParser {
  type IconPack (line 2754) | interface IconPack {
  type IconManager (line 2757) | interface IconManager {
  type Resource (line 2762) | interface Resource {
  type WithSubItems (line 2766) | type WithSubItems<T, K extends keyof T> = T[K] extends Array<any> ? (T &...
  type Props (line 2767) | interface Props<A extends any[] = any[]> {
  type ExtendedClass (line 2775) | type ExtendedClass<T extends Props<A>, A extends any[]> = WithSubItems<T...
  type ExtendedClassConstructor (line 2776) | interface ExtendedClassConstructor<T extends Props<A>, A extends any[] =...
  type Class (line 2781) | interface Class {
  type RGB (line 2784) | interface RGB {
  type HSV (line 2789) | interface HSV {
  type ColorConstructor (line 2794) | type ColorConstructor = new (value?: string | RGB | HSV) => Color;
  type Color (line 2795) | interface Color {
  type DebounceFunc (line 2801) | interface DebounceFunc<T extends (...args: any[]) => void> {
  type Delay (line 2805) | interface Delay {
  type UploadResult (line 2816) | type UploadResult = UploadResult$2;
  type ImageUploader (line 2817) | interface ImageUploader {
  type JSONUtils (line 2820) | interface JSONUtils {
  type JSONPSettings (line 2824) | interface JSONPSettings {
  type JSONP (line 2829) | interface JSONP {
  type JSONRequestSettings (line 2834) | interface JSONRequestSettings {
  type JSONRequestArgs (line 2847) | interface JSONRequestArgs extends JSONRequestSettings {
  type JSONRequestConstructor (line 2852) | interface JSONRequestConstructor {
  class JSONRequest (line 2857) | class JSONRequest {
  type KeyboardLikeEvent (line 2864) | interface KeyboardLikeEvent {
  type VK (line 2870) | interface VK {
  type XHRSettings (line 2888) | interface XHRSettings {
  type XHREventMap (line 2905) | interface XHREventMap {
  type XHR (line 2914) | interface XHR extends Observable<XHREventMap> {
  type DOMUtilsNamespace (line 2917) | interface DOMUtilsNamespace {
  type RangeUtilsNamespace (line 2922) | interface RangeUtilsNamespace {
  type AddOnManagerNamespace (line 2929) | interface AddOnManagerNamespace {
  type BookmarkManagerNamespace (line 2937) | interface BookmarkManagerNamespace {
  type SaxParserNamespace (line 2941) | interface SaxParserNamespace {
  type TinyMCE (line 2945) | interface TinyMCE extends EditorManager {

FILE: tests/CreatesApplication.php
  type CreatesApplication (line 7) | trait CreatesApplication
    method createApplication (line 14) | public function createApplication()

FILE: tests/Feature/ExampleTest.php
  class ExampleTest (line 8) | class ExampleTest extends TestCase
    method test_the_application_returns_a_successful_response (line 15) | public function test_the_application_returns_a_successful_response()

FILE: tests/TestCase.php
  class TestCase (line 7) | abstract class TestCase extends BaseTestCase

FILE: tests/Unit/ExampleTest.php
  class ExampleTest (line 7) | class ExampleTest extends TestCase
    method test_that_true_is_true (line 14) | public function test_that_true_is_true()
Condensed preview — 340 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (3,038K chars).
[
  {
    "path": ".editorconfig",
    "chars": 258,
    "preview": "root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\nindent_style = space\nindent_size = 4\ntrim_"
  },
  {
    "path": ".gitattributes",
    "chars": 373,
    "preview": "* text=auto\n\n*.blade.php diff=html\n*.css diff=css\n*.html diff=html\n*.md diff=markdown\n*.php diff=php\n\n/.github export-ig"
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 19,
    "preview": "github: [heloufir]\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "chars": 834,
    "preview": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n**Describe the b"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "chars": 595,
    "preview": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n**Is your fea"
  },
  {
    "path": ".gitignore",
    "chars": 203,
    "preview": "/node_modules\n/public/build\n/public/hot\n/public/storage\n/storage/*.key\n/vendor\n.env\n.env.backup\n.phpunit.result.cache\nHo"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "chars": 5202,
    "preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nWe as members, contributors, and leaders pledge to make participa"
  },
  {
    "path": "LICENSE.md",
    "chars": 1098,
    "preview": "The MIT License (MIT)\n\nCopyright (c) shuvroroy <shuvro.nsu.cse@gmail.com>\n\nPermission is hereby granted, free of charge,"
  },
  {
    "path": "Procfile",
    "chars": 43,
    "preview": "web: vendor/bin/heroku-php-apache2 public/\n"
  },
  {
    "path": "README.md",
    "chars": 6833,
    "preview": "# Help Desk\n\n<p align=\"center\">\n    <a href=\"https://laravel.com\"><img alt=\"Laravel v9.x\" src=\"https://img.shields.io/ba"
  },
  {
    "path": "SECURITY.md",
    "chars": 364,
    "preview": "# Security Policy\n\n## Supported Versions\n\n| Version | Supported |\n| ------- | ------------------ |\n| 1.x | :white_check_"
  },
  {
    "path": "app/Console/Kernel.php",
    "chars": 681,
    "preview": "<?php\n\nnamespace App\\Console;\n\nuse Illuminate\\Console\\Scheduling\\Schedule;\nuse Illuminate\\Foundation\\Console\\Kernel as C"
  },
  {
    "path": "app/Core/CrudDialogHelper.php",
    "chars": 1183,
    "preview": "<?php\n\nnamespace App\\Core;\n\nuse Exception;\nuse Filament\\Notifications\\Actions\\Action;\nuse Filament\\Notifications\\Notific"
  },
  {
    "path": "app/Core/HasLogsActivity.php",
    "chars": 150,
    "preview": "<?php\n\nnamespace App\\Core;\n\ninterface HasLogsActivity\n{\n\n    public function __toString(): string;\n\n    public function "
  },
  {
    "path": "app/Core/LogsActivity.php",
    "chars": 1667,
    "preview": "<?php\n\nnamespace App\\Core;\n\nuse Illuminate\\Support\\HtmlString;\nuse Spatie\\Activitylog\\LogOptions;\nuse Spatie\\Activitylog"
  },
  {
    "path": "app/Exceptions/Handler.php",
    "chars": 1050,
    "preview": "<?php\n\nnamespace App\\Exceptions;\n\nuse Illuminate\\Foundation\\Exceptions\\Handler as ExceptionHandler;\nuse Throwable;\n\nclas"
  },
  {
    "path": "app/Http/Controllers/Auth/LogoutController.php",
    "chars": 358,
    "preview": "<?php\n\nnamespace App\\Http\\Controllers\\Auth;\n\nuse App\\Http\\Controllers\\Controller;\nuse Illuminate\\Http\\Request;\nuse Illum"
  },
  {
    "path": "app/Http/Controllers/Controller.php",
    "chars": 361,
    "preview": "<?php\n\nnamespace App\\Http\\Controllers;\n\nuse Illuminate\\Foundation\\Auth\\Access\\AuthorizesRequests;\nuse Illuminate\\Foundat"
  },
  {
    "path": "app/Http/Controllers/TicketNumberController.php",
    "chars": 903,
    "preview": "<?php\n\nnamespace App\\Http\\Controllers;\n\nuse App\\Models\\Ticket;\nuse Illuminate\\Http\\RedirectResponse;\nuse Illuminate\\Supp"
  },
  {
    "path": "app/Http/Kernel.php",
    "chars": 2739,
    "preview": "<?php\n\nnamespace App\\Http;\n\nuse Illuminate\\Foundation\\Http\\Kernel as HttpKernel;\n\nclass Kernel extends HttpKernel\n{\n    "
  },
  {
    "path": "app/Http/Livewire/Administration/ActivityLogs.php",
    "chars": 1565,
    "preview": "<?php\n\nnamespace App\\Http\\Livewire\\Administration;\n\nuse App\\Models\\TicketPriority;\nuse Filament\\Forms\\Components\\Grid;\nu"
  },
  {
    "path": "app/Http/Livewire/Administration/Companies.php",
    "chars": 6261,
    "preview": "<?php\n\nnamespace App\\Http\\Livewire\\Administration;\n\nuse App\\Models\\Company;\nuse App\\Tables\\Columns\\UserColumn;\nuse Carbo"
  },
  {
    "path": "app/Http/Livewire/Administration/CompaniesDialog.php",
    "chars": 6575,
    "preview": "<?php\n\nnamespace App\\Http\\Livewire\\Administration;\n\nuse App\\Core\\CrudDialogHelper;\nuse App\\Models\\CompanyUser;\nuse App\\M"
  },
  {
    "path": "app/Http/Livewire/Administration/Roles.php",
    "chars": 4757,
    "preview": "<?php\n\nnamespace App\\Http\\Livewire\\Administration;\n\nuse App\\Models\\Company;\nuse Carbon\\Carbon;\nuse Filament\\Notification"
  },
  {
    "path": "app/Http/Livewire/Administration/RolesDialog.php",
    "chars": 4586,
    "preview": "<?php\n\nnamespace App\\Http\\Livewire\\Administration;\n\nuse App\\Core\\CrudDialogHelper;\nuse Filament\\Forms\\Components\\Checkbo"
  },
  {
    "path": "app/Http/Livewire/Administration/TicketPriorities.php",
    "chars": 4859,
    "preview": "<?php\n\nnamespace App\\Http\\Livewire\\Administration;\n\nuse App\\Models\\TicketPriority;\nuse App\\Models\\User;\nuse Carbon\\Carbo"
  },
  {
    "path": "app/Http/Livewire/Administration/TicketPrioritiesDialog.php",
    "chars": 5778,
    "preview": "<?php\n\nnamespace App\\Http\\Livewire\\Administration;\n\nuse App\\Core\\CrudDialogHelper;\nuse App\\Models\\Icon;\nuse App\\Models\\T"
  },
  {
    "path": "app/Http/Livewire/Administration/TicketStatuses.php",
    "chars": 4871,
    "preview": "<?php\n\nnamespace App\\Http\\Livewire\\Administration;\n\nuse App\\Models\\TicketStatus;\nuse Carbon\\Carbon;\nuse Filament\\Tables\\"
  },
  {
    "path": "app/Http/Livewire/Administration/TicketStatusesDialog.php",
    "chars": 4818,
    "preview": "<?php\n\nnamespace App\\Http\\Livewire\\Administration;\n\nuse App\\Core\\CrudDialogHelper;\nuse App\\Models\\TicketStatus;\nuse Fila"
  },
  {
    "path": "app/Http/Livewire/Administration/TicketTypes.php",
    "chars": 4708,
    "preview": "<?php\n\nnamespace App\\Http\\Livewire\\Administration;\n\nuse App\\Models\\TicketType;\nuse Carbon\\Carbon;\nuse Filament\\Tables\\Ac"
  },
  {
    "path": "app/Http/Livewire/Administration/TicketTypesDialog.php",
    "chars": 5284,
    "preview": "<?php\n\nnamespace App\\Http\\Livewire\\Administration;\n\nuse App\\Core\\CrudDialogHelper;\nuse App\\Models\\Icon;\nuse App\\Models\\T"
  },
  {
    "path": "app/Http/Livewire/Administration/Users.php",
    "chars": 7832,
    "preview": "<?php\n\nnamespace App\\Http\\Livewire\\Administration;\n\nuse App\\Models\\User;\nuse App\\Notifications\\UserCreatedNotification;\n"
  },
  {
    "path": "app/Http/Livewire/Administration/UsersDialog.php",
    "chars": 7196,
    "preview": "<?php\n\nnamespace App\\Http\\Livewire\\Administration;\n\nuse App\\Core\\CrudDialogHelper;\nuse App\\Models\\CompanyUser;\nuse App\\M"
  },
  {
    "path": "app/Http/Livewire/Analytics.php",
    "chars": 2790,
    "preview": "<?php\n\nnamespace App\\Http\\Livewire;\n\nuse App\\Models\\Project;\nuse App\\Models\\Ticket;\nuse App\\Models\\TicketStatus;\nuse Liv"
  },
  {
    "path": "app/Http/Livewire/Auth/ActivateAccount.php",
    "chars": 1751,
    "preview": "<?php\n\nnamespace App\\Http\\Livewire\\Auth;\n\nuse App\\Models\\User;\nuse App\\Notifications\\UserActivatedNotification;\nuse Fila"
  },
  {
    "path": "app/Http/Livewire/Auth/ForgotPassword.php",
    "chars": 1842,
    "preview": "<?php\n\nnamespace App\\Http\\Livewire\\Auth;\n\nuse App\\Models\\User;\nuse Filament\\Forms\\Components\\TextInput;\nuse Filament\\For"
  },
  {
    "path": "app/Http/Livewire/Auth/Login.php",
    "chars": 2804,
    "preview": "<?php\n\nnamespace App\\Http\\Livewire\\Auth;\n\nuse DanHarrin\\LivewireRateLimiting\\Exceptions\\TooManyRequestsException;\nuse Da"
  },
  {
    "path": "app/Http/Livewire/Auth/RecoverPassword.php",
    "chars": 3008,
    "preview": "<?php\n\nnamespace App\\Http\\Livewire\\Auth;\n\nuse App\\Models\\User;\nuse Filament\\Forms\\Components\\Checkbox;\nuse Filament\\Form"
  },
  {
    "path": "app/Http/Livewire/Chat.php",
    "chars": 1494,
    "preview": "<?php\n\nnamespace App\\Http\\Livewire;\n\nuse App\\Models\\Chat as Model;\nuse App\\Models\\Ticket;\nuse Filament\\Forms\\Components\\"
  },
  {
    "path": "app/Http/Livewire/Kanban.php",
    "chars": 8329,
    "preview": "<?php\n\nnamespace App\\Http\\Livewire;\n\nuse App\\Jobs\\TicketUpdatedJob;\nuse App\\Models\\Ticket;\nuse App\\Models\\TicketPriority"
  },
  {
    "path": "app/Http/Livewire/MyNotifications.php",
    "chars": 1269,
    "preview": "<?php\n\nnamespace App\\Http\\Livewire;\n\nuse Filament\\Notifications\\Notification;\nuse Livewire\\Component;\n\nclass MyNotificat"
  },
  {
    "path": "app/Http/Livewire/MyProfile.php",
    "chars": 3610,
    "preview": "<?php\n\nnamespace App\\Http\\Livewire;\n\nuse App\\Models\\User;\nuse Filament\\Forms\\Components\\Grid;\nuse Filament\\Forms\\Compone"
  },
  {
    "path": "app/Http/Livewire/Projects.php",
    "chars": 7861,
    "preview": "<?php\n\nnamespace App\\Http\\Livewire;\n\nuse App\\Models\\FavoriteProject;\nuse App\\Models\\Project;\nuse App\\Tables\\Columns\\User"
  },
  {
    "path": "app/Http/Livewire/ProjectsDialog.php",
    "chars": 6329,
    "preview": "<?php\n\nnamespace App\\Http\\Livewire;\n\nuse App\\Core\\CrudDialogHelper;\nuse App\\Models\\Company;\nuse App\\Models\\Project;\nuse "
  },
  {
    "path": "app/Http/Livewire/TicketDetails/Content.php",
    "chars": 2239,
    "preview": "<?php\n\nnamespace App\\Http\\Livewire\\TicketDetails;\n\nuse App\\Jobs\\TicketUpdatedJob;\nuse App\\Models\\Ticket;\nuse Filament\\Fo"
  },
  {
    "path": "app/Http/Livewire/TicketDetails/Priority.php",
    "chars": 2220,
    "preview": "<?php\n\nnamespace App\\Http\\Livewire\\TicketDetails;\n\nuse App\\Jobs\\TicketUpdatedJob;\nuse App\\Models\\Ticket;\nuse Filament\\Fo"
  },
  {
    "path": "app/Http/Livewire/TicketDetails/Responsible.php",
    "chars": 2534,
    "preview": "<?php\n\nnamespace App\\Http\\Livewire\\TicketDetails;\n\nuse App\\Jobs\\TicketUpdatedJob;\nuse App\\Models\\Ticket;\nuse App\\Models\\"
  },
  {
    "path": "app/Http/Livewire/TicketDetails/Status.php",
    "chars": 2141,
    "preview": "<?php\n\nnamespace App\\Http\\Livewire\\TicketDetails;\n\nuse App\\Jobs\\TicketUpdatedJob;\nuse App\\Models\\Ticket;\nuse Filament\\Fo"
  },
  {
    "path": "app/Http/Livewire/TicketDetails/Title.php",
    "chars": 1917,
    "preview": "<?php\n\nnamespace App\\Http\\Livewire\\TicketDetails;\n\nuse App\\Jobs\\TicketUpdatedJob;\nuse App\\Models\\Ticket;\nuse Filament\\Fo"
  },
  {
    "path": "app/Http/Livewire/TicketDetails/Type.php",
    "chars": 2100,
    "preview": "<?php\n\nnamespace App\\Http\\Livewire\\TicketDetails;\n\nuse App\\Jobs\\TicketUpdatedJob;\nuse App\\Models\\Ticket;\nuse Filament\\Fo"
  },
  {
    "path": "app/Http/Livewire/TicketDetails.php",
    "chars": 1592,
    "preview": "<?php\n\nnamespace App\\Http\\Livewire;\n\nuse App\\Models\\Ticket;\nuse Filament\\Notifications\\Notification;\nuse Livewire\\Compon"
  },
  {
    "path": "app/Http/Livewire/TicketDetailsComments.php",
    "chars": 2591,
    "preview": "<?php\n\nnamespace App\\Http\\Livewire;\n\nuse App\\Jobs\\CommentCreatedJob;\nuse App\\Jobs\\TicketCreatedJob;\nuse App\\Models\\Comme"
  },
  {
    "path": "app/Http/Livewire/TicketDetailsCommentsContent.php",
    "chars": 4925,
    "preview": "<?php\n\nnamespace App\\Http\\Livewire;\n\nuse App\\Jobs\\CommentCreatedJob;\nuse App\\Models\\Comment;\nuse App\\Models\\Ticket;\nuse "
  },
  {
    "path": "app/Http/Livewire/Tickets.php",
    "chars": 7870,
    "preview": "<?php\n\nnamespace App\\Http\\Livewire;\n\nuse App\\Models\\Project;\nuse App\\Models\\Ticket;\nuse App\\Models\\User;\nuse Filament\\Fo"
  },
  {
    "path": "app/Http/Livewire/TicketsDialog.php",
    "chars": 3809,
    "preview": "<?php\n\nnamespace App\\Http\\Livewire;\n\nuse App\\Jobs\\TicketCreatedJob;\nuse App\\Models\\Project;\nuse App\\Models\\Ticket;\nuse F"
  },
  {
    "path": "app/Http/Middleware/Authenticate.php",
    "chars": 474,
    "preview": "<?php\n\nnamespace App\\Http\\Middleware;\n\nuse Illuminate\\Auth\\Middleware\\Authenticate as Middleware;\n\nclass Authenticate ex"
  },
  {
    "path": "app/Http/Middleware/CanAccessTicket.php",
    "chars": 919,
    "preview": "<?php\n\nnamespace App\\Http\\Middleware;\n\nuse App\\Models\\Ticket;\nuse Closure;\nuse Illuminate\\Http\\Request;\n\nclass CanAccess"
  },
  {
    "path": "app/Http/Middleware/EncryptCookies.php",
    "chars": 307,
    "preview": "<?php\n\nnamespace App\\Http\\Middleware;\n\nuse Illuminate\\Cookie\\Middleware\\EncryptCookies as Middleware;\n\nclass EncryptCook"
  },
  {
    "path": "app/Http/Middleware/LocaleMiddleware.php",
    "chars": 997,
    "preview": "<?php\n\nnamespace App\\Http\\Middleware;\n\nuse Closure;\nuse Illuminate\\Http\\Request;\n\nclass LocaleMiddleware\n{\n    /**\n     "
  },
  {
    "path": "app/Http/Middleware/PreventRequestsDuringMaintenance.php",
    "chars": 366,
    "preview": "<?php\n\nnamespace App\\Http\\Middleware;\n\nuse Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance as Mid"
  },
  {
    "path": "app/Http/Middleware/RedirectIfAuthenticated.php",
    "chars": 877,
    "preview": "<?php\n\nnamespace App\\Http\\Middleware;\n\nuse App\\Providers\\RouteServiceProvider;\nuse Closure;\nuse Illuminate\\Http\\Request;"
  },
  {
    "path": "app/Http/Middleware/TrimStrings.php",
    "chars": 381,
    "preview": "<?php\n\nnamespace App\\Http\\Middleware;\n\nuse Illuminate\\Foundation\\Http\\Middleware\\TrimStrings as Middleware;\n\nclass TrimS"
  },
  {
    "path": "app/Http/Middleware/TrustHosts.php",
    "chars": 372,
    "preview": "<?php\n\nnamespace App\\Http\\Middleware;\n\nuse Illuminate\\Http\\Middleware\\TrustHosts as Middleware;\n\nclass TrustHosts extend"
  },
  {
    "path": "app/Http/Middleware/TrustProxies.php",
    "chars": 649,
    "preview": "<?php\n\nnamespace App\\Http\\Middleware;\n\nuse Illuminate\\Http\\Middleware\\TrustProxies as Middleware;\nuse Illuminate\\Http\\Re"
  },
  {
    "path": "app/Http/Middleware/ValidateSignature.php",
    "chars": 460,
    "preview": "<?php\n\nnamespace App\\Http\\Middleware;\n\nuse Illuminate\\Routing\\Middleware\\ValidateSignature as Middleware;\n\nclass Validat"
  },
  {
    "path": "app/Http/Middleware/VerifyCsrfToken.php",
    "chars": 320,
    "preview": "<?php\n\nnamespace App\\Http\\Middleware;\n\nuse Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken as Middleware;\n\nclass V"
  },
  {
    "path": "app/Jobs/CommentCreatedJob.php",
    "chars": 1549,
    "preview": "<?php\n\nnamespace App\\Jobs;\n\nuse App\\Models\\Comment;\nuse App\\Models\\User;\nuse App\\Notifications\\CommentCreateNotification"
  },
  {
    "path": "app/Jobs/TicketCreatedJob.php",
    "chars": 1100,
    "preview": "<?php\n\nnamespace App\\Jobs;\n\nuse App\\Models\\Ticket;\nuse App\\Models\\User;\nuse App\\Notifications\\TicketCreatedNotification;"
  },
  {
    "path": "app/Jobs/TicketUpdatedJob.php",
    "chars": 2423,
    "preview": "<?php\n\nnamespace App\\Jobs;\n\nuse App\\Models\\Ticket;\nuse App\\Models\\User;\nuse App\\Notifications\\CommentCreateNotification;"
  },
  {
    "path": "app/Models/Chat.php",
    "chars": 831,
    "preview": "<?php\n\nnamespace App\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Builder;\nuse Illuminate\\Database\\Eloquent\\Factories\\HasFa"
  },
  {
    "path": "app/Models/Comment.php",
    "chars": 1175,
    "preview": "<?php\n\nnamespace App\\Models;\n\nuse App\\Core\\HasLogsActivity;\nuse App\\Core\\LogsActivity;\nuse Illuminate\\Database\\Eloquent\\"
  },
  {
    "path": "app/Models/Company.php",
    "chars": 758,
    "preview": "<?php\n\nnamespace App\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Factories\\HasFactory;\nuse Illuminate\\Database\\Eloquent\\Mo"
  },
  {
    "path": "app/Models/CompanyUser.php",
    "chars": 512,
    "preview": "<?php\n\nnamespace App\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Factories\\HasFactory;\nuse Illuminate\\Database\\Eloquent\\Mo"
  },
  {
    "path": "app/Models/FavoriteProject.php",
    "chars": 517,
    "preview": "<?php\n\nnamespace App\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Factories\\HasFactory;\nuse Illuminate\\Database\\Eloquent\\Mo"
  },
  {
    "path": "app/Models/Icon.php",
    "chars": 226,
    "preview": "<?php\n\nnamespace App\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Factories\\HasFactory;\nuse Illuminate\\Database\\Eloquent\\Mo"
  },
  {
    "path": "app/Models/Project.php",
    "chars": 1742,
    "preview": "<?php\n\nnamespace App\\Models;\n\nuse App\\Core\\HasLogsActivity;\nuse App\\Core\\LogsActivity;\nuse Illuminate\\Database\\Eloquent\\"
  },
  {
    "path": "app/Models/Ticket.php",
    "chars": 2348,
    "preview": "<?php\n\nnamespace App\\Models;\n\nuse App\\Core\\HasLogsActivity;\nuse App\\Core\\LogsActivity;\nuse Illuminate\\Database\\Eloquent\\"
  },
  {
    "path": "app/Models/TicketPriority.php",
    "chars": 668,
    "preview": "<?php\n\nnamespace App\\Models;\n\nuse App\\Core\\HasLogsActivity;\nuse App\\Core\\LogsActivity;\nuse Illuminate\\Database\\Eloquent\\"
  },
  {
    "path": "app/Models/TicketStatus.php",
    "chars": 667,
    "preview": "<?php\n\nnamespace App\\Models;\n\nuse App\\Core\\HasLogsActivity;\nuse App\\Core\\LogsActivity;\nuse Illuminate\\Database\\Eloquent\\"
  },
  {
    "path": "app/Models/TicketType.php",
    "chars": 659,
    "preview": "<?php\n\nnamespace App\\Models;\n\nuse App\\Core\\HasLogsActivity;\nuse App\\Core\\LogsActivity;\nuse Illuminate\\Database\\Eloquent\\"
  },
  {
    "path": "app/Models/User.php",
    "chars": 3100,
    "preview": "<?php\n\nnamespace App\\Models;\n\nuse App\\Core\\HasLogsActivity;\nuse App\\Core\\LogsActivity;\nuse Devaslanphp\\FilamentAvatar\\Co"
  },
  {
    "path": "app/Notifications/CommentCreateNotification.php",
    "chars": 2360,
    "preview": "<?php\n\nnamespace App\\Notifications;\n\nuse App\\Models\\Comment;\nuse App\\Models\\Ticket;\nuse App\\Models\\User;\nuse Illuminate\\"
  },
  {
    "path": "app/Notifications/TicketCreatedNotification.php",
    "chars": 2659,
    "preview": "<?php\n\nnamespace App\\Notifications;\n\nuse App\\Models\\Ticket;\nuse App\\Models\\User;\nuse Illuminate\\Bus\\Queueable;\nuse Illum"
  },
  {
    "path": "app/Notifications/TicketUpdatedNotification.php",
    "chars": 2572,
    "preview": "<?php\n\nnamespace App\\Notifications;\n\nuse App\\Models\\Ticket;\nuse App\\Models\\User;\nuse Illuminate\\Bus\\Queueable;\nuse Illum"
  },
  {
    "path": "app/Notifications/UserActivatedNotification.php",
    "chars": 1714,
    "preview": "<?php\n\nnamespace App\\Notifications;\n\nuse Illuminate\\Bus\\Queueable;\nuse Illuminate\\Contracts\\Queue\\ShouldQueue;\nuse Illum"
  },
  {
    "path": "app/Notifications/UserCreatedNotification.php",
    "chars": 2006,
    "preview": "<?php\n\nnamespace App\\Notifications;\n\nuse App\\Models\\User;\nuse Illuminate\\Bus\\Queueable;\nuse Illuminate\\Contracts\\Queue\\S"
  },
  {
    "path": "app/Providers/AppServiceProvider.php",
    "chars": 518,
    "preview": "<?php\n\nnamespace App\\Providers;\n\nuse Illuminate\\Support\\Facades\\URL;\nuse Illuminate\\Support\\ServiceProvider;\n\nclass AppS"
  },
  {
    "path": "app/Providers/AuthServiceProvider.php",
    "chars": 585,
    "preview": "<?php\n\nnamespace App\\Providers;\n\nuse Illuminate\\Foundation\\Support\\Providers\\AuthServiceProvider as ServiceProvider;\n\ncl"
  },
  {
    "path": "app/Providers/BroadcastServiceProvider.php",
    "chars": 380,
    "preview": "<?php\n\nnamespace App\\Providers;\n\nuse Illuminate\\Support\\Facades\\Broadcast;\nuse Illuminate\\Support\\ServiceProvider;\n\nclas"
  },
  {
    "path": "app/Providers/EventServiceProvider.php",
    "chars": 926,
    "preview": "<?php\n\nnamespace App\\Providers;\n\nuse Illuminate\\Auth\\Events\\Registered;\nuse Illuminate\\Auth\\Listeners\\SendEmailVerificat"
  },
  {
    "path": "app/Providers/RouteServiceProvider.php",
    "chars": 1323,
    "preview": "<?php\n\nnamespace App\\Providers;\n\nuse Illuminate\\Cache\\RateLimiting\\Limit;\nuse Illuminate\\Foundation\\Support\\Providers\\Ro"
  },
  {
    "path": "app/Tables/Columns/UserColumn.php",
    "chars": 170,
    "preview": "<?php\n\nnamespace App\\Tables\\Columns;\n\nuse Filament\\Tables\\Columns\\Column;\n\nclass UserColumn extends Column\n{\n    protect"
  },
  {
    "path": "app/View/Components/BaseLayout.php",
    "chars": 486,
    "preview": "<?php\n\nnamespace App\\View\\Components;\n\nuse Illuminate\\View\\Component;\n\nclass BaseLayout extends Component\n{\n    /**\n    "
  },
  {
    "path": "app/View/Components/GuestLayout.php",
    "chars": 488,
    "preview": "<?php\n\nnamespace App\\View\\Components;\n\nuse Illuminate\\View\\Component;\n\nclass GuestLayout extends Component\n{\n    /**\n   "
  },
  {
    "path": "app/View/Components/Layout.php",
    "chars": 477,
    "preview": "<?php\n\nnamespace App\\View\\Components;\n\nuse Illuminate\\View\\Component;\n\nclass Layout extends Component\n{\n    /**\n     * C"
  },
  {
    "path": "app/View/Components/MainMenu.php",
    "chars": 541,
    "preview": "<?php\n\nnamespace App\\View\\Components;\n\nuse Illuminate\\View\\Component;\n\nclass MainMenu extends Component\n{\n\n    public $m"
  },
  {
    "path": "app/View/Components/NotificationType.php",
    "chars": 572,
    "preview": "<?php\n\nnamespace App\\View\\Components;\n\nuse Illuminate\\View\\Component;\n\nclass NotificationType extends Component\n{\n    pu"
  },
  {
    "path": "app/View/Components/PrioritySpan.php",
    "chars": 619,
    "preview": "<?php\n\nnamespace App\\View\\Components;\n\nuse App\\Models\\TicketPriority;\nuse Illuminate\\View\\Component;\n\nclass PrioritySpan"
  },
  {
    "path": "app/View/Components/RoleSpan.php",
    "chars": 524,
    "preview": "<?php\n\nnamespace App\\View\\Components;\n\nuse Illuminate\\View\\Component;\n\nclass RoleSpan extends Component\n{\n    public $ro"
  },
  {
    "path": "app/View/Components/StatusSpan.php",
    "chars": 603,
    "preview": "<?php\n\nnamespace App\\View\\Components;\n\nuse App\\Models\\TicketStatus;\nuse Illuminate\\View\\Component;\n\nclass StatusSpan ext"
  },
  {
    "path": "app/View/Components/TypeSpan.php",
    "chars": 645,
    "preview": "<?php\n\nnamespace App\\View\\Components;\n\nuse App\\Models\\TicketType;\nuse Illuminate\\View\\Component;\n\nclass TypeSpan extends"
  },
  {
    "path": "app/View/Components/UserAvatar.php",
    "chars": 588,
    "preview": "<?php\n\nnamespace App\\View\\Components;\n\nuse Illuminate\\View\\Component;\n\nclass UserAvatar extends Component\n{\n\n    public "
  },
  {
    "path": "app/helpers.php",
    "chars": 2239,
    "preview": "<?php\n\nuse App\\Models\\TicketPriority;\nuse App\\Models\\TicketStatus;\nuse App\\Models\\TicketType;\nuse App\\Models\\User;\nuse I"
  },
  {
    "path": "artisan",
    "chars": 1686,
    "preview": "#!/usr/bin/env php\n<?php\n\ndefine('LARAVEL_START', microtime(true));\n\n/*\n|-----------------------------------------------"
  },
  {
    "path": "bootstrap/app.php",
    "chars": 1620,
    "preview": "<?php\n\n/*\n|--------------------------------------------------------------------------\n| Create The Application\n|--------"
  },
  {
    "path": "bootstrap/cache/.gitignore",
    "chars": 14,
    "preview": "*\n!.gitignore\n"
  },
  {
    "path": "composer.json",
    "chars": 2482,
    "preview": "{\n    \"name\": \"laravel/laravel\",\n    \"type\": \"project\",\n    \"description\": \"Help Desk open source project.\",\n    \"keywor"
  },
  {
    "path": "config/activitylog.php",
    "chars": 1567,
    "preview": "<?php\n\nreturn [\n\n    /*\n     * If set to false, no activities will be saved to the database.\n     */\n    'enabled' => en"
  },
  {
    "path": "config/app.php",
    "chars": 7782,
    "preview": "<?php\n\nuse Illuminate\\Support\\Facades\\Facade;\n\nreturn [\n\n    /*\n    |---------------------------------------------------"
  },
  {
    "path": "config/auth.php",
    "chars": 3665,
    "preview": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Authentica"
  },
  {
    "path": "config/broadcasting.php",
    "chars": 2146,
    "preview": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Default Br"
  },
  {
    "path": "config/cache.php",
    "chars": 3272,
    "preview": "<?php\n\nuse Illuminate\\Support\\Str;\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------"
  },
  {
    "path": "config/cors.php",
    "chars": 846,
    "preview": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Cross-Orig"
  },
  {
    "path": "config/database.php",
    "chars": 5289,
    "preview": "<?php\n\nuse Illuminate\\Support\\Str;\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------"
  },
  {
    "path": "config/filament-avatar.php",
    "chars": 2004,
    "preview": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | DEFAULT PR"
  },
  {
    "path": "config/filament-kanban-board.php",
    "chars": 19,
    "preview": "<?php\nreturn [\n\n];\n"
  },
  {
    "path": "config/filament.php",
    "chars": 10183,
    "preview": "<?php\n\nuse Filament\\Http\\Middleware\\Authenticate;\nuse Filament\\Http\\Middleware\\DispatchServingFilamentEvent;\nuse Filamen"
  },
  {
    "path": "config/filesystems.php",
    "chars": 2370,
    "preview": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Default Fi"
  },
  {
    "path": "config/hashing.php",
    "chars": 1572,
    "preview": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Default Ha"
  },
  {
    "path": "config/larabug.php",
    "chars": 4210,
    "preview": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Login key\n"
  },
  {
    "path": "config/laravel-translatable-string-exporter.php",
    "chars": 1998,
    "preview": "<?php\nreturn [\n    // Directories to search in.\n    'directories'=> [\n        'app',\n        'resources',\n    ],\n\n    //"
  },
  {
    "path": "config/logging.php",
    "chars": 3830,
    "preview": "<?php\n\nuse Monolog\\Handler\\NullHandler;\nuse Monolog\\Handler\\StreamHandler;\nuse Monolog\\Handler\\SyslogUdpHandler;\n\nreturn"
  },
  {
    "path": "config/mail.php",
    "chars": 3600,
    "preview": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Default Ma"
  },
  {
    "path": "config/permission.php",
    "chars": 5580,
    "preview": "<?php\n\nreturn [\n\n    'models' => [\n\n        /*\n         * When using the \"HasPermissions\" trait from this package, we ne"
  },
  {
    "path": "config/queue.php",
    "chars": 2906,
    "preview": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Default Qu"
  },
  {
    "path": "config/sanctum.php",
    "chars": 2294,
    "preview": "<?php\n\nuse Laravel\\Sanctum\\Sanctum;\n\nreturn [\n\n    /*\n    |-------------------------------------------------------------"
  },
  {
    "path": "config/services.php",
    "chars": 979,
    "preview": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Third Part"
  },
  {
    "path": "config/session.php",
    "chars": 7023,
    "preview": "<?php\n\nuse Illuminate\\Support\\Str;\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------"
  },
  {
    "path": "config/system.php",
    "chars": 6164,
    "preview": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Locales co"
  },
  {
    "path": "config/tables.php",
    "chars": 2191,
    "preview": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Date / Tim"
  },
  {
    "path": "config/view.php",
    "chars": 1053,
    "preview": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | View Stora"
  },
  {
    "path": "database/.gitignore",
    "chars": 10,
    "preview": "*.sqlite*\n"
  },
  {
    "path": "database/factories/UserFactory.php",
    "chars": 970,
    "preview": "<?php\n\nnamespace Database\\Factories;\n\nuse Illuminate\\Database\\Eloquent\\Factories\\Factory;\nuse Illuminate\\Support\\Str;\n\n/"
  },
  {
    "path": "database/help_desk.pgsql.sql",
    "chars": 12781,
    "preview": "INSERT INTO users (id, name, email, email_verified_at, password, remember_token, created_at,\n                   updated_"
  },
  {
    "path": "database/help_desk.sql",
    "chars": 13011,
    "preview": "SET foreign_key_checks = 0;\n\nINSERT INTO `users` (`id`, `name`, `email`, `email_verified_at`, `password`, `remember_toke"
  },
  {
    "path": "database/migrations/2014_10_12_000000_create_users_table.php",
    "chars": 793,
    "preview": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Fa"
  },
  {
    "path": "database/migrations/2014_10_12_100000_create_password_resets_table.php",
    "chars": 669,
    "preview": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Fa"
  },
  {
    "path": "database/migrations/2019_08_19_000000_create_failed_jobs_table.php",
    "chars": 810,
    "preview": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Fa"
  },
  {
    "path": "database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php",
    "chars": 898,
    "preview": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Fa"
  },
  {
    "path": "database/migrations/2022_09_08_094911_create_icons_table.php",
    "chars": 605,
    "preview": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Fa"
  },
  {
    "path": "database/migrations/2022_09_09_220749_create_tickets_table.php",
    "chars": 912,
    "preview": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Fa"
  },
  {
    "path": "database/migrations/2022_09_10_205032_create_projects_table.php",
    "chars": 768,
    "preview": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Fa"
  },
  {
    "path": "database/migrations/2022_09_10_205612_create_user_projects_table.php",
    "chars": 755,
    "preview": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Fa"
  },
  {
    "path": "database/migrations/2022_09_10_205915_add_project_to_tickets.php",
    "chars": 711,
    "preview": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Fa"
  },
  {
    "path": "database/migrations/2022_09_10_220736_add_role_to_users.php",
    "chars": 618,
    "preview": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Fa"
  },
  {
    "path": "database/migrations/2022_09_11_142205_add_register_token_to_users.php",
    "chars": 648,
    "preview": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Fa"
  },
  {
    "path": "database/migrations/2022_09_11_153059_add_soft_deletes_to_users.php",
    "chars": 616,
    "preview": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Fa"
  },
  {
    "path": "database/migrations/2022_09_11_163751_create_favorite_projects_table.php",
    "chars": 727,
    "preview": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Fa"
  },
  {
    "path": "database/migrations/2022_09_11_202013_add_type_to_tickets.php",
    "chars": 622,
    "preview": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Fa"
  },
  {
    "path": "database/migrations/2022_09_12_090928_create_comments_table.php",
    "chars": 784,
    "preview": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Fa"
  },
  {
    "path": "database/migrations/2022_09_12_095043_create_jobs_table.php",
    "chars": 856,
    "preview": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Fa"
  },
  {
    "path": "database/migrations/2022_09_14_175349_create_notifications_table.php",
    "chars": 768,
    "preview": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Fa"
  },
  {
    "path": "database/migrations/2022_09_15_142643_add_local_to_user.php",
    "chars": 637,
    "preview": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Fa"
  },
  {
    "path": "database/migrations/2022_09_19_095513_create_ticket_statuses_table.php",
    "chars": 799,
    "preview": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Fa"
  },
  {
    "path": "database/migrations/2022_09_19_111627_create_ticket_priorities_table.php",
    "chars": 783,
    "preview": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Fa"
  },
  {
    "path": "database/migrations/2022_09_19_111633_create_ticket_types_table.php",
    "chars": 773,
    "preview": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Fa"
  },
  {
    "path": "database/migrations/2022_09_19_122813_add_slug_to_ticket_statuses.php",
    "chars": 643,
    "preview": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Fa"
  },
  {
    "path": "database/migrations/2022_09_19_122821_add_slug_to_ticket_types.php",
    "chars": 637,
    "preview": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Fa"
  },
  {
    "path": "database/migrations/2022_09_19_122828_add_slug_to_ticket_priorities.php",
    "chars": 647,
    "preview": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Fa"
  },
  {
    "path": "database/migrations/2022_09_19_143232_add_ticket_prefix_to_projects.php",
    "chars": 645,
    "preview": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Fa"
  },
  {
    "path": "database/migrations/2022_09_19_144042_add_number_to_tickets.php",
    "chars": 626,
    "preview": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Fa"
  },
  {
    "path": "database/migrations/2022_09_19_181148_create_activity_log_table.php",
    "chars": 909,
    "preview": "<?php\n\nuse Illuminate\\Support\\Facades\\Schema;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Database\\Migratio"
  },
  {
    "path": "database/migrations/2022_09_19_181149_add_event_column_to_activity_log_table.php",
    "chars": 692,
    "preview": "<?php\n\nuse Illuminate\\Support\\Facades\\Schema;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Database\\Migratio"
  },
  {
    "path": "database/migrations/2022_09_19_181150_add_batch_uuid_column_to_activity_log_table.php",
    "chars": 702,
    "preview": "<?php\n\nuse Illuminate\\Support\\Facades\\Schema;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Database\\Migratio"
  },
  {
    "path": "database/migrations/2022_09_19_181611_drop_user_projects.php",
    "chars": 755,
    "preview": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Fa"
  },
  {
    "path": "database/migrations/2022_09_19_212320_create_chats_table.php",
    "chars": 777,
    "preview": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Fa"
  },
  {
    "path": "database/migrations/2022_09_24_230950_create_companies_table.php",
    "chars": 884,
    "preview": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Fa"
  },
  {
    "path": "database/migrations/2022_09_25_154331_create_permission_tables.php",
    "chars": 6552,
    "preview": "<?php\n\nuse Illuminate\\Support\\Facades\\Schema;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Database\\Migratio"
  },
  {
    "path": "database/migrations/2022_09_25_163436_remove_role_from_users.php",
    "chars": 618,
    "preview": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Fa"
  },
  {
    "path": "database/migrations/2022_09_25_165452_create_company_users_table.php",
    "chars": 720,
    "preview": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Fa"
  },
  {
    "path": "database/migrations/2022_09_30_133603_add_company_id_to_projects.php",
    "chars": 726,
    "preview": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Fa"
  },
  {
    "path": "database/seeders/DatabaseSeeder.php",
    "chars": 389,
    "preview": "<?php\n\nnamespace Database\\Seeders;\n\n// use Illuminate\\Database\\Console\\Seeds\\WithoutModelEvents;\nuse Illuminate\\Database"
  },
  {
    "path": "database/seeders/FontAwesomeFreeSeeder.php",
    "chars": 46625,
    "preview": "<?php\n\nnamespace Database\\Seeders;\n\nuse App\\Models\\Icon;\nuse Illuminate\\Database\\Seeder;\n\nclass FontAwesomeFreeSeeder ex"
  },
  {
    "path": "database/seeders/PermissionsSeeder.php",
    "chars": 1681,
    "preview": "<?php\n\nnamespace Database\\Seeders;\n\nuse Illuminate\\Database\\Console\\Seeds\\WithoutModelEvents;\nuse Illuminate\\Database\\Se"
  },
  {
    "path": "docker-compose.yml",
    "chars": 3194,
    "preview": "# For more information: https://laravel.com/docs/sail\nversion: '3'\nservices:\n    laravel.test:\n        build:\n          "
  },
  {
    "path": "docs/.nojekyll",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "docs/README.md",
    "chars": 1518,
    "preview": "# Help Desk\n\nHelp Desk is a Laravel based project, that let you manage your support tickets and communicate with your cu"
  },
  {
    "path": "docs/_sidebar.md",
    "chars": 1100,
    "preview": "![Help Desk](_media/logo.png)\n\n- [Help Desk](/?id=help-desk)\n  - [Features](/?id=features)\n  - [Live preview](/?id=live-"
  },
  {
    "path": "docs/changelog.md",
    "chars": 2377,
    "preview": "# Changelog\n\nSee what's new added, changed, fixed, improved or updated in the latest versions.\n\n- **Version 1.4.8** *(30"
  },
  {
    "path": "docs/configuration.md",
    "chars": 2685,
    "preview": "# Configuration\n\n> We are working to make the Help Desk application configurable as much as possible.\n\nYou can check the"
  },
  {
    "path": "docs/getting-started.md",
    "chars": 3281,
    "preview": "# Getting started\n\nTo get and start developing into this application, please make sure to follow these steps:\n\n## Prereq"
  },
  {
    "path": "docs/index.html",
    "chars": 1432,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>Help Desk docs</title>\n    <meta http-equi"
  },
  {
    "path": "docs/permissions.md",
    "chars": 986,
    "preview": "# Permissions\n\n> The package used to manage the permissions is `spatie/laravel-permission` (you can check the [official "
  },
  {
    "path": "docs/screenshots.md",
    "chars": 723,
    "preview": "# Screenshots\n\nBelow you can see some application screenshots:\n\n![screenshot](_media/1.png)\n![screenshot](_media/2.png)\n"
  },
  {
    "path": "lang/en/auth.php",
    "chars": 674,
    "preview": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Authentica"
  },
  {
    "path": "lang/en/pagination.php",
    "chars": 534,
    "preview": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Pagination"
  },
  {
    "path": "lang/en/passwords.php",
    "chars": 744,
    "preview": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Password R"
  },
  {
    "path": "lang/en/validation.php",
    "chars": 9282,
    "preview": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Validation"
  },
  {
    "path": "lang/fr/auth.php",
    "chars": 723,
    "preview": "<?php\n\nreturn [\n    /*\n    |--------------------------------------------------------------------------\n    | Authenticat"
  },
  {
    "path": "lang/fr/pagination.php",
    "chars": 540,
    "preview": "<?php\n\nreturn [\n    /*\n    |--------------------------------------------------------------------------\n    | Pagination "
  },
  {
    "path": "lang/fr/passwords.php",
    "chars": 858,
    "preview": "<?php\n\nreturn [\n    /*\n    |--------------------------------------------------------------------------\n    | Password Re"
  },
  {
    "path": "lang/fr/validation.php",
    "chars": 11021,
    "preview": "<?php\n\nreturn [\n    /*\n    |--------------------------------------------------------------------------\n    | Validation "
  },
  {
    "path": "lang/fr.json",
    "chars": 21476,
    "preview": "{\n    \"- Content: :content\": \"- Contenu : :content\",\n    \"- Field: :field\": \"- Champ : :field\",\n    \"- New value: :newVa"
  },
  {
    "path": "package.json",
    "chars": 897,
    "preview": "{\n    \"private\": true,\n    \"scripts\": {\n        \"dev\": \"vite\",\n        \"build\": \"vite build\",\n        \"heroku-postbuild\""
  },
  {
    "path": "phpunit.xml",
    "chars": 1105,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<phpunit xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:noNam"
  },
  {
    "path": "postcss.config.js",
    "chars": 82,
    "preview": "module.exports = {\n  plugins: {\n    tailwindcss: {},\n    autoprefixer: {},\n  },\n}\n"
  },
  {
    "path": "public/.htaccess",
    "chars": 603,
    "preview": "<IfModule mod_rewrite.c>\n    <IfModule mod_negotiation.c>\n        Options -MultiViews -Indexes\n    </IfModule>\n\n    Rewr"
  },
  {
    "path": "public/index.php",
    "chars": 1710,
    "preview": "<?php\n\nuse Illuminate\\Contracts\\Http\\Kernel;\nuse Illuminate\\Http\\Request;\n\ndefine('LARAVEL_START', microtime(true));\n\n/*"
  },
  {
    "path": "public/robots.txt",
    "chars": 24,
    "preview": "User-agent: *\nDisallow:\n"
  },
  {
    "path": "public/vendor/filament-forms-tinyeditor/tinymce/langs/README.md",
    "chars": 151,
    "preview": "This is where language files should be placed.\n\nPlease DO NOT translate these directly use this service: https://www.tra"
  }
]

// ... and 140 more files (download for full content)

About this extraction

This page contains the full source code of the devaslanphp/help-desk GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 340 files (2.6 MB), approximately 703.5k tokens, and a symbol index with 1091 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!