diff --git a/src/const/ApiConst.js b/src/const/ApiConst.js index f3cf52d..d7bdf1a 100644 --- a/src/const/ApiConst.js +++ b/src/const/ApiConst.js @@ -771,7 +771,10 @@ export const HIERARCHY_FTTH_COUNT_TREE = (id) => { export const WAYPOINT_SEARCH = `${BASE_SIMPRO_LUMEN}/waypoint/search`; export const IMAGE_UPLOAD = `${BASE_SIMPRO_LUMEN}/image/upload`; - +export const IMAGE_MULTIPLE_UPLOAD = `${BASE_SIMPRO_LUMEN}/image/multiple-upload`; +export const IMAGE_MULTIPLE_DELETE = (id, category) => { + return `${BASE_SIMPRO_LUMEN}/image/multiple-delete/${id}/${category}`; +} export const IMAGE_DELETE = (id, category) => { return `${BASE_SIMPRO_LUMEN}/image/delete/${id}/${category}`; } diff --git a/src/views/Master/MasterCompany/DialogForm.js b/src/views/Master/MasterCompany/DialogForm.js index e0fd9a8..259e8c6 100644 --- a/src/views/Master/MasterCompany/DialogForm.js +++ b/src/views/Master/MasterCompany/DialogForm.js @@ -12,7 +12,7 @@ import 'antd/dist/antd.css'; import { useTranslation } from 'react-i18next'; import axios from "../../../const/interceptorApi" import { - USER_SEARCH, MENU_COMPANY_DELETE, USER_DELETE, ROLE_SEARCH, COMPANY_MANAGEMENT_GET_ID, MENU_COMPANY_SEARCH + USER_SEARCH, MENU_COMPANY_DELETE, USER_DELETE, ROLE_SEARCH, COMPANY_MANAGEMENT_GET_ID, MENU_COMPANY_SEARCH, BASE_SIMPRO_LUMEN_IMAGE } from '../../../const/ApiConst'; const token = window.localStorage.getItem('token'); const config = { @@ -22,7 +22,7 @@ const config = { "Content-type": `application/json` } }; -const DialogForm = ({ openDialog, closeDialog, toggleDialog, typeDialog, companyID, companyNameProp, dataEditCompany, imageHeader, imageFavIcon, imageLogin, lastIdCompany }) => { +const DialogForm = ({ openDialog, closeDialog, toggleDialog, typeDialog, companyID, companyNameProp, dataEditCompany, imageHeader, imageFavIcon, imageLogin, imageSlider, lastIdCompany }) => { const { Option } = Select const { t } = useTranslation() const [registrationnumber, setRegistrationNumber] = useState('') @@ -33,6 +33,7 @@ const DialogForm = ({ openDialog, closeDialog, toggleDialog, typeDialog, company const [description, setDescription] = useState('') const [logoLogin, setLogoLogin] = useState(null) const [logoHeader, setLogoHeader] = useState(null) + const [sliderLogin, setSliderLogin] = useState(null) const [favIcon, setFavIcon] = useState(null) const [loginInstruction, setLoginInstruction] = useState('') const [about, setAbout] = useState('') @@ -65,6 +66,8 @@ const DialogForm = ({ openDialog, closeDialog, toggleDialog, typeDialog, company const [openDialogMenu, setOpenDialogMenu] = useState(false) const [typeDialogMenu, setTypeDialogMenu] = useState("add") const [loading, setLoading] = useState(true); + const [modalOpen, setModalOpen] = useState(false); + const [typeImage, setTypeImage] = useState(''); useEffect(() => { if (companyID && typeDialog === 'Set') { setLoading(true) @@ -98,6 +101,7 @@ const DialogForm = ({ openDialog, closeDialog, toggleDialog, typeDialog, company } else { setAvailableBaseUrl(false) } + setSliderLogin(null) } else { setId(0) setCompanyName('') @@ -111,6 +115,7 @@ const DialogForm = ({ openDialog, closeDialog, toggleDialog, typeDialog, company setTemplate('') setLogoLogin(null) setLogoHeader(null) + setSliderLogin(null) setFavIcon(null) setBaseUrl([]) } @@ -391,6 +396,7 @@ const DialogForm = ({ openDialog, closeDialog, toggleDialog, typeDialog, company data.imageLogin = logoLogin ? logoLogin : null; data.imageHeader = logoHeader ? logoHeader : null; data.imageFavicon = favIcon ? favIcon : null; + data.imageSlider = sliderLogin ? sliderLogin : null; closeDialog('save', data); setLoading(false); } else if (typeDialog === "Edit") { @@ -413,6 +419,7 @@ const DialogForm = ({ openDialog, closeDialog, toggleDialog, typeDialog, company data.imageLogin = logoLogin ? logoLogin : null; data.imageHeader = logoHeader ? logoHeader : null; data.imageFavicon = favIcon ? favIcon : null; + data.imageSlider = sliderLogin ? sliderLogin : null; closeDialog('edit', data); setLoading(false); } @@ -427,6 +434,7 @@ const DialogForm = ({ openDialog, closeDialog, toggleDialog, typeDialog, company closeDialog('cancel', 'none') setDatatable([]); setBaseUrl([]); + setSliderLogin(null); setAvailableBaseUrl(false); setLoading(false); } @@ -568,9 +576,27 @@ const DialogForm = ({ openDialog, closeDialog, toggleDialog, typeDialog, company } }; + const truncateText = (text, maxLength) => { + if (text.length > maxLength) { + return text.substring(0, maxLength) + '...'; + } + return text; + }; + + const toggleModal = () => { + setModalOpen(!modalOpen); + }; + + const handleImageClick = async (type) => { + setTypeImage(type); + if (type != '') { + toggleModal(); + } + }; const renderFromCompany = () => { return ( + <>
@@ -654,7 +680,6 @@ const DialogForm = ({ openDialog, closeDialog, toggleDialog, typeDialog, company @@ -687,15 +712,45 @@ const DialogForm = ({ openDialog, closeDialog, toggleDialog, typeDialog, company - - - setLogoLogin(e.target.files[0])} - /> - {imageLogin ? imageLogin.image :

Not found image

}
-
+ + + setLogoLogin(e.target.files[0])} + /> + handleImageClick('imageLogin') : ''} style={{ cursor: imageLogin ? "pointer" : ""}}> +

+ { + imageLogin ? ( + "View Image" + ) : ( + "Not found image" + ) + } +

+
+
+ + (Multiple Input) + setSliderLogin(e.target.files)} + /> + handleImageClick('imageSlider') : ''} style={{ cursor: imageSlider.length ? "pointer" : ""}}> +

+ { + imageSlider.length > 0 ? ( + "View image" + ) : ( + "Not found image" + ) + } +

+
+
@@ -705,10 +760,18 @@ const DialogForm = ({ openDialog, closeDialog, toggleDialog, typeDialog, company accept="image/*" onChange={(e) => setLogoHeader(e.target.files[0])} /> - {imageHeader ? imageHeader.image :

Not found image

}
+ handleImageClick('imageHeader') : ''} style={{ cursor: imageHeader ? "pointer" : ""}}> +

+ { + imageHeader ? ( + "View image" + ) : ( + "Not found image" + ) + } +

+
-
- setFavIcon(e.target.files[0])} /> - {imageFavIcon ? imageFavIcon.image :

Not found image

}
+ handleImageClick('favIcon') : ''} style={{ cursor: imageFavIcon ? "pointer" : "" }}> +

+ { + imageFavIcon ? ( + "View image" + ) : ( + "Not found image" + ) + } +

+
+ + + { + typeImage !== 'imageSlider' ? ( + imageLogin || imageHeader || imageFavIcon ? ( + Image Preview + ):('-') + ):( + + {imageSlider && imageSlider.map((item, index)=> ( + + + + ))} + + ) + } + + + + + + ) } diff --git a/src/views/Master/MasterCompany/index.js b/src/views/Master/MasterCompany/index.js index aed078c..d629c83 100644 --- a/src/views/Master/MasterCompany/index.js +++ b/src/views/Master/MasterCompany/index.js @@ -6,7 +6,7 @@ import DialogForm from './DialogForm' import { NotificationContainer, NotificationManager } from 'react-notifications'; import { Pagination, Table, Button, Tooltip, Spin } from 'antd'; import { - COMPANY_MANAGEMENT_SEARCH, COMPANY_MANAGEMENT_ADD, COMPANY_MANAGEMENT_EDIT, COMPANY_MANAGEMENT_DELETE, IMAGE_UPLOAD, IMAGE_GET_BY_ID, IMAGE_DELETE + COMPANY_MANAGEMENT_SEARCH, COMPANY_MANAGEMENT_ADD, COMPANY_MANAGEMENT_EDIT, COMPANY_MANAGEMENT_DELETE, IMAGE_UPLOAD, IMAGE_MULTIPLE_UPLOAD, IMAGE_MULTIPLE_DELETE, IMAGE_GET_BY_ID, IMAGE_DELETE, IMAGE_SEARCH } from '../../../const/ApiConst'; import { useTranslation } from 'react-i18next'; const token = window.localStorage.getItem('token'); @@ -47,6 +47,7 @@ const MasterCompany = ({ params }) => { const [companyName, setCompanyName] = useState('') const [imageHeader, setProjectImageHeader] = useState(null); const [imageLogin, setProjectImageLogin] = useState(null); + const [imageSlider, setProjectImageSlider] = useState([]); const [imageFavIcon, setProjectImageFavicon] = useState(null); const [lastIdCompany,setLastCompanyId] = useState(''); const [loading, setLoading] = useState(true); @@ -163,6 +164,24 @@ const MasterCompany = ({ params }) => { } } + const getProjectImageSlider = async (id) => { + const payload = { + "columns": [ + { "name": "category", "logic_operator": "=", "value": "company_slider_login", "operator": "and" }, + { "name": "ref_id", "logic_operator": "=", "value": parseInt(id), "operator": "and" } + ] + } + const result = await axios + .post(IMAGE_SEARCH, payload, config) + .then(res => res) + .catch((error) => error.response); + + if (result && result.data && result.data.code == 200) { + const sourceData = result.data.data; + setProjectImageSlider(sourceData); + } + } + const handleSearch = e => { const value = e.target.value setSearch(value); @@ -178,6 +197,7 @@ const MasterCompany = ({ params }) => { const handleEdit = async (data) => { setDataEdit(data); await getProjectImageHeader(data.id); + await getProjectImageSlider(data.id); await getProjectImageLogin(data.id); await getProjectImageFavicon(data.id); handleOpenDialog('Edit'); @@ -213,9 +233,24 @@ const MasterCompany = ({ params }) => { setProjectImageHeader(null) setProjectImageLogin(null) setProjectImageFavicon(null) + setProjectImageSlider([]) setOpenDialog(false) } + const packFiles = (id, files) => { + const data = new FormData(); + + for (let i = 0; i < files.length; i++) { + data.append('files[]', files[i]); + } + + data.append('ref_id', id); + data.append('category', 'company_slider_login'); + + return data; + }; + + const saveCompany = async (data) => { const formData = data const result = await axios.post(COMPANY_MANAGEMENT_ADD, formData, HEADER) @@ -226,6 +261,7 @@ const MasterCompany = ({ params }) => { const logoHeader = data.imageHeader; const logoLogin = data.imageLogin; const favIcon = data.imageFavicon; + const slider = data.imageSlider; if (logoHeader) { await saveImageHeader( result.data.data.id, @@ -244,6 +280,10 @@ const MasterCompany = ({ params }) => { favIcon ); } + if(slider) { + const dataPack = packFiles(result.data.data.id,slider) + await saveSliderLogin(dataPack) + } getDataCompany(); setLoading(false) NotificationManager.success(`Data company berhasil ditambah`, 'Success!!'); @@ -259,6 +299,7 @@ const MasterCompany = ({ params }) => { const logoHeader = data.imageHeader; const logoLogin = data.imageLogin; const favIcon = data.imageFavicon; + const slider = data.imageSlider; const formData = data const result = await axios.put(urlEdit, formData, HEADER) @@ -291,6 +332,13 @@ const MasterCompany = ({ params }) => { favIcon ); } + if(slider) { + await deleteImageSlider( + data.id + ); + const dataPack = packFiles(data.id,slider) + await saveSliderLogin(dataPack) + } if (result && result.data && result.data.code === 200) { getDataCompany(); setLoading(false) @@ -339,6 +387,15 @@ const MasterCompany = ({ params }) => { .catch((error) => error.response); return "berhasil"; }; + + const saveSliderLogin = async (data) => { + await axios + .post(IMAGE_MULTIPLE_UPLOAD, data, HEADER_MULTIPART) + .then(res => res) + .catch((error) => error.response); + return "berhasil"; + }; + // Delete Image Function const deleteImageHeader = async (id) => { const URL = IMAGE_DELETE(id, 'company_logo_header'); @@ -367,6 +424,15 @@ const MasterCompany = ({ params }) => { return "berhasil"; }; + const deleteImageSlider = async (id) => { + const URL = IMAGE_MULTIPLE_DELETE(id, 'company_slider_login'); + await axios + .delete(URL, HEADER) + .then(res => res) + .catch((error) => error.response); + return "berhasil"; + }; + const toggleAddDialog = () => { setOpenDialog(!openDialog) } @@ -383,6 +449,7 @@ const MasterCompany = ({ params }) => { deleteImageHeader(idDelete) deleteImageLogin(idDelete) deleteImageFavicon(idDelete) + deleteImageSlider(idDelete) setIdDelete(0) setAlertDelete(false) setLoading(false) @@ -465,6 +532,7 @@ const MasterCompany = ({ params }) => { companyNameProp={companyName} imageHeader={imageHeader} imageFavIcon={imageFavIcon} + imageSlider={imageSlider} imageLogin={imageLogin} lastIdCompany={lastIdCompany} /> @@ -473,10 +541,10 @@ const MasterCompany = ({ params }) => {

{pageName}

- + - +