Add autocomplete dropdown on comment subject and email fields
This commit is contained in:
@@ -6,7 +6,7 @@ New features:
|
|||||||
* Automatic action to assign tasks to its creator
|
* Automatic action to assign tasks to its creator
|
||||||
* Add the possibility to create a comment when a task is sent by email
|
* Add the possibility to create a comment when a task is sent by email
|
||||||
* Add dropdown menu to autocomplete email field from project members
|
* Add dropdown menu to autocomplete email field from project members
|
||||||
* Add configurable list of predefined subjects when sending a task by email
|
* Add configurable list of predefined subjects when sending a task or a a comment by email
|
||||||
|
|
||||||
Version 1.0.44 (May 28, 2017)
|
Version 1.0.44 (May 28, 2017)
|
||||||
-----------------------------
|
-----------------------------
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ class CommentMailController extends BaseController
|
|||||||
'errors' => $errors,
|
'errors' => $errors,
|
||||||
'task' => $task,
|
'task' => $task,
|
||||||
'project' => $project,
|
'project' => $project,
|
||||||
|
'members' => $this->projectPermissionModel->getMembersWithEmail($project['id']),
|
||||||
)));
|
)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<div class="page-header">
|
<div class="page-header">
|
||||||
<h2><?= t('Create and send a comment by email') ?></h2>
|
<h2><?= t('Create and send a comment by email') ?></h2>
|
||||||
</div>
|
</div>
|
||||||
<form method="post" action="<?= $this->url->href('CommentMailController', 'save', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?>" autocomplete="off">
|
<form method="post" action="<?= $this->url->href('CommentMailController', 'save', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?>" autocomplete="off" class="js-mail-form">
|
||||||
<?= $this->form->csrf() ?>
|
<?= $this->form->csrf() ?>
|
||||||
<?= $this->form->hidden('task_id', $values) ?>
|
<?= $this->form->hidden('task_id', $values) ?>
|
||||||
<?= $this->form->hidden('user_id', $values) ?>
|
<?= $this->form->hidden('user_id', $values) ?>
|
||||||
@@ -9,9 +9,39 @@
|
|||||||
<?= $this->form->label(t('Email'), 'email') ?>
|
<?= $this->form->label(t('Email'), 'email') ?>
|
||||||
<?= $this->form->email('email', $values, $errors, array('autofocus', 'required', 'tabindex="1"')) ?>
|
<?= $this->form->email('email', $values, $errors, array('autofocus', 'required', 'tabindex="1"')) ?>
|
||||||
|
|
||||||
|
<?php if (! empty($members)): ?>
|
||||||
|
<div class="dropdown">
|
||||||
|
<a href="#" class="dropdown-menu dropdown-menu-link-icon"><i class="fa fa-address-card-o"></i><i class="fa fa-caret-down"></i></a>
|
||||||
|
<ul>
|
||||||
|
<?php foreach ($members as $member): ?>
|
||||||
|
<li data-email="<?= $this->text->e($member['email']) ?>" class="js-autocomplete-email">
|
||||||
|
<?= $this->text->e($this->user->getFullname($member)) ?>
|
||||||
|
</li>
|
||||||
|
<?php endforeach ?>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<?php endif ?>
|
||||||
|
|
||||||
<?= $this->form->label(t('Subject'), 'subject') ?>
|
<?= $this->form->label(t('Subject'), 'subject') ?>
|
||||||
<?= $this->form->text('subject', $values, $errors, array('required', 'tabindex="2"')) ?>
|
<?= $this->form->text('subject', $values, $errors, array('required', 'tabindex="2"')) ?>
|
||||||
|
|
||||||
|
<?php if (! empty($project['predefined_email_subjects'])): ?>
|
||||||
|
<div class="dropdown">
|
||||||
|
<a href="#" class="dropdown-menu dropdown-menu-link-icon"><i class="fa fa-archive"></i><i class="fa fa-caret-down"></i></a>
|
||||||
|
<ul>
|
||||||
|
<?php foreach (explode("\r\n", trim($project['predefined_email_subjects'])) as $subject): ?>
|
||||||
|
<?php $subject = trim($subject); ?>
|
||||||
|
|
||||||
|
<?php if (! empty($subject)): ?>
|
||||||
|
<li data-subject="<?= $this->text->e($subject) ?>" class="js-autocomplete-subject">
|
||||||
|
<?= $this->text->e($subject) ?>
|
||||||
|
</li>
|
||||||
|
<?php endif ?>
|
||||||
|
<?php endforeach ?>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<?php endif ?>
|
||||||
|
|
||||||
<?= $this->form->textEditor('comment', $values, $errors, array('required' => true, 'tabindex' => 3)) ?>
|
<?= $this->form->textEditor('comment', $values, $errors, array('required' => true, 'tabindex' => 3)) ?>
|
||||||
|
|
||||||
<?= $this->modal->submitButtons(array(
|
<?= $this->modal->submitButtons(array(
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<div class="page-header">
|
<div class="page-header">
|
||||||
<h2><?= $this->text->e($task['title']) ?> > <?= t('Send by email') ?></h2>
|
<h2><?= $this->text->e($task['title']) ?> > <?= t('Send by email') ?></h2>
|
||||||
</div>
|
</div>
|
||||||
<form method="post" action="<?= $this->url->href('TaskMailController', 'send', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?>" autocomplete="off" class="js-task-mail-form">
|
<form method="post" action="<?= $this->url->href('TaskMailController', 'send', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?>" autocomplete="off" class="js-mail-form">
|
||||||
<?= $this->form->csrf() ?>
|
<?= $this->form->csrf() ?>
|
||||||
|
|
||||||
<?= $this->form->label(t('Email'), 'email') ?>
|
<?= $this->form->label(t('Email'), 'email') ?>
|
||||||
@@ -22,6 +22,7 @@
|
|||||||
|
|
||||||
<?= $this->form->label(t('Subject'), 'subject') ?>
|
<?= $this->form->label(t('Subject'), 'subject') ?>
|
||||||
<?= $this->form->text('subject', $values, $errors, array('required', 'tabindex="2"')) ?>
|
<?= $this->form->text('subject', $values, $errors, array('required', 'tabindex="2"')) ?>
|
||||||
|
|
||||||
<?php if (! empty($project['predefined_email_subjects'])): ?>
|
<?php if (! empty($project['predefined_email_subjects'])): ?>
|
||||||
<div class="dropdown">
|
<div class="dropdown">
|
||||||
<a href="#" class="dropdown-menu dropdown-menu-link-icon"><i class="fa fa-archive"></i><i class="fa fa-caret-down"></i></a>
|
<a href="#" class="dropdown-menu dropdown-menu-link-icon"><i class="fa fa-archive"></i><i class="fa fa-caret-down"></i></a>
|
||||||
|
|||||||
4
assets/js/app.min.js
vendored
4
assets/js/app.min.js
vendored
File diff suppressed because one or more lines are too long
@@ -1,25 +1,21 @@
|
|||||||
KB.onClick('.js-autocomplete-email', function (e) {
|
KB.onClick('.js-autocomplete-email', function (e) {
|
||||||
var email = KB.dom(e.target).data('email');
|
var email = KB.dom(e.target).data('email');
|
||||||
|
var emailField = KB.find('.js-mail-form input[type="email"]');
|
||||||
|
|
||||||
if (email) {
|
if (email && emailField) {
|
||||||
var emailField = KB.find('.js-task-mail-form input[type="email"]');
|
emailField.build().value = email;
|
||||||
|
|
||||||
if (emailField) {
|
|
||||||
emailField.attr('value', email);
|
|
||||||
_KB.controllers['Dropdown'].close();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_KB.controllers['Dropdown'].close();
|
||||||
});
|
});
|
||||||
|
|
||||||
KB.onClick('.js-autocomplete-subject', function (e) {
|
KB.onClick('.js-autocomplete-subject', function (e) {
|
||||||
var subject = KB.dom(e.target).data('subject');
|
var subject = KB.dom(e.target).data('subject');
|
||||||
|
var subjectField = KB.find('.js-mail-form input[name="subject"]');
|
||||||
|
|
||||||
if (subject) {
|
if (subject && subjectField) {
|
||||||
var subjectField = KB.find('.js-task-mail-form input[name="subject"]');
|
subjectField.build().value = subject;
|
||||||
|
|
||||||
if (subjectField) {
|
|
||||||
subjectField.attr('value', subject);
|
|
||||||
_KB.controllers['Dropdown'].close();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_KB.controllers['Dropdown'].close();
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -52,7 +52,11 @@ Kanboard.Dropdown.prototype.listen = function() {
|
|||||||
if ($(e.target).is('li')) {
|
if ($(e.target).is('li')) {
|
||||||
KB.trigger('dropdown.clicked');
|
KB.trigger('dropdown.clicked');
|
||||||
|
|
||||||
$(this).find('a:visible')[0].click(); // Calling native click() not the jQuery one
|
var element = $(this).find('a:visible');
|
||||||
|
|
||||||
|
if (element.length > 0) {
|
||||||
|
element[0].click(); // Calling native click() not the jQuery one
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user