initial commit
@ -0,0 +1,4 @@
|
||||
<svg width="33" height="29" viewBox="0 0 33 29" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M29.7815 15.5794H24.1122V16.5275C24.1122 18.0777 22.8502 19.3397 21.2936 19.3397H10.7301C9.17981 19.3397 7.91783 18.0777 7.91783 16.5275V15.5794H2.2421C1.00574 15.5794 0 16.5851 0 17.8279V26.7515C0 27.9942 1.00574 29 2.2421 29H29.7815C31.0179 29 32.03 27.9942 32.03 26.7515V17.8343C32.03 16.5916 31.0179 15.5794 29.7815 15.5794ZM9.34636 24.2211H8.03954L8.69295 25.355C8.87232 25.6625 8.76342 26.0532 8.45593 26.2326C8.35984 26.2903 8.24453 26.3159 8.14203 26.3159C7.91782 26.3159 7.70002 26.2006 7.58471 25.9956L6.92489 24.8617L6.27148 25.9956C6.14977 26.2006 5.93837 26.3159 5.71416 26.3159C5.60526 26.3159 5.49635 26.2903 5.39386 26.2326C5.09278 26.0532 4.98387 25.6625 5.16324 25.355L5.81665 24.2211H4.50342C4.15109 24.2211 3.86282 23.9328 3.86282 23.5805C3.86282 23.2218 4.15109 22.9399 4.50342 22.9399H5.81665L5.16324 21.7996C4.98387 21.4922 5.09278 21.1014 5.39386 20.9284C5.70135 20.7491 6.09211 20.8515 6.27148 21.159L6.92489 22.2993L7.58471 21.159C7.75768 20.8515 8.14844 20.7491 8.45593 20.9284C8.76342 21.1014 8.87232 21.4922 8.69295 21.7996L8.03954 22.9399H9.34636C9.7051 22.9399 9.98697 23.2218 9.98697 23.5805C9.98697 23.9328 9.7051 24.2211 9.34636 24.2211ZM18.4365 24.2211H17.1233L17.7767 25.355C17.956 25.6625 17.8471 26.0532 17.5461 26.2326C17.4436 26.2903 17.3347 26.3159 17.2258 26.3159C17.0015 26.3159 16.7901 26.2006 16.6684 25.9956L16.015 24.8617L15.3552 25.9956C15.2399 26.2006 15.0221 26.3159 14.8043 26.3159C14.6954 26.3159 14.5801 26.2903 14.484 26.2326C14.1765 26.0532 14.0676 25.6625 14.247 25.355L14.9004 24.2211H13.5935C13.2348 24.2211 12.9529 23.9328 12.9529 23.5805C12.9529 23.2218 13.2348 22.9399 13.5935 22.9399H14.9004L14.247 21.7996C14.0676 21.4922 14.1765 21.1014 14.484 20.9284C14.7851 20.7491 15.1822 20.8515 15.3552 21.159L16.015 22.2993L16.6684 21.159C16.8478 20.8515 17.2386 20.7491 17.5461 20.9284C17.8471 21.1014 17.956 21.4922 17.7767 21.7996L17.1233 22.9399H18.4365C18.7888 22.9399 19.0771 23.2218 19.0771 23.5805C19.0771 23.9328 18.7888 24.2211 18.4365 24.2211ZM27.5202 24.2211H26.207L26.8604 25.355C27.0398 25.6625 26.9373 26.0532 26.6298 26.2326C26.5273 26.2903 26.4184 26.3159 26.3095 26.3159C26.0853 26.3159 25.8739 26.2006 25.7521 25.9956L25.0987 24.8617L24.4389 25.9956C24.3236 26.2006 24.1058 26.3159 23.888 26.3159C23.7791 26.3159 23.6702 26.2903 23.5677 26.2326C23.2602 26.0532 23.1577 25.6625 23.3307 25.355L23.9905 24.2211H22.6773C22.3249 24.2211 22.0367 23.9328 22.0367 23.5805C22.0367 23.2218 22.3249 22.9399 22.6773 22.9399H23.9905L23.3307 21.7996C23.1577 21.4922 23.2602 21.1014 23.5677 20.9284C23.8752 20.7491 24.266 20.8515 24.4389 21.159L25.0987 22.2993L25.7521 21.159C25.9315 20.8515 26.3223 20.7491 26.6298 20.9284C26.9373 21.1014 27.0398 21.4922 26.8604 21.7996L26.207 22.9399H27.5202C27.8725 22.9399 28.1608 23.2218 28.1608 23.5805C28.1608 23.9328 27.8725 24.2211 27.5202 24.2211Z" fill="#7D859A"/>
|
||||
<path d="M16.0151 1.2812C18.097 1.2812 19.801 2.97879 19.801 5.06715C19.801 5.41948 20.0829 5.70775 20.4416 5.70775C20.794 5.70775 21.0822 5.41948 21.0822 5.06715C21.0822 2.27413 18.8081 0 16.0151 0C13.2157 0 10.9479 2.27413 10.9479 5.06715V7.49503H10.7301C9.88454 7.49503 9.1991 8.18688 9.1991 9.03247V16.5275C9.1991 17.3731 9.88454 18.0585 10.7301 18.0585H21.2936C22.1392 18.0585 22.8311 17.3731 22.8311 16.5275V9.03247C22.8311 8.18688 22.1392 7.49503 21.2936 7.49503H12.2291V5.06715C12.2291 2.9852 13.9267 1.2812 16.0151 1.2812Z" fill="#7D859A"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.4 KiB |
@ -0,0 +1,4 @@
|
||||
<svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M24.8847 7.53113H24.2267V12.6464C24.2267 16.4362 21.1434 19.5195 17.3536 19.5195H7.53113V20.1778C7.53113 22.9983 9.8259 25.2928 12.6464 25.2928H23.1544L28.5585 29.7963C28.7194 29.9304 28.9194 30 29.1213 30C29.6045 30 30 29.6079 30 29.1211V12.6464C30 9.82155 27.7146 7.53113 24.8847 7.53113Z" fill="#7D859A"/>
|
||||
<path d="M22.4689 12.6464V5.11528C22.4689 2.28539 20.1787 0 17.3536 0H5.11528C2.28539 0 0 2.29019 0 5.11528V21.59C0 22.0766 0.395508 22.4689 0.878677 22.4689C1.08055 22.4689 1.28059 22.3993 1.4415 22.2649L6.84563 17.7617H17.3536C20.1741 17.7617 22.4689 15.4671 22.4689 12.6464ZM11.2344 13.9961C10.7492 13.9961 10.3555 13.6024 10.3555 13.1172C10.3555 12.632 10.7492 12.2383 11.2344 12.2383C11.7194 12.2383 12.1133 12.632 12.1133 13.1172C12.1133 13.6024 11.7194 13.9961 11.2344 13.9961ZM12.1133 10.109V10.293C12.1133 10.7783 11.7197 11.172 11.2344 11.172C10.749 11.172 10.3555 10.7783 10.3555 10.293V9.35165C10.3555 8.8662 10.749 8.47275 11.2344 8.47275C12.0474 8.47275 12.7089 7.81105 12.7089 6.99806C12.7089 6.18484 12.0474 5.52338 11.2344 5.52338C10.8398 5.52338 10.4697 5.67673 10.1914 5.95505C9.9131 6.23337 9.75975 6.60347 9.75975 6.99692C9.75975 7.48238 9.3663 7.87651 8.88084 7.87651C8.39539 7.87651 8.00194 7.48329 8.00194 6.99806V6.99692C8.00194 6.13403 8.33817 5.32242 8.94836 4.71222C9.55879 4.10179 10.3702 3.76556 11.2333 3.76556C13.0167 3.76556 14.4667 5.21576 14.4667 6.99806C14.4667 8.47595 13.4699 9.72542 12.1133 10.109Z" fill="#7D859A"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.5 KiB |
@ -0,0 +1,4 @@
|
||||
<svg width="21" height="22" viewBox="0 0 21 22" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M19.4907 4.07066C17.844 3.90702 16.1973 3.78428 14.5404 3.69223V3.68201L14.3154 2.35239C14.162 1.41144 13.937 0 11.5437 0H8.864C6.48089 0 6.25588 1.35007 6.09224 2.34216L5.87745 3.65132C4.92627 3.71269 3.97508 3.77406 3.0239 3.86611L0.937428 4.07066C0.507861 4.11157 0.201027 4.49 0.241938 4.90934C0.282849 5.32868 0.65105 5.63551 1.08062 5.5946L3.16709 5.39005C8.52648 4.8582 13.9268 5.06276 19.3475 5.60483H19.4293C19.818 5.60483 20.1555 5.30823 20.1964 4.90934C20.2271 4.49 19.9202 4.11157 19.4907 4.07066Z" fill="#F63939"/>
|
||||
<path d="M17.6089 7.04696C17.3634 6.79126 17.0259 6.64807 16.6781 6.64807H3.75026C3.40252 6.64807 3.05477 6.79126 2.81953 7.04696C2.58429 7.30265 2.45133 7.65039 2.47179 8.00837L3.10591 18.5021C3.21842 20.0567 3.36161 22 6.93111 22H13.4973C17.0668 22 17.2101 20.0669 17.3225 18.5021L17.9566 8.0186C17.9771 7.6504 17.8441 7.30265 17.6089 7.04696ZM11.912 16.8759H8.50613C8.08685 16.8759 7.7391 16.5281 7.7391 16.1088C7.7391 15.6894 8.08685 15.3417 8.50613 15.3417H11.912C12.3313 15.3417 12.6791 15.6894 12.6791 16.1088C12.6791 16.5281 12.3313 16.8759 11.912 16.8759ZM12.7711 12.7847H7.65728C7.23794 12.7847 6.89019 12.437 6.89019 12.0177C6.89019 11.5983 7.23794 11.2506 7.65728 11.2506H12.7711C13.1905 11.2506 13.5382 11.5983 13.5382 12.0177C13.5382 12.437 13.1905 12.7847 12.7711 12.7847Z" fill="#F63939"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.4 KiB |
@ -0,0 +1,5 @@
|
||||
<svg width="21" height="21" viewBox="0 0 21 21" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M11.9989 13.3512C11.7971 13.5528 11.5477 13.7069 11.2775 13.797L8.66721 14.6671C8.47883 14.7299 8.28236 14.7618 8.0836 14.7618C7.59055 14.7618 7.12704 14.5699 6.77844 14.2212C6.28088 13.7235 6.11009 12.9999 6.3326 12.3324L7.20271 9.72226C7.29274 9.45193 7.44696 9.20239 7.64855 9.0008L13.2863 3.36304H2.25586C1.01198 3.36304 0 4.37502 0 5.6189V18.7439C0 19.9878 1.01198 20.9997 2.25586 20.9997H15.3809C16.6247 20.9997 17.6367 19.9878 17.6367 18.7439V7.7134L11.9989 13.3512Z" fill="#3B3D4A"/>
|
||||
<path d="M8.51856 9.87099C8.45101 9.93854 8.40015 10.0209 8.36996 10.1115L7.49986 12.7217C7.42615 12.9427 7.4837 13.1864 7.64846 13.3512C7.81326 13.516 8.05697 13.5736 8.27805 13.4998L10.8883 12.6298C10.9789 12.5996 11.0612 12.5487 11.1288 12.4812L18.8144 4.79556L16.2042 2.18536L8.51856 9.87099Z" fill="#3B3D4A"/>
|
||||
<path d="M19.5394 0.300082C19.139 -0.100353 18.4897 -0.100353 18.0893 0.300082L17.0742 1.31518L19.6845 3.92541L20.6995 2.91032C21.1 2.50988 21.1 1.86064 20.6995 1.46021L19.5394 0.300082Z" fill="#3B3D4A"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 54 KiB |
@ -0,0 +1,3 @@
|
||||
<svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M12.0132 27.5142C10.6888 27.1991 9.42387 26.674 8.26462 25.9602L5.82881 27.042L2.95788 24.1712L4.03944 21.7361C3.32537 20.5767 2.80031 19.3112 2.48513 17.9865L0 17.03V12.97L2.48569 12.0133C2.57013 11.6584 2.66969 11.3078 2.78387 10.9624C3.53513 11.2836 4.36212 11.4616 5.23075 11.4616C5.81213 11.4616 6.3885 11.3811 6.94475 11.2222L7.12494 11.4024C6.62362 12.4979 6.344 13.7162 6.344 14.9999C6.344 19.7809 10.219 23.6559 15.0001 23.6559C16.2838 23.6559 17.5021 23.3762 18.5976 22.8749L20.036 24.3133C19.9569 24.6893 19.9172 25.0729 19.9172 25.4584C19.9172 25.9275 19.9757 26.3829 20.0855 26.8179C19.4084 27.1097 18.7064 27.3429 17.9869 27.5142L17.0299 30H12.97L12.0132 27.5142ZM15 7.394C13.2853 7.394 11.8953 8.78406 11.8953 10.4987C11.8953 12.2134 13.2853 13.6034 15 13.6034C16.7147 13.6034 18.1047 12.2133 18.1047 10.4987C18.1047 8.784 16.7148 7.394 15 7.394ZM9.63519 19.7083L20.3648 19.7083C20.7709 19.7083 21.067 19.3331 20.9728 18.9381C20.3281 16.2369 17.8988 14.2284 15.0001 14.2284C12.1014 14.2284 9.672 16.2369 9.02731 18.9382C8.933 19.3331 9.22919 19.7083 9.63519 19.7083ZM0 5.23081C0 8.11969 2.34188 10.4616 5.23075 10.4616C5.93138 10.4616 6.59963 10.3234 7.21031 10.0736L11.3618 14.2251C11.7035 14.0226 12.0627 13.8481 12.4362 13.7043C11.4969 12.952 10.8953 11.7955 10.8953 10.4987C10.8953 9.78656 11.0769 9.11675 11.3961 8.53288L10.0736 7.21037C10.3235 6.59975 10.4616 5.93144 10.4616 5.23081C10.4616 2.34188 8.11963 0 5.23081 0C4.6615 0 4.1135 0.09125 3.60044 0.2595L7.31931 3.97837L6.61338 6.61338L3.97844 7.31931L0.259437 3.60038C0.0913124 4.1135 0 4.66144 0 5.23081ZM27.1779 27.1779L24.8292 27.8072L23.1099 26.0879L23.7392 23.7392L26.0879 23.1099L27.8072 24.8292L27.1779 27.1779ZM17.845 20.7083L21.1516 24.0148C20.9996 24.4684 20.9171 24.9538 20.9171 25.4586C20.9171 27.9667 22.9504 30 25.4586 30C27.9667 30 29.9999 27.9667 30 25.4586C29.9999 22.9504 27.9667 20.9171 25.4586 20.9171C24.9538 20.9171 24.4683 20.9996 24.0147 21.1516L21.9904 19.1273C21.9822 19.4737 21.8623 19.8088 21.6403 20.0901C21.3281 20.4857 20.8686 20.7084 20.3647 20.7084H17.845V20.7083ZM10.9621 2.78338C11.2834 3.53475 11.4616 4.36194 11.4616 5.23081C11.4616 5.81219 11.3811 6.38856 11.2222 6.94481L11.4024 7.12506C12.4981 6.62381 13.7162 6.34406 15 6.34406C19.7809 6.34406 23.6559 10.2191 23.6559 15C23.6559 16.2838 23.3762 17.502 22.8749 18.5976L24.3133 20.036C24.6893 19.9569 25.073 19.9172 25.4585 19.9172C25.9276 19.9172 26.3831 19.9757 26.8182 20.0856C27.1099 19.4084 27.3432 18.7064 27.5144 17.9867L30 17.0299V12.9699L27.5149 12.0134C27.1996 10.6887 26.6746 9.42319 25.9606 8.26381L27.0421 5.82875L24.1712 2.95788L21.7353 4.03969C20.5761 3.32594 19.3112 2.80087 17.9867 2.48569L17.0299 0H12.9699L12.0134 2.48513C11.6584 2.56963 11.3077 2.66913 10.9621 2.78338Z" fill="#7D859A"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.9 KiB |
@ -1,4 +1,4 @@
|
||||
<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M23.9998 0C10.7663 0 0 10.7661 0 23.9993C0 37.2335 10.7663 48 23.9998 48C37.233 48 47.9991 37.2333 47.9991 23.9993C47.9991 10.7661 37.233 0 23.9998 0ZM23.9998 44.5596C12.6633 44.5596 3.44037 35.3362 3.44037 23.9993C3.44037 12.6631 12.6633 3.44037 23.9998 3.44037C35.336 3.44037 44.5587 12.6631 44.5587 23.9993C44.5587 35.3362 35.336 44.5596 23.9998 44.5596Z" fill="#FFEDBC"/>
|
||||
<path d="M36.3401 23.5977H25.0617V11.2693C25.0617 10.3193 24.2918 9.54907 23.3415 9.54907C22.3915 9.54907 21.6213 10.3193 21.6213 11.2693V25.3179C21.6213 26.2679 22.3915 27.0381 23.3415 27.0381H36.3401C37.2904 27.0381 38.0603 26.2679 38.0603 25.3179C38.0603 24.3679 37.2901 23.5977 36.3401 23.5977Z" fill="#FFEDBC"/>
|
||||
<svg width="26" height="26" viewBox="0 0 26 26" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M12.9999 -0.000488281C5.83149 -0.000488281 -0.000457764 5.83134 -0.000457764 12.9996C-0.000457764 20.1684 5.83149 26.0005 12.9999 26.0005C20.1682 26.0005 26 20.1683 26 12.9996C26 5.83134 20.1682 -0.000488281 12.9999 -0.000488281ZM12.9999 24.1369C6.85908 24.1369 1.86314 19.1407 1.86314 12.9996C1.86314 6.85893 6.85908 1.86311 12.9999 1.86311C19.1406 1.86311 24.1364 6.85893 24.1364 12.9996C24.1364 19.1407 19.1406 24.1369 12.9999 24.1369Z" fill="#FFC945"/>
|
||||
<path d="M19.6845 12.7821H13.5751V6.10392C13.5751 5.58932 13.158 5.17212 12.6433 5.17212C12.1287 5.17212 11.7115 5.58932 11.7115 6.10392V13.7139C11.7115 14.2285 12.1287 14.6457 12.6433 14.6457H19.6845C20.1992 14.6457 20.6163 14.2285 20.6163 13.7139C20.6163 13.1993 20.1991 12.7821 19.6845 12.7821Z" fill="#FFC945"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 805 B After Width: | Height: | Size: 885 B |
@ -0,0 +1,4 @@
|
||||
<svg width="30" height="28" viewBox="0 0 30 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M16.4814 0C9.02723 0 2.96265 6.06432 2.96265 13.5184C2.96265 14.9279 3.17858 16.3028 3.59882 17.6212L6.05981 13.6207C6.47469 12.9461 7.19509 12.5435 7.98717 12.5435C8.77873 12.5435 9.49965 12.9464 9.914 13.621L16.7079 24.6635C17.1437 25.3716 17.1615 26.2276 16.756 26.9532C16.7407 26.9807 16.7216 27.0048 16.7053 27.0315C24.0561 26.911 30.0001 20.8975 30.0001 13.5184C30.0001 6.06432 23.9355 0 16.4814 0ZM23.6666 18.1333C23.564 18.2926 23.3914 18.3795 23.2151 18.3795C23.1162 18.3795 23.0157 18.352 22.9263 18.2945L16.192 13.9692C16.0382 13.8705 15.9456 13.7008 15.9456 13.5184V3.44455C15.9456 3.1487 16.1852 2.90882 16.4814 2.90882C16.7775 2.90882 17.0171 3.1487 17.0171 3.44455V13.2257L23.5049 17.393C23.7539 17.5529 23.8261 17.8843 23.6666 18.1333Z" fill="#7D859A"/>
|
||||
<path d="M0.153672 26.4306C0.367125 26.8125 0.755841 27.0406 1.19321 27.0406H14.7805C15.2183 27.0406 15.6071 26.8125 15.8205 26.4306C16.034 26.0484 16.0246 25.5977 15.7954 25.2249L9.00152 14.1821C8.78336 13.8269 8.40406 13.615 7.98709 13.615C7.57013 13.615 7.19083 13.8269 6.97215 14.1821L0.178784 25.2249C-0.0503642 25.5977 -0.0597812 26.0486 0.153672 26.4306ZM7.45137 17.8817C7.45137 17.5858 7.69098 17.346 7.98709 17.346C8.28321 17.346 8.52282 17.5858 8.52282 17.8817V22.1809C8.52282 22.4767 8.28321 22.7166 7.98709 22.7166C7.69098 22.7166 7.45137 22.4767 7.45137 22.1809V17.8817ZM7.45137 24.4491C7.45137 24.1532 7.69098 23.9133 7.98709 23.9133C8.28321 23.9133 8.52282 24.1532 8.52282 24.4491V24.623C8.52282 24.9189 8.28321 25.1587 7.98709 25.1587C7.69098 25.1587 7.45137 24.9189 7.45137 24.623V24.4491Z" fill="#7D859A"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.7 KiB |
@ -0,0 +1,8 @@
|
||||
<svg width="33" height="29" viewBox="0 0 33 29" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M29.2627 9.22729C28.6053 9.22729 27.9476 8.73301 27.9476 7.90909V4.61373C27.9476 3.46034 26.9611 2.63642 25.9748 2.63642H22.6869C22.0292 2.63642 21.3717 2.14213 21.3717 1.31821C21.3717 0.494451 21.8649 2.86102e-06 22.6869 2.86102e-06H25.9748C28.4408 2.86102e-06 30.5779 1.97731 30.5779 4.61373V7.90909C30.5779 8.56819 29.9204 9.22729 29.2627 9.22729Z" fill="#7D859A"/>
|
||||
<path d="M22.6869 26.3636H25.9748C27.1256 26.3636 27.9476 25.375 27.9476 24.3864V21.0909C27.9476 20.4318 28.4409 19.7728 29.2629 19.7728C30.0849 19.7728 30.5781 20.2671 30.5781 21.0909V24.3864C30.5781 26.858 28.6053 29 25.9748 29H22.6869C22.0294 29 21.3717 28.5057 21.3717 27.6818C21.3717 26.858 22.0294 26.3636 22.6869 26.3636Z" fill="#7D859A"/>
|
||||
<path d="M9.53517 2.63642H6.2472C5.0964 2.63642 4.27442 3.62499 4.27442 4.61373V7.90909C4.27442 8.56819 3.78122 9.22729 2.95922 9.22729C2.13723 9.22729 1.64404 8.56819 1.64404 7.90909V4.61373C1.64404 2.14213 3.61683 2.86102e-06 6.2472 2.86102e-06H9.53517C10.1928 2.86102e-06 10.8504 0.494451 10.8504 1.31821C10.8504 2.14213 10.1928 2.63642 9.53517 2.63642Z" fill="#7D859A"/>
|
||||
<path d="M2.95922 19.7728C3.61683 19.7728 4.27442 20.2671 4.27442 21.0909V24.3864C4.27442 25.5398 5.26082 26.3636 6.2472 26.3636H9.53518C10.1928 26.3636 10.8504 26.858 10.8504 27.6818C10.8504 28.5057 10.1928 29 9.53518 29H6.2472C3.78123 29 1.64404 26.858 1.64404 24.3864V21.0909C1.64404 20.4318 2.30163 19.7728 2.95922 19.7728Z" fill="#7D859A"/>
|
||||
<path d="M22.6869 4.61363C24.4953 4.61363 25.975 6.0965 25.975 7.90899V10.8749H6.24707V7.90899C6.24707 6.0965 7.72666 4.61363 9.53505 4.61363H22.6869Z" fill="#7D859A"/>
|
||||
<path d="M30.907 15.8182H25.9751V21.0909C25.9751 22.9033 24.4954 24.3863 22.687 24.3863H9.53513C7.72674 24.3863 6.24715 22.9033 6.24715 21.0909V15.4886H1.31519C0.657589 15.4886 0 14.9943 0 14.1703C0 13.3466 0.493192 12.8523 1.31519 12.8523H30.907C31.5645 12.8523 32.2221 13.3466 32.2221 14.1703C32.2221 14.9943 31.5645 15.8182 30.907 15.8182Z" fill="#7D859A"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.0 KiB |
@ -0,0 +1,9 @@
|
||||
<svg width="26" height="30" viewBox="0 0 26 30" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M20.8 5.82597C21.1451 5.82597 21.4259 5.54517 21.4259 5.2C21.4259 4.85484 21.1451 4.5741 20.8 4.5741C20.4548 4.5741 20.1741 4.85484 20.1741 5.2C20.1741 5.54517 20.4548 5.82597 20.8 5.82597Z" fill="#7D859A"/>
|
||||
<path d="M5.19967 10.474C6.072 10.474 6.89412 10.2591 7.61606 9.87943C9.01151 9.14554 11.433 8.74063 13.0097 8.74063C14.5864 8.74063 16.9885 9.14554 18.3839 9.87943C19.1059 10.2591 19.928 10.474 20.8003 10.474C23.6845 10.474 26.0199 8.12582 25.9999 5.23698C26.02 2.34815 23.6845 0 20.8004 0C19.928 0 19.1059 0.214876 18.384 0.594592C16.9885 1.32843 14.5864 1.73334 13.0097 1.73334C11.433 1.73334 9.01151 1.32843 7.61606 0.594592C6.89412 0.214876 6.072 0 5.19967 0C2.31552 0 -0.0199208 2.34815 0.000128126 5.23698C-0.0199208 8.12582 2.31552 10.474 5.19967 10.474ZM20.8 3.32223C21.8355 3.32223 22.6778 4.16463 22.6778 5.20001C22.6778 6.23538 21.8355 7.07779 20.8 7.07779C19.7646 7.07779 18.9223 6.23538 18.9223 5.20001C18.9223 4.16463 19.7646 3.32223 20.8 3.32223ZM5.20002 3.32223C6.23546 3.32223 7.0778 4.16463 7.0778 5.20001C7.0778 6.23538 6.23546 7.07779 5.20002 7.07779C4.16458 7.07779 3.32224 6.23538 3.32224 5.20001C3.32224 4.16463 4.16458 3.32223 5.20002 3.32223Z" fill="#7D859A"/>
|
||||
<path d="M5.20018 5.82597C5.54535 5.82597 5.82615 5.54517 5.82615 5.2C5.82615 4.85484 5.54541 4.5741 5.20018 4.5741C4.85502 4.5741 4.57422 4.85484 4.57422 5.2C4.57422 5.54517 4.85502 5.82597 5.20018 5.82597Z" fill="#7D859A"/>
|
||||
<path d="M19.933 24.8922C20.2787 24.8922 20.5589 24.612 20.5589 24.2663C20.5589 23.9206 20.2787 23.6404 19.933 23.6404C19.5874 23.6404 19.3071 23.9206 19.3071 24.2663C19.3071 24.612 19.5874 24.8922 19.933 24.8922Z" fill="#7D859A"/>
|
||||
<path d="M5.20018 21.4254C5.5459 21.4254 5.82615 21.1451 5.82615 20.7994C5.82615 20.4537 5.5459 20.1735 5.20018 20.1735C4.85447 20.1735 4.57422 20.4537 4.57422 20.7994C4.57422 21.1451 4.85447 21.4254 5.20018 21.4254Z" fill="#7D859A"/>
|
||||
<path d="M21.4514 19.1522C20.6056 18.9386 19.7559 18.9456 18.963 19.1369C17.4304 19.5068 15.8334 19.5211 14.3048 19.1351C12.776 18.749 9.86286 17.9782 8.68956 16.925C8.08255 16.3801 7.33808 15.9704 6.49227 15.7568C3.69588 15.0506 0.856619 16.7554 0.168716 19.5613C-0.558072 22.3572 1.13129 25.2057 3.92769 25.912C4.77344 26.1256 5.62318 26.1185 6.41606 25.9272C7.94873 25.5573 10.403 25.543 11.9317 25.9291C13.4604 26.3151 15.5162 27.086 16.6895 28.1392C17.2966 28.6841 18.041 29.0937 18.8868 29.3073C21.6832 30.0136 24.5224 28.3087 25.2104 25.5029C25.9372 22.7069 24.2478 19.8583 21.4514 19.1522ZM5.20001 22.6774C4.16457 22.6774 3.32223 21.835 3.32223 20.7996C3.32223 19.7642 4.16457 18.9218 5.20001 18.9218C6.23545 18.9218 7.07779 19.7642 7.07779 20.7996C7.07779 21.835 6.23545 22.6774 5.20001 22.6774ZM19.933 26.1441C18.8975 26.1441 18.0552 25.3017 18.0552 24.2663C18.0552 23.2309 18.8975 22.3885 19.933 22.3885C20.9684 22.3885 21.8107 23.2309 21.8107 24.2663C21.8107 25.3017 20.9684 26.1441 19.933 26.1441Z" fill="#7D859A"/>
|
||||
<path d="M8.85478 14.8946C8.59824 13.6273 8.61292 12.3992 8.84652 11.2207C8.26827 11.4519 7.14334 12.2072 5.19981 12.2072C4.25549 12.2072 3.34063 12.0196 2.49696 11.6625C2.6347 12.5828 2.63465 13.4941 2.49609 14.4181C4.5631 13.5375 6.9321 13.7129 8.85478 14.8946Z" fill="#7D859A"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.2 KiB |
@ -0,0 +1,8 @@
|
||||
<svg width="33" height="29" viewBox="0 0 33 29" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M29.2627 9.22729C28.6053 9.22729 27.9476 8.73301 27.9476 7.90909V4.61373C27.9476 3.46034 26.9611 2.63642 25.9748 2.63642H22.6869C22.0292 2.63642 21.3717 2.14213 21.3717 1.31821C21.3717 0.494451 21.8649 2.86102e-06 22.6869 2.86102e-06H25.9748C28.4408 2.86102e-06 30.5779 1.97731 30.5779 4.61373V7.90909C30.5779 8.56819 29.9204 9.22729 29.2627 9.22729Z" fill="#7D859A"/>
|
||||
<path d="M22.6869 26.3636H25.9748C27.1256 26.3636 27.9476 25.375 27.9476 24.3864V21.0909C27.9476 20.4318 28.4409 19.7728 29.2629 19.7728C30.0849 19.7728 30.5781 20.2671 30.5781 21.0909V24.3864C30.5781 26.858 28.6053 29 25.9748 29H22.6869C22.0294 29 21.3717 28.5057 21.3717 27.6818C21.3717 26.858 22.0294 26.3636 22.6869 26.3636Z" fill="#7D859A"/>
|
||||
<path d="M9.53517 2.63642H6.2472C5.0964 2.63642 4.27442 3.62499 4.27442 4.61373V7.90909C4.27442 8.56819 3.78122 9.22729 2.95922 9.22729C2.13723 9.22729 1.64404 8.56819 1.64404 7.90909V4.61373C1.64404 2.14213 3.61683 2.86102e-06 6.2472 2.86102e-06H9.53517C10.1928 2.86102e-06 10.8504 0.494451 10.8504 1.31821C10.8504 2.14213 10.1928 2.63642 9.53517 2.63642Z" fill="#7D859A"/>
|
||||
<path d="M2.95922 19.7728C3.61683 19.7728 4.27442 20.2671 4.27442 21.0909V24.3864C4.27442 25.5398 5.26082 26.3636 6.2472 26.3636H9.53518C10.1928 26.3636 10.8504 26.858 10.8504 27.6818C10.8504 28.5057 10.1928 29 9.53518 29H6.2472C3.78123 29 1.64404 26.858 1.64404 24.3864V21.0909C1.64404 20.4318 2.30163 19.7728 2.95922 19.7728Z" fill="#7D859A"/>
|
||||
<path d="M22.6869 4.61363C24.4953 4.61363 25.975 6.0965 25.975 7.90899V10.8749H6.24707V7.90899C6.24707 6.0965 7.72666 4.61363 9.53505 4.61363H22.6869Z" fill="#7D859A"/>
|
||||
<path d="M30.907 15.8182H25.9751V21.0909C25.9751 22.9033 24.4954 24.3863 22.687 24.3863H9.53513C7.72674 24.3863 6.24715 22.9033 6.24715 21.0909V15.4886H1.31519C0.657589 15.4886 0 14.9943 0 14.1703C0 13.3466 0.493192 12.8523 1.31519 12.8523H30.907C31.5645 12.8523 32.2221 13.3466 32.2221 14.1703C32.2221 14.9943 31.5645 15.8182 30.907 15.8182Z" fill="#7D859A"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.0 KiB |
@ -0,0 +1,13 @@
|
||||
class AppAsset{
|
||||
static String loginTopBg = 'assets/images/login_top_bg.png';
|
||||
static String askOtpIcon = 'assets/images/ask_otp_icon.svg';
|
||||
static String askRequesterIcon = 'assets/images/ask_requester_icon.svg';
|
||||
static String scanQrIcon = 'assets/images/scan_qr_icon.svg';
|
||||
static String takeDevicePhotoIcon = 'assets/images/take_device_photo_icon.svg';
|
||||
static String maintenanceIcon = 'assets/images/maintenance_icon.svg';
|
||||
static String retiredAssetIcon = 'assets/images/retired_asset_icon.svg';
|
||||
static String sparePartIcon = 'assets/images/spare_part_icon.svg';
|
||||
static String editIcon = 'assets/images/edit_icon.svg';
|
||||
static String deleteIcon = 'assets/images/delete_icon.svg';
|
||||
static String overDueIcon = 'assets/images/overdue.svg';
|
||||
}
|
||||
@ -0,0 +1,139 @@
|
||||
import 'dart:async';
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:test_sa/controllers/notification/firebase_notification_manger.dart';
|
||||
import 'package:test_sa/controllers/notification/notification_manger.dart';
|
||||
import 'package:test_sa/controllers/providers/api/all_requests_provider.dart';
|
||||
import 'package:test_sa/controllers/providers/api/notifications_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/dashboard_latest/widgets/app_bar_widget.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/user.dart';
|
||||
import 'package:test_sa/new_views/app_style/app_color.dart';
|
||||
import 'package:test_sa/new_views/pages/land_page/dashboard_fragments/progress_fragment.dart';
|
||||
import 'package:test_sa/new_views/pages/land_page/dashboard_fragments/requests_fragment.dart';
|
||||
import 'package:test_sa/utilities/request_utils.dart';
|
||||
|
||||
import '../new_views/pages/land_page/dashboard_fragments/request_category_fragment.dart';
|
||||
|
||||
class DashboardView extends StatefulWidget {
|
||||
final VoidCallback onDrawerPress;
|
||||
|
||||
const DashboardView({Key key, this.onDrawerPress}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<DashboardView> createState() => _DashboardViewState();
|
||||
}
|
||||
|
||||
class _DashboardViewState extends State<DashboardView> {
|
||||
int _currentPage = 0;
|
||||
bool isFCM = true;
|
||||
User user;
|
||||
|
||||
SettingProvider settingProvider;
|
||||
UserProvider userProvider;
|
||||
|
||||
AllRequestsProvider allRequestsProvider;
|
||||
|
||||
NotificationsProvider notificationsProvider;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
getInitialData();
|
||||
}
|
||||
|
||||
void getInitialData() {
|
||||
scheduleMicrotask(() async {
|
||||
userProvider = Provider.of<UserProvider>(context, listen: false);
|
||||
settingProvider = Provider.of<SettingProvider>(context, listen: false);
|
||||
allRequestsProvider = Provider.of<AllRequestsProvider>(context, listen: false);
|
||||
user = userProvider.user;
|
||||
await getAllRequests();
|
||||
|
||||
if (isFCM) {
|
||||
FirebaseNotificationManger.initialized(context);
|
||||
NotificationManger.initialisation((notificationDetails) {
|
||||
FirebaseNotificationManger.handleMessage(context, json.decode(notificationDetails.payload));
|
||||
}, (id, title, body, payload) async {});
|
||||
|
||||
isFCM = false;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
Future<void> getAllRequests() async {
|
||||
allRequestsProvider.isAllLoading = true;
|
||||
allRequestsProvider.isFilterRequestLoading = true;
|
||||
allRequestsProvider.currentListIndex = 0;
|
||||
allRequestsProvider.filterRequest = null;
|
||||
var tabs = RequestUtils.getTabs(userType: userProvider.user.type, context: context);
|
||||
Future.wait([
|
||||
allRequestsProvider.getRequests(),
|
||||
allRequestsProvider.getFilterRequests(pagination: false, status: tabs[0]['status']),
|
||||
]).whenComplete(() {
|
||||
allRequestsProvider.isAllLoading = false;
|
||||
});
|
||||
|
||||
print('user provider user data is ${userProvider.user.type}');
|
||||
await notificationsProvider.getSystemNotifications(user: userProvider.user, resetProvider: true);
|
||||
}
|
||||
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
// backgroundColor: AppColor.background(context),
|
||||
appBar: PreferredSize(
|
||||
preferredSize: const Size.fromHeight(kToolbarHeight),
|
||||
child: AppBarWidget(
|
||||
onDrawerPress: widget.onDrawerPress,
|
||||
)),
|
||||
body: RefreshIndicator(
|
||||
onRefresh: () async {
|
||||
await getInitialData();
|
||||
return Future.delayed(const Duration(milliseconds: 250));
|
||||
},
|
||||
child: SingleChildScrollView(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
Text(
|
||||
context.translation.welcome,
|
||||
style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
|
||||
),
|
||||
Text(
|
||||
user == null ? "" : (user?.username ?? ""),
|
||||
style: AppTextStyles.heading2.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50, fontWeight: FontWeight.w600),
|
||||
),
|
||||
// 24.height,
|
||||
|
||||
ProgressFragment(),
|
||||
35.height,
|
||||
SizedBox(height: 105.toScreenHeight, child: const RequestsFragment()),
|
||||
const RequestCategoryFragment()
|
||||
],
|
||||
).paddingOnly(start: 16, end: 16, top: 0, bottom: 8),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,120 @@
|
||||
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/notifications_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/widget_extensions.dart';
|
||||
import 'package:test_sa/new_views/app_style/app_color.dart';
|
||||
import 'package:test_sa/views/pages/user/notifications/notifications_page.dart';
|
||||
|
||||
import '../../controllers/providers/api/user_provider.dart';
|
||||
import '../../models/user.dart';
|
||||
|
||||
class AppBarWidget extends StatelessWidget {
|
||||
final VoidCallback onDrawerPress;
|
||||
const AppBarWidget({Key key, this.onDrawerPress}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return AppBar(
|
||||
automaticallyImplyLeading: false,
|
||||
backgroundColor: Theme.of(context).scaffoldBackgroundColor,
|
||||
titleSpacing: 0,
|
||||
title: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
Consumer<UserProvider>(builder: (context, snapshot, _) {
|
||||
return CircleAvatar(
|
||||
radius: 24,
|
||||
backgroundColor: context.isDark ? AppColor.neutral50 : AppColor.neutral40,
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(1), // Border radius
|
||||
child: ClipOval(
|
||||
child: snapshot.profileImage != null
|
||||
? Image.file(snapshot.profileImage)
|
||||
: (snapshot.user.profilePhotoName?.isNotEmpty ?? false)
|
||||
? Image.network(snapshot.user.profilePhotoName)
|
||||
: const Icon(Icons.person, size: 24, color: Colors.white),
|
||||
),
|
||||
),
|
||||
);
|
||||
}).onPress(onDrawerPress),
|
||||
const Spacer(),
|
||||
Consumer<SettingProvider>(
|
||||
builder: (context, settingProvider,child) {
|
||||
return Container(
|
||||
padding: const EdgeInsets.fromLTRB(12, 6, 6, 6),
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(8),
|
||||
color: AppColor.background(context),
|
||||
boxShadow: const [
|
||||
BoxShadow(
|
||||
color: Color(0x07000000),
|
||||
blurRadius: 14,
|
||||
offset: Offset(0, 0),
|
||||
spreadRadius: 0,
|
||||
)
|
||||
],
|
||||
),
|
||||
child: DropdownButton<AssetGroup>(
|
||||
value: settingProvider.assetGroup,
|
||||
//iconSize: 24,
|
||||
isDense: true,
|
||||
icon: const Icon(Icons.keyboard_arrow_down),
|
||||
elevation: 8,
|
||||
// dropdownColor: Colors.amber,
|
||||
borderRadius: BorderRadius.circular(8),
|
||||
style: TextStyle(color: Theme.of(context).primaryColor),
|
||||
underline: const SizedBox.shrink(),
|
||||
onChanged: (newValue) {
|
||||
if (settingProvider.assetGroup != newValue) {
|
||||
settingProvider.setAssetGroup(newValue);
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
Provider.of<AllRequestsProvider>(context, listen: false).getRequests();
|
||||
Provider.of<NotificationsProvider>(context, listen: false).getSystemNotifications(user: Provider.of<UserProvider>(context, listen: false).user, resetProvider: true);
|
||||
});
|
||||
}
|
||||
},
|
||||
items: Provider.of<UserProvider>(context, listen: false).user.assetGroups.map<DropdownMenuItem<AssetGroup>>((value) {
|
||||
return DropdownMenuItem<AssetGroup>(
|
||||
value: value,
|
||||
child: Text(
|
||||
value?.name ?? "",
|
||||
style: Theme.of(context).textTheme.bodyLarge,
|
||||
),
|
||||
);
|
||||
})?.toList(),
|
||||
),
|
||||
);
|
||||
}
|
||||
),
|
||||
16.width,
|
||||
Stack(
|
||||
alignment: Alignment.topRight,
|
||||
children: [
|
||||
Icon(Icons.notifications, color: context.isDark ? AppColor.neutral30 : AppColor.neutral20, size: 30).paddingOnly(top: 6, end: 0),
|
||||
// todo @sikander will add count for unread notifications
|
||||
// Positioned(
|
||||
// top: 0,
|
||||
// right: 0,
|
||||
// child: Container(
|
||||
// padding: const EdgeInsets.all(4),
|
||||
// decoration: const ShapeDecoration(
|
||||
// color: Color(0xFFD02127),
|
||||
// shape: CircleBorder(),
|
||||
// ),
|
||||
// child: Text("", style: AppTextStyles.bodyText),
|
||||
// ),
|
||||
// )
|
||||
],
|
||||
).onPress(() {
|
||||
Navigator.of(context).pushNamed(NotificationsPage.id);
|
||||
}),
|
||||
],
|
||||
).paddingOnly(start: 16, end: 16),
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,84 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:badges/badges.dart' as badges;
|
||||
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 TabButton extends StatelessWidget {
|
||||
final String label;
|
||||
final bool isSelected;
|
||||
final int count;
|
||||
final bool loading;
|
||||
final VoidCallback onPressed;
|
||||
|
||||
const TabButton({
|
||||
Key key,
|
||||
@required this.label,
|
||||
this.isSelected = false,
|
||||
@required this.count,
|
||||
@required this.loading = false,
|
||||
@required this.onPressed,
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return InkWell(
|
||||
onTap: onPressed,
|
||||
child: count != null && count > 0 && isSelected && !loading
|
||||
? badges.Badge(
|
||||
badgeContent: Text(
|
||||
count.toString(),
|
||||
style: const TextStyle(
|
||||
color: AppColor.white20,
|
||||
fontWeight: FontWeight.normal,
|
||||
),
|
||||
),
|
||||
badgeStyle: const badges.BadgeStyle(padding: EdgeInsets.symmetric(horizontal: 5, vertical: 3), badgeColor: AppColor.red50),
|
||||
child: Container(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 8),
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(7),
|
||||
color: isSelected ? AppColor.primary10 : AppColor.white30,
|
||||
border: !isSelected ? Border.all(color: Colors.white54, width: 1) : null,
|
||||
),
|
||||
child: Center(
|
||||
child: Text(
|
||||
label,
|
||||
style: AppTextStyles.bodyText.copyWith(
|
||||
color: isSelected ? Colors.white : Colors.black,
|
||||
),
|
||||
)),
|
||||
).toShimmer(isShow: loading, radius: 7),
|
||||
)
|
||||
: Container(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 8),
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(7),
|
||||
color: isSelected ? AppColor.primary10 : AppColor.white30,
|
||||
border: !isSelected ? Border.all(color: AppColor.white30, width: 1) : null,
|
||||
),
|
||||
child: Center(
|
||||
child: Text(
|
||||
label,
|
||||
style: AppTextStyles.bodyText.copyWith(
|
||||
color: isSelected ? Colors.white : Colors.black,
|
||||
),
|
||||
)),
|
||||
).toShimmer(isShow: loading, radius: 7),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class TabButtonData {
|
||||
final String label;
|
||||
final bool isSelected;
|
||||
final int totalCount;
|
||||
final VoidCallback onPressed;
|
||||
|
||||
TabButtonData({
|
||||
@required this.label,
|
||||
@required this.isSelected,
|
||||
@required this.totalCount,
|
||||
@required this.onPressed,
|
||||
});
|
||||
}
|
||||
@ -0,0 +1,265 @@
|
||||
//Older code
|
||||
// import 'package:flutter/material.dart';
|
||||
// import 'package:provider/provider.dart';
|
||||
// import 'package:test_sa/controllers/notification/firebase_notification_manger.dart';
|
||||
// import 'package:test_sa/controllers/providers/api/all_requests_provider.dart';
|
||||
// import 'package:test_sa/controllers/providers/api/notifications_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/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/views/widgets/notifications/notification_item.dart';
|
||||
//
|
||||
// class RequestCategoryFragment extends StatelessWidget {
|
||||
// RequestCategoryFragment({Key key}) : super(key: key);
|
||||
//
|
||||
// //NotificationsProvider _notificationsProvider;
|
||||
//
|
||||
// @override
|
||||
// Widget build(BuildContext context) {
|
||||
// //_notificationsProvider ??= Provider.of<NotificationsProvider>(context, listen: false);
|
||||
// return Consumer<NotificationsProvider>(builder: (context, _notificationsProvider, _) {
|
||||
// return RefreshIndicator(
|
||||
// onRefresh: () {
|
||||
// Provider.of<AllRequestsProvider>(context, listen: false).getRequests();
|
||||
// _notificationsProvider.getSystemNotifications(user: Provider.of<UserProvider>(context, listen: false).user,resetProvider: true);
|
||||
// return Future.delayed(const Duration(microseconds: 250));
|
||||
// },
|
||||
// child: SingleChildScrollView(
|
||||
// padding: const EdgeInsets.all(16),
|
||||
// child: Container(
|
||||
// decoration: ShapeDecoration(
|
||||
// color: AppColor.background(context),
|
||||
// shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)),
|
||||
// shadows: [boxShadowR14],
|
||||
// ),
|
||||
// child: Column(
|
||||
// mainAxisSize: MainAxisSize.min,
|
||||
// crossAxisAlignment: CrossAxisAlignment.start,
|
||||
// children: [
|
||||
// context.translation.recentActivities
|
||||
// .heading5(context)
|
||||
// .toShimmer(
|
||||
// isShow: _notificationsProvider.isLoading,
|
||||
// )
|
||||
// .paddingOnly(top: 16, start: 16, end: 16),
|
||||
// ListView.separated(
|
||||
// shrinkWrap: true,
|
||||
// physics: const NeverScrollableScrollPhysics(),
|
||||
// padding: const EdgeInsets.all(16),
|
||||
// itemCount: _notificationsProvider.notifications.length,
|
||||
// separatorBuilder: (context, itemIndex) => const Divider().defaultStyle(context).paddingOnly(top: 16, bottom: 16),
|
||||
// itemBuilder: (context, itemIndex) {
|
||||
// // todo add priority & progress tag to show chip
|
||||
// return NotificationItem(
|
||||
// isLoading: _notificationsProvider.isLoading,
|
||||
// notification: _notificationsProvider.notifications[itemIndex],
|
||||
// onPressed: (notification) {
|
||||
// FirebaseNotificationManger.handleMessage(context, notification.toNotificationJson());
|
||||
// },
|
||||
// );
|
||||
// },
|
||||
// ),
|
||||
// ],
|
||||
// ),
|
||||
// ),
|
||||
// ),
|
||||
// );
|
||||
// });
|
||||
// }
|
||||
// }
|
||||
|
||||
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/notifications_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/text_extensions.dart';
|
||||
import 'package:test_sa/extensions/widget_extensions.dart';
|
||||
import 'package:test_sa/models/all_requests_and_count_model.dart';
|
||||
import 'package:test_sa/models/enums/user_types.dart';
|
||||
import 'package:test_sa/models/user.dart';
|
||||
import 'package:test_sa/new_views/common_widgets/tab_button.dart';
|
||||
import 'package:test_sa/new_views/pages/land_page/dashboard_fragments/request_category_list.dart';
|
||||
import 'package:test_sa/utilities/request_utils.dart';
|
||||
import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
|
||||
|
||||
class RequestCategoryFragment extends StatefulWidget {
|
||||
// final AllRequestsAndCount allRequestsAndCount;
|
||||
|
||||
// const RequestCategoryFragment({Key key, this.allRequestsAndCount}) : super(key: key);
|
||||
const RequestCategoryFragment({
|
||||
Key key,
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<RequestCategoryFragment> createState() => _RequestCategoryFragmentState();
|
||||
}
|
||||
|
||||
class _RequestCategoryFragmentState extends State<RequestCategoryFragment> {
|
||||
@override
|
||||
void initState() {
|
||||
// TODO: implement initState
|
||||
// getInitialList();
|
||||
print('init state called...');
|
||||
super.initState();
|
||||
}
|
||||
|
||||
// Future<void> getInitialList() async {
|
||||
// UserProvider userProvider = Provider.of<UserProvider>(context, listen: false);
|
||||
//
|
||||
// AllRequestsProvider allRequestsProvider = Provider.of<AllRequestsProvider>(context, listen: false);
|
||||
// UsersTypes usersType = userProvider.user.type;
|
||||
// var tabs = RequestUtils.getTabs(userType: usersType, context: context);
|
||||
// allRequestsProvider.currentListIndex = 0;
|
||||
// allRequestsProvider.filterRequest = null;
|
||||
// await allRequestsProvider.getFilterRequests(pagination: false, status: tabs[0]['status']);
|
||||
//
|
||||
// print('tabs lenght is ${tabs.length}');
|
||||
// }
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Consumer<AllRequestsProvider>(builder: (context, allRequestProvider, child) {
|
||||
return Column(mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: <Widget>[
|
||||
context.translation.allRequests.heading4(context).paddingOnly(top: 16, bottom: 16),
|
||||
getTabs(
|
||||
requestsProvider: allRequestProvider,
|
||||
context: context,
|
||||
userType: Provider.of<UserProvider>(context, listen: false).user.type,
|
||||
),
|
||||
// Row(
|
||||
// children: _buildTabButtons(isEngineer: Provider.of<UserProvider>(context, listen: false).user.type == UsersTypes.engineer, allRequestsProvider: allRequestProvider),
|
||||
// ),
|
||||
10.height,
|
||||
allRequestProvider.isFilterRequestLoading||allRequestProvider.filterRequest==null?Column(
|
||||
mainAxisSize: MainAxisSize.max,
|
||||
children: List.generate( 3 , (index) {
|
||||
return Padding(
|
||||
padding: EdgeInsets.symmetric(vertical: 10.toScreenHeight,horizontal: 0),
|
||||
child: const SizedBox().toRequestShimmer(context, allRequestProvider.isFilterRequestLoading),
|
||||
);
|
||||
})): RequestCategoryList(allRequestProvider.filterRequest.requestsDetails ?? [], allRequestProvider.isFilterRequestLoading),
|
||||
// if (allRequestProvider.isLoadingList) ...[
|
||||
// const Center(child: CircularProgressIndicator()),
|
||||
// ] else ...[
|
||||
// RequestCategoryList(allRequestProvider.dashBoardFilterList?.requestsDetails ?? [], allRequestProvider.dashBoardFilterListLoading),
|
||||
// ]
|
||||
]);
|
||||
});
|
||||
}
|
||||
|
||||
Widget getTabs({@required BuildContext context, @required AllRequestsProvider requestsProvider, @required UsersTypes userType}) {
|
||||
List<dynamic> tabs = [];
|
||||
switch (userType) {
|
||||
case UsersTypes.engineer:
|
||||
tabs = RequestUtils.getTabs(userType: UsersTypes.engineer, context: context);
|
||||
return Row(
|
||||
children: tabs.map((item) {
|
||||
return tabWidget(
|
||||
label: item['label'],
|
||||
status: item['status'],
|
||||
selectedTab: tabs.indexOf(item),
|
||||
requestsProvider: requestsProvider,
|
||||
);
|
||||
}).toList(),
|
||||
);
|
||||
case UsersTypes.normal_user:
|
||||
tabs = RequestUtils.getTabs(userType: UsersTypes.normal_user, context: context);
|
||||
return Row(
|
||||
children: tabs.map((item) {
|
||||
return tabWidget(
|
||||
label: item['label'],
|
||||
status: item['status'],
|
||||
selectedTab: tabs.indexOf(item),
|
||||
requestsProvider: requestsProvider,
|
||||
);
|
||||
}).toList(),
|
||||
);
|
||||
default:
|
||||
return const SizedBox();
|
||||
}
|
||||
}
|
||||
|
||||
Widget tabWidget({@required int selectedTab, @required String label, @required int status, double width, @required AllRequestsProvider requestsProvider}) {
|
||||
return Padding(
|
||||
padding: const EdgeInsets.only(right: 12),
|
||||
child: TabButton(
|
||||
label: label,
|
||||
loading: requestsProvider.isFilterRequestLoading,
|
||||
isSelected: requestsProvider.currentListIndex == selectedTab,
|
||||
count: requestsProvider.filterRequest != null ? requestsProvider.filterRequest.total.count : 0,
|
||||
onPressed: () async {
|
||||
requestsProvider.currentListIndex = selectedTab;
|
||||
requestsProvider.filterRequest = null;
|
||||
await requestsProvider.getFilterRequests(status: status);
|
||||
requestsProvider.isInProgressLoading = false;
|
||||
requestsProvider.pageNum = 1;
|
||||
// requestsProvider.dashBoardFilterList = requestsProvider.openRequests.requestsDetails;
|
||||
},
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
//tabs code...
|
||||
//
|
||||
// List<TabButtonData> _getTabButtonData({@required bool isEngineer, @required AllRequestsProvider allRequestsProvider, @required int totalCount}) {
|
||||
// List<TabButtonData> tabList = [];
|
||||
// List<Map<String, dynamic>> tabs = [];
|
||||
// print('dashboard filter list data is ${allRequestsProvider.dashBoardFilterList}');
|
||||
//
|
||||
// if (!isEngineer && allRequestsProvider.dashBoardFilterList != null && allRequestsProvider.dashBoardFilterList.isNotEmpty) {
|
||||
// tabList.add(TabButtonData(
|
||||
// label: 'New Request',
|
||||
// isSelected: allRequestsProvider.currentListIndex == 0,
|
||||
// totalCount: totalCount,
|
||||
// onPressed: () {
|
||||
// allRequestsProvider.currentListIndex = 0;
|
||||
// allRequestsProvider.dashBoardFilterList = allRequestsProvider.openRequests.requestsDetails;
|
||||
// },
|
||||
// ));
|
||||
// }
|
||||
// tabList.add(TabButtonData(
|
||||
// label: 'In Progress',
|
||||
// isSelected: allRequestsProvider.currentListIndex == (isEngineer ? 0 : 1),
|
||||
// totalCount: totalCount,
|
||||
// onPressed: () {
|
||||
// allRequestsProvider.currentListIndex = isEngineer ? 0 : 1;
|
||||
// allRequestsProvider.dashBoardFilterList = allRequestsProvider.inProgressRequests.requestsDetails;
|
||||
// },
|
||||
// ));
|
||||
// tabList.add(
|
||||
// TabButtonData(
|
||||
// label: 'Completed',
|
||||
// isSelected: allRequestsProvider.currentListIndex == (isEngineer ? 1 : 2),
|
||||
// totalCount: totalCount,
|
||||
// onPressed: () {
|
||||
// allRequestsProvider.currentListIndex = isEngineer ? 1 : 2;
|
||||
// allRequestsProvider.dashBoardFilterList = allRequestsProvider.completedRequests.requestsDetails;
|
||||
// },
|
||||
// ),
|
||||
// );
|
||||
// return tabList;
|
||||
// }
|
||||
//
|
||||
// List<Widget> _buildTabButtons({@required bool isEngineer, @required AllRequestsProvider allRequestsProvider}) {
|
||||
// int totalCount = 0;
|
||||
// print('build tab button called');
|
||||
// if (allRequestsProvider.dashBoardFilterList != null) {
|
||||
// totalCount = allRequestsProvider.dashBoardFilterList.length;
|
||||
// }
|
||||
// return _getTabButtonData(isEngineer: isEngineer, allRequestsProvider: allRequestsProvider, totalCount: totalCount).map((tab) {
|
||||
// return Padding(
|
||||
// padding: const EdgeInsets.only(left: 10.0),
|
||||
// child: TabButton(
|
||||
// label: tab.label,
|
||||
// isSelected: tab.isSelected,
|
||||
// count: totalCount,
|
||||
// onPressed: tab.onPressed,
|
||||
// ),
|
||||
// );
|
||||
// }).toList();
|
||||
// }
|
||||
@ -0,0 +1,54 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:test_sa/extensions/int_extensions.dart';
|
||||
import 'package:test_sa/models/all_requests_and_count_model.dart';
|
||||
import 'package:test_sa/new_views/pages/land_page/requests/asset_item_view.dart';
|
||||
import 'package:test_sa/new_views/pages/land_page/requests/gas_refill_item_view.dart';
|
||||
import 'package:test_sa/new_views/pages/land_page/requests/ppm_item_view.dart';
|
||||
import 'package:test_sa/new_views/pages/land_page/requests/service_request_item_view.dart';
|
||||
|
||||
class RequestCategoryList extends StatelessWidget {
|
||||
final List<RequestsDetails> list;
|
||||
final bool isLoading;
|
||||
|
||||
const RequestCategoryList(this.list, this.isLoading, {Key key})
|
||||
: super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: List.generate(isLoading ? 6 : list.length, (index) {
|
||||
// if (isLoading) {
|
||||
// return const SizedBox().toRequestShimmer(context, isLoading);
|
||||
// }
|
||||
// else {
|
||||
return Padding(
|
||||
padding: EdgeInsets.symmetric(vertical: 10.toScreenHeight),
|
||||
child: _buildRequestItem(list[index]));
|
||||
// }
|
||||
}));
|
||||
}
|
||||
|
||||
Widget _buildRequestItem(RequestsDetails request) {
|
||||
bool isServiceRequest = request.nameOfType == "ServiceRequest";
|
||||
bool isGasRefill = request.nameOfType == "GasRefill";
|
||||
bool isAssetTransfer = request.nameOfType == "AssetTransfer";
|
||||
bool isPPMs = request.nameOfType == "PPMs";
|
||||
|
||||
if (isServiceRequest) {
|
||||
return ServiceRequestItemView(request);
|
||||
} else if (isGasRefill) {
|
||||
return GasRefillItemView(request);
|
||||
} else if (isPPMs) {
|
||||
return PpmItemView(request);
|
||||
} else if (isAssetTransfer) {
|
||||
return AssetItemView(request);
|
||||
} else {
|
||||
return Container(
|
||||
height: 100,
|
||||
width: double.infinity,
|
||||
color: Colors.grey,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,146 @@
|
||||
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/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/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/bottom_sheets/activity_type_bottomsheet.dart';
|
||||
import 'package:test_sa/service_request_latest/views/components/bottom_sheets/service_request_bottomsheet.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 ActivitiesListView extends StatelessWidget {
|
||||
static const String id = "/activities-list";
|
||||
|
||||
ActivitiesListView({Key key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
// UserProvider _userProvider = Provider.of<UserProvider>(context);
|
||||
// SettingProvider _settingProvider = Provider.of<SettingProvider>(context);
|
||||
List<SearchWorkOrder> workOrders = [];
|
||||
UserProvider _userProvider = Provider.of<UserProvider>(context);
|
||||
return Scaffold(
|
||||
appBar: DefaultAppBar(title: context.translation.activities),
|
||||
//backgroundColor: const Color(0xfff8f9fb),
|
||||
body: Consumer<ServiceRequestsProvider>(builder: (context, serviceRequestsProvider, child) {
|
||||
return SafeArea(
|
||||
child: FutureBuilder(
|
||||
future: serviceRequestsProvider.searchWorkOrders(callId: serviceRequestsProvider.currentSelectedRequest?.requestCode),
|
||||
builder: (context, snap) {
|
||||
if (snap.connectionState == ConnectionState.waiting) return const Center(child: CircularProgressIndicator());
|
||||
workOrders = snap.data as List<SearchWorkOrder>;
|
||||
return Column(
|
||||
children: [
|
||||
(workOrders.isEmpty)
|
||||
? NoItemFound(message: context.translation.noDataFound).expanded
|
||||
: ListView.separated(
|
||||
padding: const EdgeInsets.all(16),
|
||||
itemCount: workOrders.length,
|
||||
separatorBuilder: (czt, index) => 8.height,
|
||||
itemBuilder: (context, index) {
|
||||
return Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
StatusLabel(
|
||||
label: workOrders[index].currentSituation.name,
|
||||
textColor: AppColor.getRequestStatusTextColorByName(context, workOrders[index].currentSituation.name),
|
||||
backgroundColor: AppColor.getRequestStatusColorByName(context, workOrders[index].currentSituation.name),
|
||||
),
|
||||
8.height,
|
||||
Text(serviceRequestsProvider.currentSelectedRequest.requestCode, style: AppTextStyles.heading5.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50)),
|
||||
Text(
|
||||
'${context.translation.assetName}: ${workOrders[index].callRequest.asset.modelDefinition.assetName?.cleanupWhitespace?.capitalizeFirstOfEach}',
|
||||
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
|
||||
),
|
||||
Text(
|
||||
'${context.translation.currentSituation}: ${workOrders[index].currentSituation.name}',
|
||||
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
|
||||
),
|
||||
16.height,
|
||||
Row(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
Text(
|
||||
context.translation.viewDetails,
|
||||
style: AppTextStyles.bodyText.copyWith(color: AppColor.blueStatus(context)),
|
||||
),
|
||||
4.width,
|
||||
Icon(Icons.arrow_forward, color: AppColor.blueStatus(context), size: 14)
|
||||
],
|
||||
),
|
||||
],
|
||||
).onPress(() {
|
||||
Navigator.push(
|
||||
context,
|
||||
MaterialPageRoute(builder: (context) => WorkOrderDetailsPage(workOrder: workOrders[index], serviceRequest: serviceRequestsProvider.currentSelectedRequest)),
|
||||
);
|
||||
}).expanded,
|
||||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.end,
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: [
|
||||
if (_userProvider.user.type == UsersTypes.engineer &&
|
||||
serviceRequestsProvider.currentSelectedRequest.statusValue != 5 &&
|
||||
serviceRequestsProvider.currentSelectedRequest.statusValue != 3)
|
||||
"edit".toSvgAsset(height: 48, width: 48).onPress(() {
|
||||
Navigator.of(context).push(
|
||||
MaterialPageRoute(builder: (_) => UpdateServiceReport(request: serviceRequestsProvider.currentSelectedRequest, workOrder: workOrders[index])),
|
||||
);
|
||||
}),
|
||||
if (_userProvider.user.type == UsersTypes.engineer &&
|
||||
serviceRequestsProvider.currentSelectedRequest.statusValue != 5 &&
|
||||
serviceRequestsProvider.currentSelectedRequest.statusValue != 3)
|
||||
8.height,
|
||||
Text(workOrders[index].visitDate?.toServiceRequestCardFormat ?? "",
|
||||
textAlign: TextAlign.end, style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral30 : const Color(0xFF3B3D4A))),
|
||||
],
|
||||
)
|
||||
],
|
||||
).toShadowContainer(context);
|
||||
},
|
||||
).expanded,
|
||||
if (_userProvider.user.type == UsersTypes.engineer && (serviceRequestsProvider.currentSelectedRequest.statusValue != 5 && serviceRequestsProvider.currentSelectedRequest.statusValue != 3))
|
||||
AppFilledButton(
|
||||
label: context.translation.createNewActivity,
|
||||
maxWidth: true,
|
||||
onPressed: () async{
|
||||
ServiceRequestBottomSheet.fixRemotelyBottomSheet(context: context);
|
||||
// bool shouldReloadData = (await showModalBottomSheet(
|
||||
// context: context,
|
||||
// useSafeArea: true,
|
||||
// isScrollControlled: true,
|
||||
// backgroundColor: Colors.transparent,
|
||||
// // builder: (context) => ActivityTypeBottomSheet(),
|
||||
// builder: (context) => FixRemotlyBottomSheet(),
|
||||
// )) as bool;
|
||||
// if (shouldReloadData ?? false) {
|
||||
// // getServiceRequest();
|
||||
// }
|
||||
// Navigator.of(context).push(MaterialPageRoute(builder: (_) => CreateServiceReport(request: serviceRequestsProvider.serviceRequest)));
|
||||
},
|
||||
).paddingOnly(start: 16, end: 16, bottom: 16)
|
||||
],
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
}),
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -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 ActivityCardView extends StatelessWidget {
|
||||
final SearchWorkOrder workOrder;
|
||||
final ServiceRequest serviceRequest;
|
||||
final bool showShadow;
|
||||
|
||||
ActivityCardView(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,89 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/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/service_request_latest/views/components/verify_arrival_view.dart';
|
||||
import 'package:test_sa/views/widgets/date_and_time/date_picker.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 ActionBottomSheet extends StatelessWidget {
|
||||
final String title;
|
||||
final String button1Text;
|
||||
final String button2Text;
|
||||
final VoidCallback button1Tap;
|
||||
final VoidCallback button2Tap;
|
||||
|
||||
ActionBottomSheet({Key key, @required this.title, this.button1Text, this.button2Text, this.button1Tap, this.button2Tap}) : super(key: key);
|
||||
|
||||
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Consumer<ServiceRequestsProvider>(builder: (context, serviceRequestProvider, child) {
|
||||
return Wrap(
|
||||
children: [
|
||||
Container(
|
||||
clipBehavior: Clip.antiAlias,
|
||||
margin: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom),
|
||||
decoration: BoxDecoration(
|
||||
color: Theme.of(context).scaffoldBackgroundColor,
|
||||
borderRadius: const BorderRadius.only(topRight: Radius.circular(20), topLeft: Radius.circular(20)),
|
||||
),
|
||||
padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 8.toScreenHeight),
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
Container(
|
||||
width: 40.toScreenWidth,
|
||||
height: 5.toScreenHeight,
|
||||
decoration: BoxDecoration(color: AppColor.neutral40, borderRadius: BorderRadius.circular(30)),
|
||||
),
|
||||
Align(
|
||||
alignment: AlignmentDirectional.centerStart,
|
||||
child: title.heading4(context).custom(fontWeight: FontWeight.w500).paddingOnly(top: 16, bottom: 16),
|
||||
),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
SizedBox(
|
||||
width: 200.toScreenHeight,
|
||||
child: AppFilledButton(
|
||||
label: button1Text ?? context.translation.no,
|
||||
loading: false,
|
||||
buttonColor: AppColor.neutral40,
|
||||
textColor: AppColor.balck10,
|
||||
onPressed: button1Tap ??
|
||||
() 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.yes,
|
||||
buttonColor: AppColor.primary10,
|
||||
loading: false,
|
||||
onPressed:button2Tap,
|
||||
),
|
||||
),
|
||||
],
|
||||
)
|
||||
],
|
||||
),
|
||||
)
|
||||
],
|
||||
);
|
||||
});
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,129 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/svg.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:test_sa/app_strings/app_asset.dart';
|
||||
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/extensions/widget_extensions.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/default_app_bar.dart';
|
||||
import 'package:test_sa/service_request_latest/views/components/spare_part_request.dart';
|
||||
import 'package:test_sa/views/pages/user/requests/work_order/create_service_report.dart';
|
||||
|
||||
class ActivityTypeBottomSheet extends StatelessWidget {
|
||||
ActivityTypeBottomSheet({Key key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
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},
|
||||
];
|
||||
return Wrap(
|
||||
children: [
|
||||
Consumer<ServiceRequestsProvider>(builder: (context, serviceRequestsProvider, child) {
|
||||
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: SafeArea(
|
||||
child: Column(
|
||||
children: [
|
||||
Align(
|
||||
alignment: AlignmentDirectional.centerStart,
|
||||
child: context.translation.selectActivityType.heading4(context).paddingOnly(top: 16, bottom: 16),
|
||||
),
|
||||
ListView.builder(
|
||||
shrinkWrap: true,
|
||||
padding: EdgeInsets.zero,
|
||||
itemCount: items.length,
|
||||
itemBuilder: (context, index) {
|
||||
final item = items[index];
|
||||
return listItem(
|
||||
icon: item['icon'],
|
||||
heading: item['heading'],
|
||||
subHeading: item['subHeading'],
|
||||
context: context,
|
||||
onTap: () {
|
||||
onItemTap(serviceRequest: serviceRequestsProvider.currentSelectedRequest, index: index, context: context);
|
||||
});
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
Widget listItem({@required BuildContext context, @required String icon, @required String heading, @required String subHeading, @required VoidCallback onTap}) {
|
||||
return Padding(
|
||||
padding: EdgeInsets.only(bottom: 8.toScreenHeight),
|
||||
child: Card(
|
||||
color: AppColor.neutral80,
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(15),
|
||||
// Circular border radius
|
||||
),
|
||||
// color: Colors.white,
|
||||
child: ListTile(
|
||||
minVerticalPadding: 8,
|
||||
horizontalTitleGap: 10,
|
||||
onTap: onTap,
|
||||
contentPadding: const EdgeInsets.all(8),
|
||||
leading: SvgPicture.asset(icon),
|
||||
title: Text(
|
||||
heading,
|
||||
style: AppTextStyles.heading5,
|
||||
),
|
||||
subtitle: Text(
|
||||
subHeading,
|
||||
style: AppTextStyles.bodyText,
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
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.of(context).push(MaterialPageRoute(builder: (_) =>const SparePartRequest()));
|
||||
|
||||
break;
|
||||
case 1:
|
||||
//push to specific screen...
|
||||
// Navigator.push(
|
||||
// context,
|
||||
// MaterialPageRoute(builder: (context) => ActivitiesListView()),
|
||||
// );
|
||||
break;
|
||||
case 2:
|
||||
//push to specific screen...
|
||||
// Navigator.push(
|
||||
// context,
|
||||
// MaterialPageRoute(builder: (context) => const ScanQrView()),
|
||||
// );
|
||||
break;
|
||||
case 2:
|
||||
//push to specific screen...
|
||||
// Navigator.push(
|
||||
// context,
|
||||
// MaterialPageRoute(builder: (context) => const ScanQrView()),
|
||||
// );
|
||||
break;
|
||||
}
|
||||
// ScanQr
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,217 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/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/service_request_latest/views/components/verify_arrival_view.dart';
|
||||
import 'package:test_sa/views/widgets/date_and_time/date_picker.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 InitialVisitBottomSheet extends StatelessWidget {
|
||||
|
||||
InitialVisitBottomSheet({Key key,}) : super(key: key);
|
||||
|
||||
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final userProvider = Provider.of<UserProvider>(context, listen: false);
|
||||
return Consumer<ServiceRequestsProvider>(
|
||||
builder: (context, serviceRequestProvider,child) {
|
||||
return Wrap(
|
||||
children: [
|
||||
Container(
|
||||
clipBehavior: Clip.antiAlias,
|
||||
margin: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom),
|
||||
decoration: BoxDecoration(
|
||||
color: Theme.of(context).scaffoldBackgroundColor,
|
||||
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(
|
||||
children: [
|
||||
Container(
|
||||
width: 40.toScreenWidth,
|
||||
height: 5.toScreenHeight,
|
||||
decoration: BoxDecoration(color: AppColor.neutral40, borderRadius: BorderRadius.circular(30)),
|
||||
),
|
||||
Align(
|
||||
alignment: AlignmentDirectional.centerStart,
|
||||
child: context.translation.setVisitDate.heading5(context).custom(fontWeight: FontWeight.w500).paddingOnly(top: 16, bottom: 16),
|
||||
),
|
||||
|
||||
8.height,
|
||||
ADatePicker(
|
||||
label: context.translation.visitDate,
|
||||
date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest.visitDate ?? ""),
|
||||
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;
|
||||
}
|
||||
serviceRequestProvider.currentSelectedRequest.visitDate = selectedDateTime?.toIso8601String();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
),
|
||||
// ],
|
||||
|
||||
if (serviceRequestProvider.currentSelectedRequest.firstAction?.id == 404 && Provider.of<SettingProvider>(context, listen: false).assetGroup.id == 1) ...[
|
||||
8.height,
|
||||
Row(
|
||||
children: [
|
||||
ADatePicker(
|
||||
label: context.translation.startDate,
|
||||
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) {
|
||||
|
||||
serviceRequestProvider.currentSelectedRequest.startDate = selectedDateTime?.toIso8601String();
|
||||
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
).expanded,
|
||||
8.width,
|
||||
ADatePicker(
|
||||
label: context.translation.endDate,
|
||||
date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest.endDate ?? ""),
|
||||
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) {
|
||||
serviceRequestProvider.currentSelectedRequest.endDate = selectedDateTime?.toIso8601String();
|
||||
serviceRequestProvider.currentSelectedRequest.workingHours =
|
||||
(((DateTime.parse(serviceRequestProvider.currentSelectedRequest.endDate).difference(DateTime.parse(serviceRequestProvider.currentSelectedRequest.startDate)).inSeconds ?? 0) / 60) / 60).toStringAsFixed(2);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
).expanded,
|
||||
],
|
||||
)
|
||||
],
|
||||
|
||||
/// Loan availability not required
|
||||
// 8.height,
|
||||
// SingleItemDropDownMenu<Lookup, LoanAvailabilityProvider>(
|
||||
// context: context,
|
||||
// title: context.translation.loanAvailability,
|
||||
// initialValue: _serviceRequest.loanAvailability,
|
||||
// onSelect: (status) {
|
||||
// setState(() {
|
||||
// _serviceRequest.loanAvailability = status;
|
||||
// if (_serviceRequest.loanAvailability.value != 1) {
|
||||
// asset = null;
|
||||
// }
|
||||
// });
|
||||
// },
|
||||
// ),
|
||||
// if (_serviceRequest?.loanAvailability?.value == 1) 8.height,
|
||||
// if (_serviceRequest?.loanAvailability?.value == 1)
|
||||
// PickAsset(
|
||||
// device: asset ?? _serviceRequest.device,
|
||||
// onPickAsset: (asset) {
|
||||
// setState(() {
|
||||
// this.asset = asset;
|
||||
// });
|
||||
// },
|
||||
// ),
|
||||
8.height,
|
||||
AppTextFormField(
|
||||
labelText: context.translation.comments,
|
||||
textInputType: TextInputType.multiline,
|
||||
alignLabelWithHint: true,
|
||||
onChange: (text) {
|
||||
serviceRequestProvider.currentSelectedRequest.comments = text;
|
||||
},
|
||||
onSaved: (text) {
|
||||
serviceRequestProvider.currentSelectedRequest.comments = text;
|
||||
},
|
||||
),
|
||||
16.height,
|
||||
Consumer<ServiceRequestsProvider>(
|
||||
builder: (context, snapshot, _) => AppFilledButton(
|
||||
label: context.translation.save,
|
||||
loading: snapshot.isLoading ?? false,
|
||||
onPressed: () async {
|
||||
_formKey.currentState.save();
|
||||
|
||||
// await snapshot.updateRequest(user: userProvider.user, request: serviceRequestProvider.serviceRequest);
|
||||
// Navigator.pop(context, true);
|
||||
Navigator.of(context).push(MaterialPageRoute(
|
||||
builder: (_) => VerifyArrivalView()));
|
||||
},
|
||||
),
|
||||
),
|
||||
16.height,
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
)
|
||||
],
|
||||
);
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,236 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/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/text_extensions.dart';
|
||||
import 'package:test_sa/extensions/widget_extensions.dart';
|
||||
import 'package:test_sa/models/device/asset.dart';
|
||||
import '../../../../controllers/providers/api/service_requests_provider.dart';
|
||||
import '../../../../models/lookup.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';
|
||||
import '../../../../new_views/common_widgets/single_item_drop_down_menu.dart';
|
||||
import '../../../../providers/service_request_providers/first_action_provider.dart';
|
||||
|
||||
class RejectRequestBottomSheet extends StatelessWidget {
|
||||
|
||||
RejectRequestBottomSheet({Key key,}) : super(key: key);
|
||||
|
||||
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
|
||||
Asset asset;
|
||||
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final userProvider = Provider.of<UserProvider>(context, listen: false);
|
||||
return Consumer<ServiceRequestsProvider>(
|
||||
builder: (context, requestDetailProvider,child) {
|
||||
return Wrap(
|
||||
children: [
|
||||
Container(
|
||||
clipBehavior: Clip.antiAlias,
|
||||
margin: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom),
|
||||
decoration: BoxDecoration(
|
||||
color: Theme.of(context).scaffoldBackgroundColor,
|
||||
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(
|
||||
children: [
|
||||
Container(
|
||||
width: 40.toScreenWidth,
|
||||
height: 5.toScreenHeight,
|
||||
decoration: BoxDecoration(color: AppColor.neutral40, borderRadius: BorderRadius.circular(30)),
|
||||
),
|
||||
Align(
|
||||
alignment: AlignmentDirectional.centerStart,
|
||||
child: context.translation.rejectionReason.heading3(context).custom(fontWeight: FontWeight.w600).paddingOnly(top: 16, bottom: 16),
|
||||
),
|
||||
SingleItemDropDownMenu<Lookup, FirstActionStatusProvider>(
|
||||
context: context,
|
||||
title: context.translation.rejectionReason,
|
||||
initialValue: requestDetailProvider.currentSelectedRequest.firstAction, //_currentSelectedRequest.firstAction,
|
||||
onSelect: (value) {
|
||||
// setState(() {
|
||||
//_currentSelectedRequest.firstAction = value;
|
||||
requestDetailProvider.currentSelectedRequest.firstAction = value;
|
||||
if (requestDetailProvider.currentSelectedRequest.firstAction.value != 2) {
|
||||
requestDetailProvider.currentSelectedRequest.visitDate = null;
|
||||
}
|
||||
// });
|
||||
},
|
||||
),
|
||||
// if (requestDetailProvider.currentSelectedRequest.firstAction?.value == 2) ...[
|
||||
// 8.height,
|
||||
// ADatePicker(
|
||||
// label: context.translation.visitDate,
|
||||
// date: DateTime.tryParse(requestDetailProvider.currentSelectedRequest.visitDate ?? ""),
|
||||
// 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(requestDetailProvider.currentSelectedRequest.date))) {
|
||||
// "Visit Date time must be greater then request date".showToast;
|
||||
// return;
|
||||
// }
|
||||
//
|
||||
// // setState(() {
|
||||
// requestDetailProvider.currentSelectedRequest.visitDate = selectedDateTime?.toIso8601String();
|
||||
// // });
|
||||
// }
|
||||
// }
|
||||
// });
|
||||
// }
|
||||
// },
|
||||
// ),
|
||||
// ],
|
||||
//
|
||||
// if (requestDetailProvider.currentSelectedRequest.firstAction?.id == 404 && Provider.of<SettingProvider>(context, listen: false).assetGroup.id == 1) ...[
|
||||
// 8.height,
|
||||
// Row(
|
||||
// children: [
|
||||
// ADatePicker(
|
||||
// label: context.translation.startDate,
|
||||
// date: DateTime.tryParse(requestDetailProvider.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) {
|
||||
// requestDetailProvider.currentSelectedRequest.startDate = selectedDateTime?.toIso8601String();
|
||||
// }
|
||||
// }
|
||||
// });
|
||||
// }
|
||||
// },
|
||||
// ).expanded,
|
||||
// 8.width,
|
||||
// ADatePicker(
|
||||
// label: context.translation.endDate,
|
||||
// date: DateTime.tryParse(requestDetailProvider.currentSelectedRequest.endDate ?? ""),
|
||||
// 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) {
|
||||
// requestDetailProvider.currentSelectedRequest.endDate = selectedDateTime?.toIso8601String();
|
||||
// requestDetailProvider.currentSelectedRequest.workingHours =
|
||||
// (((DateTime.parse(requestDetailProvider.currentSelectedRequest.endDate).difference(DateTime.parse(requestDetailProvider.currentSelectedRequest.startDate)).inSeconds ?? 0) / 60) / 60).toStringAsFixed(2);
|
||||
// }
|
||||
// }
|
||||
// });
|
||||
// }
|
||||
// },
|
||||
// ).expanded,
|
||||
// ],
|
||||
// )
|
||||
// ],
|
||||
|
||||
/// Loan availability not required
|
||||
// 8.height,
|
||||
// SingleItemDropDownMenu<Lookup, LoanAvailabilityProvider>(
|
||||
// context: context,
|
||||
// title: context.translation.loanAvailability,
|
||||
// initialValue: _currentSelectedRequest.loanAvailability,
|
||||
// onSelect: (status) {
|
||||
// setState(() {
|
||||
// _currentSelectedRequest.loanAvailability = status;
|
||||
// if (_currentSelectedRequest.loanAvailability.value != 1) {
|
||||
// asset = null;
|
||||
// }
|
||||
// });
|
||||
// },
|
||||
// ),
|
||||
// if (_currentSelectedRequest?.loanAvailability?.value == 1) 8.height,
|
||||
// if (_currentSelectedRequest?.loanAvailability?.value == 1)
|
||||
// PickAsset(
|
||||
// device: asset ?? _currentSelectedRequest.device,
|
||||
// onPickAsset: (asset) {
|
||||
// setState(() {
|
||||
// this.asset = asset;
|
||||
// });
|
||||
// },
|
||||
// ),
|
||||
8.height,
|
||||
AppTextFormField(
|
||||
labelText: context.translation.comments,
|
||||
textInputType: TextInputType.multiline,
|
||||
alignLabelWithHint: true,
|
||||
onChange: (text) {
|
||||
requestDetailProvider.currentSelectedRequest.comments = text;
|
||||
},
|
||||
onSaved: (text) {
|
||||
requestDetailProvider.currentSelectedRequest.comments = text;
|
||||
},
|
||||
),
|
||||
16.height,
|
||||
Consumer<ServiceRequestsProvider>(
|
||||
builder: (context, snapshot, _) => AppFilledButton(
|
||||
label: context.translation.reject,
|
||||
maxWidth: true,
|
||||
buttonColor: Colors.white54,
|
||||
textColor: AppColor.red50,
|
||||
showBorder: true,
|
||||
loading: snapshot.isLoading ?? false,
|
||||
onPressed: () async {
|
||||
_formKey.currentState.save();
|
||||
// requestDetailProvider.serviceRequest.device = asset;
|
||||
await snapshot.updateRequest(user: userProvider.user, request: requestDetailProvider.currentSelectedRequest);
|
||||
Navigator.pop(context, true);
|
||||
},
|
||||
),
|
||||
),
|
||||
16.height,
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
)
|
||||
],
|
||||
);
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,860 @@
|
||||
import 'package:flutter/material.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';
|
||||
import 'package:test_sa/new_views/common_widgets/single_item_drop_down_menu.dart';
|
||||
import 'package:test_sa/providers/service_request_providers/first_action_provider.dart';
|
||||
import 'package:test_sa/service_request_latest/views/components/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/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>();
|
||||
return showModalBottomSheet(
|
||||
context: context,
|
||||
useSafeArea: true,
|
||||
isScrollControlled: true,
|
||||
backgroundColor: Colors.transparent,
|
||||
builder: (context) => Consumer<ServiceRequestsProvider>(builder: (context, serviceRequestProvider, child) {
|
||||
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: StatefulBuilder(
|
||||
builder: (context, setState) {
|
||||
return 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,
|
||||
hideShadow: true,
|
||||
height: 80.toScreenHeight,
|
||||
backgroundColor: AppColor.neutral90,
|
||||
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}');
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
),
|
||||
|
||||
// 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,
|
||||
SizedBox(
|
||||
width: double.infinity,
|
||||
height: 80.toScreenHeight,
|
||||
// padding: EdgeInsets.symmetric(horizontal: 20.toScreenWidth, vertical: 10.toScreenHeight),
|
||||
child:
|
||||
AppTimer(
|
||||
label: context.translation.workingHours,
|
||||
timer: TimerModel(),
|
||||
decoration: BoxDecoration(
|
||||
color: context.isDark ? AppColor.neutral20 : AppColor.neutral90,
|
||||
borderRadius: BorderRadius.circular(10),
|
||||
// boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10)],
|
||||
),
|
||||
// enabled: serviceRequestProvider.currentSelectedRequest.date == null,
|
||||
enabled: true,
|
||||
onChange: (timer) async {
|
||||
print('timer i got is ${timer.toString()}');
|
||||
return true;
|
||||
},
|
||||
),
|
||||
// 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,
|
||||
showWithoutDecoration: true,
|
||||
backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90,
|
||||
alignLabelWithHint: true,
|
||||
onChange: (text) {
|
||||
serviceRequestProvider.currentSelectedRequest.comments = text;
|
||||
},
|
||||
onSaved: (text) {
|
||||
serviceRequestProvider.currentSelectedRequest.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,
|
||||
],
|
||||
);
|
||||
}
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}));
|
||||
}
|
||||
|
||||
static Future initialVisitBottomSheet({@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 Container(
|
||||
clipBehavior: Clip.antiAlias,
|
||||
margin: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom),
|
||||
decoration: BoxDecoration(
|
||||
color: Theme.of(context).scaffoldBackgroundColor,
|
||||
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(
|
||||
children: [
|
||||
Container(
|
||||
width: 40.toScreenWidth,
|
||||
height: 5.toScreenHeight,
|
||||
decoration: BoxDecoration(color: AppColor.neutral40, borderRadius: BorderRadius.circular(30)),
|
||||
),
|
||||
Align(
|
||||
alignment: AlignmentDirectional.centerStart,
|
||||
child: context.translation.setVisitDate.heading5(context).custom(fontWeight: FontWeight.w500).paddingOnly(top: 16, bottom: 16),
|
||||
),
|
||||
|
||||
8.height,
|
||||
ADatePicker(
|
||||
label: context.translation.visitDate,
|
||||
date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest.visitDate ?? ""),
|
||||
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;
|
||||
}
|
||||
serviceRequestProvider.currentSelectedRequest.visitDate = selectedDateTime?.toIso8601String();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
),
|
||||
// ],
|
||||
|
||||
if (serviceRequestProvider.currentSelectedRequest.firstAction?.id == 404 && Provider.of<SettingProvider>(context, listen: false).assetGroup.id == 1) ...[
|
||||
8.height,
|
||||
Row(
|
||||
children: [
|
||||
ADatePicker(
|
||||
label: context.translation.startDate,
|
||||
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) {
|
||||
serviceRequestProvider.currentSelectedRequest.startDate = selectedDateTime?.toIso8601String();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
).expanded,
|
||||
8.width,
|
||||
ADatePicker(
|
||||
label: context.translation.endDate,
|
||||
date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest.endDate ?? ""),
|
||||
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) {
|
||||
serviceRequestProvider.currentSelectedRequest.endDate = selectedDateTime?.toIso8601String();
|
||||
serviceRequestProvider.currentSelectedRequest.workingHours =
|
||||
(((DateTime.parse(serviceRequestProvider.currentSelectedRequest.endDate).difference(DateTime.parse(serviceRequestProvider.currentSelectedRequest.startDate)).inSeconds ??
|
||||
0) /
|
||||
60) /
|
||||
60)
|
||||
.toStringAsFixed(2);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
).expanded,
|
||||
],
|
||||
)
|
||||
],
|
||||
8.height,
|
||||
AppTextFormField(
|
||||
labelText: context.translation.comments,
|
||||
textInputType: TextInputType.multiline,
|
||||
alignLabelWithHint: true,
|
||||
onChange: (text) {
|
||||
serviceRequestProvider.currentSelectedRequest.comments = text;
|
||||
},
|
||||
onSaved: (text) {
|
||||
serviceRequestProvider.currentSelectedRequest.comments = text;
|
||||
},
|
||||
),
|
||||
16.height,
|
||||
Consumer<ServiceRequestsProvider>(
|
||||
builder: (context, snapshot, _) => AppFilledButton(
|
||||
label: context.translation.save,
|
||||
loading: snapshot.isLoading ?? false,
|
||||
onPressed: () async {
|
||||
_formKey.currentState.save();
|
||||
|
||||
// await snapshot.updateRequest(user: userProvider.user, request: serviceRequestProvider.serviceRequest);
|
||||
// Navigator.pop(context, true);
|
||||
Navigator.of(context).push(MaterialPageRoute(builder: (_) => VerifyArrivalView()));
|
||||
},
|
||||
),
|
||||
),
|
||||
16.height,
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}));
|
||||
}
|
||||
|
||||
static Future rejectRequestBottomSheet({@required BuildContext context}) {
|
||||
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
|
||||
final userProvider = Provider.of<UserProvider>(context, listen: false);
|
||||
return showModalBottomSheet(
|
||||
context: context,
|
||||
useSafeArea: true,
|
||||
isScrollControlled: true,
|
||||
backgroundColor: Colors.transparent,
|
||||
builder: (context) => Consumer<ServiceRequestsProvider>(builder: (context, serviceRequestProvider, child) {
|
||||
return Container(
|
||||
clipBehavior: Clip.antiAlias,
|
||||
margin: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom),
|
||||
decoration: BoxDecoration(
|
||||
color: Theme.of(context).scaffoldBackgroundColor,
|
||||
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(
|
||||
children: [
|
||||
Container(
|
||||
width: 40.toScreenWidth,
|
||||
height: 5.toScreenHeight,
|
||||
decoration: BoxDecoration(color: AppColor.neutral40, borderRadius: BorderRadius.circular(30)),
|
||||
),
|
||||
Align(
|
||||
alignment: AlignmentDirectional.centerStart,
|
||||
child: context.translation.rejectionReason.heading3(context).custom(fontWeight: FontWeight.w600).paddingOnly(top: 16, bottom: 16),
|
||||
),
|
||||
SingleItemDropDownMenu<Lookup, FirstActionStatusProvider>(
|
||||
context: context,
|
||||
title: context.translation.rejectionReason,
|
||||
initialValue: serviceRequestProvider.currentSelectedRequest.firstAction, //_serviceRequest.firstAction,
|
||||
onSelect: (value) {
|
||||
serviceRequestProvider.currentSelectedRequest.firstAction = value;
|
||||
if (serviceRequestProvider.currentSelectedRequest.firstAction.value != 2) {
|
||||
serviceRequestProvider.currentSelectedRequest.visitDate = null;
|
||||
}
|
||||
},
|
||||
),
|
||||
8.height,
|
||||
AppTextFormField(
|
||||
labelText: context.translation.comments,
|
||||
textInputType: TextInputType.multiline,
|
||||
alignLabelWithHint: true,
|
||||
onChange: (text) {
|
||||
serviceRequestProvider.currentSelectedRequest.comments = text;
|
||||
},
|
||||
onSaved: (text) {
|
||||
serviceRequestProvider.currentSelectedRequest.comments = text;
|
||||
},
|
||||
),
|
||||
16.height,
|
||||
Consumer<ServiceRequestsProvider>(
|
||||
builder: (context, snapshot, _) => AppFilledButton(
|
||||
label: context.translation.reject,
|
||||
maxWidth: true,
|
||||
buttonColor: Colors.white54,
|
||||
textColor: AppColor.red50,
|
||||
showBorder: true,
|
||||
loading: snapshot.isLoading ?? false,
|
||||
onPressed: () async {
|
||||
_formKey.currentState.save();
|
||||
// serviceRequestProvider.serviceRequest.device = asset;
|
||||
await snapshot.updateRequest(user: userProvider.user, request: serviceRequestProvider.currentSelectedRequest);
|
||||
Navigator.pop(context, true);
|
||||
},
|
||||
),
|
||||
),
|
||||
16.height,
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}));
|
||||
}
|
||||
|
||||
static Future activityTypeBottomSheet({@required BuildContext context}) {
|
||||
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 Padding(
|
||||
padding: EdgeInsets.only(bottom: 8.toScreenHeight),
|
||||
child: Card(
|
||||
color: AppColor.neutral80,
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(15),
|
||||
// Circular border radius
|
||||
),
|
||||
// color: Colors.white,
|
||||
child: ListTile(
|
||||
minVerticalPadding: 8,
|
||||
horizontalTitleGap: 10,
|
||||
onTap: onTap,
|
||||
contentPadding: const EdgeInsets.all(8),
|
||||
leading: SvgPicture.asset(icon),
|
||||
title: Text(
|
||||
heading,
|
||||
style: AppTextStyles.heading5,
|
||||
),
|
||||
subtitle: Text(
|
||||
subHeading,
|
||||
style: AppTextStyles.bodyText,
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
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.of(context).push(MaterialPageRoute(builder: (_) => const SparePartRequest()));
|
||||
|
||||
break;
|
||||
case 1:
|
||||
//push to specific screen...
|
||||
// Navigator.push(
|
||||
// context,
|
||||
// MaterialPageRoute(builder: (context) => ActivitiesListView()),
|
||||
// );
|
||||
break;
|
||||
case 2:
|
||||
//push to specific screen...
|
||||
// Navigator.push(
|
||||
// context,
|
||||
// MaterialPageRoute(builder: (context) => const ScanQrView()),
|
||||
// );
|
||||
break;
|
||||
case 2:
|
||||
//push to specific screen...
|
||||
// Navigator.push(
|
||||
// context,
|
||||
// MaterialPageRoute(builder: (context) => const ScanQrView()),
|
||||
// );
|
||||
break;
|
||||
}
|
||||
// ScanQr
|
||||
}
|
||||
|
||||
return showModalBottomSheet(
|
||||
context: context,
|
||||
useSafeArea: true,
|
||||
isScrollControlled: false,
|
||||
backgroundColor: Colors.transparent,
|
||||
builder: (context) => Consumer<ServiceRequestsProvider>(builder: (context, serviceRequestProvider, child) {
|
||||
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: SafeArea(
|
||||
child: Column(
|
||||
children: [
|
||||
Align(
|
||||
alignment: AlignmentDirectional.centerStart,
|
||||
child: context.translation.selectActivityType.heading4(context).paddingOnly(top: 16, bottom: 16),
|
||||
),
|
||||
ListView.builder(
|
||||
shrinkWrap: true,
|
||||
padding: EdgeInsets.zero,
|
||||
itemCount: items.length,
|
||||
itemBuilder: (context, index) {
|
||||
final item = items[index];
|
||||
return listItem(
|
||||
icon: item['icon'],
|
||||
heading: item['heading'],
|
||||
subHeading: item['subHeading'],
|
||||
context: context,
|
||||
onTap: () {
|
||||
onItemTap(serviceRequest: serviceRequestProvider.currentSelectedRequest, index: index, context: context);
|
||||
});
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}));
|
||||
}
|
||||
|
||||
static Future actionBottomSheet({@required BuildContext context, @required String title, String button1Text, String button2Text, VoidCallback button1Tap, VoidCallback button2Tap}) {
|
||||
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
|
||||
final userProvider = Provider.of<UserProvider>(context, listen: false);
|
||||
return showModalBottomSheet(
|
||||
context: context,
|
||||
useSafeArea: true,
|
||||
isScrollControlled: true,
|
||||
backgroundColor: Colors.transparent,
|
||||
builder: (context) => Consumer<ServiceRequestsProvider>(builder: (context, serviceRequestProvider, child) {
|
||||
return Container(
|
||||
clipBehavior: Clip.antiAlias,
|
||||
margin: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom),
|
||||
decoration: BoxDecoration(
|
||||
color: Theme.of(context).scaffoldBackgroundColor,
|
||||
borderRadius: const BorderRadius.only(topRight: Radius.circular(20), topLeft: Radius.circular(20)),
|
||||
),
|
||||
padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 8.toScreenHeight),
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
Container(
|
||||
width: 40.toScreenWidth,
|
||||
height: 5.toScreenHeight,
|
||||
decoration: BoxDecoration(color: AppColor.neutral40, borderRadius: BorderRadius.circular(30)),
|
||||
),
|
||||
Align(
|
||||
alignment: AlignmentDirectional.centerStart,
|
||||
child: title.heading4(context).custom(fontWeight: FontWeight.w500).paddingOnly(top: 16, bottom: 16),
|
||||
),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
SizedBox(
|
||||
width: 200.toScreenHeight,
|
||||
child: AppFilledButton(
|
||||
label: button1Text ?? context.translation.no,
|
||||
loading: false,
|
||||
buttonColor: AppColor.neutral40,
|
||||
textColor: AppColor.balck10,
|
||||
onPressed: button1Tap ??
|
||||
() 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.yes,
|
||||
buttonColor: AppColor.primary10,
|
||||
loading: false,
|
||||
onPressed: button2Tap,
|
||||
),
|
||||
),
|
||||
],
|
||||
)
|
||||
],
|
||||
),
|
||||
);
|
||||
}));
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,60 @@
|
||||
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';
|
||||
import 'package:test_sa/new_views/common_widgets/default_app_bar.dart';
|
||||
|
||||
class HistoryLogView extends StatelessWidget {
|
||||
const HistoryLogView({Key key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
backgroundColor: AppColor.neutral100,
|
||||
body: Padding(
|
||||
padding: EdgeInsets.symmetric(vertical: 50.toScreenHeight),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
historyLogCard(context: context,date: DateTime.now()),
|
||||
historyLogCard(context: context,date: DateTime.now()),
|
||||
historyLogCard(context: context,date: DateTime.now()),
|
||||
historyLogCard(context: context,date: DateTime.now()),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget historyLogCard({@required BuildContext context, @required DateTime date}) {
|
||||
return SizedBox(
|
||||
width: double.infinity,
|
||||
child: Padding(
|
||||
padding: EdgeInsets.only(left: 16.toScreenWidth, bottom: 16.toScreenHeight, top: 12.toScreenHeight),
|
||||
child: Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Column(
|
||||
children: [
|
||||
Text(
|
||||
date.toString().toServiceRequestCardFormat,
|
||||
textAlign: TextAlign.end,
|
||||
style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral20),
|
||||
),
|
||||
],
|
||||
),
|
||||
50.width,
|
||||
Expanded(
|
||||
child: 'Requester acknowledged adc dld a'.heading6(context),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
).toShadowContainer(context).paddingOnly(start: 16, end: 16);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,72 @@
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:qr_code_scanner/qr_code_scanner.dart';
|
||||
import 'package:test_sa/extensions/context_extension.dart';
|
||||
import 'package:test_sa/extensions/int_extensions.dart';
|
||||
import 'package:test_sa/new_views/common_widgets/default_app_bar.dart';
|
||||
|
||||
|
||||
class ScanQrView extends StatefulWidget {
|
||||
const ScanQrView({Key key}) : super(key: key);
|
||||
|
||||
@override
|
||||
_ScanQrViewState createState() => _ScanQrViewState();
|
||||
}
|
||||
|
||||
class _ScanQrViewState extends State<ScanQrView> {
|
||||
Barcode result;
|
||||
QRViewController _controller;
|
||||
bool _scanDone = false;
|
||||
final GlobalKey qrKey = GlobalKey(debugLabel: 'QR_scanner');
|
||||
|
||||
// In order to get hot reload to work we need to pause the camera if the platform
|
||||
// is android, or resume the camera if the platform is iOS.
|
||||
@override
|
||||
void reassemble() {
|
||||
super.reassemble();
|
||||
if (Platform.isAndroid) {
|
||||
_controller?.pauseCamera();
|
||||
} else if (Platform.isIOS) {
|
||||
_controller?.resumeCamera();
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
super.dispose();
|
||||
_controller?.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
|
||||
body: Stack(
|
||||
children: [
|
||||
QRView(
|
||||
key: qrKey,
|
||||
onQRViewCreated: (QRViewController controller) {
|
||||
setState(() {
|
||||
_controller = controller;
|
||||
});
|
||||
controller.scannedDataStream.listen((scanData) {
|
||||
if (!_scanDone) {
|
||||
_scanDone = true;
|
||||
Navigator.of(context).pop(scanData.code);
|
||||
}
|
||||
});
|
||||
},
|
||||
overlay: QrScannerOverlayShape(borderColor: Colors.red, borderRadius: 10, borderLength: 30, borderWidth: 10, cutOutSize: 280),
|
||||
),
|
||||
Padding(
|
||||
padding: EdgeInsets.all(12.0),
|
||||
child: SizedBox(
|
||||
height: 100.toScreenHeight,
|
||||
child: DefaultAppBar(title: context.translation.scanQr)),
|
||||
)
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,250 @@
|
||||
import 'dart:convert';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:test_sa/attachment.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/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/loading_list_notifier.dart';
|
||||
import 'package:test_sa/providers/work_order/reason_provider.dart';
|
||||
import 'package:test_sa/service_request_latest/views/components/bottom_sheets/action_bottomsheet.dart';
|
||||
import 'package:test_sa/service_request_latest/views/components/bottom_sheets/service_request_bottomsheet.dart';
|
||||
import 'package:test_sa/views/pages/user/requests/work_order/part_no_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 '../../../../../models/service_request/spare_parts.dart';
|
||||
import '../../../../../new_views/common_widgets/app_text_form_field.dart';
|
||||
import '../../../../../new_views/common_widgets/default_app_bar.dart';
|
||||
import '../../../controllers/validator/validator.dart';
|
||||
|
||||
class SparePartRequest extends StatefulWidget {
|
||||
static const String id = "/spare-part-request";
|
||||
|
||||
const SparePartRequest({Key key}) : super(key: key);
|
||||
|
||||
@override
|
||||
_SparePartRequestState createState() => _SparePartRequestState();
|
||||
}
|
||||
|
||||
class _SparePartRequestState extends State<SparePartRequest> with TickerProviderStateMixin {
|
||||
UserProvider _userProvider;
|
||||
SettingProvider _settingProvider;
|
||||
ServiceRequestsProvider _serviceRequestsProvider;
|
||||
ServiceStatusProvider _assetTypeProvider;
|
||||
PartsProvider _partsProvider;
|
||||
ServiceReport _serviceReport;
|
||||
bool _isLoading = false;
|
||||
List<SparePart> _spareParts = [];
|
||||
|
||||
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();
|
||||
|
||||
@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;
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_faultController.dispose();
|
||||
_workPreformedController.dispose();
|
||||
_partQtyController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
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
|
||||
_spareParts = await _partsProvider.getPartsList(assetId: serviceRequestsProvider.currentSelectedRequest.deviceId);
|
||||
_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.sparePartRequest),
|
||||
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: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||
children: [
|
||||
Card(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||
children: [
|
||||
context.translation.sparePartDetails.heading5(context),
|
||||
12.height,
|
||||
SingleItemDropDownMenu<SparePart, NullableLoadingProvider>(
|
||||
context: context,
|
||||
title: context.translation.partNo,
|
||||
staticData: _spareParts,
|
||||
height: 80.toScreenHeight,
|
||||
showShadow: false,
|
||||
initialValue: serviceRequestProvider.initialSelectedSparePart.sparePart,
|
||||
backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90,
|
||||
onSelect: (part) {
|
||||
serviceRequestProvider.initialSelectedSparePart = SparePartsWorkOrders(id: 0, sparePart: part, qty: 0);
|
||||
},
|
||||
),
|
||||
15.height,
|
||||
AppTextFormField(
|
||||
controller: _partQtyController,
|
||||
labelText: context.translation.quantity,
|
||||
textInputType: TextInputType.number,
|
||||
contentPadding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 20.toScreenHeight),
|
||||
showWithoutDecoration: true,
|
||||
backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90,
|
||||
enable: serviceRequestProvider.initialSelectedSparePart != null && serviceRequestProvider.initialSelectedSparePart.sparePart?.id != null,
|
||||
validator: (value) => value == null || value.isEmpty
|
||||
? context.translation.requiredField
|
||||
: Validator.isNumeric(value)
|
||||
? null
|
||||
: context.translation.onlyNumbers,
|
||||
onSaved: (text) {
|
||||
serviceRequestProvider.initialSelectedSparePart.qty = num.tryParse(text ?? "");
|
||||
},
|
||||
),
|
||||
15.height,
|
||||
AppTextFormField(
|
||||
controller: _oracleNoController,
|
||||
labelText: context.translation.oracleNo,
|
||||
textInputType: TextInputType.number,
|
||||
contentPadding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 20.toScreenHeight),
|
||||
showWithoutDecoration: true,
|
||||
backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90,
|
||||
enable: serviceRequestProvider.initialSelectedSparePart != null && serviceRequestProvider.initialSelectedSparePart.sparePart?.id != null,
|
||||
validator: (value) => value == null || value.isEmpty
|
||||
? context.translation.requiredField
|
||||
: Validator.isNumeric(value)
|
||||
? null
|
||||
: context.translation.onlyNumbers,
|
||||
onSaved: (text) {
|
||||
//TODO set the values...
|
||||
// serviceRequestProvider.initialSelectedSparePart. = num.tryParse(text ?? "");
|
||||
},
|
||||
),
|
||||
15.height,
|
||||
AppTextFormField(
|
||||
initialValue: _serviceReport?.comment,
|
||||
backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90,
|
||||
labelText: context.translation.description,
|
||||
alignLabelWithHint: true,
|
||||
showWithoutDecoration: true,
|
||||
textInputType: TextInputType.multiline,
|
||||
onSaved: (value) {
|
||||
_serviceReport.comment = value;
|
||||
},
|
||||
),
|
||||
15.height,
|
||||
MultiFilesPicker(label: context.translation.attachQuotation, files: _files),
|
||||
],
|
||||
).paddingAll(16),
|
||||
),
|
||||
8.height,
|
||||
],
|
||||
),
|
||||
).expanded,
|
||||
AppFilledButton(
|
||||
label: context.translation.addSparePartActivity,
|
||||
buttonColor: AppColor.green70,
|
||||
onPressed: () async {
|
||||
ServiceRequestBottomSheet.actionBottomSheet(context: context, title: context.translation.addSparePartActionHeading);
|
||||
// bool shouldReloadData = (await showModalBottomSheet(
|
||||
// context: context,
|
||||
// useSafeArea: true,
|
||||
// isScrollControlled: true,
|
||||
// backgroundColor: Colors.transparent,
|
||||
// builder: (context) => ActionBottomSheet(title: context.translation.addSparePartActionHeading),
|
||||
// )) as bool;
|
||||
// if (shouldReloadData ?? false) {}
|
||||
//TODO write add sparepart logic
|
||||
|
||||
// if ((!_formKey.currentState.validate()) || (!(await _serviceReport.validate(context)))) {
|
||||
// setState(() {});
|
||||
// return;
|
||||
// }
|
||||
// _formKey.currentState.save();
|
||||
// _serviceReport.attachmentsWorkOrder ??= [];
|
||||
// if (_files.isEmpty) _serviceReport.attachmentsWorkOrder = [];
|
||||
// for (var file in _files) {
|
||||
// _serviceReport.attachmentsWorkOrder.add(Attachment(id: 0, name: "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}"));
|
||||
// }
|
||||
// final user = Provider.of<UserProvider>(context, listen: false).user;
|
||||
// await _serviceRequestsProvider.createServiceReport(context, report: _serviceReport, request: serviceRequestProvider.serviceRequest, user: user);
|
||||
},
|
||||
),
|
||||
],
|
||||
).paddingAll(16),
|
||||
),
|
||||
),
|
||||
);
|
||||
}),
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,114 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/svg.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:test_sa/app_strings/app_asset.dart';
|
||||
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/extensions/widget_extensions.dart';
|
||||
import 'package:test_sa/models/service_request/service_request.dart';
|
||||
import 'package:test_sa/new_views/common_widgets/default_app_bar.dart';
|
||||
import 'package:test_sa/service_request_latest/views/components/scan_qr_view.dart';
|
||||
import 'package:test_sa/views/widgets/qr/scan_qr.dart';
|
||||
|
||||
import 'activities_list_view.dart';
|
||||
|
||||
class VerifyArrivalView extends StatelessWidget {
|
||||
VerifyArrivalView({Key key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final List<Map<String, String>> items = [
|
||||
{'heading': context.translation.scanQr, 'subHeading': context.translation.scanQrDetail, 'icon': AppAsset.scanQrIcon},
|
||||
{'heading': context.translation.askRequester, 'subHeading': context.translation.askRequesterDetail, 'icon': AppAsset.askRequesterIcon},
|
||||
{'heading': context.translation.askOtp, 'subHeading': context.translation.askOtpDetail, 'icon': AppAsset.askOtpIcon},
|
||||
{'heading': context.translation.takeDevicePhoto, 'subHeading': context.translation.takeDevicePhotoDetail, 'icon': AppAsset.takeDevicePhotoIcon},
|
||||
];
|
||||
return Scaffold(
|
||||
appBar: DefaultAppBar(title: context.translation.verifyArrival),
|
||||
//backgroundColor: const Color(0xfff8f9fb),
|
||||
body: Consumer<ServiceRequestsProvider>(builder: (context, serviceRequestsProvider, child) {
|
||||
return SafeArea(
|
||||
child: ListView.builder(
|
||||
padding: EdgeInsets.symmetric(vertical: 12.toScreenHeight),
|
||||
// padding: EdgeInsets.zero,
|
||||
itemCount: items.length,
|
||||
itemBuilder: (context, index) {
|
||||
final item = items[index];
|
||||
return listItem(
|
||||
icon: item['icon'],
|
||||
heading: item['heading'],
|
||||
subHeading: item['subHeading'],
|
||||
context: context,
|
||||
onTap: () {
|
||||
|
||||
onItemTap(serviceRequest: serviceRequestsProvider.currentSelectedRequest, index: index,context: context);
|
||||
});
|
||||
},
|
||||
),
|
||||
);
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
Widget listItem({@required BuildContext context, @required String icon, @required String heading, @required String subHeading, @required VoidCallback onTap}) {
|
||||
return Padding(
|
||||
padding: EdgeInsets.only(left: 16.toScreenWidth,right: 16.toScreenWidth,bottom: 12.toScreenHeight),
|
||||
|
||||
child: Card(
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(14), // Circular border radius
|
||||
),
|
||||
color: Colors.white,
|
||||
child:
|
||||
ListTile(
|
||||
minVerticalPadding: 12,
|
||||
horizontalTitleGap: 10,
|
||||
onTap: onTap,
|
||||
// contentPadding: const EdgeInsets.all(12),
|
||||
leading: SvgPicture.asset(icon),
|
||||
title: Text(
|
||||
heading,
|
||||
style: AppTextStyles.heading5,
|
||||
),
|
||||
subtitle: Text(
|
||||
subHeading,
|
||||
style: AppTextStyles.bodyText,
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
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(
|
||||
context,
|
||||
MaterialPageRoute(builder: (context) => const ScanQrView()),
|
||||
);
|
||||
break;case 1:
|
||||
//push to specific screen...
|
||||
Navigator.push(
|
||||
context,
|
||||
MaterialPageRoute(builder: (context) => ActivitiesListView()),
|
||||
);
|
||||
break;case 2:
|
||||
//push to specific screen...
|
||||
// Navigator.push(
|
||||
// context,
|
||||
// MaterialPageRoute(builder: (context) => const ScanQrView()),
|
||||
// );
|
||||
break;case 2:
|
||||
//push to specific screen...
|
||||
// Navigator.push(
|
||||
// context,
|
||||
// MaterialPageRoute(builder: (context) => const ScanQrView()),
|
||||
// );
|
||||
break;
|
||||
}
|
||||
// ScanQr
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,124 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:pinput/pinput.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/timer_model.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/views/widgets/timer/app_timer.dart';
|
||||
|
||||
class VerifyOtpView extends StatelessWidget {
|
||||
const VerifyOtpView({Key key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final defaultPinTheme = PinTheme(
|
||||
width: 51.toScreenWidth,
|
||||
height: 63.toScreenHeight,
|
||||
textStyle: const TextStyle(
|
||||
fontSize: 22,
|
||||
color: Colors.black,
|
||||
),
|
||||
decoration: BoxDecoration(
|
||||
color: AppColor.neutral100,
|
||||
borderRadius: BorderRadius.circular(10),
|
||||
border: Border.all(color: Colors.transparent),
|
||||
),
|
||||
);
|
||||
return Scaffold(
|
||||
backgroundColor: AppColor.neutral100,
|
||||
appBar: DefaultAppBar(title: context.translation.askOtpFromRequester),
|
||||
body: SingleChildScrollView(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
12.height,
|
||||
SizedBox(
|
||||
width: double.infinity,
|
||||
child: Padding(
|
||||
padding: EdgeInsets.only(left: 16.toScreenWidth, bottom: 16.toScreenHeight, top: 12.toScreenHeight),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
context.translation.verify.heading5(context),
|
||||
12.height,
|
||||
context.translation.otpSentToNumber.bodyText(context),
|
||||
Padding(
|
||||
padding: EdgeInsets.symmetric(
|
||||
vertical: 50.toScreenHeight,
|
||||
),
|
||||
child: Center(
|
||||
child: Pinput(
|
||||
length: 4,
|
||||
defaultPinTheme: defaultPinTheme,
|
||||
focusedPinTheme: defaultPinTheme.copyWith(
|
||||
decoration: defaultPinTheme.decoration?.copyWith(
|
||||
border: Border.all(color: AppColor.neutral100),
|
||||
),
|
||||
),
|
||||
onCompleted: (pin) => debugPrint(pin),
|
||||
),
|
||||
),
|
||||
),
|
||||
Row(
|
||||
children: [
|
||||
context.translation.resendIn.bodyText(context),
|
||||
7.width,
|
||||
ValueListenableBuilder<String>(
|
||||
//add actual timer value...
|
||||
valueListenable: ValueNotifier("0:00"),
|
||||
builder: (context, value, _) {
|
||||
return Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
value.bodyText(context).custom(
|
||||
color: context.isDark ? AppColor.neutral10 : AppColor.neutral20,
|
||||
),
|
||||
],
|
||||
);
|
||||
},
|
||||
),
|
||||
7.width,
|
||||
InkWell(
|
||||
onTap: (){
|
||||
//other method check..
|
||||
},
|
||||
child: Text(context.translation.resend,style: const TextStyle(
|
||||
color: AppColor.primary10,
|
||||
decoration: TextDecoration.underline,
|
||||
),),
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
).toShadowContainer(context).paddingOnly(start: 16, end: 16),
|
||||
Padding(
|
||||
padding: EdgeInsets.only(left: 17.toScreenWidth, top: 24.toScreenHeight),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
context.translation.havingTroubleReceivingOtp.heading6(context),
|
||||
3.height,
|
||||
InkWell(
|
||||
onTap: (){
|
||||
//other method check..
|
||||
},
|
||||
child: Text(context.translation.checkOutOtherMethods,style: const TextStyle(
|
||||
color: AppColor.primary10,
|
||||
decoration: TextDecoration.underline,
|
||||
),),
|
||||
),
|
||||
],
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,393 @@
|
||||
import 'package:another_flushbar/flushbar.dart';
|
||||
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/comments_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/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/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/bottom_sheets/service_request_bottomsheet.dart';
|
||||
import 'package:test_sa/service_request_latest/views/components/bottom_sheets/reject_request_bottomsheet.dart';
|
||||
import 'package:test_sa/service_request_latest/views/components/verify_otp_view.dart';
|
||||
import 'package:test_sa/utilities/general_utils.dart';
|
||||
import 'package:test_sa/views/pages/user/requests/comments_bottom_sheet.dart';
|
||||
import 'package:test_sa/views/pages/user/requests/first_action_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';
|
||||
import 'package:test_sa/views/widgets/images/files_list.dart';
|
||||
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 'components/bottom_sheets/initial_visit_bottomsheet.dart';
|
||||
|
||||
class ServiceRequestDetailView extends StatefulWidget {
|
||||
static const String id = "/call-details";
|
||||
ServiceRequest serviceRequest;
|
||||
|
||||
ServiceRequestDetailView({Key key, this.serviceRequest}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<ServiceRequestDetailView> createState() => _ServiceRequestDetailViewState();
|
||||
}
|
||||
|
||||
class _ServiceRequestDetailViewState extends State<ServiceRequestDetailView> {
|
||||
bool loading = false;
|
||||
|
||||
// ServiceRequest serviceRequest;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
getServiceRequest(requestId: widget.serviceRequest.id);
|
||||
}
|
||||
|
||||
void getServiceRequest({@required dynamic requestId}) {
|
||||
// setState(() {});
|
||||
WidgetsFlutterBinding.ensureInitialized().addPostFrameCallback((timeStamp) async {
|
||||
Provider.of<CommentsProvider>(context, listen: false).reset();
|
||||
ServiceRequestsProvider serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context, listen: false);
|
||||
serviceRequestsProvider.currentSelectedRequest = await serviceRequestsProvider.getServiceRequestObjectById(requestId: requestId);
|
||||
// setState(() {});
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
UserProvider _userProvider = Provider.of<UserProvider>(context, listen: false);
|
||||
|
||||
Widget informationCard(ServiceRequest serviceRequest) {
|
||||
return Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Row(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
StatusLabel(
|
||||
label: serviceRequest.priority.name,
|
||||
id: serviceRequest.priority.id,
|
||||
textColor: AppColor.getPriorityStatusTextColor(context, serviceRequest.priority.id),
|
||||
backgroundColor: AppColor.getPriorityStatusColor(context, serviceRequest.priority.id),
|
||||
),
|
||||
8.width,
|
||||
StatusLabel(
|
||||
label: serviceRequest.statusLabel,
|
||||
textColor: AppColor.getRequestStatusTextColor(context, serviceRequest.statusValue),
|
||||
backgroundColor: AppColor.getRequestStatusColor(context, serviceRequest.statusValue),
|
||||
),
|
||||
1.width.expanded,
|
||||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.end,
|
||||
children: [
|
||||
if (_userProvider.user.type == UsersTypes.normal_user)
|
||||
context.translation.code.toSvgAsset(width: 48).onPress(() {
|
||||
Navigator.push(context, MaterialPageRoute(builder: (context) => UpdateServiceRequestPage(serviceRequest: serviceRequest)));
|
||||
}),
|
||||
if (_userProvider.user.type == UsersTypes.engineer) 16.height,
|
||||
Text(
|
||||
serviceRequest.date.toServiceRequestCardFormat,
|
||||
textAlign: TextAlign.end,
|
||||
style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50),
|
||||
),
|
||||
],
|
||||
)
|
||||
],
|
||||
),
|
||||
Text(
|
||||
context.translation.assetDetails,
|
||||
style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50),
|
||||
),
|
||||
8.height,
|
||||
'${context.translation.assetName}: ${serviceRequest.deviceEnName?.cleanupWhitespace?.capitalizeFirstOfEach}'.bodyText(context),
|
||||
// 8.height,
|
||||
Text(
|
||||
'${context.translation.assetNumber}: ${serviceRequest.device?.assetNumber}',
|
||||
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
|
||||
),
|
||||
|
||||
Text(
|
||||
'${context.translation.equipmentStatus}: ${serviceRequest.defectType?.name}',
|
||||
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
|
||||
),
|
||||
Text(
|
||||
'${context.translation.manufacture}: ${serviceRequest.device.modelDefinition.manufacturerName?.cleanupWhitespace?.capitalizeFirstOfEach}',
|
||||
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
|
||||
),
|
||||
Text(
|
||||
'${context.translation.model}: ${serviceRequest.device.modelDefinition.modelName?.cleanupWhitespace?.capitalizeFirstOfEach}',
|
||||
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
|
||||
),
|
||||
Text(
|
||||
'${context.translation.site}: ${serviceRequest.device.site?.custName?.cleanupWhitespace?.capitalizeFirstOfEach}',
|
||||
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
|
||||
),
|
||||
Text(
|
||||
'${context.translation.building}: ${serviceRequest.device.building?.name?.cleanupWhitespace?.capitalizeFirstOfEach}',
|
||||
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
|
||||
),
|
||||
Text(
|
||||
'${context.translation.floor}: ${serviceRequest.device.floor?.name?.cleanupWhitespace?.capitalizeFirstOfEach ?? ""}',
|
||||
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
|
||||
),
|
||||
Text(
|
||||
'${context.translation.department}: ${serviceRequest.device.department?.departmentName?.cleanupWhitespace?.capitalizeFirstOfEach}',
|
||||
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
|
||||
),
|
||||
Text(
|
||||
'${context.translation.room}: ${(serviceRequest.device.room?.name ?? "").cleanupWhitespace?.capitalizeFirstOfEach}',
|
||||
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
|
||||
),
|
||||
],
|
||||
).expanded,
|
||||
],
|
||||
),
|
||||
8.height,
|
||||
const Divider().defaultStyle(context),
|
||||
|
||||
//... request details starts here....
|
||||
Text(
|
||||
context.translation.requestDetail,
|
||||
style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50),
|
||||
),
|
||||
8.height,
|
||||
Text(
|
||||
'${context.translation.requestType}: ${serviceRequest.type.name}',
|
||||
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
|
||||
),
|
||||
Text(
|
||||
'${context.translation.requestNo}: ${serviceRequest.requestCode}',
|
||||
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
|
||||
),
|
||||
Text(
|
||||
'${context.translation.requesterName}: ${serviceRequest.callCreatedBy?.name ?? "-"}',
|
||||
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
|
||||
),
|
||||
|
||||
8.height,
|
||||
if ((serviceRequest.callComments ?? "").isNotEmpty) ...[
|
||||
const Divider().defaultStyle(context),
|
||||
8.height,
|
||||
Text(
|
||||
serviceRequest.callComments,
|
||||
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
|
||||
),
|
||||
],
|
||||
if (serviceRequest.devicePhotos.isNotEmpty) ...[
|
||||
8.height,
|
||||
const Divider().defaultStyle(context),
|
||||
FilesList(images: serviceRequest.devicePhotos),
|
||||
],
|
||||
if (serviceRequest.audio?.isNotEmpty ?? false) ...[
|
||||
const Divider().defaultStyle(context),
|
||||
16.height,
|
||||
ASoundPlayer(audio: serviceRequest.audio),
|
||||
8.height,
|
||||
],
|
||||
],
|
||||
).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))
|
||||
.onPress(() {
|
||||
showModalBottomSheet(
|
||||
context: context,
|
||||
useSafeArea: true,
|
||||
isScrollControlled: true,
|
||||
useRootNavigator: true,
|
||||
backgroundColor: Colors.transparent,
|
||||
builder: (context) => CommentsBottomSheet(requestId: serviceRequest.id),
|
||||
);
|
||||
}),
|
||||
],
|
||||
).toShadowContainer(context, padding: 0);
|
||||
}
|
||||
|
||||
return Scaffold(
|
||||
appBar: DefaultAppBar(title: context.translation.serviceDetails),
|
||||
//backgroundColor: const Color(0xfff8f9fb),
|
||||
body: Consumer<ServiceRequestsProvider>(builder: (context, serviceRequestsProvider, child) {
|
||||
return SafeArea(
|
||||
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: const EdgeInsets.all(16),
|
||||
child: informationCard(serviceRequestsProvider.currentSelectedRequest),
|
||||
).expanded,
|
||||
Center(
|
||||
child: InkWell(
|
||||
onTap: () async {
|
||||
AllRequestsProvider allRequestProvider = Provider.of<AllRequestsProvider>(context, listen: false);
|
||||
int index = allRequestProvider.filterRequest.requestsDetails.indexWhere((element) => element.id.toString() == serviceRequestsProvider.currentSelectedRequest.id);
|
||||
print('index i got is $index');
|
||||
if (index != -1 && index != allRequestProvider.filterRequest.requestsDetails.length) {
|
||||
print('loading value is $loading');
|
||||
getServiceRequest(requestId: allRequestProvider.filterRequest.requestsDetails[index + 1].id.toString());
|
||||
print('call the api with next id ...${allRequestProvider.filterRequest.requestsDetails[index + 1].id.toString()}');
|
||||
}
|
||||
},
|
||||
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.red50,
|
||||
showBorder: true,
|
||||
onPressed: () async {
|
||||
print('service request value is ${serviceRequestsProvider.currentSelectedRequest.type}');
|
||||
ServiceRequestBottomSheet.rejectRequestBottomSheet(context: context);
|
||||
// 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,
|
||||
),
|
||||
AppFilledButton(
|
||||
label: context.translation.accept,
|
||||
maxWidth: true,
|
||||
buttonColor: AppColor.green70,
|
||||
onPressed: () async {
|
||||
// GeneralUtils.showFlushBar(context: context);
|
||||
Navigator.of(context).push(MaterialPageRoute(builder: (_) => const VerifyOtpView()));
|
||||
|
||||
// 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.firstAction,
|
||||
// maxWidth: true,
|
||||
// onPressed: () async {
|
||||
// bool shouldReloadData = (await showModalBottomSheet(
|
||||
// context: context,
|
||||
// useSafeArea: true,
|
||||
// isScrollControlled: true,
|
||||
// backgroundColor: Colors.transparent,
|
||||
// builder: (context) => FirstActionBottomSheet(request: serviceRequestsProvider.serviceRequest),
|
||||
// )) as bool;
|
||||
// if (shouldReloadData ?? false) {
|
||||
// getServiceRequest();
|
||||
// }
|
||||
// },
|
||||
// )
|
||||
: 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),
|
||||
],
|
||||
),
|
||||
);
|
||||
}),
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,48 @@
|
||||
import 'package:another_flushbar/flushbar.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:test_sa/new_views/app_style/app_color.dart';
|
||||
|
||||
class GeneralUtils{
|
||||
|
||||
static Duration parseTimeString(String timeString) {
|
||||
try {
|
||||
print('time string i got is ${timeString}');
|
||||
List<String> timeParts = timeString.split(':');
|
||||
|
||||
int hours = int.parse(timeParts[0]);
|
||||
int minutes = int.parse(timeParts[1]);
|
||||
int seconds = int.parse(timeParts[2]);
|
||||
|
||||
print('');
|
||||
|
||||
return Duration(hours: hours, minutes: minutes, seconds: seconds);
|
||||
} catch (e) {
|
||||
if (kDebugMode) {
|
||||
print("Error parsing time string: $e");
|
||||
}
|
||||
return Duration.zero; // Return zero duration in case of an error
|
||||
}
|
||||
}
|
||||
static Widget showFlushBar({@required BuildContext context,String title,String message,double duration}){
|
||||
return Flushbar(
|
||||
flushbarPosition: FlushbarPosition.TOP,
|
||||
backgroundColor: AppColor.green70,
|
||||
title:title?? "Hey Ninja",
|
||||
message:message?? "Lorem Ipsum is simply dummy text of the printing and typesetting industry",
|
||||
duration: Duration(seconds:duration?? 3),
|
||||
flushbarStyle: FlushbarStyle.GROUNDED,
|
||||
reverseAnimationCurve: Curves.easeInOut,
|
||||
mainButton: IconButton(
|
||||
onPressed: () {
|
||||
Navigator.pop(context);
|
||||
},
|
||||
icon: const Icon(
|
||||
Icons.close,
|
||||
color: AppColor.white20,
|
||||
),
|
||||
),
|
||||
)..show(context);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,18 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:test_sa/models/enums/user_types.dart';
|
||||
|
||||
class RequestUtils{
|
||||
static List<Map<String, dynamic>> getTabs({@required UsersTypes userType,@required BuildContext context}) {
|
||||
List<Map<String, dynamic>> tabs = [];
|
||||
if(userType==UsersTypes.engineer){
|
||||
tabs.add({'label':'In Progress','status':2});
|
||||
tabs.add({'label':'Completed','status':4});
|
||||
return tabs;
|
||||
}
|
||||
tabs.add({'label':'New Request','status':1});
|
||||
tabs.add({'label':'In Progress','status':2});
|
||||
tabs.add({'label':'Completed','status':4});
|
||||
return tabs;
|
||||
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,29 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class RoundedBackButton extends StatelessWidget {
|
||||
final VoidCallback onPressed;
|
||||
final IconData icon;
|
||||
final Color backgroundColor;
|
||||
final Color iconColor;
|
||||
|
||||
const RoundedBackButton({Key key, this.onPressed,@required this.icon,this.backgroundColor,this.iconColor}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Container(
|
||||
padding: const EdgeInsets.only(left: 8),
|
||||
decoration: BoxDecoration(
|
||||
shape: BoxShape.circle,
|
||||
color: backgroundColor??Colors.blue, // Background color of the circle
|
||||
),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(8),
|
||||
child: Icon(
|
||||
icon,
|
||||
color: iconColor??Colors.white,
|
||||
size: 22, // Adjust the icon size as needed
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -1,73 +1,87 @@
|
||||
///todo deleted
|
||||
// import 'package:flutter/material.dart';
|
||||
// import 'package:test_sa/views/app_style/sizing.dart';
|
||||
//
|
||||
// class ADateTimePicker extends StatelessWidget {
|
||||
// final DateTime date;
|
||||
// final DateTime from;
|
||||
// final DateTime to;
|
||||
// final Function(DateTime) onDateTimePicker;
|
||||
// final bool enable;
|
||||
//
|
||||
// const ADateTimePicker({Key key, this.date, this.onDateTimePicker, this.from, this.to, this.enable}) : super(key: key);
|
||||
//
|
||||
// @override
|
||||
// Widget build(BuildContext context) {
|
||||
// return ElevatedButton(
|
||||
// style: ElevatedButton.styleFrom(
|
||||
// foregroundColor: Colors.white,
|
||||
// textStyle: Theme.of(context).textTheme.subtitle2,
|
||||
// shape: RoundedRectangleBorder(
|
||||
// borderRadius: BorderRadius.circular(12 * AppStyle.getScaleFactor(context)),
|
||||
// ),
|
||||
// ),
|
||||
// child: Text(
|
||||
// date == null ? "Pick Time" : date.toString().substring(0, date.toString().lastIndexOf(":")),
|
||||
// textScaleFactor: AppStyle.getScaleFactor(context),
|
||||
// ),
|
||||
// onPressed: enable
|
||||
// ? () async {
|
||||
// // TimeOfDay picked = await showTimePicker(context: context, initialTime: TimeOfDay.now());
|
||||
// onDateTimePicker(await showDateTimePicker(context: context, initialDate: date, firstDate: from, lastDate: to));
|
||||
// }
|
||||
// : null,
|
||||
// );
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// Future<DateTime> showDateTimePicker({
|
||||
// BuildContext context,
|
||||
// DateTime initialDate,
|
||||
// DateTime firstDate,
|
||||
// DateTime lastDate,
|
||||
// }) async {
|
||||
// initialDate ??= DateTime.now();
|
||||
// firstDate ??= initialDate.subtract(const Duration(days: 365 * 100));
|
||||
// lastDate ??= firstDate.add(const Duration(days: 365 * 200));
|
||||
//
|
||||
// final DateTime selectedDate = await showDatePicker(
|
||||
// context: context,
|
||||
// initialDate: initialDate,
|
||||
// firstDate: firstDate,
|
||||
// lastDate: lastDate,
|
||||
// );
|
||||
//
|
||||
// if (selectedDate == null) return null;
|
||||
//
|
||||
// if (!context.mounted) return selectedDate;
|
||||
//
|
||||
// final TimeOfDay selectedTime = await showTimePicker(
|
||||
// context: context,
|
||||
// initialTime: TimeOfDay.fromDateTime(selectedDate),
|
||||
// );
|
||||
//
|
||||
// return selectedTime == null
|
||||
// ? selectedDate
|
||||
// : DateTime(
|
||||
// selectedDate.year,
|
||||
// selectedDate.month,
|
||||
// selectedDate.day,
|
||||
// selectedTime.hour,
|
||||
// selectedTime.minute,
|
||||
// );
|
||||
// }
|
||||
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 ATimePicker extends StatelessWidget {
|
||||
final TimeOfDay time;
|
||||
final String label;
|
||||
final String hint;
|
||||
final Function(TimeOfDay) onTimePicker;
|
||||
final bool enable, withBorder;
|
||||
final Color backgroundColor;
|
||||
final double height;
|
||||
|
||||
const ATimePicker({
|
||||
Key key,
|
||||
@required this.label,
|
||||
this.withBorder = true,
|
||||
this.height,
|
||||
this.backgroundColor,
|
||||
this.hint,
|
||||
this.time,
|
||||
this.onTimePicker,
|
||||
this.enable = true,
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
print('initial time in picker is $time');
|
||||
return Container(
|
||||
height:height,
|
||||
decoration: BoxDecoration(
|
||||
color: backgroundColor ??
|
||||
(context.isDark && (enable == false)
|
||||
? AppColor.neutral50
|
||||
: (enable == false)
|
||||
? AppColor.neutral40
|
||||
: AppColor.background(context)),
|
||||
borderRadius: BorderRadius.circular(10),
|
||||
border: withBorder ? Border.all(width: 1, color: Theme.of(context).scaffoldBackgroundColor) : const Border(),
|
||||
boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10)],
|
||||
),
|
||||
padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 8.toScreenHeight),
|
||||
child: Row(
|
||||
children: [
|
||||
// enable
|
||||
// ?
|
||||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
label.tinyFont(context),
|
||||
(time == null
|
||||
?hint?? context.translation.pickTime
|
||||
: (time.format(context)?? context.translation.pickADate))
|
||||
.bodyText(context)
|
||||
.custom(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50),
|
||||
],
|
||||
).expanded,
|
||||
//: label.bodyText(context).paddingOnly(top: 8, bottom: 8),
|
||||
enable ? 16.width : const Spacer(),
|
||||
"calender".toSvgAsset(width: 20, color: context.isDark ? AppColor.neutral10 : null),
|
||||
],
|
||||
),
|
||||
).onPress(enable
|
||||
? () async {
|
||||
// Define the initial time
|
||||
TimeOfDay initialTime = TimeOfDay.now();
|
||||
|
||||
// Show the time picker with the initial time set
|
||||
TimeOfDay pickedTime = await showTimePicker(
|
||||
context: context,
|
||||
initialTime: initialTime,
|
||||
);
|
||||
|
||||
// Handle the selected time (if user didn't cancel)
|
||||
if (pickedTime != null) {
|
||||
if (onTimePicker != null) onTimePicker(pickedTime);
|
||||
print("Selected time: ${pickedTime.format(context)}");
|
||||
}
|
||||
}
|
||||
: null);
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,9 @@
|
||||
{
|
||||
"ar": [
|
||||
"returnToService",
|
||||
"signInToYour",
|
||||
"overdue",
|
||||
"newR",
|
||||
"noDataFound"
|
||||
]
|
||||
}
|
||||