added firebase analytics
This commit is contained in:
@@ -5477,6 +5477,27 @@
|
|||||||
</translation>
|
</translation>
|
||||||
</translations>
|
</translations>
|
||||||
</concept_node>
|
</concept_node>
|
||||||
|
<concept_node>
|
||||||
|
<name>total</name>
|
||||||
|
<definition_loaded>false</definition_loaded>
|
||||||
|
<description></description>
|
||||||
|
<comment></comment>
|
||||||
|
<default_text></default_text>
|
||||||
|
<translations>
|
||||||
|
<translation>
|
||||||
|
<language>en-US</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
<translation>
|
||||||
|
<language>es-MX</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
<translation>
|
||||||
|
<language>fr-CA</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
</translations>
|
||||||
|
</concept_node>
|
||||||
<concept_node>
|
<concept_node>
|
||||||
<name>unq_seq</name>
|
<name>unq_seq</name>
|
||||||
<definition_loaded>false</definition_loaded>
|
<definition_loaded>false</definition_loaded>
|
||||||
|
|||||||
@@ -28,6 +28,7 @@
|
|||||||
"react-barcode": "^1.4.0",
|
"react-barcode": "^1.4.0",
|
||||||
"react-big-calendar": "^0.24.1",
|
"react-big-calendar": "^0.24.1",
|
||||||
"react-dom": "^16.13.1",
|
"react-dom": "^16.13.1",
|
||||||
|
"react-ga": "^2.7.0",
|
||||||
"react-grid-gallery": "^0.5.5",
|
"react-grid-gallery": "^0.5.5",
|
||||||
"react-grid-layout": "^0.18.3",
|
"react-grid-layout": "^0.18.3",
|
||||||
"react-html-email": "^3.0.0",
|
"react-html-email": "^3.0.0",
|
||||||
|
|||||||
@@ -11,9 +11,9 @@ import AllocationsBulkAssignmentContainer from "../allocations-bulk-assignment/a
|
|||||||
import AllocationsEmployeeLabelContainer from "../allocations-employee-label/allocations-employee-label.container";
|
import AllocationsEmployeeLabelContainer from "../allocations-employee-label/allocations-employee-label.container";
|
||||||
import PartsOrderModalContainer from "../parts-order-modal/parts-order-modal.container";
|
import PartsOrderModalContainer from "../parts-order-modal/parts-order-modal.container";
|
||||||
|
|
||||||
const mapDispatchToProps = dispatch => ({
|
const mapDispatchToProps = (dispatch) => ({
|
||||||
setPartsOrderContext: context =>
|
setPartsOrderContext: (context) =>
|
||||||
dispatch(setModalContext({ context: context, modal: "partsOrder" }))
|
dispatch(setModalContext({ context: context, modal: "partsOrder" })),
|
||||||
});
|
});
|
||||||
|
|
||||||
export function JobLinesComponent({
|
export function JobLinesComponent({
|
||||||
@@ -25,10 +25,10 @@ export function JobLinesComponent({
|
|||||||
selectedLines,
|
selectedLines,
|
||||||
setSelectedLines,
|
setSelectedLines,
|
||||||
jobId,
|
jobId,
|
||||||
setJobLineEditContext
|
setJobLineEditContext,
|
||||||
}) {
|
}) {
|
||||||
const [state, setState] = useState({
|
const [state, setState] = useState({
|
||||||
sortedInfo: {}
|
sortedInfo: {},
|
||||||
});
|
});
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
|
||||||
@@ -44,7 +44,7 @@ export function JobLinesComponent({
|
|||||||
state.sortedInfo.columnKey === "unq_seq" && state.sortedInfo.order,
|
state.sortedInfo.columnKey === "unq_seq" && state.sortedInfo.order,
|
||||||
//ellipsis: true,
|
//ellipsis: true,
|
||||||
editable: true,
|
editable: true,
|
||||||
width: 75
|
width: 75,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: t("joblines.fields.line_desc"),
|
title: t("joblines.fields.line_desc"),
|
||||||
@@ -55,7 +55,6 @@ export function JobLinesComponent({
|
|||||||
state.sortedInfo.columnKey === "line_desc" && state.sortedInfo.order,
|
state.sortedInfo.columnKey === "line_desc" && state.sortedInfo.order,
|
||||||
ellipsis: true,
|
ellipsis: true,
|
||||||
editable: true,
|
editable: true,
|
||||||
width: "20%"
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: t("joblines.fields.oem_partno"),
|
title: t("joblines.fields.oem_partno"),
|
||||||
@@ -70,12 +69,12 @@ export function JobLinesComponent({
|
|||||||
state.sortedInfo.columnKey === "oem_partno" && state.sortedInfo.order,
|
state.sortedInfo.columnKey === "oem_partno" && state.sortedInfo.order,
|
||||||
ellipsis: true,
|
ellipsis: true,
|
||||||
editable: true,
|
editable: true,
|
||||||
width: "10%",
|
|
||||||
render: (text, record) => (
|
render: (text, record) => (
|
||||||
<span>
|
<span>
|
||||||
{record.oem_partno ? record.oem_partno : record.op_code_desc}
|
{record.oem_partno ? record.oem_partno : record.op_code_desc}
|
||||||
</span>
|
</span>
|
||||||
)
|
),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: t("joblines.fields.part_type"),
|
title: t("joblines.fields.part_type"),
|
||||||
@@ -86,7 +85,6 @@ export function JobLinesComponent({
|
|||||||
state.sortedInfo.columnKey === "part_type" && state.sortedInfo.order,
|
state.sortedInfo.columnKey === "part_type" && state.sortedInfo.order,
|
||||||
ellipsis: true,
|
ellipsis: true,
|
||||||
editable: true,
|
editable: true,
|
||||||
width: "7%"
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: t("joblines.fields.line_ind"),
|
title: t("joblines.fields.line_ind"),
|
||||||
@@ -94,20 +92,7 @@ export function JobLinesComponent({
|
|||||||
key: "line_ind",
|
key: "line_ind",
|
||||||
sorter: (a, b) => alphaSort(a.line_ind, b.line_ind),
|
sorter: (a, b) => alphaSort(a.line_ind, b.line_ind),
|
||||||
sortOrder:
|
sortOrder:
|
||||||
state.sortedInfo.columnKey === "line_ind" && state.sortedInfo.order
|
state.sortedInfo.columnKey === "line_ind" && state.sortedInfo.order,
|
||||||
},
|
|
||||||
{
|
|
||||||
title: t("joblines.fields.db_price"),
|
|
||||||
dataIndex: "db_price",
|
|
||||||
key: "db_price",
|
|
||||||
sorter: (a, b) => a.db_price - b.db_price,
|
|
||||||
sortOrder:
|
|
||||||
state.sortedInfo.columnKey === "db_price" && state.sortedInfo.order,
|
|
||||||
ellipsis: true,
|
|
||||||
width: "8%",
|
|
||||||
render: (text, record) => (
|
|
||||||
<CurrencyFormatter>{record.db_price}</CurrencyFormatter>
|
|
||||||
)
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: t("joblines.fields.act_price"),
|
title: t("joblines.fields.act_price"),
|
||||||
@@ -117,10 +102,31 @@ export function JobLinesComponent({
|
|||||||
sortOrder:
|
sortOrder:
|
||||||
state.sortedInfo.columnKey === "act_price" && state.sortedInfo.order,
|
state.sortedInfo.columnKey === "act_price" && state.sortedInfo.order,
|
||||||
ellipsis: true,
|
ellipsis: true,
|
||||||
width: "8%",
|
|
||||||
render: (text, record) => (
|
render: (text, record) => (
|
||||||
<CurrencyFormatter>{record.act_price}</CurrencyFormatter>
|
<CurrencyFormatter>{record.act_price}</CurrencyFormatter>
|
||||||
)
|
),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: t("joblines.fields.part_qty"),
|
||||||
|
dataIndex: "part_qty",
|
||||||
|
key: "part_qty",
|
||||||
|
ellipsis: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: t("joblines.fields.total"),
|
||||||
|
dataIndex: "total",
|
||||||
|
key: "total",
|
||||||
|
sorter: (a, b) => a.act_price * a.part_qty - b.act_price * b.part_qty,
|
||||||
|
sortOrder:
|
||||||
|
state.sortedInfo.columnKey === "act_price" && state.sortedInfo.order,
|
||||||
|
ellipsis: true,
|
||||||
|
|
||||||
|
render: (text, record) => (
|
||||||
|
<CurrencyFormatter>
|
||||||
|
{record.act_price * record.part_qty}
|
||||||
|
</CurrencyFormatter>
|
||||||
|
),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: t("joblines.fields.mod_lb_hrs"),
|
title: t("joblines.fields.mod_lb_hrs"),
|
||||||
@@ -128,7 +134,7 @@ export function JobLinesComponent({
|
|||||||
key: "mod_lb_hrs",
|
key: "mod_lb_hrs",
|
||||||
sorter: (a, b) => a.mod_lb_hrs - b.mod_lb_hrs,
|
sorter: (a, b) => a.mod_lb_hrs - b.mod_lb_hrs,
|
||||||
sortOrder:
|
sortOrder:
|
||||||
state.sortedInfo.columnKey === "mod_lb_hrs" && state.sortedInfo.order
|
state.sortedInfo.columnKey === "mod_lb_hrs" && state.sortedInfo.order,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: t("joblines.fields.status"),
|
title: t("joblines.fields.status"),
|
||||||
@@ -136,13 +142,13 @@ export function JobLinesComponent({
|
|||||||
key: "status",
|
key: "status",
|
||||||
sorter: (a, b) => alphaSort(a.status, b.status),
|
sorter: (a, b) => alphaSort(a.status, b.status),
|
||||||
sortOrder:
|
sortOrder:
|
||||||
state.sortedInfo.columnKey === "status" && state.sortedInfo.order
|
state.sortedInfo.columnKey === "status" && state.sortedInfo.order,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: t("allocations.fields.employee"),
|
title: t("allocations.fields.employee"),
|
||||||
dataIndex: "employee",
|
dataIndex: "employee",
|
||||||
key: "employee",
|
key: "employee",
|
||||||
width: "10%",
|
|
||||||
sorter: (a, b) =>
|
sorter: (a, b) =>
|
||||||
alphaSort(
|
alphaSort(
|
||||||
a.allocations[0] &&
|
a.allocations[0] &&
|
||||||
@@ -157,7 +163,7 @@ export function JobLinesComponent({
|
|||||||
render: (text, record) => (
|
render: (text, record) => (
|
||||||
<span>
|
<span>
|
||||||
{record.allocations && record.allocations.length > 0
|
{record.allocations && record.allocations.length > 0
|
||||||
? record.allocations.map(item => (
|
? record.allocations.map((item) => (
|
||||||
<AllocationsEmployeeLabelContainer
|
<AllocationsEmployeeLabelContainer
|
||||||
key={item.id}
|
key={item.id}
|
||||||
refetch={refetch}
|
refetch={refetch}
|
||||||
@@ -172,7 +178,7 @@ export function JobLinesComponent({
|
|||||||
hours={record.mod_lb_hrs}
|
hours={record.mod_lb_hrs}
|
||||||
/>
|
/>
|
||||||
</span>
|
</span>
|
||||||
)
|
),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: t("general.labels.actions"),
|
title: t("general.labels.actions"),
|
||||||
@@ -184,32 +190,21 @@ export function JobLinesComponent({
|
|||||||
onClick={() => {
|
onClick={() => {
|
||||||
setJobLineEditContext({
|
setJobLineEditContext({
|
||||||
actions: { refetch: refetch },
|
actions: { refetch: refetch },
|
||||||
context: record
|
context: record,
|
||||||
});
|
});
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{t("general.actions.edit")}
|
{t("general.actions.edit")}
|
||||||
</Button>
|
</Button>
|
||||||
</span>
|
</span>
|
||||||
)
|
),
|
||||||
}
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
const handleTableChange = (pagination, filters, sorter) => {
|
const handleTableChange = (pagination, filters, sorter) => {
|
||||||
setState({ ...state, filteredInfo: filters, sortedInfo: sorter });
|
setState({ ...state, filteredInfo: filters, sortedInfo: sorter });
|
||||||
};
|
};
|
||||||
|
|
||||||
const formItemLayout = {
|
|
||||||
labelCol: {
|
|
||||||
xs: { span: 12 },
|
|
||||||
sm: { span: 5 }
|
|
||||||
},
|
|
||||||
wrapperCol: {
|
|
||||||
xs: { span: 24 },
|
|
||||||
sm: { span: 12 }
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<PartsOrderModalContainer />
|
<PartsOrderModalContainer />
|
||||||
@@ -219,7 +214,7 @@ export function JobLinesComponent({
|
|||||||
<div>
|
<div>
|
||||||
<Input.Search
|
<Input.Search
|
||||||
placeholder={t("general.labels.search")}
|
placeholder={t("general.labels.search")}
|
||||||
onChange={e => {
|
onChange={(e) => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
setSearchText(e.target.value);
|
setSearchText(e.target.value);
|
||||||
}}
|
}}
|
||||||
@@ -231,8 +226,8 @@ export function JobLinesComponent({
|
|||||||
actions: { refetch: refetch },
|
actions: { refetch: refetch },
|
||||||
context: {
|
context: {
|
||||||
jobId: jobId,
|
jobId: jobId,
|
||||||
linesToOrder: selectedLines
|
linesToOrder: selectedLines,
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
@@ -246,7 +241,7 @@ export function JobLinesComponent({
|
|||||||
onClick={() => {
|
onClick={() => {
|
||||||
setJobLineEditContext({
|
setJobLineEditContext({
|
||||||
actions: { refetch: refetch },
|
actions: { refetch: refetch },
|
||||||
context: { jobid: jobId }
|
context: { jobid: jobId },
|
||||||
});
|
});
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
@@ -255,13 +250,12 @@ export function JobLinesComponent({
|
|||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}}
|
}}
|
||||||
{...formItemLayout}
|
|
||||||
loading={loading}
|
loading={loading}
|
||||||
size="small"
|
size="small"
|
||||||
expandedRowRender={record => (
|
expandedRowRender={(record) => (
|
||||||
<div style={{ margin: 0 }}>
|
<div style={{ margin: 0 }}>
|
||||||
<strong>{t("parts_orders.labels.orderhistory")}</strong>
|
<strong>{t("parts_orders.labels.orderhistory")}</strong>
|
||||||
{record.parts_order_lines.map(item => (
|
{record.parts_order_lines.map((item) => (
|
||||||
<div key={item.id}>
|
<div key={item.id}>
|
||||||
{`${item.parts_order.order_number || ""} from `}
|
{`${item.parts_order.order_number || ""} from `}
|
||||||
<Link to={`/manage/shop/vendors/${item.parts_order.vendor.id}`}>
|
<Link to={`/manage/shop/vendors/${item.parts_order.vendor.id}`}>
|
||||||
@@ -279,9 +273,9 @@ export function JobLinesComponent({
|
|||||||
setSelectedLines(selectedRows);
|
setSelectedLines(selectedRows);
|
||||||
},
|
},
|
||||||
onSelect: (record, selected, selectedRows, nativeEvent) =>
|
onSelect: (record, selected, selectedRows, nativeEvent) =>
|
||||||
setSelectedLines(selectedRows)
|
setSelectedLines(selectedRows),
|
||||||
}}
|
}}
|
||||||
columns={columns.map(item => ({ ...item }))}
|
columns={columns.map((item) => ({ ...item }))}
|
||||||
rowKey="id"
|
rowKey="id"
|
||||||
dataSource={jobLines}
|
dataSource={jobLines}
|
||||||
onChange={handleTableChange}
|
onChange={handleTableChange}
|
||||||
|
|||||||
@@ -2,28 +2,30 @@ import firebase from "firebase/app";
|
|||||||
import "firebase/firestore";
|
import "firebase/firestore";
|
||||||
import "firebase/auth";
|
import "firebase/auth";
|
||||||
import "firebase/database";
|
import "firebase/database";
|
||||||
|
import "firebase/analytics";
|
||||||
|
|
||||||
const config = JSON.parse(process.env.REACT_APP_FIREBASE_CONFIG);
|
const config = JSON.parse(process.env.REACT_APP_FIREBASE_CONFIG);
|
||||||
firebase.initializeApp(config);
|
firebase.initializeApp(config);
|
||||||
|
|
||||||
export const auth = firebase.auth();
|
export const auth = firebase.auth();
|
||||||
export const firestore = firebase.firestore();
|
export const firestore = firebase.firestore();
|
||||||
|
export const analytics = firebase.analytics();
|
||||||
|
|
||||||
export default firebase;
|
export default firebase;
|
||||||
|
|
||||||
export const getCurrentUser = () => {
|
export const getCurrentUser = () => {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
const unsubscribe = auth.onAuthStateChanged(userAuth => {
|
const unsubscribe = auth.onAuthStateChanged((userAuth) => {
|
||||||
unsubscribe();
|
unsubscribe();
|
||||||
resolve(userAuth);
|
resolve(userAuth);
|
||||||
}, reject);
|
}, reject);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
export const updateCurrentUser = userDetails => {
|
export const updateCurrentUser = (userDetails) => {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
const unsubscribe = auth.onAuthStateChanged(userAuth => {
|
const unsubscribe = auth.onAuthStateChanged((userAuth) => {
|
||||||
console.log("userDetails", userDetails);
|
userAuth.updateProfile(userDetails).then((r) => {
|
||||||
userAuth.updateProfile(userDetails).then(r => {
|
|
||||||
unsubscribe();
|
unsubscribe();
|
||||||
resolve(userAuth);
|
resolve(userAuth);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,11 +1,23 @@
|
|||||||
import React from "react";
|
import React from "react";
|
||||||
import DashboardGridComponent from "../../components/dashboard-grid/dashboard-grid.component";
|
import DashboardGridComponent from "../../components/dashboard-grid/dashboard-grid.component";
|
||||||
import Test from "../../components/_test/test.component";
|
import Test from "../../components/_test/test.component";
|
||||||
|
import { analytics } from "../../firebase/firebase.utils";
|
||||||
|
|
||||||
export default function ManageRootPageComponent() {
|
export default function ManageRootPageComponent() {
|
||||||
//const client = useApolloClient();
|
//const client = useApolloClient();
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<Test />
|
<Test />
|
||||||
|
<button
|
||||||
|
onClick={() => {
|
||||||
|
analytics.logEvent("start_game", {
|
||||||
|
level: "10",
|
||||||
|
difficulty: "expert",
|
||||||
|
});
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
Click me to start an event
|
||||||
|
</button>
|
||||||
<DashboardGridComponent />
|
<DashboardGridComponent />
|
||||||
{
|
{
|
||||||
// <SendEmailButton
|
// <SendEmailButton
|
||||||
|
|||||||
@@ -385,6 +385,7 @@
|
|||||||
"part_qty": "Quantity",
|
"part_qty": "Quantity",
|
||||||
"part_type": "Part Type",
|
"part_type": "Part Type",
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
|
"total": "Total",
|
||||||
"unq_seq": "Seq #"
|
"unq_seq": "Seq #"
|
||||||
},
|
},
|
||||||
"labels": {
|
"labels": {
|
||||||
|
|||||||
@@ -385,6 +385,7 @@
|
|||||||
"part_qty": "",
|
"part_qty": "",
|
||||||
"part_type": "Tipo de parte",
|
"part_type": "Tipo de parte",
|
||||||
"status": "Estado",
|
"status": "Estado",
|
||||||
|
"total": "",
|
||||||
"unq_seq": "Seq #"
|
"unq_seq": "Seq #"
|
||||||
},
|
},
|
||||||
"labels": {
|
"labels": {
|
||||||
|
|||||||
@@ -385,6 +385,7 @@
|
|||||||
"part_qty": "",
|
"part_qty": "",
|
||||||
"part_type": "Type de pièce",
|
"part_type": "Type de pièce",
|
||||||
"status": "Statut",
|
"status": "Statut",
|
||||||
|
"total": "",
|
||||||
"unq_seq": "Seq #"
|
"unq_seq": "Seq #"
|
||||||
},
|
},
|
||||||
"labels": {
|
"labels": {
|
||||||
|
|||||||
@@ -11178,6 +11178,11 @@ react-error-overlay@^6.0.7:
|
|||||||
resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.7.tgz#1dcfb459ab671d53f660a991513cb2f0a0553108"
|
resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.7.tgz#1dcfb459ab671d53f660a991513cb2f0a0553108"
|
||||||
integrity sha512-TAv1KJFh3RhqxNvhzxj6LeT5NWklP6rDr2a0jaTfsZ5wSZWHOGeqQyejUp3xxLfPt2UpyJEcVQB/zyPcmonNFA==
|
integrity sha512-TAv1KJFh3RhqxNvhzxj6LeT5NWklP6rDr2a0jaTfsZ5wSZWHOGeqQyejUp3xxLfPt2UpyJEcVQB/zyPcmonNFA==
|
||||||
|
|
||||||
|
react-ga@^2.7.0:
|
||||||
|
version "2.7.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/react-ga/-/react-ga-2.7.0.tgz#24328f157f31e8cffbf4de74a3396536679d8d7c"
|
||||||
|
integrity sha512-AjC7UOZMvygrWTc2hKxTDvlMXEtbmA0IgJjmkhgmQQ3RkXrWR11xEagLGFGaNyaPnmg24oaIiaNPnEoftUhfXA==
|
||||||
|
|
||||||
react-grid-gallery@^0.5.5:
|
react-grid-gallery@^0.5.5:
|
||||||
version "0.5.5"
|
version "0.5.5"
|
||||||
resolved "https://registry.yarnpkg.com/react-grid-gallery/-/react-grid-gallery-0.5.5.tgz#1b3f3c23a190834e587ab613c96d53ec3af4f0a2"
|
resolved "https://registry.yarnpkg.com/react-grid-gallery/-/react-grid-gallery-0.5.5.tgz#1b3f3c23a190834e587ab613c96d53ec3af4f0a2"
|
||||||
|
|||||||
Reference in New Issue
Block a user