diff --git a/migration/iD10/oracle/202206171231_IDEMPIERE-5319.sql b/migration/iD10/oracle/202206171231_IDEMPIERE-5319.sql
new file mode 100644
index 0000000000..86fcbe1be2
--- /dev/null
+++ b/migration/iD10/oracle/202206171231_IDEMPIERE-5319.sql
@@ -0,0 +1,100 @@
+-- IDEMPIERE-5319
+SELECT register_migration_script('202206171231_IDEMPIERE-5319.sql') FROM dual;
+
+SET SQLBLANKLINES ON
+SET DEFINE OFF
+
+-- Jun 17, 2022, 12:31:33 PM CEST
+INSERT INTO AD_Element (AD_Element_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,ColumnName,Name,PrintName,EntityType,AD_Element_UU) VALUES (203602,0,0,'Y',TO_TIMESTAMP('2022-06-17 12:31:33','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2022-06-17 12:31:33','YYYY-MM-DD HH24:MI:SS'),100,'DeleteConfirmationLogic','Delete Confirmation Logic','Delete Confirmation Logic','D','1ffaa85d-527c-4e37-9472-3f9e74d8fd1e')
+;
+
+-- Jun 17, 2022, 12:33:31 PM CEST
+INSERT INTO AD_Column (AD_Column_ID,Version,Name,AD_Table_ID,ColumnName,FieldLength,IsKey,IsParent,IsMandatory,IsTranslated,IsIdentifier,SeqNo,IsEncrypted,AD_Reference_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,AD_Element_ID,IsUpdateable,IsSelectionColumn,EntityType,IsSyncDatabase,IsAlwaysUpdateable,IsAutocomplete,IsAllowLogging,AD_Column_UU,IsAllowCopy,SeqNoSelection,IsToolbarButton,IsSecure,FKConstraintType,IsHtml) VALUES (214937,0,'Delete Confirmation Logic',106,'DeleteConfirmationLogic',255,'N','N','N','N','N',0,'N',10,0,0,'Y',TO_TIMESTAMP('2022-06-17 12:33:31','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2022-06-17 12:33:31','YYYY-MM-DD HH24:MI:SS'),100,203602,'Y','N','D','N','N','N','Y','c478ffba-25a8-4010-b77b-007286df5403','Y',0,'N','N','N','N')
+;
+
+-- Jun 17, 2022, 12:34:23 PM CEST
+INSERT INTO AD_Column (AD_Column_ID,Version,Name,AD_Table_ID,ColumnName,FieldLength,IsKey,IsParent,IsMandatory,IsTranslated,IsIdentifier,SeqNo,IsEncrypted,AD_Reference_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,AD_Element_ID,IsUpdateable,IsSelectionColumn,EntityType,IsSyncDatabase,IsAlwaysUpdateable,IsAutocomplete,IsAllowLogging,AD_Column_UU,IsAllowCopy,SeqNoSelection,IsToolbarButton,IsSecure,FKConstraintType,IsHtml) VALUES (214938,0,'Delete Confirmation Logic',466,'DeleteConfirmationLogic',255,'N','N','N','N','N',0,'N',10,0,0,'Y',TO_TIMESTAMP('2022-06-17 12:34:23','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2022-06-17 12:34:23','YYYY-MM-DD HH24:MI:SS'),100,203602,'Y','N','D','N','N','N','Y','124d81e0-1c59-4583-8c94-d2983184bc92','Y',0,'N','N','N','N')
+;
+
+-- Jun 17, 2022, 2:14:19 PM CEST
+ALTER TABLE AD_Tab ADD DeleteConfirmationLogic VARCHAR2(255 CHAR) DEFAULT NULL
+;
+
+-- Jun 17, 2022, 2:14:42 PM CEST
+ALTER TABLE AD_UserDef_Tab ADD DeleteConfirmationLogic VARCHAR2(255 CHAR) DEFAULT NULL
+;
+
+-- Jun 17, 2022, 2:27:18 PM CEST
+INSERT INTO AD_Field (AD_Field_ID,Name,AD_Tab_ID,AD_Column_ID,IsDisplayed,DisplayLength,SeqNo,SortNo,IsSameLine,IsHeading,IsFieldOnly,IsEncrypted,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,IsReadOnly,IsCentrallyMaintained,EntityType,AD_Field_UU,IsDisplayedGrid,SeqNoGrid,XPosition,ColumnSpan,NumLines,IsQuickEntry,IsDefaultFocus,IsAdvancedField,IsQuickForm) VALUES (207079,'Delete Confirmation Logic',106,214937,'Y',0,390,0,'N','N','N','N',0,0,'Y',TO_TIMESTAMP('2022-06-17 14:27:18','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2022-06-17 14:27:18','YYYY-MM-DD HH24:MI:SS'),100,'N','Y','D','58f3879f-6b9b-4f75-8f84-b3c654eff5f2','Y',360,1,1,1,'N','N','N','N')
+;
+
+-- Jun 17, 2022, 2:28:56 PM CEST
+UPDATE AD_Field SET IsDisplayed='Y', SeqNo=320, AD_Reference_Value_ID=NULL, AD_Val_Rule_ID=NULL, XPosition=1, ColumnSpan=5, IsToolbarButton=NULL,Updated=TO_TIMESTAMP('2022-06-17 14:28:56','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=207079
+;
+
+-- Jun 17, 2022, 2:28:57 PM CEST
+UPDATE AD_Field SET SeqNo=330, AD_Reference_Value_ID=NULL, AD_Val_Rule_ID=NULL, IsToolbarButton=NULL,Updated=TO_TIMESTAMP('2022-06-17 14:28:57','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=1548
+;
+
+-- Jun 17, 2022, 2:28:57 PM CEST
+UPDATE AD_Field SET SeqNo=340, AD_Reference_Value_ID=NULL, AD_Val_Rule_ID=NULL, IsToolbarButton=NULL,Updated=TO_TIMESTAMP('2022-06-17 14:28:57','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=1550
+;
+
+-- Jun 17, 2022, 2:28:57 PM CEST
+UPDATE AD_Field SET SeqNo=350, AD_Reference_Value_ID=NULL, AD_Val_Rule_ID=NULL, IsToolbarButton=NULL,Updated=TO_TIMESTAMP('2022-06-17 14:28:57','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=1549
+;
+
+-- Jun 17, 2022, 2:28:57 PM CEST
+UPDATE AD_Field SET SeqNo=360, AD_Reference_Value_ID=NULL, AD_Val_Rule_ID=NULL, IsToolbarButton=NULL,Updated=TO_TIMESTAMP('2022-06-17 14:28:57','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=4956
+;
+
+-- Jun 17, 2022, 2:28:57 PM CEST
+UPDATE AD_Field SET SeqNo=370, AD_Reference_Value_ID=NULL, AD_Val_Rule_ID=NULL, IsToolbarButton=NULL,Updated=TO_TIMESTAMP('2022-06-17 14:28:57','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=201811
+;
+
+-- Jun 17, 2022, 2:28:57 PM CEST
+UPDATE AD_Field SET SeqNo=380, AD_Reference_Value_ID=NULL, AD_Val_Rule_ID=NULL, IsToolbarButton=NULL,Updated=TO_TIMESTAMP('2022-06-17 14:28:57','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=5131
+;
+
+-- Jun 17, 2022, 2:28:57 PM CEST
+UPDATE AD_Field SET SeqNo=390, AD_Reference_Value_ID=NULL, AD_Val_Rule_ID=NULL, IsToolbarButton=NULL,Updated=TO_TIMESTAMP('2022-06-17 14:28:57','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=3205
+;
+
+-- Jun 17, 2022, 2:29:57 PM CEST
+INSERT INTO AD_Field (AD_Field_ID,Name,AD_Tab_ID,AD_Column_ID,IsDisplayed,DisplayLength,SeqNo,SortNo,IsSameLine,IsHeading,IsFieldOnly,IsEncrypted,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,IsReadOnly,IsCentrallyMaintained,EntityType,AD_Field_UU,IsDisplayedGrid,SeqNoGrid,XPosition,ColumnSpan,NumLines,IsQuickEntry,IsDefaultFocus,IsAdvancedField,IsQuickForm) VALUES (207080,'Delete Confirmation Logic',394,214938,'Y',0,190,0,'N','N','N','N',0,0,'Y',TO_TIMESTAMP('2022-06-17 14:29:56','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2022-06-17 14:29:56','YYYY-MM-DD HH24:MI:SS'),100,'N','Y','D','77efa46f-f83b-4ca8-87cc-375e26d3084f','Y',190,1,1,1,'N','N','N','N')
+;
+
+-- Jun 17, 2022, 2:30:46 PM CEST
+UPDATE AD_Field SET IsDisplayed='Y', SeqNo=150, AD_Reference_Value_ID=NULL, AD_Val_Rule_ID=NULL, XPosition=1, ColumnSpan=5, IsToolbarButton=NULL,Updated=TO_TIMESTAMP('2022-06-17 14:30:46','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=207080
+;
+
+-- Jun 17, 2022, 2:30:46 PM CEST
+UPDATE AD_Field SET SeqNo=160, AD_Reference_Value_ID=NULL, AD_Val_Rule_ID=NULL, IsToolbarButton=NULL,Updated=TO_TIMESTAMP('2022-06-17 14:30:46','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=205833
+;
+
+-- Jun 17, 2022, 2:30:46 PM CEST
+UPDATE AD_Field SET SeqNo=170, AD_Reference_Value_ID=NULL, AD_Val_Rule_ID=NULL, IsToolbarButton=NULL,Updated=TO_TIMESTAMP('2022-06-17 14:30:46','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=200003
+;
+
+-- Jun 17, 2022, 2:30:46 PM CEST
+UPDATE AD_Field SET SeqNo=180, AD_Reference_Value_ID=NULL, AD_Val_Rule_ID=NULL, IsToolbarButton=NULL,Updated=TO_TIMESTAMP('2022-06-17 14:30:46','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=205828
+;
+
+-- Jun 17, 2022, 2:30:46 PM CEST
+UPDATE AD_Field SET SeqNo=190, AD_Reference_Value_ID=NULL, AD_Val_Rule_ID=NULL, IsToolbarButton=NULL,Updated=TO_TIMESTAMP('2022-06-17 14:30:46','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=205830
+;
+
+-- Jun 17, 2022, 2:50:13 PM CEST
+INSERT INTO AD_Message (MsgType,MsgText,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,AD_Message_ID,Value,EntityType,AD_Message_UU) VALUES ('I','Do you want to delete the record?
+Please confirm by typing: {0}',0,0,'Y',TO_TIMESTAMP('2022-06-17 14:50:13','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2022-06-17 14:50:13','YYYY-MM-DD HH24:MI:SS'),100,200763,'DeleteRecordWithConfirm?','D','f95200bf-125c-4d7e-a157-79cd1971905d')
+;
+
+-- Jun 21, 2022, 10:32:12 AM CEST
+INSERT INTO AD_Message (MsgType,MsgText,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,AD_Message_ID,Value,EntityType,AD_Message_UU) VALUES ('I','Do you want to delete {0} (selected) items?
+Please confirm by typing: {1}',0,0,'Y',TO_TIMESTAMP('2022-06-21 10:32:11','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2022-06-21 10:32:11','YYYY-MM-DD HH24:MI:SS'),100,200764,'DeleteSelectionWithConfirm?','D','850eaab7-0ae9-48db-8232-80af712b5024')
+;
+
+-- Jun 22, 2022, 1:16:31 PM CEST
+INSERT INTO AD_Message (MsgType,MsgText,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,AD_Message_ID,Value,EntityType,AD_Message_UU) VALUES ('E','Entered Value Is Not Correct',0,0,'Y',TO_TIMESTAMP('2022-06-22 13:16:30','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2022-06-22 13:16:30','YYYY-MM-DD HH24:MI:SS'),100,200765,'ValueNotCorrect','D','a8be89f0-367c-4f4b-8df8-62b6da3f3f2e')
+;
+
diff --git a/migration/iD10/postgresql/202206171231_IDEMPIERE-5319.sql b/migration/iD10/postgresql/202206171231_IDEMPIERE-5319.sql
new file mode 100644
index 0000000000..274421840d
--- /dev/null
+++ b/migration/iD10/postgresql/202206171231_IDEMPIERE-5319.sql
@@ -0,0 +1,97 @@
+-- IDEMPIERE-5319
+SELECT register_migration_script('202206171231_IDEMPIERE-5319.sql') FROM dual;
+
+-- Jun 17, 2022, 12:31:33 PM CEST
+INSERT INTO AD_Element (AD_Element_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,ColumnName,Name,PrintName,EntityType,AD_Element_UU) VALUES (203602,0,0,'Y',TO_TIMESTAMP('2022-06-17 12:31:33','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2022-06-17 12:31:33','YYYY-MM-DD HH24:MI:SS'),100,'DeleteConfirmationLogic','Delete Confirmation Logic','Delete Confirmation Logic','D','1ffaa85d-527c-4e37-9472-3f9e74d8fd1e')
+;
+
+-- Jun 17, 2022, 12:33:31 PM CEST
+INSERT INTO AD_Column (AD_Column_ID,Version,Name,AD_Table_ID,ColumnName,FieldLength,IsKey,IsParent,IsMandatory,IsTranslated,IsIdentifier,SeqNo,IsEncrypted,AD_Reference_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,AD_Element_ID,IsUpdateable,IsSelectionColumn,EntityType,IsSyncDatabase,IsAlwaysUpdateable,IsAutocomplete,IsAllowLogging,AD_Column_UU,IsAllowCopy,SeqNoSelection,IsToolbarButton,IsSecure,FKConstraintType,IsHtml) VALUES (214937,0,'Delete Confirmation Logic',106,'DeleteConfirmationLogic',255,'N','N','N','N','N',0,'N',10,0,0,'Y',TO_TIMESTAMP('2022-06-17 12:33:31','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2022-06-17 12:33:31','YYYY-MM-DD HH24:MI:SS'),100,203602,'Y','N','D','N','N','N','Y','c478ffba-25a8-4010-b77b-007286df5403','Y',0,'N','N','N','N')
+;
+
+-- Jun 17, 2022, 12:34:23 PM CEST
+INSERT INTO AD_Column (AD_Column_ID,Version,Name,AD_Table_ID,ColumnName,FieldLength,IsKey,IsParent,IsMandatory,IsTranslated,IsIdentifier,SeqNo,IsEncrypted,AD_Reference_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,AD_Element_ID,IsUpdateable,IsSelectionColumn,EntityType,IsSyncDatabase,IsAlwaysUpdateable,IsAutocomplete,IsAllowLogging,AD_Column_UU,IsAllowCopy,SeqNoSelection,IsToolbarButton,IsSecure,FKConstraintType,IsHtml) VALUES (214938,0,'Delete Confirmation Logic',466,'DeleteConfirmationLogic',255,'N','N','N','N','N',0,'N',10,0,0,'Y',TO_TIMESTAMP('2022-06-17 12:34:23','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2022-06-17 12:34:23','YYYY-MM-DD HH24:MI:SS'),100,203602,'Y','N','D','N','N','N','Y','124d81e0-1c59-4583-8c94-d2983184bc92','Y',0,'N','N','N','N')
+;
+
+-- Jun 17, 2022, 2:14:19 PM CEST
+ALTER TABLE AD_Tab ADD COLUMN DeleteConfirmationLogic VARCHAR(255) DEFAULT NULL
+;
+
+-- Jun 17, 2022, 2:14:42 PM CEST
+ALTER TABLE AD_UserDef_Tab ADD COLUMN DeleteConfirmationLogic VARCHAR(255) DEFAULT NULL
+;
+
+-- Jun 17, 2022, 2:27:18 PM CEST
+INSERT INTO AD_Field (AD_Field_ID,Name,AD_Tab_ID,AD_Column_ID,IsDisplayed,DisplayLength,SeqNo,SortNo,IsSameLine,IsHeading,IsFieldOnly,IsEncrypted,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,IsReadOnly,IsCentrallyMaintained,EntityType,AD_Field_UU,IsDisplayedGrid,SeqNoGrid,XPosition,ColumnSpan,NumLines,IsQuickEntry,IsDefaultFocus,IsAdvancedField,IsQuickForm) VALUES (207079,'Delete Confirmation Logic',106,214937,'Y',0,390,0,'N','N','N','N',0,0,'Y',TO_TIMESTAMP('2022-06-17 14:27:18','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2022-06-17 14:27:18','YYYY-MM-DD HH24:MI:SS'),100,'N','Y','D','58f3879f-6b9b-4f75-8f84-b3c654eff5f2','Y',360,1,1,1,'N','N','N','N')
+;
+
+-- Jun 17, 2022, 2:28:56 PM CEST
+UPDATE AD_Field SET IsDisplayed='Y', SeqNo=320, AD_Reference_Value_ID=NULL, AD_Val_Rule_ID=NULL, XPosition=1, ColumnSpan=5, IsToolbarButton=NULL,Updated=TO_TIMESTAMP('2022-06-17 14:28:56','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=207079
+;
+
+-- Jun 17, 2022, 2:28:57 PM CEST
+UPDATE AD_Field SET SeqNo=330, AD_Reference_Value_ID=NULL, AD_Val_Rule_ID=NULL, IsToolbarButton=NULL,Updated=TO_TIMESTAMP('2022-06-17 14:28:57','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=1548
+;
+
+-- Jun 17, 2022, 2:28:57 PM CEST
+UPDATE AD_Field SET SeqNo=340, AD_Reference_Value_ID=NULL, AD_Val_Rule_ID=NULL, IsToolbarButton=NULL,Updated=TO_TIMESTAMP('2022-06-17 14:28:57','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=1550
+;
+
+-- Jun 17, 2022, 2:28:57 PM CEST
+UPDATE AD_Field SET SeqNo=350, AD_Reference_Value_ID=NULL, AD_Val_Rule_ID=NULL, IsToolbarButton=NULL,Updated=TO_TIMESTAMP('2022-06-17 14:28:57','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=1549
+;
+
+-- Jun 17, 2022, 2:28:57 PM CEST
+UPDATE AD_Field SET SeqNo=360, AD_Reference_Value_ID=NULL, AD_Val_Rule_ID=NULL, IsToolbarButton=NULL,Updated=TO_TIMESTAMP('2022-06-17 14:28:57','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=4956
+;
+
+-- Jun 17, 2022, 2:28:57 PM CEST
+UPDATE AD_Field SET SeqNo=370, AD_Reference_Value_ID=NULL, AD_Val_Rule_ID=NULL, IsToolbarButton=NULL,Updated=TO_TIMESTAMP('2022-06-17 14:28:57','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=201811
+;
+
+-- Jun 17, 2022, 2:28:57 PM CEST
+UPDATE AD_Field SET SeqNo=380, AD_Reference_Value_ID=NULL, AD_Val_Rule_ID=NULL, IsToolbarButton=NULL,Updated=TO_TIMESTAMP('2022-06-17 14:28:57','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=5131
+;
+
+-- Jun 17, 2022, 2:28:57 PM CEST
+UPDATE AD_Field SET SeqNo=390, AD_Reference_Value_ID=NULL, AD_Val_Rule_ID=NULL, IsToolbarButton=NULL,Updated=TO_TIMESTAMP('2022-06-17 14:28:57','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=3205
+;
+
+-- Jun 17, 2022, 2:29:57 PM CEST
+INSERT INTO AD_Field (AD_Field_ID,Name,AD_Tab_ID,AD_Column_ID,IsDisplayed,DisplayLength,SeqNo,SortNo,IsSameLine,IsHeading,IsFieldOnly,IsEncrypted,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,IsReadOnly,IsCentrallyMaintained,EntityType,AD_Field_UU,IsDisplayedGrid,SeqNoGrid,XPosition,ColumnSpan,NumLines,IsQuickEntry,IsDefaultFocus,IsAdvancedField,IsQuickForm) VALUES (207080,'Delete Confirmation Logic',394,214938,'Y',0,190,0,'N','N','N','N',0,0,'Y',TO_TIMESTAMP('2022-06-17 14:29:56','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2022-06-17 14:29:56','YYYY-MM-DD HH24:MI:SS'),100,'N','Y','D','77efa46f-f83b-4ca8-87cc-375e26d3084f','Y',190,1,1,1,'N','N','N','N')
+;
+
+-- Jun 17, 2022, 2:30:46 PM CEST
+UPDATE AD_Field SET IsDisplayed='Y', SeqNo=150, AD_Reference_Value_ID=NULL, AD_Val_Rule_ID=NULL, XPosition=1, ColumnSpan=5, IsToolbarButton=NULL,Updated=TO_TIMESTAMP('2022-06-17 14:30:46','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=207080
+;
+
+-- Jun 17, 2022, 2:30:46 PM CEST
+UPDATE AD_Field SET SeqNo=160, AD_Reference_Value_ID=NULL, AD_Val_Rule_ID=NULL, IsToolbarButton=NULL,Updated=TO_TIMESTAMP('2022-06-17 14:30:46','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=205833
+;
+
+-- Jun 17, 2022, 2:30:46 PM CEST
+UPDATE AD_Field SET SeqNo=170, AD_Reference_Value_ID=NULL, AD_Val_Rule_ID=NULL, IsToolbarButton=NULL,Updated=TO_TIMESTAMP('2022-06-17 14:30:46','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=200003
+;
+
+-- Jun 17, 2022, 2:30:46 PM CEST
+UPDATE AD_Field SET SeqNo=180, AD_Reference_Value_ID=NULL, AD_Val_Rule_ID=NULL, IsToolbarButton=NULL,Updated=TO_TIMESTAMP('2022-06-17 14:30:46','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=205828
+;
+
+-- Jun 17, 2022, 2:30:46 PM CEST
+UPDATE AD_Field SET SeqNo=190, AD_Reference_Value_ID=NULL, AD_Val_Rule_ID=NULL, IsToolbarButton=NULL,Updated=TO_TIMESTAMP('2022-06-17 14:30:46','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=205830
+;
+
+-- Jun 17, 2022, 2:50:13 PM CEST
+INSERT INTO AD_Message (MsgType,MsgText,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,AD_Message_ID,Value,EntityType,AD_Message_UU) VALUES ('I','Do you want to delete the record?
+Please confirm by typing: {0}',0,0,'Y',TO_TIMESTAMP('2022-06-17 14:50:13','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2022-06-17 14:50:13','YYYY-MM-DD HH24:MI:SS'),100,200763,'DeleteRecordWithConfirm?','D','f95200bf-125c-4d7e-a157-79cd1971905d')
+;
+
+-- Jun 21, 2022, 10:32:12 AM CEST
+INSERT INTO AD_Message (MsgType,MsgText,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,AD_Message_ID,Value,EntityType,AD_Message_UU) VALUES ('I','Do you want to delete {0} (selected) items?
+Please confirm by typing: {1}',0,0,'Y',TO_TIMESTAMP('2022-06-21 10:32:11','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2022-06-21 10:32:11','YYYY-MM-DD HH24:MI:SS'),100,200764,'DeleteSelectionWithConfirm?','D','850eaab7-0ae9-48db-8232-80af712b5024')
+;
+
+-- Jun 22, 2022, 1:16:31 PM CEST
+INSERT INTO AD_Message (MsgType,MsgText,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,AD_Message_ID,Value,EntityType,AD_Message_UU) VALUES ('E','Entered Value Is Not Correct',0,0,'Y',TO_TIMESTAMP('2022-06-22 13:16:30','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2022-06-22 13:16:30','YYYY-MM-DD HH24:MI:SS'),100,200765,'ValueNotCorrect','D','a8be89f0-367c-4f4b-8df8-62b6da3f3f2e')
+;
+
diff --git a/org.adempiere.base/src/org/compiere/model/GridTab.java b/org.adempiere.base/src/org/compiere/model/GridTab.java
index 5ebc4f9e69..90975badb4 100644
--- a/org.adempiere.base/src/org/compiere/model/GridTab.java
+++ b/org.adempiere.base/src/org/compiere/model/GridTab.java
@@ -3462,6 +3462,22 @@ public class GridTab implements DataStatusListener, Evaluatee, Serializable
this.calloutUI = calloutUI;
}
+ /**
+ * Get Delete Confirmation Logic
+ * @return String
+ */
+ public String getDeleteConfirmationLogic() {
+ return m_vo.deleteConfirmationLogic;
+ }
+
+ /**
+ * Set Delete Confirmation Logic
+ * @param deleteConfirmationLogic
+ */
+ public void setDeleteConfirmationLogic(String deleteConfirmationLogic) {
+ m_vo.deleteConfirmationLogic = deleteConfirmationLogic;
+ }
+
/** Get Max Query Records.
* @return If defined, you cannot query more records as defined - the query criteria needs to be changed to query less records
*/
diff --git a/org.adempiere.base/src/org/compiere/model/GridTabVO.java b/org.adempiere.base/src/org/compiere/model/GridTabVO.java
index 5bf0eb586b..1827199654 100644
--- a/org.adempiere.base/src/org/compiere/model/GridTabVO.java
+++ b/org.adempiere.base/src/org/compiere/model/GridTabVO.java
@@ -105,9 +105,21 @@ public class GridTabVO implements Evaluatee, Serializable
Env.setContext(vo.ctx, vo.WindowNo, vo.TabNo, GridTab.CTX_AD_Tab_UU, vo.AD_Tab_UU);
// FR IDEMPIERE-177
MUserDefTab userDef = MUserDefTab.get(vo.ctx, vo.AD_Tab_ID, vo.AD_Window_ID);
+ MTab tab = MTab.get(vo.AD_Tab_ID);
vo.Name = rs.getString("Name");
- if (userDef != null && userDef.getName() != null)
- vo.Name = userDef.getName();
+ if (userDef != null) {
+ if(!Util.isEmpty(userDef.getName()))
+ vo.Name = userDef.getName();
+
+ if(!Util.isEmpty(userDef.getDeleteConfirmationLogic()))
+ vo.deleteConfirmationLogic = userDef.getDeleteConfirmationLogic();
+ else if((tab != null) && (!Util.isEmpty(tab.getDeleteConfirmationLogic())))
+ vo.deleteConfirmationLogic = tab.getDeleteConfirmationLogic();
+
+ }
+ else if((tab != null) && (!Util.isEmpty(tab.getDeleteConfirmationLogic()))) {
+ vo.deleteConfirmationLogic = tab.getDeleteConfirmationLogic();
+ }
Env.setContext(vo.ctx, vo.WindowNo, vo.TabNo, GridTab.CTX_Name, vo.Name);
// Translation Tab **
@@ -547,6 +559,9 @@ public class GridTabVO implements Evaluatee, Serializable
private ArrayList Fields = null;
private boolean initFields = false;
+
+ /** Delete Confirmation Logic of AD_Tab or AD_UserDef_Tab */
+ public String deleteConfirmationLogic = null;
public ArrayList getFields()
{
@@ -627,6 +642,7 @@ public class GridTabVO implements Evaluatee, Serializable
clone.AD_Image_ID = AD_Image_ID;
clone.Included_Tab_ID = Included_Tab_ID;
clone.ReplicationType = ReplicationType;
+ clone.deleteConfirmationLogic = deleteConfirmationLogic;
Env.setContext(Ctx, windowNo, clone.TabNo, GridTab.CTX_AccessLevel, clone.AccessLevel);
Env.setContext(Ctx, windowNo, clone.TabNo, GridTab.CTX_AD_Table_ID, String.valueOf(clone.AD_Table_ID));
Env.setContext(Ctx, windowNo, clone.TabNo, GridTab.CTX_IsLookupOnlySelection, clone.IsLookupOnlySelection);
diff --git a/org.adempiere.base/src/org/compiere/model/I_AD_Tab.java b/org.adempiere.base/src/org/compiere/model/I_AD_Tab.java
index 0253cc5d82..cd8301ecd2 100644
--- a/org.adempiere.base/src/org/compiere/model/I_AD_Tab.java
+++ b/org.adempiere.base/src/org/compiere/model/I_AD_Tab.java
@@ -44,26 +44,11 @@ public interface I_AD_Tab
/** Column name AD_Client_ID */
public static final String COLUMNNAME_AD_Client_ID = "AD_Client_ID";
- /** Get Client.
- * Client/Tenant for this installation.
+ /** Get Tenant.
+ * Tenant for this installation.
*/
public int getAD_Client_ID();
- /** Column name AD_Column_ID */
- public static final String COLUMNNAME_AD_Column_ID = "AD_Column_ID";
-
- /** Set Column.
- * Column in the table
- */
- public void setAD_Column_ID (int AD_Column_ID);
-
- /** Get Column.
- * Column in the table
- */
- public int getAD_Column_ID();
-
- public org.compiere.model.I_AD_Column getAD_Column() throws RuntimeException;
-
/** Column name AD_ColumnSortOrder_ID */
public static final String COLUMNNAME_AD_ColumnSortOrder_ID = "AD_ColumnSortOrder_ID";
@@ -94,6 +79,21 @@ public interface I_AD_Tab
public org.compiere.model.I_AD_Column getAD_ColumnSortYesNo() throws RuntimeException;
+ /** Column name AD_Column_ID */
+ public static final String COLUMNNAME_AD_Column_ID = "AD_Column_ID";
+
+ /** Set Column.
+ * Column in the table
+ */
+ public void setAD_Column_ID (int AD_Column_ID);
+
+ /** Get Column.
+ * Column in the table
+ */
+ public int getAD_Column_ID();
+
+ public org.compiere.model.I_AD_Column getAD_Column() throws RuntimeException;
+
/** Column name AD_CtxHelp_ID */
public static final String COLUMNNAME_AD_CtxHelp_ID = "AD_CtxHelp_ID";
@@ -124,12 +124,12 @@ public interface I_AD_Tab
public static final String COLUMNNAME_AD_Org_ID = "AD_Org_ID";
/** Set Organization.
- * Organizational entity within client
+ * Organizational entity within tenant
*/
public void setAD_Org_ID (int AD_Org_ID);
/** Get Organization.
- * Organizational entity within client
+ * Organizational entity within tenant
*/
public int getAD_Org_ID();
@@ -148,6 +148,19 @@ public interface I_AD_Tab
public org.compiere.model.I_AD_Process getAD_Process() throws RuntimeException;
+ /** Column name AD_TabType */
+ public static final String COLUMNNAME_AD_TabType = "AD_TabType";
+
+ /** Set Tab Type.
+ * Defines Tab Type
+ */
+ public void setAD_TabType (String AD_TabType);
+
+ /** Get Tab Type.
+ * Defines Tab Type
+ */
+ public String getAD_TabType();
+
/** Column name AD_Tab_ID */
public static final String COLUMNNAME_AD_Tab_ID = "AD_Tab_ID";
@@ -185,19 +198,6 @@ public interface I_AD_Tab
public org.compiere.model.I_AD_Table getAD_Table() throws RuntimeException;
- /** Column name AD_TabType */
- public static final String COLUMNNAME_AD_TabType = "AD_TabType";
-
- /** Set Tab Type.
- * Defines Tab Type
- */
- public void setAD_TabType (String AD_TabType);
-
- /** Get Tab Type.
- * Defines Tab Type
- */
- public String getAD_TabType();
-
/** Column name AD_Window_ID */
public static final String COLUMNNAME_AD_Window_ID = "AD_Window_ID";
@@ -242,6 +242,15 @@ public interface I_AD_Tab
*/
public int getCreatedBy();
+ /** Column name DeleteConfirmationLogic */
+ public static final String COLUMNNAME_DeleteConfirmationLogic = "DeleteConfirmationLogic";
+
+ /** Set Delete Confirmation Logic */
+ public void setDeleteConfirmationLogic (String DeleteConfirmationLogic);
+
+ /** Get Delete Confirmation Logic */
+ public String getDeleteConfirmationLogic();
+
/** Column name Description */
public static final String COLUMNNAME_Description = "Description";
@@ -466,12 +475,12 @@ public interface I_AD_Tab
/** Column name IsTranslationTab */
public static final String COLUMNNAME_IsTranslationTab = "IsTranslationTab";
- /** Set TranslationTab.
+ /** Set Translation Tab.
* This Tab contains translation information
*/
public void setIsTranslationTab (boolean IsTranslationTab);
- /** Get TranslationTab.
+ /** Get Translation Tab.
* This Tab contains translation information
*/
public boolean isTranslationTab();
diff --git a/org.adempiere.base/src/org/compiere/model/I_AD_UserDef_Tab.java b/org.adempiere.base/src/org/compiere/model/I_AD_UserDef_Tab.java
index 8cffecb436..3c4bebf0b8 100644
--- a/org.adempiere.base/src/org/compiere/model/I_AD_UserDef_Tab.java
+++ b/org.adempiere.base/src/org/compiere/model/I_AD_UserDef_Tab.java
@@ -44,8 +44,8 @@ public interface I_AD_UserDef_Tab
/** Column name AD_Client_ID */
public static final String COLUMNNAME_AD_Client_ID = "AD_Client_ID";
- /** Get Client.
- * Client/Tenant for this installation.
+ /** Get Tenant.
+ * Tenant for this installation.
*/
public int getAD_Client_ID();
@@ -53,12 +53,12 @@ public interface I_AD_UserDef_Tab
public static final String COLUMNNAME_AD_Org_ID = "AD_Org_ID";
/** Set Organization.
- * Organizational entity within client
+ * Organizational entity within tenant
*/
public void setAD_Org_ID (int AD_Org_ID);
/** Get Organization.
- * Organizational entity within client
+ * Organizational entity within tenant
*/
public int getAD_Org_ID();
@@ -137,6 +137,15 @@ public interface I_AD_UserDef_Tab
*/
public int getCreatedBy();
+ /** Column name DeleteConfirmationLogic */
+ public static final String COLUMNNAME_DeleteConfirmationLogic = "DeleteConfirmationLogic";
+
+ /** Set Delete Confirmation Logic */
+ public void setDeleteConfirmationLogic (String DeleteConfirmationLogic);
+
+ /** Get Delete Confirmation Logic */
+ public String getDeleteConfirmationLogic();
+
/** Column name Description */
public static final String COLUMNNAME_Description = "Description";
diff --git a/org.adempiere.base/src/org/compiere/model/X_AD_Tab.java b/org.adempiere.base/src/org/compiere/model/X_AD_Tab.java
index 65a56648ef..b286ebe95b 100644
--- a/org.adempiere.base/src/org/compiere/model/X_AD_Tab.java
+++ b/org.adempiere.base/src/org/compiere/model/X_AD_Tab.java
@@ -31,7 +31,7 @@ public class X_AD_Tab extends PO implements I_AD_Tab, I_Persistent
/**
*
*/
- private static final long serialVersionUID = 20220119L;
+ private static final long serialVersionUID = 20220617L;
/** Standard Constructor */
public X_AD_Tab (Properties ctx, int AD_Tab_ID, String trxName)
@@ -123,34 +123,6 @@ public class X_AD_Tab extends PO implements I_AD_Tab, I_Persistent
return sb.toString();
}
- public org.compiere.model.I_AD_Column getAD_Column() throws RuntimeException
- {
- return (org.compiere.model.I_AD_Column)MTable.get(getCtx(), org.compiere.model.I_AD_Column.Table_ID)
- .getPO(getAD_Column_ID(), get_TrxName());
- }
-
- /** Set Column.
- @param AD_Column_ID Column in the table
- */
- public void setAD_Column_ID (int AD_Column_ID)
- {
- if (AD_Column_ID < 1)
- set_Value (COLUMNNAME_AD_Column_ID, null);
- else
- set_Value (COLUMNNAME_AD_Column_ID, Integer.valueOf(AD_Column_ID));
- }
-
- /** Get Column.
- @return Column in the table
- */
- public int getAD_Column_ID()
- {
- Integer ii = (Integer)get_Value(COLUMNNAME_AD_Column_ID);
- if (ii == null)
- return 0;
- return ii.intValue();
- }
-
public org.compiere.model.I_AD_Column getAD_ColumnSortOrder() throws RuntimeException
{
return (org.compiere.model.I_AD_Column)MTable.get(getCtx(), org.compiere.model.I_AD_Column.Table_ID)
@@ -207,6 +179,34 @@ public class X_AD_Tab extends PO implements I_AD_Tab, I_Persistent
return ii.intValue();
}
+ public org.compiere.model.I_AD_Column getAD_Column() throws RuntimeException
+ {
+ return (org.compiere.model.I_AD_Column)MTable.get(getCtx(), org.compiere.model.I_AD_Column.Table_ID)
+ .getPO(getAD_Column_ID(), get_TrxName());
+ }
+
+ /** Set Column.
+ @param AD_Column_ID Column in the table
+ */
+ public void setAD_Column_ID (int AD_Column_ID)
+ {
+ if (AD_Column_ID < 1)
+ set_Value (COLUMNNAME_AD_Column_ID, null);
+ else
+ set_Value (COLUMNNAME_AD_Column_ID, Integer.valueOf(AD_Column_ID));
+ }
+
+ /** Get Column.
+ @return Column in the table
+ */
+ public int getAD_Column_ID()
+ {
+ Integer ii = (Integer)get_Value(COLUMNNAME_AD_Column_ID);
+ if (ii == null)
+ return 0;
+ return ii.intValue();
+ }
+
public org.compiere.model.I_AD_CtxHelp getAD_CtxHelp() throws RuntimeException
{
return (org.compiere.model.I_AD_CtxHelp)MTable.get(getCtx(), org.compiere.model.I_AD_CtxHelp.Table_ID)
@@ -290,6 +290,29 @@ public class X_AD_Tab extends PO implements I_AD_Tab, I_Persistent
return ii.intValue();
}
+ /** AD_TabType AD_Reference_ID=200117 */
+ public static final int AD_TABTYPE_AD_Reference_ID=200117;
+ /** Form = FORM */
+ public static final String AD_TABTYPE_Form = "FORM";
+ /** Sort = SORT */
+ public static final String AD_TABTYPE_Sort = "SORT";
+ /** Set Tab Type.
+ @param AD_TabType Defines Tab Type
+ */
+ public void setAD_TabType (String AD_TabType)
+ {
+
+ set_Value (COLUMNNAME_AD_TabType, AD_TabType);
+ }
+
+ /** Get Tab Type.
+ @return Defines Tab Type
+ */
+ public String getAD_TabType()
+ {
+ return (String)get_Value(COLUMNNAME_AD_TabType);
+ }
+
/** Set Tab.
@param AD_Tab_ID Tab within a Window
*/
@@ -355,29 +378,6 @@ public class X_AD_Tab extends PO implements I_AD_Tab, I_Persistent
return ii.intValue();
}
- /** AD_TabType AD_Reference_ID=200117 */
- public static final int AD_TABTYPE_AD_Reference_ID=200117;
- /** Form = FORM */
- public static final String AD_TABTYPE_Form = "FORM";
- /** Sort = SORT */
- public static final String AD_TABTYPE_Sort = "SORT";
- /** Set Tab Type.
- @param AD_TabType Defines Tab Type
- */
- public void setAD_TabType (String AD_TabType)
- {
-
- set_Value (COLUMNNAME_AD_TabType, AD_TabType);
- }
-
- /** Get Tab Type.
- @return Defines Tab Type
- */
- public String getAD_TabType()
- {
- return (String)get_Value(COLUMNNAME_AD_TabType);
- }
-
public org.compiere.model.I_AD_Window getAD_Window() throws RuntimeException
{
return (org.compiere.model.I_AD_Window)MTable.get(getCtx(), org.compiere.model.I_AD_Window.Table_ID)
@@ -422,6 +422,21 @@ public class X_AD_Tab extends PO implements I_AD_Tab, I_Persistent
return (String)get_Value(COLUMNNAME_CommitWarning);
}
+ /** Set Delete Confirmation Logic.
+ @param DeleteConfirmationLogic Delete Confirmation Logic
+ */
+ public void setDeleteConfirmationLogic (String DeleteConfirmationLogic)
+ {
+ set_Value (COLUMNNAME_DeleteConfirmationLogic, DeleteConfirmationLogic);
+ }
+
+ /** Get Delete Confirmation Logic.
+ @return Delete Confirmation Logic */
+ public String getDeleteConfirmationLogic()
+ {
+ return (String)get_Value(COLUMNNAME_DeleteConfirmationLogic);
+ }
+
/** Set Description.
@param Description Optional short description of the record
*/
@@ -762,7 +777,7 @@ public class X_AD_Tab extends PO implements I_AD_Tab, I_Persistent
return false;
}
- /** Set TranslationTab.
+ /** Set Translation Tab.
@param IsTranslationTab This Tab contains translation information
*/
public void setIsTranslationTab (boolean IsTranslationTab)
@@ -770,7 +785,7 @@ public class X_AD_Tab extends PO implements I_AD_Tab, I_Persistent
set_Value (COLUMNNAME_IsTranslationTab, Boolean.valueOf(IsTranslationTab));
}
- /** Get TranslationTab.
+ /** Get Translation Tab.
@return This Tab contains translation information
*/
public boolean isTranslationTab()
diff --git a/org.adempiere.base/src/org/compiere/model/X_AD_UserDef_Tab.java b/org.adempiere.base/src/org/compiere/model/X_AD_UserDef_Tab.java
index 49480a5434..4cac368fdd 100644
--- a/org.adempiere.base/src/org/compiere/model/X_AD_UserDef_Tab.java
+++ b/org.adempiere.base/src/org/compiere/model/X_AD_UserDef_Tab.java
@@ -31,7 +31,7 @@ public class X_AD_UserDef_Tab extends PO implements I_AD_UserDef_Tab, I_Persiste
/**
*
*/
- private static final long serialVersionUID = 20220119L;
+ private static final long serialVersionUID = 20220617L;
/** Standard Constructor */
public X_AD_UserDef_Tab (Properties ctx, int AD_UserDef_Tab_ID, String trxName)
@@ -214,6 +214,21 @@ public class X_AD_UserDef_Tab extends PO implements I_AD_UserDef_Tab, I_Persiste
return ii.intValue();
}
+ /** Set Delete Confirmation Logic.
+ @param DeleteConfirmationLogic Delete Confirmation Logic
+ */
+ public void setDeleteConfirmationLogic (String DeleteConfirmationLogic)
+ {
+ set_Value (COLUMNNAME_DeleteConfirmationLogic, DeleteConfirmationLogic);
+ }
+
+ /** Get Delete Confirmation Logic.
+ @return Delete Confirmation Logic */
+ public String getDeleteConfirmationLogic()
+ {
+ return (String)get_Value(COLUMNNAME_DeleteConfirmationLogic);
+ }
+
/** Set Description.
@param Description Optional short description of the record
*/
diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/AbstractADWindowContent.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/AbstractADWindowContent.java
index 6c18c4cf9e..bb39c1ec65 100644
--- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/AbstractADWindowContent.java
+++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/AbstractADWindowContent.java
@@ -62,6 +62,7 @@ import org.adempiere.webui.component.ZkCssHelper;
import org.adempiere.webui.editor.IProcessButton;
import org.adempiere.webui.editor.WButtonEditor;
import org.adempiere.webui.editor.WEditor;
+import org.adempiere.webui.editor.WStringEditor;
import org.adempiere.webui.event.ActionEvent;
import org.adempiere.webui.event.ActionListener;
import org.adempiere.webui.event.DialogEvents;
@@ -110,6 +111,7 @@ import org.compiere.process.DocAction;
import org.compiere.process.ProcessInfo;
import org.compiere.process.ProcessInfoLog;
import org.compiere.process.ProcessInfoUtil;
+import org.compiere.tools.FileUtil;
import org.compiere.util.CLogger;
import org.compiere.util.DB;
import org.compiere.util.Env;
@@ -202,6 +204,8 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
private int adWindowId;
private MImage image;
+
+ private String deleteConfirmationLogic;
/**
* Quick Form Status bar
@@ -2756,29 +2760,66 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
onDeleteSelected(postCallback);
return;
}
-
- FDialog.ask(curWindowNo, null, "DeleteRecord?", new Callback() {
-
- @Override
- public void onCallback(Boolean result)
- {
- if (result)
+
+ deleteConfirmationLogic = adTabbox.getSelectedGridTab().getDeleteConfirmationLogic();
+ if(Util.isEmpty(deleteConfirmationLogic)) {
+ FDialog.ask(curWindowNo, null, "DeleteRecord?", new Callback() {
+ @Override
+ public void onCallback(Boolean result)
{
- //error will be catch in the dataStatusChanged event
- boolean success = adTabbox.getSelectedGridTab().dataDelete();
- adTabbox.getSelectedGridTab().dataRefreshAll(true, true);
- adTabbox.getSelectedGridTab().refreshParentTabs();
- if (!success)
- showLastWarning();
-
- adTabbox.getSelectedTabpanel().dynamicDisplay(0);
- focusToActivePanel();
- MRecentItem.publishChangedEvent(Env.getAD_User_ID(ctx));
+ if (result)
+ {
+ //error will be catch in the dataStatusChanged event
+ boolean success = adTabbox.getSelectedGridTab().dataDelete();
+ adTabbox.getSelectedGridTab().dataRefreshAll(true, true);
+ adTabbox.getSelectedGridTab().refreshParentTabs();
+ if (!success)
+ showLastWarning();
+
+ adTabbox.getSelectedTabpanel().dynamicDisplay(0);
+ focusToActivePanel();
+ MRecentItem.publishChangedEvent(Env.getAD_User_ID(ctx));
+ }
+ if (postCallback != null)
+ postCallback.onCallback(result);
}
- if (postCallback != null)
- postCallback.onCallback(result);
- }
- });
+ });
+ }
+ else {
+ int tableID = adTabbox.getSelectedGridTab().getAD_Table_ID();
+ int recordID = adTabbox.getSelectedGridTab().getRecord_ID();
+ deleteConfirmationLogic = FileUtil.parseTitle(ctx, deleteConfirmationLogic, tableID, recordID, curWindowNo, null);
+ deleteConfirmationLogic = Msg.parseTranslation(ctx, deleteConfirmationLogic);
+
+ WEditor editor = new WStringEditor();
+ editor.fillHorizontal();
+ editor.setValidInput(deleteConfirmationLogic);
+
+ FDialog.askForInputTextConfirmation(curWindowNo, editor, "DeleteRecordWithConfirm?", new Object[] {deleteConfirmationLogic}, null,
+ new Callback>() {
+ @Override
+ public void onCallback(Map.Entry result)
+ {
+ if(!result.getKey() || !(result.getValue() instanceof String))
+ return;
+
+ if(result.getValue().equals(deleteConfirmationLogic)) {
+ boolean success = adTabbox.getSelectedGridTab().dataDelete();
+ adTabbox.getSelectedGridTab().dataRefreshAll(true, true);
+ adTabbox.getSelectedGridTab().refreshParentTabs();
+ if (!success)
+ showLastWarning();
+
+ adTabbox.getSelectedTabpanel().dynamicDisplay(0);
+ focusToActivePanel();
+ MRecentItem.publishChangedEvent(Env.getAD_User_ID(ctx));
+
+ }
+ if (postCallback != null)
+ postCallback.onCallback(result.getValue().equals(deleteConfirmationLogic));
+ }
+ });
+ }
}
// Elaine 2008/12/01
@@ -2790,46 +2831,95 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
postCallback.onCallback(false);
return;
}
-
+ deleteConfirmationLogic = adTabbox.getSelectedGridTab().getDeleteConfirmationLogic();
final int[] indices = adTabbox.getSelectedGridTab().getSelection();
if(indices.length > 0) {
StringBuilder sb = new StringBuilder();
sb.append(Env.getContext(ctx, curWindowNo, "_WinInfo_WindowName", false)).append(" - ")
.append(indices.length).append(" ").append(Msg.getMsg(Env.getCtx(), "Selected"));
- FDialog.ask(sb.toString(), curWindowNo, null,"DeleteSelection", new Callback() {
- @Override
- public void onCallback(Boolean result) {
- if(result){
- adTabbox.getSelectedGridTab().clearSelection();
- Arrays.sort(indices);
- int offset = 0;
- int count = 0;
- for (int i = 0; i < indices.length; i++)
- {
- adTabbox.getSelectedGridTab().navigate(indices[i]-offset);
- if (adTabbox.getSelectedGridTab().dataDelete())
+ if(Util.isEmpty(deleteConfirmationLogic)) {
+ FDialog.ask(sb.toString(), curWindowNo, null,"DeleteSelection", new Callback() {
+ @Override
+ public void onCallback(Boolean result) {
+ if(result){
+ adTabbox.getSelectedGridTab().clearSelection();
+ Arrays.sort(indices);
+ int offset = 0;
+ int count = 0;
+ for (int i = 0; i < indices.length; i++)
{
- offset++;
- count++;
+ adTabbox.getSelectedGridTab().navigate(indices[i]-offset);
+ if (adTabbox.getSelectedGridTab().dataDelete())
+ {
+ offset++;
+ count++;
+ }
+ }
+ adTabbox.getSelectedGridTab().dataRefreshAll(true, true);
+ adTabbox.getSelectedGridTab().refreshParentTabs();
+
+ adTabbox.getSelectedTabpanel().dynamicDisplay(0);
+ if (getActiveGridTab().isQuickForm)
+ {
+ statusBarQF.setStatusLine(Msg.getMsg(Env.getCtx(), "Deleted") + ": " + count, false);
+ }
+ else
+ {
+ statusBar.setStatusLine(Msg.getMsg(Env.getCtx(), "Deleted") + ": " + count, false);
}
}
- adTabbox.getSelectedGridTab().dataRefreshAll(true, true);
- adTabbox.getSelectedGridTab().refreshParentTabs();
-
- adTabbox.getSelectedTabpanel().dynamicDisplay(0);
- if (getActiveGridTab().isQuickForm)
- {
- statusBarQF.setStatusLine(Msg.getMsg(Env.getCtx(), "Deleted") + ": " + count, false);
- }
- else
- {
- statusBar.setStatusLine(Msg.getMsg(Env.getCtx(), "Deleted") + ": " + count, false);
- }
+ if (postCallback != null)
+ postCallback.onCallback(result);
}
- if (postCallback != null)
- postCallback.onCallback(result);
- }
- });
+ });
+ }
+ else {
+ deleteConfirmationLogic = Msg.getMsg(ctx, "DeleteSelection");
+
+ WEditor editor = new WStringEditor();
+ editor.fillHorizontal();
+ editor.setValidInput(deleteConfirmationLogic);
+
+ FDialog.askForInputTextConfirmation(curWindowNo, editor, "DeleteSelectionWithConfirm?", new String[] {Integer.toString(indices.length), deleteConfirmationLogic}, null,
+ new Callback>() {
+ @Override
+ public void onCallback(Map.Entry result)
+ {
+ if(!result.getKey() || !(result.getValue() instanceof String))
+ return;
+
+ if(result.getValue().equals(deleteConfirmationLogic)) {
+ adTabbox.getSelectedGridTab().clearSelection();
+ Arrays.sort(indices);
+ int offset = 0;
+ int count = 0;
+ for (int i = 0; i < indices.length; i++)
+ {
+ adTabbox.getSelectedGridTab().navigate(indices[i]-offset);
+ if (adTabbox.getSelectedGridTab().dataDelete())
+ {
+ offset++;
+ count++;
+ }
+ }
+ adTabbox.getSelectedGridTab().dataRefreshAll(true, true);
+ adTabbox.getSelectedGridTab().refreshParentTabs();
+
+ adTabbox.getSelectedTabpanel().dynamicDisplay(0);
+ if (getActiveGridTab().isQuickForm)
+ {
+ statusBarQF.setStatusLine(Msg.getMsg(Env.getCtx(), "Deleted") + ": " + count, false);
+ }
+ else
+ {
+ statusBar.setStatusLine(Msg.getMsg(Env.getCtx(), "Deleted") + ": " + count, false);
+ }
+ }
+ if (postCallback != null)
+ postCallback.onCallback(result.getValue().equals(deleteConfirmationLogic));
+ }
+ });
+ }
} else {
if (getActiveGridTab().isQuickForm)
{
diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/component/Messagebox.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/component/Messagebox.java
index 0b878b623f..7d2fc78df8 100644
--- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/component/Messagebox.java
+++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/component/Messagebox.java
@@ -174,7 +174,7 @@ public class Messagebox extends Window implements EventListener
btnIgnore = ButtonFactory.createNamedButton("Ignore");
btnIgnore.addEventListener(Events.ON_CLICK, this);
btnIgnore.setId("btnIgnore");
-
+
Panel pnlMessage = new Panel();
if (ClientInfo.maxWidth(399))
{
@@ -323,7 +323,7 @@ public class Messagebox extends Window implements EventListener
}
});
}
-
+
this.setTitle(title);
this.setPosition("center");
this.setClosable(true);
@@ -417,13 +417,41 @@ public class Messagebox extends Window implements EventListener
{
returnValue = IGNORE;
}
- if ((returnValue == CANCEL) || !isInputMandatory || (isInputMandatory && !Util.isEmpty(String.valueOf(inputField.getValue()))))
- close();
- else {
- isExceptionThrown = true;
- returnValue = 0;
- throw new WrongValueException(inputField.getComponent(), Msg.getMsg(Env.getCtx(), "PrintFormatMandatory"));
- }
+
+ //TODO
+ else {
+ returnValue = 0;
+ }
+ validateOnClose();
+ }
+
+ private void validateOnClose() {
+
+ // Don't close on OK if input is mandatory while input field is empty
+ if ((returnValue == CANCEL) || !isInputMandatory || (isInputMandatory && !Util.isEmpty(String.valueOf(inputField.getValue()))))
+
+ // if Valid Input is defined, don't close on OK until user types the Valid Input
+ if(!Util.isEmpty(inputField.getValidInput())) {
+
+ if((returnValue == CANCEL) || (inputField.isValid(String.valueOf(inputField.getValue())) && returnValue == OK)) {
+ close();
+ }
+ else {
+ isExceptionThrown = true;
+ returnValue = 0;
+ throw new WrongValueException(inputField.getComponent(), Msg.getMsg(Env.getCtx(), "ValueNotCorrect"));
+ }
+ }
+ else {
+ close();
+ }
+ //
+ else {
+ isExceptionThrown = true;
+ returnValue = 0;
+ throw new WrongValueException(inputField.getComponent(), Msg.getMsg(Env.getCtx(), "AnswerMandatory"));
+ }
+ //
}
private void close() {
diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/IInputValidator.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/IInputValidator.java
new file mode 100644
index 0000000000..750372f1d5
--- /dev/null
+++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/IInputValidator.java
@@ -0,0 +1,52 @@
+/**********************************************************************
+* This file is part of iDempiere ERP Open Source *
+* http://www.idempiere.org *
+* *
+* Copyright (C) Contributors *
+* *
+* This program is free software; you can redistribute it and/or *
+* modify it under the terms of the GNU General Public License *
+* as published by the Free Software Foundation; either version 2 *
+* of the License, or (at your option) any later version. *
+* *
+* This program is distributed in the hope that it will be useful, *
+* but WITHOUT ANY WARRANTY; without even the implied warranty of *
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+* GNU General Public License for more details. *
+* *
+* You should have received a copy of the GNU General Public License *
+* along with this program; if not, write to the Free Software *
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, *
+* MA 02110-1301, USA. *
+* *
+* Contributors: *
+* - Peter Takacs, Cloudempiere *
+**********************************************************************/
+package org.adempiere.webui.editor;
+
+/**
+ * Interface to validate the input of editors
+ * @author Peter Takacs, Cloudempiere
+ *
+ */
+public interface IInputValidator {
+
+ /**
+ * Get Valid Input
+ * @return String
+ */
+ public String getValidInput();
+
+ /**
+ * Set Valid Input
+ * @param validInput
+ */
+ public void setValidInput(String validInput);
+
+ /**
+ * Is Input Valid
+ * @param input
+ * @return boolean
+ */
+ public boolean isValid(String input);
+}
diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/WEditor.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/WEditor.java
index 347ea1039f..493e3c4c77 100644
--- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/WEditor.java
+++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/WEditor.java
@@ -71,7 +71,7 @@ import org.zkoss.zul.impl.XulElement;
* @date Mar 11, 2007
* @version $Revision: 0.10 $
*/
-public abstract class WEditor implements EventListener, PropertyChangeListener
+public abstract class WEditor implements EventListener, PropertyChangeListener, IInputValidator
{
private static final String[] lISTENER_EVENTS = {};
@@ -104,6 +104,8 @@ public abstract class WEditor implements EventListener, PropertyChangeLis
protected boolean tableEditor;
private boolean isProcessParameter;
+
+ private String sValidInput;
/**
* call to show context menu of this field.
@@ -507,6 +509,10 @@ public abstract class WEditor implements EventListener, PropertyChangeLis
return component.isVisible();
}
+ /**
+ * Indicating error with changing the style.
+ * @param error
+ */
public void setBackground(boolean error)
{
@@ -943,4 +949,19 @@ public abstract class WEditor implements EventListener, PropertyChangeLis
}
}
+
+ @Override
+ public String getValidInput() {
+ return this.sValidInput;
+ }
+
+ @Override
+ public void setValidInput(String validInput) {
+ this.sValidInput = validInput;
+ }
+
+ @Override
+ public boolean isValid(String input) {
+ return Util.isEmpty(sValidInput) ? true : sValidInput.equals(input);
+ }
}
diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/FDialog.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/FDialog.java
index 9f68b61be9..185b49c159 100644
--- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/FDialog.java
+++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/FDialog.java
@@ -424,6 +424,30 @@ public class FDialog
Messagebox.showDialog(s, Util.isEmpty(title) ? AEnv.getDialogHeader(Env.getCtx(), windowNo) : title,
Messagebox.OK | Messagebox.INPUT, Messagebox.QUESTION, weditor, msgCallback, (msgCallback == null));
}
+
+ /**
+ * Confirmation dialog before deleting the records.
+ * @param windowNo
+ * @param weditor
+ * @param adMessage
+ * @param adMessageArgs
+ * @param title
+ * @param correctInput
+ * @param callback
+ */
+ public static void askForInputTextConfirmation(int windowNo, WEditor weditor, String adMessage, Object[] adMessageArgs, String title, final Callback> callback)
+ {
+ Callback> msgCallback = null;
+ msgCallback = new Callback>() {
+ @Override
+ public void onCallback(Map.Entry result) {
+ callback.onCallback(result);
+ }
+ };
+ String s = Msg.getMsg(Env.getCtx(), adMessage, adMessageArgs).replace("\n", "
");
+ Messagebox.showDialog(s, Util.isEmpty(title) ? AEnv.getDialogHeader(Env.getCtx(), windowNo) : title,
+ Messagebox.OK | Messagebox.CANCEL | Messagebox.INPUT, Messagebox.QUESTION, weditor, msgCallback, (msgCallback == null));
+ }
public static void askForInput(int windowNo, Component comp, String adMessage, final Callback callback) {
askForInput(windowNo, comp, adMessage, "", callback);