Add edit E-mail template page.
This commit is contained in:
parent
17ef953a86
commit
60a108f377
10 changed files with 372 additions and 18 deletions
75
HACKING.rst
75
HACKING.rst
|
|
@ -205,6 +205,79 @@ openSUSE
|
|||
* Go to http://localhost:8080/libreplan-webapp/
|
||||
|
||||
|
||||
Microsoft Windows
|
||||
~~~~~~~~
|
||||
|
||||
* Download and install latest Java Development Kit 7u80 (JDK7u80)::
|
||||
|
||||
# http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html
|
||||
|
||||
* Download and install latest PostgreSQL database::
|
||||
|
||||
# http://www.enterprisedb.com/products-services-training/pgdownload#windows
|
||||
|
||||
* Download and install Git
|
||||
|
||||
# https://git-scm.com/download/win
|
||||
|
||||
* Download Maven
|
||||
|
||||
# https://maven.apache.org/download.cgi
|
||||
|
||||
.. WARNING::
|
||||
|
||||
Check if latest Maven version is compatible with your JDK
|
||||
|
||||
* Connect to database::
|
||||
|
||||
# Go to PostgreSQL bin folder and command window from here
|
||||
# psql -U postgres
|
||||
|
||||
* Use SQL sentences::
|
||||
|
||||
CREATE DATABASE libreplandev;
|
||||
CREATE DATABASE libreplandevtest;
|
||||
|
||||
CREATE USER libreplan WITH PASSWORD 'libreplan';
|
||||
|
||||
REVOKE ALL
|
||||
ON ALL TABLES IN SCHEMA public
|
||||
FROM PUBLIC;
|
||||
|
||||
GRANT ALL PRIVILEGES ON DATABASE libreplan TO libreplan;
|
||||
|
||||
GRANT SELECT, INSERT, UPDATE, DELETE
|
||||
ON ALL TABLES IN SCHEMA public
|
||||
TO libreplan;
|
||||
|
||||
* Restore PostgreSQL dump - scripts/database/postgresql_1.4.1.backup
|
||||
|
||||
* Download source code::
|
||||
|
||||
# Open GitBash
|
||||
# git clone https://github.com/LibrePlan/libreplan.git
|
||||
|
||||
* Set JAVA_HOME environment variable::
|
||||
|
||||
# You need to set it to your JDK installed directory (e.g. C:\Program Files\Java\jdk1.7.0_80)
|
||||
|
||||
* Add path of unpacked distributions bin directory of Maven to 'Path' environment variable
|
||||
|
||||
# (e.g. C:\Program Files\apache-maven-3.3.3\bin)
|
||||
|
||||
* Compile project::
|
||||
|
||||
# cd libreplan
|
||||
# mvn clean install
|
||||
|
||||
* Launch application::
|
||||
|
||||
# cd libreplan-webapp
|
||||
# mvn jetty:run
|
||||
|
||||
* Go to http://localhost:8080/libreplan-webapp/
|
||||
|
||||
|
||||
CutyCapt compilation
|
||||
--------------------
|
||||
|
||||
|
|
@ -466,4 +539,4 @@ For MySQL users here are specific instructions.
|
|||
* Launch application::
|
||||
|
||||
$ cd libreplan-webapp/
|
||||
$ mvn -Pdev,mysql jetty:run
|
||||
$ mvn -Pdev,mysql jetty:run
|
||||
77
INSTALL.rst
77
INSTALL.rst
|
|
@ -117,6 +117,11 @@ Instructions depending on the distribution:
|
|||
|
||||
If you have memory problems review the section `Fix memory errors`_.
|
||||
|
||||
Microsoft Windows
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
|
||||
|
||||
RPM Packages
|
||||
~~~~~~~~~~~~
|
||||
|
||||
|
|
@ -316,6 +321,78 @@ openSUSE
|
|||
|
||||
* Go to http://localhost:8080/libreplan/
|
||||
|
||||
Microsoft Windows
|
||||
~~~~~~~~~~~
|
||||
|
||||
Instructions:
|
||||
|
||||
* Download and install latest Java Runtime Environment 7u79 (JRE7u79)::
|
||||
|
||||
# http://www.oracle.com/technetwork/java/javase/downloads/jre7-downloads-1880261.html
|
||||
|
||||
* Download and install latest PostgreSQL database::
|
||||
|
||||
# http://www.enterprisedb.com/products-services-training/pgdownload#windows
|
||||
|
||||
* Download and install Apache Tomcat 6::
|
||||
|
||||
# http://tomcat.apache.org/download-60.cgi
|
||||
|
||||
.. NOTE::
|
||||
|
||||
In JDK folder there is JRE folder
|
||||
|
||||
* Set up JDBC41 PostgreSQL Driver::
|
||||
|
||||
# Download latest driver: https://jdbc.postgresql.org/download.html
|
||||
# Copy downloaded *.jar file to JRE location: (e.g. C:\Program Files\Java\jre7\lib\ext)
|
||||
|
||||
* Download latest ``.war`` file from SourceForge.net (for PostgreSQL) and rename it to libreplan.war::
|
||||
|
||||
# http://sourceforge.net/projects/libreplan/files/LibrePlan/
|
||||
|
||||
* Create database::
|
||||
|
||||
CREATE DATABASE libreplan;
|
||||
|
||||
* Use SQL sentences::
|
||||
|
||||
CREATE USER libreplan WITH PASSWORD 'libreplan';
|
||||
GRANT ALL PRIVILEGES ON DATABASE libreplan TO libreplan;
|
||||
|
||||
REVOKE ALL
|
||||
ON ALL TABLES IN SCHEMA public
|
||||
FROM PUBLIC;
|
||||
GRANT SELECT, INSERT, UPDATE, DELETE
|
||||
ON ALL TABLES IN SCHEMA public
|
||||
TO libreplan;
|
||||
|
||||
* Restore PostgreSQL dump - scripts/database/postgresql_1.4.1.backup::
|
||||
|
||||
* Create an Environment Variable JRE_HOME
|
||||
|
||||
# You need to set it to your JRE installed directory
|
||||
|
||||
* Configure Apache Tomcat Server
|
||||
|
||||
# Put libreplan.war file to Apache Tomcat webapps folder (e.g. C:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps\)
|
||||
# Go to localhost folder (e.g. C:\Program Files\Apache Software Foundation\Tomcat 6.0\conf\Catalina\localhost\) and create there libreplan.xml file with this lines of code:
|
||||
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Context antiJARLocking="true" path="">
|
||||
<Resource name="jdbc/libreplan-ds" auth="Container"
|
||||
type="javax.sql.DataSource"
|
||||
maxActive="100" maxIdle="30" maxWait="10000"
|
||||
username="libreplan" password="libreplan"
|
||||
driverClassName="org.postgresql.Driver"
|
||||
url="jdbc:postgresql://localhost/libreplan" />
|
||||
</Context>
|
||||
|
||||
* Start Apache Tomcat server
|
||||
|
||||
# Example location: C:\Program Files\Apache Software Foundation\Tomcat 6.0\bin\Tomcat6.exe
|
||||
|
||||
* Go to http://localhost:8080/libreplan
|
||||
|
||||
Logs
|
||||
----
|
||||
|
|
|
|||
101
doc/src/technical/howto-start-development-with-intellij-idea.rst
Normal file
101
doc/src/technical/howto-start-development-with-intellij-idea.rst
Normal file
|
|
@ -0,0 +1,101 @@
|
|||
How To Start Development With JetBrains Intellij IDEA
|
||||
======================================================
|
||||
|
||||
.. sectnum::
|
||||
|
||||
:Author: Perebykivskiy Vova
|
||||
:Contact: vova@libreplan-enterprise.com
|
||||
:Date: 09/09/2015
|
||||
:Copyright:
|
||||
Some rights reserved. This document is distributed under the Creative
|
||||
Commons Attribution-ShareAlike 3.0 licence, available in
|
||||
http://creativecommons.org/licenses/by-sa/3.0/.
|
||||
:Abstract:
|
||||
Quick guide to start the development of LibrePlan_ using JetBrains Intellij IDEA_ IDE.
|
||||
As this is the most common way of work among LibrePlan developers team.
|
||||
|
||||
.. contents:: Table of Contents
|
||||
|
||||
Download LibrePlan source code
|
||||
------------------------------
|
||||
|
||||
* You need to download LibrePlan_ source code to start hacking on it. You have two
|
||||
options:
|
||||
|
||||
a) Clone Git repository (recommended)::
|
||||
|
||||
git clone git://github.com/LibrePlan/libreplan.git
|
||||
|
||||
b) Download last version source code::
|
||||
|
||||
http://sourceforge.net/projects/libreplan/files/LibrePlan/libreplan_*.tar.gz
|
||||
|
||||
* Download latest libreplan_*.war file for your database (PostgreSQL or MySQL)
|
||||
|
||||
http://sourceforge.net/projects/libreplan/files/LibrePlan/
|
||||
|
||||
You should review ``HACKING`` file to check that you have installed all the
|
||||
requirements.
|
||||
|
||||
Import LibrePlan project
|
||||
------------------------
|
||||
* Run Intellij IDEA
|
||||
|
||||
* Select Import Project
|
||||
|
||||
* Select directory with source code of Libreplan
|
||||
|
||||
# e.g. C\Users\PC-User\IdeaProjects\libreplan
|
||||
|
||||
* Select *Import project from external model* > *Maven* and click *Next*
|
||||
|
||||
* Then leave all as default
|
||||
|
||||
* Then select profiles: dev and for PostgreSQL users - postgresql / Mysql users - mysql
|
||||
|
||||
* Then leave all by default
|
||||
|
||||
* Then choose your JDK
|
||||
|
||||
* Then define project name or leave default name
|
||||
|
||||
|
||||
Configure project to run
|
||||
------------------------
|
||||
|
||||
* Go to *Run* > *Edit Configurations...*
|
||||
|
||||
* Create a new *Maven Build* called *MavenConfig*
|
||||
|
||||
* Change the following values:
|
||||
|
||||
* Working directory: Choose ``libreplan-webapp`` folder in your workspace
|
||||
* Command line: ``jetty:stop jetty:run``
|
||||
* Profiles (optional): ``-userguide -reports -i18n``
|
||||
(to disable userguide,reports and i18n profiles to save compilation time
|
||||
as they are not mandatory to run LibrePlan)
|
||||
* Mark the following checkboxes (recommended):
|
||||
|
||||
* Resolve Workspace artifacts
|
||||
|
||||
* In "Before launch" section choose "+" and add Build Artifact (war file)
|
||||
|
||||
* Click *Run* and application will be available at
|
||||
http://localhost:8080/libreplan-webapp/
|
||||
|
||||
Develop LibrePlan in Intellij IDEA using MySQL
|
||||
----------------------------------------
|
||||
|
||||
* This tutorial works properly with PostgreSQL, but if you want to develop
|
||||
LibrePlan using MySQL you have to do 2 small changes:
|
||||
|
||||
* In section `Configure project to run`_ you have to set the *Profiles* to:
|
||||
``-dev -mysql -userguide -reports -i18n``
|
||||
|
||||
* Remember that the three last profiles that are being disabled is just to save
|
||||
compilation time and not mandatory. However, to develop using MySQL you have
|
||||
to set at least the first two: ``-dev`` and ``-mysql``.
|
||||
|
||||
|
||||
.. _LibrePlan: http://www.libreplan.com/
|
||||
.. _JetBrains Intellij IDEA: https://www.jetbrains.com/idea/
|
||||
|
|
@ -27,6 +27,7 @@ import static org.libreplan.business.i18n.I18nHelper._;
|
|||
*
|
||||
* @author Miciele Ghiorghis <m.ghiorghis@antoniusziekenhuis.nl>
|
||||
* @author Manuel Rego Casasnovas <rego@igalia.com>
|
||||
* @author Vova Perebykivskiy <vova@libreplan-enterprise.com>
|
||||
*/
|
||||
public class PredefinedConnectorProperties {
|
||||
|
||||
|
|
@ -51,4 +52,9 @@ public class PredefinedConnectorProperties {
|
|||
*/
|
||||
public static final String JIRA_CODE_PREFIX = "JIRA-";
|
||||
|
||||
// Specific for E-mail
|
||||
public static String HOST = _("Host");
|
||||
public static String USER_EMAIL = _("E-mail");
|
||||
public static String PORT = _("Port");
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@ import java.util.List;
|
|||
*
|
||||
* @author Miciele Ghiorghis <m.ghiorghis@antoniusziekenhuis.nl>
|
||||
* @author Manuel Rego Casasnovas <rego@igalia.com>
|
||||
* @author Vova Perebykivskiy <vova@libreplan-enterprise.com>
|
||||
*/
|
||||
public enum PredefinedConnectors {
|
||||
|
||||
|
|
@ -50,7 +51,14 @@ public enum PredefinedConnectors {
|
|||
ConnectorProperty
|
||||
.create(PredefinedConnectorProperties.JIRA_LABELS, ""),
|
||||
ConnectorProperty.create(
|
||||
PredefinedConnectorProperties.JIRA_HOURS_TYPE, "Default"));
|
||||
PredefinedConnectorProperties.JIRA_HOURS_TYPE, "Default")),
|
||||
EMAIL("E-mail",
|
||||
ConnectorProperty.create(PredefinedConnectorProperties.ACTIVATED, "N"),
|
||||
ConnectorProperty.create(PredefinedConnectorProperties.HOST, ""),
|
||||
ConnectorProperty.create(PredefinedConnectorProperties.PORT, ""),
|
||||
ConnectorProperty.create(PredefinedConnectorProperties.USER_EMAIL, ""),
|
||||
ConnectorProperty.create(PredefinedConnectorProperties.PASSWORD, "")
|
||||
);
|
||||
|
||||
private String name;
|
||||
private List<ConnectorProperty> properties;
|
||||
|
|
|
|||
|
|
@ -430,6 +430,14 @@
|
|||
<groupId>javax.servlet</groupId>
|
||||
<artifactId>servlet-api</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!--Java mail-->
|
||||
<dependency>
|
||||
<groupId>javax.mail</groupId>
|
||||
<artifactId>mail</artifactId>
|
||||
<version>1.5.0-b01</version>
|
||||
</dependency>
|
||||
|
||||
<!-- JAX-RS API -->
|
||||
<dependency>
|
||||
<groupId>javax.ws.rs</groupId>
|
||||
|
|
|
|||
|
|
@ -23,16 +23,9 @@ package org.libreplan.web.common;
|
|||
|
||||
import static org.libreplan.web.I18nHelper._;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.ConcurrentModificationException;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.*;
|
||||
|
||||
import javax.mail.*;
|
||||
import javax.ws.rs.core.MediaType;
|
||||
import javax.ws.rs.core.Response;
|
||||
import javax.ws.rs.core.Response.Status;
|
||||
|
|
@ -97,6 +90,7 @@ import org.zkoss.zul.impl.InputElement;
|
|||
* @author Susana Montes Pedreira <smontes@wirelessgalicia.com>
|
||||
* @author Cristina Alavarino Perez <cristina.alvarino@comtecsf.es>
|
||||
* @author Ignacio Diaz Teijido <ignacio.diaz@comtecsf.es>
|
||||
* @author Vova Perebykivskiy <vova@libreplan-enterprise.com>
|
||||
*/
|
||||
public class ConfigurationController extends GenericForwardComposer {
|
||||
|
||||
|
|
@ -251,6 +245,7 @@ public class ConfigurationController extends GenericForwardComposer {
|
|||
|
||||
public void cancel() throws InterruptedException {
|
||||
configurationModel.cancel();
|
||||
messages.clearMessages();
|
||||
messages.showMessage(Level.INFO, _("Changes have been canceled"));
|
||||
reloadWindow();
|
||||
reloadEntitySequences();
|
||||
|
|
@ -305,12 +300,18 @@ public class ConfigurationController extends GenericForwardComposer {
|
|||
String password = properties
|
||||
.get(PredefinedConnectorProperties.PASSWORD);
|
||||
|
||||
if (selectedConnector.getName().equals(
|
||||
PredefinedConnectors.TIM.getName())) {
|
||||
if ( selectedConnector.getName().equals(
|
||||
PredefinedConnectors.TIM.getName()) ) {
|
||||
testTimConnection(url, username, password);
|
||||
} else if (selectedConnector.getName().equals(
|
||||
PredefinedConnectors.JIRA.getName())) {
|
||||
} else if ( selectedConnector.getName().equals(
|
||||
PredefinedConnectors.JIRA.getName()) ) {
|
||||
testJiraConnection(url, username, password);
|
||||
} else if( selectedConnector.getName().equals(
|
||||
PredefinedConnectors.EMAIL.getName()) ){
|
||||
String host = properties.get(PredefinedConnectorProperties.HOST);
|
||||
String email = properties.get(PredefinedConnectorProperties.USER_EMAIL);
|
||||
String port = properties.get(PredefinedConnectorProperties.PORT);
|
||||
testEmailConnection(host, port, email, password);
|
||||
} else {
|
||||
throw new RuntimeException("Unknown connector");
|
||||
}
|
||||
|
|
@ -373,6 +374,65 @@ public class ConfigurationController extends GenericForwardComposer {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test E-mail connection
|
||||
*
|
||||
* @param host
|
||||
* the host
|
||||
* @param port
|
||||
* the port
|
||||
* @param email
|
||||
* the email
|
||||
* @param password
|
||||
* the password
|
||||
*/
|
||||
private void testEmailConnection(String host, String port, String email, String password){
|
||||
|
||||
String[] hostWords = host.split("\\.");
|
||||
|
||||
// + "s" means that protocol coming with SSL
|
||||
String protocol = hostWords[0] + "s";
|
||||
|
||||
Properties props = System.getProperties();
|
||||
|
||||
if ( hostWords[0].equals("pop") ){
|
||||
protocol = "pop3s";
|
||||
props.setProperty("mail.pop3s.port", port);
|
||||
}
|
||||
else if ( hostWords[0].equals("smtp") ){ props.setProperty("mail.smtps.port", port); }
|
||||
else if ( hostWords[0].equals("imap") ){ props.setProperty("mail.imaps.port", port); }
|
||||
|
||||
try {
|
||||
Session session = Session.getInstance(props, null);
|
||||
session.setDebug(true);
|
||||
|
||||
if ( hostWords[0].equals("pop") || hostWords[0].equals("imap") ){
|
||||
Store store = session.getStore(protocol);
|
||||
store.connect(host, email, password);
|
||||
messages.clearMessages();
|
||||
if ( store.isConnected() ) messages.showMessage(Level.INFO, _("Connection successful!"));
|
||||
}
|
||||
else if ( hostWords[0].equals("smtp") ){
|
||||
Transport transport = session.getTransport(protocol);
|
||||
transport.connect(host, email, password);
|
||||
messages.clearMessages();
|
||||
if ( transport.isConnected() ) messages.showMessage(Level.INFO, _("Connection successful!"));
|
||||
}
|
||||
}
|
||||
catch (AuthenticationFailedException e){
|
||||
LOG.error(e);
|
||||
messages.showMessage(Level.ERROR, _("Invalid credentials"));
|
||||
}
|
||||
catch (MessagingException e){
|
||||
LOG.error(e);
|
||||
messages.showMessage(Level.ERROR, _("Cannot connect"));
|
||||
}
|
||||
catch (Exception e){
|
||||
LOG.error(e);
|
||||
messages.showMessage(Level.ERROR, _("Failed to connect"));
|
||||
}
|
||||
}
|
||||
|
||||
private boolean checkValidEntitySequenceRows() {
|
||||
Rows rows = entitySequencesGrid.getRows();
|
||||
for (Row row : (List<Row>) rows.getChildren()) {
|
||||
|
|
|
|||
|
|
@ -59,6 +59,7 @@ import org.zkoss.zul.Vbox;
|
|||
* Controller for customMenu <br />
|
||||
* @author Lorenzo Tilve Álvaro <ltilve@igalia.com>
|
||||
* @author Fernando Bellas Permuy <fbellas@udc.es>
|
||||
* @author Vova Perebykivskiy <vova@libreplan-enterprise.com>
|
||||
*/
|
||||
public class CustomMenuController extends Div implements IMenuItemsRegister {
|
||||
|
||||
|
|
@ -420,6 +421,11 @@ public class CustomMenuController extends Div implements IMenuItemsRegister {
|
|||
"/common/job_scheduling.zul",
|
||||
"19-scheduler.html"));
|
||||
}
|
||||
if (SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_EDIT_EMAIL_TEMPLATES)) {
|
||||
configurationItems.add(subItem(_("Edit E-mail Templates"),
|
||||
"/templates/email_templates.zul",
|
||||
"email-templates.html"));
|
||||
}
|
||||
|
||||
if (!configurationItems.isEmpty()) {
|
||||
topItem(_("Configuration"), "/common/configuration.zul", "",
|
||||
|
|
|
|||
|
|
@ -26,7 +26,6 @@ import java.util.Arrays;
|
|||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import java.util.logging.Filter;
|
||||
|
||||
import org.libreplan.business.common.exceptions.ValidationException;
|
||||
import org.libreplan.business.labels.entities.Label;
|
||||
|
|
@ -38,8 +37,6 @@ import org.libreplan.web.common.Level;
|
|||
import org.libreplan.web.common.MessagesForUser;
|
||||
import org.libreplan.web.common.components.bandboxsearch.BandboxSearch;
|
||||
import org.zkoss.zk.ui.Component;
|
||||
import org.zkoss.zk.ui.Session;
|
||||
import org.zkoss.zk.ui.Sessions;
|
||||
import org.zkoss.zk.ui.event.Event;
|
||||
import org.zkoss.zk.ui.event.EventListener;
|
||||
import org.zkoss.zk.ui.event.Events;
|
||||
|
|
|
|||
|
|
@ -889,6 +889,7 @@ msgstr ""
|
|||
#: libreplan-webapp/src/main/webapp/resources/worker/_edition.zul:122
|
||||
#: libreplan-webapp/src/main/webapp/resources/worker/_edition.zul:158
|
||||
#: libreplan-webapp/src/main/webapp/users/_editUser.zul:84
|
||||
#: libreplan-business/src/main/java/org/libreplan/business/common/entities/PredefinedConnectorProperties.java:56
|
||||
msgid "E-mail"
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -1363,6 +1364,7 @@ msgid "First expense"
|
|||
msgstr ""
|
||||
|
||||
#: libreplan-webapp/src/main/webapp/common/configuration.zul:296
|
||||
#: libreplan-business/src/main/java/org/libreplan/business/common/entities/PredefinedConnectorProperties.java:55
|
||||
msgid "Host"
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -9212,3 +9214,19 @@ msgstr ""
|
|||
#: libreplan-business/src/main/java/org/libreplan/business/settings/entities/Language.java:36
|
||||
msgid "Use browser language configuration"
|
||||
msgstr ""
|
||||
|
||||
#: libreplan-business/src/main/java/org/libreplan/business/templates/entities/EmailTemplateEnum.java:17
|
||||
msgid "Task assigned to resource"
|
||||
msgstr ""
|
||||
|
||||
#: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:425
|
||||
msgid "Edit E-mail Templates"
|
||||
msgstr ""
|
||||
|
||||
#: libreplan-webapp/src/main/java/org/libreplan/web/templates/EmailTemplateController.java:72
|
||||
msgid "E-mail template saved"
|
||||
msgstr ""
|
||||
|
||||
#: libreplan-business/src/main/java/org/libreplan/business/common/entities/PredefinedConnectorProperties.java:57
|
||||
msgid "Port"
|
||||
msgstr ""
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue