Merge release-7.1 into master
This commit is contained in:
commit
04c13ea9c3
|
@ -56,6 +56,7 @@ org.apache.ecs/bin/*
|
||||||
keystore/*
|
keystore/*
|
||||||
log/*
|
log/*
|
||||||
PostgreSQL/*
|
PostgreSQL/*
|
||||||
|
Oracle/*
|
||||||
*.log
|
*.log
|
||||||
Adempiere.properties
|
Adempiere.properties
|
||||||
idempiere.properties
|
idempiere.properties
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
-- IDEMPIERE-3413 Multi Select List and table reference
|
||||||
|
|
||||||
|
CREATE TYPE TABLE_OF_VARCHAR2 AS TABLE OF VARCHAR2(4000)
|
||||||
|
/
|
||||||
|
|
||||||
|
CREATE OR REPLACE FUNCTION toTableOfVarchar2(p_list IN VARCHAR2)
|
||||||
|
RETURN TABLE_OF_VARCHAR2 DETERMINISTIC
|
||||||
|
AS
|
||||||
|
l_tab TABLE_OF_VARCHAR2 := TABLE_OF_VARCHAR2();
|
||||||
|
BEGIN
|
||||||
|
FOR i IN
|
||||||
|
( select trim('"' from REGEXP_SUBSTR(p_list, '(".*?"|.*?)(,|$)', 1, level, NULL, 1)) split
|
||||||
|
from dual
|
||||||
|
connect by level<=length(regexp_replace(p_list,'".*?"|[^,]*'))+1)
|
||||||
|
LOOP
|
||||||
|
l_tab.EXTEND;
|
||||||
|
l_tab(l_tab.COUNT) := i.split;
|
||||||
|
END LOOP;
|
||||||
|
RETURN l_tab;
|
||||||
|
END toTableOfVarchar2
|
||||||
|
;
|
||||||
|
/
|
||||||
|
|
|
@ -61,25 +61,10 @@ UPDATE AD_Field SET DisplayLogic='@IsQueryCriteria@=Y & @AD_Reference_ID@!200161
|
||||||
UPDATE AD_Field SET AD_Reference_Value_ID=NULL, AD_Val_Rule_ID=NULL, MandatoryLogic='@AD_Reference_ID@=200161 | @AD_Reference_ID@=200162 | @AD_Reference_ID@=200163', IsToolbarButton=NULL,Updated=TO_DATE('2019-06-22 17:15:39','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=201622
|
UPDATE AD_Field SET AD_Reference_Value_ID=NULL, AD_Val_Rule_ID=NULL, MandatoryLogic='@AD_Reference_ID@=200161 | @AD_Reference_ID@=200162 | @AD_Reference_ID@=200163', IsToolbarButton=NULL,Updated=TO_DATE('2019-06-22 17:15:39','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=201622
|
||||||
;
|
;
|
||||||
|
|
||||||
CREATE TYPE TABLE_OF_VARCHAR2 AS TABLE OF VARCHAR2(4000)
|
-- moved to script 201912282330_IDEMPIERE-3413.sql
|
||||||
;
|
-- CREATE TYPE TABLE_OF_VARCHAR2 AS TABLE OF VARCHAR2(4000)
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION toTableOfVarchar2(p_list IN VARCHAR2)
|
-- CREATE OR REPLACE FUNCTION toTableOfVarchar2(p_list IN VARCHAR2)
|
||||||
RETURN TABLE_OF_VARCHAR2 DETERMINISTIC
|
|
||||||
AS
|
|
||||||
l_tab TABLE_OF_VARCHAR2 := TABLE_OF_VARCHAR2();
|
|
||||||
BEGIN
|
|
||||||
FOR i IN
|
|
||||||
( select trim('"' from REGEXP_SUBSTR(p_list, '(".*?"|.*?)(,|$)', 1, level, NULL, 1)) split
|
|
||||||
from dual
|
|
||||||
connect by level<=length(regexp_replace(p_list,'".*?"|[^,]*'))+1)
|
|
||||||
LOOP
|
|
||||||
l_tab.EXTEND;
|
|
||||||
l_tab(l_tab.COUNT) := i.split;
|
|
||||||
END LOOP;
|
|
||||||
RETURN l_tab;
|
|
||||||
END toTableOfVarchar2
|
|
||||||
;
|
|
||||||
|
|
||||||
SELECT register_migration_script('201906171811_IDEMPIERE-3413.sql') FROM dual
|
SELECT register_migration_script('201906171811_IDEMPIERE-3413.sql') FROM dual
|
||||||
;
|
;
|
||||||
|
|
|
@ -0,0 +1,32 @@
|
||||||
|
SET SQLBLANKLINES ON
|
||||||
|
SET DEFINE OFF
|
||||||
|
|
||||||
|
-- IDEMPIERE-3952 EntityType and Data Access Level review for tables
|
||||||
|
-- Dec 27, 2019, 5:14:30 PM CET
|
||||||
|
ALTER TABLE AD_InfoProcess MODIFY EntityType VARCHAR2(40) DEFAULT 'U'
|
||||||
|
;
|
||||||
|
|
||||||
|
ALTER TABLE AD_InfoRelated MODIFY EntityType VARCHAR2(40) DEFAULT 'U'
|
||||||
|
;
|
||||||
|
|
||||||
|
ALTER TABLE AD_SearchDefinition MODIFY EntityType VARCHAR2(40) DEFAULT 'U'
|
||||||
|
;
|
||||||
|
|
||||||
|
ALTER TABLE AD_Style MODIFY EntityType VARCHAR2(40) DEFAULT 'U'
|
||||||
|
;
|
||||||
|
|
||||||
|
ALTER TABLE AD_StyleLine MODIFY EntityType VARCHAR2(40) DEFAULT 'U'
|
||||||
|
;
|
||||||
|
|
||||||
|
ALTER TABLE AD_ToolBarButton MODIFY EntityType VARCHAR2(40) DEFAULT 'U'
|
||||||
|
;
|
||||||
|
|
||||||
|
ALTER TABLE AD_ZoomCondition MODIFY EntityType VARCHAR2(40) DEFAULT 'U'
|
||||||
|
;
|
||||||
|
|
||||||
|
ALTER TABLE PA_DocumentStatus MODIFY EntityType VARCHAR2(40) DEFAULT 'U'
|
||||||
|
;
|
||||||
|
|
||||||
|
SELECT register_migration_script('201912271715_IDEMPIERE-3952.sql') FROM dual
|
||||||
|
;
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
-- IDEMPIERE-3413 Multi Select List and table reference - fix oracle seed - wrong application of script 201906171811_IDEMPIERE-3413.sql
|
||||||
|
-- register the migration script applied wrongly
|
||||||
|
SELECT register_migration_script('201906171811_IDEMPIERE-3413.sql') FROM dual
|
||||||
|
;
|
||||||
|
|
||||||
|
CREATE TYPE TABLE_OF_VARCHAR2 AS TABLE OF VARCHAR2(4000)
|
||||||
|
/
|
||||||
|
|
||||||
|
CREATE OR REPLACE FUNCTION toTableOfVarchar2(p_list IN VARCHAR2)
|
||||||
|
RETURN TABLE_OF_VARCHAR2 DETERMINISTIC
|
||||||
|
AS
|
||||||
|
l_tab TABLE_OF_VARCHAR2 := TABLE_OF_VARCHAR2();
|
||||||
|
BEGIN
|
||||||
|
FOR i IN
|
||||||
|
( select trim('"' from REGEXP_SUBSTR(p_list, '(".*?"|.*?)(,|$)', 1, level, NULL, 1)) split
|
||||||
|
from dual
|
||||||
|
connect by level<=length(regexp_replace(p_list,'".*?"|[^,]*'))+1)
|
||||||
|
LOOP
|
||||||
|
l_tab.EXTEND;
|
||||||
|
l_tab(l_tab.COUNT) := i.split;
|
||||||
|
END LOOP;
|
||||||
|
RETURN l_tab;
|
||||||
|
END toTableOfVarchar2
|
||||||
|
;
|
||||||
|
/
|
||||||
|
|
||||||
|
SELECT register_migration_script('201912282330_IDEMPIERE-3413.sql') FROM dual
|
||||||
|
;
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
-- IDEMPIERE-3952 EntityType and Data Access Level review for tables
|
||||||
|
-- Dec 27, 2019, 5:14:30 PM CET
|
||||||
|
INSERT INTO t_alter_column values('AD_InfoProcess','EntityType','VARCHAR(40)',null,'U')
|
||||||
|
;
|
||||||
|
|
||||||
|
INSERT INTO t_alter_column values('AD_InfoRelated','EntityType','VARCHAR(40)',null,'U')
|
||||||
|
;
|
||||||
|
|
||||||
|
INSERT INTO t_alter_column values('AD_SearchDefinition','EntityType','VARCHAR(40)',null,'U')
|
||||||
|
;
|
||||||
|
|
||||||
|
INSERT INTO t_alter_column values('AD_Style','EntityType','VARCHAR(40)',null,'U')
|
||||||
|
;
|
||||||
|
|
||||||
|
INSERT INTO t_alter_column values('AD_StyleLine','EntityType','VARCHAR(40)',null,'U')
|
||||||
|
;
|
||||||
|
|
||||||
|
INSERT INTO t_alter_column values('AD_ToolBarButton','EntityType','VARCHAR(40)',null,'U')
|
||||||
|
;
|
||||||
|
|
||||||
|
INSERT INTO t_alter_column values('AD_ZoomCondition','EntityType','VARCHAR(40)',null,'U')
|
||||||
|
;
|
||||||
|
|
||||||
|
INSERT INTO t_alter_column values('PA_DocumentStatus','EntityType','VARCHAR(40)',null,'U')
|
||||||
|
;
|
||||||
|
|
||||||
|
SELECT register_migration_script('201912271715_IDEMPIERE-3952.sql') FROM dual
|
||||||
|
;
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
-- IDEMPIERE-3413 Multi Select List and table reference
|
||||||
|
-- Placeholder - script just for oracle
|
||||||
|
|
||||||
|
SELECT register_migration_script('201912282330_IDEMPIERE-3413.sql') FROM dual
|
||||||
|
;
|
||||||
|
|
|
@ -20,6 +20,7 @@ import java.io.File;
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.sql.Timestamp;
|
import java.sql.Timestamp;
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
|
@ -457,34 +458,10 @@ public class MJournal extends X_GL_Journal implements DocAction
|
||||||
m_processMsg = ModelValidationEngine.get().fireDocValidate(this, ModelValidator.TIMING_BEFORE_PREPARE);
|
m_processMsg = ModelValidationEngine.get().fireDocValidate(this, ModelValidator.TIMING_BEFORE_PREPARE);
|
||||||
if (m_processMsg != null)
|
if (m_processMsg != null)
|
||||||
return DocAction.STATUS_Invalid;
|
return DocAction.STATUS_Invalid;
|
||||||
MDocType dt = MDocType.get(getCtx(), getC_DocType_ID());
|
|
||||||
|
|
||||||
// Get Period
|
m_processMsg = validatePeriod(getDateAcct());
|
||||||
MPeriod period = (MPeriod) getC_Period();
|
if (m_processMsg != null)
|
||||||
if (! period.isInPeriod(getDateAcct())) {
|
|
||||||
period = MPeriod.get (getCtx(), getDateAcct(), getAD_Org_ID(), get_TrxName());
|
|
||||||
if (period == null)
|
|
||||||
{
|
|
||||||
log.warning("No Period for " + getDateAcct());
|
|
||||||
m_processMsg = "@PeriodNotFound@";
|
|
||||||
return DocAction.STATUS_Invalid;
|
|
||||||
}
|
|
||||||
// Standard Period
|
|
||||||
if (period.getC_Period_ID() != getC_Period_ID()
|
|
||||||
&& period.isStandardPeriod())
|
|
||||||
{
|
|
||||||
m_processMsg = "@PeriodNotValid@";
|
|
||||||
return DocAction.STATUS_Invalid;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
boolean open = period.isOpen(dt.getDocBaseType(), getDateAcct());
|
|
||||||
if (!open)
|
|
||||||
{
|
|
||||||
log.warning(period.getName()
|
|
||||||
+ ": Not open for " + dt.getDocBaseType() + " (" + getDateAcct() + ")");
|
|
||||||
m_processMsg = "@PeriodClosed@";
|
|
||||||
return DocAction.STATUS_Invalid;
|
return DocAction.STATUS_Invalid;
|
||||||
}
|
|
||||||
|
|
||||||
// Lines
|
// Lines
|
||||||
MJournalLine[] lines = getLines(true);
|
MJournalLine[] lines = getLines(true);
|
||||||
|
@ -503,6 +480,12 @@ public class MJournal extends X_GL_Journal implements DocAction
|
||||||
if (!isActive())
|
if (!isActive())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if (! line.getDateAcct().equals(getDateAcct())) {
|
||||||
|
m_processMsg = validatePeriod(line.getDateAcct());
|
||||||
|
if (m_processMsg != null)
|
||||||
|
return DocAction.STATUS_Invalid;
|
||||||
|
}
|
||||||
|
|
||||||
// bcahya, BF [2789319] No check of Actual, Budget, Statistical attribute
|
// bcahya, BF [2789319] No check of Actual, Budget, Statistical attribute
|
||||||
if (!line.getAccountElementValue().isActive())
|
if (!line.getAccountElementValue().isActive())
|
||||||
{
|
{
|
||||||
|
@ -584,6 +567,35 @@ public class MJournal extends X_GL_Journal implements DocAction
|
||||||
return DocAction.STATUS_InProgress;
|
return DocAction.STATUS_InProgress;
|
||||||
} // prepareIt
|
} // prepareIt
|
||||||
|
|
||||||
|
private String validatePeriod(Timestamp dateAcct) {
|
||||||
|
// Get Period
|
||||||
|
MDocType dt = MDocType.get(getCtx(), getC_DocType_ID());
|
||||||
|
MPeriod period = (MPeriod) getC_Period();
|
||||||
|
SimpleDateFormat dateFormat = DisplayType.getDateFormat(DisplayType.Date);
|
||||||
|
|
||||||
|
if (! period.isInPeriod(dateAcct)) {
|
||||||
|
period = MPeriod.get (getCtx(), dateAcct, getAD_Org_ID(), get_TrxName());
|
||||||
|
if (period == null)
|
||||||
|
{
|
||||||
|
log.warning("No Period for " + dateAcct);
|
||||||
|
return "@PeriodNotFound@ -> " + dateFormat.format(dateAcct);
|
||||||
|
}
|
||||||
|
// Standard Period
|
||||||
|
if (period.getC_Period_ID() != getC_Period_ID() && period.isStandardPeriod())
|
||||||
|
{
|
||||||
|
log.warning("No Period for " + dateAcct);
|
||||||
|
return "@PeriodNotValid@ -> " + dateFormat.format(dateAcct);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
boolean open = period.isOpen(dt.getDocBaseType(), dateAcct);
|
||||||
|
if (!open)
|
||||||
|
{
|
||||||
|
log.warning(period.getName() + ": Not open for " + dt.getDocBaseType() + " (" + dateAcct + ")");
|
||||||
|
return "@PeriodClosed@ -> " + dateFormat.format(dateAcct);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Approve Document
|
* Approve Document
|
||||||
* @return true if success
|
* @return true if success
|
||||||
|
|
|
@ -45,8 +45,7 @@ public class MPrintFormatItem extends X_AD_PrintFormatItem
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
private static final long serialVersionUID = -679302944951915141L;
|
private static final long serialVersionUID = 7145503984951798641L;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
|
@ -116,6 +115,8 @@ public class MPrintFormatItem extends X_AD_PrintFormatItem
|
||||||
private String m_columnName = null;
|
private String m_columnName = null;
|
||||||
/** Locally cached label translations */
|
/** Locally cached label translations */
|
||||||
private HashMap<String,String> m_translationLabel;
|
private HashMap<String,String> m_translationLabel;
|
||||||
|
String m_newTranslationLabel = null;
|
||||||
|
boolean m_translationLabelChanged = false;
|
||||||
/** Locally cached suffix translations */
|
/** Locally cached suffix translations */
|
||||||
private HashMap<String,String> m_translationSuffix;
|
private HashMap<String,String> m_translationSuffix;
|
||||||
|
|
||||||
|
@ -138,6 +139,26 @@ public class MPrintFormatItem extends X_AD_PrintFormatItem
|
||||||
return retValue;
|
return retValue;
|
||||||
} // getPrintName
|
} // getPrintName
|
||||||
|
|
||||||
|
/**************************************************************************
|
||||||
|
* Set print name on language
|
||||||
|
* @param language language - ignored if IsMultiLingualDocument not 'Y'
|
||||||
|
*/
|
||||||
|
public void setPrintName (Language language, String printName)
|
||||||
|
{
|
||||||
|
if (language == null || Env.isBaseLanguage(language, "AD_PrintFormatItem")) {
|
||||||
|
setPrintName(printName);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
loadTranslations();
|
||||||
|
String retValue = (String)m_translationLabel.get(language.getAD_Language());
|
||||||
|
if ((retValue != null && ! retValue.equals(printName))
|
||||||
|
|| (retValue == null && printName != null)) {
|
||||||
|
m_newTranslationLabel = printName;
|
||||||
|
m_translationLabelChanged = true;
|
||||||
|
m_translationLabel.put(language.getAD_Language(), printName);
|
||||||
|
}
|
||||||
|
} // getPrintName
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get print name suffix with language
|
* Get print name suffix with language
|
||||||
* @param language language - ignored if IsMultiLingualDocument not 'Y'
|
* @param language language - ignored if IsMultiLingualDocument not 'Y'
|
||||||
|
@ -683,11 +704,30 @@ public class MPrintFormatItem extends X_AD_PrintFormatItem
|
||||||
+ " AND AD_PrintFormatItem_Trl.AD_PrintFormatItem_ID = " + get_ID() + ")"
|
+ " AND AD_PrintFormatItem_Trl.AD_PrintFormatItem_ID = " + get_ID() + ")"
|
||||||
+ " AND EXISTS (SELECT * FROM AD_Client "
|
+ " AND EXISTS (SELECT * FROM AD_Client "
|
||||||
+ "WHERE AD_Client_ID=AD_PrintFormatItem_Trl.AD_Client_ID AND IsMultiLingualDocument='Y')";
|
+ "WHERE AD_Client_ID=AD_PrintFormatItem_Trl.AD_Client_ID AND IsMultiLingualDocument='Y')";
|
||||||
int no = DB.executeUpdate(sql, get_TrxName());
|
int no = DB.executeUpdateEx(sql, get_TrxName());
|
||||||
if (log.isLoggable(Level.FINE)) log.fine("translations updated #" + no);
|
if (log.isLoggable(Level.FINE)) log.fine("translations updated #" + no);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (m_translationLabelChanged) {
|
||||||
|
String sql = "UPDATE AD_PrintFormatItem_Trl "
|
||||||
|
+ "SET PrintName = ? "
|
||||||
|
+ "WHERE AD_PrintFormatItem_ID = ?"
|
||||||
|
+ " AND AD_Language=?";
|
||||||
|
int no = DB.executeUpdateEx(sql, new Object[] {m_newTranslationLabel, get_ID(), Language.getLoginLanguage().getAD_Language()}, get_TrxName());
|
||||||
|
if (log.isLoggable(Level.FINE)) log.fine("translations updated #" + no);
|
||||||
|
|
||||||
|
m_newTranslationLabel = null;
|
||||||
|
m_translationLabelChanged = false;
|
||||||
|
}
|
||||||
|
|
||||||
return success;
|
return success;
|
||||||
} // afterSave
|
} // afterSave
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean is_Changed() {
|
||||||
|
if (m_translationLabelChanged)
|
||||||
|
return true;
|
||||||
|
return super.is_Changed();
|
||||||
|
}
|
||||||
|
|
||||||
} // MPrintFormatItem
|
} // MPrintFormatItem
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
<launcherArgs>
|
<launcherArgs>
|
||||||
<programArgs>-console
|
<programArgs>-console
|
||||||
</programArgs>
|
</programArgs>
|
||||||
<vmArgs>--add-modules java.se --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.nio=ALL-UNNAMED --add-opens java.base/sun.nio.ch=ALL-UNNAMED --add-opens java.management/sun.management=ALL-UNNAMED --add-opens jdk.management/com.sun.management.internal=ALL-UNNAMED --add-exports java.base/jdk.internal.ref=ALL-UNNAMED --add-exports java.desktop/sun.awt=ALL-UNNAMED --add-exports java.sql.rowset/com.sun.rowset=ALL-UNNAMED --add-exports java.naming/com.sun.jndi.ldap=ALL-UNNAMED -Declipse.product=org.adempiere.server.product -Dosgi.noShutdown=true -Dosgi.framework.activeThreadType=normal -Dorg.osgi.framework.bootdelegation=sun.security.ssl,org.w3c.dom.events -Dosgi.compatibility.bootdelegation=true -Djetty.home=jettyhome -Djetty.etc.config.urls=etc/jetty.xml,etc/jetty-deployer.xml,etc/jetty-ssl.xml,etc/jetty-ssl-context.xml,etc/jetty-http.xml,etc/jetty-alpn.xml,etc/jetty-http2.xml,etc/jetty-https.xml -Dmail.mime.encodefilename=true -Dmail.mime.decodefilename=true -Dmail.mime.encodeparameters=true -Dmail.mime.decodeparameters=true -Dhazelcast.config=hazelcast.xml -Dorg.zkoss.zk.config.path=file://${workspace_loc}/zk.xml
|
<vmArgs>--add-modules java.se --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.nio=ALL-UNNAMED --add-opens java.base/sun.nio.ch=ALL-UNNAMED --add-opens java.management/sun.management=ALL-UNNAMED --add-opens jdk.management/com.sun.management.internal=ALL-UNNAMED --add-exports java.base/jdk.internal.ref=ALL-UNNAMED --add-exports java.desktop/sun.awt=ALL-UNNAMED --add-exports java.sql.rowset/com.sun.rowset=ALL-UNNAMED --add-exports java.naming/com.sun.jndi.ldap=ALL-UNNAMED -Declipse.product=org.adempiere.server.product -Dosgi.noShutdown=true -Dosgi.framework.activeThreadType=normal -Dorg.osgi.framework.bootdelegation=sun.security.ssl,org.w3c.dom.events -Dosgi.compatibility.bootdelegation=true -Djetty.home=jettyhome -Djetty.etc.config.urls=etc/jetty.xml,etc/jetty-deployer.xml,etc/jetty-ssl.xml,etc/jetty-ssl-context.xml,etc/jetty-http.xml,etc/jetty-https.xml -Dmail.mime.encodefilename=true -Dmail.mime.decodefilename=true -Dmail.mime.encodeparameters=true -Dmail.mime.decodeparameters=true -Dhazelcast.config=hazelcast.xml -Dorg.zkoss.zk.config.path=file://${workspace_loc}/zk.xml
|
||||||
</vmArgs>
|
</vmArgs>
|
||||||
<vmArgsMac>-XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts
|
<vmArgsMac>-XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts
|
||||||
</vmArgsMac>
|
</vmArgsMac>
|
||||||
|
@ -67,13 +67,13 @@
|
||||||
<plugin id="org.mortbay.jasper.apache-el" autoStart="true" startLevel="0" />
|
<plugin id="org.mortbay.jasper.apache-el" autoStart="true" startLevel="0" />
|
||||||
<plugin id="org.mortbay.jasper.apache-jsp" autoStart="true" startLevel="0" />
|
<plugin id="org.mortbay.jasper.apache-jsp" autoStart="true" startLevel="0" />
|
||||||
<plugin id="org.restlet" autoStart="true" startLevel="0" />
|
<plugin id="org.restlet" autoStart="true" startLevel="0" />
|
||||||
<property name="eclipse.product" value="org.adempiere.server.product" />
|
|
||||||
<property name="org.eclipse.equinox.simpleconfigurator.exclusiveInstallation" value="false" />
|
|
||||||
<property name="org.eclipse.update.reconcile" value="false" />
|
<property name="org.eclipse.update.reconcile" value="false" />
|
||||||
|
<property name="osgi.instance.area.default" value="@config.dir/../workspace" />
|
||||||
<property name="osgi.compatibility.bootdelegation" value="true" />
|
<property name="osgi.compatibility.bootdelegation" value="true" />
|
||||||
<property name="osgi.console.enable.builtin" value="false" />
|
<property name="osgi.console.enable.builtin" value="false" />
|
||||||
|
<property name="eclipse.product" value="org.adempiere.server.product" />
|
||||||
<property name="osgi.framework.activeThreadType" value="normal" />
|
<property name="osgi.framework.activeThreadType" value="normal" />
|
||||||
<property name="osgi.instance.area.default" value="@config.dir/../workspace" />
|
<property name="org.eclipse.equinox.simpleconfigurator.exclusiveInstallation" value="false" />
|
||||||
<property name="osgi.noShutdown" value="true" />
|
<property name="osgi.noShutdown" value="true" />
|
||||||
</configurations>
|
</configurations>
|
||||||
|
|
||||||
|
|
|
@ -19,18 +19,14 @@ import java.util.Properties;
|
||||||
|
|
||||||
import javax.servlet.ServletRequest;
|
import javax.servlet.ServletRequest;
|
||||||
|
|
||||||
import org.adempiere.webui.apps.AEnv;
|
|
||||||
import org.adempiere.webui.part.AbstractUIPart;
|
import org.adempiere.webui.part.AbstractUIPart;
|
||||||
import org.adempiere.webui.theme.ThemeManager;
|
import org.adempiere.webui.theme.ThemeManager;
|
||||||
import org.adempiere.webui.util.ZKUpdateUtil;
|
|
||||||
import org.adempiere.webui.window.LoginWindow;
|
import org.adempiere.webui.window.LoginWindow;
|
||||||
import org.zkoss.web.servlet.Servlets;
|
import org.zkoss.web.servlet.Servlets;
|
||||||
import org.zkoss.zhtml.Text;
|
|
||||||
import org.zkoss.zk.ui.Component;
|
import org.zkoss.zk.ui.Component;
|
||||||
import org.zkoss.zk.ui.Executions;
|
import org.zkoss.zk.ui.Executions;
|
||||||
import org.zkoss.zk.ui.metainfo.PageDefinition;
|
import org.zkoss.zk.ui.metainfo.PageDefinition;
|
||||||
import org.zkoss.zul.Borderlayout;
|
import org.zkoss.zul.Borderlayout;
|
||||||
import org.zkoss.zul.Div;
|
|
||||||
import org.zkoss.zul.East;
|
import org.zkoss.zul.East;
|
||||||
import org.zkoss.zul.North;
|
import org.zkoss.zul.North;
|
||||||
import org.zkoss.zul.South;
|
import org.zkoss.zul.South;
|
||||||
|
@ -67,6 +63,7 @@ public class WLogin extends AbstractUIPart
|
||||||
loginWindow = (LoginWindow) loginPage.getFellow("loginWindow");
|
loginWindow = (LoginWindow) loginPage.getFellow("loginWindow");
|
||||||
loginWindow.init(app);
|
loginWindow.init(app);
|
||||||
|
|
||||||
|
/* IDEMPIERE-1022 - deprecated message
|
||||||
if (!AEnv.isBrowserSupported())
|
if (!AEnv.isBrowserSupported())
|
||||||
{
|
{
|
||||||
//TODO: localization
|
//TODO: localization
|
||||||
|
@ -81,6 +78,7 @@ public class WLogin extends AbstractUIPart
|
||||||
browserWarningWindow.setPage(page);
|
browserWarningWindow.setPage(page);
|
||||||
browserWarningWindow.doOverlapped();
|
browserWarningWindow.doOverlapped();
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
boolean mobile = false;
|
boolean mobile = false;
|
||||||
if (Executions.getCurrent().getBrowser("mobile") !=null) {
|
if (Executions.getCurrent().getBrowser("mobile") !=null) {
|
||||||
|
|
|
@ -524,6 +524,7 @@ public final class AEnv
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return boolean
|
* @return boolean
|
||||||
|
* @deprecated See IDEMPIERE-1022
|
||||||
*/
|
*/
|
||||||
public static boolean isBrowserSupported() {
|
public static boolean isBrowserSupported() {
|
||||||
Execution execution = Executions.getCurrent();
|
Execution execution = Executions.getCurrent();
|
||||||
|
|
|
@ -19,7 +19,6 @@ package org.adempiere.webui.panel;
|
||||||
|
|
||||||
import org.adempiere.webui.AdempiereWebUI;
|
import org.adempiere.webui.AdempiereWebUI;
|
||||||
import org.adempiere.webui.LayoutUtils;
|
import org.adempiere.webui.LayoutUtils;
|
||||||
import org.adempiere.webui.apps.AEnv;
|
|
||||||
import org.adempiere.webui.component.Label;
|
import org.adempiere.webui.component.Label;
|
||||||
import org.adempiere.webui.component.Panel;
|
import org.adempiere.webui.component.Panel;
|
||||||
import org.adempiere.webui.session.SessionManager;
|
import org.adempiere.webui.session.SessionManager;
|
||||||
|
@ -208,7 +207,7 @@ public class StatusBarPanel extends Panel implements EventListener<Event>, IStat
|
||||||
statusLine.setStyle("color: black");
|
statusLine.setStyle("color: black");
|
||||||
statusLine.setTooltiptext(text);
|
statusLine.setTooltiptext(text);
|
||||||
|
|
||||||
if (showPopup && AEnv.isBrowserSupported())
|
if (showPopup)
|
||||||
{
|
{
|
||||||
Text t = new Text(text);
|
Text t = new Text(text);
|
||||||
popupContent.getChildren().clear();
|
popupContent.getChildren().clear();
|
||||||
|
|
|
@ -27,6 +27,7 @@ import org.adempiere.webui.util.ZKUpdateUtil;
|
||||||
import org.compiere.print.MPrintFormat;
|
import org.compiere.print.MPrintFormat;
|
||||||
import org.compiere.print.MPrintFormatItem;
|
import org.compiere.print.MPrintFormatItem;
|
||||||
import org.compiere.util.KeyNamePair;
|
import org.compiere.util.KeyNamePair;
|
||||||
|
import org.compiere.util.Language;
|
||||||
import org.compiere.util.Util;
|
import org.compiere.util.Util;
|
||||||
import org.zkoss.zk.ui.event.Event;
|
import org.zkoss.zk.ui.event.Event;
|
||||||
import org.zkoss.zk.ui.event.EventListener;
|
import org.zkoss.zk.ui.event.EventListener;
|
||||||
|
@ -122,7 +123,7 @@ public class WRC1DisplayFieldsPanel extends WRCTabPanel implements EventListener
|
||||||
row.appendChild(m_chkboxes[i]);
|
row.appendChild(m_chkboxes[i]);
|
||||||
|
|
||||||
m_textBoxes[i] = new Textbox();
|
m_textBoxes[i] = new Textbox();
|
||||||
String strValue = printItem.getPrintName();
|
String strValue = printItem.getPrintName(Language.getLoginLanguage());
|
||||||
if(strValue ==null || strValue.length()==0){
|
if(strValue ==null || strValue.length()==0){
|
||||||
strValue = printItem.getName();
|
strValue = printItem.getName();
|
||||||
}
|
}
|
||||||
|
@ -141,7 +142,7 @@ public class WRC1DisplayFieldsPanel extends WRCTabPanel implements EventListener
|
||||||
int i=0;
|
int i=0;
|
||||||
for (MPrintFormatItem item : m_pfi){
|
for (MPrintFormatItem item : m_pfi){
|
||||||
item.setIsActive(m_chkboxes[i].isChecked());
|
item.setIsActive(m_chkboxes[i].isChecked());
|
||||||
item.setPrintName(m_textBoxes[i].getText());
|
item.setPrintName(Language.getLoginLanguage(), m_textBoxes[i].getText());
|
||||||
item.saveEx();
|
item.saveEx();
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
@ -176,8 +177,8 @@ public class WRC1DisplayFieldsPanel extends WRCTabPanel implements EventListener
|
||||||
}
|
}
|
||||||
String printname = m_textBoxes[i].getValue();
|
String printname = m_textBoxes[i].getValue();
|
||||||
if (!Util.isEmpty(printname))
|
if (!Util.isEmpty(printname))
|
||||||
if (! printname.equals(m_pfi.get(i).getPrintName()))
|
if (! printname.equals(m_pfi.get(i).getPrintName(Language.getLoginLanguage())))
|
||||||
m_pfi.get(i).setPrintName(m_textBoxes[i].getValue());
|
m_pfi.get(i).setPrintName(Language.getLoginLanguage(), m_textBoxes[i].getValue());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -30,6 +30,7 @@ import org.adempiere.webui.theme.ThemeManager;
|
||||||
import org.adempiere.webui.util.ZKUpdateUtil;
|
import org.adempiere.webui.util.ZKUpdateUtil;
|
||||||
import org.compiere.print.MPrintFormatItem;
|
import org.compiere.print.MPrintFormatItem;
|
||||||
import org.compiere.util.KeyNamePair;
|
import org.compiere.util.KeyNamePair;
|
||||||
|
import org.compiere.util.Language;
|
||||||
import org.compiere.util.NamePair;
|
import org.compiere.util.NamePair;
|
||||||
import org.zkoss.zk.au.out.AuFocus;
|
import org.zkoss.zk.au.out.AuFocus;
|
||||||
import org.zkoss.zk.ui.event.DropEvent;
|
import org.zkoss.zk.ui.event.DropEvent;
|
||||||
|
@ -207,7 +208,7 @@ public class WRC2FieldOrderPanel extends WRCTabPanel implements EventListener<Ev
|
||||||
for (MPrintFormatItem pfi : listColumns){
|
for (MPrintFormatItem pfi : listColumns){
|
||||||
pfi.setSeqNo(seq);
|
pfi.setSeqNo(seq);
|
||||||
m_pfi.get(m_pfi.indexOf(pfi)).setSeqNo(seq);
|
m_pfi.get(m_pfi.indexOf(pfi)).setSeqNo(seq);
|
||||||
String name= pfi.getPrintName()== null ? pfi.getName(): pfi.getPrintName() ;
|
String name= pfi.getPrintName(Language.getLoginLanguage())== null ? pfi.getName(): pfi.getPrintName(Language.getLoginLanguage()) ;
|
||||||
ListElement element =new ListElement(pfi.get_ID(), name, pfi.getSeqNo(), pfi.getAD_Client_ID(), pfi.getAD_Org_ID());
|
ListElement element =new ListElement(pfi.get_ID(), name, pfi.getSeqNo(), pfi.getAD_Client_ID(), pfi.getAD_Org_ID());
|
||||||
sortModel.addElement(element);
|
sortModel.addElement(element);
|
||||||
sortList.addItem(new KeyNamePair(m_pfi.get(m_pfi.indexOf(pfi)).get_ID(), name));
|
sortList.addItem(new KeyNamePair(m_pfi.get(m_pfi.indexOf(pfi)).get_ID(), name));
|
||||||
|
|
|
@ -36,6 +36,7 @@ import org.compiere.model.MRefList;
|
||||||
import org.compiere.print.MPrintFormatItem;
|
import org.compiere.print.MPrintFormatItem;
|
||||||
import org.compiere.util.Env;
|
import org.compiere.util.Env;
|
||||||
import org.compiere.util.KeyNamePair;
|
import org.compiere.util.KeyNamePair;
|
||||||
|
import org.compiere.util.Language;
|
||||||
import org.compiere.util.Msg;
|
import org.compiere.util.Msg;
|
||||||
import org.compiere.util.NamePair;
|
import org.compiere.util.NamePair;
|
||||||
import org.compiere.util.Util;
|
import org.compiere.util.Util;
|
||||||
|
@ -233,7 +234,7 @@ public class WRC3SortCriteriaPanel extends WRCTabPanel implements EventListener
|
||||||
yesModel.removeAllElements();
|
yesModel.removeAllElements();
|
||||||
for (int i=0 ; i < yesItems.size() ; i++) {
|
for (int i=0 ; i < yesItems.size() ; i++) {
|
||||||
int ID= yesItems.get(i).get_ID();
|
int ID= yesItems.get(i).get_ID();
|
||||||
String name = getName(yesItems.get(i));
|
String name = yesItems.get(i).getPrintName(Language.getLoginLanguage())==null? yesItems.get(i).getName():yesItems.get(i).getPrintName(Language.getLoginLanguage());
|
||||||
yesList.addItem(new KeyNamePair(ID, name));
|
yesList.addItem(new KeyNamePair(ID, name));
|
||||||
yesModel.addElement(new ListElement(ID, name, yesItems.get(i).getSortNo(), true, yesItems.get(i).getAD_Client_ID(), yesItems.get(i).getAD_Org_ID()));
|
yesModel.addElement(new ListElement(ID, name, yesItems.get(i).getSortNo(), true, yesItems.get(i).getAD_Client_ID(), yesItems.get(i).getAD_Org_ID()));
|
||||||
}
|
}
|
||||||
|
@ -243,7 +244,7 @@ public class WRC3SortCriteriaPanel extends WRCTabPanel implements EventListener
|
||||||
noModel.removeAllElements();
|
noModel.removeAllElements();
|
||||||
for (int i=0 ; i < noItems.size() ; i++) {
|
for (int i=0 ; i < noItems.size() ; i++) {
|
||||||
int ID= noItems.get(i).get_ID();
|
int ID= noItems.get(i).get_ID();
|
||||||
String name = noItems.get(i).getPrintName()== null ? noItems.get(i).getName() : noItems.get(i).getPrintName();
|
String name = noItems.get(i).getPrintName(Language.getLoginLanguage())== null ? noItems.get(i).getName() : noItems.get(i).getPrintName(Language.getLoginLanguage());
|
||||||
noItems.get(i).setSortNo(0);
|
noItems.get(i).setSortNo(0);
|
||||||
noItems.get(i).setIsOrderBy(false);
|
noItems.get(i).setIsOrderBy(false);
|
||||||
noList.addItem(new KeyNamePair(ID, name));
|
noList.addItem(new KeyNamePair(ID, name));
|
||||||
|
|
|
@ -25,6 +25,7 @@ import org.adempiere.webui.component.Rows;
|
||||||
import org.adempiere.webui.component.Window;
|
import org.adempiere.webui.component.Window;
|
||||||
import org.adempiere.webui.util.ZKUpdateUtil;
|
import org.adempiere.webui.util.ZKUpdateUtil;
|
||||||
import org.compiere.print.MPrintFormatItem;
|
import org.compiere.print.MPrintFormatItem;
|
||||||
|
import org.compiere.util.Language;
|
||||||
import org.zkoss.zk.ui.event.Event;
|
import org.zkoss.zk.ui.event.Event;
|
||||||
import org.zkoss.zk.ui.event.EventListener;
|
import org.zkoss.zk.ui.event.EventListener;
|
||||||
import org.zkoss.zk.ui.event.Events;
|
import org.zkoss.zk.ui.event.Events;
|
||||||
|
@ -124,7 +125,7 @@ public class WRC4GroupingCriteriaPanel extends WRCTabPanel implements EventListe
|
||||||
m_chkboxes[i].setChecked(orderfield.get(i).isGroupBy());
|
m_chkboxes[i].setChecked(orderfield.get(i).isGroupBy());
|
||||||
m_chkboxes[i].addEventListener(Events.ON_CHECK, this);
|
m_chkboxes[i].addEventListener(Events.ON_CHECK, this);
|
||||||
|
|
||||||
String strValue = orderfield.get(i).getPrintName();
|
String strValue = orderfield.get(i).getPrintName(Language.getLoginLanguage());
|
||||||
if(strValue ==null || strValue.length()==0){
|
if(strValue ==null || strValue.length()==0){
|
||||||
strValue = orderfield.get(i).getName();
|
strValue = orderfield.get(i).getName();
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,6 +26,7 @@ import org.adempiere.webui.component.Window;
|
||||||
import org.adempiere.webui.util.ZKUpdateUtil;
|
import org.adempiere.webui.util.ZKUpdateUtil;
|
||||||
import org.compiere.print.MPrintFormatItem;
|
import org.compiere.print.MPrintFormatItem;
|
||||||
import org.compiere.util.Env;
|
import org.compiere.util.Env;
|
||||||
|
import org.compiere.util.Language;
|
||||||
import org.compiere.util.Msg;
|
import org.compiere.util.Msg;
|
||||||
import org.zkoss.zk.ui.event.Event;
|
import org.zkoss.zk.ui.event.Event;
|
||||||
import org.zkoss.zk.ui.event.EventListener;
|
import org.zkoss.zk.ui.event.EventListener;
|
||||||
|
@ -159,7 +160,7 @@ public class WRC5SummaryFieldsPanel extends WRCTabPanel implements EventListener
|
||||||
|
|
||||||
for(int i=0 ;i<DisplayItems.size(); i++){
|
for(int i=0 ;i<DisplayItems.size(); i++){
|
||||||
row=new Row();
|
row=new Row();
|
||||||
String strValue = DisplayItems.get(i).getPrintName();
|
String strValue = DisplayItems.get(i).getPrintName(Language.getLoginLanguage());
|
||||||
if(strValue ==null || strValue.length()==0){
|
if(strValue ==null || strValue.length()==0){
|
||||||
strValue = DisplayItems.get(i).getName();
|
strValue = DisplayItems.get(i).getName();
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
<launcherArgs>
|
<launcherArgs>
|
||||||
<programArgs>-console
|
<programArgs>-console
|
||||||
</programArgs>
|
</programArgs>
|
||||||
<vmArgs>--add-modules java.se --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.nio=ALL-UNNAMED --add-opens java.base/sun.nio.ch=ALL-UNNAMED --add-opens java.management/sun.management=ALL-UNNAMED --add-opens jdk.management/com.sun.management.internal=ALL-UNNAMED --add-exports java.base/jdk.internal.ref=ALL-UNNAMED --add-exports java.desktop/sun.awt=ALL-UNNAMED --add-exports java.sql.rowset/com.sun.rowset=ALL-UNNAMED --add-exports java.naming/com.sun.jndi.ldap=ALL-UNNAMED -Declipse.product=org.adempiere.server.product -Dosgi.noShutdown=true -Dosgi.framework.activeThreadType=normal -Dorg.osgi.framework.bootdelegation=sun.security.ssl,org.w3c.dom.events -Dosgi.compatibility.bootdelegation=true -Djetty.home=jettyhome -Djetty.etc.config.urls=etc/jetty.xml,etc/jetty-deployer.xml,etc/jetty-ssl.xml,etc/jetty-ssl-context.xml,etc/jetty-http.xml,etc/jetty-alpn.xml,etc/jetty-http2.xml,etc/jetty-https.xml -Dmail.mime.encodefilename=true -Dmail.mime.decodefilename=true -Dmail.mime.encodeparameters=true -Dmail.mime.decodeparameters=true -Dhazelcast.config=hazelcast.xml -Dorg.zkoss.zk.config.path=file://${workspace_loc}/zk.xml
|
<vmArgs>--add-modules java.se --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.nio=ALL-UNNAMED --add-opens java.base/sun.nio.ch=ALL-UNNAMED --add-opens java.management/sun.management=ALL-UNNAMED --add-opens jdk.management/com.sun.management.internal=ALL-UNNAMED --add-exports java.base/jdk.internal.ref=ALL-UNNAMED --add-exports java.desktop/sun.awt=ALL-UNNAMED --add-exports java.sql.rowset/com.sun.rowset=ALL-UNNAMED --add-exports java.naming/com.sun.jndi.ldap=ALL-UNNAMED -Declipse.product=org.adempiere.server.product -Dosgi.noShutdown=true -Dosgi.framework.activeThreadType=normal -Dorg.osgi.framework.bootdelegation=sun.security.ssl,org.w3c.dom.events -Dosgi.compatibility.bootdelegation=true -Djetty.home=jettyhome -Djetty.etc.config.urls=etc/jetty.xml,etc/jetty-deployer.xml,etc/jetty-ssl.xml,etc/jetty-ssl-context.xml,etc/jetty-http.xml,etc/jetty-https.xml -Dmail.mime.encodefilename=true -Dmail.mime.decodefilename=true -Dmail.mime.encodeparameters=true -Dmail.mime.decodeparameters=true -Dhazelcast.config=hazelcast.xml -Dorg.zkoss.zk.config.path=file://${workspace_loc}/zk.xml
|
||||||
</vmArgs>
|
</vmArgs>
|
||||||
<vmArgsMac>-XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts
|
<vmArgsMac>-XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts
|
||||||
</vmArgsMac>
|
</vmArgsMac>
|
||||||
|
@ -67,14 +67,14 @@
|
||||||
<plugin id="org.mortbay.jasper.apache-el" autoStart="true" startLevel="0" />
|
<plugin id="org.mortbay.jasper.apache-el" autoStart="true" startLevel="0" />
|
||||||
<plugin id="org.mortbay.jasper.apache-jsp" autoStart="true" startLevel="0" />
|
<plugin id="org.mortbay.jasper.apache-jsp" autoStart="true" startLevel="0" />
|
||||||
<plugin id="org.restlet" autoStart="true" startLevel="0" />
|
<plugin id="org.restlet" autoStart="true" startLevel="0" />
|
||||||
|
<property name="org.eclipse.update.reconcile" value="false" />
|
||||||
|
<property name="osgi.instance.area.default" value="@config.dir/../workspace" />
|
||||||
<property name="eclipse.product" value="org.adempiere.server.product" />
|
<property name="eclipse.product" value="org.adempiere.server.product" />
|
||||||
<property name="org.eclipse.equinox.simpleconfigurator.exclusiveInstallation" value="false" />
|
<property name="org.eclipse.equinox.simpleconfigurator.exclusiveInstallation" value="false" />
|
||||||
<property name="org.eclipse.update.reconcile" value="false" />
|
|
||||||
<property name="osgi.checkConfiguration" value="true" />
|
<property name="osgi.checkConfiguration" value="true" />
|
||||||
<property name="osgi.compatibility.bootdelegation" value="true" />
|
|
||||||
<property name="osgi.console.enable.builtin" value="false" />
|
<property name="osgi.console.enable.builtin" value="false" />
|
||||||
<property name="osgi.framework.activeThreadType" value="normal" />
|
<property name="osgi.framework.activeThreadType" value="normal" />
|
||||||
<property name="osgi.instance.area.default" value="@config.dir/../workspace" />
|
<property name="osgi.compatibility.bootdelegation" value="true" />
|
||||||
<property name="osgi.noShutdown" value="true" />
|
<property name="osgi.noShutdown" value="true" />
|
||||||
</configurations>
|
</configurations>
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue