Compare commits
16 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| b3c2785a4b | |||
| ff129480a5 | |||
| 8cf0c8da89 | |||
| 6aaf682d38 | |||
| 9f77a01bb2 | |||
| 9d79e1c709 | |||
| 78ac5d5b24 | |||
| 75657350a3 | |||
| 171f99d997 | |||
| 25c7cd75c7 | |||
| fd68800b00 | |||
| 33f1515d2c | |||
| 2cc30d6c47 | |||
| cfadb42811 | |||
| 1bb2eb3203 | |||
| cd68861dfa |
@@ -4,7 +4,7 @@ import linkedInLogo from "../../../assets/images/Linkedin.png";
|
||||
import appleLogo from "../../../assets/images/apple-black.svg";
|
||||
import facebookLogo from "../../../assets/images/facebook.svg";
|
||||
import googleLogo from "../../../assets/images/google-logo.svg";
|
||||
import WrenchBoard from "../../../assets/images/wrenchboard-logo-text_new.png";
|
||||
import WrenchBoard from "../../../assets/images/wrenchboard-logo-text.png";
|
||||
import usersService from "../../../services/UsersService";
|
||||
import InputCom from "../../Helpers/Inputs/InputCom";
|
||||
import AuthLayout from "../AuthLayout2";
|
||||
|
||||
@@ -5,6 +5,7 @@ import debounce from "../../../hooks/debounce";
|
||||
import usersService from "../../../services/UsersService";
|
||||
import InputCom from "../../Helpers/Inputs/InputCom";
|
||||
import AuthLayout from "../AuthLayout2";
|
||||
import LoadingSpinner from '../../../components/Spinners/LoadingSpinner'
|
||||
|
||||
export default function VerifyLink() {
|
||||
const [email, setEmail] = useState("");
|
||||
@@ -119,7 +120,14 @@ export default function VerifyLink() {
|
||||
<>
|
||||
<AuthLayout slogan="Welcome to WrenchBoard">
|
||||
{pageLoader ? (
|
||||
<img src={WrenchBoard} alt="wrenchboard" className="h-10 mx-auto" />
|
||||
<div className='flex flex-col justify-center items-center gap-4'>
|
||||
<img src={WrenchBoard} alt="wrenchboard" className="h-10 mx-auto" />
|
||||
<div className='flex flex-col justify-center items-center'>
|
||||
<LoadingSpinner height='h-40' size='8' />
|
||||
<p>Loading...</p>
|
||||
<p>please do not refresh</p>
|
||||
</div>
|
||||
</div>
|
||||
) : (
|
||||
<div className="w-full">
|
||||
<div className="mb-12">
|
||||
|
||||
@@ -24,6 +24,8 @@ const AssignTaskPopout = ({
|
||||
setActiveTask,
|
||||
setUpdatePage,
|
||||
}) => {
|
||||
const newJobList = {...jobList, data:jobList?.data?.filter(item => item?.job_mode == 'FAMILY')}
|
||||
|
||||
const {parentAssignJobToKid} = SocketValues()
|
||||
|
||||
const { walletDetails } = useSelector((state) => state?.walletDetails); // WALLET STORE
|
||||
@@ -386,7 +388,7 @@ const AssignTaskPopout = ({
|
||||
<div className="contents">
|
||||
{assignType == 'task' ?
|
||||
<AssignPrevNewTask
|
||||
jobList={jobList}
|
||||
jobList={newJobList}
|
||||
requestStatus={requestStatus}
|
||||
assignFamilyTask={assignFamilyTask}
|
||||
taskType={taskType}
|
||||
|
||||
@@ -73,7 +73,7 @@ const FamilyWaitlist = memo(
|
||||
className="bg-white dark:bg-dark-white border-b dark:border-[#5356fb29] hover:bg-gray-50"
|
||||
key={value.uid}
|
||||
>
|
||||
<td className="py-4">
|
||||
<td className="px-2 py-4">
|
||||
<div className="w-full flex justify-between items-center">
|
||||
<div className="account-name flex space-x-4 items-center">
|
||||
<div className="icon w-14 h-14 flex justify-center items-center">
|
||||
@@ -92,23 +92,40 @@ const FamilyWaitlist = memo(
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div className="px-2 flex flex-col items-center justify-center">
|
||||
{/* <p className="text-sm font-bold text-dark-gray dark:text-white">
|
||||
{/* <div className="px-2 flex flex-col items-center justify-center">
|
||||
<p className="text-sm font-bold text-dark-gray dark:text-white">
|
||||
{addedDate}
|
||||
</p> */}
|
||||
</p>
|
||||
<p className="text-xs py-1.5 w-[70px] cursor-default tracking-wide rounded-full bg-gold text-white flex justify-center items-center">
|
||||
{value.status_text}
|
||||
</p>
|
||||
</div>
|
||||
</div> */}
|
||||
</div>
|
||||
</td>
|
||||
<td className="text-right py-4 px-2">
|
||||
<button
|
||||
onClick={() => openPopUp(value)}
|
||||
className="w-20 h-11 flex justify-center items-center btn-gradient text-base rounded-full text-white"
|
||||
>
|
||||
View
|
||||
</button>
|
||||
<td className="text-right px-2 py-4">
|
||||
<div className='w-full flex justify-end items-center gap-4'>
|
||||
<p className="text-xs py-1.5 w-[70px] cursor-default tracking-wide rounded-full bg-gold text-white flex justify-center items-center">
|
||||
{value.status_text}
|
||||
</p>
|
||||
<button
|
||||
onClick={() => openPopUp(value)}
|
||||
className="w-12 h-11 flex justify-center items-center btn-gradient text-base rounded-full text-white"
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 11 20"
|
||||
id="Arrow"
|
||||
className="w-[0.7rem]"
|
||||
>
|
||||
<path
|
||||
fillRule="evenodd"
|
||||
d="M.366 19.708c.405.39 1.06.39 1.464 0l8.563-8.264a1.95 1.95 0 0 0 0-2.827L1.768.292A1.063 1.063 0 0 0 .314.282a.976.976 0 0 0-.011 1.425l7.894 7.617a.975.975 0 0 1 0 1.414L.366 18.295a.974.974 0 0 0 0 1.413"
|
||||
// fill=""
|
||||
className="color000000 svgShape fill-[#fff]"
|
||||
></path>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
);
|
||||
|
||||
@@ -276,7 +276,7 @@ function ActiveJobs(props) {
|
||||
<div className="py-[20px] bg-white dark:bg-black dark:text-white px-4 rounded-2xl shadow-md md:flex justify-between items-start gap-8">
|
||||
{/* job title */}
|
||||
<div className="w-full">
|
||||
<div className="w-full flex justify-start space-x-3 items-start">
|
||||
<div className="w-full flex justify-start space-x-3 items-center">
|
||||
<button
|
||||
type="button"
|
||||
className="min-w-[45px] h-auto text-[#374557] border border-sky-blue p-1 rounded-full"
|
||||
|
||||
@@ -104,7 +104,7 @@ export default function MyJobTable({ MyJobList, reloadJobList, className }) {
|
||||
);
|
||||
};
|
||||
|
||||
const currentJobList = filterJobList();
|
||||
const currentJobList = filterJobList()?.filter(item => item?.job_mode == 'GENERAL'); // Show only jobs with job mode of GENERAL
|
||||
|
||||
// Handling Filter Pagination
|
||||
const filteredCurrentJobList = currentJobList?.slice(
|
||||
@@ -358,13 +358,14 @@ function myJobTableFeatures(
|
||||
{MyJobList?.data?.result_list?.length > 0 ? (
|
||||
filteredCurrentJobList.length > 0 ? (
|
||||
filteredCurrentJobList.map((value, index) => (
|
||||
<JobListItem
|
||||
key={index}
|
||||
index={index}
|
||||
value={value}
|
||||
image_server={MyJobList.data.session_image_server}
|
||||
/>
|
||||
))
|
||||
<JobListItem
|
||||
key={index}
|
||||
index={index}
|
||||
value={value}
|
||||
image_server={MyJobList.data.session_image_server}
|
||||
/>
|
||||
)
|
||||
)
|
||||
) : (
|
||||
<NoJobsRow text="No Jobs Available In This Category!" />
|
||||
)
|
||||
|
||||
@@ -16,6 +16,22 @@ export default function MyUploadedFiles({ uploadedFiles }) {
|
||||
const handlePagination = (e) => {
|
||||
handlePagingFunc(e, setCurrentPage);
|
||||
};
|
||||
|
||||
|
||||
//FUNCTION TO OPEN NEW WINDOW
|
||||
const openNewWindow = (e, url, width=1000, height=600) => {
|
||||
e.preventDefault()
|
||||
var leftPosition, topPosition;
|
||||
//Allow for borders.
|
||||
leftPosition = (window.screen.width / 2) - ((width / 2) + 10);
|
||||
//Allow for title and status bars.
|
||||
topPosition = (window.screen.height / 2) - ((height / 2) + 50);
|
||||
//Open the window.
|
||||
window.open(url, "",
|
||||
"status=no,height=" + height + ",width=" + width + ",resizable=yes,left="
|
||||
+ leftPosition + ",top=" + topPosition + ",screenX=" + leftPosition + ",screenY="
|
||||
+ topPosition + ",toolbar=no,menubar=no,scrollbars=yes,location=no,directories=no");
|
||||
}
|
||||
return (
|
||||
<>
|
||||
<div className="mb-4 w-full flex justify-end item-center">
|
||||
@@ -44,7 +60,8 @@ export default function MyUploadedFiles({ uploadedFiles }) {
|
||||
currentFiles.map((value, idx) => {
|
||||
let addedDate = value?.added?.split(" ")[0];
|
||||
let formattedSize = formatFileSize(value?.file_size);
|
||||
let imageLink = `${uploadedFiles?.image}${localStorage.getItem('session_token')}/myfile/${value.file_uid}`
|
||||
let downloadLink = value.file_type == 'video/mp4' ? `${process.env.REACT_APP_MEDIA_LINK}/myfile/${value.file_uid}` : `${uploadedFiles?.image}${localStorage.getItem('session_token')}/myfile/${value.file_uid}`
|
||||
|
||||
return (
|
||||
<tr
|
||||
key={value?.file_uid}
|
||||
@@ -103,8 +120,9 @@ export default function MyUploadedFiles({ uploadedFiles }) {
|
||||
<td className="text-right py-4 px-2">
|
||||
<div className="flex justify-center items-center">
|
||||
<a
|
||||
href={imageLink}
|
||||
href={downloadLink}
|
||||
title="download"
|
||||
onClick={(e)=> openNewWindow(e, downloadLink)}
|
||||
// className="w-20 h-11 flex justify-center items-center btn-gradient text-base rounded-full text-white"
|
||||
>
|
||||
<img
|
||||
|
||||
@@ -146,10 +146,12 @@ export default function UploadProduct({uploadTypes}) {
|
||||
|
||||
let reqData = { // PAYLOAD FOR API CALL
|
||||
// file_name: selectedFile.substring(0,21).replace(/ /gi, ""),
|
||||
|
||||
// file_data: img.file?.split(",")[1],
|
||||
file_name: `myfile.${imgDetails?.type?.split('/')[1]}`,
|
||||
file_size: imgDetails.size,
|
||||
file_type: imgDetails.type,
|
||||
file_data: img.file?.split(",")[1],
|
||||
files: imgDetails,
|
||||
title: itemName,
|
||||
description: description,
|
||||
msg_type: 'FILE',
|
||||
@@ -173,7 +175,7 @@ export default function UploadProduct({uploadTypes}) {
|
||||
|
||||
// API CALL TO UPLOAD COMES HERE
|
||||
setRequestStatus({loading: true, status: null, message: ''}) // SETS REQUEST LOADING TRUE
|
||||
apiCall.sendFiles(reqData).then(res=>{
|
||||
apiCall.uploadFile(reqData).then(res=>{
|
||||
if(res.status != 200 || res.data.internal_return < 0){
|
||||
return setRequestStatus({loading: false, status: false, message: 'Something went wrong, try again'})
|
||||
}
|
||||
@@ -311,6 +313,13 @@ export default function UploadProduct({uploadTypes}) {
|
||||
className="w-full h-full object-cover"
|
||||
controls
|
||||
></video>
|
||||
) : img.type === "audio" ? (
|
||||
<audio
|
||||
type=""
|
||||
src={img.file}
|
||||
className="w-full h-full object-cover"
|
||||
controls
|
||||
></audio>
|
||||
) : img.type != null ? (
|
||||
<p>{selectedFile}</p>
|
||||
) : null}
|
||||
@@ -434,6 +443,7 @@ export default function UploadProduct({uploadTypes}) {
|
||||
// to="/"
|
||||
onClick={uploadItem}
|
||||
className="sm:w-[126px] h-[46px] w-[100px] flex justify-center items-center btn-gradient sm:text-18 text-sm rounded-full text-white"
|
||||
disabled={uploadTypes.loading || requestStatus.loading}
|
||||
>
|
||||
Upload
|
||||
</button>
|
||||
|
||||
@@ -7,7 +7,7 @@ import usersService from '../../services/UsersService'
|
||||
export default function AttachFile({data='', fontSize='text-sm', showOnData=false}) {
|
||||
|
||||
const apiCall = new usersService()
|
||||
|
||||
|
||||
let [uploadedList, setUploadedList] = useState({loading: true, data:{}})
|
||||
let [reloadList, setReloadList] = useState(false) // Triggers list of upload reload
|
||||
|
||||
@@ -19,9 +19,9 @@ export default function AttachFile({data='', fontSize='text-sm', showOnData=fals
|
||||
let inputs = {
|
||||
file: event.target.files[0],
|
||||
job_uid: data?.job_uid,
|
||||
uid: localStorage.getItem("uid"),
|
||||
// uid: localStorage.getItem("uid"),
|
||||
// member_id: localStorage.getItem("member_id"),
|
||||
sessionid: localStorage.getItem("session_token"),
|
||||
// sessionid: localStorage.getItem("session_token"),
|
||||
};
|
||||
setRequestStatus({loading: true, status:false, message:''})
|
||||
if(!inputs.file){
|
||||
@@ -31,12 +31,11 @@ export default function AttachFile({data='', fontSize='text-sm', showOnData=fals
|
||||
}, 3000)
|
||||
return
|
||||
}
|
||||
const formData = new FormData()
|
||||
for (let input in inputs) {
|
||||
formData.append(input, inputs[input]);
|
||||
}
|
||||
|
||||
axios.post(`${process.env.REACT_APP_MEDIA_LINK}/upload/task`,formData).then(res => {
|
||||
// const formData = new FormData()
|
||||
// for (let input in inputs) {
|
||||
// formData.append(input, inputs[input]);
|
||||
// }
|
||||
apiCall.uploadTaskFile(inputs).then(res => {
|
||||
if(res.data.internal_return < 0){
|
||||
inputFile.current.value = null
|
||||
setRequestStatus({loading: false, status:false, message:'upload failed'})
|
||||
@@ -61,6 +60,21 @@ export default function AttachFile({data='', fontSize='text-sm', showOnData=fals
|
||||
})
|
||||
}
|
||||
|
||||
//FUNCTION TO OPEN NEW WINDOW
|
||||
const openNewWindow = (e, url, width=1000, height=600) => {
|
||||
e.preventDefault()
|
||||
var leftPosition, topPosition;
|
||||
//Allow for borders.
|
||||
leftPosition = (window.screen.width / 2) - ((width / 2) + 10);
|
||||
//Allow for title and status bars.
|
||||
topPosition = (window.screen.height / 2) - ((height / 2) + 50);
|
||||
//Open the window.
|
||||
window.open(url, "",
|
||||
"status=no,height=" + height + ",width=" + width + ",resizable=yes,left="
|
||||
+ leftPosition + ",top=" + topPosition + ",screenX=" + leftPosition + ",screenY="
|
||||
+ topPosition + ",toolbar=no,menubar=no,scrollbars=yes,location=no,directories=no");
|
||||
}
|
||||
|
||||
useEffect(()=>{
|
||||
apiCall.jobManagerFiles({job_uid:data?.job_uid || data?.origin_job_uid}).then(res => {
|
||||
setUploadedList({loading: false, data:res.data})
|
||||
@@ -97,6 +111,7 @@ export default function AttachFile({data='', fontSize='text-sm', showOnData=fals
|
||||
uploadedList.data.result_list.length > 0 ?
|
||||
uploadedList.data.result_list.map((item, index) => {
|
||||
let fileNameExt = item.originalname.split('.')[item.originalname.split('.').length - 1]
|
||||
let downloadLink = fileNameExt == 'mp4' ? `${process.env.REACT_APP_MEDIA_LINK}/mytask/${item.file_uid}` : `${uploadedList?.data?.session_image_server}/${localStorage.getItem("session_token")}/jobfile/${item.file_uid}`
|
||||
return(
|
||||
<div key={item.file_uid} className={`my-[6px] flex justify-start gap-2 ${fontSize}`}>
|
||||
<span>{index + 1}:</span>
|
||||
@@ -104,7 +119,8 @@ export default function AttachFile({data='', fontSize='text-sm', showOnData=fals
|
||||
target='_blank'
|
||||
alt='download-link'
|
||||
className=''
|
||||
href={`${uploadedList?.data?.session_image_server}/${localStorage.getItem("session_token")}/jobfile/${item.file_uid}`}
|
||||
href={downloadLink}
|
||||
onClick={(e)=> openNewWindow(e, downloadLink)}
|
||||
>
|
||||
{(item.originalname).toString().length > 30 ? (item.originalname).toString().slice(0, 26) + '..._.' + fileNameExt : (item.originalname).toString()}
|
||||
</a>
|
||||
@@ -139,6 +155,7 @@ export default function AttachFile({data='', fontSize='text-sm', showOnData=fals
|
||||
<div className='text-[12px] w-full p-2 h-20 overflow-y-auto flex flex-col gap-2'>
|
||||
{uploadedList.data.result_list.map((item, index) => {
|
||||
let fileNameExt = item.originalname.split('.')[item.originalname.split('.').length - 1]
|
||||
let downloadLink = fileNameExt == 'mp4' ? `${process.env.REACT_APP_MEDIA_LINK}/mytask/${item.file_uid}` : `${uploadedList?.data?.session_image_server}/${localStorage.getItem("session_token")}/jobfile/${item.file_uid}`
|
||||
return(
|
||||
<div key={item.file_uid} className={`my-[6px] flex justify-start gap-2 ${fontSize}`}>
|
||||
<span>{index + 1}:</span>
|
||||
@@ -146,7 +163,8 @@ export default function AttachFile({data='', fontSize='text-sm', showOnData=fals
|
||||
target='_blank'
|
||||
alt='download-link'
|
||||
className=''
|
||||
href={`${uploadedList?.data?.session_image_server}/${localStorage.getItem("session_token")}/jobfile/${item.file_uid}`}
|
||||
href={downloadLink}
|
||||
onClick={(e)=> openNewWindow(e, downloadLink)}
|
||||
>
|
||||
{(item.originalname).toString().length > 30 ? (item.originalname).toString().slice(0, 26) + '..._.' + fileNameExt : (item.originalname).toString()}
|
||||
</a>
|
||||
|
||||
@@ -908,6 +908,42 @@ class usersService {
|
||||
return this.postAuxEnd("/uploads", postData);
|
||||
}
|
||||
|
||||
// FUNCTION TO UPLOAD RESOURCE FILES
|
||||
uploadFile(reqData) {
|
||||
var postData = {
|
||||
uid: localStorage.getItem("uid"),
|
||||
member_id: localStorage.getItem("member_id"),
|
||||
sessionid: localStorage.getItem("session_token"),
|
||||
action: apiConst.WRENCHBOARD_CONTRACT_MESSAGE,
|
||||
...reqData,
|
||||
};
|
||||
|
||||
const formData = new FormData();
|
||||
for (let data in postData) {
|
||||
formData.append(data, postData[data]);
|
||||
}
|
||||
|
||||
return this.postAuxEnd("/upload/resources", formData, true);
|
||||
}
|
||||
|
||||
// FUNCTION TO UPLOAD TASK FILES
|
||||
uploadTaskFile(reqData) {
|
||||
var postData = {
|
||||
uid: localStorage.getItem("uid"),
|
||||
member_id: localStorage.getItem("member_id"),
|
||||
sessionid: localStorage.getItem("session_token"),
|
||||
// action: apiConst.WRENCHBOARD_CONTRACT_MESSAGE,
|
||||
...reqData,
|
||||
};
|
||||
|
||||
const formData = new FormData();
|
||||
for (let data in postData) {
|
||||
formData.append(data, postData[data]);
|
||||
}
|
||||
|
||||
return this.postAuxEnd("/upload/task", formData, true);
|
||||
}
|
||||
|
||||
// END POINT TO DELETE A JOB
|
||||
deleteJob(reqData) {
|
||||
var postData = {
|
||||
@@ -1456,8 +1492,8 @@ class usersService {
|
||||
});
|
||||
}
|
||||
|
||||
postAuxEnd(uri, reqData) {
|
||||
const endPoint = process.env.REACT_APP_USERS_ENDPOINT + uri;
|
||||
postAuxEnd(uri, reqData, uploadPost=false) {
|
||||
const endPoint = uploadPost ? process.env.REACT_APP_MEDIA_LINK + uri : process.env.REACT_APP_USERS_ENDPOINT + uri;
|
||||
const session_token = localStorage.getItem("session_token");
|
||||
// session_token = session_token !=null ?session_token : '';
|
||||
// 'Authorization': `Basic ${(session_token !=null) ?session_token : ''}`,
|
||||
|
||||
Reference in New Issue
Block a user