├── Resources ├── public │ ├── css │ │ ├── custom.css │ │ └── uikit.css │ ├── js │ │ ├── common.js │ │ └── tinymce │ │ │ ├── plugins │ │ │ ├── help │ │ │ │ └── img │ │ │ │ │ └── logo.png │ │ │ ├── emoticons │ │ │ │ └── img │ │ │ │ │ ├── smiley-cool.gif │ │ │ │ │ ├── smiley-cry.gif │ │ │ │ │ ├── smiley-kiss.gif │ │ │ │ │ ├── smiley-wink.gif │ │ │ │ │ ├── smiley-yell.gif │ │ │ │ │ ├── smiley-frown.gif │ │ │ │ │ ├── smiley-sealed.gif │ │ │ │ │ ├── smiley-smile.gif │ │ │ │ │ ├── smiley-innocent.gif │ │ │ │ │ ├── smiley-laughing.gif │ │ │ │ │ ├── smiley-surprised.gif │ │ │ │ │ ├── smiley-undecided.gif │ │ │ │ │ ├── smiley-embarassed.gif │ │ │ │ │ ├── smiley-money-mouth.gif │ │ │ │ │ ├── smiley-tongue-out.gif │ │ │ │ │ └── smiley-foot-in-mouth.gif │ │ │ ├── print │ │ │ │ └── plugin.min.js │ │ │ ├── hr │ │ │ │ └── plugin.min.js │ │ │ ├── nonbreaking │ │ │ │ └── plugin.min.js │ │ │ ├── code │ │ │ │ └── plugin.min.js │ │ │ └── directionality │ │ │ │ └── plugin.min.js │ │ │ ├── skins │ │ │ └── lightgray │ │ │ │ ├── img │ │ │ │ ├── anchor.gif │ │ │ │ ├── loader.gif │ │ │ │ ├── object.gif │ │ │ │ └── trans.gif │ │ │ │ └── fonts │ │ │ │ ├── tinymce.eot │ │ │ │ ├── tinymce.ttf │ │ │ │ ├── tinymce.woff │ │ │ │ ├── tinymce-small.eot │ │ │ │ ├── tinymce-small.ttf │ │ │ │ └── tinymce-small.woff │ │ │ └── langs │ │ │ └── readme.md │ └── images │ │ ├── 403.png │ │ ├── 404.png │ │ ├── close.png │ │ ├── no-domain.png │ │ ├── icon-google.png │ │ ├── mail-status.png │ │ ├── splash │ │ ├── tasks.png │ │ ├── branding.png │ │ ├── mailbox.png │ │ ├── profile.png │ │ ├── onboarding.png │ │ └── saved-replies.png │ │ ├── unkown-error.png │ │ ├── message-status.png │ │ ├── uv-avatar-batman.png │ │ ├── uv-avatar-ironman.png │ │ ├── uv-avatar-uvdesk.png │ │ ├── icons │ │ ├── file-system │ │ │ ├── c.png │ │ │ ├── js.png │ │ │ ├── ts.png │ │ │ ├── aspx.png │ │ │ ├── css.png │ │ │ ├── csv.png │ │ │ ├── doc.png │ │ │ ├── html.png │ │ │ ├── java.png │ │ │ ├── json.png │ │ │ ├── jsp.png │ │ │ ├── ods.png │ │ │ ├── odt.png │ │ │ ├── pdf.png │ │ │ ├── php.png │ │ │ ├── ppt.png │ │ │ ├── txt.png │ │ │ ├── xls.png │ │ │ ├── xml.png │ │ │ ├── yaml.png │ │ │ ├── zip.png │ │ │ └── unknown.png │ │ └── country-flags │ │ │ ├── ar.png │ │ │ ├── de.png │ │ │ ├── en.png │ │ │ ├── es.png │ │ │ ├── fr.png │ │ │ ├── it.png │ │ │ ├── tr.png │ │ │ └── default.png │ │ ├── uv-avatar-huntress.png │ │ ├── uvdesk-illustration-import.png │ │ ├── icon-broadcast.svg │ │ ├── due-pattern.svg │ │ ├── icon-check.svg │ │ ├── icon-clip-or.svg │ │ ├── arrow-down.svg │ │ ├── arrow-down-dark.svg │ │ ├── arrow-down-light.svg │ │ ├── icon-add.svg │ │ ├── app-glyph-files.svg │ │ ├── icon-app-files.svg │ │ ├── checkbox.svg │ │ ├── radio.svg │ │ ├── icon-folder.svg │ │ ├── app-glyph-notes-on-customer.svg │ │ ├── icon-success.svg │ │ ├── icon-error.svg │ │ ├── checkbox-checked.svg │ │ ├── radio-checked.svg │ │ ├── ticket-rating-white-star.svg │ │ ├── uvdesk-sprite-success.svg │ │ ├── app-glyph-ecommerce.svg │ │ ├── app-glyph-todo.svg │ │ ├── app-glyph-tasks.svg │ │ ├── app-glyph-custom.svg │ │ ├── app-glyph-articles.svg │ │ ├── icon-close.svg │ │ ├── icon-attachment-choose.svg │ │ ├── icon-search-kb.svg │ │ ├── icon-search.svg │ │ ├── app-glyph-customer-ticket.svg │ │ ├── uvdesk-logo-symbol.svg │ │ ├── icon-history.svg │ │ ├── icon-attachment.svg │ │ ├── uvdesk-layout-sprite.svg │ │ ├── icon-attachment-dropbox.svg │ │ └── icon-date-picker.svg ├── config │ ├── routes.yaml │ ├── routes │ │ └── public.yaml │ └── services │ │ ├── automations.yaml │ │ └── public.yaml └── views │ ├── Templates │ ├── aside.html.twig │ └── search.html.twig │ └── tickets │ └── quick-actions │ └── saved-replies.html.twig ├── Templates ├── swiftmailer.yaml ├── SwiftMailer │ ├── null-configurations.php │ └── configurations.php ├── Email │ ├── UVDeskEmailTemplateInterface.php │ ├── base.html.twig │ └── Resources │ │ ├── UserForgotPassword.php │ │ └── Collaborator │ │ └── TicketReplyAgent.php ├── twig.yaml ├── doctrine.yaml ├── config.yaml ├── CLI │ ├── on-boarding.php │ └── Guides │ │ └── uvdesk-bootstrapping-guide.php └── uvdesk.php ├── .gitattributes ├── Tickets ├── WidgetInterface.php ├── QuickActionButtonInterface.php ├── WidgetCollection.php └── QuickActionButtonCollection.php ├── Definition ├── RouterInterface.php ├── RoutingResourceInterface.php └── RouteLoader.php ├── Framework ├── ExtendableComponentInterface.php ├── ExtendableComponentManager.php └── EventDispatcher.php ├── Dashboard ├── Segments │ ├── PanelSidebarInterface.php │ ├── PanelSidebarItemInterface.php │ ├── SearchItemInterface.php │ ├── NavigationInterface.php │ ├── HomepageSectionItemInterface.php │ ├── HomepageSectionInterface.php │ ├── HomepageSection.php │ └── HomepageSectionItem.php └── DashboardTemplate.php ├── .github ├── SECURITY.md ├── PULL_REQUEST_TEMPLATE.md └── ISSUE_TEMPLATE │ ├── Feature_request.md │ ├── Support_question.md │ └── Bug_report.md ├── UIComponents ├── Dashboard │ ├── Panel │ │ ├── Sidebars │ │ │ ├── Apps.php │ │ │ ├── Users.php │ │ │ ├── Account.php │ │ │ ├── Reports.php │ │ │ ├── Branding.php │ │ │ ├── Settings.php │ │ │ └── Productivity.php │ │ └── Items │ │ │ ├── Account │ │ │ └── Profile.php │ │ │ ├── Themes │ │ │ └── Helpdesk.php │ │ │ ├── Settings │ │ │ ├── Branding.php │ │ │ ├── EmailSettings.php │ │ │ ├── EmailTemplates.php │ │ │ ├── SwiftMailer.php │ │ │ └── MicrosoftApps.php │ │ │ ├── Reports │ │ │ ├── Kudos.php │ │ │ └── AgentActivity.php │ │ │ ├── Productivity │ │ │ ├── Tags.php │ │ │ ├── SavedReplies.php │ │ │ └── TicketTypes.php │ │ │ └── Users │ │ │ ├── Agents.php │ │ │ ├── Groups.php │ │ │ ├── Teams.php │ │ │ ├── Privileges.php │ │ │ └── Customers.php │ ├── Homepage │ │ ├── Sections │ │ │ ├── Productivity.php │ │ │ ├── Reports.php │ │ │ ├── Settings.php │ │ │ └── Users.php │ │ └── Items │ │ │ ├── AgentActivity.php │ │ │ ├── Tags.php │ │ │ ├── TicketTypes.php │ │ │ ├── SavedReplies.php │ │ │ ├── Agents.php │ │ │ ├── Teams.php │ │ │ ├── Kudos.php │ │ │ ├── Privileges.php │ │ │ ├── Branding.php │ │ │ ├── Customers.php │ │ │ ├── EmailTemplates.php │ │ │ └── Groups.php │ ├── Search │ │ ├── AgentActivity.php │ │ ├── Apps.php │ │ ├── Tags.php │ │ ├── TicketTypes.php │ │ ├── SavedReplies.php │ │ ├── Agents.php │ │ ├── Teams.php │ │ ├── Kudos.php │ │ ├── Privileges.php │ │ ├── Branding.php │ │ ├── EmailTemplates.php │ │ ├── Tickets.php │ │ └── Groups.php │ └── Navigation │ │ ├── Home.php │ │ ├── Reports.php │ │ └── Ticket.php └── Ticket │ └── QuickActionButtons │ └── SavedReplies.php ├── Workflow ├── Events │ ├── Agent │ │ ├── Update.php │ │ ├── Create.php │ │ ├── Delete.php │ │ └── ForgotPassword.php │ ├── Ticket │ │ ├── Note.php │ │ ├── Agent.php │ │ ├── Create.php │ │ ├── Delete.php │ │ ├── Group.php │ │ ├── Team.php │ │ ├── Type.php │ │ ├── Status.php │ │ ├── AgentReply.php │ │ ├── Priority.php │ │ ├── CustomerReply.php │ │ ├── ThreadUpdate.php │ │ ├── Collaborator.php │ │ └── CollaboratorReply.php │ ├── Customer │ │ ├── Create.php │ │ ├── Delete.php │ │ ├── Update.php │ │ └── ForgotPassword.php │ └── User │ │ └── ForgotPassword.php └── Actions │ └── Ticket │ ├── AddNote.php │ └── MarkSpam.php ├── FileSystem └── FileUploadServiceInterface.php ├── Routing └── RoutingResource.php ├── Controller ├── Session.php └── ThreadXHR.php ├── Repository ├── RecaptchaRepository.php └── AgentActivityRepository.php ├── SwiftMailer └── Event │ ├── ConfigurationRemovedEvent.php │ └── ConfigurationUpdatedEvent.php ├── EventListener └── Logout.php ├── Guides └── BootstrappingProject.php ├── DependencyInjection └── Passes │ ├── Routes.php │ ├── Ticket │ ├── Widgets.php │ └── QuickActionButtons.php │ ├── Events.php │ └── Extendables.php ├── Fixtures ├── HelpdeskBranding.php ├── AgentGroups.php ├── TicketTypes.php └── AgentPrivileges.php ├── UVDeskCoreFrameworkBundle.php ├── PreparedResponse └── Actions │ ├── Agent │ └── TransferTickets.php │ └── Ticket │ ├── Delete.php │ ├── MarkSpam.php │ ├── AddNote.php │ ├── UpdateGroup.php │ └── UpdateTeam.php ├── composer.json ├── Extension └── TwigExtension.php ├── Form └── UserProfile.php └── Entity └── Recaptcha.php /Resources/public/css/custom.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Resources/public/css/uikit.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Resources/public/js/common.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Resources/public/images/403.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uvdesk/core-framework/HEAD/Resources/public/images/403.png -------------------------------------------------------------------------------- /Resources/public/images/404.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uvdesk/core-framework/HEAD/Resources/public/images/404.png -------------------------------------------------------------------------------- /Resources/public/images/close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uvdesk/core-framework/HEAD/Resources/public/images/close.png -------------------------------------------------------------------------------- /Templates/swiftmailer.yaml: -------------------------------------------------------------------------------- 1 | swiftmailer: 2 | # url: '%env(MAILER_URL)%' 3 | # spool: { type: 'memory' } 4 | 5 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | Resources/public/* linguist-vendored 2 | Resources/views/* linguist-vendored 3 | Templates/* linguist-vendored -------------------------------------------------------------------------------- /Resources/public/images/no-domain.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uvdesk/core-framework/HEAD/Resources/public/images/no-domain.png -------------------------------------------------------------------------------- /Resources/public/images/icon-google.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uvdesk/core-framework/HEAD/Resources/public/images/icon-google.png -------------------------------------------------------------------------------- /Resources/public/images/mail-status.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uvdesk/core-framework/HEAD/Resources/public/images/mail-status.png -------------------------------------------------------------------------------- /Resources/public/images/splash/tasks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uvdesk/core-framework/HEAD/Resources/public/images/splash/tasks.png -------------------------------------------------------------------------------- /Resources/public/images/unkown-error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uvdesk/core-framework/HEAD/Resources/public/images/unkown-error.png -------------------------------------------------------------------------------- /Templates/SwiftMailer/null-configurations.php: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Resources/public/images/message-status.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uvdesk/core-framework/HEAD/Resources/public/images/message-status.png -------------------------------------------------------------------------------- /Resources/public/images/splash/branding.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uvdesk/core-framework/HEAD/Resources/public/images/splash/branding.png -------------------------------------------------------------------------------- /Resources/public/images/splash/mailbox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uvdesk/core-framework/HEAD/Resources/public/images/splash/mailbox.png -------------------------------------------------------------------------------- /Resources/public/images/splash/profile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uvdesk/core-framework/HEAD/Resources/public/images/splash/profile.png -------------------------------------------------------------------------------- /Resources/public/images/splash/onboarding.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uvdesk/core-framework/HEAD/Resources/public/images/splash/onboarding.png -------------------------------------------------------------------------------- /Resources/public/images/uv-avatar-batman.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uvdesk/core-framework/HEAD/Resources/public/images/uv-avatar-batman.png -------------------------------------------------------------------------------- /Resources/public/images/uv-avatar-ironman.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uvdesk/core-framework/HEAD/Resources/public/images/uv-avatar-ironman.png -------------------------------------------------------------------------------- /Resources/public/images/uv-avatar-uvdesk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uvdesk/core-framework/HEAD/Resources/public/images/uv-avatar-uvdesk.png -------------------------------------------------------------------------------- /Tickets/WidgetInterface.php: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Dashboard/Segments/PanelSidebarInterface.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /.github/SECURITY.md: -------------------------------------------------------------------------------- 1 | Security Policy 2 | =============== 3 | 4 | ⚠ PLEASE DON'T DISCLOSE SECURITY-RELATED ISSUES PUBLICLY, SEE BELOW. 5 | 6 | If you have found a security issue in Uvdesk, please send the details to support@uvdesk.com and don't disclose it publicly until we can provide a fix for it. 7 | 8 | Thanks! 9 | -------------------------------------------------------------------------------- /Definition/RoutingResourceInterface.php: -------------------------------------------------------------------------------- 1 | 4 | 5 | ### 1. Why is this change necessary? 6 | 7 | 8 | ### 2. What does this change do, exactly? 9 | 10 | 11 | ### 3. Please link to the relevant issues (if any). 12 | -------------------------------------------------------------------------------- /Resources/public/images/due-pattern.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /Resources/public/images/icon-check.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /Resources/public/images/icon-clip-or.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /Dashboard/Segments/SearchItemInterface.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /Resources/public/images/arrow-down-dark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /Resources/public/images/arrow-down-light.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /UIComponents/Dashboard/Panel/Sidebars/Apps.php: -------------------------------------------------------------------------------- 1 | 5 | 7 | -------------------------------------------------------------------------------- /UIComponents/Dashboard/Panel/Sidebars/Account.php: -------------------------------------------------------------------------------- 1 | 5 | 7 | -------------------------------------------------------------------------------- /Resources/public/images/icon-app-files.svg: -------------------------------------------------------------------------------- 1 | 5 | 7 | -------------------------------------------------------------------------------- /Resources/public/images/checkbox.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /Resources/public/images/radio.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/Feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: 🚀 Feature Request 3 | about: RFC and ideas for new features and improvements 4 | 5 | --- 6 | 7 | **Description** 8 | 9 | 10 | **Example** 11 | 13 | -------------------------------------------------------------------------------- /Dashboard/Segments/HomepageSectionItemInterface.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /Templates/Email/base.html.twig: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {% block title %}{% endblock %} 6 | {% block metadata %}{% endblock %} 7 | 8 | 9 | {{ message|raw }} 10 | 11 | -------------------------------------------------------------------------------- /Workflow/Events/Ticket/Priority.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /Resources/public/images/icon-success.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /Workflow/Events/Ticket/Collaborator.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /Resources/public/images/checkbox-checked.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /Routing/RoutingResource.php: -------------------------------------------------------------------------------- 1 | 9 | 10 | **How to reproduce** 11 | 12 | 13 | **Possible Solution** 14 | 15 | 16 | **Additional context** 17 | 18 | -------------------------------------------------------------------------------- /Resources/public/images/radio-checked.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /Resources/public/images/ticket-rating-white-star.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /Resources/public/images/uvdesk-sprite-success.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /Workflow/Events/Agent/ForgotPassword.php: -------------------------------------------------------------------------------- 1 | 5 | 7 | -------------------------------------------------------------------------------- /Workflow/Events/Customer/ForgotPassword.php: -------------------------------------------------------------------------------- 1 | 5 | 7 | -------------------------------------------------------------------------------- /Controller/Session.php: -------------------------------------------------------------------------------- 1 | getUser()) { 14 | return new JsonResponse(['session' => 'expired'], 401); 15 | } 16 | 17 | return new JsonResponse(['session' => 'active']); 18 | } 19 | } -------------------------------------------------------------------------------- /Resources/public/images/app-glyph-tasks.svg: -------------------------------------------------------------------------------- 1 | 5 | 7 | -------------------------------------------------------------------------------- /Resources/public/images/app-glyph-custom.svg: -------------------------------------------------------------------------------- 1 | 5 | 7 | -------------------------------------------------------------------------------- /Resources/config/routes/public.yaml: -------------------------------------------------------------------------------- 1 | # Add public routing resources here ... 2 | helpdesk_forgot_account_password: 3 | path: /{_locale}/forgot-password 4 | controller: Webkul\UVDesk\CoreFrameworkBundle\Controller\Authentication::forgotPassword 5 | requirements: { _locale: '%app_locales%' } 6 | defaults: { _locale: '%locale%' } 7 | 8 | helpdesk_update_account_credentials: 9 | path: /{_locale}/update-credentials/{email}/{verificationCode} 10 | controller: Webkul\UVDesk\CoreFrameworkBundle\Controller\Authentication::updateCredentials 11 | requirements: { _locale: '%app_locales%' } 12 | defaults: { _locale: '%locale%', email: '', verificationCode: '' } 13 | -------------------------------------------------------------------------------- /UIComponents/Dashboard/Homepage/Sections/Productivity.php: -------------------------------------------------------------------------------- 1 | 5 | 7 | -------------------------------------------------------------------------------- /Framework/ExtendableComponentManager.php: -------------------------------------------------------------------------------- 1 | container = $container; 14 | } 15 | 16 | public function addComponent(ExtendableComponentInterface $component, array $tags = []) 17 | { 18 | $this->components[get_class($component)] = $component; 19 | } 20 | 21 | public function getRegisteredComponent($className) : ExtendableComponentInterface 22 | { 23 | return $this->components[$className]; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /UIComponents/Dashboard/Homepage/Sections/Settings.php: -------------------------------------------------------------------------------- 1 | collection[] = $item; 20 | 21 | return $this; 22 | } 23 | 24 | public function getItemCollection(): array 25 | { 26 | return $this->collection; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Resources/public/images/icon-close.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /Resources/public/images/icon-attachment-choose.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | icon-choose 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /Resources/public/images/icon-search-kb.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /Resources/public/images/icon-search.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /Repository/RecaptchaRepository.php: -------------------------------------------------------------------------------- 1 | configuration = $configuration; 21 | } 22 | 23 | public function getSwiftMailerConfiguration(): BaseConfiguration 24 | { 25 | return $this->configuration; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /EventListener/Logout.php: -------------------------------------------------------------------------------- 1 | entityManager = $entityManager; 15 | } 16 | 17 | public function onLogout(LogoutEvent $event) 18 | { 19 | $user = $event->getToken()->getUser(); 20 | 21 | if ($user && method_exists($user, 'getCurrentInstance')) { 22 | $userInstance = $user->getCurrentInstance(); 23 | if ($userInstance) { 24 | $userInstance->setIsOnline(false); 25 | $this->entityManager->flush(); 26 | } 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /Repository/AgentActivityRepository.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /Framework/EventDispatcher.php: -------------------------------------------------------------------------------- 1 | container = $container; 17 | $this->requestStack = $requestStack; 18 | } 19 | 20 | public function addEventListener($eventListener, array $tags = []) 21 | { 22 | foreach ($tags as $tag) { 23 | $this->addListener($tag['event'], [$eventListener, $tag['method']]); 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /UIComponents/Dashboard/Homepage/Sections/Users.php: -------------------------------------------------------------------------------- 1 | render('@UVDeskCoreFramework/tickets/quick-actions/saved-replies.html.twig'); 19 | } 20 | 21 | public function prepareDashboard(DashboardTemplate $dashboard) 22 | { 23 | $dashboard->appendJavascript('bundles/uvdeskcoreframework/js/tickets/quick-actions/saved-replies.js'); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /Guides/BootstrappingProject.php: -------------------------------------------------------------------------------- 1 | setName('uvdesk:guides:bootstrapping-project'); 16 | $this->setDescription('Walks you through on how to provide the minimal setup for your support system.'); 17 | } 18 | 19 | protected function execute(InputInterface $input, OutputInterface $output) 20 | { 21 | $consoleOutputText = require self::$console_guide_resource . "/uvdesk-bootstrapping-guide.php"; 22 | 23 | $output->writeln($consoleOutputText); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /Dashboard/Segments/HomepageSectionItem.php: -------------------------------------------------------------------------------- 1 | 9 | 10 | 11 | SVG; 12 | 13 | public static function getIcon(): string 14 | { 15 | return self::SVG; 16 | } 17 | 18 | public static function getRoles(): array 19 | { 20 | return []; 21 | } 22 | 23 | public abstract static function getTitle(): string; 24 | public abstract static function getRouteName(): string; 25 | public abstract static function getSectionReferenceId(): string; 26 | } 27 | -------------------------------------------------------------------------------- /Resources/config/services/automations.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | Webkul\UVDesk\CoreFrameworkBundle\Workflow\Events\: 3 | resource: '../../../Workflow/Events/*' 4 | arguments: ['@service_container', '@request_stack', '@doctrine.orm.entity_manager'] 5 | tags: 6 | - { name: uvdesk.automations.workflow.events } 7 | 8 | Webkul\UVDesk\CoreFrameworkBundle\Workflow\Actions\: 9 | resource: '../../../Workflow/Actions/*' 10 | arguments: ['@service_container', '@request_stack', '@doctrine.orm.entity_manager'] 11 | tags: 12 | - { name: uvdesk.automations.workflow.actions } 13 | 14 | Webkul\UVDesk\CoreFrameworkBundle\PreparedResponse\Actions\: 15 | resource: '../../../PreparedResponse/Actions/*' 16 | arguments: ['@service_container', '@request_stack', '@doctrine.orm.entity_manager'] 17 | tags: 18 | - { name: uvdesk.automations.prepared_response.actions } 19 | -------------------------------------------------------------------------------- /UIComponents/Dashboard/Panel/Items/Account/Profile.php: -------------------------------------------------------------------------------- 1 | 3 |
4 |
{{ sidebar.title|trans }}
5 |
6 | {{ 'Back'|trans }} 7 |
8 |
9 | 10 |
11 | 16 |
17 | 18 | {% endif %} -------------------------------------------------------------------------------- /UIComponents/Dashboard/Panel/Items/Settings/Branding.php: -------------------------------------------------------------------------------- 1 | has(RouteLoader::class)) { 16 | $routerDefinition = $container->findDefinition(RouteLoader::class); 17 | 18 | foreach ($container->findTaggedServiceIds(RoutingResourceInterface::class) as $resource => $tags) { 19 | $routerDefinition->addMethodCall('addRoutingResource', array(new Reference($resource), $tags)); 20 | } 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /UIComponents/Dashboard/Panel/Items/Productivity/Tags.php: -------------------------------------------------------------------------------- 1 | has(WidgetCollection::class)) { 16 | $ticketWidgetCollectionDefinition = $container->findDefinition(WidgetCollection::class); 17 | 18 | foreach ($container->findTaggedServiceIds(WidgetInterface::class) as $id => $tags) { 19 | $ticketWidgetCollectionDefinition->addMethodCall('add', array(new Reference($id), $tags)); 20 | } 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Fixtures/HelpdeskBranding.php: -------------------------------------------------------------------------------- 1 | getRepository(Website::class)->findOneByCode('helpdesk'); 15 | 16 | if (empty($website)) { 17 | ($website = new CoreEntities\Website()) 18 | ->setName('Support Center') 19 | ->setCode('helpdesk') 20 | ->setThemeColor('#0056fc') 21 | ->setCreatedAt(new \DateTime()) 22 | ->setUpdatedAt(new \DateTime()); 23 | 24 | $entityManager->persist($website); 25 | $entityManager->flush(); 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /DependencyInjection/Passes/Events.php: -------------------------------------------------------------------------------- 1 | has(EventDispatcher::class)) { 15 | $eventDispatcherDefinition = $container->findDefinition(EventDispatcher::class); 16 | $taggedEventListeners = $container->findTaggedServiceIds('uvdesk.event_listener'); 17 | 18 | foreach ($taggedEventListeners as $serviceId => $serviceTags) { 19 | $eventDispatcherDefinition->addMethodCall('addEventListener', array(new Reference($serviceId), $serviceTags)); 20 | } 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /UVDeskCoreFrameworkBundle.php: -------------------------------------------------------------------------------- 1 | addCompilerPass(new Passes\Events()) 23 | ->addCompilerPass(new Passes\Routes()) 24 | ->addCompilerPass(new Passes\Extendables()) 25 | ->addCompilerPass(new Passes\DashboardComponents()) 26 | ->addCompilerPass(new Passes\Ticket\Widgets()) 27 | ->addCompilerPass(new Passes\Ticket\QuickActionButtons()); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /Resources/views/tickets/quick-actions/saved-replies.html.twig: -------------------------------------------------------------------------------- 1 |
2 |
{{ 'Saved Replies'|trans }}
3 |
4 |
5 | 6 |
    7 | 8 |
  • 9 | {{ 'create new'|trans }} 10 |
  • 11 | {% for savedReply in ticket_service.getSavedReplies() %} 12 |
  • 13 | {{ savedReply.name }} 14 |
  • 15 | {% endfor %} 16 |
17 |
18 |
19 |
20 | -------------------------------------------------------------------------------- /Tickets/WidgetCollection.php: -------------------------------------------------------------------------------- 1 | collection[] = $widget; 14 | } 15 | 16 | // Render side filter icons 17 | public function embedSideFilterIcons() 18 | { 19 | return array_reduce($this->collection, function($html, $segment) { 20 | $html .= '' . $segment::getIcon() . ''; 21 | 22 | return $html; 23 | }, ''); 24 | } 25 | 26 | // Render side filter content 27 | public function embedSideFilterContent() 28 | { 29 | return array_reduce($this->collection, function($html, $segment) { 30 | $html .= $segment->getTemplate(); 31 | 32 | return $html; 33 | }, ''); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /DependencyInjection/Passes/Extendables.php: -------------------------------------------------------------------------------- 1 | has(ExtendableComponentManager::class)) { 16 | $extendableComponentManagerDefinition = $container->findDefinition(ExtendableComponentManager::class); 17 | 18 | foreach ($container->findTaggedServiceIds(ExtendableComponentInterface::class) as $component => $tags) { 19 | $extendableComponentManagerDefinition->addMethodCall('addComponent', array(new Reference($component))); 20 | } 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /DependencyInjection/Passes/Ticket/QuickActionButtons.php: -------------------------------------------------------------------------------- 1 | has(QuickActionButtonCollection::class)) { 16 | $quickActionButtonCollectionDefinition = $container->findDefinition(QuickActionButtonCollection::class); 17 | 18 | foreach ($container->findTaggedServiceIds(QuickActionButtonInterface::class) as $id => $tags) { 19 | $quickActionButtonCollectionDefinition->addMethodCall('add', array(new Reference($id), $tags)); 20 | } 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /PreparedResponse/Actions/Agent/TransferTickets.php: -------------------------------------------------------------------------------- 1 | get('doctrine.orm.entity_manager'); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "uvdesk/core-framework", 3 | "description": "UVDesk Community Helpdesk Core Framework Bundle", 4 | "type": "symfony-bundle", 5 | "license": "MIT", 6 | "authors": [ 7 | { 8 | "name": "UVdesk Support", 9 | "email": "support@uvdesk.com" 10 | } 11 | ], 12 | "require": { 13 | "php": "^7.2.5 || ^8.0", 14 | "doctrine/doctrine-bundle": "^2.4", 15 | "doctrine/doctrine-fixtures-bundle": "^3.4", 16 | "doctrine/doctrine-migrations-bundle": "^3.4", 17 | "knplabs/knp-paginator-bundle": "^5.4.0" 18 | }, 19 | "suggest": { 20 | "uvdesk/automation-bundle": "Automate operations within your UVDesk Community Helpdesk System based on pre-defined events triggered from your application", 21 | "uvdesk/support-center-bundle": "Provide your customers with convenience by introducing the Support Center Portal to your UVDesk Community Helpdesk System" 22 | }, 23 | "autoload": { 24 | "psr-4": { "Webkul\\UVDesk\\CoreFrameworkBundle\\": "" } 25 | }, 26 | "minimum-stability": "stable" 27 | } 28 | -------------------------------------------------------------------------------- /Templates/doctrine.yaml: -------------------------------------------------------------------------------- 1 | parameters: 2 | # Adds a fallback DATABASE_URL if the env var is not set. 3 | # This allows you to run cache:warmup even if your 4 | # environment variables are not available yet. 5 | # You should not need to change this value. 6 | env(DATABASE_URL): '' 7 | 8 | doctrine: 9 | dbal: 10 | # configure these for your database server 11 | driver: 'pdo_mysql' 12 | server_version: '5.7' 13 | charset: utf8mb4 14 | default_table_options: 15 | charset: utf8mb4 16 | collate: utf8mb4_unicode_ci 17 | 18 | url: '%env(DATABASE_URL)%' 19 | options: 20 | 1002: 'SET sql_mode=(SELECT REPLACE(@@sql_mode, "ONLY_FULL_GROUP_BY", ""))' 21 | orm: 22 | auto_generate_proxy_classes: true 23 | naming_strategy: doctrine.orm.naming_strategy.underscore 24 | auto_mapping: true 25 | mappings: 26 | App: 27 | is_bundle: false 28 | type: annotation 29 | dir: '%kernel.project_dir%/src/Entity' 30 | prefix: 'App\Entity' 31 | alias: App 32 | -------------------------------------------------------------------------------- /UIComponents/Dashboard/Panel/Items/Users/Agents.php: -------------------------------------------------------------------------------- 1 | 11 | 12 | 13 | SVG; 14 | 15 | public static function getIcon() : string 16 | { 17 | return self::SVG; 18 | } 19 | 20 | public static function getTitle() : string 21 | { 22 | return "Agent Activity"; 23 | } 24 | 25 | public static function getRouteName() : string 26 | { 27 | return 'helpdesk_member_agent_activity'; 28 | } 29 | 30 | public static function getRoles() : array 31 | { 32 | return ['ROLE_AGENT_MANAGE_AGENT_ACTIVITY']; 33 | } 34 | 35 | public function getChildrenRoutes() : array 36 | { 37 | return []; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /UIComponents/Dashboard/Search/Apps.php: -------------------------------------------------------------------------------- 1 | 10 | 11 | 12 | SVG; 13 | 14 | public static function getIcon() : string 15 | { 16 | return self::SVG; 17 | } 18 | 19 | public static function getTitle() : string 20 | { 21 | return "Apps"; 22 | } 23 | 24 | public static function getRouteName() : string 25 | { 26 | return 'uvdesk_extensions_applications_dashboard'; 27 | } 28 | 29 | public function getChildrenRoutes() : array 30 | { 31 | return []; 32 | } 33 | public static function getRoles() : array 34 | { 35 | return ['ROLE_ADMIN']; 36 | } 37 | } -------------------------------------------------------------------------------- /Templates/config.yaml: -------------------------------------------------------------------------------- 1 | parameters: 2 | app_locales: en|fr|it|de|da|ar|es|tr|zh|pl 3 | 4 | # Default Assets 5 | assets_default_agent_profile_image_path: 'bundles/uvdeskcoreframework/images/uv-avatar-batman.png' 6 | assets_default_customer_profile_image_path: 'bundles/uvdeskcoreframework/images/uv-avatar-ironman.png' 7 | assets_default_helpdesk_profile_image_path: 'bundles/uvdeskcoreframework/images/uv-avatar-uvdesk.png' 8 | 9 | uvdesk_site_path.member_prefix: member 10 | uvdesk_site_path.knowledgebase_customer_prefix: customer 11 | 12 | # File uploads constraints 13 | # @TODO: Set these parameters via compilers 14 | max_post_size: 8388608 15 | max_file_uploads: 20 16 | upload_max_filesize: 2097152 17 | 18 | uvdesk: 19 | site_url: 'localhost:8000' 20 | upload_manager: 21 | id: Webkul\UVDesk\CoreFrameworkBundle\FileSystem\UploadManagers\Localhost 22 | 23 | support_email: ~ 24 | 25 | # Default resources 26 | default: 27 | ticket: 28 | type: support 29 | status: open 30 | priority: low 31 | templates: 32 | email: mail.html.twig 33 | -------------------------------------------------------------------------------- /UIComponents/Dashboard/Panel/Items/Settings/EmailTemplates.php: -------------------------------------------------------------------------------- 1 | 3 | {% if websiteDetails and websiteDetails.themeColor %} 4 | .uv-search-bar:focus { 5 | border: 1px solid {{ websiteDetails.themeColor }} !important; 6 | box-shadow: none !important; 7 | } 8 | .uv-search-bar { 9 | border: 1px solid #9E9E9E !important; 10 | background-color: transparent !important; 11 | } 12 | {% endif %} 13 | 14 |
15 | 16 |
17 |
Results
18 | 19 | {% for item in collection %} 20 | 21 |
22 |
{{ item.icon | raw }}
23 |

{{ item.title |trans }}

24 |
25 |
26 | {% endfor %} 27 | 28 | 31 |
32 |
33 | -------------------------------------------------------------------------------- /UIComponents/Dashboard/Panel/Items/Productivity/SavedReplies.php: -------------------------------------------------------------------------------- 1 | updatedConfiguration = $updatedConfiguration; 22 | $this->existingConfiguration = $existingConfiguration; 23 | } 24 | 25 | public function getUpdatedSwiftMailerConfiguration(): BaseConfiguration 26 | { 27 | return $this->updatedConfiguration; 28 | } 29 | 30 | public function getExistingSwiftMailerConfiguration(): BaseConfiguration 31 | { 32 | return $this->existingConfiguration; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /UIComponents/Dashboard/Panel/Items/Users/Privileges.php: -------------------------------------------------------------------------------- 1 | ")}),a.addButton("hr",{icon:"hr",tooltip:"Horizontal line",cmd:"InsertHorizontalRule"}),a.addMenuItem("hr",{icon:"hr",text:"Horizontal line",cmd:"InsertHorizontalRule",context:"insert"})}),function(){}}),d("0")()}(); -------------------------------------------------------------------------------- /Resources/public/images/uvdesk-logo-symbol.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /Resources/public/images/icon-history.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /UIComponents/Dashboard/Panel/Items/Users/Customers.php: -------------------------------------------------------------------------------- 1 | 11 | 12 | 13 | SVG; 14 | 15 | public static function getIcon() : string 16 | { 17 | return self::SVG; 18 | } 19 | 20 | public static function getTitle() : string 21 | { 22 | return "Home"; 23 | } 24 | 25 | public static function getRouteName() : string 26 | { 27 | return 'helpdesk_member_dashboard'; 28 | } 29 | 30 | public static function getRoles() : array 31 | { 32 | return []; 33 | } 34 | 35 | public function getChildrenRoutes() : array 36 | { 37 | return []; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /UIComponents/Dashboard/Search/Tags.php: -------------------------------------------------------------------------------- 1 | 11 | 12 | 13 | SVG; 14 | 15 | public static function getIcon() : string 16 | { 17 | return self::SVG; 18 | } 19 | 20 | public static function getTitle() : string 21 | { 22 | return "Tags"; 23 | } 24 | 25 | public static function getRouteName() : string 26 | { 27 | return 'helpdesk_member_ticket_tag_collection'; 28 | } 29 | 30 | public static function getRoles() : array 31 | { 32 | return ['ROLE_AGENT_MANAGE_TAG']; 33 | } 34 | 35 | public function getChildrenRoutes() : array 36 | { 37 | return []; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /Extension/TwigExtension.php: -------------------------------------------------------------------------------- 1 | 56 | -------------------------------------------------------------------------------- /UIComponents/Dashboard/Search/TicketTypes.php: -------------------------------------------------------------------------------- 1 | 11 | 12 | 13 | SVG; 14 | 15 | public static function getIcon() : string 16 | { 17 | return self::SVG; 18 | } 19 | 20 | public static function getTitle() : string 21 | { 22 | return "Ticket Types"; 23 | } 24 | 25 | public static function getRouteName() : string 26 | { 27 | return 'helpdesk_member_ticket_type_collection'; 28 | } 29 | 30 | public static function getRoles() : array 31 | { 32 | return ['ROLE_AGENT_MANAGE_TICKET_TYPE']; 33 | } 34 | 35 | public function getChildrenRoutes() : array 36 | { 37 | return []; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /UIComponents/Dashboard/Search/SavedReplies.php: -------------------------------------------------------------------------------- 1 | 11 | 12 | 13 | SVG; 14 | 15 | public static function getIcon() : string 16 | { 17 | return self::SVG; 18 | } 19 | 20 | public static function getTitle() : string 21 | { 22 | return "Saved Replies"; 23 | } 24 | 25 | public static function getRouteName() : string 26 | { 27 | return 'helpdesk_member_saved_replies'; 28 | } 29 | 30 | public static function getRoles() : array 31 | { 32 | return []; 33 | } 34 | 35 | public function getChildrenRoutes() : array 36 | { 37 | return []; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /Dashboard/DashboardTemplate.php: -------------------------------------------------------------------------------- 1 | router = $router; 18 | $this->container = $container; 19 | $this->requestStack = $requestStack; 20 | } 21 | 22 | public function appendJavascript($javascript, $tags = []) 23 | { 24 | $this->scripts[] = $javascript; 25 | } 26 | 27 | public function getJavascriptResources() 28 | { 29 | return $this->scripts; 30 | } 31 | 32 | public function appendStylesheet($stylesheet, $tags = []) 33 | { 34 | $this->stylesheets[] = $stylesheet; 35 | } 36 | 37 | public function getStylesheetResources() 38 | { 39 | return $this->stylesheets; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /UIComponents/Dashboard/Navigation/Reports.php: -------------------------------------------------------------------------------- 1 | 11 | 12 | 13 | SVG; 14 | 15 | public static function getIcon() : string 16 | { 17 | return self::SVG; 18 | } 19 | 20 | public static function getTitle() : string 21 | { 22 | return "Reports"; 23 | } 24 | 25 | public static function getRouteName() : string 26 | { 27 | return 'helpdesk_member_agent_activity'; 28 | } 29 | 30 | public static function getRoles() : array 31 | { 32 | return []; 33 | } 34 | 35 | public function getChildrenRoutes() : array 36 | { 37 | return []; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /PreparedResponse/Actions/Ticket/Delete.php: -------------------------------------------------------------------------------- 1 | get('doctrine.orm.entity_manager'); 35 | if($entity instanceof Ticket) { 36 | $entityManager->remove($entity); 37 | $entityManager->flush(); 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /UIComponents/Dashboard/Homepage/Items/AgentActivity.php: -------------------------------------------------------------------------------- 1 | 12 | 13 | 14 | SVG; 15 | 16 | public static function getIcon() : string 17 | { 18 | return self::SVG; 19 | } 20 | 21 | public static function getTitle() : string 22 | { 23 | return "Agent Activity"; 24 | } 25 | 26 | public static function getRouteName() : string 27 | { 28 | return 'helpdesk_member_agent_activity'; 29 | } 30 | 31 | public static function getRoles() : array 32 | { 33 | return ['ROLE_AGENT_MANAGE_AGENT_ACTIVITY']; 34 | } 35 | 36 | public static function getSectionReferenceId() : string 37 | { 38 | return Reports::class; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /UIComponents/Dashboard/Panel/Items/Settings/MicrosoftApps.php: -------------------------------------------------------------------------------- 1 | 11 | 12 | 13 | SVG; 14 | 15 | public static function getIcon() : string 16 | { 17 | return self::SVG; 18 | } 19 | 20 | public static function getTitle() : string 21 | { 22 | return "Agents"; 23 | } 24 | 25 | public static function getRouteName() : string 26 | { 27 | return 'helpdesk_member_account_collection'; 28 | } 29 | 30 | public static function getRoles() : array 31 | { 32 | return ['ROLE_AGENT_MANAGE_AGENT']; 33 | } 34 | 35 | public function getChildrenRoutes() : array 36 | { 37 | return []; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /Resources/public/images/icon-attachment.svg: -------------------------------------------------------------------------------- 1 | 5 | 7 | -------------------------------------------------------------------------------- /Resources/public/images/uvdesk-layout-sprite.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /UIComponents/Dashboard/Search/Teams.php: -------------------------------------------------------------------------------- 1 | 11 | 12 | 13 | SVG; 14 | 15 | public static function getIcon() : string 16 | { 17 | return self::SVG; 18 | } 19 | 20 | public static function getTitle() : string 21 | { 22 | return "Teams"; 23 | } 24 | 25 | public static function getRouteName() : string 26 | { 27 | return 'helpdesk_member_support_team_collection'; 28 | } 29 | 30 | public static function getRoles() : array 31 | { 32 | return ['ROLE_AGENT_MANAGE_SUB_GROUP']; 33 | } 34 | 35 | public function getChildrenRoutes() : array 36 | { 37 | return []; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /Fixtures/AgentGroups.php: -------------------------------------------------------------------------------- 1 | 'Default', 15 | 'description' => 'Account Owner', 16 | 'isActive' => true, 17 | ], 18 | ]; 19 | 20 | public function load(ObjectManager $entityManager): void 21 | { 22 | $availableSupportGroups = $entityManager->getRepository(SupportGroup::class)->findAll(); 23 | 24 | if (empty($availableSupportGroups)) { 25 | foreach (self::$seeds as $supportGroupSeed) { 26 | $supportGroup = new CoreEntities\SupportGroup(); 27 | $supportGroup->setName($supportGroupSeed['name']); 28 | $supportGroup->setDescription($supportGroupSeed['description']); 29 | $supportGroup->setIsActive($supportGroupSeed['isActive']); 30 | 31 | $entityManager->persist($supportGroup); 32 | } 33 | 34 | $entityManager->flush(); 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /UIComponents/Dashboard/Search/Kudos.php: -------------------------------------------------------------------------------- 1 | 11 | 12 | 13 | SVG; 14 | 15 | public static function getIcon() : string 16 | { 17 | return self::SVG; 18 | } 19 | 20 | public static function getTitle() : string 21 | { 22 | return "Kudos"; 23 | } 24 | 25 | public static function getRouteName() : string 26 | { 27 | return 'helpdesk_report_achievements_insight_action'; 28 | } 29 | 30 | public static function getRoles() : array 31 | { 32 | return ['ROLE_AGENT_MANAGE_KUDOS']; 33 | } 34 | 35 | public function getChildrenRoutes() : array 36 | { 37 | return []; 38 | } 39 | } -------------------------------------------------------------------------------- /UIComponents/Dashboard/Homepage/Items/Tags.php: -------------------------------------------------------------------------------- 1 | 12 | 13 | 14 | SVG; 15 | 16 | public static function getIcon() : string 17 | { 18 | return self::SVG; 19 | } 20 | 21 | public static function getTitle() : string 22 | { 23 | return "Tags"; 24 | } 25 | 26 | public static function getRouteName() : string 27 | { 28 | return 'helpdesk_member_ticket_tag_collection'; 29 | } 30 | 31 | public static function getRoles() : array 32 | { 33 | return ['ROLE_AGENT_MANAGE_TAG']; 34 | } 35 | 36 | public static function getSectionReferenceId() : string 37 | { 38 | return Productivity::class; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /UIComponents/Dashboard/Homepage/Items/TicketTypes.php: -------------------------------------------------------------------------------- 1 | 12 | 13 | 14 | SVG; 15 | 16 | public static function getIcon() : string 17 | { 18 | return self::SVG; 19 | } 20 | 21 | public static function getTitle() : string 22 | { 23 | return "Ticket Types"; 24 | } 25 | 26 | public static function getRouteName() : string 27 | { 28 | return 'helpdesk_member_ticket_type_collection'; 29 | } 30 | 31 | public static function getRoles() : array 32 | { 33 | return ['ROLE_AGENT_MANAGE_TICKET_TYPE']; 34 | } 35 | 36 | public static function getSectionReferenceId() : string 37 | { 38 | return Productivity::class; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /UIComponents/Dashboard/Homepage/Items/SavedReplies.php: -------------------------------------------------------------------------------- 1 | 12 | 13 | 14 | SVG; 15 | 16 | public static function getIcon() : string 17 | { 18 | return self::SVG; 19 | } 20 | 21 | public static function getTitle() : string 22 | { 23 | return "Saved Replies"; 24 | } 25 | 26 | public static function getRouteName() : string 27 | { 28 | return 'helpdesk_member_saved_replies'; 29 | } 30 | 31 | public static function getRoles() : array 32 | { 33 | return []; 34 | } 35 | 36 | public static function getSectionReferenceId() : string 37 | { 38 | return Productivity::class; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /UIComponents/Dashboard/Search/Privileges.php: -------------------------------------------------------------------------------- 1 | 11 | 12 | 13 | SVG; 14 | 15 | public static function getIcon() : string 16 | { 17 | return self::SVG; 18 | } 19 | 20 | public static function getTitle() : string 21 | { 22 | return "Privileges"; 23 | } 24 | 25 | public static function getRouteName() : string 26 | { 27 | return 'helpdesk_member_privilege_collection'; 28 | } 29 | 30 | public static function getRoles() : array 31 | { 32 | return ['ROLE_AGENT_MANAGE_AGENT_PRIVILEGE']; 33 | } 34 | 35 | public function getChildrenRoutes() : array 36 | { 37 | return []; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /UIComponents/Dashboard/Search/Branding.php: -------------------------------------------------------------------------------- 1 | 11 | 12 | 13 | SVG; 14 | 15 | public static function getIcon() : string 16 | { 17 | return self::SVG; 18 | } 19 | 20 | public static function getTitle() : string 21 | { 22 | return "Branding"; 23 | } 24 | 25 | public static function getRoles() : array 26 | { 27 | return ['ROLE_ADMIN']; 28 | } 29 | 30 | public static function getRouteName() : string 31 | { 32 | return 'helpdesk_member_helpdesk_theme'; 33 | } 34 | 35 | public function getChildrenRoutes() : array 36 | { 37 | return []; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /UIComponents/Dashboard/Homepage/Items/Agents.php: -------------------------------------------------------------------------------- 1 | 12 | 13 | 14 | SVG; 15 | 16 | public static function getIcon() : string 17 | { 18 | return self::SVG; 19 | } 20 | 21 | public static function getTitle() : string 22 | { 23 | return "Agents"; 24 | } 25 | 26 | public static function getRouteName() : string 27 | { 28 | return 'helpdesk_member_account_collection'; 29 | } 30 | 31 | public static function getRoles() : array 32 | { 33 | return ['ROLE_AGENT_MANAGE_AGENT']; 34 | } 35 | 36 | public static function getSectionReferenceId() : string 37 | { 38 | return Users::class; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /Templates/CLI/on-boarding.php: -------------------------------------------------------------------------------- 1 | 7 | _ ___ ______ _ ____ _ _ 8 | | | | \ \ / / _ \ ___ ___| | __ / ___|___ _ __ ___ _ __ ___ _ _ _ __ (_) |_ _ _ 9 | | | | |\ \ / /| | | |/ _ \/ __| |/ / | | / _ \| '_ ` _ \| '_ ` _ \| | | | '_ \| | __| | | | 10 | | |_| | \ V / | |_| | __/\__ \ < | |__| (_) | | | | | | | | | | | |_| | | | | | |_| |_| | 11 | \___/ \_/ |____/ \___||___/_|\_\ \____\___/|_| |_| |_|_| |_| |_|\__,_|_| |_|_|\__|\__, | 12 | |___/ 13 | 14 | Welcome to the UVDesk Community project! UVDesk Community is an open-source e-commerce helpdesk system 15 | which is built on top of reliable set of tools to provide you and your customers with the best support 16 | solution possible. 17 | 18 | To start things off, here are a few commands to help you setup: 19 | 20 | * Configuring your project: 21 | 22 | php bin/console uvdesk:configure-helpdesk 23 | 24 | * Run your project through a local php web server: 25 | 26 | php bin/console server:run 27 | 28 | 29 | Made with $love by the UVDesk Team. Happy helping :) 30 | 31 | PROMPT; 32 | 33 | ?> -------------------------------------------------------------------------------- /UIComponents/Dashboard/Search/EmailTemplates.php: -------------------------------------------------------------------------------- 1 | 11 | 12 | 13 | SVG; 14 | 15 | public static function getIcon() : string 16 | { 17 | return self::SVG; 18 | } 19 | 20 | public static function getTitle() : string 21 | { 22 | return "Email Templates"; 23 | } 24 | 25 | public static function getRouteName() : string 26 | { 27 | return 'email_templates_action'; 28 | } 29 | 30 | public static function getRoles() : array 31 | { 32 | return ['ROLE_AGENT_MANAGE_EMAIL_TEMPLATE']; 33 | } 34 | 35 | public function getChildrenRoutes() : array 36 | { 37 | return []; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /Controller/ThreadXHR.php: -------------------------------------------------------------------------------- 1 | ticketService = $ticketService; 18 | } 19 | 20 | public function listTicketThreadCollectionXHR($ticketId) 21 | { 22 | $entityManager = $this->getDoctrine()->getManager(); 23 | $request = $this->container->get('request_stack')->getCurrentRequest(); 24 | 25 | if (true === $request->isXmlHttpRequest()) { 26 | $ticket = $entityManager->getRepository(Ticket::class)->findOneById($ticketId); 27 | 28 | if (! empty($ticket)) { 29 | $paginationResponse = $this->ticketService->paginateMembersTicketThreadCollection($ticket, $request); 30 | 31 | return new Response(json_encode($paginationResponse), 200, ['Content-Type' => 'application/json']); 32 | } 33 | } 34 | 35 | return new Response(json_encode([]), 404, ['Content-Type' => 'application/json']); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /Templates/uvdesk.php: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /UIComponents/Dashboard/Homepage/Items/Teams.php: -------------------------------------------------------------------------------- 1 | 12 | 13 | 14 | SVG; 15 | 16 | public static function getIcon() : string 17 | { 18 | return self::SVG; 19 | } 20 | 21 | public static function getTitle() : string 22 | { 23 | return "Teams"; 24 | } 25 | 26 | public static function getRouteName() : string 27 | { 28 | return 'helpdesk_member_support_team_collection'; 29 | } 30 | 31 | public static function getRoles() : array 32 | { 33 | return ['ROLE_AGENT_MANAGE_SUB_GROUP']; 34 | } 35 | 36 | public static function getSectionReferenceId() : string 37 | { 38 | return Users::class; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /UIComponents/Dashboard/Navigation/Ticket.php: -------------------------------------------------------------------------------- 1 | 11 | 12 | 13 | SVG; 14 | 15 | public static function getIcon() : string 16 | { 17 | return self::SVG; 18 | } 19 | 20 | public static function getTitle() : string 21 | { 22 | return "Tickets"; 23 | } 24 | 25 | public static function getRouteName() : string 26 | { 27 | return 'helpdesk_member_ticket_collection'; 28 | } 29 | 30 | public static function getRoles() : array 31 | { 32 | return []; 33 | } 34 | 35 | public function getChildrenRoutes() : array 36 | { 37 | return []; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /PreparedResponse/Actions/Ticket/MarkSpam.php: -------------------------------------------------------------------------------- 1 | get('doctrine.orm.entity_manager'); 36 | if ($entity instanceof Ticket) { 37 | $status = $entityManager->getRepository(TicketStatus::class)->find(6); 38 | $entity->setStatus($status); 39 | $entityManager->persist($entity); 40 | $entityManager->flush(); 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /UIComponents/Dashboard/Search/Tickets.php: -------------------------------------------------------------------------------- 1 | 11 | 12 | 13 | SVG; 14 | 15 | public static function getIcon() : string 16 | { 17 | return self::SVG; 18 | } 19 | 20 | public static function getTitle() : string 21 | { 22 | return "Tickets"; 23 | } 24 | 25 | public static function getRouteName() : string 26 | { 27 | return 'helpdesk_member_ticket_collection'; 28 | } 29 | 30 | public static function getRoles() : array 31 | { 32 | return []; 33 | } 34 | 35 | public function getChildrenRoutes() : array 36 | { 37 | return []; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /UIComponents/Dashboard/Homepage/Items/Kudos.php: -------------------------------------------------------------------------------- 1 | 12 | 13 | 14 | SVG; 15 | 16 | public static function getIcon() : string 17 | { 18 | return self::SVG; 19 | } 20 | 21 | public static function getTitle() : string 22 | { 23 | return "Kudos"; 24 | } 25 | 26 | public static function getRouteName() : string 27 | { 28 | return 'helpdesk_report_achievements_insight_action'; 29 | } 30 | 31 | public static function getRoles() : array 32 | { 33 | return ['ROLE_AGENT_MANAGE_KUDOS']; 34 | } 35 | 36 | public static function getSectionReferenceId() : string 37 | { 38 | return Reports::class; 39 | } 40 | } -------------------------------------------------------------------------------- /UIComponents/Dashboard/Search/Groups.php: -------------------------------------------------------------------------------- 1 | 11 | 12 | 13 | SVG; 14 | 15 | public static function getIcon() : string 16 | { 17 | return self::SVG; 18 | } 19 | 20 | public static function getTitle() : string 21 | { 22 | return "Groups"; 23 | } 24 | 25 | public static function getRouteName() : string 26 | { 27 | return 'helpdesk_member_support_group_collection'; 28 | } 29 | 30 | public static function getRoles() : array 31 | { 32 | return ['ROLE_AGENT_MANAGE_GROUP']; 33 | } 34 | 35 | public function getChildrenRoutes() : array 36 | { 37 | return []; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /Fixtures/TicketTypes.php: -------------------------------------------------------------------------------- 1 | 'support', 15 | 'description' => 'Support', 16 | 'isActive' => true, 17 | ], 18 | ]; 19 | 20 | public function load(ObjectManager $entityManager): void 21 | { 22 | $availableTicketTypes = $entityManager->getRepository(TicketType::class)->findAll(); 23 | $availableTicketTypes = array_map(function ($ticketType) { 24 | return $ticketType->getCode(); 25 | }, $availableTicketTypes); 26 | 27 | foreach (self::$seeds as $ticketTypeSeed) { 28 | if (false === in_array($ticketTypeSeed['code'], $availableTicketTypes)) { 29 | $ticketType = new CoreEntities\TicketType(); 30 | $ticketType->setCode($ticketTypeSeed['code']); 31 | $ticketType->setDescription($ticketTypeSeed['description']); 32 | $ticketType->setIsActive($ticketTypeSeed['isActive']); 33 | 34 | $entityManager->persist($ticketType); 35 | } 36 | } 37 | 38 | $entityManager->flush(); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /Resources/public/images/icon-attachment-dropbox.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | icon-dropbox 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /Resources/config/services/public.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | _defaults: 3 | autowire: true 4 | autoconfigure: true 5 | public: true 6 | 7 | # Aliases 8 | uvdesk.service: 9 | alias: Webkul\UVDesk\CoreFrameworkBundle\Services\UVDeskService 10 | 11 | user.provider: 12 | alias: Webkul\UVDesk\CoreFrameworkBundle\Providers\UserProvider 13 | 14 | user.service: 15 | alias: Webkul\UVDesk\CoreFrameworkBundle\Services\UserService 16 | 17 | email.service: 18 | alias: Webkul\UVDesk\CoreFrameworkBundle\Services\EmailService 19 | 20 | ticket.service: 21 | alias: Webkul\UVDesk\CoreFrameworkBundle\Services\TicketService 22 | 23 | recaptcha.service: 24 | alias: Webkul\UVDesk\CoreFrameworkBundle\Services\ReCaptchaService 25 | 26 | report.service: 27 | alias: Webkul\UVDesk\CoreFrameworkBundle\Services\ReportService 28 | 29 | validation.service: 30 | alias: Webkul\UVDesk\CoreFrameworkBundle\Services\ValidationService 31 | 32 | uvdesk.core.file_system.service: 33 | alias: Webkul\UVDesk\CoreFrameworkBundle\FileSystem\FileSystem 34 | 35 | swiftmailer.service: 36 | alias: Webkul\UVDesk\CoreFrameworkBundle\SwiftMailer\SwiftMailer 37 | 38 | uvdesk.core.event_dispatcher: 39 | alias: Webkul\UVDesk\CoreFrameworkBundle\Framework\EventDispatcher 40 | 41 | uvdesk.extensibles: 42 | alias: Webkul\UVDesk\CoreFrameworkBundle\Framework\ExtendableComponentManager 43 | -------------------------------------------------------------------------------- /UIComponents/Dashboard/Homepage/Items/Privileges.php: -------------------------------------------------------------------------------- 1 | 12 | 13 | 14 | SVG; 15 | 16 | public static function getIcon() : string 17 | { 18 | return self::SVG; 19 | } 20 | 21 | public static function getTitle() : string 22 | { 23 | return "Privileges"; 24 | } 25 | 26 | public static function getRouteName() : string 27 | { 28 | return 'helpdesk_member_privilege_collection'; 29 | } 30 | 31 | public static function getRoles() : array 32 | { 33 | return ['ROLE_AGENT_MANAGE_AGENT_PRIVILEGE']; 34 | } 35 | 36 | public static function getSectionReferenceId() : string 37 | { 38 | return Users::class; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /Resources/public/js/tinymce/plugins/nonbreaking/plugin.min.js: -------------------------------------------------------------------------------- 1 | !function(){var a={},b=function(b){for(var c=a[b],e=c.deps,f=c.defn,g=e.length,h=new Array(g),i=0;i ':" "),a.dom.setAttrib(a.dom.select("span.mce-nbsp"),"data-mce-bogus","1")}),a.addButton("nonbreaking",{title:"Nonbreaking space",cmd:"mceNonBreaking"}),a.addMenuItem("nonbreaking",{text:"Nonbreaking space",cmd:"mceNonBreaking",context:"insert"}),b){var c=+b>1?+b:3;a.on("keydown",function(b){if(9==b.keyCode){if(b.shiftKey)return;b.preventDefault();for(var d=0;d 12 | 13 | 14 | SVG; 15 | 16 | public static function getIcon() : string 17 | { 18 | return self::SVG; 19 | } 20 | 21 | public static function getTitle() : string 22 | { 23 | return "Branding"; 24 | } 25 | 26 | public static function getRouteName() : string 27 | { 28 | return 'helpdesk_member_helpdesk_theme'; 29 | } 30 | 31 | public static function getRoles() : array 32 | { 33 | return ['ROLE_ADMIN']; 34 | } 35 | 36 | public static function getSectionReferenceId() : string 37 | { 38 | return Settings::class; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /UIComponents/Dashboard/Homepage/Items/Customers.php: -------------------------------------------------------------------------------- 1 | 12 | 13 | 14 | SVG; 15 | 16 | public static function getIcon() : string 17 | { 18 | return self::SVG; 19 | } 20 | 21 | public static function getTitle() : string 22 | { 23 | return "Customers"; 24 | } 25 | 26 | public static function getRouteName() : string 27 | { 28 | return 'helpdesk_member_manage_customer_account_collection'; 29 | } 30 | 31 | public static function getRoles() : array 32 | { 33 | return ['ROLE_AGENT_MANAGE_CUSTOMER']; 34 | } 35 | 36 | public static function getSectionReferenceId() : string 37 | { 38 | return Users::class; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /Form/UserProfile.php: -------------------------------------------------------------------------------- 1 | add('firstName', TextType::class); 21 | $builder->add('lastName', TextType::class); 22 | $builder->add('email', EmailType::class); 23 | $builder->add('password', RepeatedType::class); 24 | } 25 | 26 | public function configureOptions(OptionsResolver $resolver) 27 | { 28 | $resolver->setDefaults(array( 29 | 'data_class' => 'Webkul\UVDesk\CoreFrameworkBundle\Entity\User', 30 | 'cascade_validation' => true, 31 | 'allow_extra_fields' => true, 32 | 'csrf_protection' => false, 33 | )); 34 | } 35 | 36 | public function setDefaultOptions(OptionsResolverInterface $resolver) 37 | { 38 | $this->configureOptions($resolver); 39 | } 40 | 41 | public function getName() 42 | { 43 | return 'user_form'; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /Fixtures/AgentPrivileges.php: -------------------------------------------------------------------------------- 1 | 'Default Privileges', 15 | 'description' => 'Default Privileges', 16 | 'privileges' => [ 17 | 'ROLE_AGENT_ADD_NOTE' 18 | ], 19 | ], 20 | ]; 21 | 22 | public function load(ObjectManager $entityManager): void 23 | { 24 | $availableSupportPrivileges = $entityManager->getRepository(SupportPrivilege::class)->findAll(); 25 | 26 | if (empty($availableSupportPrivileges)) { 27 | foreach (self::$seeds as $supportPrivilegeSeed) { 28 | $supportPrivilege = new CoreEntities\SupportPrivilege(); 29 | $supportPrivilege->setName($supportPrivilegeSeed['name']); 30 | $supportPrivilege->setDescription($supportPrivilegeSeed['description']); 31 | $supportPrivilege->setPrivileges($supportPrivilegeSeed['privileges']); 32 | $supportPrivilege->setCreatedAt(new \Datetime('now')); 33 | 34 | $entityManager->persist($supportPrivilege); 35 | } 36 | 37 | $entityManager->flush(); 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /PreparedResponse/Actions/Ticket/AddNote.php: -------------------------------------------------------------------------------- 1 | getIsTrashed()) 35 | return; 36 | if ($entity instanceof Ticket) { 37 | $data = array(); 38 | $data['ticket'] = $entity; 39 | $data['threadType'] = 'note'; 40 | $data['source'] = 'website'; 41 | $data['message'] = $value; 42 | $data['createdBy'] = 'System'; 43 | 44 | $container->get('ticket.service')->createThread($entity, $data); 45 | } 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /UIComponents/Dashboard/Homepage/Items/EmailTemplates.php: -------------------------------------------------------------------------------- 1 | 12 | 13 | 14 | SVG; 15 | 16 | public static function getIcon() : string 17 | { 18 | return self::SVG; 19 | } 20 | 21 | public static function getTitle() : string 22 | { 23 | return "Email Templates"; 24 | } 25 | 26 | public static function getRouteName() : string 27 | { 28 | return 'email_templates_action'; 29 | } 30 | 31 | public static function getRoles() : array 32 | { 33 | return ['ROLE_AGENT_MANAGE_EMAIL_TEMPLATE']; 34 | } 35 | 36 | public static function getSectionReferenceId() : string 37 | { 38 | return Settings::class; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /Tickets/QuickActionButtonCollection.php: -------------------------------------------------------------------------------- 1 | twig = $twig; 17 | $this->dashboard = $dashboard; 18 | $this->userService = $userService; 19 | } 20 | 21 | public function add(QuickActionButtonInterface $quickActionButton) 22 | { 23 | $this->collection[] = $quickActionButton; 24 | } 25 | 26 | public function injectTemplates() 27 | { 28 | return array_reduce($this->collection, function ($stream, $quickActionButton) { 29 | return $stream .= $quickActionButton->renderTemplate($this->twig); 30 | }, ''); 31 | } 32 | 33 | public function prepareAssets() 34 | { 35 | foreach ($this->collection as $quickActionButton) { 36 | if ($quickActionButton::getRoles() != null) { 37 | foreach ($quickActionButton::getRoles() as $accessRole) { 38 | if ($this->userService->isAccessAuthorized($accessRole)) { 39 | $quickActionButton->prepareDashboard($this->dashboard); 40 | 41 | break; 42 | } 43 | } 44 | } else { 45 | $quickActionButton->prepareDashboard($this->dashboard); 46 | } 47 | } 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /Resources/public/images/icon-date-picker.svg: -------------------------------------------------------------------------------- 1 | 5 | 7 | -------------------------------------------------------------------------------- /UIComponents/Dashboard/Homepage/Items/Groups.php: -------------------------------------------------------------------------------- 1 | 12 | 13 | 14 | SVG; 15 | 16 | public static function getIcon() : string 17 | { 18 | return self::SVG; 19 | } 20 | 21 | public static function getTitle() : string 22 | { 23 | return "Groups"; 24 | } 25 | 26 | public static function getRouteName() : string 27 | { 28 | return 'helpdesk_member_support_group_collection'; 29 | } 30 | 31 | public static function getRoles() : array 32 | { 33 | return ['ROLE_AGENT_MANAGE_GROUP']; 34 | } 35 | 36 | public static function getSectionReferenceId() : string 37 | { 38 | return Users::class; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /Templates/CLI/Guides/uvdesk-bootstrapping-guide.php: -------------------------------------------------------------------------------- 1 | 6 | Bootstrapping your UVDesk Community Helpdesk Support System 7 | 8 | 9 | Before continuing, first ensure that you have correctly configured your application 10 | as detailed below under the Base Configuration guide. 11 | 12 | Once you have correctly setup your application with the minimum set of configuration 13 | parameters, your support system is ready to be used. Follow along the steps detailed 14 | under the Running your application guide to start using your project. 15 | 16 | * Base Configuration: 17 | 18 | 1. Switch to the project directory 19 | 2. Modify your DATABASE_URL config in .env 20 | 3. Execute the php bin/console uvdesk:configure-helpdesk command 21 | 22 | This will populate your database with the necessary dataset required by different 23 | components in your application for proper functioning of your support system. 24 | 25 | * Running your Application: 26 | 27 | 1. Switch to the project directory 28 | 2. Execute the php bin/console server:run command to start the development server 29 | 3. Browse to http://127.0.0.1:8000/en/member/login url to access your support dashboard. 30 | 31 | Quit the server with CTRL-C. 32 | 33 | PROMPT; 34 | 35 | ?> -------------------------------------------------------------------------------- /Resources/public/js/tinymce/plugins/code/plugin.min.js: -------------------------------------------------------------------------------- 1 | !function(){var a={},b=function(b){for(var c=a[b],e=c.deps,f=c.defn,g=e.length,h=new Array(g),i=0;igetTicket(); 39 | 40 | if (empty($ticket)) { 41 | return; 42 | } 43 | } 44 | 45 | $params = [ 46 | 'ticket' => $ticket, 47 | 'message' => $value, 48 | 'source' => 'website', 49 | 'threadType' => 'note', 50 | 'createdBy' => 'System', 51 | ]; 52 | 53 | $container->get('ticket.service')->createThread($ticket, $params); 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /Definition/RouteLoader.php: -------------------------------------------------------------------------------- 1 | env = $container->get('kernel')->getEnvironment(); 16 | } 17 | 18 | public function addRoutingResource(RoutingResourceInterface $routingResource, array $tags = []) 19 | { 20 | if (empty($tags)) { 21 | $this->routingResources[] = $routingResource; 22 | 23 | return; 24 | } 25 | 26 | foreach ($tags as $tag) { 27 | if (empty($tag) || empty($tag['env'])) { 28 | $this->routingResources[] = $routingResource; 29 | } else if (!empty($tag['env']) && $this->env === $tag['env']) { 30 | $this->routingResources[] = $routingResource; 31 | } 32 | } 33 | } 34 | 35 | public function load($resource, $type = null) 36 | { 37 | $collection = new RouteCollection(); 38 | 39 | foreach ($this->routingResources as $routingResource) { 40 | $collection->addCollection($this->import($routingResource->getResourcePath(), $routingResource->getResourceType())); 41 | } 42 | 43 | return $collection; 44 | } 45 | 46 | public function supports($resource, $type = null) 47 | { 48 | return 'uvdesk' === $type; 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /Entity/Recaptcha.php: -------------------------------------------------------------------------------- 1 | id; 37 | } 38 | 39 | public function getSiteKey(): ?string 40 | { 41 | return $this->siteKey; 42 | } 43 | 44 | public function setSiteKey(?string $siteKey): self 45 | { 46 | $this->siteKey = $siteKey; 47 | 48 | return $this; 49 | } 50 | 51 | public function getSecretKey(): ?string 52 | { 53 | return $this->secretKey; 54 | } 55 | 56 | public function setSecretKey(?string $secretKey): self 57 | { 58 | $this->secretKey = $secretKey; 59 | 60 | return $this; 61 | } 62 | 63 | public function getIsActive(): ?bool 64 | { 65 | return $this->isActive; 66 | } 67 | 68 | public function setIsActive(?bool $isActive): self 69 | { 70 | $this->isActive = $isActive; 71 | 72 | return $this; 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /Workflow/Actions/Ticket/MarkSpam.php: -------------------------------------------------------------------------------- 1 | get('doctrine.orm.entity_manager'); 37 | 38 | if (! $event instanceof TicketActivity) { 39 | return; 40 | } else { 41 | $ticket = $event->getTicket(); 42 | 43 | if (empty($ticket)) { 44 | return; 45 | } 46 | } 47 | 48 | $status = $entityManager->getRepository(TicketStatus::class)->find(6); 49 | 50 | $ticket 51 | ->setStatus($status); 52 | 53 | $entityManager->persist($ticket); 54 | $entityManager->flush(); 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /Templates/Email/Resources/UserForgotPassword.php: -------------------------------------------------------------------------------- 1 |

14 |

15 |

16 |

17 |

{%global.companyLogo%}

18 |

19 |
20 |

21 |

Hi {%user.userName%}, 22 |
23 |

24 |

25 |
26 |

27 |

You recently requested to reset your password for your {%global.companyName%} account. Click the link to reset it {%user.forgotPasswordLink%}

28 |

29 |
30 |

31 |

If you did not request a password reset, please ignore this mail or revert back to let us know.

32 |
33 |
34 |
35 |

Thanks and Regards

36 |

{%global.companyName%}

37 |

38 |

39 | MESSAGE; 40 | 41 | public static function getName() 42 | { 43 | return self::$name; 44 | } 45 | 46 | public static function getTemplateType() 47 | { 48 | return self::$type; 49 | } 50 | 51 | public static function getSubject() 52 | { 53 | return self::$subject; 54 | } 55 | 56 | public static function getMessage() 57 | { 58 | return self::$message; 59 | } 60 | } -------------------------------------------------------------------------------- /PreparedResponse/Actions/Ticket/UpdateGroup.php: -------------------------------------------------------------------------------- 1 | get('user.service')->getSupportGroups(); 31 | } 32 | 33 | public static function applyAction(ContainerInterface $container, $entity, $value = null) 34 | { 35 | $entityManager = $container->get('doctrine.orm.entity_manager'); 36 | if ($entity instanceof Ticket) { 37 | $group = $entityManager->getRepository(SupportGroup::class)->find($value); 38 | if ($group) { 39 | $entity->setSupportGroup($group); 40 | $entityManager->persist($entity); 41 | $entityManager->flush(); 42 | } else { 43 | // User Group Not Found. Disable Workflow/Prepared Response 44 | // $this->disableEvent($event, $entity); 45 | } 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /PreparedResponse/Actions/Ticket/UpdateTeam.php: -------------------------------------------------------------------------------- 1 | get('user.service')->getSupportTeams(); 31 | } 32 | 33 | public static function applyAction(ContainerInterface $container, $entity, $value = null) 34 | { 35 | $entityManager = $container->get('doctrine.orm.entity_manager'); 36 | if ($entity instanceof Ticket) { 37 | $subGroup = $entityManager->getRepository(SupportTeam::class)->find($value); 38 | if ($subGroup) { 39 | $entity->setSupportTeam($subGroup); 40 | $entityManager->persist($entity); 41 | $entityManager->flush(); 42 | } else { 43 | // User Sub Group Not Found. Disable Workflow/Prepared Response 44 | //$this->disableEvent($event, $entity); 45 | } 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /Templates/Email/Resources/Collaborator/TicketReplyAgent.php: -------------------------------------------------------------------------------- 1 |  

14 |

 

15 |

{%global.companyLogo%}

16 |

 

17 |

New Response!!

18 |


19 |

Hello {%ticket.agentName%},

20 |

 

21 |

Collaborator of the ticket #{%ticket.id%} has added a reply. You can check the ticket from here {%ticket.agentLink%}.

22 |

 

23 |

Here go the message:

24 |

{%ticket.threadMessage%}{%ticket.attachments%}

25 |

 

26 |

Thanks and Regards

27 |

{%global.companyName%}

28 |

 

29 | MESSAGE; 30 | 31 | public static function getName() 32 | { 33 | return self::$name; 34 | } 35 | 36 | public static function getTemplateType() 37 | { 38 | return self::$type; 39 | } 40 | 41 | public static function getSubject() 42 | { 43 | return self::$subject; 44 | } 45 | 46 | public static function getMessage() 47 | { 48 | return self::$message; 49 | } 50 | } --------------------------------------------------------------------------------