Compare commits

..

No commits in common. "83f5b20168f9af98a5524347f982bb07d5508707" and "899444e815c59995a2cc731813784504ac88fe45" have entirely different histories.

23 changed files with 88 additions and 137 deletions

View File

@ -184,6 +184,7 @@ const downloadArtifact = async (artifact, destinationPath, webContents) => {
} }
const restartApp = (app) => { const restartApp = (app) => {
console.log('[app-update] restarting app')
app.relaunch() app.relaunch()
app.exit(0) app.exit(0)
} }

View File

@ -111,6 +111,13 @@ export const launchMacInstaller = (
const installScript = buildMacInstallScript(installerPath, logPath) const installScript = buildMacInstallScript(installerPath, logPath)
const promptName = 'farmcontrol' const promptName = 'farmcontrol'
console.log('[app-update] launching macOS installer:', {
installerPath,
installScript,
logPath,
promptName
})
sendProgress(webContents, { sendProgress(webContents, {
phase: 'installing', phase: 'installing',
percent: 0, percent: 0,
@ -133,6 +140,7 @@ export const launchMacInstaller = (
await fs.unlink(logPath).catch(() => {}) await fs.unlink(logPath).catch(() => {})
if (stdout) console.log('[app-update] installer stdout:', stdout)
if (stderr) console.error('[app-update] installer stderr:', stderr) if (stderr) console.error('[app-update] installer stderr:', stderr)
if (error) { if (error) {
@ -166,6 +174,7 @@ export const launchMacInstaller = (
message: message || 'Installation complete. Restarting Farm Control...' message: message || 'Installation complete. Restarting Farm Control...'
}) })
console.log('[app-update] installer completed successfully')
resolve() resolve()
}) })
}) })

View File

@ -157,6 +157,7 @@ function setupWindowEvents() {
}) })
}) })
win.on('enter-full-screen', () => { win.on('enter-full-screen', () => {
console.log('Entered fullscreen')
win.webContents.send('window-state', { win.webContents.send('window-state', {
isFullScreen: true isFullScreen: true
}) })
@ -292,6 +293,7 @@ export function setupMainWindowAppEvents(app) {
export function setupDevAuthServer() { export function setupDevAuthServer() {
const env = (process.env.NODE_ENV || 'development').trim() const env = (process.env.NODE_ENV || 'development').trim()
if (env == 'development') { if (env == 'development') {
console.log('Starting development auth web server...')
import('express').then(({ default: express }) => { import('express').then(({ default: express }) => {
const app = express() const app = express()
const port = 3500 const port = 3500
@ -308,7 +310,11 @@ export function setupDevAuthServer() {
} }
}) })
app.listen(port, () => {}) app.listen(port, () => {
console.log(`Dev auth server running on http://localhost:${port}`)
})
}) })
} else {
console.log('Will use url scheme instead of auth server.')
} }
} }

View File

@ -9,7 +9,14 @@ const DEBUG_PREFIX = '[app-update][win-progress]'
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms)) const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms))
const debugLog = () => {} const debugLog = (message, details) => {
if (details === undefined) {
console.log(`${DEBUG_PREFIX} ${message}`)
return
}
console.log(`${DEBUG_PREFIX} ${message}`, details)
}
const decodeMsiLogBuffer = (buffer) => { const decodeMsiLogBuffer = (buffer) => {
if (!buffer?.length) return '' if (!buffer?.length) return ''

View File

@ -191,7 +191,7 @@ const AppPasswordInfo = () => {
<Modal <Modal
open={regenerateSecretOpen} open={regenerateSecretOpen}
destroyOnHidden={true} destroyOnClose
width={650} width={650}
onCancel={() => { onCancel={() => {
actionHandlerRef.current?.clearAction?.() actionHandlerRef.current?.clearAction?.()

View File

@ -229,7 +229,7 @@ const FilamentInfo = () => {
footer={null} footer={null}
width={700} width={700}
onCancel={() => setNewFilamentSkuOpen(false)} onCancel={() => setNewFilamentSkuOpen(false)}
destroyOnHidden={true} destroyOnClose
> >
<NewFilamentSku <NewFilamentSku
onOk={() => { onOk={() => {

View File

@ -184,7 +184,7 @@ const PartInfo = () => {
footer={null} footer={null}
width={700} width={700}
onCancel={() => setNewPartSkuOpen(false)} onCancel={() => setNewPartSkuOpen(false)}
destroyOnHidden={true} destroyOnClose
> >
<NewPartSku <NewPartSku
onOk={() => { onOk={() => {

View File

@ -188,7 +188,7 @@ const ProductInfo = () => {
footer={null} footer={null}
width={700} width={700}
onCancel={() => setNewProductSkuOpen(false)} onCancel={() => setNewProductSkuOpen(false)}
destroyOnHidden={true} destroyOnClose
> >
<NewProductSku <NewProductSku
onOk={() => { onOk={() => {

View File

@ -239,7 +239,7 @@ const UserInfo = () => {
<Modal <Modal
open={newAppPasswordOpen} open={newAppPasswordOpen}
destroyOnHidden={true} destroyOnClose
width={700} width={700}
onCancel={() => { onCancel={() => {
actionHandlerRef.current?.clearAction?.() actionHandlerRef.current?.clearAction?.()

View File

@ -66,6 +66,8 @@ const DeployJob = ({
} }
}, [objectData]) }, [objectData])
console.log(objectData)
const steps = [ const steps = [
{ {
title: 'Confirm', title: 'Confirm',

View File

@ -1,9 +1,6 @@
import { useRef, useState } from 'react' import { useRef, useState } from 'react'
import { useLocation } from 'react-router-dom' import { useLocation } from 'react-router-dom'
import { Space, Flex, Card, Button, Modal } from 'antd' import { Space, Flex, Card } from 'antd'
import NewPrinterProfile, {
EditPrinterProfile
} from '../PrinterProfiles/NewPrinterProfile'
import { LoadingOutlined } from '@ant-design/icons' import { LoadingOutlined } from '@ant-design/icons'
import loglevel from 'loglevel' import loglevel from 'loglevel'
import config from '../../../../config.js' import config from '../../../../config.js'
@ -25,20 +22,17 @@ import InfoCollapsePlaceholder from '../../common/InfoCollapsePlaceholder.jsx'
import DocumentPrintButton from '../../common/DocumentPrintButton.jsx' import DocumentPrintButton from '../../common/DocumentPrintButton.jsx'
import UserNotifierToggle from '../../common/UserNotifierToggle.jsx' import UserNotifierToggle from '../../common/UserNotifierToggle.jsx'
import ScrollBox from '../../common/ScrollBox.jsx' import ScrollBox from '../../common/ScrollBox.jsx'
import PlusIcon from '../../../Icons/PlusIcon.jsx'
import PrinterProfileIcon from '../../../Icons/PrinterProfileIcon.jsx'
const log = loglevel.getLogger('PrinterInfo') const log = loglevel.getLogger('PrinterInfo')
log.setLevel(config.logLevel) log.setLevel(config.logLevel)
const PrinterInfo = () => { const PrinterInfo = () => {
const location = useLocation() const location = useLocation()
const objectFormRef = useRef(null) const objectFormRef = useRef(null)
const profilesTableRef = useRef(null)
const actionHandlerRef = useRef(null) const actionHandlerRef = useRef(null)
const printerId = new URLSearchParams(location.search).get('printerId') const printerId = new URLSearchParams(location.search).get('printerId')
const [collapseState, updateCollapseState] = useCollapseState('PrinterInfo', { const [collapseState, updateCollapseState] = useCollapseState('PrinterInfo', {
info: true, info: true,
profiles: true,
stocks: true, stocks: true,
notes: true, notes: true,
auditLogs: false auditLogs: false
@ -52,15 +46,6 @@ const PrinterInfo = () => {
loading: false, loading: false,
objectData: {} objectData: {}
}) })
const [profileModal, setProfileModal] = useState({
open: false,
profileId: null
})
const handleProfileSaved = () => {
setProfileModal({ open: false, profileId: null })
profilesTableRef.current?.reload()
}
const actions = { const actions = {
edit: () => { edit: () => {
@ -100,7 +85,6 @@ const PrinterInfo = () => {
disabled={objectFormState.loading} disabled={objectFormState.loading}
items={[ items={[
{ key: 'info', label: 'Printer Information' }, { key: 'info', label: 'Printer Information' },
{ key: 'profiles', label: 'Printer Profiles' },
{ key: 'notes', label: 'Notes' }, { key: 'notes', label: 'Notes' },
{ key: 'auditLogs', label: 'Audit Logs' } { key: 'auditLogs', label: 'Audit Logs' }
]} ]}
@ -163,73 +147,31 @@ const PrinterInfo = () => {
setEditFormState((prev) => ({ ...prev, ...state })) setEditFormState((prev) => ({ ...prev, ...state }))
}} }}
> >
{({ loading, isEditing, objectData }) => ( {({ loading, isEditing, objectData }) => {
<ObjectInfo return (
loading={loading} <ObjectInfo
indicator={<LoadingOutlined />} loading={loading}
isEditing={isEditing} indicator={<LoadingOutlined />}
type='printer' isEditing={isEditing}
objectData={objectData} type='printer'
labelWidth='175px' objectData={objectData}
visibleProperties={{ labelWidth='175px'
currentFilamentStock: false, visibleProperties={{
'currentFilamentStock._id': false, currentFilamentStock: false,
currentJob: false, 'currentFilamentStock._id': false,
'currentJob._id': false, currentJob: false,
currentSubJob: false, 'currentJob._id': false,
'currentSubJob._id': false, currentSubJob: false,
alerts: false 'currentSubJob._id': false,
}} alerts: false
/> }}
)} />
)
}}
</ObjectForm> </ObjectForm>
</InfoCollapse> </InfoCollapse>
</ActionHandler> </ActionHandler>
<InfoCollapse
title='Printer Profiles'
icon={<PrinterProfileIcon />}
active={collapseState.profiles}
onToggle={(expanded) => updateCollapseState('profiles', expanded)}
collapseKey='profiles'
>
{objectFormState.loading ? (
<InfoCollapsePlaceholder />
) : (
<Flex vertical gap='middle'>
<Flex>
<Button
icon={<PlusIcon />}
onClick={() =>
setProfileModal({ open: true, profileId: null })
}
>
New Printer Profile
</Button>
</Flex>
<ObjectTable
ref={profilesTableRef}
type='printerProfile'
masterFilter={{ printer: printerId }}
visibleColumns={{
printer: false,
'printer._id': false
}}
onRowAction={(action, profile) => {
if (action.name === 'edit') {
setProfileModal({
open: true,
profileId: profile._id
})
return true
}
return false
}}
/>
</Flex>
)}
</InfoCollapse>
<InfoCollapse <InfoCollapse
title='Notes' title='Notes'
icon={<NoteIcon />} icon={<NoteIcon />}
@ -264,27 +206,6 @@ const PrinterInfo = () => {
</Flex> </Flex>
</ScrollBox> </ScrollBox>
</Flex> </Flex>
<Modal
open={profileModal.open}
footer={null}
width={1000}
onCancel={() => setProfileModal({ open: false, profileId: null })}
destroyOnHidden
>
{profileModal.open &&
(profileModal.profileId ? (
<EditPrinterProfile
profileId={profileModal.profileId}
printerId={printerId}
onOk={handleProfileSaved}
/>
) : (
<NewPrinterProfile
printerId={printerId}
onOk={handleProfileSaved}
/>
))}
</Modal>
</> </>
) )
} }

View File

@ -285,7 +285,7 @@ const MarketplaceInfo = () => {
onCancel={() => setSyncListingsOpen(false)} onCancel={() => setSyncListingsOpen(false)}
width={500} width={500}
footer={null} footer={null}
destroyOnHidden={true} destroyOnClose
centered centered
> >
<SyncListings <SyncListings
@ -301,7 +301,7 @@ const MarketplaceInfo = () => {
onCancel={() => setSyncOrdersOpen(false)} onCancel={() => setSyncOrdersOpen(false)}
width={500} width={500}
footer={null} footer={null}
destroyOnHidden={true} destroyOnClose
centered centered
> >
<SyncOrders <SyncOrders
@ -317,7 +317,7 @@ const MarketplaceInfo = () => {
onCancel={() => setConfigureModalOpen(false)} onCancel={() => setConfigureModalOpen(false)}
width={650} width={650}
footer={null} footer={null}
destroyOnHidden={true} destroyOnClose
centered centered
> >
<ConfigureMarketplace <ConfigureMarketplace

View File

@ -105,7 +105,7 @@ const ExportListButton = ({
</Dropdown> </Dropdown>
<Modal <Modal
open={odataModalOpen} open={odataModalOpen}
destroyOnHidden={true} destroyOnClose
width={650} width={650}
onCancel={() => setOdataModalOpen(false)} onCancel={() => setOdataModalOpen(false)}
footer={null} footer={null}
@ -114,7 +114,7 @@ const ExportListButton = ({
</Modal> </Modal>
<Modal <Modal
open={rssModalOpen} open={rssModalOpen}
destroyOnHidden={true} destroyOnClose
width={750} width={750}
onCancel={() => setRssModalOpen(false)} onCancel={() => setRssModalOpen(false)}
footer={null} footer={null}

View File

@ -19,6 +19,7 @@ const FilePreview = ({ file, style = {} }) => {
return return
} }
setLoading(true) setLoading(true)
console.log('fetching file content', file)
const objectUrl = await fetchFileContent(file, false) const objectUrl = await fetchFileContent(file, false)
if (objectUrl == null) { if (objectUrl == null) {
setLoading(false) setLoading(false)

View File

@ -220,7 +220,7 @@ const Notification = ({
{showExtraInfo && ( {showExtraInfo && (
<> <>
<Divider style={{ margin: largeSpacing ? '10px 0' : 0 }} /> <Divider style={{ margin: largeSpacing ? '10px 0' : 0 }} />
<Flex ju stify='space-between' align='center'> <Flex justify='space-between' align='center'>
{getNotificationTag(notification.type)} {getNotificationTag(notification.type)}
<TimeDisplay <TimeDisplay
dateTime={notification.createdAt} dateTime={notification.createdAt}

View File

@ -376,6 +376,7 @@ const ObjectChildTable = ({
const currentItems = Array.isArray(itemsSource) ? itemsSource : [] const currentItems = Array.isArray(itemsSource) ? itemsSource : []
const newItems = [...currentItems, newItem] const newItems = [...currentItems, newItem]
console.log('newItems', newItems)
if (typeof onChange === 'function') { if (typeof onChange === 'function') {
onChange(newItems) onChange(newItems)
} }

View File

@ -47,20 +47,17 @@ const ObjectDisplay = ({
}, []) }, [])
// Detect minimal objects that only contain an _id (must be string, not populated object) // Detect minimal objects that only contain an _id (must be string, not populated object)
const isMinimalObject = useCallback( const isMinimalObject = useCallback((obj) => {
(obj) => { if (!obj || typeof obj !== 'object' || Array.isArray(obj)) return false
if (!obj || typeof obj !== 'object' || Array.isArray(obj)) return false const keys = Object.keys(obj)
const keys = Object.keys(obj) const id = obj._id
const id = obj._id return (
return ( keys.length === 1 &&
keys.length === 1 && keys[0] === '_id' &&
keys[0] === '_id' && typeof id === 'string' &&
typeof id === 'string' && isValidId(id)
isValidId(id) )
) }, [isValidId])
},
[isValidId]
)
// If only an _id is provided, fetch the full object via spotlight // If only an _id is provided, fetch the full object via spotlight
const fetchFullObjectIfNeeded = useCallback( const fetchFullObjectIfNeeded = useCallback(
@ -134,14 +131,7 @@ const ObjectDisplay = ({
cancelled = true cancelled = true
setIsHydrating(false) setIsHydrating(false)
} }
}, [ }, [object, fetchFullObjectIfNeeded, isMinimalObject, isValidId, getStringId, token])
object,
fetchFullObjectIfNeeded,
isMinimalObject,
isValidId,
getStringId,
token
])
if (!objectData) { if (!objectData) {
return <Text type='secondary'>n/a</Text> return <Text type='secondary'>n/a</Text>
} }

View File

@ -43,6 +43,8 @@ const PropertyChanges = ({ type, value }) => {
...flatNew ...flatNew
} }
console.log(combinedChanges)
return ( return (
<Descriptions size='small' column={1}> <Descriptions size='small' column={1}>
{Object.keys(combinedChanges).map((key) => { {Object.keys(combinedChanges).map((key) => {

View File

@ -1770,6 +1770,8 @@ const ApiServerProvider = ({ children }) => {
'launchSession' 'launchSession'
) )
console.log(new URLSearchParams(location.search))
if ( if (
authenticated !== true || authenticated !== true ||
!token || !token ||

View File

@ -303,6 +303,8 @@ const AuthProvider = ({ children }) => {
profileImage?._id ?? profileImage?._id ??
(typeof profileImage === 'string' ? profileImage : null) (typeof profileImage === 'string' ? profileImage : null)
console.log('Fetching profile image:', profileImageId)
if (!token) { if (!token) {
if (profileImageUrlRef.current) { if (profileImageUrlRef.current) {
URL.revokeObjectURL(profileImageUrlRef.current) URL.revokeObjectURL(profileImageUrlRef.current)
@ -370,6 +372,10 @@ const AuthProvider = ({ children }) => {
} }
}, [userProfile?.profileImage, token]) }, [userProfile?.profileImage, token])
useEffect(() => {
console.log('userProfile', userProfile)
}, [userProfile])
const logout = useCallback( const logout = useCallback(
(redirectUri = '/login') => { (redirectUri = '/login') => {
setAuthenticated(false) setAuthenticated(false)

View File

@ -57,6 +57,7 @@ const EmailNotificationTemplate = () => {
) )
} }
case 'newNote': { case 'newNote': {
console.log('newNote metadata', JSON.stringify(metadata, null, 2))
const model = getModelByName(metadata?.note?.parentType) const model = getModelByName(metadata?.note?.parentType)
const infoAction = const infoAction =
model.actions?.find((action) => action.name === 'info') ?? null model.actions?.find((action) => action.name === 'info') ?? null

View File

@ -161,6 +161,7 @@ export const ListingVarient = {
showHyperlink: true, showHyperlink: true,
readOnly: true, readOnly: true,
value: (objectData) => { value: (objectData) => {
console.log('listing product id', objectData?.listing?.product?._id)
return objectData?.listing?.product return objectData?.listing?.product
}, },
required: true, required: true,

View File

@ -244,6 +244,7 @@ export const OrderItem = {
showHyperlink: true, showHyperlink: true,
columnWidth: 300, columnWidth: 300,
masterFilter: (objectData) => { masterFilter: (objectData) => {
console.log(objectData)
if (objectData?.itemType === 'filament' && objectData?.item?._id) { if (objectData?.itemType === 'filament' && objectData?.item?._id) {
return { filament: objectData.item._id } return { filament: objectData.item._id }
} }