diff --git a/docs/WhatsApp Image 2022-07-07 at 11.53.46 AM.jpeg b/docs/WhatsApp Image 2022-07-07 at 11.53.46 AM.jpeg
deleted file mode 100644
index 76a24c7..0000000
Binary files a/docs/WhatsApp Image 2022-07-07 at 11.53.46 AM.jpeg and /dev/null differ
diff --git a/src/assets/img/brand/logo.svg b/src/assets/img/brand/logo.svg
deleted file mode 100644
index 8437742..0000000
--- a/src/assets/img/brand/logo.svg
+++ /dev/null
@@ -1,44 +0,0 @@
-
-
-
-
diff --git a/src/assets/img/brand/logo_bmd_denpasar.png b/src/assets/img/brand/logo_bmd_denpasar.png
deleted file mode 100644
index 759180d..0000000
Binary files a/src/assets/img/brand/logo_bmd_denpasar.png and /dev/null differ
diff --git a/src/assets/img/brand/logo_kominfo.jpeg b/src/assets/img/brand/logo_kominfo.jpeg
deleted file mode 100644
index 4345765..0000000
Binary files a/src/assets/img/brand/logo_kominfo.jpeg and /dev/null differ
diff --git a/src/assets/img/brand/logo_siopas.png b/src/assets/img/brand/logo_siopas.png
deleted file mode 100644
index 041d9e9..0000000
Binary files a/src/assets/img/brand/logo_siopas.png and /dev/null differ
diff --git a/src/assets/img/brand/logo_siopas_old.png b/src/assets/img/brand/logo_siopas_old.png
deleted file mode 100644
index 4afc248..0000000
Binary files a/src/assets/img/brand/logo_siopas_old.png and /dev/null differ
diff --git a/src/assets/img/brand/sygnet.svg b/src/assets/img/brand/sygnet.svg
deleted file mode 100644
index 4967443..0000000
--- a/src/assets/img/brand/sygnet.svg
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
diff --git a/src/assets/img/logo-surveyor-indonesia-2.png b/src/assets/img/logo-surveyor-indonesia-2.png
deleted file mode 100644
index 6ddf492..0000000
Binary files a/src/assets/img/logo-surveyor-indonesia-2.png and /dev/null differ
diff --git a/src/assets/img/logo-surveyor-indonesia.png b/src/assets/img/logo-surveyor-indonesia.png
deleted file mode 100644
index df1dfc4..0000000
Binary files a/src/assets/img/logo-surveyor-indonesia.png and /dev/null differ
diff --git a/src/assets/img/logo_adyawinsa.jpg b/src/assets/img/logo_adyawinsa.jpg
deleted file mode 100644
index 3aed73b..0000000
Binary files a/src/assets/img/logo_adyawinsa.jpg and /dev/null differ
diff --git a/src/assets/img/logo_kit.png b/src/assets/img/logo_kit.png
deleted file mode 100644
index 8f9a56a..0000000
Binary files a/src/assets/img/logo_kit.png and /dev/null differ
diff --git a/src/assets/img/logo_nawakara.png b/src/assets/img/logo_nawakara.png
deleted file mode 100644
index df2ed5f..0000000
Binary files a/src/assets/img/logo_nawakara.png and /dev/null differ
diff --git a/src/assets/img/yokke.png b/src/assets/img/yokke.png
deleted file mode 100644
index 2d3b32f..0000000
Binary files a/src/assets/img/yokke.png and /dev/null differ
diff --git a/src/dummy_data/paxel.geojson b/src/dummy_data/paxel.geojson
deleted file mode 100644
index 9140641..0000000
--- a/src/dummy_data/paxel.geojson
+++ /dev/null
@@ -1,101 +0,0 @@
-{
- "type": "FeatureCollection",
- "totalFeatures": "unknown",
- "features": [
- {
- "type": "Feature",
- "id": "paxel_area_code_20210426.5083",
- "geometry": {
- "type": "MultiPolygon",
- "coordinates": [
- [
- [
- [
- 106.522270001261,
- -6.66321000044036
- ],
- [
- 106.536260000699,
- -6.66382999935416
- ],
- [
- 106.556582195013,
- -6.68497003983464
- ],
- [
- 106.541310000657,
- -6.71486999865072
- ],
- [
- 106.542630000375,
- -6.74058999942815
- ],
- [
- 106.550740756582,
- -6.7473471734325
- ],
- [
- 106.533284161136,
- -6.75148465469226
- ],
- [
- 106.524773753407,
- -6.76232523192311
- ],
- [
- 106.498398062322,
- -6.75218427058684
- ],
- [
- 106.46682763259,
- -6.75104031405846
- ],
- [
- 106.459021692598,
- -6.73381922767441
- ],
- [
- 106.481760000125,
- -6.72494999944212
- ],
- [
- 106.504030000085,
- -6.70412999979885
- ],
- [
- 106.51431934866,
- -6.65951255475977
- ],
- [
- 106.522270001261,
- -6.66321000044036
- ]
- ]
- ]
- ]
- },
- "geometry_name": "the_geom",
- "properties": {
- "fid": 37287,
- "desa": "MALASARI",
- "provinsi": "JAWA BARAT",
- "kabkot": "BOGOR",
- "kecamatan": "NANGGUNG",
- "post_code": null,
- "city_code": "",
- "ph_code": "",
- "locker_cod": "",
- "area_code": "",
- "id": 37287,
- "cluster_area_code": "",
- "service_ty": null
- }
- }
- ],
- "crs": {
- "type": "name",
- "properties": {
- "name": "urn:ogc:def:crs:EPSG::4326"
- }
- }
-}
\ No newline at end of file
diff --git a/src/dummy_data/route.json b/src/dummy_data/route.json
deleted file mode 100644
index 9bb8756..0000000
--- a/src/dummy_data/route.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "routes": [
- {
- "geometry": "hldhx@lnau`BCG_EaC??cFjAwDjF??uBlKMd@}@z@??aC^yk@z_@se@b[wFdE??wFfE}NfIoGxB_I\\gG}@eHoCyTmPqGaBaHOoD\\??yVrGotA|N??o[N_STiwAtEmHGeHcAkiA}^aMyBiHOkFNoI`CcVvM??gG^gF_@iJwC??eCcA]OoL}DwFyCaCgCcCwDcGwHsSoX??wI_EkUFmq@hBiOqBgTwS??iYse@gYq\\cp@ce@{vA}s@csJqaE}{@iRaqE{lBeRoIwd@_T{]_Ngn@{PmhEwaA{SeF_u@kQuyAw]wQeEgtAsZ}LiCarAkVwI}D??_}RcjEinPspDwSqCgs@sPua@_OkXaMeT_Nwk@ob@gV}TiYs[uTwXoNmT{Uyb@wNg]{Nqa@oDgNeJu_@_G}YsFw]kDuZyDmm@i_@uyIJe~@jCg|@nGiv@zUi_BfNqaAvIow@dEed@dCcf@r@qz@Egs@{Acu@mCum@yIey@gGig@cK_m@aSku@qRil@we@{mAeTej@}Tkz@cLgr@aHko@qOmcEaJw~C{w@kai@qBchBq@kmBS{kDnBscBnFu_Dbc@_~QHeU`IuyDrC_}@bByp@fCyoA?qMbD}{AIkeAgBk_A_A{UsDke@gFej@qH{o@qGgb@qH{`@mMgm@uQus@kL{_@yOmd@ymBgwE}x@ouBwtA__DuhEgaKuWct@gp@cnBii@mlBa_@}|Asj@qrCg^eaC}L{dAaJ_aAiOyjByH{nAuYu`GsAwXyn@ywMyOyqD{_@cfIcDe}@y@aeBJmwA`CkiAbFkhBlTgdDdPyiB`W}xDnSa}DbJyhCrXitAhT}x@bE}Z_@qW_Kwv@qKaaAiBgXvIm}A~JovAxCqW~WanB`XewBbK{_A`K}fBvAmi@xBycBeCauBoF}}@qJioAww@gjHaPopA_NurAyJku@uGmi@cDs[eRaiBkQstAsQkcByNmaCsK_uBcJgbEw@gkB_@ypEqDoqSm@eZcDwjBoGw`BoMegBaU_`Ce_@_uBqb@ytBwkFqiT_fAqfEwe@mfCka@_eC_UmlB}MmaBeWkkDeHwqAoX}~DcBsZmLcxBqOwqE_DkyAuJmrJ\\o~CfIewG|YibQxBssB?es@qGciA}RorAoVajA_nAodD{[y`AgPqp@mKwr@ms@umEaW{dAmb@umAw|@ojBwzDaaJsmBwbEgdCsrFqhAihDquAi`Fux@}_Dui@_eB_u@guCuyAuiHukA_lKszAu|OmaA{wKm}@clHs_A_rEahCssKo\\sgBsSglAqk@yvDcS_wAyTwpBmPc|BwZknFoFscB_GsaDiZmyMyLgtHgQonHqT{hKaPg}Dqq@m~Hym@c`EuiBudIabB{hF{pWifx@snAw`GkFyVqf@y~BkoAi}Lel@wtc@}`@oaXi_C}pZsi@eqGsSuqJ|Lqeb@e]kgPcaAu}SkDwzGhn@gjYh\\qlNZovJieBqja@ed@siO{[ol\\kCmjMe\\isHorCmec@uLebB}EqiBaCg}@m@qwHrT_vFps@kkI`uAszIrpHuzYxx@e{Crw@kpDhN{wBtQarDy@knFgP_yCu\\wyCwyA{kHo~@omEoYmoDaEcPiuAosDagD}rO{{AsyEihCayFilLaiUqm@_bAumFo}DgqA_uByi@swC~AkzDlhA}xEvcBa}Cxk@ql@`rAo|@~bBq{@``Bye@djDww@z_C_cAtn@ye@nfC_eC|gGahH~s@w}@``Fi~FpnAooC|u@wlEaEedRlYkrPvKerBfYs}Arg@m}AtrCkzElw@gjBbh@woBhR{gCwGkgCc[wtCuOapAcFoh@uBy[yBgr@c@iq@o@wvEv@sp@`FajBfCaq@fIipAdy@ewJlUc`ExGuaBdEmbBpBssArAuqBBg}@s@g{AkB{bBif@_bYmC}r@kDgm@sPq_BuJ_s@{X_{AsK_d@eM{d@wVgx@oWcu@??aDmOkNia@wFoSmDyMyCkPiBePwAob@XcQ|@oNdCoSfFwXhEmOnLi\\lbAulB`X_d@|k@au@bc@oc@bqC}{BhwDgcD`l@ed@??bL{G|a@eTje@oS~]cLr~Bgh@|b@}Jv}EieAlv@sPluD{z@nzA_]`|KchCtd@sPvb@wSb{@ko@f`RooQ~e[upZbuIolI|gFafFzu@iq@nMmJ|OeJn^{Qjh@yQhc@uJ~j@iGdd@kAp~BkBxO{@|QsAfYgEtYiGd]}Jpd@wRhVoNzNeK`j@ce@vgK}cJnSoSzQkVvUm^rSgc@`Uql@xIq\\vIgg@~kDyq[nIir@jNoq@xNwc@fYik@tk@su@neB}uBhqEesFjoGeyHtCoD|D}Ed|@ctAbIuOzqB_}D~NgY`\\um@v[gm@v{Cw`G`w@o{AdjAwzBh{C}`Gpp@ypAxn@}mAfz@{bBbNia@??jIab@`CuOlC}YnAcV`@_^m@aeB}@yk@YuTuBg^uCkZiGk\\yGeY}Lu_@oOsZiTe[uWi[sl@mo@soAauAsrBgzBqgAglAyd@ig@asAcyAklA}qAwHkGi{@s~@goAmsAyDeEirB_{B}IsJuEeFymAssAkdAmhAyTcVkFeEoKiH}l@kp@wg@sj@ku@ey@uh@kj@}EsFmG}Jk^_r@_f@m~@ym@yjA??a@cFd@kBrCgDbAUnAcBhAyAdk@et@??kF}D??OL"
- }
- ]
-}
\ No newline at end of file
diff --git a/src/dummy_data/route2.json b/src/dummy_data/route2.json
deleted file mode 100644
index 7d09827..0000000
--- a/src/dummy_data/route2.json
+++ /dev/null
@@ -1,257 +0,0 @@
-{
- "geocoded_waypoints": [
- {
- "geocoder_status": "OK",
- "place_id": "ChIJT2zELKHxaS4RR5fpIKhtekA",
- "types": [
- "street_address"
- ]
- },
- {
- "geocoder_status": "OK",
- "place_id": "ChIJdbdzpG7xaS4RUCaaEC6NIOo",
- "types": [
- "street_address"
- ]
- }
- ],
- "routes": [
- {
- "bounds": {
- "northeast": {
- "lat": -6.245234399999999,
- "lng": 106.8006477
- },
- "southwest": {
- "lat": -6.2623544,
- "lng": 106.7885345
- }
- },
- "copyrights": "Map data ©2021",
- "legs": [
- {
- "distance": {
- "text": "3.0 km",
- "value": 2992
- },
- "duration": {
- "text": "9 mins",
- "value": 552
- },
- "end_address": "Jl. Melawai 5 No.172, RT.3/RW.1, Melawai, Kec. Kby. Baru, Kota Jakarta Selatan, Daerah Khusus Ibukota Jakarta 12160, Indonesia",
- "end_location": {
- "lat": -6.245234399999999,
- "lng": 106.8006477
- },
- "start_address": "Jl. Bri Radio Dalam No.34/4, RT.2/RW.15, Gandaria Utara, Kec. Kby. Baru, Kota Jakarta Selatan, Daerah Khusus Ibukota Jakarta 12140, Indonesia",
- "start_location": {
- "lat": -6.2623544,
- "lng": 106.7885345
- },
- "steps": [
- {
- "distance": {
- "text": "1.5 km",
- "value": 1495
- },
- "duration": {
- "text": "4 mins",
- "value": 221
- },
- "end_location": {
- "lat": -6.2493628,
- "lng": 106.7918222
- },
- "html_instructions": "Head north on Jl. Radio Dalam Raya toward Jl. Dwijaya Raya
Pass by Alfamart Radio Dalam 4 (on the right)
",
- "polyline": {
- "points": "tbfe@icxjSOEs@M}@K}C]m@KUKg@G[EKAQCaAO_@GGAoB[SEaCa@e@Ga@GuB]yA[{Ba@iAYkA[a@KqAi@w@WaA[KCgAYQCMAw@I}AKUCeAOQCoAUMCoAQyAQc@EcBKe@C}@IC?g@E_AG"
- },
- "start_location": {
- "lat": -6.2623544,
- "lng": 106.7885345
- },
- "travel_mode": "DRIVING"
- },
- {
- "distance": {
- "text": "0.5 km",
- "value": 532
- },
- "duration": {
- "text": "2 mins",
- "value": 99
- },
- "end_location": {
- "lat": -6.2491213,
- "lng": 106.7959681
- },
- "html_instructions": "Turn right onto Jl. Kramat Pela",
- "maneuver": "turn-right",
- "polyline": {
- "points": "nqce@{wxjSMA\\sBJm@JOBQFa@h@cC@EN_@Le@Hc@?QBQBIDQ@Q@O?UASCSAMCGEGU]QSWWQUq@q@MGQEGAKA"
- },
- "start_location": {
- "lat": -6.2493628,
- "lng": 106.7918222
- },
- "travel_mode": "DRIVING"
- },
- {
- "distance": {
- "text": "25 m",
- "value": 25
- },
- "duration": {
- "text": "1 min",
- "value": 4
- },
- "end_location": {
- "lat": -6.249124,
- "lng": 106.7961904
- },
- "html_instructions": "Turn right toward Jl. Barito II",
- "maneuver": "turn-right",
- "polyline": {
- "points": "~oce@yqyjSAK@_@"
- },
- "start_location": {
- "lat": -6.2491213,
- "lng": 106.7959681
- },
- "travel_mode": "DRIVING"
- },
- {
- "distance": {
- "text": "0.2 km",
- "value": 154
- },
- "duration": {
- "text": "1 min",
- "value": 36
- },
- "end_location": {
- "lat": -6.249612600000001,
- "lng": 106.7974484
- },
- "html_instructions": "Turn right onto Jl. Barito II",
- "maneuver": "turn-right",
- "polyline": {
- "points": "~oce@esyjS`@_@P[JSJ]DM@KH}@Bu@"
- },
- "start_location": {
- "lat": -6.249124,
- "lng": 106.7961904
- },
- "travel_mode": "DRIVING"
- },
- {
- "distance": {
- "text": "0.4 km",
- "value": 414
- },
- "duration": {
- "text": "1 min",
- "value": 77
- },
- "end_location": {
- "lat": -6.2459198,
- "lng": 106.7979545
- },
- "html_instructions": "Turn left onto Jl. Panglima Polim (signs for Senayan/Semanggi)Pass by ATM Bank UOB (on the left)
",
- "maneuver": "turn-left",
- "polyline": {
- "points": "`sce@a{yjSmBMgDUyBQGAyDW[CgAIk@E"
- },
- "start_location": {
- "lat": -6.249612600000001,
- "lng": 106.7974484
- },
- "travel_mode": "DRIVING"
- },
- {
- "distance": {
- "text": "0.2 km",
- "value": 220
- },
- "duration": {
- "text": "1 min",
- "value": 48
- },
- "end_location": {
- "lat": -6.245905899999999,
- "lng": 106.7999397
- },
- "html_instructions": "Turn right onto Jl. Melawai RayaPass by MM Juice Melawai (on the right)
",
- "maneuver": "turn-right",
- "polyline": {
- "points": "~{be@e~yjS?SAq@?S?A?]Cg@AKD_F"
- },
- "start_location": {
- "lat": -6.2459198,
- "lng": 106.7979545
- },
- "travel_mode": "DRIVING"
- },
- {
- "distance": {
- "text": "74 m",
- "value": 74
- },
- "duration": {
- "text": "1 min",
- "value": 33
- },
- "end_location": {
- "lat": -6.2452361,
- "lng": 106.7999455
- },
- "html_instructions": "Turn left after HAZEL Brew Coffee (on the right)",
- "maneuver": "turn-left",
- "polyline": {
- "points": "|{be@sjzjSO?C?_@?qAA"
- },
- "start_location": {
- "lat": -6.245905899999999,
- "lng": 106.7999397
- },
- "travel_mode": "DRIVING"
- },
- {
- "distance": {
- "text": "78 m",
- "value": 78
- },
- "duration": {
- "text": "1 min",
- "value": 34
- },
- "end_location": {
- "lat": -6.245234399999999,
- "lng": 106.8006477
- },
- "html_instructions": "Turn right onto Jl. Melawai 9Destination will be on the left
",
- "maneuver": "turn-right",
- "polyline": {
- "points": "vwbe@ujzjSAkC"
- },
- "start_location": {
- "lat": -6.2452361,
- "lng": 106.7999455
- },
- "travel_mode": "DRIVING"
- }
- ],
- "traffic_speed_entry": [],
- "via_waypoint": []
- }
- ],
- "overview_polyline": {
- "points": "tbfe@icxjScAS{Ei@m@KUKcAM_C]mGeAgAOoEy@eE{@mBg@iCaAmA_@yA]eAKsBOwAS}AYiDc@kF_@yBOh@aDJOBQFa@h@cCPe@ViABc@H[Ba@Ai@Ea@IOg@q@i@m@q@q@MGYGKAAK@_@`@_@\\o@Pk@JiABu@mBMaHg@eHg@k@E?SAeAEsAD_FO?c@?qAAAkC"
- },
- "summary": "Jl. Radio Dalam Raya",
- "warnings": [],
- "waypoint_order": []
- }
- ],
- "status": "OK"
-}
\ No newline at end of file
diff --git a/src/dummy_data/route3.geojson b/src/dummy_data/route3.geojson
deleted file mode 100644
index 9304824..0000000
--- a/src/dummy_data/route3.geojson
+++ /dev/null
@@ -1,259 +0,0 @@
-{
- "type": "FeatureCollection",
- "features": [
- {
- "id": "sales.1",
- "geometry_name": "the_geom",
- "type": "Feature",
- "properties": {
- "id": "sales.1",
- "name": "Sales 1"
- },
- "geometry": {
- "type": "LineString",
- "coordinates": [
- [
- 106.78853,
- -6.26235
- ],
- [
- 106.78863,
- -6.26201
- ],
- [
- 106.78884,
- -6.26091
- ],
- [
- 106.7889,
- -6.26068
- ],
- [
- 106.78896,
- -6.26057
- ],
- [
- 106.78903,
- -6.26023
- ],
- [
- 106.78918,
- -6.25959
- ],
- [
- 106.78953,
- -6.25824
- ],
- [
- 106.78961,
- -6.25788
- ],
- [
- 106.7899,
- -6.25684
- ],
- [
- 106.7902,
- -6.25585
- ],
- [
- 106.7904,
- -6.2553
- ],
- [
- 106.79073,
- -6.25461
- ],
- [
- 106.79089,
- -6.25422
- ],
- [
- 106.79104,
- -6.25377
- ],
- [
- 106.7911,
- -6.25342
- ],
- [
- 106.79118,
- -6.25284
- ],
- [
- 106.79128,
- -6.2524
- ],
- [
- 106.79141,
- -6.25193
- ],
- [
- 106.79159,
- -6.25108
- ],
- [
- 106.79175,
- -6.2499
- ],
- [
- 106.79183,
- -6.24929
- ],
- [
- 106.79264,
- -6.2495
- ],
- [
- 106.79272,
- -6.24956
- ],
- [
- 106.79281,
- -6.24958
- ],
- [
- 106.79298,
- -6.24962
- ],
- [
- 106.79364,
- -6.24983
- ],
- [
- 106.79383,
- -6.24992
- ],
- [
- 106.7942,
- -6.25004
- ],
- [
- 106.79438,
- -6.25006
- ],
- [
- 106.79452,
- -6.25011
- ],
- [
- 106.79469,
- -6.25013
- ],
- [
- 106.7949,
- -6.25012
- ],
- [
- 106.79507,
- -6.25009
- ],
- [
- 106.79515,
- -6.25004
- ],
- [
- 106.7954,
- -6.24984
- ],
- [
- 106.79563,
- -6.24963
- ],
- [
- 106.79588,
- -6.24938
- ],
- [
- 106.79592,
- -6.24931
- ],
- [
- 106.79596,
- -6.24918
- ],
- [
- 106.79597,
- -6.24912
- ],
- [
- 106.79603,
- -6.24911
- ],
- [
- 106.79619,
- -6.24912
- ],
- [
- 106.79635,
- -6.24929
- ],
- [
- 106.79659,
- -6.24944
- ],
- [
- 106.79681,
- -6.24953
- ],
- [
- 106.79718,
- -6.24959
- ],
- [
- 106.79745,
- -6.24961
- ],
- [
- 106.79752,
- -6.24906
- ],
- [
- 106.79772,
- -6.24761
- ],
- [
- 106.79792,
- -6.24614
- ],
- [
- 106.79795,
- -6.24592
- ],
- [
- 106.79805,
- -6.24592
- ],
- [
- 106.7984,
- -6.24591
- ],
- [
- 106.79882,
- -6.24588
- ],
- [
- 106.79994,
- -6.24591
- ],
- [
- 106.79994,
- -6.24583
- ],
- [
- 106.79994,
- -6.24565
- ],
- [
- 106.79995,
- -6.24524
- ],
- [
- 106.80065,
- -6.24523
- ]
- ]
- }
- }
- ]
-}
\ No newline at end of file
diff --git a/src/dummy_data/sales.geojson b/src/dummy_data/sales.geojson
deleted file mode 100644
index c9e0832..0000000
--- a/src/dummy_data/sales.geojson
+++ /dev/null
@@ -1,85 +0,0 @@
-{
- "type": "FeatureCollection",
- "features": [
- {
- "id": "sales.1",
- "geometry_name": "the_geom",
- "type": "Feature",
- "properties": {
- "id": "sales.1",
- "name": "Sales 1"
- },
- "geometry": {
- "type": "Point",
- "coordinates": [
- 106.79569244384766,
- -6.2395378839383016
- ]
- }
- },
- {
- "id": "sales.2",
- "geometry_name": "the_geom",
- "type": "Feature",
- "properties": {
- "id": "sales.2",
- "name": "Sales 2"
- },
- "geometry": {
- "type": "Point",
- "coordinates": [
- 106.78788185119627,
- -6.2620624718682665
- ]
- }
- },
- {
- "id": "sales.3",
- "geometry_name": "the_geom",
- "type": "Feature",
- "properties": {
- "id": "sales.3",
- "name": "Sales 3"
- },
- "geometry": {
- "type": "Point",
- "coordinates": [
- 106.81011199951172,
- -6.249349850172153
- ]
- }
- },
- {
- "id": "sales.4",
- "geometry_name": "the_geom",
- "type": "Feature",
- "properties": {
- "id": "sales.4",
- "name": "Sales 4"
- },
- "geometry": {
- "type": "Point",
- "coordinates": [
- 106.81543350219727,
- -6.215817763782759
- ]
- }
- },
- {
- "id": "sales.5",
- "geometry_name": "the_geom",
- "type": "Feature",
- "properties": {
- "id": "sales.5",
- "name": "Sales 5"
- },
- "geometry": {
- "type": "Point",
- "coordinates": [
- 106.80745124816895,
- -6.2746041510497355
- ]
- }
- }
- ]
-}
\ No newline at end of file
diff --git a/src/views/Dashboard/DashboardProject.js.save b/src/views/Dashboard/DashboardProject.js.save
deleted file mode 100644
index f534d5f..0000000
--- a/src/views/Dashboard/DashboardProject.js.save
+++ /dev/null
@@ -1,1698 +0,0 @@
-import React, { useEffect, useMemo, useRef, useState } from "react";
-import axios from "axios";
-import { Row, Col, Button, Input } from "antd";
-import {
- CardDashboard,
- CardExpenditure,
- CardScheduleHealthPerDivision,
-} from "../../components/CardDashboard/CardDashboard";
-import L from "leaflet";
-import { useParams } from "react-router-dom";
-import "../../assets/css/customscroll.css";
-import moment from "moment";
-import { renderFormatRupiah } from "../../const/CustomFunc";
-import { BASE_OSPRO } from "../../const/ApiConst";
-import { SendOutlined } from "@ant-design/icons";
-import {
- NotificationContainer,
- NotificationManager,
-} from "react-notifications";
-import ContentLoader from "react-content-loader";
-import {
- BehindTaskItem,
- Comment,
- HealthByBudget,
- HealthBySchedule,
- ListLoader,
- PopupContent,
- ProgressActualBar,
- ProgressPlanningBar,
- SingleTextLoader,
-} from "./Components";
-import { Fab, Action } from "react-tiny-fab";
-import "react-tiny-fab/dist/styles.css";
-import { useHistory } from "react-router-dom";
-
-const { TextArea } = Input;
-
-const styles = {
- cardContainer: {
- backgroundColor: "#F8F8F8",
- margin: 2,
- paddingLeft: 20,
- paddingRight: 20,
- paddingTop: 10,
- },
- cardHeaderContainer: {
- display: "flex",
- flexDirection: "row",
- marginBottom: 10,
- },
- cardChartContainer: {
- position: "relative",
- height: "21vh",
- margin: "auto",
- paddingBottom: 10,
- justifyContent: "center",
- },
- cardTitle: { color: "#444444", fontSize: 16, fontWeight: "bold" },
- cardSubtitle: { color: "#888888", fontSize: 12 },
-};
-
-const center = {
- lat: -6.2,
- lng: 106.816666,
-};
-
-const DashboardProject = () => {
- const token = localStorage.getItem("token");
- const HEADER = {
- headers: {
- "Content-Type": "application/json",
- Authorization: `Bearer ${token}`,
- },
- };
- const { PROJECT_ID, GANTT_ID, SCURVE } = useParams();
- const URL_GANTT = `https://konstruksi-gantt.ospro.id17/04/2024/view-mode/index.html?base_url=${BASE_OSPRO}/api&gantt_id=${GANTT_ID}&proyek_id=${PROJECT_ID}&token=${token}&ro=1`;
- const mapRef = useRef();
- const [projectName, setProjectName] = useState("");
- const [projectManagerName, setProjectManagerName] = useState("");
- const [customerName, setCustomerName] = useState("");
- const [plannedStart, setPlannedStart] = useState(null);
- const [plannedFinish, setPlannedFinish] = useState(null);
- const [plannedCost, setPlannedCost] = useState(null);
- const [totalCost, setTotalCost] = useState(null);
- const [actualStart, setActualStart] = useState(null);
- const [actualFinish, setActualFinish] = useState(null);
- const [estimatedFinish, setEstimatedFinish] = useState(null);
- const [mymap, setMymap] = useState(null);
- const [activeTabIdx, setActiveTabIdx] = useState(0);
- const [activeTabCommentIdx, setActiveTabCommentIdx] = useState(0);
- const [planningProgress, setPlanningProgress] = useState(0);
- const [actualProgress, setActualProgress] = useState(0);
- const [currentBudget, setCurrentBudget] = useState(null);
- const [addCostToComplete, setAddCostToComplete] = useState(null);
- const [actualToDate, setActualToDate] = useState(null);
- const [estAtCompletion, setEstAtCompletion] = useState(null);
- const [bcwp, setBcwp] = useState(null);
- const [costDeviation, setCostDeviation] = useState(null);
- const [remToComplete, setRemToComplete] = useState(0);
- const [totalInvoice, setTotalInvoice] = useState(null);
- const [cashIn, setCashIn] = useState(null);
- const [outstandingBalance, setOutstandingBalance] = useState(null);
- const [comment, setComment] = useState("");
- const [comments, setComments] = useState([]);
- const [isReadyComments, setIsReadyComments] = useState(false);
- const [isSendingComment, setIsSendingComment] = useState(false);
- const [isReadyProjectDetail, setIsReadyProjectDetail] = useState(false);
- const [isReadySCurve, setIsReadySCurve] = useState(false);
- const [isReadyGantt, setIsReadyGantt] = useState(false);
- const [isReadyOverdueActivities, setIsReadyOverdueActivities] =
- useState(false);
- const [isReadyIntegrationInvoice, setIsReadyIntegrationInvoice] =
- useState(false);
- const [isReadyReportDistribution, setIsReadyReportDistribution] =
- useState(false);
- const [overdueActivities, setOverdueActivities] = useState([]);
- const [healthBySchedule, setHealthBySchedule] = useState("-");
- const [healthByBudget, setHealthByBudget] = useState("-");
- const [reportDistribution, setReportDistribution] = useState([]);
- const [manPower, setManPower] = useState(0);
- const [assignedHr, setAssignedHr] = useState([]);
- const [assignedHrCount, setAssignedHrCount] = useState(0);
- const [actualHrCount, setActualHrCount] = useState(0);
- const [dataGantt, setDataGantt] = useState({});
- const [dataGanttParents, setDataGanttParents] = useState({});
- const [isReadyGanttParents, setIsReadyGanttParents] = useState(false);
- const [calculationStatus, setCalculationStatus] = useState(false);
- const [isHierarchy, setIsHierarchy] = useState(false);
- let history = useHistory();
-
- useEffect(() => {
- getProjectDetail();
- getSCurve();
- getOverdueActivities();
- getReportDistribution();
- getComments();
- getGantt();
- getGanttParents();
- return () => {
- console.log("unmount RenderMap");
- };
- }, []);
-
- useEffect(() => {
- if (activeTabIdx === 1) {
- initMap();
- }
- }, [activeTabIdx]);
-
- useEffect(() => {
- async function fetchData() {
- await Promise.all([
- getManpower(),
- getAssignedHR(),
- ...(assignedHr.length > 0 ? [getActualHR()] : []),
- ]);
- }
- fetchData();
- }, []);
-
- useEffect(() => {
- let deviation = 0;
- if (plannedCost && totalCost) {
- deviation = plannedCost - totalCost;
- }
- setRemToComplete(deviation.toString());
- }, [plannedCost, totalCost]);
-
- const handleRedirect = () => {
- history.push("/projects/" + GANTT_ID + "/" + PROJECT_ID + "/gantt");
- };
-
- const getManpower = async () => {
- const url = `${BASE_OSPRO}/api/project/manpower/${PROJECT_ID}`;
- try {
- const response = await axios.get(url, HEADER);
- setManPower(response.data.totalRecord);
- } catch (error) {
- console.error("Failed to get manpower:", error);
- }
- };
-
- const getGantt = async () => {
- setIsReadyGantt(false);
- const url = `${BASE_OSPRO}/api/version-gantt/edit/${GANTT_ID}`;
- try {
- const response = await axios.get(url, HEADER);
- setDataGantt(response);
- if (response.data.data.hierarchy_ftth_id) {
- setIsHierarchy(true);
- }
- setIsReadyGantt(true);
- } catch (error) {
- console.error("Failed to get gantt data:", error);
- setIsReadyGantt(true);
- }
- };
-
- const getGanttParents = async () => {
- setIsReadyGanttParents(false);
- const url = `${BASE_OSPRO}/api/hierarchy-ftths/tree-gantt/${GANTT_ID}`;
- try {
- const response = await axios.get(url, HEADER);
- setDataGanttParents(response);
- setIsReadyGanttParents(true);
- } catch (error) {
- console.error("Failed to get gantt data:", error);
- setIsReadyGanttParents(true);
- }
- };
-
- const getAssignedHR = async () => {
- const url = `${BASE_OSPRO}/api/project/manpower/assigned/${GANTT_ID}`;
- try {
- const response = await axios.get(url, HEADER);
- const today = moment();
- const assignedList = response.data.data
- .filter((item) =>
- today.isBetween(moment(item.start_date), moment(item.end_date))
- )
- .map((item) => item.user_id);
- setAssignedHrCount(assignedList.length);
- setAssignedHr(assignedList);
- } catch (error) {
- console.error("Failed to get assigned HR:", error);
- }
- };
-
- const getActualHR = async () => {
- const dateStart = moment().startOf("day").toDate();
- const dateEnd = moment().endOf("day").toDate();
- try {
- const payload = {
- paging: { start: 0, length: -1 },
- columns: [
- {
- name: "name",
- logic_operator: "ilike",
- value: "",
- table_name: "m_users",
- },
- {
- name: "clock_in",
- logic_operator: "range",
- value: dateStart,
- value1: dateEnd,
- },
- ],
- joins: [
- {
- name: "m_users",
- column_join: "user_id",
- column_results: ["name", "ktp_number"],
- },
- ],
- orders: { columns: ["id"], ascending: false },
- };
- const url = `${BASE_OSPRO}/api/presence/search`;
- const response = await axios.post(url, payload, HEADER);
- const actualHrCount = response.data.data.filter((item) =>
- assignedHr.includes(item.user_id)
- ).length;
- setActualHrCount(actualHrCount);
- } catch (error) {
- console.error("Failed to get actual HR:", error);
- }
- };
-
- const getProjectDetail = async () => {
- setIsReadyProjectDetail(false);
- let URL = `${BASE_OSPRO}/api/project/detail/${PROJECT_ID}`;
- if (GANTT_ID) {
- URL = `${BASE_OSPRO}/api/project/detail/${PROJECT_ID}/${GANTT_ID}`;
- }
- if (SCURVE) {
- URL = `${BASE_OSPRO}/api/project/detail/${PROJECT_ID}/${GANTT_ID}/${SCURVE}`;
- }
- const result = await axios
- .get(URL, HEADER)
- .then((res) => res)
- .catch((err) => err.response);
- console.log("getProjectDetail", result);
- if (!result) {
- NotificationManager.error(`Could not connect to internet.`, "Failed");
- setIsReadyProjectDetail(true);
- return;
- }
-
- if (result.status !== 200) {
- NotificationManager.error(
- `Get project detail failed, ${result.data.message}`,
- "Failed"
- );
- setIsReadyProjectDetail(true);
- return;
- } else if (result.status == 200 && result.data.data) {
- console.log(result.data.data);
- // setComments(result.data.data);
- setProjectName(result.data.data.nama ? result.data.data.nama : "-");
- setProjectManagerName(
- result.data.data.projectManager ? result.data.data.projectManager : "-"
- );
- setCustomerName(
- result.data.data.company ? result.data.data.company : "-"
- );
- setPlannedStart(
- SCURVE
- ? result.data.data.mulai_proyek
- ? result.data.data.mulai_proyek
- : null
- : result.data.data.header?.planned_start
- ? result.data.data.header?.planned_start
- : null
- );
- setPlannedFinish(
- SCURVE
- ? result.data.data.akhir_proyek
- ? result.data.data.akhir_proyek
- : null
- : result.data.data.header?.planned_end
- ? result.data.data.header?.planned_end
- : null
- );
- setActualStart(
- result.data.data.header?.start_date
- ? result.data.data.header.start_date
- : null
- );
- setEstimatedFinish(
- result.data.data.header?.end_date
- ? result.data.data.header.end_date
- : null
- );
- setPlannedCost(
- result.data.data.rencana_biaya ? result.data.data.rencana_biaya : null
- );
- setIsReadyProjectDetail(true);
- setCalculationStatus(
- result.data.data.calculation_status
- ? result.data.data.calculation_status
- : false
- );
-
- if (
- result.data.data.kode_sortname &&
- result.data.data.kode_sortname !== ""
- ) {
- if (SCURVE) {
- getIntegrationInvoice(result.data.data.kode_sortname, result.data.data.id);
- } else {
- getIntegrationInvoice(result.data.data.kode_sortname, result.data.data.id, GANTT_ID);
- }
- }
- }
- };
-
- const getSCurve = async () => {
- setIsReadySCurve(false);
- let URL = `${BASE_OSPRO}/api/project/get-s-curve`;
- if (SCURVE && SCURVE == "1" && isHierarchy) {
- URL = `${BASE_OSPRO}/api/project/calculate-s-curve`;
- }
-
- const payload = {
- project_id: PROJECT_ID.toString(),
- gantt_id: GANTT_ID.toString(),
- period: "week",
- // "end_date": moment(new Date()).format('YYYY-MM-DD')
- };
- const result = await axios
- .post(URL, payload, HEADER)
- .then((res) => res)
- .catch((err) => err.response);
- if (!result) {
- NotificationManager.error(`Could not connect to internet.`, "Failed");
- setIsReadySCurve(true);
- return;
- }
-
- if (result.status !== 200) {
- NotificationManager.error(
- `Get S Curve failed, ${result.data.message}`,
- "Failed"
- );
- setIsReadySCurve(true);
- return;
- } else if (result.status == 200 && result.data.data) {
- let selisihProgress = 0;
- let planningProgress = 0;
- let actualProgress = 0;
- let statusHealthBySchedule = "on-schedule";
- if (
- result.data.data.length > 0 &&
- result.data.data[0].data?.budget_control
- ) {
- setCurrentBudget(
- result.data.data[0].data.budget_control.current_budget?.toString()
- );
- setActualToDate(
- result.data.data[0].data.budget_control.acwp?.toString()
- );
- setBcwp(result.data.data[0].data.budget_control.bcwp?.toString());
- // setRemToComplete(result.data.data[0].data.budget_control.rem_to_complete?.toString())
- setAddCostToComplete(
- result.data.data[0].data.budget_control.add_cost_to_complete?.toString()
- );
- setEstAtCompletion(
- result.data.data[0].data.budget_control.estimated_at_completion?.toString()
- );
- setCostDeviation(
- result.data.data[0].data.budget_control.cost_deviation?.toString()
- );
- }
- let now = new Date().toISOString().slice(0, 10);
- let dates = result.data.data[0].data?.date;
- let n = dates.findIndex(
- (element) => new Date(now) < new Date(element[0])
- );
- if (n < 0) {
- n = dates.length - 1;
- }
- if (
- result.data.data.length > 0 &&
- result.data.data[0].data?.percentagePlan &&
- result.data.data[0].data?.percentagePlan.length > 0
- ) {
- if (SCURVE && SCURVE == "1") {
- planningProgress =
- result.data.data[0].data?.percentagePlan[
- result.data.data[0].data?.percentagePlan.length - 1
- ];
- } else {
- planningProgress = result.data.data[0].data?.percentagePlan[n];
- }
- setPlanningProgress(planningProgress);
- }
- if (
- result.data.data.length > 0 &&
- result.data.data[0].data?.percentageReal &&
- result.data.data[0].data?.percentageReal.length > 0
- ) {
- actualProgress =
- result.data.data[0].data?.percentageReal[
- result.data.data[0].data?.percentageReal.length - 1
- ];
- setActualProgress(actualProgress);
- }
-
- selisihProgress = planningProgress - actualProgress;
- if (selisihProgress > 0 && selisihProgress <= 5) {
- statusHealthBySchedule = "warning";
- } else if (selisihProgress > 5) {
- statusHealthBySchedule = "danger";
- }
-
- setHealthBySchedule(statusHealthBySchedule);
- setIsReadySCurve(true);
- }
- };
-
- const getOverdueActivities = async () => {
- setIsReadyOverdueActivities(false);
- const URL = `${BASE_OSPRO}/api/project/get-overdue-activities`;
- const payload = {
- id: PROJECT_ID.toString(),
- gantt: GANTT_ID.toString(),
- scurve: SCURVE ? SCURVE.toString() : null,
- till_date: moment(new Date()).format("YYYY-MM-DD"),
- };
- const result = await axios
- .post(URL, payload, HEADER)
- .then((res) => res)
- .catch((err) => err.response);
- console.log("getOverdueActivities", result);
- if (!result) {
- NotificationManager.error(`Could not connect to internet.`, "Failed");
- setIsReadyOverdueActivities(true);
- return;
- }
-
- if (result.status !== 200) {
- NotificationManager.error(
- `Get Overdue Activities failed, ${result.data.message}`,
- "Failed"
- );
- setIsReadyOverdueActivities(true);
- return;
- } else if (result.status == 200 && result.data.data) {
- if (result.data.data.overdueActivities) {
- setOverdueActivities(result.data.data.overdueActivities);
- }
- setHealthByBudget(result.data.data.budget_health);
- setIsReadyOverdueActivities(true);
- }
- };
-
- const getIntegrationInvoice = async (kode_sortname, id, gantt_id = null) => {
- setIsReadyIntegrationInvoice(false);
- const URL = `${BASE_OSPRO}/api/project/get-integration-invoice`;
- let payload = {
- search: kode_sortname,
- id: id
- };
- if (gantt_id) {
- payload.gantt_id = gantt_id;
- }
- const result = await axios
- .post(URL, payload, HEADER)
- .then((res) => res)
- .catch((err) => err.response);
- console.log("getIntegrationInvoice", result);
- if (!result) {
- NotificationManager.error(`Could not connect to internet.`, "Failed");
- setIsReadyIntegrationInvoice(true);
- return;
- }
-
- if (result.status !== 200) {
- NotificationManager.error(
- `Get integration invoice failed, ${result.data.message}`,
- "Failed"
- );
- setIsReadyIntegrationInvoice(true);
- return;
- } else if (result.status == 200 && result.data.data) {
- if (result.data.data.data) {
- let total_invoice = result.data.data.data.total_invoice_amount;
- let cash_in = result.data.data.data.total_invoice_paid_amount;
- let total_cost = result.data.data.data.total_cost;
- let outstanding_balance = total_invoice - cash_in;
- setTotalInvoice(total_invoice ? total_invoice.toString() : null);
- setCashIn(cash_in ? cash_in.toString() : null);
- total_cost = total_cost.toString().split(".")[0];
- setTotalCost(total_cost ? total_cost.toString() : null);
- setOutstandingBalance(
- outstanding_balance ? outstanding_balance.toString() : null
- );
- }
- setIsReadyIntegrationInvoice(true);
- }
- };
-
- const getReportDistribution = async () => {
- setIsReadyReportDistribution(false);
- const URL = `${BASE_OSPRO}/api/project/get-report-distribution`;
- const payload = {
- project_id: PROJECT_ID,
- start_date: moment()
- .startOf("month")
- .subtract(1, "years")
- .format("YYYY-MM-DD"),
- end_date: moment(new Date()).subtract(1, "years").format("YYYY-MM-DD"),
- };
- const result = await axios
- .post(URL, payload, HEADER)
- .then((res) => res)
- .catch((err) => err.response);
- console.log("getReportDistribution", result);
- if (!result) {
- NotificationManager.error(`Could not connect to internet.`, "Failed");
- setIsReadyReportDistribution(true);
- return;
- }
-
- if (result.status !== 200) {
- NotificationManager.error(
- `Get report distribution failed, ${result.data.message}`,
- "Failed"
- );
- setIsReadyReportDistribution(true);
- return;
- } else if (result.status == 200 && result.data.data) {
- setReportDistribution(result.data.data);
- setIsReadyReportDistribution(true);
- }
- };
-
- const getComments = async () => {
- setIsReadyComments(false);
- const URL = `${BASE_OSPRO}/api/project-comment/search`;
- const payload = {
- columns: [
- {
- name: "project_id",
- logic_operator: "=",
- value: PROJECT_ID.toString(),
- operator: "AND",
- },
- {
- name: "gantt_id",
- logic_operator: "=",
- value: GANTT_ID.toString(),
- operator: "AND",
- },
- ],
- joins: [
- {
- name: "m_users",
- column_join: "sender_id",
- column_results: ["name", "username"],
- },
- ],
- orders: { columns: ["created_at"], ascending: false },
- paging: { start: 0, length: -1 },
- };
-
- const result = await axios
- .post(URL, payload, HEADER)
- .then((res) => res)
- .catch((err) => err.response);
- console.log("getComments", result);
- if (!result) {
- NotificationManager.error(`Could not connect to internet.`, "Failed");
- setIsReadyComments(true);
- return;
- }
-
- if (result.status !== 200) {
- NotificationManager.error(
- `Get comments failed, ${result.data.message}`,
- "Failed"
- );
- setIsReadyComments(true);
- return;
- } else if (result.status == 200 && result.data.data) {
- setComments(result.data.data);
- setIsReadyComments(true);
- }
- };
-
- const handleSendComment = async () => {
- // console.log('handleSendComment', comment);
- setIsSendingComment(true);
- if (comment === "") {
- NotificationManager.error(
- "Please leave a comment before you send it.",
- "Failed"
- );
- setIsSendingComment(false);
- return;
- }
- const URL = `${BASE_OSPRO}/api/project-comment/add`;
- const payload = {
- sender_id: localStorage.getItem("user_id"),
- project_id: PROJECT_ID,
- gantt_id: GANTT_ID,
- comment: comment,
- };
- const result = await axios
- .post(URL, payload, HEADER)
- .then((res) => res)
- .catch((err) => err.response);
-
- if (!result) {
- NotificationManager.error(`Could not connect to internet.`, "Failed");
- setIsSendingComment(false);
- return;
- }
-
- if (result.status !== 200) {
- NotificationManager.error(
- `Post comment failed, ${result.data.message}`,
- "Failed"
- );
- setIsSendingComment(false);
- return;
- } else if (result.status === 200) {
- NotificationManager.success(`Post comment success`, "Success");
- resetInputComment();
- getComments();
- }
- };
-
- const resetInputComment = () => {
- setComment("");
- setIsSendingComment(false);
- };
-
- const initMap = () => {
- let mymap = L.map("map-area", {
- center: center,
- zoom: 13,
- });
-
- setMymap(mymap);
- L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", {
- attribution:
- '© OpenStreetMap contributors',
- }).addTo(mymap);
- };
-
- useEffect(() => {
- if (mymap) {
- if (reportDistribution.length > 0) {
- reportDistribution.map((item, idx) => {
- L.marker([item.lat, item.lon])
- .addTo(mymap)
- .bindPopup(PopupContent(item));
- });
- }
- }
- }, [mymap, reportDistribution]);
-
- useEffect(() => {
- // Add event listener for receiving messages from the iframe
- window.addEventListener("message", handleIframeMessage);
-
- // Clean up the event listener on component unmount
- return () => {
- window.removeEventListener("message", handleIframeMessage);
- };
- }, []);
-
- const handleIframeMessage = (event) => {
- if (event.data && event.data.action === "getUrl") {
- const childUrl = window.location.href;
-
- // Send the URL back to the iframe
- event.source.postMessage(
- { action: "sendUrl", url: childUrl },
- event.origin
- );
- }
- };
-
- const RenderGantt = useMemo(
- () => (
-
- ),
- [activeTabIdx]
- );
-
- const RenderComments = useMemo(() => {
- return (
- <>
-
-
- {!isReadyComments &&
}
- {isReadyComments && comments && comments.length < 1 && (
-
- No comments found.
-
- )}
- {comments &&
- comments.length > 0 &&
- comments.map((item, idx) => (
-
- ))}
-
- >
- );
- }, [comment, comments, isSendingComment, isReadyComments]);
-
- const RenderBehindTasks = useMemo(() => {
- return (
-
- {!isReadyOverdueActivities &&
}
- {isReadyOverdueActivities &&
- overdueActivities &&
- overdueActivities.length < 1 && (
-
- No overdue activity found.
-
- )}
- {isReadyOverdueActivities &&
- overdueActivities &&
- overdueActivities.length > 0 &&
- overdueActivities.map((item, idx) => {
- let end_date;
- let planned_end;
- let diffDays = 0;
- let message = "";
- if (item.end_date && item.end_date !== null) {
- end_date = moment(item.end_date);
- planned_end = moment(item.planned_end);
- diffDays = end_date.diff(planned_end, "days");
- if (isNaN(diffDays)) {
- return null;
- } else {
- if (diffDays > 0) {
- message = `Overdue by ${diffDays + 1} days`;
- } else {
- return null;
- }
- }
- }
- return (
-
- );
- })}
-
- );
- }, [overdueActivities, isReadyOverdueActivities]);
-
- return (
-
-
-
-
-
-
-
-
-
-
- Project
-
-
- {isReadyProjectDetail &&
- isReadyGanttParents &&
- isReadyGantt ? (
- (() => {
- let parentNames = "";
- for (
- let i = dataGanttParents.data.data.length - 1;
- i >= 0;
- i--
- ) {
- parentNames += " - ";
- parentNames += dataGanttParents.data.data[i].name;
- }
- return SCURVE && SCURVE == "1"
- ? projectName
- ? calculationStatus
- ? projectName + " - S-Curve Ready"
- : projectName + " - S-Curve Loading"
- : null
- : projectName +
- parentNames +
- " - " +
- dataGantt.data.data.name_version;
- })()
- ) : (
-
- )}
-
-
-
-
-
-
-
-
-
-
-
-
-
- Project Manager
-
-
- {isReadyProjectDetail ? (
- projectManagerName
- ) : (
-
- )}
-
-
-
-
-
-
-
-
-
-
-
-
-
- Customer
-
-
- {isReadyProjectDetail ? (
- customerName
- ) : (
-
- )}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Planned Start
-
-
- {isReadyProjectDetail ? (
- plannedStart ? (
- moment(plannedStart).format("D MMMM YYYY")
- ) : (
- "-"
- )
- ) : (
-
- )}
-
-
-
-
-
- Actual Start
-
-
- {isReadyProjectDetail ? (
- actualStart ? (
- moment(actualStart).format("D MMMM YYYY")
- ) : (
- "-"
- )
- ) : (
-
- )}
-
-
-
-
-
- Planned Finish
-
-
- {isReadyProjectDetail ? (
- plannedFinish ? (
- moment(plannedFinish).format("D MMMM YYYY")
- ) : (
- "-"
- )
- ) : (
-
- )}
-
-
-
-
-
- Estimated Finish
-
-
- {isReadyProjectDetail ? (
- estimatedFinish ? (
- moment(estimatedFinish).format("D MMMM YYYY")
- ) : (
- "-"
- )
- ) : (
-
- )}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Current Budget
-
-
- {isReadyProjectDetail ? (
- plannedCost ? (
- renderFormatRupiah(plannedCost, "Rp.")
- ) : (
- "-"
- )
- ) : (
-
- )}
-
-
-
- Add Cost to Complete
-
-
- {isReadyGantt ? (
- dataGantt.data.data.cost_to_complete ? (
- renderFormatRupiah(
- dataGantt.data.data.cost_to_complete.toString(),
- "Rp."
- )
- ) : (
- "-"
- )
- ) : (
-
- )}
-
-
-
-
-
- Actual to Date
-
-
- {isReadyIntegrationInvoice ? (
- totalCost ? (
- renderFormatRupiah(totalCost, "Rp.")
- ) : (
- "-"
- )
- ) : (
-
- )}
-
-
-
- Est. at Completion
-
-
- {isReadyProjectDetail && isReadyGantt ? (
- dataGantt.data.data.cost_to_complete ? (
- renderFormatRupiah(
- (parseInt(plannedCost) + dataGantt.data.data.cost_to_complete).toString(),
- "Rp."
- )
- ) : (
- renderFormatRupiah(
- parseInt(plannedCost).toString(),
- "Rp."
- )
- )
- ) : (
-
- )}
-
-
-
-
-
- BCWP (cost vs perform)
-
-
- {isReadySCurve ? (
- bcwp ? (
- renderFormatRupiah(bcwp, "Rp.")
- ) : (
- "-"
- )
- ) : (
-
- )}
-
-
-
- Cost Deviation
-
-
- {isReadyProjectDetail && isReadyGantt ? (
- dataGantt.data.data.cost_to_complete ? (
- renderFormatRupiah(
- (dataGantt.data.data.cost_to_complete).toString(),
- "Rp."
- )
- ) : (
- "Rp. 0"
- )
- ) : (
-
- )}
-
-
-
-
-
- Rem. to Complete
-
-
- {isReadyProjectDetail && isReadyIntegrationInvoice ? (
- remToComplete ? (
- renderFormatRupiah(remToComplete, "Rp.")
- ) : (
- "-"
- )
- ) : (
-
- )}
-
-
-
- Committed Cost
-
-
- {isReadyGantt ? (
- dataGantt.data.data.committed_cost ? (
- renderFormatRupiah(
- dataGantt.data.data.committed_cost.toString(),
- "Rp."
- )
- ) : (
- "-"
- )
- ) : (
-
- )}
-
-
-
-
-
-
-
-
-
-
- setActiveTabIdx(0)}
- >
- S Curve
-
-
-
- setActiveTabIdx(1)}
- >
- Maps
-
-
-
-
-
-
- {/* { activeTabIdx === 0 &&
{RenderGantt}
}
- { activeTabIdx === 1 &&
} */}
-
- {RenderGantt}
-
- {activeTabIdx === 1 && (
-
- )}
-
-
-
-
-
-
-
-
-
-
-
- Progress
-
- {isReadySCurve ? (
-
100 ? 100 : planningProgress}
- />
- ) : (
-
- )}
-
- {isReadySCurve ? (
- 100
- ? parseFloat(
- (actualProgress / planningProgress) * 100
- ).toFixed(2)
- : actualProgress
- }
- />
- ) : (
-
- )}
-
-
-
-
-
-
- {isReadyOverdueActivities && (
-
- )}
- {isReadySCurve && (
-
- )}
-
-
-
-
-
-
- Manpower : {manPower}
-
-
-
-
-
-
- Assigned : {assignedHrCount}
-
-
-
-
- Actual : {actualHrCount}
-
-
-
-
-
-
-
-
- {/*
Health By Schedule
-
*/}
-
- Total Invoice
-
- {isReadyIntegrationInvoice ? (
- totalInvoice ? (
- renderFormatRupiah(totalInvoice, "Rp.")
- ) : (
- "-"
- )
- ) : (
-
- )}
-
-
-
- Cash In
-
- {isReadyIntegrationInvoice ? (
- cashIn ? (
- renderFormatRupiah(cashIn, "Rp.")
- ) : (
- "-"
- )
- ) : (
-
- )}
-
-
-
-
-
-
-
-
- Outstanding Balance
-
- {isReadyIntegrationInvoice ? (
- outstandingBalance ? (
- renderFormatRupiah(outstandingBalance, "Rp.")
- ) : (
- "-"
- )
- ) : (
-
- )}
-
-
-
-
-
-
-
-
- {/*
-
setActiveTabCommentIdx(0)}>Behind Task
-
setActiveTabCommentIdx(1)}>Comment From Customer
-
*/}
-
-
- setActiveTabCommentIdx(0)}
- >
- Behind Task
-
-
-
- setActiveTabCommentIdx(1)}
- >
- Comment From Customer
-
-
-
-
- {activeTabCommentIdx === 0 && RenderBehindTasks}
- {activeTabCommentIdx === 1 && RenderComments}
-
-
-
-
-
-
-
-
- );
-};
-
-export default DashboardProject;
diff --git a/src/views/Dashboard/DashboardProject.js.save.1 b/src/views/Dashboard/DashboardProject.js.save.1
deleted file mode 100644
index 6db17c7..0000000
--- a/src/views/Dashboard/DashboardProject.js.save.1
+++ /dev/null
@@ -1,1698 +0,0 @@
-import React, { useEffect, useMemo, useRef, useState } from "react";
-import axios from "axios";
-import { Row, Col, Button, Input } from "antd";
-import {
- CardDashboard,
- CardExpenditure,
- CardScheduleHealthPerDivision,
-} from "../../components/CardDashboard/CardDashboard";
-import L from "leaflet";
-import { useParams } from "react-router-dom";
-import "../../assets/css/customscroll.css";
-import moment from "moment";
-import { renderFormatRupiah } from "../../const/CustomFunc";
-import { BASE_OSPRO } from "../../const/ApiConst";
-import { SendOutlined } from "@ant-design/icons";
-import {
- NotificationContainer,
- NotificationManager,
-} from "react-notifications";
-import ContentLoader from "react-content-loader";
-import {
- BehindTaskItem,
- Comment,
- HealthByBudget,
- HealthBySchedule,
- ListLoader,
- PopupContent,
- ProgressActualBar,
- ProgressPlanningBar,
- SingleTextLoader,
-} from "./Components";
-import { Fab, Action } from "react-tiny-fab";
-import "react-tiny-fab/dist/styles.css";
-import { useHistory } from "react-router-dom";
-
-const { TextArea } = Input;
-
-const styles = {
- cardContainer: {
- backgroundColor: "#F8F8F8",
- margin: 2,
- paddingLeft: 20,
- paddingRight: 20,
- paddingTop: 10,
- },
- cardHeaderContainer: {
- display: "flex",
- flexDirection: "row",
- marginBottom: 10,
- },
- cardChartContainer: {
- position: "relative",
- height: "21vh",
- margin: "auto",
- paddingBottom: 10,
- justifyContent: "center",
- },
- cardTitle: { color: "#444444", fontSize: 16, fontWeight: "bold" },
- cardSubtitle: { color: "#888888", fontSize: 12 },
-};
-
-const center = {
- lat: -6.2,
- lng: 106.816666,
-};
-
-const DashboardProject = () => {
- const token = localStorage.getItem("token");
- const HEADER = {
- headers: {
- "Content-Type": "application/json",
- Authorization: `Bearer ${token}`,
- },
- };
- const { PROJECT_ID, GANTT_ID, SCURVE } = useParams();
- const URL_GANTT = `17/04/2024https://konstruksi-gantt.ospro.id/view-mode/index.html?base_url=${BASE_OSPRO}/api&gantt_id=${GANTT_ID}&proyek_id=${PROJECT_ID}&token=${token}&ro=1`;
- const mapRef = useRef();
- const [projectName, setProjectName] = useState("");
- const [projectManagerName, setProjectManagerName] = useState("");
- const [customerName, setCustomerName] = useState("");
- const [plannedStart, setPlannedStart] = useState(null);
- const [plannedFinish, setPlannedFinish] = useState(null);
- const [plannedCost, setPlannedCost] = useState(null);
- const [totalCost, setTotalCost] = useState(null);
- const [actualStart, setActualStart] = useState(null);
- const [actualFinish, setActualFinish] = useState(null);
- const [estimatedFinish, setEstimatedFinish] = useState(null);
- const [mymap, setMymap] = useState(null);
- const [activeTabIdx, setActiveTabIdx] = useState(0);
- const [activeTabCommentIdx, setActiveTabCommentIdx] = useState(0);
- const [planningProgress, setPlanningProgress] = useState(0);
- const [actualProgress, setActualProgress] = useState(0);
- const [currentBudget, setCurrentBudget] = useState(null);
- const [addCostToComplete, setAddCostToComplete] = useState(null);
- const [actualToDate, setActualToDate] = useState(null);
- const [estAtCompletion, setEstAtCompletion] = useState(null);
- const [bcwp, setBcwp] = useState(null);
- const [costDeviation, setCostDeviation] = useState(null);
- const [remToComplete, setRemToComplete] = useState(0);
- const [totalInvoice, setTotalInvoice] = useState(null);
- const [cashIn, setCashIn] = useState(null);
- const [outstandingBalance, setOutstandingBalance] = useState(null);
- const [comment, setComment] = useState("");
- const [comments, setComments] = useState([]);
- const [isReadyComments, setIsReadyComments] = useState(false);
- const [isSendingComment, setIsSendingComment] = useState(false);
- const [isReadyProjectDetail, setIsReadyProjectDetail] = useState(false);
- const [isReadySCurve, setIsReadySCurve] = useState(false);
- const [isReadyGantt, setIsReadyGantt] = useState(false);
- const [isReadyOverdueActivities, setIsReadyOverdueActivities] =
- useState(false);
- const [isReadyIntegrationInvoice, setIsReadyIntegrationInvoice] =
- useState(false);
- const [isReadyReportDistribution, setIsReadyReportDistribution] =
- useState(false);
- const [overdueActivities, setOverdueActivities] = useState([]);
- const [healthBySchedule, setHealthBySchedule] = useState("-");
- const [healthByBudget, setHealthByBudget] = useState("-");
- const [reportDistribution, setReportDistribution] = useState([]);
- const [manPower, setManPower] = useState(0);
- const [assignedHr, setAssignedHr] = useState([]);
- const [assignedHrCount, setAssignedHrCount] = useState(0);
- const [actualHrCount, setActualHrCount] = useState(0);
- const [dataGantt, setDataGantt] = useState({});
- const [dataGanttParents, setDataGanttParents] = useState({});
- const [isReadyGanttParents, setIsReadyGanttParents] = useState(false);
- const [calculationStatus, setCalculationStatus] = useState(false);
- const [isHierarchy, setIsHierarchy] = useState(false);
- let history = useHistory();
-
- useEffect(() => {
- getProjectDetail();
- getSCurve();
- getOverdueActivities();
- getReportDistribution();
- getComments();
- getGantt();
- getGanttParents();
- return () => {
- console.log("unmount RenderMap");
- };
- }, []);
-
- useEffect(() => {
- if (activeTabIdx === 1) {
- initMap();
- }
- }, [activeTabIdx]);
-
- useEffect(() => {
- async function fetchData() {
- await Promise.all([
- getManpower(),
- getAssignedHR(),
- ...(assignedHr.length > 0 ? [getActualHR()] : []),
- ]);
- }
- fetchData();
- }, []);
-
- useEffect(() => {
- let deviation = 0;
- if (plannedCost && totalCost) {
- deviation = plannedCost - totalCost;
- }
- setRemToComplete(deviation.toString());
- }, [plannedCost, totalCost]);
-
- const handleRedirect = () => {
- history.push("/projects/" + GANTT_ID + "/" + PROJECT_ID + "/gantt");
- };
-
- const getManpower = async () => {
- const url = `${BASE_OSPRO}/api/project/manpower/${PROJECT_ID}`;
- try {
- const response = await axios.get(url, HEADER);
- setManPower(response.data.totalRecord);
- } catch (error) {
- console.error("Failed to get manpower:", error);
- }
- };
-
- const getGantt = async () => {
- setIsReadyGantt(false);
- const url = `${BASE_OSPRO}/api/version-gantt/edit/${GANTT_ID}`;
- try {
- const response = await axios.get(url, HEADER);
- setDataGantt(response);
- if (response.data.data.hierarchy_ftth_id) {
- setIsHierarchy(true);
- }
- setIsReadyGantt(true);
- } catch (error) {
- console.error("Failed to get gantt data:", error);
- setIsReadyGantt(true);
- }
- };
-
- const getGanttParents = async () => {
- setIsReadyGanttParents(false);
- const url = `${BASE_OSPRO}/api/hierarchy-ftths/tree-gantt/${GANTT_ID}`;
- try {
- const response = await axios.get(url, HEADER);
- setDataGanttParents(response);
- setIsReadyGanttParents(true);
- } catch (error) {
- console.error("Failed to get gantt data:", error);
- setIsReadyGanttParents(true);
- }
- };
-
- const getAssignedHR = async () => {
- const url = `${BASE_OSPRO}/api/project/manpower/assigned/${GANTT_ID}`;
- try {
- const response = await axios.get(url, HEADER);
- const today = moment();
- const assignedList = response.data.data
- .filter((item) =>
- today.isBetween(moment(item.start_date), moment(item.end_date))
- )
- .map((item) => item.user_id);
- setAssignedHrCount(assignedList.length);
- setAssignedHr(assignedList);
- } catch (error) {
- console.error("Failed to get assigned HR:", error);
- }
- };
-
- const getActualHR = async () => {
- const dateStart = moment().startOf("day").toDate();
- const dateEnd = moment().endOf("day").toDate();
- try {
- const payload = {
- paging: { start: 0, length: -1 },
- columns: [
- {
- name: "name",
- logic_operator: "ilike",
- value: "",
- table_name: "m_users",
- },
- {
- name: "clock_in",
- logic_operator: "range",
- value: dateStart,
- value1: dateEnd,
- },
- ],
- joins: [
- {
- name: "m_users",
- column_join: "user_id",
- column_results: ["name", "ktp_number"],
- },
- ],
- orders: { columns: ["id"], ascending: false },
- };
- const url = `${BASE_OSPRO}/api/presence/search`;
- const response = await axios.post(url, payload, HEADER);
- const actualHrCount = response.data.data.filter((item) =>
- assignedHr.includes(item.user_id)
- ).length;
- setActualHrCount(actualHrCount);
- } catch (error) {
- console.error("Failed to get actual HR:", error);
- }
- };
-
- const getProjectDetail = async () => {
- setIsReadyProjectDetail(false);
- let URL = `${BASE_OSPRO}/api/project/detail/${PROJECT_ID}`;
- if (GANTT_ID) {
- URL = `${BASE_OSPRO}/api/project/detail/${PROJECT_ID}/${GANTT_ID}`;
- }
- if (SCURVE) {
- URL = `${BASE_OSPRO}/api/project/detail/${PROJECT_ID}/${GANTT_ID}/${SCURVE}`;
- }
- const result = await axios
- .get(URL, HEADER)
- .then((res) => res)
- .catch((err) => err.response);
- console.log("getProjectDetail", result);
- if (!result) {
- NotificationManager.error(`Could not connect to internet.`, "Failed");
- setIsReadyProjectDetail(true);
- return;
- }
-
- if (result.status !== 200) {
- NotificationManager.error(
- `Get project detail failed, ${result.data.message}`,
- "Failed"
- );
- setIsReadyProjectDetail(true);
- return;
- } else if (result.status == 200 && result.data.data) {
- console.log(result.data.data);
- // setComments(result.data.data);
- setProjectName(result.data.data.nama ? result.data.data.nama : "-");
- setProjectManagerName(
- result.data.data.projectManager ? result.data.data.projectManager : "-"
- );
- setCustomerName(
- result.data.data.company ? result.data.data.company : "-"
- );
- setPlannedStart(
- SCURVE
- ? result.data.data.mulai_proyek
- ? result.data.data.mulai_proyek
- : null
- : result.data.data.header?.planned_start
- ? result.data.data.header?.planned_start
- : null
- );
- setPlannedFinish(
- SCURVE
- ? result.data.data.akhir_proyek
- ? result.data.data.akhir_proyek
- : null
- : result.data.data.header?.planned_end
- ? result.data.data.header?.planned_end
- : null
- );
- setActualStart(
- result.data.data.header?.start_date
- ? result.data.data.header.start_date
- : null
- );
- setEstimatedFinish(
- result.data.data.header?.end_date
- ? result.data.data.header.end_date
- : null
- );
- setPlannedCost(
- result.data.data.rencana_biaya ? result.data.data.rencana_biaya : null
- );
- setIsReadyProjectDetail(true);
- setCalculationStatus(
- result.data.data.calculation_status
- ? result.data.data.calculation_status
- : false
- );
-
- if (
- result.data.data.kode_sortname &&
- result.data.data.kode_sortname !== ""
- ) {
- if (SCURVE) {
- getIntegrationInvoice(result.data.data.kode_sortname, result.data.data.id);
- } else {
- getIntegrationInvoice(result.data.data.kode_sortname, result.data.data.id, GANTT_ID);
- }
- }
- }
- };
-
- const getSCurve = async () => {
- setIsReadySCurve(false);
- let URL = `${BASE_OSPRO}/api/project/get-s-curve`;
- if (SCURVE && SCURVE == "1" && isHierarchy) {
- URL = `${BASE_OSPRO}/api/project/calculate-s-curve`;
- }
-
- const payload = {
- project_id: PROJECT_ID.toString(),
- gantt_id: GANTT_ID.toString(),
- period: "week",
- // "end_date": moment(new Date()).format('YYYY-MM-DD')
- };
- const result = await axios
- .post(URL, payload, HEADER)
- .then((res) => res)
- .catch((err) => err.response);
- if (!result) {
- NotificationManager.error(`Could not connect to internet.`, "Failed");
- setIsReadySCurve(true);
- return;
- }
-
- if (result.status !== 200) {
- NotificationManager.error(
- `Get S Curve failed, ${result.data.message}`,
- "Failed"
- );
- setIsReadySCurve(true);
- return;
- } else if (result.status == 200 && result.data.data) {
- let selisihProgress = 0;
- let planningProgress = 0;
- let actualProgress = 0;
- let statusHealthBySchedule = "on-schedule";
- if (
- result.data.data.length > 0 &&
- result.data.data[0].data?.budget_control
- ) {
- setCurrentBudget(
- result.data.data[0].data.budget_control.current_budget?.toString()
- );
- setActualToDate(
- result.data.data[0].data.budget_control.acwp?.toString()
- );
- setBcwp(result.data.data[0].data.budget_control.bcwp?.toString());
- // setRemToComplete(result.data.data[0].data.budget_control.rem_to_complete?.toString())
- setAddCostToComplete(
- result.data.data[0].data.budget_control.add_cost_to_complete?.toString()
- );
- setEstAtCompletion(
- result.data.data[0].data.budget_control.estimated_at_completion?.toString()
- );
- setCostDeviation(
- result.data.data[0].data.budget_control.cost_deviation?.toString()
- );
- }
- let now = new Date().toISOString().slice(0, 10);
- let dates = result.data.data[0].data?.date;
- let n = dates.findIndex(
- (element) => new Date(now) < new Date(element[0])
- );
- if (n < 0) {
- n = dates.length - 1;
- }
- if (
- result.data.data.length > 0 &&
- result.data.data[0].data?.percentagePlan &&
- result.data.data[0].data?.percentagePlan.length > 0
- ) {
- if (SCURVE && SCURVE == "1") {
- planningProgress =
- result.data.data[0].data?.percentagePlan[
- result.data.data[0].data?.percentagePlan.length - 1
- ];
- } else {
- planningProgress = result.data.data[0].data?.percentagePlan[n];
- }
- setPlanningProgress(planningProgress);
- }
- if (
- result.data.data.length > 0 &&
- result.data.data[0].data?.percentageReal &&
- result.data.data[0].data?.percentageReal.length > 0
- ) {
- actualProgress =
- result.data.data[0].data?.percentageReal[
- result.data.data[0].data?.percentageReal.length - 1
- ];
- setActualProgress(actualProgress);
- }
-
- selisihProgress = planningProgress - actualProgress;
- if (selisihProgress > 0 && selisihProgress <= 5) {
- statusHealthBySchedule = "warning";
- } else if (selisihProgress > 5) {
- statusHealthBySchedule = "danger";
- }
-
- setHealthBySchedule(statusHealthBySchedule);
- setIsReadySCurve(true);
- }
- };
-
- const getOverdueActivities = async () => {
- setIsReadyOverdueActivities(false);
- const URL = `${BASE_OSPRO}/api/project/get-overdue-activities`;
- const payload = {
- id: PROJECT_ID.toString(),
- gantt: GANTT_ID.toString(),
- scurve: SCURVE ? SCURVE.toString() : null,
- till_date: moment(new Date()).format("YYYY-MM-DD"),
- };
- const result = await axios
- .post(URL, payload, HEADER)
- .then((res) => res)
- .catch((err) => err.response);
- console.log("getOverdueActivities", result);
- if (!result) {
- NotificationManager.error(`Could not connect to internet.`, "Failed");
- setIsReadyOverdueActivities(true);
- return;
- }
-
- if (result.status !== 200) {
- NotificationManager.error(
- `Get Overdue Activities failed, ${result.data.message}`,
- "Failed"
- );
- setIsReadyOverdueActivities(true);
- return;
- } else if (result.status == 200 && result.data.data) {
- if (result.data.data.overdueActivities) {
- setOverdueActivities(result.data.data.overdueActivities);
- }
- setHealthByBudget(result.data.data.budget_health);
- setIsReadyOverdueActivities(true);
- }
- };
-
- const getIntegrationInvoice = async (kode_sortname, id, gantt_id = null) => {
- setIsReadyIntegrationInvoice(false);
- const URL = `${BASE_OSPRO}/api/project/get-integration-invoice`;
- let payload = {
- search: kode_sortname,
- id: id
- };
- if (gantt_id) {
- payload.gantt_id = gantt_id;
- }
- const result = await axios
- .post(URL, payload, HEADER)
- .then((res) => res)
- .catch((err) => err.response);
- console.log("getIntegrationInvoice", result);
- if (!result) {
- NotificationManager.error(`Could not connect to internet.`, "Failed");
- setIsReadyIntegrationInvoice(true);
- return;
- }
-
- if (result.status !== 200) {
- NotificationManager.error(
- `Get integration invoice failed, ${result.data.message}`,
- "Failed"
- );
- setIsReadyIntegrationInvoice(true);
- return;
- } else if (result.status == 200 && result.data.data) {
- if (result.data.data.data) {
- let total_invoice = result.data.data.data.total_invoice_amount;
- let cash_in = result.data.data.data.total_invoice_paid_amount;
- let total_cost = result.data.data.data.total_cost;
- let outstanding_balance = total_invoice - cash_in;
- setTotalInvoice(total_invoice ? total_invoice.toString() : null);
- setCashIn(cash_in ? cash_in.toString() : null);
- total_cost = total_cost.toString().split(".")[0];
- setTotalCost(total_cost ? total_cost.toString() : null);
- setOutstandingBalance(
- outstanding_balance ? outstanding_balance.toString() : null
- );
- }
- setIsReadyIntegrationInvoice(true);
- }
- };
-
- const getReportDistribution = async () => {
- setIsReadyReportDistribution(false);
- const URL = `${BASE_OSPRO}/api/project/get-report-distribution`;
- const payload = {
- project_id: PROJECT_ID,
- start_date: moment()
- .startOf("month")
- .subtract(1, "years")
- .format("YYYY-MM-DD"),
- end_date: moment(new Date()).subtract(1, "years").format("YYYY-MM-DD"),
- };
- const result = await axios
- .post(URL, payload, HEADER)
- .then((res) => res)
- .catch((err) => err.response);
- console.log("getReportDistribution", result);
- if (!result) {
- NotificationManager.error(`Could not connect to internet.`, "Failed");
- setIsReadyReportDistribution(true);
- return;
- }
-
- if (result.status !== 200) {
- NotificationManager.error(
- `Get report distribution failed, ${result.data.message}`,
- "Failed"
- );
- setIsReadyReportDistribution(true);
- return;
- } else if (result.status == 200 && result.data.data) {
- setReportDistribution(result.data.data);
- setIsReadyReportDistribution(true);
- }
- };
-
- const getComments = async () => {
- setIsReadyComments(false);
- const URL = `${BASE_OSPRO}/api/project-comment/search`;
- const payload = {
- columns: [
- {
- name: "project_id",
- logic_operator: "=",
- value: PROJECT_ID.toString(),
- operator: "AND",
- },
- {
- name: "gantt_id",
- logic_operator: "=",
- value: GANTT_ID.toString(),
- operator: "AND",
- },
- ],
- joins: [
- {
- name: "m_users",
- column_join: "sender_id",
- column_results: ["name", "username"],
- },
- ],
- orders: { columns: ["created_at"], ascending: false },
- paging: { start: 0, length: -1 },
- };
-
- const result = await axios
- .post(URL, payload, HEADER)
- .then((res) => res)
- .catch((err) => err.response);
- console.log("getComments", result);
- if (!result) {
- NotificationManager.error(`Could not connect to internet.`, "Failed");
- setIsReadyComments(true);
- return;
- }
-
- if (result.status !== 200) {
- NotificationManager.error(
- `Get comments failed, ${result.data.message}`,
- "Failed"
- );
- setIsReadyComments(true);
- return;
- } else if (result.status == 200 && result.data.data) {
- setComments(result.data.data);
- setIsReadyComments(true);
- }
- };
-
- const handleSendComment = async () => {
- // console.log('handleSendComment', comment);
- setIsSendingComment(true);
- if (comment === "") {
- NotificationManager.error(
- "Please leave a comment before you send it.",
- "Failed"
- );
- setIsSendingComment(false);
- return;
- }
- const URL = `${BASE_OSPRO}/api/project-comment/add`;
- const payload = {
- sender_id: localStorage.getItem("user_id"),
- project_id: PROJECT_ID,
- gantt_id: GANTT_ID,
- comment: comment,
- };
- const result = await axios
- .post(URL, payload, HEADER)
- .then((res) => res)
- .catch((err) => err.response);
-
- if (!result) {
- NotificationManager.error(`Could not connect to internet.`, "Failed");
- setIsSendingComment(false);
- return;
- }
-
- if (result.status !== 200) {
- NotificationManager.error(
- `Post comment failed, ${result.data.message}`,
- "Failed"
- );
- setIsSendingComment(false);
- return;
- } else if (result.status === 200) {
- NotificationManager.success(`Post comment success`, "Success");
- resetInputComment();
- getComments();
- }
- };
-
- const resetInputComment = () => {
- setComment("");
- setIsSendingComment(false);
- };
-
- const initMap = () => {
- let mymap = L.map("map-area", {
- center: center,
- zoom: 13,
- });
-
- setMymap(mymap);
- L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", {
- attribution:
- '© OpenStreetMap contributors',
- }).addTo(mymap);
- };
-
- useEffect(() => {
- if (mymap) {
- if (reportDistribution.length > 0) {
- reportDistribution.map((item, idx) => {
- L.marker([item.lat, item.lon])
- .addTo(mymap)
- .bindPopup(PopupContent(item));
- });
- }
- }
- }, [mymap, reportDistribution]);
-
- useEffect(() => {
- // Add event listener for receiving messages from the iframe
- window.addEventListener("message", handleIframeMessage);
-
- // Clean up the event listener on component unmount
- return () => {
- window.removeEventListener("message", handleIframeMessage);
- };
- }, []);
-
- const handleIframeMessage = (event) => {
- if (event.data && event.data.action === "getUrl") {
- const childUrl = window.location.href;
-
- // Send the URL back to the iframe
- event.source.postMessage(
- { action: "sendUrl", url: childUrl },
- event.origin
- );
- }
- };
-
- const RenderGantt = useMemo(
- () => (
-
- ),
- [activeTabIdx]
- );
-
- const RenderComments = useMemo(() => {
- return (
- <>
-
-
- {!isReadyComments &&
}
- {isReadyComments && comments && comments.length < 1 && (
-
- No comments found.
-
- )}
- {comments &&
- comments.length > 0 &&
- comments.map((item, idx) => (
-
- ))}
-
- >
- );
- }, [comment, comments, isSendingComment, isReadyComments]);
-
- const RenderBehindTasks = useMemo(() => {
- return (
-
- {!isReadyOverdueActivities &&
}
- {isReadyOverdueActivities &&
- overdueActivities &&
- overdueActivities.length < 1 && (
-
- No overdue activity found.
-
- )}
- {isReadyOverdueActivities &&
- overdueActivities &&
- overdueActivities.length > 0 &&
- overdueActivities.map((item, idx) => {
- let end_date;
- let planned_end;
- let diffDays = 0;
- let message = "";
- if (item.end_date && item.end_date !== null) {
- end_date = moment(item.end_date);
- planned_end = moment(item.planned_end);
- diffDays = end_date.diff(planned_end, "days");
- if (isNaN(diffDays)) {
- return null;
- } else {
- if (diffDays > 0) {
- message = `Overdue by ${diffDays + 1} days`;
- } else {
- return null;
- }
- }
- }
- return (
-
- );
- })}
-
- );
- }, [overdueActivities, isReadyOverdueActivities]);
-
- return (
-
-
-
-
-
-
-
-
-
-
- Project
-
-
- {isReadyProjectDetail &&
- isReadyGanttParents &&
- isReadyGantt ? (
- (() => {
- let parentNames = "";
- for (
- let i = dataGanttParents.data.data.length - 1;
- i >= 0;
- i--
- ) {
- parentNames += " - ";
- parentNames += dataGanttParents.data.data[i].name;
- }
- return SCURVE && SCURVE == "1"
- ? projectName
- ? calculationStatus
- ? projectName + " - S-Curve Ready"
- : projectName + " - S-Curve Loading"
- : null
- : projectName +
- parentNames +
- " - " +
- dataGantt.data.data.name_version;
- })()
- ) : (
-
- )}
-
-
-
-
-
-
-
-
-
-
-
-
-
- Project Manager
-
-
- {isReadyProjectDetail ? (
- projectManagerName
- ) : (
-
- )}
-
-
-
-
-
-
-
-
-
-
-
-
-
- Customer
-
-
- {isReadyProjectDetail ? (
- customerName
- ) : (
-
- )}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Planned Start
-
-
- {isReadyProjectDetail ? (
- plannedStart ? (
- moment(plannedStart).format("D MMMM YYYY")
- ) : (
- "-"
- )
- ) : (
-
- )}
-
-
-
-
-
- Actual Start
-
-
- {isReadyProjectDetail ? (
- actualStart ? (
- moment(actualStart).format("D MMMM YYYY")
- ) : (
- "-"
- )
- ) : (
-
- )}
-
-
-
-
-
- Planned Finish
-
-
- {isReadyProjectDetail ? (
- plannedFinish ? (
- moment(plannedFinish).format("D MMMM YYYY")
- ) : (
- "-"
- )
- ) : (
-
- )}
-
-
-
-
-
- Estimated Finish
-
-
- {isReadyProjectDetail ? (
- estimatedFinish ? (
- moment(estimatedFinish).format("D MMMM YYYY")
- ) : (
- "-"
- )
- ) : (
-
- )}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Current Budget
-
-
- {isReadyProjectDetail ? (
- plannedCost ? (
- renderFormatRupiah(plannedCost, "Rp.")
- ) : (
- "-"
- )
- ) : (
-
- )}
-
-
-
- Add Cost to Complete
-
-
- {isReadyGantt ? (
- dataGantt.data.data.cost_to_complete ? (
- renderFormatRupiah(
- dataGantt.data.data.cost_to_complete.toString(),
- "Rp."
- )
- ) : (
- "-"
- )
- ) : (
-
- )}
-
-
-
-
-
- Actual to Date
-
-
- {isReadyIntegrationInvoice ? (
- totalCost ? (
- renderFormatRupiah(totalCost, "Rp.")
- ) : (
- "-"
- )
- ) : (
-
- )}
-
-
-
- Est. at Completion
-
-
- {isReadyProjectDetail && isReadyGantt ? (
- dataGantt.data.data.cost_to_complete ? (
- renderFormatRupiah(
- (parseInt(plannedCost) + dataGantt.data.data.cost_to_complete).toString(),
- "Rp."
- )
- ) : (
- renderFormatRupiah(
- parseInt(plannedCost).toString(),
- "Rp."
- )
- )
- ) : (
-
- )}
-
-
-
-
-
- BCWP (cost vs perform)
-
-
- {isReadySCurve ? (
- bcwp ? (
- renderFormatRupiah(bcwp, "Rp.")
- ) : (
- "-"
- )
- ) : (
-
- )}
-
-
-
- Cost Deviation
-
-
- {isReadyProjectDetail && isReadyGantt ? (
- dataGantt.data.data.cost_to_complete ? (
- renderFormatRupiah(
- (dataGantt.data.data.cost_to_complete).toString(),
- "Rp."
- )
- ) : (
- "Rp. 0"
- )
- ) : (
-
- )}
-
-
-
-
-
- Rem. to Complete
-
-
- {isReadyProjectDetail && isReadyIntegrationInvoice ? (
- remToComplete ? (
- renderFormatRupiah(remToComplete, "Rp.")
- ) : (
- "-"
- )
- ) : (
-
- )}
-
-
-
- Committed Cost
-
-
- {isReadyGantt ? (
- dataGantt.data.data.committed_cost ? (
- renderFormatRupiah(
- dataGantt.data.data.committed_cost.toString(),
- "Rp."
- )
- ) : (
- "-"
- )
- ) : (
-
- )}
-
-
-
-
-
-
-
-
-
-
- setActiveTabIdx(0)}
- >
- S Curve
-
-
-
- setActiveTabIdx(1)}
- >
- Maps
-
-
-
-
-
-
- {/* { activeTabIdx === 0 &&
{RenderGantt}
}
- { activeTabIdx === 1 &&
} */}
-
- {RenderGantt}
-
- {activeTabIdx === 1 && (
-
- )}
-
-
-
-
-
-
-
-
-
-
-
- Progress
-
- {isReadySCurve ? (
-
100 ? 100 : planningProgress}
- />
- ) : (
-
- )}
-
- {isReadySCurve ? (
- 100
- ? parseFloat(
- (actualProgress / planningProgress) * 100
- ).toFixed(2)
- : actualProgress
- }
- />
- ) : (
-
- )}
-
-
-
-
-
-
- {isReadyOverdueActivities && (
-
- )}
- {isReadySCurve && (
-
- )}
-
-
-
-
-
-
- Manpower : {manPower}
-
-
-
-
-
-
- Assigned : {assignedHrCount}
-
-
-
-
- Actual : {actualHrCount}
-
-
-
-
-
-
-
-
- {/*
Health By Schedule
-
*/}
-
- Total Invoice
-
- {isReadyIntegrationInvoice ? (
- totalInvoice ? (
- renderFormatRupiah(totalInvoice, "Rp.")
- ) : (
- "-"
- )
- ) : (
-
- )}
-
-
-
- Cash In
-
- {isReadyIntegrationInvoice ? (
- cashIn ? (
- renderFormatRupiah(cashIn, "Rp.")
- ) : (
- "-"
- )
- ) : (
-
- )}
-
-
-
-
-
-
-
-
- Outstanding Balance
-
- {isReadyIntegrationInvoice ? (
- outstandingBalance ? (
- renderFormatRupiah(outstandingBalance, "Rp.")
- ) : (
- "-"
- )
- ) : (
-
- )}
-
-
-
-
-
-
-
-
- {/*
-
setActiveTabCommentIdx(0)}>Behind Task
-
setActiveTabCommentIdx(1)}>Comment From Customer
-
*/}
-
-
- setActiveTabCommentIdx(0)}
- >
- Behind Task
-
-
-
- setActiveTabCommentIdx(1)}
- >
- Comment From Customer
-
-
-
-
- {activeTabCommentIdx === 0 && RenderBehindTasks}
- {activeTabCommentIdx === 1 && RenderComments}
-
-
-
-
-
-
-
-
- );
-};
-
-export default DashboardProject;
diff --git a/src/views/DashboardProject/chatDashboard.js b/src/views/DashboardProject/chatDashboard.js
deleted file mode 100644
index b45bcdd..0000000
--- a/src/views/DashboardProject/chatDashboard.js
+++ /dev/null
@@ -1,37 +0,0 @@
-import React from 'react';
-const ChatDashboard = (props) => {
- const { dataParams } = props;
-
- const renderComment = (items) => {
- return items.map((item, idx) => {
- return (
-
-
-
- {item.comment_by}
-
-
- {item.comment}
-
-
- {item.comment_created}
-
-
-
- )
- })
- }
-
-
- return (
-
-
-
- {renderComment(dataParams)}
-
-
- );
-}
-export default ChatDashboard;
\ No newline at end of file
diff --git a/src/views/DashboardProject/ganttDashboard.js b/src/views/DashboardProject/ganttDashboard.js
deleted file mode 100644
index 49eb582..0000000
--- a/src/views/DashboardProject/ganttDashboard.js
+++ /dev/null
@@ -1,34 +0,0 @@
-import React, { useEffect, useMemo, useState } from 'react';
-import Timeline from 'react-calendar-timeline'
-// make sure you include the timeline stylesheet or the timeline will not be styled
-import 'react-calendar-timeline/lib/Timeline.css'
-import { useParams } from 'react-router-dom';
-// import moment from 'moment';
-// import { USER_VERSION_GANTT_SEARCH, BASE_SIMPRO_LUMEN } from '../../../const/ApiConst';
-// import axios from "../../../const/interceptorApi"
-const token = localStorage.getItem("token")
-
-const Gantt = (props) => {
-const { ID } = useParams();
-const { GANTTID } = useParams();
-const url = `https://konstruksi-gantt.ospro.id/view-mode/index.html?base_url=${BASE_OSPRO}/api&gantt_id=${GANTT_ID}&proyek_id=${PROJECT_ID}&token=${token}&ro=1`
-
- const RenderGantt = () => (
-
- )
- return (
-
-
-
- );
-}
-export default Gantt;
diff --git a/src/views/DashboardProject/index.js b/src/views/DashboardProject/index.js
deleted file mode 100644
index 0aa5b31..0000000
--- a/src/views/DashboardProject/index.js
+++ /dev/null
@@ -1,275 +0,0 @@
-import React, { useEffect, useState } from 'react';
-import { Row, Col, Select, Divider } from 'antd';
-import moment from 'moment'
-import Gantt from './ganttDashboard';
-import ChatDashboard from './chatDashboard';
-import axios from 'axios'
-import { NotificationContainer, NotificationManager } from 'react-notifications';
-import { useParams } from 'react-router-dom';
-import { Badge } from 'reactstrap';
-import { BASE_OSPRO, BASE_INTEGRATION_V1, TOKEN_ADW } from '../../const/ApiConst';
-import {formatRibuanDecimal} from "../../const/CustomFunc";
-import ProgressBar from "./progressBar";
-import numeral from 'numeral';
-
-function BoxDashboard({ value, title, secondaryTitle, icon, bgColor }) {
- return (
-
- )
-}
-
-function RenderHealthProject({params}){
- if (params == "on-budget") {
- return (On Budget)
- } else if (params == "warning") {
- return (Warning)
- } else {
- return (Danger)
- }
-}
-
-const DashboardProject = () => {
-
- const { ID } = useParams();
- const [STATUSPROJECT, SET_STATUSPROJECT] = useState([])
- const [PROJECTMGR, SET_PROJECTMGR] = useState([])
- const [RO, SET_RO] = useState([])
- // Schedule
- const [STARTDATE, SET_STARTDATE] = useState([])
- const [BASELINEFINISHDATE, SET_BASELINEFINISHDATE] = useState([])
- const [ESTFINISHDATE, SET_ESTFINISHDATE] = useState([])
- // Financials
- const [BCWP, SET_BCWP] = useState([])
- const [ACWP, SET_ACWP] = useState([])
- const [VARIANCE, SET_VARIANCE] = useState([])
- const [PROGRESS, SET_PROGRESS] = useState([])
- const [BUDGET, SET_BUDGET] = useState([])
- const [PROJECTNAME, SET_PROJECTNAME] = useState([])
- const [CURRENCYSYMBOL, SET_CURRENCYSYMBOL] = useState([])
- const [BUDGETHEALTH, SET_BUDGETHEALTH] = useState([])
- const [COMMENT, SET_COMMENT] = useState([])
- const [MANPOWER, SET_MANPOWER] = useState([0])
-
- const token = localStorage.getItem("token")
- const HEADER = {
- headers: {
- "Content-Type": "application/json",
- "Authorization": `Bearer ${token}`
- }
- }
-
- const HEADER_INTEGRASI = {
- headers: {
- "Content-Type": "application/json",
- "Authorization": `${TOKEN_ADW}`
- }
- }
-
- const getProjectDetail = async () => {
- const URL = `${BASE_OSPRO}/api/project/dashboard/${ID}`
- const result = await axios.get(URL, HEADER).then(res => res).catch(err => err.response)
-
- if (result.data.code !== 200) {
- NotificationManager.error(result.data.message, 'Failed');
- }
-
- if(result.data.code == 200) {
- let resData = result.data.data;
- SET_BUDGET(resData.rencana_biaya)
- SET_PROJECTMGR(resData.pm)
- SET_RO(resData.company)
- SET_PROJECTNAME(resData.name_project)
- SET_STARTDATE(resData.start)
- SET_BASELINEFINISHDATE(resData.finish)
- SET_CURRENCYSYMBOL(resData.currency_symbol)
- SET_BUDGETHEALTH(resData.budget_health)
- SET_ACWP(resData.actual_cost)
- SET_PROGRESS(resData.progress)
- SET_COMMENT(resData.comment)
- SET_MANPOWER(resData.man_power)
- getDataCostActual(resData.kode_sortname);
- }
- }
-
- const getDataCostActual = async (kode_project) => {
- const URL = `${BASE_INTEGRATION_V1}/api/project_cost?project_no=${kode_project}`
- const result = await axios.get(URL, HEADER_INTEGRASI).then(res => res).catch(err => err.response)
- if (!result.data.data) {
- NotificationManager.error('Integrasi Cost Actual Failed', 'Failed');
- }else {
- SET_ACWP(result.data.data.total_cost)
- }
-
- }
-
- useEffect(() => {
- getProjectDetail();
- }, [])
-
-
- return (
-
-
-
-
-
-
Project
-
{PROJECTNAME}
-
-
-
-
-
-
-
-
-
-
-
-
Date
-
{moment().format("DD-MM-YYYY")}
-
-
-
-
-
-
-
-
SCHEDULE
-
-
-
-
-
-
Start Date
-
{moment(STARTDATE).format("LL")}
-
-
-
-
-
-
-
-
-
-
Baseline Finish Date
-
{moment(BASELINEFINISHDATE).format("LL")}
-
-
-
-
-
-
-
-
-
-
Estimated Finish Date
-
{moment(ESTFINISHDATE).format("LL")}
-
-
-
-
-
-
-
-
-
FINANCIALS
-
-
-
-
-
-
Budget Proyek
-
{`${formatRibuanDecimal(BUDGET)}`}
-
-
-
-
-
-
-
-
-
-
Actual Cost
-
{`${formatRibuanDecimal(ACWP)}`}
-
-
-
-
-
-
-
-
-
-
Variance
-
{`${formatRibuanDecimal(BUDGET - ACWP)}`}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {/*
*/}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-}
-
-export default DashboardProject;
diff --git a/src/views/DashboardProject/progressBar.js b/src/views/DashboardProject/progressBar.js
deleted file mode 100644
index 4eb2209..0000000
--- a/src/views/DashboardProject/progressBar.js
+++ /dev/null
@@ -1,37 +0,0 @@
-import React from "react";
-
-const ProgressBar = (props) => {
- const { bgcolor, completed } = props;
-
- const containerStyles = {
- height: 25,
- width: '100%',
- backgroundColor: "#e0e0de",
- borderRadius: 50,
- margin: 0
- }
-
- const fillerStyles = {
- height: '100%',
- width: `${completed}%`,
- backgroundColor: bgcolor,
- borderRadius: 'inherit',
- textAlign: 'right'
- }
-
- const labelStyles = {
- padding: 5,
- color: 'white',
- fontWeight: 'bold'
- }
-
- return (
-
-
- {`${completed}%`}
-
-
- );
- };
-
- export default ProgressBar;
\ No newline at end of file
diff --git a/src/views/DashboardProject/tableDashboard.js b/src/views/DashboardProject/tableDashboard.js
deleted file mode 100644
index f851d20..0000000
--- a/src/views/DashboardProject/tableDashboard.js
+++ /dev/null
@@ -1,72 +0,0 @@
-import React from 'react';
-import { Table, Tag, Space } from 'antd';
-const columns = [
- {
- title: 'No',
- dataIndex: 'carNo',
- key: 'carNo',
- fixed: 'left',
- },
- {
- title: 'Description',
- dataIndex: 'description',
- key: 'description',
- width: 350
- },
- {
- title: 'Severity',
- dataIndex: 'severity',
- key: 'severity',
- render: text => {
- return text == 'low' ? LOW
:
- text == 'medium' ? MEDIUM
:
- HIGH
- },
- },
- {
- title: 'Status',
- dataIndex: 'status',
- key: 'status',
- render: text => {
- return text == 'open' ? OPEN
:
- text == 'on-progress' ? ON PROGRESS
:
- DONE
- },
- },
- {
- title: 'Assigned',
- dataIndex: 'assigned',
- key: 'assigned',
- },
- {
- title: 'Due',
- dataIndex: 'due',
- key: 'due',
- }
-];
-const data = [
- {
- key: '1',
- carNo: 'RIS001',
- description: 'Test Analyst on unplanned leave, risk to project if leave extends pas 5/20',
- severity: 'medium',
- status: 'on-progress',
- due: '05/04/2022',
- assigned: 'John Lennon'
- },
- {
- key: '2',
- carNo: 'RIS002',
- description: 'Coffee machine broken, result in extra long breaks to find coffee',
- severity: 'low',
- status: 'open',
- due: '14/011/2022',
- assigned: 'Robert William'
- },
-];
-const TableDashboard = () => {
- return (
-
- );
-}
-export default TableDashboard;
\ No newline at end of file
diff --git a/src/views/Master/MasterCountry/MasterCountry.css b/src/views/Master/MasterCountry/MasterCountry.css
deleted file mode 100644
index e69de29..0000000
diff --git a/src/views/Master/MasterCountry/MasterCountry.js b/src/views/Master/MasterCountry/MasterCountry.js
deleted file mode 100644
index 3d4b23f..0000000
--- a/src/views/Master/MasterCountry/MasterCountry.js
+++ /dev/null
@@ -1,51 +0,0 @@
-import React, { Component } from 'react'
-import DataTable from '../../../components/DataTable'
-import {API_LIST_DATA_COUNTRY, API_INSERT_DATA_COUNTRY, API_UPDATE_DATA_COUNTRY, API_DELETE_DATA_COUNTRY } from '../../../const/ApiConst.js'
-
-
-const columns = [{
- dataField: 'id',
- alias: "Id",
- showInput: false,
- type: "number",
- state: 0
-}, {
- dataField: 'country_name',
- alias: "Country Name",
- showInput: true,
- type: "text",
- state: ""
-}, {
- dataField: 'last_updated',
- alias: "Last Updated",
- showInput: false,
- type: "text",
- state: ""
-}];
-
-class MasterCountry extends Component {
- constructor(props) {
- super(props)
- this.state = {}
- }
-
- componentDidMount() {}
-
- render() {
-
- return (
-
-
-
- )
- }
-}
-
-export default MasterCountry;
\ No newline at end of file
diff --git a/src/views/Master/MasterCountry/package.json b/src/views/Master/MasterCountry/package.json
deleted file mode 100644
index e270c3c..0000000
--- a/src/views/Master/MasterCountry/package.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "name": "MasterCountry",
- "version": "0.0.0",
- "private": true,
- "main": "./MasterCountry.js"
-}
diff --git a/src/views/Master/MasterGroupSales/DialogForm.js b/src/views/Master/MasterGroupSales/DialogForm.js
deleted file mode 100644
index a2e8543..0000000
--- a/src/views/Master/MasterGroupSales/DialogForm.js
+++ /dev/null
@@ -1,156 +0,0 @@
-import React, { Component } from 'react'
-import { Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap';
-import { Col, Row, Button, Form, FormGroup, Label, Input } from 'reactstrap';
-import { NotificationContainer, NotificationManager } from 'react-notifications';
-import axios from 'axios'
-
-
-const BASE_URL = "https://oslog.id/geohr-api/";
-const formState = {
- dataTable: [],
- openDialog: false,
- name: '',
- description: '',
- id: 0,
- idData: 0,
- nameMessage: "",
-}
-
-const ERROR_NAME = "name cannot be empty"
-export default class DialogForm extends Component {
- state = {
- ...formState
- }
-
- componentDidUpdate(prevProps, prevState) {
- const { dataEdit, methodAct } = this.props
- if ((prevProps.dataEdit !== dataEdit) && (methodAct == "Edit" || methodAct == "View")) {
- this.setState({
- idData: dataEdit.id,
- name: dataEdit.name,
- description: dataEdit.description,
- })
- }
- }
-
- handleSave = async () => {
- const err = this.handleValidation();
- let url = BASE_URL + "group-sales/add"
- const { name, description, idData } = this.state
- const { methodAct } = this.props
- console.log(`methodAct`, methodAct)
- if (methodAct === "Add") {
- if (!err) {
-
- const payload = {
- name,
- description,
- }
- const result = await axios.post(url, payload)
- .then(res => res)
- .catch((error) => error.response);
- console.log(`result`, result)
- if (result.data.message === "OK") {
- this.props.closeDialog()
- this.setState({
- ...formState,
- })
- NotificationManager.success('Data group sales berhasil ditambahkan!!', 'Success!!');
- } else {
- NotificationManager.error(result.data.message);
- }
- }
- } else if (methodAct === "Edit") {
- if (!err) {
- let urlEdit = BASE_URL + `group-sales/${idData}/edit`;
- const payload = {
- name,
- description,
- }
-
- const result = await axios.put(urlEdit, payload)
- .then(res => res)
- .catch((error) => error.response);
- console.log(`result edit`, result)
-
- if (result.data.message === "OK") {
- this.props.closeDialog()
- this.setState({
- ...formState,
- })
- NotificationManager.success('Data group sales berhasil diedit!!', 'Success!!');
- } else {
- NotificationManager.error(result.data.message);
- }
- }
- }
-
- }
-
- handleCancel = () => {
- this.props.closeDialog()
- this.setState({
- ...formState
- })
- }
-
- handleValidation = () => {
- const { name } = this.state
- let isError = false;
- const errors = {
- nameMessage: "",
- }
- if (name === "") {
- isError = true
- errors.nameMessage = ERROR_NAME
- }
- this.setState({
- nameMessage: "",
- ...errors,
- });
-
- return isError;
- }
-
- renderForm = () => {
- const { name, description, nameMessage } = this.state
- return (
-
-
-
-
- this.setState({
- name: e.target.value,
- nameMessage: e.target.value !== "" ? "" : ERROR_NAME
- })} placeholder="name" invalid={nameMessage} />
-
-
-
-
-
- this.setState({ description: e.target.value })} placeholder="description " />
-
-
-
- )
- }
-
- render() {
- const { openDialog, closeDialog, methodAct } = this.props
- return (
-
- {methodAct} Group Sales
-
-
-
-
- {' '}
-
-
-
- )
- }
-}
diff --git a/src/views/Master/MasterGroupSales/index.js b/src/views/Master/MasterGroupSales/index.js
deleted file mode 100644
index c43565c..0000000
--- a/src/views/Master/MasterGroupSales/index.js
+++ /dev/null
@@ -1,291 +0,0 @@
-import React, { Component } from 'react';
-import { Card, CardBody, CardHeader, Col, Row, Table, Input, InputGroupButtonDropdown, DropdownToggle, DropdownItem, DropdownMenu, InputGroup } from 'reactstrap';
-import BootstrapTable from 'react-bootstrap-table-next';
-import { Button } from 'reactstrap';
-import axios from 'axios';
-import SweetAlert from 'react-bootstrap-sweetalert';
-import DialogForm from './DialogForm';
-import paginationFactory from 'react-bootstrap-table2-paginator';
-import { NotificationContainer, NotificationManager } from 'react-notifications';
-import ToolkitProvider, { Search } from 'react-bootstrap-table2-toolkit';
-import { Pagination } from 'antd';
-import { Tooltip } from 'reactstrap';
-
-const BASE_URL = "https://oslog.id/geohr-api/";
-
-const { SearchBar } = Search;
-
-const NoDataIndication = () => (
-
-);
-
-const column = [
- { name: "Name" },
- { name: "Description" },
-]
-
-const LENGTH_DATA = 10
-export default class index extends Component {
- constructor(props) {
- super(props)
- this.state = {
- data: [],
- openDialog: false,
- typeDialog: 'Save',
- dataEdit: null,
- alertDelete: false,
- idDelete: 0,
- search: "",
- alert: false,
- methodAct: "Add",
- page: 0,
- totalPage: 0,
- rowsPerPage: LENGTH_DATA,
- currentPage: 1,
- splitButtonOpen: false,
- searchDetail: "All",
- searchDetailField: "name",
- tooltipDelete: false,
- tooltipEdit: false
- }
- }
-
- async componentDidMount() {
- const { page, rowsPerPage } = this.state
- this.getDataGroupSales(page, rowsPerPage);
- }
- async componentDidUpdate(prevProps, prevState) {
- const { search, rowsPerPage, page } = this.state
-
- if (page !== prevState.page) {
- this.getDataGroupSales(page, rowsPerPage)
- }
-
- if (rowsPerPage !== prevState.rowsPerPage) {
- this.getDataGroupSales(0, rowsPerPage)
- this.setState({ page: 0 })
- }
-
- if (search !== prevState.search) {
- this.getDataGroupSales(0, rowsPerPage)
- this.setState({ page: 0 })
- }
- };
-
- handleSearch = e => {
- const value = e.target.value
- this.setState({ search: value, page: 0 })
- };
-
-
- getDataGroupSales = async (start, length) => {
- const { search, rowsPerPage, searchDetail, searchDetailField } = this.state
- let url = BASE_URL + "group-sales/search";
- const obj = {
- "paging": { "start": start, "length": length },
- ...searchDetail === "All" &&
- {
- "filter_columns": [
- { "name": "name", "value": search.toString() },
- { "name": "description", "value": search.toString() },
- ],
- },
- ...searchDetail !== "All" &&
- {
- "columns": [
- { "name": searchDetailField, "logic_operator": "ilike", "operator": "and", "value": search.toString() }
- ]
- },
- "orders": { "columns": ["created_date"], "ascending": false }
- }
-
- const result = await axios
- .post(url, obj)
- .then(res => res)
- .catch((error) => error.response);
- if (result.data.message == "OK") {
- console.log(`result data`, result.data.data)
- this.setState({ data: result.data.data, totalPage: result.data.totalRecord });
- } else {
- NotificationManager.error('Failed retreiving data!!', 'Failed');
- }
- }
-
-
-
- handleOpenDialog = () => {
- this.setState({ openDialog: true, methodAct: "Add" })
- }
-
- handleCloseDialog = () => {
- this.setState({ openDialog: false })
- this.getDataGroupSales()
- }
-
-
- handleEditData = (data) => {
- this.setState({ dataEdit: data, openDialog: true, methodAct: "Edit" })
- }
-
-
- onDelete = (id) => {
- this.setState({
- alertDelete: true,
- idDelete: id
- })
- }
-
- handleDeleted = async (param) => {
- const { idDelete } = this.state
-
- if (param === "delete") {
- const result = await axios.delete(`${BASE_URL}/group-sales/${idDelete}/delete`)
- .then((response) => response)
- .catch((error) => error.response)
- this.setState({
- alertDelete: false,
- alert: true
- })
- await this.getDataGroupSales()
- } else {
- this.setState({
- alertDelete: false
- })
- }
- }
-
-
- onShowSizeChange = (current, pageSize) => {
- this.setState({ rowsPerPage: pageSize })
- }
-
- onPagination = (current, pageSize) => {
- this.setState({ currentPage: current, page: (current - 1) * pageSize })
- }
-
- toggleDropDown = () => {
- this.setState(prevState => ({ splitButtonOpen: !prevState.splitButtonOpen }))
- }
-
- toggle = (param) => {
- if (param === "edit") {
- this.setState(prevState => ({ tooltipEdit: !prevState.tooltipEdit }))
- } else if (param === "delete") {
- this.setState(prevState => ({ tooltipDelete: !prevState.tooltipDelete }))
- }
- }
- render() {
- const { openDialog, data, search, alert, page, totalPage, rowsPerPage, currentPage, searchDetail, searchDetailField, splitButtonOpen, tooltipEdit, tooltipDelete } = this.state
- let noSeq = 0;
- return (
-
-
-
this.setState({ alert: false })} onCancel={() => this.setState({ alert: false })}>
- You clicked the button!
-
-
this.handleDeleted("delete")}
- onCancel={() => this.handleDeleted("cancel")}
- focusCancelBtn
- >
- Data group sales akan terhapus!!
-
-
-
-
- Group Sales
-
-
-
-
-
-
-
-
- this.setState({
- searchDetail: "All",
- searchDetailField: "name"
- })}>All
- this.setState({
- searchDetail: "Name",
- searchDetailField: "name"
- })}>Name
- this.setState({
- searchDetail: "Description",
- searchDetailField: "description"
- })}>Description
-
-
-
-
-
-
- Actions |
- {column.map((i) => {
- return (
- {i.name} |
- )
- })}
-
-
-
- {data.map((n) => {
- return (
-
-
- {/* delete */}
- this.onDelete(n.id)}>
- this.toggle("delete")}>
- Delete
-
-
- {/* edit */}
- this.handleEditData(n)}>
- this.toggle("edit")}>
- Edit
-
- {/* this.handleDetail(n)}> */}
- |
- {n.name} |
- {n.description} |
-
- )
- })}
-
-
-
-
-
-
- )
- }
-}
diff --git a/src/views/Master/MasterKaryawan/DialogForm.js b/src/views/Master/MasterKaryawan/DialogForm.js
deleted file mode 100644
index b79ae52..0000000
--- a/src/views/Master/MasterKaryawan/DialogForm.js
+++ /dev/null
@@ -1,581 +0,0 @@
-import React, { Component } from 'react'
-import { Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap';
-import { Col, Row, Button, Form, FormGroup, Label, Input, FormText } from 'reactstrap';
-import Select from 'react-select'
-import axios from 'axios';
-import moment from 'moment';
-import { DatePicker } from 'antd';
-import 'antd/dist/antd.css';
-import { BASE_URL_GEOHR_API2 } from '../../../const/ApiConst'
-import '../MasterDataStyles.css'
-import SweetAlert from 'react-bootstrap-sweetalert';
-import { NotificationContainer, NotificationManager } from 'react-notifications';
-
-
-const format = 'YYYY-MM-DD';
-let countError = 0;
-const listGender = [
- {
- "value": "L",
- "label": "Laki-laki"
- },
- {
- "value": "P",
- "label": "Perempuan"
- }]
-
- const listBlood = [
- {
- "value": "A",
- "label": "A"
- },
- {
- "value": "AB",
- "label": "AB"
- },
- {
- "value": "B",
- "label": "B"
- },
- {
- "value": "O",
- "label": "O"
- }]
-
- const API = `https://oslog.id/geohr-api`
-
-
-
-export default class DialogForm extends Component {
- constructor(props) {
- super(props)
- this.state = {
- id: 0,
- idDivision:0,
- idRoles:0,
- name:"",
- email:"",
- phoneNumber:"",
- username:"",
- password:"",
- address:"",
- birthPlace: "",
- birthDate: null,
- currentSelectGender: null,
- hobby: "",
- openDialog: false,
- isParentClick: false,
- currentSelectVal: null,
- dataDivision:[],
- listDivisionSelect:[],
- selectDisable: false,
- dataRoles:[],
- listRolesSelect:[],
- selectDisableRoles: false,
- currentSelectRoles: null,
- currentSelectBlood: null,
- selectDisableBlood: false,
- nik: "",
- files: [],
- showImg: false,
- getUrl: "",
- namePhoto: "",
- alertDelete: false,
- idDelete: 0 ,
- dataPhoto: null
-
-
- }
- }
-
- fileSelectedHandler = (e) => {
- this.setState({ files: [...this.state.files, ...e.target.files] }, () => {
- console.log('test data foto', this.state.files)
- })
- }
-
-
- async componentDidMount(){
- this.getDataRoles()
- this.props.showDialog(this.showDialog);
- }
-
- async componentDidUpdate (prevProps, prevState){
- const { dataEdit } = this.props
-
- if(this.state.isParentClick===true){
- if(this.props.typeDialog==="Edit" || this.props.typeDialog==="View"){
-
- if(dataEdit.role_id!=="" && dataEdit.role_id!==null && dataEdit.role_id!==undefined){
- this.searchRoles(dataEdit.role_id);
- }
-
- this.getUrlImagery(dataEdit.id)
-
- this.setState({
- id:dataEdit.id,
- idRoles: dataEdit.role_id,
- idDivision:dataEdit.employee_division_id,
- username:dataEdit.username || "",
- name:dataEdit.name || "",
- email:dataEdit.email || "",
- password:"",
- phoneNumber:dataEdit.phone_number || "",
- address:dataEdit.address || "",
- birthPlace: dataEdit.birth_place || "",
- birthDate: dataEdit.birth_date || null,
- currentSelectGender: dataEdit.gender ? listGender.find((x) => x.value === dataEdit.gender) : null,
- hobby: dataEdit.hobby || "",
- nik: dataEdit.ktp_number || "",
- currentSelectBlood: dataEdit.blood_type ? listBlood.find((x) => x.value === dataEdit.blood_type) : null,
- })
- }else{
- this.setState({
- id:0,
- idDivision:0,
- idRoles:0,
- name:"",
- email:"",
- password:"",
- phoneNumber:"",
- address:"",
- username:"",
- birthPlace: "",
- birthDate: null,
- currentSelectGender: null,
- hobby: "",
- currentSelectVal:null,
- currentSelectRoles:null,
- nik: "",
- currentSelectBlood: null,
- files: []
- })
- }
- this.setState({isParentClick:false});
- }
- }
-
-
-
- closeImg = () => {
- this.setState({ showImg: false })
- }
-
- getUrlImagery = async (param) => {
- const payload = {
- "paging": { "start": 0, "length": -1 },
- "columns": [
- { "name": "category", "logic_operator": "=", "value": "employee", "operator": "and" },
- { "name": "ref_id", "logic_operator": "=", "value": param.toString(), "operator": "and" }
- ],
- "orders": { "columns": ["id"], "ascending": true }
- }
- const resultUrl = await axios.post(`${API}/image/search`, payload).then(response => response).catch(err => err.response)
- this.setState({ files: resultUrl.data.data })
- console.log(`resultUrl`, resultUrl.data.data)
-
- }
-
- getDataDivision = async () => {
- countError++;
- let url = BASE_URL_GEOHR_API2+`/employee_devision.php?act=get_data`;
-
- const result = await axios
- .get(url)
- .then(res => res)
- .catch((error) => error.response );
- console.log('cek', result)
-
- if(result && result.data && result.data.code_status === 200){
- this.setState({ dataDivision:result.data.data },()=>{
- this.setDataDivision();
- })
- }else{
- if(countError<6){
- this.getDataDivision();
- }
- }
-
- }
-
- getDataRoles = async () => {
- countError++;
- let url = BASE_URL_GEOHR_API2+`/roles.php?act=get_data`;
-
- const result = await axios
- .get(url)
- .then(res => res)
- .catch((error) => error.response );
- console.log('cek', result)
-
- if(result && result.data && result.data.code_status === 200){
- this.setState({ dataRoles:result.data.data },()=>{
- this.setDataRoles();
- })
- }else{
- if(countError<6){
- this.getDataRoles();
- }
- }
- }
-
- setDataDivision = () => {
- const { dataDivision } = this.state
- const listDivision = []
- dataDivision.map((val, index)=> {
- listDivision.push({
- value:val.id,
- label:val.name
- })
- })
- this.setState({ listDivisionSelect:listDivision })
- }
-
- setDataRoles = () => {
- const { dataRoles } = this.state
- const listRoles = []
- dataRoles.map((val, index)=> {
- listRoles.push({
- value:val.id,
- label:val.name
- })
- })
- this.setState({ listRolesSelect:listRoles })
- }
-
-
- searchDivision = (id) => {
- let getIndex = this.getIndexDataDivision(id);
- let data = this.state.dataDivision[getIndex]
- this.setState({ idDivision:data.id,currentSelectVal:{value:data.id,label:data.name} })
- }
-
- getIndexDataDivision = (val) => {
- let index = this.state.dataDivision.findIndex(obj => obj.id === val);
- return index
- }
-
- searchRoles = (id) => {
- let getIndex = this.getIndexDataRoles(id);
- let data = this.state.dataRoles[getIndex]
- this.setState({ idRoles:data.id,currentSelectRoles:{value:data.id,label:data.name} })
- }
-
- getIndexDataRoles = (val) => {
- let index = this.state.dataRoles.findIndex(obj => obj.id === val);
- return index
- }
-
-
- showDialog = () => {
- this.setState({ isParentClick : true });
- }
-
- handleDeletePhoto = (data) => {
- this.setState({ alertDelete: true, dataPhoto: data }, () => {
- console.log('data photo', this.state.dataPhoto)
- });
- }
-
-
- handleSave = async () => {
- const {
- id,
- idDivision,
- username,
- name,
- email,
- password,
- address,
- phoneNumber,
- idRoles,
- birthPlace,
- birthDate,
- currentSelectGender,
- hobby,
- currentSelectBlood,
- nik,
- files,
- currentSelectRoles
- } = this.state
-
- let data = '';
- if(this.props.typeDialog==="Save"){
- data = {
- idDivision,
- username,
- name,
- email,
- password,
- address,
- phoneNumber,
- idRoles,
- birthPlace,
- birthDate,
- currentSelectGender,
- hobby,
- nik,
- currentSelectBlood,
- files,
- currentSelectRoles
- }
-
-
- this.props.closeDialog('save', data);
- }else{
- data = {
- id,
- username,
- name,
- email,
- password,
- address,
- phoneNumber,
- idDivision,
- idRoles,
- birthPlace,
- birthDate,
- currentSelectGender,
- hobby,
- nik,
- currentSelectBlood,
- currentSelectRoles
-
- }
-
- console.log('test log data', data)
-
- if (files.length > 0) {
- const formData = new FormData()
- files.map((res) => {
- if (res)
- formData.append("ref_id", id);
- formData.append("files", res);
- })
- await axios.post(`${API}/image/employee/upload`, formData).then(response => response).catch(err => err.response)
- }
-
- this.props.closeDialog('edit', data);
- }
-
-
- this.setState({ id:0,idDivision:0,currentSelectVal:null, currentSelectRoles: null, currentSelectGender: null, currentSelectBlood: null });
-
- }
-
- handleCancel = () => {
- this.setState({ id:0,currentSelectVal:null, currentSelectRoles: null, currentSelectGender: null, currentSelectBlood: null });
- this.props.closeDialog('cancel', 'none')
- }
-
- handleSelectGs = (inputValue, actionMeta) => {
- this.setState({ idDivision:inputValue.value,currentSelectVal:{ value:inputValue.value,label:inputValue.label } })
- }
-
- handleSelectRoles = (inputValue, actionMeta) => {
- this.setState({ idRoles:inputValue.value,currentSelectRoles:{ value:inputValue.value,label:inputValue.label } }, ()=> {
- console.log("test select role", this.state.currentSelectRoles)
- })
- }
-
- onConfirmDeletePhoto = async () => {
- const { id, dataPhoto } = this.state
- let url = `https://oslog.id/geohr-api/image/employee/${id}/delete?files=${dataPhoto.image}`
- let result = await axios.delete(url)
- .then(res => res)
- .catch((error) => error.response);
-
- if(result.message!==undefined){
-
- }else{
-
- }
- console.log("test data photooo", result)
-
- if (result) {
- this.getUrlImagery(id)
-
- this.setState({ dataPhoto: null, alertDelete: false })
- NotificationManager.success('Foto berhasil dihapus!!', 'Success!!');
- } else {
- this.getUrlImagery(id)
-
- this.setState({ dataPhoto: null, alertDelete: false })
- NotificationManager.error('Foto gagal dihapus!!', 'Failed!!');
- }
- }
-
-
- renderForm = () => {
- const {files} = this.state
- const {typeDialog} = this.props
- let typeRole = localStorage.getItem('role_name')
-
- return(
-
- )
- }
-
- render() {
- const {typeDialog} = this.props
- return (
-
-
-
- this.setState({ alertDelete: false, dataPhoto: null})}
- focusCancelBtn
- >
- Foto Akan Terhapus!!
-
- this.handleCancel()}>{this.props.typeDialog} Karyawan
-
- {this.renderForm()}
-
- {typeDialog !== "View" && (
-
-
- {' '}
-
-
- )}
-
- )
- }
-}
diff --git a/src/views/Master/MasterKaryawan/DialogImport.js b/src/views/Master/MasterKaryawan/DialogImport.js
deleted file mode 100644
index 261e2bb..0000000
--- a/src/views/Master/MasterKaryawan/DialogImport.js
+++ /dev/null
@@ -1,79 +0,0 @@
-import React, { Component } from 'react'
-import { Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap';
-import { Col, Row, Button, Form, FormGroup, Label, Input } from 'reactstrap';
-import moment from 'moment';
-import 'antd/dist/antd.css';
-
-export default class DialogImport extends Component {
- constructor(props) {
- super(props)
- this.state = {
- dataImport:null,
- openDialog: false,
- isParentClick: false,
- disable: false
- }
- }
-
- async componentDidMount(){
- this.props.showDialog(this.showDialog);
- }
-
- async componentDidUpdate (){
- if(this.state.isParentClick===true){
- this.setState({isParentClick:false});
- }
- }
-
-
- showDialog = () => {
- this.setState({ isParentClick : true });
- }
-
-
- handleSave = () => {
- const {
- dataImport
- } = this.state
-
-
- this.props.closeDialog('import', dataImport);
- this.setState({ dataImport:null });
- }
-
- handleCancel = () => {
- this.props.closeDialog('cancel', 'none')
- }
-
- importExcel = (e) => {
- e.preventDefault();
- let file = e.target.files[0];
- this.setState({dataImport:file});
- }
-
- renderForm = () => {
- return(
-
- )
- }
-
- render() {
- return (
-
- Import Data Karyawan
-
- {this.renderForm()}
-
-
- {' '}
-
-
-
- )
- }
-}
diff --git a/src/views/Master/MasterKaryawan/index.js b/src/views/Master/MasterKaryawan/index.js
deleted file mode 100644
index 1d08d23..0000000
--- a/src/views/Master/MasterKaryawan/index.js
+++ /dev/null
@@ -1,607 +0,0 @@
-import React, { Component } from 'react';
-import { Card, CardBody, CardHeader, Col, Row, Table, Input,InputGroup, InputGroupButtonDropdown, DropdownToggle, DropdownItem, DropdownMenu,ButtonDropdown } from 'reactstrap';
-import { Button } from 'reactstrap';
-import axios from 'axios';
-import moment from 'moment';
-import SweetAlert from 'react-bootstrap-sweetalert';
-import DialogForm from './DialogForm';
-import DialogImport from './DialogImport';
-import { NotificationContainer, NotificationManager } from 'react-notifications';
-import { Pagination } from 'antd';
-import { Tooltip } from 'reactstrap';
-import * as XLSX from 'xlsx';
-import { BASE_URL_GEOHR_API2 } from '../../../const/ApiConst'
-import { Icon, InlineIcon } from '@iconify/react';
-import eyeFilled from '@iconify/icons-ant-design/eye-filled';
-import { Link } from 'react-router-dom';
-
-const id_org = window.localStorage.getItem('id_org');
-const roleName = window.localStorage.getItem('role_name');
-
-
-
-
-
-const momentFormat = 'HH:mm';
-
-const column = [
- { name: "Organasi" },
- { name: "Nama" },
- { name: "Email" },
- { name: "Nomor Handphone" },
-]
-
-const LENGTH_DATA = 10
-
-const API = `https://oslog.id/geohr-api`
-
-
-export default class index extends Component {
- constructor(props) {
- super(props)
- this.state = {
- dataTable: [],
- finalData: [],
- openDialog: false,
- typeDialog: 'Save',
- dataEdit: null,
- alertDelete: false,
- idDelete: 0,
- dataGs: [],
- dataIdHo: [],
- search: "",
- page: 0,
- rowsPerPage: LENGTH_DATA,
- currentPage: 1,
- totalPage: 0,
- tooltipEdit: false,
- tooltipDelete: false,
- splitButtonOpen:false,
- searchDetail: "Nama",
- searchDetailField: "name",
- tooltipDetail: false,
- tooltipTambah:false,
- tooltipImport:false,
- tooltipExport:false,
- dataImport: null,
- aksiDropdown:false,
- openDialogImport:false,
- dataExport:false,
- }
- }
-
- async componentDidMount() {
- this.getDataEmployee();
- }
-
- async componentDidUpdate(prevProps, prevState) {
- const { search } = this.state
- if (search !== prevState.search) this.getDataEmployee()
- }
-
- toggleAksiDropdown = () => {
- this.setState({aksiDropdown:!this.state.aksiDropdown});
- }
-
- handleSearch = e => {
- const value = e.target.value
- this.setState({ search: value, currentPage: 1 })
- };
-
- getDataEmployee = async () => {
- let start = 0;
- if (this.state.currentPage !== 1) {
- start = (this.state.currentPage * this.state.rowsPerPage) - this.state.rowsPerPage
- }
- let url = BASE_URL_GEOHR_API2 + `/employee.php?act=get_data&start=${start}&length=${this.state.rowsPerPage}&role_name=${roleName}`;
- const formData = new FormData();
- formData.append("id_org", id_org);
- formData.append('field', this.state.searchDetailField);
- formData.append('value', this.state.search);
- const result = await axios
- .post(url,formData)
- .then(res => res)
- .catch((error) => error.response);
- if (result && result.data && result.statusText == "OK") {
- this.setState({ dataTable: result.data.data, totalPage: result.data.total_record });
- } else {
- NotificationManager.error('Failed retreiving data!!', 'Failed');
- }
- }
-
- setListIdHo = (data) => {
- let list = [];
- data.map((val, index) => {
- list.push(val.sales)
- })
- this.setState({ dataIdHo: list }, () => {
- })
- }
-
- handleOpenDialog = (type) => {
- this.setState({ openDialog: true, typeDialog: type })
- this.showChildDialog();
- }
-
- handleCloseDialog = async (type, data) => {
- let result = false;
- if (type === "save") {
- result = await this.saveEmployee(data);
- } else if (type === "edit") {
- result = await this.editEmployee(data);
- }
- else if (type === "cancel") {
- result = true;
- }
-
- if (result) {
- this.setState({ openDialog: false })
- }
- }
-
- toggleAddDialog = () => {
- this.setState({ openDialog: !this.state.openDialog })
- }
-
- onConfirmDelete = async () => {
- const { idDelete } = this.state
- let url = BASE_URL_GEOHR_API2 + `/employee.php?act=delete&id=${idDelete}`;
- let result = await axios.get(url)
- .then(res => res)
- .catch((error) => error.response);
-
- if(result.message!==undefined){
-
- }else{
-
- }
-
- if (result.data.message === "Data Has Been Deleted") {
- this.getDataEmployee()
- this.setState({ idDelete: 0, alertDelete: false })
- NotificationManager.success('Data employee berhasil dihapus!!', 'Success!!');
- } else {
- this.setState({ idDelete: 0, alertDelete: false })
- NotificationManager.error('Data employee gagal dihapus!!', 'Failed!!');
- }
- }
-
- saveEmployee = async (data) => {
- let url = BASE_URL_GEOHR_API2 + "/employee.php?act=input";
- const formData = new FormData();
- formData.append('name', data.name);
- formData.append('username', data.username);
- formData.append('phone_number', data.phoneNumber);
- formData.append('email', data.email);
- formData.append('address', data.name);
- formData.append('password', data.password);
- formData.append('birth_place', data.birthPlace);
- formData.append('birth_date', data.birthDate);
- formData.append('gender', data.currentSelectGender ? data.currentSelectGender.value : "");
- formData.append('hobby', data.hobby);
- formData.append('blood_type', data.currentSelectBlood ? data.currentSelectBlood.value: "");
- formData.append('ktp_number', data.nik);
- formData.append('role_id', data.currentSelectRoles ? data.currentSelectRoles.value: "");
-
-
-
- if(data.idRoles!==undefined && data.idRoles!==0 && data.idRoles!==null){
- formData.append('roles_id', data.idRoles);
- }
-
- let result = await axios.post(url, formData)
- .then(res => res)
- .catch((error) => error.response);
-
- if (!result) {
- return false;
- }
-
- if(result && result.message!==undefined){
- if (result.message === "Data Has Been Saved") {
- this.getDataEmployee();
- NotificationManager.success('Data employee berhasil ditambahkan!!', 'Success!!');
- return true;
- } else {
- NotificationManager.error(`${result.data.message}`, 'Failed!!');
- return false;
- }
- }else{
- if (result.data.message === "Data Has Been Saved") {
- this.getDataEmployee();
- NotificationManager.success('Data employee berhasil ditambahkan!!', 'Success!!');
- return true;
- } else {
- NotificationManager.error(`${result.data.message}`, 'Failed!!');
- return false;
- }
- }
-
- let ref_id = parseInt(result.data.data.id)
- if (ref_id) {
- if (data.files.length > 0) {
- const formData = new FormData()
- data.files.map((res) => {
- console.log('test data upload photo', res)
- if (res)
- formData.append("ref_id", ref_id);
- formData.append("files", res);
- })
- await axios.post(`${API}/image/employee/upload`, formData).then(response => response).catch(err => err.response)
- }
- }
-
-
-
- }
-
- editEmployee = async (data) => {
- let url = BASE_URL_GEOHR_API2 + `/employee.php?act=edit&id=${data.id}&role_name=${roleName}`;
- const formData = new FormData();
- formData.append('name', data.name);
- formData.append('username', data.username);
- formData.append('phone_number', data.phoneNumber);
- formData.append('email', data.email);
- formData.append('address', data.address);
- formData.append('birth_place', data.birthPlace);
- formData.append('birth_date', data.birthDate);
- formData.append('gender', data.currentSelectGender ? data.currentSelectGender.value : "");
- formData.append('hobby', data.hobby);
- formData.append('blood_type', data.currentSelectBlood ? data.currentSelectBlood.value: "");
- formData.append('role_id', data.currentSelectRoles ? data.currentSelectRoles.value: "");
-
- formData.append('ktp_number', data.nik);
-
-
- if(data.password!==""){
- formData.append('password', data.password);
- }
-
- if(data.idRoles!==undefined && data.idRoles!==0 && data.idRoles!==null){
- formData.append('role_id', data.idRoles);
- }
-
-
-
- let result = await axios.post(url, formData)
- .then(res => res)
- .catch((error) => error.response);
-
- if (!result) {
- return false;
- }
-
- if(result && result.message!==undefined){
- if (result.message === "Data Has Been Edited") {
- this.getDataEmployee();
- NotificationManager.success('Data karyawan berhasil diedit!!', 'Success!!');
- return true;
- } else {
- NotificationManager.error('Data karyawan gagal diedit!!', 'Failed!!');
- return false
- }
- }else{
- if (result.data.message === "Data Has Been Edited") {
- this.getDataEmployee();
- NotificationManager.success('Data karyawan berhasil diedit!!', 'Success!!');
- return true;
- } else {
- NotificationManager.error('Data karyawan gagal diedit!!', 'Failed!!');
- return false;
- }
- }
- }
-
-
- handleEdit = (data) => {
- this.setState({ dataEdit: data });
- this.handleOpenDialog('Edit');
- }
-
- handleDetail = (data) => {
- this.setState({ dataEdit: data })
- this.handleOpenDialog('View');
-
- }
-
- handleDelete = (id) => {
- this.setState({ alertDelete: true, idDelete: id });
- }
-
- onShowSizeChange = (current, pageSize) => {
- this.setState({ rowsPerPage: pageSize }, () => {
- this.getDataEmployee();
- })
-
- }
-
- onPagination = (current, pageSize) => {
- this.setState({ currentPage: current, page: (current - 1) * pageSize }, () => {
- this.getDataEmployee();
- })
- }
-
- toggle = (param) => {
- if (param === "edit") {
- this.setState(prevState => ({ tooltipEdit: !prevState.tooltipEdit }))
- } else if (param === "delete") {
- this.setState(prevState => ({ tooltipDelete: !prevState.tooltipDelete }))
- } else if (param === "detail") {
- this.setState(prevState => ({ tooltipDetail: !prevState.tooltipDetail }))
- } else if (param === "tambah") {
- this.setState(prevState => ({ tooltipTambah: !prevState.tooltipTambah }))
- } else if (param === "import") {
- this.setState(prevState => ({ tooltipImport : !prevState.tooltipImport }))
- } else if (param === "export") {
- this.setState(prevState => ({ tooltipExport: !prevState.tooltipExport }))
- }
-
- }
-
- toggleDropDown = () => {
- this.setState({splitButtonOpen:!this.state.splitButtonOpen})
- }
-
- handleDialogImport = () => {
- this.setState({ openDialogImport: true})
- this.showImportDialog();
- }
-
- handleCloseImport = (type, file) => {
- if(type==="import"){
- if(!file){
- NotificationManager.error('Silahkan masukan file excel!!', 'Failed!!');
- return false
- }
-
- if (/\.(xls?x)$/i.test(file.name) === false ) {
- NotificationManager.error('File yang dimasukan bukan format excel (.xsl/.xslx)!!', 'Failed!!');
- return false
- }
-
- this.importExcel(file);
-
- }else{
- this.setState({ openDialogImport:false });
- }
- }
-
- toggleImportDialog = () => {
- this.setState({ openDialogImport:!this.state.openDialogImport })
- }
-
- importExcel = async (file) => {
- const url = `${BASE_URL_GEOHR_API2}/employee.php?act=import`;
- const formData = new FormData();
- formData.append('file', file);
- const result = await axios
- .post(url, formData)
- .then((res) => res)
- .catch((error) => error.response);
-
- if(result && result.code_status){
- if (result.code_status === 200) {
- NotificationManager.success('File imported successfully', 'Success Message');
- this.getDataEmployee();
- this.setState({openDialogImport: false});
- } else {
- NotificationManager.error(result.data.message, "error message");
- }
- }else{
- NotificationManager.error("Import data karyawan gagal!!", "error message");
- }
-
- }
-
- getTemplateExcel = async (event) => {
- event.preventDefault();
- const url = `${BASE_URL_GEOHR_API2}/dok/template-import-karyawan.xlsx`;
- window.open(url, "_blank");
- };
-
-
- handleExportExcel = async () => {
- let start = 0;
- let end = "ALL";
- let url = BASE_URL_GEOHR_API2 + `/employee.php?act=get_data&start=${start}&length=${end}&role_name=${roleName}`;
- const formData = new FormData();
- formData.append('field', this.state.searchDetailField);
- formData.append('value', this.state.search);
- const result = await axios
- .post(url,formData)
- .then(res => res)
- .catch((error) => error.response);
- if (result && result.data && result.statusText == "OK") {
- const dataRes = result.data.data|| [];
- const dataExport = [];
- dataRes.map((val,index)=> {
- let row = {
- Nama:val.name,
- Organisasi:val.organization_name || "-",
- Nik:val.ktp_number,
- Username:val.username,
- Email:val.email,
- "Nomor Handphone":val.phone_number,
- "Tanggal Lahir":val.birth_date,
- "Tempat Lahir":val.birth_place,
- "Hobby":val.hobby,
- "Jenis Kelamin":val.gender,
- "Golongan Data":val.blood_type,
- }
- dataExport.push(row);
- })
- this.setState({ dataExport:dataExport },()=> {
- this.exportExcel();
- });
- } else {
- NotificationManager.error('Failed retreiving data!!', 'Failed');
- }
- }
-
- exportExcel = () => {
- const dataExcel = this.state.dataExport || [];
- const fileName = "Data Karyawan.xlsx";
- const ws = XLSX.utils.json_to_sheet(dataExcel);
- const wb = XLSX.utils.book_new();
- XLSX.utils.book_append_sheet(wb, ws, 'Data Karyawan');
-
- XLSX.writeFile(wb, fileName);
- }
-
-
- render() {
- const { tooltipTambah,tooltipImport,tooltipExport,tooltipDetail, dataTable, searchDetail, splitButtonOpen, openDialog, currentPage, rowsPerPage, totalPage, search, tooltipEdit, tooltipDelete } = this.state
- let dataTable2 = dataTable || [];
- return (
-
-
-
this.setState({ alertDelete: false, idDelete: 0 })}
- focusCancelBtn
- >
- Data karyawan akan terhapus!!
-
-
this.toggleAddDialog}
- typeDialog={this.state.typeDialog}
- dataEdit={this.state.dataEdit}
- showDialog={showDialog => this.showChildDialog = showDialog}
- dataHs={this.state.dataIdHo}
- />
- this.toggleImportDialog}
- showDialog={showDialog => this.showImportDialog = showDialog}
- />
-
-
-
-
- Karyawan
-
-
-
-
-
-
-
- this.setState({
- searchDetail: "Nama",
- searchDetailField: "name"
- })}>Nama
- this.setState({
- searchDetail: "Nomor Handphone",
- searchDetailField: "phone_number"
- })}>Nomor Handphone
- this.setState({
- searchDetail: "Email",
- searchDetailField: "email"
- })}>Email
- this.setState({
- searchDetail: "Alamat",
- searchDetailField: "address"
- })}>Alamat
-
-
-
-
-
-
- this.toggleAksiDropdown()}>
-
-
-
-
- this.handleDialogImport()}>Import Data Karyawan
- this.getTemplateExcel(e)}>Download Template
-
-
-
- this.toggle("tambah")}>
- Tambah
-
- this.toggle("import")}>
- Import Excel
-
- this.toggle("export")}>
- Export Excel
-
-
-
-
-
-
-
-
- Aksi |
- {column.map((i, index) => {
- return (
- {i.name} |
- )
- })}
-
-
-
- {dataTable2.map((n) => {
- return (
-
-
- this.handleDelete(n.id)}>
- this.toggle("delete")}>
- Hapus
-
- this.handleEdit(n)}>
- this.toggle("edit")}>
- Edit
-
- this.handleDetail(n)}>
-
-
-
-
- this.toggle("detail")}>
- Detail
-
- |
- {n.organization_name===null ? n.chairman_org || "-" : n.organization_name || "-"} |
- {n.name} |
- {n.email || "-"} |
- {n.phone_number || "-"} |
-
- )
- })}
-
-
-
-
-
-
- )
- }
-}
-
diff --git a/src/views/Master/MasterSales/DialogForm.js b/src/views/Master/MasterSales/DialogForm.js
deleted file mode 100644
index 7abc742..0000000
--- a/src/views/Master/MasterSales/DialogForm.js
+++ /dev/null
@@ -1,262 +0,0 @@
-import React, { Component } from 'react'
-import { Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap';
-import { Col, Row, Button, Form, FormGroup, Label, Input } from 'reactstrap';
-import Select from 'react-select'
-
-export default class DialogForm extends Component {
- constructor(props) {
- super(props)
- this.state = {
- openDialog: false,
- type_sales:'B2B',
- name: '',
- email: '',
- address: '',
- username: '',
- phoneNumber: '',
- password:'',
- id: 0,
- idGs:0,
- isParentClick: false,
- file: [],
- fileObj: [],
- fileArray: [],
- dataGs: [],
- currentSelectVal: null,
- }
- }
-
- async componentDidMount(){
- this.props.showDialog(this.showDialog);
- this.cekDataGs()
- }
-
- async componentDidUpdate (){
- if(this.state.isParentClick===true){
- await this.cekDataGs()
- if(this.props.typeDialog==="Edit"){
- let dataGs = this.searchGs(this.props.dataEdit.group_sales);
- this.setState({
- idGs:this.props.dataEdit.group_sales,
- id:this.props.dataEdit.id,
- name:this.props.dataEdit.name,
- type_sales:this.props.dataEdit.type_sales,
- email: this.props.dataEdit.email,
- address: this.props.dataEdit.address,
- username: this.props.dataEdit.username,
- phoneNumber: this.props.dataEdit.phone_number,
- password:this.props.dataEdit.password,
- currentSelectVal:dataGs
- })
- }else{
- this.setState({
- id:0,
- name:'',
- type_sales:'B2B',
- email: '',
- address:'',
- username: '',
- phoneNumber: '',
- password: '',
- currentSelectVal:null
- })
- }
- this.setState({isParentClick:false});
- }
- }
-
- searchGs = (idGs) => {
- let getIndex = this.getIndexDataGs(idGs);
- return this.state.dataGs[getIndex];
- }
-
- getIndexDataGs = (val) => {
- let index = this.state.dataGs.findIndex(obj => obj.value === val);
- return index
- }
-
- cekDataGs = () => {
- if(this.state.dataGs.length===0){
- let data = [];
- this.props.dataGs.map((val,index) => {
- data.push(
- {
- value: val.id,
- label: val.name
- }
- )
- });
- this.setState({ dataGs:data })
- }
- }
-
- showDialog = () => {
- this.setState({ isParentClick : true });
- }
-
-
- handleSave = () => {
- const { file, name, email, id, address, phoneNumber, password, username, idGs,type_sales } = this.state
- let data = '';
- if(this.props.typeDialog==="Save"){
- data = {
- username,
- password,
- name,
- email,
- address,
- phone_number:phoneNumber,
- group_sales:idGs,
- type_sales
- }
- this.props.closeDialog('save', data, file);
- }else{
- data = {
- id,
- username,
- password,
- name,
- email,
- address,
- phone_number:phoneNumber,
- group_sales:idGs,
- type_sales
- }
- this.props.closeDialog('edit', data, file);
- }
-
- this.setState({ id:'',username:'',password:'',name:'',email:'',address:'',phoneNumber:'',file:[],idGs:0,type_sales:'B2B',currentSelectVal:null });
-
- }
-
- handleCancel = () => {
- this.setState({ id:'',username:'',password:'',name:'',email:'',address:'',phoneNumber:'',file:[],idGs:0,type_sales:'B2B' });
- this.props.closeDialog('cancel', 'none', 'none')
- }
-
- uploadMultipleImage = (event) => {
- this.setState({ fileObj: [...this.state.fileObj, event.target.files],file: [...this.state.file, event.target.files] }, ()=> {
- this.setUrl()
- })
-
- }
-
- setUrl = () => {
- for (let i = 0; i < this.state.fileObj[0].length; i++) {
- this.setState({ fileArray: [...this.state.fileArray, URL.createObjectURL(this.state.fileObj[0][i])],fileObj:[] })
- }
- }
-
- handleSelectGs = (inputValue, actionMeta) => {
- this.setState({ idGs:inputValue.value,currentSelectVal:{ value:inputValue.value,label:inputValue.label } })
- }
-
- handleTypeSales = (e) => {
- this.setState({ type_sales:e.target.value })
- }
-
- renderForm = () => {
- return(
-
- )
- }
-
- render() {
- return (
-
- Add Sales
-
- {this.renderForm()}
-
-
- {' '}
-
-
-
- )
- }
-}
diff --git a/src/views/Master/MasterSales/SettingSales.js b/src/views/Master/MasterSales/SettingSales.js
deleted file mode 100644
index 7fe7354..0000000
--- a/src/views/Master/MasterSales/SettingSales.js
+++ /dev/null
@@ -1,347 +0,0 @@
-import React, { Component } from 'react';
-import { Card, CardBody, CardHeader, Col, Row, Table, Input, Modal, ModalHeader, ModalBody, ModalFooter, FormGroup, Label } from 'reactstrap';
-import { Button } from 'reactstrap';
-import axios from 'axios';
-import SweetAlert from 'react-bootstrap-sweetalert';
-import DialogForm from './DialogForm';
-import { NotificationContainer, NotificationManager} from 'react-notifications';
-import { Pagination } from 'antd';
-import { Icon, InlineIcon } from '@iconify/react';
-import settingOutlined from '@iconify/icons-ant-design/setting-outlined';
-import {Link} from 'react-router-dom'
-import Select from 'react-select'
-
-import { SketchPicker } from 'react-color';
-
-
-const BASE_URL = "https://oslog.id/geohr-api/";
-
-
-const column = [
- { name: "Group Sales" },
- { name: "Name" },
- { name: "Phone Number" },
- { name: "Email" },
- { name: "Address" },
-]
-
-const layerSales = [
- {
- "id": 1,
- "rule_name": "sales yang incomenya lebih dari 1000000",
- "style": {
- "fill_color": "#22194D",
- },
- "rule": {
- "column": "income",
- "operator": ">",
- "value": 1000000,
- }
-},
-{
- "id": 2,
- "rule_name": "sales yang punya nama mohammad",
- "style": {
- "fill_color": "#22194D",
- },
- "rule": {
- "column": "name",
- "operator": "like",
- "value": "mohammad"
- }
-},
-
-
-]
-
-const options = [
- { value: 'group-sales', label: 'Group Sales' },
- { value: 'name', label: 'Name' },
- { value: 'phone-number', label: 'Phone Number' },
- { value: 'email', label: 'Email' },
- { value: 'address', label: 'Address' }
-
- ]
-
- const logicOperator = [
- { value: '>', label: '>' },
- { value: '>=', label: '>=' },
- { value: '<', label: '<' },
- { value: '<=', label: '<=' },
- { value: '==', label: '==' },
- { value: '<>', label: '<>' },
- ]
-
-
-const LENGTH_DATA = 10
-export default class SettingSales extends Component {
- constructor(props) {
- super(props)
- this.state = {
- dataTable: [],
- openDialog: false,
- typeDialog: 'Save',
- dataEdit: null,
- alertDelete: false,
- idDelete: 0,
- dataGs: [],
- search: "",
- page: 0,
- rowsPerPage: LENGTH_DATA,
- currentPage: 1,
- totalPage: 0,
- layersSales: [],
- modalEdit: false,
- modalAdd: false,
- id: 0,
- fill_color: "#000",
- column: "",
- operator: "",
- value: "",
- dataEdit: null,
-
- }
- }
-
-
- async componentDidMount (){
- this.getRuleSales()
- }
-
- async componentDidUpdate (prevProps, prevState){
- const { search } = this.state
- if (search !== prevState.search) this.getRuleSales()
- }
-
- handleOpenDialog = (type) => {
- this.setState({modalEdit: true, typeDialog: type })
- this.handleSetData()
-}
-
- handleSetData = () => {
- const { dataEdit, typeDialog} = this.state
- if(typeDialog === "Edit") {
- this.setState({
- id: dataEdit.id,
- rule_name: dataEdit.rule_name,
- fill_color: dataEdit.style.fill_color,
- column: dataEdit.rule.column,
- value: dataEdit.rule.value,
- operator: dataEdit.rule.operator
-
- })
- } else {
- this.setState({
- id: 0,
- rule_name: "",
- fill_color: "#000",
- column: null,
- value:"",
- operator: null
-
- })
-
- }
-
- }
-
- handleEdit = (data) => {
- this.setState({dataEdit: data})
- this.handleOpenDialog('Edit')
- console.log('test data edit', data)
-
- }
-
- handleCancel = () => {
- this.setState({
-
- rule_name: "",
- fill_color: "#000",
- column: null,
- value:"",
- operator: null,
- modalEdit: false
- })
-
-
-
-
- }
-
- handleSave = () => {
- this.setState({
-
- rule_name: "",
- fill_color: "#000",
- column: null,
- value:"",
- operator: null,
- modalEdit: false })
-
-
- }
-
- toggleAdd = () => {
- this.setState({modalAdd: !this.state.modalAdd})
- }
-
- getRuleSales = () => {
- this.setState({layersSales: layerSales})
- }
-
- handleChangeComplete = (color, event) => {
-
- console.log('handleChangeComplete',color, event);
- this.setState({fill_color: color.hex});
- }
-
-
- render() {
- const {layersSales, modalEdit, modalAdd, search, openDialog, currentPage, rowsPerPage,totalPage, dataTable } = this.state
- let noSeq = 0;
- return (
-
- )
- }
-}
diff --git a/src/views/Master/MasterSales/index.js b/src/views/Master/MasterSales/index.js
deleted file mode 100644
index cee8bbe..0000000
--- a/src/views/Master/MasterSales/index.js
+++ /dev/null
@@ -1,399 +0,0 @@
-import React, { Component } from 'react';
-import { Card, CardBody, CardHeader, Col, Row, Table, Input, InputGroup, InputGroupButtonDropdown, DropdownToggle, DropdownItem, DropdownMenu } from 'reactstrap';
-import { Button } from 'reactstrap';
-import axios from 'axios';
-import SweetAlert from 'react-bootstrap-sweetalert';
-import DialogForm from './DialogForm';
-import { NotificationContainer, NotificationManager } from 'react-notifications';
-import { Pagination } from 'antd';
-import { Icon, InlineIcon } from '@iconify/react';
-import settingOutlined from '@iconify/icons-ant-design/setting-outlined';
-import { Link } from 'react-router-dom';
-import { Tooltip } from 'reactstrap';
-
-
-
-const BASE_URL = "https://oslog.id/geohr-api/";
-
-
-const column = [
- { name: "Group Sales" },
- { name: "Name" },
- { name: "Phone Number" },
- { name: "Email" },
- { name: "Address" },
-]
-
-const LENGTH_DATA = 10
-export default class index extends Component {
- constructor(props) {
- super(props)
- this.state = {
- dataTable: [],
- openDialog: false,
- typeDialog: 'Save',
- dataEdit: null,
- alertDelete: false,
- idDelete: 0,
- dataGs: [],
- search: "",
- page: 0,
- rowsPerPage: LENGTH_DATA,
- currentPage: 1,
- totalPage: 0,
- splitButtonOpen: false,
- dropdownOpen: false,
- searchDetail: "All",
- searchDetailField: "name",
- tooltipDelete: false,
- tooltipEdit: false
- }
- }
-
- async componentDidMount() {
- this.getDataSales();
- this.getDataGroupSales();
- }
-
- async componentDidUpdate(prevProps, prevState) {
- const { search } = this.state
- if (search !== prevState.search) this.getDataSales()
- }
-
- getDataGroupSales = async () => {
- let url = BASE_URL + "group-sales/search";
- const obj = {
- "paging": { "start": 0, "length": -1 },
- "columns": [
- {
- "name": "name",
- "logic_operator": "ilike",
- "value": "",
- "operator": "and"
- }
- ],
- "orders": { "columns": ["name"], "ascending": true }
- }
-
- const result = await axios
- .post(url, obj)
- .then(res => res)
- .catch((error) => error.response);
- if (result && result.data && result.data.message == "OK") {
- this.setState({ dataGs: result.data.data });
- } else {
- NotificationManager.error('Failed retreiving data!!', 'Failed');
- }
- }
-
-
- getDataSales = async () => {
- const { searchDetail, searchDetailField } = this.state
- let url = BASE_URL + "sales/search";
- let start = 0
- if (this.state.currentPage !== 1) {
- start = (this.state.currentPage * this.state.rowsPerPage) - this.state.rowsPerPage
- }
- const obj = {
- "paging": { "start": start, "length": this.state.rowsPerPage },
- ...searchDetail === "All" &&
- {
- "filter_columns": [
- { "name": "name", "value": this.state.search.toString() },
- { "name": "phone_number", "value": this.state.search.toString() },
- { "name": "email", "value": this.state.search.toString() },
- { "name": "address", "value": this.state.search.toString() },
- { "name": "name", "value": this.state.search.toString(), "table_name": "m_group_sales" },
- ],
- },
- ...searchDetail !== "All" && searchDetail !== "Group Sales" &&
- {
- "columns": [
- { "name": searchDetailField, "logic_operator": "ilike", "operator": "and", "value": this.state.search.toString() }
- ]
- },
- ...searchDetail === "Group Sales" &&
- {
- "columns": [
- { "name": searchDetailField, "logic_operator": "ilike", "operator": "and", "value": this.state.search.toString(), "table_name": "m_group_sales" }
- ]
- },
-
- "joins": [
- { "name": "group_sales", "column_results": ["name", "description"] }
- ],
- "orders": { "columns": ["name"], "ascending": true }
- }
-
- const result = await axios
- .post(url, obj)
- .then(res => res)
- .catch((error) => error.response);
- if (result && result.data && result.data.message == "OK") {
- this.setState({ dataTable: result.data.data, totalPage: result.data.totalRecord });
- } else {
- NotificationManager.error('Failed retreiving data!!', 'Failed');
- }
- }
-
- handleOpenDialog = (type) => {
- this.setState({ openDialog: true, typeDialog: type })
- this.showChildDialog();
- }
-
- handleCloseDialog = (type, data, files) => {
- if (type === "save") {
- this.saveSales(data, files);
- } else if (type === "edit") {
- this.editSales(data, files);
- this.uploadImage(files, data.id);
- }
-
- this.setState({ openDialog: false })
- }
-
- toggleAddDialog = () => {
- this.setState({ openDialog: !this.state.openDialog })
- }
-
- onConfirmDelete = async () => {
- const { idDelete } = this.state
- let url = BASE_URL + `sales/${idDelete}/delete`;
- const result = await axios.delete(url)
- .then(res => res)
- .catch((error) => error.response);
- if (result && result.data && result.data.message === "OK") {
- this.getDataSales()
- this.setState({ idDelete: 0, alertDelete: false })
- NotificationManager.success('Data group sales berhasil dihapus!!', 'Success!!');
- } else {
- this.setState({ idDelete: 0, alertDelete: false })
- NotificationManager.error('Data group sales galal dihapus!!', 'Failed!!');
- }
- }
-
-
- saveSales = async (obj, files) => {
- let url = BASE_URL + "sales/add";
- let data = JSON.stringify(obj);
- const result = await axios.post(url, data)
- .then(res => res)
- .catch((error) => error.response);
- if (result && result.data && result.data.message === "OK") {
- let ref_id = parseInt(result.data.data.id);
- this.uploadImage(files, ref_id);
- NotificationManager.success('Data sales berhasil ditambahkan!!', 'Success!!');
- } else {
- NotificationManager.error(`${result.data.message}`, 'Failed!!');
- }
- }
-
- editSales = async (data) => {
- let url = BASE_URL + `sales/${data.id}/edit`;
- const obj = JSON.stringify(data);
- const result = await axios.put(url, obj)
- .then(res => res)
- .catch((error) => error.response);
- if (result && result.data && result.data.message === "OK") {
- this.getDataSales();
- NotificationManager.success('Data sales berhasil diedit!!', 'Success!!');
- } else {
- NotificationManager.error('Data sales galal diedit!!', 'Failed!!');
- }
- }
-
- uploadImage = async (files, idRef) => {
- if (files.length > 0) {
- let promises = [];
- let response = [];
- let url = BASE_URL + `image/m_sales/upload`;
- files.map((val, index) => {
- let formData = new FormData();
- formData.append("ref_id", idRef);
- formData.append("files", val[0]);
- promises.push(axios.post(url, formData)
- .then(res => { response.push(res) }))
- })
- await Promise.all(promises);
- }
-
- this.getDataSales()
- }
-
- handleEdit = (data) => {
- this.setState({ dataEdit: data });
- this.handleOpenDialog('Edit');
- }
-
- handleDelete = (id) => {
- this.setState({ alertDelete: true, idDelete: id });
- }
-
- onShowSizeChange = (current, pageSize) => {
- this.setState({ rowsPerPage: pageSize }, () => {
- this.getDataSales();
- })
- }
-
- onPagination = (current, pageSize) => {
- this.setState({ currentPage: current, page: (current - 1) * pageSize }, () => {
- this.getDataSales();
- })
- }
-
- handleSearch = e => {
- const value = e.target.value
- this.setState({ search: value, currentPage: 1 })
- };
-
- toggleDropDown = () => {
- this.setState(prevState => ({ splitButtonOpen: !prevState.splitButtonOpen }))
- }
-
- toggle = (param) => {
- if (param === "edit") {
- this.setState(prevState => ({ tooltipEdit: !prevState.tooltipEdit }))
- } else if (param === "delete") {
- this.setState(prevState => ({ tooltipDelete: !prevState.tooltipDelete }))
- }
- }
-
-
-
- render() {
- const { search, openDialog, currentPage, rowsPerPage, totalPage, dataTable, splitButtonOpen, searchDetail, tooltipDelete, tooltipEdit } = this.state
- let noSeq = 0;
- return (
-
-
-
this.setState({ alertDelete: false, idDelete: 0 })}
- focusCancelBtn
- >
- Data group sales akan terhapus!!
-
-
this.toggleAddDialog}
- typeDialog={this.state.typeDialog}
- dataEdit={this.state.dataEdit}
- showDialog={showDialog => this.showChildDialog = showDialog}
- dataGs={this.state.dataGs}
- />
-
-
- Sales
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- this.setState({
- searchDetail: "All",
- searchDetailField: "name"
- })}>All
- this.setState({
- searchDetail: "Name",
- searchDetailField: "name"
- })}>Name
- this.setState({
- searchDetail: "Group Sales",
- searchDetailField: "name"
- })}>Group Sales
- this.setState({
- searchDetail: "Phone Number",
- searchDetailField: "phone_number"
- })}>Phone Number
- this.setState({
- searchDetail: "Email",
- searchDetailField: "email"
- })}>Email
- this.setState({
- searchDetail: "Address",
- searchDetailField: "address"
- })}>Address
-
-
-
-
-
-
- Actions |
- {column.map((i, index) => {
- return (
- {i.name} |
- )
- })}
-
-
-
- {dataTable.map((n) => {
- return (
-
-
- {/* delete */}
- this.handleDelete(n.id)}>
- this.toggle("delete")}>
- Delete
-
-
- {/* edit */}
- this.handleEdit(n)}>
- this.toggle("edit")}>
- Edit
-
- |
- {n.join.group_sales_name} |
- {n.name} |
- {n.phone_number} |
- {n.email} |
- {n.address} |
-
- )
- })}
-
-
-
-
-
-
- )
- }
-}
diff --git a/src/views/Master/MasterSubdistrict/MasterSubdistrict.css b/src/views/Master/MasterSubdistrict/MasterSubdistrict.css
deleted file mode 100644
index e69de29..0000000
diff --git a/src/views/Master/MasterSubdistrict/MasterSubdistrict.js b/src/views/Master/MasterSubdistrict/MasterSubdistrict.js
deleted file mode 100644
index d4a423a..0000000
--- a/src/views/Master/MasterSubdistrict/MasterSubdistrict.js
+++ /dev/null
@@ -1,50 +0,0 @@
-import React, { Component } from 'react'
-import DataTable from '../../../components/DataTable'
-import { API_LIST_DATA_SUBDISTRICT, API_INSERT_DATA_SUBDISTRICT, API_UPDATE_DATA_SUBDISTRICT, API_DELETE_DATA_SUBDISTRICT } from '../../../const/ApiConst.js'
-
-const columns = [{
- dataField: 'id',
- alias: "Id",
- showInput: false,
- type: "number",
- state: 0
- }, {
- dataField: 'subdistrict_name',
- alias: "Subdistrict Name",
- showInput: true,
- type: "text",
- state: ""
- }, {
- dataField: 'last_updated',
- alias: "Last Updated",
- showInput: false,
- type: "text",
- state: ""
- }];
-
-class MasterSubdistrict extends Component {
- constructor(props) {
- super(props)
- this.state = {}
- }
-
- componentDidMount() {}
-
- render() {
-
- return (
-
-
-
- )
- }
-}
-
-export default MasterSubdistrict;
\ No newline at end of file
diff --git a/src/views/Master/MasterSubdistrict/package.json b/src/views/Master/MasterSubdistrict/package.json
deleted file mode 100644
index 46f7fea..0000000
--- a/src/views/Master/MasterSubdistrict/package.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "name": "MasterSubdistrict",
- "version": "0.0.0",
- "private": true,
- "main": "./MasterSubdistrict.js"
-}
diff --git a/src/views/Master/MasterVillage/MasterVillage.css b/src/views/Master/MasterVillage/MasterVillage.css
deleted file mode 100644
index e69de29..0000000
diff --git a/src/views/Master/MasterVillage/MasterVillage.js b/src/views/Master/MasterVillage/MasterVillage.js
deleted file mode 100644
index c9c49e1..0000000
--- a/src/views/Master/MasterVillage/MasterVillage.js
+++ /dev/null
@@ -1,50 +0,0 @@
-import React, { Component } from 'react'
-import DataTable from '../../../components/DataTable'
-import { API_LIST_DATA_VILLAGE, API_INSERT_DATA_VILLAGE, API_UPDATE_DATA_VILLAGE, API_DELETE_DATA_VILLAGE } from '../../../const/ApiConst.js'
-
-const columns = [{
- dataField: 'id',
- alias: "Id",
- showInput: false,
- type: "number",
- state: 0
- }, {
- dataField: 'village_name',
- alias: "Village Name",
- showInput: true,
- type: "text",
- state: ""
- }, {
- dataField: 'last_updated',
- alias: "Last Updated",
- showInput: false,
- type: "text",
- state: ""
- }];
-
-class MasterVillage extends Component {
- constructor(props) {
- super(props)
- this.state = {}
- }
-
- componentDidMount() {}
-
- render() {
-
- return (
-
-
-
- )
- }
-}
-
-export default MasterVillage;
\ No newline at end of file
diff --git a/src/views/Master/MasterVillage/package.json b/src/views/Master/MasterVillage/package.json
deleted file mode 100644
index 536cadc..0000000
--- a/src/views/Master/MasterVillage/package.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "name": "MasterVillage",
- "version": "0.0.0",
- "private": true,
- "main": "./MasterVillage.js"
-}
diff --git a/src/views/Master/PlanningVsRealisasi/DialogEdit.js b/src/views/Master/PlanningVsRealisasi/DialogEdit.js
deleted file mode 100644
index 921bc71..0000000
--- a/src/views/Master/PlanningVsRealisasi/DialogEdit.js
+++ /dev/null
@@ -1,106 +0,0 @@
-import React, { Component } from 'react'
-import { Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap';
-import { Col, Row, Button, Form, FormGroup, Label, Input } from 'reactstrap';
-import Select from 'react-select'
-import axios from 'axios';
-import moment from 'moment';
-import { TimePicker } from 'antd';
-import 'antd/dist/antd.css';
-
-export default class DialogForm extends Component {
- constructor(props) {
- super(props)
- this.state = {
- id: 0,
- lat:"",
- lon:"",
- status:"",
- name:"",
- openDialog: false,
- isParentClick: false,
- disable: false
- }
- }
-
- async componentDidMount(){
- this.props.showDialog(this.showDialog);
- }
-
- async componentDidUpdate (){
- if(this.state.isParentClick===true){
- const { dataEdit } = this.props
- console.log("cek", dataEdit);
- this.setState({
- id:dataEdit.id,
- lat:dataEdit.lat,
- lon:dataEdit.lon,
- status:dataEdit.status_response,
- name:dataEdit.employee_name
- })
-
- this.setState({isParentClick:false});
- }
- }
-
-
- showDialog = () => {
- this.setState({ isParentClick : true });
- }
-
-
- handleSave = () => {
- const {
- lat,
- lon,
- status,
- id
- } = this.state
-
- let data = {
- lat,
- lon,
- status_response:status,
- id
- }
- this.props.closeDialog('save', data);
- this.setState({ id:0,lat:"",lon:"",status:'active' });
-
- }
-
- handleCancel = () => {
- this.props.closeDialog('cancel', 'none')
- }
-
- renderForm = () => {
- return(
-
- )
- }
-
- render() {
- return (
-
- Edit Status Response
-
- {this.renderForm()}
-
-
- {' '}
-
-
-
- )
- }
-}
diff --git a/src/views/Master/PlanningVsRealisasi/DialogForm.js b/src/views/Master/PlanningVsRealisasi/DialogForm.js
deleted file mode 100644
index 33ac833..0000000
--- a/src/views/Master/PlanningVsRealisasi/DialogForm.js
+++ /dev/null
@@ -1,85 +0,0 @@
-import React, { Component } from 'react'
-import { Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap';
-import { Col, Row, Button, Form, FormGroup, Label, Input } from 'reactstrap';
-import Map from './Map'
-import 'antd/dist/antd.css';
-
-const ERROR_LATLON = "Geom cannot be empty"
-const ERROR_COMPANY = "Company cannot be empty"
-const ERROR_NAME = "name cannot be empty"
-const ERROR_RADIUS = "Buffer Radius cannot be empty"
-
-export default class DialogForm extends Component {
- constructor(props) {
- super(props)
- this.state = {
- id: 0,
- lat:0,
- lon:0,
- openDialog: false,
- isParentClick: false,
- }
- }
-
- async componentDidMount(){
- this.props.showDialog(this.showDialog);
- }
-
- async componentDidUpdate (){
- if(this.state.isParentClick===true){
- const { dataMap } = this.props
- this.setState({
- lat:dataMap.lat,
- lon:dataMap.lon
- })
- this.setState({isParentClick:false});
- }
- }
-
-
- showDialog = () => {
- this.setState({ isParentClick : true });
- }
-
-
- handleSave = () => {
-
- }
-
- handleCancel = () => {
- this.props.closeDialog('cancel', 'none')
- }
-
- getLocation = (param) => {
- console.log(`getLocation`, param)
- this.setState({
- latlonMessage: param != "" ? "" : ERROR_LATLON,
- lat: param.lat,
- lon: param.lng,
- latlon: `lat:${param.lat} lng:${param.lng}`
- })
- }
-
- renderForm = () => {
- return(
-
-
-
- )
- }
-
- render() {
- return (
-
- Map
-
- {this.renderForm()}
-
-
- {/* {' '} */}
-
-
-
- )
- }
-}
diff --git a/src/views/Master/PlanningVsRealisasi/DialogView.js b/src/views/Master/PlanningVsRealisasi/DialogView.js
deleted file mode 100644
index 79c7f08..0000000
--- a/src/views/Master/PlanningVsRealisasi/DialogView.js
+++ /dev/null
@@ -1,104 +0,0 @@
-import React, { useEffect, useMemo, useState } from 'react'
-import { Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap';
-import { Button, Form, FormGroup, Label, Input, Col, Row } from 'reactstrap';
-import { Select, Table } from 'antd'
-import { BASE_SIMPRO } from '../../../const/ApiConst';
-import { NotificationContainer, NotificationManager } from 'react-notifications';
-import 'antd/dist/antd.css';
-import axios from 'axios';
-import moment from 'moment';
-
-const { Option } = Select
-
-const DialogView = ({ openDialog, closeDialog, toggleDialog, dataPlanning, nameProyekParent }) => {
- const token = localStorage.getItem("token")
- const HEADER = {
- headers: {
- "Content-Type": "application/json",
- "Authorization": `Bearer ${token}`
- }
- }
- const [dataPlan, setDataPlan] = useState([]);
-
- useEffect(() => {
- setDataPlan(dataPlanning)
- }, [dataPlanning]);
-
-
- const RenderTableLaporanPlan = (tableData) => {
- const columns = [
- {
- title: 'Tanggal',
- dataIndex: 'tanggal',
- key: 'tanggal',
- render: (text, record) => <>{moment(text.tanggal).format("YYYY-MM-DD")}>,
- },
- { title: 'Jumlah Pekerja', dataIndex: 'jumlah_pekerjaan', key: 'jumlah_pekerjaan' },
- { title: 'Status', dataIndex: 'status', key: 'status' },
- { title: 'deskripsi', dataIndex: 'deskripsi', key: 'deskripsi' },
- ];
-
- return (
-
- )
- }
-
- const RenderTablePlan = useMemo(() => {
- let idx = 0
- const columns = [
- {
- title: 'No',
- dataIndex: 'no',
- key: 'id',
- render: (text, record) => <>{idx+1}>,
- },
-
- {
- title: 'Waspang',
- dataIndex: 'created_by',
- key: 'created_by',
- render: (text, record) => <>{record.created_by}>,
- },
- { title: 'Jumlah Pekerjaan', dataIndex: 'jumlah_pekerjaan', key: 'jumlah_pekerjaan' },
- {
- title: 'Deskripsi',
- dataIndex: 'deskripsi',
- key: 'deskripsi',
- render: (text, record) => <>{record.deskripsi}>,
- },
- ];
-
- return (
- RenderTableLaporanPlan(record.realisasi),
- rowExpandable: record => record.realisasi,
- }}
- dataSource={dataPlan}
- />
- )
- }, [dataPlan])
-
-
- return (
-
- View Realisasi
-
- {RenderTablePlan}
-
-
- {/* {' '} */}
-
-
-
- )
-
-}
-
-export default DialogView;
\ No newline at end of file
diff --git a/src/views/Master/PlanningVsRealisasi/Map.js b/src/views/Master/PlanningVsRealisasi/Map.js
deleted file mode 100644
index a929531..0000000
--- a/src/views/Master/PlanningVsRealisasi/Map.js
+++ /dev/null
@@ -1,83 +0,0 @@
-import React, { useState, useRef, useMemo, useCallback, useEffect } from 'react'
-import { MapContainer, TileLayer, Marker, Popup, Polygon } from 'react-leaflet'
-
-const center = {
- lat: -6.200000,
- lng: 106.816666
-}
-
-const DraggableMarker = (props) => {
- const { method } = props
- let lat = props.lat
- let lng = props.lng
- const currentPos = [lat, lng]
- console.log(`currentPos`, currentPos)
-
-
-
- const [draggable, setDraggable] = useState(true)
- const [position, setPosition] = useState(center)
-
-
- const markerRef = useRef(null)
- const eventHandlers = useMemo(
- () => ({
- dragend() {
- const marker = markerRef.current
- if (marker != null) {
- setPosition(marker.getLatLng())
- props.getLocation(marker.getLatLng())
- }
- },
- }),
- [],
- )
- return (
- <>
-
- {method === "View" && (
-
-
- )}
-
- {method === "Edit" && (
-
-
- )}
- {method === "Save" && (
-
-
- )}
- >
- )
-}
-
-
-const purpleOptions = { color: 'purple' }
-const RenderMap = (props) => {
- let lat = props.lat
- let lng = props.lng
- const currentPos = (lat !== "" && lng !== "") ? [lat, lng] : center
- return (
-
- {/* */}
-
-
-
- )
-}
-export default RenderMap;
\ No newline at end of file
diff --git a/src/views/Master/PlanningVsRealisasi/index.js b/src/views/Master/PlanningVsRealisasi/index.js
deleted file mode 100644
index 90fabb3..0000000
--- a/src/views/Master/PlanningVsRealisasi/index.js
+++ /dev/null
@@ -1,608 +0,0 @@
-import React, { Component } from 'react';
-import { Card, CardBody, CardHeader, Col, Row, Table, Input, InputGroup } from 'reactstrap';
-import { Button } from 'reactstrap';
-import axios from 'axios';
-import moment from 'moment';
-import SweetAlert from 'react-bootstrap-sweetalert';
-import DialogForm from './DialogForm';
-import DialogEdit from './DialogEdit';
-import { NotificationContainer, NotificationManager } from 'react-notifications';
-import { Pagination, Tooltip } from 'antd';
-import { DatePicker } from 'antd';
-import * as XLSX from 'xlsx';
-import { PLANNING_REALISASI_SEARCH, PLANNING_SEARCH } from '../../../const/ApiConst.js';
-import DialogView from './DialogView';
-
-
-const { RangePicker } = DatePicker;
-
-const token = window.localStorage.getItem('token');
-const config = {
- headers:
- {
- Authorization : `Bearer ${token}`,
- "Content-type" : `application/json`
- }
-};
-
-const proyek_id = localStorage.getItem('proyek_id');
-const role_id = localStorage.getItem('role_id');
-
-const column = [
- { name: "No" },
- { name: "Proyek" },
- { name: "Pekerjaan" },
- { name: "Target" },
- { name: "Actual" },
- { name: "Team Leader" },
- { name: "Waspang" },
- { name: "Tanggal" },
- { name: "Lihat" },
-]
-
-const LENGTH_DATA = 10
-
-export default class index extends Component {
- constructor(props) {
- super(props)
- this.state = {
- dataTable: [],
- dataExport: [],
- openDialog: false,
- openDialogEdit:false,
- typeDialog: 'Save',
- dataEdit: null,
- alertDelete: false,
- idDelete: 0,
- dataGs: [],
- dataIdHo: [],
- search: "",
- page: 0,
- rowsPerPage: LENGTH_DATA,
- currentPage: 1,
- totalPage: 0,
- tooltipMap: false,
- tooltipDelete: false,
- typeClock: "All",
- startDate:moment(moment().format("YYYY-M-D")),
- endDate:moment(moment().format("YYYY-M-D")),
- currentDay: 'today',
- dataMap:"",
- tooltipExport:false,
- openDialogPlan: false,
- dataRealisasi: []
- }
- }
-
- async componentDidMount() {
- this.getDataReportPlanning();
- }
-
- async componentDidUpdate(prevProps, prevState) {
- const { search,startDate,dataExport } = this.state
- if (search !== prevState.search) this.getDataReportPlanning()
- if (startDate !== prevState.startDate) this.getDataReportPlanning()
- if (dataExport !== prevState.dataExport){
- if(dataExport.length > 0){
- this.exportExcel()
- }
- }
- }
-
- handleSearch = e => {
- const value = e.target.value
- this.setState({ search: value, currentPage: 1 })
- };
-
- getDataReportPlanning = async () => {
- let start = 0;
- if (this.state.currentPage !== 1 && this.state.currentPage > 1) {
- start = (this.state.currentPage * this.state.rowsPerPage) - this.state.rowsPerPage
- }
-
- let dateStart = moment(this.state.startDate).format("YYYY-MM-DD 00:00:00");
- let dateEnd = moment(this.state.endDate).format("YYYY-MM-DD 23:59:59");
-
-
-
- const formData = {
- "columns": [
- {
- "name": "created_at",
- "logic_operator": "range",
- "value": dateStart,
- "value1": dateEnd,
- "operator": "AND"
- },
- {
- "name": "nama",
- "logic_operator": "ilike",
- "value": this.state.search,
- "operator": "AND",
- }
- ],
- "joins": [
- {
- "name": "m_proyek",
- "column_join": "proyek_id",
- "column_results": [
- "nama",
- "biaya",
- "color_progress",
- "jumlah_pekerja",
- "pic",
- "mulai_proyek",
- "akhir_proyek"
- ]
- },
- {
- "name": "m_subproyek",
- "column_join": "subproyek_id",
- "column_results": [
- "nama",
- "biaya",
- "color_progress",
- "jumlah_pekerja",
- "pic",
- "mulai_proyek",
- "akhir_proyek"
- ]
- },
- {
- "name": "m_users",
- "column_join": "user_id",
- "column_results": [
- "name",
- "username",
- "email",
- "phone_number",
- "gender"
- ]
- }
- ],
- "orders": {
- "columns": [
- "planning_id"
- ],
- "ascending": true
- },
- "paging": {
- "start": start,
- "length": this.state.rowsPerPage
- }
- }
-
- if(parseInt(role_id)!==1){
- formData.columns.push(
- {
- "name": "id",
- "logic_operator": "=",
- "value": proyek_id,
- "operator": "AND",
- "table_name": "m_proyek"
- }
- )
- }
-
- const result = await axios
- .post(PLANNING_REALISASI_SEARCH, formData, config)
- .then(res => res)
- .catch((error) => error.response);
-
- if(result && result.data && result.data.code==200){
- console.log("cek res planning", result.data.data)
- this.setState({ dataTable: result.data.data, totalPage: result.data.totalRecord });
- }else{
- NotificationManager.error('Gagal Menerima Data!!', 'Failed');
- }
- }
-
- handleCloseDialogPlan = () => {
- this.setState({openDialogPlan: false})
- }
-
- handleOpenDialogPlan = (param) => {
- this.setState({openDialogPlan: true})
- this.setState({dataRealisasi: param.realisasi})
- }
-
-
- toggleAddDialogPlan = () => {
- this.setState({openDialogPlan: !this.stateopenDialogPlan})
-}
-
-
- handleOpenDialog = (type) => {
- if(type==="Map"){
- this.setState({ openDialog: true })
- this.showChildDialog();
- }else{
- this.setState({ openDialogEdit: true })
- this.showDialogEdit();
- }
-
- }
-
- handleCloseDialog = () => {
- this.setState({ openDialog: false })
- }
-
- handleCloseDialogEdit = (type, data) => {
- if(type==="save"){
- this.updateStatusResponse(data);
- }
- this.setState({ openDialogEdit: false })
- }
-
- toggleMapDialog = () => {
- this.setState({ openDialog: !this.state.openDialog })
- }
-
- toggleEditDialog = () => {
- this.setState({ openDialogEdit:!this.state.openDialogEdit });
- }
-
- handleMap = data => {
- this.setState({ dataMap: data });
- this.handleOpenDialog('Map');
- }
-
- handleEdit = data => {
- this.setState({ dataEdit:data });
- this.handleOpenDialog('Edit');
- }
-
- handleDelete = (id) => {
- this.setState({ alertDelete: true, idDelete: id });
- }
-
- onShowSizeChange = (current, pageSize) => {
- this.setState({ rowsPerPage: pageSize }, () => {
- this.getDataReportPlanning();
- })
- }
-
- onPagination = (current, pageSize) => {
- this.setState({ currentPage: current, page: (current - 1) * pageSize }, () => {
- this.getDataReportPlanning();
- })
- }
-
- toggle = (param) => {
- if (param === "map") {
- this.setState(prevState => ({ tooltipMap: !prevState.tooltipMap }))
- }else if(param==="edit"){
- this.setState(prevState => ({ tooltipEdit: !prevState.tooltipEdit }))
- } else if (param === "delete") {
- this.setState(prevState => ({ tooltipDelete: !prevState.tooltipDelete }))
- } else if (param === "export") {
- this.setState(prevState => ({ tooltipExport: !prevState.tooltipExport }))
- }
- }
-
- handleDatePicker = (date, dateString) => {
- this.setState({ startDate:date[0],endDate:date[1] },()=>{
- this.getDataReportPlanning();
- })
- }
-
- handleTipe = (e) => {
- this.setState({ typeClock:e.target.value }, () => {
- this.getDataReportPlanning();
- });
- }
-
- handleExportExcel = async () => {
- let dateStart = moment(this.state.startDate).format("YYYY-MM-DD 00:00:00");
- let dateEnd = moment(this.state.endDate).format("YYYY-MM-DD 23:59:59");
-
- const payload = {
- "columns": [
- {
- "name": "created_at",
- "logic_operator": "range",
- "value": dateStart,
- "value1": dateEnd,
- "operator": "AND"
- },
- {
- "name": "nama",
- "logic_operator": "ilike",
- "value": this.state.search,
- "operator": "AND",
- }
- ],
- "joins": [
- {
- "name": "m_proyek",
- "column_join": "proyek_id",
- "column_results": [
- "nama",
- "biaya",
- "color_progress",
- "jumlah_pekerja",
- "pic",
- "mulai_proyek",
- "akhir_proyek"
- ]
- },
- {
- "name": "m_subproyek",
- "column_join": "subproyek_id",
- "column_results": [
- "nama",
- "biaya",
- "color_progress",
- "jumlah_pekerja",
- "pic",
- "mulai_proyek",
- "akhir_proyek"
- ]
- },
- {
- "name": "m_users",
- "column_join": "user_id",
- "column_results": [
- "name",
- "username",
- "email",
- "phone_number",
- "gender"
- ]
- }
- ],
- "orders": {
- "columns": [
- "planning_id"
- ],
- "ascending": true
- },
- "paging": {
- "start": 0,
- "length": -1
- }
- }
-
- if(parseInt(role_id)!==1){
- payload.columns.push(
- {
- "name": "id",
- "logic_operator": "=",
- "value": proyek_id,
- "operator": "AND",
- "table_name": "m_proyek"
- }
- )
- }
-
- const result = await axios
- .post(PLANNING_REALISASI_SEARCH, payload, config)
- .then(res => res)
- .catch((error) => error.response);
-
-
- if(result && result.data && result.data.code == 200){
- let resData = result.data.data;
- const excelData = [];
- resData.map((n, index) => {
- let dataRow = {
- "Proyek": n.join ? n.join.m_proyek_nama : "-",
- "Pekerjaan": n.nama ? n.nama : "-",
- "Target" : n.jumlah_titik ? n.jumlah_titik : "0",
- "Actual" : n.realisasi ? this.renderActual(n.realisasi) : "0",
- "Team Leader" : n.join.m_subproyek_pic ? `${n.join.m_subproyek_pic}` : "-",
- "Waspang" : n.join.m_users_name ? `${n.join.m_users_name}` : "-",
- "Tanggal" : n.target_planning ? moment(n.target_planning).format("DD-MM-YYYY") : "-",
- }
- excelData.push(dataRow)
- })
- this.setState({dataExport:excelData})
- }else{
- NotificationManager.error('Gagal Export Data!!', 'Failed');
- }
- }
-
- exportExcel = () => {
- const dataExcel = this.state.dataExport || [];
- const fileName = `Data Planning vs realisasi.xlsx`;
- const ws = XLSX.utils.json_to_sheet(dataExcel);
- const wb = XLSX.utils.book_new();
- XLSX.utils.book_append_sheet(wb, ws, `Data Planning vs realisasi`);
-
- XLSX.writeFile(wb, fileName);
- this.setState({dataExport:[] })
- }
-
- updateStatusResponse = async (data) => {
- let url = ``;
-
- const formData = new FormData();
- formData.append("lat", data.lat);
- formData.append("lon", data.lon);
- formData.append("status_response", data.status_response);
-
- const result = await axios
- .post(url, formData)
- .then(res => res)
- .catch((error) => error.response);
- if(result && result.data){
- if (result.data.code_status == 200) {
- NotificationManager.success('Berhasil update status response!!', 'Success!');
- } else {
- NotificationManager.error('Gagal update status response!!', 'Failed');
- }
- }
- }
-
- renderActual = (realisasi) => {
- let data = realisasi || []
- let sumActual = 0
- data.map((val, index) => {
- sumActual += parseInt(val.jumlah_pekerjaan)
- })
- return sumActual
- }
-
- renderTable = () => {
- const dataTable2 = this.state.dataTable || [];
- return (
-
- {dataTable2.length!==0 ? dataTable2.map((n, index) => {
- return (
-
- {index + 1} |
- { n.join ? n.join.m_proyek_nama : "-" } |
- { n.nama ? n.nama : "-"} |
- { n.jumlah_titik ? n.jumlah_titik : "0" } |
- { n.realisasi ? this.renderActual(n.realisasi) : "0" } |
- { n.join.m_subproyek_pic ? `${n.join.m_subproyek_pic}` : "-" } |
- { n.join.m_users_name ? `${n.join.m_users_name}` : "-" } |
- { n.target_planning ? moment(n.target_planning).format("DD-MM-YYYY") : "-" } |
-
- {/* this.handleDelete(n.id)}>
- this.toggle("delete")}>
- Delete
- */}
- {/* this.handleEdit(n)}>
- this.toggle("edit")}>
- Edit
-
- {' '} */}
-
- this.handleOpenDialogPlan(n)} id="tooltipMap" className="fa fa-eye fa-lg" style={{ color: 'black', cursor: "pointer" }}>
-
- |
-
- )
- }) :
- No Data Available |
-
- }
-
- )
- }
-
- handleChangeDay = (e) => {
- const val = e.target.value;
- this.setState({ currentDay:val });
- if(val==="today"){
- this.setState({
- startDate:moment(moment().format("YYYY-M-D")),
- endDate:moment(moment().format("YYYY-M-D")),
- currentPage: 1
- })
- }else if(val==="3 day"){
- this.setState({
- startDate:moment(moment().subtract(3, "days").format("YYYY-M-D")),
- endDate:moment(moment().format("YYYY-M-D")),
- currentPage: 1
- })
- }else if(val==="7 day"){
- this.setState({
- startDate:moment(moment().subtract(7, "days").format("YYYY-M-D")),
- endDate:moment(moment().format("YYYY-M-D")),
- currentPage: 1
- })
- }else{
- this.setState({
- startDate:moment(moment().format("YYYY-M-D")),
- endDate:moment(moment().format("YYYY-M-D")),
- currentPage: 1
- })
- }
- }
-
- render() {
- const { tooltipExport,dataTable, openDialogEdit, openDialog, currentPage, rowsPerPage, totalPage, search, tooltipMap, tooltipDelete } = this.state
- return (
-
-
- {/*
this.setState({ alertDelete: false, idDelete: 0 })}
- focusCancelBtn
- >
- Data tipe karyawan akan terhapus!!
- */}
-
this.toggleMapDialog}
- dataMap={this.state.dataMap}
- showDialog={showDialog => this.showChildDialog = showDialog}
- />
- this.toggleEditDialog}
- dataEdit={this.state.dataEdit}
- showDialog={showDialog => this.showDialogEdit = showDialog}
- />
-
-
- Planning Vs Realisasi
-
- {/* {' '} */}
-
-
-
-
-
-
-
-
-
- this.handleChangeDay(e)} defaultValue={this.state.currentDay}>
-
-
-
-
-
-
- {' '}
-
-
-
-
-
-
-
-
- {/* Actions | */}
- {column.map((i, index) => {
- return (
- {i.name} |
- )
- })}
-
-
- { this.renderTable() }
-
-
-
-
-
- this.handleCloseDialogPlan()}
- toggleDialog={() => this.toggleAddDialogPlan()}
- dataPlanning={this.state.dataRealisasi}
- />
-
- )
- }
-}
diff --git a/src/views/Master/UserWaspang/DialogForm.js b/src/views/Master/UserWaspang/DialogForm.js
deleted file mode 100644
index c63b5ab..0000000
--- a/src/views/Master/UserWaspang/DialogForm.js
+++ /dev/null
@@ -1,211 +0,0 @@
-import React, { useEffect, useState } from 'react'
-import { Modal, ModalHeader, ModalBody, ModalFooter,Row,Col } from 'reactstrap';
-import { Button, Form, FormGroup, Label, Input } from 'reactstrap';
-import { DatePicker,Select } from 'antd';
-import moment from 'moment';
-import 'antd/dist/antd.css';
-
-const { Option } = Select
-const DialogForm = ({openDialog, closeDialog, toggleDialog, typeDialog, dataEdit, dataRole}) => {
- const [id, setId] = useState(0)
- const [user_id, setUserId] = useState(0)
- const [name, setName] = useState('')
- const [username, setUsername] = useState('')
- const [birth_place, setBirthPlace] = useState('')
- const [birth_date, setBirthDate] = useState(moment(moment().format('YYYY-MM-DD')))
- const [email, setEmail] = useState('')
- const [phone_number, setPhoneNumber] = useState('')
- const [address, setAddress] = useState('')
- const [gender, setGender] = useState('Laki-laki')
- const [password, setPassword] = useState('')
- const [role_id,setIdRole] = useState(null)
- useEffect(()=> {
- if(typeDialog==="Edit"){
- if(dataEdit){
- setId(dataEdit.id)
- setIdRole(3)
- setUserId(dataEdit.user_id)
- if(dataEdit.join){
- setName(dataEdit.join.m_users_name)
- setEmail(dataEdit.join.m_users_email)
- setBirthDate(dataEdit.join.m_users_birth_date ? moment(moment(dataEdit.join.m_users_birth_date).format("YYYY-MM-DD")) : moment(moment()))
- setBirthPlace(dataEdit.join.m_users_birth_place)
- setPhoneNumber(dataEdit.join.m_users_phone_number)
- setGender(dataEdit.join.m_users_gender || "Laki-laki")
- setAddress(dataEdit.join.m_users_address)
- setUsername(dataEdit.join.m_users_username)
- }
- }
- }else{
- setId(0)
- setName('')
- setEmail('')
- setBirthDate(moment(moment().format('YYYY-MM-DD')))
- setBirthPlace('')
- setPhoneNumber('')
- setGender('Laki-laki')
- setAddress('')
- setUsername('')
- setPassword('')
- setIdRole(3)
- setUserId(0)
- }
- },[dataEdit,openDialog])
-
- const handleSave = () => {
- let data = '';
- if(typeDialog==="Save"){
- data = {
- name,
- username,
- phone_number,
- email,
- birth_date,
- birth_place,
- gender,
- address,
- password,
- role_id,
- user_id
- }
- closeDialog('save', data);
- }else{
- data = {
- id,
- name,
- username,
- phone_number,
- email,
- birth_date,
- birth_place,
- gender,
- address,
- role_id,
- user_id
- }
-
- if(password!==''){
- data['password'] = password
- }
-
- closeDialog('edit', data);
- }
- setId(0)
- setName('')
- setEmail('')
- setBirthDate(moment(moment().format('YYYY-MM-DD')))
- setBirthPlace('')
- setPhoneNumber('')
- setGender('Laki-laki')
- setAddress('')
- setUsername('')
- setPassword('')
- setIdRole(3)
- setUserId(0)
- }
-
- const handleCancel = () => {
- closeDialog('cancel', 'none')
- setId(0)
- setName('')
- setEmail('')
- setBirthDate(moment(moment().format('YYYY-MM-DD')))
- setBirthPlace('')
- setPhoneNumber('')
- setGender('Laki-laki')
- setAddress('')
- setUsername('')
- setPassword('')
- setIdRole(null)
- setUserId(0)
- }
-
- const handleDatePicker = (date, dateString) => {
- setBirthDate(date)
- }
-
- const setupOption = () => {
- return(
- <>
- {dataRole.map((val, index)=> {
- return(
-
- )
- })}
- >
- )
- }
-
- const onChangeRole = (val) => {
- setIdRole(val)
- }
-
- const renderForm = () => {
- return(
-
- )
- }
-
-
- return (
-
- {typeDialog=="Save" ? `Tambah` : "Edit"} User Waspang
-
- {renderForm()}
-
-
- {' '}
-
-
-
- )
-
-}
-
-export default DialogForm;
\ No newline at end of file
diff --git a/src/views/Master/UserWaspang/DialogProyek.js b/src/views/Master/UserWaspang/DialogProyek.js
deleted file mode 100644
index c7c1fca..0000000
--- a/src/views/Master/UserWaspang/DialogProyek.js
+++ /dev/null
@@ -1,156 +0,0 @@
-import React, { useEffect, useState } from 'react'
-import { Modal, ModalHeader, ModalBody, ModalFooter, Row, Col } from 'reactstrap';
-import { Button, Form, FormGroup, Label, Input } from 'reactstrap';
-import { Select, DatePicker } from 'antd';
-import moment from 'moment';
-import 'antd/dist/antd.css';
-const proyekId = localStorage.getItem('proyek_id');
-const { Option } = Select;
-const DialogProyek = ({ openDialog, closeDialog, toggleDialog, dataWaspangProyek, dataProyek, waspangId }) => {
- const [id, setId] = useState(0)
- const [proyek_id, setProyekId] = useState(null)
- const [user_id, setUserId] = useState(null)
- const [userIdAdd, setUserIdAdd] = useState(0)
- const [startDate, setStartDate] = useState(moment(moment()))
- const [endDate, setEndDate] = useState(moment(moment()))
- const [type, setType] = useState("add")
- const [disableSelectProyek, setDisableSelectProyek] = useState(false)
- const [role_id, setRoleId] = useState(localStorage.getItem('role_id'))
-
- useEffect(() => {
- if (waspangId) {
- setUserIdAdd(waspangId)
- }
- }, [waspangId])
-
- useEffect(() => {
- let data = dataWaspangProyek || []
- console.log("waspang id", waspangId)
- console.log("role_id", role_id)
- if (data.length > 0) {
- let dataObj = data[0]
- setType("edit")
- setProyekId(dataObj.proyek_id)
- if (dataObj.mulai) {
- setStartDate(moment(moment(dataObj.mulai)))
- } else {
- setStartDate(moment(moment()))
- }
-
- if (dataObj.mulai) {
- setEndDate(moment(moment(dataObj.akhir)))
- } else {
- setEndDate(moment(moment()))
- }
-
-
- setUserId(dataObj.user_id)
- setId(dataObj.id)
- } else {
- setProyekId(null)
- setStartDate(moment(moment()))
- setEndDate(moment(moment()))
- setType("add")
- }
-
- if (parseInt(role_id) === 2) {
- setProyekId(parseInt(proyekId))
- setDisableSelectProyek(true)
- }
- }, [dataWaspangProyek, openDialog])
-
- useEffect(() => {
- if (parseInt(role_id) === 2) {
- setProyekId(parseInt(proyekId))
- setDisableSelectProyek(true)
- }
- }, [role_id])
- const handleCancel = () => {
- closeDialog('cancel', 'none')
- setId(0)
- setProyekId(null)
- }
-
- const onChangeParent = (value) => {
- setProyekId(value)
- }
-
- const setupOption = () => {
- return (
- <>
- {dataProyek.map((val, index) => {
- return (
-
- )
- })}
- >
- )
- }
-
- const handleStartDate = (date, string) => {
- setStartDate(date)
- }
-
- const handleEndDate = (date, string) => {
- setEndDate(date)
- }
-
- const handleSave = () => {
- let data = {
- type,
- mulai: startDate,
- akhir: endDate,
- proyek_id,
- user_id
- }
-
- if (type === "add") {
- data['user_id'] = userIdAdd
- }
-
- if (type === "edit") {
- data['id'] = id
- }
-
- closeDialog("save", data)
- }
-
- const renderForm = () => {
- return (
-
- )
- }
-
-
- return (
-
- closeDialog("none", "none")}>Save User Proyek
-
- {renderForm()}
-
-
- {' '}
-
-
-
- )
-
-}
-
-export default DialogProyek;
\ No newline at end of file
diff --git a/src/views/Master/UserWaspang/index.js b/src/views/Master/UserWaspang/index.js
deleted file mode 100644
index f9cf3a4..0000000
--- a/src/views/Master/UserWaspang/index.js
+++ /dev/null
@@ -1,686 +0,0 @@
-import React, { useState, useEffect } from 'react';
-import { Card, CardBody, CardHeader, Col, Row, Table, Input } from 'reactstrap';
-import { Button } from 'reactstrap';
-import axios from 'axios';
-import * as XLSX from 'xlsx';
-import SweetAlert from 'react-bootstrap-sweetalert';
-import DialogForm from './DialogForm';
-import { NotificationContainer, NotificationManager } from 'react-notifications';
-import { Pagination, Tooltip } from 'antd';
-import {
- USER_ADD,
- USER_SEARCH,
- USER_EDIT,
- USER_DELETE,
- ROLE_SEARCH,
- USERROLE_ADD,
- USERROLE_EDIT,
- USERROLE_DELETE,
- USERROLE_SEARCH,
- USERPROYEK_SEARCH,
- PROYEK_SEARCH,
- USERPROYEK_EDIT,
- USERPROYEK_ADD
-} from '../../../const/ApiConst.js';import moment from 'moment';
-import DialogProyek from './DialogProyek';
-const token = window.localStorage.getItem('token');
-const config = {
- headers:
- {
- Authorization : `Bearer ${token}`,
- "Content-type" : `application/json`
- }
-};
-const column =
- [
- { name: "Nama" },
- { name: "Tempat Lahir" },
- { name: "Tanggal Lahir" },
- { name: "Nomor Telepon" },
- { name: "Email" },
- { name: "Proyek"}
- ]
-
-
-const IndexUser = ({params}) => {
- const [dataTable, setDatatable] = useState([])
- const [search, setSearch] = useState('')
- const [currentPage, setCurrentPage] = useState(1)
- const [totalPage, setTotalPage] = useState(0)
- const [openDialog, setOpenDialog] = useState(false)
- const [typeDialog, setTypeDialog] = useState('Save')
- const [idDelete, setIdDelete] = useState(0)
- const [dataProyek, setDataProyek] = useState([])
- const [alertDelete, setAlertDelete] = useState(false)
- const [dataEdit, setDataEdit] = useState([])
- const [rowsPerPage, setRowsPerPage] = useState(10)
- const [clickOpenModal, setClickOpenModal] = useState(false)
- const [allDataUserProyek, setAllDataUserProyek] = useState([])
- const [dataRole, setDataRole] = useState([])
- const [dataExport, setDataExport] = useState([])
- const [openDialogProyek, setOpenDialogProyek] = useState(false)
- const [dataWaspangProyek, setDataWaspangProyek] = useState([])
- const [waspangId, setWaspangId] = useState([])
- const pageName = params.name;
- useEffect(()=> {
- getAllDataRole();
- getAllDataProyek();
- getAllDataUserProyek();
- },[])
-
- useEffect(()=> {
- getDataUser();
- },[search,rowsPerPage,currentPage])
-
- useEffect(()=> {
- const cekData = dataExport || []
- if(cekData.length > 0){
- exportExcel()
- }
- },[dataExport])
-
- const handleSearch = e => {
- const value = e.target.value
- setSearch(value);
- setCurrentPage(1)
- };
-
- const getAllDataRole = async () => {
-
- const payload = {
- "paging": {"start": 0, "length": -1},
- "columns": [
- {"name": "name", "logic_operator": "ilike", "value": "", "operator": "AND"}
- ],
- "joins": [],
- "orders": {"columns": ["id"], "ascending": false}
- }
-
-
-
- const result = await axios
- .post(ROLE_SEARCH, payload, config)
- .then(res => res)
- .catch((error) => error.response);
-
-
- if(result && result.data && result.data.code == 200){
- setDataRole(result.data.data);
- }else{
- }
- }
-
- const getAllDataProyek = async () => {
-
- const payload = {
- "paging": {"start": 0, "length": -1},
- "columns": [
- {"name": "nama", "logic_operator": "ilike", "value": "", "operator": "AND"}
- ],
- "joins": [],
- "orders": {"columns": ["id"], "ascending": false}
- }
-
-
-
- const result = await axios
- .post(PROYEK_SEARCH, payload, config)
- .then(res => res)
- .catch((error) => error.response);
-
- if(result && result.data && result.data.code == 200){
- setDataProyek(result.data.data);
- }else{
-
- }
- }
-
- const getAllDataUserProyek = async () => {
- const formData = {
- "paging": {"start": 0, "length": -1},
- "columns": [
- ],
- "joins": [
- {
- "name":"m_proyek",
- "column_join":"proyek_id",
- "column_results":[
- "nama",
- ]
- }
- ],
- "orders": {"columns": ["id"], "ascending": false}
- }
- const result = await axios.post(USERPROYEK_SEARCH, formData, config)
- .then(res => res)
- .catch((error) => error.response);
-
- if(result && result.data && result.data.code===200){
- setAllDataUserProyek(result.data.data)
- }else{
-
- }
- }
-
- const getDataUser = async () => {
-
- let start = 0;
-
- if (currentPage !== 1 && currentPage > 1) {
- start = (currentPage * rowsPerPage) - rowsPerPage
- }
-
- const payload = {
- "paging":{
- "start":start,
- "length":rowsPerPage
- },
- "filter_columns":[
- {
- "name":"name",
- "value":"",
- "table_name":"m_users"
- }
- ],
- "columns":[
- {
- "name":"name",
- "logic_operator":"like",
- "value":search,
- "operator":"AND",
- "table_name":"m_users"
- },
- {
- "name":"id",
- "logic_operator":"=",
- "value":'3',
- "operator":"AND",
- "table_name":"m_roles"
- }
- ],
- "joins":[
- {
- "name":"m_users",
- "column_join":"user_id",
- "column_results":[
- "username",
- "name",
- "email",
- "gender",
- "phone_number",
- "address",
- "birth_place",
- "birth_date"
- ]
- },
- {
- "name":"m_roles",
- "column_join":"role_id",
- "column_results":[
- "name"
- ]
- }
- ],
- "orders":{
- "columns":[
- "id"
- ],
- "ascending":false
- }
- }
-
-
-
- const result = await axios
- .post(USERROLE_SEARCH, payload, config)
- .then(res => res)
- .catch((error) => error.response);
-
-
-
- if(result && result.data && result.data.code == 200){
- setDatatable(result.data.data);
- setTotalPage(result.data.totalRecord);
- }else{
- NotificationManager.error('Gagal Mengambil Data!!', 'Failed');
- }
- }
-
- const handleOpenDialog = async (type) => {
- await setTypeDialog(type)
- setOpenDialog(true)
- }
-
- const handleCloseDialog = (type, data) => {
- if (type === "save") {
- saveUser(data);
- } else if (type === "edit") {
- editUser(data);
- }
- setDataEdit([])
- setOpenDialog(false)
- }
-
- const toggleAddDialog = () => {
- setOpenDialog(!openDialog)
- }
-
- const onConfirmDelete = async () => {
- let url = USER_DELETE(idDelete);
-
- const result = await axios.delete(url,config)
- .then(res => res)
- .catch((error) => error.response);
-
- if (result && result.data && result.data.code === 200) {
- getDataUser()
- setIdDelete(0)
- setAlertDelete(false)
- NotificationManager.success(`Data user berhasil dihapus!`, 'Success!!');
- } else {
- setIdDelete(0)
- setAlertDelete(false)
- NotificationManager.error(`Data user gagal dihapus!}`, 'Failed!!');
- }
- }
-
- const userRoleDelete = async (id) => {
- let url = USERROLE_DELETE(id);
-
- const result = await axios.delete(url,config)
- .then(res => res)
- .catch((error) => error.response);
-
- if (result && result.data && result.data.code === 200) {
-
- } else {
-
- }
- }
-
- const saveUser = async (data) => {
- const formData = data
-
- const result = await axios.post(USER_ADD, formData, config)
- .then(res => res)
- .catch((error) => error.response);
-
- if(result && result.data && result.data.code===200){
- let dataRes = result.data.data
- addUserRole(dataRes.id, data.role_id)
- } else {
- NotificationManager.error(`${result.data.message}`, 'Failed!!');
- }
-
- }
-
- const editUser = async (data) => {
-
- let url = USER_EDIT(data.user_id)
-
- const formData = data
-
- const result = await axios.put(url, formData, config)
- .then(res => res)
- .catch((error) => error.response);
-
- if(result && result.data && result.data.code===200){
- editUserRole(data)
- } else {
- NotificationManager.error(`${result.data.message}`, `Failed!!`);
- }
- }
-
- const addUserRole = async (user_id, role_id) => {
- const formData = {
- user_id,
- role_id
- }
- const result = await axios.post(USERROLE_ADD, formData, config)
- .then(res => res)
- .catch((error) => error.response);
-
- if(result && result.data && result.data.code===200){
- getDataUser();
- NotificationManager.success(`Data user berhasil ditambahkan`, 'Success!!');
- } else {
- NotificationManager.error(`${result.data.message}`, `Failed!!`);
- }
- }
-
- const editUserRole = async (data) => {
- let url = USERROLE_EDIT(data.id)
-
- const formData = {
- user_id:data.user_id,
- role_id:data.role_id
- }
-
- const result = await axios.put(url, formData, config)
- .then(res => res)
- .catch((error) => error.response);
-
- if(result && result.data && result.data.code===200){
- getDataUser();
- NotificationManager.success(`Data user berhasil di edit`, 'Success!!');
- } else {
- NotificationManager.error(`${result.data.message}`, `Failed!!`);
- }
- }
-
-
- const handleEdit = async (data) => {
- await setDataEdit(data)
- handleOpenDialog('Edit');
- }
-
- const handleDelete = async (id) => {
- await setAlertDelete(true)
- await setIdDelete(id)
- }
-
- const onShowSizeChange = (current, pageSize) => {
- setRowsPerPage(pageSize)
- }
-
- const onPagination = (current, pageSize) => {
- setCurrentPage(current)
- }
-
- const handleExportExcel = async () => {
-
- const payload = {
- "paging":{
- "start":0,
- "length":-1
- },
- "filter_columns":[
- {
- "name":"name",
- "value":"",
- "table_name":"m_users"
- }
- ],
- "columns":[
- {
- "name":"name",
- "logic_operator":"like",
- "value":search,
- "operator":"AND",
- "table_name":"m_users"
- }
- ],
- "joins":[
- {
- "name":"m_users",
- "column_join":"user_id",
- "column_results":[
- "username",
- "name",
- "email",
- "gender",
- "phone_number",
- "address",
- "birth_place",
- "birth_date"
- ]
- },
- {
- "name":"m_roles",
- "column_join":"role_id",
- "column_results":[
- "name"
- ]
- }
- ],
- "orders":{
- "columns":[
- "id"
- ],
- "ascending":false
- }
- }
-
-
-
- const result = await axios
- .post(USERROLE_SEARCH, payload, config)
- .then(res => res)
- .catch((error) => error.response);
-
- if(result && result.data && result.data.code == 200){
- let resData = result.data.data;
- const excelData = [];
- resData.map((n, index) => {
- let dataRow = {
- "Name" :n.join.m_users_name ? n.join.m_users_name : "-",
- "Email" :n.join.m_users_email ? n.join.m_users_email : "-",
- "Username" :n.join.m_users_username ? n.join.m_users_username : "-",
- "Phone Number":n.join.m_users_phone_number ? n.join.m_users_phone_number : "-",
- "Address":n.join.m_users_address ? n.join.m_users_address : "-",
- "Birth Date":n.join.m_users_birth_date ? moment(n.join.m_users_birth_date).format("YYYY-MM-DD") : "-",
- "Birth Place":n.join.m_users_birth_place ? n.join.m_users_birth_place : "-",
- "Gender":n.join.m_users_gender ? n.join.m_users_gender : "-"
- }
- excelData.push(dataRow)
- })
- await setDataExport(excelData);
- }else{
- NotificationManager.error('Gagal Export Data!!', 'Failed');
- }
- }
-
-
- const exportExcel = () => {
- const dataExcel = dataExport || [];
- const fileName = `Data ${pageName}.xlsx`;
- const ws = XLSX.utils.json_to_sheet(dataExcel);
- const wb = XLSX.utils.book_new();
- XLSX.utils.book_append_sheet(wb, ws, `Data ${pageName}`);
-
- XLSX.writeFile(wb, fileName);
- }
-
- const cancelDelete = () => {
- setAlertDelete(false)
- setIdDelete(0)
- }
-
- const renderRoleProyek = (role_name, user_id) => {
- const userProyek = allDataUserProyek || []
- let index = userProyek.findIndex(x => parseInt(x.user_id) === parseInt(user_id));
- if(index>=0){
- return allDataUserProyek[index].join.m_proyek_nama
- }else{
- return role_name;
- }
- }
-
- const handleWaspangProyek = async (data) => {
- await setWaspangId(data.user_id)
- getDataWaspangProyek(data.user_id);
- }
-
- const getDataWaspangProyek = async (id) => {
- const formData = {
- "paging": {"start": 0, "length": -1},
- "columns": [
- {"name": "user_id", "logic_operator": "=", "value": id.toString(), "operator": "AND"}
- ],
- "joins": [],
- "orders": {"columns": ["id"], "ascending": false}
- }
- const result = await axios.post(USERPROYEK_SEARCH, formData, config)
- .then(res => res)
- .catch((error) => error.response);
-
- if(result && result.data && result.data.code===200){
- let dataRes = result.data.data
- if(dataRes.length > 0){
- await setDataWaspangProyek(result.data.data)
- setOpenDialogProyek(true)
- }else {
- await setDataWaspangProyek([])
- setOpenDialogProyek(true)
- }
-
- } else {
- NotificationManager.error(`${result.data.message}`, `Failed!!`);
- }
- }
-
- const closeProyekDialog = (type, data) => {
- if(type==="save"){
- if(data.type==="add"){
- saveWaspangProyek(data)
- }else{
- editWaspangProyek(data)
- }
- }
- setOpenDialogProyek(false)
- }
-
- const saveWaspangProyek = async (data) => {
- const formData = data
-
- const result = await axios.post(USERPROYEK_ADD, formData, config)
- .then(res => res)
- .catch((error) => error.response);
-
- if(result && result.data && result.data.code===200){
- NotificationManager.success(`Data user proyek berhasil ditambahkan`, 'Success!!');
- } else {
- NotificationManager.error(`${result.data.message}`, `Failed!!`);
- }
- }
-
- const editWaspangProyek = async (data) => {
-
- let url = USERPROYEK_EDIT(data.id)
-
- const formData = data
-
- const result = await axios.put(url, formData, config)
- .then(res => res)
- .catch((error) => error.response);
-
- if(result && result.data && result.data.code===200){
- NotificationManager.success(`Data user proyek berhasil diedit`, 'Success!!');
- } else {
- NotificationManager.error(`${result.data.message}`, `Failed!!`);
- }
- }
-
- const toggleProyekDialog = () => {
- setOpenDialogProyek(!openDialogProyek)
- }
-
- return (
-
-
-
cancelDelete()}
- focusCancelBtn
- >
- Data user waspang akan terhapus!!
-
-
toggleAddDialog}
- typeDialog={typeDialog}
- dataEdit={dataEdit}
- clickOpenModal={clickOpenModal}
- dataRole={dataRole}
- />
-
-
-
- {pageName}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Aksi |
- {column.map((i, index) => {
- return (
- {i.name} |
- )
- })}
-
-
-
- {dataTable.length<=0 ?
-
- No Data Available |
-
: null}
- {dataTable.map((n, index) => {
- return (
-
-
-
- handleDelete(n.user_id)}>
-
-
- handleEdit(n)}>
-
-
- handleWaspangProyek(n)} style={{color:"black", cursor: "pointer"}} className="cil-task">
-
- |
- {n.join ? n.join.m_users_name : "-"} |
- {n.join ? n.join.m_users_birth_place || "-" : "-"} |
- {n.join.m_users_birth_date ? moment(n.join.m_users_birth_date).format("YYYY-MM-DD") : "-"} |
- {n.join ? n.join.m_users_phone_number : "-"} |
- {n.join ? n.join.m_users_email : "-"} |
- {/* {n.join ? n.join.m_roles_name : "-"} | */}
- {n.join ? n.role_id===3 ? renderRoleProyek(n.join.m_roles_name, n.user_id) : n.join.m_roles_name : "-"} |
-
- )
- })}
-
-
-
-
-
-
- )
-}
-
-export default IndexUser;