From b7fc53c670bb85e68631f8ce3b02defcda675ae7 Mon Sep 17 00:00:00 2001 From: Rithvik Nishad Date: Tue, 3 Oct 2023 12:15:41 +0530 Subject: [PATCH 1/2] Revert "Prescriptions: Shrink discontinued prescriptions + Flip MAR timeline + Freeze primary columns in horizontal scroll (#6282)" (#6386) This reverts commit 5009a86abfb96e9b21f8371635176e4c3f73c5a7. --- src/Common/hooks/useRangePagination.ts | 32 +-- .../PrescriptionAdministrationsTable.tsx | 266 +++++++----------- src/Redux/actions.tsx | 2 +- 3 files changed, 120 insertions(+), 180 deletions(-) diff --git a/src/Common/hooks/useRangePagination.ts b/src/Common/hooks/useRangePagination.ts index e6bbe9f573e..7652ae546c1 100644 --- a/src/Common/hooks/useRangePagination.ts +++ b/src/Common/hooks/useRangePagination.ts @@ -9,18 +9,17 @@ interface Props { bounds: DateRange; perPage: number; slots?: number; - snapToLatest?: boolean; - reverse?: boolean; + defaultEnd?: boolean; } const useRangePagination = ({ bounds, perPage, ...props }: Props) => { const [currentRange, setCurrentRange] = useState( - getInitialBounds(bounds, perPage, props.snapToLatest) + getInitialBounds(bounds, perPage, props.defaultEnd) ); useEffect(() => { - setCurrentRange(getInitialBounds(bounds, perPage, props.snapToLatest)); - }, [bounds, perPage, props.snapToLatest]); + setCurrentRange(getInitialBounds(bounds, perPage, props.defaultEnd)); + }, [bounds, perPage, props.defaultEnd]); const next = () => { const { end } = currentRange; @@ -63,24 +62,17 @@ const useRangePagination = ({ bounds, perPage, ...props }: Props) => { } const slots: DateRange[] = []; - const { start, end } = currentRange; + const { start } = currentRange; const delta = perPage / props.slots; for (let i = 0; i < props.slots; i++) { - if (props.snapToLatest) { - slots.push({ - start: new Date(end.valueOf() - delta * (i - 1)), - end: new Date(end.valueOf() - delta * i), - }); - } else { - slots.push({ - start: new Date(start.valueOf() + delta * i), - end: new Date(start.valueOf() + delta * (i + 1)), - }); - } + slots.push({ + start: new Date(start.valueOf() + delta * i), + end: new Date(start.valueOf() + delta * (i + 1)), + }); } - return props.reverse ? slots.reverse() : slots; + return slots; }, [currentRange, props.slots, perPage]); return { @@ -98,7 +90,7 @@ export default useRangePagination; const getInitialBounds = ( bounds: DateRange, perPage: number, - snapToLatest?: boolean + defaultEnd?: boolean ) => { const deltaBounds = bounds.end.valueOf() - bounds.start.valueOf(); @@ -106,7 +98,7 @@ const getInitialBounds = ( return bounds; } - if (snapToLatest) { + if (defaultEnd) { return { start: new Date(bounds.end.valueOf() - perPage), end: bounds.end, diff --git a/src/Components/Medicine/PrescriptionAdministrationsTable.tsx b/src/Components/Medicine/PrescriptionAdministrationsTable.tsx index 470caa1042b..81282126d7c 100644 --- a/src/Components/Medicine/PrescriptionAdministrationsTable.tsx +++ b/src/Components/Medicine/PrescriptionAdministrationsTable.tsx @@ -47,10 +47,6 @@ export default function PrescriptionAdministrationsTable({ const { t } = useTranslation(); const [state, setState] = useState(); - - const [showDiscontinued, setShowDiscontinued] = useState(false); - const [discontinuedCount, setDiscontinuedCount] = useState(); - const pagination = useRangePagination({ bounds: state?.administrationsTimeBounds ?? { start: new Date(), @@ -58,8 +54,7 @@ export default function PrescriptionAdministrationsTable({ }, perPage: 24 * 60 * 60 * 1000, slots: 24, - snapToLatest: true, - reverse: true, + defaultEnd: true, }); const [showBulkAdminister, setShowBulkAdminister] = useState(false); @@ -69,13 +64,8 @@ export default function PrescriptionAdministrationsTable({ ); const refetch = useCallback(async () => { - const filters = { - is_prn: prn, - prescription_type: "REGULAR", - }; - const res = await dispatch( - list(showDiscontinued ? filters : { ...filters, discontinued: false }) + list({ is_prn: prn, prescription_type: "REGULAR" }) ); setState({ @@ -84,14 +74,7 @@ export default function PrescriptionAdministrationsTable({ ), administrationsTimeBounds: getAdministrationBounds(res.data.results), }); - - if (showDiscontinued === false) { - const discontinuedRes = await dispatch( - list({ ...filters, discontinued: true, limit: 0 }) - ); - setDiscontinuedCount(discontinuedRes.data.count); - } - }, [consultation_id, showDiscontinued, dispatch]); + }, [consultation_id, dispatch]); useEffect(() => { refetch(); @@ -158,22 +141,17 @@ export default function PrescriptionAdministrationsTable({ } /> -
- +
+
- + + )) - : pagination.slots - ?.map(({ start, end }, index) => ( - - )) - .reverse()} + : pagination.slots?.map(({ start, end }, index) => ( + + ))}
-
- {t("medicine")} - -

Dosage &

-

- {!state?.prescriptions[0]?.is_prn - ? "Frequency" - : "Indicator"} -

-
-
+
{t("medicine")} +

Dosage &

+

+ {!state?.prescriptions[0]?.is_prn ? "Frequency" : "Indicator"} +

@@ -184,10 +162,8 @@ export default function PrescriptionAdministrationsTable({ border className="mx-2 px-1" variant="secondary" - disabled={!pagination.hasNext} - onClick={pagination.next} - tooltip="Next 24 hours" - tooltipClassName="tooltip-bottom -translate-x-1/2 text-xs" + disabled={!pagination.hasPrevious} + onClick={pagination.previous} > @@ -201,26 +177,24 @@ export default function PrescriptionAdministrationsTable({

-

{formatDateTime(end, "DD/MM")}

-

{formatDateTime(end, "HH:mm")}

- - - Administration(s) between -
- {formatTime(start)} and{" "} - {formatTime(end)} -
- on {formatDate(start)} -
-
+

{formatDateTime(start, "DD/MM")}

+

{formatDateTime(start, "HH:mm")}

+ + + Administration(s) between +
+ {formatTime(start)} and{" "} + {formatTime(end)} +
+ on {formatDate(start)} +
+
@@ -255,23 +227,6 @@ export default function PrescriptionAdministrationsTable({
- {showDiscontinued === false && !!discontinuedCount && ( - setShowDiscontinued(true)} - > - - - - Show {discontinuedCount} other discontinued - prescription(s) - - - - )} - {state?.prescriptions.length === 0 && (
@@ -328,7 +283,12 @@ const PrescriptionRow = ({ prescription, ...props }: PrescriptionRowProps) => { }, [prescription.id, dispatch, props.intervals]); return ( - <> + {showDiscontinue && ( {
)} - setShowDetails(true)} > - setShowDetails(true)} - > -
-
- - {prescription.medicine_object?.name ?? - prescription.medicine_old} - - - {prescription.discontinued && ( - - {t("discontinued")} - - )} - - {prescription.route && ( - - {t(prescription.route)} - - )} -
+
+ + {prescription.medicine_object?.name ?? prescription.medicine_old} + -
-

{prescription.dosage}

-

- {!prescription.is_prn - ? t("PRESCRIPTION_FREQUENCY_" + prescription.frequency) - : prescription.indicator} -

-
-
- + {prescription.discontinued && ( + + {t("discontinued")} + + )} - - {/* Administration Cells */} - {props.intervals - .map(({ start, end }, index) => ( - - {administrations === undefined ? ( - - ) : ( - - )} - - )) - .reverse()} - - - {/* Action Buttons */} - - setShowAdminister(true)} - > - {t("administer")} - + {prescription.route && ( + + {t(prescription.route)} + + )} +
+ + + +

{prescription.dosage}

+

+ {!prescription.is_prn + ? t("PRESCRIPTION_FREQUENCY_" + prescription.frequency) + : prescription.indicator} +

+ + + + {/* Administration Cells */} + {props.intervals.map(({ start, end }, index) => ( + + {administrations === undefined ? ( + + ) : ( + + )} - - + ))} + + + {/* Action Buttons */} + + setShowAdminister(true)} + > + {t("administer")} + + + ); }; diff --git a/src/Redux/actions.tsx b/src/Redux/actions.tsx index 1a5bd7e4fb1..6e0d91fc59d 100644 --- a/src/Redux/actions.tsx +++ b/src/Redux/actions.tsx @@ -1003,7 +1003,7 @@ export const PrescriptionActions = (consultation_external_id: string) => { const pathParams = { consultation_external_id }; return { - list: (query?: Record) => { + list: (query?: Partial) => { let altKey; if (query?.is_prn !== undefined) { altKey = query?.is_prn From 8589460e826b3d3262dd2d22ee0d623846f0b26d Mon Sep 17 00:00:00 2001 From: Ashesh <3626859+Ashesh3@users.noreply.github.com> Date: Tue, 3 Oct 2023 20:22:47 +0530 Subject: [PATCH 2/2] Refactor Asset Model Import Formatting (#6388) * Refactor Asset Model Import Formatting * fixes to warranty_amc_end_of_validity * Fix asset import file for cypress --- cypress/fixtures/sampleAsset.xlsx | Bin 45398 -> 35942 bytes src/Common/constants.tsx | 45 +++++++++++++++------ src/Components/Assets/AssetImportModal.tsx | 20 +++++---- 3 files changed, 45 insertions(+), 20 deletions(-) diff --git a/cypress/fixtures/sampleAsset.xlsx b/cypress/fixtures/sampleAsset.xlsx index f8e234ce4477934a0426a088783ba4988500f7aa..49421f62baca164b5908d5b182ce11f8776aefb3 100644 GIT binary patch literal 35942 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%0DwfYI@bY)VNaG;z9w`%`XRb#^tALRKi~d%t+gfXc zX$|t8MnvzN4@S6n-ZJc+mISuRe&os#=OyjP+3Wo{x;q=t7fVi&X?2K<*;T zl^1P*R%sdA_7MA9{p9muCQGG0W^Gt*L>&N9#8ci7L~JFn=OBuOel-?k~ZDz-$!?fI8mgT1d03}_!_5I)R-hJ0&v*rZx6x_*yT~l5K%YSk7@;!dC8x^VXUG6 zug9N485PUN;L&vhtqps@copnBTJA>?0B16Pui}DFnOiMdk?=3`4G`l z?b9f?ih_9XAuA~Z;O&FmX$fdIa2gOIQxIT=P6)d!3Se{$>#EYDcjN2b~3xjtEE5g7D^f236Z*XQOdEIOXMyD$${xX{9OknyqB?P5l7e444419K?8$ z!!&%Z0As3FWTKEm>n9deio+8hKkO3277^nJ>5dW9f%M8kN3b+Po+xF#Hf)>nA7qk9P}1y;iq`&dO6d3{t}*WKmkp%hKD@It8q^3B3HW_T@zcBmP7!mSUz`kPZB|4{>_4>n zf3|cesAx&<-@FAyHk5tHS$>V+a>&ILN)+k7-0%+0tn~MB@k~bo1YPcg0e+eFPeJzI zTKzv;`hVo-e5RRI_UWTM>ltNi3GB5wGH1PwL^xHF)*%!bYCEU$m$qK zi*Q85Ngxt|C@tH(HcO<$5zFSJaXcKmf1IOv2q;bnL8;IIbl`x)0u?x`R+6zcF*!l- z^P~DLMvq*S0z#L830-$I=0i;>-~tfdWA~Bz0y!=m7z&NYV)|xCOV`9saOQ!`zhO_# zIC3cr@sQbYDuY@bo+_1_=sizdsPqeq|38xfr~> zuR0Z%h=`lE4neX;bTYshB}!1;;9!6m45UlsU@~n5$4Mx0z%y{w?dm`!X&kZ*LE}F7 zpdikRRx2CS_*RQ5Iz*~4sqR$k8E0whyxvjXNIDKDQXdeJfwO}ggw==HI)g>XKk1JU z1yzg=OCwJc)%J+cl8^wUaJ{kRb`xpSy9|Sc3 zq~89oaT^^S2+z4+l#W?L6eee2LL}t&r=$a!#Pt`FWa+FbTMqQTZZskJ$!WiWHPT#> z^oANBs^}1vB&f$wA*f2@)yVbp1+O}cuFvXk1+I%%N2e{s8R8`*+V6+dJKbC0t$ZCQ ziMzlC*jJQ5)xlIyaA$1*!KtyMwh}A|NFSm!S|D#>()Y_$z*B`2MkSYmub^K|`4Qr` z=D?mbxzGWPGy6=oF>yLdfdfX=LBw`PS2z-U`|umYD{f2+44|>m8BqTKl#xY#5+te7 zBfC+J2j2`7jD#A`(=%2WG(lXN6qeOt4^%9g$Vs0L58xd*`U637esO<18KEQMmxvX) z08915v9SjguHzqoq~RbSq6A4WS#qx6>UdbWmUk)Q_k-LJ1yHf5pL@@%3L1YP_?a`X zaa6Vugl)tYX($-iI7cN&D+1)WBSwW5N|@c=69X8cgs=!q^?$M8Q%vR%01;%a2k0w= zMv^=&H2Tqcl@U2ZUfH9F_Jh?95+f1xm_p@0J;xK1qY(r`-IOM*ZvA;t7&VB5;swqR zRR$vYyyZ}o#b#ckI}ouG*giXG?ga6`UV?!M%P>DrLQD<`pHQ-a1mZb}s06*xonQgr zwIq*kgp-1fg}cyzg%#j`t^xup*f(*GWndLraWQ>&LM0z?I-T0Zv>C``jUt1D7GO>+ zc3A!*j*f=yrW3;@p$**V#212{e_JcbKz=Q3=S)s}mOufAw~3Ygw^bBQr`utgcM&-u$TBRA;N{X+pc34sAF*~$C#!5V z3_)kD#|i0oFXV|QA&CBfJSPF<4u%C6=ZyFSn-aWC8SygrZdA#VAEc{u6(lhfWZ<;t zLNZN&D+QIlujR!taOWbmDHRA4FiN06e?#r@#nrZZL64+prD-%4 zNwB8Jj%XN2f?R-b0rmM2*-UUK`RBQJ2Y;Z`4o@_p|`Yi1LAGbs0ONwMpbWl>?rOVxB;G z@Mlh1ZBLX*gwz|_xpo=`04V=A!^r+L3fUwTc8A-(b0MwBl|v*F#V!fD&|?FB_sh0% z9!nw^E?w>-%U^JHq=9wQ^WpCsBXlN&hp<-EuR=kFodOANKNmW7`;d-;bL133g4}e6 zuIhor1vKJk!)43iEet_kMjcrMSlzfrASKXVb||qM@aZ^6fvk&KeTY4xRv(zJMi3|o z`T^ner?3bmP+pmmQ-ew#3HWE4+IZxm!?dKemd$x<$C&44$&{UMm%_WD?=1SChLi!@mdIwNpFdjr= zikwF$07!-&7)k}ogM;)>2Zna!=zx*?$e6@hprFcmo`{?xYD63kacU9Vxll%vNl6?! z(PVb6C_<#x5cGZeancDRTM#>vpR(ZCap({tEoSeKa=TH=<;f{B7iih z5UT6U0kx2LMXRwTJYSpH0ceHwA=Ijsz@}Z;K7h#Sub!}z9`q{w3+iZv98Tt_FNK+q zIBtd``J61R2*D2_RR>8-d(!*~EwmnGD$;Nu8{^W4CXY?GOf$%oM21Hd0!B(gQbeat zhlpt>fLsKeb{GG-5~-qhDfJocolH@vv>`aBBcixgx@`~PG&@>BON0XYr)Ok{AF>Jy zM%|nI#-9Trwi4`x6l#J#<^!uecD|KYRZYESH#iKjbfm62auME5Q`pF*6EFkU3y3wo z4}j|`t<-@uR#i)Smh8s9S{sLS$|q5x$(mdQS46CS9#m5CDk@f(AE9l7j*KWNB629c zgZwkUD+;!K2>1$52>-T$a>a7&es+wN?phg%Lf{6@9 zD`9Epg8jRGQrZb>AV6dUXI~gwhJ?n#e z%H%lNv?0kF6(s=ej$*X919rM6mgqG>1q2>s=$~681TG1N!#GDjYx+#4vLXJtI#!w> zRZmfH0<+M4o$s|>F86ac;6fJ4l2uY$pxBl*L&u3A#PO#b2Bk&=ZtIMHfVPedY7$`U zL(PGJu1}Q}(`RU45M~+V@PYhI3k+n0QI30f(*MDeUjv4$e^L7aL#hHKNus5L>Nm{$ zBXNbU!Y@JnvkzbcjB-5610iM9XLkwjM1Qi zAa5|F^9rz&^HIa4C;?u?d5$1#lIG$_<5ChlP#e(1j`H7jF9`M0m8~W+?GHgMtjs97 z&BjT7k{w#NtsU&GCQ!jgoruVl5QelXVyI#T`o^#%x_9?jQXiRjemBckE=2Rh|}(Eb++Nzhv)`J;~^&PErM zRV#KyJwmF<=zTDq95b*4$*bg7a_=1E!l9vV|lx z)u%cSd0%G^Km2Yhh&oZxy0OQW0@sijVP|EFDFe%oLO zR|3gu9BS8*%Kn9dW{9B^fk`lEkf0!A;FF8(cb+P6&~2O7%uJ$gM5BL}D%60}Hy#CW zd>DzM{fZ|+XhqjIrgc9_(#Ht>ZX`1i_nJsi6p|gX2&suK*PBLpXnUct8X8w-#>FXW z618I4nAV{r#|har@JZ`>viKp6l~kCO1b1pxv`T`ugMbU2fpo|DNe8{cS^8*n|^UNL^F^~PkN`iga3Ni zUkOL*P{qWR-nxUbtJHd(#l}m|W2?Z849YAzXF(;egD12iB-d3rpPY_w7Qh8KuqR2O1n6nE%3yX(o7XQ+c?C!J&NuWu7=dy@71#L3I5 z&2_3ByW-r{1k3$W#;e}cvM2aCWk!XaY1>7$Nl%H5*Da$oTlfzawRMWid8LeRG(N^{ zWG3sC5~6MxWfZZ^cr?y4MM8UZctaqK&vj zsT%p+F>I}rLd6_&_;B8c2sOM)K&`v(lG&TKfgnrtyWqqpttzeR#&vIMCuYWuC-kd2 z@Qz0aCF#OL;mJY^QL3I(aOeBjQWn?qBEp;nwWYC5l^$HiS*dzPb#`~Sj7JZarmGfL zo`vbOgp(SgV~cIu(nLCoP%ERP2X`h(mJXVv727IF^~h>Ro-vbkh!9ZA z1H0%rY!d_n&GcWJCqV2rsrbTUSfqq{%k9)0^Y$+mE_fQQh;*FCGy8g2Q@j2 z9aFV6lGx_;Puo;#i-pU8b-G+!+mX_Ab*soQpRZNC#^P~btFmZM@?$Q-J|$Nwzqyhh z!*-zbe5-n+JlKa{l&ZiVc@Gb1l*A3i@Ceo$MZm&YpLSS9p2?i^5Y~;(4}SG8W<< zfu)B!VG5h!1o&R7lDq1fd!Lt!xW~H9i&M~k2!Cr6N_r&3uxte=bk*KOdOZ`Dvo*chjs#MYP zp2trnTdgLC`6nkECqL&+{IG(LM6f{ejyz&isB=uiH=wJl?hf8iye@qX@YY6HS2V=r zq&u5ZoZW4)9k2pb*mLBO;Ka*Yg1smTNo}c~DNb)|H5|Bee4SMTLka;I?4uyK-XlC~ zYx7O9R3`!B$8GG}Ms@z+ejGOGzAw39lfD6glu*VZ#SFIAE3sX*(KhMK5JjJTveJD3 z838oP%>ztf7s#T6t*dUlB%;f=D(iKWRAfz4YUi5PyD8vT$f70ko<}f50w^d`yXqF9 zPZ5sjuGUqT9NSS*uS4y5pt-BFLb&asXP5B8!rF8mXTxE3?#N^ZQ8}<#z=SV%U~uB$ z%{WYsEr%cnxP@3llko$7NCKYaOA;U`0O0*GPOS3_-jJ>WhKm4fgs{`1R5^q&v49Zi z>f|!M!b3ioWY7@4cpV~zL^5Kh)^&p=gJ`E3N#AgoAQ)rztICp)8<~;d*pNe5X9tO< zaWx)7L)y~}O29mdu!G=-dVn?PY?z`yrooY+sQ1@}kU}7hr*0E1=Uk3qmM>>Tv=gio zPaaH0nq*62LcezKuS>;QNw>UHb6P>i@lI=NY85W=>}JvzF~A;5cUo= zJBNPVKrgR8*abPrub)AONn3x*5YDKQD+^BUK1#Y&RluM%_D%v0Qq)kcGe(IR$LF~y zoAd-G49k!LA#+C72mpRTZp8kHeX~szd$jdb43O>&QScR=&9v7MOu_~sKfhsAuRnWg zld+?1(vZLrdM+i=^H-yq$^OwsL>|B^ElTpRv$RQf+U~59V?HZ(JV?D|$aYks9HvQC z8E2oe`6aXKfT>>x&kg*v^S~x>;H^Ko z6D=2ZkyHVPJ}qAHVO)G#DbWpI4|gn)pT2V%!uahf4|Hy-Zy&WPXbH-;)qP{5M~J4fjrNz3!oenW61=GR$vyN@==Bg%;3 zwLXmmYTy_skbs&-JevmK(}IZZN>%0n44qe=06X+Va0y%juS*@0QUd0~-M@tVEwvx; zb*JsYFYhXvh9bX@>#Bf63J~5JN%OiUh&=k#cVABBu;p+pH1I%VxS)3M#nGHEFOpSi zr2B)^4a1aOtf#`r9UuZ>V*qeR6fd-cr}5;b|G^HOP~Qa{uat8mK+PP zqX25tY!V9_*1(y)5imT(%z22G)wJ;;jh>)EFtD|O+raWrcFgfPg)=4%2Fbj6cPe*d zZXp;_$FDrvRY$OaQ&CfV|KFhyXH;$Cpa)-E;IzNfFHf*(NnF=}v7r#c)Z8%4p=R)i zuanq#zTp7o%oCD#n{KDRjyjq{n`#R1X?OroA)!i8<1$2v)Ps3)d>Ry_xZ%H@N3y^8 zh7??Q0f7V1>#9@bQGRA#6l)sh2MC^?m9B+!gE6K!2%`U-016TR2u4&Bl|J;ei)@4z97&XsKr_-qI75IGo(k)g@KWu- zW{vYd8&PgP@};iL~5RcideD*xis>DlF=gw%SLUB zY9+xQ;pzxn=sCX(9wKbU%fLa}>Bte*!&O^X; z)o#EFI^{v`N3cJ{VM=K95-pgdm+lq9JIA?ydO#<6kXg!@-(`N&lr0_nuIpm>h$*@O z03AdJ%=D)1o|s$Rnk0K%09RgNP4}S7G1PMkL4^aG$aURRLg0p^PL! zVD#vHlF<{TEK0^!#^$lrGPb-y_YaT6A*5r0J z%!WN7q2Zf+*_Hg(!8I{Zr^&oqgzcElL$5FDojnm~uQ$1lGe8^((NMB?Qvgt>BHn%g zRW-G(z@P8}M}V_Tm3H;KKzU*dKK~urWlwiNQu4vsZrgjHGu?U3;S3f8~ zzR3fU5rN*r`(+4n`XE>XGFvT{+Vt3HDG%2Q8r?fNLH0o>^~9m(153AVHzX#MZoh#@ zk?HUg{Mm=m>seT-mtP|G{iq?2xHhJiAj`89xsbecYBhR?>6RdB*3 z0-cB{Bn1N1A#xgxPSKz!>~z`Bejp0#nC=H+h#}CZzh)9aftX`6zky5Oh5Z`}{1oh@ z_<*Xv(Gwk@X`u~E00n~SVV6-=S#utCr)-Zjo{bASNfWn&3?!7ZO5pCRR?v7N>r>Z2)*i5A`P7Amk964|Q6RT!09M zDP+iWxQya^sjA4;l#udll|5FI+@0-7ijb10d3`b11XW!S-$>9Tl2$&5d#x0-AvN{j z(}Lx2RDHah8lQ#2i7P4X&np7|m_&q6bmVp8Zg(Pc6K@9ja~1xTf39sOkpT z$YA>!1wkK}b40vB9tB3PY+Dvg;Dj8;34a)Ar)LpCC!7K_bl?m)m{10ZZ_ts=M3htA zI+o0iITY1EquBoFexA4?tZ?5_6G5?23j9m?vxRY$Pz7Q$gA(Of%2$w8bq}}$Db2%2 zJ-?NYQ-|aJxuWh?LgfBz3yIhu0yHohNyM5oA|>!e%n|J@5l8H*OPtOTf07MHwkHN5 zB{AGllmUvsi=I=`p@*&0rD`SMjjQTeqs`StTGl}7BaS3kImge=>X>XM(z#Zfg6m?< z5vkV-AS$kib}@913P`;Cebfsjd8~fgj!TONC#rH?x0HpQ>(Mi(5tL3Tp#MOy;RZ)r zmgcm~DYOM;jkqBY{gi|yQYmLMkeCn>&9RYBPS&C}CG?D)2l3zlq$E74LOm=3@TJV=v z&{qSw8##4gN2kE^rV22E=H*WBZ6G}c>!HxSAoWlLi1C3q-=F;aiJ)7Q&o~lj9r{?O~IH2`qU4$LsUkpqBALZ^3a6d{!Nb*n<#EVs!)$Cik?y zMlKEuC(z%WwFWds4wxeSZ@L$(02V^DWRQY}X)`oXK(HwTWx)yWn3Rlgthd7<*ksCv zbidE(QoCPALsEi2l2R%@^C{w0RErl;m5dJ@nFE&xNX!7u1a+m56VP;2NKt2L^5OK^ zLAOU$2F3;Q9LUZWBxc+YgT#E%(}1RM6M7AP5G%%zGoIX*(C=LyjJ&2Q7|97l!w#mC zP9yV9i6D}Gs+>l^oLr2e)Zh03>2DME`!CF;-pqu&NH#Qx&k>+cOPc_KQ1fPvvm>b6 z1LdYWVvzE5qk%F86n6gc^CHkT1j0oWPJ#oDD6(n*1&a`EY7KOzQ)SeII&YdsNH^2X zX2k{KHzG7BA>nW&v=&VGW04L5IM*84Kji|>C;?+fjm;DIL*;~pDFlu*T8~>)Nf_Xe zmi5E|rLglFzR=yG_MOnmp<1N_F(cY*ZG;90vr9k=iR#h6M}4Rn>QZFVqd8y~5DE~- z0&W(DGY%O;NSVX9@>6ILLbN>y4D_?M=S*mY|L_x7v&WHSqNBEEc_b2GWrtQgK|DYW zgBPxD%;Yd?ScR(QX|xfe;R=YVU*kZto0jx`wkQ~`2A(wI7V8)0YJwvIFt*x1j&HD( z9XS&d6r9-l4IjkMWRT{mi0%;-5;JVYjBm&lQ21v%l9eYwTqxtMiWrm*QK77lyKdCj zd#%t?#g2di0!vR25Wgl$qOB{5bVigYQRBpX-AGAnvO{#2-Wc2qrZs4Nnp7G2yLhz104}bqnU0O zm6o9WV8JtE*P;pw#BW?nCAHkH^rt*Ge1mHOOLb%j_81T(=z&4j8P~|~*>hTU*Fg?I zfj8{ilemx`&VPpaY45E~g+1MG_=>I_iKiP+=IL+{ucVNN6Lx zhGx2lGap^)?N7S*z8N1VD?P7HTXHQe1>wsFD44Kxfr<;nUT8{X0KOMNDotn=pNT6D zBmlPq3#|j*Kf+#b{*n>QMuZWny6FbRWD*Mb<`Y;JXwfwCr*t7in^G37B7C9(ct8v( zl*~c0QWcUp;z1`w{7(c@WJxL#$m-L;TM#YeioDnQhzI0HL;wZK>v25`nx27r@z3qy zEJCMzW}dV=!JBw6$mx^Sfk>7K!y+yr-R9l1&4ijD9)Qe~OC zX3>aMmagfgCG;2&SImH{R)lIgIu|37lcl&Ebfb8$f)aqP6=21LXm_TcjW~w5)l>}8 zs3P(nJ0NJQLF)v~F`FWbq{Y@49;*nzQ;^G`3;b==4+S8te}tq$!zjyd@)^kE2q~W+ zPPCRQy0+1hsKgy?a|hTqp{~Z++0~qPLG>9lI6nKF1^G8q1GSJbt3xFQwz{zBB^qNw z)R1VfVN;k{w}}!LJ1{&bwm>8IT$uBvY6)no3~oaS6S#^3x)${9g+N88C~D<3+ujyy zMC&94DZ{9bX};)&4MH?*5@J^bYa!;D(is9Mm&_)OpoD}(3ffJAE)r~3|8fCo;(jbL z5+ucM@^p#;(k&P%47ZJUsg8w`eW|P(4=B$_nZ;^)D8XHVL3|-57i+3cPzx50DXJWWb0Tn z2wZEd@Gbrwau!t15pYH`0-^(wE8(^bnJC#>k@AKLz`@&7&VXsX3o4_~H{NgrZ|0aT zc0dt@TcF^sQ#~4d83&(sk>tRdd5_K$S(TtPwVvIXAaEI|0?J8AV2IgR} zOWZAlbv2}2ZkSMmP7O5|TMUO7dHn&=Ys8!z(Oo0br6g2|yhOi&fcH67Nk_rg9Ld84^-}`afxnb0V<64gYJkbNW!fM zRit8Iq*Dd4l~MM2#|MXQvygI0A?~#CLH2M$>C*~SMLKbW<{=tK=Zu01FzqL zZQ;-Iz^zAAC25pc(ZS*trX%1A$cym(E9zNv`wG@Q)q1oakOXOg z5PyI11O%IUE{2e%cRlSm1MmVjwn*uRU{VKkSjM-U2s#)zin4yXc$&J`OTDAzZCLt6M z|GdqDu?7iDh(J#{4%#Jl1$YEH9ld9XcS-CXNEF=wJX4gp1?up@?a^ua0h9&P5+%`3rr7|U zq|x&zd*P_(+u7vr`IYOKup)N8I%b)0_F_JGJ(^|2I}cR^x~$zYplo*!=xZw=L3N z7J3r?%tgD^=#QVqf9|5KiJ_$-KmIHJ1CTnjl&n_oUzy9 zsgS*Stn$kRiG~oP^Txu0%5AI7JmuwYxISHH{pHdng@jj;V}a63SYli*+Zk04D(+VH zUiwP&tVvEvS$3bZOR;Xw;5z;9cjq3kZ}5oq=UuYFzL-%+CGdTS?ohe5Tg1yBGXz7u zjf6G{WTy9YiEH*`Djbkq+)>sdc3L(@HGibs%i|je8?;u+k6F<%$j^eFm(?CNDrYv*`A^Kw{kbV|>AQ^TSwYu6kRmbqgX zG|%>imZ0m|Ib)CH*dNW^v2}U2iR|(|)@_!@bzZi&Y>HaZac=NjiQcoMkK09#?lg9f zkdjEPOAt=9P-aayy@H_+4W zds1=FN0T(|0oj6E8_lE#jV%}DX=o)_@;P3Zl{`GMCbzoIB12Om`!B7rwl%qqkx#Vy zdgk~D1acHVNZXTD?=`|A&}<<-S8vv^cBEU`p-&6dy36Gj*e9;|p?$6U?0bewa|Gf| z?o>Wqw|C7I)(q=vR+jcz|A@UPU7f{J^lYQk3a=;kubRnrv##85O18VI&q`0i#a&mz z#b)fE+Md5T?r=zmIS=PVwpf0AZQpeI;*WvNc`iTJk94+b@^iSXczuv{vd@lVy#Gt| z$#whQd4#iuN&RT4^=8$(IM%+)bJjmfmq+=s~P6J+$W5Y{>2HVv=WH|7qa8lV{EN5f7Gy!52A8c7Iy*Ek1w$p}%(Z zYu&l#7`}TR2cIn8Y346~zpJ$jc8u!uV0s(4EV|#eQTgVZuY7+$dpWP*rp(A%sdZfI z>LnB;a=P9fJyURYWe$ik0NU{H;47L%=Yj-C4*c=XT)w`%08hPq%d5SL8 zwxRarYe#uDs;0i|X@v^MgIlDp@NErz@Lcg)#h!Ti&&IW19iQ$yk-|7HQSv@dy^8f; zPL5R`l$%=*Y+kzj_{(e)zY^(#%I|h^@?5R1R}4BQas5N_`X_atXJutKl?JH^7>y_v zD~gMn>|Z9*ev(&n;^Rs6qAHoR0MjPfcX^uDto#SmRPbN8K0=Oq4T5(iEshnF+-u4rP40;s&s01Xc(>xl=cPwaM0`nOvwonuDD8o~>Br?~q>NMC+FKdn#|Z?YY6!m+2yv&Be z>THVLkC$-AC~q{GeXub=OGNL1@agS(7yR0d`BE8kAvn?p?gIc+`%uJUc!8cVXA}_syQ$9~d9#(9B%_U;cop zf)DREXC{}Ori*Xx`Ut$14@-^odHx~K9l*-!Ei0%-;$Te4PYx)`FDTYeE-fy}&(#B7 z$p^f5ee~97VBl?;5}SS7K%(_M`)_`?@2kE(^?x))&2Qm`KBrBwZ`3q?W$r56Q&T^5^?5RBe z*0N+*gSDqc$_#;s1v1VDJ(dNZVhyYil3o~cy!6y1Dfv~!7k?D5kF8?)%WJ&v%a=dE zB#qewyD|IggGImu?+d(TRscD{Cl(ZprgmU5hk`kiee-V{@U*>W{wB|JSK9J!08ith zByaOC8xj~Nm8JVFOJ2AwrDM&+H`n{O1zvwycB@xjKhAcEN^y18t2KvR?Ao?Q=@m^) zEZF$r;f^r=_WbbqA#OYi8?4x3RvS;+we|h|nXz5EYTrC&MzBP!?%Elf>AUU_TZZCW zg}Fw{*di{KT-m6z_weo)^Q3v!tpEJS?Qy4}NJPxm$qS`q!)5=k&lHS3@7~{DtbO2G zP2TNW)(JB&V;)mne(T=TNx>cYn}j6Us8ZM?4ao3+LEMpWqp8y2wxab{}HG24%v{MYlc zQ_Dqdv8#btd%?Q7$Nw#kuJ>yz7PWs9c;E0b_3(7p&Fd8s6{j2BJrH8> zebb$g?vvs-OYGmJ+AZC(QbA^8#l|1IFWS#J{;~YV)3ZwdC!F@4akZ!JFZ(yph3%N> zx-^P?O&u^@KLTFsE{L42lkHhi8Ev?vnH$di zX~UjV{vKk15vp0~iH=bnPqtXu%t*=iN=*Y+OJw`#I+X$AM0DmDB`tXLG-~p{9P&PE1xL5G++3RWy+F(X2$M`Vw0Qx z6$mzU*7KE|kh`3bQ+q2jy*xhpq@2u+`GNdLmSw8>-n{AYkNa0ib@BbRv$A)e^s;v@b6aj>#-htB?BU(W`9?#RqlU!^y#OrkYF?2 zVzblTMV6^^&i)AexF@#MWPk6%{26mQ|BG->+gubmWsdB}qHW86=mwP9`zx%8$@uN@ zWQWw>Q?KCHeKRuY0 zjs+#-0B=+SgyZ(5G64;^4@~z!JCMLaU2ro6p}Uu zhAY4xdPR;tL~nV1QFc;(em2N%tmaI3^*Ce#&PA)0CrBWImjlUI|BVKdxYjA zK+gajfpN1vx(VnvrXx&P0K7mQWCHyDbabugcQPZiRtmyhj&VaXx+&;m8VFPBtH7q9 zk8q$HfZ7B_Xa|;KjSLJ}8l>n3pjPR~1~9cC833)|(RHI1oXEOwwIS(-6{7*(poj*g OHExE3z-aI91n~g)q&wgM literal 45398 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

3{GwPx#=zj(sy?FWW-|fEUs= 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 diff --git a/src/Common/constants.tsx b/src/Common/constants.tsx index f64a9fa27ae..e51494f6bac 100644 --- a/src/Common/constants.tsx +++ b/src/Common/constants.tsx @@ -896,7 +896,7 @@ export const XLSXAssetImportSchema = { Class: { prop: "asset_class", type: String, - oneOf: ["HL7MONITOR", "ONVIF"], + oneOf: ["HL7MONITOR", "ONVIF", "VENTILATOR", ""], }, Description: { prop: "description", type: String }, "Working Status": { @@ -908,7 +908,7 @@ export const XLSXAssetImportSchema = { } else if (status === "NOT WORKING") { return false; } else { - throw new Error("Invalid Working Status"); + throw new Error("Invalid Working Status: " + status); } }, required: true, @@ -917,6 +917,7 @@ export const XLSXAssetImportSchema = { prop: "not_working_reason", type: String, }, + "Serial Number": { prop: "serial_number", type: String }, "QR Code ID": { prop: "qr_code_id", type: String }, Manufacturer: { prop: "manufacturer", type: String }, "Vendor Name": { prop: "vendor_name", type: String }, @@ -925,10 +926,11 @@ export const XLSXAssetImportSchema = { prop: "support_email", type: String, parse: (email: string) => { + if (!email) return null; const isValid = /^[\w-.]+@([\w-]+\.)+[\w-]{2,4}$/.test(email); if (!isValid) { - throw new Error("Invalid Support Email"); + throw new Error("Invalid Support Email: " + email); } return email; @@ -938,23 +940,38 @@ export const XLSXAssetImportSchema = { prop: "support_phone", type: String, parse: (phone: number | string) => { - phone = "+91" + String(phone); - if (!PhoneNumberValidator(["support"])(phone) === undefined) { - throw new Error("Invalid Support Phone Number"); + phone = String(phone); + if (phone.length === 10 && !phone.startsWith("1800")) { + phone = "+91" + phone; + } + if (phone.startsWith("91") && phone.length === 12) { + phone = "+" + phone; + } + if (phone.startsWith("+911800")) { + phone = "1800" + phone.slice(6); + } + if ( + PhoneNumberValidator(["mobile", "landline", "support"])(phone) !== + undefined + ) { + throw new Error("Invalid Support Phone Number: " + phone); } return phone ? phone : undefined; }, required: true, }, - "Warrenty End Date": { + "Warranty End Date": { prop: "warranty_amc_end_of_validity", type: String, parse: (date: string) => { - const parsed = new Date(date); + if (!date) return null; + const parts = date.split("-"); + const reformattedDateStr = `${parts[2]}-${parts[1]}-${parts[0]}`; + const parsed = new Date(reformattedDateStr); if (String(parsed) === "Invalid Date") { - throw new Error("Invalid Warrenty End Date"); + throw new Error("Invalid Warranty End Date:" + date); } return dateQueryString(parsed); @@ -964,10 +981,13 @@ export const XLSXAssetImportSchema = { prop: "last_serviced_on", type: String, parse: (date: string) => { - const parsed = new Date(date); + if (!date) return null; + const parts = date.split("-"); + const reformattedDateStr = `${parts[2]}-${parts[1]}-${parts[0]}`; + const parsed = new Date(reformattedDateStr); if (String(parsed) === "Invalid Date") { - throw new Error("Invalid Last Service Date"); + throw new Error("Invalid Last Service Date:" + date); } return dateQueryString(parsed); @@ -981,13 +1001,14 @@ export const XLSXAssetImportSchema = { prop: "local_ip_address", type: String, parse: (ip: string) => { + if (!ip) return null; const isValid = /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test( ip ); if (!isValid) { - throw new Error("Invalid Config IP Address"); + throw new Error("Invalid Config IP Address: " + ip); } return ip; diff --git a/src/Components/Assets/AssetImportModal.tsx b/src/Components/Assets/AssetImportModal.tsx index 548df2901ec..7382c7eff4f 100644 --- a/src/Components/Assets/AssetImportModal.tsx +++ b/src/Components/Assets/AssetImportModal.tsx @@ -85,11 +85,11 @@ const AssetImportModal = ({ open, onClose, facility }: Props) => { } } } - } catch (e) { + } catch (e: any) { setPreview(undefined); console.log(e); Notification.Error({ - msg: "Invalid file", + msg: "Invalid file: " + e.message, }); setSelectedFile(undefined); } @@ -113,7 +113,7 @@ const AssetImportModal = ({ open, onClose, facility }: Props) => { let error = false; for (const asset of preview || []) { - const asset_data = JSON.stringify({ + const asset_data: any = { name: asset.name, asset_type: asset.asset_type, asset_class: asset.asset_class, @@ -129,11 +129,15 @@ const AssetImportModal = ({ open, onClose, facility }: Props) => { qr_code_id: asset.qr_code_id, manufacturer: asset.manufacturer, meta: { ...asset.meta }, - warranty_amc_end_of_validity: asset.warranty_amc_end_of_validity, - last_serviced_on: asset.last_serviced_on, note: asset.notes, - cancelToken: { promise: {} }, - }); + }; + + if (asset.last_serviced_on) + asset_data["last_serviced_on"] = asset.last_serviced_on; + + if (asset.warranty_amc_end_of_validity) + asset_data["warranty_amc_end_of_validity"] = + asset.warranty_amc_end_of_validity; const response = await fetch("/api/v1/asset/", { method: "POST", @@ -142,7 +146,7 @@ const AssetImportModal = ({ open, onClose, facility }: Props) => { Authorization: "Bearer " + localStorage.getItem(LocalStorageKeys.accessToken), }, - body: asset_data, + body: JSON.stringify(asset_data), }); const data = await response.json(); if (response.status !== 201) {