Merged in release/2025-01-31 (pull request #2091)
Release/2025 01 31 into test-AIO - IO-2681
This commit is contained in:
@@ -32,6 +32,7 @@ import AddToProduction from "./jobs-detail-header-actions.addtoproduction.util";
|
|||||||
import DuplicateJob from "./jobs-detail-header-actions.duplicate.util";
|
import DuplicateJob from "./jobs-detail-header-actions.duplicate.util";
|
||||||
import JobsDetailHeaderActionsToggleProduction from "./jobs-detail-header-actions.toggle-production";
|
import JobsDetailHeaderActionsToggleProduction from "./jobs-detail-header-actions.toggle-production";
|
||||||
import { useNotification } from "../../contexts/Notifications/notificationContext.jsx";
|
import { useNotification } from "../../contexts/Notifications/notificationContext.jsx";
|
||||||
|
import ShareToTeamsButton from "../share-to-teams/share-to-teams.component.jsx";
|
||||||
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
bodyshop: selectBodyshop,
|
bodyshop: selectBodyshop,
|
||||||
@@ -133,10 +134,10 @@ export function JobsDetailHeaderActions({
|
|||||||
const notification = useNotification();
|
const notification = useNotification();
|
||||||
|
|
||||||
const {
|
const {
|
||||||
treatments: { ImEXPay }
|
treatments: { ImEXPay, Share_To_Teams }
|
||||||
} = useSplitTreatments({
|
} = useSplitTreatments({
|
||||||
attributes: {},
|
attributes: {},
|
||||||
names: ["ImEXPay"],
|
names: ["ImEXPay", "Share_To_Teams"],
|
||||||
splitKey: bodyshop && bodyshop.imexshopid
|
splitKey: bodyshop && bodyshop.imexshopid
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -971,6 +972,14 @@ export function JobsDetailHeaderActions({
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
if (Share_To_Teams?.treatment === "on") {
|
||||||
|
menuItems.push({
|
||||||
|
key: "sharetoteams",
|
||||||
|
id: "job-actions-sharetoteams",
|
||||||
|
label: <ShareToTeamsButton noIcon={true} urlOverride={`${window.location.origin}${window.location.pathname}`} />
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
menuItems.push({
|
menuItems.push({
|
||||||
key: "exportcustdata",
|
key: "exportcustdata",
|
||||||
id: "job-actions-exportcustdata",
|
id: "job-actions-exportcustdata",
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ import LockWrapperComponent from "../lock-wrapper/lock-wrapper.component";
|
|||||||
import PartsReceiveModalContainer from "../parts-receive-modal/parts-receive-modal.container";
|
import PartsReceiveModalContainer from "../parts-receive-modal/parts-receive-modal.container";
|
||||||
import PrintWrapper from "../print-wrapper/print-wrapper.component";
|
import PrintWrapper from "../print-wrapper/print-wrapper.component";
|
||||||
import PartsOrderDrawer from "./parts-order-list-table-drawer.component";
|
import PartsOrderDrawer from "./parts-order-list-table-drawer.component";
|
||||||
|
import ShareToTeamsButton from "../share-to-teams/share-to-teams.component.jsx";
|
||||||
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
jobRO: selectJobReadOnly,
|
jobRO: selectJobReadOnly,
|
||||||
@@ -66,19 +67,21 @@ export function PartsOrderListTableComponent({
|
|||||||
|
|
||||||
const parts_orders = billsQuery.data ? billsQuery.data.parts_orders : [];
|
const parts_orders = billsQuery.data ? billsQuery.data.parts_orders : [];
|
||||||
const { refetch } = billsQuery;
|
const { refetch } = billsQuery;
|
||||||
|
// label: <ShareToTeamsButton noIcon={true} urlOverride={`${window.location.origin}${window.location.pathname}`} />
|
||||||
const recordActions = (record, showView = false) => (
|
const recordActions = (record, showView = false) => (
|
||||||
<Space direction="horizontal" wrap>
|
<Space direction="horizontal" wrap>
|
||||||
|
<ShareToTeamsButton
|
||||||
|
linkText={""}
|
||||||
|
urlOverride={`${window.location.origin}/manage/jobs/${job.id}?partsorderid=${record.id}&tab=partssublet `}
|
||||||
|
/>
|
||||||
{showView && (
|
{showView && (
|
||||||
<Button
|
<Button
|
||||||
|
icon={<EyeFilled />}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
handleOnRowClick(record);
|
handleOnRowClick(record);
|
||||||
}}
|
}}
|
||||||
>
|
/>
|
||||||
<EyeFilled />
|
|
||||||
</Button>
|
|
||||||
)}
|
)}
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
disabled={jobRO || record.return || record.vendor.id === bodyshop.inhousevendorid}
|
disabled={jobRO || record.return || record.vendor.id === bodyshop.inhousevendorid}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
@@ -106,6 +109,7 @@ export function PartsOrderListTableComponent({
|
|||||||
</Button>
|
</Button>
|
||||||
<Button
|
<Button
|
||||||
title={t("tasks.buttons.create")}
|
title={t("tasks.buttons.create")}
|
||||||
|
icon={<FaTasks />}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
setTaskUpsertContext({
|
setTaskUpsertContext({
|
||||||
context: {
|
context: {
|
||||||
@@ -114,9 +118,7 @@ export function PartsOrderListTableComponent({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}}
|
}}
|
||||||
>
|
/>
|
||||||
<FaTasks />
|
|
||||||
</Button>
|
|
||||||
<Popconfirm
|
<Popconfirm
|
||||||
title={t("parts_orders.labels.confirmdelete")}
|
title={t("parts_orders.labels.confirmdelete")}
|
||||||
disabled={jobRO}
|
disabled={jobRO}
|
||||||
@@ -137,9 +139,7 @@ export function PartsOrderListTableComponent({
|
|||||||
});
|
});
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<Button disabled={jobRO}>
|
<Button disabled={jobRO} icon={<DeleteFilled />} />
|
||||||
<DeleteFilled />
|
|
||||||
</Button>
|
|
||||||
</Popconfirm>
|
</Popconfirm>
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
|
|||||||
@@ -20,6 +20,8 @@ import dayjs from "../../utils/day";
|
|||||||
|
|
||||||
import JobPartsQueueCount from "../job-parts-queue-count/job-parts-queue-count.component";
|
import JobPartsQueueCount from "../job-parts-queue-count/job-parts-queue-count.component";
|
||||||
import OwnerNameDisplay from "../owner-name-display/owner-name-display.component";
|
import OwnerNameDisplay from "../owner-name-display/owner-name-display.component";
|
||||||
|
import ShareToTeamsButton from "../share-to-teams/share-to-teams.component.jsx";
|
||||||
|
import { SiMicrosoftteams } from "react-icons/si";
|
||||||
|
|
||||||
const cardColor = (ssbuckets, totalHrs) => {
|
const cardColor = (ssbuckets, totalHrs) => {
|
||||||
const bucket = ssbuckets.find((bucket) => bucket.gte <= totalHrs && (!bucket.lt || bucket.lt > totalHrs));
|
const bucket = ssbuckets.find((bucket) => bucket.gte <= totalHrs && (!bucket.lt || bucket.lt > totalHrs));
|
||||||
@@ -417,9 +419,20 @@ export default function ProductionBoardCard({ technician, card, bodyshop, cardSe
|
|||||||
title={!isBodyEmpty ? headerContent : null}
|
title={!isBodyEmpty ? headerContent : null}
|
||||||
extra={
|
extra={
|
||||||
!isBodyEmpty && (
|
!isBodyEmpty && (
|
||||||
<Link to={{ search: `?selected=${card.id}` }}>
|
<Space>
|
||||||
<EyeFilled />
|
<ShareToTeamsButton
|
||||||
</Link>
|
noIcon={true}
|
||||||
|
linkText={
|
||||||
|
<div className="share-to-teams-badge">
|
||||||
|
<SiMicrosoftteams />
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
urlOverride={`${window.location.origin}/manage/jobs/${card.id}`}
|
||||||
|
/>
|
||||||
|
<Link to={{ search: `?selected=${card.id}` }}>
|
||||||
|
<EyeFilled />
|
||||||
|
</Link>
|
||||||
|
</Space>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -10,6 +10,16 @@
|
|||||||
.height-preserving-container {
|
.height-preserving-container {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.share-to-teams-badge {
|
||||||
|
background-color: #cccccc;
|
||||||
|
border-radius: 50%;
|
||||||
|
width: 24px;
|
||||||
|
height: 24px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
.react-trello-column-header {
|
.react-trello-column-header {
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ import ProductionListColumnNote from "./production-list-columns.productionnote.c
|
|||||||
import ProductionListColumnCategory from "./production-list-columns.status.category";
|
import ProductionListColumnCategory from "./production-list-columns.status.category";
|
||||||
import ProductionListColumnStatus from "./production-list-columns.status.component";
|
import ProductionListColumnStatus from "./production-list-columns.status.component";
|
||||||
import ProductionListColumnTouchTime from "./prodution-list-columns.touchtime.component";
|
import ProductionListColumnTouchTime from "./prodution-list-columns.touchtime.component";
|
||||||
|
import ShareToTeamsButton from "../share-to-teams/share-to-teams.component.jsx";
|
||||||
|
|
||||||
const getEmployeeName = (employeeId, employees) => {
|
const getEmployeeName = (employeeId, employees) => {
|
||||||
const employee = employees.find((e) => e.id === employeeId);
|
const employee = employees.find((e) => e.id === employeeId);
|
||||||
@@ -41,7 +42,17 @@ const r = ({ technician, state, activeStatuses, data, bodyshop, refetch, treatme
|
|||||||
dataIndex: "viewdetail",
|
dataIndex: "viewdetail",
|
||||||
key: "viewdetail",
|
key: "viewdetail",
|
||||||
ellipsis: true,
|
ellipsis: true,
|
||||||
render: (text, record) => <Link to={{ search: `?selected=${record.id}` }}>{i18n.t("general.labels.view")}</Link>
|
render: (text, record) => (
|
||||||
|
<Space>
|
||||||
|
<Link to={{ search: `?selected=${record.id}` }}>{i18n.t("general.labels.view")}</Link>
|
||||||
|
<ShareToTeamsButton
|
||||||
|
noIcon={true}
|
||||||
|
linkText={"Share"}
|
||||||
|
noIconStyle={{ color: "#1890ff" }}
|
||||||
|
urlOverride={`${window.location.origin}/manage/jobs/${record.id}`}
|
||||||
|
/>
|
||||||
|
</Space>
|
||||||
|
)
|
||||||
},
|
},
|
||||||
...(Enhanced_Payroll.treatment === "on"
|
...(Enhanced_Payroll.treatment === "on"
|
||||||
? [
|
? [
|
||||||
|
|||||||
@@ -0,0 +1,124 @@
|
|||||||
|
import React from "react";
|
||||||
|
import PropTypes from "prop-types";
|
||||||
|
import { Button } from "antd";
|
||||||
|
import { useLocation } from "react-router-dom";
|
||||||
|
import { SiMicrosoftteams } from "react-icons/si";
|
||||||
|
import { useTranslation } from "react-i18next";
|
||||||
|
import { useSplitTreatments } from "@splitsoftware/splitio-react";
|
||||||
|
import { connect } from "react-redux";
|
||||||
|
import { createStructuredSelector } from "reselect";
|
||||||
|
import { selectBodyshop } from "../../redux/user/user.selectors.js";
|
||||||
|
|
||||||
|
const mapStateToProps = createStructuredSelector({
|
||||||
|
bodyshop: selectBodyshop
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ShareToTeamsButton component for sharing content to Microsoft Teams via an HTTP link.
|
||||||
|
*
|
||||||
|
* This component creates a button or link that opens the Microsoft Teams share dialog with
|
||||||
|
* the provided URL, title, and message text through query parameters. The popup window is centered on the screen.
|
||||||
|
*
|
||||||
|
* @param {Object} props - The component's props.
|
||||||
|
* @param {string} [props.messageTextOverride] - Custom message text for sharing.
|
||||||
|
* @param {string} [props.urlOverride] - Custom URL to share instead of the current page's URL.
|
||||||
|
* @param {string} [props.pageTitleOverride] - Custom title for the shared page.
|
||||||
|
* @param {boolean} [props.noIcon=false] - If true, renders as a simple text link instead of a button with an icon.
|
||||||
|
* @param {Object} [props.noIconStyle={}] - Style object for the text link when noIcon is true.
|
||||||
|
* @param {Object} [props.buttonStyle={}] - Style object for the Ant Design button.
|
||||||
|
* @param {Object} [props.buttonIconStyle={}] - Style object for the icon within the button.
|
||||||
|
* @param {string} [props.linkText] - Text to display on the button or link.
|
||||||
|
* @param {Object} [props.additionalProps] - Additional props to pass to the rendered component.
|
||||||
|
* @returns {React.ReactElement} A button or text link for sharing to Microsoft Teams.
|
||||||
|
*/
|
||||||
|
const ShareToTeamsComponent = ({
|
||||||
|
bodyshop,
|
||||||
|
messageTextOverride,
|
||||||
|
urlOverride,
|
||||||
|
pageTitleOverride,
|
||||||
|
noIcon = false,
|
||||||
|
noIconStyle = {},
|
||||||
|
buttonStyle = {},
|
||||||
|
buttonIconStyle = {},
|
||||||
|
linkText,
|
||||||
|
...additionalProps
|
||||||
|
}) => {
|
||||||
|
const location = useLocation();
|
||||||
|
const { t } = useTranslation();
|
||||||
|
|
||||||
|
const {
|
||||||
|
treatments: { Share_To_Teams }
|
||||||
|
} = useSplitTreatments({
|
||||||
|
attributes: {},
|
||||||
|
names: ["Share_To_Teams"],
|
||||||
|
splitKey: bodyshop && bodyshop.imexshopid
|
||||||
|
});
|
||||||
|
|
||||||
|
const currentUrl =
|
||||||
|
urlOverride ||
|
||||||
|
encodeURIComponent(`${window.location.origin}${location.pathname}${location.search}${location.hash}`);
|
||||||
|
const pageTitle =
|
||||||
|
pageTitleOverride ||
|
||||||
|
encodeURIComponent(typeof document !== "undefined" ? document.title : t("general.actions.sharetoteams"));
|
||||||
|
const messageText = messageTextOverride || encodeURIComponent(t("general.actions.sharetoteams"));
|
||||||
|
|
||||||
|
// Construct the Teams share URL with parameters
|
||||||
|
const teamsShareUrl = `https://teams.microsoft.com/share?href=${currentUrl}&preText=${messageText}&title=${pageTitle}`;
|
||||||
|
|
||||||
|
// Function to open the centered share link in a new window/tab
|
||||||
|
const handleShare = () => {
|
||||||
|
const screenWidth = window.screen.width;
|
||||||
|
const screenHeight = window.screen.height;
|
||||||
|
const windowWidth = 600;
|
||||||
|
const windowHeight = 400;
|
||||||
|
|
||||||
|
const left = screenWidth / 2 - windowWidth / 2;
|
||||||
|
const top = screenHeight / 2 - windowHeight / 2;
|
||||||
|
|
||||||
|
const windowFeatures = `width=${windowWidth},height=${windowHeight},left=${left},top=${top}`;
|
||||||
|
|
||||||
|
// noinspection JSIgnoredPromiseFromCall
|
||||||
|
window.open(teamsShareUrl, "_blank", windowFeatures);
|
||||||
|
};
|
||||||
|
|
||||||
|
if (Share_To_Teams?.treatment !== "on") {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (noIcon) {
|
||||||
|
return (
|
||||||
|
<div style={{ cursor: "pointer", ...noIconStyle }} onClick={handleShare} {...additionalProps}>
|
||||||
|
{!linkText ? t("general.actions.sharetoteams") : linkText}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Button
|
||||||
|
style={{
|
||||||
|
backgroundColor: "#6264A7",
|
||||||
|
borderColor: "#6264A7",
|
||||||
|
color: "#FFFFFF",
|
||||||
|
...buttonStyle
|
||||||
|
}}
|
||||||
|
icon={<SiMicrosoftteams style={{ color: "#FFFFFF", ...buttonIconStyle }} />}
|
||||||
|
onClick={handleShare}
|
||||||
|
title={linkText === null ? t("general.actions.sharetoteams") : linkText}
|
||||||
|
{...additionalProps}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
ShareToTeamsComponent.propTypes = {
|
||||||
|
messageTextOverride: PropTypes.string,
|
||||||
|
urlOverride: PropTypes.string,
|
||||||
|
pageTitleOverride: PropTypes.string,
|
||||||
|
noIcon: PropTypes.bool,
|
||||||
|
noIconStyle: PropTypes.object,
|
||||||
|
buttonStyle: PropTypes.object,
|
||||||
|
buttonIconStyle: PropTypes.object,
|
||||||
|
linkText: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),
|
||||||
|
additionalProps: PropTypes.oneOfType([PropTypes.object, PropTypes.node])
|
||||||
|
};
|
||||||
|
|
||||||
|
export default connect(mapStateToProps)(ShareToTeamsComponent);
|
||||||
@@ -18,6 +18,7 @@ import { setModalContext } from "../../redux/modals/modals.actions";
|
|||||||
import { pageLimit } from "../../utils/config";
|
import { pageLimit } from "../../utils/config";
|
||||||
import { DateFormatter, DateTimeFormatter } from "../../utils/DateFormatter.jsx";
|
import { DateFormatter, DateTimeFormatter } from "../../utils/DateFormatter.jsx";
|
||||||
import dayjs from "../../utils/day";
|
import dayjs from "../../utils/day";
|
||||||
|
import ShareToTeamsButton from "../share-to-teams/share-to-teams.component.jsx";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Task List Component
|
* Task List Component
|
||||||
@@ -266,8 +267,13 @@ function TaskListComponent({
|
|||||||
width: "8%",
|
width: "8%",
|
||||||
render: (text, record) => (
|
render: (text, record) => (
|
||||||
<Space direction="horizontal">
|
<Space direction="horizontal">
|
||||||
|
<ShareToTeamsButton
|
||||||
|
linkText=""
|
||||||
|
urlOverride={`https://localhost:3000/manage/tasks/alltasks?taskid=${record.id}`}
|
||||||
|
/>
|
||||||
<Button
|
<Button
|
||||||
title={t("tasks.buttons.edit")}
|
title={t("tasks.buttons.edit")}
|
||||||
|
icon={<EditFilled />}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
setTaskUpsertContext({
|
setTaskUpsertContext({
|
||||||
context: {
|
context: {
|
||||||
@@ -276,18 +282,18 @@ function TaskListComponent({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}}
|
}}
|
||||||
>
|
/>
|
||||||
<EditFilled />
|
|
||||||
</Button>
|
|
||||||
<Button
|
<Button
|
||||||
title={t("tasks.buttons.complete")}
|
title={t("tasks.buttons.complete")}
|
||||||
onClick={() => toggleCompletedStatus(record.id, record.completed)}
|
onClick={() => toggleCompletedStatus(record.id, record.completed)}
|
||||||
>
|
icon={record.completed ? <CheckCircleOutlined /> : <CheckCircleFilled />}
|
||||||
{record.completed ? <CheckCircleOutlined /> : <CheckCircleFilled />}
|
/>
|
||||||
</Button>
|
|
||||||
<Button title={t("tasks.buttons.delete")} onClick={() => toggleDeletedStatus(record.id, record.deleted)}>
|
<Button
|
||||||
{record.deleted ? <DeleteOutlined /> : <DeleteFilled />}
|
title={t("tasks.buttons.delete")}
|
||||||
</Button>
|
onClick={() => toggleDeletedStatus(record.id, record.deleted)}
|
||||||
|
icon={record.deleted ? <DeleteOutlined /> : <DeleteFilled />}
|
||||||
|
/>
|
||||||
</Space>
|
</Space>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ export function TaskUpsertModalContainer({ bodyshop, currentUser, taskUpsert, to
|
|||||||
const [insertTask] = useMutation(MUTATION_INSERT_NEW_TASK);
|
const [insertTask] = useMutation(MUTATION_INSERT_NEW_TASK);
|
||||||
const [updateTask] = useMutation(MUTATION_UPDATE_TASK);
|
const [updateTask] = useMutation(MUTATION_UPDATE_TASK);
|
||||||
const { open, context } = taskUpsert;
|
const { open, context } = taskUpsert;
|
||||||
const { jobid, joblineid, billid, partsorderid, taskId, existingTask, query } = context;
|
const { jobid, joblineid, billid, partsorderid, taskId, existingTask, query, view } = context;
|
||||||
const [form] = Form.useForm();
|
const [form] = Form.useForm();
|
||||||
const [selectedJobId, setSelectedJobId] = useState(null);
|
const [selectedJobId, setSelectedJobId] = useState(null);
|
||||||
const [selectedJobDetails, setSelectedJobDetails] = useState(null);
|
const [selectedJobDetails, setSelectedJobDetails] = useState(null);
|
||||||
@@ -255,16 +255,14 @@ export function TaskUpsertModalContainer({ bodyshop, currentUser, taskUpsert, to
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const taskTitle = useMemo(() => {
|
|
||||||
return existingTask ? t("tasks.actions.edit") : t("tasks.actions.new");
|
|
||||||
}, [existingTask, t]);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Modal
|
<Modal
|
||||||
title={<span id="task-upsert-modal-title">{taskTitle}</span>}
|
title={<span id="task-upsert-modal-title">{view ? t("tasks.actions.view") : existingTask ? t("tasks.actions.edit") : t("tasks.actions.new")}</span>}
|
||||||
open={open}
|
open={open}
|
||||||
okText={t("general.actions.save")}
|
okText={t("general.actions.save")}
|
||||||
width="50%"
|
width="50%"
|
||||||
|
cancelText={!isTouched ? t("general.actions.ok") : t("general.actions.cancel")}
|
||||||
onOk={() => {
|
onOk={() => {
|
||||||
removeTaskIdFromUrl();
|
removeTaskIdFromUrl();
|
||||||
form.submit();
|
form.submit();
|
||||||
@@ -289,6 +287,7 @@ export function TaskUpsertModalContainer({ bodyshop, currentUser, taskUpsert, to
|
|||||||
loading={loading || (taskId && taskLoading)}
|
loading={loading || (taskId && taskLoading)}
|
||||||
error={error}
|
error={error}
|
||||||
data={data}
|
data={data}
|
||||||
|
view={view}
|
||||||
existingTask={existingTask || taskData?.tasks_by_pk}
|
existingTask={existingTask || taskData?.tasks_by_pk}
|
||||||
selectedJobId={selectedJobId}
|
selectedJobId={selectedJobId}
|
||||||
setSelectedJobId={setSelectedJobId}
|
setSelectedJobId={setSelectedJobId}
|
||||||
|
|||||||
@@ -46,7 +46,8 @@ export function AllTasksPageContainer({ setBreadcrumbs, setSelectedHeader, setTa
|
|||||||
if (taskId) {
|
if (taskId) {
|
||||||
setTaskUpsertContext({
|
setTaskUpsertContext({
|
||||||
context: {
|
context: {
|
||||||
taskId
|
taskId,
|
||||||
|
view: true
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
urlParams.delete("taskid");
|
urlParams.delete("taskid");
|
||||||
|
|||||||
@@ -1193,7 +1193,9 @@
|
|||||||
"submit": "Submit",
|
"submit": "Submit",
|
||||||
"tryagain": "Try Again",
|
"tryagain": "Try Again",
|
||||||
"view": "View",
|
"view": "View",
|
||||||
"viewreleasenotes": "See What's Changed"
|
"viewreleasenotes": "See What's Changed",
|
||||||
|
"sharetoteams": "Share to Teams",
|
||||||
|
"ok": "Ok"
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"fcm": "You must allow notification permissions to have real time messaging. Click to try again.",
|
"fcm": "You must allow notification permissions to have real time messaging. Click to try again.",
|
||||||
@@ -3183,7 +3185,8 @@
|
|||||||
"tasks": {
|
"tasks": {
|
||||||
"actions": {
|
"actions": {
|
||||||
"edit": "Edit Task",
|
"edit": "Edit Task",
|
||||||
"new": "New Task"
|
"new": "New Task",
|
||||||
|
"view": "View Task"
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"allTasks": "All",
|
"allTasks": "All",
|
||||||
|
|||||||
@@ -1193,7 +1193,9 @@
|
|||||||
"submit": "",
|
"submit": "",
|
||||||
"tryagain": "",
|
"tryagain": "",
|
||||||
"view": "",
|
"view": "",
|
||||||
"viewreleasenotes": ""
|
"viewreleasenotes": "",
|
||||||
|
"sharetoteams": "",
|
||||||
|
"ok": ""
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"fcm": "",
|
"fcm": "",
|
||||||
@@ -3183,7 +3185,8 @@
|
|||||||
"tasks": {
|
"tasks": {
|
||||||
"actions": {
|
"actions": {
|
||||||
"edit": "",
|
"edit": "",
|
||||||
"new": ""
|
"new": "",
|
||||||
|
"view": ""
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"allTasks": "",
|
"allTasks": "",
|
||||||
|
|||||||
@@ -1193,7 +1193,9 @@
|
|||||||
"submit": "",
|
"submit": "",
|
||||||
"tryagain": "",
|
"tryagain": "",
|
||||||
"view": "",
|
"view": "",
|
||||||
"viewreleasenotes": ""
|
"viewreleasenotes": "",
|
||||||
|
"sharetoteams": "",
|
||||||
|
"ok": ""
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"fcm": "",
|
"fcm": "",
|
||||||
@@ -3183,7 +3185,8 @@
|
|||||||
"tasks": {
|
"tasks": {
|
||||||
"actions": {
|
"actions": {
|
||||||
"edit": "",
|
"edit": "",
|
||||||
"new": ""
|
"new": "",
|
||||||
|
"view": ""
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"allTasks": "",
|
"allTasks": "",
|
||||||
|
|||||||
Reference in New Issue
Block a user