Ui updated
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 |
@ -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,
|
||||
};
|
||||
}
|
||||
}
|
||||
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@ -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),
|
||||
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -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),
|
||||
// ],
|
||||
// ),
|
||||
// ),
|
||||
// );
|
||||
// }
|
||||
@ -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,
|
||||
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -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,
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue