Ui updated

design_3.0_latest
muhammad.abbasi 1 year ago
parent f257fbadfa
commit d13f3e3551

@ -0,0 +1,5 @@
<svg width="16" height="23" viewBox="0 0 16 23" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M11.5878 1.85777C11.0729 1.49004 10.5046 1.2034 9.90276 1.00781C9.26894 0.802485 8.60665 0.698604 7.9404 0.700011C6.63333 0.694288 5.35747 1.09927 4.29297 1.85777C1.62997 3.75614 0.921755 7.41248 2.63004 10.2008L5.11728 14.2624L7.3194 17.8563C7.38449 17.963 7.47592 18.0512 7.5849 18.1124C7.69389 18.1736 7.81677 18.2057 7.94175 18.2057C8.06674 18.2057 8.18962 18.1736 8.29861 18.1124C8.40759 18.0512 8.49902 17.963 8.5641 17.8563L10.7646 14.2632L13.2518 10.2016C14.9604 7.41248 14.2508 3.75614 11.5878 1.85777ZM7.9404 11.6736C6.99781 11.6736 6.07639 11.3941 5.29266 10.8704C4.50892 10.3467 3.89808 9.60242 3.53738 8.73157C3.17668 7.86072 3.08232 6.90247 3.26623 5.978C3.45014 5.05352 3.90406 4.20434 4.57059 3.53785C5.23712 2.87135 6.08633 2.41748 7.01081 2.23362C7.9353 2.04976 8.89355 2.14418 9.76437 2.50493C10.6352 2.86568 11.3795 3.47657 11.9031 4.26033C12.4268 5.04409 12.7062 5.96553 12.7062 6.90812C12.7061 8.17203 12.204 9.38416 11.3102 10.2779C10.4165 11.1716 9.20432 11.6736 7.9404 11.6736Z" fill="white"/>
<path d="M6.95141 9.11802C6.76142 9.11784 6.57926 9.04229 6.44489 8.90796L4.94072 7.40406C4.87421 7.33753 4.82145 7.25854 4.78545 7.17162C4.74946 7.08469 4.73094 6.99153 4.73096 6.89745C4.73098 6.70744 4.80649 6.52523 4.94086 6.39089C5.07523 6.25655 5.25747 6.1811 5.44748 6.18112C5.63748 6.18115 5.8197 6.25665 5.95403 6.39102L6.95141 7.3884L9.43217 4.90764C9.49871 4.84113 9.57769 4.78837 9.66462 4.75237C9.75154 4.71638 9.84471 4.69786 9.93879 4.69788C10.0329 4.69789 10.126 4.71643 10.2129 4.75245C10.2999 4.78846 10.3788 4.84124 10.4454 4.90778C10.5119 4.97431 10.5646 5.0533 10.6006 5.14022C10.6366 5.22715 10.6551 5.32031 10.6551 5.41439C10.6551 5.50848 10.6366 5.60163 10.6005 5.68855C10.5645 5.77547 10.5117 5.85444 10.4452 5.92095L7.45793 8.90796C7.32362 9.04237 7.14143 9.11793 6.95141 9.11802Z" fill="white"/>
<path d="M11.33 14.3719L11.0662 14.8039L10.5851 15.5891C11.4696 15.7724 12.2701 16.0451 12.9284 16.3902C13.9317 16.9164 14.5309 17.5698 14.5309 18.1382C14.5309 18.7065 13.9317 19.3599 12.9284 19.8859C11.6375 20.5617 9.81936 20.95 7.94043 20.95C6.0615 20.95 4.24332 20.5617 2.95272 19.8851C1.9494 19.3591 1.35027 18.7057 1.35027 18.1374C1.35027 17.569 1.9494 16.9156 2.95272 16.3894C3.61098 16.0443 4.41072 15.7716 5.29578 15.5883L4.65669 14.545L4.55085 14.3719C1.86084 15.0386 0 16.4742 0 18.1374C0 20.437 3.55509 22.3 7.94043 22.3C12.3258 22.3 15.8809 20.437 15.8809 18.1374C15.8809 16.4742 14.02 15.0386 11.33 14.3719Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

@ -0,0 +1,3 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M8 0.25C12.2812 0.25 15.75 3.71875 15.75 8C15.75 12.2812 12.2812 15.75 8 15.75C3.71875 15.75 0.25 12.2812 0.25 8C0.25 3.71875 3.71875 0.25 8 0.25ZM8 14.25C11.4375 14.25 14.25 11.4688 14.25 8C14.25 4.5625 11.4375 1.75 8 1.75C4.53125 1.75 1.75 4.5625 1.75 8C1.75 11.4688 4.53125 14.25 8 14.25ZM9.90625 11L7.25 9.0625C7.15625 9 7.125 8.875 7.125 8.78125V3.625C7.125 3.4375 7.28125 3.25 7.5 3.25H8.5C8.6875 3.25 8.875 3.4375 8.875 3.625V8.0625L10.9375 9.59375C11.125 9.71875 11.1562 9.9375 11.0312 10.125L10.4375 10.9062C10.3125 11.0938 10.0938 11.125 9.90625 11Z" fill="#3B3D4A"/>
</svg>

After

Width:  |  Height:  |  Size: 690 B

@ -0,0 +1,3 @@
<svg width="17" height="9" viewBox="0 0 17 9" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M1.72464 3.5C1.38354 3.5 1.0501 3.39736 0.766481 3.20507C0.482866 3.01278 0.261815 2.73947 0.131281 2.4197C0.00074726 2.09993 -0.0334063 1.74806 0.0331392 1.40859C0.0996847 1.06913 0.26394 0.757306 0.505135 0.512564C0.74633 0.267822 1.05363 0.101151 1.38818 0.0336265C1.72273 -0.0338976 2.06949 0.000758249 2.38463 0.133212C2.69977 0.265665 2.96912 0.489967 3.15862 0.777753C3.34813 1.06554 3.44928 1.40388 3.44928 1.75C3.44928 2.21413 3.26757 2.65925 2.94414 2.98744C2.62071 3.31563 2.18204 3.5 1.72464 3.5ZM10.2246 1.75C10.2246 1.40388 10.1235 1.06554 9.93398 0.777753C9.74448 0.489967 9.47513 0.265665 9.15999 0.133212C8.84485 0.000758249 8.49809 -0.0338976 8.16354 0.0336265C7.82899 0.101151 7.52169 0.267822 7.2805 0.512564C7.0393 0.757306 6.87505 1.06913 6.8085 1.40859C6.74196 1.74806 6.77611 2.09993 6.90664 2.4197C7.03718 2.73947 7.25823 3.01278 7.54184 3.20507C7.82546 3.39736 8.1589 3.5 8.5 3.5C8.9574 3.5 9.39607 3.31563 9.7195 2.98744C10.0429 2.65925 10.2246 2.21413 10.2246 1.75ZM17 1.75C17 1.40388 16.8989 1.06554 16.7093 0.777753C16.5198 0.489967 16.2505 0.265665 15.9354 0.133212C15.6202 0.000758249 15.2734 -0.0338976 14.9389 0.0336265C14.6044 0.101151 14.2971 0.267822 14.0559 0.512564C13.8147 0.757306 13.6504 1.06913 13.5839 1.40859C13.5173 1.74806 13.5515 2.09993 13.682 2.4197C13.8125 2.73947 14.0336 3.01278 14.3172 3.20507C14.6008 3.39736 14.9343 3.5 15.2754 3.5C15.7328 3.5 16.1714 3.31563 16.4949 2.98744C16.8183 2.65925 17 2.21413 17 1.75ZM3.44928 7.25C3.44928 6.90388 3.34813 6.56554 3.15862 6.27775C2.96912 5.98997 2.69977 5.76566 2.38463 5.63321C2.06949 5.50076 1.72273 5.4661 1.38818 5.53363C1.05363 5.60115 0.74633 5.76782 0.505135 6.01256C0.26394 6.25731 0.0996847 6.56912 0.0331392 6.90859C-0.0334063 7.24806 0.00074726 7.59993 0.131281 7.9197C0.261815 8.23947 0.482866 8.51278 0.766481 8.70507C1.0501 8.89736 1.38354 9 1.72464 9C2.18204 9 2.62071 8.81563 2.94414 8.48744C3.26757 8.15925 3.44928 7.71413 3.44928 7.25ZM10.2246 7.25C10.2246 6.90388 10.1235 6.56554 9.93398 6.27775C9.74448 5.98997 9.47513 5.76566 9.15999 5.63321C8.84485 5.50076 8.49809 5.4661 8.16354 5.53363C7.82899 5.60115 7.52169 5.76782 7.2805 6.01256C7.0393 6.25731 6.87505 6.56912 6.8085 6.90859C6.74196 7.24806 6.77611 7.59993 6.90664 7.9197C7.03718 8.23947 7.25823 8.51278 7.54184 8.70507C7.82546 8.89736 8.1589 9 8.5 9C8.9574 9 9.39607 8.81563 9.7195 8.48744C10.0429 8.15925 10.2246 7.71413 10.2246 7.25ZM17 7.25C17 6.90388 16.8989 6.56554 16.7093 6.27775C16.5198 5.98997 16.2505 5.76566 15.9354 5.63321C15.6202 5.50076 15.2734 5.4661 14.9389 5.53363C14.6044 5.60115 14.2971 5.76782 14.0559 6.01256C13.8147 6.25731 13.6504 6.56912 13.5839 6.90859C13.5173 7.24806 13.5515 7.59993 13.682 7.9197C13.8125 8.23947 14.0336 8.51278 14.3172 8.70507C14.6008 8.89736 14.9343 9 15.2754 9C15.7328 9 16.1714 8.81563 16.4949 8.48744C16.8183 8.15925 17 7.71413 17 7.25Z" fill="#535561"/>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

@ -0,0 +1,3 @@
<svg width="20" height="18" viewBox="0 0 20 18" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M19.977 8.50317V14.3339C20.0371 14.8263 19.9792 15.3252 19.8076 15.7933C19.636 16.2614 19.3551 16.6866 18.9861 17.0371C18.617 17.3876 18.1693 17.6543 17.6764 17.8172C17.1835 17.9802 16.6581 18.0352 16.1397 17.9781H3.86032C3.34187 18.0352 2.81653 17.9802 2.32362 17.8172C1.83071 17.6543 1.38298 17.3876 1.01393 17.0371C0.644868 16.6866 0.364038 16.2614 0.192443 15.7933C0.0208482 15.3252 -0.03707 14.8263 0.0230211 14.3339V4.61601C-0.03707 4.12364 0.0208482 3.62474 0.192443 3.15663C0.364038 2.68852 0.644868 2.26332 1.01393 1.91284C1.38298 1.56235 1.83071 1.29565 2.32362 1.13269C2.81653 0.969728 3.34187 0.914724 3.86032 0.971791H11.0233C11.2268 0.971791 11.422 1.04858 11.566 1.18526C11.7099 1.32195 11.7907 1.50733 11.7907 1.70063C11.7907 1.89394 11.7099 2.07932 11.566 2.216C11.422 2.35269 11.2268 2.42948 11.0233 2.42948H3.86032C2.24661 2.42948 1.55794 3.08349 1.55794 4.61601V13.6051L4.15707 11.1367C4.35027 10.9547 4.61142 10.8525 4.8836 10.8525C5.15578 10.8525 5.41693 10.9547 5.61013 11.1367L6.57201 12.0502C6.66765 12.1392 6.79624 12.1891 6.93016 12.1891C7.06408 12.1891 7.19267 12.1392 7.28831 12.0502L12.3433 7.24956C12.5365 7.0675 12.7977 6.96533 13.0698 6.96533C13.342 6.96533 13.6032 7.0675 13.7964 7.24956L18.4421 11.6615V8.50317C18.4421 8.30987 18.5229 8.12449 18.6668 7.9878C18.8108 7.85112 19.006 7.77433 19.2095 7.77433C19.4131 7.77433 19.6083 7.85112 19.7522 7.9878C19.8961 8.12449 19.977 8.30987 19.977 8.50317ZM5.89972 5.34485C5.55998 5.34575 5.2345 5.47467 4.99477 5.7033C4.75504 5.93192 4.62066 6.24156 4.62113 6.5642C4.6216 6.88685 4.7569 7.19613 4.9973 7.42411C5.2377 7.6521 5.56356 7.78016 5.9033 7.78016C6.24304 7.78016 6.56889 7.6521 6.8093 7.42411C7.0497 7.19613 7.18499 6.88685 7.18547 6.5642C7.18594 6.24156 7.05156 5.93192 6.81183 5.7033C6.5721 5.47467 6.24662 5.34575 5.90688 5.34485H5.89972ZM15.1164 3.40127H16.3955V4.61601C16.3955 4.80931 16.4764 4.99469 16.6203 5.13138C16.7642 5.26806 16.9594 5.34485 17.163 5.34485C17.3665 5.34485 17.5617 5.26806 17.7056 5.13138C17.8496 4.99469 17.9304 4.80931 17.9304 4.61601V3.40127H19.2095C19.4131 3.40127 19.6083 3.32448 19.7522 3.1878C19.8961 3.05111 19.977 2.86573 19.977 2.67243C19.977 2.47912 19.8961 2.29374 19.7522 2.15706C19.6083 2.02037 19.4131 1.94358 19.2095 1.94358H17.9304V0.728843C17.9304 0.535542 17.8496 0.350158 17.7056 0.213473C17.5617 0.0767885 17.3665 0 17.163 0C16.9594 0 16.7642 0.0767885 16.6203 0.213473C16.4764 0.350158 16.3955 0.535542 16.3955 0.728843V1.94358H15.1164C14.9129 1.94358 14.7176 2.02037 14.5737 2.15706C14.4298 2.29374 14.3489 2.47912 14.3489 2.67243C14.3489 2.86573 14.4298 3.05111 14.5737 3.1878C14.7176 3.32448 14.9129 3.40127 15.1164 3.40127Z" fill="#7D859A"/>
</svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

@ -0,0 +1,3 @@
<svg width="26" height="26" viewBox="0 0 26 26" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M20.1512 17.6694C22.3808 19.8946 23.6086 22.8531 23.6086 26H21.5734C21.5734 20.6238 17.191 16.25 11.8043 16.25C6.41762 16.25 2.03522 20.6238 2.03522 26H0C0 22.8531 1.22785 19.8946 3.45739 17.6694C4.71521 16.414 6.20703 15.477 7.83455 14.8986C6.11025 13.6519 4.9863 11.6265 4.9863 9.34375C4.9863 5.56364 8.06768 2.48828 11.8552 2.48828C12.2747 2.48828 12.6856 2.52616 13.0845 2.59843C12.8894 3.22568 12.7838 3.89909 12.7727 4.60708C12.4755 4.54985 12.1689 4.51953 11.8552 4.51953C9.18991 4.51953 7.02153 6.68368 7.02153 9.34375C7.02153 12.0038 9.18991 14.168 11.8552 14.168C13.4103 14.168 14.7959 13.4311 15.6806 12.2891H17.1971C17.2008 12.2891 17.2045 12.2891 17.2082 12.2891C17.3927 12.2891 17.7054 12.2756 18.0946 12.2087C17.5909 13.2973 16.809 14.2321 15.841 14.923C17.4425 15.5032 18.9107 16.4313 20.1512 17.6694ZM26 4.7321C26 7.67066 23.8554 9.49609 20.4031 9.49609C20.0731 9.49609 19.757 9.46679 19.4635 9.42744C18.5533 10.1879 17.546 10.2578 17.2107 10.2578C17.2074 10.2578 17.2041 10.2578 17.2008 10.2578L15.3395 10.25L16.3354 8.70873C16.3483 8.68649 16.4185 8.56233 16.5012 8.35763C15.4014 7.52934 14.8062 6.27032 14.8062 4.73205C14.8062 3.15783 15.4159 1.88632 16.5693 1.05498C17.5269 0.364812 18.8526 0 20.4031 0C21.9537 0 23.2794 0.364812 24.2369 1.05498C25.3903 1.88632 26 3.15788 26 4.7321ZM23.9648 4.7321C23.9648 3.81179 23.664 3.14768 23.0454 2.70177C22.4368 2.26307 21.5231 2.03125 20.4031 2.03125C19.2831 2.03125 18.3694 2.26307 17.7609 2.70171C17.1422 3.14762 16.8415 3.81174 16.8415 4.73205C16.8415 5.821 17.2703 6.56134 18.1522 6.99532L18.705 7.2673L18.7209 7.24882L19.2873 7.3448C19.6457 7.40548 20.0271 7.46479 20.4031 7.46479C22.028 7.46484 23.9648 6.99075 23.9648 4.7321Z" fill="#7D859A"/>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

@ -0,0 +1,8 @@
<svg width="24" height="20" viewBox="0 0 24 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M21.072 6.36365C20.6186 6.36365 20.165 6.02276 20.165 5.45454V3.18188C20.165 2.38644 19.4847 1.81821 18.8045 1.81821H16.5369C16.0834 1.81821 15.6299 1.47733 15.6299 0.909106C15.6299 0.340996 15.9701 -1.90735e-06 16.5369 -1.90735e-06H18.8045C20.5052 -1.90735e-06 21.979 1.36366 21.979 3.18188V5.45454C21.979 5.90909 21.5256 6.36365 21.072 6.36365Z" fill="white"/>
<path d="M16.5369 18.1818H18.8045C19.5982 18.1818 20.165 17.5 20.165 16.8182V14.5455C20.165 14.0909 20.5053 13.6364 21.0722 13.6364C21.639 13.6364 21.9792 13.9773 21.9792 14.5455V16.8182C21.9792 18.5227 20.6186 20 18.8045 20H16.5369C16.0835 20 15.6299 19.6591 15.6299 19.0909C15.6299 18.5227 16.0835 18.1818 16.5369 18.1818Z" fill="white"/>
<path d="M7.46667 1.81821H5.19911C4.40545 1.81821 3.83856 2.49999 3.83856 3.18188V5.45454C3.83856 5.90909 3.49843 6.36365 2.93153 6.36365C2.36465 6.36365 2.02451 5.90909 2.02451 5.45454V3.18188C2.02451 1.47733 3.38505 -1.90735e-06 5.19911 -1.90735e-06H7.46667C7.92019 -1.90735e-06 8.3737 0.340996 8.3737 0.909106C8.3737 1.47733 7.92019 1.81821 7.46667 1.81821Z" fill="white"/>
<path d="M2.93156 13.6364C3.38508 13.6364 3.83859 13.9773 3.83859 14.5455V16.8182C3.83859 17.6136 4.51886 18.1818 5.19913 18.1818H7.4667C7.92021 18.1818 8.37372 18.5227 8.37372 19.0909C8.37372 19.6591 7.92021 20 7.4667 20H5.19913C3.49845 20 2.02454 18.5227 2.02454 16.8182V14.5455C2.02454 14.0909 2.47805 13.6364 2.93156 13.6364Z" fill="white"/>
<path d="M16.5369 3.18184C17.7842 3.18184 18.8046 4.2045 18.8046 5.4545V7.49994H5.19914V5.4545C5.19914 4.2045 6.21955 3.18184 7.46671 3.18184H16.5369Z" fill="white"/>
<path d="M22.2059 10.9091H18.8046V14.5454C18.8046 15.7954 17.7842 16.8181 16.5369 16.8181H7.4667C6.21954 16.8181 5.19913 15.7954 5.19913 14.5454V10.6817H1.79779C1.34426 10.6817 0.890755 10.3409 0.890755 9.77263C0.890755 9.20452 1.23089 8.86364 1.79779 8.86364H22.2059C22.6594 8.86364 23.1129 9.20452 23.1129 9.77263C23.1129 10.3409 22.6594 10.9091 22.2059 10.9091Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

@ -35,7 +35,11 @@ class URLs {
static get engineerRejectUrl=> '$_baseUrl/ServiceRequest/EngineerReject';
static get engineerFixRemotlyUrl=> '$_baseUrl/ServiceRequest/EngineerFixRemotly';
static get engineerNeedVisitUrl=> '$_baseUrl/ServiceRequest/EngineerNeedVisit';
static get engineerMarkAsFixUrl=> '$_baseUrl/ServiceRequest/EngineerMarkAsFix';
static get getWorkOrderByIdUrl=> '$_baseUrl/ServiceRequest/GetWorkOrderById';
static get deleteActivitySparePartUrl=> '$_baseUrl/ServiceRequest/DeleteActivitySparePart';
static get createActivitySparePartUrl=> '$_baseUrl/ServiceRequest/CreateActivitySparePart';
static get updateActivitySparePartUrl=> '$_baseUrl/ServiceRequest/UpdateActivitySparePart';
static get assignEngineerToWorkOrderUrl=> '$_baseUrl/ServiceRequest/AssignEngineerToWorkOrder';
static get getDepartments => "$_baseUrl/Customer/GetDepartmentLookup"; // get
static get getAssets => "$_baseUrl/Asset/GetAssets"; // get

@ -44,6 +44,14 @@ class ServiceRequestsProvider extends ChangeNotifier {
// 500 service not available
int stateCode;
bool _isDetialLoading=false;
bool _ackhnowledge = false;
bool get ackhnowledge => _ackhnowledge;
set ackhnowledge(bool value) {
_ackhnowledge = value;
notifyListeners();
}
bool get isDetialLoading => _isDetialLoading;

@ -62,6 +62,8 @@ class _DashboardViewState extends State<DashboardView> {
allRequestsProvider = Provider.of<AllRequestsProvider>(context, listen: false);
notificationsProvider = Provider.of<NotificationsProvider>(context, listen: false);
user = userProvider.user;
log('user token i got is ${user.token}');
await getAllRequests();
await requestDetailProvider.engineerRejectWorkOrder(id: '3',feedBack: 'Abcdef');

@ -10,6 +10,14 @@ extension StringExtensions on String {
DateTime dateTime = DateTime.tryParse(this);
return "${DateFormat('dd MMM, yyyy').format(dateTime)}\n${DateFormat('hh:mm a').format(dateTime)}";
}
String get toDragAbleTimerFormat {
DateTime dateTime = DateTime.tryParse(this);
return DateFormat('HH:mm:ss').format(dateTime);
}
String get toInitialVisitCardFormat {
DateTime dateTime = DateTime.tryParse(this);
return "${DateFormat('dd MMM, yyyy').format(dateTime)} at ${DateFormat('hh:mm a').format(dateTime)}";
}
String get toServiceRequestDetailsFormat {
try {

@ -73,6 +73,21 @@
"brand": "ماركة",
"clearSearch": "تنظيف البحث",
"closed": "غلق",
"close": "يغلق",
"attachFiles": "إرفاق الملفات",
"hours": "ساعات",
"internal": "داخلي",
"external": "خارجي",
"addInternalActivity": "إضافة نشاط داخلي",
"addExternalActivity": "إضافة نشاط خارجي",
"remotely": "عن بُعد",
"workshop": "ورشة",
"activityStatus": "حالة النشاط",
"scanOrPickAsset": "امسح أو اختر الأصل",
"takeAction": "اتخذ إجراء",
"pleaseConfirmTheIssueHasBeenResolved": "يرجى تأكيد أن المشكلة قد تم حلها",
"nurseAcknowledge": "أقر بإكمال أمر العمل هذا",
"abroad": "خارج البلاد",
"create": "انشاء",
"createServiceRequest": "انشاء طلب خدمة",
"delete": "مسح",
@ -276,6 +291,18 @@
"timeAndDuration": "الوقت والمدة",
"assetsCondition": "حالة الأصول",
"attachmentsAcknowledge": "إقرار & المرفقات",
"up_and_running": "قيد التشغيل",
"partially_down": "معطل جزئيًا",
"fully_down": "معطل تمامًا",
"verify_asset_details": "تحقق من تفاصيل الأصل",
"equipment_status": "حالة المعدات",
"failureReason": "سبب الفشل",
"visitDateAndTime": "تاريخ ووقت الزيارة",
"markAsFixed": "تحديد كإصلاح",
"iHaveArrived": "لقد وصلت",
"fixedRemotely": "تم الإصلاح عن بُعد",
"needAVisit": "بحاجة إلى زيارة",
"solutions": "الحلول",
"welcome" : "مرحبا،",
"openWhatsapp" : "الإنتقال الى الواتس اب",
"callUs" : "إتصل بنا",

@ -69,6 +69,21 @@
"brand": "manufacture",
"clearSearch": "Clear Search",
"closed": "Closed",
"close": "Close",
"scanOrPickAsset": "Scan or Pick Asset",
"attachFiles": "Attach Files",
"activityStatus": "Activity Status",
"takeAction": "Take Action",
"pleaseConfirmTheIssueHasBeenResolved": "Please confirm the issue has been resolved",
"nurseAcknowledge": "I acknowledge the completion of this work order",
"hours": "Hours",
"internal": "Internal",
"external": "External",
"addInternalActivity": "Add Internal Activity",
"addExternalActivity": "Add External Activity",
"remotely": "Remotely",
"workshop": "Workshop",
"abroad": "Abroad",
"create": "Create",
"createServiceRequest": "Create Service Request",
"delete": "Delete",
@ -248,6 +263,18 @@
"timeAndDuration": "Time and Duration",
"assetsCondition": "Assets Condition",
"attachmentsAcknowledge": "Attachments & Acknowledge",
"up_and_running": "Up & Running",
"partially_down": "Partially Down",
"needAVisit": "Need a Visit",
"fixedRemotely": "Fixed Remotely",
"iHaveArrived": "I have arrived",
"verify_asset_details": "Verify Asset Details",
"equipment_status": "Equipment Status",
"failureReason": "Failure Reason",
"visitDateAndTime": "Visit Date & Time",
"markAsFixed": "Mark as Fixed",
"fully_down": "Fully Down",
"solutions": "Solutions",
"callUs" : "Call Us",
"liveChat" : "Live Chat",
"feedBack" : "Feedback",

@ -0,0 +1,64 @@
class ActivitySparePartModel {
int id;
int workOrderId;
int partCatalogItemId;
int quantity;
String comment;
List<SparePartAttachments> sparePartAttachments;
ActivitySparePartModel(
{this.id,
this.workOrderId,
this.partCatalogItemId,
this.quantity,
this.comment,
this.sparePartAttachments});
ActivitySparePartModel.fromJson(Map<String, dynamic> json) {
id = json['id'];
workOrderId = json['workOrderId'];
partCatalogItemId = json['partCatalogItemId'];
quantity = json['quantity'];
comment = json['comment'];
if (json['acitiySparePartAttachments'] != null) {
sparePartAttachments = <SparePartAttachments>[];
json['acitiySparePartAttachments'].forEach((v) {
sparePartAttachments
.add(SparePartAttachments.fromJson(v));
});
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['workOrderId'] = workOrderId;
data['partCatalogItemId'] = partCatalogItemId;
data['quantity'] = quantity;
data['comment'] = comment;
if (sparePartAttachments != null) {
data['acitiySparePartAttachments'] =
sparePartAttachments.map((v) => v.toJson()).toList();
}
return data;
}
}
class SparePartAttachments {
int id;
String name;
SparePartAttachments({this.id, this.name});
SparePartAttachments.fromJson(Map<String, dynamic> json) {
id = json['id'];
name = json['name'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['name'] = name;
return data;
}
}

@ -0,0 +1,23 @@
class MarkAsFixed {
int workOrderId;
String feedback;
MarkAsFixed({
this.workOrderId,
this.feedback,
});
factory MarkAsFixed.fromJson(Map<String, dynamic> json) {
return MarkAsFixed(
workOrderId: json['workOrderId'],
feedback: json['feedback'],
);
}
Map<String, dynamic> toJson() {
return {
'workOrderId': workOrderId,
'feedback': feedback,
};
}
}

@ -25,6 +25,7 @@ class Lookup extends Base {
}
factory Lookup.fromJson(Map<String, dynamic> parsedJson) {
if (parsedJson == null) return null;
return Lookup(
name: parsedJson["name"],

@ -1,3 +1,5 @@
import 'package:test_sa/models/lookup.dart';
class WorkOrderDetail {
WorkOrder data;
String message;
@ -42,20 +44,20 @@ class WorkOrder {
WorkOrderCreatedBy workOrderCreatedBy;
DateTime requestedDate;
Asset asset;
AssetGroup assetGroup;
Manufacturer manufacturer;
Model model;
AssetNDModel assetNDModel;
Lookup assetGroup;
Lookup manufacturer;
Lookup model;
Lookup assetNDModel;
Site site;
Building building;
Floor floor;
Department department;
Lookup building;
Lookup floor;
Lookup department;
dynamic room;
AssetType assetType;
Lookup assetType;
AssignedEmployee assignedEmployee;
dynamic lastActivityStatus;
Status status;
NextStep nextStep;
Lookup status;
Lookup nextStep;
dynamic assetVerificationType;
List<WorkOrderContactPerson> workOrderContactPerson;
EquipmentStatus equipmentStatus;
@ -128,20 +130,20 @@ class WorkOrder {
workOrderCreatedBy: WorkOrderCreatedBy.fromJson(json['workOrderCreatedBy']),
requestedDate: DateTime.parse(json['requestedDate']),
asset: Asset.fromJson(json['asset']),
assetGroup: AssetGroup.fromJson(json['assetGroup']),
manufacturer: Manufacturer.fromJson(json['manufacturer']),
model: Model.fromJson(json['model']),
assetNDModel: AssetNDModel.fromJson(json['assetNDModel']),
assetGroup: json['assetGroup']??Lookup.fromJson(json['assetGroup']),
manufacturer:json['manufacturer']?? Lookup.fromJson(json['manufacturer']),
model: json['model']?? Lookup.fromJson(json['model']),
assetNDModel:json['assetNDModel']?? Lookup.fromJson(json['assetNDModel']),
site: Site.fromJson(json['site']),
building: Building.fromJson(json['building']),
floor: Floor.fromJson(json['floor']),
department: Department.fromJson(json['department']),
building: json['building']??Lookup.fromJson(json['building']),
floor: json['floor']??Lookup.fromJson(json['floor']),
department:json['department']?? Lookup.fromJson(json['department']),
room: json['room'],
assetType: AssetType.fromJson(json['assetType']),
assetType: json['assetType']??Lookup.fromJson(json['assetType']),
assignedEmployee: AssignedEmployee.fromJson(json['assignedEmployee']),
lastActivityStatus: json['lastActivityStatus'],
status: Status.fromJson(json['status']),
nextStep: NextStep.fromJson(json['nextStep']),
status: json['status']??Lookup.fromJson(json['status']),
nextStep: json['nextStep']??Lookup.fromJson(json['nextStep']),
assetVerificationType: json['assetVerificationType'],
workOrderContactPerson: (json['workOrderContactPerson'] as List)
.map((i) => WorkOrderContactPerson.fromJson(i))
@ -257,262 +259,6 @@ class Asset {
}
}
class AssetGroup {
int id;
String name;
AssetGroup({this.id, this.name});
factory AssetGroup.fromJson(Map<String, dynamic> json) {
return AssetGroup(
id: json['id'],
name: json['name'],
);
}
Map<String, dynamic> toJson() {
return {
'id': id,
'name': name,
};
}
}
class Manufacturer {
int id;
String name;
Manufacturer({this.id, this.name});
factory Manufacturer.fromJson(Map<String, dynamic> json) {
return Manufacturer(
id: json['id'],
name: json['name'],
);
}
Map<String, dynamic> toJson() {
return {
'id': id,
'name': name,
};
}
}
class Model {
int id;
String name;
Model({this.id, this.name});
factory Model.fromJson(Map<String, dynamic> json) {
return Model(
id: json['id'],
name: json['name'],
);
}
Map<String, dynamic> toJson() {
return {
'id': id,
'name': name,
};
}
}
class AssetNDModel {
int id;
String name;
AssetNDModel({this.id, this.name});
factory AssetNDModel.fromJson(Map<String, dynamic> json) {
return AssetNDModel(
id: json['id'],
name: json['name'],
);
}
Map<String, dynamic> toJson() {
return {
'id': id,
'name': name,
};
}
}
class Site {
int id;
String siteName;
Site({this.id, this.siteName});
factory Site.fromJson(Map<String, dynamic> json) {
return Site(
id: json['id'],
siteName: json['siteName'],
);
}
Map<String, dynamic> toJson() {
return {
'id': id,
'siteName': siteName,
};
}
}
class Building {
int id;
String name;
int value;
Building({this.id, this.name, this.value});
factory Building.fromJson(Map<String, dynamic> json) {
return Building(
id: json['id'],
name: json['name'],
value: json['value'],
);
}
Map<String, dynamic> toJson() {
return {
'id': id,
'name': name,
'value': value,
};
}
}
class Floor {
int id;
String name;
int value;
Floor({this.id, this.name, this.value});
factory Floor.fromJson(Map<String, dynamic> json) {
return Floor(
id: json['id'],
name: json['name'],
value: json['value'],
);
}
Map<String, dynamic> toJson() {
return {
'id': id,
'name': name,
'value': value,
};
}
}
class Department {
int id;
String name;
Department({this.id, this.name});
factory Department.fromJson(Map<String, dynamic> json) {
return Department(
id: json['id'],
name: json['name'],
);
}
Map<String, dynamic> toJson() {
return {
'id': id,
'name': name,
};
}
}
class AssetType {
int id;
String name;
int value;
AssetType({this.id, this.name, this.value});
factory AssetType.fromJson(Map<String, dynamic> json) {
return AssetType(
id: json['id'],
name: json['name'],
value: json['value'],
);
}
Map<String, dynamic> toJson() {
return {
'id': id,
'name': name,
'value': value,
};
}
}
class AssignedEmployee {
String id;
String userName;
AssignedEmployee({this.id, this.userName});
factory AssignedEmployee.fromJson(Map<String, dynamic> json) {
return AssignedEmployee(
id: json['id'],
userName: json['userName'],
);
}
Map<String, dynamic> toJson() {
return {
'id': id,
'userName': userName,
};
}
}
class Status {
int id;
String name;
int value;
Status({this.id, this.name, this.value});
factory Status.fromJson(Map<String, dynamic> json) {
return Status(
id: json['id'],
name: json['name'],
value: json['value'],
);
}
Map<String, dynamic> toJson() {
return {
'id': id,
'name': name,
'value': value,
};
}
}
class NextStep {
int id;
String name;
int value;
NextStep({this.id, this.name, this.value});
factory NextStep.fromJson(Map<String, dynamic> json) {
return NextStep(
id: json['id'],
name: json['name'],
value: json['value'],
);
}
Map<String, dynamic> toJson() {
return {
'id': id,
'name': name,
'value': value,
};
}
}
class WorkOrderContactPerson {
int id;
String name;
@ -585,6 +331,266 @@ class ContactUser {
}
}
class AssignedEmployee {
String id;
String userName;
AssignedEmployee({this.id, this.userName});
factory AssignedEmployee.fromJson(Map<String, dynamic> json) {
return AssignedEmployee(
id: json['id'],
userName: json['userName'],
);
}
Map<String, dynamic> toJson() {
return {
'id': id,
'userName': userName,
};
}
}
class Site {
int id;
String siteName;
Site({this.id, this.siteName});
factory Site.fromJson(Map<String, dynamic> json) {
return Site(
id: json['id'],
siteName: json['siteName'],
);
}
Map<String, dynamic> toJson() {
return {
'id': id,
'siteName': siteName,
};
}
}
///
// class AssetGroup {
// int id;
// String name;
//
// AssetGroup({this.id, this.name});
//
// factory AssetGroup.fromJson(Map<String, dynamic> json) {
// return AssetGroup(
// id: json['id'],
// name: json['name'],
// );
// }
// Map<String, dynamic> toJson() {
// return {
// 'id': id,
// 'name': name,
// };
// }
//
// }
//
// class Manufacturer {
// int id;
// String name;
//
// Manufacturer({this.id, this.name});
//
// factory Manufacturer.fromJson(Map<String, dynamic> json) {
// return Manufacturer(
// id: json['id'],
// name: json['name'],
// );
// }
// Map<String, dynamic> toJson() {
// return {
// 'id': id,
// 'name': name,
// };
// }
// }
//
// class Model {
// int id;
// String name;
//
// Model({this.id, this.name});
//
// factory Model.fromJson(Map<String, dynamic> json) {
// return Model(
// id: json['id'],
// name: json['name'],
// );
// }
// Map<String, dynamic> toJson() {
// return {
// 'id': id,
// 'name': name,
// };
// }
// }
//
// class AssetNDModel {
// int id;
// String name;
//
// AssetNDModel({this.id, this.name});
//
// factory AssetNDModel.fromJson(Map<String, dynamic> json) {
// return AssetNDModel(
// id: json['id'],
// name: json['name'],
// );
// }
// Map<String, dynamic> toJson() {
// return {
// 'id': id,
// 'name': name,
// };
// }
// }
//
// class Building {
// int id;
// String name;
// int value;
//
// Building({this.id, this.name, this.value});
//
// factory Building.fromJson(Map<String, dynamic> json) {
// return Building(
// id: json['id'],
// name: json['name'],
// value: json['value'],
// );
// }
// Map<String, dynamic> toJson() {
// return {
// 'id': id,
// 'name': name,
// 'value': value,
// };
// }
// }
//
// class Floor {
// int id;
// String name;
// int value;
//
// Floor({this.id, this.name, this.value});
//
// factory Floor.fromJson(Map<String, dynamic> json) {
// return Floor(
// id: json['id'],
// name: json['name'],
// value: json['value'],
// );
// }
// Map<String, dynamic> toJson() {
// return {
// 'id': id,
// 'name': name,
// 'value': value,
// };
// }
// }
//
// class Department {
// int id;
// String name;
//
// Department({this.id, this.name});
//
// factory Department.fromJson(Map<String, dynamic> json) {
// return Department(
// id: json['id'],
// name: json['name'],
// );
// }
// Map<String, dynamic> toJson() {
// return {
// 'id': id,
// 'name': name,
// };
// }
// }
//
// class AssetType {
// int id;
// String name;
// int value;
//
// AssetType({this.id, this.name, this.value});
//
// factory AssetType.fromJson(Map<String, dynamic> json) {
// return AssetType(
// id: json['id'],
// name: json['name'],
// value: json['value'],
// );
// }
// Map<String, dynamic> toJson() {
// return {
// 'id': id,
// 'name': name,
// 'value': value,
// };
// }
// }
//
// class Status {
// int id;
// String name;
// int value;
//
// Status({this.id, this.name, this.value});
//
// factory Status.fromJson(Map<String, dynamic> json) {
// return Status(
// id: json['id'],
// name: json['name'],
// value: json['value'],
// );
// }
// Map<String, dynamic> toJson() {
// return {
// 'id': id,
// 'name': name,
// 'value': value,
// };
// }
// }
//
// class NextStep {
// int id;
// String name;
// int value;
//
// NextStep({this.id, this.name, this.value});
//
// factory NextStep.fromJson(Map<String, dynamic> json) {
// return NextStep(
// id: json['id'],
// name: json['name'],
// value: json['value'],
// );
// }
// Map<String, dynamic> toJson() {
// return {
// 'id': id,
// 'name': name,
// 'value': value,
// };
// }
// }
class EquipmentStatus {
int id;
@ -694,11 +700,11 @@ class ProblemDescription {
class WorkOrderHistory {
int id;
WorkOrderStatus workOrderStatus;
Lookup workOrderStatus;
dynamic activityStatus; // Since activityStatus is null, it's dynamic
String date;
HistoryUser user;
Step step;
Lookup step;
dynamic fixRemotelyStartTime; // Since it's null, it's dynamic
dynamic fixRemotelyEndTime; // Since it's null, it's dynamic
dynamic fixRemotelyWorkingHours; // Since it's null, it's dynamic
@ -722,11 +728,12 @@ class WorkOrderHistory {
factory WorkOrderHistory.fromJson(Map<String, dynamic> json) {
return WorkOrderHistory(
id: json['id'],
workOrderStatus: WorkOrderStatus.fromJson(json['workorderStatus']),
//json['assetType'] != null ? Lookup.fromJson(json['assetType']) : null;
workOrderStatus:json['workorderStatus']??Lookup.fromJson(json['workorderStatus']),
activityStatus: json['activityStatus'],
date: json['date'],
user: HistoryUser.fromJson(json['user']),
step: Step.fromJson(json['step']),
step: json['step']??Lookup.fromJson(json['step']),
fixRemotelyStartTime: json['fixRemotlyStartTime'],
fixRemotelyEndTime: json['fixRemotlyEndTime'],
fixRemotelyWorkingHours: json['fixRemotlyWorkingHours'],
@ -738,6 +745,7 @@ class WorkOrderHistory {
Map<String, dynamic> toJson() {
return {
'id': id,
// Lookup.fromJson(json['workorderStatus'])
'workorderStatus': workOrderStatus.toJson(),
'activityStatus': activityStatus,
'date': date,
@ -752,33 +760,33 @@ class WorkOrderHistory {
}
}
class WorkOrderStatus {
int id;
String name;
int value;
WorkOrderStatus({
this.id,
this.name,
this.value,
});
factory WorkOrderStatus.fromJson(Map<String, dynamic> json) {
return WorkOrderStatus(
id: json['id'],
name: json['name'],
value: json['value'],
);
}
Map<String, dynamic> toJson() {
return {
'id': id,
'name': name,
'value': value,
};
}
}
// class WorkOrderStatus {
// int id;
// String name;
// int value;
//
// WorkOrderStatus({
// this.id,
// this.name,
// this.value,
// });
//
// factory WorkOrderStatus.fromJson(Map<String, dynamic> json) {
// return WorkOrderStatus(
// id: json['id'],
// name: json['name'],
// value: json['value'],
// );
// }
//
// Map<String, dynamic> toJson() {
// return {
// 'id': id,
// 'name': name,
// 'value': value,
// };
// }
// }
class HistoryUser {
String id;
@ -804,31 +812,31 @@ class HistoryUser {
}
}
class Step {
int id;
String name;
int value;
Step({
this.id,
this.name,
this.value,
});
factory Step.fromJson(Map<String, dynamic> json) {
return Step(
id: json['id'],
name: json['name'],
value: json['value'],
);
}
Map<String, dynamic> toJson() {
return {
'id': id,
'name': name,
'value': value,
};
}
}
// class Step {
// int id;
// String name;
// int value;
//
// Step({
// this.id,
// this.name,
// this.value,
// });
//
// factory Step.fromJson(Map<String, dynamic> json) {
// return Step(
// id: json['id'],
// name: json['name'],
// value: json['value'],
// );
// }
//
// Map<String, dynamic> toJson() {
// return {
// 'id': id,
// 'name': name,
// 'value': value,
// };
// }
// }

@ -50,6 +50,7 @@ class AppColor {
static const Color red40 = Color(0xffFFDBDC);
static const Color red50 = Color(0xffD02127);
static const Color red60 = Color(0xff8C050A);
static const Color red70 = Color(0xffF63939);
//green
static const Color green40 = Color(0xffBAFFE1);

@ -26,7 +26,7 @@ class AppBottomNavigationBar extends StatelessWidget {
child: BottomNavigationBar(
items: <BottomNavigationBarItem>[
navBarItem(context, index: 0, iconName: "overview", label: context.translation.overview),
navBarItem(context, index: 1, iconName: "requests", label: context.translation.request),
navBarItem(context, index: 1, iconName: "request_icon", label: context.translation.request),
if (!isEngineer) navBarItem(context, index: 2, iconName: "add_icon", label: context.translation.calendar, showLabel: false),
navBarItem(context, index: !isEngineer ? 3 : 2, iconName: "assets", label: context.translation.assets),
navBarItem(context, index: !isEngineer ? 4 : 3, iconName: "contact", label: context.translation.contact),

@ -11,9 +11,10 @@ class AppDashedButton extends StatelessWidget {
final String title;
final VoidCallback onPressed;
double height;
Color buttonColor;
Widget icon;
AppDashedButton({@required this.title, @required this.onPressed, Key key,this.height,this.icon}) : super(key: key);
AppDashedButton({@required this.title, @required this.onPressed, Key key,this.height,this.icon,this.buttonColor}) : super(key: key);
@override
Widget build(BuildContext context) {
@ -25,7 +26,7 @@ class AppDashedButton extends StatelessWidget {
child: DottedBorder(
strokeWidth: 1,
padding: EdgeInsets.symmetric(vertical: 16.toScreenHeight, horizontal: 16.toScreenWidth),
color: context.isDark ? AppColor.primary40 : AppColor.black20,
color: context.isDark ? AppColor.primary40 : buttonColor?? AppColor.black20,
dashPattern: const [4, 3],
radius: const Radius.circular(10),
borderType: BorderType.RRect,
@ -35,10 +36,10 @@ class AppDashedButton extends StatelessWidget {
children: [
icon,
7.width,
title.heading6(context).custom(color: context.isDark ? AppColor.primary40 : AppColor.black10).center,
title.heading6(context).custom(color: context.isDark ? AppColor.primary40 : buttonColor??AppColor.black10).center,
],
):
title.heading6(context).custom(color: context.isDark ? AppColor.primary40 : AppColor.primary10).center,
title.heading6(context).custom(color: context.isDark ? AppColor.primary40 : buttonColor?? AppColor.primary10).center,
),
).onPress(onPressed);
}

@ -11,13 +11,17 @@ class AppFilledButton extends StatelessWidget {
final Color buttonColor;
final Color textColor;
final bool showBorder;
final bool showIcon;
final Widget icon;
const AppFilledButton({
@required this.onPressed,
@required this.label,
this.maxWidth = false,
this.icon,
this.loading = false,
this.showBorder = false,
this.showIcon = false,
this.buttonColor,
this.textColor,
Key key,
@ -43,7 +47,18 @@ class AppFilledButton extends StatelessWidget {
strokeWidth: 2,
),
)
: label.heading6(context).custom(color: textColor ?? AppColor.background(context)),
: showIcon&&icon!=null?
Center(
child: Row(
mainAxisSize:MainAxisSize.min,
children: [
icon,
8.width,
label.heading6(context).custom(color: textColor ?? AppColor.background(context))
],
),
):
label.heading6(context).custom(color: textColor ?? AppColor.background(context)),
).onPress(onPressed);
}
}

@ -1,3 +1,4 @@
import 'dart:developer';
import 'dart:io';
import 'package:flutter/material.dart';

@ -1,25 +1,16 @@
import 'dart:async';
import 'dart:convert';
import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:http/http.dart';
import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/models/helper_data_models/spare_part/activity_spare_part_model.dart';
import 'package:test_sa/models/helper_data_models/workorder/fix_remotely_model.dart';
import 'package:test_sa/models/helper_data_models/workorder/mark_as_fixed_model.dart';
import 'package:test_sa/models/helper_data_models/workorder/need_visit_model.dart';
import 'package:test_sa/models/helper_data_models/workorder/nurse_action_model.dart';
import 'package:test_sa/models/new_models/dashboard_detail.dart';
import 'package:test_sa/models/new_models/workOrderDetail.dart';
import 'package:test_sa/models/service_request/service_report.dart';
import 'package:test_sa/models/service_request/service_request.dart';
import 'package:test_sa/models/service_request/spare_parts.dart';
import 'package:test_sa/models/service_request/supp_engineer_work_orders.dart';
import 'package:test_sa/models/service_request/supplier_engineer_model.dart';
import '../../../models/service_request/wo_call_request.dart';
import '../../../models/user.dart';
import '../../../new_views/common_widgets/app_lazy_loading.dart';
class RequestDetailProvider extends ChangeNotifier {
final pageItemNumber = 10;
@ -28,6 +19,33 @@ class RequestDetailProvider extends ChangeNotifier {
stateCode = null;
}
DateTime timerStartTime = DateTime(0, 0, 0, 0, 0, 0); // Start from 00:00:00
Timer timer;
bool isTimerRunning = false;
void startTimer() {
if (isTimerRunning) return;
timer = Timer.periodic(const Duration(seconds: 1), (Timer t) {
timerStartTime = timerStartTime.add(const Duration(seconds: 1));
notifyListeners(); // Notify UI when time is updated
});
isTimerRunning = true;
notifyListeners(); // Notify UI when timer starts
}
void stopTimer() {
timer?.cancel();
isTimerRunning = false;
notifyListeners(); // Notify UI when timer stops
}
void resetTimer() {
timerStartTime = DateTime(0, 0, 0, 0, 0, 0); // Reset to 00:00:00
notifyListeners();
}
// Getter to get the current time
DateTime get currentTime => timerStartTime;
bool _isLoading = false;
@ -41,6 +59,23 @@ class RequestDetailProvider extends ChangeNotifier {
WorkOrderDetail _currentWorkOrder;
FixRemotely _fixRemotelyModel;
NeedVisit _needVisitModel;
MarkAsFixed _markAsFixed;
ActivitySparePartModel _activitySparePartModel;
ActivitySparePartModel get activitySparePartModel => _activitySparePartModel;
set activitySparePartModel(ActivitySparePartModel value) {
_activitySparePartModel = value;
notifyListeners();
}
MarkAsFixed get markAsFixed => _markAsFixed;
set markAsFixed(MarkAsFixed value) {
_markAsFixed = value;
notifyListeners();
}
NurseActionModel _nurseActionModel;
@ -83,8 +118,6 @@ class RequestDetailProvider extends ChangeNotifier {
_selectedTime = value;
notifyListeners();
} // list of user requests
SparePartsWorkOrders _initialSelectedSparePart = SparePartsWorkOrders();
int _selectedListIndex = 0;
int get selectedListIndex => _selectedListIndex;
@ -219,6 +252,30 @@ class RequestDetailProvider extends ChangeNotifier {
return CommonResponseModel();
}
}
//engineerMarkAsFixed......
Future<CommonResponseModel> engineerMarkAsFixed() async {
try {
isLoading = true;
final response = await ApiManager.instance.post(URLs.engineerMarkAsFixUrl,body: markAsFixed.toJson());
stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
CommonResponseModel commonResponseModel = CommonResponseModel.fromJson(json.decode(response.body));
print('response of Engineer mark as fixed ${commonResponseModel.toJson()}');
notifyListeners();
isLoading = false;
return commonResponseModel;
}
isLoading= false;
notifyListeners();
return CommonResponseModel();
}
catch (e) {
log("engineer accept [error] : $e");
isLoading = false;
notifyListeners();
return CommonResponseModel();
}
}
//assignEngineerToWorkOrder......
Future<CommonResponseModel> assignEngineerWorkOrder({@required String workOrderId,@required String engineerId}) async {
try {
@ -297,74 +354,12 @@ class RequestDetailProvider extends ChangeNotifier {
}
Future<int> updateRequest({@required User user, @required ServiceRequest request}) async {
Future<int> updateActivitySparePart({@required ActivitySparePartModel activitySparePartModel}) async {
isLoading = true;
notifyListeners();
Map<String, dynamic> serviceRequest = await getWorkOrderById(id: request.id) ?? "";
final List callSiteContacts = (serviceRequest['callSiteContactPerson'] as List);
final Map<String, dynamic> callSiteContactPerson = callSiteContacts.isEmpty ? {} : callSiteContacts[0];
Response response;
try {
if ((request.audio ?? "").isNotEmpty) {
request.audio = request.audio.substring(request.audio.indexOf("=") + 1, request.audio.length);
}
} catch (ex) {}
var body = {
"id": request.id,
"callNo": serviceRequest['callNo'],
"callCreatedBy": serviceRequest['callCreatedBy'],
"requestedDate": request.date ?? "",
"requestedTime": request.date ?? "",
"priority": request.priority?.toJson(),
"defectType": request.defectType?.toJson(),
"typeofRequest": request.type?.toJson(),
"requestedThrough": request.requestedThrough?.toJson(),
"voiceNote": request.audio,
"assets": request.deviceId == null ? [] : [request.deviceId],
"attachmentsCallRequest": (request.devicePhotos?.isNotEmpty ?? false) ? request.devicePhotos?.map((e) => {"name": e.getFileName})?.toList() : [],
"assignedEmployee": {
"id": request.engineerId,
"name": request.engineerName,
},
"callSiteContactPerson": [
{
"id": callSiteContactPerson['id'] ?? 0,
"employeeCode": callSiteContactPerson['employeeCode'],
"name": callSiteContactPerson['name'] ?? user.userName,
"telephone": callSiteContactPerson['telephone'] ?? user.phoneNumber,
"job": callSiteContactPerson['job'],
"email": callSiteContactPerson['email'] ?? user.email,
"land": callSiteContactPerson['land'],
"contactUserId": user.userID,
},
],
"callComments": request.callComments,
"noofFollowup": 0,
"status": request.statusId == null
? null
: {
"id": request.statusId,
"name": request.statusLabel,
"value": request.statusValue,
},
"callLastSituation": null,
"firstAction": request.firstAction?.toJson(),
"loanAvailablity": request.loanAvailability?.toJson(),
"comments": request.comments,
"firstActionDate": request.visitDate,
"visitDate": request.visitDate,
"startDate": request.startDate,
"endDate": request.endDate,
"workingHours": request.workingHours,
"callReview": null,
"reviewComment": null,
//"reviewComment": request.reviewComment,
};
try {
response = await ApiManager.instance.put(
URLs.updateRequestDate,
body: body,
final response = await ApiManager.instance.put(
URLs.updateActivitySparePartUrl,
body: activitySparePartModel.toJson(),
);
stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
@ -380,71 +375,50 @@ class RequestDetailProvider extends ChangeNotifier {
return -1;
}
}
Future<int> createServiceReport(BuildContext context, {@required ServiceReport report, @required User user, @required ServiceRequest request}) async {
Response response;
Future<int> deleteActivitySparePart({@required int id,@required int workOrderId}) async {
isLoading = true;
var body = {
'id':id,
'workOrderId':workOrderId,
};
try {
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
final body = report.toJson();
final callRequest = CallRequest(id: num.tryParse(request?.id ?? "")).toJson();
final contactPerson = [
{
"id": 0,
// "employeeCode": "",
"name": user.userName,
"telephone": user.phoneNumber,
// "job": "",
"email": user.email,
// "land": "",
"contactUserId": user.userID,
}
];
body.update("contactPersonWorkOrders", (value) => contactPerson, ifAbsent: () => contactPerson);
body.update("callRequest", (value) => callRequest, ifAbsent: () => callRequest);
response = await ApiManager.instance.post(URLs.createServiceReport, body: body);
final response = await ApiManager.instance.post(
URLs.deleteActivitySparePartUrl,
body: body,
);
stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
reset();
//map to the model...
notifyListeners();
Fluttertoast.showToast(msg: context.translation.successfulRequestMessage);
Navigator.of(context).pop();
} else {
Fluttertoast.showToast(msg: "${context.translation.failedToCompleteRequest}: ${json.decode(response.body)['message']}");
}
Navigator.pop(context);
isLoading = false;
notifyListeners();
return response.statusCode;
} catch (error) {
Navigator.pop(context);
print(error);
isLoading = false;
notifyListeners();
return -1;
}
}
Future<SuppEngineerWorkOrders> addSupplierEngineer(SupplierEngineer supplierEngineer) async {
Future<int> createActivitySparePart({@required ActivitySparePartModel activitySparePartModel}) async {
isLoading = true;
notifyListeners();
Response response;
SuppEngineerWorkOrders res;
try {
response = await ApiManager.instance.post(URLs.addSupplierEngineer, body: supplierEngineer.toJson());
final response = await ApiManager.instance.put(
URLs.createActivitySparePartUrl,
body: activitySparePartModel.toJson(),
);
stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
res = SuppEngineerWorkOrders.fromJson(json.decode(response.body)["data"]);
// request.engineerName = employee.name;
notifyListeners();
}
isLoading = false;
notifyListeners();
return res;
return response.statusCode;
} catch (error) {
isLoading = false;
notifyListeners();
return res;
return -1;
}
}
SparePartsWorkOrders get initialSelectedSparePart => _initialSelectedSparePart;
set initialSelectedSparePart(SparePartsWorkOrders value) {
_initialSelectedSparePart = value;
notifyListeners();
}
}

@ -0,0 +1,165 @@
import 'package:flutter/material.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/common_widgets/app_filled_button.dart';
import 'package:test_sa/service_request_latest/views/components/bottom_sheets/service_request_bottomsheet.dart';
class FooterActionButton {
static Widget footerContainer({@required Widget child}){
return Align(
alignment: Alignment.bottomCenter,
child: Container(
padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth,vertical: 16.toScreenHeight),
color: AppColor.white10,
child: child,
),
);
}
static Widget footerWidget({@required int status,@required BuildContext context}){
switch(status){
//accept reject...
case 1:
return footerContainer(
child:
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
mainAxisSize: MainAxisSize.min,
children: [
AppFilledButton(
label: context.translation.reject,
maxWidth: true,
buttonColor: Colors.white54,
textColor: AppColor.red30,
showBorder: true,
onPressed: () async {
ServiceRequestBottomSheet.rejectRequestBottomSheet(context: context);
},
).expanded,
const SizedBox(
width: 20,
),
AppFilledButton(
label: context.translation.accept,
maxWidth: true,
buttonColor: AppColor.green70,
onPressed: () async {
},
).expanded,
],
)
);
break;
//need visit fixed remotely
case 2:
return footerContainer(
child:
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
mainAxisSize: MainAxisSize.min,
children: [
AppFilledButton(
label: context.translation.needAVisit,
maxWidth: true,
buttonColor: AppColor.neutral50,
onPressed: () async {
ServiceRequestBottomSheet.initialVisitBottomSheet(context: context);
},
).expanded,
const SizedBox(
width: 20,
),
AppFilledButton(
label: context.translation.fixedRemotely,
maxWidth: true,
buttonColor: AppColor.green70,
onPressed: () async {
ServiceRequestBottomSheet.fixRemotelyBottomSheet(context: context);
},
).expanded,
],
)
);
break;
//verify Asset Details
case 3:
return footerContainer(
child:
AppFilledButton(
label: context.translation.verify_asset_details,
// maxWidth: true,
buttonColor: AppColor.primary10,
onPressed: () async {
},
)
);
break;
//Activities
case 4:
return footerContainer(
child:
AppFilledButton(
label: context.translation.activities,
// maxWidth: true,
buttonColor: AppColor.neutral50,
onPressed: () async {
ServiceRequestBottomSheet.activityTypeBottomSheet(context: context);
},
)
);
break;
//I have arrived...
case 5:
return footerContainer(
child:
AppFilledButton(
label: context.translation.iHaveArrived,
showIcon: true,
icon: 'arrived_icon'.toSvgAsset(),
buttonColor: AppColor.green70,
onPressed: () async {
},
)
);
break;
//Close..
case 6:
return footerContainer(
child:
AppFilledButton(
label: context.translation.close,
// maxWidth: true,
buttonColor: AppColor.primary10,
onPressed: () async {
},
)
);
break;
//for nurse to take action...
case 7:
return footerContainer(
child:
AppFilledButton(
label: context.translation.takeAction,
// maxWidth: true,
buttonColor: AppColor.primary10,
onPressed: () async {
},
)
);
break;
default:
return const SizedBox();
}
}
}

@ -1,15 +1,14 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/app_strings/app_asset.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/device/asset.dart';
import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/service_request/service_request.dart';
import 'package:test_sa/models/timer_model.dart';
@ -18,215 +17,13 @@ import 'package:test_sa/providers/service_request_providers/first_action_provide
import 'package:test_sa/service_request_latest/views/forms/spare_part/spare_part_request.dart';
import 'package:test_sa/service_request_latest/views/components/verify_arrival_view.dart';
import 'package:test_sa/views/widgets/date_and_time/date_picker.dart';
import 'package:test_sa/views/widgets/date_and_time/time_picker.dart';
import 'package:test_sa/views/widgets/e_signature/e_signature.dart';
import 'package:test_sa/views/widgets/timer/app_timer.dart';
import '../../../../controllers/providers/api/service_requests_provider.dart';
import '../../../../new_views/app_style/app_color.dart';
import '../../../../new_views/common_widgets/app_filled_button.dart';
import '../../../../new_views/common_widgets/app_text_form_field.dart';
// class FixRemotlyBottomSheet extends StatelessWidget {
//
// FixRemotlyBottomSheet({Key key,}) : super(key: key);
//
// final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
//
// @override
// Widget build(BuildContext context) {
// return Consumer<ServiceRequestsProvider>(
// builder: (context, serviceRequestProvider,child) {
// return StatefulBuilder(
// builder: (BuildContext context, StateSetter setState) {
// return Container(
// clipBehavior: Clip.antiAlias,
// margin: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom),
// decoration: BoxDecoration(
// color: AppColor.background(context),
// borderRadius: const BorderRadius.only(topRight: Radius.circular(20), topLeft: Radius.circular(20)),
// ),
// padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 8.toScreenHeight),
// child: Form(
// key: _formKey,
// child: SingleChildScrollView(
// child: Column(
// crossAxisAlignment: CrossAxisAlignment.start,
// children: [
// Center(
// child: Container(
// width: 40.toScreenWidth,
// height: 5.toScreenHeight,
// decoration: BoxDecoration(color: AppColor.neutral40, borderRadius: BorderRadius.circular(30)),
// ),
// ),
// Align(
// alignment: AlignmentDirectional.centerStart,
// child: context.translation.fillDetails.heading5(context).custom(fontWeight: FontWeight.w500).paddingOnly(top: 16, bottom: 16),
// ),
//
// 8.height,
// ADatePicker(
// label: context.translation.date,
// height: 80.toScreenHeight,
// backgroundColor: AppColor.neutral90,
// date: DateTime.tryParse(serviceRequestProvider.serviceRequest.startDate ?? ""),
// formatDateWithTime: true,
// onDatePicker: (selectedDate) {
// if (selectedDate != null) {
// showTimePicker(
// context: context,
// initialTime: TimeOfDay.now(),
// ).then((selectedTime) {
// // Handle the selected date and time here.
// if (selectedTime != null) {
// DateTime selectedDateTime = DateTime(
// selectedDate.year,
// selectedDate.month,
// selectedDate.day,
// selectedTime.hour,
// selectedTime.minute,
// );
// if (selectedDateTime != null) {
// if (selectedDateTime.isBefore(DateTime.parse(serviceRequestProvider.serviceRequest.date))) {
// "Visit Date time must be greater then request date".showToast;
// return;
// }
//
// setState(() {
// serviceRequestProvider.serviceRequest.startDate = selectedDateTime?.toIso8601String();
// });
// }
// }
// });
// }
// },
// ),
// 8.height,
// ATimePicker(
// label: context.translation.startTime,
// height: 80.toScreenHeight,
// backgroundColor: AppColor.neutral90,
// hint:context.translation.pickTime,
// time: serviceRequestProvider.selectedTime,
// onTimePicker: (selectedTime) {
// //TODO handle selected time here.
// if (selectedTime != null) {
// setState(() {
// serviceRequestProvider.selectedTime = selectedTime;
// });
// // DateTime selectedDateTime = DateTime(
// // selectedDate.year,
// // selectedDate.month,
// // selectedDate.day,
// // selectedTime.hour,
// // selectedTime.minute,
// // );
// // if (selectedDateTime != null) {
// // if (selectedDateTime.isBefore(DateTime.parse(serviceRequestProvider.serviceRequest.date))) {
// // "Visit Date time must be greater then request date".showToast;
// // return;
// // }
// //
//
// // }
// }
// },
// ),
// 8.height,
// ATimePicker(
// label: context.translation.endTime,
// height: 80.toScreenHeight,
// backgroundColor: AppColor.neutral90,
// hint:context.translation.pickTime,
// time: serviceRequestProvider.selectedTime,
// onTimePicker: (selectedTime) {
// //TODO handle selected time here.
// if (selectedTime != null) {
// setState(() {
// serviceRequestProvider.selectedTime = selectedTime;
// });
// }
// },
// ),
// 8.height,
// Container(
// width: double.infinity,
// height: 80.toScreenHeight,
// decoration: BoxDecoration(
// borderRadius: BorderRadius.circular(10),
// color:AppColor.neutral90,
// boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10)],
// ),
// padding: EdgeInsets.symmetric(horizontal: 20.toScreenWidth,vertical: 10.toScreenHeight),
// child: Column(
// crossAxisAlignment: CrossAxisAlignment.start,
// mainAxisAlignment: MainAxisAlignment.start,
// children: [
// context.translation.workingHours.bodyText2(context),
// //TODo calculate the hours and write here.
// 'No of hours'.bodyText(context).custom(color:AppColor.balck10),
// ],
// ),
//
// ),
// 8.height,
// AppTextFormField(
// labelText: context.translation.comments,
// textInputType: TextInputType.multiline,
// alignLabelWithHint: true,
// backgroundColor: AppColor.neutral90,
// onChange: (text) {
// serviceRequestProvider.serviceRequest.comments = text;
// },
// onSaved: (text) {
// serviceRequestProvider.serviceRequest.comments = text;
// },
// ),
// 16.height,
// Row(
// mainAxisAlignment: MainAxisAlignment.spaceBetween,
// children: [
// SizedBox(
// width: 200.toScreenHeight,
// child: AppFilledButton(
// label: context.translation.cancel,
// loading: false,
// buttonColor: Colors.transparent,
// showBorder: true,
// textColor: AppColor.balck10,
// onPressed:
// () async {
// Navigator.pop(context);
// // await snapshot.updateRequest(user: userProvider.user, request: serviceRequestProvider.serviceRequest);
// // Navigator.pop(context, true);
// },
// ),
// ),
// SizedBox(
// width: 200.toScreenHeight,
// child: AppFilledButton(
// label: context.translation.fixed,
// buttonColor: AppColor.green70,
// loading: false,
// onPressed:(){
//
// },
// ),
// ),
// ],
// ),
// 16.height,
// ],
// ),
// ),
// ),
// );
// }
// );
// }
// );
// }
// }
class ServiceRequestBottomSheet {
static Future fixRemotelyBottomSheet({@required BuildContext context}) {
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
@ -606,7 +403,6 @@ class ServiceRequestBottomSheet {
final List<Map<String, String>> items = [
{'heading': context.translation.sparePartRequest, 'subHeading': context.translation.sparePartRequestDetail, 'icon': AppAsset.sparePartIcon},
{'heading': context.translation.maintenanceRequest, 'subHeading': context.translation.sparePartRequestDetail, 'icon': AppAsset.maintenanceIcon},
{'heading': context.translation.assetToBeRetired, 'subHeading': context.translation.sparePartRequestDetail, 'icon': AppAsset.retiredAssetIcon},
];
Widget listItem({@required BuildContext context, @required String icon, @required String heading, @required String subHeading, @required VoidCallback onTap}) {
return Card(
@ -641,6 +437,7 @@ class ServiceRequestBottomSheet {
break;
case 1:
//push to specific screen...
// Navigator.push(
// context,
@ -823,4 +620,95 @@ class ServiceRequestBottomSheet {
);
}));
}
static Future nurseTakeActionBottomSheet({@required BuildContext context}) {
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
return showModalBottomSheet(
context: context,
useSafeArea: true,
isScrollControlled: true,
backgroundColor: Colors.transparent,
builder: (context) => Consumer<ServiceRequestsProvider>(builder: (context, serviceRequestProvider, child) {
return Form(
key: _formKey,
child: SingleChildScrollView(
child: StatefulBuilder(builder: (context, setState) {
bool acknowledge = false;
Uint8List newSignature;
return Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
const SizedBox().indicatorWidget(),
8.height,
Align(
alignment: AlignmentDirectional.centerStart,
child: context.translation.pleaseConfirmTheIssueHasBeenResolved.bottomSheetHeadingTextStyle(context),
),
10.height,
Row(
children: [
Checkbox(
value: serviceRequestProvider.ackhnowledge,
activeColor: AppColor.blueStatus(context),
onChanged: (value) {
setState(() {
acknowledge = !value;
});
print('acknowledge value is $acknowledge');
}),
context.translation.nurseAcknowledge.bodyText(context).custom(color: context.isDark ? AppColor.primary50 : AppColor.neutral120),
],
),
17.height,
ESignature(
title: '',
oldSignature: '',
newSignature: newSignature,
backgroundColor: AppColor.neutral100,
showShadow: false,
onSaved: (signature) {
// if (signature == null || signature.isEmpty) {
// setState(() {});
// return;
// }
if (signature == null || signature.isEmpty) return;
newSignature = signature;
// _subWorkOrders.nurseSignature = signature != null ? "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}" : null;
},
),
16.height,
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
mainAxisSize: MainAxisSize.min,
children: [
AppFilledButton(
label: context.translation.reject,
maxWidth: true,
buttonColor: Colors.white54,
textColor: AppColor.red30,
showBorder: true,
onPressed: () async {
ServiceRequestBottomSheet.rejectRequestBottomSheet(context: context);
},
).expanded,
const SizedBox(
width: 20,
),
AppFilledButton(
label: context.translation.confirm,
maxWidth: true,
buttonColor: AppColor.green70,
onPressed: () async {
},
).expanded,
],
)
],
);
}),
),
).bottomSheetContainer(context);
}));
}
}

@ -0,0 +1,42 @@
import 'package:flutter/material.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/new_views/app_style/app_color.dart';
class InitialVisitCard extends StatelessWidget {
const InitialVisitCard({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(14),
color: AppColor.white10,
),
padding: EdgeInsets.symmetric(horizontal: 12.toScreenWidth, vertical: 14.toScreenHeight),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [
Text(
DateTime.now().toString().toInitialVisitCardFormat,
textAlign: TextAlign.end,
style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.black10),
),
"edit_icon".toSvgAsset(height: 21, width: 21).onPress(() {
//open bottom sheet again with the informations added...
}),
]),
2.height,
context.translation.visitDateAndTime.heading6(context).custom(color: AppColor.neutral120),
8.height,
'Comments for the visit will be visible here for reference'.heading6(context).custom(color: AppColor.neutral120),
],
),
);
}
}

@ -14,10 +14,12 @@ import 'package:test_sa/models/service_request/service_request.dart';
import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/common_widgets/app_filled_button.dart';
import 'package:test_sa/new_views/common_widgets/default_app_bar.dart';
import 'package:test_sa/service_request_latest/views/components/action_button/footer_action_button.dart';
import 'package:test_sa/service_request_latest/views/components/bottom_sheets/service_request_bottomsheet.dart';
import 'package:test_sa/service_request_latest/views/forms/work_order/components/asset_conditon_view.dart';
import 'package:test_sa/service_request_latest/views/forms/work_order/components/attachments_view.dart';
import 'package:test_sa/service_request_latest/views/forms/work_order/work_order_form_view.dart';
import 'package:test_sa/service_request_latest/views/components/initial_visit_card.dart';
import 'package:test_sa/service_request_latest/views/components/timer_widget.dart';
import 'package:test_sa/service_request_latest/views/forms/asset_retired/asset_retired.dart';
import 'package:test_sa/service_request_latest/views/nurse/create_new_request_view.dart';
import 'package:test_sa/views/pages/user/requests/comments_bottom_sheet.dart';
import 'package:test_sa/views/pages/user/requests/update_service_request_page.dart';
import 'package:test_sa/views/pages/user/requests/work_order/work_orders_list_page.dart';
@ -26,12 +28,15 @@ import 'package:test_sa/views/widgets/loaders/app_loading.dart';
import 'package:test_sa/views/widgets/requests/request_status.dart';
import 'package:test_sa/views/widgets/sound/sound_player.dart';
import '../../../models/lookup.dart';
import '../forms/maintenance_request/maintenance_request_main.dart';
class RequestDetailView extends StatefulWidget {
static const String id = "/call-details";
ServiceRequest serviceRequest;
bool fromTabView=false;
bool fromTabView = false;
RequestDetailView({Key key, this.serviceRequest,this.fromTabView=false}) : super(key: key);
RequestDetailView({Key key, this.serviceRequest, this.fromTabView = false}) : super(key: key);
@override
State<RequestDetailView> createState() => _RequestDetailViewState();
@ -50,135 +55,77 @@ class _RequestDetailViewState extends State<RequestDetailView> {
Provider.of<CommentsProvider>(context, listen: false).reset();
ServiceRequestsProvider serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context, listen: false);
serviceRequestsProvider.currentSelectedRequest = await serviceRequestsProvider.getServiceRequestObjectById(requestId: requestId);
print('request id i got is ${serviceRequestsProvider.currentSelectedRequest.id}');
// setState(() {});
});
}
final GlobalKey _detailsCardKey = GlobalKey();
void createBreakPoint(){
final RenderBox detailContainerBox =
_detailsCardKey.currentContext?.findRenderObject() as RenderBox;
final detailContainerHeight = detailContainerBox?.size?.height;
}
@override
Widget build(BuildContext context) {
UserProvider _userProvider = Provider.of<UserProvider>(context, listen: false);
return !widget.fromTabView? Scaffold(
appBar:DefaultAppBar(title: context.translation.serviceDetails),
body: Padding(
padding: EdgeInsets.only(top: 12.toScreenHeight),
child: Consumer<ServiceRequestsProvider>(builder: (context, serviceRequestsProvider, child) {
return requestDetailCard(serviceRequestsProvider: serviceRequestsProvider,userProvider: _userProvider);
}),
),
):Consumer<ServiceRequestsProvider>(builder: (context, serviceRequestsProvider, child) {
return requestDetailCard(serviceRequestsProvider: serviceRequestsProvider,userProvider: _userProvider);
});
return !widget.fromTabView
? Scaffold(
appBar: DefaultAppBar(title: context.translation.serviceDetails),
body: Padding(
padding: EdgeInsets.only(top: 12.toScreenHeight),
child: Consumer<ServiceRequestsProvider>(builder: (context, serviceRequestsProvider, child) {
return requestDetailCard(serviceRequestsProvider: serviceRequestsProvider, userProvider: _userProvider);
}),
),
)
: Consumer<ServiceRequestsProvider>(builder: (context, serviceRequestsProvider, child) {
return requestDetailCard(serviceRequestsProvider: serviceRequestsProvider, userProvider: _userProvider);
});
}
Widget requestDetailCard({ ServiceRequestsProvider serviceRequestsProvider,UserProvider userProvider}){
Widget requestDetailCard({ServiceRequestsProvider serviceRequestsProvider, UserProvider userProvider}) {
if(!serviceRequestsProvider.isDetialLoading){
createBreakPoint();
}
return SafeArea(
key: _detailsCardKey,
child: serviceRequestsProvider.isDetialLoading
? const ALoading().center
: serviceRequestsProvider.currentSelectedRequest == null
? Text(
context.translation.noDataFound,
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
).center
: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SingleChildScrollView(
padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth),
child: informationCard(serviceRequestsProvider.currentSelectedRequest,userProvider),
).expanded,
Center(
child: InkWell(
onTap: () async {
try{
//use a common list
AllRequestsProvider allRequestProvider = Provider.of<AllRequestsProvider>(context, listen: false);
int index = allRequestProvider.requestDetailList.requestsDetails.indexWhere((element) => element.id.toString() == serviceRequestsProvider.currentSelectedRequest.id);
if (index != -1 && index != allRequestProvider.requestDetailList.requestsDetails.length) {
getServiceRequest(requestId: allRequestProvider.requestDetailList.requestsDetails[index + 1].id.toString());
}
}catch(e){
print(e);
}
},
child: Text(
context.translation.skipForLater,
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20, decoration: TextDecoration.underline, fontSize: 16),
),
),
),
20.height,
if (userProvider.user.type == UsersTypes.engineer ||
(serviceRequestsProvider.currentSelectedRequest.statusValue == 5 || serviceRequestsProvider.currentSelectedRequest.statusValue == 3))
(serviceRequestsProvider.currentSelectedRequest?.firstAction == null
? Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
mainAxisSize: MainAxisSize.min,
children: [
AppFilledButton(
label: context.translation.reject,
maxWidth: true,
buttonColor: Colors.white54,
textColor: AppColor.red30,
showBorder: true,
onPressed: () async {
// ServiceRequestBottomSheet.rejectRequestBottomSheet(context: context);
Navigator.of(context).push(MaterialPageRoute(builder: (_) => const WorkOrderFormView()));
? Text(
context.translation.noDataFound,
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
).center
: Stack(
children: [
SingleChildScrollView(
padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
informationCard(serviceRequestsProvider.currentSelectedRequest, userProvider),
// bool shouldReloadData = (await showModalBottomSheet(
// context: context,
// useSafeArea: true,
// isScrollControlled: true,
// backgroundColor: Colors.transparent,
// builder: (context) => RejectRequestBottomSheet(),
// )) as bool;
// if (shouldReloadData ?? false) {
// getServiceRequest();
// }
},
).expanded,
const SizedBox(
width: 20,
40.height,
// skipForLater(serviceRequestsProvider.currentSelectedRequest),
// 20.height,
const InitialVisitCard(),
20.height,
],
),
),
FooterActionButton.footerWidget(status: 1, context: context),
const TimerWidget(),
],
),
AppFilledButton(
label: context.translation.accept,
maxWidth: true,
buttonColor: AppColor.green70,
onPressed: () async {
// const SizedBox().flushBar(context: context);
ServiceRequestBottomSheet.feedBackBottomSheet(context: context);
// ServiceRequestBottomSheet.fixRemotelyBottomSheet(context: context);
// bool shouldReloadData = (await showModalBottomSheet(
// context: context,
// useSafeArea: true,
// isScrollControlled: true,
// backgroundColor: Colors.transparent,
// builder: (context) => InitialVisitBottomSheet(),
// )) as bool;
// if (shouldReloadData ?? false) {
// getServiceRequest();
// }
},
).expanded,
],
)
: AppFilledButton(
label: context.translation.viewWorkOrder,
maxWidth: true,
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => WorkOrderListPage(serviceRequest: serviceRequestsProvider.currentSelectedRequest)),
);
// Navigator.of(context).pushNamed(WorkOrderListPage.id, arguments: serviceRequest);
},
))
.paddingOnly(start: 16, end: 16, bottom: 24),
],
),
);
}
Widget informationCard(ServiceRequest serviceRequest,UserProvider userProvider) {
Widget informationCard(ServiceRequest serviceRequest, UserProvider userProvider) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
@ -320,51 +267,51 @@ class _RequestDetailViewState extends State<RequestDetailView> {
],
).paddingOnly(start: 16, end: 16, top: 16, bottom: 8),
(userProvider.user.type == UsersTypes.normal_user
? Container(
height: 50,
padding: const EdgeInsets.only(left: 16, right: 16),
alignment: Alignment.center,
width: double.infinity,
decoration: ShapeDecoration(
color: context.isDark ? AppColor.neutral50 : AppColor.neutral30,
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.only(
bottomLeft: Radius.circular(20),
bottomRight: Radius.circular(20),
),
),
),
child: Row(
children: [
Text(
'${context.translation.commentHere}...',
style: AppTextStyles.heading6.copyWith(
color: (context.isDark ? AppColor.neutral30 : AppColor.neutral50).withOpacity(.6),
),
).expanded,
"comment_send".toSvgAsset(width: 24, color: context.isDark ? AppColor.primary50 : AppColor.primary70),
],
),
)
: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Divider().defaultStyle(context),
16.height,
Row(
mainAxisSize: MainAxisSize.min,
children: [
Text(
context.translation.viewComments,
style: AppTextStyles.bodyText.copyWith(color: AppColor.blueStatus(context)),
),
4.width,
Icon(Icons.arrow_forward, color: AppColor.blueStatus(context), size: 14)
],
),
],
).paddingOnly(bottom: 16, start: 16, end: 16))
? Container(
height: 50,
padding: const EdgeInsets.only(left: 16, right: 16),
alignment: Alignment.center,
width: double.infinity,
decoration: ShapeDecoration(
color: context.isDark ? AppColor.neutral50 : AppColor.neutral30,
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.only(
bottomLeft: Radius.circular(20),
bottomRight: Radius.circular(20),
),
),
),
child: Row(
children: [
Text(
'${context.translation.commentHere}...',
style: AppTextStyles.heading6.copyWith(
color: (context.isDark ? AppColor.neutral30 : AppColor.neutral50).withOpacity(.6),
),
).expanded,
"comment_send".toSvgAsset(width: 24, color: context.isDark ? AppColor.primary50 : AppColor.primary70),
],
),
)
: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Divider().defaultStyle(context),
16.height,
Row(
mainAxisSize: MainAxisSize.min,
children: [
Text(
context.translation.viewComments,
style: AppTextStyles.bodyText.copyWith(color: AppColor.blueStatus(context)),
),
4.width,
Icon(Icons.arrow_forward, color: AppColor.blueStatus(context), size: 14)
],
),
],
).paddingOnly(bottom: 16, start: 16, end: 16))
.onPress(() {
showModalBottomSheet(
context: context,
@ -375,7 +322,56 @@ class _RequestDetailViewState extends State<RequestDetailView> {
builder: (context) => CommentsBottomSheet(requestId: serviceRequest.id),
);
}),
//set condition for show asset detail button...
if(true)...[
assetRetiredButton(serviceRequest: serviceRequest),
]
],
).toShadowContainer(context, padding: 0);
}
Widget assetRetiredButton({ServiceRequest serviceRequest}){
return Padding(
padding: EdgeInsets.symmetric(horizontal: 16.toScreenHeight,vertical: 12.toScreenWidth),
child: AppFilledButton(
label: context.translation.assetToBeRetired,
maxWidth: true,
buttonColor: Colors.white54,
textColor: AppColor.red30,
showBorder: true,
onPressed: () async {
// ServiceRequestBottomSheet.nurseTakeActionBottomSheet(context: context);
Navigator.push(context, MaterialPageRoute(builder: (context)=>const AssetRetired()));
}
),
);
}
Widget skipForLater (ServiceRequest serviceRequest){
return Center(
child: InkWell(
onTap: () async {
try {
//use a common list
AllRequestsProvider allRequestProvider = Provider.of<AllRequestsProvider>(context, listen: false);
int index = allRequestProvider.requestDetailList.requestsDetails.indexWhere((element) => element.id.toString() == serviceRequest.id);
if (index != -1 && index != allRequestProvider.requestDetailList.requestsDetails.length) {
getServiceRequest(requestId: allRequestProvider.requestDetailList.requestsDetails[index + 1].id.toString());
}
} catch (e) {
print(e);
}
},
child: Text(
context.translation.skipForLater,
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20, decoration: TextDecoration.underline, fontSize: 16),
),
),
);
}
}

@ -0,0 +1,195 @@
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/models/size_config.dart';
import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/service_request_latest/request_detail_provider.dart';
class TimerWidget extends StatefulWidget {
const TimerWidget({Key key}) : super(key: key);
@override
_TimerWidgetState createState() => _TimerWidgetState();
}
class _TimerWidgetState extends State<TimerWidget> {
Offset position = Offset(SizeConfig.screenWidth - 100, SizeConfig.screenHeight / 2 - 50);
@override
void initState() {
// TODO: implement initState
Provider.of<RequestDetailProvider>(context,listen: false).startTimer();
super.initState();
}
@override
void dispose() {
// TODO: implement dispose
//dispose the timer...
super.dispose();
}
@override
Widget build(BuildContext context) {
return Consumer<RequestDetailProvider>(
builder: (context, provider, child) {
return Positioned(
left: position.dx,
top: position.dy,
child: GestureDetector(
onPanEnd: (details){},
onPanUpdate: (details) {
setState(() {
if (position.dy + details.delta.dy > 0 && position.dy + details.delta.dy < 560) {
position = Offset(
position.dx + details.delta.dx, // Update the X position
position.dy + details.delta.dy, // Update the Y position
);
}
});
},
child: buildTimerWidget(provider),
),
);
},
);
}
Widget buildTimerWidget(RequestDetailProvider provider) {
return GestureDetector(
onTap: () {
if (provider.isTimerRunning) {
provider.stopTimer();
} else {
provider.startTimer();
}
},
child: Container(
padding: EdgeInsets.all(8.toScreenHeight),
width: 80.toScreenWidth,
decoration: BoxDecoration(
color: AppColor.black10,
borderRadius: BorderRadius.circular(10),
),
child:
Column(
children: [
'drag_icon'.toSvgAsset(),
12.height,
provider.currentTime.toString().toDragAbleTimerFormat.tinyFont(context).custom(color: AppColor.white10, fontWeight: FontWeight.w600),
2.height,
context.translation.hours.tinyFont(context).custom(color: AppColor.white10, fontWeight: FontWeight.w600),
],
),
),
);
}
}
//older code...
// DateTime startTime = DateTime(0, 0, 0, 0, 0, 0); // Start from 00:00:00
// Timer timer;
// bool isRunning = false;
//
// @override
// void initState() {
// super.initState();
// startTimer();
// }
//
// void startTimer() {
// if (isRunning) return;
// timer = Timer.periodic(const Duration(seconds: 1), (Timer t) {
// setState(() {
// startTime = startTime.add(const Duration(seconds: 1));
// });
// });
// setState(() {
// isRunning = true;
// });
// }
//
// void stopTimer() {
// timer?.cancel();
// setState(() {
// isRunning = false;
// });
// }
// @override
// void dispose() {
// timer?.cancel();
// super.dispose();
// }
//
// @override
// Widget build(BuildContext context) {
// return Positioned(
// left: position.dx,
// top: position.dy,
// child: GestureDetector(
// onPanUpdate: (details) {
// setState(() {
// //calculate the exact bonds to be restrict the drag..
// if(position.dy + details.delta.dy>0&&position.dy + details.delta.dy<560){
// position = Offset(
// position.dx + details.delta.dx, // Update the X position
// position.dy + details.delta.dy, // Update the Y position
// );
// }
// });
// },
// child: buildTimerWidget(),
// ),
// );
// // return Positioned(
// // left: position.dx,
// // top: position.dy,
// // child: Draggable(
// // feedback: buildTimerWidget(),
// // childWhenDragging: Container(),
// // onDragEnd: (dragDetails) {
// // setState(() {
// // // Get the RenderBox of the parent widget (Stack)
// // final renderBox = context.findRenderObject() as RenderBox;
// //
// // // Convert the global position to a local position inside the Stack
// // position = dragDetails.offset;
// // });
// // },
// // child: buildTimerWidget(),
// // ),
// // );
// }
//
// Widget buildTimerWidget() {
// return GestureDetector(
// onTap: (){
// if(isRunning){
// stopTimer();
// }else{
// startTimer();
// }
// },
// child: Container(
// padding: EdgeInsets.all(8.toScreenHeight),
// width: 80.toScreenWidth,
// decoration: BoxDecoration(
// color: AppColor.black10,
// borderRadius: BorderRadius.circular(10),
// ),
// child: Column(
// children: [
// 'drag_icon'.toSvgAsset(),
// 12.height,
// startTime.toString().toDragAbleTimerFormat.tinyFont(context).custom(color: AppColor.white10, fontWeight: FontWeight.w600),
// 2.height,
// context.translation.hours.tinyFont(context).custom(color: AppColor.white10, fontWeight: FontWeight.w600),
// ],
// ),
// ),
// );
// }

@ -82,7 +82,6 @@ class VerifyArrivalView extends StatelessWidget {
}
void onItemTap({@required int index, @required ServiceRequest serviceRequest,@required BuildContext context}) {
print('on item tap i got index is $index');
switch(index){
case 0:
Navigator.push(

@ -0,0 +1,88 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/all_requests_provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/enums/user_types.dart';
import 'package:test_sa/models/service_request/search_work_order.dart';
import 'package:test_sa/models/service_request/service_request.dart';
import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/views/pages/user/requests/work_order/update_service_report.dart';
import 'package:test_sa/views/pages/user/requests/work_order/work_order_details_page.dart';
import '../../../../views/widgets/requests/request_status.dart';
class WorkOrderCardView extends StatelessWidget {
final SearchWorkOrder workOrder;
final ServiceRequest serviceRequest;
final bool showShadow;
WorkOrderCardView(this.workOrder, this.serviceRequest, {Key key, this.showShadow = true}) : super(key: key);
@override
Widget build(BuildContext context) {
UserProvider _userProvider = Provider.of<UserProvider>(context, listen: false);
return Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
StatusLabel(
label: workOrder.currentSituation.name,
textColor: AppColor.getRequestStatusTextColorByName(context, workOrder.currentSituation.name),
backgroundColor: AppColor.getRequestStatusColorByName(context, workOrder.currentSituation.name),
),
8.height,
Text(serviceRequest.requestCode, style: AppTextStyles.heading5.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50)),
Text(
'${context.translation.assetName}: ${workOrder.callRequest.asset.modelDefinition.assetName?.cleanupWhitespace?.capitalizeFirstOfEach}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
),
Text(
'${context.translation.currentSituation}: ${workOrder.currentSituation.name}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
),
16.height,
Row(
mainAxisSize: MainAxisSize.min,
children: [
Text(
context.translation.readCompleteThread,
style: AppTextStyles.bodyText.copyWith(color: AppColor.blueStatus(context), decoration: TextDecoration.underline),
),
// 4.width,
// Icon(Icons.arrow_forward, color: AppColor.blueStatus(context), size: 14)
],
),
],
).onPress(() {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => WorkOrderDetailsPage(workOrder: workOrder, serviceRequest: serviceRequest)),
);
}).expanded,
Column(
crossAxisAlignment: CrossAxisAlignment.end,
mainAxisAlignment: MainAxisAlignment.start,
children: [
if (_userProvider.user.type == UsersTypes.engineer && serviceRequest.statusValue != 5 && serviceRequest.statusValue != 3)
"edit_icon".toSvgAsset(height: 21, width: 21).onPress(() {
Navigator.of(context).push(
MaterialPageRoute(builder: (_) => UpdateServiceReport(request: serviceRequest, workOrder: workOrder)),
);
}),
if (_userProvider.user.type == UsersTypes.engineer && serviceRequest.statusValue != 5 && serviceRequest.statusValue != 3) 8.height,
Text(workOrder.visitDate?.toServiceRequestCardFormat ?? "",
textAlign: TextAlign.end, style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral30 : const Color(0xFF3B3D4A))),
],
)
],
).toShadowContainer(context);
}
}

@ -0,0 +1,168 @@
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/service_requests_provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/device/asset.dart';
import 'package:test_sa/models/service_request/service_report.dart';
import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/common_widgets/app_filled_button.dart';
import 'package:test_sa/new_views/common_widgets/app_text_form_field.dart';
import 'package:test_sa/new_views/common_widgets/single_item_drop_down_menu.dart';
import 'package:test_sa/providers/work_order/reason_provider.dart';
import 'package:test_sa/service_request_latest/views/components/action_button/footer_action_button.dart';
import 'package:test_sa/views/widgets/images/multi_image_picker.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
import '../../../../../../controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart';
import '../../../../../../controllers/providers/api/status_drop_down/report/service_types_provider.dart';
import '../../../../../../models/lookup.dart';
import '../../../../../../new_views/common_widgets/default_app_bar.dart';
class AssetRetired extends StatefulWidget {
static const String id = "/asset-tobe-retired";
const AssetRetired({Key key}) : super(key: key);
@override
_AssetRetiredState createState() => _AssetRetiredState();
}
class _AssetRetiredState extends State<AssetRetired> with TickerProviderStateMixin {
UserProvider _userProvider;
SettingProvider _settingProvider;
ServiceRequestsProvider _serviceRequestsProvider;
ServiceStatusProvider _assetTypeProvider;
ServiceReport _serviceReport;
bool _isLoading = false;
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
@override
void initState() {
_serviceReport = ServiceReport(
// returnToService: DateTime.now(),
// //type: const Lookup(value: 2),
// device: widget.request.device,
sparePartsWorkOrders: [],
);
super.initState();
if (context.mounted) {
ServiceRequestsProvider serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context, listen: false);
Provider.of<ServiceReportLastCallsProvider>(context, listen: false).reset();
Provider.of<ReasonProvider>(context, listen: false).reset();
Provider.of<ReasonProvider>(context, listen: false).serviceRequestId = serviceRequestsProvider.currentSelectedRequest.id;
}
// _isLoading = true;
}
Asset loanAvailabilityAsset;
void getRequestForWorkOrder() async {
_isLoading = true;
setState(() {});
ServiceRequestsProvider serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context, listen: false);
_serviceReport.callRequest = await _serviceRequestsProvider.getCallRequestForWorkOrder(callId: serviceRequestsProvider.currentSelectedRequest.id);
await _assetTypeProvider.getTypes(user: _userProvider.user, host: _settingProvider.host);
_serviceReport.assignedEmployee = _serviceReport.callRequest?.assignedEmployee;
_serviceReport.equipmentStatus = _serviceReport.callRequest?.defectType;
_serviceReport.serviceType = Lookup(id: 65, name: "Interval", value: 1); // default value in service type as in web
_isLoading = false;
setState(() {});
}
@override
Widget build(BuildContext context) {
_userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context);
_serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context);
_assetTypeProvider = Provider.of<ServiceStatusProvider>(context);
if (_serviceReport.callRequest == null) {
getRequestForWorkOrder();
}
_serviceReport.assetType = _assetTypeProvider.statuses?.firstWhere(
(element) => element.value == _serviceReport.callRequest?.assetType,
orElse: () => null,
);
final List<File> _files = [];
return Scaffold(
key: _scaffoldKey,
appBar: DefaultAppBar(title: context.translation.assetToBeRetired),
body: Consumer<ServiceRequestsProvider>(builder: (context, serviceRequestProvider, child) {
return SafeArea(
child: LoadingManager(
isLoading: _isLoading,
isFailedLoading: false,
stateCode: 200,
onRefresh: () async {},
child: Form(
key: _formKey,
child: Column(
children: [
SingleChildScrollView(
child: Card(
child: Column(
children: [
12.height,
SingleItemDropDownMenu<Lookup, ReasonProvider>(
context: context,
title: context.translation.failureReason,
backgroundColor: AppColor.neutral100,
height: 70.toScreenHeight,
showShadow: false,
// initialValue: _subWorkOrders.reason,
onSelect: (value) {
if (value != null) {
// _subWorkOrders.reason = value;
}
},
),
8.height,
AppTextFormField(
labelText: context.translation.comments,
textInputType: TextInputType.multiline,
showWithoutDecoration: true,
backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral100,
alignLabelWithHint: true,
onChange: (text) {
serviceRequestProvider.currentSelectedRequest.comments = text;
},
onSaved: (text) {
serviceRequestProvider.currentSelectedRequest.comments = text;
},
),
23.height,
MultiFilesPicker(label: context.translation.attachFiles,
files: _files,
buttonIcon: 'image-plus'?.toSvgAsset(),
),
],
).paddingOnly(start:13,end: 13,top: 16,bottom: 16),
).paddingAll(16),
).expanded,
FooterActionButton.footerContainer(
child: AppFilledButton(
label: context.translation.submit,
buttonColor: AppColor.primary10,
onPressed: () async {
//
},
),
),
],
),
),
),
);
}),
);
}
}

@ -0,0 +1,283 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/parts_provider.dart';
import 'package:test_sa/controllers/providers/api/service_requests_provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/device/asset.dart';
import 'package:test_sa/models/service_request/service_report.dart';
import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/common_widgets/app_filled_button.dart';
import 'package:test_sa/new_views/common_widgets/single_item_drop_down_menu.dart';
import 'package:test_sa/providers/service_request_providers/loan_availability_provider.dart';
import 'package:test_sa/providers/work_order/reason_provider.dart';
import 'package:test_sa/views/widgets/date_and_time/date_picker.dart';
import 'package:test_sa/views/widgets/equipment/pick_asset.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
import '../../../../../../controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart';
import '../../../../../../controllers/providers/api/status_drop_down/report/service_types_provider.dart';
import '../../../../../../models/lookup.dart';
import '../../../../../../new_views/common_widgets/default_app_bar.dart';
class VerifyAssetDetails extends StatefulWidget {
static const String id = "/verify-asset-detail";
const VerifyAssetDetails({Key key}) : super(key: key);
@override
_VerifyAssetDetailsState createState() => _VerifyAssetDetailsState();
}
class _VerifyAssetDetailsState extends State<VerifyAssetDetails> with TickerProviderStateMixin {
UserProvider _userProvider;
SettingProvider _settingProvider;
ServiceRequestsProvider _serviceRequestsProvider;
ServiceStatusProvider _assetTypeProvider;
PartsProvider _partsProvider;
ServiceReport _serviceReport;
bool _isLoading = false;
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
int _selectedValue = 1;
@override
void initState() {
_serviceReport = ServiceReport(
// returnToService: DateTime.now(),
// //type: const Lookup(value: 2),
// device: widget.request.device,
sparePartsWorkOrders: [],
);
super.initState();
if (context.mounted) {
ServiceRequestsProvider serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context, listen: false);
Provider.of<ServiceReportLastCallsProvider>(context, listen: false).reset();
Provider.of<ReasonProvider>(context, listen: false).reset();
Provider.of<ReasonProvider>(context, listen: false).serviceRequestId = serviceRequestsProvider.currentSelectedRequest.id;
}
// _isLoading = true;
}
Asset loanAvailabilityAsset;
void getRequestForWorkOrder() async {
_isLoading = true;
setState(() {});
ServiceRequestsProvider serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context, listen: false);
_serviceReport.callRequest = await _serviceRequestsProvider.getCallRequestForWorkOrder(callId: serviceRequestsProvider.currentSelectedRequest.id);
await _assetTypeProvider.getTypes(user: _userProvider.user, host: _settingProvider.host);
_serviceReport.assignedEmployee = _serviceReport.callRequest?.assignedEmployee;
_serviceReport.equipmentStatus = _serviceReport.callRequest?.defectType;
_serviceReport.serviceType = Lookup(id: 65, name: "Interval", value: 1); // default value in service type as in web
_isLoading = false;
setState(() {});
}
@override
Widget build(BuildContext context) {
_userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context);
_serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context);
_assetTypeProvider = Provider.of<ServiceStatusProvider>(context);
_partsProvider = Provider.of<PartsProvider>(context);
if (_serviceReport.callRequest == null) {
getRequestForWorkOrder();
}
_serviceReport.assetType = _assetTypeProvider.statuses?.firstWhere(
(element) => element.value == _serviceReport.callRequest?.assetType,
orElse: () => null,
);
return Scaffold(
key: _scaffoldKey,
appBar: DefaultAppBar(title: context.translation.verify_asset_details),
body: Consumer<ServiceRequestsProvider>(builder: (context, serviceRequestProvider, child) {
return SafeArea(
child: LoadingManager(
isLoading: _isLoading,
isFailedLoading: false,
stateCode: 200,
onRefresh: () async {},
child: Form(
key: _formKey,
child: Column(
children: [
SingleChildScrollView(
child: Card(
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
context.translation.equipmentStatus.bodyText(context).custom(color: AppColor.black20),
12.height,
assetStatusWidget(context),
24.height,
ADatePicker(
label: context.translation.returnToService,
hideShadow: true,
height: 70.toScreenHeight,
backgroundColor: AppColor.neutral100,
date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest.startDate ?? ""),
formatDateWithTime: true,
onDatePicker: (selectedDate) {
if (selectedDate != null) {
showTimePicker(
context: context,
initialTime: TimeOfDay.now(),
).then((selectedTime) {
// Handle the selected date and time here.
if (selectedTime != null) {
DateTime selectedDateTime = DateTime(
selectedDate.year,
selectedDate.month,
selectedDate.day,
selectedTime.hour,
selectedTime.minute,
);
if (selectedDateTime != null) {
if (selectedDateTime.isBefore(DateTime.parse(serviceRequestProvider.currentSelectedRequest.date))) {
"Visit Date time must be greater then request date".showToast;
return;
}
setState(() {
serviceRequestProvider.currentSelectedRequest.startDate = selectedDateTime?.toIso8601String();
});
print('start date i got is ${serviceRequestProvider.currentSelectedRequest.startDate}');
}
}
});
}
},
),
8.height,
SingleItemDropDownMenu<Lookup, LoanAvailabilityProvider>(
context: context,
title: context.translation.loanAvailability,
initialValue: _serviceReport?.loanAvailablity,
onSelect: (status) {
if (status != null) {
setState(() {
_serviceReport.loanAvailablity = status;
if (_serviceReport.loanAvailablity.value != 1) {
loanAvailabilityAsset = null;
_serviceReport.assetLoan = null;
}
});
}
},
),
if (_serviceReport?.loanAvailablity?.value == 1) 8.height,
if (_serviceReport?.loanAvailablity?.value == 1)
PickAsset(
device: loanAvailabilityAsset, // ?? _serviceReport.device,
onPickAsset: (asset) {
if (asset != null) {
_serviceReport.assetLoan = AssetInfo.fromJson(asset.toJson());
setState(() {
loanAvailabilityAsset = asset;
});
}
},
),
8.height,
SingleItemDropDownMenu<Lookup, ReasonProvider>(
context: context,
title: context.translation.failureReason,
backgroundColor: AppColor.neutral100,
height: 70.toScreenHeight,
showShadow: false,
// initialValue: _subWorkOrders.reason,
onSelect: (value) {
if (value != null) {
// _subWorkOrders.reason = value;
}
},
),
8.height,
SingleItemDropDownMenu<Lookup, ReasonProvider>(
context: context,
title: context.translation.faultDescription,
backgroundColor: AppColor.neutral100,
height: 70.toScreenHeight,
showShadow: false,
// initialValue: _subWorkOrders.reason,
onSelect: (value) {
if (value != null) {
// _subWorkOrders.reason = value;
}
},
),
11.height,
context.translation.solutions.heading6(context).custom(color: AppColor.neutral50),
11.height,
//TODO solution from api...
'Solution number one \nSolution number two'.heading6(context).custom(color: AppColor.neutral50),
],
).paddingOnly(start:13,end: 13,top: 16,bottom: 16),
).paddingAll(16),
).expanded,
Container(
padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth,vertical: 16.toScreenHeight),
color: AppColor.white10,
child: AppFilledButton(
label: context.translation.verify_asset_details,
buttonColor: AppColor.primary10,
onPressed: () async {
},
),
),
],
),
),
),
);
}),
);
}
Widget assetStatusWidget(BuildContext context) {
return Row(
mainAxisSize: MainAxisSize.min,
children: [
radioButtonWidget(label: context.translation.up_and_running, value: 1),
radioButtonWidget(label: context.translation.partially_down, value: 2),
radioButtonWidget(label: context.translation.fully_down, value: 3),
],
);
}
Widget radioButtonWidget({@required String label, @required dynamic value}) {
return Row(
mainAxisSize: MainAxisSize.min,
children: [
SizedBox(
width: 20.toScreenWidth,
height: 40.toScreenHeight,
//TODO use the type required according data..
child: Radio<int>(
activeColor: AppColor.primary10,
value: value,
groupValue: _selectedValue,
onChanged: (int value) {
setState(() {
_selectedValue = value;
});
},
),
),
8.width,
Text(
label,
style: AppTextStyles.tinyFont,
),
13.width,
],
);
}
}

@ -0,0 +1,279 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/parts_provider.dart';
import 'package:test_sa/controllers/providers/api/service_requests_provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/device/asset.dart';
import 'package:test_sa/models/service_request/service_report.dart';
import 'package:test_sa/models/service_request/service_request.dart';
import 'package:test_sa/models/service_request/supp_engineer_work_orders.dart';
import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/common_widgets/app_filled_button.dart';
import 'package:test_sa/providers/loading_list_notifier.dart';
import 'package:test_sa/providers/work_order/reason_provider.dart';
import 'package:test_sa/service_request_latest/views/components/action_button/footer_action_button.dart';
import 'package:test_sa/views/widgets/date_and_time/time_picker.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
import '../../../../../controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart';
import '../../../../../controllers/providers/api/status_drop_down/report/service_types_provider.dart';
import '../../../../../models/lookup.dart';
import '../../../../../new_views/common_widgets/app_text_form_field.dart';
import '../../../../../new_views/common_widgets/single_item_drop_down_menu.dart';
class ExternalMaintenanceRequest extends StatefulWidget {
static const String id = "/add-external-activity";
const ExternalMaintenanceRequest({Key key}) : super(key: key);
@override
_ExternalMaintenanceRequestState createState() => _ExternalMaintenanceRequestState();
}
class _ExternalMaintenanceRequestState extends State<ExternalMaintenanceRequest> with TickerProviderStateMixin {
UserProvider _userProvider;
SettingProvider _settingProvider;
ServiceRequest _request;
ServiceRequestsProvider _serviceRequestsProvider;
ServiceStatusProvider _assetTypeProvider;
ServiceReport _serviceReport;
bool _isLoading = false;
TimeOfDay _startTime;
int _selectedValue = 1;
TimeOfDay _endTime;
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final TextEditingController _faultController = TextEditingController();
final TextEditingController _workPreformedController = TextEditingController();
final TextEditingController _partQtyController = TextEditingController();
@override
void initState() {
_serviceReport = ServiceReport(
// returnToService: DateTime.now(),
// //type: const Lookup(value: 2),
// device: widget.request.device,
sparePartsWorkOrders: [],
);
super.initState();
if (context.mounted) {
_request = Provider.of<ServiceRequestsProvider>(context, listen: false).currentSelectedRequest;
Provider.of<ServiceReportLastCallsProvider>(context, listen: false).reset();
Provider.of<ReasonProvider>(context, listen: false).reset();
Provider.of<ReasonProvider>(context, listen: false).serviceRequestId = _request.id;
}
// _isLoading = true;
}
Asset loanAvailabilityAsset;
@override
void dispose() {
_faultController.dispose();
_workPreformedController.dispose();
_partQtyController.dispose();
super.dispose();
}
void getRequestForWorkOrder() async {
_isLoading = true;
setState(() {});
_serviceReport.callRequest = await _serviceRequestsProvider.getCallRequestForWorkOrder(callId: _request.id);
await _assetTypeProvider.getTypes(user: _userProvider.user, host: _settingProvider.host);
_serviceReport.assignedEmployee = _serviceReport.callRequest?.assignedEmployee;
_serviceReport.equipmentStatus = _serviceReport.callRequest?.defectType;
_serviceReport.serviceType = Lookup(id: 65, name: "Interval", value: 1); // default value in service type as in web
_isLoading = false;
setState(() {});
}
@override
Widget build(BuildContext context) {
_userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context);
_serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context);
_assetTypeProvider = Provider.of<ServiceStatusProvider>(context);
if (_serviceReport.callRequest == null) {
getRequestForWorkOrder();
}
_serviceReport.assetType = _assetTypeProvider.statuses?.firstWhere(
(element) => element.value == _serviceReport.callRequest?.assetType,
orElse: () => null,
);
return LoadingManager(
isLoading: _isLoading,
isFailedLoading: false,
stateCode: 200,
onRefresh: () async {},
child: Stack(
children: [
SingleChildScrollView(
child: Form(
key: _formKey,
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
8.height,
SingleItemDropDownMenu<Lookup, NullableLoadingProvider>(
context: context,
height: 70.toScreenHeight,
title: context.translation.supplier,
showShadow: false,
backgroundColor: AppColor.neutral100,
staticData: Provider.of<ServiceReportLastCallsProvider>(context).calls,
initialValue: _serviceReport?.calllastSituation,
onSelect: (status) {
_serviceReport.calllastSituation = status;
},
),
// Container(
// height: 60.toScreenHeight,
// width: 60.toScreenWidth,
// decoration: BoxDecoration(
// color: _subWorkOrders.supplier?.suppliername == null ? AppColor.neutral40 : AppColor.background(context),
// borderRadius: BorderRadius.circular(10),
// boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10)],
// ),
// child: Icon(
// Icons.add,
// color: context.isDark ? null : AppColor.neutral60,
// ),
// ).onPress(_subWorkOrders.supplier?.suppliername == null
// ? null
// : () async {
// SuppEngineerWorkOrders suppEngineer = (await showModalBottomSheet(
// context: context,
// useSafeArea: true,
// isScrollControlled: true,
// backgroundColor: Colors.transparent,
// builder: (context) => AddSupplierEngineerBottomSheet(_subWorkOrders.supplier.id),
// )) as SuppEngineerWorkOrders;
// if (suppEngineer != null) {
// _subWorkOrders?.supplier?.suppPersons ??= [];
// _subWorkOrders?.supplier?.suppPersons?.add(SuppPersons.fromJson(suppEngineer.toJson()));
// engineer = suppEngineer;
// setState(() {});
// }
// }),
8.height,
Row(
mainAxisSize: MainAxisSize.min,
children: [
ATimePicker(
label: context.translation.startTime,
hint: context.translation.select,
withBorder: false,
icon: 'clock',
withIcon: true,
backgroundColor: AppColor.neutral100,
height: 70.toScreenHeight,
time: _startTime,
onTimePicker: (selectedTime) {
if (selectedTime != null) {
print('time selected $selectedTime');
setState(() {
_startTime = selectedTime;
});
}
},
).expanded,
8.width,
ATimePicker(
label: context.translation.endTime,
hint: context.translation.select,
icon: 'clock',
withIcon: true,
backgroundColor: AppColor.neutral100,
withBorder: false,
height: 70.toScreenHeight,
time: _endTime,
onTimePicker: (selectedTime) {
if (selectedTime != null) {
setState(() {
_endTime = selectedTime;
});
}
},
).expanded,
],
),
8.height,
AppTextFormField(
labelText: context.translation.workingHours,
backgroundColor: AppColor.neutral80,
suffixIcon: "clock".toSvgAsset(width: 20, color: context.isDark ? AppColor.neutral10 : null).paddingOnly(end: 16),
contentPadding: EdgeInsets.symmetric(vertical: 18.toScreenHeight, horizontal: 16.toScreenWidth),
initialValue: _serviceReport?.workingHours.toString(),
textAlign: TextAlign.center,
showShadow: false,
enable: false,
style: Theme.of(context).textTheme.titleMedium,
),
8.height,
],
),
),
).toShadowContainer(context).paddingOnly(start: 16, end: 16, top: 12),
FooterActionButton.footerContainer(
child: AppFilledButton(
label:context.translation.addExternalActivity, // Use the dynamic label
buttonColor: AppColor.primary10,
onPressed: () async {
// Handle button press
},
),
),
],
),
);
}
Widget repairLocationWidget(BuildContext context) {
return Row(
mainAxisSize: MainAxisSize.min,
children: [
radioButtonWidget(label: context.translation.remotely, value: 1),
radioButtonWidget(label: context.translation.workshop, value: 2),
radioButtonWidget(label: context.translation.abroad, value: 3),
],
);
}
Widget radioButtonWidget({@required String label, @required dynamic value}) {
return Row(
mainAxisSize: MainAxisSize.min,
children: [
SizedBox(
width: 20.toScreenWidth,
height: 40.toScreenHeight,
//TODO use the type required according data..
child: Radio<int>(
activeColor: AppColor.primary10,
value: value,
groupValue: _selectedValue,
onChanged: (int value) {
setState(() {
_selectedValue = value;
});
},
),
),
8.width,
Text(
label,
style: AppTextStyles.tinyFont.copyWith(color: AppColor.neutral120),
),
13.width,
],
);
}
}

@ -0,0 +1,303 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/parts_provider.dart';
import 'package:test_sa/controllers/providers/api/service_requests_provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/device/asset.dart';
import 'package:test_sa/models/service_request/service_report.dart';
import 'package:test_sa/models/service_request/service_request.dart';
import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/common_widgets/app_filled_button.dart';
import 'package:test_sa/providers/loading_list_notifier.dart';
import 'package:test_sa/providers/work_order/reason_provider.dart';
import 'package:test_sa/service_request_latest/views/components/action_button/footer_action_button.dart';
import 'package:test_sa/views/widgets/date_and_time/time_picker.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
import '../../../../../controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart';
import '../../../../../controllers/providers/api/status_drop_down/report/service_types_provider.dart';
import '../../../../../models/lookup.dart';
import '../../../../../new_views/common_widgets/app_text_form_field.dart';
import '../../../../../new_views/common_widgets/single_item_drop_down_menu.dart';
class InternalMaintenanceRequest extends StatefulWidget {
static const String id = "/add-internal-activity";
const InternalMaintenanceRequest({Key key}) : super(key: key);
@override
_InternalMaintenanceRequestState createState() => _InternalMaintenanceRequestState();
}
class _InternalMaintenanceRequestState extends State<InternalMaintenanceRequest> with TickerProviderStateMixin {
UserProvider _userProvider;
SettingProvider _settingProvider;
ServiceRequest _request;
ServiceRequestsProvider _serviceRequestsProvider;
ServiceStatusProvider _assetTypeProvider;
PartsProvider _partsProvider;
ServiceReport _serviceReport;
bool _isLoading = false;
TimeOfDay _startTime;
int _selectedValue = 1;
TimeOfDay _endTime;
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final TextEditingController _faultController = TextEditingController();
final TextEditingController _workPreformedController = TextEditingController();
final TextEditingController _partQtyController = TextEditingController();
@override
void initState() {
_serviceReport = ServiceReport(
// returnToService: DateTime.now(),
// //type: const Lookup(value: 2),
// device: widget.request.device,
sparePartsWorkOrders: [],
);
super.initState();
if (context.mounted) {
_request = Provider.of<ServiceRequestsProvider>(context, listen: false).currentSelectedRequest;
Provider.of<ServiceReportLastCallsProvider>(context, listen: false).reset();
Provider.of<ReasonProvider>(context, listen: false).reset();
Provider.of<ReasonProvider>(context, listen: false).serviceRequestId = _request.id;
}
// _isLoading = true;
}
Asset loanAvailabilityAsset;
@override
void dispose() {
_faultController.dispose();
_workPreformedController.dispose();
_partQtyController.dispose();
super.dispose();
}
void getRequestForWorkOrder() async {
_isLoading = true;
setState(() {});
_serviceReport.callRequest = await _serviceRequestsProvider.getCallRequestForWorkOrder(callId: _request.id);
await _assetTypeProvider.getTypes(user: _userProvider.user, host: _settingProvider.host);
_serviceReport.assignedEmployee = _serviceReport.callRequest?.assignedEmployee;
_serviceReport.equipmentStatus = _serviceReport.callRequest?.defectType;
_serviceReport.serviceType = Lookup(id: 65, name: "Interval", value: 1); // default value in service type as in web
_isLoading = false;
setState(() {});
}
@override
Widget build(BuildContext context) {
_userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context);
_serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context);
_assetTypeProvider = Provider.of<ServiceStatusProvider>(context);
_partsProvider = Provider.of<PartsProvider>(context);
if (_serviceReport.callRequest == null) {
getRequestForWorkOrder();
}
_serviceReport.assetType = _assetTypeProvider.statuses?.firstWhere(
(element) => element.value == _serviceReport.callRequest?.assetType,
orElse: () => null,
);
return LoadingManager(
isLoading: _isLoading,
isFailedLoading: false,
stateCode: 200,
onRefresh: () async {},
child: Stack(
children: [
SingleChildScrollView(
child: Form(
key: _formKey,
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
8.height,
SingleItemDropDownMenu<Lookup, NullableLoadingProvider>(
context: context,
height: 70.toScreenHeight,
title: context.translation.activityStatus,
showShadow: false,
backgroundColor: AppColor.neutral100,
staticData: Provider.of<ServiceReportLastCallsProvider>(context).calls,
initialValue: _serviceReport?.calllastSituation,
onSelect: (status) {
_serviceReport.calllastSituation = status;
},
),
8.height,
Row(
mainAxisSize: MainAxisSize.min,
children: [
ATimePicker(
label: context.translation.startTime,
hint: context.translation.select,
withBorder: false,
icon: 'clock',
withIcon: true,
backgroundColor: AppColor.neutral100,
height: 70.toScreenHeight,
time: _startTime,
onTimePicker: (selectedTime) {
if (selectedTime != null) {
print('time selected $selectedTime');
setState(() {
_startTime = selectedTime;
});
}
},
).expanded,
8.width,
ATimePicker(
label: context.translation.endTime,
hint: context.translation.select,
icon: 'clock',
withIcon: true,
backgroundColor: AppColor.neutral100,
withBorder: false,
height: 70.toScreenHeight,
time: _endTime,
onTimePicker: (selectedTime) {
if (selectedTime != null) {
setState(() {
_endTime = selectedTime;
});
}
},
).expanded,
],
),
8.height,
AppTextFormField(
labelText: context.translation.workingHours,
backgroundColor: AppColor.neutral80,
suffixIcon: "clock".toSvgAsset(width: 20, color: context.isDark ? AppColor.neutral10 : null).paddingOnly(end: 16),
contentPadding: EdgeInsets.symmetric(vertical: 18.toScreenHeight, horizontal: 16.toScreenWidth),
initialValue: _serviceReport?.workingHours.toString(),
textAlign: TextAlign.center,
showShadow: false,
enable: false,
style: Theme.of(context).textTheme.titleMedium,
),
8.height,
//TODO need to be selected when submit...
// SingleItemDropDownMenu<Lookup, ServiceTypeProvider>(
// context: context,
// title: context.translation.serviceType,
// initialValue: _serviceReport.serviceType,
// onSelect: (value) {
// _serviceReport.serviceType = value;
// },
// ),
//Provider.of<ServiceReportLastCallsProvider>(context)
8.height,
AppTextFormField(
labelText: context.translation.travelingHours,
backgroundColor: AppColor.neutral100,
suffixIcon: "clock".toSvgAsset(width: 20, color: context.isDark ? AppColor.neutral10 : null).paddingOnly(end: 16),
initialValue: _serviceReport?.travelingHours?.toString(),
textInputType: TextInputType.number,
contentPadding: EdgeInsets.symmetric(vertical: 18.toScreenHeight, horizontal: 16.toScreenWidth),
showShadow: false,
onSaved: (value) {
_serviceReport.travelingHours = double.tryParse(value) ?? 0.0;
},
),
16.height,
context.translation.repairLocation.bodyText(context).custom(color: AppColor.black20, fontWeight: FontWeight.w500),
8.height,
repairLocationWidget(context),
16.height,
AppTextFormField(
labelText: context.translation.assignedEmployee,
backgroundColor: AppColor.neutral80,
contentPadding: EdgeInsets.symmetric(vertical: 18.toScreenHeight, horizontal: 16.toScreenWidth),
initialValue: _serviceReport?.workingHours.toString(),
textAlign: TextAlign.center,
showShadow: false,
enable: false,
style: Theme.of(context).textTheme.titleMedium,
),
8.height,
AppTextFormField(
initialValue: _serviceReport?.comment,
labelText: context.translation.technicalComment,
backgroundColor: AppColor.neutral100,
showShadow: false,
alignLabelWithHint: true,
textInputType: TextInputType.multiline,
onSaved: (value) {
_serviceReport.comment = value;
},
),
],
),
),
).toShadowContainer(context).paddingOnly(start: 16, end: 16, top: 12),
FooterActionButton.footerContainer(
child: AppFilledButton(
label:context.translation.addInternalActivity, // Use the dynamic label
buttonColor: AppColor.primary10,
onPressed: () async {
// Handle button press
},
),
),
],
),
);
}
Widget repairLocationWidget(BuildContext context) {
return Row(
mainAxisSize: MainAxisSize.min,
children: [
radioButtonWidget(label: context.translation.remotely, value: 1),
radioButtonWidget(label: context.translation.workshop, value: 2),
radioButtonWidget(label: context.translation.abroad, value: 3),
],
);
}
Widget radioButtonWidget({@required String label, @required dynamic value}) {
return Row(
mainAxisSize: MainAxisSize.min,
children: [
SizedBox(
width: 20.toScreenWidth,
height: 40.toScreenHeight,
//TODO use the type required according data..
child: Radio<int>(
activeColor: AppColor.primary10,
value: value,
groupValue: _selectedValue,
onChanged: (int value) {
setState(() {
_selectedValue = value;
});
},
),
),
8.width,
Text(
label,
style: AppTextStyles.tinyFont.copyWith(color: AppColor.neutral120),
),
13.width,
],
);
}
}

@ -0,0 +1,94 @@
import 'package:flutter/material.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/common_widgets/app_filled_button.dart';
import 'package:test_sa/new_views/common_widgets/default_app_bar.dart';
import 'package:test_sa/service_request_latest/views/components/action_button/footer_action_button.dart';
import 'package:test_sa/service_request_latest/views/forms/maintenance_request/components/external_request.dart';
import 'package:test_sa/service_request_latest/views/forms/maintenance_request/components/internal_request.dart';
class MaintenanceRequestForm extends StatefulWidget {
const MaintenanceRequestForm({Key key}) : super(key: key);
@override
_MaintenanceRequestFormState createState() => _MaintenanceRequestFormState();
}
class _MaintenanceRequestFormState extends State<MaintenanceRequestForm> with SingleTickerProviderStateMixin {
TabController _tabController;
int initialIndex = 0;
@override
void initState() {
super.initState();
// _tabController = TabController(length: 2, vsync: this);
// print('tab controller i got is ${_tabController.length}');
// _tabController.addListener(() {
// print('add listner called..');
// setState(() {
// print('index i got is ${_tabController.index}');
// if (_tabController.index == 0) {
// _buttonLabel = 'abc';
// } else if (_tabController.index == 1) {
// _buttonLabel = 'def';
// }
// });
// });
}
@override
void dispose() {
_tabController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: AppColor.neutral100,
appBar: DefaultAppBar(title: context.translation.maintenanceRequest),
body: DefaultTabController(
length: 2,
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Container(
margin: EdgeInsets.only(left: 16.toScreenWidth, right: 16.toScreenWidth, top: 12.toScreenHeight),
decoration: BoxDecoration(
color: context.isDark ? AppColor.neutral50 : AppColor.white10,
borderRadius: BorderRadius.circular(10),
),
child: TabBar(
padding: EdgeInsets.symmetric(vertical: 4.toScreenHeight, horizontal: 4.toScreenWidth),
labelColor: context.isDark ? AppColor.neutral30 : AppColor.black20,
unselectedLabelColor: context.isDark ? AppColor.neutral30 : AppColor.black20,
unselectedLabelStyle: AppTextStyles.bodyText,
labelStyle: AppTextStyles.bodyText,
indicatorPadding: EdgeInsets.zero,
indicator: BoxDecoration(
color: context.isDark ? AppColor.neutral60 : AppColor.neutral110,
borderRadius: BorderRadius.circular(7),
),
tabs: [
Tab(text: context.translation.internal, height: 57.toScreenHeight),
Tab(text: context.translation.external, height: 57.toScreenHeight),
],
),
),
// 12.height,
const TabBarView(
children: [
InternalMaintenanceRequest(),
ExternalMaintenanceRequest(),
],
).expanded,
],
),
),
);
}
}

@ -50,8 +50,6 @@ class _SparePartRequestState extends State<SparePartRequest> with TickerProvider
final List<File> _files = [];
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
final TextEditingController _faultController = TextEditingController();
final TextEditingController _workPreformedController = TextEditingController();
final TextEditingController _partQtyController = TextEditingController();
final TextEditingController _oracleNoController = TextEditingController();
@ -77,9 +75,8 @@ class _SparePartRequestState extends State<SparePartRequest> with TickerProvider
@override
void dispose() {
_faultController.dispose();
_workPreformedController.dispose();
_partQtyController.dispose();
_oracleNoController.dispose();
super.dispose();
}
@ -145,6 +142,7 @@ class _SparePartRequestState extends State<SparePartRequest> with TickerProvider
initialValue: serviceRequestProvider.initialSelectedSparePart.sparePart,
backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90,
onSelect: (part) {
print('part i got is ${part.id}');
serviceRequestProvider.initialSelectedSparePart = SparePartsWorkOrders(id: 0, sparePart: part, qty: 0);
},
),

@ -5,7 +5,6 @@ import 'package:test_sa/controllers/providers/api/service_requests_provider.dart
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/views/widgets/images/multi_image_picker.dart';
class AttachmentView extends StatelessWidget {

@ -0,0 +1,215 @@
import 'dart:io';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/devices_provider.dart';
import 'package:test_sa/controllers/providers/api/service_requests_provider.dart';
import 'package:test_sa/controllers/validator/validator.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/device/asset.dart';
import 'package:test_sa/models/device/asset_search.dart';
import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/common_widgets/app_filled_button.dart';
import 'package:test_sa/new_views/common_widgets/app_text_form_field.dart';
import 'package:test_sa/providers/work_order/reason_provider.dart';
import 'package:test_sa/service_request_latest/views/components/action_button/footer_action_button.dart';
import 'package:test_sa/views/widgets/images/multi_image_picker.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
import 'package:test_sa/views/widgets/qr/scan_qr.dart';
import '../../../../../../controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart';
import '../../../../../../new_views/common_widgets/default_app_bar.dart';
class CreateNewRequest extends StatefulWidget {
static const String id = "/create-new-request";
const CreateNewRequest({Key key}) : super(key: key);
@override
_CreateNewRequestState createState() => _CreateNewRequestState();
}
class _CreateNewRequestState extends State<CreateNewRequest> with TickerProviderStateMixin {
AssetProvider _devicesProvider;
bool _isLoading = false;
int _selectedEStatus = 1;
bool _isHighPrority = false;
String text;
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
@override
void initState() {
super.initState();
if (context.mounted) {
ServiceRequestsProvider serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context, listen: false);
Provider.of<ServiceReportLastCallsProvider>(context, listen: false).reset();
Provider.of<ReasonProvider>(context, listen: false).reset();
Provider.of<ReasonProvider>(context, listen: false).serviceRequestId = serviceRequestsProvider.currentSelectedRequest.id;
}
// _isLoading = true;
}
_getDevice(String result, {bool isQr = false}) async {
if (result == null) return;
_devicesProvider.reset();
await _devicesProvider.getAssets(
search: AssetSearch(assetNo: result, assetSerialNumber: ""),
isQr: isQr,
);
}
Asset loanAvailabilityAsset;
@override
Widget build(BuildContext context) {
final List<File> _files = [];
return Scaffold(
key: _scaffoldKey,
appBar: DefaultAppBar(title: context.translation.createNewRequest),
body: Consumer<ServiceRequestsProvider>(builder: (context, serviceRequestProvider, child) {
return SafeArea(
child: LoadingManager(
isLoading: _isLoading,
isFailedLoading: false,
stateCode: 200,
onRefresh: () async {},
child: Form(
key: _formKey,
child: Column(
children: [
SingleChildScrollView(
child: Card(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
AppFilledButton(
label: context.translation.scanOrPickAsset,
showIcon: true,
icon: "scan_asset".toSvgAsset(height: 20, fit: BoxFit.contain, color: Theme.of(context).scaffoldBackgroundColor),
buttonColor: AppColor.neutral50,
onPressed: () async {
String result = await Navigator.of(context).push(
MaterialPageRoute(builder: (_) => const ScanQr()),
) as String;
_getDevice(result, isQr: true);
} ,
),
21.height,
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
context.translation.highPriority.bodyText(context).custom(color: AppColor.black20),
CupertinoSwitch(
value: _isHighPrority,
onChanged: (value) {
setState(() {
// listingVm.listing[listingVm.listingParameter]['bayut'] = value;
_isHighPrority = value;
});
},
thumbColor: AppColor.red70,
activeColor: AppColor.red30.withOpacity(0.4),
),
],
),
20.height,
context.translation.equipmentStatus.bodyText(context).custom(color: AppColor.black20),
12.height,
assetStatusWidget(context),
8.height,
23.height,
MultiFilesPicker(label: context.translation.attachImage,
files: _files,
buttonColor: AppColor.primary10,
onlyImages: true,
buttonIcon: 'image-plus'?.toSvgAsset(color: AppColor.primary10),
),
AppTextFormField(
labelText: "Type any comment",
backgroundColor: AppColor.neutral30,
alignLabelWithHint: true,
showShadow: false,
validator: (value) => Validator.hasValue(value) ? null : context.translation.requiredField,
textInputType: TextInputType.multiline,
suffixIcon: "comment_send".toSvgAsset().paddingOnly(end: 16).onPress(() {
if (_formKey.currentState.validate()) {
_formKey.currentState.save();
// final comment = Comment(id: 0, callRequestId: num.tryParse(widget.requestId ?? ""), comment: text);
// commentsProvider.addComment(context, comment: comment);
}
}),
onSaved: (value) {
text = value;
},
),
],
).paddingOnly(start:13,end: 13,top: 15,bottom: 16),
).paddingAll(16),
).expanded,
FooterActionButton.footerContainer(
child: AppFilledButton(
label: context.translation.submitRequest,
buttonColor: AppColor.primary10,
onPressed: (){},
),
),
],
),
),
),
);
}),
);
}
Widget assetStatusWidget(BuildContext context) {
return Row(
mainAxisSize: MainAxisSize.min,
children: [
radioButtonWidget(label: context.translation.up_and_running, value: 1),
radioButtonWidget(label: context.translation.partially_down, value: 2),
radioButtonWidget(label: context.translation.fully_down, value: 3),
],
);
}
Widget radioButtonWidget({@required String label, @required dynamic value}) {
return Row(
mainAxisSize: MainAxisSize.min,
children: [
SizedBox(
width: 20.toScreenWidth,
height: 40.toScreenHeight,
//TODO use the type required according data..
child: Radio<int>(
activeColor: AppColor.primary10,
value: value,
groupValue: _selectedEStatus,
onChanged: (int value) {
setState(() {
_selectedEStatus = value;
});
},
),
),
8.width,
Text(
label,
style: AppTextStyles.tinyFont,
),
13.width,
],
);
}
}

@ -7,6 +7,7 @@ import 'package:test_sa/models/service_request/service_request.dart';
import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/common_widgets/default_app_bar.dart';
import 'package:test_sa/service_request_latest/views/components/history_log_view.dart';
import 'package:test_sa/service_request_latest/views/components/initial_visit_card.dart';
import 'components/request_detail_view.dart';
@ -52,7 +53,6 @@ class RequestDetailMain extends StatelessWidget {
serviceRequest: ServiceRequest(id: requestId.toString()),
fromTabView: true,
),
// HistoryLogView(),
const HistoryLogView(),
],
).expanded,

@ -4,21 +4,15 @@ import 'package:test_sa/controllers/providers/api/service_requests_provider.dart
import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/enums/user_types.dart';
import 'package:test_sa/models/service_request/search_work_order.dart';
import 'package:test_sa/models/service_request/service_request.dart';
import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/common_widgets/app_filled_button.dart';
import 'package:test_sa/new_views/common_widgets/default_app_bar.dart';
import 'package:test_sa/service_request_latest/views/components/activity_card_view.dart';
import 'package:test_sa/views/pages/user/requests/work_order/create_service_report.dart';
import 'package:test_sa/views/pages/user/requests/work_order/update_service_report.dart';
import 'package:test_sa/views/pages/user/requests/work_order/work_order_details_page.dart';
import 'package:test_sa/views/widgets/loaders/no_item_found.dart';
import 'package:test_sa/views/widgets/requests/request_status.dart';
class WorkOrderListPage extends StatelessWidget {
static const String id = "/work-order-list";

@ -9,6 +9,7 @@ import 'package:test_sa/new_views/app_style/app_color.dart';
class ATimePicker extends StatelessWidget {
final TimeOfDay time;
final String label;
final String icon;
final String hint;
final Function(TimeOfDay) onTimePicker;
final bool enable, withBorder, withIcon;
@ -19,6 +20,7 @@ class ATimePicker extends StatelessWidget {
Key key,
@required this.label,
this.withBorder = true,
this.icon,
this.withIcon = true,
this.height,
this.backgroundColor,
@ -30,7 +32,6 @@ class ATimePicker extends StatelessWidget {
@override
Widget build(BuildContext context) {
print('initial time in picker is $time');
return Container(
height: height,
decoration: BoxDecoration(
@ -61,7 +62,11 @@ class ATimePicker extends StatelessWidget {
).expanded,
//: label.bodyText(context).paddingOnly(top: 8, bottom: 8),
enable ? 16.width : const Spacer(),
withIcon ? "calender".toSvgAsset(width: 20, color: context.isDark ? AppColor.neutral10 : null) : const SizedBox(),
withIcon
? icon != null
? icon.toSvgAsset(width: 20, color: context.isDark ? AppColor.neutral10 : null)
: "calender".toSvgAsset(width: 20, color: context.isDark ? AppColor.neutral10 : null)
: const SizedBox(),
],
),
).onPress(enable

@ -13,11 +13,13 @@ import '../loaders/image_loader.dart';
class ESignature extends StatefulWidget {
final String oldSignature;
final Uint8List newSignature;
Color backgroundColor;
bool showShadow=true;
final Function(Uint8List) onSaved;
final Function(Uint8List) onChange;
final String title;
const ESignature({Key key, this.title, this.oldSignature, this.onSaved, this.onChange, this.newSignature}) : super(key: key);
ESignature({Key key, this.title, this.oldSignature, this.onSaved, this.onChange, this.newSignature,this.backgroundColor,this.showShadow=true}) : super(key: key);
@override
State<ESignature> createState() => _ESignatureState();
@ -63,9 +65,9 @@ class _ESignatureState extends State<ESignature> {
width: MediaQuery.of(context).size.width,
padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 8.toScreenHeight),
decoration: BoxDecoration(
color: context.isDark ? AppColor.background(context) : Colors.white,
color:widget.backgroundColor ?? (context.isDark ? AppColor.background(context) : Colors.white),
borderRadius: _editable ? const BorderRadius.only(topLeft: Radius.circular(10), topRight: Radius.circular(10)) : BorderRadius.circular(10),
boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10)],
boxShadow:widget.showShadow? [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10)]:[],
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,

@ -20,10 +20,11 @@ class MultiFilesPicker extends StatefulWidget {
final bool enabled, onlyImages;
double buttonHeight;
Widget buttonIcon;
Color buttonColor;
final Function(List<File>) onChange;
final bool showAsGrid;
MultiFilesPicker({Key key, this.files, this.label, this.error = false, this.buttonHeight, this.buttonIcon, this.enabled = true, this.onlyImages = false, this.onChange, this.showAsGrid = false})
MultiFilesPicker({Key key, this.files, this.label, this.error = false, this.buttonHeight, this.buttonIcon, this.enabled = true, this.onlyImages = false, this.onChange, this.showAsGrid = false,this.buttonColor})
: super(key: key);
@override
@ -39,6 +40,7 @@ class _MultiFilesPickerState extends State<MultiFilesPicker> {
AppDashedButton(
title: widget.label,
height: widget.buttonHeight,
buttonColor: widget.buttonColor,
icon: widget.buttonIcon,
onPressed: (widget.enabled == false)
? () {}

Loading…
Cancel
Save