Merge branch 'master' into faiz_cs

# Conflicts:
#	lib/classes/utils.dart
#	lib/ui/marathon/widgets/marathon_banner.dart
faiz_cs
Faiz Hashmi 3 years ago
commit 5bb998a8d2

@ -1,23 +1,13 @@
<svg xmlns="http://www.w3.org/2000/svg" width="29.557" height="29.557" viewBox="0 0 29.557 29.557"> <svg xmlns="http://www.w3.org/2000/svg" width="24.322" height="24.322" viewBox="0 0 24.322 24.322">
<g id="chat_3_" data-name="chat (3)" transform="translate(0 -0.008)"> <g id="chat_8_" data-name="chat (8)" transform="translate(0 -0.006)">
<g id="Group_8672" data-name="Group 8672" transform="translate(0 0.007)"> <g id="Group_7919" data-name="Group 7919" transform="translate(0 7.368)">
<g id="Group_8671" data-name="Group 8671" transform="translate(0 0)"> <g id="Group_7918" data-name="Group 7918">
<path id="Path_13684" data-name="Path 13684" d="M29.348,17.685l-2.039-2.379A8.6,8.6,0,0,0,29.556,9.59c0-5.369-5.209-9.583-11.315-9.583-6.207,0-11.257,4.3-11.257,9.583,0,.133,0,.266.011.4-4.131,1.641-7,5.18-7,9.271a9.341,9.341,0,0,0,2.483,6.276L.214,28.127a.866.866,0,0,0,.652,1.436H13.046c.1,0,.4-.055.462-.061A12.95,12.95,0,0,0,21,26.322a9.481,9.481,0,0,0,3.3-7.207H28.69A.867.867,0,0,0,29.348,17.685ZM13.219,27.79c-.076.006-.337.029-.39.042H2.774l1.538-1.758a.866.866,0,0,0-.056-1.2,7.739,7.739,0,0,1-2.525-5.616c0-4.694,4.687-8.515,10.449-8.515,5.73,0,10.391,3.82,10.391,8.515C22.571,23.649,18.482,27.36,13.219,27.79ZM24.1,17.383h0C23.057,12.566,18.06,9.013,12.18,9.013a14.281,14.281,0,0,0-3.461.422c.1-4.258,4.333-7.7,9.523-7.7,5.284,0,9.583,3.522,9.583,7.851a7.016,7.016,0,0,1-2.284,5.058.866.866,0,0,0-.059,1.189l1.326,1.547Z" transform="translate(0 -0.007)" fill="#989898"/> <path id="Path_4723" data-name="Path 4723" d="M10.023,155C4.522,155,0,158.78,0,163.43a7.852,7.852,0,0,0,2.043,5.211L.176,170.775a.713.713,0,0,0,.536,1.182H10.735c4.061,0,9.31-3.5,9.31-8.526C20.045,158.78,15.523,155,10.023,155ZM5.7,164.736a1.425,1.425,0,1,1,1.425-1.425A1.427,1.427,0,0,1,5.7,164.736Zm4.323,0a1.425,1.425,0,1,1,1.425-1.425A1.427,1.427,0,0,1,10.023,164.736Zm4.323,0a1.425,1.425,0,1,1,1.425-1.425A1.427,1.427,0,0,1,14.345,164.736Z" transform="translate(0 -154.998)" fill="#818181"/>
</g> </g>
</g> </g>
<g id="Group_8674" data-name="Group 8674" transform="translate(5.253 17.383)"> <g id="Group_7921" data-name="Group 7921" transform="translate(5.823 0.006)">
<g id="Group_8673" data-name="Group 8673"> <g id="Group_7920" data-name="Group 7920" transform="translate(0 0)">
<path id="Path_13685" data-name="Path 13685" d="M92.729,301a1.732,1.732,0,1,0,1.732,1.732A1.734,1.734,0,0,0,92.729,301Z" transform="translate(-90.997 -300.999)" fill="#989898"/> <path id="Path_4724" data-name="Path 4724" d="M140.909,14.5l-1.678-1.957a7.078,7.078,0,0,0,1.849-4.7c0-4.322-4.155-7.838-9.263-7.838-4.618,0-8.542,2.878-9.235,6.624a13.184,13.184,0,0,1,4.2-.687c6.24,0,11.366,4.358,11.441,9.738h2.144A.713.713,0,0,0,140.909,14.5Z" transform="translate(-122.583 -0.006)" fill="#818181"/>
</g>
</g>
<g id="Group_8676" data-name="Group 8676" transform="translate(10.448 17.383)">
<g id="Group_8675" data-name="Group 8675">
<path id="Path_13686" data-name="Path 13686" d="M182.726,301a1.732,1.732,0,1,0,1.732,1.732A1.734,1.734,0,0,0,182.726,301Z" transform="translate(-180.994 -300.999)" fill="#989898"/>
</g>
</g>
<g id="Group_8678" data-name="Group 8678" transform="translate(15.644 17.383)">
<g id="Group_8677" data-name="Group 8677">
<path id="Path_13687" data-name="Path 13687" d="M272.723,301a1.732,1.732,0,1,0,1.732,1.732A1.734,1.734,0,0,0,272.723,301Z" transform="translate(-270.991 -300.999)" fill="#989898"/>
</g> </g>
</g> </g>
</g> </g>

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

@ -1,7 +1,5 @@
<svg id="interview_3_" data-name="interview (3)" xmlns="http://www.w3.org/2000/svg" width="27.258" height="27.258" viewBox="0 0 27.258 27.258"> <svg id="interview_4_" data-name="interview (4)" xmlns="http://www.w3.org/2000/svg" width="25.9" height="25.9" viewBox="0 0 25.9 25.9">
<path id="Path_4667" data-name="Path 4667" d="M7.663,248.55a4.22,4.22,0,1,0-5.175,0A5.07,5.07,0,0,0,0,252.918v1.711a.8.8,0,0,0,.8.8H9.352a.8.8,0,0,0,.8-.8v-1.711A5.07,5.07,0,0,0,7.663,248.55Zm-5.21-3.33a2.623,2.623,0,1,1,2.623,2.623A2.626,2.626,0,0,1,2.452,245.22Zm6.1,8.61H1.6v-.912a3.478,3.478,0,1,1,6.956,0v.912Zm0,0" transform="translate(0 -228.17)" fill="#989898"/> <path id="Path_4711" data-name="Path 4711" d="M205.751,0H196a3.2,3.2,0,0,0-3.2,3.2v14.63a.759.759,0,0,0,1.214.607l3.049-2.286h8.687a3.2,3.2,0,0,0,3.2-3.2V3.2A3.2,3.2,0,0,0,205.751,0Zm-5.635,12.084h-3.3a.759.759,0,1,1,0-1.518h3.3a.759.759,0,1,1,0,1.518Zm4.823-3.251h-8.128a.759.759,0,1,1,0-1.518h8.128a.759.759,0,1,1,0,1.518Zm0-3.251h-8.128a.759.759,0,1,1,0-1.518h8.128a.759.759,0,1,1,0,1.518Zm0,0" transform="translate(-183.048)" fill="#818181"/>
<path id="Path_4668" data-name="Path 4668" d="M206.43,0H196.165A3.363,3.363,0,0,0,192.8,3.365v15.4a.8.8,0,0,0,1.278.639l3.208-2.406h9.143a3.363,3.363,0,0,0,3.365-3.365V3.365A3.363,3.363,0,0,0,206.43,0ZM208.2,13.629A1.766,1.766,0,0,1,206.43,15.4h-9.409a.8.8,0,0,0-.479.16L194.4,17.164V3.365A1.766,1.766,0,0,1,196.165,1.6H206.43A1.766,1.766,0,0,1,208.2,3.365Zm0,0" transform="translate(-182.536 0)" fill="#989898"/> <path id="Path_4712" data-name="Path 4712" d="M31.6,244.575a3.587,3.587,0,1,1-3.587-3.587A3.587,3.587,0,0,1,31.6,244.575Zm0,0" transform="translate(-23.19 -228.797)" fill="#818181"/>
<path id="Path_4669" data-name="Path 4669" d="M266.419,80.332h-8.554a.8.8,0,1,0,0,1.6h8.554a.8.8,0,0,0,0-1.6Zm0,0" transform="translate(-243.381 -76.055)" fill="#989898"/> <path id="Path_4713" data-name="Path 4713" d="M4.823,382.8A4.823,4.823,0,0,0,0,387.627v.954a.759.759,0,0,0,.759.759H8.886a.759.759,0,0,0,.759-.759v-.954A4.823,4.823,0,0,0,4.823,382.8Zm0,0" transform="translate(0 -363.44)" fill="#818181"/>
<path id="Path_4670" data-name="Path 4670" d="M266.419,144.6h-8.554a.8.8,0,1,0,0,1.6h8.554a.8.8,0,0,0,0-1.6Zm0,0" transform="translate(-243.381 -136.903)" fill="#989898"/>
<path id="Path_4671" data-name="Path 4671" d="M262.142,208.867h-4.277a.8.8,0,1,0,0,1.6h4.277a.8.8,0,1,0,0-1.6Zm0,0" transform="translate(-243.381 -197.747)" fill="#989898"/>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1018 B

@ -1,7 +1,7 @@
<svg xmlns="http://www.w3.org/2000/svg" width="25.898" height="25.9" viewBox="0 0 25.898 25.9"> <svg xmlns="http://www.w3.org/2000/svg" width="25.898" height="25.9" viewBox="0 0 25.898 25.9">
<g id="home_12_" data-name="home (12)" transform="translate(-0.022)"> <g id="home_12_" data-name="home (12)" transform="translate(-0.021)">
<path id="Path_4683" data-name="Path 4683" d="M351.362.759A.759.759,0,0,0,350.6,0h-3.251a.759.759,0,0,0-.759.759v.687l4.769,4.769Z" transform="translate(-329.039 0)" fill="#2e303a"/> <path id="Path_4683" data-name="Path 4683" d="M351.362.759A.759.759,0,0,0,350.6,0h-3.251a.759.759,0,0,0-.759.759v.687l4.769,4.769Z" transform="translate(-329.039 0)" fill="#818181"/>
<path id="Path_4684" data-name="Path 4684" d="M25.221,11.259,14.661.7A2.391,2.391,0,0,0,11.28.7L.721,11.26A2.391,2.391,0,1,0,4.1,14.641l8.869-8.869,8.869,8.869a2.375,2.375,0,0,0,1.69.7h0a2.391,2.391,0,0,0,1.691-4.081Z" fill="#2e303a"/> <path id="Path_4684" data-name="Path 4684" d="M25.221,11.259,14.661.7A2.391,2.391,0,0,0,11.28.7L.721,11.26A2.391,2.391,0,1,0,4.1,14.641l8.869-8.869,8.869,8.869a2.375,2.375,0,0,0,1.69.7h0a2.391,2.391,0,0,0,1.691-4.081Z" fill="#818181"/>
<path id="Path_4685" data-name="Path 4685" d="M65.238,156.525l-7.8,7.8a3.878,3.878,0,0,1-2.369,1.125v6.271a2.794,2.794,0,0,0,2.791,2.791H62.8a.759.759,0,0,0,.759-.759v-5.743h3.359v5.743a.759.759,0,0,0,.759.759h4.935a2.794,2.794,0,0,0,2.791-2.791v-6.271a3.879,3.879,0,0,1-2.368-1.125Z" transform="translate(-52.267 -148.607)" fill="#2e303a"/> <path id="Path_4685" data-name="Path 4685" d="M65.238,156.525l-7.8,7.8a3.878,3.878,0,0,1-2.369,1.125v6.271a2.794,2.794,0,0,0,2.791,2.791H62.8a.759.759,0,0,0,.759-.759v-5.743h3.359v5.743a.759.759,0,0,0,.759.759h4.935a2.794,2.794,0,0,0,2.791-2.791v-6.271a3.879,3.879,0,0,1-2.368-1.125Z" transform="translate(-52.267 -148.607)" fill="#818181"/>
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 955 B

After

Width:  |  Height:  |  Size: 955 B

@ -1,3 +1,11 @@
<svg xmlns="http://www.w3.org/2000/svg" width="25.974" height="24.23" viewBox="0 0 25.974 24.23"> <svg xmlns="http://www.w3.org/2000/svg" width="23.893" height="22.83" viewBox="0 0 23.893 22.83">
<path id="shipping_2_" data-name="shipping (2)" d="M23.959,29.714V17.886a.764.764,0,0,0-.764-.764H2.724a.764.764,0,0,0-.764.764V30.657A2.294,2.294,0,0,0,.512,34.381l3.442,4.172c2.13,2.493,4.393,2.8,7.758,2.8a25.054,25.054,0,0,0,6.694-.561l2.45-.586a2.138,2.138,0,0,0,1.737.914H23.8a2.238,2.238,0,0,0,2.175-2.291V32A2.248,2.248,0,0,0,23.959,29.714Zm-3.434,1.572-1.018-.517a6.053,6.053,0,0,0-5.309-.086,7.3,7.3,0,0,1-2,.774H8.664a2.128,2.128,0,0,0-2.125,2.125v.557l-.02-.021L4,31.381a2.327,2.327,0,0,0-.508-.416v-7.58H9.741v2.8a.764.764,0,0,0,.764.764h4.821a.764.764,0,0,0,.764-.764v-2.8h6.341v6.329A2.2,2.2,0,0,0,20.525,31.286Zm-9.256-7.9h3.293v2.037H11.269Zm11.162-1.528H16.091V18.65h6.341v3.206ZM14.563,18.65v3.206H11.269V18.65Zm-4.821,0v3.206H3.488V18.65ZM18.05,39.3a24.308,24.308,0,0,1-6.312.511c-3.158,0-4.684-.051-6.606-2.235L1.691,33.408a.773.773,0,0,1,1.182-.993L5.4,35.154a3.469,3.469,0,0,0,2.54,1.113h6.994a.764.764,0,0,0,0-1.528H8.067V33.582a.6.6,0,0,1,.6-.6H12.2a6.994,6.994,0,0,0,2.645-.917,4.533,4.533,0,0,1,3.975.063l1.6.813v5.794Zm6.4-.477a.713.713,0,0,1-.647.763H22.592a.713.713,0,0,1-.647-.763V32a.713.713,0,0,1,.647-.763H23.8a.713.713,0,0,1,.647.763Z" transform="translate(0.001 -17.122)" fill="#989898"/> <g id="shipping_3_" data-name="shipping (3)" transform="translate(0 -11.379)">
<path id="Path_4716" data-name="Path 4716" d="M217.941,11.378h3.429v4.135h-3.429Z" transform="translate(-207.769)" fill="#818181"/>
<path id="Path_4717" data-name="Path 4717" d="M217.941,134.067h3.429v2.121h-3.429Z" transform="translate(-207.769 -116.963)" fill="#818181"/>
<path id="Path_4718" data-name="Path 4718" d="M27.275,134.067v7.59a2.406,2.406,0,0,1,1.325.737l2.627,2.852.021.021v-.58a2.216,2.216,0,0,1,2.213-2.213H37.14a7.7,7.7,0,0,0,2.083-.806,6.3,6.3,0,0,1,5.529.089l1.06.539a2.283,2.283,0,0,1,2.152-1.644h.629v-6.584h-7.4v2.917a.8.8,0,0,1-.8.8H35.378a.8.8,0,0,1-.8-.8v-2.917Z" transform="translate(-26.002 -116.963)" fill="#818181"/>
<path id="Path_4719" data-name="Path 4719" d="M325.521,15.513h7.4V12.482a1.023,1.023,0,0,0-.917-1.1h-6.482Z" transform="translate(-310.328)" fill="#818181"/>
<path id="Path_4720" data-name="Path 4720" d="M456.823,309.24a.742.742,0,0,0-.673.794v7.113a.742.742,0,0,0,.673.795h1.257a.742.742,0,0,0,.673-.795v-7.113a.742.742,0,0,0-.673-.794Z" transform="translate(-434.861 -283.961)" fill="#818181"/>
<path id="Path_4721" data-name="Path 4721" d="M34.582,11.378H28.037a.851.851,0,0,0-.762.917v3.217h7.307Z" transform="translate(-26.002)" fill="#818181"/>
<path id="Path_4722" data-name="Path 4722" d="M1.428,319.1c-.7-.7-1.9.216-1.231,1.034l3.584,4.345A6.361,6.361,0,0,0,8.7,326.795h4.054a19.348,19.348,0,0,0,4.475-.525l2.465-.59v-6.034l-1.666-.846a4.72,4.72,0,0,0-4.139-.066l-1.417.659a3.193,3.193,0,0,1-1.337.3H7.459a.622.622,0,0,0-.622.622v1.205h7.146a.8.8,0,1,1,0,1.591H6.7a3.66,3.66,0,0,1-2.645-1.16Z" transform="translate(0 -292.586)" fill="#818181"/>
</g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

@ -1,15 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" width="21.12" height="26.881" viewBox="0 0 21.12 26.881"> <svg xmlns="http://www.w3.org/2000/svg" width="19.729" height="25.9" viewBox="0 0 19.729 25.9">
<g id="clipboard_5_" data-name="clipboard (5)" transform="translate(-47.037 0)"> <g id="to-do-list_1_" data-name="to-do-list (1)" transform="translate(-61)">
<g id="Group_7687" data-name="Group 7687" transform="translate(47.037 0)"> <path id="Path_4714" data-name="Path 4714" d="M80.064,30.668A2.258,2.258,0,0,0,78.455,30H77.446v1.012a2.025,2.025,0,0,1-2.021,2.023h-9.1a2.025,2.025,0,0,1-2.021-2.023V30H63.3a2.278,2.278,0,0,0-2.274,2.274L61,52.1a2.275,2.275,0,0,0,2.274,2.279H78.433a2.278,2.278,0,0,0,2.274-2.274l.022-19.83A2.263,2.263,0,0,0,80.064,30.668Zm-8.942,6.92h5.385a.759.759,0,0,1,0,1.518H71.122a.759.759,0,0,1,0-1.518Zm0,5.059h5.385a.759.759,0,0,1,0,1.518H71.122a.759.759,0,0,1,0-1.518Zm0,5.059h5.407a.759.759,0,0,1,0,1.518H71.122a.759.759,0,0,1,0-1.518ZM64.664,37.618a.757.757,0,0,1,1.072,0l.412.413,1.748-1.75a.758.758,0,1,1,1.072,1.073L66.684,39.64a.757.757,0,0,1-1.072,0l-.948-.949a.759.759,0,0,1,0-1.073Zm0,5.445a.757.757,0,0,1,1.072,0l.412.413,1.748-1.75A.758.758,0,0,1,68.968,42.8l-2.284,2.286a.757.757,0,0,1-1.072,0l-.948-.949A.759.759,0,0,1,64.664,43.063Zm0,5.059a.757.757,0,0,1,1.072,0l.412.413,1.748-1.75a.758.758,0,1,1,1.072,1.073l-2.284,2.286a.757.757,0,0,1-1.072,0l-.948-.949A.759.759,0,0,1,64.664,48.122Z" transform="translate(0 -28.482)" fill="#818181"/>
<g id="Group_7686" data-name="Group 7686" transform="translate(0 0)"> <path id="Path_4715" data-name="Path 4715" d="M156.361,2.529a.506.506,0,0,0,.505.506h9.1a.506.506,0,0,0,.505-.506V.506A.506.506,0,0,0,165.962,0h-9.1a.506.506,0,0,0-.505.506Z" transform="translate(-90.537)" fill="#818181"/>
<path id="Path_4672" data-name="Path 4672" d="M65.469,3.522H63.037V2.434c0-.352-.384-.512-.736-.512H60.413A2.862,2.862,0,0,0,57.565,0a2.912,2.912,0,0,0-2.848,1.92H52.861c-.352,0-.7.16-.7.512V3.522H49.725a2.72,2.72,0,0,0-2.688,2.592V24.45a2.575,2.575,0,0,0,2.688,2.432H65.469a2.575,2.575,0,0,0,2.688-2.432V6.114A2.72,2.72,0,0,0,65.469,3.522ZM53.437,3.2H55.2a.7.7,0,0,0,.608-.576,1.856,1.856,0,0,1,1.76-1.44,1.824,1.824,0,0,1,1.728,1.44.7.7,0,0,0,.64.576h1.824v2.56h-8.32ZM66.877,24.45A1.3,1.3,0,0,1,65.469,25.6H49.725a1.3,1.3,0,0,1-1.408-1.152V6.114A1.44,1.44,0,0,1,49.725,4.8h2.432V6.434a.672.672,0,0,0,.7.608H62.3a.7.7,0,0,0,.736-.608V4.8h2.432a1.44,1.44,0,0,1,1.408,1.312V24.45Z" transform="translate(-47.037 0)" fill="#989898"/>
<path id="Path_4673" data-name="Path 4673" d="M104.271,230.511a.64.64,0,0,0-.9-.032l-2.048,1.952-.864-.9a.64.64,0,0,0-.9-.032.672.672,0,0,0,0,.928l1.312,1.344a.576.576,0,0,0,.448.192.64.64,0,0,0,.448-.192l2.5-2.368a.608.608,0,0,0,.037-.859C104.3,230.535,104.283,230.523,104.271,230.511Z" transform="translate(-96.175 -216.205)" fill="#989898"/>
<path id="Path_4674" data-name="Path 4674" d="M206.548,256.034h-7.36a.64.64,0,0,0,0,1.28h7.36a.64.64,0,1,0,0-1.28Z" transform="translate(-189.268 -240.352)" fill="#989898"/>
<path id="Path_4675" data-name="Path 4675" d="M104.271,146.919a.64.64,0,0,0-.9-.032l-2.048,1.952-.864-.9a.64.64,0,0,0-.9-.032.672.672,0,0,0,0,.928l1.312,1.344a.576.576,0,0,0,.448.192.64.64,0,0,0,.448-.192l2.5-2.368a.608.608,0,0,0,.037-.859C104.3,146.943,104.283,146.931,104.271,146.919Z" transform="translate(-96.175 -137.733)" fill="#989898"/>
<path id="Path_4676" data-name="Path 4676" d="M206.548,172.442h-7.36a.64.64,0,0,0,0,1.28h7.36a.64.64,0,1,0,0-1.28Z" transform="translate(-189.268 -161.88)" fill="#989898"/>
<path id="Path_4677" data-name="Path 4677" d="M104.271,314.1a.64.64,0,0,0-.9-.032l-2.048,1.952-.864-.9a.64.64,0,0,0-.9-.032.672.672,0,0,0,0,.928l1.312,1.344a.576.576,0,0,0,.448.192.64.64,0,0,0,.448-.192l2.5-2.368a.608.608,0,0,0,.037-.859C104.3,314.126,104.283,314.114,104.271,314.1Z" transform="translate(-96.175 -294.677)" fill="#989898"/>
<path id="Path_4678" data-name="Path 4678" d="M206.548,339.626h-7.36a.64.64,0,0,0,0,1.28h7.36a.64.64,0,1,0,0-1.28Z" transform="translate(-189.268 -318.824)" fill="#989898"/>
</g>
</g>
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

@ -14,11 +14,12 @@ typedef FactoryConstructor<U> = U Function(dynamic);
class APIError { class APIError {
int? errorCode; int? errorCode;
int? errorType;
String? errorMessage; String? errorMessage;
APIError(this.errorCode, this.errorMessage); APIError(this.errorCode, this.errorMessage, this.errorType);
Map<String, dynamic> toJson() => {'errorCode': errorCode, 'errorMessage': errorMessage}; Map<String, dynamic> toJson() => {'errorCode': errorCode, 'errorMessage': errorMessage, 'errorType': errorType,};
@override @override
String toString() { String toString() {
@ -33,14 +34,14 @@ APIException _throwAPIException(Response response) {
if (response.body != null && response.body.isNotEmpty) { if (response.body != null && response.body.isNotEmpty) {
var jsonError = jsonDecode(response.body); var jsonError = jsonDecode(response.body);
print(jsonError); print(jsonError);
apiError = APIError(jsonError['ErrorCode'], jsonError['ErrorMessage']); apiError = APIError(jsonError['ErrorCode'], jsonError['ErrorMessage'], jsonError['ErrorType']);
} }
return APIException(APIException.BAD_REQUEST, error: apiError); return APIException(APIException.BAD_REQUEST, error: apiError);
case 400: case 400:
APIError? apiError; APIError? apiError;
if (response.body != null && response.body.isNotEmpty) { if (response.body != null && response.body.isNotEmpty) {
var jsonError = jsonDecode(response.body); var jsonError = jsonDecode(response.body);
apiError = APIError(jsonError['ErrorCode'], jsonError['ErrorMessage']); apiError = APIError(jsonError['ErrorCode'], jsonError['ErrorMessage'], jsonError['ErrorType']);
} }
return APIException(APIException.BAD_REQUEST, error: apiError); return APIException(APIException.BAD_REQUEST, error: apiError);
case 401: case 401:
@ -90,7 +91,7 @@ class ApiClient {
return factoryConstructor(jsonData); return factoryConstructor(jsonData);
} else { } else {
APIError? apiError; APIError? apiError;
apiError = APIError(jsonData['ErrorCode'], jsonData['ErrorEndUserMessage']); apiError = APIError(jsonData['ErrorCode'], jsonData['ErrorEndUserMessage'], jsonData['ErrorType']);
throw APIException(APIException.BAD_REQUEST, error: apiError); throw APIException(APIException.BAD_REQUEST, error: apiError);
} }
// } catch (ex) { // } catch (ex) {

@ -3,10 +3,12 @@ import 'dart:io';
import 'dart:typed_data'; import 'dart:typed_data';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart'; import 'package:http/http.dart';
import 'package:mohem_flutter_app/api/api_client.dart'; import 'package:mohem_flutter_app/api/api_client.dart';
import 'package:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart';
import 'package:mohem_flutter_app/classes/consts.dart'; import 'package:mohem_flutter_app/classes/consts.dart';
import 'package:mohem_flutter_app/classes/utils.dart';
import 'package:mohem_flutter_app/exceptions/api_exception.dart'; import 'package:mohem_flutter_app/exceptions/api_exception.dart';
import 'package:mohem_flutter_app/main.dart'; import 'package:mohem_flutter_app/main.dart';
import 'package:mohem_flutter_app/models/chat/chat_user_image_model.dart'; import 'package:mohem_flutter_app/models/chat/chat_user_image_model.dart';
@ -22,6 +24,7 @@ class ChatApiClient {
factory ChatApiClient() => _instance; factory ChatApiClient() => _instance;
Future<user.UserAutoLoginModel> getUserLoginToken() async { Future<user.UserAutoLoginModel> getUserLoginToken() async {
user.UserAutoLoginModel userLoginResponse = user.UserAutoLoginModel();
Response response = await ApiClient().postJsonForResponse( Response response = await ApiClient().postJsonForResponse(
"${ApiConsts.chatLoginTokenUrl}externaluserlogin", "${ApiConsts.chatLoginTokenUrl}externaluserlogin",
{ {
@ -30,9 +33,17 @@ class ChatApiClient {
}, },
); );
if (!kReleaseMode) { if (!kReleaseMode) {
print("Status Code is ================" + response.statusCode.toString());
logger.i("res: " + response.body); logger.i("res: " + response.body);
} }
user.UserAutoLoginModel userLoginResponse = user.userAutoLoginModelFromJson(response.body); if (response.statusCode == 200) {
userLoginResponse = user.userAutoLoginModelFromJson(response.body);
} else if (response.statusCode == 501 || response.statusCode == 502 || response.statusCode == 503 || response.statusCode == 504) {
getUserLoginToken();
} else {
userLoginResponse = user.userAutoLoginModelFromJson(response.body);
Utils.showToast(userLoginResponse.errorResponses!.first.message!);
}
return userLoginResponse; return userLoginResponse;
} }
@ -131,16 +142,22 @@ class ChatApiClient {
// Download File For Chat // Download File For Chat
Future<Uint8List> downloadURL({required String fileName, required String fileTypeDescription}) async { Future<Uint8List> downloadURL({required String fileName, required String fileTypeDescription}) async {
print(fileName);
print(fileTypeDescription);
print("${ApiConsts.chatMediaImageUploadUrl}download");
print(AppState().chatDetails!.response!.token);
Response response = await ApiClient().postJsonForResponse( Response response = await ApiClient().postJsonForResponse(
"${ApiConsts.chatMediaImageUploadUrl}download", "${ApiConsts.chatMediaImageUploadUrl}download",
{"fileType": fileTypeDescription, "fileName": fileName, "fileSource": 1}, {"fileType": fileTypeDescription, "fileName": fileName, "fileSource": 1},
token: AppState().chatDetails!.response!.token, token: AppState().chatDetails!.response!.token,
); );
Uint8List data = Uint8List.fromList(response.bodyBytes); Uint8List data = Uint8List.fromList(response.bodyBytes);
return data; return data;
} }
Future<List<ChatUserImageModel>> getUsersImages({required List<String> encryptedEmails}) async { Future<List<ChatUserImageModel>> getUsersImages({required List<String> encryptedEmails}) async {
List<ChatUserImageModel> imagesData = [];
Response response = await ApiClient().postJsonForResponse( Response response = await ApiClient().postJsonForResponse(
"${ApiConsts.chatUserImages}images", "${ApiConsts.chatUserImages}images",
{"encryptedEmails": encryptedEmails, "fromClient": false}, {"encryptedEmails": encryptedEmails, "fromClient": false},
@ -149,6 +166,14 @@ class ChatApiClient {
if (!kReleaseMode) { if (!kReleaseMode) {
logger.i("res: " + response.body); logger.i("res: " + response.body);
} }
return chatUserImageModelFromJson(response.body); if (response.statusCode == 200) {
imagesData = chatUserImageModelFromJson(response.body);
} else if (response.statusCode == 500 || response.statusCode == 504) {
getUsersImages(encryptedEmails: encryptedEmails);
} else {
Utils.showToast("Something went wrong while loading images");
imagesData = [];
}
return imagesData;
} }
} }

@ -1,12 +1,10 @@
import 'dart:async'; import 'dart:async';
import 'dart:convert'; import 'dart:convert';
import 'package:http/http.dart';
import 'package:mohem_flutter_app/api/api_client.dart'; import 'package:mohem_flutter_app/api/api_client.dart';
import 'package:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart';
import 'package:mohem_flutter_app/classes/consts.dart'; import 'package:mohem_flutter_app/classes/consts.dart';
import 'package:mohem_flutter_app/classes/date_uitl.dart'; import 'package:mohem_flutter_app/classes/date_uitl.dart';
import 'package:mohem_flutter_app/models/chat/chat_count_conversation_model.dart';
import 'package:mohem_flutter_app/models/dashboard/get_accrual_balances_list_model.dart'; import 'package:mohem_flutter_app/models/dashboard/get_accrual_balances_list_model.dart';
import 'package:mohem_flutter_app/models/dashboard/get_attendance_tracking_list_model.dart'; import 'package:mohem_flutter_app/models/dashboard/get_attendance_tracking_list_model.dart';
import 'package:mohem_flutter_app/models/dashboard/itg_forms_model.dart'; import 'package:mohem_flutter_app/models/dashboard/itg_forms_model.dart';
@ -14,7 +12,6 @@ import 'package:mohem_flutter_app/models/dashboard/list_menu.dart';
import 'package:mohem_flutter_app/models/generic_response_model.dart'; import 'package:mohem_flutter_app/models/generic_response_model.dart';
import 'package:mohem_flutter_app/models/itg/itg_main_response.dart'; import 'package:mohem_flutter_app/models/itg/itg_main_response.dart';
import 'package:mohem_flutter_app/models/itg/itg_response_model.dart'; import 'package:mohem_flutter_app/models/itg/itg_response_model.dart';
import 'package:uuid/uuid.dart'; import 'package:uuid/uuid.dart';
class DashboardApiClient { class DashboardApiClient {
@ -47,7 +44,6 @@ class DashboardApiClient {
Future<GenericResponseModel?> getCOCNotifications() async { Future<GenericResponseModel?> getCOCNotifications() async {
String url = "${ApiConsts.cocRest}Mohemm_ITG_ReviewerAdmin_Pending_Tasks"; String url = "${ApiConsts.cocRest}Mohemm_ITG_ReviewerAdmin_Pending_Tasks";
Map<String, dynamic> postParams = {"Date": DateUtil.getISODateFormat(DateTime.now()), "EmployeeNumber": AppState().memberInformationList?.eMPLOYEENUMBER}; Map<String, dynamic> postParams = {"Date": DateUtil.getISODateFormat(DateTime.now()), "EmployeeNumber": AppState().memberInformationList?.eMPLOYEENUMBER};
postParams.addAll(AppState().postParamsJson); postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject((json) { return await ApiClient().postJsonForObject((json) {
GenericResponseModel responseData = GenericResponseModel.fromJson(json); GenericResponseModel responseData = GenericResponseModel.fromJson(json);
@ -69,9 +65,7 @@ class DashboardApiClient {
String url = "${ApiConsts.erpRest}GET_ACCRUAL_BALANCES"; String url = "${ApiConsts.erpRest}GET_ACCRUAL_BALANCES";
Map<String, dynamic> postParams = {"P_EFFECTIVE_DATE": effectiveDate}; Map<String, dynamic> postParams = {"P_EFFECTIVE_DATE": effectiveDate};
postParams.addAll(AppState().postParamsJson); postParams.addAll(AppState().postParamsJson);
if (empID != null && empID.isNotEmpty) { if (empID != null) postParams["P_SELECTED_EMPLOYEE_NUMBER"] = empID;
postParams['P_SELECTED_EMPLOYEE_NUMBER'] = empID;
}
return await ApiClient().postJsonForObject((json) { return await ApiClient().postJsonForObject((json) {
GenericResponseModel responseData = GenericResponseModel.fromJson(json); GenericResponseModel responseData = GenericResponseModel.fromJson(json);
return responseData.getAccrualBalancesList ?? []; return responseData.getAccrualBalancesList ?? [];
@ -205,8 +199,6 @@ class DashboardApiClient {
}, url, postParams); }, url, postParams);
} }
// Future setAdvertisementViewed(String masterID, int advertisementId) async { // Future setAdvertisementViewed(String masterID, int advertisementId) async {
// String url = "${ApiConsts.cocRest}Mohemm_ITG_UpdateAdvertisementAsViewed"; // String url = "${ApiConsts.cocRest}Mohemm_ITG_UpdateAdvertisementAsViewed";
// //

@ -17,13 +17,11 @@ class LeaveBalanceApiClient {
factory LeaveBalanceApiClient() => _instance; factory LeaveBalanceApiClient() => _instance;
Future<List<GetAbsenceTransactionList>> getAbsenceTransactions(int pSelectedResopID, {String? empID}) async { Future<List<GetAbsenceTransactionList>> getAbsenceTransactions(int pSelectedResopID, String? empID) async {
String url = "${ApiConsts.erpRest}GET_ABSENCE_TRANSACTIONS"; String url = "${ApiConsts.erpRest}GET_ABSENCE_TRANSACTIONS";
Map<String, dynamic> postParams = {"P_PAGE_LIMIT": 50, "P_PAGE_NUM": 1, "P_MENU_TYPE": "E", "P_SELECTED_RESP_ID": pSelectedResopID}; Map<String, dynamic> postParams = {"P_PAGE_LIMIT": 50, "P_PAGE_NUM": 1, "P_MENU_TYPE": "E", "P_SELECTED_RESP_ID": pSelectedResopID};
postParams.addAll(AppState().postParamsJson); postParams.addAll(AppState().postParamsJson);
if (empID!.isNotEmpty) { if (empID != null) postParams["P_SELECTED_EMPLOYEE_NUMBER"] = empID;
postParams['P_SELECTED_EMPLOYEE_NUMBER'] = empID;
}
return await ApiClient().postJsonForObject((json) { return await ApiClient().postJsonForObject((json) {
GenericResponseModel? responseData = GenericResponseModel.fromJson(json); GenericResponseModel? responseData = GenericResponseModel.fromJson(json);
return responseData.getAbsenceTransactionList ?? []; return responseData.getAbsenceTransactionList ?? [];
@ -34,16 +32,15 @@ class LeaveBalanceApiClient {
String url = "${ApiConsts.erpRest}GET_ABSENCE_ATTENDANCE_TYPES"; String url = "${ApiConsts.erpRest}GET_ABSENCE_ATTENDANCE_TYPES";
Map<String, dynamic> postParams = {}; Map<String, dynamic> postParams = {};
postParams.addAll(AppState().postParamsJson); postParams.addAll(AppState().postParamsJson);
if (empID!.isNotEmpty) { if (empID != null) postParams["P_SELECTED_EMPLOYEE_NUMBER"] = empID;
postParams['P_SELECTED_EMPLOYEE_NUMBER'] = empID;
}
return await ApiClient().postJsonForObject((json) { return await ApiClient().postJsonForObject((json) {
GenericResponseModel? responseData = GenericResponseModel.fromJson(json); GenericResponseModel? responseData = GenericResponseModel.fromJson(json);
return responseData.getAbsenceAttendanceTypesList ?? []; return responseData.getAbsenceAttendanceTypesList ?? [];
}, url, postParams); }, url, postParams);
} }
Future<CalculateAbsenceDuration> calculateAbsenceDuration(int pAbsenceAttendanceTypeID, String pDateStart, String pDateEnd, int pSelectedResopID, {String? empID}) async { Future<CalculateAbsenceDuration> calculateAbsenceDuration(int pAbsenceAttendanceTypeID, String pDateStart, String pDateEnd, int pSelectedResopID, {String? empID}) async {
String url = "${ApiConsts.erpRest}CALCULATE_ABSENCE_DURATION"; String url = "${ApiConsts.erpRest}CALCULATE_ABSENCE_DURATION";
Map<String, dynamic> postParams = { Map<String, dynamic> postParams = {
"P_ABSENCE_ATTENDANCE_TYPE_ID": pAbsenceAttendanceTypeID, "P_ABSENCE_ATTENDANCE_TYPE_ID": pAbsenceAttendanceTypeID,
@ -52,25 +49,26 @@ class LeaveBalanceApiClient {
"P_SELECTED_RESP_ID": pSelectedResopID, "P_SELECTED_RESP_ID": pSelectedResopID,
"P_MENU_TYPE": "E", "P_MENU_TYPE": "E",
"P_TIME_END": null, "P_TIME_END": null,
"P_TIME_START": null, "P_TIME_START": null
}; };
postParams.addAll(AppState().postParamsJson); postParams.addAll(AppState().postParamsJson);
if (empID!.isNotEmpty) { if (empID != null) postParams["P_SELECTED_EMPLOYEE_NUMBER"] = empID;
postParams['P_SELECTED_EMPLOYEE_NUMBER'] = empID;
}
return await ApiClient().postJsonForObject((json) { return await ApiClient().postJsonForObject((json) {
GenericResponseModel? responseData = GenericResponseModel.fromJson(json); GenericResponseModel? responseData = GenericResponseModel.fromJson(json);
return responseData.calculateAbsenceDuration!; return responseData.calculateAbsenceDuration!;
}, url, postParams); }, url, postParams);
} }
Future<List<GetAbsenceDffStructureList>> getAbsenceDffStructure(String pDescFlexContextCode, String pFunctionName, int pSelectedResopID, {String? empID}) async { Future<List<GetAbsenceDffStructureList>> getAbsenceDffStructure(String pDescFlexContextCode, String pFunctionName, int pSelectedResopID, {String? empID}) async {
String url = "${ApiConsts.erpRest}GET_ABSENCE_DFF_STRUCTURE"; String url = "${ApiConsts.erpRest}GET_ABSENCE_DFF_STRUCTURE";
Map<String, dynamic> postParams = {"P_DESC_FLEX_CONTEXT_CODE": pDescFlexContextCode, "P_FUNCTION_NAME": pFunctionName, "P_MENU_TYPE": "E", "P_SELECTED_RESP_ID": pSelectedResopID}; Map<String, dynamic> postParams = {
"P_DESC_FLEX_CONTEXT_CODE": pDescFlexContextCode,
"P_FUNCTION_NAME": pFunctionName,
"P_MENU_TYPE": "E",
"P_SELECTED_RESP_ID": pSelectedResopID,
};
postParams.addAll(AppState().postParamsJson); postParams.addAll(AppState().postParamsJson);
if (empID!.isNotEmpty) { if (empID != null) postParams["P_SELECTED_EMPLOYEE_NUMBER"] = empID;
postParams['P_SELECTED_EMPLOYEE_NUMBER'] = empID;
}
return await ApiClient().postJsonForObject((json) { return await ApiClient().postJsonForObject((json) {
GenericResponseModel? responseData = GenericResponseModel.fromJson(json); GenericResponseModel? responseData = GenericResponseModel.fromJson(json);
return responseData.getAbsenceDffStructureList ?? []; return responseData.getAbsenceDffStructureList ?? [];
@ -79,7 +77,7 @@ class LeaveBalanceApiClient {
Future<GenericResponseModel> validateAbsenceTransaction( Future<GenericResponseModel> validateAbsenceTransaction(
String pDescFlexContextCode, String pFunctionName, int pAbsenceAttendanceTypeID, String pReplacementUserName, String pDateStart, String pDateEnd, int pSelectedResopID, Map<String, String?> data, String pDescFlexContextCode, String pFunctionName, int pAbsenceAttendanceTypeID, String pReplacementUserName, String pDateStart, String pDateEnd, int pSelectedResopID, Map<String, String?> data,
{String comments = "", String? empID}) async { {String comments = "", String? empID}) async {
String url = "${ApiConsts.erpRest}VALIDATE_ABSENCE_TRANSACTION"; String url = "${ApiConsts.erpRest}VALIDATE_ABSENCE_TRANSACTION";
Map<String, dynamic> postParams = { Map<String, dynamic> postParams = {
"P_DESC_FLEX_CONTEXT_CODE": pDescFlexContextCode, "P_DESC_FLEX_CONTEXT_CODE": pDescFlexContextCode,
@ -94,13 +92,11 @@ class LeaveBalanceApiClient {
"P_SELECTED_RESP_ID": pSelectedResopID, "P_SELECTED_RESP_ID": pSelectedResopID,
"P_MENU_TYPE": "E", "P_MENU_TYPE": "E",
"P_TIME_END": null, "P_TIME_END": null,
"P_TIME_START": null, "P_TIME_START": null
}; };
postParams.addAll(data); postParams.addAll(data);
postParams.addAll(AppState().postParamsJson); postParams.addAll(AppState().postParamsJson);
if (empID!.isNotEmpty) { if (empID != null) postParams["P_SELECTED_EMPLOYEE_NUMBER"] = empID;
postParams['P_SELECTED_EMPLOYEE_NUMBER'] = empID;
}
return await ApiClient().postJsonForObject((json) { return await ApiClient().postJsonForObject((json) {
GenericResponseModel? responseData = GenericResponseModel.fromJson(json); GenericResponseModel? responseData = GenericResponseModel.fromJson(json);
return responseData; return responseData;
@ -109,7 +105,7 @@ class LeaveBalanceApiClient {
Future<SumbitAbsenceTransactionList> submitAbsenceTransaction( Future<SumbitAbsenceTransactionList> submitAbsenceTransaction(
String pDescFlexContextCode, String pFunctionName, int pAbsenceAttendanceTypeID, String pReplacementUserName, String pDateStart, String pDateEnd, int pSelectedResopID, Map<String, String?> data, String pDescFlexContextCode, String pFunctionName, int pAbsenceAttendanceTypeID, String pReplacementUserName, String pDateStart, String pDateEnd, int pSelectedResopID, Map<String, String?> data,
{String comments = "", String? empID}) async { {String comments = "", String? empID}) async {
String url = "${ApiConsts.erpRest}SUBMIT_ABSENCE_TRANSACTION"; String url = "${ApiConsts.erpRest}SUBMIT_ABSENCE_TRANSACTION";
Map<String, dynamic> postParams = { Map<String, dynamic> postParams = {
"P_DESC_FLEX_CONTEXT_CODE": pDescFlexContextCode, "P_DESC_FLEX_CONTEXT_CODE": pDescFlexContextCode,
@ -124,13 +120,11 @@ class LeaveBalanceApiClient {
"P_SELECTED_RESP_ID": pSelectedResopID, "P_SELECTED_RESP_ID": pSelectedResopID,
"P_MENU_TYPE": "E", "P_MENU_TYPE": "E",
"P_TIME_END": null, "P_TIME_END": null,
"P_TIME_START": null, "P_TIME_START": null
}; };
postParams.addAll(data); postParams.addAll(data);
postParams.addAll(AppState().postParamsJson); postParams.addAll(AppState().postParamsJson);
if (empID!.isNotEmpty) { if (empID != null) postParams["P_SELECTED_EMPLOYEE_NUMBER"] = empID;
postParams['P_SELECTED_EMPLOYEE_NUMBER'] = empID;
}
return await ApiClient().postJsonForObject((json) { return await ApiClient().postJsonForObject((json) {
GenericResponseModel? responseData = GenericResponseModel.fromJson(json); GenericResponseModel? responseData = GenericResponseModel.fromJson(json);
return responseData.sumbitAbsenceTransactionList!; return responseData.sumbitAbsenceTransactionList!;
@ -147,18 +141,11 @@ class LeaveBalanceApiClient {
}, url, postParams); }, url, postParams);
} }
Future<StartAbsenceApprovalProccess> startAbsenceApprovalProcess(int pTransactionID, String comments, int pSelectedResopID,{String? empID}) async { Future<StartAbsenceApprovalProccess> startAbsenceApprovalProcess(int pTransactionID, String comments, int pSelectedResopID, {String? empID}) async {
String url = "${ApiConsts.erpRest}START_ABSENCE_APPROVAL_PROCESS"; String url = "${ApiConsts.erpRest}START_ABSENCE_APPROVAL_PROCESS";
Map<String, dynamic> postParams = { Map<String, dynamic> postParams = {"P_TRANSACTION_ID": pTransactionID, "P_SELECTED_RESP_ID": pSelectedResopID, "P_COMMENTS": comments, "P_MENU_TYPE": "E"};
"P_TRANSACTION_ID": pTransactionID,
"P_SELECTED_RESP_ID": pSelectedResopID,
"P_COMMENTS": comments,
"P_MENU_TYPE": "E",
};
postParams.addAll(AppState().postParamsJson); postParams.addAll(AppState().postParamsJson);
if (empID!.isNotEmpty) { if (empID != null) postParams["P_SELECTED_EMPLOYEE_NUMBER"] = empID;
postParams['P_SELECTED_EMPLOYEE_NUMBER'] = empID;
}
return await ApiClient().postJsonForObject((json) { return await ApiClient().postJsonForObject((json) {
GenericResponseModel? responseData = GenericResponseModel.fromJson(json); GenericResponseModel? responseData = GenericResponseModel.fromJson(json);
return responseData.startAbsenceApprovalProccess!; return responseData.startAbsenceApprovalProccess!;

@ -22,11 +22,7 @@ class MyAttendanceApiClient {
String url = "${ApiConsts.erpRest}GET_EIT_TRANSACTIONS"; String url = "${ApiConsts.erpRest}GET_EIT_TRANSACTIONS";
Map<String, dynamic> postParams = {"P_PAGE_LIMIT": 50, "P_PAGE_NUM": 1, "P_SELECTED_RESP_ID": -999, "P_MENU_TYPE": "E", "P_FUNCTION_NAME": pFunctionName}; Map<String, dynamic> postParams = {"P_PAGE_LIMIT": 50, "P_PAGE_NUM": 1, "P_SELECTED_RESP_ID": -999, "P_MENU_TYPE": "E", "P_FUNCTION_NAME": pFunctionName};
postParams.addAll(AppState().postParamsJson); postParams.addAll(AppState().postParamsJson);
// postParams['P_SELECTED_EMPLOYEE_NUMBER'] = empID; if (empID != null) postParams["P_SELECTED_EMPLOYEE_NUMBER"] = empID;
if (empID!.isNotEmpty) {
postParams['P_SELECTED_EMPLOYEE_NUMBER'] = empID;
// AppState().postParamsJson['P_SELECTED_EMPLOYEE_NUMBER'] = empID;
}
return await ApiClient().postJsonForObject((json) { return await ApiClient().postJsonForObject((json) {
GenericResponseModel? responseData = GenericResponseModel.fromJson(json); GenericResponseModel? responseData = GenericResponseModel.fromJson(json);
return responseData.getEITTransactionList ?? []; return responseData.getEITTransactionList ?? [];
@ -37,9 +33,7 @@ class MyAttendanceApiClient {
String url = "${ApiConsts.erpRest}GET_EIT_DFF_STRUCTURE"; String url = "${ApiConsts.erpRest}GET_EIT_DFF_STRUCTURE";
Map<String, dynamic> postParams = {"P_SELECTED_RESP_ID": -999, "P_MENU_TYPE": "E", "P_FUNCTION_NAME": pFunctionName}; Map<String, dynamic> postParams = {"P_SELECTED_RESP_ID": -999, "P_MENU_TYPE": "E", "P_FUNCTION_NAME": pFunctionName};
postParams.addAll(AppState().postParamsJson); postParams.addAll(AppState().postParamsJson);
if (empID!.isNotEmpty) { if (empID != null) postParams["P_SELECTED_EMPLOYEE_NUMBER"] = empID;
postParams['P_SELECTED_EMPLOYEE_NUMBER'] = empID;
}
return await ApiClient().postJsonForObject((json) { return await ApiClient().postJsonForObject((json) {
GenericResponseModel? responseData = GenericResponseModel.fromJson(json); GenericResponseModel? responseData = GenericResponseModel.fromJson(json);
return responseData; return responseData;
@ -53,16 +47,14 @@ class MyAttendanceApiClient {
"P_MENU_TYPE": "E", "P_MENU_TYPE": "E",
"P_PAGE_LIMIT": 1000, "P_PAGE_LIMIT": 1000,
"P_PAGE_NUM": 1, "P_PAGE_NUM": 1,
"P_PARENT_VALUE": empID!.isNotEmpty ? parentValue : null, "P_PARENT_VALUE": empID != null ? parentValue : null,
"P_SEGMENT_NAME": pSegmentName, "P_SEGMENT_NAME": pSegmentName,
"P_DESC_FLEX_CONTEXT_CODE": pDescFlexContextCode, "P_DESC_FLEX_CONTEXT_CODE": pDescFlexContextCode,
"P_DESC_FLEX_NAME": pDescFlexName, "P_DESC_FLEX_NAME": pDescFlexName,
"GetValueSetValuesTBL": list, "GetValueSetValuesTBL": list,
}; };
postParams.addAll(AppState().postParamsJson); postParams.addAll(AppState().postParamsJson);
if (empID.isNotEmpty) { if (empID != null) postParams["P_SELECTED_EMPLOYEE_NUMBER"] = empID;
postParams['P_SELECTED_EMPLOYEE_NUMBER'] = empID;
}
return await ApiClient().postJsonForObject((json) { return await ApiClient().postJsonForObject((json) {
GenericResponseModel? responseData = GenericResponseModel.fromJson(json); GenericResponseModel? responseData = GenericResponseModel.fromJson(json);
return responseData.getValueSetValuesList ?? []; return responseData.getValueSetValuesList ?? [];
@ -81,9 +73,7 @@ class MyAttendanceApiClient {
"GetValueSetValuesTBL": list, "GetValueSetValuesTBL": list,
}; };
postParams.addAll(AppState().postParamsJson); postParams.addAll(AppState().postParamsJson);
if (empID != null && empID!.isNotEmpty) { if (empID != null) postParams["P_SELECTED_EMPLOYEE_NUMBER"] = empID;
postParams['P_SELECTED_EMPLOYEE_NUMBER'] = empID;
}
return await ApiClient().postJsonForObject((json) { return await ApiClient().postJsonForObject((json) {
GenericResponseModel? responseData = GenericResponseModel.fromJson(json); GenericResponseModel? responseData = GenericResponseModel.fromJson(json);
return ESERVICESDV.fromJson(responseData.getDefaultValueList!.toJson()); return ESERVICESDV.fromJson(responseData.getDefaultValueList!.toJson());
@ -100,9 +90,7 @@ class MyAttendanceApiClient {
"EITTransactionTBL": list, "EITTransactionTBL": list,
}; };
postParams.addAll(AppState().postParamsJson); postParams.addAll(AppState().postParamsJson);
if (empID!.isNotEmpty) { if (empID != null) postParams["P_SELECTED_EMPLOYEE_NUMBER"] = empID;
postParams['P_SELECTED_EMPLOYEE_NUMBER'] = empID;
}
return await ApiClient().postJsonForObject((json) { return await ApiClient().postJsonForObject((json) {
GenericResponseModel? responseData = GenericResponseModel.fromJson(json); GenericResponseModel? responseData = GenericResponseModel.fromJson(json);
return responseData; //ESERVICESDV.fromJson(responseData.getDefaultValueList!.toJson()); return responseData; //ESERVICESDV.fromJson(responseData.getDefaultValueList!.toJson());
@ -120,9 +108,7 @@ class MyAttendanceApiClient {
"EITTransactionTBLModel": list, "EITTransactionTBLModel": list,
}; };
postParams.addAll(AppState().postParamsJson); postParams.addAll(AppState().postParamsJson);
if (empID!.isNotEmpty) { if (empID != null) postParams["P_SELECTED_EMPLOYEE_NUMBER"] = empID;
postParams['P_SELECTED_EMPLOYEE_NUMBER'] = empID;
}
return await ApiClient().postJsonForObject((json) { return await ApiClient().postJsonForObject((json) {
GenericResponseModel responseData = GenericResponseModel.fromJson(json); GenericResponseModel responseData = GenericResponseModel.fromJson(json);
return responseData.submitEITTransactionList!; //ESERVICESDV.fromJson(responseData.getDefaultValueList!.toJson()); return responseData.submitEITTransactionList!; //ESERVICESDV.fromJson(responseData.getDefaultValueList!.toJson());

@ -157,7 +157,7 @@ class WorkListApiClient {
"P_PAGE_NUM": 1, "P_PAGE_NUM": 1,
}; };
postParams.addAll(AppState().postParamsJson); postParams.addAll(AppState().postParamsJson);
postParams["P_SELECTED_EMPLOYEE_NUMBER"] = selectedEmployeeNumber; if (selectedEmployeeNumber != null) postParams["P_SELECTED_EMPLOYEE_NUMBER"] = selectedEmployeeNumber;
return await ApiClient().postJsonForObject((json) { return await ApiClient().postJsonForObject((json) {
GenericResponseModel responseData = GenericResponseModel.fromJson(json); GenericResponseModel responseData = GenericResponseModel.fromJson(json);
return responseData.memberInformationList![0]; return responseData.memberInformationList![0];

@ -64,7 +64,7 @@ class AppState {
String? get getMarathonProjectId => _projectID; String? get getMarathonProjectId => _projectID;
final PostParamsModel _postParamsInitConfig = PostParamsModel(channel: 31, versionID: 5.0, mobileType: Platform.isAndroid ? "android" : "ios"); final PostParamsModel _postParamsInitConfig = PostParamsModel(channel: 31, versionID: 3.8, mobileType: Platform.isAndroid ? "android" : "ios");
void setPostParamsInitConfig() { void setPostParamsInitConfig() {
isAuthenticated = false; isAuthenticated = false;

@ -4,7 +4,7 @@ class ApiConsts {
//static String baseUrl = "http://10.200.204.20:2801/"; // Local server //static String baseUrl = "http://10.200.204.20:2801/"; // Local server
// static String baseUrl = "https://erptstapp.srca.org.sa"; // SRCA server // static String baseUrl = "https://erptstapp.srca.org.sa"; // SRCA server
static String baseUrl = "https://uat.hmgwebservices.com"; // UAT server static String baseUrl = "https://uat.hmgwebservices.com"; // UAT server
// static String baseUrl = "https://hmgwebservices.com"; // Live server // static String baseUrl = "https://hmgwebservices.com"; // Live server
static String baseUrlServices = baseUrl + "/Services/"; // server static String baseUrlServices = baseUrl + "/Services/"; // server
// static String baseUrlServices = "https://api.cssynapses.com/tangheem/"; // Live server // static String baseUrlServices = "https://api.cssynapses.com/tangheem/"; // Live server
static String utilitiesRest = baseUrlServices + "Utilities.svc/REST/"; static String utilitiesRest = baseUrlServices + "Utilities.svc/REST/";

@ -6,7 +6,6 @@ class DateUtil {
/// ///
/// ///
static DateTime convertStringToDateMarathon(String date) { static DateTime convertStringToDateMarathon(String date) {
// /Date(1585774800000+0300)/ // /Date(1585774800000+0300)/
if (date != null) { if (date != null) {
@ -40,7 +39,30 @@ class DateUtil {
} }
static DateTime convertSimpleStringDateToDate(String date) { static DateTime convertSimpleStringDateToDate(String date) {
return DateFormat("MM/dd/yyyy hh:mm:ss").parse(date); // print(date.toUpperCase());
return getDateTimeFromString(date.split(" ")[0], date.toUpperCase().split(" ")[1] + " " + date.toUpperCase().split(" ")[2]);
}
static DateTime getDateTimeFromString(String date, String time) {
var hours = num.parse(time.split(":")[0]);
var mins = time.split(":")[1];
var secs = time.split(":")[2].split(" ")[0];
String meridium = time.split(" ")[1];
if (meridium == "PM") {
if (hours != 12) {
hours = hours + 12;
}
}
if (meridium == "AM") {
if (hours == 12) {
hours = 00;
}
}
date = date + " $hours:$mins:$secs";
DateTime returnDate = DateFormat("MM/dd/yyyy HH:mm:ss").parse(date);
return returnDate;
} }
static DateTime convertSimpleStringDateToDateddMMyyyy(String date) { static DateTime convertSimpleStringDateToDateddMMyyyy(String date) {

@ -98,33 +98,37 @@ class Utils {
static void handleException(dynamic exception, cxt, Function(String)? onErrorMessage) { static void handleException(dynamic exception, cxt, Function(String)? onErrorMessage) {
String errorMessage; String errorMessage;
if (exception is APIException) { if (exception.error.errorType != null && exception.error.errorType == 4) {
if (exception.message == APIException.UNAUTHORIZED) { Navigator.pushNamedAndRemoveUntil(cxt, AppRoutes.appUpdateScreen, (_) => false, arguments: exception.error?.errorMessage);
return; } else {
if (exception is APIException) {
if (exception.message == APIException.UNAUTHORIZED) {
return;
} else {
errorMessage = exception.error?.errorMessage ?? exception.message;
}
} else { } else {
errorMessage = exception.error?.errorMessage ?? exception.message; errorMessage = APIException.UNKNOWN;
} }
} else { if (onErrorMessage != null) {
errorMessage = APIException.UNKNOWN; onErrorMessage(errorMessage);
}
if (onErrorMessage != null) {
onErrorMessage(errorMessage);
} else {
if (!AppState().isAuthenticated) {
showDialog(
context: cxt,
builder: (BuildContext cxt) => ConfirmDialog(
message: errorMessage,
onTap: () {
Navigator.pushNamedAndRemoveUntil(cxt, AppRoutes.login, (Route<dynamic> route) => false);
},
),
);
} else { } else {
if (cxt != null) { if (!AppState().isAuthenticated) {
confirmDialog(cxt, errorMessage); showDialog(
context: cxt,
builder: (cxt) => ConfirmDialog(
message: errorMessage,
onTap: () {
Navigator.pushNamedAndRemoveUntil(cxt, AppRoutes.login, (Route<dynamic> route) => false);
},
),
);
} else { } else {
showToast(errorMessage); if (cxt != null) {
confirmDialog(cxt, errorMessage);
} else {
showToast(errorMessage);
}
} }
} }
} }
@ -321,7 +325,24 @@ class Utils {
} }
static String formatDateDefault(String date) { static String formatDateDefault(String date) {
return DateFormat('yyyy-MM-dd').format(DateFormat('dd-MMM-yyyy').parseLoose(date)); if (date.isNotEmpty) {
if (date.toLowerCase().contains("t")) {
date = date.toLowerCase().split("t")[0];
if (!date.contains("00:00:00")) {
date = date + ' 00:00:00';
}
return date;
} else {
if (date.toLowerCase().split("-")[1].length == 3) {
return DateFormat('dd-MM-yyyy').format(DateFormat('dd-MMM-yyyy').parseLoose(date));
} else {
return DateFormat('dd-MM-yyyy').format(DateFormat('yyyy-MM-dd').parseLoose(date));
}
// return DateFormat('yyyy-MM-dd').format(DateFormat('dd-MM-yyyy').parseLoose(date));
}
} else {
return date;
}
} }
static Future<DateTime> selectDate(BuildContext context, DateTime selectedDate) async { static Future<DateTime> selectDate(BuildContext context, DateTime selectedDate) async {

@ -1,4 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mohem_flutter_app/ui/app_update_screen.dart';
import 'package:mohem_flutter_app/ui/attendance/add_vacation_rule_screen.dart'; import 'package:mohem_flutter_app/ui/attendance/add_vacation_rule_screen.dart';
import 'package:mohem_flutter_app/ui/attendance/monthly_attendance_screen.dart'; import 'package:mohem_flutter_app/ui/attendance/monthly_attendance_screen.dart';
import 'package:mohem_flutter_app/ui/attendance/vacation_rule_screen.dart'; import 'package:mohem_flutter_app/ui/attendance/vacation_rule_screen.dart';
@ -190,6 +191,7 @@ class AppRoutes {
static const String marathonWaitingScreen = "/marathonWaitingScreen"; static const String marathonWaitingScreen = "/marathonWaitingScreen";
static const String unsafeDeviceScreen = "/unsafeDeviceScreen"; static const String unsafeDeviceScreen = "/unsafeDeviceScreen";
static const String appUpdateScreen = "/appUpdateScreen";
static final Map<String, WidgetBuilder> routes = { static final Map<String, WidgetBuilder> routes = {
login: (BuildContext context) => LoginScreen(), login: (BuildContext context) => LoginScreen(),
@ -300,5 +302,6 @@ class AppRoutes {
marathonWaitingScreen: (BuildContext context) => const MarathonWaitingScreen(), marathonWaitingScreen: (BuildContext context) => const MarathonWaitingScreen(),
unsafeDeviceScreen: (BuildContext context) => const UnsafeDeviceScreen(), unsafeDeviceScreen: (BuildContext context) => const UnsafeDeviceScreen(),
appUpdateScreen: (BuildContext context) => const AppUpdateScreen(),
}; };
} }

@ -58,7 +58,7 @@ extension WidgetExtensions on Widget {
), ),
], ],
), ),
alignment: center == true ? Alignment.center : null, alignment: center ? Alignment.center : null,
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,

@ -16,7 +16,6 @@ import 'package:image_picker_for_web/image_picker_for_web.dart';
import 'package:shared_preferences_web/shared_preferences_web.dart'; import 'package:shared_preferences_web/shared_preferences_web.dart';
import 'package:url_launcher_web/url_launcher_web.dart'; import 'package:url_launcher_web/url_launcher_web.dart';
import 'package:video_player_web/video_player_web.dart'; import 'package:video_player_web/video_player_web.dart';
import 'package:wakelock_web/wakelock_web.dart';
import 'package:flutter_web_plugins/flutter_web_plugins.dart'; import 'package:flutter_web_plugins/flutter_web_plugins.dart';
@ -32,6 +31,5 @@ void registerPlugins(Registrar registrar) {
SharedPreferencesPlugin.registerWith(registrar); SharedPreferencesPlugin.registerWith(registrar);
UrlLauncherPlugin.registerWith(registrar); UrlLauncherPlugin.registerWith(registrar);
VideoPlayerPlugin.registerWith(registrar); VideoPlayerPlugin.registerWith(registrar);
WakelockWeb.registerWith(registrar);
registrar.registerMessageHandler(); registrar.registerMessageHandler();
} }

@ -4,7 +4,7 @@ class GetPoItemHistoryList {
String? bUYER; String? bUYER;
String? cLOSEDCODE; String? cLOSEDCODE;
String? cREATIONDATE; String? cREATIONDATE;
int? dISCOUNTPERCENTAGE; num? dISCOUNTPERCENTAGE;
int? fROMROWNUM; int? fROMROWNUM;
int? iTEMID; int? iTEMID;
num? nETPRICE; num? nETPRICE;

@ -5,7 +5,7 @@ class GetQuotationAnalysisList {
int? nOOFROWS; int? nOOFROWS;
String? qUOTBONUSQTY; String? qUOTBONUSQTY;
String? qUOTDELIVERYDATE; String? qUOTDELIVERYDATE;
int? qUOTLINETOTAL; num? qUOTLINETOTAL;
String? qUOTMFGPARTNUM; String? qUOTMFGPARTNUM;
String? qUOTNUM; String? qUOTNUM;
num? qUOTQTY; num? qUOTQTY;

@ -2,18 +2,20 @@ import 'dart:async';
import 'dart:convert'; import 'dart:convert';
import 'dart:io'; import 'dart:io';
import 'dart:typed_data'; import 'dart:typed_data';
import 'package:audio_waveforms/audio_waveforms.dart';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart';
import 'package:http/http.dart'; import 'package:http/http.dart';
import 'package:just_audio/just_audio.dart'; import 'package:just_audio/just_audio.dart' as JustAudio;
import 'package:mohem_flutter_app/api/chat/chat_api_client.dart'; import 'package:mohem_flutter_app/api/chat/chat_api_client.dart';
import 'package:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart';
import 'package:mohem_flutter_app/classes/consts.dart'; import 'package:mohem_flutter_app/classes/consts.dart';
import 'package:mohem_flutter_app/classes/encryption.dart'; import 'package:mohem_flutter_app/classes/encryption.dart';
import 'package:mohem_flutter_app/classes/utils.dart'; import 'package:mohem_flutter_app/classes/utils.dart';
import 'package:mohem_flutter_app/main.dart'; import 'package:mohem_flutter_app/main.dart';
import 'package:mohem_flutter_app/models/chat/chat_count_conversation_model.dart';
import 'package:mohem_flutter_app/models/chat/chat_user_image_model.dart'; import 'package:mohem_flutter_app/models/chat/chat_user_image_model.dart';
import 'package:mohem_flutter_app/models/chat/get_search_user_chat_model.dart'; import 'package:mohem_flutter_app/models/chat/get_search_user_chat_model.dart';
import 'package:mohem_flutter_app/models/chat/get_single_user_chat_list_model.dart'; import 'package:mohem_flutter_app/models/chat/get_single_user_chat_list_model.dart';
@ -23,6 +25,7 @@ import 'package:mohem_flutter_app/ui/landing/dashboard_screen.dart';
import 'package:mohem_flutter_app/widgets/image_picker.dart'; import 'package:mohem_flutter_app/widgets/image_picker.dart';
import 'package:open_file/open_file.dart'; import 'package:open_file/open_file.dart';
import 'package:path_provider/path_provider.dart'; import 'package:path_provider/path_provider.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:signalr_netcore/hub_connection.dart'; import 'package:signalr_netcore/hub_connection.dart';
import 'package:signalr_netcore/signalr_client.dart'; import 'package:signalr_netcore/signalr_client.dart';
import 'package:uuid/uuid.dart'; import 'package:uuid/uuid.dart';
@ -37,7 +40,6 @@ class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
bool isLoading = true; bool isLoading = true;
bool isChatScreenActive = false; bool isChatScreenActive = false;
int receiverID = 0; int receiverID = 0;
late File selectedFile; late File selectedFile;
bool isFileSelected = false; bool isFileSelected = false;
String sFileType = ""; String sFileType = "";
@ -53,9 +55,13 @@ class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
Future<void> getUserAutoLoginToken() async { Future<void> getUserAutoLoginToken() async {
userLoginToken.UserAutoLoginModel userLoginResponse = await ChatApiClient().getUserLoginToken(); userLoginToken.UserAutoLoginModel userLoginResponse = await ChatApiClient().getUserLoginToken();
print("======================================= Chat Login Token Check =====================================");
logger.d(userLoginResponse.toJson());
print("======================================= Chat Login Token Check =====================================");
if (userLoginResponse.response != null) { if (userLoginResponse.response != null) {
AppState().setchatUserDetails = userLoginResponse; AppState().setchatUserDetails = userLoginResponse;
} else { } else {
AppState().setchatUserDetails = userLoginResponse;
Utils.showToast( Utils.showToast(
userLoginResponse.errorResponses!.first.fieldName.toString() + " Erorr", userLoginResponse.errorResponses!.first.fieldName.toString() + " Erorr",
); );
@ -814,15 +820,15 @@ class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
sFileType = ""; sFileType = "";
deleteData(); deleteData();
favUsersList.clear(); favUsersList.clear();
searchedChats!.clear(); if (searchedChats != null) searchedChats!.clear();
pChatHistory!.clear(); if (pChatHistory != null) pChatHistory!.clear();
chatHubConnection.stop(); chatHubConnection.stop();
AppState().chatDetails = null; AppState().chatDetails = null;
} }
void deleteData() { void deleteData() {
List<ChatUser> exists = [], unique = []; List<ChatUser> exists = [], unique = [];
exists.addAll(searchedChats!); if (searchedChats != null) exists.addAll(searchedChats!);
exists.addAll(favUsersList!); exists.addAll(favUsersList!);
Map<String, ChatUser> profileMap = {}; Map<String, ChatUser> profileMap = {};
for (ChatUser item in exists) { for (ChatUser item in exists) {
@ -903,7 +909,7 @@ class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
} }
void setMsgTune() async { void setMsgTune() async {
AudioPlayer player = AudioPlayer(); JustAudio.AudioPlayer player = JustAudio.AudioPlayer();
await player.setVolume(1.0); await player.setVolume(1.0);
String audioAsset = ""; String audioAsset = "";
if (Platform.isAndroid) { if (Platform.isAndroid) {
@ -949,4 +955,133 @@ class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
logger.d([reciptUser, currentUser]); logger.d([reciptUser, currentUser]);
await chatHubConnection.invoke("UserTypingAsync", args: [reciptUser, currentUser]); await chatHubConnection.invoke("UserTypingAsync", args: [reciptUser, currentUser]);
} }
// Audio Recoding Work
Timer? _timer;
int _recodeDuration = 0;
bool isRecoding = false;
bool isPause = false;
bool isPlaying = false;
String? path;
String? musicFile;
late Directory appDirectory;
late RecorderController recorderController;
late PlayerController playerController;
//////// Audio Recoding Work ////////////////////
Future<void> initAudio() async {
appDirectory = await getApplicationDocumentsDirectory();
path = "${appDirectory.path}/${AppState().chatDetails!.response!.id}-${DateTime.now().microsecondsSinceEpoch}.aac";
recorderController = RecorderController()
..androidEncoder = AndroidEncoder.aac
..androidOutputFormat = AndroidOutputFormat.mpeg4
..iosEncoder = IosEncoder.kAudioFormatMPEG4AAC
..sampleRate = 8000
..bitRate = 32000;
playerController = PlayerController();
}
void disposeAudio() {
isRecoding = false;
isPlaying = false;
isPause = false;
recorderController.dispose();
playerController.dispose();
}
void startRecoding() async {
PermissionStatus status = await Permission.microphone.request();
print(status);
if (status.isDenied == true) {
startRecoding();
} else {
recorderController.reset();
await recorderController.record(path);
_recodeDuration = 0;
_startTimer();
isRecoding = !isRecoding;
notifyListeners();
}
}
void _startTimer() {
_timer?.cancel();
_timer = Timer.periodic(const Duration(seconds: 1), (Timer t) {
_recodeDuration++;
buildTimer();
notifyListeners();
});
}
Future<void> pauseRecoding() async {
isPause = true;
isPlaying = true;
recorderController.pause();
path = await recorderController.stop(false);
print(path);
File file = File(path!);
file.readAsBytesSync();
await playerController.preparePlayer(file.path, 1.0);
var tempDuration = _recodeDuration;
_recodeDuration = tempDuration;
_timer?.cancel();
notifyListeners();
}
void resumeRecoding() {
isPause = false;
isPlaying = false;
isRecoding = true;
recorderController.record(path);
_startTimer();
}
Future<void> deleteRecoding() async {
print(path);
_recodeDuration = 0;
_timer?.cancel();
// path = await recorderController.stop(false);
recorderController.reset();
print(path);
if (path != null && path!.isNotEmpty) {
File delFile = File(path!);
double fileSizeInKB = delFile.lengthSync() / 1024;
double fileSizeInMB = fileSizeInKB / 1024;
debugPrint("Deleted file size: ${delFile.lengthSync()}");
debugPrint("Deleted file size in KB: " + fileSizeInKB.toString());
debugPrint("Deleted file size in MB: " + fileSizeInMB.toString());
if (await delFile.exists()) {
delFile.delete();
}
isPause = false;
isRecoding = false;
isPlaying = false;
notifyListeners();
}
}
String buildTimer() {
String minutes = _formatNum(_recodeDuration ~/ 60);
String seconds = _formatNum(_recodeDuration % 60);
return '$minutes : $seconds';
}
String _formatNum(int number) {
String numberStr = number.toString();
if (number < 10) {
numberStr = '0' + numberStr;
}
return numberStr;
}
void playRecoding() async {
isPlaying = true;
await playerController.startPlayer(finishMode: FinishMode.stop);
}
void playOrPause() async {
playerController.playerState == PlayerState.playing ? await playerController.pausePlayer() : playRecoding();
notifyListeners();
}
} }

@ -107,7 +107,7 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
DrawerMenuItem("assets/images/drawer/performance_evaluation.svg", LocaleKeys.performanceEvaluation.tr(), AppRoutes.performanceEvaluation), DrawerMenuItem("assets/images/drawer/performance_evaluation.svg", LocaleKeys.performanceEvaluation.tr(), AppRoutes.performanceEvaluation),
DrawerMenuItem("assets/images/drawer/mowadhafi.svg", LocaleKeys.mowadhafhi.tr(), AppRoutes.mowadhafhi), DrawerMenuItem("assets/images/drawer/mowadhafi.svg", LocaleKeys.mowadhafhi.tr(), AppRoutes.mowadhafhi),
DrawerMenuItem("assets/images/drawer/pending_trasactions.svg", LocaleKeys.pendingTransactions.tr(), AppRoutes.pendingTransactions), DrawerMenuItem("assets/images/drawer/pending_trasactions.svg", LocaleKeys.pendingTransactions.tr(), AppRoutes.pendingTransactions),
DrawerMenuItem("assets/images/drawer/drawer_marathon.svg", LocaleKeys.brainMarathon.tr(), AppRoutes.marathonIntroScreen), // DrawerMenuItem("assets/images/drawer/drawer_marathon.svg", LocaleKeys.brainMarathon.tr(), AppRoutes.marathonIntroScreen),
DrawerMenuItem("assets/images/drawer/change_password.svg", LocaleKeys.changePassword.tr(), AppRoutes.changePassword), DrawerMenuItem("assets/images/drawer/change_password.svg", LocaleKeys.changePassword.tr(), AppRoutes.changePassword),
]; ];

@ -0,0 +1,56 @@
import 'dart:io';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:mohem_flutter_app/extensions/int_extensions.dart';
import 'package:mohem_flutter_app/extensions/string_extensions.dart';
import 'package:mohem_flutter_app/extensions/widget_extensions.dart';
import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
import 'package:mohem_flutter_app/widgets/button/default_button.dart';
import 'package:url_launcher/url_launcher.dart';
class AppUpdateScreen extends StatefulWidget {
const AppUpdateScreen({Key? key}) : super(key: key);
@override
State<AppUpdateScreen> createState() => _UnsafeDeviceScreenState();
}
class _UnsafeDeviceScreenState extends State<AppUpdateScreen> {
String? dynamicParams;
@override
Widget build(BuildContext context) {
dynamicParams ??= ModalRoute.of(context)!.settings.arguments as String;
return Scaffold(
body: SafeArea(
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
21.height,
Center(child: Image.asset("assets/images/logos/main_mohemm_logo.png", width: 200, height: 50)),
50.height,
"Please Update Your App".toText24(isBold: true),
48.height,
dynamicParams.toString().toText14(isCenter: true).paddingOnly(left: 20.0, right: 20.0),
21.height,
DefaultButton(LocaleKeys.ok.tr(), () async {
if (Platform.isAndroid || Platform.isIOS) {
var appId = Platform.isAndroid ? 'hmg.cloudSolutions.mohem' : '1468856602';
var url = Uri.parse(
Platform.isAndroid ? "market://details?id=$appId" : "https://apps.apple.com/app/id$appId",
);
launchUrl(
url,
mode: LaunchMode.externalApplication,
);
}
}).paddingAll(24)
],
),
),
);
}
}

@ -1,6 +1,7 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:typed_data'; import 'dart:typed_data';
import 'package:audio_waveforms/audio_waveforms.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_svg/flutter_svg.dart';
import 'package:mohem_flutter_app/api/api_client.dart'; import 'package:mohem_flutter_app/api/api_client.dart';
@ -120,10 +121,14 @@ class ChatBubble extends StatelessWidget {
else else
Row( Row(
children: [ children: [
if (fileTypeID == 1 || fileTypeID == 5 || fileTypeID == 7 || fileTypeID == 6 || fileTypeID == 8 || fileTypeID == 2) if (fileTypeID == 1 || fileTypeID == 5 || fileTypeID == 7 || fileTypeID == 6 || fileTypeID == 8
// || fileTypeID == 2
)
SvgPicture.asset(data.getType(fileTypeName ?? ""), height: 30, width: 22, alignment: Alignment.center, fit: BoxFit.cover).paddingOnly(left: 0, right: 10), SvgPicture.asset(data.getType(fileTypeName ?? ""), height: 30, width: 22, alignment: Alignment.center, fit: BoxFit.cover).paddingOnly(left: 0, right: 10),
(cItem.contant ?? "").toText12().expanded, (cItem.contant ?? "").toText12().expanded,
if (fileTypeID == 1 || fileTypeID == 5 || fileTypeID == 7 || fileTypeID == 6 || fileTypeID == 8 || fileTypeID == 2) const Icon(Icons.remove_red_eye, size: 16) if (fileTypeID == 1 || fileTypeID == 5 || fileTypeID == 7 || fileTypeID == 6 || fileTypeID == 8
//|| fileTypeID == 2
) const Icon(Icons.remove_red_eye, size: 16)
], ],
), ),
Align( Align(
@ -217,10 +222,15 @@ class ChatBubble extends StatelessWidget {
else else
Row( Row(
children: [ children: [
if (fileTypeID == 1 || fileTypeID == 5 || fileTypeID == 7 || fileTypeID == 6 || fileTypeID == 8 || fileTypeID == 2) if (fileTypeID == 1 || fileTypeID == 5 || fileTypeID == 7 || fileTypeID == 6 || fileTypeID == 8
// || fileTypeID == 2
)
SvgPicture.asset(data.getType(fileTypeName ?? ""), height: 30, width: 22, alignment: Alignment.center, fit: BoxFit.cover).paddingOnly(left: 0, right: 10), SvgPicture.asset(data.getType(fileTypeName ?? ""), height: 30, width: 22, alignment: Alignment.center, fit: BoxFit.cover).paddingOnly(left: 0, right: 10),
(cItem.contant ?? "").toText12(color: Colors.white).expanded, (cItem.contant ?? "").toText12(color: Colors.white).expanded,
if (fileTypeID == 1 || fileTypeID == 5 || fileTypeID == 7 || fileTypeID == 6 || fileTypeID == 8 || fileTypeID == 2) const Icon(Icons.remove_red_eye, color: Colors.white, size: 16) if (fileTypeID == 1 || fileTypeID == 5 || fileTypeID == 7 || fileTypeID == 6 || fileTypeID == 8
//|| fileTypeID == 2
)
const Icon(Icons.remove_red_eye, color: Colors.white, size: 16)
], ],
), ),
Align( Align(
@ -274,3 +284,63 @@ class ChatBubble extends StatelessWidget {
} }
} }
} }
class WaveBubble extends StatelessWidget {
final PlayerController playerController;
final VoidCallback onTap;
final bool isPlaying;
const WaveBubble({
Key? key,
required this.playerController,
required this.onTap,
required this.isPlaying,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
margin: const EdgeInsets.all(10),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(30),
gradient: const LinearGradient(
transform: GradientRotation(.83),
begin: Alignment.topRight,
end: Alignment.bottomLeft,
colors: <Color>[
MyColors.gradiantEndColor,
MyColors.gradiantStartColor,
],
),
),
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
IconButton(
onPressed: onTap,
icon: Icon(isPlaying ? Icons.stop : Icons.play_arrow),
color: Colors.white,
splashColor: Colors.transparent,
highlightColor: Colors.transparent,
),
AudioFileWaveforms(
size: Size(MediaQuery.of(context).size.width / 2, 10),
playerController: playerController,
padding: EdgeInsets.zero,
margin: EdgeInsets.zero,
playerWaveStyle: const PlayerWaveStyle(
fixedWaveColor: Colors.white,
liveWaveColor:MyColors.lightGreenColor,
showTop: true,
showBottom: true,
waveCap: StrokeCap.round,
seekLineThickness: 3,
visualizerHeight: 6,
backgroundColor: Colors.transparent
),
),
],
),
);
}
}

@ -1,6 +1,7 @@
import 'dart:async'; import 'dart:async';
import 'dart:convert'; import 'dart:convert';
import 'package:audio_waveforms/audio_waveforms.dart';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_svg/flutter_svg.dart';
@ -62,6 +63,12 @@ class _ChatDetailScreenState extends State<ChatDetailScreen> {
_rc.loadComplete(); _rc.loadComplete();
} }
@override
void dispose() {
data.disposeAudio();
super.dispose();
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
params = ModalRoute.of(context)!.settings.arguments as ChatDetailedScreenParams; params = ModalRoute.of(context)!.settings.arguments as ChatDetailedScreenParams;
@ -73,6 +80,7 @@ class _ChatDetailScreenState extends State<ChatDetailScreen> {
loadMore: false, loadMore: false,
isNewChat: params!.isNewChat!, isNewChat: params!.isNewChat!,
); );
data.initAudio();
} }
return Scaffold( return Scaffold(
@ -181,62 +189,140 @@ class _ChatDetailScreenState extends State<ChatDetailScreen> {
height: 1, height: 1,
color: MyColors.lightGreyEFColor, color: MyColors.lightGreyEFColor,
), ),
TextField( if (m.isRecoding)
controller: m.message, Column(
decoration: InputDecoration( children: <Widget>[
hintText: m.isFileSelected ? m.selectedFile.path.split("/").last : LocaleKeys.typeheretoreply.tr(), Row(
hintStyle: TextStyle(color: m.isFileSelected ? MyColors.darkTextColor : MyColors.grey98Color, fontSize: 14), children: [
border: InputBorder.none, Text(m.buildTimer()).paddingAll(10),
focusedBorder: InputBorder.none, if (m.isRecoding && m.isPlaying)
enabledBorder: InputBorder.none, WaveBubble(
errorBorder: InputBorder.none, playerController: m.playerController,
disabledBorder: InputBorder.none, onTap: () {
filled: true, m.playOrPause();
fillColor: MyColors.white, },
contentPadding: const EdgeInsets.only( isPlaying: m.playerController.playerState == PlayerState.playing)
left: 21, .expanded
top: 20, else
bottom: 20, AudioWaveforms(
), waveStyle: const WaveStyle(
prefixIconConstraints: const BoxConstraints(), waveColor: MyColors.lightGreenColor,
prefixIcon: m.sFileType.isNotEmpty middleLineColor: Colors.transparent,
? SvgPicture.asset(m.getType(m.sFileType), height: 30, width: 22, alignment: Alignment.center, fit: BoxFit.cover).paddingOnly(left: 21, right: 15) extendWaveform: true,
: null, showBottom: true,
suffixIcon: SizedBox( showTop: true,
width: 100, waveThickness: 2,
child: Row( showMiddleLine: false,
mainAxisAlignment: MainAxisAlignment.end, middleLineThickness: 0,
crossAxisAlignment: CrossAxisAlignment.center, // added line
children: <Widget>[
if (m.sFileType.isNotEmpty)
Row(
children: <Widget>[
const Icon(Icons.cancel, size: 15, color: MyColors.redA3Color).paddingOnly(right: 5),
("Clear").toText11(color: MyColors.redA3Color, isUnderLine: true).paddingOnly(left: 0),
],
).onPress(() => m.removeAttachment()).paddingOnly(right: 25),
if (m.sFileType.isEmpty)
RotationTransition(
turns: const AlwaysStoppedAnimation(45 / 360),
child: const Icon(Icons.attach_file_rounded, size: 26, color: MyColors.grey3AColor).onPress(
() => m.selectImageToUpload(context),
), ),
).paddingOnly(right: 25), padding: const EdgeInsets.all(5),
SvgPicture.asset("assets/icons/chat/chat_send_icon.svg", height: 26, width: 26).onPress( shouldCalculateScrolledPosition: false,
margin: EdgeInsets.zero,
size: const Size(double.infinity, 30.0),
recorderController: m.recorderController,
backgroundColor: Colors.white,
).expanded,
],
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
const Icon(
Icons.delete_outlined,
size: 26,
color: MyColors.lightGreenColor,
).paddingAll(10).onPress(() {
m.deleteRecoding();
}),
if (m.isPause)
const Icon(
Icons.mic,
size: 26,
color: MyColors.lightGreenColor,
).paddingOnly(right: 15).onPress(() {
m.resumeRecoding();
}),
if (!m.isPause)
const Icon(
Icons.pause_circle_outline,
size: 26,
color: MyColors.lightGreenColor,
).paddingOnly(right: 15).onPress(() {
m.pauseRecoding();
}),
SvgPicture.asset("assets/icons/chat/chat_send_icon.svg", height: 26, width: 26)
.onPress(
() => m.sendChatMessage(context,
targetUserId: params!.chatUser!.id!,
userStatus: params!.chatUser!.userStatus ?? 0,
userEmail: params!.chatUser!.email!,
targetUserName: params!.chatUser!.userName!),
)
.paddingOnly(right: 21),
],
),
],
).objectContainerView(disablePadding: true, radius: 0),
if (!m.isRecoding)
Row(
children: [
TextField(
controller: m.message,
decoration: InputDecoration(
hintText: m.isFileSelected ? m.selectedFile.path.split("/").last : LocaleKeys.typeheretoreply.tr(),
hintStyle: TextStyle(color: m.isFileSelected ? MyColors.darkTextColor : MyColors.grey98Color, fontSize: 14),
border: InputBorder.none,
focusedBorder: InputBorder.none,
enabledBorder: InputBorder.none,
errorBorder: InputBorder.none,
disabledBorder: InputBorder.none,
filled: true,
fillColor: MyColors.white,
contentPadding: const EdgeInsets.only(
left: 21,
top: 20,
bottom: 20,
),
prefixIconConstraints: const BoxConstraints(),
prefixIcon: m.sFileType.isNotEmpty
? SvgPicture.asset(m.getType(m.sFileType), height: 30, width: 22, alignment: Alignment.center, fit: BoxFit.cover).paddingOnly(left: 21, right: 15)
: null,
),
onChanged: (val) {
m.userTypingInvoke(currentUser: AppState().chatDetails!.response!.id!, reciptUser: params!.chatUser!.id!);
},
).expanded,
if (m.sFileType.isNotEmpty)
Row(
children: <Widget>[
const Icon(Icons.cancel, size: 15, color: MyColors.redA3Color).paddingOnly(right: 5),
("Clear").toText11(color: MyColors.redA3Color, isUnderLine: true).paddingOnly(left: 0),
],
).onPress(() => m.removeAttachment()).paddingOnly(right: 15),
if (m.sFileType.isEmpty)
RotationTransition(
turns: const AlwaysStoppedAnimation(45 / 360),
child: const Icon(Icons.attach_file_rounded, size: 26, color: MyColors.grey3AColor).onPress(
() => m.selectImageToUpload(context),
),
).paddingOnly(right: 15),
Icon(
Icons.mic,
color: MyColors.lightGreenColor,
).paddingOnly(right: 15).onPress(() {
m.startRecoding();
}),
SvgPicture.asset("assets/icons/chat/chat_send_icon.svg", height: 26, width: 26)
.onPress(
() => m.sendChatMessage(context, () => m.sendChatMessage(context,
targetUserId: params!.chatUser!.id!, targetUserId: params!.chatUser!.id!,
userStatus: params!.chatUser!.userStatus ?? 0, userStatus: params!.chatUser!.userStatus ?? 0,
userEmail: params!.chatUser!.email!, userEmail: params!.chatUser!.email!,
targetUserName: params!.chatUser!.userName!), targetUserName: params!.chatUser!.userName!),
), )
], .paddingOnly(right: 21),
), ],
).paddingOnly(right: 21), ).objectContainerView(disablePadding: true, radius: 0),
),
onChanged: (val) {
m.userTypingInvoke(currentUser: AppState().chatDetails!.response!.id!, reciptUser: params!.chatUser!.id!);
},
),
], ],
)); ));
}, },

@ -4,7 +4,6 @@ import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mohem_flutter_app/api/leave_balance_api_client.dart'; import 'package:mohem_flutter_app/api/leave_balance_api_client.dart';
import 'package:mohem_flutter_app/app_state/app_state.dart';
import 'package:mohem_flutter_app/classes/date_uitl.dart'; import 'package:mohem_flutter_app/classes/date_uitl.dart';
import 'package:mohem_flutter_app/classes/utils.dart'; import 'package:mohem_flutter_app/classes/utils.dart';
import 'package:mohem_flutter_app/config/routes.dart'; import 'package:mohem_flutter_app/config/routes.dart';
@ -25,8 +24,7 @@ import 'package:mohem_flutter_app/widgets/button/default_button.dart';
import 'package:mohem_flutter_app/widgets/dynamic_forms/dynamic_textfield_widget.dart'; import 'package:mohem_flutter_app/widgets/dynamic_forms/dynamic_textfield_widget.dart';
class AddLeaveBalanceScreen extends StatefulWidget { class AddLeaveBalanceScreen extends StatefulWidget {
final String selectedEmp; AddLeaveBalanceScreen({Key? key}) : super(key: key);
AddLeaveBalanceScreen({this.selectedEmp = '', Key? key}) : super(key: key);
@override @override
_AddLeaveBalanceScreenState createState() { _AddLeaveBalanceScreenState createState() {
@ -44,15 +42,21 @@ class _AddLeaveBalanceScreenState extends State<AddLeaveBalanceScreen> {
int? totalDays; int? totalDays;
String comment = ""; String comment = "";
ReplacementList? selectedReplacementEmployee; ReplacementList? selectedReplacementEmployee;
dynamic dynamicParams; String? selectedEmp;
String selectedEmp = "";
DateTime selectedDate = DateTime(DateTime.now().year, DateTime.now().month, DateTime.now().day); DateTime selectedDate = DateTime(DateTime.now().year, DateTime.now().month, DateTime.now().day);
@override @override
void initState() { void initState() {
super.initState(); super.initState();
//getAbsenceAttendanceTypes();
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
var dynamicParam = ModalRoute.of(context)!.settings.arguments;
if (dynamicParam != null) {
selectedEmp = dynamicParam.toString();
}
getAbsenceAttendanceTypes();
});
} }
void getAbsenceAttendanceTypes() async { void getAbsenceAttendanceTypes() async {
@ -85,7 +89,6 @@ class _AddLeaveBalanceScreenState extends State<AddLeaveBalanceScreen> {
Utils.showLoading(context); Utils.showLoading(context);
CalculateAbsenceDuration duration = await LeaveBalanceApiClient() CalculateAbsenceDuration duration = await LeaveBalanceApiClient()
.calculateAbsenceDuration(selectedAbsenceType!.aBSENCEATTENDANCETYPEID!, Utils.getMonthNamedFormat(startDateTime!), Utils.getMonthNamedFormat(endDateTime!), -999, empID: selectedEmp); .calculateAbsenceDuration(selectedAbsenceType!.aBSENCEATTENDANCETYPEID!, Utils.getMonthNamedFormat(startDateTime!), Utils.getMonthNamedFormat(endDateTime!), -999, empID: selectedEmp);
totalDays = duration.pABSENCEDAYS?.toInt(); totalDays = duration.pABSENCEDAYS?.toInt();
Utils.hideLoading(context); Utils.hideLoading(context);
setState(() {}); setState(() {});
@ -95,56 +98,57 @@ class _AddLeaveBalanceScreenState extends State<AddLeaveBalanceScreen> {
} }
} }
void validateAbsenceTransaction(selectedID) async { void validateAbsenceTransaction(String? selectedID) async {
try { try {
Utils.showLoading(context); Utils.showLoading(context);
Map<String, String?> dffDataMap = {}; Map<String, String?> dffDataMap = {};
for (int i = 1; i <= 20; i++) { for (int i = 1; i <= 20; i++) {
dffDataMap["P_ATTRIBUTE$i"] = null; dffDataMap["P_ATTRIBUTE$i"] = null;
for (int dffIndex = 0; dffIndex < getabsenceDffStructureList.length; dffIndex++) { for (int dffIndex = 0; dffIndex < getabsenceDffStructureList.length; dffIndex++) {
if ("ATTRIBUTE$i" == getabsenceDffStructureList[dffIndex].aPPLICATIONCOLUMNNAME) { if ("ATTRIBUTE$i" == getabsenceDffStructureList[dffIndex].aPPLICATIONCOLUMNNAME) {
if (getabsenceDffStructureList[dffIndex].fORMATTYPE == "X") { if (getabsenceDffStructureList[dffIndex].fORMATTYPE == "X") {
dffDataMap["P_ATTRIBUTE$i"] = dffDataMap["P_ATTRIBUTE$i"] =
getabsenceDffStructureList[dffIndex].eSERVICESDV!.pIDCOLUMNNAME != null ? Utils.formatDate(getabsenceDffStructureList[dffIndex].eSERVICESDV!.pIDCOLUMNNAME!) : ""; getabsenceDffStructureList[dffIndex].eSERVICESDV!.pIDCOLUMNNAME != null ? Utils.formatDate(getabsenceDffStructureList[dffIndex].eSERVICESDV!.pIDCOLUMNNAME!) : "";
} else { } else {
dffDataMap["P_ATTRIBUTE$i"] = getabsenceDffStructureList[dffIndex].eSERVICESDV?.pIDCOLUMNNAME; dffDataMap["P_ATTRIBUTE$i"] = getabsenceDffStructureList[dffIndex].eSERVICESDV?.pIDCOLUMNNAME;
}
break;
} }
break;
} }
} }
} await LeaveBalanceApiClient().validateAbsenceTransaction(
await LeaveBalanceApiClient().validateAbsenceTransaction( selectedAbsenceType!.dESCFLEXCONTEXTCODE!,
selectedAbsenceType!.dESCFLEXCONTEXTCODE!, "HR_LOA_SS",
"HR_LOA_SS", selectedAbsenceType!.aBSENCEATTENDANCETYPEID!,
selectedAbsenceType!.aBSENCEATTENDANCETYPEID!, selectedReplacementEmployee != null ? selectedReplacementEmployee!.userName! : "",
selectedReplacementEmployee != null ? selectedReplacementEmployee!.userName! : "", DateUtil.getFormattedDate(startDateTime!, "MM/dd/yyyy"),
DateUtil.getFormattedDate(startDateTime!, "MM/dd/yyyy"), DateUtil.getFormattedDate(endDateTime!, "MM/dd/yyyy"),
DateUtil.getFormattedDate(endDateTime!, "MM/dd/yyyy"), -999,
-999, dffDataMap,
dffDataMap, comments: comment,
comments: comment, empID: selectedID);
empID: selectedEmp);
SumbitAbsenceTransactionList submit = await LeaveBalanceApiClient().submitAbsenceTransaction( SumbitAbsenceTransactionList submit = await LeaveBalanceApiClient().submitAbsenceTransaction(
selectedAbsenceType!.dESCFLEXCONTEXTCODE!, selectedAbsenceType!.dESCFLEXCONTEXTCODE!,
"HR_LOA_SS", "HR_LOA_SS",
selectedAbsenceType!.aBSENCEATTENDANCETYPEID!, selectedAbsenceType!.aBSENCEATTENDANCETYPEID!,
selectedReplacementEmployee != null ? selectedReplacementEmployee!.userName! : "", selectedReplacementEmployee != null ? selectedReplacementEmployee!.userName! : "",
DateUtil.getFormattedDate(startDateTime!, "MM/dd/yyyy"), DateUtil.getFormattedDate(startDateTime!, "MM/dd/yyyy"),
DateUtil.getFormattedDate(endDateTime!, "MM/dd/yyyy"), DateUtil.getFormattedDate(endDateTime!, "MM/dd/yyyy"),
-999, -999,
dffDataMap, dffDataMap,
comments: comment, comments: comment,
empID: selectedEmp); empID: selectedID);
Utils.hideLoading(context); Utils.hideLoading(context);
var res = await Navigator.pushNamed(context, AppRoutes.requestSubmitScreen, arguments: RequestSubmitScreenParams(LocaleKeys.submit.tr(), submit.pTRANSACTIONID!, "", "add_leave_balance")); var res = await Navigator.pushNamed(context, AppRoutes.requestSubmitScreen,
if (res != null && res == true) { arguments: RequestSubmitScreenParams(LocaleKeys.submit.tr(), submit.pTRANSACTIONID!, "", "add_leave_balance", selectedEmployeeID: selectedID));
Utils.showLoading(context); if (res != null && res == true) {
} Utils.showLoading(context);
await LeaveBalanceApiClient().cancelHrTransaction(submit.pTRANSACTIONID!); }
Utils.hideLoading(context); await LeaveBalanceApiClient().cancelHrTransaction(submit.pTRANSACTIONID!);
Utils.hideLoading(context);
} catch (ex) { } catch (ex) {
Utils.hideLoading(context); Utils.hideLoading(context);
Utils.handleException(ex, context, null); Utils.handleException(ex, context, null);
@ -158,16 +162,6 @@ class _AddLeaveBalanceScreenState extends State<AddLeaveBalanceScreen> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
if (dynamicParams == null) {
dynamicParams = ModalRoute.of(context)!.settings.arguments;
if (dynamicParams!= null && dynamicParams.isNotEmpty) {
AppState().postParamsJson['P_SELECTED_EMPLOYEE_NUMBER'] = dynamicParams;
selectedEmp = dynamicParams;
getAbsenceAttendanceTypes();
} else {
getAbsenceAttendanceTypes();
}
}
return Scaffold( return Scaffold(
backgroundColor: Colors.white, backgroundColor: Colors.white,
appBar: AppBarWidget( appBar: AppBarWidget(
@ -187,13 +181,13 @@ class _AddLeaveBalanceScreenState extends State<AddLeaveBalanceScreen> {
isPopup: true, isPopup: true,
), ),
itemBuilder: (_) => <PopupMenuItem<int>>[ itemBuilder: (_) => <PopupMenuItem<int>>[
for (int i = 0; i < absenceList.length; i++) PopupMenuItem<int>(value: i, child: Text(absenceList[i].aBSENCEATTENDANCETYPENAME!)), for (int i = 0; i < (absenceList?.length ?? 0); i++) PopupMenuItem<int>(value: i, child: Text(absenceList![i].aBSENCEATTENDANCETYPENAME!)),
], ],
onSelected: (int popupIndex) { onSelected: (int popupIndex) {
if (selectedAbsenceType == absenceList[popupIndex]) { if (selectedAbsenceType == absenceList![popupIndex]) {
return; return;
} }
selectedAbsenceType = absenceList[popupIndex]; selectedAbsenceType = absenceList![popupIndex];
setState(() {}); setState(() {});
getAbsenceDffStructure(); getAbsenceDffStructure();
}, },

@ -1,7 +1,6 @@
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mohem_flutter_app/api/leave_balance_api_client.dart'; import 'package:mohem_flutter_app/api/leave_balance_api_client.dart';
import 'package:mohem_flutter_app/app_state/app_state.dart';
import 'package:mohem_flutter_app/classes/colors.dart'; import 'package:mohem_flutter_app/classes/colors.dart';
import 'package:mohem_flutter_app/classes/utils.dart'; import 'package:mohem_flutter_app/classes/utils.dart';
import 'package:mohem_flutter_app/config/routes.dart'; import 'package:mohem_flutter_app/config/routes.dart';
@ -14,8 +13,7 @@ import 'package:mohem_flutter_app/widgets/balances_dashboard_widget.dart';
import 'package:mohem_flutter_app/widgets/item_detail_view_widget.dart'; import 'package:mohem_flutter_app/widgets/item_detail_view_widget.dart';
class LeaveBalance extends StatefulWidget { class LeaveBalance extends StatefulWidget {
final String selectedEmp; LeaveBalance({Key? key}) : super(key: key);
LeaveBalance({this.selectedEmp = '', Key? key}) : super(key: key);
@override @override
_LeaveBalanceState createState() { _LeaveBalanceState createState() {
@ -27,13 +25,18 @@ class _LeaveBalanceState extends State<LeaveBalance> {
List<GetAbsenceTransactionList>? absenceTransList; List<GetAbsenceTransactionList>? absenceTransList;
DateTime accrualDateTime = DateTime.now(); DateTime accrualDateTime = DateTime.now();
dynamic dynamicParams; String? employeeId;
String selectedEmp = "";
@override @override
void initState() { void initState() {
super.initState(); super.initState();
absenceTransList = []; WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
var dynamicParam = ModalRoute.of(context)!.settings.arguments;
if (dynamicParam != null) {
employeeId = dynamicParam.toString();
}
getAbsenceTransactions();
});
} }
@override @override
@ -43,9 +46,9 @@ class _LeaveBalanceState extends State<LeaveBalance> {
void getAbsenceTransactions() async { void getAbsenceTransactions() async {
try { try {
// Utils.showLoading(context); Utils.showLoading(context);
absenceTransList = await LeaveBalanceApiClient().getAbsenceTransactions(-999, empID: selectedEmp); absenceTransList = await LeaveBalanceApiClient().getAbsenceTransactions(-999, employeeId);
//Utils.hideLoading(context); Utils.hideLoading(context);
setState(() {}); setState(() {});
} catch (ex) { } catch (ex) {
Utils.hideLoading(context); Utils.hideLoading(context);
@ -55,63 +58,53 @@ class _LeaveBalanceState extends State<LeaveBalance> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
if (dynamicParams == null) {
dynamicParams = ModalRoute.of(context)!.settings.arguments;
if (dynamicParams!= null && dynamicParams.isNotEmpty) {
AppState().postParamsJson['P_SELECTED_EMPLOYEE_NUMBER'] = dynamicParams;
selectedEmp = dynamicParams;
getAbsenceTransactions();
} else {
getAbsenceTransactions();
}
}
return Scaffold( return Scaffold(
backgroundColor: Colors.white, backgroundColor: Colors.white,
appBar: AppBarWidget( appBar: AppBarWidget(
context, context,
title: LocaleKeys.leaveBalance.tr(), title: LocaleKeys.leaveBalance.tr(),
), ),
body: ListView( body: absenceTransList == null
physics: const BouncingScrollPhysics(), ? const SizedBox()
padding: const EdgeInsets.all(21), : (absenceTransList!.isEmpty
children: [ ? Utils.getNoDataWidget(context).paddingOnly(top: 50)
BalancesDashboardWidget(LocaleKeys.currentLeaveBalance.tr(), true, selectedEmp), : ListView(
12.height, physics: const BouncingScrollPhysics(),
absenceTransList == null padding: const EdgeInsets.all(21),
? const SizedBox() children: [
: (absenceTransList!.isEmpty BalancesDashboardWidget(LocaleKeys.currentLeaveBalance.tr(), true, selectedEmp: employeeId),
? Utils.getNoDataWidget(context).paddingOnly(top: 50) 12.height,
: ListView.separated( ListView.separated(
physics: const NeverScrollableScrollPhysics(), physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true, shrinkWrap: true,
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
itemBuilder: (cxt, int index) => Column( itemBuilder: (cxt, int index) => Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
ItemDetailGrid( ItemDetailGrid(
ItemDetailViewCol(LocaleKeys.startDateT.tr(), absenceTransList![index].sTARTDATE ?? ""), ItemDetailViewCol(LocaleKeys.startDateT.tr(), absenceTransList![index].sTARTDATE ?? ""),
ItemDetailViewCol(LocaleKeys.endDateT.tr(), absenceTransList![index].eNDDATE ?? ""), ItemDetailViewCol(LocaleKeys.endDateT.tr(), absenceTransList![index].eNDDATE ?? ""),
), ),
ItemDetailGrid( ItemDetailGrid(
ItemDetailViewCol(LocaleKeys.absenceType.tr(), absenceTransList![index].aBSENCETYPE ?? ""), ItemDetailViewCol(LocaleKeys.absenceType.tr(), absenceTransList![index].aBSENCETYPE ?? ""),
ItemDetailViewCol(LocaleKeys.absenceCategory.tr(), absenceTransList![index].aBSENCECATEGORY ?? ""), ItemDetailViewCol(LocaleKeys.absenceCategory.tr(), absenceTransList![index].aBSENCECATEGORY ?? ""),
), ),
ItemDetailGrid( ItemDetailGrid(
ItemDetailViewCol(LocaleKeys.days.tr(), absenceTransList![index].aBSENCEDAYS?.toString() ?? ""), ItemDetailViewCol(LocaleKeys.days.tr(), absenceTransList![index].aBSENCEDAYS?.toString() ?? ""),
ItemDetailViewCol(LocaleKeys.hours.tr(), absenceTransList![index].aBSENCEHOURS?.toString() ?? ""), ItemDetailViewCol(LocaleKeys.hours.tr(), absenceTransList![index].aBSENCEHOURS?.toString() ?? ""),
), ),
ItemDetailGrid( ItemDetailGrid(
ItemDetailViewCol(LocaleKeys.approvalStatus.tr(), absenceTransList![index].aPPROVALSTATUS ?? ""), ItemDetailViewCol(LocaleKeys.approvalStatus.tr(), absenceTransList![index].aPPROVALSTATUS ?? ""),
ItemDetailViewCol(LocaleKeys.absenceStatus.tr(), absenceTransList![index].aBSENCESTATUS ?? ""), ItemDetailViewCol(LocaleKeys.absenceStatus.tr(), absenceTransList![index].aBSENCESTATUS ?? ""),
isItLast: true, isItLast: true,
), ),
], ],
).objectContainerView(), ).objectContainerView(),
separatorBuilder: (cxt, index) => 12.height, separatorBuilder: (cxt, index) => 12.height,
itemCount: absenceTransList!.length)), itemCount: absenceTransList!.length),
], ],
), )),
floatingActionButton: Container( floatingActionButton: Container(
height: 54, height: 54,
width: 54, width: 54,
@ -124,7 +117,7 @@ class _LeaveBalanceState extends State<LeaveBalance> {
), ),
child: const Icon(Icons.add, color: Colors.white, size: 30), child: const Icon(Icons.add, color: Colors.white, size: 30),
).onPress(() { ).onPress(() {
Navigator.pushNamed(context, AppRoutes.addLeaveBalance, arguments: selectedEmp ?? ''); Navigator.pushNamed(context, AppRoutes.addLeaveBalance, arguments: employeeId);
}), }),
); );
} }

@ -58,9 +58,9 @@ class _LoginScreenState extends State<LoginScreen> {
void initState() { void initState() {
super.initState(); super.initState();
// checkFirebaseToken(); // checkFirebaseToken();
if (kReleaseMode) { // if (kReleaseMode) {
checkDeviceSafety(); // checkDeviceSafety();
} // }
} }
void checkDeviceSafety() async { void checkDeviceSafety() async {

@ -102,8 +102,8 @@ class _NewPasswordScreenState extends State<NewPasswordScreen> {
passwordConstraintsUI(LocaleKeys.minimum8Characters.tr(), password.text.length >= 8), passwordConstraintsUI(LocaleKeys.minimum8Characters.tr(), password.text.length >= 8),
8.height, 8.height,
passwordConstraintsUI(LocaleKeys.doNotAddRepeatingLetters.tr(), checkRepeatedChars(password.text)), passwordConstraintsUI(LocaleKeys.doNotAddRepeatingLetters.tr(), checkRepeatedChars(password.text)),
8.height, // 8.height,
passwordConstraintsUI(LocaleKeys.itShouldContainSpecialCharacter.tr(), checkRegEx(r'[!@#$%^&*(),.?":{}|<>]')), // passwordConstraintsUI(LocaleKeys.itShouldContainSpecialCharacter.tr(), checkRegEx(r'[!@#$%^&*(),.?":{}|<>]')),
8.height, 8.height,
passwordConstraintsUI(LocaleKeys.confirmPasswordMustMatch.tr(), password.text.isNotEmpty && password.text == confirmPassword.text), passwordConstraintsUI(LocaleKeys.confirmPasswordMustMatch.tr(), password.text.isNotEmpty && password.text == confirmPassword.text),
], ],
@ -146,11 +146,11 @@ class _NewPasswordScreenState extends State<NewPasswordScreen> {
bool hasUppercase = password.contains(RegExp(r'[A-Z]')); bool hasUppercase = password.contains(RegExp(r'[A-Z]'));
bool hasDigits = password.contains(RegExp(r'[0-9]')); bool hasDigits = password.contains(RegExp(r'[0-9]'));
bool hasLowercase = password.contains(RegExp(r'[a-z]')); bool hasLowercase = password.contains(RegExp(r'[a-z]'));
bool hasSpecialCharacters = password.contains(RegExp(r'[!@#$%^&*(),.?":{}|<>]')); // bool hasSpecialCharacters = password.contains(RegExp(r'[!@#$%^&*(),.?":{}|<>]'));
bool hasMinLength = password.length >= minLength; bool hasMinLength = password.length >= minLength;
bool isMatched = password == confirmPassword.text; bool isMatched = password == confirmPassword.text;
return hasDigits && hasUppercase && hasLowercase && hasSpecialCharacters && hasMinLength && isMatched && checkRepeatedChars(password); return hasDigits && hasUppercase && hasLowercase && hasMinLength && isMatched && checkRepeatedChars(password);
} }
bool checkRepeatedChars(String password) { bool checkRepeatedChars(String password) {

@ -435,6 +435,7 @@ class MarathonProvider extends ChangeNotifier {
} }
bool checkIfPrivilegedForMarathon() { bool checkIfPrivilegedForMarathon() {
return true;
for (PrivilegeListModel element in AppState().privilegeListModel!) { for (PrivilegeListModel element in AppState().privilegeListModel!) {
if (element.serviceName == "Marathon") { if (element.serviceName == "Marathon") {
if (element.previlege != null) { if (element.previlege != null) {

@ -31,13 +31,13 @@ class RequestSubmitScreenParams {
int transactionId; int transactionId;
String pItemId; String pItemId;
String approvalFlag; String approvalFlag;
String? selectedEmployeeID;
RequestSubmitScreenParams(this.title, this.transactionId, this.pItemId, this.approvalFlag); RequestSubmitScreenParams(this.title, this.transactionId, this.pItemId, this.approvalFlag, {this.selectedEmployeeID});
} }
class RequestSubmitScreen extends StatefulWidget { class RequestSubmitScreen extends StatefulWidget {
final String selectedEmp; RequestSubmitScreen({Key? key}) : super(key: key);
RequestSubmitScreen({this.selectedEmp ='',Key? key}) : super(key: key);
@override @override
_RequestSubmitScreenState createState() { _RequestSubmitScreenState createState() {
@ -53,7 +53,7 @@ class _RequestSubmitScreenState extends State<RequestSubmitScreen> {
List<File> attachmentFiles = []; List<File> attachmentFiles = [];
List<String> attachments = []; List<String> attachments = [];
dynamic dynamicParams; dynamic dynamicParams;
String selectedEmp =""; String selectedEmp = "";
@override @override
void initState() { void initState() {
@ -64,7 +64,6 @@ class _RequestSubmitScreenState extends State<RequestSubmitScreen> {
try { try {
Utils.showLoading(context); Utils.showLoading(context);
approverList = await MyAttendanceApiClient().getApproversList("SSHRMS", params!.transactionId); approverList = await MyAttendanceApiClient().getApproversList("SSHRMS", params!.transactionId);
Utils.hideLoading(context); Utils.hideLoading(context);
setState(() {}); setState(() {});
} catch (ex) { } catch (ex) {
@ -123,12 +122,7 @@ class _RequestSubmitScreenState extends State<RequestSubmitScreen> {
params!.transactionId, params!.transactionId,
); );
} else if (params!.approvalFlag == 'add_leave_balance') { } else if (params!.approvalFlag == 'add_leave_balance') {
await LeaveBalanceApiClient().startAbsenceApprovalProcess( await LeaveBalanceApiClient().startAbsenceApprovalProcess(params!.transactionId, comments.text, -999, empID: params!.selectedEmployeeID);
params!.transactionId,
comments.text,
-999,
empID: widget.selectedEmp
);
} else if (params!.approvalFlag == 'eit') { } else if (params!.approvalFlag == 'eit') {
await MyAttendanceApiClient().startEitApprovalProcess( await MyAttendanceApiClient().startEitApprovalProcess(
"SUBMIT", "SUBMIT",

@ -5,7 +5,6 @@ import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mohem_flutter_app/api/leave_balance_api_client.dart'; import 'package:mohem_flutter_app/api/leave_balance_api_client.dart';
import 'package:mohem_flutter_app/api/my_attendance_api_client.dart'; import 'package:mohem_flutter_app/api/my_attendance_api_client.dart';
import 'package:mohem_flutter_app/app_state/app_state.dart';
import 'package:mohem_flutter_app/classes/utils.dart'; import 'package:mohem_flutter_app/classes/utils.dart';
import 'package:mohem_flutter_app/config/routes.dart'; import 'package:mohem_flutter_app/config/routes.dart';
import 'package:mohem_flutter_app/extensions/int_extensions.dart'; import 'package:mohem_flutter_app/extensions/int_extensions.dart';
@ -44,7 +43,6 @@ class _DynamicInputScreenState extends State<DynamicInputScreen> {
void getTransactionsStructure() async { void getTransactionsStructure() async {
try { try {
Utils.showLoading(context); Utils.showLoading(context);
genericResponseModel = await MyAttendanceApiClient().getEitDffStructure(dynamicParams!.dynamicId, dynamicParams!.selectedEmp); genericResponseModel = await MyAttendanceApiClient().getEitDffStructure(dynamicParams!.dynamicId, dynamicParams!.selectedEmp);
dESCFLEXCONTEXTCODE = genericResponseModel!.pDESCFLEXCONTEXTCODE ?? ""; dESCFLEXCONTEXTCODE = genericResponseModel!.pDESCFLEXCONTEXTCODE ?? "";
descFlexConTextTitle = genericResponseModel!.pDESCFLEXCONTEXTNAME ?? ""; descFlexConTextTitle = genericResponseModel!.pDESCFLEXCONTEXTNAME ?? "";
@ -92,9 +90,8 @@ class _DynamicInputScreenState extends State<DynamicInputScreen> {
values.add(ValidateEitTransactionModel(dATEVALUE: null, nAME: "PEI_EXTRA_INFO_ID", nUMBERVALUE: -1, tRANSACTIONNUMBER: 1, vARCHAR2VALUE: null).toJson()); values.add(ValidateEitTransactionModel(dATEVALUE: null, nAME: "PEI_EXTRA_INFO_ID", nUMBERVALUE: -1, tRANSACTIONNUMBER: 1, vARCHAR2VALUE: null).toJson());
values.add(ValidateEitTransactionModel(dATEVALUE: null, nAME: "PEI_OBJECT_VERSION_NUMBER", nUMBERVALUE: 0, tRANSACTIONNUMBER: 1, vARCHAR2VALUE: null).toJson()); values.add(ValidateEitTransactionModel(dATEVALUE: null, nAME: "PEI_OBJECT_VERSION_NUMBER", nUMBERVALUE: 0, tRANSACTIONNUMBER: 1, vARCHAR2VALUE: null).toJson());
genericResponseModel = await MyAttendanceApiClient().validateEitTransaction(dESCFLEXCONTEXTCODE, dynamicParams!.dynamicId, values, empID: dynamicParams!.selectedEmp ?? ''); genericResponseModel = await MyAttendanceApiClient().validateEitTransaction(dESCFLEXCONTEXTCODE, dynamicParams!.dynamicId, values, empID: dynamicParams!.selectedEmp);
SubmitEITTransactionList submitEITTransactionList = SubmitEITTransactionList submitEITTransactionList = await MyAttendanceApiClient().submitEitTransaction(dESCFLEXCONTEXTCODE, dynamicParams!.dynamicId, values, empID: dynamicParams!.selectedEmp);
await MyAttendanceApiClient().submitEitTransaction(dESCFLEXCONTEXTCODE, dynamicParams!.dynamicId, values, empID: dynamicParams!.selectedEmp ?? '');
Utils.hideLoading(context); Utils.hideLoading(context);
await Navigator.pushNamed(context, AppRoutes.requestSubmitScreen, await Navigator.pushNamed(context, AppRoutes.requestSubmitScreen,
arguments: RequestSubmitScreenParams(LocaleKeys.submit.tr(), submitEITTransactionList.pTRANSACTIONID!, submitEITTransactionList.pITEMKEY!, 'eit')); arguments: RequestSubmitScreenParams(LocaleKeys.submit.tr(), submitEITTransactionList.pTRANSACTIONID!, submitEITTransactionList.pITEMKEY!, 'eit'));
@ -131,7 +128,7 @@ class _DynamicInputScreenState extends State<DynamicInputScreen> {
.toList(); .toList();
List<ESERVICESVS> eServicesResponseModel = await MyAttendanceApiClient().getValueSetValues(segmentId, structureList.dESCFLEXCONTEXTCODE!, structureList.dESCFLEXNAME!, values, List<ESERVICESVS> eServicesResponseModel = await MyAttendanceApiClient().getValueSetValues(segmentId, structureList.dESCFLEXCONTEXTCODE!, structureList.dESCFLEXNAME!, values,
empID: dynamicParams!.selectedEmp ?? '', parentValue: structureList.eSERVICESDV!.pVALUECOLUMNNAME); empID: dynamicParams!.selectedEmp, parentValue: structureList.eSERVICESDV!.pVALUECOLUMNNAME);
List<GetEITDFFStructureList> abc = genericResponseModel?.getEITDFFStructureList ?? []; List<GetEITDFFStructureList> abc = genericResponseModel?.getEITDFFStructureList ?? [];
getEitDffStructureList = abc; getEitDffStructureList = abc;
int index = getEitDffStructureList!.indexWhere((element) => element.sEGMENTNAME == segmentId); int index = getEitDffStructureList!.indexWhere((element) => element.sEGMENTNAME == segmentId);
@ -191,7 +188,7 @@ class _DynamicInputScreenState extends State<DynamicInputScreen> {
// Utils.hideLoading(context); // Utils.hideLoading(context);
} }
} else if (values.isNotEmpty) { } else if (values.isNotEmpty) {
ESERVICESDV defaultValue = await MyAttendanceApiClient().getDefaultValue(segmentId, structureList.dESCFLEXCONTEXTCODE!, structureList.dESCFLEXNAME!, values); ESERVICESDV defaultValue = await MyAttendanceApiClient().getDefaultValue(segmentId, structureList.dESCFLEXCONTEXTCODE!, structureList.dESCFLEXNAME!, values, empID: dynamicParams!.selectedEmp);
int index = getEitDffStructureList!.indexWhere((element) => element.sEGMENTNAME == segmentId); int index = getEitDffStructureList!.indexWhere((element) => element.sEGMENTNAME == segmentId);
getEitDffStructureList![index].eSERVICESDV = defaultValue; getEitDffStructureList![index].eSERVICESDV = defaultValue;
} }
@ -431,9 +428,6 @@ class _DynamicInputScreenState extends State<DynamicInputScreen> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
if (dynamicParams == null) { if (dynamicParams == null) {
dynamicParams = ModalRoute.of(context)!.settings.arguments as DynamicListViewParams; dynamicParams = ModalRoute.of(context)!.settings.arguments as DynamicListViewParams;
if (dynamicParams!.selectedEmp.isNotEmpty) {
AppState().postParamsJson['P_SELECTED_EMPLOYEE_NUMBER'] = dynamicParams!.selectedEmp;
}
getTransactionsStructure(); getTransactionsStructure();
} }
return Scaffold( return Scaffold(
@ -627,12 +621,15 @@ class _DynamicInputScreenState extends State<DynamicInputScreen> {
).paddingOnly(bottom: 12), ).paddingOnly(bottom: 12),
itemBuilder: (_) => <PopupMenuItem<int>>[ itemBuilder: (_) => <PopupMenuItem<int>>[
if (model.rEADONLY != "Y") if (model.rEADONLY != "Y")
for (int i = 0; i < model.eSERVICESVS!.length; i++) PopupMenuItem<int>(value: i, child: Column( for (int i = 0; i < model.eSERVICESVS!.length; i++)
children: [ PopupMenuItem<int>(
Text(model.eSERVICESVS![i].vALUECOLUMNNAME!), value: i,
const PopupMenuDivider(), child: Column(
], children: [
)), Text(model.eSERVICESVS![i].vALUECOLUMNNAME!),
const PopupMenuDivider(),
],
)),
], ],
onSelected: (int popipIndex) async { onSelected: (int popipIndex) async {
ESERVICESDV eservicesdv = ESERVICESDV( ESERVICESDV eservicesdv = ESERVICESDV(

@ -21,10 +21,10 @@ class DynamicListViewParams {
bool isUpdate; bool isUpdate;
List<CollectionNotificationEit>? collectionNotificationList; List<CollectionNotificationEit>? collectionNotificationList;
final String selectedEmp; final String? selectedEmp;
DynamicListViewParams(this.title, this.dynamicId, DynamicListViewParams(this.title, this.dynamicId,
{this.selectedEmp = '', this.uRL = 'GET_EIT_DFF_STRUCTURE', this.requestID = '', this.colsURL = '', this.isUpdate = false, this.collectionNotificationList}); {this.selectedEmp, this.uRL = 'GET_EIT_DFF_STRUCTURE', this.requestID = '', this.colsURL = '', this.isUpdate = false, this.collectionNotificationList});
} }
class DynamicListViewScreen extends StatefulWidget { class DynamicListViewScreen extends StatefulWidget {
@ -54,7 +54,6 @@ class _DynamicListViewScreenState extends State<DynamicListViewScreen> {
getEITTransactionList?.forEach((element) { getEITTransactionList?.forEach((element) {
element.collectionTransaction = element.collectionTransaction?.where((elemen) => elemen.dISPLAYFLAG == "Y").toList() ?? []; element.collectionTransaction = element.collectionTransaction?.where((elemen) => elemen.dISPLAYFLAG == "Y").toList() ?? [];
}); });
getEITTransactionList = getEITTransactionList?.where((element) => element.collectionTransaction?.isNotEmpty ?? false).toList() ?? []; getEITTransactionList = getEITTransactionList?.where((element) => element.collectionTransaction?.isNotEmpty ?? false).toList() ?? [];
Utils.hideLoading(context); Utils.hideLoading(context);
setState(() {}); setState(() {});
@ -94,7 +93,7 @@ class _DynamicListViewScreenState extends State<DynamicListViewScreen> {
padding: const EdgeInsets.all(21), padding: const EdgeInsets.all(21),
children: [ children: [
// HMG_TKT_NEW_EIT_SS Id used for ticket balance dashboard // HMG_TKT_NEW_EIT_SS Id used for ticket balance dashboard
if (isTicketRequest) ...[const BalancesDashboardWidget("Current Ticket Balance", false, ""), 12.height], if (isTicketRequest) ...[const BalancesDashboardWidget("Current Ticket Balance", false, showLoading: false), 12.height],
getEITTransactionList == null getEITTransactionList == null
? const SizedBox() ? const SizedBox()
: (getEITTransactionList!.isEmpty : (getEITTransactionList!.isEmpty

@ -17,9 +17,10 @@ import 'package:provider/provider.dart';
class ServicesMenuListScreenParams { class ServicesMenuListScreenParams {
final String title; final String title;
final List<GetMenuEntriesList> list; final List<GetMenuEntriesList> list;
final String selectedEmp; final String? selectedEmp;
GetEmployeeSubordinatesList? getEmployeeSubordinates; GetEmployeeSubordinatesList? getEmployeeSubordinates;
ServicesMenuListScreenParams(this.title, this.list, {this.selectedEmp =''});
ServicesMenuListScreenParams(this.title, this.list, {this.selectedEmp});
} }
class ServicesMenuListScreen extends StatelessWidget { class ServicesMenuListScreen extends StatelessWidget {
@ -54,11 +55,12 @@ class ServicesMenuListScreen extends StatelessWidget {
} }
return; return;
} else if (servicesMenuData.list[index].requestType == "ABSENCE") { } else if (servicesMenuData.list[index].requestType == "ABSENCE") {
Navigator.pushNamed(context, AppRoutes.leaveBalance, arguments: servicesMenuData?.selectedEmp ??''); Navigator.pushNamed(context, AppRoutes.leaveBalance, arguments: servicesMenuData.selectedEmp);
return; return;
} }
if (servicesMenuData.list[index].requestType == "EIT") { if (servicesMenuData.list[index].requestType == "EIT") {
Navigator.pushNamed(context, AppRoutes.dynamicScreen, arguments: DynamicListViewParams(servicesMenuData.list[index].prompt!, servicesMenuData.list[index].functionName!, selectedEmp: servicesMenuData.selectedEmp)); Navigator.pushNamed(context, AppRoutes.dynamicScreen,
arguments: DynamicListViewParams(servicesMenuData.list[index].prompt!, servicesMenuData.list[index].functionName!, selectedEmp: servicesMenuData.selectedEmp));
} else { } else {
if (servicesMenuData.list[index].requestType == "TERMINATION") { if (servicesMenuData.list[index].requestType == "TERMINATION") {
Navigator.pushNamed(context, AppRoutes.endEmploymentScreen, Navigator.pushNamed(context, AppRoutes.endEmploymentScreen,

@ -38,13 +38,13 @@ class _CreateRequestState extends State<CreateRequest> {
@override @override
void initState() { void initState() {
super.initState(); super.initState();
employeeSubRequest(); // employeeSubRequest();
} }
void employeeSubRequest() async { void employeeSubRequest() async {
try { try {
Utils.showLoading(context); Utils.showLoading(context);
getEmployeeSubordinatesList = await MyTeamApiClient().getEmployeeSubordinates(searchEmpEmail.toString(), searchEmpName.toString(), searchEmpNo.toString()); // getEmployeeSubordinatesList = await MyTeamApiClient().getEmployeeSubordinates(searchEmpEmail.toString(), searchEmpName.toString(), searchEmpNo.toString());
getMenuEntriesList = await MyTeamApiClient().employeeSubordinatesRequest(getEmployeeSubordinates?.eMPLOYEENUMBER); getMenuEntriesList = await MyTeamApiClient().employeeSubordinatesRequest(getEmployeeSubordinates?.eMPLOYEENUMBER);
homeMenus = parseMenus(getMenuEntriesList); homeMenus = parseMenus(getMenuEntriesList);
Utils.hideLoading(context); Utils.hideLoading(context);
@ -68,7 +68,8 @@ class _CreateRequestState extends State<CreateRequest> {
void handleOnPress(context, Menus menu) { void handleOnPress(context, Menus menu) {
if (menu.menuEntry.menuEntryType == "FUNCTION") { if (menu.menuEntry.menuEntryType == "FUNCTION") {
if (menu.menuEntry.requestType == "EIT") { if (menu.menuEntry.requestType == "EIT") {
Navigator.pushNamed(context, AppRoutes.dynamicScreen, arguments: DynamicListViewParams(menu.menuEntry.prompt!, menu.menuEntry.functionName!, selectedEmp: getEmployeeSubordinates?.eMPLOYEENUMBER ?? '')); Navigator.pushNamed(context, AppRoutes.dynamicScreen,
arguments: DynamicListViewParams(menu.menuEntry.prompt!, menu.menuEntry.functionName!, selectedEmp: getEmployeeSubordinates?.eMPLOYEENUMBER ?? ''));
} else {} } else {}
} else { } else {
Navigator.pushNamed(context, AppRoutes.servicesMenuListScreen, Navigator.pushNamed(context, AppRoutes.servicesMenuListScreen,
@ -79,8 +80,10 @@ class _CreateRequestState extends State<CreateRequest> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
getEmployeeSubordinates ??= ModalRoute.of(context)?.settings.arguments as GetEmployeeSubordinatesList; if (getEmployeeSubordinates == null) {
getEmployeeSubordinates ??= ModalRoute.of(context)?.settings.arguments as GetEmployeeSubordinatesList;
employeeSubRequest();
}
return Scaffold( return Scaffold(
backgroundColor: Colors.white, backgroundColor: Colors.white,
appBar: AppBarWidget( appBar: AppBarWidget(

@ -67,23 +67,25 @@ class _EmployeeDetailsState extends State<EmployeeDetails> {
} }
return Scaffold( return Scaffold(
extendBody: true, extendBody: true,
backgroundColor: MyColors.lightGreyEFColor, backgroundColor: MyColors.lightGreyEFColor,
body: Stack(children: [ body: Stack(
getEmployeeSubordinates!.eMPLOYEEIMAGE != null ? children: [
Container( getEmployeeSubordinates!.eMPLOYEEIMAGE != null
height: 200, ? Container(
margin: EdgeInsets.only(top: 30), height: 200,
decoration: BoxDecoration(image: DecorationImage(image: MemoryImage(Utils.dataFromBase64String(getEmployeeSubordinates!.eMPLOYEEIMAGE!)), fit: BoxFit.cover)), margin: const EdgeInsets.only(top: 30),
child: new BackdropFilter( decoration: BoxDecoration(image: DecorationImage(image: MemoryImage(Utils.dataFromBase64String(getEmployeeSubordinates!.eMPLOYEEIMAGE!)), fit: BoxFit.cover)),
filter: new ImageFilter.blur(sigmaX: 10.0, sigmaY: 10.0), child: BackdropFilter(
child: new Container( filter: ImageFilter.blur(sigmaX: 10.0, sigmaY: 10.0),
decoration: new BoxDecoration(color: Colors.white.withOpacity(0.0)), child: Container(
), decoration: BoxDecoration(color: Colors.white.withOpacity(0.0)),
), ),
) : Container( ),
decoration: BoxDecoration(color: Colors.white.withOpacity(0.0)), )
), : Container(
decoration: BoxDecoration(color: Colors.white.withOpacity(0.0)),
),
SingleChildScrollView( SingleChildScrollView(
scrollDirection: Axis.vertical, scrollDirection: Axis.vertical,
child: Column( child: Column(
@ -95,15 +97,13 @@ class _EmployeeDetailsState extends State<EmployeeDetails> {
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
children: [ children: [
IconButton( CircleAvatar(
onPressed: () { radius: 18,
Navigator.pop(context); backgroundColor: Colors.black.withOpacity(.21),
}, child: const Icon(Icons.arrow_back_ios_rounded, color: Colors.white, size: 18).paddingOnly(right: 4),
icon: Icon( ).onPress(() {
Icons.arrow_back_ios, Navigator.pop(context);
color: Colors.white, }),
),
),
], ],
), ),
), ),
@ -111,7 +111,9 @@ class _EmployeeDetailsState extends State<EmployeeDetails> {
], ],
), ),
) )
])); ],
),
);
} }
Widget myTeamInfo() { Widget myTeamInfo() {
@ -202,16 +204,8 @@ class _EmployeeDetailsState extends State<EmployeeDetails> {
} }
Widget ProfileImage() => getEmployeeSubordinates?.eMPLOYEEIMAGE == null Widget ProfileImage() => getEmployeeSubordinates?.eMPLOYEEIMAGE == null
? SvgPicture.asset( ? SvgPicture.asset("assets/images/user.svg", height: 68, width: 68)
"assets/images/user.svg", : CircleAvatar(radius: 68, backgroundImage: MemoryImage(Utils.getPostBytes(getEmployeeSubordinates?.eMPLOYEEIMAGE)), backgroundColor: Colors.black);
height: 68,
width: 68,
)
: CircleAvatar(
radius: 68,
backgroundImage: MemoryImage(Utils.getPostBytes(getEmployeeSubordinates?.eMPLOYEEIMAGE)),
backgroundColor: Colors.black,
);
void setMenu() { void setMenu() {
menu = [ menu = [
@ -256,16 +250,17 @@ class _EmployeeDetailsState extends State<EmployeeDetails> {
child: Column( child: Column(
children: [ children: [
Text(LocaleKeys.addFavoriteList).tr(namedArgs: {'name': '${getEmployeeSubordinates!.eMPLOYEENAME}'}), Text(LocaleKeys.addFavoriteList).tr(namedArgs: {'name': '${getEmployeeSubordinates!.eMPLOYEENAME}'}),
getEmployeeSubordinates!.eMPLOYEEIMAGE == null getEmployeeSubordinates!.eMPLOYEEIMAGE == null
? SvgPicture.asset( ? SvgPicture.asset(
"assets/images/user.svg", "assets/images/user.svg",
height: 68, height: 68,
width: 68,) width: 68,
: CircleAvatar( )
radius: 68, : CircleAvatar(
backgroundImage: MemoryImage(Utils.dataFromBase64String(getEmployeeSubordinates!.eMPLOYEEIMAGE!)), radius: 68,
backgroundColor: Colors.black, backgroundImage: MemoryImage(Utils.dataFromBase64String(getEmployeeSubordinates!.eMPLOYEEIMAGE!)),
), backgroundColor: Colors.black,
),
// Image.memory( // Image.memory(
// Utils.getPostBytes( // Utils.getPostBytes(
// getEmployeeSubordinates!.eMPLOYEEIMAGE ?? "", // getEmployeeSubordinates!.eMPLOYEEIMAGE ?? "",

@ -15,6 +15,7 @@ import 'package:url_launcher/url_launcher.dart';
class TeamMembers extends StatefulWidget { class TeamMembers extends StatefulWidget {
final String? selectedEmp; final String? selectedEmp;
const TeamMembers({this.selectedEmp, Key? key}) : super(key: key); const TeamMembers({this.selectedEmp, Key? key}) : super(key: key);
@override @override
@ -22,8 +23,8 @@ class TeamMembers extends StatefulWidget {
} }
class _TeamMembersState extends State<TeamMembers> { class _TeamMembersState extends State<TeamMembers> {
String searchEmpEmail =""; String searchEmpEmail = "";
String searchEmpName =""; String searchEmpName = "";
String searchEmpNo = ""; String searchEmpNo = "";
String? empId; String? empId;
@ -32,14 +33,14 @@ class _TeamMembersState extends State<TeamMembers> {
void initState() { void initState() {
super.initState(); super.initState();
employeeSubordinates(); // employeeSubordinates();
} }
void employeeSubordinates() async { void employeeSubordinates() async {
try { try {
Utils.showLoading(context); Utils.showLoading(context);
getEmployeeSubordinatesList = await MyTeamApiClient().getEmployeeSubordinates(searchEmpEmail.toString(), searchEmpName.toString(), searchEmpNo.toString()); // getEmployeeSubordinatesList = await MyTeamApiClient().getEmployeeSubordinates(searchEmpEmail.toString(), searchEmpName.toString(), searchEmpNo.toString());
getEmployeeSubordinatesList = await MyTeamApiClient().employeeSubordinates(searchEmpEmail.toString(), searchEmpName.toString(), searchEmpNo.toString(),getEmployeeSubordinates?.eMPLOYEENUMBER); getEmployeeSubordinatesList = await MyTeamApiClient().employeeSubordinates(searchEmpEmail.toString(), searchEmpName.toString(), searchEmpNo.toString(), getEmployeeSubordinates?.eMPLOYEENUMBER);
Utils.hideLoading(context); Utils.hideLoading(context);
setState(() {}); setState(() {});
} catch (ex) { } catch (ex) {
@ -50,82 +51,88 @@ class _TeamMembersState extends State<TeamMembers> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
getEmployeeSubordinates ??= ModalRoute.of(context)?.settings.arguments as GetEmployeeSubordinatesList; if (getEmployeeSubordinates == null) {
getEmployeeSubordinates ??= ModalRoute.of(context)?.settings.arguments as GetEmployeeSubordinatesList;
employeeSubordinates();
}
return Scaffold( return Scaffold(
appBar: AppBarWidget( appBar: AppBarWidget(
context, context,
title: LocaleKeys.teamMembers.tr(), title: LocaleKeys.teamMembers.tr(),
),
backgroundColor: MyColors.backgroundColor,
body: SingleChildScrollView(
scrollDirection: Axis.vertical,
child: Column(
children: <Widget>[
getEmployeeSubordinatesList.isEmpty
? Container(margin: const EdgeInsets.only(top: 100), child: Utils.getNoDataWidget(context))
: ListView.separated(
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
padding: const EdgeInsets.only(top: 12),
separatorBuilder: (BuildContext cxt, int index) => 12.height,
itemCount: getEmployeeSubordinatesList.length,
itemBuilder: (BuildContext context, int index) {
var phoneNumber = Uri.parse('tel:${getEmployeeSubordinatesList[index].eMPLOYEEMOBILENUMBER}');
return InkWell(
onTap: () async {
Navigator.pushNamed(context, AppRoutes.employeeDetails, arguments: getEmployeeSubordinatesList[index]);
},
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
getEmployeeSubordinatesList[index].eMPLOYEEIMAGE == null
? SvgPicture.asset(
"assets/images/user.svg",
height: 34,
width: 34,
).paddingOnly(top: 4)
: Container(
height: 34,
width: 34,
child: CircleAvatar(
radius: 25,
backgroundImage: MemoryImage(Utils.dataFromBase64String(getEmployeeSubordinatesList[index].eMPLOYEEIMAGE!)),
backgroundColor: Colors.black,
).paddingOnly(top: 4),
),
9.width,
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// "Present".toText13(color: MyColors.greenColor),
"${getEmployeeSubordinatesList[index].eMPLOYEENAME}".toText16(color: MyColors.grey3AColor),
"${getEmployeeSubordinatesList[index].pOSITIONNAME}".toText10(color: MyColors.grey57Color),
],
).expanded,
Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.end,
children: [
getEmployeeSubordinatesList[index].eMPLOYEEMOBILENUMBER == ""
? SvgPicture.asset("assets/images/call-disable.svg", width: 22, height: 22)
: InkWell(
onTap: () {
launchUrl(phoneNumber);
},
child: SvgPicture.asset("assets/images/call.svg", width: 22, height: 22),
),
8.height,
const Icon(
Icons.arrow_forward_outlined,
color: MyColors.grey3AColor,
size: 18,
),
],
),
],
).paddingOnly(top: 13, bottom: 13, right: 12, left: 14).objectContainerView(radius: 10, disablePadding: true),
).paddingOnly(left: 16.0, right: 16.0);
}),
],
), ),
backgroundColor: MyColors.backgroundColor, ),
body: SingleChildScrollView( );
scrollDirection: Axis.vertical,
child: Column(
children: <Widget>[
getEmployeeSubordinatesList.isEmpty
? Container(
margin: const EdgeInsets.only(top: 100),
child: Utils.getNoDataWidget(context)):
ListView.separated(
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
padding: const EdgeInsets.only(top: 12),
separatorBuilder: (BuildContext cxt,int index) => 12.height,
itemCount: getEmployeeSubordinatesList.length,
itemBuilder: (BuildContext context, int index) {
var phoneNumber = Uri.parse('tel:${getEmployeeSubordinatesList[index].eMPLOYEEMOBILENUMBER}');
return InkWell(
onTap: () async {
Navigator.pushNamed(context, AppRoutes.employeeDetails, arguments: getEmployeeSubordinatesList[index]);
},
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
getEmployeeSubordinatesList[index].eMPLOYEEIMAGE == null
? SvgPicture.asset("assets/images/user.svg",height: 34, width: 34, ).paddingOnly(top: 4)
: Container(
height: 34,
width: 34,
child: CircleAvatar(
radius: 25,
backgroundImage: MemoryImage(Utils.dataFromBase64String(getEmployeeSubordinatesList[index].eMPLOYEEIMAGE!)),
backgroundColor: Colors.black,
).paddingOnly(top: 4),
),
9.width,
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// "Present".toText13(color: MyColors.greenColor),
"${getEmployeeSubordinatesList[index].eMPLOYEENAME}".toText16(color: MyColors.grey3AColor),
"${getEmployeeSubordinatesList[index].pOSITIONNAME}".toText10( color: MyColors.grey57Color),
],
).expanded,
Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.end,
children: [
getEmployeeSubordinatesList[index].eMPLOYEEMOBILENUMBER == ""
? SvgPicture.asset("assets/images/call-disable.svg", width: 22, height: 22)
:InkWell(
onTap: () {
launchUrl(phoneNumber);
},
child: SvgPicture.asset("assets/images/call.svg", width: 22, height: 22),
),
8.height,
const Icon(
Icons.arrow_forward_outlined,
color: MyColors.grey3AColor,
size: 18,
),
],
),
],
).paddingOnly(top: 13, bottom: 13, right: 12, left: 14).objectContainerView(radius: 10, disablePadding: true),
);
}),
],
)
));
} }
} }

@ -21,29 +21,30 @@ class PersonalInfo extends StatelessWidget {
title: LocaleKeys.profile_personalInformation.tr(), title: LocaleKeys.profile_personalInformation.tr(),
), ),
backgroundColor: MyColors.backgroundColor, backgroundColor: MyColors.backgroundColor,
body: SizedBox( body: ListView(
width: MediaQuery.of(context).size.width, children: [
child: Column( Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
// mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
children: [ children: [
LocaleKeys.category.tr().toText13(color: MyColors.lightGrayColor), LocaleKeys.category.tr().toText13(color: MyColors.lightGrayColor),
(memberInformationList.eMPLOYMENTCATEGORYMEANING ?? "").toText16(), (memberInformationList.eMPLOYMENTCATEGORYMEANING ?? "").toText16(),
20.height, 12.height,
LocaleKeys.address.tr().toText13(color: MyColors.lightGrayColor), LocaleKeys.address.tr().toText13(color: MyColors.lightGrayColor),
(memberInformationList.lOCATIONNAME ?? "").toText16(), (memberInformationList.lOCATIONNAME ?? "").toText16(),
20.height, 12.height,
LocaleKeys.phoneNumber.tr().toText13(color: MyColors.lightGrayColor), LocaleKeys.phoneNumber.tr().toText13(color: MyColors.lightGrayColor),
(memberInformationList.eMPLOYEEMOBILENUMBER ?? "").toText16(), (memberInformationList.eMPLOYEEMOBILENUMBER ?? "").toText16(),
20.height, 12.height,
LocaleKeys.businessGroup.tr().toText13(color: MyColors.lightGrayColor), LocaleKeys.businessGroup.tr().toText13(color: MyColors.lightGrayColor),
(memberInformationList.bUSINESSGROUPNAME ?? "").toText16(), (memberInformationList.bUSINESSGROUPNAME ?? "").toText16(),
20.height, 12.height,
LocaleKeys.Payroll.tr().toText13(color: MyColors.lightGrayColor), LocaleKeys.Payroll.tr().toText13(color: MyColors.lightGrayColor),
(memberInformationList.pAYROLLNAME ?? "").toText16(), (memberInformationList.pAYROLLNAME ?? "").toText16(),
], ],
).objectContainerView().paddingAll(21), ).objectContainerView(center: false).paddingAll(21),
],
), ),
); );
} }

@ -1,4 +1,3 @@
import 'dart:convert';
import 'dart:io'; import 'dart:io';
import 'dart:ui'; import 'dart:ui';
@ -76,15 +75,13 @@ class _ProfileScreenState extends State<ProfileScreen> {
Row( Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
IconButton( CircleAvatar(
onPressed: () { radius: 18,
Navigator.pop(context); backgroundColor: Colors.black.withOpacity(.21),
}, child: const Icon(Icons.arrow_back_ios_rounded, color: Colors.white, size: 18).paddingOnly(right: 4),
icon: const Icon( ).onPress(() {
Icons.arrow_back_ios, Navigator.pop(context);
color: Colors.white, }),
),
),
InkWell( InkWell(
onTap: () { onTap: () {
// startImageSheet(); // startImageSheet();

@ -51,8 +51,8 @@ class ProfilePanel extends StatelessWidget {
: ClipOval( : ClipOval(
child: Image.memory( child: Image.memory(
Utils.dataFromBase64String(memberInformationList.eMPLOYEEIMAGE!), Utils.dataFromBase64String(memberInformationList.eMPLOYEEIMAGE!),
width: 75, width: 68,
height: 75, height: 68,
fit: BoxFit.fill, fit: BoxFit.fill,
), ),
); );

@ -141,7 +141,7 @@ class _MyPostedAdsFragmentState extends State<MyPostedAdsFragment> {
Row( Row(
children: [ children: [
LocaleKeys.remove.tr().toText12(color: MyColors.redColor).center.onPress(() { LocaleKeys.remove.tr().toText12(color: MyColors.redColor).center.onPress(() {
updateItemForSale(employeePostedAdsList[index].itemSaleID!); updateItemForSale(employeePostedAdsList[index]);
}).expanded, }).expanded,
Container(width: 1, height: 30, color: MyColors.lightGreyEFColor), Container(width: 1, height: 30, color: MyColors.lightGreyEFColor),
LocaleKeys.edit.tr().toText12(color: MyColors.gradiantEndColor).center.onPress(() { LocaleKeys.edit.tr().toText12(color: MyColors.gradiantEndColor).center.onPress(() {
@ -172,7 +172,7 @@ class _MyPostedAdsFragmentState extends State<MyPostedAdsFragment> {
); );
} }
void updateItemForSale(int itemSaleID) async { void updateItemForSale(EmployeePostedAds employeePostedAds) async {
Utils.showLoading(context); Utils.showLoading(context);
String? empNum = AppState().memberInformationList?.eMPLOYEENUMBER; String? empNum = AppState().memberInformationList?.eMPLOYEENUMBER;
@ -180,15 +180,24 @@ class _MyPostedAdsFragmentState extends State<MyPostedAdsFragment> {
String? loginTokenID = AppState().postParamsObject?.logInTokenID; String? loginTokenID = AppState().postParamsObject?.logInTokenID;
String? tokenID = AppState().postParamsObject?.tokenID; String? tokenID = AppState().postParamsObject?.tokenID;
var request = http.MultipartRequest('POST', Uri.parse("${ApiConsts.cocRest}Mohemm_ITG_UpdateItemForSale")); var request = http.MultipartRequest('POST', Uri.parse("${ApiConsts.cocRest}Mohemm_ITG_UpdateItemForSaleMobile"));
request.fields['itemSaleID'] = itemSaleID.toString(); request.fields['ItgItemSaleID'] = employeePostedAds.itemSaleID.toString();
request.fields['ItgCategoryID'] = employeePostedAds.categoryID.toString();
request.fields['ItgTitle'] = employeePostedAds.title!;
request.fields['ItgDescription'] = employeePostedAds.description!;
request.fields['ItgQuotePrice'] = employeePostedAds.quotePrice.toString();
request.fields['RegionID'] = employeePostedAds.regionID.toString();
request.fields['Itg_EndDate'] = employeePostedAds.endDate.toString();
request.fields['Channel'] = "31"; request.fields['Channel'] = "31";
request.fields['isActive'] = "false"; request.fields['ItgIsActive'] = "false";
request.fields['LogInToken'] = loginTokenID!; request.fields['LogInToken'] = loginTokenID!;
request.fields['Token'] = tokenID!; request.fields['Token'] = tokenID!;
request.fields['MobileNo'] = empMobNum!; request.fields['MobileNo'] = empMobNum!;
request.fields['EmployeeNumber'] = empNum!; request.fields['EmployeeNumber'] = empNum!;
request.fields['employeeNumber'] = empNum; request.fields['employeeNumber'] = empNum;
// debugPrint(json.encode(request.fields.toString()));
var response = await request.send().catchError((e) { var response = await request.send().catchError((e) {
Utils.hideLoading(context); Utils.hideLoading(context);
Utils.handleException(e, context, null); Utils.handleException(e, context, null);

@ -88,7 +88,8 @@ class _ItemHistoryScreenState extends State<ItemHistoryScreen> {
children: [ children: [
if (moItemHistoryList.isNotEmpty) loadMoItemHistoryData(), if (moItemHistoryList.isNotEmpty) loadMoItemHistoryData(),
if (poItemHistoryList.isNotEmpty) loadPoItemHistoryData(), if (poItemHistoryList.isNotEmpty) loadPoItemHistoryData(),
if (quotationAnalysisList.isNotEmpty) loadQuotationAnalysisData() if (quotationAnalysisList.isNotEmpty) loadQuotationAnalysisData(),
if (moItemHistoryList.isEmpty && poItemHistoryList.isEmpty && quotationAnalysisList.isEmpty) Utils.getNoDataWidget(context),
], ],
), ),
); );

@ -31,9 +31,10 @@ class BalancesDashboardWidget extends StatefulWidget {
final String title; final String title;
final List<PieChartModel> chartModelList; final List<PieChartModel> chartModelList;
final bool isLeaveBalance; final bool isLeaveBalance;
final String selectedEmp; final String? selectedEmp;
final bool showLoading;
const BalancesDashboardWidget(this.title, this.isLeaveBalance, this.selectedEmp, {Key? key, this.chartModelList = const []}) : super(key: key); const BalancesDashboardWidget(this.title, this.isLeaveBalance, {Key? key, this.selectedEmp, this.showLoading = true, this.chartModelList = const []}) : super(key: key);
@override @override
_BalancesDashboardWidgetState createState() { _BalancesDashboardWidgetState createState() {
@ -46,14 +47,12 @@ class _BalancesDashboardWidgetState extends State<BalancesDashboardWidget> {
late DateTime accrualDateTime; late DateTime accrualDateTime;
GetAccrualBalancesList? leaveBalanceAccrual; GetAccrualBalancesList? leaveBalanceAccrual;
List<GetAccrualBalancesList>? ticketBalanceAccrualList; List<GetAccrualBalancesList>? ticketBalanceAccrualList;
dynamic dynamicParams;
String selectedEmp = "";
@override @override
void initState() { void initState() {
super.initState(); super.initState();
accrualDateTime = DateTime.now(); accrualDateTime = DateTime.now();
changeAccrualDate(); changeAccrualDate(widget.showLoading);
} }
@override @override
@ -61,9 +60,9 @@ class _BalancesDashboardWidgetState extends State<BalancesDashboardWidget> {
super.dispose(); super.dispose();
} }
void changeAccrualDate() async { void changeAccrualDate(bool showLoading) async {
try { try {
// Utils.showLoading(context); if (showLoading) Utils.showLoading(context);
List<GetAccrualBalancesList> accrualList = await DashboardApiClient().getAccrualBalances(DateFormat("MM/dd/yyyy").format(accrualDateTime), empID: widget.selectedEmp); List<GetAccrualBalancesList> accrualList = await DashboardApiClient().getAccrualBalances(DateFormat("MM/dd/yyyy").format(accrualDateTime), empID: widget.selectedEmp);
if (accrualList.isNotEmpty) { if (accrualList.isNotEmpty) {
if (widget.isLeaveBalance) { if (widget.isLeaveBalance) {
@ -80,10 +79,10 @@ class _BalancesDashboardWidgetState extends State<BalancesDashboardWidget> {
]; ];
} }
} }
// Utils.hideLoading(context); if (showLoading) Utils.hideLoading(context);
setState(() {}); setState(() {});
} catch (ex) { } catch (ex) {
Utils.hideLoading(context); if (showLoading) Utils.hideLoading(context);
Utils.handleException(ex, context, null); Utils.handleException(ex, context, null);
} }
} }
@ -125,7 +124,7 @@ class _BalancesDashboardWidgetState extends State<BalancesDashboardWidget> {
DateTime selectedDate = await Utils.selectDate(context, accrualDateTime); DateTime selectedDate = await Utils.selectDate(context, accrualDateTime);
if (selectedDate != accrualDateTime) { if (selectedDate != accrualDateTime) {
accrualDateTime = selectedDate; accrualDateTime = selectedDate;
changeAccrualDate(); changeAccrualDate(true);
} }
}), }),
], ],

@ -92,6 +92,10 @@ dependencies:
swipe_to: ^1.0.2 swipe_to: ^1.0.2
flutter_webrtc: ^0.9.16 flutter_webrtc: ^0.9.16
camera: ^0.10.0+4 camera: ^0.10.0+4
#Chat Voice Message Recoding & Play
# record: ^4.4.3
audio_waveforms: ^0.1.5+1
# animated_text_kit: ^4.2.2 # animated_text_kit: ^4.2.2
#Encryption #Encryption

Loading…
Cancel
Save