added firebase analytics

This commit is contained in:
Patrick Fic
2020-04-13 18:21:59 -07:00
parent e66bd0ae56
commit c783b3f31d
9 changed files with 97 additions and 59 deletions

View File

@@ -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>

View File

@@ -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",

View File

@@ -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}

View File

@@ -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);
}); });

View File

@@ -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

View File

@@ -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": {

View File

@@ -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": {

View File

@@ -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": {

View File

@@ -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"