diff --git a/org.adempiere.base/src/org/compiere/model/MUserQuery.java b/org.adempiere.base/src/org/compiere/model/MUserQuery.java index 8a12fc773a..fabbc73b2e 100644 --- a/org.adempiere.base/src/org/compiere/model/MUserQuery.java +++ b/org.adempiere.base/src/org/compiere/model/MUserQuery.java @@ -38,7 +38,7 @@ public class MUserQuery extends X_AD_UserQuery /** * */ - private static final long serialVersionUID = -3606227368868305024L; + private static final long serialVersionUID = -5640578235804864422L; /** * Get all active queries of client for Tab @@ -250,6 +250,26 @@ public class MUserQuery extends X_AD_UserQuery } return retValue; } // get + + /** + * Get Specific Tab Query + * Private or globall + * @param ctx context + * @param AD_Tab_ID tab + * @param name name + * @return query or null + */ + public static MUserQuery getUserQueryByName(Properties ctx, int AD_Tab_ID, String name) + { + String sqlWhere = " AD_Client_ID=? AND AD_Tab_ID=? AND UPPER(Name) LIKE ? " + + "AND (AD_User_ID = ? OR AD_User_ID IS NULL) "; + + return new Query(ctx, Table_Name, sqlWhere, null) + .setParameters(Env.getAD_Client_ID (ctx), AD_Tab_ID, name.toUpperCase(), Env.getAD_User_ID(ctx)) + .setOnlyActiveRecords(true) + .setOrderBy("Name") + .first(); + } // getUserQueryByName /** Logger */ private static CLogger s_log = CLogger.getCLogger (MUserQuery.class); @@ -289,5 +309,31 @@ public class MUserQuery extends X_AD_UserQuery } return true; } + + /** + * Returns true if the current user can save the query privately + * @return + */ + public boolean userCanSave() { + if (getAD_Client_ID() != Env.getAD_Client_ID(Env.getCtx()) || //Cannot modify a query from another client (e.g. System) + getAD_User_ID() != Env.getAD_User_ID(Env.getCtx()) || //Cannot save a query from a different user + get_Value(COLUMNNAME_AD_User_ID) == null) //Cannot save privately (user-specific) an already existing global query + return false; + + return true; + } + + /** + * Returns true if the current users has permission + * to share or modify the query globally + * @return + */ + public boolean userCanShare() { + if (!MRole.PREFERENCETYPE_Client.equals(MRole.getDefault().getPreferenceType()) || //Share button only works for roles with preference level = Client + getAD_Client_ID() != Env.getAD_Client_ID(Env.getCtx())) //Cannot modify a query from another client (e.g. System) + return false; + + return true; + } } // MUserQuery diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/FindWindow.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/FindWindow.java index 0c7952fbb6..9ba4b09e1b 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/FindWindow.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/FindWindow.java @@ -1368,6 +1368,8 @@ public class FindWindow extends Window implements EventListener, ValueCha } else { cmd_saveSimple(true, shareAllUsers); } + if (shareAllUsers) + btnSave.setDisabled(true); } } // Confirm panel actions @@ -1477,14 +1479,8 @@ public class FindWindow extends Window implements EventListener, ValueCha } else { MUserQuery uq = userQueries[index-1]; - // If global query do not allow other users to save the query - if (uq.getAD_User_ID() != Env.getAD_User_ID(Env.getCtx())) { - if (!MRole.PREFERENCETYPE_Client.equals(MRole.getDefault().getPreferenceType()) || - uq.getAD_Client_ID() != Env.getAD_Client_ID(Env.getCtx())) { - btnSave.setDisabled(true); - btnShare.setDisabled(true); - } - } + btnSave.setDisabled(!uq.userCanSave()); + btnShare.setDisabled(!uq.userCanShare()); parseUserQuery(userQueries[index-1]); } } @@ -1829,7 +1825,7 @@ public class FindWindow extends Window implements EventListener, ValueCha code.append( (Object) historyCombo.getSelectedItem().getValue()); } - MUserQuery uq = MUserQuery.get(Env.getCtx(), m_AD_Tab_ID, name); + MUserQuery uq = MUserQuery.getUserQueryByName(Env.getCtx(), m_AD_Tab_ID, name); if (code.length() > 0) { // New or updated if (uq == null) // Create a new record {