summaryrefslogtreecommitdiff
path: root/plugins/Customizer/Template
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/Customizer/Template')
-rw-r--r--plugins/Customizer/Template/board/task_avatar.php26
-rw-r--r--plugins/Customizer/Template/config/sidebar.php3
-rw-r--r--plugins/Customizer/Template/config/themecreator.php96
-rw-r--r--plugins/Customizer/Template/file/remove.php15
-rw-r--r--plugins/Customizer/Template/file/show.php435
-rw-r--r--plugins/Customizer/Template/file/upload_flavicon.php22
-rw-r--r--plugins/Customizer/Template/file/upload_loginlogo.php22
-rw-r--r--plugins/Customizer/Template/file/upload_logo.php22
-rw-r--r--plugins/Customizer/Template/header/title.php24
-rw-r--r--plugins/Customizer/Template/header/title_older_kb.php26
-rw-r--r--plugins/Customizer/Template/header/user_dropdown.php45
-rw-r--r--plugins/Customizer/Template/layout/index.php47
-rw-r--r--plugins/Customizer/Template/layout/layout.php85
-rw-r--r--plugins/Customizer/Template/layout/login_no_custom.php21
-rw-r--r--plugins/Customizer/Template/layout/login_with_custom.php128
-rw-r--r--plugins/Customizer/Template/layout/note.php7
-rw-r--r--plugins/Customizer/Template/layout/preview_style.php77
-rw-r--r--plugins/Customizer/Template/user_mod/show.php58
18 files changed, 1159 insertions, 0 deletions
diff --git a/plugins/Customizer/Template/board/task_avatar.php b/plugins/Customizer/Template/board/task_avatar.php
new file mode 100644
index 00000000..3dd34a4c
--- /dev/null
+++ b/plugins/Customizer/Template/board/task_avatar.php
@@ -0,0 +1,26 @@
+
+<?php if (! empty($task['owner_id'])): ?>
+<div class="task-board-avatars">
+ <span
+ <?php if ($this->user->hasProjectAccess('TaskModificationController', 'edit', $task['project_id'])): ?>
+ class="task-board-assignee task-board-change-assignee"
+ data-url="<?= $this->url->href('TaskModificationController', 'edit', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?>">
+ <?php else: ?>
+ class="task-board-assignee">
+ <?php endif ?>
+ <?= $this->helper->dynamicAvatar->boardDynamic(
+ $task['owner_id'],
+ $task['assignee_username'],
+ $task['assignee_name'],
+ $task['assignee_email'],
+ $task['assignee_avatar_path'],
+ 'avatar-inline',
+ $this->task->configModel->get('b_av_size', '20')
+ ) ?>
+ </span>
+</div>
+<?php endif ?>
+<style>
+.avatar-bdyn img, .avatar-bdyn div {border-radius: <?= $this->task->configModel->get('b_av_radius', '50') ?>%}
+.avatar-bdyn .avatar-letter {line-height:<?= $this->task->configModel->get('b_av_size', '20') ?>px;width:<?= $this->task->configModel->get('b_av_size', '20') ?>px;font-size:<?= $this->task->configModel->get('b_av_size', '20') / 2 ?>px;}
+</style> \ No newline at end of file
diff --git a/plugins/Customizer/Template/config/sidebar.php b/plugins/Customizer/Template/config/sidebar.php
new file mode 100644
index 00000000..b9d11934
--- /dev/null
+++ b/plugins/Customizer/Template/config/sidebar.php
@@ -0,0 +1,3 @@
+<li <?= $this->app->checkMenuSelection('CustomizerFileController', 'show') ?>>
+ <?= $this->url->link(t('Customizer'), 'CustomizerFileController', 'show', ['plugin' => 'Customizer']) ?>
+</li>
diff --git a/plugins/Customizer/Template/config/themecreator.php b/plugins/Customizer/Template/config/themecreator.php
new file mode 100644
index 00000000..218547da
--- /dev/null
+++ b/plugins/Customizer/Template/config/themecreator.php
@@ -0,0 +1,96 @@
+<form name="themecreator" id="themecreator" class="url-links" method="post" action="<?= $this->url->href('CustomizerConfigController', 'create_theme', array('plugin' => 'customizer', 'redirect' => 'application')) ?>" autocomplete="off">
+<?= $this->form->csrf() ?>
+ <div class="column-100" style="min-height: 600px;">
+ <?= t('Theme Name: ') ?><input type="text" name="theme_name" placeholder="<?= t('Theme Name') ?>" pattern="[a-zA-Z0-9]+" title="<?= t('it should only contain alphanumeric without spaces') ?>" required>
+ <br>
+ <br>
+ <table>
+ <tr>
+ <th colspan="2" class="title-creator">
+ <?= t('Header') ?>
+ </th>
+ <tr>
+ <td>
+ <strong><?= t('Header Background') ?></strong>
+ </td>
+ <td>
+ <input class="color" name="header_background" value="">
+ </td>
+ <td>
+ <strong><?= t('Header Shade') ?></strong>
+ </td>
+ <td>
+ <input class="color" name="header_shade" value="">
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <strong><?= t('Header Title') ?></strong>
+ </td>
+ <td>
+ <input class="color" name="header_title" value="">
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <strong><?= t('Notification Icon') ?></strong>
+ </td>
+ <td>
+ <input class="color" name="notification_icon" value="">
+ </td>
+ </tr>
+ <tr>
+ <th colspan="2" class="title-creator">
+ <?= t('Body') ?>
+ </th>
+ <tr>
+ <tr>
+ <td>
+ <strong><?= t('Background Color') ?></strong>
+ </td>
+ <td>
+ <input class="color" name="background_color" value="">
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <strong><?= t('Main Font and Icons') ?></strong>
+ </td>
+ <td>
+ <input class="color" name="font_main" value="">
+ </td>
+ <td>
+ <strong><?= t('Secondary Fonts and Icons') ?></strong>
+ </td>
+ <td>
+ <input class="color" name="font_secondary" value="">
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <strong><?= t('Links') ?></strong>
+ </td>
+ <td>
+ <input class="color" name="font_link" value="">
+ </td>
+ <td>
+ <strong><?= t('Link Hover & Focus') ?></strong>
+ </td>
+ <td>
+ <input class="color" name="font_link_focus" value="">
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <strong><?= t('Over due') ?></strong>
+ </td>
+ <td>
+ <input class="color" name="font_overdue" value="">
+ </td>
+ </tr>
+ </table>
+ </div>
+ <div class="form-actions" style="margin-bottom: 50px">
+ <button type="submit" class="btn btn-blue"><?= t('Save') ?></button>
+ </div>
+</form>
diff --git a/plugins/Customizer/Template/file/remove.php b/plugins/Customizer/Template/file/remove.php
new file mode 100644
index 00000000..4031f8a8
--- /dev/null
+++ b/plugins/Customizer/Template/file/remove.php
@@ -0,0 +1,15 @@
+<div class="page-header">
+ <h2><?= t('Remove a file') ?></h2>
+</div>
+
+<div class="confirm">
+ <p class="alert alert-info">
+ <?= t('Do you really want to remove this file: "%s"?', $this->text->e($file['name'])) ?>
+ </p>
+
+ <?= $this->modal->confirmButtons(
+ 'CustomizerFileController',
+ 'removeform',
+ array('plugin' => 'customizer', 'custom_id' => $file['custom_id'], 'file_id' => $file['id'])
+ ) ?>
+</div>
diff --git a/plugins/Customizer/Template/file/show.php b/plugins/Customizer/Template/file/show.php
new file mode 100644
index 00000000..c184656c
--- /dev/null
+++ b/plugins/Customizer/Template/file/show.php
@@ -0,0 +1,435 @@
+<?php
+global $customizer;
+?>
+
+<?= $this->hook->render('customizer:config:style') ?>
+
+<div class="sidebar-content">
+ <form name="settings" id="settings" class="url-links" method="post" action="<?= $this->url->href('CustomizerConfigController', 'save', array('plugin' => 'customizer', 'redirect' => 'application')) ?>" autocomplete="off">
+ <?= $this->form->csrf() ?>
+ <fieldset class="login-link-block panel">
+
+ <button type="button" class="login-accordion"><i class="fa fa-picture-o" aria-hidden="true"></i> <?= t('Image Assets & Settings') ?></button>
+ <div class="login-accordian-panel mt-10">
+ <div class="panel header-logo-panel">
+ <div class="panel-heading">
+ <h3 class="panel-title"><?= t('Header Image') ?></h3>
+ </div>
+ <img id="hl1" src="<?= $this->url->href('CustomizerFileController', 'logo_setting', array('plugin' => 'customizer', 'file_id' => $logo['id'])) ?>" alt="<?= $this->text->e($logo['name']) ?>" height="<?= $this->task->configModel->get('headerlogo_size', '30') ?>">
+ <br>
+ <br>
+ <ul class="upload-link">
+ <?php
+ ini_set('display_errors', 1);
+ ini_set('display_startup_errors', 1);
+ error_reporting(E_ALL);
+ ?>
+
+ <?= $this->modal->medium('file', t('Upload Header Logo'), 'CustomizerFileController', 'create', array('plugin' => 'customizer', 'custom_id' => 1))?>
+ </ul class="remove-link">
+ <?php if (null !== $this->task->customizerFileModel->getByType(1)) : ?>
+ <ul class="remove-link">
+ <?php
+ ini_set('display_errors', 1);
+ ini_set('display_startup_errors', 1);
+ error_reporting(E_ALL);
+ ?>
+
+ <?= $this->modal->medium('remove', t('Remove Header Logo'), 'CustomizerFileController', 'confirm', array('plugin' => 'customizer', 'custom_id' => 1, 'file_id' => $logo['id']))?>
+ </ul>
+ <?php endif ?>
+ <br><br>
+ <table>
+ <tr>
+ <th width="25%"><strong><?= t('Header Logo Size') ?></strong></th>
+ <th><input type="range" name="headerlogo_size" min="20" max="250" value="<?= $this->task->configModel->get('headerlogo_size','30') ?>">
+ <header_logo_output> <?= $this->task->configModel->get('headerlogo_size','30') ?></header_logo_output><?= t('&nbsp;pixels high') ?>
+ </th>
+ </tr>
+ </table>
+
+ </div>
+
+ <div class="panel login-logo-panel">
+ <div class="panel-heading">
+ <h3 class="panel-title"><?= t('Login Image') ?></h3>
+ </div>
+
+ <img id="ll1" src="<?= $this->url->href('CustomizerFileController', 'loginlogo_setting', array('plugin' => 'customizer', 'file_id' => $loginlogo['id'])) ?>" alt="<?= $this->text->e($loginlogo['name']) ?>" height="<?= $this->task->configModel->get('loginlogo_size', '50') ?>">
+ <br>
+ <br>
+ <ul class="upload-link">
+ <?php
+ ini_set('display_errors', 1);
+ ini_set('display_startup_errors', 1);
+ error_reporting(E_ALL);
+ ?>
+
+ <?= $this->modal->medium('file', t('Upload Login Logo'), 'CustomizerFileController', 'create', array('plugin' => 'customizer', 'custom_id' => 3))?>
+ </ul>
+ <?php if (null !== $this->task->customizerFileModel->getByType(3)) : ?>
+ <ul class="remove-link">
+ <?php
+ ini_set('display_errors', 1);
+ ini_set('display_startup_errors', 1);
+ error_reporting(E_ALL);
+ ?>
+
+ <?= $this->modal->medium('remove', t('Remove Login Logo'), 'CustomizerFileController', 'confirm', array('plugin' => 'customizer', 'custom_id' => 3, 'file_id' => $loginlogo['id']))?>
+ </ul>
+ <?php endif ?>
+ <br><br>
+ <table>
+ <tr>
+ <th width="25%"><strong><?= t('Login Logo Size') ?></strong></th>
+ <th><input type="range" name="loginlogo_size" min="20" max="500" value="<?= $this->task->configModel->get('loginlogo_size','50') ?>">
+ <login_logo_output><?= $this->task->configModel->get('loginlogo_size','50') ?></login_logo_output><?= t('&nbsp;pixels high') ?>
+ </th>
+ </tr>
+ </table>
+
+ </div>
+
+ <div class="panel favicon-panel">
+ <div class="panel-heading">
+ <h3 class="panel-title"><?= t('Favicon Image') ?></h3>
+ </div>
+
+ <img src="<?= $this->url->href('CustomizerFileController', 'icon_setting', array('plugin' => 'customizer', 'file_id' => $flavicon['id'])) ?>" alt="<?= $this->text->e($flavicon['name']) ?>" height="16">
+ <br>
+ <br>
+ <ul class="upload-link">
+ <?php
+ ini_set('display_errors', 1);
+ ini_set('display_startup_errors', 1);
+ error_reporting(E_ALL);
+ ?>
+ <?= $this->modal->medium('file', t('Upload Favicon'), 'CustomizerFileController', 'create', array('plugin' => 'customizer', 'custom_id' => 2))?>
+ </ul>
+ </ul>
+ <?php if (null !== $this->task->customizerFileModel->getByType(2)) : ?>
+ <ul class="remove-link">
+ <?php
+ ini_set('display_errors', 1);
+ ini_set('display_startup_errors', 1);
+ error_reporting(E_ALL);
+ ?>
+
+ <?= $this->modal->medium('remove', t('Remove Favicon'), 'CustomizerFileController', 'confirm', array('plugin' => 'customizer', 'custom_id' => 2, 'file_id' => $flavicon['id']))?>
+ </ul>
+ <?php endif ?>
+ </div>
+
+ <div class="panel avatar-sizing-panel">
+ <div class="panel-heading">
+ <h3 class="panel-title"><?= t('Header Avatar Icon') ?></h3>
+ </div>
+ <?= $this->helper->dynamicAvatar->currentUserDynamic('avatar-preview') ?>
+ <br>
+ <br>
+ <table>
+ <tr>
+ <th width="25%"><strong><?= t('Header Avatar Icon Size') ?></strong></th>
+ <th><input type="range" name="av_size" id="av_size" min="20" max="50" value="<?= $this->task->configModel->get('av_size','20') ?>">
+ <av_icon_output> <?= $this->task->configModel->get('av_size','20') ?></av_icon_output><?= t('&nbsp;pixels') ?>
+ </th>
+ </tr>
+ <tr>
+ <th width="25%"><strong><?= t('Header Avatar Icon Radius') ?></strong></th>
+ <th><input type="range" name="av_radius" id="av_radius" min="0" max="50" value="<?= $this->task->configModel->get('av_radius','50') ?>">
+ <av_radius_output> <?= $this->task->configModel->get('av_radius','50') ?></av_radius_output><?= t('&nbsp;percent') ?>
+ </th>
+ </tr>
+ </table>
+
+ </div>
+
+ <div class="panel b-avatar-sizing-panel">
+ <div class="panel-heading">
+ <h3 class="panel-title"><?= t('Task Board Avatar Icon') ?></h3>
+ </div>
+ <?= $this->helper->dynamicAvatar->boardCurrentUserDynamic('b-avatar-preview') ?>
+ <br>
+ <br>
+ <table>
+ <tr>
+ <th width="25%"><strong><?= t('Avatar Icon Size') ?></strong></th>
+ <th><input type="range" name="b_av_size" id="b_av_size" min="20" max="50" value="<?= $this->task->configModel->get('b_av_size','20') ?>">
+ <b_av_icon_output> <?= $this->task->configModel->get('b_av_size','20') ?></b_av_icon_output><?= t('&nbsp;pixels') ?>
+ </th>
+ </tr>
+ <tr>
+ <th width="25%"><strong><?= t('Avatar Icon Radius') ?></strong></th>
+ <th><input type="range" name="b_av_radius" id="b_av_radius" min="0" max="50" value="<?= $this->task->configModel->get('b_av_radius','50') ?>">
+ <b_av_radius_output> <?= $this->task->configModel->get('b_av_radius','50') ?></b_av_radius_output><?= t('&nbsp;percent') ?>
+ </th>
+ </tr>
+ </table>
+
+ </div>
+<style>
+.avatar-bdyn img, .avatar-bdyn div {border-radius: <?= $this->task->configModel->get('b_av_radius', '50') ?>%}
+.avatar-bdyn .avatar-letter {line-height:<?= $this->task->configModel->get('b_av_size', '20') ?>px;width:<?= $this->task->configModel->get('b_av_size', '20') ?>px;font-size:<?= $this->task->configModel->get('b_av_size', '20') / 2 ?>px;}
+</style>
+
+
+ <table>
+ <tr>
+ <th width="25%"><strong><?= t('Enable Cache') ?></strong>
+ <p class="form-help enable-cache-desc"><?= e('Once enabled, site assets will begin to be cached for 5 days, increasing speed of site. However, you will need to clear your cache to see any new images uploaded. The settings page, will be unaffected by this setting.') ?></p>
+ </th>
+ <th>
+ <label class="switch">
+ <input id="toggle" name="enable_cache" type="checkbox" value="checked" <?= $this->task->configModel->get('enable_cache','') ?>>
+ <span class="slider round"></span>
+ </label>
+ </th>
+ </tr>
+ </table>
+ <table>
+ <tr>
+ <th width="25%"><strong><?= t('Logo Generator') ?></strong>
+ <p class="form-help enable-cache-desc"><?= e('Experimental Tool, to create simple logos for those in need.') ?></p>
+ </th>
+ <th>
+ <a href="https://creecros.github.io/simple_logo_gen/">
+ <img border="0" alt="logo_gen" src="/plugins/Customizer/Assets/img/logo-gen.png">
+ </a>
+ </th>
+ </table>
+ <div class="form-actions mb-20 ml-15">
+ <button type="submit" name="save" value="save" class="btn btn-blue"><?= t('Save') ?></button>
+ </div>
+ </div>
+
+ <button type="button" class="login-accordion"><i class="fa fa-sign-in" aria-hidden="true"></i> <?= t('Login Page Settings') ?></button>
+ <?php if ($this->task->configModel->get('use_custom_login', '') == 'checked') : ?>
+ <div class="login-accordian-panel mt-10">
+ <?php else :?>
+ <div class="login-accordian-panel mt-10">
+ <?php endif ?>
+ <table>
+ <tr>
+ <th width="25%"><strong><?= t('Use Custom Login Settings') ?></strong></th>
+ <th>
+ <label class="switch">
+ <input id="toggle" name="use_custom_login" type="checkbox" value="checked" <?= $this->task->configModel->get('use_custom_login','') ?>>
+ <span class="slider round"></span>
+ </label>
+ </th>
+ </tr>
+ </table>
+
+ <?php if ($this->task->configModel->get('use_custom_login', '') == 'checked') : ?>
+ <?= $this->form->label(t('Login Link'), 'login_link') ?>
+ <?= $this->form->text('login_link', $values, $errors, array('placeholder="https://example.kanboard.org/"')) ?>
+ <p class="form-help login-link-desc"><?= e('Example: <code>https://example.kanboard.org/</code> (used as logo link on login page)') ?></p>
+ <?= $this->form->label(t('Login Background Image URL'), 'background_url') ?>
+ <?= $this->form->text('background_url', $values, $errors, array('placeholder="https://source.unsplash.com/random"')) ?>
+ <p class="form-help background-img-link-desc"><?= e('Example: <code>https://source.unsplash.com/random</code> (URL for a background image on the login page, centered, autoscale, no-repeat)') ?></p>
+ <?= $this->form->label(t('Login page note'), 'login_note') ?>
+ <?= $this->form->textarea('login_note', $values, $errors, array('placeholder="Welcome to Kanboard!"')) ?>
+ <p class="form-help login-note-desc"><?= e('Hint: Use HTML formatting to customize your note further.') ?></p>
+ <div class="column-100">
+ <table>
+ <tr>
+ <th>
+ <strong><?= t('Login Page Background Color') ?></strong>
+ </th>
+ <th>
+ <input id="loginbackground_color" class="color" name="loginbackground_color" value="<?= $this->task->configModel->get('loginbackground_color','#ffffff') ?>">
+ </th>
+ </tr>
+ <tr>
+ <th>
+ <strong><?= t('Login Panel Shadow Color') ?></strong>
+ </th>
+ <th>
+ <input id="login_shadow_color" class="color" name="login_shadow_color" value="<?= $this->task->configModel->get('login_shadow_color','#333') ?>">
+ </th>
+ </tr>
+ <tr>
+ <th>
+ <strong><?= t('Login Panel Border Color') ?></strong>
+ </th>
+ <th>
+ <input id="login_border_color" class="color" name="login_border_color" value="<?= $this->task->configModel->get('login_border_color','#ffffff') ?>">
+ </th>
+ </tr>
+ <tr>
+ <th>
+ <strong><?= t('Login Panel Border Thickness') ?></strong>
+ </th>
+ <th>
+ <input id="login_border" type="range" name="login_border" min="0" max="10" value="<?= $this->task->configModel->get('login_border','0') ?>">
+ </th>
+ </tr>
+ <tr>
+ <th>
+ <strong><?= t('Login Panel Color') ?></strong>
+ </th>
+ <th>
+ <input id="loginpanel_color" class="color" name="loginpanel_color" value="<?= $this->task->configModel->get('loginpanel_color','#ffffff') ?>">
+ </th>
+ </tr>
+ <tr>
+ <th>
+ <strong><?= t('Login Panel Shadow Intensity') ?></strong>
+ </th>
+ <th>
+ <input id="login_shadow" type="range" name="login_shadow" min="0" max="20" value="<?= $this->task->configModel->get('login_shadow','0') ?>">
+ </th>
+ </tr>
+ <tr>
+ <th>
+ <strong><?= t('Login Button Background Color') ?></strong>
+ </th>
+ <th>
+ <input id="login_btn_color" class="color" name="login_btn_color" value="<?= $this->task->configModel->get('login_btn_color','#3079ed') ?>">
+ </th>
+ </tr>
+ <tr>
+ <th>
+ <strong><?= t('Login Button Shadow Color') ?></strong>
+ </th>
+ <th>
+ <input id="login_btn_shadow_color" class="color" name="login_btn_shadow_color" value="<?= $this->task->configModel->get('login_btn_shadow_color','#333') ?>">
+ </th>
+ </tr>
+ <tr>
+ <th>
+ <strong><?= t('Login Button Border Color') ?></strong>
+ </th>
+ <th>
+ <input id="login_btn_border_color" class="color" name="login_btn_border_color" value="<?= $this->task->configModel->get('login_btn_border_color','transparent') ?>">
+ </th>
+ </tr>
+ <tr>
+ <th>
+ <strong><?= t('Login Button Shade Color') ?></strong>
+ </th>
+ <th>
+ <input id="login_btn_shade_color" class="color" name="login_btn_shade_color" value="<?= $this->task->configModel->get('login_btn_shade_color','transparent') ?>">
+ </th>
+ </tr>
+ <tr>
+ <th>
+ <strong><?= t('Login Button Font Color') ?></strong>
+ </th>
+ <th>
+ <input id="login_btn_font_color" class="color" name="login_btn_font_color" value="<?= $this->task->configModel->get('login_btn_font_color','#ffffff') ?>">
+ </th>
+ </tr>
+ <tr>
+ <th>
+ <strong><?= t('Login Button Shadow Intensity') ?></strong>
+ </th>
+ <th>
+ <input id="login_btn_shadow" type="range" name="login_btn_shadow" min="0" max="20" value="<?= $this->task->configModel->get('login_btn_shadow','0') ?>">
+ </th>
+ </tr>
+ <tr>
+ <th>
+ <strong><?= t('Login Button Border Thickness') ?></strong>
+ </th>
+ <th>
+ <input id="login_btn_border" type="range" name="login_btn_border" min="0" max="10" value="<?= $this->task->configModel->get('login_btn_border','0') ?>">
+ </th>
+ </tr>
+ <tr>
+ <th>
+ <strong><?= t('Login Button Width') ?></strong>
+ </th>
+ <th>
+ <input id="login_btn_width" type="range" name="login_btn_width" min="95" max="300" value="<?= $this->task->configModel->get('login_btn_width','95') ?>">
+ </th>
+ </tr>
+ </table>
+ <p class="alert" style="max-width: 1000px;"><?= t('Changes must be saved in order to take effect.') ?> <button type="submit" name="save" value="save" class="btn btn-blue" style="float: right;margin-top: -6px;"><?= t('Save') ?></button></p>
+ <div class="panel" id="preview" style="background: url('<?= $customizer['backURL'] ?>') no-repeat center center;background-size: cover;height: 700px;max-width: 1000px;background-color: <?= $customizer['backColor'] ?>;">
+ <div>
+ <p style="color: #f5f5f5;"><?= t('Preview') ?></p>
+ </div>
+ <div id="preview-form-login" class="preview-form-login">
+ <?php if ($customizer['loginCheck']): ?>
+ <?= $this->url->link('<img src="' . $this->url->href('CustomizerFileController', 'loginlogo_setting', array('plugin' => 'customizer')) . '" height="' . $customizer['logoSize'] . '">', 'CustomizerFileController', 'link', array('plugin' => 'customizer')) ?>
+ <?php else: ?>
+ <?= $this->url->link('K<span>B</span>', 'DashboardController', 'show', array(), false, '', t('Dashboard')) ?>
+ <?php endif ?>
+
+ <label for="form-username"></label>
+ <input type="text" name="username" placeholder="<?= t('Enter your username') ?>" style="
+ border-radius: 5px;
+ ">
+ <span class="preview-form-required"></span>
+ <label for="form-password"></label>
+ <input type="password" name="password" placeholder="<?= t('Enter your password') ?>" style="
+ border-radius: 5px;
+ ">
+ <span class="preview-form-required"></span>
+ <label style="color:grey"><input type="checkbox" name="remember_me" value="1" checked="checked" disabled>&nbsp; <?= t('Remember Me') ?></label>
+ <div style="margin-bottom: 10px !important;"></div>
+ <div class="preview-form-actions">
+ <button type="button" id="preview-login-btn" class="btn preview-login-btn"><?= t('Sign in') ?></button>
+ </div>
+ <?php if ($this->app->config('password_reset') == 1): ?>
+ <div class="reset-password">
+ <?= $this->url->link(t('Forgot password?'), 'PasswordResetController', 'create') ?>
+ </div>
+ <?php endif ?>
+ </div>
+ <div id="preview-form-note" class="preview-form-note">
+ <div class="login-note">
+ <?= $customizer['login_note'] ?>
+ </div>
+ </div>
+ </div>
+ </div>
+ <?php endif ?>
+ </div>
+ <button type="button" class="login-accordion"><i class="fa fa-refresh" aria-hidden="true"></i> <?= t('Manage Themes') ?></button>
+ <div class="login-accordian-panel mt-10">
+ <div class="panel header-logo-panel">
+ <h3 class="panel-title"><?= t('Global Themes') ?></h3>
+ <?= $this->form->label(t('Theme'), 'themeSelection') ?>
+ <?= $this->helper->themeHelper->reverseSelect('themeSelection', $customizer['themes'], $values, $errors) ?>
+ <p class="form-help theme-select"><?= e('This will be the theme selection for all users who have not chosen their own theme.') ?></p>
+ <div class="form-actions" style="margin-bottom: 50px">
+ <button type="submit" name="save" value="save" class="btn btn-blue"><?= t('Save') ?> </button><button type="submit" name="remove" value="remove" class="btn btn-red"><?= t('Remove') ?></button>
+ </div>
+ </div>
+ </form>
+
+ <form method="post" enctype="multipart/form-data" action="<?= $this->url->href('CustomizerConfigController', 'uploadcss', array('plugin' => 'customizer')) ?>">
+ <div class="panel header-logo-panel">
+ <h3 class="panel-title"><?= t('Upload a theme') ?></h3>
+ <input type="file" name="fileToUpload" id="fileToUpload">
+ <input type="submit" class="btn btn-blue" value="<?= t('Add Theme') ?>" name="submit">
+ </div>
+ </form>
+ <form method="post" enctype="multipart/form-data" action="<?= $this->url->href('CustomizerConfigController', 'resetUserThemes', array('plugin' => 'customizer')) ?>">
+ <div class="panel header-logo-panel">
+ <h3 class="panel-title"><?= t('Users themes option') ?></h3>
+ <input type="submit" class="btn btn-red" value="<?= t('Reset All Users Themes') ?>" name="submit">
+ </div>
+ </form>
+ <form method="post" enctype="multipart/form-data" action="<?= $this->url->href('CustomizerConfigController', 'enableDisableThemes', array('plugin' => 'customizer')) ?>">
+ <div class="panel header-logo-panel">
+ <h3 class="panel-title"><?= t('Toggle Users themes') ?></h3>
+ <?php if ($this->task->configModel->get('toggle_user_themes', 'disable') == 'disable') : ?>
+ <input type="submit" class="btn btn-blue" value="<?= t('Enable Users Themes') ?>" name="submit">
+ <?php else :?>
+ <input type="submit" class="btn btn-red" value="<?= t('Disable Users Themes') ?>" name="submit">
+ <?php endif ?>
+ </div>
+ </form>
+
+
+ </div>
+
+ <button type="button" class="login-accordion"><i class="fa fa-magic" aria-hidden="true"></i> <?= t('Theme Creator') ?></button>
+ <div class="login-accordian-panel mt-10">
+ <?= $this->hook->render('customizer:config:themecreator') ?>
+ </div>
+ </div>
+</fieldset>
diff --git a/plugins/Customizer/Template/file/upload_flavicon.php b/plugins/Customizer/Template/file/upload_flavicon.php
new file mode 100644
index 00000000..b0e8988c
--- /dev/null
+++ b/plugins/Customizer/Template/file/upload_flavicon.php
@@ -0,0 +1,22 @@
+<div class="page-header">
+ <h2><?= t('Favicon') ?></h2>
+ <br>
+ <?= t('Recommend 50x50 pixels, *.png only, max size 20kb.') ?>
+</div>
+
+<?= $this->app->component('file-upload', array(
+ 'maxSize' => 20000,
+ 'url' => $this->url->to('CustomizerFileController', 'save', array('plugin' => 'customizer', 'custom_id' => 2)),
+ 'labelDropzone' => t('Drag and drop your file here'),
+ 'labelOr' => t('or'),
+ 'labelChooseFiles' => t('choose file'),
+ 'labelOversize' => t('The maximum allowed file size is %sB.', $this->text->bytes(20000)),
+ 'labelSuccess' => t('File has been uploaded successfully.'),
+ 'labelCloseSuccess' => t('Close this window'),
+ 'labelUploadError' => t('Unable to upload this file.'),
+)) ?>
+
+<?= $this->modal->submitButtons(array(
+ 'submitLabel' => t('Upload Favicon'),
+ 'disabled' => true,
+)) ?>
diff --git a/plugins/Customizer/Template/file/upload_loginlogo.php b/plugins/Customizer/Template/file/upload_loginlogo.php
new file mode 100644
index 00000000..fa715f36
--- /dev/null
+++ b/plugins/Customizer/Template/file/upload_loginlogo.php
@@ -0,0 +1,22 @@
+<div class="page-header">
+ <h2><?= t('Login Logo') ?></h2>
+ <br>
+ <?= t('Recommend 100 pixels in height, *.png, *.jpg, *.gif, max size 500kb.') ?>
+</div>
+
+<?= $this->app->component('file-upload', array(
+ 'maxSize' => 500000,
+ 'url' => $this->url->to('CustomizerFileController', 'save', array('plugin' => 'customizer', 'custom_id' => 3)),
+ 'labelDropzone' => t('Drag and drop your file here'),
+ 'labelOr' => t('or'),
+ 'labelChooseFiles' => t('choose file'),
+ 'labelOversize' => t('The maximum allowed file size is %sB.', $this->text->bytes(500000)),
+ 'labelSuccess' => t('File has been uploaded successfully.'),
+ 'labelCloseSuccess' => t('Close this window'),
+ 'labelUploadError' => t('Unable to upload this file.'),
+)) ?>
+
+<?= $this->modal->submitButtons(array(
+ 'submitLabel' => t('Upload Login Logo'),
+ 'disabled' => true,
+)) ?>
diff --git a/plugins/Customizer/Template/file/upload_logo.php b/plugins/Customizer/Template/file/upload_logo.php
new file mode 100644
index 00000000..0dae640c
--- /dev/null
+++ b/plugins/Customizer/Template/file/upload_logo.php
@@ -0,0 +1,22 @@
+<div class="page-header">
+ <h2><?= t('Header Logo') ?></h2>
+ <br>
+ <?= t('Recommend 100 pixels in width, *.png, *.jpg, *.gif, max size 500kb.') ?>
+</div>
+
+<?= $this->app->component('file-upload', array(
+ 'maxSize' => 500000,
+ 'url' => $this->url->to('CustomizerFileController', 'save', array('plugin' => 'customizer', 'custom_id' => 1)),
+ 'labelDropzone' => t('Drag and drop your file here'),
+ 'labelOr' => t('or'),
+ 'labelChooseFiles' => t('choose file'),
+ 'labelOversize' => t('The maximum allowed file size is %sB.', $this->text->bytes(500000)),
+ 'labelSuccess' => t('File has been uploaded successfully.'),
+ 'labelCloseSuccess' => t('Close this window'),
+ 'labelUploadError' => t('Unable to upload this file.'),
+)) ?>
+
+<?= $this->modal->submitButtons(array(
+ 'submitLabel' => t('Upload Header Logo'),
+ 'disabled' => true,
+)) ?>
diff --git a/plugins/Customizer/Template/header/title.php b/plugins/Customizer/Template/header/title.php
new file mode 100644
index 00000000..5080c9be
--- /dev/null
+++ b/plugins/Customizer/Template/header/title.php
@@ -0,0 +1,24 @@
+<h1>
+ <?php if (null !== $this->task->customizerFileModel->getByType(1)) : ?>
+ <span class="logo">
+ <a href="<?= $this->url->href('DashboardController', 'show', array(), false, '', t('Dashboard')) ?>">
+ <img src="<?= $this->url->href('CustomizerFileController', 'image', array('plugin' => 'customizer', 'file_id' => $this->task->customizerFileModel->getIdByType(1))) ?>" height="<?= $this->task->configModel->get('headerlogo_size', '30') ?>">
+ </a>
+ </span>
+ <?php else: ?>
+ <span class="logo">
+ <?= $this->url->link('K<span>B</span>', 'DashboardController', 'show', array(), false, '', t('Dashboard')) ?>
+ </span>
+ <?php endif ?>
+
+ <span class="title">
+ <?php if (! empty($project) && ! empty($task)): ?>
+ <?= $this->url->link($this->text->e($project['name']), 'BoardViewController', 'show', array('project_id' => $project['id'])) ?>
+ <?php else: ?>
+ <?= $this->text->e($title) ?>
+ <?php endif ?>
+ </span>
+ <?php if (! empty($description)): ?>
+ <?= $this->app->tooltipHTML($description) ?>
+ <?php endif ?>
+</h1>
diff --git a/plugins/Customizer/Template/header/title_older_kb.php b/plugins/Customizer/Template/header/title_older_kb.php
new file mode 100644
index 00000000..a38ff323
--- /dev/null
+++ b/plugins/Customizer/Template/header/title_older_kb.php
@@ -0,0 +1,26 @@
+<h1>
+ <?php if (null !== $this->task->customizerFileModel->getByType(1)) : ?>
+ <span class="logo">
+ <a href="<?= $this->url->href('DashboardController', 'show', array(), false, '', t('Dashboard')) ?>">
+ <img src="<?= $this->url->href('CustomizerFileController', 'image', array('plugin' => 'customizer', 'file_id' => $this->task->customizerFileModel->getIdByType(1))) ?>" height="<?= $this->task->configModel->get('headerlogo_size', '30') ?>">
+ </a>
+ </span>
+ <?php else: ?>
+ <span class="logo">
+ <?= $this->url->link('K<span>B</span>', 'DashboardController', 'show', array(), false, '', t('Dashboard')) ?>
+ </span>
+ <?php endif ?>
+
+ <span class="title">
+ <?php if (! empty($project) && ! empty($task)): ?>
+ <?= $this->url->link($this->text->e($project['name']), 'BoardViewController', 'show', array('project_id' => $project['id'])) ?>
+ <?php else: ?>
+ <?= $this->text->e($title) ?>
+ <?php endif ?>
+ </span>
+ <?php if (! empty($description)): ?>
+ <small class="tooltip" title="<?= $this->text->markdownAttribute($description) ?>">
+ <i class="fa fa-info-circle"></i>
+ </small>
+ <?php endif ?>
+</h1>
diff --git a/plugins/Customizer/Template/header/user_dropdown.php b/plugins/Customizer/Template/header/user_dropdown.php
new file mode 100644
index 00000000..d302924f
--- /dev/null
+++ b/plugins/Customizer/Template/header/user_dropdown.php
@@ -0,0 +1,45 @@
+<div class="dropdown">
+ <a href="#" class="dropdown-menu dropdown-menu-link-icon" style="display:flex;position:relative;align-items:center;flex-direction:row;"><?= $this->helper->dynamicAvatar->currentUserDynamic('avatar-inline') ?><i class="fa fa-caret-down"></i></a>
+ <ul>
+ <li class="no-hover"><strong><?= $this->text->e($this->user->getFullname()) ?></strong></li>
+ <li>
+ <?= $this->url->icon('tachometer', t('My dashboard'), 'DashboardController', 'show', array('user_id' => $this->user->getId())) ?>
+ </li>
+ <li>
+ <?= $this->url->icon('home', t('My profile'), 'UserViewController', 'show', array('user_id' => $this->user->getId())) ?>
+ </li>
+ <li>
+ <?= $this->url->icon('folder', t('Projects management'), 'ProjectListController', 'show') ?>
+ </li>
+ <?php if ($this->user->hasAccess('UserListController', 'show')): ?>
+ <li>
+ <?= $this->url->icon('user', t('Users management'), 'UserListController', 'show') ?>
+ </li>
+ <li>
+ <?= $this->url->icon('group', t('Groups management'), 'GroupListController', 'index') ?>
+ </li>
+ <li>
+ <?= $this->url->icon('cubes', t('Plugins'), 'PluginController', 'show') ?>
+ </li>
+ <li>
+ <?= $this->url->icon('cog', t('Settings'), 'ConfigController', 'index') ?>
+ </li>
+ <?php endif ?>
+
+ <?= $this->hook->render('template:header:dropdown') ?>
+
+ <li>
+ <i class="fa fa-fw fa-life-ring" aria-hidden="true"></i>
+ <?= $this->url->doc(t('Documentation'), 'index') ?>
+ </li>
+ <?php if (! DISABLE_LOGOUT): ?>
+ <li>
+ <?= $this->url->icon('sign-out', t('Logout'), 'AuthController', 'logout') ?>
+ </li>
+ <?php endif ?>
+ </ul>
+</div>
+<style>
+.avatar-dyn img, .avatar-dyn div {border-radius: <?= $this->task->configModel->get('av_radius', '50') ?>%}
+.avatar-dyn .avatar-letter {line-height:<?= $this->task->configModel->get('av_size', '20') ?>px;width:<?= $this->task->configModel->get('av_size', '20') ?>px;font-size:<?= $this->task->configModel->get('av_size', '20') / 2 ?>px;}
+</style>
diff --git a/plugins/Customizer/Template/layout/index.php b/plugins/Customizer/Template/layout/index.php
new file mode 100644
index 00000000..587b3e04
--- /dev/null
+++ b/plugins/Customizer/Template/layout/index.php
@@ -0,0 +1,47 @@
+<div class="form-login">
+
+ <?= $this->hook->render('template:auth:login-form:before') ?>
+
+ <?php if (isset($errors['login'])): ?>
+ <p class="alert alert-error"><?= $this->text->e($errors['login']) ?></p>
+ <?php endif ?>
+
+ <?php if (! HIDE_LOGIN_FORM): ?>
+ <form method="post" action="<?= $this->url->href('AuthController', 'check') ?>">
+
+ <?= $this->form->csrf() ?>
+
+ <?= $this->form->label(t('Username'), 'username') ?>
+ <?= $this->form->text('username', $values, $errors, array('autofocus', 'required', 'placeholder="Enter your username"')) ?>
+
+ <?= $this->form->label(t('Password'), 'password') ?>
+ <?= $this->form->password('password', $values, $errors, array('required', 'placeholder="Enter your password"')) ?>
+
+ <?php if (isset($captcha) && $captcha): ?>
+ <?= $this->form->label(t('Enter the text below'), 'captcha') ?>
+ <img src="<?= $this->url->href('CaptchaController', 'image') ?>" alt="Captcha">
+ <?= $this->form->text('captcha', array(), $errors, array('required')) ?>
+ <?php endif ?>
+
+ <?php if (REMEMBER_ME_AUTH == true): ?>
+ <?= $this->form->checkbox('remember_me', t('Remember Me'), 1, true) ?>
+ <div class="mb-10"></div>
+ <?php else: ?>
+ <div class="mb-15"></div>
+ <?php endif ?>
+
+ <div class="form-actions">
+ <button type="submit" class="btn login-btn"><?= t('Sign in') ?></button>
+ </div>
+ <?php if ($this->app->config('password_reset') == 1): ?>
+ <div class="reset-password">
+ <?= $this->url->link(t('Forgot password?'), 'PasswordResetController', 'create') ?>
+ </div>
+ <?php endif ?>
+ </form>
+ <?php endif ?>
+
+ <?= $this->hook->render('template:auth:login-form:after') ?>
+</div>
+
+<?= $this->hook->render('template:auth:login-form:newbox') ?>
diff --git a/plugins/Customizer/Template/layout/layout.php b/plugins/Customizer/Template/layout/layout.php
new file mode 100644
index 00000000..e5b4b772
--- /dev/null
+++ b/plugins/Customizer/Template/layout/layout.php
@@ -0,0 +1,85 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width">
+ <meta name="mobile-web-app-capable" content="yes">
+ <meta name="robots" content="noindex,nofollow">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <meta name="referrer" content="no-referrer">
+
+ <?php if (isset($board_public_refresh_interval)): ?>
+ <meta http-equiv="refresh" content="<?= $board_public_refresh_interval ?>">
+ <?php endif ?>
+
+ <?= $this->asset->colorCss() ?>
+ <?= $this->asset->css('assets/css/vendor.min.css') ?>
+ <?= $this->asset->css('assets/css/app.min.css') ?>
+ <?php if (file_exists('assets/css/print.min.css')) :?>
+ <?= $this->asset->css('assets/css/print.min.css', true, 'print') ?>
+ <?php endif ?>
+ <?= $this->asset->customCss() ?>
+
+ <?php if (! isset($not_editable)): ?>
+ <?= $this->asset->js('assets/js/vendor.min.js') ?>
+ <?= $this->asset->js('assets/js/app.min.js') ?>
+ <?php endif ?>
+
+ <?= $this->hook->asset('css', 'template:layout:css') ?>
+ <?= $this->hook->asset('js', 'template:layout:js') ?>
+ <?php if (null !== $this->task->customizerFileModel->getByType(2)) : ?>
+ <link rel="icon" type="image/png" href="<?= $this->url->href('CustomizerFileController', 'image', array('plugin' => 'customizer', 'file_id' => $this->task->customizerFileModel->getIdByType(2))) ?>">
+ <link rel="apple-touch-icon" href="<?= $this->url->href('CustomizerFileController', 'image', array('plugin' => 'customizer', 'file_id' => $this->task->customizerFileModel->getIdByType(2))) ?>">
+ <link rel="apple-touch-icon" sizes="72x72" href="<?= $this->url->href('CustomizerFileController', 'image', array('plugin' => 'customizer', 'file_id' => $this->task->customizerFileModel->getIdByType(2))) ?>">
+ <link rel="apple-touch-icon" sizes="114x114" href="<?= $this->url->href('CustomizerFileController', 'image', array('plugin' => 'customizer', 'file_id' => $this->task->customizerFileModel->getIdByType(2))) ?>">
+ <link rel="apple-touch-icon" sizes="144x144" href="<?= $this->url->href('CustomizerFileController', 'image', array('plugin' => 'customizer', 'file_id' => $this->task->customizerFileModel->getIdByType(2))) ?>">
+ <?php else: ?>
+ <link rel="icon" type="image/png" href="<?= $this->url->dir() ?>assets/img/favicon.png">
+ <link rel="apple-touch-icon" href="<?= $this->url->dir() ?>assets/img/touch-icon-iphone.png">
+ <link rel="apple-touch-icon" sizes="72x72" href="<?= $this->url->dir() ?>assets/img/touch-icon-ipad.png">
+ <link rel="apple-touch-icon" sizes="114x114" href="<?= $this->url->dir() ?>assets/img/touch-icon-iphone-retina.png">
+ <link rel="apple-touch-icon" sizes="144x144" href="<?= $this->url->dir() ?>assets/img/touch-icon-ipad-retina.png">
+ <?php endif ?>
+
+
+ <title>
+ <?php if (isset($page_title)): ?>
+ <?= $this->text->e($page_title) ?>
+ <?php elseif (isset($title)): ?>
+ <?= $this->text->e($title) ?>
+ <?php else: ?>
+ Kanboard
+ <?php endif ?>
+ </title>
+
+ <?= $this->hook->render('template:layout:head') ?>
+ </head>
+ <body data-status-url="<?= $this->url->href('UserAjaxController', 'status') ?>"
+ data-login-url="<?= $this->url->href('AuthController', 'login') ?>"
+ data-keyboard-shortcut-url="<?= $this->url->href('DocumentationController', 'shortcuts') ?>"
+ data-timezone="<?= $this->app->getTimezone() ?>"
+ data-js-lang="<?= $this->app->jsLang() ?>"
+ data-js-date-format="<?= $this->app->getJsDateFormat() ?>"
+ data-js-time-format="<?= $this->app->getJsTimeFormat() ?>"
+ data-js-modal-close-msg="<?= t('Close window?\\n\\nChanges that you made have not been saved.') ?>"
+ >
+
+ <?php if (isset($no_layout) && $no_layout): ?>
+ <?= $this->app->flashMessage() ?>
+ <?= $content_for_layout ?>
+ <?php else: ?>
+ <?= $this->hook->render('template:layout:top') ?>
+ <?= $this->render('header', array(
+ 'title' => $title,
+ 'description' => isset($description) ? $description : '',
+ 'board_selector' => isset($board_selector) ? $board_selector : array(),
+ 'project' => isset($project) ? $project : array(),
+ )) ?>
+ <section class="page">
+ <?= $this->app->flashMessage() ?>
+ <?= $content_for_layout ?>
+ </section>
+ <?= $this->hook->render('template:layout:bottom') ?>
+ <?php endif ?>
+ </body>
+</html>
diff --git a/plugins/Customizer/Template/layout/login_no_custom.php b/plugins/Customizer/Template/layout/login_no_custom.php
new file mode 100644
index 00000000..7e7cbd54
--- /dev/null
+++ b/plugins/Customizer/Template/layout/login_no_custom.php
@@ -0,0 +1,21 @@
+<?php global $customizer; ?>
+<?php if ($customizer['loginCheck']): ?>
+<?= $this->url->link('<img src="' . $this->url->href('CustomizerFileController', 'loginlogo', array('plugin' => 'customizer')) . '" height="' . $customizer['logoSize'] . '">', 'CustomizerFileController', 'link', array('plugin' => 'customizer')) ?>
+<?php endif ?>
+<?php
+if (function_exists('session_exists')) {
+if (session_exists('redirectAfterLogin') && ! filter_var(session_get('redirectAfterLogin'), FILTER_VALIDATE_URL)) {
+ $redirect = session_get('redirectAfterLogin');
+ if (strpos($redirect, 'Customizer') !== false) {
+ session_remove('redirectAfterLogin');
+ }
+}
+} else {
+if (isset($this->task->sessionStorage->redirectAfterLogin) && ! empty($this->task->sessionStorage->redirectAfterLogin) && ! filter_var($this->task->sessionStorage->redirectAfterLogin, FILTER_VALIDATE_URL)) {
+ $redirect = $this->task->sessionStorage->redirectAfterLogin;
+ if (strpos($redirect, 'Customizer') !== false) {
+ unset($this->task->sessionStorage->redirectAfterLogin);
+ }
+}
+}
+?>
diff --git a/plugins/Customizer/Template/layout/login_with_custom.php b/plugins/Customizer/Template/layout/login_with_custom.php
new file mode 100644
index 00000000..1ca70d77
--- /dev/null
+++ b/plugins/Customizer/Template/layout/login_with_custom.php
@@ -0,0 +1,128 @@
+<?php global $customizer; ?>
+<?php if ($customizer['loginCheck']): ?>
+<?= $this->url->link('<img src="' . $this->url->href('CustomizerFileController', 'loginlogo', array('plugin' => 'customizer')) . '" height="' . $customizer['logoSize'] . '">', 'CustomizerFileController', 'link', array('plugin' => 'customizer')) ?>
+<?php endif ?>
+<style>
+body {
+ background: url("<?= $customizer['backURL'] ?>") no-repeat center center fixed;
+ background-size: cover;
+ background-color: <?= $customizer['backColor'] ?>;
+}
+.mb-10 {
+ margin-bottom: 10px !important;
+}
+.mb-15 {
+ margin-bottom: 15px !important;
+}
+
+.form-login > a > img {
+ display: block;
+ margin: auto;
+ padding-top: 10px
+} /* This aligns the logo to the text. Adds padding to top of logo. */
+
+.form-login {
+ background-color: <?= $customizer['loginpanel_color'] ?>;
+ -webkit-box-shadow: 0px 0px <?= $customizer['login_shadow'] ?>px <?= $customizer['login_shadow'] * .1 ?>px <?= $customizer['login_shadow_color'] ?>;
+ -moz-box-shadow: 0px 0px <?= $customizer['login_shadow'] ?>px <?= $customizer['login_shadow'] * .1 ?>px <?= $customizer['login_shadow_color'] ?>;
+ box-shadow: 0px 0px <?= $customizer['login_shadow'] ?>px <?= $customizer['login_shadow'] * .1 ?>px <?= $customizer['login_shadow_color'] ?>;
+ padding: 10px;
+ border: <?= $customizer['login_border'] ?>px solid <?= $customizer['login_border_color'] ?>;
+ border-radius: 5px;
+ max-width: max-content;
+ text-align: center;
+}
+.login-btn {
+ width: <?= $customizer['login_btn_width'] ?>px;
+ -webkit-box-shadow: 0px 0px <?= $customizer['login_btn_shadow'] ?>px <?= $customizer['login_btn_shadow'] * .1 ?>px <?= $customizer['login_btn_shadow_color'] ?>;
+ -moz-box-shadow: 0px 0px <?= $customizer['login_btn_shadow'] ?>px <?= $customizer['login_btn_shadow'] * .1 ?>px <?= $customizer['login_btn_shadow_color'] ?>;
+ box-shadow: 0px 0px <?= $customizer['login_btn_shadow'] ?>px <?= $customizer['login_btn_shadow'] * .1 ?>px <?= $customizer['login_btn_shadow_color'] ?>;
+ border: <?= $customizer['login_btn_border'] ?>px solid <?= $customizer['login_btn_border_color'] ?>;
+ background: <?= $customizer['login_btn_color'] ?>;
+ color: <?= $customizer['login_btn_font_color'] ?>;
+ background-image: linear-gradient(-180deg, <?= $customizer['login_btn_color'] ?> 0%, <?= $customizer['login_btn_shade_color'] ?> 90%);
+ border-radius: 5px;
+ }
+.login-btn:hover, .login-btn:focus {
+ border-color: <?= $customizer['login_btn_border_color'] ?>;
+ background: <?= $customizer['login_btn_font_color'] ?>;
+ color: <?= $customizer['login_btn_color'] ?>;
+}
+/*------ MOVED FROM PLUGIN CSS FILE TO AVOID AFFECTING OTHER PARTS OF KANBOARD. STYLES SET HERE APPLY ONLY TO THE LOGIN PAGE. ------*/
+.form-actions {
+ text-align: center;
+ padding-top: unset;
+ padding-bottom: 10px;
+} /* This moves the login button to the centre of the box and removes the useless padding above the login button. Adds padding to bottom of login button. */
+
+label:nth-of-type(3n) {
+ color: grey;
+ text-align: center;
+} /* This makes the 'remember me' smaller and centralised*/
+
+.form-actions > .login-btn {
+ font-variant-caps: all-small-caps;
+ text-align: center;
+ transition: cubic-bezier(0.1, 0.75, 0.57, 1) 0.4s;
+ -webkit-transition: cubic-bezier(0.1, 0.75, 0.57, 1) 0.4s;
+} /* This makes the title text of the login button all capitals. Also adds smoothing when hover on the login button */
+
+label:nth-of-type(1) {
+ visibility: hidden;
+} /* This hides (to maintain the gap) the text of the labels */
+
+label:nth-of-type(2n) {
+ visibility: hidden;
+ margin-top: -5px;
+} /* This hides (to maintain the gap) the text of the labels and also reduces the top margin */
+
+input::-webkit-input-placeholder {
+ color: #000;
+ opacity: 1;
+ -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";
+} /* This styles the placeholder to emphasise it. Cross-browser compatibility */
+
+input::-moz-placeholder {
+ color: #000;
+ opacity: 1;
+ -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";
+} /* This styles the placeholder to emphasise it. Cross-browser compatibility */
+
+input:-ms-input-placeholder {
+ color: #000;
+ opacity: 1;
+ -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";
+} /* This styles the placeholder to emphasise it. Cross-browser compatibility */
+
+input::placeholder {
+ color: #000;
+ opacity: 1;
+ -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";
+} /* This styles the placeholder to emphasise it. Cross-browser compatibility */
+
+input[type="password"], input[type="text"]:not(.input-addon-field) {
+ margin: auto;
+ display: block;
+ border-radius: 5px;
+} /* This centralises the input fields and makes the borders consistent with the outer form */
+
+.form-required { display: none;} /* This removes the standard required asterisk */
+
+</style>
+<?php
+if (function_exists('session_exists')) {
+if (session_exists('redirectAfterLogin') && ! filter_var(session_get('redirectAfterLogin'), FILTER_VALIDATE_URL)) {
+ $redirect = session_get('redirectAfterLogin');
+ if (strpos($redirect, 'Customizer') !== false) {
+ session_remove('redirectAfterLogin');
+ }
+}
+} else {
+if (isset($this->task->sessionStorage->redirectAfterLogin) && ! empty($this->task->sessionStorage->redirectAfterLogin) && ! filter_var($this->task->sessionStorage->redirectAfterLogin, FILTER_VALIDATE_URL)) {
+ $redirect = $this->task->sessionStorage->redirectAfterLogin;
+ if (strpos($redirect, 'Customizer') !== false) {
+ unset($this->task->sessionStorage->redirectAfterLogin);
+ }
+}
+}
+?>
diff --git a/plugins/Customizer/Template/layout/note.php b/plugins/Customizer/Template/layout/note.php
new file mode 100644
index 00000000..b8454e64
--- /dev/null
+++ b/plugins/Customizer/Template/layout/note.php
@@ -0,0 +1,7 @@
+<?php global $customizer; ?>
+
+<div class="form-login">
+ <div class="login-note">
+ <?= $customizer['login_note'] ?>
+ </div>
+</div>
diff --git a/plugins/Customizer/Template/layout/preview_style.php b/plugins/Customizer/Template/layout/preview_style.php
new file mode 100644
index 00000000..fdd9576f
--- /dev/null
+++ b/plugins/Customizer/Template/layout/preview_style.php
@@ -0,0 +1,77 @@
+<?php global $customizer; ?>
+<style>
+.preview-form-login > a > img {
+ display: block;
+ margin: auto;
+ padding-top: 10px
+} /* This aligns the logo to the text. Adds padding to top of logo. */
+
+
+.preview-form-login, .preview-form-note {
+ background-color: <?= $customizer['loginpanel_color'] ?>;
+ -webkit-box-shadow: 0px 0px <?= $customizer['login_shadow'] ?>px <?= $customizer['login_shadow'] * .1 ?>px;
+ -moz-box-shadow: 0px 0px <?= $customizer['login_shadow'] ?>px <?= $customizer['login_shadow'] * .1 ?>px;
+ box-shadow: 0px 0px <?= $customizer['login_shadow'] ?>px <?= $customizer['login_shadow'] * .1 ?>px;
+ padding: 10px;
+ border: <?= $customizer['login_border'] ?>px solid <?= $customizer['login_border_color'] ?>;
+ border-radius: 5px;
+ text-align: center;
+ max-width: max-content;
+ margin: 5% auto 0;;
+}
+.preview-login-btn {
+ width: <?= $customizer['login_btn_width'] ?>px;
+ -webkit-box-shadow: 0px 0px <?= $customizer['login_btn_shadow'] ?>px <?= $customizer['login_btn_shadow'] * .1 ?>px <?= $customizer['login_btn_shadow_color'] ?>;
+ -moz-box-shadow: 0px 0px <?= $customizer['login_btn_shadow'] ?>px <?= $customizer['login_btn_shadow'] * .1 ?>px <?= $customizer['login_btn_shadow_color'] ?>;
+ box-shadow: 0px 0px <?= $customizer['login_btn_shadow'] ?>px <?= $customizer['login_btn_shadow'] * .1 ?>px <?= $customizer['login_btn_shadow_color'] ?>;
+ border: <?= $customizer['login_btn_border'] ?>px solid <?= $customizer['login_btn_border_color'] ?>;
+ background: <?= $customizer['login_btn_color'] ?>;
+ color: <?= $customizer['login_btn_font_color'] ?>;
+ background-image: linear-gradient(-180deg, transparent 0%, <?= $customizer['login_btn_shade_color'] ?> 90%);
+ border-radius: 5px;
+ }
+
+.preview-login-btn:hover, .preview-login-btn:focus {
+ border-color: <?= $customizer['login_btn_border_color'] ?>;
+ background: <?= $customizer['login_btn_font_color'] ?>;
+ color: <?= $customizer['login_btn_color'] ?>;
+ background-image: unset;
+}
+
+.preview-form-actions > .preview-login-btn {
+ font-variant-caps: all-small-caps;
+ text-align: center;
+ transition: cubic-bezier(0.1, 0.75, 0.57, 1) 0.4s;
+ -webkit-transition: cubic-bezier(0.1, 0.75, 0.57, 1) 0.4s;
+}
+
+
+.preview-form-actions {
+ text-align: center;
+ padding-top: unset;
+ padding-bottom: 10px;
+} /* This moves the login button to the centre of the box and removes the useless padding above the login button. Adds padding to bottom of login button. */
+
+
+
+.preview-form-required { display: none;} /* This removes the standard required asterisk */
+
+.avatar-preview img, .avatar-preview div {
+ border-radius: <?= $this->task->configModel->get('av_radius','50') ?>%;
+}
+.avatar-preview .avatar-letter {
+ line-height: <?= $this->task->configModel->get('av_size','20') ?>px;
+ width: <?= $this->task->configModel->get('av_size','20') ?>px;
+ font-size: <?= $this->task->configModel->get('av_size','20') / 2 ?>px;
+}
+
+.b-avatar-preview img, .b-avatar-preview div {
+ border-radius: <?= $this->task->configModel->get('b_av_radius','50') ?>%;
+}
+.b-avatar-preview .avatar-letter {
+ line-height: <?= $this->task->configModel->get('b_av_size','20') ?>px;
+ width: <?= $this->task->configModel->get('b_av_size','20') ?>px;
+ font-size: <?= $this->task->configModel->get('b_av_size','20') / 2 ?>px;
+}
+
+</style>
diff --git a/plugins/Customizer/Template/user_mod/show.php b/plugins/Customizer/Template/user_mod/show.php
new file mode 100644
index 00000000..a4fbaf96
--- /dev/null
+++ b/plugins/Customizer/Template/user_mod/show.php
@@ -0,0 +1,58 @@
+<?php
+global $customizer;
+$user_theme['themeSelection'] = $this->task->userMetadataModel->get($user['id'], 'themeSelection', $this->task->configModel->get('themeSelection', ''));
+?>
+
+<div class="page-header">
+ <h2><?= t('Edit user') ?></h2>
+</div>
+
+<form method="post" id="ts" action="<?= $this->url->href('CustomizerConfigController', 'usertheme', array('plugin' => 'customizer', 'user_id' => $user['id'])) ?>" autocomplete="off">
+ <?= $this->form->csrf() ?>
+ <?= $this->form->hidden('id', $values) ?>
+ <fieldset>
+ <legend><?= t('Themes') ?></legend>
+ <?= $this->form->label(t('User Theme'), 'themeSelection') ?>
+ <?= $this->helper->themeHelper->reverseSelectOnChange('themeSelection', $customizer['themes'], $user_theme, $errors) ?>
+ </fieldset>
+</form>
+
+<form method="post" action="<?= $this->url->href('UserModificationController', 'save', array('user_id' => $user['id'])) ?>" autocomplete="off">
+ <?= $this->form->csrf() ?>
+ <?= $this->form->hidden('id', $values) ?>
+
+ <fieldset>
+ <legend><?= t('Profile') ?></legend>
+ <?= $this->form->label(t('Username'), 'username') ?>
+ <?= $this->form->text('username', $values, $errors, array('autofocus', 'required', isset($values['is_ldap_user']) && $values['is_ldap_user'] == 1 && !$this->user->isAdmin() ? 'readonly' : '', 'maxlength="191"')) ?>
+
+ <?= $this->form->label(t('Name'), 'name') ?>
+ <?= $this->form->text('name', $values, $errors, array($this->user->hasAccess('UserModificationController', 'show/edit_name') ? '' : 'readonly')) ?>
+
+ <?= $this->form->label(t('Email'), 'email') ?>
+ <?= $this->form->email('email', $values, $errors, array($this->user->hasAccess('UserModificationController', 'show/edit_email') ? '' : 'readonly')) ?>
+ </fieldset>
+
+ <fieldset>
+ <legend><?= t('Preferences') ?></legend>
+ <?= $this->form->label(t('Timezone'), 'timezone') ?>
+ <?= $this->form->select('timezone', $timezones, $values, $errors, array($this->user->hasAccess('UserModificationController', 'show/edit_timezone') ? '' : 'disabled')) ?>
+
+ <?= $this->form->label(t('Language'), 'language') ?>
+ <?= $this->form->select('language', $languages, $values, $errors, array($this->user->hasAccess('UserModificationController', 'show/edit_language') ? '' : 'disabled')) ?>
+
+ <?= $this->form->label(t('Filter'), 'filter') ?>
+ <?= $this->form->text('filter', $values, $errors, array($this->user->hasAccess('UserModificationController', 'show/edit_filter') ? '' : 'readonly')) ?>
+ </fieldset>
+
+ <?php if ($this->user->isAdmin()): ?>
+ <fieldset>
+ <legend><?= t('Security') ?></legend>
+ <?= $this->form->label(t('Application role'), 'role') ?>
+ <?= $this->form->select('role', $roles, $values, $errors) ?>
+ </fieldset>
+ <?php endif ?>
+
+ <?= $this->modal->submitButtons() ?>
+</form>
+ \ No newline at end of file