@@ -19,3 +19,6 @@ npx deadfile ./src/index.js --exclude build templates
|
|||||||
hasura migrate create "Init" --from-server --endpoint https://db.imex.online/ --admin-secret 'Production-ImEXOnline!@#'
|
hasura migrate create "Init" --from-server --endpoint https://db.imex.online/ --admin-secret 'Production-ImEXOnline!@#'
|
||||||
hasura migrate apply --version "1620771761757" --skip-execution --endpoint https://db.imex.online/ --admin-secret 'Production-ImEXOnline!@#'
|
hasura migrate apply --version "1620771761757" --skip-execution --endpoint https://db.imex.online/ --admin-secret 'Production-ImEXOnline!@#'
|
||||||
hasura migrate status --endpoint https://db.imex.online/ --admin-secret 'Production-ImEXOnline!@#'
|
hasura migrate status --endpoint https://db.imex.online/ --admin-secret 'Production-ImEXOnline!@#'
|
||||||
|
|
||||||
|
Generate the license file:
|
||||||
|
$ generate-license-file --input package.json --output third-party-licenses.txt --overwrite
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -9,6 +9,7 @@ import { GET_DOCUMENTS_BY_JOB } from "../../graphql/documents.queries";
|
|||||||
import { selectBodyshop } from "../../redux/user/user.selectors";
|
import { selectBodyshop } from "../../redux/user/user.selectors";
|
||||||
import AlertComponent from "../alert/alert.component";
|
import AlertComponent from "../alert/alert.component";
|
||||||
import JobDocumentsGalleryExternal from "../jobs-documents-gallery/jobs-documents-gallery.external.component";
|
import JobDocumentsGalleryExternal from "../jobs-documents-gallery/jobs-documents-gallery.external.component";
|
||||||
|
import JobDocumentsLocalGalleryExternal from "../jobs-documents-local-gallery/jobs-documents-local-gallery.external.component";
|
||||||
import LoadingSpinner from "../loading-spinner/loading-spinner.component";
|
import LoadingSpinner from "../loading-spinner/loading-spinner.component";
|
||||||
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
@@ -58,17 +59,24 @@ export function ChatMediaSelector({
|
|||||||
{selectedMedia.filter((s) => s.isSelected).length >= 10 ? (
|
{selectedMedia.filter((s) => s.isSelected).length >= 10 ? (
|
||||||
<div style={{ color: "red" }}>{t("messaging.labels.maxtenimages")}</div>
|
<div style={{ color: "red" }}>{t("messaging.labels.maxtenimages")}</div>
|
||||||
) : null}
|
) : null}
|
||||||
{data && (
|
{!bodyshop.uselocalmediaserver && data && (
|
||||||
<JobDocumentsGalleryExternal
|
<JobDocumentsGalleryExternal
|
||||||
data={data ? data.documents : []}
|
data={data ? data.documents : []}
|
||||||
externalMediaState={[selectedMedia, setSelectedMedia]}
|
externalMediaState={[selectedMedia, setSelectedMedia]}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
|
{bodyshop.uselocalmediaserver && visible && (
|
||||||
|
<JobDocumentsLocalGalleryExternal
|
||||||
|
externalMediaState={[selectedMedia, setSelectedMedia]}
|
||||||
|
jobId={
|
||||||
|
conversation.job_conversations[0] &&
|
||||||
|
conversation.job_conversations[0].jobid
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
||||||
if (bodyshop.uselocalmediaserver) return null;
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Popover
|
<Popover
|
||||||
content={
|
content={
|
||||||
|
|||||||
@@ -5,12 +5,15 @@ import { connect } from "react-redux";
|
|||||||
import { createStructuredSelector } from "reselect";
|
import { createStructuredSelector } from "reselect";
|
||||||
import { GET_DOCUMENTS_BY_JOB } from "../../graphql/documents.queries";
|
import { GET_DOCUMENTS_BY_JOB } from "../../graphql/documents.queries";
|
||||||
import { selectEmailConfig } from "../../redux/email/email.selectors";
|
import { selectEmailConfig } from "../../redux/email/email.selectors";
|
||||||
|
import { selectBodyshop } from "../../redux/user/user.selectors";
|
||||||
import AlertComponent from "../alert/alert.component";
|
import AlertComponent from "../alert/alert.component";
|
||||||
import JobDocumentsGalleryExternal from "../jobs-documents-gallery/jobs-documents-gallery.external.component";
|
import JobDocumentsGalleryExternal from "../jobs-documents-gallery/jobs-documents-gallery.external.component";
|
||||||
|
import JobsDocumentsLocalGalleryExternalComponent from "../jobs-documents-local-gallery/jobs-documents-local-gallery.external.component";
|
||||||
import LoadingSpinner from "../loading-spinner/loading-spinner.component";
|
import LoadingSpinner from "../loading-spinner/loading-spinner.component";
|
||||||
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
//currentUser: selectCurrentUser
|
//currentUser: selectCurrentUser
|
||||||
|
bodyshop: selectBodyshop,
|
||||||
emailConfig: selectEmailConfig,
|
emailConfig: selectEmailConfig,
|
||||||
});
|
});
|
||||||
const mapDispatchToProps = (dispatch) => ({
|
const mapDispatchToProps = (dispatch) => ({
|
||||||
@@ -25,6 +28,7 @@ export function EmailDocumentsComponent({
|
|||||||
emailConfig,
|
emailConfig,
|
||||||
form,
|
form,
|
||||||
selectedMediaState,
|
selectedMediaState,
|
||||||
|
bodyshop,
|
||||||
}) {
|
}) {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
|
||||||
@@ -52,12 +56,18 @@ export function EmailDocumentsComponent({
|
|||||||
10485760 - new Blob([form.getFieldValue("html")]).size ? (
|
10485760 - new Blob([form.getFieldValue("html")]).size ? (
|
||||||
<div style={{ color: "red" }}>{t("general.errors.sizelimit")}</div>
|
<div style={{ color: "red" }}>{t("general.errors.sizelimit")}</div>
|
||||||
) : null}
|
) : null}
|
||||||
{data && (
|
{!bodyshop.uselocalmediaserver && data && (
|
||||||
<JobDocumentsGalleryExternal
|
<JobDocumentsGalleryExternal
|
||||||
data={data ? data.documents : []}
|
data={data ? data.documents : []}
|
||||||
externalMediaState={[selectedMedia, setSelectedMedia]}
|
externalMediaState={[selectedMedia, setSelectedMedia]}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
|
{bodyshop.uselocalmediaserver && (
|
||||||
|
<JobsDocumentsLocalGalleryExternalComponent
|
||||||
|
externalMediaState={[selectedMedia, setSelectedMedia]}
|
||||||
|
jobId={emailConfig.jobid}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -160,14 +160,13 @@ export function EmailOverlayComponent({
|
|||||||
</Form.Item>
|
</Form.Item>
|
||||||
|
|
||||||
<Tabs>
|
<Tabs>
|
||||||
{!bodyshop.uselocalmediaserver && (
|
<Tabs.TabPane tab={t("emails.labels.documents")} key="documents">
|
||||||
<Tabs.TabPane tab={t("emails.labels.documents")} key="documents">
|
<EmailDocumentsComponent
|
||||||
<EmailDocumentsComponent
|
selectedMediaState={selectedMediaState}
|
||||||
selectedMediaState={selectedMediaState}
|
form={form}
|
||||||
form={form}
|
/>
|
||||||
/>
|
</Tabs.TabPane>
|
||||||
</Tabs.TabPane>
|
|
||||||
)}
|
|
||||||
<Tabs.TabPane tab={t("emails.labels.attachments")} key="attachments">
|
<Tabs.TabPane tab={t("emails.labels.attachments")} key="attachments">
|
||||||
{bodyshop.uselocalmediaserver && emailConfig.jobid && (
|
{bodyshop.uselocalmediaserver && emailConfig.jobid && (
|
||||||
<a href={CreateExplorerLinkForJob({ jobid: emailConfig.jobid })}>
|
<a href={CreateExplorerLinkForJob({ jobid: emailConfig.jobid })}>
|
||||||
|
|||||||
@@ -95,7 +95,7 @@ mutation UNVOID_JOB($jobId: uuid!) {
|
|||||||
|
|
||||||
insertAuditTrail({
|
insertAuditTrail({
|
||||||
jobid: job.id,
|
jobid: job.id,
|
||||||
operation: AuditTrailMapping.admin_unvoicejob(),
|
operation: AuditTrailMapping.admin_jobunvoid(),
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
notification["error"]({
|
notification["error"]({
|
||||||
|
|||||||
@@ -0,0 +1,79 @@
|
|||||||
|
import React, { useEffect } from "react";
|
||||||
|
import Gallery from "react-grid-gallery";
|
||||||
|
import { useTranslation } from "react-i18next";
|
||||||
|
import { connect } from "react-redux";
|
||||||
|
import { createStructuredSelector } from "reselect";
|
||||||
|
import {
|
||||||
|
getJobMedia,
|
||||||
|
toggleMediaSelected,
|
||||||
|
} from "../../redux/media/media.actions";
|
||||||
|
import { selectAllMedia } from "../../redux/media/media.selectors";
|
||||||
|
import { selectBodyshop } from "../../redux/user/user.selectors";
|
||||||
|
|
||||||
|
const mapStateToProps = createStructuredSelector({
|
||||||
|
bodyshop: selectBodyshop,
|
||||||
|
allMedia: selectAllMedia,
|
||||||
|
});
|
||||||
|
|
||||||
|
const mapDispatchToProps = (dispatch) => ({
|
||||||
|
getJobMedia: (id) => dispatch(getJobMedia(id)),
|
||||||
|
|
||||||
|
toggleMediaSelected: ({ jobid, filename }) =>
|
||||||
|
dispatch(toggleMediaSelected({ jobid, filename })),
|
||||||
|
});
|
||||||
|
|
||||||
|
export default connect(
|
||||||
|
mapStateToProps,
|
||||||
|
mapDispatchToProps
|
||||||
|
)(JobDocumentsLocalGalleryExternal);
|
||||||
|
|
||||||
|
function JobDocumentsLocalGalleryExternal({
|
||||||
|
jobId,
|
||||||
|
externalMediaState,
|
||||||
|
getJobMedia,
|
||||||
|
toggleMediaSelected,
|
||||||
|
allMedia,
|
||||||
|
}) {
|
||||||
|
const [galleryImages, setgalleryImages] = externalMediaState;
|
||||||
|
const { t } = useTranslation();
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if ( jobId) {
|
||||||
|
getJobMedia(jobId);
|
||||||
|
}
|
||||||
|
}, [jobId, getJobMedia]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
let documents =
|
||||||
|
allMedia && allMedia[jobId]
|
||||||
|
? allMedia[jobId].reduce((acc, val) => {
|
||||||
|
if (
|
||||||
|
val.type &&
|
||||||
|
val.type.mime &&
|
||||||
|
val.type.mime.startsWith("image")
|
||||||
|
) {
|
||||||
|
acc.push(val);
|
||||||
|
}
|
||||||
|
return acc;
|
||||||
|
}, [])
|
||||||
|
: [];
|
||||||
|
|
||||||
|
setgalleryImages(documents);
|
||||||
|
}, [allMedia, jobId, setgalleryImages, t]);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="clearfix">
|
||||||
|
<Gallery
|
||||||
|
images={galleryImages}
|
||||||
|
backdropClosesModal={true}
|
||||||
|
onSelectImage={(index, image) => {
|
||||||
|
setgalleryImages(
|
||||||
|
galleryImages.map((g, idx) =>
|
||||||
|
index === idx ? { ...g, isSelected: !g.isSelected } : g
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -1,12 +1,15 @@
|
|||||||
import React from "react";
|
import React from "react";
|
||||||
|
import RbacWrapperComponent from "../../components/rbac-wrapper/rbac-wrapper.component";
|
||||||
import TechLookupJobsDrawer from "../../components/tech-lookup-jobs-drawer/tech-lookup-jobs-drawer.component";
|
import TechLookupJobsDrawer from "../../components/tech-lookup-jobs-drawer/tech-lookup-jobs-drawer.component";
|
||||||
import TechLookupJobsList from "../../components/tech-lookup-jobs-list/tech-lookup-jobs-list.component";
|
import TechLookupJobsList from "../../components/tech-lookup-jobs-list/tech-lookup-jobs-list.component";
|
||||||
|
|
||||||
export default function TechLookupContainer() {
|
export default function TechLookupContainer() {
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<TechLookupJobsList />
|
<RbacWrapperComponent action="jobs:list-active">
|
||||||
<TechLookupJobsDrawer />
|
<TechLookupJobsList />
|
||||||
|
<TechLookupJobsDrawer />
|
||||||
|
</RbacWrapperComponent>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ const AuditTrailMapping = {
|
|||||||
i18n.t("audit_trail.messages.admin_jobmarkforreexport"),
|
i18n.t("audit_trail.messages.admin_jobmarkforreexport"),
|
||||||
admin_jobmarkexported: () =>
|
admin_jobmarkexported: () =>
|
||||||
i18n.t("audit_trail.messages.admin_jobmarkexported"),
|
i18n.t("audit_trail.messages.admin_jobmarkexported"),
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export default AuditTrailMapping;
|
export default AuditTrailMapping;
|
||||||
|
|||||||
Reference in New Issue
Block a user