diff --git a/judo-ui-react-itest/ActionGroupTest/model/ActionGroupTest-ui.model b/judo-ui-react-itest/ActionGroupTest/model/ActionGroupTest-ui.model index 1c9a6cf7..5d639e1d 100644 --- a/judo-ui-react-itest/ActionGroupTest/model/ActionGroupTest-ui.model +++ b/judo-ui-react-itest/ActionGroupTest/model/ActionGroupTest-ui.model @@ -168,20 +168,6 @@ - - - - - - - - - - - - - - @@ -198,6 +184,8 @@ + + @@ -280,7 +268,7 @@ - + @@ -368,9 +356,6 @@ - - - @@ -378,8 +363,8 @@ - - + + @@ -399,21 +384,14 @@ - - - - - + - - - - + - - - + + + @@ -422,6 +400,13 @@ + + + + + + + @@ -442,9 +427,9 @@ - - - + + + @@ -840,14 +825,14 @@ - + - + @@ -861,18 +846,14 @@ - - + - - - - + - - - + + + @@ -889,9 +870,6 @@ - - - @@ -906,6 +884,21 @@ + + + + + + + + + + + + + + + @@ -976,7 +969,7 @@ - + @@ -1029,21 +1022,21 @@ - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + @@ -1053,14 +1046,14 @@ - - - - - - - - + + + + + + + + @@ -1070,18 +1063,6 @@ - - - - - - - - - - - - @@ -1094,9 +1075,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + @@ -1117,8 +1130,8 @@ - - + + @@ -1167,18 +1180,14 @@ - - + - - - - + - - - + + + @@ -1856,7 +1865,6 @@ UPDATE DELETE - @@ -2090,45 +2098,45 @@ - + - + - + - + - + - + - + - + - + - + @@ -2138,11 +2146,11 @@ - + - + @@ -2150,15 +2158,15 @@ - + - + - - + + @@ -2294,11 +2302,11 @@ - + - + @@ -2308,11 +2316,11 @@ - + - + @@ -2380,45 +2388,45 @@ - + - + - + - + - + - + - + - + - + - + @@ -2428,11 +2436,11 @@ - + - + @@ -2440,15 +2448,15 @@ - + - + - - + + @@ -2599,11 +2607,11 @@ - + - + @@ -2613,11 +2621,11 @@ - + - + @@ -2730,11 +2738,11 @@ - + - + @@ -2744,11 +2752,11 @@ - + - + @@ -2808,37 +2816,37 @@ - + - + - + - + - + - + - + - + @@ -2849,11 +2857,11 @@ - + - + @@ -2861,11 +2869,11 @@ - + - - + + @@ -2920,11 +2928,11 @@ - + - + @@ -2934,11 +2942,11 @@ - + - + @@ -2966,37 +2974,37 @@ - + - + - + - + - + - + - + - + @@ -3007,11 +3015,11 @@ - + - + @@ -3019,11 +3027,11 @@ - + - - + + @@ -3095,37 +3103,37 @@ - + - + - + - + - + - + - + - + @@ -3183,11 +3191,11 @@ - + - + @@ -3197,11 +3205,11 @@ - + - + @@ -3244,37 +3252,37 @@ - + - + - + - + - + - + - + - + @@ -3358,11 +3366,11 @@ - + - + @@ -3372,11 +3380,11 @@ - + - + @@ -3472,11 +3480,11 @@ - + - + @@ -3486,11 +3494,11 @@ - + - + @@ -3591,11 +3599,11 @@ - + - + @@ -3605,11 +3613,11 @@ - + - + @@ -3718,11 +3726,11 @@ - + - + @@ -3732,11 +3740,11 @@ - + - + @@ -3830,45 +3838,45 @@ - + - + - + - + - + - + - + - + - + - + @@ -3879,19 +3887,19 @@ - + - + - + - - + + @@ -3899,11 +3907,11 @@ - + - + @@ -3911,15 +3919,15 @@ - + - + - - + + @@ -4094,11 +4102,11 @@ - + - + @@ -4108,11 +4116,11 @@ - + - + @@ -4169,11 +4177,11 @@ - + - + @@ -4181,15 +4189,15 @@ - + - + - - + + @@ -4198,19 +4206,19 @@ - + - + - + - - + + @@ -4224,45 +4232,45 @@ - + - + - + - + - + - + - + - + - + - + @@ -4452,11 +4460,11 @@ - + - + @@ -4466,11 +4474,11 @@ - + - + @@ -4528,37 +4536,37 @@ - + - + - + - + - + - + - + - + @@ -4601,17 +4609,17 @@ - + - + - + @@ -4622,29 +4630,29 @@ - + - + - + - + - + - + @@ -4654,15 +4662,15 @@ - + - + - - + + @@ -4783,11 +4791,11 @@ - + - + @@ -4797,11 +4805,11 @@ - + - + @@ -4829,17 +4837,17 @@ - + - + - + @@ -4850,29 +4858,29 @@ - + - + - + - + - + - + @@ -4882,15 +4890,15 @@ - + - + - - + + @@ -5049,11 +5057,11 @@ - + - + @@ -5063,23 +5071,11 @@ - + - - - - - - - - - - - - - + @@ -5110,29 +5106,29 @@ - + - + - + - - - + + + - + - + @@ -5189,7 +5185,7 @@ - + @@ -5244,29 +5240,29 @@ - + - + - + - + - + - + @@ -5286,9 +5282,9 @@ - - - + + + @@ -5442,11 +5438,11 @@ - + - + @@ -5454,15 +5450,15 @@ - + - + - - + + @@ -5565,11 +5561,11 @@ - + - + @@ -5579,23 +5575,23 @@ - + - + - - - + + + - - - + + + - - - + + + @@ -5619,41 +5615,41 @@ - + - + - + - + - + - + - + - + - + @@ -5695,11 +5691,11 @@ - + - + @@ -5707,15 +5703,15 @@ - + - + - - + + @@ -5840,11 +5836,11 @@ - + - + @@ -5957,11 +5953,11 @@ - + - + @@ -5971,11 +5967,11 @@ - + - + @@ -6087,15 +6083,27 @@ - + + + + + - + + + + + - + + + + + @@ -6136,11 +6144,11 @@ - + - + @@ -6150,11 +6158,11 @@ - + - + @@ -6253,11 +6261,11 @@ - + - + @@ -6267,11 +6275,11 @@ - + - + @@ -6373,19 +6381,31 @@ - + - + + + + + + + + + + + + + - - - + + + - - - + + + @@ -6395,61 +6415,11 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -6467,38 +6437,21 @@ - - - - - + - - - - - - - - - + - - - - - - + @@ -6535,53 +6488,70 @@ - + - + - + - + - + - + + + + + + + + + + + + + + + + + + - + - + - + - - - + + + - - - + + + - - - + + + @@ -6611,79 +6581,15 @@ - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -6712,7 +6618,7 @@ - + @@ -6752,6 +6658,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -6775,41 +6775,29 @@ - + - + - + - + - + - - - - - - - - - - - - - + @@ -6864,11 +6852,11 @@ - + - + @@ -6878,11 +6866,11 @@ - + - + @@ -6918,41 +6906,29 @@ - + - + - + - + - + - - - - - - - - - - - - - + @@ -7047,19 +7023,19 @@ - + - + - + - - + + @@ -7070,33 +7046,33 @@ - + - + - + - + - + - + - + @@ -7222,11 +7198,11 @@ - + - + @@ -7236,11 +7212,11 @@ - + - + @@ -7271,93 +7247,45 @@ - + - + - + - + - + - - + + + - - + + + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -7368,19 +7296,19 @@ - + - + - + - - + + @@ -7391,33 +7319,33 @@ - + - + - + - + - + - + - + diff --git a/judo-ui-react-itest/ActionGroupTestPro/model/ActionGroupTestPro-ui.model b/judo-ui-react-itest/ActionGroupTestPro/model/ActionGroupTestPro-ui.model index 1c9a6cf7..5d639e1d 100644 --- a/judo-ui-react-itest/ActionGroupTestPro/model/ActionGroupTestPro-ui.model +++ b/judo-ui-react-itest/ActionGroupTestPro/model/ActionGroupTestPro-ui.model @@ -168,20 +168,6 @@ - - - - - - - - - - - - - - @@ -198,6 +184,8 @@ + + @@ -280,7 +268,7 @@ - + @@ -368,9 +356,6 @@ - - - @@ -378,8 +363,8 @@ - - + + @@ -399,21 +384,14 @@ - - - - - + - - - - + - - - + + + @@ -422,6 +400,13 @@ + + + + + + + @@ -442,9 +427,9 @@ - - - + + + @@ -840,14 +825,14 @@ - + - + @@ -861,18 +846,14 @@ - - + - - - - + - - - + + + @@ -889,9 +870,6 @@ - - - @@ -906,6 +884,21 @@ + + + + + + + + + + + + + + + @@ -976,7 +969,7 @@ - + @@ -1029,21 +1022,21 @@ - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + @@ -1053,14 +1046,14 @@ - - - - - - - - + + + + + + + + @@ -1070,18 +1063,6 @@ - - - - - - - - - - - - @@ -1094,9 +1075,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + @@ -1117,8 +1130,8 @@ - - + + @@ -1167,18 +1180,14 @@ - - + - - - - + - - - + + + @@ -1856,7 +1865,6 @@ UPDATE DELETE - @@ -2090,45 +2098,45 @@ - + - + - + - + - + - + - + - + - + - + @@ -2138,11 +2146,11 @@ - + - + @@ -2150,15 +2158,15 @@ - + - + - - + + @@ -2294,11 +2302,11 @@ - + - + @@ -2308,11 +2316,11 @@ - + - + @@ -2380,45 +2388,45 @@ - + - + - + - + - + - + - + - + - + - + @@ -2428,11 +2436,11 @@ - + - + @@ -2440,15 +2448,15 @@ - + - + - - + + @@ -2599,11 +2607,11 @@ - + - + @@ -2613,11 +2621,11 @@ - + - + @@ -2730,11 +2738,11 @@ - + - + @@ -2744,11 +2752,11 @@ - + - + @@ -2808,37 +2816,37 @@ - + - + - + - + - + - + - + - + @@ -2849,11 +2857,11 @@ - + - + @@ -2861,11 +2869,11 @@ - + - - + + @@ -2920,11 +2928,11 @@ - + - + @@ -2934,11 +2942,11 @@ - + - + @@ -2966,37 +2974,37 @@ - + - + - + - + - + - + - + - + @@ -3007,11 +3015,11 @@ - + - + @@ -3019,11 +3027,11 @@ - + - - + + @@ -3095,37 +3103,37 @@ - + - + - + - + - + - + - + - + @@ -3183,11 +3191,11 @@ - + - + @@ -3197,11 +3205,11 @@ - + - + @@ -3244,37 +3252,37 @@ - + - + - + - + - + - + - + - + @@ -3358,11 +3366,11 @@ - + - + @@ -3372,11 +3380,11 @@ - + - + @@ -3472,11 +3480,11 @@ - + - + @@ -3486,11 +3494,11 @@ - + - + @@ -3591,11 +3599,11 @@ - + - + @@ -3605,11 +3613,11 @@ - + - + @@ -3718,11 +3726,11 @@ - + - + @@ -3732,11 +3740,11 @@ - + - + @@ -3830,45 +3838,45 @@ - + - + - + - + - + - + - + - + - + - + @@ -3879,19 +3887,19 @@ - + - + - + - - + + @@ -3899,11 +3907,11 @@ - + - + @@ -3911,15 +3919,15 @@ - + - + - - + + @@ -4094,11 +4102,11 @@ - + - + @@ -4108,11 +4116,11 @@ - + - + @@ -4169,11 +4177,11 @@ - + - + @@ -4181,15 +4189,15 @@ - + - + - - + + @@ -4198,19 +4206,19 @@ - + - + - + - - + + @@ -4224,45 +4232,45 @@ - + - + - + - + - + - + - + - + - + - + @@ -4452,11 +4460,11 @@ - + - + @@ -4466,11 +4474,11 @@ - + - + @@ -4528,37 +4536,37 @@ - + - + - + - + - + - + - + - + @@ -4601,17 +4609,17 @@ - + - + - + @@ -4622,29 +4630,29 @@ - + - + - + - + - + - + @@ -4654,15 +4662,15 @@ - + - + - - + + @@ -4783,11 +4791,11 @@ - + - + @@ -4797,11 +4805,11 @@ - + - + @@ -4829,17 +4837,17 @@ - + - + - + @@ -4850,29 +4858,29 @@ - + - + - + - + - + - + @@ -4882,15 +4890,15 @@ - + - + - - + + @@ -5049,11 +5057,11 @@ - + - + @@ -5063,23 +5071,11 @@ - + - - - - - - - - - - - - - + @@ -5110,29 +5106,29 @@ - + - + - + - - - + + + - + - + @@ -5189,7 +5185,7 @@ - + @@ -5244,29 +5240,29 @@ - + - + - + - + - + - + @@ -5286,9 +5282,9 @@ - - - + + + @@ -5442,11 +5438,11 @@ - + - + @@ -5454,15 +5450,15 @@ - + - + - - + + @@ -5565,11 +5561,11 @@ - + - + @@ -5579,23 +5575,23 @@ - + - + - - - + + + - - - + + + - - - + + + @@ -5619,41 +5615,41 @@ - + - + - + - + - + - + - + - + - + @@ -5695,11 +5691,11 @@ - + - + @@ -5707,15 +5703,15 @@ - + - + - - + + @@ -5840,11 +5836,11 @@ - + - + @@ -5957,11 +5953,11 @@ - + - + @@ -5971,11 +5967,11 @@ - + - + @@ -6087,15 +6083,27 @@ - + + + + + - + + + + + - + + + + + @@ -6136,11 +6144,11 @@ - + - + @@ -6150,11 +6158,11 @@ - + - + @@ -6253,11 +6261,11 @@ - + - + @@ -6267,11 +6275,11 @@ - + - + @@ -6373,19 +6381,31 @@ - + - + + + + + + + + + + + + + - - - + + + - - - + + + @@ -6395,61 +6415,11 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -6467,38 +6437,21 @@ - - - - - + - - - - - - - - - + - - - - - - + @@ -6535,53 +6488,70 @@ - + - + - + - + - + - + + + + + + + + + + + + + + + + + + - + - + - + - - - + + + - - - + + + - - - + + + @@ -6611,79 +6581,15 @@ - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -6712,7 +6618,7 @@ - + @@ -6752,6 +6658,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -6775,41 +6775,29 @@ - + - + - + - + - + - - - - - - - - - - - - - + @@ -6864,11 +6852,11 @@ - + - + @@ -6878,11 +6866,11 @@ - + - + @@ -6918,41 +6906,29 @@ - + - + - + - + - + - - - - - - - - - - - - - + @@ -7047,19 +7023,19 @@ - + - + - + - - + + @@ -7070,33 +7046,33 @@ - + - + - + - + - + - + - + @@ -7222,11 +7198,11 @@ - + - + @@ -7236,11 +7212,11 @@ - + - + @@ -7271,93 +7247,45 @@ - + - + - + - + - + - - + + + - - + + + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -7368,19 +7296,19 @@ - + - + - + - - + + @@ -7391,33 +7319,33 @@ - + - + - + - + - + - + - + diff --git a/judo-ui-react-itest/CRUDActionsTest/model/CRUDActionsTest-ui.model b/judo-ui-react-itest/CRUDActionsTest/model/CRUDActionsTest-ui.model index 230f0eb8..0a5e62f1 100644 --- a/judo-ui-react-itest/CRUDActionsTest/model/CRUDActionsTest-ui.model +++ b/judo-ui-react-itest/CRUDActionsTest/model/CRUDActionsTest-ui.model @@ -37,7 +37,7 @@ - + @@ -99,7 +99,7 @@ - + @@ -621,11 +621,11 @@ - + - + @@ -635,11 +635,11 @@ - + - + @@ -682,25 +682,25 @@ - + - + - + - + - + @@ -720,37 +720,37 @@ - + - + - + - + - + - + - + - + @@ -766,45 +766,45 @@ - + - + - + - + - + - + - + - + - + - + @@ -897,25 +897,25 @@ - + - + - + - + - + @@ -935,37 +935,37 @@ - + - + - + - + - + - + - + - + @@ -981,45 +981,45 @@ - + - + - + - + - + - + - + - + - + - + @@ -1131,11 +1131,11 @@ - + - + @@ -1145,11 +1145,11 @@ - + - + @@ -1186,15 +1186,15 @@ - + - - + + @@ -1216,11 +1216,11 @@ - + - + @@ -1228,11 +1228,11 @@ - + - - + + @@ -1244,11 +1244,11 @@ - + - + @@ -1256,15 +1256,15 @@ - + - + - - + + @@ -1346,15 +1346,15 @@ - + - - + + @@ -1376,11 +1376,11 @@ - + - + @@ -1388,11 +1388,11 @@ - + - - + + @@ -1404,11 +1404,11 @@ - + - + @@ -1416,15 +1416,15 @@ - + - + - - + + @@ -1531,11 +1531,11 @@ - + - + @@ -1545,11 +1545,11 @@ - + - + @@ -1722,11 +1722,11 @@ - + - + @@ -1736,11 +1736,11 @@ - + - + @@ -1878,11 +1878,11 @@ - + - + @@ -1892,11 +1892,11 @@ - + - + @@ -2034,11 +2034,11 @@ - + - + @@ -2048,11 +2048,11 @@ - + - + @@ -2227,7 +2227,7 @@ - + @@ -2289,7 +2289,7 @@ - + @@ -2811,11 +2811,11 @@ - + - + @@ -2825,11 +2825,11 @@ - + - + @@ -2872,25 +2872,25 @@ - + - + - + - + - + @@ -2910,37 +2910,37 @@ - + - + - + - + - + - + - + - + @@ -2956,45 +2956,45 @@ - + - + - + - + - + - + - + - + - + - + @@ -3087,25 +3087,25 @@ - + - + - + - + - + @@ -3125,37 +3125,37 @@ - + - + - + - + - + - + - + - + @@ -3171,45 +3171,45 @@ - + - + - + - + - + - + - + - + - + - + @@ -3321,11 +3321,11 @@ - + - + @@ -3335,11 +3335,11 @@ - + - + @@ -3376,15 +3376,15 @@ - + - - + + @@ -3406,11 +3406,11 @@ - + - + @@ -3418,11 +3418,11 @@ - + - - + + @@ -3434,11 +3434,11 @@ - + - + @@ -3446,15 +3446,15 @@ - + - + - - + + @@ -3536,15 +3536,15 @@ - + - - + + @@ -3566,11 +3566,11 @@ - + - + @@ -3578,11 +3578,11 @@ - + - - + + @@ -3594,11 +3594,11 @@ - + - + @@ -3606,15 +3606,15 @@ - + - + - - + + @@ -3721,11 +3721,11 @@ - + - + @@ -3735,11 +3735,11 @@ - + - + @@ -3912,11 +3912,11 @@ - + - + @@ -3926,11 +3926,11 @@ - + - + @@ -4068,11 +4068,11 @@ - + - + @@ -4082,11 +4082,11 @@ - + - + @@ -4224,11 +4224,11 @@ - + - + @@ -4238,11 +4238,11 @@ - + - + @@ -4417,7 +4417,7 @@ - + @@ -4479,7 +4479,7 @@ - + @@ -4992,11 +4992,11 @@ - + - + @@ -5006,11 +5006,11 @@ - + - + @@ -5053,25 +5053,25 @@ - + - + - + - + - + @@ -5091,37 +5091,37 @@ - + - + - + - + - + - + - + - + @@ -5137,45 +5137,45 @@ - + - + - + - + - + - + - + - + - + - + @@ -5268,25 +5268,25 @@ - + - + - + - + - + @@ -5306,37 +5306,37 @@ - + - + - + - + - + - + - + - + @@ -5352,45 +5352,45 @@ - + - + - + - + - + - + - + - + - + - + @@ -5502,11 +5502,11 @@ - + - + @@ -5516,11 +5516,11 @@ - + - + @@ -5557,15 +5557,15 @@ - + - - + + @@ -5587,11 +5587,11 @@ - + - + @@ -5599,11 +5599,11 @@ - + - - + + @@ -5615,11 +5615,11 @@ - + - + @@ -5627,15 +5627,15 @@ - + - + - - + + @@ -5717,15 +5717,15 @@ - + - - + + @@ -5747,11 +5747,11 @@ - + - + @@ -5759,11 +5759,11 @@ - + - - + + @@ -5775,11 +5775,11 @@ - + - + @@ -5787,15 +5787,15 @@ - + - + - - + + @@ -5902,11 +5902,11 @@ - + - + @@ -5916,11 +5916,11 @@ - + - + @@ -6093,11 +6093,11 @@ - + - + @@ -6107,11 +6107,11 @@ - + - + @@ -6249,11 +6249,11 @@ - + - + @@ -6263,11 +6263,11 @@ - + - + @@ -6405,11 +6405,11 @@ - + - + @@ -6419,11 +6419,11 @@ - + - + diff --git a/judo-ui-react-itest/OperationParametersTest/model/OperationParametersTest-ui.model b/judo-ui-react-itest/OperationParametersTest/model/OperationParametersTest-ui.model index 93db98a2..302dc70f 100644 --- a/judo-ui-react-itest/OperationParametersTest/model/OperationParametersTest-ui.model +++ b/judo-ui-react-itest/OperationParametersTest/model/OperationParametersTest-ui.model @@ -19,9 +19,9 @@ - - - + + + @@ -29,9 +29,9 @@ - - - + + + @@ -46,10 +46,10 @@ - - - - + + + + @@ -162,7 +162,7 @@ - + @@ -211,6 +211,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -221,7 +263,7 @@ - + @@ -314,7 +356,7 @@ - + @@ -386,7 +428,7 @@ - + @@ -461,7 +503,7 @@ - + @@ -536,6 +578,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -572,7 +661,7 @@ - + @@ -612,7 +701,7 @@ - + @@ -1171,37 +1260,37 @@ - + - + - + - + - + - + - + - + @@ -1219,11 +1308,11 @@ - + - - + + @@ -1275,11 +1364,11 @@ - + - + @@ -1289,11 +1378,11 @@ - + - + @@ -1322,11 +1411,11 @@ - + - - + + @@ -1348,37 +1437,37 @@ - + - + - + - + - + - + - + - + @@ -1421,29 +1510,29 @@ - + - + - + - + - + - + @@ -1456,17 +1545,17 @@ - + - + - + @@ -1521,11 +1610,11 @@ - + - + @@ -1535,11 +1624,11 @@ - + - + @@ -1568,17 +1657,17 @@ - + - + - + @@ -1592,29 +1681,29 @@ - + - + - + - + - + - + @@ -1700,11 +1789,11 @@ - + - + @@ -1714,11 +1803,11 @@ - + - + @@ -1824,11 +1913,11 @@ - + - + @@ -1838,11 +1927,11 @@ - + - + @@ -1981,11 +2070,11 @@ - + - + @@ -1995,23 +2084,23 @@ - + - + - - - + + + - - - + + + - - - + + + @@ -2032,17 +2121,17 @@ - + - + - + @@ -2133,11 +2222,11 @@ - + - + @@ -2147,11 +2236,11 @@ - + - + @@ -2230,17 +2319,17 @@ - + - + - + @@ -2255,29 +2344,29 @@ - + - + - + - + - + - + @@ -2287,19 +2376,19 @@ - + - + - + - - + + @@ -2311,19 +2400,19 @@ - + - + - + - - + + @@ -2334,17 +2423,17 @@ - + - + - + @@ -2354,11 +2443,11 @@ - + - - + + @@ -2417,11 +2506,11 @@ - + - + @@ -2431,11 +2520,11 @@ - + - + @@ -2475,11 +2564,11 @@ - + - - + + @@ -2491,17 +2580,17 @@ - + - + - + @@ -2512,19 +2601,19 @@ - + - + - + - - + + @@ -2533,19 +2622,19 @@ - + - + - + - - + + @@ -2559,29 +2648,29 @@ - + - + - + - + - + - + @@ -2595,17 +2684,17 @@ - + - + - + @@ -2805,11 +2894,11 @@ - + - + @@ -2819,11 +2908,11 @@ - + - + @@ -2886,11 +2975,11 @@ - + - - + + @@ -2901,37 +2990,37 @@ - + - + - + - + - + - + - + - + @@ -3032,11 +3121,11 @@ - + - + @@ -3046,11 +3135,11 @@ - + - + @@ -3116,11 +3205,11 @@ - + - - + + @@ -3131,37 +3220,37 @@ - + - + - + - + - + - + - + - + @@ -3252,17 +3341,17 @@ - + - + - + @@ -3276,17 +3365,17 @@ - + - + - + @@ -3300,17 +3389,17 @@ - + - + - + @@ -3327,15 +3416,15 @@ - + - + - - + + @@ -3347,29 +3436,29 @@ - + - + - + - + - + - + @@ -3386,19 +3475,19 @@ - + - + - + - - + + @@ -3412,33 +3501,33 @@ - + - + - + - + - + - + - + @@ -3460,11 +3549,11 @@ - + - - + + @@ -3699,11 +3788,11 @@ - + - + @@ -3713,11 +3802,11 @@ - + - + @@ -3765,19 +3854,19 @@ - + - + - + - - + + @@ -3797,33 +3886,33 @@ - + - + - + - + - + - + - + @@ -3845,11 +3934,11 @@ - + - - + + @@ -3858,15 +3947,15 @@ - + - + - - + + @@ -3878,29 +3967,29 @@ - + - + - + - + - + - + @@ -3920,17 +4009,17 @@ - + - + - + @@ -3944,17 +4033,17 @@ - + - + - + @@ -3968,17 +4057,17 @@ - + - + - + @@ -4174,17 +4263,17 @@ - + - + - + @@ -4195,11 +4284,11 @@ - + - - + + @@ -4211,29 +4300,29 @@ - + - + - + - + - + - + @@ -4244,15 +4333,15 @@ - + - + - - + + @@ -4293,9 +4382,13 @@ + + + + - + @@ -4411,11 +4504,11 @@ - + - + @@ -4425,11 +4518,11 @@ - + - + @@ -4473,15 +4566,15 @@ - + - + - - + + @@ -4490,11 +4583,11 @@ - + - - + + @@ -4506,29 +4599,29 @@ - + - + - + - + - + - + @@ -4542,17 +4635,17 @@ - + - + - + @@ -4585,6 +4678,9 @@ + + + @@ -4602,7 +4698,9 @@ + + @@ -4634,11 +4732,11 @@ - + - + @@ -4648,28 +4746,27 @@ - + - + - - - - + + + - - - - + + + - - - + + + - - + + + @@ -4682,6 +4779,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -4708,6 +4922,9 @@ + + + @@ -4768,7 +4985,7 @@ - + @@ -4806,7 +5023,7 @@ - + @@ -4845,7 +5062,7 @@ - + @@ -4903,11 +5120,11 @@ - + - + @@ -4917,11 +5134,11 @@ - + - + @@ -5017,11 +5234,11 @@ - + - + @@ -5031,11 +5248,11 @@ - + - + @@ -5100,37 +5317,37 @@ - + - + - + - + - + - + - + - + @@ -5146,11 +5363,11 @@ - + - - + + @@ -5244,11 +5461,11 @@ - + - + @@ -5258,11 +5475,11 @@ - + - + @@ -5352,11 +5569,11 @@ - + - - + + @@ -5368,37 +5585,37 @@ - + - + - + - + - + - + - + - + @@ -5486,11 +5703,11 @@ - + - + @@ -5500,11 +5717,11 @@ - + - + diff --git a/judo-ui-react-itest/RelationTest/model/RelationTest-ui.model b/judo-ui-react-itest/RelationTest/model/RelationTest-ui.model index 103acf2a..29ffa5e1 100644 --- a/judo-ui-react-itest/RelationTest/model/RelationTest-ui.model +++ b/judo-ui-react-itest/RelationTest/model/RelationTest-ui.model @@ -393,7 +393,7 @@ - + @@ -425,7 +425,7 @@ - + @@ -825,11 +825,11 @@ - + - + @@ -837,16 +837,16 @@ - + - + - - - + + + @@ -854,20 +854,20 @@ - + - + - + - - - + + + @@ -875,16 +875,16 @@ - + - - - + + + @@ -892,20 +892,20 @@ - + - + - - - + + + @@ -913,16 +913,16 @@ - + - - - + + + @@ -1044,11 +1044,11 @@ - + - + @@ -1058,11 +1058,11 @@ - + - + @@ -1083,11 +1083,11 @@ - + - + @@ -1095,16 +1095,16 @@ - + - + - - - + + + @@ -1112,20 +1112,20 @@ - + - + - + - - - + + + @@ -1133,16 +1133,16 @@ - + - - - + + + @@ -1150,20 +1150,20 @@ - + - + - - - + + + @@ -1171,16 +1171,16 @@ - + - - - + + + @@ -1293,45 +1293,45 @@ - + - + - + - + - + - + - + - + - + - + @@ -1346,37 +1346,37 @@ - + - + - + - + - + - + - + - + @@ -1391,11 +1391,11 @@ - + - + @@ -1403,15 +1403,15 @@ - + - + - - + + @@ -1424,11 +1424,11 @@ - + - + @@ -1436,11 +1436,11 @@ - + - - + + @@ -1559,11 +1559,11 @@ - + - + @@ -1573,11 +1573,11 @@ - + - + @@ -1609,45 +1609,45 @@ - + - + - + - + - + - + - + - + - + - + @@ -1662,37 +1662,37 @@ - + - + - + - + - + - + - + - + @@ -1703,45 +1703,45 @@ - + - + - + - + - + - + - + - + - + - + @@ -1760,11 +1760,11 @@ - + - + @@ -1772,15 +1772,15 @@ - + - + - - + + @@ -1793,11 +1793,11 @@ - + - + @@ -1805,11 +1805,11 @@ - + - - + + @@ -1994,11 +1994,11 @@ - + - + @@ -2008,11 +2008,11 @@ - + - + @@ -2141,11 +2141,11 @@ - + - + @@ -2155,11 +2155,11 @@ - + - + @@ -2255,11 +2255,11 @@ - + - + @@ -2269,11 +2269,11 @@ - + - + @@ -2369,11 +2369,11 @@ - + - + @@ -2383,11 +2383,11 @@ - + - + @@ -2483,11 +2483,11 @@ - + - + @@ -2497,11 +2497,11 @@ - + - + diff --git a/judo-ui-react/src/main/java/hu/blackbelt/judo/ui/generator/react/UiActionsHelper.java b/judo-ui-react/src/main/java/hu/blackbelt/judo/ui/generator/react/UiActionsHelper.java index 871c8d0b..3b996d57 100644 --- a/judo-ui-react/src/main/java/hu/blackbelt/judo/ui/generator/react/UiActionsHelper.java +++ b/judo-ui-react/src/main/java/hu/blackbelt/judo/ui/generator/react/UiActionsHelper.java @@ -33,8 +33,7 @@ import static hu.blackbelt.judo.ui.generator.react.UiPageHelper.*; import static hu.blackbelt.judo.ui.generator.react.UiWidgetHelper.*; -import static hu.blackbelt.judo.ui.generator.typescript.rest.commons.UiCommonsHelper.classDataName; -import static hu.blackbelt.judo.ui.generator.typescript.rest.commons.UiCommonsHelper.firstToUpper; +import static hu.blackbelt.judo.ui.generator.typescript.rest.commons.UiCommonsHelper.*; @Log @TemplateHelper @@ -65,10 +64,24 @@ public static Set getContainerOwnActionDefinitions(PageContain actionDefinitions.addAll(buttons.stream().map(Button::getActionDefinition).toList()); actionDefinitions.addAll(buttons.stream().map(Button::getPreFetchActionDefinition).filter(Objects::nonNull).toList()); + Set target = new HashSet<>(); + Map actionDefinitionMap = new HashMap<>(); + + for (ActionDefinition actionDefinition : flexActionDefinitions) { + OperationType operationType = actionDefinition instanceof InputFormCallOperationActionDefinition cad ? cad.getOperation() : null; + if (operationType == null) { + target.add(actionDefinition); + } else { + actionDefinitionMap.putIfAbsent(getXMIID(operationType), actionDefinition); + } + } + + target.addAll(actionDefinitionMap.values()); + SortedSet sorted = new TreeSet<>(Comparator.comparing(NamedElement::getFQName)); + sorted.addAll(target); sorted.addAll(actionDefinitions); - sorted.addAll(flexActionDefinitions); return sorted; } @@ -437,6 +450,15 @@ public static Action getRowViewActionForCreateOpenAction(Action action) { return null; } + public static boolean isActionInTableInViewNonBulk(Action action) { + Table table = getTableParentForActionDefinition(action.getActionDefinition()); + boolean isTableAction = table != null && table.getTableActionButtonGroup().getButtons().stream().anyMatch(b -> b.getActionDefinition().equals(action.getActionDefinition())); + if (!action.getActionDefinition().isIsBulk() && isTableAction) { + return ((PageDefinition) action.eContainer()).getContainer().isView(); + } + return false; + } + public static boolean isActionParentEagerElement(Action action) { Table table = getTableParentForActionDefinition(action.getActionDefinition()); Link link = getLinkParentForActionDefinition(action.getActionDefinition()); diff --git a/judo-ui-react/src/main/java/hu/blackbelt/judo/ui/generator/react/UiI18NHelper.java b/judo-ui-react/src/main/java/hu/blackbelt/judo/ui/generator/react/UiI18NHelper.java index 07c2fa53..19932cab 100644 --- a/judo-ui-react/src/main/java/hu/blackbelt/judo/ui/generator/react/UiI18NHelper.java +++ b/judo-ui-react/src/main/java/hu/blackbelt/judo/ui/generator/react/UiI18NHelper.java @@ -137,6 +137,7 @@ public static String getTranslationKeyForVisualElement(VisualElement element) { if (element instanceof PageContainer) { return element.getName().replaceAll("::", "."); } + String root = element.getPageContainer().getName(); VisualElement target = element; @@ -276,6 +277,9 @@ public static Map getApplicationTranslations(Application applica return; } translations.put(getTranslationKeyForVisualElement(b), b.getLabel()); + if (b.getConfirmation() != null) { + translations.put(getTranslationKeyForVisualElement(b) + ".confirmation", b.getConfirmation().getConfirmationMessage()); + } }); } if (table.getRowActionButtonGroup() != null) { diff --git a/judo-ui-react/src/main/java/hu/blackbelt/judo/ui/generator/react/UiPageContainerHelper.java b/judo-ui-react/src/main/java/hu/blackbelt/judo/ui/generator/react/UiPageContainerHelper.java index 1c8dafa5..e90d75d0 100644 --- a/judo-ui-react/src/main/java/hu/blackbelt/judo/ui/generator/react/UiPageContainerHelper.java +++ b/judo-ui-react/src/main/java/hu/blackbelt/judo/ui/generator/react/UiPageContainerHelper.java @@ -88,7 +88,7 @@ public static String simpleActionDefinitionName(ActionDefinition actionDefinitio // CallOperation actions are rolled on the form container, which could lead to method name collisions. suffix = firstToLower(callOperationActionDefinition.getOperation().getName()) + "For" + firstToUpper(callOperationActionDefinition.getOperation().getOwnerSimpleName()); } else if (actionDefinition instanceof BulkCallOperationActionDefinition bulkCallOperationActionDefinition) { - suffix = "bulk" + firstToUpper(bulkCallOperationActionDefinition.getBulkOf().getOperation().getName()); + suffix = "bulk" + firstToUpper(bulkCallOperationActionDefinition.getOperation().getName()); } else if (actionDefinition instanceof OpenOperationInputSelectorActionDefinition openOperationInputSelectorActionDefinition) { if (openOperationInputSelectorActionDefinition.getSelectorFor() != null) { if (openOperationInputSelectorActionDefinition.getSelectorFor() instanceof CallOperationActionDefinition callOperationActionDefinition) { @@ -479,4 +479,29 @@ public static String getCustomImplementationProps(VisualElement element) { } return "data, validation, editMode, storeDiff, isLoading, actions"; } + + public static List getOperationFormCallerPages(PageContainer container, Application application) { + List pages = new ArrayList<>(); + if (!container.isForm()) { + return pages; + } + boolean hasOp = getContainerOwnActionDefinitions(container).stream().anyMatch(ActionDefinition::getIsInputFormCallOperationAction); + + if (hasOp) { + pages = application.getPages().stream().filter(p -> p.getContainer().equals(container)).toList(); + } + return pages; + } + + public static boolean hasOperationFormCallerPages(PageContainer container, Application application) { + return !getOperationFormCallerPages(container, application).isEmpty(); + } + + public static PageDefinition getCallerPageForOperationFormCallButton(Button button, Application application) { + PageContainer container = button.getPageContainer(); + List pages = getOperationFormCallerPages(container, application); + return pages.stream() + .filter(p -> p.getActions().stream().anyMatch(a -> a.getActionDefinition().equals(button.getActionDefinition()))) + .findFirst().orElse(null); + } } diff --git a/judo-ui-react/src/main/java/hu/blackbelt/judo/ui/generator/react/UiTableHelper.java b/judo-ui-react/src/main/java/hu/blackbelt/judo/ui/generator/react/UiTableHelper.java index a9b4936b..1a546948 100644 --- a/judo-ui-react/src/main/java/hu/blackbelt/judo/ui/generator/react/UiTableHelper.java +++ b/judo-ui-react/src/main/java/hu/blackbelt/judo/ui/generator/react/UiTableHelper.java @@ -251,10 +251,7 @@ public static boolean tableHasBulkOperations(Table table) { } public static boolean tableHasSelectorColumn(Table table) { - return table.isIsSelectorTable() - || table.getRowActionDefinitions().stream().anyMatch(a -> ((ActionDefinition) a).isIsBulkCapable()) - || table.getRowActionDefinitions().stream().anyMatch(a -> ((ActionDefinition) a).getIsDeleteAction()) - || table.getRowActionDefinitions().stream().anyMatch(a -> ((ActionDefinition) a).getIsRemoveAction()); + return table.isIsSelectorTable() || tableHasBulkOperations(table); } public static Column getFirstTitleColumnForTable(Table table) { diff --git a/judo-ui-react/src/main/resources/actor/src/components/table/EagerTable.tsx.hbs b/judo-ui-react/src/main/resources/actor/src/components/table/EagerTable.tsx.hbs index 234ce6f9..cff9e3cb 100644 --- a/judo-ui-react/src/main/resources/actor/src/components/table/EagerTable.tsx.hbs +++ b/judo-ui-react/src/main/resources/actor/src/components/table/EagerTable.tsx.hbs @@ -25,6 +25,7 @@ import { columnsActionCalculator, } from '~/components/table'; import { RowHighlightLegend } from '~/components/table'; +import { useConfirmDialog } from '~/components/dialog'; import { basePageSizeOptions, baseTableConfig } from '~/config'; import { useDataStore } from '~/hooks'; import { transformRowStylings } from '~/theme/table-row-highlighting'; @@ -133,6 +134,7 @@ export function EagerTable} variant={toolBarAction.variant} onClick={async () => { + if (toolBarAction.confirmation && (typeof toolBarAction.confirmationCondition === 'undefined' || toolBarAction.confirmationCondition === true)) { + const result = await openConfirmDialog( + toolBarAction.id, + toolBarAction.confirmation, + t('judo.modal.confirm.confirm-title', { defaultValue: 'Confirm action' }) as string, + ); + + if (!result) { + return; + } + } if (toolBarAction.name === calculateActionName(relationName, 'filterAction')) { await filterAction(toolBarAction.id); } else { diff --git a/judo-ui-react/src/main/resources/actor/src/components/table/LazyTable.tsx.hbs b/judo-ui-react/src/main/resources/actor/src/components/table/LazyTable.tsx.hbs index 55402f73..16f259d7 100644 --- a/judo-ui-react/src/main/resources/actor/src/components/table/LazyTable.tsx.hbs +++ b/judo-ui-react/src/main/resources/actor/src/components/table/LazyTable.tsx.hbs @@ -27,6 +27,7 @@ StripedDataGrid, columnsActionCalculator, RowHighlightLegend, } from '~/components/table'; +import { useConfirmDialog } from '~/components/dialog'; import { basePageSizeOptions, baseTableConfig, filterDebounceMs } from '~/config'; import { useDataStore } from '~/hooks'; import { transformRowStylings } from '~/theme/table-row-highlighting'; @@ -166,6 +167,7 @@ export function LazyTable(false); const [totalCount, setTotalCount] = useState(-1); const [data, setData] = useState[]>(dataProp); @@ -625,6 +627,17 @@ export function LazyTable} variant={toolBarAction.variant} onClick={async () => { + if (toolBarAction.confirmation && (typeof toolBarAction.confirmationCondition === 'undefined' || toolBarAction.confirmationCondition === true)) { + const result = await openConfirmDialog( + toolBarAction.id, + toolBarAction.confirmation, + t('judo.modal.confirm.confirm-title', { defaultValue: 'Confirm action' }) as string, + ); + + if (!result) { + return; + } + } if (toolBarAction.name === calculateActionName(relationName, 'filterAction')) { await filterAction(toolBarAction.id); } else { diff --git a/judo-ui-react/src/main/resources/actor/src/containers/components/table/index.tsx.hbs b/judo-ui-react/src/main/resources/actor/src/containers/components/table/index.tsx.hbs index 791daa77..8e8c9b31 100644 --- a/judo-ui-react/src/main/resources/actor/src/containers/components/table/index.tsx.hbs +++ b/judo-ui-react/src/main/resources/actor/src/containers/components/table/index.tsx.hbs @@ -171,16 +171,22 @@ export function {{ componentName table }}(props: {{ componentName table }}Props) const toolBarActions: ToolBarActionProps<{{# with (getReferenceClassType table) as |classType| }}{{# if classType.isMapped }}{{ classDataName (getReferenceClassType table) 'Stored' }}{{ else }}{{ classDataName (getReferenceClassType table) '' }}{{/ if }}{{/ with }}>[] = [ {{# each table.tableActionButtonGroup.buttons as |button| }} { - name:"{{ simpleActionDefinitionName actionDefinition }}", - id:"{{ getXMIID button }}", + name: "{{ simpleActionDefinitionName actionDefinition }}", + id: "{{ getXMIID button }}", {{# if button.icon }} - startIcon:"{{ button.icon.iconName }}", + startIcon: "{{ button.icon.iconName }}", {{/ if }} - variant:{{{ variantForButton button }}}, - hiddenBy:{{# if button.hiddenBy }}true{{ else }}false{{/ if }}, - label:{ 'translationKey': '{{ getTranslationKeyForVisualElement button }}', 'defaultValue': '{{ button.label }}' }, + variant: {{{ variantForButton button }}}, + hiddenBy: {{# if button.hiddenBy }}true{{ else }}false{{/ if }}, + label: { 'translationKey': '{{ getTranslationKeyForVisualElement button }}', 'defaultValue': '{{ button.label }}' }, enabled: (data: {{# with (getReferenceClassType table) as |classType| }}{{# if classType.isMapped }}{{ classDataName (getReferenceClassType table) 'Stored' }}[]{{ else }}{{ classDataName (getReferenceClassType table) '' }}[]{{/ if }}{{/ with }}, selectionModel: GridRowSelectionModel, ownerData?: any, isFormUpdateable?: () => boolean): boolean => {{{ tableButtonVisibilityConditions button table container }}}, isBulk: {{ boolValue actionDefinition.isBulk }}, + {{# if button.confirmation }} + confirmation: t('{{ getTranslationKeyForVisualElement button }}.confirmation', { defaultValue: '{{ button.confirmation.confirmationMessage }}' }) as string, + {{# if (shouldRenderConfirmationCondition button) }} + confirmationCondition: data?.{{ button.confirmation.confirmationCondition.name }} ?? false, + {{/ if }} + {{/ if }} }, {{/ each }} diff --git a/judo-ui-react/src/main/resources/actor/src/containers/components/table/types.ts.hbs b/judo-ui-react/src/main/resources/actor/src/containers/components/table/types.ts.hbs index ce8565c9..a23d68b4 100644 --- a/judo-ui-react/src/main/resources/actor/src/containers/components/table/types.ts.hbs +++ b/judo-ui-react/src/main/resources/actor/src/containers/components/table/types.ts.hbs @@ -42,7 +42,7 @@ export interface {{ componentName table }}ActionDefinitions { {{/ if }} {{/ each }} {{# each table.rowActionDefinitions as |actionDefinition| }} - {{ simpleActionDefinitionName actionDefinition }}?: (row: {{ classDataName (getReferenceClassType table) 'Stored' }}{{# if actionDefinition.isBulkCapable }}, silentMode?: boolean{{ else }}{{# if actionDefinition.isOpenPageAction }}, isDraft?: boolean{{/ if }}{{/ if }}) => Promise; + {{ simpleActionDefinitionName actionDefinition }}?: (row: {{ classDataName (getReferenceClassType table) 'Stored' }}{{# if actionDefinition.isOpenPageAction }}, isDraft?: boolean{{/ if }}) => Promise; {{/ each }} {{ table.relationType.name }}AdditionalToolbarButtons?: ( {{# with (getReferenceClassType table) as |classType| }} diff --git a/judo-ui-react/src/main/resources/actor/src/containers/dialog.tsx.hbs b/judo-ui-react/src/main/resources/actor/src/containers/dialog.tsx.hbs index ecb9a6af..5e803a5f 100644 --- a/judo-ui-react/src/main/resources/actor/src/containers/dialog.tsx.hbs +++ b/judo-ui-react/src/main/resources/actor/src/containers/dialog.tsx.hbs @@ -57,6 +57,9 @@ export default function {{ containerComponentName container }}Dialog({{# unless const createDropdownRef = useRef(null); {{/ if }} const { + {{# if (hasOperationFormCallerPages container application) }} + formFor, + {{/ if }} ownerData, onClose {{# unless (containerIsEmptyDashboard container) }}, @@ -150,7 +153,7 @@ export default function {{ containerComponentName container }}Dialog({{# unless {{# each container.actionButtonGroup.buttons as |button| }} - { {{{ containerButtonAvailable button }}} && actions.{{ simpleActionDefinitionName actionDefinition }} && ( + { {{# if button.actionDefinition.isInputFormCallOperationAction }}formFor === '{{ safeName (getCallerPageForOperationFormCallButton button application) }}' && {{/ if }}{{{ containerButtonAvailable button }}} && actions.{{ simpleActionDefinitionName actionDefinition }} && ( {{# if button.actionDefinition.isCreateAction }} {{# unless button.actionDefinition.autoOpenAfterCreate }} diff --git a/judo-ui-react/src/main/resources/actor/src/containers/types.ts.hbs b/judo-ui-react/src/main/resources/actor/src/containers/types.ts.hbs index 595a62c5..a7767b47 100644 --- a/judo-ui-react/src/main/resources/actor/src/containers/types.ts.hbs +++ b/judo-ui-react/src/main/resources/actor/src/containers/types.ts.hbs @@ -22,6 +22,10 @@ export interface {{ pageContainerActionDefinitionTypeName container }}{{# if (containerHasRelationComponents container) }} extends {{# each (getContainerActionsExtends container) as |ext| }}{{ ext }}{{# unless @last}},{{/ unless}}{{/ each }}{{/ if }} { getPageTitle?: ({{# unless container.table }}data: {{ classDataName container.dataElement '' }}{{/ unless }}) => string; {{# each (getContainerOwnActionDefinitions container) as |actionDefinition| }} + {{# if actionDefinition.isCallOperationAction }} + // {{ getXMIID actionDefinition.operation }} + // {{ actionDefinition.operation.name }} + {{/ if }} {{ simpleActionDefinitionName actionDefinition }}?: ({{{ getContainerOwnActionParameters actionDefinition container }}}) => Promise<{{{ getContainerOwnActionReturnType actionDefinition container }}}>; {{/ each }} {{# each (getOnBlurAttributesForContainer container) as |attributeType| }} @@ -53,7 +57,9 @@ {{# if actionDefinition.isRefreshAction }} {{ simpleActionDefinitionName actionDefinition }}?: (queryCustomizer: {{ classDataName container.dataElement 'QueryCustomizer' }}) => Promise>; {{ else }} - {{ simpleActionDefinitionName actionDefinition }}?: () => Promise; + {{# unless actionDefinition.isCallOperationAction }} + {{ simpleActionDefinitionName actionDefinition }}?: () => Promise; + {{/ unless }} {{/ if }} {{/ each }} } @@ -79,13 +85,25 @@ export interface {{ containerComponentName container }}DialogActions extends {{ pageContainerActionDefinitionTypeName container }} { {{# each container.pageActionDefinitions as |actionDefinition| }} - {{ simpleActionDefinitionName actionDefinition }}?: ({{{ getContainerOwnActionParameters actionDefinition container }}}) => Promise<{{{ getContainerOwnActionReturnType actionDefinition container }}}>; + {{# unless actionDefinition.isCallOperationAction }} + {{ simpleActionDefinitionName actionDefinition }}?: ({{{ getContainerOwnActionParameters actionDefinition container }}}) => Promise<{{{ getContainerOwnActionReturnType actionDefinition container }}}>; + {{/ unless }} {{/ each }} } +{{# if (hasOperationFormCallerPages container application) }} + export type FormFor{{ containerComponentName container }} = + {{# each (getOperationFormCallerPages container application) as |actionDefinition| }} + '{{ safeName actionDefinition }}'{{# unless @last}} | {{/ unless}} + {{/ each }}; +{{/ if }} + export interface {{ containerComponentName container }}DialogProps { ownerData: any; onClose: () => Promise; + {{# if (hasOperationFormCallerPages container application) }} + formFor: FormFor{{ containerComponentName container }}; + {{/ if }} {{# unless (containerIsEmptyDashboard container) }} actions: {{ containerComponentName container }}DialogActions; dataPath?: string; @@ -109,16 +127,6 @@ isDraft?: boolean; {{/ unless }} }; - - export interface {{ containerComponentName container }}PageActions extends {{ pageContainerActionDefinitionTypeName container }} { - {{# each container.pageActionDefinitions as |actionDefinition| }} - {{# if actionDefinition.isRefreshAction }} - {{ simpleActionDefinitionName actionDefinition }}?: (queryCustomizer: {{ classDataName container.dataElement 'QueryCustomizer' }}) => Promise>; - {{ else }} - {{ simpleActionDefinitionName actionDefinition }}?: () => Promise; - {{/ if }} - {{/ each }} - } {{ else }} export const _ = 'placeholder'; {{/ unless }} diff --git a/judo-ui-react/src/main/resources/actor/src/dialogs/index.tsx.hbs b/judo-ui-react/src/main/resources/actor/src/dialogs/index.tsx.hbs index c0494d8b..c27f7adc 100644 --- a/judo-ui-react/src/main/resources/actor/src/dialogs/index.tsx.hbs +++ b/judo-ui-react/src/main/resources/actor/src/dialogs/index.tsx.hbs @@ -255,6 +255,9 @@ export default function {{ pageName page }}(props: {{ pageName page }}Props) { // ViewModel setup const viewModel: {{ containerComponentName page.container }}ViewModel = { + {{# if (hasOperationFormCallerPages page.container application) }} + formFor: '{{ safeName page }}', + {{/ if }} onClose, actions, ownerData, @@ -318,6 +321,9 @@ export default function {{ pageName page }}(props: {{ pageName page }}Props) { isLoading={isLoading} editMode={editMode} refreshCounter={refreshCounter} + {{# if (hasOperationFormCallerPages page.container application) }} + formFor={'{{ safeName page }}'} + {{/ if }} {{# unless (containerIsEmptyDashboard page.container) }} {{# if page.container.isSelector }} selectionDiff={selectionDiff} diff --git a/judo-ui-react/src/main/resources/actor/src/pages/actions/AddAction.fragment.hbs b/judo-ui-react/src/main/resources/actor/src/pages/actions/AddAction.fragment.hbs index a606981c..0f9a128e 100644 --- a/judo-ui-react/src/main/resources/actor/src/pages/actions/AddAction.fragment.hbs +++ b/judo-ui-react/src/main/resources/actor/src/pages/actions/AddAction.fragment.hbs @@ -1,3 +1,4 @@ +// AddAction: {{ getXMIID action }} const {{ simpleActionDefinitionName action.actionDefinition }} = async (selected: {{ classDataName action.actionDefinition.targetType 'Stored' }}[]) => { onSubmit(selected); }; diff --git a/judo-ui-react/src/main/resources/actor/src/pages/actions/AutocompleteRangeAction.fragment.hbs b/judo-ui-react/src/main/resources/actor/src/pages/actions/AutocompleteRangeAction.fragment.hbs index ad2b1b72..334987f3 100644 --- a/judo-ui-react/src/main/resources/actor/src/pages/actions/AutocompleteRangeAction.fragment.hbs +++ b/judo-ui-react/src/main/resources/actor/src/pages/actions/AutocompleteRangeAction.fragment.hbs @@ -1,3 +1,4 @@ +// AutocompleteRangeAction: {{ getXMIID action }} const {{ simpleActionDefinitionName action.actionDefinition }} = async (queryCustomizer: {{ classDataName action.actionDefinition.targetType 'QueryCustomizer' }}): Promise<{{ classDataName action.actionDefinition.targetType 'Stored' }}[]> => { {{# with (getLinkParentForActionDefinition action.actionDefinition) as |link| }} try { diff --git a/judo-ui-react/src/main/resources/actor/src/pages/actions/AutocompleteSetAction.fragment.hbs b/judo-ui-react/src/main/resources/actor/src/pages/actions/AutocompleteSetAction.fragment.hbs index 9e42cd7c..a7deff03 100644 --- a/judo-ui-react/src/main/resources/actor/src/pages/actions/AutocompleteSetAction.fragment.hbs +++ b/judo-ui-react/src/main/resources/actor/src/pages/actions/AutocompleteSetAction.fragment.hbs @@ -1,3 +1,4 @@ +// AutocompleteSetAction: {{ getXMIID action }} const {{ simpleActionDefinitionName action.actionDefinition }} = async (selected: {{ classDataName action.actionDefinition.targetType 'Stored' }}) => { {{# with (getLinkParentForActionDefinition action.actionDefinition) as |link| }} try { diff --git a/judo-ui-react/src/main/resources/actor/src/pages/actions/BackAction.fragment.hbs b/judo-ui-react/src/main/resources/actor/src/pages/actions/BackAction.fragment.hbs index 5f012b25..01d61b71 100644 --- a/judo-ui-react/src/main/resources/actor/src/pages/actions/BackAction.fragment.hbs +++ b/judo-ui-react/src/main/resources/actor/src/pages/actions/BackAction.fragment.hbs @@ -1,3 +1,4 @@ +// BackAction: {{ getXMIID action }} const {{ simpleActionDefinitionName action.actionDefinition }} = async () => { {{# if page.openInDialog }} onClose(); diff --git a/judo-ui-react/src/main/resources/actor/src/pages/actions/BulkCallOperationAction.fragment.hbs b/judo-ui-react/src/main/resources/actor/src/pages/actions/BulkCallOperationAction.fragment.hbs index 8a14bafc..9054abc3 100644 --- a/judo-ui-react/src/main/resources/actor/src/pages/actions/BulkCallOperationAction.fragment.hbs +++ b/judo-ui-react/src/main/resources/actor/src/pages/actions/BulkCallOperationAction.fragment.hbs @@ -1,4 +1,5 @@ -const {{ simpleActionDefinitionName action.actionDefinition }} = async (selectedRows: {{ classDataName action.actionDefinition.bulkOf.targetType 'Stored' }}[]): Promise>> => { +// BulkCallOperationAction: {{ getXMIID action }} +const {{ simpleActionDefinitionName action.actionDefinition }} = async (selectedRows: {{ classDataName action.actionDefinition.targetType 'Stored' }}[]): Promise>> => { {{# with (getTableParentForActionDefinition action.actionDefinition) as |table| }} return new Promise((resolve) => { openCRUDDialog<{{ classDataName (getReferenceClassType table) 'Stored' }}>({ @@ -11,9 +12,7 @@ const {{ simpleActionDefinitionName action.actionDefinition }} = async (selected selectedItems: selectedRows, action: async (item, successHandler: () => void, errorHandler: (error: any) => void) => { try { - if (actions.{{ simpleActionDefinitionName actionDefinition.bulkOf }}) { - await actions.{{ simpleActionDefinitionName actionDefinition.bulkOf }}!(item, true); - } + await {{ getServiceImplForPage page }}.{{ action.actionDefinition.operation.name }}{{ operationCallSuffix action }}(item); successHandler(); } catch (error) { errorHandler(error); diff --git a/judo-ui-react/src/main/resources/actor/src/pages/actions/BulkDeleteAction.fragment.hbs b/judo-ui-react/src/main/resources/actor/src/pages/actions/BulkDeleteAction.fragment.hbs index 5bba6147..8f857944 100644 --- a/judo-ui-react/src/main/resources/actor/src/pages/actions/BulkDeleteAction.fragment.hbs +++ b/judo-ui-react/src/main/resources/actor/src/pages/actions/BulkDeleteAction.fragment.hbs @@ -1,4 +1,5 @@ -const {{ simpleActionDefinitionName action.actionDefinition }} = async (selectedRows: {{ classDataName action.actionDefinition.bulkOf.targetType 'Stored' }}[]): Promise>> => { +// BulkDeleteAction: {{ getXMIID action }} +const {{ simpleActionDefinitionName action.actionDefinition }} = async (selectedRows: {{ classDataName action.actionDefinition.targetType 'Stored' }}[]): Promise>> => { {{# with (getTableParentForActionDefinition action.actionDefinition) as |table| }} return new Promise((resolve) => { {{# if table.isEager }} @@ -20,9 +21,12 @@ const {{ simpleActionDefinitionName action.actionDefinition }} = async (selected selectedItems: selectedRows, action: async (item, successHandler: () => void, errorHandler: (error: any) => void) => { try { - if (actions.{{ simpleActionDefinitionName actionDefinition.bulkOf }}) { - await actions.{{ simpleActionDefinitionName actionDefinition.bulkOf }}!(item, true); - } + {{# if (isActionParentEagerElement action) }} + const newList = (data?.{{ table.dataElement.name }} ?? []).filter((c: any) => c.__identifier !== item.__identifier); + storeDiff('{{ table.dataElement.name }}', newList); + {{ else }} + await {{ getServiceImplForPage page }}.delete{{# if action.targetDataElement }}{{ firstToUpper action.targetDataElement.name }}{{/ if }}(item); + {{/ if }} successHandler(); } catch (error) { errorHandler(error); diff --git a/judo-ui-react/src/main/resources/actor/src/pages/actions/BulkRemoveAction.fragment.hbs b/judo-ui-react/src/main/resources/actor/src/pages/actions/BulkRemoveAction.fragment.hbs index 40734446..7b2fb444 100644 --- a/judo-ui-react/src/main/resources/actor/src/pages/actions/BulkRemoveAction.fragment.hbs +++ b/judo-ui-react/src/main/resources/actor/src/pages/actions/BulkRemoveAction.fragment.hbs @@ -1,4 +1,5 @@ -const {{ simpleActionDefinitionName action.actionDefinition }} = async (selectedRows: {{ classDataName action.actionDefinition.bulkOf.targetType 'Stored' }}[]): Promise>> => { +// BulkRemoveAction: {{ getXMIID action }} +const {{ simpleActionDefinitionName action.actionDefinition }} = async (selectedRows: {{ classDataName action.actionDefinition.targetType 'Stored' }}[]): Promise>> => { {{# with (getTableParentForActionDefinition action.actionDefinition) as |table| }} return new Promise((resolve) => { {{# if table.isEager }} @@ -20,9 +21,12 @@ const {{ simpleActionDefinitionName action.actionDefinition }} = async (selected selectedItems: selectedRows, action: async (item, successHandler: () => void, errorHandler: (error: any) => void) => { try { - if (actions.{{ simpleActionDefinitionName actionDefinition.bulkOf }}) { - await actions.{{ simpleActionDefinitionName actionDefinition.bulkOf }}!(item, true); - } + {{# if table.isEager }} + const newList = (data?.{{ table.dataElement.name }} ?? []).filter((c: any) => c.__identifier !== item.__identifier); + storeDiff('{{ table.dataElement.name }}', newList); + {{ else }} + await {{ getServiceImplForPage page }}.remove{{ firstToUpper action.targetDataElement.name }}({{# if page.container.table }}{ __signedIdentifier: signedIdentifier } as any{{ else }}data{{/ if }}, [item]); + {{/ if }} successHandler(); } catch (error) { errorHandler(error); diff --git a/judo-ui-react/src/main/resources/actor/src/pages/actions/CancelAction.fragment.hbs b/judo-ui-react/src/main/resources/actor/src/pages/actions/CancelAction.fragment.hbs index 2f1038ff..3ad5c75d 100644 --- a/judo-ui-react/src/main/resources/actor/src/pages/actions/CancelAction.fragment.hbs +++ b/judo-ui-react/src/main/resources/actor/src/pages/actions/CancelAction.fragment.hbs @@ -1,3 +1,4 @@ +// CancelAction: {{ getXMIID action }} const {{ simpleActionDefinitionName action.actionDefinition }} = async () => { setValidation(new Map()); {{# and page.openInDialog page.container.view }} diff --git a/judo-ui-react/src/main/resources/actor/src/pages/actions/ClearAction.fragment.hbs b/judo-ui-react/src/main/resources/actor/src/pages/actions/ClearAction.fragment.hbs index 71e480df..b5528173 100644 --- a/judo-ui-react/src/main/resources/actor/src/pages/actions/ClearAction.fragment.hbs +++ b/judo-ui-react/src/main/resources/actor/src/pages/actions/ClearAction.fragment.hbs @@ -1,3 +1,4 @@ +// ClearAction: {{ getXMIID action }} const {{ simpleActionDefinitionName action.actionDefinition }} = async () => { {{# with (getTableParentForActionDefinition action.actionDefinition) as |table| }} {{# if table.isEager }} diff --git a/judo-ui-react/src/main/resources/actor/src/pages/actions/CreateAction.fragment.hbs b/judo-ui-react/src/main/resources/actor/src/pages/actions/CreateAction.fragment.hbs index 1363db86..f80a77e5 100644 --- a/judo-ui-react/src/main/resources/actor/src/pages/actions/CreateAction.fragment.hbs +++ b/judo-ui-react/src/main/resources/actor/src/pages/actions/CreateAction.fragment.hbs @@ -1,3 +1,4 @@ +// CreateAction: {{ getXMIID action }} const {{ simpleActionDefinitionName action.actionDefinition }} = async (openCreated?: boolean) => { try { {{# if (hasPageRequiredBy page) }} diff --git a/judo-ui-react/src/main/resources/actor/src/pages/actions/CustomAction.fragment.hbs b/judo-ui-react/src/main/resources/actor/src/pages/actions/CustomAction.fragment.hbs index b7500951..cd47592d 100644 --- a/judo-ui-react/src/main/resources/actor/src/pages/actions/CustomAction.fragment.hbs +++ b/judo-ui-react/src/main/resources/actor/src/pages/actions/CustomAction.fragment.hbs @@ -1,3 +1,4 @@ +// CustomAction: {{ getXMIID action }} const {{ simpleActionDefinitionName action.actionDefinition }} = async () => { alert('CustomAction'); }; diff --git a/judo-ui-react/src/main/resources/actor/src/pages/actions/DeleteAction.fragment.hbs b/judo-ui-react/src/main/resources/actor/src/pages/actions/DeleteAction.fragment.hbs index 0965bbf1..cba7c639 100644 --- a/judo-ui-react/src/main/resources/actor/src/pages/actions/DeleteAction.fragment.hbs +++ b/judo-ui-react/src/main/resources/actor/src/pages/actions/DeleteAction.fragment.hbs @@ -1,4 +1,5 @@ -const {{ simpleActionDefinitionName action.actionDefinition }} = async ({{# if action.actionDefinition.targetType }}target: {{ classDataName action.actionDefinition.targetType 'Stored' }}{{# if action.actionDefinition.isBulkCapable }}, silentMode?: boolean{{/ if }}{{/ if}}) => { +// DeleteAction: {{ getXMIID action }} +const {{ simpleActionDefinitionName action.actionDefinition }} = async ({{# if action.actionDefinition.targetType }}target: {{ classDataName action.actionDefinition.targetType 'Stored' }}{{/ if}}) => { try { const confirmed = await openConfirmDialog( 'delete-action', diff --git a/judo-ui-react/src/main/resources/actor/src/pages/actions/ExportAction.fragment.hbs b/judo-ui-react/src/main/resources/actor/src/pages/actions/ExportAction.fragment.hbs index 671e81f2..bf73aeef 100644 --- a/judo-ui-react/src/main/resources/actor/src/pages/actions/ExportAction.fragment.hbs +++ b/judo-ui-react/src/main/resources/actor/src/pages/actions/ExportAction.fragment.hbs @@ -1,3 +1,4 @@ +// ExportAction: {{ getXMIID action }} {{# if action.targetDataElement }} const {{ simpleActionDefinitionName action.actionDefinition }} = async (queryCustomizer: {{ classDataName action.targetDataElement.target 'QueryCustomizer' }}) => { {{ else }} diff --git a/judo-ui-react/src/main/resources/actor/src/pages/actions/FilterAction.fragment.hbs b/judo-ui-react/src/main/resources/actor/src/pages/actions/FilterAction.fragment.hbs index 8ad0a322..00d15c36 100644 --- a/judo-ui-react/src/main/resources/actor/src/pages/actions/FilterAction.fragment.hbs +++ b/judo-ui-react/src/main/resources/actor/src/pages/actions/FilterAction.fragment.hbs @@ -1,3 +1,4 @@ +// FilterAction: {{ getXMIID action }} const {{ simpleActionDefinitionName action.actionDefinition }} = async (id: string, filterOptions: FilterOption[], model?: GridFilterModel, filters?: Filter[]): Promise<{ model?: GridFilterModel; filters?: Filter[] }> => { const newFilters = await openFilterDialog(id, filterOptions, filters); return { diff --git a/judo-ui-react/src/main/resources/actor/src/pages/actions/GetTemplateAction.fragment.hbs b/judo-ui-react/src/main/resources/actor/src/pages/actions/GetTemplateAction.fragment.hbs index 8a54aacf..259f5cec 100644 --- a/judo-ui-react/src/main/resources/actor/src/pages/actions/GetTemplateAction.fragment.hbs +++ b/judo-ui-react/src/main/resources/actor/src/pages/actions/GetTemplateAction.fragment.hbs @@ -1,3 +1,4 @@ +// GetTemplateAction: {{ getXMIID action }} const {{ simpleActionDefinitionName action.actionDefinition }} = async (): Promise> => { try { setIsLoading(true); diff --git a/judo-ui-react/src/main/resources/actor/src/pages/actions/InputFormCallOperationAction.fragment.hbs b/judo-ui-react/src/main/resources/actor/src/pages/actions/InputFormCallOperationAction.fragment.hbs new file mode 100644 index 00000000..48ad03b3 --- /dev/null +++ b/judo-ui-react/src/main/resources/actor/src/pages/actions/InputFormCallOperationAction.fragment.hbs @@ -0,0 +1,59 @@ +// InputFormCallOperationAction: {{ getXMIID action }} +const {{ simpleActionDefinitionName action.actionDefinition }} = async ({{# if action.actionDefinition.targetType }}target?: {{ classDataName action.actionDefinition.targetType 'Stored' }}{{/ if }}) => { + {{# with action.actionDefinition.operation as |operation| }} + try { + {{# if (hasPageRequiredBy page) }} + {{> actor/src/fragments/page/local-validate.fragment.hbs }} + {{/ if }} + + setIsLoading(true); + {{# if operation.output }}const { data: result } = {{/ if }}await {{ getServiceImplForPage page }}.{{ operation.name }}{{ operationCallSuffix action }}( + {{# unless operation.isStatic }}produceDataAdjustedOwner(),{{/ unless }} + data + ); + if (customActions?.post{{ firstToUpper (simpleActionDefinitionName action.actionDefinition) }}) { + await customActions.post{{ firstToUpper (simpleActionDefinitionName action.actionDefinition) }}( + {{# if action.actionDefinition.targetType }}target!,{{/ if }} + {{# if operation.output }}result,{{/ if }} + onSubmit, + onClose + ); + } else { + showSuccessSnack(t('judo.action.operation.success', { defaultValue: 'Operation executed successfully' }) as string); + onSubmit({{# if operation.output }}result{{/ if }}); + + {{# if operation.postCallAccessNavigation }} + try { + const { data: pcan } = await {{ firstToLower (serviceRelationName operation.postCallAccessNavigation.accessRelation) }}Impl.list(undefined, { + _identifier: result.__identifier, + }); + {{# if action.targetPageDefinition.openInDialog }} + await open{{ pageName operation.postCallAccessNavigation.pageDefinition }}({ + ownerData: pcan[0] + }); + {{ else }} + navigate(routeTo{{ pageName operation.postCallAccessNavigation.pageDefinition }}(pcan[0].__signedIdentifier)); + {{/ if }} + } catch(error) { + console.error('Could not proceed with post call access navigation', error); + } + {{ else }} + {{# if operation.output }} + {{# if action.targetPageDefinition.openInDialog }} + await open{{ pageName action.targetPageDefinition }}({ + ownerData: produceDataAdjustedOwner(), + data: result, + }); + {{ else }} + navigate(routeTo{{ pageName action.targetPageDefinition }}(result.__signedIdentifier)); + {{/ if }} + {{/ if }} + {{/ if }} + } + } catch (error) { + handleError<{{ classDataName (getReferenceClassType page) '' }}>(error, { setValidation }, owner.current, dataPath); + } finally { + setIsLoading(false); + } + {{/ with }} +}; diff --git a/judo-ui-react/src/main/resources/actor/src/pages/actions/CallOperationAction.fragment.hbs b/judo-ui-react/src/main/resources/actor/src/pages/actions/InputSelectorCallOperationAction.fragment.hbs similarity index 57% rename from judo-ui-react/src/main/resources/actor/src/pages/actions/CallOperationAction.fragment.hbs rename to judo-ui-react/src/main/resources/actor/src/pages/actions/InputSelectorCallOperationAction.fragment.hbs index 4647a392..190111a9 100644 --- a/judo-ui-react/src/main/resources/actor/src/pages/actions/CallOperationAction.fragment.hbs +++ b/judo-ui-react/src/main/resources/actor/src/pages/actions/InputSelectorCallOperationAction.fragment.hbs @@ -1,59 +1,20 @@ +// InputSelectorCallOperationAction: {{ getXMIID action }} const {{ simpleActionDefinitionName action.actionDefinition }} = async ({{# if action.actionDefinition.targetType }}target?: {{ classDataName action.actionDefinition.targetType 'Stored' }}{{/ if }}) => { {{# with action.actionDefinition.operation as |operation| }} try { - {{# if page.container.form }} - {{# if (hasPageRequiredBy page) }} - {{> actor/src/fragments/page/local-validate.fragment.hbs }} - {{/ if }} - {{/ if }} - setIsLoading(true); {{# if operation.output }}const { data: result } = {{/ if }}await {{ getServiceImplForPage page }}.{{ operation.name }}{{ operationCallSuffix action }}( - {{# if page.container.form }} - {{# unless operation.isStatic }}produceDataAdjustedOwner(){{/ unless }} - {{# if operation.input }}{{# unless operation.isStatic }}, {{/ unless }}data{{/ if }} - {{ else }} - {{# if page.container.isSelector }} - {{# unless operation.isStatic }}ownerData, {{/ unless }}selectionDiff[0] - {{ else }} - {{# if page.container.table }} - {{# unless operation.isStatic }} - target! - {{/ unless }} - {{ else }} - {{# unless operation.isStatic }} - {{# if action.actionDefinition.targetType }} - target! - {{ else }} - data - {{/ if }} - {{/ unless }} - {{# if operation.input }} - {{# unless operation.isStatic }}, {{/ unless }}target! - {{/ if }} - {{/ if }} - {{/ if }} - {{/ if }} + {{# unless operation.isStatic }}ownerData, {{/ unless }}selectionDiff[0] ); if (customActions?.post{{ firstToUpper (simpleActionDefinitionName action.actionDefinition) }}) { await customActions.post{{ firstToUpper (simpleActionDefinitionName action.actionDefinition) }}( {{# if action.actionDefinition.targetType }}target!,{{/ if }} {{# if operation.output }}result,{{/ if }} - {{# if page.container.form }}onSubmit,{{/ if }} {{# if page.openInDialog }}onClose{{/ if }} ); } else { showSuccessSnack(t('judo.action.operation.success', { defaultValue: 'Operation executed successfully' }) as string); - - {{# if page.openInDialog }} - {{# or page.container.form page.container.isSelector }} - onSubmit({{# if operation.output }}result{{/ if }}); - {{/ or }} - {{ else }} - {{# if (allowRefreshAfterOperationCall action) }} - await refresh(); - {{/ if }} - {{/ if }} + onSubmit({{# if operation.output }}result{{/ if }}); {{# if operation.postCallAccessNavigation }} try { @@ -84,11 +45,7 @@ const {{ simpleActionDefinitionName action.actionDefinition }} = async ({{# if a {{/ if }} } } catch (error) { - {{# unless page.container.table }} - handleError<{{ classDataName (getReferenceClassType page) '' }}>(error, { setValidation }, owner.current, dataPath); - {{ else }} - handleError(error); - {{/ unless }} + handleError(error); } finally { setIsLoading(false); } diff --git a/judo-ui-react/src/main/resources/actor/src/pages/actions/OpenAddSelectorAction.fragment.hbs b/judo-ui-react/src/main/resources/actor/src/pages/actions/OpenAddSelectorAction.fragment.hbs index 14415598..17e090f2 100644 --- a/judo-ui-react/src/main/resources/actor/src/pages/actions/OpenAddSelectorAction.fragment.hbs +++ b/judo-ui-react/src/main/resources/actor/src/pages/actions/OpenAddSelectorAction.fragment.hbs @@ -1,3 +1,4 @@ +// OpenAddSelectorAction: {{ getXMIID action }} const {{ simpleActionDefinitionName action.actionDefinition }} = async () => { const { result, data: returnedData } = await open{{ pageName action.targetPageDefinition }}({ {{# unless page.container.table }} diff --git a/judo-ui-react/src/main/resources/actor/src/pages/actions/OpenCreateFormAction.fragment.hbs b/judo-ui-react/src/main/resources/actor/src/pages/actions/OpenCreateFormAction.fragment.hbs index 8acb1e1c..f06069e7 100644 --- a/judo-ui-react/src/main/resources/actor/src/pages/actions/OpenCreateFormAction.fragment.hbs +++ b/judo-ui-react/src/main/resources/actor/src/pages/actions/OpenCreateFormAction.fragment.hbs @@ -1,3 +1,4 @@ +// OpenCreateFormAction: {{ getXMIID action }} const {{ simpleActionDefinitionName action.actionDefinition }} = async ({{# if action.actionDefinition.targetType }}templateDataOverride?: Partial<{{ classDataName action.actionDefinition.targetType '' }}>, {{/ if}}) => { {{# if (isActionParentEagerTable action) }} const itemIndex = (data.{{ action.targetDataElement.name }} || []).length; // length gives next without -1-ing it diff --git a/judo-ui-react/src/main/resources/actor/src/pages/actions/OpenOperationInputFormAction.fragment.hbs b/judo-ui-react/src/main/resources/actor/src/pages/actions/OpenOperationInputFormAction.fragment.hbs index 02327b63..02419215 100644 --- a/judo-ui-react/src/main/resources/actor/src/pages/actions/OpenOperationInputFormAction.fragment.hbs +++ b/judo-ui-react/src/main/resources/actor/src/pages/actions/OpenOperationInputFormAction.fragment.hbs @@ -1,9 +1,14 @@ +// OpenOperationInputFormAction: {{ getXMIID action }} const {{ simpleActionDefinitionName action.actionDefinition }} = async ({{# if action.actionDefinition.targetType }}target: {{ classDataName action.actionDefinition.targetType 'Stored' }}, {{/ if}}isDraft?: boolean, ownerValidation?: (target: any) => Promise) => { const { result, data: returnedData } = await open{{ actionTargetPageName action }}({ - {{# if action.actionDefinition.targetType }} - ownerData: target, + {{# if (isActionInTableInViewNonBulk action) }} + ownerData: data, {{ else }} - ownerData: produceDataAdjustedOwner(), + {{# if action.actionDefinition.targetType }} + ownerData: target, + {{ else }} + ownerData: produceDataAdjustedOwner(), + {{/ if }} {{/ if }} }); if (result === 'submit'{{# if page.container.view }} && !editMode{{/ if }}) { diff --git a/judo-ui-react/src/main/resources/actor/src/pages/actions/OpenOperationInputSelectorAction.fragment.hbs b/judo-ui-react/src/main/resources/actor/src/pages/actions/OpenOperationInputSelectorAction.fragment.hbs index cd111983..457634ef 100644 --- a/judo-ui-react/src/main/resources/actor/src/pages/actions/OpenOperationInputSelectorAction.fragment.hbs +++ b/judo-ui-react/src/main/resources/actor/src/pages/actions/OpenOperationInputSelectorAction.fragment.hbs @@ -1,9 +1,14 @@ +// OpenOperationInputSelectorAction: {{ getXMIID action }} const {{ simpleActionDefinitionName action.actionDefinition }} = async ({{# if action.actionDefinition.targetType }}target?: {{ classDataName action.actionDefinition.targetType 'Stored' }}{{/ if }}) => { const { result, data: returnedData } = await open{{ pageName action.targetPageDefinition }}({ - {{# if action.actionDefinition.targetType }} - ownerData: target!, + {{# if (isActionInTableInViewNonBulk action) }} + ownerData: data, {{ else }} - ownerData: produceDataAdjustedOwner(), + {{# if action.actionDefinition.targetType }} + ownerData: target!, + {{ else }} + ownerData: produceDataAdjustedOwner(), + {{/ if }} {{/ if }} }); if (result === 'submit') { diff --git a/judo-ui-react/src/main/resources/actor/src/pages/actions/OpenPageAction.fragment.hbs b/judo-ui-react/src/main/resources/actor/src/pages/actions/OpenPageAction.fragment.hbs index 9056ceb5..407d076b 100644 --- a/judo-ui-react/src/main/resources/actor/src/pages/actions/OpenPageAction.fragment.hbs +++ b/judo-ui-react/src/main/resources/actor/src/pages/actions/OpenPageAction.fragment.hbs @@ -1,3 +1,4 @@ +// OpenPageAction: {{ getXMIID action }} const {{ simpleActionDefinitionName action.actionDefinition }} = async (target: {{ classDataName action.actionDefinition.targetType 'Stored' }}, isDraftParam?: boolean) => { {{# if (isActionParentEagerTable action) }} const itemIndex = {{# with (getTableParentForActionDefinition action.actionDefinition) as |table| }}(data.{{ table.relationName }} || []).findIndex(r => r.__identifier === target.__identifier)!{{/ with }}; diff --git a/judo-ui-react/src/main/resources/actor/src/pages/actions/OpenSetSelectorAction.fragment.hbs b/judo-ui-react/src/main/resources/actor/src/pages/actions/OpenSetSelectorAction.fragment.hbs index 49ef7e2b..c6e85a4a 100644 --- a/judo-ui-react/src/main/resources/actor/src/pages/actions/OpenSetSelectorAction.fragment.hbs +++ b/judo-ui-react/src/main/resources/actor/src/pages/actions/OpenSetSelectorAction.fragment.hbs @@ -1,3 +1,4 @@ +// OpenSelectorAction: {{ getXMIID action }} {{# with (getLinkParentForActionDefinition action.actionDefinition) as |link| }} const {{ simpleActionDefinitionName action.actionDefinition }} = async (): Promise<{{ classDataName (getReferenceClassType link) 'Stored' }} | undefined> => { const { result, data: returnedData } = await open{{ pageName action.targetPageDefinition }}({ diff --git a/judo-ui-react/src/main/resources/actor/src/pages/actions/ParameterlessCallOperationAction.fragment.hbs b/judo-ui-react/src/main/resources/actor/src/pages/actions/ParameterlessCallOperationAction.fragment.hbs new file mode 100644 index 00000000..ae40fe4c --- /dev/null +++ b/judo-ui-react/src/main/resources/actor/src/pages/actions/ParameterlessCallOperationAction.fragment.hbs @@ -0,0 +1,70 @@ +// ParameterlessCallOperationAction: {{ getXMIID action }} +const {{ simpleActionDefinitionName action.actionDefinition }} = async ({{# if action.actionDefinition.targetType }}target?: {{ classDataName action.actionDefinition.targetType 'Stored' }}{{/ if }}) => { + {{# with action.actionDefinition.operation as |operation| }} + try { + setIsLoading(true); + {{# if operation.output }}const { data: result } = {{/ if }}await {{ getServiceImplForPage page }}.{{ operation.name }}{{# if action.actionDefinition.isContainedRelationAction }}{{ operationCallSuffix action }}{{/ if }}( + {{# if page.container.table }} + {{# unless operation.isStatic }} + target! + {{/ unless }} + {{ else }} + {{# unless operation.isStatic }} + {{# if (isActionInTableInViewNonBulk action) }} + data + {{ else }} + {{# if action.actionDefinition.targetType }} + target! + {{ else }} + data + {{/ if }} + {{/ if }} + {{/ unless }} + {{/ if }} + ); + if (customActions?.post{{ firstToUpper (simpleActionDefinitionName action.actionDefinition) }}) { + await customActions.post{{ firstToUpper (simpleActionDefinitionName action.actionDefinition) }}( + {{# if action.actionDefinition.targetType }}target!,{{/ if }} + {{# if operation.output }}result,{{/ if }} + ); + } else { + showSuccessSnack(t('judo.action.operation.success', { defaultValue: 'Operation executed successfully' }) as string); + {{# if (allowRefreshAfterOperationCall action) }} + await refresh(); + {{/ if }} + + {{# if operation.postCallAccessNavigation }} + try { + const { data: pcan } = await {{ firstToLower (serviceRelationName operation.postCallAccessNavigation.accessRelation) }}Impl.list(undefined, { + _identifier: result.__identifier, + }); + {{# if action.targetPageDefinition.openInDialog }} + await open{{ pageName operation.postCallAccessNavigation.pageDefinition }}({ + ownerData: pcan[0] + }); + {{ else }} + navigate(routeTo{{ pageName operation.postCallAccessNavigation.pageDefinition }}(pcan[0].__signedIdentifier)); + {{/ if }} + } catch(error) { + console.error('Could not proceed with post call access navigation', error); + } + {{ else }} + {{# if operation.output }} + {{# if action.targetPageDefinition.openInDialog }} + await open{{ pageName action.targetPageDefinition }}({ + ownerData: produceDataAdjustedOwner(), + data: result, + }); + {{ else }} + navigate(routeTo{{ pageName action.targetPageDefinition }}(result.__signedIdentifier)); + {{/ if }} + {{/ if }} + {{/ if }} + } + } catch (error) { + handleError(error); + } finally { + setIsLoading(false); + } + {{/ with }} +}; diff --git a/judo-ui-react/src/main/resources/actor/src/pages/actions/PreFetchAction.fragment.hbs b/judo-ui-react/src/main/resources/actor/src/pages/actions/PreFetchAction.fragment.hbs index 4b33255f..e24579c7 100644 --- a/judo-ui-react/src/main/resources/actor/src/pages/actions/PreFetchAction.fragment.hbs +++ b/judo-ui-react/src/main/resources/actor/src/pages/actions/PreFetchAction.fragment.hbs @@ -1,3 +1,4 @@ +// PreFetchAction: {{ getXMIID action }} const {{ simpleActionDefinitionName action.actionDefinition }} = async (): Promise> => { return {{ getServiceImplForPage page }}.get{{ firstToUpper action.targetDataElement.name }}({{# if (pageHasSignedId page) }}{{# if page.openInDialog }}data{{ else }}{ __signedIdentifier: signedIdentifier } as any{{/ if }}{{ else }}data{{/ if }}, { _mask: '{}', diff --git a/judo-ui-react/src/main/resources/actor/src/pages/actions/RefreshAction.fragment.hbs b/judo-ui-react/src/main/resources/actor/src/pages/actions/RefreshAction.fragment.hbs index 9ec33fbc..0cd437c4 100644 --- a/judo-ui-react/src/main/resources/actor/src/pages/actions/RefreshAction.fragment.hbs +++ b/judo-ui-react/src/main/resources/actor/src/pages/actions/RefreshAction.fragment.hbs @@ -1,3 +1,4 @@ +// RefreshAction: {{ getXMIID action }} {{# if action.targetDataElement }} const {{ simpleActionDefinitionName action.actionDefinition }} = async (queryCustomizer: {{ classDataName action.targetDataElement.target 'QueryCustomizer' }}): Promise> => { const result = await {{ getServiceImplForPage page }}.{{# if action.targetDataElement.isCollection }}list{{ else }}get{{/ if }}{{ firstToUpper action.targetDataElement.name }}({{{ refreshActionDataParameter action }}}, queryCustomizer{{# with (getTableParentForActionDefinition action.actionDefinition) as |table| }}{{# if table.showTotalCount }}, { [X_JUDO_COUNT_RECORDS]: 'true' }{{/ if }}{{/ with }}); diff --git a/judo-ui-react/src/main/resources/actor/src/pages/actions/RemoveAction.fragment.hbs b/judo-ui-react/src/main/resources/actor/src/pages/actions/RemoveAction.fragment.hbs index 0e752f01..ba3b713a 100644 --- a/judo-ui-react/src/main/resources/actor/src/pages/actions/RemoveAction.fragment.hbs +++ b/judo-ui-react/src/main/resources/actor/src/pages/actions/RemoveAction.fragment.hbs @@ -1,34 +1,19 @@ -const {{ simpleActionDefinitionName action.actionDefinition }} = async (target?: {{ classDataName action.actionDefinition.targetType 'Stored' }}{{# if action.actionDefinition.isBulkCapable }}, silentMode?: boolean{{/ if }}) => { +// RemoveAction: {{ getXMIID action }} +const {{ simpleActionDefinitionName action.actionDefinition }} = async (target: {{ classDataName action.actionDefinition.targetType 'Stored' }}) => { {{# with (getTableParentForActionDefinition action.actionDefinition) as |table| }} - if (target) { - {{# if table.isEager }} - const newList = (data?.{{ table.dataElement.name }} ?? []).filter((c: any) => c.__identifier !== target!.__identifier); - storeDiff('{{ table.dataElement.name }}', newList); - {{ else }} - try { - if (!silentMode) { - setIsLoading(true); - } - await {{ getServiceImplForPage page }}.remove{{ firstToUpper action.targetDataElement.name }}({{# if page.container.table }}{ __signedIdentifier: signedIdentifier } as any{{ else }}data{{/ if }}, [target!]); - if (!silentMode) { - await refresh(); - } - } catch(error) { - if (!silentMode) { - {{# if action.actionDefinition.targetType }} - handleError<{{ classDataName action.actionDefinition.targetType '' }}>(error, undefined, target); - {{ else }} - handleError(error, undefined, data); - {{/ if }} - } else { - throw error; - } - } finally { - if (!silentMode) { - setIsLoading(false); - } - } - {{/ if }} - } + {{# if table.isEager }} + const newList = (data?.{{ table.dataElement.name }} ?? []).filter((c: any) => c.__identifier !== target.__identifier); + storeDiff('{{ table.dataElement.name }}', newList); + {{ else }} + try { + setIsLoading(true); + await {{ getServiceImplForPage page }}.remove{{ firstToUpper action.targetDataElement.name }}({{# if page.container.table }}{ __signedIdentifier: signedIdentifier } as any{{ else }}data{{/ if }}, [target]); + await refresh(); + } catch(error) { + handleError<{{ classDataName action.actionDefinition.targetType '' }}>(error, undefined, target); + } finally { + setIsLoading(false); + } + {{/ if }} {{/ with }} }; diff --git a/judo-ui-react/src/main/resources/actor/src/pages/actions/RowDeleteAction.fragment.hbs b/judo-ui-react/src/main/resources/actor/src/pages/actions/RowDeleteAction.fragment.hbs index 377e158f..2faa2c88 100644 --- a/judo-ui-react/src/main/resources/actor/src/pages/actions/RowDeleteAction.fragment.hbs +++ b/judo-ui-react/src/main/resources/actor/src/pages/actions/RowDeleteAction.fragment.hbs @@ -1,10 +1,11 @@ -const {{ simpleActionDefinitionName action.actionDefinition }} = async ({{# if action.actionDefinition.targetType }}target: {{ classDataName action.actionDefinition.targetType 'Stored' }}{{# if action.actionDefinition.isBulkCapable }}, silentMode?: boolean{{/ if }}{{/ if}}) => { +// RowDeleteAction: {{ getXMIID action }} +const {{ simpleActionDefinitionName action.actionDefinition }} = async (target: {{ classDataName action.actionDefinition.targetType 'Stored' }}) => { try { - const confirmed = {{# if action.actionDefinition.isBulkCapable }}!silentMode ? {{/ if }}await openConfirmDialog( + const confirmed = await openConfirmDialog( 'row-delete-action', t('judo.modal.confirm.confirm-delete', { defaultValue: 'Are you sure you would like to delete the selected element?' }), t('judo.modal.confirm.confirm-title', { defaultValue: 'Confirm action' }), - ){{# if action.actionDefinition.isBulkCapable }} : true{{/ if }}; + ); if (confirmed) { {{# if (isActionParentEagerElement action) }} {{# with (getTableParentForActionDefinition action.actionDefinition) as |table| }} @@ -15,10 +16,7 @@ const {{ simpleActionDefinitionName action.actionDefinition }} = async ({{# if a storeDiff('{{ link.dataElement.name }}', null); {{/ with }} {{ else }} - await {{ getServiceImplForPage page }}.delete{{# if action.targetDataElement }}{{ firstToUpper action.targetDataElement.name }}{{/ if }}({{# if action.actionDefinition.targetType }}target{{ else }}data{{/ if }}); - {{# if action.actionDefinition.isBulkCapable }} - if (!silentMode) { - {{/ if }} + await {{ getServiceImplForPage page }}.delete{{# if action.targetDataElement }}{{ firstToUpper action.targetDataElement.name }}{{/ if }}(target); showSuccessSnack(t('judo.action.delete.success', { defaultValue: 'Delete successful' })); {{# if page.container.table }} setRefreshCounter((prev) => prev + 1); @@ -26,7 +24,7 @@ const {{ simpleActionDefinitionName action.actionDefinition }} = async ({{# if a {{# if page.container.view }} {{# unless action.actionDefinition.isContainedRelationAction }} {{# if page.openInDialog }} - onSubmit({{# if action.actionDefinition.targetType }}target{{ else }}data{{/ if }}, 'delete'); + onSubmit(target, 'delete'); {{ else }} navigateBack(); {{/ if }} @@ -38,24 +36,9 @@ const {{ simpleActionDefinitionName action.actionDefinition }} = async ({{# if a {{/ if }} {{/ unless }} {{/ if }} - {{# if action.actionDefinition.isBulkCapable }} - } - {{/ if }} {{/ if }} } } catch(error) { - {{# if action.actionDefinition.isBulkCapable }} - if (!silentMode) { - {{/ if }} - {{# if action.actionDefinition.targetType }} - handleError<{{ classDataName action.actionDefinition.targetType '' }}>(error, undefined, target); - {{ else }} - handleError(error, undefined, data); - {{/ if }} - {{# if action.actionDefinition.isBulkCapable }} - } else { - throw error; - } - {{/ if }} + handleError<{{ classDataName action.actionDefinition.targetType '' }}>(error, undefined, target); } }; diff --git a/judo-ui-react/src/main/resources/actor/src/pages/actions/SelectorRangeAction.fragment.hbs b/judo-ui-react/src/main/resources/actor/src/pages/actions/SelectorRangeAction.fragment.hbs index af394ca4..c711a20c 100644 --- a/judo-ui-react/src/main/resources/actor/src/pages/actions/SelectorRangeAction.fragment.hbs +++ b/judo-ui-react/src/main/resources/actor/src/pages/actions/SelectorRangeAction.fragment.hbs @@ -1,3 +1,4 @@ +// SelectorRangeAction: {{ getXMIID action }} const {{ simpleActionDefinitionName action.actionDefinition }} = async (queryCustomizer: {{ classDataName action.actionDefinition.targetType 'QueryCustomizer' }}): Promise> => { {{# with (getTableParentForActionDefinition action.actionDefinition) as |table| }} try { diff --git a/judo-ui-react/src/main/resources/actor/src/pages/actions/SetAction.fragment.hbs b/judo-ui-react/src/main/resources/actor/src/pages/actions/SetAction.fragment.hbs index a606981c..8cccf308 100644 --- a/judo-ui-react/src/main/resources/actor/src/pages/actions/SetAction.fragment.hbs +++ b/judo-ui-react/src/main/resources/actor/src/pages/actions/SetAction.fragment.hbs @@ -1,3 +1,4 @@ +// SetAction: {{ getXMIID action }} const {{ simpleActionDefinitionName action.actionDefinition }} = async (selected: {{ classDataName action.actionDefinition.targetType 'Stored' }}[]) => { onSubmit(selected); }; diff --git a/judo-ui-react/src/main/resources/actor/src/pages/actions/UnsetAction.fragment.hbs b/judo-ui-react/src/main/resources/actor/src/pages/actions/UnsetAction.fragment.hbs index 31a73500..011c9388 100644 --- a/judo-ui-react/src/main/resources/actor/src/pages/actions/UnsetAction.fragment.hbs +++ b/judo-ui-react/src/main/resources/actor/src/pages/actions/UnsetAction.fragment.hbs @@ -1,3 +1,4 @@ +// UnsetAction: {{ getXMIID action }} const {{ simpleActionDefinitionName action.actionDefinition }} = async ({{# if action.targetDataElement }}target: {{ classDataName action.targetDataElement.target '' }} | {{ classDataName action.targetDataElement.target 'Stored' }}{{/ if }}) => { {{# with (getLinkParentForActionDefinition action.actionDefinition) as |link| }} {{# if link.isEager }} diff --git a/judo-ui-react/src/main/resources/actor/src/pages/actions/UpdateAction.fragment.hbs b/judo-ui-react/src/main/resources/actor/src/pages/actions/UpdateAction.fragment.hbs index 681bd204..6304603f 100644 --- a/judo-ui-react/src/main/resources/actor/src/pages/actions/UpdateAction.fragment.hbs +++ b/judo-ui-react/src/main/resources/actor/src/pages/actions/UpdateAction.fragment.hbs @@ -1,3 +1,4 @@ +// UpdateAction: {{ getXMIID action }} const {{ simpleActionDefinitionName action.actionDefinition }} = async () => { {{# if (hasPageRequiredBy page) }} {{> actor/src/fragments/page/local-validate.fragment.hbs }} diff --git a/judo-ui-react/src/main/resources/actor/src/utilities/table.ts.hbs b/judo-ui-react/src/main/resources/actor/src/utilities/table.ts.hbs index ecaf5b10..2fdbeb9e 100644 --- a/judo-ui-react/src/main/resources/actor/src/utilities/table.ts.hbs +++ b/judo-ui-react/src/main/resources/actor/src/utilities/table.ts.hbs @@ -53,8 +53,10 @@ export interface ToolBarActionProps { selectionModel: GridRowSelectionModel, ownerData?: any, isFormUpdateable?: () => boolean, - ) => boolean, + ) => boolean; isBulk: boolean; + confirmation?: string; + confirmationCondition?: boolean; } export const TABLE_COLUMN_CUSTOMIZER_HOOK_INTERFACE_KEY = 'TABLE_COLUMN_CUSTOMIZER_HOOK_INTERFACE_KEY'; diff --git a/pom.xml b/pom.xml index b908ac2e..a36d3d66 100644 --- a/pom.xml +++ b/pom.xml @@ -55,9 +55,9 @@ 18.14.2 8.9.2 - 1.1.0.20240627_173956_0ab8231d_develop + 1.1.0.20240705_152025_0a9b5431_feature_JNG_5504_modelled_table_actions 1.0.0.20240621_215702_cc6f5a66_develop - 1.0.0.20240614_154655_e01ad5db_bugfix_JNG_5775_fix_filterable_attributes + 1.0.0.20240705_154122_a1f1410d_feature_JNG_5504_modelled_table_actions 3.0.0-M7 diff --git a/update-test-models.sh b/update-test-models.sh index 4cf92021..45e14f4b 100755 --- a/update-test-models.sh +++ b/update-test-models.sh @@ -6,3 +6,4 @@ cp ../../runtime/judo-tatami-tests/models/ActionGroupTest/application/frontend-r cp ../../runtime/judo-tatami-tests/models/ActionGroupTest/application/frontend-react/model/ActionGroupTest-ui.model ./judo-ui-react-itest/ActionGroupTestPro/model/ActionGroupTestPro-ui.model cp ../../runtime/judo-tatami-tests/models/CRUDActionsTest/application/frontend-react/model/CRUDActionsTest-ui.model ./judo-ui-react-itest/CRUDActionsTest/model/CRUDActionsTest-ui.model cp ../../runtime/judo-tatami-tests/models/OperationParametersTest/application/frontend-react/model/OperationParametersTest-ui.model ./judo-ui-react-itest/OperationParametersTest/model/OperationParametersTest-ui.model +cp ../../runtime/judo-tatami-tests/models/RelationTest/application/frontend-react/model/RelationTest-ui.model ./judo-ui-react-itest/RelationTest/model/RelationTest-ui.model