Showing preview only (1,558K chars total). Download the full file or copy to clipboard to get everything.
Repository: uvdesk/community-skeleton
Branch: master
Commit: 6f35040f447f
Files: 75
Total size: 1.5 MB
Directory structure:
gitextract_9k9ewx4g/
├── .docker/
│ ├── bash/
│ │ └── uvdesk-entrypoint.sh
│ └── config/
│ ├── apache2/
│ │ ├── env
│ │ ├── httpd.conf
│ │ └── vhost.conf
│ └── php/
│ └── php.ini
├── .dockerignore
├── .gitattributes
├── .github/
│ ├── CONTRIBUTING.md
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE/
│ │ ├── Bug_report.md
│ │ ├── Feature_request.md
│ │ └── Support_question.md
│ ├── PULL_REQUEST_TEMPLATE.md
│ └── SECURITY.md
├── .gitignore
├── CHANGELOG-1.0.md
├── CHANGELOG-1.1.md
├── CHANGELOG-1.2.md
├── Dockerfile
├── INSTALLATION GUIDE.md
├── LICENSE.txt
├── README.md
├── apps/
│ └── .gitignore
├── composer.json
├── config/
│ ├── bundles.php
│ ├── packages/
│ │ ├── doctrine.yaml
│ │ ├── framework.yaml
│ │ ├── mailer.yaml
│ │ ├── security.yaml
│ │ ├── translation.yaml
│ │ ├── twig.yaml
│ │ ├── uvdesk.yaml
│ │ ├── uvdesk_extensions.yaml
│ │ └── uvdesk_mailbox.yaml
│ ├── routes.yaml
│ └── services.yaml
├── public/
│ ├── .htaccess
│ ├── assets/
│ │ └── .gitignore
│ ├── attachments/
│ │ └── .gitignore
│ ├── css/
│ │ ├── main.css
│ │ ├── reset.css
│ │ └── wizard.css
│ ├── index.php
│ └── scripts/
│ └── wizard.js
├── src/
│ ├── Console/
│ │ ├── EnvironmentVariables.php
│ │ └── Wizard/
│ │ ├── ConfigureHelpdesk.php
│ │ ├── DefaultUser.php
│ │ └── MigrateDatabase.php
│ ├── Controller/
│ │ ├── BaseController.php
│ │ ├── ConfigureHelpdesk.php
│ │ └── ImageCache/
│ │ ├── ImageCacheController.php
│ │ └── ImageManager.php
│ ├── Entity/
│ │ └── .gitignore
│ ├── EventListener/
│ │ └── ExceptionSubscriber.php
│ ├── Migrations/
│ │ └── .gitignore
│ ├── Repository/
│ │ └── .gitignore
│ ├── Resources/
│ │ └── config/
│ │ └── routes.yaml
│ ├── Routing/
│ │ └── RoutingResource.php
│ └── Service/
│ └── UrlImageCacheService.php
├── templates/
│ ├── errors/
│ │ └── error.html.twig
│ ├── installation-wizard/
│ │ └── index.html.twig
│ └── mail.html.twig
└── translations/
├── .gitignore
├── messages.ar.yml
├── messages.da.yml
├── messages.de.yml
├── messages.en.yml
├── messages.es.yml
├── messages.fr.yml
├── messages.he.yml
├── messages.it.yml
├── messages.pl.yml
├── messages.pt_BR.yml
├── messages.tr.yml
└── messages.zh.yml
================================================
FILE CONTENTS
================================================
================================================
FILE: .docker/bash/uvdesk-entrypoint.sh
================================================
#!/bin/bash
# Output color codes
# https://en.wikipedia.org/wiki/ANSI_escape_code
declare -r COLOR_NC='\033[0m'
declare -r COLOR_RED='\033[0;31m'
declare -r COLOR_GREEN='\033[0;32m'
declare -r COLOR_LIGHT_GREEN='\033[1;32m'
declare -r COLOR_YELLOW='\033[1;33m'
declare -r COLOR_LIGHT_YELLOW='\033[0;33m'
declare -r COLOR_BLUE='\033[0;34m'
declare -r COLOR_LIGHT_BLUE='\033[1;34m'
# Restart apache & mysql server
service apache2 restart && service mysql restart;
if [[ ! -z "$MYSQL_USER" && ! -z "$MYSQL_PASSWORD" && ! -z "$MYSQL_DATABASE" ]]; then
if [ "$(mysqladmin ping)" == "mysqld is alive" ]; then
# Mysql is up and running with default configuration
# Create default database if not found and grant non-root user all privileges to that database
# Note: Grant privileges will create user if it doesn't exists prior to mysql 8
mysql -u root -e "CREATE DATABASE IF NOT EXISTS $MYSQL_DATABASE";
mysql -u root -e "GRANT ALL PRIVILEGES ON $MYSQL_DATABASE.* To '$MYSQL_USER'@'localhost' IDENTIFIED BY '$MYSQL_PASSWORD'";
# Update root user credentials
mysql -u root -e "ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '$MYSQL_ROOT_PASSWORD'";
# Create new mysql configuration files (root & uvdesk)
rm -f /etc/mysql/my.cnf /home/uvdesk/.my.cnf \
&& echo -e "[client]\nuser = root\npassword = $MYSQL_ROOT_PASSWORD\nhost = localhost" >> /etc/mysql/my.cnf \
&& echo -e "[client]\nuser = $MYSQL_USER\npassword = $MYSQL_PASSWORD\nhost = localhost" >> /home/uvdesk/.my.cnf;
else
echo -e "${COLOR_RED}Error: Failed to establish a connection with mysql server (localhost)${COLOR_NC}\n";
exit 1;
fi
else
echo -e "${COLOR_LIGHT_YELLOW}Notice: Skipping configuration of local database - one or more mysql environment variables are not defined.${COLOR_NC}\n";
fi
# Step down from sudo to uvdesk
/usr/local/bin/gosu uvdesk "$@"
exec "$@"
================================================
FILE: .docker/config/apache2/env
================================================
# envvars - default environment variables for apache2ctl
# this won't be correct after changing uid
unset HOME
# for supporting multiple apache2 instances
if [ "${APACHE_CONFDIR##/etc/apache2-}" != "${APACHE_CONFDIR}" ] ; then
SUFFIX="-${APACHE_CONFDIR##/etc/apache2-}"
else
SUFFIX=
fi
# Since there is no sane way to get the parsed apache2 config in scripts, some
# settings are defined via environment variables and then used in apache2ctl,
# /etc/init.d/apache2, /etc/logrotate.d/apache2, etc.
export APACHE_RUN_USER=uvdesk
export APACHE_RUN_GROUP=uvdesk
# temporary state file location. This might be changed to /run in Wheezy+1
export APACHE_PID_FILE=/var/run/apache2/apache2$SUFFIX.pid
export APACHE_RUN_DIR=/var/run/apache2$SUFFIX
export APACHE_LOCK_DIR=/var/lock/apache2$SUFFIX
# Only /var/log/apache2 is handled by /etc/logrotate.d/apache2.
export APACHE_LOG_DIR=/var/log/apache2$SUFFIX
## The locale used by some modules like mod_dav
export LANG=C
## Uncomment the following line to use the system default locale instead:
#. /etc/default/locale
export LANG
## The command to get the status for 'apache2ctl status'.
## Some packages providing 'www-browser' need '--dump' instead of '-dump'.
#export APACHE_LYNX='www-browser -dump'
## If you need a higher file descriptor limit, uncomment and adjust the
## following line (default is 8192):
#APACHE_ULIMIT_MAX_FILES='ulimit -n 65536'
## If you would like to pass arguments to the web server, add them below
## to the APACHE_ARGUMENTS environment.
#export APACHE_ARGUMENTS=''
## Enable the debug mode for maintainer scripts.
## This will produce a verbose output on package installations of web server modules and web application
## installations which interact with Apache
#export APACHE2_MAINTSCRIPT_DEBUG=1
================================================
FILE: .docker/config/apache2/httpd.conf
================================================
# This is the main Apache server configuration file. It contains the
# configuration directives that give the server its instructions.
# See http://httpd.apache.org/docs/2.4/ for detailed information about
# the directives and /usr/share/doc/apache2/README.Debian about Debian specific
# hints.
#
#
# Summary of how the Apache 2 configuration works in Debian:
# The Apache 2 web server configuration in Debian is quite different to
# upstream's suggested way to configure the web server. This is because Debian's
# default Apache2 installation attempts to make adding and removing modules,
# virtual hosts, and extra configuration directives as flexible as possible, in
# order to make automating the changes and administering the server as easy as
# possible.
# It is split into several files forming the configuration hierarchy outlined
# below, all located in the /etc/apache2/ directory:
#
# /etc/apache2/
# |-- apache2.conf
# | `-- ports.conf
# |-- mods-enabled
# | |-- *.load
# | `-- *.conf
# |-- conf-enabled
# | `-- *.conf
# `-- sites-enabled
# `-- *.conf
#
#
# * apache2.conf is the main configuration file (this file). It puts the pieces
# together by including all remaining configuration files when starting up the
# web server.
#
# * ports.conf is always included from the main configuration file. It is
# supposed to determine listening ports for incoming connections which can be
# customized anytime.
#
# * Configuration files in the mods-enabled/, conf-enabled/ and sites-enabled/
# directories contain particular configuration snippets which manage modules,
# global configuration fragments, or virtual host configurations,
# respectively.
#
# They are activated by symlinking available configuration files from their
# respective *-available/ counterparts. These should be managed by using our
# helpers a2enmod/a2dismod, a2ensite/a2dissite and a2enconf/a2disconf. See
# their respective man pages for detailed information.
#
# * The binary is called apache2. Due to the use of environment variables, in
# the default configuration, apache2 needs to be started/stopped with
# /etc/init.d/apache2 or apache2ctl. Calling /usr/bin/apache2 directly will not
# work with the default configuration.
# Global configuration
#
#
# ServerRoot: The top of the directory tree under which the server's
# configuration, error, and log files are kept.
#
# NOTE! If you intend to place this on an NFS (or otherwise network)
# mounted filesystem then please read the Mutex documentation (available
# at <URL:http://httpd.apache.org/docs/2.4/mod/core.html#mutex>);
# you will save yourself a lot of trouble.
#
# Do NOT add a slash at the end of the directory path.
#
#ServerRoot "/etc/apache2"
#
# The accept serialization lock file MUST BE STORED ON A LOCAL DISK.
#
#Mutex file:${APACHE_LOCK_DIR} default
#
# The directory where shm and other runtime files will be stored.
#
DefaultRuntimeDir ${APACHE_RUN_DIR}
#
# PidFile: The file in which the server should record its process
# identification number when it starts.
# This needs to be set in /etc/apache2/envvars
#
PidFile ${APACHE_PID_FILE}
#
# Timeout: The number of seconds before receives and sends time out.
#
Timeout 300
#
# KeepAlive: Whether or not to allow persistent connections (more than
# one request per connection). Set to "Off" to deactivate.
#
KeepAlive On
#
# MaxKeepAliveRequests: The maximum number of requests to allow
# during a persistent connection. Set to 0 to allow an unlimited amount.
# We recommend you leave this number high, for maximum performance.
#
MaxKeepAliveRequests 100
#
# KeepAliveTimeout: Number of seconds to wait for the next request from the
# same client on the same connection.
#
KeepAliveTimeout 5
# These need to be set in /etc/apache2/envvars
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}
#
# HostnameLookups: Log the names of clients or just their IP addresses
# e.g., www.apache.org (on) or 204.62.129.132 (off).
# The default is off because it'd be overall better for the net if people
# had to knowingly turn this feature on, since enabling it means that
# each client request will result in AT LEAST one lookup request to the
# nameserver.
#
HostnameLookups Off
# ErrorLog: The location of the error log file.
# If you do not specify an ErrorLog directive within a <VirtualHost>
# container, error messages relating to that virtual host will be
# logged here. If you *do* define an error logfile for a <VirtualHost>
# container, that host's errors will be logged there and not here.
#
ErrorLog ${APACHE_LOG_DIR}/error.log
#
# LogLevel: Control the severity of messages logged to the error_log.
# Available values: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# It is also possible to configure the log level for particular modules, e.g.
# "LogLevel info ssl:warn"
#
LogLevel warn
# Include module configuration:
IncludeOptional mods-enabled/*.load
IncludeOptional mods-enabled/*.conf
# Include list of ports to listen on
Include ports.conf
# Sets the default security model of the Apache2 HTTPD server. It does
# not allow access to the root filesystem outside of /usr/share and /var/www.
# The former is used by web applications packaged in Debian,
# the latter may be used for local directories served by the web server. If
# your system is serving content from a sub-directory in /srv you must allow
# access here, or in any related virtual host.
<Directory />
Options FollowSymLinks
AllowOverride None
Require all denied
</Directory>
<Directory /usr/share>
AllowOverride None
Require all granted
</Directory>
<Directory /var/www/uvdesk>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
#<Directory /srv/>
# Options Indexes FollowSymLinks
# AllowOverride None
# Require all granted
#</Directory>
# AccessFileName: The name of the file to look for in each directory
# for additional configuration directives. See also the AllowOverride
# directive.
#
AccessFileName .htaccess
#
# The following lines prevent .htaccess and .htpasswd files from being
# viewed by Web clients.
#
<FilesMatch "^\.ht">
Require all denied
</FilesMatch>
#
# The following directives define some format nicknames for use with
# a CustomLog directive.
#
# These deviate from the Common Log Format definitions in that they use %O
# (the actual bytes sent including headers) instead of %b (the size of the
# requested file), because the latter makes it impossible to detect partial
# requests.
#
# Note that the use of %{X-Forwarded-For}i instead of %h is not recommended.
# Use mod_remoteip instead.
#
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
# Include of directories ignores editors' and dpkg's backup files,
# see README.Debian for details.
# Include generic snippets of statements
IncludeOptional conf-enabled/*.conf
# Include the virtual host configurations:
IncludeOptional sites-enabled/*.conf
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
================================================
FILE: .docker/config/apache2/vhost.conf
================================================
<VirtualHost *:80>
# The ServerName directive sets the request scheme, hostname and port that
# the server uses to identify itself. This is used when creating
# redirection URLs. In the context of virtual hosts, the ServerName
# specifies what hostname must appear in the request's Host: header to
# match this virtual host. For the default virtual host (this file) this
# value is not decisive as it is used as a last resort host regardless.
# However, you must set it for any further virtual host explicitly.
#ServerName www.example.com
ServerAdmin webmaster@localhost
DocumentRoot /var/www/uvdesk/public
# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# It is also possible to configure the loglevel for particular
# modules, e.g.
#LogLevel info ssl:warn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
# For most configuration files from conf-available/, which are
# enabled or disabled at a global level, it is possible to
# include a line for only one particular virtual host. For example the
# following line enables the CGI configuration for this host only
# after it has been globally disabled with "a2disconf".
#Include conf-available/serve-cgi-bin.conf
</VirtualHost>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
================================================
FILE: .docker/config/php/php.ini
================================================
memory_limit=1024M
================================================
FILE: .dockerignore
================================================
# Ignore files that aren't required to be in the build context when building images
/var/log/*
/var/cache/*
/Dockerfile
================================================
FILE: .gitattributes
================================================
public/* linguist-vendored
templates/* linguist-vendored
================================================
FILE: .github/CONTRIBUTING.md
================================================
## How to contribute to UVdesk(Community)
### **Bug Reporting**
1. Verify that the bug was not already reported by searching on GitHub in the [Issues section](https://github.com/uvdesk/community-skeleton/issues) or supported dependent repositories [Core Framework](https://github.com/uvdesk/core-framework/issues), [Support Center](https://github.com/uvdesk/support-center-bundle), [Mailbox Component](https://github.com/uvdesk/mailbox-component/issues), [Automation bundle](https://github.com/uvdesk/automation-bundle/issues), [Extension Framework](https://github.com/uvdesk/extension-framework)
If you're unable to find an open issue, [open a new one](https://github.com/uvdesk/community-skeleton/issues/new?assignees=&labels=&template=Bug_report.md).
2. Verify that the bug you are reporting is a general issue and not specific to your individual setup.
For individual issues please use the [Community Forum](https://forums.uvdesk.com/).
#### **Did you fix a bug?**
1. To provide a code contribution for an issue you will need to set up your own fork of the [community-skeleton repository](https://github.com/uvdesk/community-skeleton) or supported depended repositories ([core](https://github.com/uvdesk/core-framework), support(https://github.com/uvdesk/support-center-bundle) etc)
Make your code changes, commit the changes and make a [Pull Request](https://help.github.com/articles/about-pull-requests/) to the respective repository.
2. Separate each fix into a new branch in your repository and name it with the issue ID e.g. issue-1456.
3. When committing to your individual branch, please try and use the following as your commit message
```Fixed #1456 - <the subject of the issue>```
4. Please follow the pull request [template](https://github.com/uvdesk/community-skeleton/blob/master/.github/PULL_REQUEST_TEMPLATE.md) as much as possible.
### **Did you create a new feature or enhancement?**
1. To provide a code contribution for a new feature or enhancement a [feature request](https://github.com/uvdesk/community-skeleton/issues/new?assignees=&labels=&template=2_Feature_request.md) report should be created in case it doesn't exist.
2. To contribute a feature to UVdesk, you must create a forked repository and set up your git and development environment.
3. Make sure your commit messages are relevant and descriptive.
4. Please follow the pull request [template](https://github.com/uvdesk/community-skeleton/blob/master/.github/PULL_REQUEST_TEMPLATE.md) as much as possible.
================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms
open_collective: uvdesk
================================================
FILE: .github/ISSUE_TEMPLATE/Bug_report.md
================================================
---
name: "🐛 Bug Report"
about: 'Report a general library issue.'
---
# Bug report
### Title
**Just a quick sentence to brief your trouble with UVDesk or something associated with it.**
**Please be calm, short and emphasize on points.**
### Issue Description
**Description helps the developers to understand the bug. It describes the problem encountered or some after effect of some kind.**
### Preconditions
**Please provide as detailed information about your environment as possible.**
1. framework Version.
2. Commit id.
### Steps to reproduce
**It is important to provide a set of clear steps to reproduce this bug.If relevant please include code samples.**
1. step1
2. step2
### Expected result
**Tell us what should happen.**
* [Screenshots, logs or description]
### Actual result
> **Tell us what happens instead.**
* [points....]
================================================
FILE: .github/ISSUE_TEMPLATE/Feature_request.md
================================================
---
name: "💡 Feature Request"
about: 'Share your ideas with our team or request new features'
---
================================================
FILE: .github/ISSUE_TEMPLATE/Support_question.md
================================================
---
name: ⛔ Support Question
about: Visit https://support.uvdesk.com/ to learn more about how the uvdesk team can assist you
---
We use GitHub issues only to discuss about uvdesk bugs and new features. For customizations and extended support:
- Contact us at support@uvdesk.com
- Visit official support website (https://support.uvdesk.com/en/)
- Visit our community forums (https://forums.uvdesk.com)
Thanks!
================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
<!--
Thank you for contributing to UVDesk! Please fill out this description template to help us to process your pull request.
-->
### 1. Why is this change necessary?
### 2. What does this change do, exactly?
### 3. Please link to the relevant issues (if any).
================================================
FILE: .github/SECURITY.md
================================================
Security Policy
===============
⚠ PLEASE DON'T DISCLOSE SECURITY-RELATED ISSUES PUBLICLY, SEE BELOW.
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.
Thanks!
================================================
FILE: .gitignore
================================================
###> symfony/framework-bundle ###
/.env.local
/.env.local.php
/.env.*.local
/config/secrets/prod/prod.decrypt.private.php
/public/bundles/
/var/
/vendor/
###< symfony/framework-bundle ###
###> symfony/phpunit-bridge ###
.phpunit.result.cache
/phpunit.xml
###< symfony/phpunit-bridge ###
###> phpunit/phpunit ###
/phpunit.xml
.phpunit.result.cache
###< phpunit/phpunit ###
================================================
FILE: CHANGELOG-1.0.md
================================================
CHANGELOG for 1.0.x
===================
This changelog references any relevant changes introduced in 1.0 minor versions.
* 1.0.17 (2021-10-27)
* **Misc. Updates:**
* Compatibility with PHP 8.
* Updated error pages design and added links.
* Saved reply search option added with default focus on search bar to save clicks.
* Added yellow background for note on ticket reply box.
* Layout updates on ticket view for scroller and search dropdown.
* Cache clear button added on dashboard so that user can clear cache of project without
running command using CMD.
* Ticket conversion issue during mailbox refresh command so now user will able to see
error on CMD if any error.
* Added route for dubugging ticket creation issue using email.
* All Attachment remove from it's physical path as well if we delete any ticket or profile etc.
* Ticket Transfer functionality added if removing a agent all tickets will assigned to another agent using workflow.
* Added some default workflow and email templates for collaborators.
* Updated "last update" filter on customer ticket listing.
* **Bug Fixes:**
* **Issue #492:** agent password creation redirects to customer login page.
* **Issue #488:** Better managment of email fetching in case of errors.
* **Issue #485:** Crontab.
* **Issue #484:** No puedo enviar ni recibir correos
* **Issue #483:** Get laravel 8 Uvdesk
* **Issue #480:** Improve 404 page enhancement.
* **Issue #476:** Fix the default email template to customer when ticket is created.
* **Issue #475:** Error when downloading attachment from customer side
* **Issue #474:** Add an option to not rename attachments.
* **Issue #472:** Login Button backend shows no reaktion.
* **Issue #465:** Sort ticket by latest updated.
* **Issue #466:** Loading issue of Tickets which have more Text messages.
* **Issue #464:** Line breaks are not or not nicely displayed.
* **Issue #462:** Error Create Ticket.
* **Issue #461:** swiftmailer.yaml
* **Issue #459:** Disable cloudflare CDN for static contents.
* **Issue #457:** swift error.
* **Issue #455:** Move the HelpDesk string to the custom field.
* **Issue #454:** Can not install UVdesk after install of Composer 2.x.
* **Issue #452:** error deleting ticket permanently.
* **Issue #452:** User login error message not translated.
* 1.0.16 (2021-08-23)
* **Misc. Updates:**
* Kudos feature added for UVdesk opensource.
https://support.uvdesk.com/es/blog/uvdesk-what-is-kudos
* Added a new option for mailbox setting that Email should be deleted from inbox after fetch and converted into ticket if user select that checkbox.
* Added password encryption for Swift mailer and Mailbox.
* Corrected and added timestamp setting for agent and customer both.
* Collaborator replies adding to the ticket thread.
* Flash Message with a warning if swift mailer is not setup or working with ticket create process.
* Profile picture remove option added for customer and agent both.
* Reply to CC and BCC users from customer panel if added.
* Fixed multiple security issues with opensource.
* Added multiple missing translation in files.
* **Bug Fixes:**
* **Issue #423:** Status of the ticket not transalted in customer ticket list.
* **Issue #428:** Attachment and Logo Issue - Web Installer Public Folder Issue.
* **Issue #435:** Newer TLDs are considered invalid.
* **Issue #437:** can’t upload logo after updating to 1.0.14.
* **Issue #438:** Unable to finish installation - Error during load/superuser.
* **Issue #439:** Update jQuery and Underscore.js
* **Issue #433:** Email should be deleted from mailbox after fetch.
* **Issue #429:** Invalid type for path "uvdesk_mailbox.mailboxes.Support.imap_server.password". Expected scalar, but got object.
* **Issue #417:** Potential Security vulnerability.
* **Issue #401:** Need to implement a workflow that alert if any issue with sending email occurs.
* **Issue #382:** Improve new user experience: install and setup.
* **Issue #410:** Unable to create super user during installation.
* **Issue #375:** [Feature request] support extensions.
* **Issue #372:** Option to remove emails from mailbox after they are fetched.
* **Issue #340:** Option for operator and for the customer to remove the profile picture.
* **Issue #326:** Issue with translations on visitor and operator side.
* **Issue #279:** Add possibility to delete emails when is added to the ticket.
* **Issue #350:** Users avatar not delted from the server
* **Issue #276:** Issues wth swiftmailer password if contains specials characters. Also save password not encrypted seems not good for security.
* 1.0.15 (2021-08-21)
* **Misc. Updates:**
* Kudos feature added for UVdesk opensource.
https://support.uvdesk.com/es/blog/uvdesk-what-is-kudos
* Added a new option for mailbox setting that Email should be deleted from inbox after fetch and converted into ticket if user select that checkbox.
* Added password encryption for Swift mailer and Mailbox.
* Corrected and added timestamp setting for agent and customer both.
* Collaborator replies adding to the ticket thread.
* Flash Message with a warning if swift mailer is not setup or working with ticket create process.
* Profile picture remove option added for customer and agent both.
* Reply to CC and BCC users from customer panel if added.
* Fixed multiple security issues with opensource.
* Added multiple missing translation in files.
* **Bug Fixes:**
* **Issue #423:** Status of the ticket not transalted in customer ticket list.
* **Issue #428:** Attachment and Logo Issue - Web Installer Public Folder Issue.
* **Issue #435:** Newer TLDs are considered invalid.
* **Issue #437:** can’t upload logo after updating to 1.0.14.
* **Issue #438:** Unable to finish installation - Error during load/superuser.
* **Issue #439:** Update jQuery and Underscore.js
* **Issue #433:** Email should be deleted from mailbox after fetch.
* **Issue #429:** Invalid type for path "uvdesk_mailbox.mailboxes.Support.imap_server.password". Expected scalar, but got object.
* **Issue #417:** Potential Security vulnerability.
* **Issue #401:** Need to implement a workflow that alert if any issue with sending email occurs.
* **Issue #382:** Improve new user experience: install and setup.
* **Issue #410:** Unable to create super user during installation.
* **Issue #375:** [Feature request] support extensions.
* **Issue #372:** Option to remove emails from mailbox after they are fetched.
* **Issue #340:** Option for operator and for the customer to remove the profile picture.
* **Issue #326:** Issue with translations on visitor and operator side.
* **Issue #279:** Add possibility to delete emails when is added to the ticket.
* **Issue #350:** Users avatar not delted from the server
* **Issue #276:** Issues wth swiftmailer password if contains specials characters. Also save password not encrypted seems not good for security.
* 1.0.14 (2021-06-19)
* **Misc. Updates:**
* Web installer updates for making installtion process easier and smooth also added progess bar.
- Extra checks for file permission https://prnt.sc/11ypcoo , https://prnt.sc/11ypvna
- Progess Bar with web installer: https://prnt.sc/11ypg5c , https://prnt.sc/11yp43d
* compatibility with composer 2.
* Agent Activity section added under report section.
https://prnt.sc/124brkr, https://prnt.sc/124bttl, https://prnt.sc/124bx1y
* Announcement section added for uvdesk opensource.
https://tinyurl.com/yf8zx2xy, https://prnt.sc/1239xpy
* ZH_CN (Chinese) Translation file added into project.
* Site_url will automatically update when saving the email setting.
* **Bug Fixes:**
* **Issue #404:** UVdesk getting frequently logged out when clicking on links.
* **Issue #405:** Redirect users to login page after email validation
* **Issue #406:** Is there a way I could hid the menu links and dashboard links.
* **Issue #407:** Ticket forwarding option forward the entire thread.
* **Issue #408:** duplicate key on ../translation/messages.ar.yml file.
* **Issue #409:** Emails not retrieving.
* **Issue #411:** error when updating composer inside latest version.
* **Issue #412:** i have installed uvdesk open source and i have configured mailbox, email settings and swift mailer but the customer is not able to receive a mail when replied to a ticket ?
* **Issue #415:** remove debugger from the installation wizard.
* 1.0.13 (2021-04-02)
* **Misc. Updates:**
* **Last reply option added on ticket list to check when last time reply added on ticket.**
* **reCAPTCHA setting option added on admin panel with profile section now admin can set recaptcha credentails on admin panel and can enable it.**
* **Disabled old dates for datapicker in broadcast section.**
* **Strong password added (for security purpose) for all places from where user create and update password.**
* **Current version updated in dashboard in footer so that user have idea which version he is using currently.**
* **Added some more option on admin/agent side when reply to a ticket i.e hyperlink, Spellcheck, adding a image by a external link, source code and differnt style formats option added into editor.**
* **Iframe support in editor for adding Youtube link etc In article section(knowledgebase).**
* **Fancy style added for Blockquote https://prnt.sc/xle8c4**
* **New auto fixtures added for workflow so user don't need to add workflow for the same.**
* **Added CC option for initial thread on ticket https://prnt.sc/1118g8e.**
* **Added option for automatically label assign to ticket from workflow.**
* **All latest version links updated for jquery, backbone and underscore js.**
* **Time format added for customer panel on profile section.**
* **Customer redirection after ticket create from customer panel - If customer is log in then will redirect to ticket listing if not then will redirect to knowledgebase.**
* **Time format and time zone will automatically assign to customer and agent now which is set in admin side branding page.**
* **Added New polish translation file(pl).**
* **Bug Fixes:**
* All controller code updates as according to symfony version(4.3) and maximum deprication messages removed from project.
* Docker Fixes (FROM ubuntu:latest to FROM ubuntu:18.04 in Dockerfile)
* Docker composer version updated.
* Mail to customer in case of ticket status update mailing issue fixed.
* Email regix updated for swiftmailer as from front end it is only allowing .com/.in etc not any other custom emails like .support
* tr and it Translation files updates.
* Branding custom css and js as duplicate issue resolved.
* Issue with Locale in mail if ticket created using email was not correct and has been fixed now.
* Groups and Teams Remove issue fixed for saved replies.
* Collaborator ticket view issue on customer panel (not able to see tickets) resolved.
* My tickets tab issue for agents as agent only see the ticket assigned to admin only not their own ticket assigned to him Resolved.
* Email Receiving issue when assign a ticket to agent resolved.
* Updated addPart for plain text in mail send function as in some cases email send was not working.
* Translation update for reset password page.
* Method change to getOneOrNullResult for mail to agent action.
* Mail to CC and BCC users without ticket link as they are not really the customer and can not login into customer panel.
* Forwording and Auto forwording emails conversion issue resolved.
* Pagination issue on ticket listing on customer panel also for tag on admin panel resolved.
* Mailbox ticket create issue if Email send on capitalize email Id.
* Email trailing issue on ticket reply if agent and customer both reply on ticket using email id resolved.
* Seachbar component on dashoard based on permission issue fixed now.
* Deleting the trash ticket issue has been fixed.
* Issue with prod mode when clearing the cache resovled.
* Saved reply disapper issue for agent if agent update anything Issue has been fixed now.
* Article and Category createdAt filter issue has been fixed now.
* Disabled user account and when user try to login then correct message for account disablity.
* Panel sidebar active status issue fixed.
* 1.0.12 (2020-07-27)
* **Misc. Updates:**
* Added Mailbox filtering in ticket list. Now tickets can be filter according with different Mailboxes.
* Ticket type sorted alphabatically for ticket creation form and other places.
* Translation file updates for different languages.
* Updates in all dependent bundles.
* **Bug Fixes:**
* **Issue #292:** Error during install: Table 'helpdesk.uv_support_role' doesn't exist.
* **Issue #290:** The cogs keep spinning!.
* **Issue #284:** Issues with Italian translations.
* **Issue #275:** need to add ar translation for the admin login page.
* **Issue #273:** duplicate key on ../translation/messages.ar.yml file.
* **Issue #269:** Failed to connect to DB if DB port other then 3306.
* **Issue #269:** Dockerfile obsolete.
* **Issue #267:** Variable "user_service" does not exist.
* 1.0.11 (2020-05-27)
* **Misc. Updates:**
* Dependedent bundles updates and issue fixes.
* Ticket duplicate issue in conversation removed.
* **Bug Fixes:**
* **Issue #257:** Installation never finish.
* **Issue #259:** /wizard/xhr/load/super-user error 500.
* **Issue #261:** Cannot create API Access Token.
* **Issue #262:** first new rule in workflow and email sending stopped working.
* **Issue #263:** composer update caused uvdesk broken.
* **Issue #265:** When the setup wizard mode on...
* 1.0.10 (2020-04-17)
* **Misc. Updates:**
* Added missing translation words for french.
* Change processing function and removed unnecessary code for speed up.
* Dependedent bundles updates for speed up project.
* **Bug Fixes:**
* **Issue #255:** Unable to install the App (Database Url malformed).
* **Issue #256:** Failed to exec 'php bin/console uvdesk:configure-helpdesk' on Ubuntu PHP 7.4.
* **Resolved speed issue with previous version.**
* 1.0.9 (2020-03-17)
* **Misc. Updates:**
* Added Missing translation for different languages.
* Installer miner changes.
* **Bug Fixes:**
* **Issue #252:** Locale code from uvdesk.yaml file gets removed when update email settings.
* **Issue #253:** Translation while search any keywords in dashboard.
* **Issue #254:** Deleted Tickets Reappearing after uvdesk:referesh.
* 1.0.8 (2020-02-12)
* **Features**
* **Translation Support (Multilingual).**
* **Misc. Changes:**
* .htaccess mode rewrite condition changes(For API Bundle).
* **Issue #247:** Translator
* **Issue #246:** UVDesk hangs trying to create Customer / Agent / Team / Group.
* **Issue #242:** Database migration gets failed if automatically created db in production environment.
* **Issue #242:** Language Spanish.
* 1.0.7 (2020-01-27)
* **Misc. Changes:**
* .htaccess mode rewrite condition changes.
* Web Installer design changes.
* Dependent packages updates.
* **Issue #238:** Showing older version in web-installer
* 1.0.6 (2020-01-06)
* **Misc. Changes:**
* Web Installer design changes.
* 1.0.5 (2019-11-15)
* **Issue #226:** Missing icon for internal server error page
* **Misc. Changes:**
* Installation wizard (web & cli) now allows users to automaticatlly create a database if it doesn't exist
* 1.0.4 (2019-10-31)
* **Issue #137:** Dockerize application for easy installation
* **Feature:** Easily dockerize your helpdesk project to deploy it from within a container
* **Misc. Changes:**
* Updated README.md and included instructions to deploying the project from within a docker conatiner
* 1.0.3 (2019-10-23)
* **Misc. Changes:**
* Updated web installer for better error reporting
* Updated README.md with link to the official gitter chat for the community project
* 1.0.1 (2019-10-15)
* **Issue #209:** User's session out will redirect to 404 error page
* **Misc. Changes:**
* Updated dependent packages to latest stable release
* 1.0.0 (Released on 2019-10-09)
* **Issue #163:** Swift mailer and Email settings configuration for outlook not working (raised by alexanderoitx)
* **Issue #135:** MAMP not working as 127.0.0.1 but works as localhost (raised by vaishaliwebkul)
* **Issue #205:** Wizard check-requirements rendering errors (raised by piyushwebkul)
* **Issue #171:** Welcome ticket must be there on ticket panel (raised by vaishaliwebkul)
* **Issue #154:** Multiple error message (raised by avneesh-webkul)
* **Issue #94:** Agent unable to view ticket which are assigned to the group (raised by vaishaliwebkul)
* **Issue #97:** All the errors user get are in developer mode so please convert them in production mode (raised by vaishaliwebkul)
* **Issue #175:** Stuck at step 4/5 while configuration (raised by vaishaliwebkul)
* **Issue #134:** Request Feature : hit on setup page without accessing project's public folder on browser (raised by vaishaliwebkul)
* **Issue #193:** Unable to run via Composer: (raised by alexsdesign)
* **Issue #196:** resetting password for super user update credentials link redirection to home page (raised by smallBiz)
* **Issue #201:** Redis server went away when installing (raised by KlaasT)
* **Issue #206:** No show Page Navigation (raised by sbonzanni)
* **Issue #203:** Production Environment Http Error pages (raised by piyushwebkul)
* **Issue #183:** Installer updated. (raised by piyushwebkul)
* **Issue #145:** Permission denied error while Configuration (raised by vaishaliwebkul)
* **Issue #207:** Translation Added (raised by anmol107)
* **Issue #122:** MIME type guessers issue while adding attachments for WAMP stack (raised by vaishaliwebkul)
* **Issue #187:** Reset database configuration issue from web installer (raised by vaishaliwebkul)
* **Issue #200:** Created issue templates (raised by prashant-webkul)
* **Issue #197:** Installation Wizard not proceeding further configuration-database step, after pressing the cancel button. (raised by piyushwebkul)
* **Issue #123:** Memory size issue occur while create project using composer command (raised by vaishaliwebkul)
* **Issue #96:** Session out error shows instead of redirect to user at login panel (raised by vaishaliwebkul)
* **Issue #164:** Feature to set default timezone (raised by vaishaliwebkul)
* **Issue #167:** can't clone repo due to memory issue (raised by tzak902)
* **Issue #168:** can't set password for agent (raised by tzak902)
* **Issue #169:** Forgot password will reset the old password immediately (raised by tzak902)
* **Issue #190:** An error occured while loading the web debug tool bar (raised by vaishaliwebkul)
* **Issue #192:** .htaccess mod_rewrite "No input file specified." (raised by VahanPWNS)
* **Issue #149:** Cannot save article (raised by kzsfluxus)
* **Issue #101:** Show meaningful warning messages with all of the mandatory input fields (raised by vaishaliwebkul)
* **Issue #182:** Added a redirection route post Installation (raised by piyushwebkul)
* **Issue #181:** some changes for files (raised by piyushwebkul)
* **Issue #136:** Design Issue while resizing menu icon present at dashboard (raised by vaishaliwebkul)
* **Issue #176:** Call to a member function getPartialDetails() on null when create ticket (raised by vaishaliwebkul)
* **Issue #180:** 0.1 (raised by piyushwebkul)
* **Issue #146:** Case sensitive route found for site_URL (raised by vaishaliwebkul)
* **Issue #179:** UVdesk banner logo link redirects to 404 page in prod mode (raised by vaishaliwebkul)
* **Issue #172:** Ticket type description data fetch in drop down list instead code (raised by vaishaliwebkul)
* **Issue #178:** entity compatibility related update (raised by shubhwebkul)
* **Issue #177:** Configuration Failed at 4/5 step (raised by vaishaliwebkul)
* **Issue #104:** Search bar is hidden back to left menu bar (raised by vaishaliwebkul)
* **Issue #165:** Collaborator unable to view ticket (raised by vaishaliwebkul)
* **Issue #174:** maker bundle update (raised by piyushwebkul)
* **Issue #162:** Mailbox refresh issue (raised by rakesh10933)
* **Issue #155:** Server Requirements (raised by kvnsmn)
* **Issue #170:** ticket view issue (raised by vaishaliwebkul)
* **Issue #166:** Profiler Added (raised by papnoisanjeev)
* **Issue #150:** Permission error when add attachment (raised by vaishaliwebkul)
* **Issue #157:** No Route found exception (raised by vaishaliwebkul)
* **Issue #159:** Link is not clickable for missing extension (raised by vaishaliwebkul)
* **Issue #138:** Update README.md file by adding mailbox component bundle (raised by vaishaliwebkul)
* **Issue #148:** Transport needed for smtp server (raised by vaishaliwebkul)
* **Issue #141:** If already setup uvdesk , it again redirect us to web installer when open /public directory (raised by vaishaliwebkul)
* **Issue #158:** community-skeleton issue-154 (raised by kumarSaurabh27)
* **Issue #152:** Update README.md (raised by vaishaliwebkul)
* **Issue #160:** Error : Mailbox-refresh command not execute on CentOS 7 (raised by vaishaliwebkul)
* **Issue #161:** Community Edition Installation Issue (raised by alexanderoitx)
* **Issue #151:** ERROR: There are extensions that haven't been installed or are currently disabled (raised by faraimupfuti)
* **Issue #153:** Is the public folder required after uvdesk install ? (raised by iGitnow)
* **Issue #156:** UVdesk Admin Panel Login issue. (raised by rakesh10933)
* **Issue #144:** Signature is not getting updated on the ticket (raised by Himaniwebkul)
* **Issue #133:** Open wizard when project root is accessed & installer icons update (raised by shubhwebkul)
* **Issue #116:** Redirecting route from installer to knowledgebase panel (disable web-installer) (raised by shubhwebkul)
* **Issue #143:** Error on install (raised by eyedocs)
* **Issue #142:** Rewrite rule with ISS (raised by mills217)
* **Issue #139:** tttttuuuuu (raised by deadmaster566)
* **Issue #91:** Incorrect ticket status count's at agent panel (raised by vaishaliwebkul)
* **Issue #107:** Broadcast Message timer UI has Inconsistent style (raised by vaishaliwebkul)
* **Issue #111:** Attachment issue when customer is sending attachment in reply (raised by UVvidu)
* **Issue #129:** Request Feature: Pre Installation extension description on web installer (raised by vaishaliwebkul)
* **Issue #132:** Website prefix value set for member/customer panel are same using command line (raised by vaishaliwebkul)
* **Issue #128:** Check Design of web installer (raised by vaishaliwebkul)
* **Issue #131:** Website prefix default value not set on command line (raised by vaishaliwebkul)
* **Issue #127:** Extension list in web installer and resolved issues (raised by shubhwebkul)
* **Issue #126:** Request Feature : to add website prefix functionality using command (raised by vaishaliwebkul)
* **Issue #118:** Zip file for all version of php not updated with current live code (raised by vaishaliwebkul)
* **Issue #125:** Issue during installation of project using composer (raised by vaishaliwebkul)
* **Issue #48:** Vulnerability found in all email type input fields (raised by vaishaliwebkul)
* **Issue #110:** Zip 7.2 is not getting migrated with the database after [Step 5/5] (raised by UVvidu)
* **Issue #102:** UI issue when window resolution is minimize (raised by vaishaliwebkul)
* **Issue #124:** Remove non unique select type element from the swiftmailer (raised by vaishaliwebkul)
* **Issue #121:** Code refactoring (raised by shubhwebkul)
* **Issue #119:** No Route found from web installer to agent and knowledgebase panel for zip file (raised by vaishaliwebkul)
* **Issue #120:** Back button for navigation purpose to the previous step in web installer (raised by shubhwebkul)
* **Issue #112:** Attachment issue when agent is attaching image in reply (raised by UVvidu)
* **Issue #113:** No check box for account status active part in Agent creation panel (raised by UVvidu)
* **Issue #114:** No check box to choose group in Agent creation part (raised by UVvidu)
* **Issue #115:** No check box in permission - in agent creation section (raised by UVvidu)
* **Issue #117:** Installer version update (raised by shubhwebkul)
* **Issue #109:** issue of redirection to member login and knowledgebase (raised by shubhwebkul)
* **Issue #59:** Email template :- Placeholder should be update according to selected templated, also design issue is there in placeholder (raised by vaishaliwebkul)
* **Issue #108:** URL change in wizards.js (raised by papnoisanjeev)
* **Issue #75:** For the document (.pdf, .doc, .xls) attach with ticket reply icon is missing (raised by vaishaliwebkul)
* **Issue #105:** All type of files will open to select while User profile image insert (support only PNG/JPG) format (raised by vaishaliwebkul)
* **Issue #27:** Check the message body which contain unnecessary description attach with reply in ticket (raised by vaishaliwebkul)
* **Issue #68:** Company logo is not showing on email which was set in email template (raised by vaishaliwebkul)
* **Issue #82:** Customer reply to ticket by adding text effects like (Bold,Italic) then changes not get reflect (raised by vaishaliwebkul)
* **Issue #98:** Design end issue for every view when adjust resolution in window (raised by vaishaliwebkul)
* **Issue #77:** Sorting based on (ticket id,customer name etc) to ticket list not sorting ticket list as selected option (raised by vaishaliwebkul)
* **Issue #79:** When save super admin credentials their must be a option of first name and last name field as mandatory (raised by vaishaliwebkul)
* **Issue #63:** Tickets which are assign to particular label ,when open that label :- not contain actual no of tickets (raised by vaishaliwebkul)
* **Issue #49:** Unable to view customer and agent list at admin panel due to Full Group Join By Clause (raised by vaishaliwebkul)
* **Issue #88:** Filter tickets by saved replies showing wrong ticket status (raised by vaishaliwebkul)
* **Issue #99:** Only for single ticket pagination shows at agent panel (raised by vaishaliwebkul)
* **Issue #100:** web installer next step by just hitting enter (raised by shubhwebkul)
* **Issue #76:** If don't have required PHP extension still Web installer working for further steps (raised by vaishaliwebkul)
* **Issue #93:** At agent panel, option available in ticket list mass action should show by assigned permission to that agent (raised by vaishaliwebkul)
* **Issue #80:** Customer reply to ticket by email then thread content mismatch (raised by vaishaliwebkul)
* **Issue #85:** Provided admin panel and knowledgebase link at setup page should open with new tab (raised by vaishaliwebkul)
* **Issue #62:** If customer has more than one ticket ,still with ticket detail it's showing that customer has only 0 more ticket (raised by vaishaliwebkul)
* **Issue #58:** When customer reply to their previous ticket using mail then ticket isn't open at admin panel (raised by vaishaliwebkul)
* **Issue #66:** Need to remove footer from email templates (raised by vaishaliwebkul)
* **Issue #84:** Unable to unassigned team/group from the ticket (raised by vaishaliwebkul)
* **Issue #55:** No document/image found when customer create ticket by attaching documents via mail (raised by vaishaliwebkul)
* **Issue #90:** Attachment issue (raised by Himaniwebkul)
* **Issue #22:** Search bar for article given at customer panel not response (raised by vaishaliwebkul)
* **Issue #69:** User unable to open ticket link attached with body of email template on their mail id (raised by vaishaliwebkul)
* **Issue #56:** New customer not receive account activation mail when customer created (raised by vaishaliwebkul)
* **Issue #54:** Set default image shown at knowledgebase front (raised by vaishaliwebkul)
* **Issue #92:** Unable to remove assigned collaborator to ticket from the customer panel (raised by vaishaliwebkul)
* **Issue #95:** Fixed issues and prefixes update (raised by shubhwebkul)
* **Issue #78:** Admin name is missing when select forward a ticket to - > agent (raised by vaishaliwebkul)
* **Issue #24:** Need warning message while Configure a database if any detail found invalid (raised by vaishaliwebkul)
* **Issue #60:** At branding, there is color picker window missing to select colors (raised by vaishaliwebkul)
* **Issue #81:** In workflow if select condition as "agent is equal to" ,unable to fetch agent list (raised by vaishaliwebkul)
* **Issue #83:** Agent list missing from workflow when select option as transfer ticket (raised by vaishaliwebkul)
* **Issue #87:** Spell error at warning message shown with naming field of email template (raised by vaishaliwebkul)
* **Issue #89:** Agent Reset password page don't have validations (raised by vaishaliwebkul)
* **Issue #21:** Back window is visible when success notification popup comes at customer panel (raised by vaishaliwebkul)
* **Issue #36:** email address and password fields show warning before written anything while save super admin credentials (raised by vaishaliwebkul)
* **Issue #43:** Validation not apply correctly on database configuration page (raised by vaishaliwebkul)
* **Issue #46:** Mails are not received by customer by any reply is added to their ticket (raised by vaishaliwebkul)
* **Issue #52:** Reply to ticket from admin panel by attaching zip file, then files not get found (raised by vaishaliwebkul)
* **Issue #50:** Mails aren't fetch as ticket at admin end after configure a mailbox (raised by vaishaliwebkul)
* **Issue #45:** Saved Replies message body is saved blank (raised by vaishaliwebkul)
* **Issue #37:** At the part of Website Configuration, add some restrictions when add Prefix value for member/customer panel (raised by vaishaliwebkul)
* **Issue #72:** Agent/Customer Forget Password mail not received When user forget password (raised by vaishaliwebkul)
* **Issue #74:** Workflow :- When apply action as "mail to agent" then option to select agent are missing (raised by vaishaliwebkul)
* **Issue #25:** When save super admin account, specify the minimum password length (raised by vaishaliwebkul)
* **Issue #7:** Show warning if configure database with non-exist Database, or username/password (raised by vaishaliwebkul)
* **Issue #8:** Check Image Validation at agent/customer profile (raised by vaishaliwebkul)
* **Issue #73:** Ticket Generate Success Mail For Customer not Received (raised by vaishaliwebkul)
* **Issue #65:** Customer not receive any attachment on their mail id when agent reply from admin panel by attaching documents (raised by vaishaliwebkul)
* **Issue #61:** Tickets which are deleted not move into trashed (raised by vaishaliwebkul)
* **Issue #86:** Unable to unassign team from the ticket in which specific team was already assigned (raised by vaishaliwebkul)
* **Issue #71:** web installer events update (raised by shubhwebkul)
* **Issue #70:** Notice Template for option in predefined email templates which are need to be selected by default (raised by vaishaliwebkul)
* **Issue #67:** Need to disable Kudos from the custome panel (raised by vaishaliwebkul)
* **Issue #51:** Attached task option need to be removed from ticket list (raised by vaishaliwebkul)
* **Issue #53:** When ticket is created by attaching single zip file-- no single zip found with ticket (raised by vaishaliwebkul)
* **Issue #57:** Website configuration details get saved without installing database tables (raised by vaishaliwebkul)
* **Issue #64:** web installer bug fixes (raised by shubhwebkul)
* **Issue #15:** All the ticket's detail can be view by agent(even that ticket not assigned to related agent) (raised by vaishaliwebkul)
* **Issue #16:** User get put in CC/BCC mail not added to the ticket reply (raised by vaishaliwebkul)
* **Issue #26:** File directory not found ,when get to download zip files attached with ticket reply (raised by vaishaliwebkul)
* **Issue #30:** At customer panel some of the icon image are missing (raised by vaishaliwebkul)
* **Issue #47:** When click to add new email template get error (raised by vaishaliwebkul)
* **Issue #44:** Code standard updations (raised by shubhwebkul)
* **Issue #33:** XSS script running while update customer name with ticket list detail (raised by vaishaliwebkul)
* **Issue #41:** vulnerability issue at tags fields (raised by vaishaliwebkul)
* **Issue #38:** Dashboard search bar option when search by starting letter's ' T ' (raised by vaishaliwebkul)
* **Issue #39:** While searching for categories by dashboard search bar, and click on that category , it will redirect to wrong page (raised by vaishaliwebkul)
* **Issue #42:** How will member login to their panel, if they are at knowledgebase?? (raised by vaishaliwebkul)
* **Issue #40:** Resolved Git issues (raised by shubhwebkul)
* **Issue #34:** Website prefixes (raised by shubhwebkul)
* **Issue #10:** Check by click on ticket thread id which shows with ticket detail (raised by vaishaliwebkul)
* **Issue #18:** Check ticket list view when click checkbox to get select all the tickets (raised by vaishaliwebkul)
* **Issue #20:** Update notification message when edit ticket type (raised by vaishaliwebkul)
* **Issue #11:** Customer Information aren't get update by viewing ticket detail (raised by vaishaliwebkul)
* **Issue #6:** Super admin credentials saved blank while setup DB (raised by vaishaliwebkul)
* **Issue #19:** No warning shows when create duplicate ticket type (raised by vaishaliwebkul)
* **Issue #9:** Prepared Response section missing while applying to ticket (raised by vaishaliwebkul)
* **Issue #28:** Ticket list link is not working (raised by vaishaliwebkul)
* **Issue #29:** While creating a project, Getting Exception as Class 'Composer\EventDispatcher\ScriptExecutionException' not found (raised by vaishaliwebkul)
* **Issue #31:** Getting error while add saved replies (raised by vaishaliwebkul)
* **Issue #32:** Unable to delete saved replies (raised by vaishaliwebkul)
* **Issue #35:** Update README.md (raised by UVvidu)
* **Issue #17:** Website-Configuration (raised by shubhwebkul)
* **Issue #13:** Found Error while create ticket,edit workflow, update admin profile (raised by vaishaliwebkul)
* **Issue #23:** Unable to run my newly created project and get authentication error (raised by vaishaliwebkul)
* **Issue #12:** some of the links not work in README.md file (raised by vaishaliwebkul)
* **Issue #14:** Setup design (raised by shubhwebkul)
* **Issue #5:** Website-Configuration and Generator (raised by shubhwebkul)
* **Issue #4:** webpack setup (raised by shubhwebkul)
* **Issue #3:** Loader, Slider, Mailbox (raised by shubhwebkul)
* **Issue #2:** Misc. fixes in branch 0.2 (raised by akshaywebkul)
* **Issue #1:** Web Installer Support (raised by akshaywebkul)
* **Feature:** Add/Remove/Create third party packages for further functionalities (bundled with [uvdesk/extension-framework][7])
* **Feature:** Easily configure and manage your support panel for customer convenience (bundled with [uvdesk/support-center-bundle][6])
* **Feature:** Automate responses to events with workflows and prepared responses (bundled with [uvdesk/automation-bundle][5])
* **Feature:** Pipe your emails from different sources into your helpdesk as tickets (bundled with [uvdesk/mailbox-component][4])
* **Feature:** Easily configure and manage your users (agents & customers), tickets, and helpdesk settings (bundled with [uvdesk/core-framework][3])
* **Feature:** Automate bundle configurations during installation via [composer][1] using the [uvdesk/composer-plugin][2]
* **Feature:** Setup your helpdesk project from the browser using the Web Installer Wizard
* **Feature:** Setup your helpdesk project from CLI using the Console Wizard
[1]: https://getcomposer.org/
[2]: https://github.com/uvdesk/composer-plugin
[3]: https://github.com/uvdesk/core-framework
[4]: https://github.com/uvdesk/mailbox-component
[5]: https://github.com/uvdesk/automation-bundle
[6]: https://github.com/uvdesk/support-center-bundle
[7]: https://github.com/uvdesk/extension-framework
================================================
FILE: CHANGELOG-1.1.md
================================================
CHANGELOG for 1.1.x
===================
This changelog references any relevant changes introduced in 1.1 minor versions.
* 1.1.8 (2025-09-19)
* Updates
- Dockerfile updates.
- Added Portuguese translation language.
- Updated code related to Doctrine Migrations package update.
* Issue Fixes:
- Issue #805 - Resolved an issue encountered during migration execution
- Check removed for docker running env.
- Enabling permission for the uvdesk.yaml file for saving email setting in case not having read/write permission.
- Remember me key feature is functional now.
* 1.1.7 (2025-01-03)
* Features & Enhancements:
- Microsoft modern app support added (For Mailbox).
- Added Marketing module.
- Added OTP option for customers to login.
- Round robin ticket assignment.
- Added a New language he (Hebrew).
- Default read/write permission added for some required files during install.
- Added option for selecting and save country for ticket.
- Showing customer email along with name in side filters ticket list. (To avoid confusion in case multiple customers having same name).
- Attachments renaming true so actual name will not show (For security purpose).
- In case of multiple attachments with ticket reply now added cross button for each attachment, So that user can remove a particular attachment before reply instead of removing all with single button.
- Made updates in installation part (for database connection related issues)
- Refactoring on code end for main and other dependent repository.
* Issue Fixes:
#### Issue Fixed in * [**Core Framework**][1]
- Issue #508 #549 - Filter issue resolved for customer filtering.
- Issue #552 - In agent activity option: date filter should be select correct date format.
- Issue #524 - ticket is in trashed folder and we will reply from the admin then it should not send mail to the customer.
- Issue #577 - Customer name edit from admin side on ticket view page, if we leave space in starting customer name is removed in ticket view.
- Issue #587 - ticket is updated from the ticket list page flash message should be same of updated option.
- Issue #582 - In agent option, the permission tab should be shown a privileges icon.
- Issue #583 - If extra enter space leave in ticket type, group, and team description so ticket threads do not loads on ticket view page.
- Issue #573 - In the search filter, if we space to leave in the start and last search filter not working.
- Issue #702 #601 - system can't calculate kudos score.
- Issue #594 - The ticket view page is not showing the proper date time format.
- Issue #605 - If saved Replies sharing without any group and team to another agent or administrator so here shows same saved reply instead of the 403 page.
- Issue #606 - When mail reply from collaborator side in agent and customer reply email template so collaborator email reply creates a new ticket
Teams not removing from edit agent page - resolved
- Issue #665 - When upload txt file in ticket , total count of words attaching at the end of the file.
- Issue #644 - On the agent side should not be showing the reports icon without given any agent activity privileges.
- Issue #656 - In spam settings: If email added in spam so should not be ticket created from the admin end.
- Issue #656 - In spam settings: If email added in spam so should not be ticket created from the admin end.
- Download link correction for ticket.
- Initial thread opening issue if multiple emails in cc or collaborator.
Microsoft redirect URL update.
- Lang select snippets position issue resolved on dashboard.
#### Issue Fixed in * [**support-center-bundle**][2]
- Issue #538 - Tag line is not translated in other languages except the english.
- Made required message field in ticket creation form on front end.
- Issue #228 - front website cookies policy Popup issue if switch language in arabic.
- Issue #168 - Branding logo file type checking issue.
- Issue #162 - Broadcast message when choosing current date, not showing current date.
- Issue #215 - Article's numbered list not being rendered correctly.
- Issue #218 - In Folder, if we using the any docs file in folder image file upload so here showing an error instead of warning.
- Issue #174 - CSS Font-size 0 hides OL/UL/LI in Knowledgebase.
- Issue #170 - When creating an article and adding a tag this special character: " / " after click on view button shows an error.
- Issue #169 - When creating articles and adding tags should be show warning here: Must be less than 20 characters.
- Issue #206 - Trashed ticket should not open on customer end.
- Issue #216 - In article should be limit added for the horizontal lines.
- Issue #173 - In article section when choosing Div and Pre tag so customer panel not showing text or content.
- Marketing announcement URL validation added.
- Allowing underscore in strong password for spacial characters.
- setting customer last reply time.
- Issue #245 - Update in customer dashboard footer content.
- Updated License and support email address for repository.
* 1.1.4 (2024-08-26)
* Feature: Add functionality for tracking the installation count and count of active users (ars128)
* 1.1.3 (2023-06-13)
* Update: Render project version number dynamically
* 1.1.2 (2023-06-12)
* Update: Dropped dependency on uvdesk/composer-plugin in support of symfony/flex
* PR #619: Changes for error page: Home and support option links (Komal-sharma-2712)
* Update: Update installation wizard to specify database version during installation
* PR #614: Translation updates: Correctly render website name in ZH locale (Komal-sharma-2712)
* 1.1.1 (2022-09-13)
* PR #592: Translation updates (Komal-sharma-2712)
* PR #582: Translation updates (Komal-sharma-2712)
* 1.1.0 (2022-03-25)
* Feature: Improved compatibility with PHP 8 and Symfony 5 components
* Bug #546: Use *getThrowable()* instead of deprecated *getException()* function in *ExceptionSubscriber.php* (vipin-shrivastava)
* PR #545: Update *README.md* - Add link to respective uvdesk's twitter and youtube profiles (papnoisanjeev)
* PR #532: Fix typo *mode_rewrite* to *mod_rewrite* (harrisonratcliffe)
* PR #522: Clicking on website logo should redirect to admin login instead of dashboard in *error.html.twig* (vipin-shrivastava)
* Bug #518: Retrieve user from security token in *ExceptionSubscriber.php* (vipin-shrivastava)
* PR #515: Remove miscellaneous duplicate translation records - *messages.it.yml* (Komal-sharma-2712)
* PR #513: Update italian translation resources - *messages.it.yml* (PeopleInside)
* PR #509: Update french translation resources - *messages.fr.yml* (user592965)
* PR #505: Update translation file resources (Komal-sharma-2712)
* PR #504: Update translation file resources (Komal-sharma-2712)
* PR #503: Update italian translation resources - *messages.it.yml* (PeopleInside)
* PR #502: Update translation resources for error page translations (vipin-shrivastava)
[1]: https://github.com/uvdesk/core-framework/
[2]: https://github.com/uvdesk/support-center-bundle
================================================
FILE: CHANGELOG-1.2.md
================================================
CHANGELOG for 1.2.x
===================
This changelog references any relevant changes introduced in 1.2 minor versions.
* 1.2.x
* PR #636: Fixed some language errors (rastiqdev)
================================================
FILE: Dockerfile
================================================
FROM ubuntu:latest
LABEL maintainer="support@uvdesk.com"
ENV GOSU_VERSION=1.11
# Install base supplementary packages
RUN apt-get update && \
apt-get -y upgrade && \
apt-get install -y software-properties-common && \
add-apt-repository -y ppa:ondrej/php && \
apt-get update && \
DEBIAN_FRONTEND=noninteractive apt-get -y install \
adduser \
curl \
wget \
git \
unzip \
apache2 \
mysql-server \
php8.1 \
libapache2-mod-php8.1 \
php8.1-common \
php8.1-xml \
php8.1-imap \
php8.1-mysql \
php8.1-mailparse \
php8.1-curl \
ca-certificates \
gnupg2 dirmngr && \
apt-get clean && rm -rf /var/lib/apt/lists/*
# Create a non-root user for UVDesk
RUN adduser uvdesk --disabled-password --gecos ""
# Copy Apache configuration files
COPY ./.docker/config/apache2/env /etc/apache2/envvars
COPY ./.docker/config/apache2/httpd.conf /etc/apache2/apache2.conf
COPY ./.docker/config/apache2/vhost.conf /etc/apache2/sites-available/000-default.conf
# Copy entrypoint script and source code
COPY ./.docker/bash/uvdesk-entrypoint.sh /usr/local/bin/
COPY . /var/www/uvdesk/
# Update Apache configurations and enable modules
RUN a2enmod php8.1 rewrite && \
chmod +x /usr/local/bin/uvdesk-entrypoint.sh
# Install GOSU for stepping down from root
RUN dpkgArch="$(dpkg --print-architecture | awk -F- '{ print $NF }')" && \
wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch" && \
wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch.asc" && \
gpg --batch --keyserver hkps://keys.openpgp.org --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 && \
gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu && \
gpgconf --kill all && \
chmod +x /usr/local/bin/gosu && \
gosu nobody true && \
rm -rf /usr/local/bin/gosu.asc
# Install Composer
RUN wget -O /usr/local/bin/composer.php "https://getcomposer.org/installer" && \
actualSig="$(wget -q -O - https://composer.github.io/installer.sig)" && \
currentSig="$(sha384sum /usr/local/bin/composer.php | awk '{print $1}')" && \
if [ "$currentSig" != "$actualSig" ]; then \
echo "Warning: Failed to verify composer signature."; \
exit 1; \
fi && \
php /usr/local/bin/composer.php --quiet --filename=/usr/local/bin/composer && \
chmod +x /usr/local/bin/composer && \
rm -f /usr/local/bin/composer.php
# Set working directory
WORKDIR /var/www/uvdesk
# Install Composer dependencies
RUN cd /var/www/uvdesk/ && composer install
# Set correct permissions for UVDesk files
RUN chown -R uvdesk:uvdesk /var/www/uvdesk && \
chmod -R 775 /var/www/uvdesk/var \
/var/www/uvdesk/config \
/var/www/uvdesk/public \
/var/www/uvdesk/migrations \
/var/www/uvdesk/.env
RUN composer dump-autoload --optimize && \
php bin/console cache:clear --env=prod --no-debug || true
# Entry point for the container
ENTRYPOINT ["/usr/local/bin/uvdesk-entrypoint.sh"]
CMD ["/bin/bash"]
================================================
FILE: INSTALLATION GUIDE.md
================================================
Installation Guide
-----------------
This guide will walk you through all the steps necessary from setting up your server environment to installing the uvdesk community helpdesk project.
> Note: This guide assumes that you already have your instance (docker instance, virtual machine, remote instance, etc...) prepared and have all the necessary credentials to perform operations requiring elevated privileges.
Overview
-----------------
We've broken this guide down into multiple sections from installing latest dependencies, to mantaining proper user permissions & file ownerships, and installing the helpdesk project using composer. You can jump right to the part most relevant to you:
* [(Optional) Upgrade to latest available Ubuntu packages](#optional-upgrade-to-latest-available-ubuntu-packages)
* [(Optional) Create a non-root user with elevated privileges](#optional-create-a-non-root-user-with-elevated-privileges)
* [(Optional) Checking for the latest PHP version available](#optional-checking-for-the-latest-php-version-available)
* [Install PHP, Apache and all the necessary packages](#install-php-apache-and-all-the-necessary-packages)
* [(Optional) Update Apache's Document Root](#optional-update-apaches-document-root)
* [Downloading and setting up Composer](#downloading-and-setting-up-composer)
* [Installing and setting up Uvdesk Community Helpdesk](#installing-and-setting-up-uvdesk-community-helpdesk)
(Optional) Upgrade to latest available Ubuntu packages
-----------------
Although optional, it's advisable to update to the latest available packages. To do so, use the following commands:
```bash
# Update the list of available packages so that the package manager is aware about the latest packages
$ sudo apt-get update;
# Update the packages to their latest available versions
$ sudo apt-get -y upgrade;
```
(Optional) Create a non-root user with elevated privileges
-----------------
It's advisable to have a non-root user configured on your instance with elevated privileges other than a root account, so that your file ownerships are properly managed and you don't run into un-intended permission related issues. To add a non-root user with elevated privileges (say *uvdesk*), use the following commands:
```bash
# Create user
$ adduser uvdesk;
# Add user to the sudo group so they can perform operations requiring elevated privileges
$ usermod -aG sudo uvdesk;
# Verify that the user uvdesk has been added to the sudo group
$ groups uvdesk;
# You can also additionaly use the passwd command if you want to set user password
$ passwd uvdesk;
```
Once your non-root user with elevated privileges has been created, you can switch to the new user account in your current terminal session using the following command:
```bash
# Use '-' if you want to be prompted for user password before switching session into the new user.
$ su - uvdesk
```
> Note: We will be using the user we just created to setup our helpdesk project, and then add this user to apache's www-data user group. This way, while the project ownership will belong to our user, apache will still have the necessary access to manage our project resources so we don't run into any permission related issues.
(Optional) Checking for the latest PHP version available
-----------------
If you want to check for the latest PHP version available, you can use the following command to list all the PHP packages available for installation:
```bash
$ apt-cache search php;
```
If you find a PHP version to your preference, you can proceed with that (it's recommended to use PHP 7.4 or greater). Otherwise, you can ppa:ondrej/php apt repository to install the latest version of PHP available:
```bash
$ sudo add-apt-repository -y ppa:ondrej/php;
# Make sure the package manager is aware about the newly listed packages
$ sudo apt-get update;
```
Install PHP, Apache and all the necessary packages
-----------------
Note: We're proceeding with installing PHP 8.2 in this guide. If you want to use a different version of PHP, simply replace 8.2 with your preferred version.
```bash
$ sudo apt -y install php8.2;
# Install the remaining packages
$ sudo apt-get install -y software-properties-common;
$ sudo apt-get -y install \
curl \
wget \
git \
unzip \
apache2 \
mysql-server \
php8.2 \
libapache2-mod-php8.2 \
php8.2-common \
php8.2-xml \
php8.2-imap \
php8.2-mysql \
php8.2-mailparse \
ca-certificates;
# Enable apache rewrite module
$ sudo a2enmod rewrite;
# Restart your apache server
$ sudo service apache2 restart;
# Or alternatively, use 'sudo systemctl restart apache2'
# Verify that your apache server is up & running
$ sudo service apache2 status;
```
> Note: You can list all available loaded PHP modules using the following command: $ php -m
Now, Verify your Apache & PHP installations using the commands below (don't worry about the warnings):
```bash
$ apache2 --version;
$ php --version;
```
With apache server installed & running, you should now be able to load web reources from your server. You can check this by accessing your server IP on your web browser.
(Optional) Update Apache's Document Root
-----------------
In your home directory (/home/uvdesk), create the following directories:
```bash
/home/uvdesk/workstation
# We will setup our helpdesk project within this directory
/home/uvdesk/workstation/projects
# We will setup this directory to be used as the document root for apache, so any resources within this directory will be servable by apache through localhost
/home/uvdesk/workstation/www
````
At this moment, apache will currently be serving documents from the /var/www/ directory. In order to serve documents from /home/uvdesk/workstation/www directory instead, we need to modify a few apache configurations and restart the apache service for these changes to take affect.
```bash
# File: /etc/apache2/apache2.conf
# Replace /var/www/ with the path of our new document root directory /home/uvdesk/workstation/www/ and set AllowOverride to All
$ sudo nano /etc/apache2/apache2.conf
# File: /etc/apache2/sites-available/000-default.conf
# Replace /var/www/html with the path of our new document root directory /home/uvdesk/workstation/www
$ sudo nano /etc/apache2/sites-available/000-default.conf
# Restart your apache server
$ sudo service apache2 restart;
# Or alternatively, use 'sudo systemctl restart apache2'
```
Now, add user uvdesk to the www-data user group, so that www-data can access the resources in our new document root directory:
```bash
$ sudo usermod -aG uvdesk www-data;
$ sudo service apache2 restart;
```
### Testing the PHP Environment (optional)
Now, create a php script *index.php* within your new document root directory using the following commands:
```bash
$ cd /home/uvdesk/workstation/www;
# Create and add the following code to index.php
$ echo "<?php echo phpinfo(); ?>" > index.php
```
Navigate to localhost/index.php to verify that localhost is able to serve your script.
> Note: If you're setting up the project on a remote instance, you can use your server's IP address instead of localhost to verify the same. Depending on your server configurations, you might need to manage your firewall settings to allow HTTP/HTTPS requests.
With all these changes done, your apache server should be able to serve web resources from your new document root. You can further go ahead and configure your DNS records to point your domains to your server's IP at this step.
Downloading and setting up Composer
------------------------------------
Follow the instructions provided on the official [composer website](https://getcomposer.org/download/) to download and install composer package manager. Once installed, it's advisable to move the composer executable to the /usr/local/bin/ directory so that it can be easily accessed from anywhere in your terminal. To do so, use the following commands:
```bash
# Assuming you used the default download instructions, the composer executable will be named composer.phar.
# We will rename and move the executable script to the /usr/local/bin/ directory.
$ mv composer.phar composer
$ sudo mv composer /usr/local/bin/
# Use the following command to verify that composer executable is accessible to you from your current directory
$ composer --version
```
Installing and setting up Uvdesk Community Helpdesk
-----------------
To install the uvdesk community helpdesk project using composer (recommended), use the following commands:
> We will be installing the project within the /home/uvdesk/workstation/projects directory, and then symlink the public directory of our project to/within apache's document root so that the project is servable from localhost. This can be changed however according to your own preference.
```bash
$ cd /home/uvdesk/workstation/projects
$ composer create-project uvdesk/community-skeleton
```
If you don't wish to use composer, you can just download the zip archive of the project and unpack it instead.
```bash
$ cd /home/uvdesk/workstation/projects
$ wget "https://cdn.uvdesk.com/uvdesk/downloads/opensource/uvdesk-community-current-stable.zip"
$ unzip uvdesk-community-current-stable.zip
```
After your project has been installed, you can navigate to your helpdesk project and run the following command to configure your helpdesk from the command line itself:
```bash
$ php bin/console uvdesk:configure-helpdesk
```
---
Please feel free to further contribute to this resource.
================================================
FILE: LICENSE.txt
================================================
Open Software License ("OSL") v. 3.0
This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
Licensed under the Open Software License version 3.0
1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
1. to reproduce the Original Work in copies, either alone or as part of a collective work;
2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
4. to perform the Original Work publicly;
5. to display the Original Work publicly.
2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
================================================
FILE: README.md
================================================
<p align="center"><a href="https://www.uvdesk.com/en/" target="_blank">
<img src="https://s3-ap-southeast-1.amazonaws.com/cdn.uvdesk.com/uvdesk/bundles/webkuldefault/images/uvdesk-wide.svg">
</a></p>
<p align="center">
<a href="https://packagist.org/packages/uvdesk/community-skeleton"><img src="https://poser.pugx.org/uvdesk/community-skeleton/v/stable.svg" alt="Latest Stable Version"></a>
<a href="https://packagist.org/packages/uvdesk/community-skeleton"><img src="https://poser.pugx.org/uvdesk/community-skeleton/d/total.svg" alt="Total Downloads"></a>
<a href="#backers"><img src="https://opencollective.com/uvdesk/backers/badge.svg" alt="Backers on Open Collective"></a>
<a href="#sponsors"><img src="https://opencollective.com/uvdesk/sponsors/badge.svg" alt="Sponsors on Open Collective"></a>
<a href="https://gitter.im/uvdesk/community"><img src="https://badges.gitter.im/uvdesk/community-skeleton.svg" alt="connect on gitter"></a>
<a href="https://forums.uvdesk.com"><img src="https://img.shields.io/badge/Ask%20me-anything-1abc9c.svg" alt="discuss on uvdesk forum"></a>
<a href="https://github.com/collections/made-in-india"><img src="https://badges.frapsoft.com/os/v3/open-source.png?v=103" alt="Checkout us on open source projects from India"></a>
</p>
<p align="center">
<a href="https://twitter.com/intent/follow?screen_name=uvdesk"><img src="https://img.shields.io/twitter/follow/uvdesk?style=social"></a>
<a href="https://www.youtube.com/channel/UCKKt4IOC7ynLwhJMP35uFeQ"><img src="https://img.shields.io/youtube/channel/subscribers/UCKKt4IOC7ynLwhJMP35uFeQ?style=social"></a>
</p>
<p align="center">
➡️ <a href="https://www.uvdesk.com/en/opensource/">Website</a> | <a href="https://docs.uvdesk.com/">Documentation</a> | <a href="https://www.uvdesk.com/en/blog/open-source-helpdesk-installation-on-ubuntu-uvdesk/">Installation Guide</a> | <a href="https://forums.uvdesk.com/">Forums</a> | <a href="https://www.facebook.com/uvdesk/">Community</a> ⬅️
</p>
<p align="center" style="display: inline;">
<img class="flag-img" src="https://flagicons.lipis.dev/flags/4x3/ar.svg" alt="Arabic" width="24" height="24">
<img class="flag-img" src="https://flagicons.lipis.dev/flags/4x3/de.svg" alt="German" width="24" height="24">
<img class="flag-img" src="https://flagicons.lipis.dev/flags/4x3/us.svg" alt="English" width="24" height="24">
<img class="flag-img" src="https://flagicons.lipis.dev/flags/4x3/es.svg" alt="Spanish" width="24" height="24">
<img class="flag-img" src="https://flagicons.lipis.dev/flags/4x3/fr.svg" alt="French" width="24" height="24">
<img class="flag-img" src="https://flagicons.lipis.dev/flags/4x3/it.svg" alt="Italian" width="24" height="24">
<img class="flag-img" src="https://flagicons.lipis.dev/flags/4x3/dk.svg" alt="Danish" width="24" height="24">
<img class="flag-img" src="https://flagicons.lipis.dev/flags/4x3/pl.svg" alt="Polish" width="24" height="24">
<img class="flag-img" src="https://flagicons.lipis.dev/flags/4x3/tr.svg" alt="Turkish" width="24" height="24">
<img class="flag-img" src="https://flagicons.lipis.dev/flags/4x3/cn.svg" alt="Chinese" width="24" height="24">
<img class="flag-img" src="https://flagicons.lipis.dev/flags/4x3/br.svg" alt="Brazil" width="24" height="24">
</p>
[Uvdesk community helpdesk][1] project skeleton packaged along with the bare essential utilities and tools to build and customize your own helpdesk solutions.
Visit our official demo website to [see it in action!][15]
Check out UVdesk on **Symfony Official Website** – [Symfony][24]
Getting Started
-----------------
* [About](#about)
* [Features](#features)
* [Documentation](#documentation)
* [Modules](#modules)
* [Requirements](#requirements)
* [Installation](#installation)
* [Docker Runtime](#docker-runtime)
* [Docker Persistent Container](#docker-persistent-container)
* [Vagrant Virtual Environment](#vagrant-virtual-environment)
* [License](#license)
* [Security Vulnerabilities](#security-vulnerabilities)
* [Feedback](#feedback)
* [Contributions](#contributions)
About
-----------------
Build on top of [symfony](https://symfony.com/) and [backbone.js](https://backbonejs.org/), UVdesk Community is an open-source, service-oriented, and event-driven helpdesk system designed for easy customization and seamless client support. Its extensible architecture allows organizations to deliver efficient, tailored customer service with minimal effort.
The standard distribution includes a comprehensive set of helpdesk packages to support a wide range of use cases and operational needs.
* [**Core Framework**][2] - At the heart of the helpdesk system, the core framework consists of all the necessary apis required by your project and dependent packages to keep things running smoothly
* [**Extension Framework**][3] - Introduces support for third-party package integration and development to easily build and extend the functionalities of your helpdesk system as per your requirements
* [**Automation Bundle**][4] - Adds support for workflows and prepared responses to automate any specific operations within your helpdesk system
* [**Mailbox Component**][11] - Convert and get all your emails to support tickets on UVDesk and manage customer query easily.
* [**Support Center Bundle**][5] - Integrates the easily customizable support center portal to enable users to easily interact with the support staff through your helpdesk system
Reach out to us at our official [gitter chat][20] or by joining [forum][21] for any queries, concerns and feature request discussions.
The development of the uvdesk community edition is led by the [uvdesk][10] team and backed by [Webkul][9]. Visit our [website][1] to learn more about the UVDesk Helpdesk System.
Features
----------------
* [Translation Support (Multilingual)][32]
* Unlimited agents, groups, teams, customers, tickets, and more.
* Agent Privileges
* No limit on the number of mailbox/email integrations.
* Saved Replies – Quickly respond to frequent questions.
* Filter tickets by status, ID, agent, customer, and more.
* Block Spam
* [Agent Activity][29]
* [Marketing Announcement][30]
* [Marketing Modules][35]
* [Kudos][31]
* [Microsoft Apps][36]
* reCAPTCHA option.
* Standard automated workflows.
* Notes for agents.
* Custom branding.
* Change logo & favicon.
* Broadcasting message.
* Ticket Forwarding.
* Prepared Response.
* Email Notification.
* Effective search.
* User Friendly Web Installer.
* Supports multiple attachments.
* A powerful knowledge base and FAQ system—organize content by articles, categories, and folders.
* Ticket types, Multiple Tags.
* Email Templates.
* [API Bundle][16] and [Documentation][25]
* Edit/Delete/Pinned ticket and thread.
* Easily add collaborators and unlock even more capabilities.
* [Explore Apps][26]
Documentation
--------------
Visit [docs.uvdesk.com](https://docs.uvdesk.com/) to read our official documentation and learn more about the uvdesk community project.
We use Jekyll to develop and maintain our documentations. Consider contributing by submitting a pull request to our project's [jeykll repository](https://github.com/uvdesk/uvdesk.github.io).
Requirements
--------------
* **OS**: Ubuntu 16.04 LTS or higher / Windows 7 or Higher (WAMP / XAMPP).
* **SERVER**: Apache 2 or NGINX.
* **RAM**: 4GB or higher.
* **PHP**: 8.1
* **Processor**: Clock Cycle 1 Ghz or higher.
* **For MySQL users**: 5.7.23 or higher.
* **Composer**: 2 or higher.
* **PHP IMAP** **&** **PHP Mailparse** for [Ubuntu][7], [Windows][23], [Centos][28], [Mac][27].
Installation
--------------
The installation process is broken down into two distinct steps:
* Setup
* Configuration
### Setting up your helpdesk project
In this step, you'll download the Helpdesk project skeleton and install its dependencies.
You can either use Composer to download and install everything automatically, or download a pre-packaged archive that includes all dependencies. We recommend using Composer whenever possible for easier updates and better dependency management. However, if you're on a system with limited resources (e.g., shared hosting), the archive download may be more reliable.
Regardless of the method you choose, the configuration process for Helpdesk remains the same.
#### Composer
You can use composer to setup your project by simply running the following command from your terminal:
```bash
$ composer create-project uvdesk/community-skeleton helpdesk-project
```
#### Direct Download
Alternatively, you can also [download the zip archive](https://cdn.uvdesk.com/uvdesk/downloads/opensource/uvdesk-community-current-stable.zip) of the latest stable release and extract its content by running the following commands from your terminal:
```bash
$ wget "https://cdn.uvdesk.com/uvdesk/downloads/opensource/uvdesk-community-current-stable.zip" -P /var/www/
$ unzip -q /var/www/uvdesk-community-current-stable.zip -d /var/www/ \
```
### Configuring your helpdesk project
After you've downloaded and installed all the project dependencies, you can configure your helpdesk installation using either of the following ways:
#### Using Terminal
```bash
$ php bin/console uvdesk:configure-helpdesk
```
#### Using Web Installer Wizard
##### Extract the contents of zip and execute the project in your browser in case of project zip download:
~~~
http(s)://localhost/community-skeleton/public
~~~
##### In case of created project using command, execute the project in your browser:
~~~
http(s)://localhost/helpdesk-project/public
~~~
or
~~~
http(s)://example.com/public
~~~
After opening your project in the web browser, you will be greeted by the web installer which will guide you in configuring your project.
##### Run project on localhost (dev mode)
```bash
php bin/console server:run
```
**How to clear cache:**
```bash
php bin/console c:c
```
#### ☁️ Deploy UVdesk on the Cloud with Amazon AMI
Easily launch UVdesk on the cloud using our pre-configured Amazon Machine Image (AMI), available directly from the AWS Marketplace:
👉 [**Launch UVdesk on AWS**](https://aws.amazon.com/marketplace/pp/prodview-c4pibdsnipim4)
This AMI offers a quick and hassle-free way to set up UVdesk on a secure, scalable AWS environment. Perfect for both production deployments and testing purposes, with no need for manual configuration.
**How to log in as admin/agent:**
*Below url is the default url for admin/agent login if you have not made any changes for /member prefix.*
> *http(s)://example.com/en/member/login*
**How to log in as customer:**
*Below url is the default url for customer login if you have not made any changes for /customer prefix.*
> *http(s)://example.com/en/customer/login*
Docker Runtime
--------------
[Dockerize your helpdesk project][22]
Docker Persistent Container
--------------
[Get started with Uvdesk now by using docker persistent container][34]
Vagrant Virtual Environment
--------------
[Get started with uvdesk now by using vagrant to setup virtual environment][33]
Modules
--------------
[Available Modules/Apps](https://store.webkul.com/UVdesk/UVdesk-Open-Source.html)
Need something else ? email us at support@uvdesk.com
License
--------------
All libraries and bundles included in the UVDesk Community Edition are released under the [OSL-3.0 license][12] license.
Security Vulnerabilities
--------------
Please don't disclose any security vulnerabilities publicly. If you find any security vulnerability in our platform then please write us at [support@uvdesk.com](mailto:support@uvdesk.com).
Feedback
---------
#### Feedback (Support Community project by raising feedback)
* [Trustpilot][17]
* [Capterra][18]
* [Software suggest][19]
Contributions
--------------
This project is hosted on [Open Collective][13] and exists thanks to our contributors:
<a href="https://github.com/uvdesk/community-skeleton/graphs/contributors"><img src="https://opencollective.com/uvdesk/contributors.svg?width=890&button=false"/></a>
#### Backers
Thank you to all our backers! 🙏
<a href="https://opencollective.com/uvdesk#contributors" target="_blank"><img src="https://opencollective.com/uvdesk/backers.svg?width=890"></a>
#### Sponsors
Support this project by becoming a sponsor. Your logo will show up here with a link to your website.
<a href="https://opencollective.com/uvdesk/contribute/sponsor-7372/checkout" target="_blank"><img src="https://images.opencollective.com/static/images/become_sponsor.svg"></a>
[1]: https://www.uvdesk.com/
[2]: https://github.com/uvdesk/core-framework
[3]: https://github.com/uvdesk/extension-framework
[4]: https://github.com/uvdesk/automation-bundle
[5]: https://github.com/uvdesk/support-center-bundle
[6]: https://support.uvdesk.com/en/blog/prerequisites-ubuntu
[7]: https://support.uvdesk.com/en/blog/prerequisites-ubuntu
[8]: https://getcomposer.org/
[9]: https://webkul.com/
[10]: https://www.uvdesk.com/en/team/
[11]: https://github.com/uvdesk/mailbox-component
[12]: https://github.com/uvdesk/community-skeleton/blob/master/LICENSE.txt
[13]: https://opencollective.com/uvdesk
[14]: https://docs.uvdesk.com/
[15]: https://demo.uvdesk.com/
[16]: https://github.com/uvdesk/api-bundle
[17]: https://www.trustpilot.com/review/uvdesk.com
[18]: https://www.capterra.com/p/158346/UVdesk/
[19]: https://www.softwaresuggest.com/uvdesk
[20]: https://gitter.im/uvdesk/community
[21]: https://forums.uvdesk.com/
[22]: https://github.com/uvdesk/community-skeleton/wiki/dockerize-helpdesk-project
[23]: https://support.uvdesk.com/en/blog/prerequisites-windows
[24]: https://symfony.com/projects/uvdesk
[25]: https://github.com/uvdesk/api-bundle/wiki/Ticket-Related-APIs
[26]: https://store.webkul.com/UVdesk/UVdesk-Open-Source.html
[27]: https://support.uvdesk.com/en/blog/prerequisites-mac
[28]: https://support.uvdesk.com/en/blog/prerequisites-centos7
[29]: https://www.uvdesk.com/en/blog/uvdesk-agent-activity/
[30]: https://www.uvdesk.com/en/blog/uvdesk-marketing-announcement/
[31]: https://support.uvdesk.com/es/blog/uvdesk-what-is-kudos
[32]: https://www.uvdesk.com/en/blog/language-translation-in-uvdesk-open-source-helpdesk/
[33]: https://github.com/uvdesk/community-skeleton/wiki/Vagrant-Virtual-Machine-Environment
[34]: https://github.com/uvdesk/community-skeleton/wiki/Docker-Persistent-Container
[35]: https://www.uvdesk.com/en/blog/marketing-module/
[36]: https://www.uvdesk.com/en/how-to-integrate-microsoft-app-to-your-opensource-uvdesk/
================================================
FILE: apps/.gitignore
================================================
================================================
FILE: composer.json
================================================
{
"name": "uvdesk/community-skeleton",
"description": "UVDesk Community Helpdesk Project Skeleton",
"type": "project",
"license": "MIT",
"minimum-stability": "dev",
"prefer-stable": true,
"require": {
"php": "^7.2.5 || ^8.0",
"ext-ctype": "*",
"ext-iconv": "*",
"symfony/flex": "^1.17|^2"
},
"flex-require": {
"doctrine/annotations": "^1.0",
"doctrine/doctrine-fixtures-bundle": "^3.4",
"google/recaptcha": "^1.2",
"knplabs/knp-paginator-bundle": "^5.8",
"phpdocumentor/reflection-docblock": "^5.3",
"phpstan/phpdoc-parser": "^1.2",
"sensio/framework-extra-bundle": "^6.1",
"symfony/asset": "*",
"symfony/console": "*",
"symfony/dotenv": "*",
"symfony/expression-language": "*",
"symfony/form": "*",
"symfony/framework-bundle": "*",
"symfony/http-client": "*",
"symfony/intl": "*",
"symfony/mailer": "*",
"symfony/mime": "*",
"symfony/monolog-bundle": "^3.1",
"symfony/notifier": "*",
"symfony/orm-pack": "*",
"symfony/process": "*",
"symfony/property-access": "*",
"symfony/property-info": "*",
"symfony/proxy-manager-bridge": "*",
"symfony/runtime": "*",
"symfony/security-bundle": "*",
"symfony/serializer": "*",
"symfony/string": "*",
"symfony/swiftmailer-bundle": "^3.5",
"symfony/translation": "*",
"symfony/twig-bundle": "*",
"symfony/validator": "*",
"symfony/web-link": "*",
"symfony/yaml": "*",
"twig/extra-bundle": "^2.12|^3.0",
"twig/twig": "^2.12|^3.0",
"uvdesk/api-bundle": "^1.1.4",
"uvdesk/automation-bundle": "^1.1.4",
"uvdesk/core-framework": "^1.1.7",
"uvdesk/extension-framework": "^1.1.2",
"uvdesk/mailbox-component": "^1.1.5",
"uvdesk/support-center-bundle": "^1.1.3",
"intervention/image": "^2.4",
"intervention/imagecache": "^2.5.2"
},
"require-dev": {
},
"flex-require-dev": {
"symfony/debug-pack": "*",
"symfony/maker-bundle": "^1.0",
"symfony/profiler-pack": "*",
"symfony/test-pack": "*"
},
"config": {
"allow-plugins": {
"composer/package-versions-deprecated": true,
"symfony/flex": true,
"symfony/runtime": true
},
"optimize-autoloader": true,
"preferred-install": {
"*": "dist"
},
"sort-packages": true
},
"autoload": {
"psr-4": {
"App\\": "src/"
}
},
"autoload-dev": {
"psr-4": {
"App\\Tests\\": "tests/"
}
},
"replace": {
"symfony/polyfill-ctype": "*",
"symfony/polyfill-iconv": "*",
"symfony/polyfill-php72": "*"
},
"scripts": {
"auto-scripts": {
"cache:clear": "symfony-cmd",
"assets:install %PUBLIC_DIR%": "symfony-cmd"
},
"post-install-cmd": [
"@auto-scripts"
],
"post-update-cmd": [
"@auto-scripts"
]
},
"conflict": {
"symfony/symfony": "*"
},
"extra": {
"symfony": {
"allow-contrib": false,
"endpoint": [
"https://api.github.com/repos/uvdesk/recipes/contents/index.json",
"flex://defaults"
],
"require": "^5.4"
}
}
}
================================================
FILE: config/bundles.php
================================================
<?php
return [
Webkul\UVDesk\CoreFrameworkBundle\UVDeskCoreFrameworkBundle::class => ['all' => true],
Webkul\UVDesk\AutomationBundle\UVDeskAutomationBundle::class => ['all' => true],
Webkul\UVDesk\ExtensionFrameworkBundle\UVDeskExtensionFrameworkBundle::class => ['all' => true],
Webkul\UVDesk\MailboxBundle\UVDeskMailboxBundle::class => ['all' => true],
Webkul\UVDesk\SupportCenterBundle\UVDeskSupportCenterBundle::class => ['all' => true],
Webkul\UVDesk\ApiBundle\UVDeskApiBundle::class => ['all' => true],
];
================================================
FILE: config/packages/doctrine.yaml
================================================
parameters:
# Adds a fallback DATABASE_URL if the env var is not set.
# This allows you to run cache:warmup even if your
# environment variables are not available yet.
# You should not need to change this value.
env(DATABASE_URL): ''
doctrine:
dbal:
# configure these for your database server
driver: 'pdo_mysql'
server_version: '5.7'
charset: utf8mb4
default_table_options:
charset: utf8mb4
collate: utf8mb4_unicode_ci
url: '%env(DATABASE_URL)%'
options:
1002: 'SET sql_mode=(SELECT REPLACE(@@sql_mode, "ONLY_FULL_GROUP_BY", ""))'
orm:
auto_generate_proxy_classes: true
naming_strategy: doctrine.orm.naming_strategy.underscore
auto_mapping: true
mappings:
App:
is_bundle: false
type: annotation
dir: '%kernel.project_dir%/src/Entity'
prefix: 'App\Entity'
alias: App
================================================
FILE: config/packages/framework.yaml
================================================
# see https://symfony.com/doc/current/reference/configuration/framework.html
framework:
secret: '%env(APP_SECRET)%'
#csrf_protection: true
http_method_override: false
# Enables session support. Note that the session will ONLY be started if you read or write from it.
# Remove or comment this section to explicitly disable session support.
session:
handler_id: null
cookie_secure: auto
cookie_samesite: lax
cookie_lifetime: '%env(int:UV_SESSION_COOKIE_LIFETIME)%'
gc_maxlifetime: '%env(int:UV_SESSION_COOKIE_LIFETIME)%'
storage_factory_id: session.storage.factory.native
#esi: true
#fragments: true
php_errors:
log: true
when@test:
framework:
test: true
session:
storage_factory_id: session.storage.factory.mock_file
================================================
FILE: config/packages/mailer.yaml
================================================
framework:
mailer:
transports:
main: '%env(MAILER_DSN)%'
================================================
FILE: config/packages/security.yaml
================================================
security:
role_hierarchy:
ROLE_AGENT: ROLE_AGENT
ROLE_ADMIN: [ROLE_AGENT, ROLE_ADMIN]
ROLE_SUPER_ADMIN: [ROLE_ADMIN, ROLE_SUPER_ADMIN]
ROLE_CUSTOMER: ROLE_CUSTOMER
encoders:
Webkul\UVDesk\CoreFrameworkBundle\Entity\User: auto
# https://symfony.com/doc/current/security.html#where-do-users-come-from-user-providers
providers:
user_provider:
id: user.provider
api_user_provider:
id: Webkul\UVDesk\ApiBundle\Providers\ApiCredentials
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
# activate different ways to authenticate
# https://symfony.com/doc/current/security.html#firewalls-authentication
# https://symfony.com/doc/current/security/impersonating_user.html
# switch_user: true
back_support:
pattern: /%uvdesk_site_path.member_prefix%
provider: user_provider
anonymous: ~
form_login:
use_referer: true
login_path: helpdesk_member_handle_login
check_path: helpdesk_member_handle_login
default_target_path: helpdesk_member_dashboard
always_use_default_target_path: true
logout:
path: helpdesk_member_handle_logout
target: helpdesk_member_handle_login
remember_me:
secret: '%kernel.secret%'
lifetime: 604800 # 7 days
path: /
name: REMEMBERME
remember_me_parameter: _remember_me
uvdesk_api:
pattern: ^/api
anonymous: true
provider: api_user_provider
guard:
authenticators:
Webkul\UVDesk\ApiBundle\Security\Guards\APIGuard: Webkul\UVDesk\ApiBundle\Security\Guards\APIGuard
customer:
pattern: /
provider: user_provider
anonymous: ~
form_login:
use_referer: true
login_path: helpdesk_customer_login
check_path: helpdesk_customer_login
default_target_path: helpdesk_customer_ticket_collection
always_use_default_target_path: true
logout:
path: helpdesk_customer_logout
target: helpdesk_customer_login
access_control:
- { path: /%uvdesk_site_path.member_prefix%/login, roles: [IS_AUTHENTICATED_REMEMBERED, IS_AUTHENTICATED_ANONYMOUSLY] }
- { path: /%uvdesk_site_path.member_prefix%/create-account, roles: [IS_AUTHENTICATED_REMEMBERED, IS_AUTHENTICATED_ANONYMOUSLY] }
- { path: /%uvdesk_site_path.member_prefix%/forgot-password, roles: [IS_AUTHENTICATED_REMEMBERED,IS_AUTHENTICATED_ANONYMOUSLY] }
- { path: /%uvdesk_site_path.member_prefix%/update-credentials, roles: [IS_AUTHENTICATED_REMEMBERED,IS_AUTHENTICATED_ANONYMOUSLY] }
- { path: /%uvdesk_site_path.member_prefix%/mailbox/listener, roles: [IS_AUTHENTICATED_ANONYMOUSLY] }
- { path: /%uvdesk_site_path.member_prefix%/, roles: ROLE_AGENT }
- { path: /%uvdesk_site_path.knowledgebase_customer_prefix%/login, roles: [IS_AUTHENTICATED_ANONYMOUSLY] }
- { path: /%uvdesk_site_path.knowledgebase_customer_prefix%/create-ticket, roles: [IS_AUTHENTICATED_ANONYMOUSLY] }
- { path: /%uvdesk_site_path.knowledgebase_customer_prefix%/forgot-password, roles: [IS_AUTHENTICATED_ANONYMOUSLY] }
- { path: /%uvdesk_site_path.knowledgebase_customer_prefix%/update-credentials, roles: [IS_AUTHENTICATED_ANONYMOUSLY] }
- { path: /%uvdesk_site_path.knowledgebase_customer_prefix%/ticket/intermediate/public-access/read-only, roles: [IS_AUTHENTICATED_REMEMBERED, IS_AUTHENTICATED_ANONYMOUSLY, ROLE_CUSTOMER_READ_ONLY] }
- { path: /%uvdesk_site_path.knowledgebase_customer_prefix%/ticket/view, roles: [ROLE_CUSTOMER, ROLE_CUSTOMER_READ_ONLY] }
- { path: /%uvdesk_site_path.knowledgebase_customer_prefix%/, roles: [ROLE_CUSTOMER] }
================================================
FILE: config/packages/translation.yaml
================================================
framework:
default_locale: en
translator:
default_path: '%kernel.project_dir%/translations'
fallbacks:
- en
================================================
FILE: config/packages/twig.yaml
================================================
twig:
default_path: '%kernel.project_dir%/templates'
debug: '%kernel.debug%'
strict_variables: '%kernel.debug%'
globals:
default_agent_image_path: '%assets_default_agent_profile_image_path%'
default_customer_image_path: '%assets_default_customer_profile_image_path%'
default_helpdesk_image_path: '%assets_default_helpdesk_profile_image_path%'
max_post_size: '%max_post_size%'
max_file_uploads: '%max_file_uploads%'
upload_max_filesize: '%upload_max_filesize%'
user_service: '@user.service'
uvdesk_service: '@uvdesk.service'
recaptcha_service: '@recaptcha.service'
ticket_service: '@ticket.service'
csrf_token_generator: '@security.csrf.token_manager'
email_service: '@email.service'
uvdesk_extensibles: '@uvdesk.extensibles'
uvdesk_core_file_system: '@uvdesk.core.file_system.service'
uvdesk_automations: '@uvdesk.automations'
uvdesk_version: "%uvdesk.version%"
uvdesk_core_version: "%uvdesk.core.version%"
================================================
FILE: config/packages/uvdesk.yaml
================================================
parameters:
app_locales: en|fr|it|de|da|ar|es|tr|zh|pl|he|pt_BR
# Default Assets
assets_default_agent_profile_image_path: 'bundles/uvdeskcoreframework/images/uv-avatar-batman.png'
assets_default_customer_profile_image_path: 'bundles/uvdeskcoreframework/images/uv-avatar-ironman.png'
assets_default_helpdesk_profile_image_path: 'bundles/uvdeskcoreframework/images/uv-avatar-uvdesk.png'
uvdesk_site_path.member_prefix: member
uvdesk_site_path.knowledgebase_customer_prefix: customer
# File uploads constraints
# @TODO: Set these parameters via compilers
max_post_size: 8388608
max_file_uploads: 20
upload_max_filesize: 2097152
uvdesk:
site_url: 'localhost:8000'
upload_manager:
id: Webkul\UVDesk\CoreFrameworkBundle\FileSystem\UploadManagers\Localhost
support_email: ~
# Default resources
default:
ticket:
type: support
status: open
priority: low
templates:
email: mail.html.twig
================================================
FILE: config/packages/uvdesk_extensions.yaml
================================================
uvdesk_extensions:
dir: '%kernel.project_dir%/apps'
================================================
FILE: config/packages/uvdesk_mailbox.yaml
================================================
uvdesk_mailbox:
emails: ~
# Often Reply emails like from gmail contains extra and redundant previous mail data.
# This data can be removed by adding delimiter i.e. specific line before each reply.
# delimiter: '<-- Please add content above this line -->'
# enable_delimiter: true
# Configure your mailboxes here
mailboxes: ~
# default:
# name: 'Sample Mailbox'
# enabled: true
# disable_outbound_emails: false
# use_strict_mode: false
# # Incoming email settings
# # IMAP settings to use for fetching emails from mailbox
# imap_server:
# host: ~
# username: ~
# password: ~
# # Outgoing email settings
# # Mailer settings to use for sending emails from mailbox
# smtp_server:
# host: ~
# port: ~
# client: ~
# type: ~
# username: ~
# password: ~
# sender_address: ~
================================================
FILE: config/routes.yaml
================================================
uvdesk:
resource: .
type: uvdesk
uvdesk_extensions:
resource: .
type: uvdesk_extensions
================================================
FILE: config/services.yaml
================================================
# This file is the entry point to configure your own services.
# Files in the packages/ subdirectory configure your dependencies.
# Put parameters here that don't need to change on each machine where the app is deployed
# https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration
parameters:
locale: 'en'
uvdesk.version: "v1.1.8"
services:
# default configuration for services in *this* file
_defaults:
autowire: true # Automatically injects dependencies in your services.
autoconfigure: true # Automatically registers your services as commands, event subscribers, etc.
public: false # Allows optimizing the container by removing unused services; this also means
# fetching services directly from the container via $container->get() won't work.
# The best practice is to be explicit about your dependencies anyway.
# makes classes in src/ available to be used as services
# this creates a service per class whose id is the fully-qualified class name
App\:
resource: '../src/*'
exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}'
# controllers are imported separately to make sure services can be injected
# as action arguments even if you don't extend any base controller class
App\Controller\:
resource: '../src/Controller'
tags: ['controller.service_arguments']
# add more service definitions when explicit configuration is needed
# please note that last definitions always *replace* previous ones
================================================
FILE: public/.htaccess
================================================
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ ./index.php/$1 [QSA,L]
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]
</IfModule>
================================================
FILE: public/assets/.gitignore
================================================
================================================
FILE: public/attachments/.gitignore
================================================
================================================
FILE: public/css/main.css
================================================
/* Main CSS */
* {
box-sizing: border-box;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
*:focus {
outline: none;
}
html,
body {
font-family: 'Source Sans Pro', sans-serif;
font-weight: 400;
color: #333333;
margin: 0px;
}
a:link,
a:hover,
a:visited,
a:focus,
a:active {
text-decoration: none;
}
@keyframes bounce {
0% {
transform: scale(1);
}
50% {
transform: scale(1.1);
}
100% {
transform: scale(1);
}
}
.fade-out-white {
animation: fade-out-white 0.3s ease-in-out !important;
}
.jelly-out {
animation: jelly-out 0.5s ease-in-out !important;
}
.active {
opacity: .75;
}
@keyframes flap-up {
0% {
opacity: 0;
transform: translateY(25px);
}
100% {
opacity: 1;
transform: translateY(0px);
}
}
@keyframes flap-slide {
0% {
opacity: 0;
transform: translateX(120px);
}
100% {
opacity: 1;
transform: translateX(0px);
}
}
@keyframes cog-animate-lg {
0% {
transform: rotate(0deg);
transform-origin: center;
}
100% {
transform: rotate(360deg);
transform-origin: center;
}
}
@keyframes cog-animate-sm {
0% {
transform: rotate(0deg);
transform-origin: center;
}
100% {
transform: rotate(-360deg);
transform-origin: center;
}
}
@keyframes bounce {
0% {
transform: scale(1);
}
50% {
transform: scale(1.1);
}
100% {
transform: scale(1);
}
}
@keyframes move {
0% {
transform: translateY(0px);
}
50% {
transform: translateY(-10px);
}
75% {
transform: translateY(5px);
}
100% {
transform: translateY(0px);
}
}
@keyframes shine {
0% {
transform: rotate(-45deg) translate(-20px, -60px);
opacity: 0;
}
100% {
transform: rotate(-45deg) translate(-25px, 55px);
opacity: .5;
}
}
@keyframes attention {
0% {
transform: translateY(0px);
transform-origin: center top;
}
35% {
transform: translateY(-10px);
transform-origin: center top;
}
50% {
transform: translateY(0px);
transform-origin: center top;
}
65% {
transform: translateY(-10px);
transform-origin: center top;
}
100% {
transform: translateY(0px);
transform-origin: center top;
}
}
@keyframes bounce-loader-before {
0% {
transform: scale(0);
opacity: .1;
}
50% {
transform: scale(1.3);
opacity: .7;
}
100% {
transform: scale(0);
opacity: .1;
}
}
@keyframes bounce-loader-after {
0% {
transform: scale(1.3);
opacity: .7;
}
50% {
transform: scale(0.7);
opacity: .1;
}
100% {
transform: scale(1.3);
opacity: .7;
}
}
@keyframes move-loader {
0% {
transform: translateY(0px);
opacity: 0;
}
50% {
transform: translateY(10px);
opacity: 1;
}
100% {
transform: translateY(0px);
opacity: 0;
}
}
@keyframes jelly {
0% {
transform: translateY(0px) scale(0.7);
opacity: 0;
}
70% {
transform: translateY(5px) scale(1.05);
opacity: 1;
}
100% {
transform: translateY(0px) scale(1);
opacity: 1;
}
}
@keyframes jelly-out {
0% {
transform: translateY(0px) scale(1);
opacity: 1;
}
30% {
transform: translateY(-5px) scale(1.05);
opacity: 1;
}
100% {
transform: translateY(0px) scale(0.7);
opacity: 0;
}
}
@keyframes fade-in-white {
0% {
opacity: 0;
}
100% {
opacity: .9;
}
}
@keyframes fade-out-white {
0% {
opacity: .9;
}
100% {
opacity: 0;
}
}
@keyframes zoom-move {
0% {
transform: scale(1, 1);
}
50% {
transform: scale(1.25, 1.25);
}
100% {
transform: scale(1, 1);
}
}
@keyframes zoom-move-reflect {
0% {
transform: translate(-30px, -180px) rotateZ(45deg);
}
100% {
transform: translate(90px, 30px) rotateZ(45deg);
}
}
@keyframes tour-moves-in {
0% {
transform: translateY(200px);
opacity: 0;
}
100% {
transform: translateY(0px);
opacity: 1;
}
}
.uv-btn-small {
font-size: 13px;
padding: 6px 10px;
color: #FFFFFF;
background-color: #7C70F4;
display: inline-block;
text-transform: uppercase;
border-radius: 3px;
font-weight: 700;
border: none;
font-family: inherit;
cursor: pointer;
vertical-align: middle;
margin: 5px 0px;
transition: 0.2s cubic-bezier(0.4, 0, 0.2, 1);
}
.uv-btn-small[disabled="disabled"],
.uv-btn-small[disabled="disabled"]:hover,
.uv-btn-small[disabled="disabled"]:active,
.uv-btn[disabled="disabled"],
.uv-btn[disabled="disabled"]:hover,
.uv-btn[disabled="disabled"]:active,
.uv-btn-large[disabled="disabled"],
.uv-btn-large[disabled="disabled"]:hover,
.uv-btn-large[disabled="disabled"]:active,
.uv-btn-action[disabled="disabled"],
.uv-btn-action[disabled="disabled"]:hover,
.uv-btn-action[disabled="disabled"]:active {
cursor: not-allowed;
background: #B1B1AE;
box-shadow: none;
opacity: 1;
}
.uv-btn {
font-size: 15px;
padding: 10px 10px;
color: #FFFFFF;
background-color: #7C70F4;
display: inline-block;
text-transform: uppercase;
border-radius: 3px;
font-weight: 700;
border: none;
font-family: inherit;
cursor: pointer;
vertical-align: middle;
margin: 5px 0px;
transition: 0.2s cubic-bezier(0.4, 0, 0.2, 1);
}
.uv-btn-nofill {
font-size: 15px;
padding: 10px 10px;
color: #9E9E9E;
background-color: transparent;
display: inline-block;
text-transform: uppercase;
border-radius: 3px;
font-weight: 700;
border: none;
font-family: inherit;
cursor: pointer;
vertical-align: middle;
margin: 5px 0px;
transition: 0.2s cubic-bezier(0.4, 0, 0.2, 1);
}
.uv-btn-nofill:hover {
background-color: #F2F2F2;
}
.uv-btn-large {
font-size: 17px;
padding: 12px 10px;
color: #FFFFFF;
background-color: #7C70F4;
display: inline-block;
text-transform: uppercase;
border-radius: 3px;
font-weight: 700;
border: none;
font-family: inherit;
cursor: pointer;
vertical-align: middle;
margin: 5px 0px;
transition: 0.2s cubic-bezier(0.4, 0, 0.2, 1);
}
.uv-btn-error {
background: #FF5656 !important;
}
.uv-btn-error:hover {
opacity: .98;
}
.uv-btn-error:active {
opacity: .80;
}
.uv-btn-stroke {
border: solid 1px #B1B1AE;
padding: 8px 10px;
border-radius: 3px;
cursor: pointer;
vertical-align: middle;
font-size: 15px;
display: inline-block;
margin: 5px 0px;
color: #333333;
transition: 0.2s cubic-bezier(0.4, 0, 0.2, 1);
}
.uv-btn-stroke[disabled="disabled"] {
opacity: .4;
cursor: not-allowed;
border-color: #B1B1AE !important;
}
.uv-btn-tag {
border: solid 1px #B1B1AE;
background: #FFFFFF;
padding: 5px 7px;
border-radius: 3px;
cursor: pointer;
vertical-align: middle;
font-size: 13px;
display: inline-block;
margin: 5px 0px;
color: #333333;
text-transform: capitalize;
transition: 0.2s cubic-bezier(0.4, 0, 0.2, 1);
}
.uv-btn-tag:hover {
border-color: #6F6F6F;
}
.uv-btn-action {
font-size: 15px;
padding: 8px 10px 9px 10px;
color: #FFFFFF;
background-color: #7C70F4;
display: inline-block;
text-transform: uppercase;
border-radius: 3px;
font-weight: 700;
border: none;
font-family: inherit;
cursor: pointer;
vertical-align: middle;
margin: 5px 0px;
transition: 0.2s cubic-bezier(0.4, 0, 0.2, 1);
}
.uv-btn-remove {
color: #FF5656;
font-size: 15px;
margin: 25px 0px;
display: inline-block;
vertical-align: middle;
cursor: pointer;
}
.uv-btn:hover,
.uv-btn-small:hover,
.uv-btn-large:hover,
.uv-btn-action:hover {
background-color: #BA81F1;
box-shadow: 0px 4px 15.36px 0.64px rgba(0, 0, 0, 0.1), 0px 2px 6px 0px rgba(0, 0, 0, 0.12);
}
.uv-btn:active,
.uv-btn-small:active,
.uv-btn-large:active,
.uv-btn-action:active {
opacity: .75;
}
.uv-btn-stroke:active {
border-color: #7C70F4;
}
.uv-btn-label {
display: inline-block;
font-size: 13px;
padding: 6px 10px;
text-transform: uppercase;
background: #7C70F4;
color: #FFFFFF;
border-radius: 3px;
margin: 5px;
}
.uv-dropdown {
display: inline-block;
color: #333333;
position: relative;
margin: 5px;
}
.uv-search-sm input.uv-search-field {
border: solid 1px #B1B1AE;
border-radius: 3px;
color: #333333;
font-size: 15px;
box-sizing: border-box;
padding: 5px 10px;
width: 160px;
margin-top: 10px;
}
.uv-dropdown-list ul.uv-agents-list {
background: #FAFAFA;
max-height: 224px;
overflow-y: auto;
}
.uv-dropdown-list ul.uv-agents-list li {
color: #333333;
border-top: solid 1px #D3D3D3;
padding: 15px 20px;
}
.uv-dropdown-list ul.uv-agents-list li img {
width: 25px;
display: inline-block;
border-radius: 3px;
margin-right: 5px;
vertical-align: middle;
}
.uv-dropdown .uv-dropdown-btn {
display: inline-block;
border: solid 1px #B1B1AE;
padding: 8px 27px 8px 10px;
border-radius: 3px;
cursor: pointer;
font-size: 15px;
position: relative;
transition: 0.2s cubic-bezier(0.4, 0, 0.2, 1);
}
.uv-dropdown .uv-dropdown-btn:after {
content: "";
position: absolute;
background-image: url('../../bundles/webkuldefault/images/arrow-down.svg');
background-repeat: no-repeat;
background-position: center;
width: 12px;
height: 6px;
margin-top: -3px;
top: 50%;
right: 10px;
}
.uv-dropdown-list {
width: 200px;
box-shadow: 0px 4px 15.36px 0.64px rgba(0, 0, 0, 0.1), 0px 2px 6px 0px rgba(0, 0, 0, 0.12);
border-radius: 3px;
background-color: #FFFFFF;
position: absolute;
display: none;
z-index: 1000;
}
.uv-dropdown-container {
padding: 20px;
overflow-y: auto;
max-height: 280px;
}
.uv-dropdown-list label {
vertical-align: middle;
margin-right: 3px;
}
.uv-drop-list-active {
position: relative;
}
span.uv-sorting.descend {
width: 12px;
height: 14px;
position: absolute;
top: 8px;
right: 0px;
cursor: pointer;
background-image: url("../../bundles/webkuldefault/images/uvdesk-sprite.svg");
background-position: 0px -68px;
}
span.uv-sorting:hover.descend {
background-position: 0px -83px;
}
span.uv-sorting.ascend {
width: 12px;
height: 14px;
position: absolute;
top: 8px;
right: 0px;
cursor: pointer;
background-image: url("../../bundles/webkuldefault/images/uvdesk-sprite.svg");
background-position: -13px -68px;
}
span.uv-sorting:hover.ascend {
background-position: -13px -83px;
}
.uv-dropdown-list label {
font-size: 15px;
display: inline-block;
text-transform: uppercase;
color: #9E9E9E;
font-weight: 700;
padding-bottom: 5px;
}
.uv-dropdown-list ul {
margin: 0px;
list-style-type: none;
padding: 0px;
}
.uv-dropdown-list ul li {
padding: 5px 0px;
font-size: 17px;
}
.uv-dropdown-list ul li:hover {
color: #2750C4;
cursor: pointer;
}
.uv-dropdown-list ul li:hover.uv-dropdown-checkbox {
color: #333333;
}
.uv-dropdown-list ul li a:link,
.uv-dropdown-list ul li a:active,
.uv-dropdown-list ul li a:visited,
.uv-dropdown-list ul li a:focus {
color: #333333;
display: block;
}
.uv-dropdown-list ul li a:hover {
color: #2750C4;
}
.uv-dropdown-show {
display: block;
}
.uv-top-left {
bottom: 42px;
left: 0px;
}
.uv-top-right {
bottom: 42px;
right: 0px;
}
.uv-bottom-left {
top: 42px;
left: 0px;
}
.uv-bottom-right {
top: 42px;
right: 0px;
}
.uv-dropdown .uv-dropdown-btn-active {
border: solid 1px #7C70F4;
}
.uv-element-block {
display: block;
margin: 20px 0px;
font-size: 15px;
color: #333333;
width: 550px;
max-width: 100%;
}
.uv-element-block p a:link,
.uv-element-block p a:hover,
.uv-element-block p a:active,
.uv-element-block p a:visited {
color: #2750C4;
font-size: 15px;
}
.uv-element-block p a:hover {
text-decoration: underline;
}
.uv-checkbox {
width: 20px;
height: 20px;
position: relative;
cursor: pointer;
display: inline-block;
vertical-align: middle;
}
.uv-checkbox input[type="checkbox"] {
width: 20px;
height: 20px;
position: absolute;
top: 0;
left: 0;
opacity: 0;
z-index: 100;
}
.uv-checkbox input[type="checkbox"] + .uv-checkbox-view {
width: 20px;
height: 20px;
background-image: url("../../bundles/webkuldefault/images/uvdesk-controls.svg");
background-position: 0px 0px;
cursor: pointer;
position: absolute;
top: 0;
left: 0;
}
.uv-checkbox input[type="checkbox"]:checked + .uv-checkbox-view {
background-image: url("../../bundles/webkuldefault/images/uvdesk-controls.svg");
background-position: 0px -21px;
}
.uv-checkbox input[type="checkbox"] + .uv-check-todo {
width: 22px;
height: 22px;
background-image: url("../../bundles/webkuldefault/images/uvdesk-sprite.svg");
background-position: 1px -373px;
cursor: pointer;
position: absolute;
top: 0;
left: 0;
}
.uv-checkbox input[type="checkbox"]:checked + .uv-check-todo {
background-image: url("../../bundles/webkuldefault/images/uvdesk-sprite.svg");
background-position: -22px -373px;
}
.uv-checkbox-label,
.uv-radio-label {
vertical-align: middle;
display: inline-block;
padding-left: 5px;
}
.uv-radio {
width: 20px;
height: 20px;
position: relative;
cursor: pointer;
display: inline-block;
vertical-align: middle;
}
.uv-radio input[type="radio"] {
width: 20px;
height: 20px;
position: absolute;
top: 0;
left: 0;
opacity: 0;
z-index: 100;
}
.uv-radio input[type="radio"] + .uv-radio-view {
width: 20px;
height: 20px;
background-image: url("../../bundles/webkuldefault/images/uvdesk-controls.svg");
background-position: -21px 0px;
cursor: pointer;
position: absolute;
top: 0;
left: 0;
}
.uv-radio input[type="radio"]:checked + .uv-radio-view {
background-image: url("../../bundles/webkuldefault/images/uvdesk-controls.svg");
background-position: -21px -21px;
}
.uv-attachment {
width: 0px;
height: 0px;
position: relative;
cursor: pointer;
display: inline-block;
vertical-align: middle;
}
.uv-attachment input[type="file"] {
background: red;
opacity: 0;
cursor: pointer;
}
.uv-file-label {
color: #2750C4;
vertical-align: middle;
display: inline-block;
cursor: pointer;
}
.uv-file-label:before {
width: 18px;
height: 20px;
background-image: url("../../bundles/webkuldefault/images/icon-attachment.svg");
content: "";
display: inline-block;
vertical-align: middle;
margin-right: 7px;
}
.uv-element-block .uv-added-attachment {
color: #333333;
margin: 5px 30px;
}
.uv-element-block .uv-added-attachment span {
width: 8px;
height: 8px;
padding-right: 12px;
background-image: url("../../bundles/webkuldefault/images/uvdesk-sprite.svg");
background-position: -64px -27px;
display: inline-block;
vertical-align: middle;
cursor: pointer;
}
.uv-field-label {
display: block;
}
.uv-field-block {
display: block;
}
.uv-field {
width: 70%;
height: 36px;
border: solid 1px #B1B1AE;
border-radius: 3px;
display: inline-block;
vertical-align: middle;
transition: 0.2s cubic-bezier(0.4, 0, 0.2, 1);
padding: 0px 10px;
font-size: 15px;
color: #333333;
margin: 10px 0px;
}
.uv-field-workflow {
width: 100%;
}
.uv-field-workflow .uv-select,
.uv-field-workflow .uv-field {
max-width: 200px;
width: 30%;
display: inline-block;
margin: 15px 10px 15px 0px;
}
.uv-workflow-hr-plank {
display: block;
height: 45px;
margin-top: 12px;
text-align: right;
}
.uv-workflow-hr-plank .uv-workflow-hr-or {
width: 95%;
border-top: solid 1px #D3D3D3;
display: inline-block;
position: relative;
}
.uv-workflow-hr-plank .uv-workflow-or {
width: 40px;
height: 40px;
position: absolute;
box-shadow: 0px 5px 14.25px 0.75px rgba(0, 0, 0, 0.25);
background-color: #FFFFFF;
font-size: 17px;
line-height: 2.2;
color: #333333;
left: 45px;
top: -20px;
border-radius: 50%;
text-align: center;
}
.uv-workflow-hr-plank .uv-workflow-or:before {
position: absolute;
top: -10px;
left: -11px;
content: "";
width: 62px;
height: 62px;
background-image: url("../../bundles/webkuldefault/images/icon-clip-or.svg");
background-repeat: no-repeat;
background-position: center center;
z-index: -1;
}
.uv-workflow-hr-plank .uv-workflow-hr-and {
width: 100%;
border-top: solid 1px #D3D3D3;
display: inline-block;
position: relative;
}
.uv-workflow-hr-plank .uv-workflow-and {
width: 40px;
height: 40px;
position: absolute;
box-shadow: 0px 5px 14.25px 0.75px rgba(0, 0, 0, 0.25);
background-color: #FFFFFF;
font-size: 17px;
line-height: 2.3;
color: #333333;
left: 45px;
top: -20px;
border-radius: 50%;
text-align: center;
}
.uv-workflow-hr-plank .uv-workflow-and:before {
position: absolute;
top: 7px;
left: -11px;
content: "";
width: 62px;
height: 45px;
background-image: url("../../bundles/webkuldefault/images/icon-clip-or.svg");
background-repeat: no-repeat;
background-position: center bottom;
z-index: -1;
}
.uv-workflow-buttons .uv-btn-tag {
margin: 10px 5px 0px 0px;
}
.uv-search-inline {
border: solid 1px #B1B1AE;
border-radius: 3px;
font-size: 15px;
display: inline-block;
margin: 5px 0px;
color: #333333;
transition: border-color 0.2s cubic-bezier(0.4, 0, 0.2, 1);
padding: 7px 10px 9px 33px;
background-size: 32px;
background-image: url(../../bundles/webkuldefault/images/icon-search.svg);
background-repeat: no-repeat;
background-position: 1px 1px;
width: 180px;
max-width: 100%;
vertical-align: middle;
}
.uv-search-inline:focus {
border-color: #7C70F4;
background-position: 1px -31px;
}
.uv-search-inline-300 {
width: 300px;
max-width: 100%;
}
.uv-group {
font-size: 0;
width: 70%;
margin-top: 15px;
}
.uv-group-field {
width: 80%;
height: 36px;
border: solid 1px #B1B1AE;
border-right: none;
border-radius: 3px 0px 0px 3px;
display: inline-block;
vertical-align: middle;
transition: 0.2s cubic-bezier(0.4, 0, 0.2, 1);
padding: 0px 10px;
font-size: 15px;
color: #333333;
margin: 0px;
}
.uv-group-select {
background-color: #FFFFFF !important;
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
width: 20%;
height: 36px;
border: solid 1px #B1B1AE;
border-radius: 0px 3px 3px 0px;
display: inline-block;
vertical-align: middle;
transition: 0.2s cubic-bezier(0.4, 0, 0.2, 1);
padding: 0px 25px 0px 10px;
font-size: 15px;
color: #333333;
margin: 0px;
background-image: url(../../bundles/webkuldefault/images/arrow-down.svg);
background-repeat: no-repeat;
background-position: right 10px center;
}
.uv-date-picker {
background-image: url("../../bundles/webkuldefault/images/icon-date-picker.svg");
background-position: right 10px center;
background-repeat: no-repeat;
width: 150px;
cursor: pointer;
}
textarea.uv-field {
height: 100px;
padding: 10px;
}
textarea.uv-field[disabled="disabled"] {
overflow-y: hidden;
}
.uv-field[disabled="disabled"] {
border-color: #D3D3D3;
background-color: #D3D3D3;
cursor: not-allowed;
}
input[type="checkbox"][disabled="disabled"] + .uv-checkbox-view {
cursor: not-allowed;
opacity: .5;
}
input[type="radio"][disabled="disabled"] + .uv-radio-view {
cursor: not-allowed;
opacity: .5;
}
.uv-select {
background-color: #FFFFFF !important;
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
width: 70%;
height: 36px;
border: solid 1px #B1B1AE;
border-radius: 3px;
display: inline-block;
vertical-align: middle;
transition: 0.2s cubic-bezier(0.4, 0, 0.2, 1);
padding: 0px 25px 0px 10px;
font-size: 15px;
color: #333333;
margin: 10px 0px;
background-image: url('../../bundles/webkuldefault/images/arrow-down.svg');
background-repeat: no-repeat;
background-position: right 10px center;
}
.uv-select[disabled="disabled"] {
border-color: #D3D3D3 !important;
background-color: #D3D3D3 !important;
cursor: not-allowed;
}
.uv-select[multiple="multiple"] {
height: 60px;
background-image: none;
}
.uv-select-grouped {
display: inline-block;
margin: 10px 2px;
width: 100px;
}
.uv-select:focus,
.uv-field:focus {
border: solid 1px #7C70F4;
}
.uv-aside-select {
margin-bottom: 15px;
}
.uv-aside-select .uv-aside-select-label {
font-size: 13px;
color: #333333;
font-weight: 700;
}
.uv-aside-select span.uv-aside-select-value {
cursor: default;
margin-top: 3px;
padding-right: 25px;
display: inline-block;
font-size: 15px;
color: #333333;
}
.uv-aside-select span.uv-aside-drop-icon {
background-image: url(../../bundles/webkuldefault/images/arrow-down.svg);
background-size: 9px;
background-repeat: no-repeat;
background-position: right 10px center;
cursor: pointer;
}
.uv-aside-select span.uv-aside-select-value:hover {
color: #333333;
}
.uv-field-error,
.uv-field-error:focus {
border-color: #FF5656;
}
.uv-field-error-icon {
width: 21px;
height: 21px;
display: inline-block;
background-image: url("../../bundles/webkuldefault/images/uvdesk-sprite.svg");
vertical-align: middle;
margin-left: 10px;
background-position: 0px -46px;
}
.uv-field-success-icon {
width: 21px;
height: 21px;
display: inline-block;
background-image: url("../../bundles/webkuldefault/images/uvdesk-sprite.svg");
vertical-align: middle;
margin-left: 10px;
background-position: -22px -46px;
}
.uv-field-info,
.uv-field-message {
display: block;
font-style: italic;
color: #6F6F6F;
}
.uv-field-message {
color: #FF5656;
margin-top: 5px;
}
.uv-max-field {
margin-top: 10px;
}
.uv-max-field input {
font-size: 17px;
color: #333333;
width: 100%;
border-radius: 3px;
border: solid 1px #D3D3D3;
padding: 15px;
transition: 0.2s cubic-bezier(0.4, 0, 0.2, 1);
}
.uv-max-field input:focus {
border-color: #7C70F4;
}
.uv-split-field {
display: inline-block;
clear: both;
width: 100%;
margin-top: 10px;
}
.uv-split-field input {
font-size: 17px;
padding: 15px;
transition: 0.2s cubic-bezier(0.4, 0, 0.2, 1);
}
.uv-split-field .uv-split-field-lt {
color: #333333;
width: 75%;
float: left;
border-radius: 3px 0px 0px 3px;
border-top: solid 1px #D3D3D3;
border-right: none;
border-bottom: solid 1px #D3D3D3;
border-left: solid 1px #D3D3D3;
}
.uv-split-field .uv-split-field-lt:focus,
.uv-split-field .uv-split-field-rt:focus {
border-top-color: #7C70F4;
border-right-color: #7C70F4;
border-bottom-color: #7C70F4;
border-left-color: #7C70F4;
}
.uv-split-field .uv-split-field-lt:focus + .uv-split-field-rt {
border-left-color: #7C70F4;
}
.uv-split-field .uv-split-field-rt {
text-align: center;
color: #6F6F6F;
width: 25%;
float: right;
border-radius: 0px 3px 3px 0px;
border-top: solid 1px #D3D3D3;
border-right: solid 1px #D3D3D3;
border-bottom: solid 1px #D3D3D3;
border-left: solid 1px #D3D3D3;
pointer-events: none;
}
.uv-split-left-small .uv-split-field-lt {
width: 15%;
text-align: center;
}
.uv-split-left-small .uv-split-field-rt {
width: 85%;
text-align: left;
pointer-events: auto;
}
.uv-split-copy {
width: 100%;
display: inline-block;
clear: both;
margin: 10px 0px;
}
.uv-split-copy .uv-split-field {
width: 80%;
float: left;
height: 46px;
background: #FAFAFA;
border-top: dashed 1px #B1B1AE;
border-right: none;
border-bottom: dashed 1px #B1B1AE;
border-left: dashed 1px #B1B1AE;
border-radius: 4px 0px 0px 4px;
display: block;
vertical-align: middle;
transition: 0.2s cubic-bezier(0.4, 0, 0.2, 1);
padding: 3px 10px 6px 10px;
font-size: 15px;
color: #6F6F6F;
margin: 0px;
}
.uv-split-copy .uv-split-btn {
width: 20%;
float: right;
border-radius: 0px 3px 3px 0px;
height: 46px;
margin: 0;
display: block;
}
.uv-split-copy span {
color: #2750C4;
}
.uv-hr {
display: block;
border-bottom: solid 1px #D3D3D3;
margin: 25px 0px;
}
.uv-message-wrapper {
display: block;
background-color: #FFFFFF;
border-radius: 3px;
margin: 25px 25px 25px 0px;
padding: 10px 12px 12px 12px;
box-shadow: 0px 4px 15.36px 0.8px rgba(0, 0, 0, 0.08), 0px 2px 6px 0px rgba(0, 0, 0, 0.12);
}
.uv-message-wrapper p {
margin: 0px 0px 10px 0px;
}
.uv-message-wrapper a:link,
.uv-message-wrapper a:hover,
.uv-message-wrapper a:active,
.uv-message-wrapper a:visited {
text-decoration: none;
font-size: 15px;
color: #2750C4;
}
.uv-message-wrapper a:hover {
text-decoration: underline;
}
.uv-message-wrapper a.uv-btn-small {
margin: 0px;
background-color: #2ED04C !important;
color: #FFFFFF !important;
text-decoration: none;
}
.uv-steppers {
position: absolute;
height: 325px;
margin: -175px 0px 0px -22px;
z-index: 3;
top: 50%;
}
.uv-steppers .uv-stepper-dot {
width: 44px;
height: 44px;
margin-bottom: 45px;
padding: 10px;
background-color: #FFFFFF;
border-radius: 50%;
z-index: 2;
box-shadow: 0px 15px 22.12px 5.88px rgba(0, 0, 0, 0.1), 0px 4px 7.6px 0.4px rgba(0, 0, 0, 0.2);
}
.uv-steppers .uv-stepper-dot .uv-stepper-dot-status {
display: inline-block;
padding: 6px;
border-radius: 50%;
background-color: #FFFFFF;
border: solid 6px #B1B1AE;
transition: 0.2s cubic-bezier(0.4, 0, 0.2, 1);
}
.uv-steppers .uv-stepper-dot .uv-stepper-dot-active {
display: inline-block;
padding: 6px;
border-radius: 50%;
background-color: #FFFFFF;
border: solid 6px #7C70F4;
}
.uv-steppers .uv-stepper-dot .uv-stepper-dot-done {
display: inline-block;
padding: 6px;
border-radius: 50%;
background-color: #574AD2;
border: solid 6px #7C70F4;
}
.uv-steppers .uv-stepper-dot:last-child .uv-stepper-dot-status {
border: none;
width: 24px;
height: 24px;
background-image: url(../../bundles/webkuldefault/images/uvdesk-sprite-success.svg);
background-position: 0px -24px;
}
.uv-steppers .uv-stepper-dot:last-child .uv-stepper-dot-active {
background-image: url(../../bundles/webkuldefault/images/uvdesk-sprite-success.svg);
background-position: 0px 0px;
border: none;
background-color: transparent;
}
.uv-steppers:before {
width: 10px;
height: 300px;
position: absolute;
content: "";
background-color: #FFFFFF;
box-shadow: 0px 15px 22.12px 5.88px rgba(0, 0, 0, 0.1), 0px 4px 7.6px 0.4px rgba(0, 0, 0, 0.2);
z-index: -1;
left: 50%;
top: 5px;
margin-left: -5px;
}
.uv-loader {
position: relative;
}
.uv-loader span {
-webkit-backface-visibility: hidden;
width: 15px;
height: 15px;
position: absolute;
animation: move-loader 1s infinite ease-in-out;
}
.uv-loader span:before {
width: 15px;
height: 15px;
background: #7C70F4;
display: block;
border-radius: 50%;
position: absolute;
content: "";
-webkit-backface-visibility: hidden;
animation: bounce-loader-before 1s infinite ease-in-out;
opacity: 0;
}
.uv-loader span:after {
width: 15px;
height: 15px;
background: #7C70F4;
display: block;
border-radius: 50%;
position: absolute;
content: "";
-webkit-backface-visibility: hidden;
animation: bounce-loader-after 1s infinite ease-in-out;
opacity: 0;
}
.uv-loader span:nth-child(1) {
left: 0px;
}
.uv-loader span:nth-child(2) {
left: 25px;
animation-delay: .2s;
}
.uv-loader span:nth-child(3) {
left: 50px;
animation-delay: .4s;
}
.uv-loader-view {
width: 100%;
height: 100%;
z-index: 6000;
background: rgba(255, 255, 255, 0.9);
position: absolute;
}
.uv-loader-view .uv-loader {
width: 65px;
height: 30px;
position: absolute;
top: 50%;
left: 50%;
margin-left: -33px;
margin-top: -100px;
transform: scale(2);
}
.uv-notifications-wrapper {
width: 300px;
top: 10px;
right: 10px;
position: fixed;
}
.uv-notification {
width: 300px;
padding: 15px;
border-radius: 3px;
display: inline-block;
box-shadow: 0px 4px 15.36px 0.64px rgba(0, 0, 0, 0.1), 0px 2px 6px 0px rgba(0, 0, 0, 0.12);
position: relative;
animation: jelly 0.5s ease-in-out;
transform-origin: center top;
z-index: 500;
margin-bottom: 10px;
}
.uv-notification span.uv-notification-close {
position: absolute;
width: 8px;
height: 8px;
background-image: url("../../bundles/webkuldefault/images/uvdesk-sprite.svg");
background-position: -55px -27px;
right: 10px;
top: 10px;
cursor: pointer;
}
.uv-notification p {
color: #FFFFFF;
margin: 0px;
padding: 0px;
font-size: 15px;
}
.uv-error {
background: #FF5656;
}
.uv-warning {
background: #FFC107;
}
.uv-success {
background: #4CAF50;
}
.uv-dark {
background: #333333;
}
.uv-vertical-align {
display: inline-block;
vertical-align: middle;
}
.uv-table {
margin-top: 15px;
}
.uv-table table {
width: 100%;
border-collapse: collapse;
border-top: solid 1px #D3D3D3;
font-size: 15px;
color: #333333;
text-align: left;
}
.uv-table table thead th {
font-weight: 700;
padding: 10px;
border-bottom: solid 1px #D3D3D3;
}
.uv-table table tbody td {
padding: 10px;
border-bottom: solid 1px #D3D3D3;
}
.uv-margin-right-5 {
margin-right: 5px;
}
.uv-margin-top-5 {
margin-top: 5px;
}
.uv-margin-top-10 {
margin-top: 10px;
}
.uv-margin-right-15 {
margin-right: 15px;
}
.uv-margin-left-15 {
margin-left: 15px;
}
.uv-padding-right-25 {
padding-right: 25px;
}
.uv-width-full {
width: 100% !important;
}
.uv-pagination {
text-align: center;
margin: 20px 0px;
}
.uv-pagination a {
padding: 17px 13px;
display: inline-block;
vertical-align: middle;
color: #333333;
border: solid 1px transparent;
border-radius: 3px;
margin: 1px;
line-height: 0;
}
.uv-pagination a:hover {
background-color: #7C70F4;
color: #FFFFFF;
border: solid 1px #7C70F4;
}
.uv-pagination .uv-pagination-previous {
padding: 11px 14px 11px 12px;
display: inline-block;
vertical-align: middle;
border: solid 1px #D3D3D3;
border-radius: 3px;
}
.uv-pagination .uv-pagination-previous:before {
width: 7px;
height: 12px;
content: "";
background: url("../../bundles/webkuldefault/images/uvdesk-sprite.svg");
background-position: -44px -62px;
display: inline-block;
}
.uv-pagination .uv-pagination-previous:hover:before {
background-position: -44px -75px;
}
.uv-pagination .uv-pagination-next {
padding: 11px 14px 11px 12px;
display: inline-block;
vertical-align: middle;
border: solid 1px #D3D3D3;
border-radius: 3px;
}
.uv-pagination .uv-pagination-next:before {
width: 7px;
height: 12px;
content: "";
background: url("../../bundles/webkuldefault/images/uvdesk-sprite.svg");
background-position: -52px -62px;
display: inline-block;
}
.uv-pagination .uv-pagination-next:hover:before {
background-position: -52px -75px;
}
.uv-pagination .uv-page-active,
.uv-pagination .uv-page-active:hover {
color: #6F6F6F;
text-decoration: underline;
background-color: transparent;
border: solid 1px transparent;
}
.uv-icon-info {
width: 16px;
height: 16px;
background-image: url("../../bundles/webkuldefault/images/uvdesk-sprite.svg");
background-position: -38px -104px;
display: inline-block;
vertical-align: middle;
}
.uv-icon-down-dark {
background-image: url("../../bundles/webkuldefault/images/arrow-down.svg");
width: 12px;
height: 6px;
display: inline-block;
vertical-align: middle;
margin-left: 5px;
}
.uv-icon-down-light {
background-image: url("../../bundles/webkuldefault/images/arrow-down-light.svg");
width: 12px;
height: 6px;
display: inline-block;
vertical-align: middle;
margin-left: 5px;
}
.uv-icon-previous {
background-image: url("../../bundles/webkuldefault/images/uvdesk-sprite.svg");
width: 7px;
height: 12px;
display: inline-block;
vertical-align: middle;
background-position: -44px -62px;
margin-right: 5px;
margin-top: -2px;
}
.uv-icon-next {
background-image: url("../../bundles/webkuldefault/images/uvdesk-sprite.svg");
width: 7px;
height: 12px;
display: inline-block;
vertical-align: middle;
background-position: -52px -62px;
margin-left: 5px;
margin-top: -2px;
}
.uv-pop-up-body {
overflow: hidden;
}
.uv-pop-up-body .uv-inner-section .uv-aside {
z-index: 1;
}
.uv-pop-up-body .uv-paper {
z-index: auto;
}
.uv-pop-up-overlay {
top: 0px;
right: 0px;
bottom: 0px;
left: 0px;
position: fixed;
z-index: 5000;
background: rgba(255, 255, 255, 0.9);
overflow-y: auto;
animation: fade-in-white 0.3s ease-in-out;
}
.uv-pop-up-box {
background: #FFFFFF;
padding: 25px;
position: relative;
z-index: 5001;
left: 50%;
margin-top: 100px;
margin-bottom: 100px;
border-radius: 3px;
box-shadow: 0px 15px 25px 0px rgba(0, 0, 0, 0.03), 0px 20px 45px 5px rgba(0, 0, 0, 0.2);
animation: jelly 0.5s ease-in-out;
}
.uv-pop-up-box .uv-pop-up-close {
background: url("../../bundles/webkuldefault/images/icon-close.svg");
width: 15px;
height: 15px;
position: absolute;
right: 20px;
top: 20px;
cursor: pointer;
background-position: 0px 0px;
}
.uv-pop-up-box .uv-pop-up-close:hover {
background-position: 0px -15px;
}
.uv-pop-up-box h2 {
font-weight: 700;
font-size: 20px;
color: #9E9E9E;
margin: 0px;
text-transform: uppercase;
padding-right: 15px;
}
.uv-pop-up-box .uv-element-block {
width: 100%;
margin: 10px 0px;
}
.uv-pop-up-box .uv-field,
.uv-pop-up-box .uv-select {
width: 100%;
}
.uv-pop-up-box .uv-textarea-reply {
height: 250px;
}
.uv-pop-up-box p {
margin: 5px 0px;
}
.uv-pop-up-box p span {
color: #2750C4;
}
.uv-pop-up-box p a:link,
.uv-pop-up-box p a:hover,
.uv-pop-up-box p a:active,
.uv-pop-up-box p a:visited {
color: #2750C4;
}
.uv-pop-up-box p a:hover {
text-decoration: underline;
}
.uv-pop-up-box .uv-element-info {
margin: 20px 0px;
}
.uv-pop-up-wide {
margin-left: -350px;
width: 700px;
max-width: 80%;
}
.uv-pop-up-wide .uv-pop-up-actions {
text-align: left;
}
.uv-pop-up-wide .uv-pop-up-actions .uv-btn {
margin: 0px 10px 0px 0px;
}
.uv-pop-up-slim {
margin-left: -250px;
width: 500px;
max-width: 80%;
}
.uv-pop-up-slim .uv-pop-up-actions {
text-align: left;
}
.uv-pop-up-slim .uv-pop-up-actions .uv-btn {
margin: 0px 7px 0px 0px;
}
.uv-onboard-wrapper {
margin-left: -350px;
width: 700px;
max-width: 80%;
height: 500px;
overflow: hidden;
}
.uv-onboard-wrapper .uv-onboard-count {
font-size: 30px;
font-weight: 700;
color: #333333;
position: relative;
margin-left: -10px;
}
.uv-onboard-wrapper .uv-onboard-count:before {
border-right: solid 10px #7C70F4;
content: "";
display: block;
width: 10px;
height: 40px;
position: absolute;
left: -26px;
}
.uv-onboard-wrapper .uv-onboard-count:after {
color: #FAFAFA;
content: attr(data-onboard);
font-size: 235px;
display: block;
position: absolute;
left: -50px;
top: -90px;
z-index: -1;
}
.uv-onboard-wrapper .uv-onboard-box {
display: none;
text-align: center;
}
.uv-onboard-wrapper .uv-onboard-box img {
margin: 0 auto;
display: block;
max-width: 80%;
animation: move 0.75s 0.07s ease-in-out;
}
.uv-onboard-wrapper .uv-onboard-box h3 {
font-size: 24px;
color: #333333;
margin-top: 30px;
}
.uv-onboard-wrapper .uv-onboard-box p {
font-size: 17px;
color: #333333;
margin-top: 10px;
margin-bottom: 10px;
}
.uv-onboard-wrapper .uv-onboard-box p a:link,
.uv-onboard-wrapper .uv-onboard-box p a:hover,
.uv-onboard-wrapper .uv-onboard-box p a:active,
.uv-onboard-wrapper .uv-onboard-box p a:visited {
color: #2750C4;
}
.uv-onboard-wrapper .uv-onboard-box p a:hover {
text-decoration: underline;
}
.uv-onboard-wrapper .uv-onboard-box .uv-brand-hlt {
color: #7C70F4;
}
.uv-onboard-wrapper .uv-onboard-box-active {
display: block;
}
.uv-onboard-wrapper .uv-onboard-flap-slide {
animation: flap-slide 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
.uv-onboard-wrapper .uv-onboard-container {
position: relative;
height: 450px;
width: 100%;
}
.uv-onboard-wrapper .uv-onboard-container .uv-onboard-actions {
position: absolute;
bottom: 0px;
right: 0px;
}
.uv-onboard-wrapper .uv-onboard-container .uv-onboard-navigators {
position: absolute;
bottom: 14px;
left: 0px;
}
.uv-onboard-wrapper .uv-onboard-container .uv-onboard-navigator {
width: 12px;
height: 12px;
display: inline-block;
border-radius: 50%;
background-color: #D3D3D3;
cursor: pointer;
}
.uv-onboard-wrapper .uv-onboard-container .uv-onboard-navigator-active {
background-color: #7C70F4;
}
@media only screen and (max-width: 900px) {
.uv-group {
width: 100%;
}
.uv-group-field {
width: 65%;
}
.uv-group-select {
width: 35%;
}
.uv-pop-up-wide,
.uv-pop-up-slim,
.uv-onboard-wrapper {
width: 80%;
left: 10%;
margin: 50px 0px;
height: auto;
}
.uv-split-field .uv-split-field-lt {
width: 65%;
}
.uv-split-field .uv-split-field-rt {
width: 35%;
background: #FAFAFA;
}
.uv-split-left-small .uv-split-field-lt {
width: 15%;
text-align: center;
}
.uv-split-left-small .uv-split-field-rt {
width: 85%;
background: none;
}
}
@media only screen and (max-width: 500px) {
.uv-split-field .uv-split-field-lt {
padding: 15px 10px;
width: 55%;
}
.uv-split-field .uv-split-field-rt {
padding: 15px 5px;
width: 45%;
background: #FAFAFA;
}
.uv-split-left-small .uv-split-field-lt {
width: 20%;
text-align: center;
}
.uv-split-left-small .uv-split-field-rt {
width: 80%;
background: none;
padding: 15px;
}
.uv-split-copy .uv-split-field {
width: 65%;
}
.uv-split-copy .uv-split-btn {
width: 35%;
}
.uv-field-workflow {
width: 100%;
}
.uv-field-workflow .uv-select,
.uv-field-workflow .uv-field {
max-width: 90%;
width: 90%;
display: block;
margin: 15px 15px 15px 0px;
}
.uv-onboard-wrapper .uv-onboard-container {
height: auto;
}
.uv-onboard-wrapper .uv-onboard-container .uv-onboard-navigators {
opacity: 0;
}
.uv-onboard-wrapper .uv-onboard-container .uv-onboard-actions {
display: block;
width: 100%;
text-align: center;
position: static;
margin: 10px 0px;
}
}
.uv-box-tab {
width: 100%;
position: relative;
}
.uv-box-tab ul {
padding: 0;
list-style-type: none;
margin: 0px;
}
.uv-box-tab ul > li {
display: inline-block;
}
.uv-box-tab ul > li a {
color: #333333;
font-size: 15px;
border: solid 1px #D3D3D3;
background-color: #FFFFFF;
padding: 10px 25px 12px 25px;
margin: 0px 10px;
transition: 0.2s cubic-bezier(0.4, 0, 0.2, 1);
border-radius: 3px;
}
.uv-box-tab ul > li a:hover,
.uv-box-tab ul > li .uv-box-tab-active {
background-color: #7C70F4;
border-color: #7C70F4;
color: #FFFFFF;
}
.uv-box-tab ul li:first-child {
margin-left: 25px;
}
.uv-box-tab:before {
position: absolute;
border-bottom: solid 1px #D3D3D3;
width: 100%;
top: 11px;
content: "";
z-index: -1;
}
.uv-box-server-error {
font-size: 0px;
max-width: 750px;
padding: 25px;
margin: 150px auto 0px auto;
}
.uv-box-server-error .uv-box-server-error-lt {
width: 65%;
display: inline-block;
vertical-align: middle;
}
.uv-box-server-error .uv-box-server-error-lt .uv-error-rsp {
display: none;
}
.uv-box-server-error .uv-box-server-error-rt {
text-align: center;
width: 35%;
display: inline-block;
vertical-align: middle;
}
.uv-box-server-error .uv-box-block {
margin: 25px 0px;
}
.uv-box-server-error p {
margin: 0px 0px 10px 0px;
font-size: 15px;
}
.uv-box-server-error p span {
font-weight: 700;
color: #6F6F6F;
}
.uv-box-server-error .uv-error-title {
font-size: 17px;
margin-bottom: 7px;
}
.uv-box-server-error a:link,
.uv-box-server-error a:hover,
.uv-box-server-error a:active,
.uv-box-server-error a:visited {
color: #2750C4;
}
.uv-box-server-error a:hover {
text-decoration: underline;
}
.uv-box-server-error a.uv-btn {
color: #FFFFFF;
text-decoration: none;
}
.uv-box-server-error ul {
font-size: 15px;
list-style-type: none;
padding: 0px;
margin: 0px;
}
.uv-box-server-error ul li {
margin: 8px 0px;
}
.uv-box-server-error .uv-box-footer {
border-top: solid 1px #D3D3D3;
padding-top: 25px;
margin-top: 5px;
}
.uv-box-server-error .uv-box-cta:after {
content: attr(data-content);
font-size: 13px;
display: inline-block;
background-color: #2ED04C;
color: #FFFFFF;
text-transform: uppercase;
font-weight: 700;
padding: 0px 5px;
margin-left: 5px;
border-radius: 3px;
}
@media screen and (max-width: 768px) {
.uv-box-server-error {
padding: 0px;
width: 100%;
max-width: 100%;
padding: 20px;
margin: 0px auto;
}
.uv-box-server-error .uv-box-server-error-lt {
width: 100%;
display: block;
}
.uv-box-server-error .uv-box-server-error-lt .uv-error-rsp {
display: block;
margin: 0px auto 25px auto;
}
.uv-box-server-error .uv-box-server-error-rt {
display: none;
}
}
.error-grooves {
animation: error-grooves-key 4s alternate infinite ease-in-out;
}
.domain-grooves {
animation: domain-grooves-key 4s alternate infinite ease-in-out;
}
.uv-ticket-tour {
width: 100%;
padding: 30px;
left: 0px;
right: 0px;
bottom: 0px;
position: fixed;
background: #7C70F4;
z-index: 1000;
text-align: center;
animation: tour-moves-in 0.4s cubic-bezier(0.4, 0, 0.2, 1);
transition: 0.35s cubic-bezier(0.4, 0, 0.2, 1);
}
.uv-ticket-tour .uv-ticket-tour-plank {
margin: 0 auto;
width: 900px;
max-width: 100%;
display: none;
}
.uv-ticket-tour .uv-ticket-tour-plank-active {
display: block;
}
.uv-ticket-tour .uv-ticket-tour-flap-slide {
animation: flap-slide 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
.uv-ticket-tour h3 {
font-size: 24px;
font-weight: 400;
color: #FFFFFF;
margin-bottom: 10px;
}
.uv-ticket-tour p {
color: #FFFFFF;
font-size: 17px;
margin: 0px;
}
.uv-ticket-tour .uv-btn-small {
background: #7C70F4;
color: #cfa5f7;
box-shadow: none;
margin: 20px 5px 0px 5px;
}
.uv-ticket-tour .uv-btn-small:hover {
background-color: #5e51e0;
}
.uv-ticket-tour .uv-btn-small.uv-btn-white {
background-color: #FFFFFF;
color: #7C70F4;
}
.uv-ticket-tour .uv-btn-small.uv-btn-white:hover {
box-shadow: 0px 4px 15.36px 0.64px rgba(0, 0, 0, 0.1), 0px 2px 6px 0px rgba(0, 0, 0, 0.12);
}
.uv-ticket-tour .uv-icon-remove-before {
position: absolute;
top: 15px;
right: 15px;
cursor: pointer;
margin-right: 0px;
background-size: 111px;
width: 12px;
height: 12px;
background-position: -82px -40px;
}
.uv-tour-success {
background-color: #2ED04C;
}
.uv-tour-success .uv-btn-small:nth-last-child(2) {
display: none;
}
.uv-tour-success .uv-btn-small.uv-btn-white {
color: #2ED04C;
}
.uv-hl-ring {
width: 100px;
height: 100px;
display: none;
position: absolute;
background: rgba(255, 255, 255, 0.3);
border: solid 2px #7C70F4;
animation: zoom-move 1.4s infinite ease-in-out;
z-index: 5000;
border-radius: 50%;
box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.25);
margin-top: -50px;
margin-left: -50px;
overflow: hidden;
transition: 0.35s cubic-bezier(0.4, 0, 0.2, 1);
}
.uv-hl-ring:before {
width: 50px;
height: 200px;
content: "";
position: absolute;
background: rgba(124, 112, 244, 0.03);
transform: translate(-30px, -180px) rotateZ(45deg);
animation: zoom-move-reflect 2.1s 0.7s infinite ease-in-out;
}
@keyframes error-grooves-key {
0% {
transform: translate(-5px, -5px);
}
25% {
transform: translate(5px, 0px);
}
50% {
transform: translate(0px, 5px);
}
75% {
transform: translate(-5px, 0px);
}
100% {
transform: translate(5px, -5px);
}
}
@keyframes domain-grooves-key {
0% {
transform: translate(-5px, -5px) rotate(0deg);
}
25% {
transform: translate(5px, 0px) rotate(180deg);
}
50% {
transform: translate(0px, 5px) rotate(360deg);
}
75% {
transform: translate(-5px, 0px) rotate(180deg);
}
100% {
transform: translate(5px, -5px) rotate(0deg);
}
}
@media screen and (max-width: 1024px) {
.uv-box-tab ul {
text-align: center;
}
.uv-box-tab ul > li,
.uv-box-tab ul li:first-child {
position: relative;
display: block;
margin: 45px;
}
.uv-box-tab ul li:before {
position: absolute;
border-bottom: solid 1px #D3D3D3;
width: 100%;
left: 0px;
right: 0px;
top: 11px;
content: "";
z-index: -1;
}
.uv-box-tab:before {
content: none;
}
}
@media screen and (max-width: 900px) {
.uv-ticket-tour,
.uv-hl-ring {
display: none;
position: static;
}
}
@media screen and (max-width: 319px) {
body {
width: 319px;
overflow-x: auto;
}
}
h1 {
font-size: 24px;
color: #333333;
font-weight: 400;
margin: 0;
}
h2 {
font-size: 20px;
color: #333333;
font-weight: 400;
margin: 0;
}
h3 {
font-size: 15px;
color: #333333;
font-weight: 700;
margin: 0;
}
h4 {
font-weight: 700;
font-size: 15px;
color: #6F6F6F;
margin: 0;
}
h6 {
font-weight: 700;
font-size: 17px;
color: #9E9E9E;
margin: 0;
text-transform: uppercase;
}
p {
font-size: 15px;
color: #333333;
}
kbd {
font-family: 'Source Sans Pro', sans-serif;
border: solid 1px #D3D3D3;
padding: 0px 8px 2px 8px;
margin: 2px 0px;
background-color: #FAFAFA;
border-radius: 3px;
display: inline-block;
box-shadow: inset 0px -1px 0px 0px #ffffff, inset 0px -2px 5px 0px rgba(0, 0, 0, 0.1);
}
.uv-bold {
font-weight: 700;
}
.uv-capitalize {
text-transform: capitalize;
}
.uv-lowercase {
text-transform: lowercase;
}
.uv-uppercase {
text-transform: uppercase;
}
.uv-text-center {
text-align: center;
}
.uv-no-more {
font-size: 15px;
color: #9E9E9E;
font-style: italic;
}
.uv-sidebar {
background-color: #FFFFFF;
width: 300px;
position: absolute;
height: auto;
top: 0;
bottom: 0;
left: 0;
box-shadow: 0px 0px 20px 0px rgba(0, 0, 0, 0.18);
border-right: solid 1px #D3D3D3;
z-index: 2;
overflow: hidden;
transition: 0.35s cubic-bezier(0.4, 0, 0.2, 1);
}
.uv-sidebar .uv-soft-top {
display: block;
width: 300px;
}
.uv-sidebar .uv-soft-top a.uv-logo {
width: 200px;
height: 48px;
display: inline-block;
vertical-align: middle;
margin: 10px 25px;
position: relative;
}
.uv-sidebar .uv-soft-top .uv-company-logo {
position: absolute;
top: 0px;
left: 0px;
background-color: #FFFFFF;
height: 48px;
width: 200px;
}
.uv-sidebar .uv-soft-top .uv-company-logo img {
height: 48px;
}
.uv-sidebar .uv-soft-top .uv-company-logo-square {
display: none;
}
.uv-sidebar .uv-soft-top .uv-hamburger {
width: 20px;
height: 20px;
display: inline-block;
vertical-align: middle;
cursor: pointer;
margin: 24px 0px;
}
.uv-sidebar .uv-soft-top .uv-hamburger:hover svg path {
fill: #7C70F4;
}
.uv-sidebar ul.uv-menubar {
list-style-type: none;
padding: 0px;
margin: 0px;
}
.uv-sidebar ul.uv-menubar li a {
width: 300px;
border-left: solid 3px transparent;
display: block;
font-size: 15px;
color: #9E9E9E;
text-transform: uppercase;
font-weight: 700;
vertical-align: middle;
padding: 15px 25px;
transition: 0.2s cubic-bezier(0.4, 0, 0.2, 1);
}
.uv-sidebar ul.uv-menubar li a .uv-icon {
width: 20px;
height: 20px;
display: inline-block;
vertical-align: middle;
cursor: pointer;
}
.uv-sidebar ul.uv-menubar li a .uv-menu-item {
display: inline-block;
vertical-align: middle;
margin-left: 5px;
}
.uv-sidebar ul.uv-menubar li a:hover,
.uv-sidebar ul.uv-menubar li .uv-item-active {
color: #7C70F4;
background: #FAFAFA;
border-left: solid 3px #7C70F4;
}
.uv-sidebar ul.uv-menubar li a:hover .uv-icon svg path,
.uv-sidebar ul.uv-menubar li .uv-item-active .uv-icon svg path {
fill: #7C70F4;
}
.uv-sidebar-active {
width: 60px;
}
.uv-sidebar-active .uv-soft-top a.uv-logo {
display: none;
}
.uv-sidebar-active .uv-soft-top .uv-hamburger {
margin: 24px 20px;
}
.uv-sidebar-active ul.uv-menubar {
list-style-type: none;
padding: 0px;
margin: 0px;
}
.uv-sidebar-active ul.uv-menubar li a {
padding: 15px 17px;
transition: 0.2s cubic-bezier(0.4, 0, 0.2, 1);
}
.uv-sidebar-active ul.uv-menubar li a .uv-menu-item {
display: none;
}
.uv-paper {
width: 100%;
position: absolute;
top: 0;
bottom: 0;
z-index: 1;
padding-left: 300px;
background-color: #FFFFFF;
transition: 0.35s cubic-bezier(0.4, 0, 0.2, 1);
}
.uv-paper .uv-navbar {
height: 70px;
background-color: #FAFAFA;
border-bottom: solid 1px #D3D3D3;
font-size: 0;
}
.uv-paper .uv-navbar .uv-search-wrapper {
display: inline-block;
width: 50%;
vertical-align: middle;
}
.uv-paper .uv-navbar .uv-search-bar {
width: 100%;
max-width: 600px;
border: none;
border-radius: 3px;
margin-left: 15px;
font-size: 17px;
color: #333333;
padding: 9px 15px 10px 40px;
background-image: url("../../bundles/webkuldefault/images/icon-search.svg");
background-repeat: no-repeat;
background-position: 0px 0px;
background-color: transparent;
transition: box-shadow 0.2s cubic-bezier(0.4, 0, 0.2, 1);
}
.uv-paper .uv-navbar .uv-search-bar:focus {
box-shadow: 0px 4px 15.36px 0.64px rgba(0, 0, 0, 0.1), 0px 2px 6px 0px rgba(0, 0, 0, 0.12);
background-position: 0px -40px;
background-color: #FFFFFF;
}
.uv-paper .uv-navbar .uv-search-result-wrapper {
width: 600px;
max-width: 100%;
padding: 20px 0px;
max-height: 500px;
overflow-y: auto;
background: #FFFFFF;
position: absolute;
border-radius: 3px;
margin-top: 7px;
margin-left: 15px;
box-shadow: 0px 20px 40px 0px rgba(0, 0, 0, 0.15), 0px 3px 9.7px 0.3px rgba(0, 0, 0, 0.1);
display: none;
z-index: 8000;
}
.uv-paper .uv-navbar .uv-search-result-wrapper h6 {
margin-left: 20px;
}
.uv-paper .uv-navbar .uv-search-result-wrapper .uv-brick-icon {
width: 50px;
height: 50px;
padding: 10px;
border-radius: 50%;
background-image: -webkit-linear-gradient(left, #7c70f4 0%, #ba81f1 100%);
background-image: -o-linear-gradient(left, #7c70f4 0%, #ba81f1 100%);
background-image: linear-gradient(to right, #7c70f4 0%, #ba81f1 100%);
transition: 0.2s cubic-bezier(0.4, 0, 0.2, 1);
display: inline-block;
vertical-align: middle;
}
.uv-paper .uv-navbar .uv-search-result-wrapper .uv-brick-icon svg path {
fill: #FFFFFF;
}
.uv-paper .uv-navbar .uv-search-result-wrapper .uv-brick-icon-facebook {
background-image: -moz-linear-gradient(90deg, #3174cd 0%, #4180d4 100%) !important;
background-image: -webkit-linear-gradient(90deg, #3174cd 0%, #4180d4 100%) !important;
background-image: -ms-linear-gradient(90deg, #3174cd 0%, #4180d4 100%) !important;
}
.uv-paper .uv-navbar .uv-search-result-wrapper .uv-brick-icon-facebook svg path,
.uv-paper .uv-navbar .uv-search-result-wrapper .uv-brick-icon-ecommerce svg path,
.uv-paper .uv-navbar .uv-search-result-wrapper .uv-brick-icon-twitter svg path,
.uv-paper .uv-navbar .uv-search-result-wrapper .uv-brick-icon-form svg path,
.uv-paper .uv-navbar .uv-search-result-wrapper .uv-brick-icon-disqus svg path,
.uv-paper .uv-navbar .uv-search-result-wrapper .uv-brick-icon-apps svg path {
fill: #FFFFFF !important;
opacity: 1 !important;
}
.uv-paper .uv-navbar .uv-search-result-wrapper .uv-brick-icon-facebook:hover svg path {
fill: #3174cd !important;
}
.uv-paper .uv-navbar .uv-search-result-wrapper .uv-brick-icon-ecommerce {
background-image: -moz-linear-gradient(90deg, #ed8a67 0%, #ffa96a 100%) !important;
background-image: -webkit-linear-gradient(90deg, #ed8a67 0%, #ffa96a 100%) !important;
background-image: -ms-linear-gradient(90deg, #ed8a67 0%, #ffa96a 100%) !important;
}
.uv-paper .uv-navbar .uv-search-result-wrapper .uv-brick-icon-twitter {
background-image: -webkit-linear-gradient(left, #69beff 0%, #23cbff 100%) !important;
background-image: -o-linear-gradient(left, #69beff 0%, #23cbff 100%) !important;
background-image: linear-gradient(to right, #69beff 0%, #23cbff 100%) !important;
}
.uv-paper .uv-navbar .uv-search-result-wrapper .uv-brick-icon-form {
background-image: -webkit-linear-gradient(left, #fd9a9a 0%, #feb692 100%) !important;
background-image: -o-linear-gradient(left, #fd9a9a 0%, #feb692 100%) !important;
background-image: linear-gradient(to right, #fd9a9a 0%, #feb692 100%) !important;
}
.uv-paper .uv-navbar .uv-search-result-wrapper .uv-brick-icon-disqus {
background-image: -webkit-linear-gradient(left, #58b1fd 0%, #79c1ff 100%) !important;
background-image: -o-linear-gradient(left, #58b1fd 0%, #79c1ff 100%) !important;
background-image: linear-gradient(to right, #58b1fd 0%, #79c1ff 100%) !important;
}
.uv-paper .uv-navbar .uv-search-result-wrapper .uv-brick-icon-apps {
background-image: -webkit-linear-gradient(left, #48dacb 0%, #5beedf 100%) !important;
background-image: -o-linear-gradient(left, #48dacb 0%, #5beedf 100%) !important;
background-image: linear-gradient(to right, #48dacb 0%, #5beedf 100%) !important;
}
.uv-paper .uv-navbar .uv-search-result-wrapper p {
font-size: 15px;
text-transform: uppercase;
margin: 0px 0px 0px 8px;
display: inline-block;
vertical-align: middle;
}
.uv-paper .uv-navbar .uv-search-result-row {
margin: 10px 0px;
padding: 10px 20px;
cursor: pointer;
background: #FFFFFF;
transition: 0.2s cubic-bezier(0.4, 0, 0.2, 1);
}
.uv-paper .uv-navbar .uv-search-result-row:last-child {
margin-bottom: 0px;
}
.uv-paper .uv-navbar .uv-search-result-row:hover {
background: #FAFAFA;
}
.uv-paper .uv-navbar .uv-search-result-row:hover p {
color: #2750C4;
}
.uv-paper .uv-navbar .uv-search-result-active {
display: block;
}
.uv-paper .uv-navbar .uv-search-flap-up {
animation: flap-up 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
.uv-paper .uv-navbar .uv-actions {
display: inline-block;
width: 50%;
height: 70px;
vertical-align: middle;
text-align: right;
}
.uv-paper .uv-navbar .uv-action-new {
background-color: #2ED04C;
width: 70px;
height: 70px;
display: inline-block;
cursor: pointer;
transition: 0.2s cubic-bezier(0.4, 0, 0.2, 1);
text-align: center;
padding: 25px;
vertical-align: middle;
}
.uv-paper .uv-navbar .uv-action-new:hover {
background-color: #25C943;
}
.uv-paper .uv-navbar .uv-action-new:active {
opacity: .75;
}
.uv-paper .uv-navbar .uv-profile {
font-size: 15px;
display: inline-block;
vertical-align: middle;
cursor: pointer;
margin: 0px 25px 0px 30px;
position: relative;
padding: 15px 0px;
height: 70px;
}
.uv-paper .uv-navbar .uv-profile-info {
display: inline-block;
vertical-align: middle;
text-align: left;
min-width: 50px;
position: relative;
margin-right: 15px;
}
.uv-paper .uv-navbar .uv-avatar {
display: inline-block;
vertical-align: middle;
border-radius: 3px;
margin-right: 10px;
height: 40px;
}
.uv-paper .uv-navbar .uv-howdy,
.uv-paper .uv-navbar .uv-user {
display: block;
}
.uv-paper .uv-navbar .uv-howdy {
color: #9E9E9E;
}
.uv-paper .uv-navbar .uv-profile:after {
background-image: url(../../bundles/webkuldefault/images/uvdesk-sprite.svg);
background-position: -68px 0px;
width: 6px;
height: 24px;
content: "";
position: absolute;
right: 0px;
top: 22px;
}
.uv-paper .uv-navbar .uv-notifications {
display: inline-block;
vertical-align: middle;
cursor: pointer;
}
.uv-paper .uv-navbar .uv-notification-icon {
width: 21px;
height: 26px;
display: inline-block;
background-image: url(../../bundles/webkuldefault/images/uvdesk-sprite.svg);
background-position: -46px 0px;
position: relative;
}
.uv-paper .uv-navbar .uv-notification-icon-count {
text-align: center;
padding: 10px 7px;
color: #FFFFFF;
font-size: 13px;
font-weight: 700;
line-height: 0;
border-radius: 10px;
position: absolute;
background-color: #7C70F4;
top: -10px;
left: 20px;
z-index: 1;
}
.uv-paper .uv-wrapper {
position: absolute;
margin-top: 70px;
top: 0px;
bottom: 0px;
left: 300px;
right: 0px;
overflow-x: hidden;
overflow-y: auto;
transition: 0.35s cubic-bezier(0.4, 0, 0.2, 1);
}
.uv-paper .uv-wrapper .uv-copyright {
font-size: 15px;
color: #6F6F6F;
}
.uv-paper .uv-wrapper .uv-copyright a {
color: #2750C4;
}
.uv-paper .uv-container .uv-area {
padding: 25px;
}
.uv-paper .uv-container .uv-home-tabs {
position: absolute;
right: 25px;
}
.uv-paper .uv-container .uv-home-tabs ul {
margin: 0px;
padding: 0px;
list-style-type: none;
font-size: 0;
}
.uv-paper .uv-container .uv-home-tabs ul li {
margin: 0;
padding: 0px;
display: inline-block;
padding: 7px 10px 7px 32px;
border: solid 1px #7C70F4;
font-size: 15px;
cursor: pointer;
color: #6F6F6F;
}
.uv-paper .uv-container .uv-home-tabs ul .uv-tab-manage {
border-radius: 3px 0px 0px 3px;
position: relative;
}
.uv-paper .uv-container .uv-home-tabs ul .uv-tab-manage:before {
width: 22px;
height: 22px;
position: absolute;
content: "";
left: 5px;
top: 6px;
background-image: url("../../bundles/webkuldefault/images/uvdesk-sprite.svg");
background-position: 0px 0px;
}
.uv-paper .uv-container .uv-home-tabs ul .uv-tab-activity {
border-radius: 0px 3px 3px 0px;
position: relative;
}
.uv-paper .uv-container .uv-home-tabs ul .uv-tab-activity:before {
width: 22px;
height: 22px;
position: absolute;
content: "";
left: 5px;
top: 6px;
background-image: url("../../bundles/webkuldefault/images/uvdesk-sprite.svg");
background-position: -23px 0px;
}
.uv-paper .uv-container .uv-home-tabs ul .home-tab-active {
background-color: #7C70F4;
color: #FFFFFF;
}
.uv-paper .uv-container .uv-home-tabs ul .home-tab-active.uv-tab-manage:before {
background-position: 0px -23px;
}
.uv-paper .uv-container .uv-home-tabs ul .home-tab-active.uv-tab-activity:before {
background-position: -23px -23px;
}
.uv-paper .uv-container .uv-brick {
margin-bottom: 40px;
}
.uv-paper .uv-container .uv-brick .uv-brick-head p {
margin: 5px 0px 15px 0px;
}
.uv-paper .uv-container .uv-brick .uv-brick-head a {
color: #2750C4;
}
.uv-paper .uv-container .uv-brick .uv-brick-section {
text-align: left;
}
.uv-paper .uv-container .uv-brick .uv-brick-section .uv-brick-container {
display: inline-block;
margin: 15px 30px 0px 0px;
max-width: 120px;
text-align: center;
vertical-align: top;
}
.uv-paper .uv-container .uv-brick .uv-brick-section .uv-brick-icon {
width: 120px;
height: 120px;
padding: 30px;
border-radius: 50%;
background-image: -webkit-linear-gradient(left, #7c70f4 0%, #ba81f1 100%);
background-image: -o-linear-gradient(left, #7c70f4 0%, #ba81f1 100%);
background-image: linear-gradient(to right, #7c70f4 0%, #ba81f1 100%);
transition: 0.2s cubic-bezier(0.4, 0, 0.2, 1);
}
.uv-paper .uv-container .uv-brick .uv-brick-section .uv-brick-icon svg path {
fill: #FFFFFF;
}
.uv-paper .uv-container .uv-brick .uv-brick-section .uv-brick-icon:hover {
background-image: -webkit-linear-gradient(left, #ffffff 0%, #ffffff 100%) !important;
background-image: -o-linear-gradient(left, #ffffff 0%, #ffffff 100%) !important;
background-image: linear-gradient(to right, #ffffff 0%, #ffffff 100%) !important;
box-shadow: 0px 4px 15.36px 0.64px rgba(0, 0, 0, 0.1), 0px 2px 6px 0px rgba(0, 0, 0, 0.12) !important;
animation: bounce 0.2s 1 cubic-bezier(0.4, 0, 0.2, 1);
}
.uv-paper .uv-container .uv-brick .uv-brick-section .uv-brick-icon:hover svg path {
fill: #7C70F4;
}
.uv-paper .uv-container .uv-brick .uv-brick-section .uv-brick-icon-facebook {
background-image: -moz-linear-gradient(90deg, #3174cd 0%, #4180d4 100%) !important;
background-image: -webkit-linear-gradient(90deg, #3174cd 0%, #4180d4 100%) !important;
background-image: -ms-linear-gradient(90deg, #3174cd 0%, #4180d4 100%) !important;
}
.uv-paper .uv-container .uv-brick .uv-brick-section .uv-brick-icon-facebook svg path,
.uv-paper .uv-container .uv-brick .uv-brick-section .uv-brick-icon-ecommerce svg path,
.uv-paper .uv-container .uv-brick .uv-brick-section .uv-brick-icon-twitter svg path,
.uv-paper .uv-container .uv-brick .uv-brick-section .uv-brick-icon-form svg path,
.uv-paper .uv-container .uv-brick .uv-brick-section .uv-brick-icon-disqus svg path,
.uv-paper .uv-container .uv-brick .uv-brick-section .uv-brick-icon-apps svg path {
fill: #FFFFFF !important;
opacity: 1 !important;
}
.uv-paper .uv-container .uv-brick .uv-brick-section .uv-brick-icon-facebook:hover svg path {
fill: #3174cd !important;
}
.uv-paper .uv-container .uv-brick .uv-brick-section .uv-brick-icon-ecommerce {
background-image: -moz-linear-gradient(90deg, #ed8a67 0%, #ffa96a 100%) !important;
background-image: -webkit-linear-gradient(90deg, #ed8a67 0%, #ffa96a 100%) !important;
background-image: -ms-linear-gradient(90deg, #ed8a67 0%, #ffa96a 100%) !important;
}
.uv-paper .uv-container .uv-brick .uv-brick-section .uv-brick-icon-ecommerce:hover svg path {
fill: #fa8b49 !important;
}
.uv-paper .uv-container .uv-brick .uv-brick-section .uv-brick-icon-twitter {
background-image: -webkit-linear-gradient(left, #69beff 0%, #23cbff 100%) !important;
background-image: -o-linear-gradient(left, #69beff 0%, #23cbff 100%) !important;
background-image: linear-gradient(to right, #69beff 0%, #23cbff 100%) !important;
}
.uv-paper .uv-container .uv-brick .uv-brick-section .uv-brick-icon-twitter:hover svg path {
fill: #69beff !important;
}
.uv-paper .uv-container .uv-brick .uv-brick-section .uv-brick-icon-form {
background-image: -webkit-linear-gradient(left, #fd9a9a 0%, #feb692 100%) !important;
background-image: -o-linear-gradient(left, #fd9a9a 0%, #feb692 100%) !important;
background-image: linear-gradient(to right, #fd9a9a 0%, #feb692 100%) !important;
}
.uv-paper .uv-container .uv-brick .uv-brick-section .uv-brick-icon-form:hover svg path {
fill: #fd9a9a !important;
}
.uv-paper .uv-container .uv-brick .uv-brick-section .uv-brick-icon-disqus {
background-image: -webkit-linear-gradient(left, #58b1fd 0%, #79c1ff 100%) !important;
background-image: -o-linear-gradient(left, #58b1fd 0%, #79c1ff 100%) !important;
background-image: linear-gradient(to right, #58b1fd 0%, #79c1ff 100%) !important;
}
.uv-paper .uv-container .uv-brick .uv-brick-section .uv-brick-icon-disqus:hover svg path {
fill: #58b1fd !important;
}
.uv-paper .uv-container .uv-brick .uv-brick-section .uv-brick-icon-apps {
background-image: -webkit-linear-gradient(left, #48dacb 0%, #5beedf 100%) !important;
background-image: -o-linear-gradient(left, #48dacb 0%, #5beedf 100%) !important;
background-image: linear-gradient(to right, #48dacb 0%, #5beedf 100%) !important;
}
.uv-paper .uv-container .uv-brick .uv-brick-section .uv-brick-icon-apps:hover svg path {
fill: #48daca !important;
}
.uv-paper .uv-container .uv-brick .uv-brick-section p {
text-align: center;
text-transform: uppercase;
margin: 10px 0px;
}
.uv-paper .uv-scroll-plank {
margin: 15px 0px 0px 0px;
}
.uv-paper .uv-scroll-plank a:link,
.uv-paper .uv-scroll-plank a:hover,
.uv-paper .uv-scroll-plank a:active,
.uv-paper .uv-scroll-plank a:focus,
.uv-paper .uv-scroll-plank a:visited {
font-size: 15px;
color: #2750C4;
margin-right: 5px;
display: inline-block;
}
.uv-paper .uv-scroll-block {
display: inline-block;
max-height: 160px;
overflow: auto;
border: dashed 1px #B1B1AE;
border-radius: 5px;
padding: 5px 15px;
background-color: #FAFAFA;
}
.uv-paper .uv-element-block {
margin: 10px 0px;
}
.uv-inner-section .uv-aside {
top: 0;
bottom: 0;
overflow-y: auto;
background: #FFFFFF;
width: 280px;
position: absolute;
z-index: 4;
padding: 20px 0px 20px 25px;
border-right: solid 1px #D3D3D3;
}
.uv-inner-section .uv-aside .uv-aside-head {
clear: both;
height: 20px;
}
.uv-inner-section .uv-aside .uv-aside-head .uv-aside-title {
float: left;
}
.uv-inner-section .uv-aside .uv-aside-head .uv-aside-back {
float: right;
margin-right: 10px;
}
.uv-inner-section .uv-aside .uv-aside-head .uv-aside-back span {
color: #333333;
position: relative;
cursor: pointer;
}
.uv-inner-section .uv-aside .uv-aside-head .uv-aside-back span:before {
width: 8px;
height: 12px;
content: "";
position: absolute;
top: 5px;
left: -12px;
background-image: url(../../bundles/webkuldefault/images/uvdesk-sprite.svg);
background-position: -120px -27px;
}
.uv-inner-section .uv-aside .uv-aside-nav h6 {
margin-top: 34px;
}
.uv-inner-section .uv-aside .uv-aside-nav .uv-aside-list li.uv-aside-item-active:first-child a,
.uv-inner-section .uv-aside .uv-aside-nav .uv-aside-custom li.uv-aside-item-active:first-child a {
border-top: none;
}
.uv-inner-section .uv-aside .uv-aside-nav ul.uv-aside-list li.uv-aside-item-active a,
.uv-inner-section .uv-aside .uv-aside-nav ul.uv-aside-custom li.uv-aside-item-active a {
border-bottom: solid 1px #D3D3D3;
}
.uv-inner-section .uv-aside .uv-aside-nav ul.uv-aside-list li:last-child a,
.uv-inner-section .uv-aside .uv-aside-nav ul.uv-aside-custom li:last-child a {
border-bottom: none;
}
.uv-inner-section .uv-aside .uv-aside-nav ul.uv-aside-list ul,
.uv-inner-section .uv-aside .uv-aside-nav ul.uv-aside-custom ul {
margin-left: 20px;
padding: 5px 0px;
}
.uv-inner-section .uv-aside .uv-aside-nav ul.uv-aside-list ul li a,
.uv-inner-section .uv-aside .uv-aside-nav ul.uv-aside-custom ul li a {
border-top: solid 1px #D3D3D3;
}
.uv-inner-section .uv-aside .uv-aside-nav ul.uv-aside-list ul li:last-child a,
.uv-inner-section .uv-aside .uv-aside-nav ul.uv-aside-custom ul li:last-child a {
border-bottom: none;
}
.uv-inner-section .uv-aside .uv-aside-nav ul {
padding: 0px;
list-style-type: none;
}
.uv-inner-section .uv-aside .uv-aside-nav ul li a {
padding: 10px 10px;
display: block;
border-top: solid 1px #D3D3D3;
color: #333333;
}
.uv-inner-section .uv-aside .uv-aside-nav ul li a:hover {
color: #2750C4;
}
.uv-inner-section .uv-aside .uv-aside-nav ul li .uv-aside-nav-active {
font-weight: 700;
}
.uv-inner-section .uv-aside .uv-aside-nav ul li .uv-aside-active {
font-weight: 700;
color: #2750C4;
cursor: default;
}
.uv-inner-section .uv-aside .uv-aside-nav ul li .uv-flag-gray {
min-width: 21px;
padding: 2px 4px;
border-radius: 3px;
background: #9E9E9E;
color: #FFFFFF;
margin-left: 7px;
font-size: 13px;
text-align: center;
display: inline-block;
font-weight: 700;
}
.uv-inner-section .uv-aside .uv-aside-nav ul li .uv-flag-dark {
background-color: #333333;
}
.uv-inner-section .uv-aside .uv-aside-nav ul li:last-child a {
border-bottom: solid 1px #D3D3D3;
}
.uv-inner-section .uv-aside .uv-aside-brick {
margin-top: 25px;
padding-top: 25px;
padding-right: 25px;
padding-right: 10px;
border-top: solid 1px #D3D3D3;
}
.uv-inner-section .uv-aside .uv-aside-brick h3 {
margin-bottom: 5px;
}
.uv-inner-section .uv-aside .uv-aside-brick .uv-aside-customer-block {
font-size: 0;
}
.uv-inner-section .uv-aside .uv-aside-brick .uv-aside-customer-block .uv-aside-avatar {
width: 40px;
display: inline-block;
vertical-align: middle;
margin-right: 10px;
}
.uv-inner-section .uv-aside .uv-aside-brick .uv-aside-customer-block .uv-aside-avatar img {
width: 40px;
border-radius: 3px;
}
.uv-inner-section .uv-aside .uv-aside-brick .uv-aside-customer-block .uv-aside-customer-info {
display: inline-block;
vertical-align: middle;
padding: 10px 10px 10px 0px;
width: 164px;
position: relative;
}
.uv-inner-section .uv-aside .uv-aside-brick .uv-aside-customer-block .uv-aside-customer-info span {
font-size: 13px;
display: block;
word-break: break-all;
}
.uv-inner-section .uv-aside .uv-aside-brick .uv-aside-customer-block .uv-aside-customer-info span.uv-customize {
width: 15px;
height: 15px;
position: absolute;
background-image: url("../../bundles/webkuldefault/images/uvdesk-sprite.svg");
background-position: -44px -46px;
top: 28px;
right: -5px;
cursor: pointer;
}
.uv-inner-section .uv-aside .uv-aside-brick .uv-aside-customer-block .uv-aside-customer-info span.uv-customize:hover {
background-position: -59px -46px;
}
.uv-inner-section .uv-aside .uv-aside-brick .uv-aside-ticket-block .uv-aside-ticket-brick {
margin-top: 20px;
}
.uv-inner-section .uv-aside .uv-aside-brick .uv-aside-ticket-block span {
display: inline-block;
font-size: 15px;
}
.uv-inner-section .uv-aside .uv-aside-brick .uv-aside-ticket-block span.uv-icon-replies {
width: 18px;
height: 18px;
background-image: url('../../bundles/webkuldefault/images/uvdesk-sprite.svg');
background-position: 0px -117px;
content: ' ';
display: inline-block;
vertical-align: middle;
margin-right: 3px;
margin-top: -3px;
}
.uv-inner-section .uv-aside .uv-aside-brick .uv-aside-ticket-block span.uv-icon-timestamp {
width: 18px;
height: 18px;
background-image: url('../../bundles/webkuldefault/images/uvdesk-sprite.svg');
background-position: -19px -117px;
content: ' ';
display: inline-block;
vertical-align: middle;
margin-right: 3px;
margin-top: -3px;
}
.uv-inner-section .uv-aside .uv-aside-brick .uv-aside-ticket-block span.uv-icon-channel {
width: 18px;
height: 18px;
background-image: url('../../bundles/webkuldefault/images/uvdesk-channel-sprite.svg');
content: ' ';
display: inline-block;
vertical-align: middle;
margin-right: 3px;
margin-top: -3px;
}
.uv-inner-section .uv-aside .uv-aside-brick .uv-list-ticket-priority {
margin-top: -1px;
}
.uv-inner-section .uv-aside .uv-aside-brick .uv-element-block {
margin: 0px;
}
.uv-inner-section .uv-aside .uv-aside-brick .uv-field {
width: 100%;
}
.uv-inner-section .uv-aside .uv-aside-brick .uv-btn-label,
.uv-inner-section .uv-aside .uv-aside-brick .uv-btn-tag {
margin: 0px 5px 8px 0px;
}
.uv-inner-section .uv-view {
padding: 25px 0px 25px 305px;
top: 0;
left: 0;
overflow-y: auto;
bottom: 0;
width: 100%;
position: absolute;
z-index: 2;
}
.uv-inner-section .uv-view .uv-tabs > ul {
padding: 0px;
list-style-type: none;
border-bottom: solid 1px #D3D3D3;
}
.uv-inner-section .uv-view .uv-tabs > ul > li {
font-size: 15px;
display: inline-block;
padding: 15px 20px;
cursor: pointer;
margin: 0px 2px;
border-bottom: solid 3px #FFFFFF;
}
.uv-inner-section .uv-view .uv-tabs > ul > li:hover {
border-bottom: solid 3px #7C70F4;
}
.uv-inner-section .uv-view .uv-tabs > ul > li:first-child {
margin-left: 0px;
}
.uv-inner-section .uv-view .uv-tabs > ul .uv-tab-active {
border-bottom: solid 3px #7C70F4;
}
.uv-inner-section .uv-view .uv-tabs > ul .uv-tab-ellipsis {
padding: 0px;
}
.uv-inner-section .uv-view .uv-tabs > ul .uv-tab-ellipsis:hover {
border-color: #FFFFFF !important;
}
.uv-inner-section .uv-view .uv-ticket-action-bar {
border-bottom: solid 1px #D3D3D3;
font-size: 0px;
margin-bottom: 15px;
}
.uv-inner-section .uv-view .uv-ticket-action-bar .uv-ticket-action-bar-lt {
width: 70%;
display: inline-block;
vertical-align: middle;
}
.uv-inner-section .uv-view .uv-ticket-action-bar .uv-ticket-action-bar-rt {
width: 30%;
display: inline-block;
vertical-align: middle;
text-align: right;
padding-right: 25px;
}
.uv-inner-section .uv-view .uv-ticket-action-bar .uv-tabs ul {
border-bottom: none;
}
.uv-inner-section .uv-view .uv-ticket-head {
font-size: 0;
padding-bottom: 5px;
}
.uv-inner-section .uv-view .uv-ticket-head .uv-ticket-head-lt {
display: inline-block;
vertical-align: middle;
width: 10%;
margin-right: 5px;
max-width: 25px;
text-align: right;
}
.uv-inner-section .uv-view .uv-ticket-head .uv-ticket-head-rt {
width: 75%;
display: inline-block;
vertical-align: middle;
}
.uv-inner-section .uv-view .uv-ticket-strip span {
font-size: 15px;
color: #333333;
display: inline-block;
margin-right: 10px;
}
.uv-inner-section .uv-view .uv-ticket-strip span .uv-ticket-strip-label {
margin-right: 3px;
color: #9E9E9E;
}
.uv-inner-section .uv-view .uv-ticket-strip span a:link,
.uv-inner-section .uv-view .uv-ticket-strip span a:hover,
.uv-inner-section .uv-view .uv-ticket-strip span a:active,
.uv-inner-section .uv-view .uv-ticket-strip span a:visited {
color: #2750C4;
font-size: 15px;
}
.uv-inner-section .uv-view .uv-ticket-strip + .uv-ticket-strip {
padding: 5px 0px;
}
.uv-inner-section .uv-view .uv-ticket-scroll-region {
top: 0;
bottom: 0;
left: 305px;
right: 0px;
position: absolute;
margin-bottom: 58px;
overflow-y: auto;
}
.uv-inner-section .uv-view .uv-ticket-fixed-region {
height: 58px;
position: absolute;
right: 0;
bottom: 0;
left: 305px;
background: #FFFFFF;
border-top: solid 1px #D3D3D3;
padding: 5px 20px 5px 0px;
font-size: 0;
}
.uv-inner-section .uv-view .uv-ticket-fixed-region .uv-ticket-fixed-region-lt {
display: inline-block;
vertical-align: middle;
width: 50%;
}
.uv-inner-section .uv-view .uv-ticket-f
gitextract_9k9ewx4g/
├── .docker/
│ ├── bash/
│ │ └── uvdesk-entrypoint.sh
│ └── config/
│ ├── apache2/
│ │ ├── env
│ │ ├── httpd.conf
│ │ └── vhost.conf
│ └── php/
│ └── php.ini
├── .dockerignore
├── .gitattributes
├── .github/
│ ├── CONTRIBUTING.md
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE/
│ │ ├── Bug_report.md
│ │ ├── Feature_request.md
│ │ └── Support_question.md
│ ├── PULL_REQUEST_TEMPLATE.md
│ └── SECURITY.md
├── .gitignore
├── CHANGELOG-1.0.md
├── CHANGELOG-1.1.md
├── CHANGELOG-1.2.md
├── Dockerfile
├── INSTALLATION GUIDE.md
├── LICENSE.txt
├── README.md
├── apps/
│ └── .gitignore
├── composer.json
├── config/
│ ├── bundles.php
│ ├── packages/
│ │ ├── doctrine.yaml
│ │ ├── framework.yaml
│ │ ├── mailer.yaml
│ │ ├── security.yaml
│ │ ├── translation.yaml
│ │ ├── twig.yaml
│ │ ├── uvdesk.yaml
│ │ ├── uvdesk_extensions.yaml
│ │ └── uvdesk_mailbox.yaml
│ ├── routes.yaml
│ └── services.yaml
├── public/
│ ├── .htaccess
│ ├── assets/
│ │ └── .gitignore
│ ├── attachments/
│ │ └── .gitignore
│ ├── css/
│ │ ├── main.css
│ │ ├── reset.css
│ │ └── wizard.css
│ ├── index.php
│ └── scripts/
│ └── wizard.js
├── src/
│ ├── Console/
│ │ ├── EnvironmentVariables.php
│ │ └── Wizard/
│ │ ├── ConfigureHelpdesk.php
│ │ ├── DefaultUser.php
│ │ └── MigrateDatabase.php
│ ├── Controller/
│ │ ├── BaseController.php
│ │ ├── ConfigureHelpdesk.php
│ │ └── ImageCache/
│ │ ├── ImageCacheController.php
│ │ └── ImageManager.php
│ ├── Entity/
│ │ └── .gitignore
│ ├── EventListener/
│ │ └── ExceptionSubscriber.php
│ ├── Migrations/
│ │ └── .gitignore
│ ├── Repository/
│ │ └── .gitignore
│ ├── Resources/
│ │ └── config/
│ │ └── routes.yaml
│ ├── Routing/
│ │ └── RoutingResource.php
│ └── Service/
│ └── UrlImageCacheService.php
├── templates/
│ ├── errors/
│ │ └── error.html.twig
│ ├── installation-wizard/
│ │ └── index.html.twig
│ └── mail.html.twig
└── translations/
├── .gitignore
├── messages.ar.yml
├── messages.da.yml
├── messages.de.yml
├── messages.en.yml
├── messages.es.yml
├── messages.fr.yml
├── messages.he.yml
├── messages.it.yml
├── messages.pl.yml
├── messages.pt_BR.yml
├── messages.tr.yml
└── messages.zh.yml
SYMBOL INDEX (69 symbols across 11 files)
FILE: src/Console/EnvironmentVariables.php
class EnvironmentVariables (line 14) | class EnvironmentVariables extends Command
method __construct (line 21) | public function __construct(ContainerInterface $container)
method configure (line 28) | protected function configure()
method initialize (line 41) | protected function initialize(InputInterface $input, OutputInterface $...
method execute (line 50) | protected function execute(InputInterface $input, OutputInterface $out...
FILE: src/Console/Wizard/ConfigureHelpdesk.php
class ConfigureHelpdesk (line 17) | class ConfigureHelpdesk extends Command
method __construct (line 39) | public function __construct(ContainerInterface $container)
method configure (line 46) | protected function configure()
method initialize (line 54) | protected function initialize(InputInterface $input, OutputInterface $...
method execute (line 82) | protected function execute(InputInterface $input, OutputInterface $out...
method addUserDetailsInTracker (line 394) | public static function addUserDetailsInTracker($userDetails = [])
method refreshDatabaseConnection (line 450) | private function refreshDatabaseConnection($host, $port, $name, $user,...
method createDatabase (line 494) | private function createDatabase($host, $port, $name, $user, $password)
method getUpdatedDatabaseCredentials (line 531) | private function getUpdatedDatabaseCredentials()
method getLatestMigrationVersion (line 552) | private function getLatestMigrationVersion(OutputInterface $bufferedOu...
method askInteractiveQuestion (line 579) | private function askInteractiveQuestion($question, $default, int $inde...
FILE: src/Console/Wizard/DefaultUser.php
class DefaultUser (line 19) | class DefaultUser extends Command
method __construct (line 27) | public function __construct(ContainerInterface $container, EntityManag...
method configure (line 36) | protected function configure()
method initialize (line 52) | protected function initialize(InputInterface $input, OutputInterface $...
method interact (line 58) | protected function interact(InputInterface $input, OutputInterface $ou...
method execute (line 117) | protected function execute(InputInterface $input, OutputInterface $out...
method promptUserEmailInteractively (line 197) | private function promptUserEmailInteractively(InputInterface $input, O...
method promptUserNameInteractively (line 229) | private function promptUserNameInteractively(InputInterface $input, Ou...
method promptUserPasswordInteractively (line 259) | private function promptUserPasswordInteractively(InputInterface $input...
FILE: src/Console/Wizard/MigrateDatabase.php
class MigrateDatabase (line 15) | class MigrateDatabase extends Command
method __construct (line 20) | public function __construct(ContainerInterface $container, EntityManag...
method configure (line 28) | protected function configure()
method execute (line 36) | protected function execute(InputInterface $input, OutputInterface $out...
method versionMigrations (line 97) | private function versionMigrations(OutputInterface $output)
method compareMigrations (line 106) | private function compareMigrations(OutputInterface $output)
method getLatestMigrationVersion (line 113) | private function getLatestMigrationVersion(OutputInterface $output)
method migrateDatabaseToLatestVersion (line 121) | private function migrateDatabaseToLatestVersion(OutputInterface $output)
method runCommand (line 126) | private function runCommand(string $commandName, array $options, Outpu...
method isDatabaseConfigurationValid (line 134) | private function isDatabaseConfigurationValid()
FILE: src/Controller/BaseController.php
class BaseController (line 13) | class BaseController extends AbstractController
method base (line 20) | public function base(EntityManagerInterface $entityManager, KernelInte...
FILE: src/Controller/ConfigureHelpdesk.php
class ConfigureHelpdesk (line 24) | class ConfigureHelpdesk extends AbstractController
method load (line 54) | public function load()
method evaluateSystemRequirements (line 59) | public function evaluateSystemRequirements(Request $request, KernelInt...
method verifyDatabaseCredentials (line 148) | public function verifyDatabaseCredentials(Request $request)
method prepareSuperUserDetailsXHR (line 210) | public function prepareSuperUserDetailsXHR(Request $request)
method updateConfigurationsXHR (line 227) | public function updateConfigurationsXHR(Request $request, KernelInterf...
method migrateDatabaseSchemaXHR (line 310) | public function migrateDatabaseSchemaXHR(Request $request, KernelInter...
method populateDatabaseEntitiesXHR (line 322) | public function populateDatabaseEntitiesXHR(Request $request, KernelIn...
method createDefaultSuperUserXHR (line 335) | public function createDefaultSuperUserXHR(Request $request, UserPasswo...
method websiteConfigurationXHR (line 399) | public function websiteConfigurationXHR(Request $request, UVDeskServic...
method updateWebsiteConfigurationXHR (line 431) | public function updateWebsiteConfigurationXHR(Request $request, UVDesk...
FILE: src/Controller/ImageCache/ImageCacheController.php
class ImageCacheController (line 10) | class ImageCacheController extends AbstractController
method __construct (line 20) | public function __construct(
method getCachedImage (line 30) | public function getCachedImage(Request $request): Response
method showImage (line 49) | public function showImage(string $imageUrl, string $domain): Response
FILE: src/Controller/ImageCache/ImageManager.php
class ImageManager (line 9) | class ImageManager extends BaseImageManager
method __construct (line 13) | public function __construct(ContainerInterface $container)
method make (line 18) | public function make($data)
method initFromUrl (line 44) | public function initFromUrl($driver, $imageUrl, $domain)
method createDriver (line 71) | private function createDriver()
FILE: src/EventListener/ExceptionSubscriber.php
class ExceptionSubscriber (line 14) | class ExceptionSubscriber implements EventSubscriberInterface
method __construct (line 20) | public function __construct(Environment $twig, ContainerInterface $con...
method getSubscribedEvents (line 27) | public static function getSubscribedEvents()
method onKernelException (line 36) | public function onKernelException(ExceptionEvent $event)
FILE: src/Routing/RoutingResource.php
class RoutingResource (line 7) | class RoutingResource implements RoutingResourceInterface
method getResourcePath (line 9) | public static function getResourcePath()
method getResourceType (line 14) | public static function getResourceType()
FILE: src/Service/UrlImageCacheService.php
class UrlImageCacheService (line 8) | class UrlImageCacheService
method __construct (line 14) | public function __construct(ContainerInterface $container)
method getCachedImage (line 21) | public function getCachedImage(string $url, string $domain): string
method isCacheExpired (line 42) | private function isCacheExpired(string $cachePath): bool
method cacheImage (line 53) | private function cacheImage(string $url, string $cachePath, string $do...
Condensed preview — 75 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,664K chars).
[
{
"path": ".docker/bash/uvdesk-entrypoint.sh",
"chars": 1982,
"preview": "#!/bin/bash\n\n# Output color codes\n# https://en.wikipedia.org/wiki/ANSI_escape_code\n\ndeclare -r COLOR_NC='\\033[0m'\ndeclar"
},
{
"path": ".docker/config/apache2/env",
"chars": 1778,
"preview": "# envvars - default environment variables for apache2ctl\n\n# this won't be correct after changing uid\nunset HOME\n\n# for s"
},
{
"path": ".docker/config/apache2/httpd.conf",
"chars": 7228,
"preview": "# This is the main Apache server configuration file. It contains the\n# configuration directives that give the server it"
},
{
"path": ".docker/config/apache2/vhost.conf",
"chars": 1340,
"preview": "<VirtualHost *:80>\n\t# The ServerName directive sets the request scheme, hostname and port that\n\t# the server uses to ide"
},
{
"path": ".docker/config/php/php.ini",
"chars": 18,
"preview": "memory_limit=1024M"
},
{
"path": ".dockerignore",
"chars": 119,
"preview": "# Ignore files that aren't required to be in the build context when building images\n/var/log/*\n/var/cache/*\n/Dockerfile"
},
{
"path": ".gitattributes",
"chars": 56,
"preview": "public/* linguist-vendored\ntemplates/* linguist-vendored"
},
{
"path": ".github/CONTRIBUTING.md",
"chars": 2505,
"preview": "## How to contribute to UVdesk(Community)\n\n\n### **Bug Reporting**\n\n1. Verify that the bug was not already reported by se"
},
{
"path": ".github/FUNDING.yml",
"chars": 70,
"preview": "# These are supported funding model platforms\n\nopen_collective: uvdesk"
},
{
"path": ".github/ISSUE_TEMPLATE/Bug_report.md",
"chars": 870,
"preview": "---\nname: \"🐛 Bug Report\"\nabout: 'Report a general library issue.'\n---\n\n# Bug report\n\n### Title\n**Just a quick sentence t"
},
{
"path": ".github/ISSUE_TEMPLATE/Feature_request.md",
"chars": 97,
"preview": "---\nname: \"💡 Feature Request\"\nabout: 'Share your ideas with our team or request new features'\n---"
},
{
"path": ".github/ISSUE_TEMPLATE/Support_question.md",
"chars": 413,
"preview": "---\nname: ⛔ Support Question\nabout: Visit https://support.uvdesk.com/ to learn more about how the uvdesk team can assist"
},
{
"path": ".github/PULL_REQUEST_TEMPLATE.md",
"chars": 266,
"preview": "<!--\nThank you for contributing to UVDesk! Please fill out this description template to help us to process your pull req"
},
{
"path": ".github/SECURITY.md",
"chars": 270,
"preview": "Security Policy\n===============\n\n⚠ PLEASE DON'T DISCLOSE SECURITY-RELATED ISSUES PUBLICLY, SEE BELOW.\n\nIf you have found"
},
{
"path": ".gitignore",
"chars": 375,
"preview": "\n###> symfony/framework-bundle ###\n/.env.local\n/.env.local.php\n/.env.*.local\n/config/secrets/prod/prod.decrypt.private.p"
},
{
"path": "CHANGELOG-1.0.md",
"chars": 38477,
"preview": "CHANGELOG for 1.0.x\n===================\n\nThis changelog references any relevant changes introduced in 1.0 minor versions"
},
{
"path": "CHANGELOG-1.1.md",
"chars": 7561,
"preview": "CHANGELOG for 1.1.x\n===================\n\nThis changelog references any relevant changes introduced in 1.1 minor versions"
},
{
"path": "CHANGELOG-1.2.md",
"chars": 185,
"preview": "CHANGELOG for 1.2.x\n===================\n\nThis changelog references any relevant changes introduced in 1.2 minor versions"
},
{
"path": "Dockerfile",
"chars": 3220,
"preview": "FROM ubuntu:latest\nLABEL maintainer=\"support@uvdesk.com\"\n\nENV GOSU_VERSION=1.11\n\n# Install base supplementary packages\nR"
},
{
"path": "INSTALLATION GUIDE.md",
"chars": 9509,
"preview": "Installation Guide\n-----------------\n\nThis guide will walk you through all the steps necessary from setting up your serv"
},
{
"path": "LICENSE.txt",
"chars": 10360,
"preview": "\nOpen Software License (\"OSL\") v. 3.0\n\nThis Open Software License (the \"License\") applies to any original work of author"
},
{
"path": "README.md",
"chars": 14503,
"preview": "<p align=\"center\"><a href=\"https://www.uvdesk.com/en/\" target=\"_blank\">\n <img src=\"https://s3-ap-southeast-1.amazonaw"
},
{
"path": "apps/.gitignore",
"chars": 0,
"preview": ""
},
{
"path": "composer.json",
"chars": 3560,
"preview": "{\n \"name\": \"uvdesk/community-skeleton\",\n \"description\": \"UVDesk Community Helpdesk Project Skeleton\",\n \"type\": "
},
{
"path": "config/bundles.php",
"chars": 537,
"preview": "<?php\n\nreturn [\n Webkul\\UVDesk\\CoreFrameworkBundle\\UVDeskCoreFrameworkBundle::class => ['all' => true],\n Webkul\\UV"
},
{
"path": "config/packages/doctrine.yaml",
"chars": 1013,
"preview": "parameters:\n # Adds a fallback DATABASE_URL if the env var is not set.\n # This allows you to run cache:warmup even"
},
{
"path": "config/packages/framework.yaml",
"chars": 843,
"preview": "# see https://symfony.com/doc/current/reference/configuration/framework.html\nframework:\n secret: '%env(APP_SECRET)%'\n"
},
{
"path": "config/packages/mailer.yaml",
"chars": 81,
"preview": "framework:\n mailer:\n transports:\n main: '%env(MAILER_DSN)%'\n"
},
{
"path": "config/packages/security.yaml",
"chars": 4174,
"preview": "security:\n role_hierarchy:\n ROLE_AGENT: ROLE_AGENT\n ROLE_ADMIN: [ROLE_AGENT, ROLE_ADMIN]\n ROLE_S"
},
{
"path": "config/packages/translation.yaml",
"chars": 144,
"preview": "framework:\n default_locale: en\n translator:\n default_path: '%kernel.project_dir%/translations'\n fall"
},
{
"path": "config/packages/twig.yaml",
"chars": 1059,
"preview": "twig:\n default_path: '%kernel.project_dir%/templates'\n debug: '%kernel.debug%'\n strict_variables: '%kernel.debu"
},
{
"path": "config/packages/uvdesk.yaml",
"chars": 1036,
"preview": "parameters:\n app_locales: en|fr|it|de|da|ar|es|tr|zh|pl|he|pt_BR\n \n # Default Assets\n assets_default_agent_p"
},
{
"path": "config/packages/uvdesk_extensions.yaml",
"chars": 56,
"preview": "uvdesk_extensions:\n dir: '%kernel.project_dir%/apps'\n"
},
{
"path": "config/packages/uvdesk_mailbox.yaml",
"chars": 1110,
"preview": "uvdesk_mailbox:\n emails: ~\n # Often Reply emails like from gmail contains extra and redundant previous mail da"
},
{
"path": "config/routes.yaml",
"chars": 104,
"preview": "uvdesk:\n resource: .\n type: uvdesk\nuvdesk_extensions:\n resource: .\n type: uvdesk_extensions\n"
},
{
"path": "config/services.yaml",
"chars": 1649,
"preview": "# This file is the entry point to configure your own services.\n# Files in the packages/ subdirectory configure your depe"
},
{
"path": "public/.htaccess",
"chars": 234,
"preview": "<IfModule mod_rewrite.c>\n RewriteEngine On\n RewriteCond %{REQUEST_FILENAME} !-f\n RewriteRule ^(.*)$ ./index.php"
},
{
"path": "public/assets/.gitignore",
"chars": 0,
"preview": ""
},
{
"path": "public/attachments/.gitignore",
"chars": 0,
"preview": ""
},
{
"path": "public/css/main.css",
"chars": 214812,
"preview": "/* Main CSS */\n* {\n box-sizing: border-box;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: gra"
},
{
"path": "public/css/reset.css",
"chars": 1142,
"preview": "/* http://meyerweb.com/eric/tools/css/reset/ \n v2.0 | 20110126\n License: none (public domain)\n*/\n\nhtml, body, div,"
},
{
"path": "public/css/wizard.css",
"chars": 15373,
"preview": "/* Community Style Rules */\nbody {\n color: #24292e;\n width: 100%;\n font-family: -apple-system, BlinkMacSystemFo"
},
{
"path": "public/index.php",
"chars": 199,
"preview": "<?php\n\nuse App\\Kernel;\n\nrequire_once dirname(__DIR__).'/vendor/autoload_runtime.php';\n\nreturn function (array $context) "
},
{
"path": "public/scripts/wizard.js",
"chars": 67202,
"preview": "(function ($) {\n const ERRORS = {\n error404: {\n title: 'Unable to locate the path on the server.',\n"
},
{
"path": "src/Console/EnvironmentVariables.php",
"chars": 2681,
"preview": "<?php\n\nnamespace App\\Console;\n\nuse Symfony\\Component\\Dotenv\\Dotenv;\nuse Symfony\\Component\\Console\\Command\\Command;\nuse S"
},
{
"path": "src/Console/Wizard/ConfigureHelpdesk.php",
"chars": 26588,
"preview": "<?php\n\nnamespace App\\Console\\Wizard;\n\nuse Doctrine\\ORM\\Tools\\Setup;\nuse Doctrine\\ORM\\EntityManager;\nuse Symfony\\Componen"
},
{
"path": "src/Console/Wizard/DefaultUser.php",
"chars": 11307,
"preview": "<?php\n\nnamespace App\\Console\\Wizard;\n\nuse Doctrine\\ORM\\EntityManagerInterface;\nuse Symfony\\Component\\Console\\Command\\Com"
},
{
"path": "src/Console/Wizard/MigrateDatabase.php",
"chars": 5146,
"preview": "<?php\n\nnamespace App\\Console\\Wizard;\n\nuse Doctrine\\DBAL\\DBALException;\nuse Doctrine\\ORM\\EntityManagerInterface;\nuse Symf"
},
{
"path": "src/Controller/BaseController.php",
"chars": 2786,
"preview": "<?php\n\nnamespace App\\Controller;\n\nuse Doctrine\\ORM\\EntityManagerInterface;\nuse Symfony\\Component\\Routing\\Annotation\\Rout"
},
{
"path": "src/Controller/ConfigureHelpdesk.php",
"chars": 18826,
"preview": "<?php\n\nnamespace App\\Controller;\n\nuse App\\Console\\Wizard\\ConfigureHelpdesk as Helpdesk;\nuse Doctrine\\DBAL\\DriverManager;"
},
{
"path": "src/Controller/ImageCache/ImageCacheController.php",
"chars": 1678,
"preview": "<?php\n\nnamespace App\\Controller\\ImageCache;\n\nuse App\\Service\\UrlImageCacheService;\nuse Symfony\\Bundle\\FrameworkBundle\\Co"
},
{
"path": "src/Controller/ImageCache/ImageManager.php",
"chars": 2423,
"preview": "<?php\n\nnamespace App\\Controller\\ImageCache;\n\nuse Intervention\\Image\\Exception\\NotReadableException;\nuse Intervention\\Ima"
},
{
"path": "src/Entity/.gitignore",
"chars": 0,
"preview": ""
},
{
"path": "src/EventListener/ExceptionSubscriber.php",
"chars": 2648,
"preview": "<?php\n\nnamespace App\\EventListener;\n\nuse Twig\\Environment;\nuse Symfony\\Component\\HttpFoundation\\Response;\nuse Symfony\\Co"
},
{
"path": "src/Migrations/.gitignore",
"chars": 0,
"preview": ""
},
{
"path": "src/Repository/.gitignore",
"chars": 0,
"preview": ""
},
{
"path": "src/Resources/config/routes.yaml",
"chars": 2071,
"preview": "uvdesk_community_installation_wizard_check_requirements:\n path: /wizard/xhr/check-requirements\n controller: Ap"
},
{
"path": "src/Routing/RoutingResource.php",
"chars": 401,
"preview": "<?php\n\nnamespace App\\Routing;\n\nuse Webkul\\UVDesk\\CoreFrameworkBundle\\Definition\\RoutingResourceInterface;\n\nclass Routing"
},
{
"path": "src/Service/UrlImageCacheService.php",
"chars": 1655,
"preview": "<?php\n\nnamespace App\\Service;\n\nuse App\\Controller\\ImageCache\\ImageManager;\nuse Symfony\\Component\\DependencyInjection\\Con"
},
{
"path": "templates/errors/error.html.twig",
"chars": 7034,
"preview": "<!DOCTYPE html PUBLIC \"-//W3C//DTDXHTML1.0Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n<html lang=\"e"
},
{
"path": "templates/installation-wizard/index.html.twig",
"chars": 34340,
"preview": "<!DOCTYPE html>\n<html>\n <head>\n <meta charset=\"UTF-8\">\n <meta http-equiv=\"X-UA-Compatible\" content=\"ie="
},
{
"path": "templates/mail.html.twig",
"chars": 424,
"preview": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\""
},
{
"path": "translations/.gitignore",
"chars": 0,
"preview": ""
},
{
"path": "translations/messages.ar.yml",
"chars": 80508,
"preview": "\"Signed in as\": \"تسجيل دخولك\"\n\"Your Profile\": \"ملفك الشخصي\"\n\"Create Ticket\": \"إنشاء تذكرة\"\n\"Create Agent\": \"إنشاء مساعد\""
},
{
"path": "translations/messages.da.yml",
"chars": 85069,
"preview": "\"Signed in as\": \"Logget ind som\"\n\"Your Profile\": \"Din profil\"\n\"Create Ticket\": \"Opret billet\"\n\"Create Agent\": \"Opret age"
},
{
"path": "translations/messages.de.yml",
"chars": 90140,
"preview": "\"Signed in as\": \"Angemeldet als\"\n\"Your Profile\": \"Dein Profil\"\n\"Create Ticket\": \"Ticket erstellen\"\n\"Create Agent\": \"Agen"
},
{
"path": "translations/messages.en.yml",
"chars": 84152,
"preview": "\"Signed in as\": \"Signed in as\"\n\"Your Profile\": \"Your Profile\"\n\"Create Ticket\": \"Create Ticket\"\n\"Create Agent\": \"Create A"
},
{
"path": "translations/messages.es.yml",
"chars": 91112,
"preview": "\"Signed in as\": \"Registrado como\"\n\"Your Profile\": \"Tu perfil\"\n\"Create Ticket\": \"Crear Ticket\"\n\"Create Agent\": \"Crear age"
},
{
"path": "translations/messages.fr.yml",
"chars": 92801,
"preview": "\"Signed in as\": \"Connecté en tant que\"\n\"Your Profile\": \"Votre profil\"\n\"Create Ticket\": \"Créer un ticket\"\n\"Create Agent\":"
},
{
"path": "translations/messages.he.yml",
"chars": 78172,
"preview": "\"Signed in as\": \"מחובר בתור\"\n\"Your Profile\": \"הפרופיל שלך\"\n\"Create Ticket\": \"פתח קריאה\"\n\"Create Agent\": \"צור סוכן\"\n\"Crea"
},
{
"path": "translations/messages.it.yml",
"chars": 90845,
"preview": "\"Signed in as\": \"Accesso eseguito come\"\n\"Your Profile\": \"Profilo\"\n\"Create Ticket\": \"Crea ticket\"\n\"Create Agent\": \"Crea a"
},
{
"path": "translations/messages.pl.yml",
"chars": 87603,
"preview": "\"Signed in as\": \"Zalogowany jako\"\n\"Your Profile\": \"Twój profil\"\n\"Create Ticket\": \"Utwórz zgłoszenie\"\n\"Create Agent\": \"Ut"
},
{
"path": "translations/messages.pt_BR.yml",
"chars": 81586,
"preview": "\"Signed in as\": \"Autenticado como\"\n\"Your Profile\": \"Seu Perfil\"\n\"Create Ticket\": \"Criar Chamado\"\n\"Create Agent\": \"Criar "
},
{
"path": "translations/messages.tr.yml",
"chars": 85511,
"preview": "\"Signed in as\": \"Olarak giriş yapıldı\"\n\"Your Profile\": \"Profil\"\n\"Create Ticket\": \"Kayıt Oluştur\"\n\"Create Agent\": \"Kullan"
},
{
"path": "translations/messages.zh.yml",
"chars": 62179,
"preview": "\"Signed in as\": \"登入为\"\n\"Your Profile\": \"您的个人资料\"\n\"Create Ticket\": \"创建工单\"\n\"Create Agent\": \"创建接单员\"\n\"Create Customer\": \"建立客户\""
}
]
About this extraction
This page contains the full source code of the uvdesk/community-skeleton GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 75 files (1.5 MB), approximately 432.2k tokens, and a symbol index with 69 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.